Thyra  Version of the Day
Thyra_TpetraThyraWrappers_def.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_TPETRA_THYRA_WRAPPERS_HPP
43 #define THYRA_TPETRA_THYRA_WRAPPERS_HPP
44 
45 
46 #include "Thyra_TpetraThyraWrappers.hpp"
47 #include "Thyra_TpetraVectorSpace.hpp"
48 #include "Thyra_TpetraVector.hpp"
49 #include "Thyra_TpetraMultiVector.hpp"
50 #include "Thyra_TpetraLinearOp.hpp"
51 
52 
53 namespace Thyra {
54 
55 
56 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
57 Teuchos::RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
58 getOrCreateTpetraVectorSpace(
59  const RCP<const VectorSpaceBase<Scalar> > space,
60  const RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > &tpetraMap
61  )
62 {
63  using Teuchos::rcp_dynamic_cast;
64  typedef TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpetraVectorSpace_t;
65  RCP<const TpetraVectorSpace_t> tpetraSpace;
66  if (nonnull(space)) {
67  tpetraSpace = rcp_dynamic_cast<const TpetraVectorSpace_t>(space, true);
68  }
69  else {
70  tpetraSpace = tpetraVectorSpace<Scalar>(tpetraMap);
71  }
72  return tpetraSpace;
73 }
74 
75 
76 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
77 Teuchos::RCP<const ScalarProdVectorSpaceBase<Scalar> >
78 getOrCreateLocallyReplicatedTpetraVectorSpace(
79  const RCP<const VectorSpaceBase<Scalar> > space,
80  const RCP<const Teuchos::Comm<int> > &tpetraComm,
81  const RCP<Node> &tpetraNode,
82  const int numCols
83  )
84 {
85  using Teuchos::rcp_dynamic_cast;
86  typedef TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpetraVectorSpace_t;
87  RCP<const TpetraVectorSpace_t> tpetraSpace;
88  if (nonnull(space)) {
89  tpetraSpace = rcp_dynamic_cast<const TpetraVectorSpace_t>(space, true);
90  }
91  else {
92  tpetraSpace = tpetraVectorSpace<Scalar>(
93  Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal>(
94  numCols, tpetraComm, tpetraNode
95  )
96  );
97  }
98  return tpetraSpace;
99 }
100 
101 
102 } // namespace Thyra
103 
104 
105 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
106 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
108  const RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > &tpetraMap
109  )
110 {
111  return tpetraVectorSpace<Scalar>(tpetraMap);
112 }
113 
114 
115 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
116 Teuchos::RCP<Thyra::VectorBase<Scalar> >
118  const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector_in,
119  const RCP<const VectorSpaceBase<Scalar> > space_in
120  )
121 {
122  return tpetraVector(
123  getOrCreateTpetraVectorSpace(space_in, tpetraVector_in->getMap()),
124  tpetraVector_in
125  );
126 }
127 
128 
129 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
130 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
132  const RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector_in,
133  const RCP<const VectorSpaceBase<Scalar> > space
134  )
135 {
136  return constTpetraVector(
137  getOrCreateTpetraVectorSpace(space, tpetraVector_in->getMap()),
138  tpetraVector_in
139  );
140 }
141 
142 
143 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
144 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> >
146  const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector_in,
147  const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
148  const RCP<const VectorSpaceBase<Scalar> > domainSpace
149  )
150 {
151  return tpetraMultiVector(
152  getOrCreateTpetraVectorSpace(rangeSpace, tpetraMultiVector_in->getMap()),
153  getOrCreateLocallyReplicatedTpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
154  domainSpace, tpetraMultiVector_in->getMap()->getComm(),
155  tpetraMultiVector_in->getMap()->getNode(),
156  tpetraMultiVector_in->getNumVectors()
157  ),
158  tpetraMultiVector_in
159  );
160 }
161 
162 
163 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
164 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
166  const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector_in,
167  const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
168  const RCP<const VectorSpaceBase<Scalar> > domainSpace
169  )
170 {
171  return constTpetraMultiVector(
172  getOrCreateTpetraVectorSpace(rangeSpace, tpetraMultiVector_in->getMap()),
173  getOrCreateLocallyReplicatedTpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
174  domainSpace, tpetraMultiVector_in->getMap()->getComm(),
175  tpetraMultiVector_in->getMap()->getNode(),
176  tpetraMultiVector_in->getNumVectors()
177  ),
178  tpetraMultiVector_in
179  );
180 }
181 
182 
183 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
184 Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
186  const RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraOperator_in,
187  const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
188  const RCP<const VectorSpaceBase<Scalar> > domainSpace
189  )
190 {
191  return tpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
192  getOrCreateTpetraVectorSpace(rangeSpace, tpetraOperator_in->getRangeMap()),
193  getOrCreateTpetraVectorSpace(domainSpace, tpetraOperator_in->getDomainMap()),
194  tpetraOperator_in
195  );
196 }
197 
198 
199 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
200 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
202  const RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraOperator_in,
203  const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
204  const RCP<const VectorSpaceBase<Scalar> > domainSpace
205  )
206 {
207  return constTpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
208  getOrCreateTpetraVectorSpace(rangeSpace, tpetraOperator_in->getRangeMap()),
209  getOrCreateTpetraVectorSpace(domainSpace, tpetraOperator_in->getDomainMap()),
210  tpetraOperator_in
211  );
212 }
213 
214 
215 namespace Thyra {
216 
217 
218 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
219 RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
222 {
224  return Teuchos::rcp_dynamic_cast<TpetraVector_t>(v, true)->getTpetraVector();
225 }
226 
227 
228 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
229 RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
232 {
234  return Teuchos::rcp_dynamic_cast<const TpetraVector_t>(v, true)->getConstTpetraVector();
235 }
236 
237 
238 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
239 RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
242 {
243 
244 #ifdef THYRA_DEBUG
245  TEUCHOS_ASSERT(nonnull(mv));
246 #endif
247 
248  using Teuchos::rcp_dynamic_cast;
249 
251  ThyraTpetraMultiVector_t;
252  const RCP<ThyraTpetraMultiVector_t> tmv =
253  rcp_dynamic_cast<ThyraTpetraMultiVector_t>(mv);
254  if (nonnull(tmv)) {
255  return tmv->getTpetraMultiVector();
256  }
257 
259  ThyraTpetraVector_t;
260  const RCP<ThyraTpetraVector_t> tv =
261  rcp_dynamic_cast<ThyraTpetraVector_t>(mv);
262  if (nonnull(tv)) {
263  return tv->getTpetraVector();
264  }
265 
266  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
267  "Error, the input mv = " << mv->description() << " does not support the"
268  " Thyra::TpetraMultiVector or the Thyra::TpetraVector interfaces!");
269 
270  return Teuchos::null;
271 
272 }
273 
274 
275 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
276 RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
279 {
280 
281 #ifdef THYRA_DEBUG
282  TEUCHOS_ASSERT(nonnull(mv));
283 #endif
284 
285  using Teuchos::rcp_dynamic_cast;
286 
288  ThyraTpetraMultiVector_t;
289  const RCP<const ThyraTpetraMultiVector_t> tmv =
290  rcp_dynamic_cast<const ThyraTpetraMultiVector_t>(mv);
291  if (nonnull(tmv)) {
292  return tmv->getConstTpetraMultiVector();
293  }
294 
296  ThyraTpetraVector_t;
297  const RCP<const ThyraTpetraVector_t> tv =
298  rcp_dynamic_cast<const ThyraTpetraVector_t>(mv);
299  if (nonnull(tv)) {
300  return tv->getConstTpetraVector();
301  }
302 
303  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
304  "Error, the input mv = " << mv->description() << " does not support the"
305  " Thyra::TpetraMultiVector or the Thyra::TpetraVector interfaces!");
306 
307  return Teuchos::null;
308 
309 }
310 
311 
312 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
313 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
316 {
318  return Teuchos::rcp_dynamic_cast<TpetraLinearOp_t>(op, true)->getTpetraOperator();
319 }
320 
321 
322 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
323 RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
326 {
328  return Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op, true)->getConstTpetraOperator();
329 }
330 
331 
332 } // namespace Thyra
333 
334 
335 #endif // THYRA_TPETRA_THYRA_WRAPPERS_HPP
Concrete implementation of Thyra::MultiVector in terms of Tpetra::MultiVector.
RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraMultiVector()
Extract the underlying non-const Tpetra::MultiVector object.
RCP< MultiVectorBase< Scalar > > createMultiVector(const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
RCP< const MultiVectorBase< Scalar > > createConstMultiVector(const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
RCP< const VectorBase< Scalar > > createConstVector(const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=Teuchos::null)
RCP< TpetraMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraMultiVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Nonmember constructor for TpetraMultiVector.
static RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraVector(const RCP< const VectorBase< Scalar > > &v)
Get a const Tpetra::Vector from a const Thyra::VectorBase object.
static RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraMultiVector(const RCP< MultiVectorBase< Scalar > > &mv)
Get a non-const Tpetra::MultiVector from a non-const Thyra::MultiVectorBase object.
RCP< const LinearOpBase< Scalar > > createConstLinearOp(const RCP< const Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraOperator, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
Interface for a collection of column vectors called a multi-vector.
RCP< const TpetraMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > constTpetraMultiVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Nonmember constructor for TpetraMultiVector.
RCP< VectorBase< Scalar > > createVector(const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=Teuchos::null)
Abstract interface for finite-dimensional dense vectors.
static RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraVector(const RCP< VectorBase< Scalar > > &v)
Get a non-const Tpetra::Vector from a non-const Thyra::VectorBase object.
RCP< const VectorSpaceBase< Scalar > > createVectorSpace(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Create a Thyra::VectorSpaceBase object given a Tpetra::Map.
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
RCP< TpetraVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Nonmember constructor for TpetraVector.
Base class for all linear operators.
RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraVector()
Get the embedded non-const Tpetra::Vector.
RCP< const TpetraVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > constTpetraVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Nonmember constructor for TpetraVector.
RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraMultiVector() const
Extract the underlying const Tpetra::MultiVector object.
static RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraMultiVector(const RCP< const MultiVectorBase< Scalar > > &mv)
Get a const Tpetra::MultiVector from a const Thyra::MultiVectorBase object.
static RCP< const Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraOperator(const RCP< const LinearOpBase< Scalar > > &op)
Get a const Tpetra::Operator from a const Thyra::LinearOpBase object.
static RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraOperator(const RCP< LinearOpBase< Scalar > > &op)
Get a non-const Tpetra::Operator from a non-const Thyra::LinearOpBase object.
RCP< LinearOpBase< Scalar > > createLinearOp(const RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraOperator, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
Concrete Thyra::LinearOpBase subclass for Tpetra::Operator.
RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraVector() const
Get the embedded non-const Tpetra::Vector.