Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_TpetraThyraWrappers_def.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_TPETRA_THYRA_WRAPPERS_HPP
11#define THYRA_TPETRA_THYRA_WRAPPERS_HPP
12
13
14#include "Thyra_TpetraThyraWrappers.hpp"
15#include "Thyra_TpetraVectorSpace.hpp"
16#include "Thyra_TpetraVector.hpp"
17#include "Thyra_TpetraMultiVector.hpp"
18#include "Thyra_TpetraLinearOp.hpp"
19
20
21namespace Thyra {
22
23
24template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
26getOrCreateTpetraVectorSpace(
27 const RCP<const VectorSpaceBase<Scalar> > space,
28 const RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > &tpetraMap
29 )
30{
31 using Teuchos::rcp_dynamic_cast;
32 typedef TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpetraVectorSpace_t;
33 RCP<const TpetraVectorSpace_t> tpetraSpace;
34 if (nonnull(space)) {
35 tpetraSpace = rcp_dynamic_cast<const TpetraVectorSpace_t>(space, true);
36 }
37 else {
38 tpetraSpace = tpetraVectorSpace<Scalar>(tpetraMap);
39 }
40 return tpetraSpace;
41}
42
43
44template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
46getOrCreateLocallyReplicatedTpetraVectorSpace(
47 const RCP<const VectorSpaceBase<Scalar> > space,
48 const RCP<const Teuchos::Comm<int> > &tpetraComm,
49 const int numCols
50 )
51{
52 using Teuchos::rcp_dynamic_cast;
53 typedef TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpetraVectorSpace_t;
54 RCP<const TpetraVectorSpace_t> tpetraSpace;
55 if (nonnull(space)) {
56 tpetraSpace = rcp_dynamic_cast<const TpetraVectorSpace_t>(space, true);
57 }
58 else {
59 tpetraSpace = tpetraVectorSpace<Scalar>(
60 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
61 numCols, tpetraComm
62 )
63 );
64 }
65 return tpetraSpace;
66}
67
68} // namespace Thyra
69
70
71template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
74 const RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > &tpetraMap
75 )
76{
77 return tpetraVectorSpace<Scalar>(tpetraMap);
78}
79
80
81template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
84 const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector_in,
85 const RCP<const VectorSpaceBase<Scalar> > space_in
86 )
87{
88 return tpetraVector(
89 getOrCreateTpetraVectorSpace(space_in, tpetraVector_in->getMap()),
90 tpetraVector_in
91 );
92}
93
94
95template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
98 const RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector_in,
99 const RCP<const VectorSpaceBase<Scalar> > space
100 )
101{
102 return constTpetraVector(
103 getOrCreateTpetraVectorSpace(space, tpetraVector_in->getMap()),
104 tpetraVector_in
105 );
106}
107
108
109template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
112 const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector_in,
113 const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
114 const RCP<const VectorSpaceBase<Scalar> > domainSpace
115 )
116{
117 return tpetraMultiVector(
118 getOrCreateTpetraVectorSpace(rangeSpace, tpetraMultiVector_in->getMap()),
119 getOrCreateLocallyReplicatedTpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
120 domainSpace, tpetraMultiVector_in->getMap()->getComm(),
121 tpetraMultiVector_in->getNumVectors()
122 ),
123 tpetraMultiVector_in
124 );
125}
126
127
128template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
131 const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector_in,
132 const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
133 const RCP<const VectorSpaceBase<Scalar> > domainSpace
134 )
135{
136 return constTpetraMultiVector(
137 getOrCreateTpetraVectorSpace(rangeSpace, tpetraMultiVector_in->getMap()),
138 getOrCreateLocallyReplicatedTpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
139 domainSpace, tpetraMultiVector_in->getMap()->getComm(),
140 tpetraMultiVector_in->getNumVectors()
141 ),
142 tpetraMultiVector_in
143 );
144}
145
146
147template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
150 const RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraOperator_in,
151 const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
152 const RCP<const VectorSpaceBase<Scalar> > domainSpace
153 )
154{
155 Teuchos::RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraRangeSpace = getOrCreateTpetraVectorSpace(rangeSpace, tpetraOperator_in->getRangeMap());
156 Teuchos::RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraDomainSpace = getOrCreateTpetraVectorSpace(domainSpace, tpetraOperator_in->getDomainMap());
157
158 return tpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
159 tpetraRangeSpace,
160 tpetraDomainSpace,
161 tpetraOperator_in
162 );
163}
164
165
166template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
169 const RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraOperator_in,
170 const RCP<const VectorSpaceBase<Scalar> > rangeSpace,
171 const RCP<const VectorSpaceBase<Scalar> > domainSpace
172 )
173{
174 Teuchos::RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraRangeSpace = getOrCreateTpetraVectorSpace(rangeSpace, tpetraOperator_in->getRangeMap());
175 Teuchos::RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraDomainSpace = getOrCreateTpetraVectorSpace(domainSpace, tpetraOperator_in->getDomainMap());
176 return constTpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
177 tpetraRangeSpace,
178 tpetraDomainSpace,
179 tpetraOperator_in
180 );
181}
182
184namespace Thyra {
185
186template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
194
195
196template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
204
205
206template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
214
215
216template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
220{
221
222#ifdef THYRA_DEBUG
223 TEUCHOS_ASSERT(nonnull(mv));
224#endif
225
226 using Teuchos::rcp_dynamic_cast;
227
229 ThyraTpetraMultiVector_t;
231 rcp_dynamic_cast<ThyraTpetraMultiVector_t>(mv);
232 if (nonnull(tmv)) {
233 return tmv->getTpetraMultiVector();
234 }
235
237 ThyraTpetraVector_t;
238 const RCP<ThyraTpetraVector_t> tv =
239 rcp_dynamic_cast<ThyraTpetraVector_t>(mv);
240 if (nonnull(tv)) {
241 return tv->getTpetraVector();
242 }
243
244 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
245 "Error, the input mv = " << mv->description() << " does not support the"
246 " Thyra::TpetraMultiVector or the Thyra::TpetraVector interfaces!");
247
249
250}
251
252
253template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
257{
258
259#ifdef THYRA_DEBUG
260 TEUCHOS_ASSERT(nonnull(mv));
261#endif
262
263 using Teuchos::rcp_dynamic_cast;
264
266 ThyraTpetraMultiVector_t;
268 rcp_dynamic_cast<const ThyraTpetraMultiVector_t>(mv);
269 if (nonnull(tmv)) {
270 return tmv->getConstTpetraMultiVector();
271 }
272
274 ThyraTpetraVector_t;
276 rcp_dynamic_cast<const ThyraTpetraVector_t>(mv);
277 if (nonnull(tv)) {
278 return tv->getConstTpetraVector();
279 }
280
281 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
282 "Error, the input mv = " << mv->description() << " does not support the"
283 " Thyra::TpetraMultiVector or the Thyra::TpetraVector interfaces!");
284
286
287}
288
289
290template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
298
299
300template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
308
309
310template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
312initializePrec(
313 const PreconditionerFactoryBase<Scalar> &precFactory,
314 const RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
316 const ESupportSolveUse supportSolveUse)
317{
318 auto fwdOp = createConstLinearOp<Scalar>(tpetraFwdOp);
320 if (prec.is_null())
321 myPrec = precFactory.createPrec();
322 else
323 myPrec = prec;
324 precFactory.initializePrec(defaultLinearOpSource(fwdOp), myPrec.get(),
325 supportSolveUse);
326 return myPrec;
327}
328
329template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
331initializePrec(
332 const PreconditionerFactoryBase<Scalar> &precFactory,
333 const RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
334 const Teuchos::RCP<PreconditionerBase<Scalar> > &prec,
335 const ESupportSolveUse supportSolveUse)
336{
337 return initializePrec(precFactory,
338 Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpetraFwdOp, true),
339 prec,
340 supportSolveUse);
341}
342
343
344template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
345RCP<LinearOpWithSolveBase<Scalar> >
346linearOpWithSolve(
347 const LinearOpWithSolveFactoryBase<Scalar> &lowsFactory,
348 const RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
349 const ESupportSolveUse supportSolveUse
350 )
351{
352 RCP<LinearOpWithSolveBase<Scalar> > Op = lowsFactory.createOp();
353 auto fwdOp = createConstLinearOp<Scalar>(tpetraFwdOp);
354 Thyra::initializeOp<Scalar>( lowsFactory, fwdOp, Op.ptr(), supportSolveUse);
355 return Op;
356}
357
358template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
360linearOpWithSolve(
361 const LinearOpWithSolveFactoryBase<Scalar> &lowsFactory,
362 const RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
363 const ESupportSolveUse supportSolveUse
364 )
365{
366 return linearOpWithSolve(lowsFactory,
367 Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpetraFwdOp, true),
368 supportSolveUse);
369}
370
371template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
373initializePreconditionedOp(
374 const LinearOpWithSolveFactoryBase<Scalar> &lowsFactory,
375 const RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
376 const RCP<PreconditionerBase<Scalar> > &prec,
377 const ESupportSolveUse supportSolveUse
378 )
379{
380 RCP<LinearOpWithSolveBase<Scalar> > Op = lowsFactory.createOp();
381 auto fwdOp = createConstLinearOp<Scalar>(tpetraFwdOp);
382 lowsFactory.initializePreconditionedOp(defaultLinearOpSource(fwdOp),
383 prec, &*Op, supportSolveUse);
384 setDefaultObjectLabel(*fwdOp ,Op.ptr());
385 return Op;
386}
387
388template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
390initializePreconditionedOp(
391 const LinearOpWithSolveFactoryBase<Scalar> &lowsFactory,
392 const RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraFwdOp,
393 const RCP<PreconditionerBase<Scalar> > &prec,
394 const ESupportSolveUse supportSolveUse
395 )
396{
397 return initializePreconditionedOp(lowsFactory,
398 Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpetraFwdOp, true),
399 prec,
400 supportSolveUse);
401}
402
403
404template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
405inline
408 const EOpTransp A_trans,
409 const RCP<const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > &tpetraB,
410 const RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > &tpetraX,
411 const Ptr<const SolveCriteria<Scalar> > solveCriteria
412 )
413{
414 auto B = createConstMultiVector(tpetraB);
415 auto X = createMultiVector(tpetraX);
416 return A.solve(A_trans, *B, X.ptr(), solveCriteria);
417}
418
419
420} // namespace Thyra
421
422
423#endif // THYRA_TPETRA_THYRA_WRAPPERS_HPP
Ptr< T > ptr() const
T * get() const
Base class for all linear operators.
Base class for all linear operators that can support a high-level solve operation.
SolveStatus< Scalar > solve(const EOpTransp A_trans, const MultiVectorBase< Scalar > &B, const Ptr< MultiVectorBase< Scalar > > &X, const Ptr< const SolveCriteria< Scalar > > solveCriteria=Teuchos::null) const
Request the solution of a block linear system.
Factory interface for creating LinearOpWithSolveBase objects from compatible LinearOpBase objects.
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
Initialize a pre-created LinearOpWithSolveBase object given a "compatible" LinearOpBase object and an...
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const =0
Create an (uninitialized) LinearOpWithSolveBase object to be initialized later in this->initializeOp(...
Interface for a collection of column vectors called a multi-vector.
Simple interface class to access a precreated preconditioner as one or more linear operators objects ...
Factory interface for creating preconditioner objects from LinearOpBase objects.
virtual void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const =0
Initialize a pre-created LinearOpBase preconditioner object given a "compatible" LinearOpBase object.
virtual RCP< PreconditionerBase< Scalar > > createPrec() const =0
Create an (uninitialized) LinearOpBase object to be initialized as the preconditioner later in this->...
Concrete Thyra::LinearOpBase subclass for Tpetra::Operator.
RCP< const Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraOperator() const
Get embedded const Tpetra::Operator.
RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraOperator()
Get embedded non-const Tpetra::Operator.
Concrete implementation of Thyra::MultiVector in terms of Tpetra::MultiVector.
static RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getTpetraMap(const RCP< const VectorSpaceBase< Scalar > > &vs)
Get a const Tpetra::Map from a const Thyra::VectorSpaceBase 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.
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< 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.
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.
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.
Concrete implementation of an SPMD vector space for Tpetra.
RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getTpetraMap() const
Get the embedded Tpetra::Map.
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraVector()
Get the embedded non-const Tpetra::Vector.
RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraVector() const
Get the embedded non-const Tpetra::Vector.
Abstract interface for finite-dimensional dense vectors.
Abstract interface for objects that represent a space for vectors.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool nonnull(const std::shared_ptr< T > &p)
ESupportSolveUse
Enum that specifies how a LinearOpWithSolveBase object will be used for solves after it is constructe...
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
RCP< const VectorBase< Scalar > > createConstVector(const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=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 VectorSpaceBase< Scalar > > createVectorSpace(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Create a Thyra::VectorSpaceBase object given a Tpetra::Map.
RCP< VectorBase< Scalar > > createVector(const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=Teuchos::null)
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< 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)
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)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
T_To & dyn_cast(T_From &from)
Simple struct that defines the requested solution criteria for a solve.
Simple struct for the return status from a solve.