47 #ifndef XPETRA_THYRAUTILS_HPP
48 #define XPETRA_THYRAUTILS_HPP
51 #ifdef HAVE_XPETRA_THYRA
55 #ifdef HAVE_XPETRA_TPETRA
56 #include "Tpetra_ConfigDefs.hpp"
59 #ifdef HAVE_XPETRA_EPETRA
60 #include "Epetra_config.h"
61 #include "Epetra_CombineMode.h"
64 #include "Xpetra_Map.hpp"
65 #include "Xpetra_BlockedMap.hpp"
66 #include "Xpetra_BlockedMultiVector.hpp"
69 #include "Xpetra_StridedMap.hpp"
70 #include "Xpetra_StridedMapFactory.hpp"
71 #include "Xpetra_MapExtractor.hpp"
74 #include "Xpetra_CrsMatrixWrap.hpp"
75 #include "Xpetra_MultiVectorFactory.hpp"
77 #include <Thyra_VectorSpaceBase.hpp>
78 #include <Thyra_SpmdVectorSpaceBase.hpp>
79 #include <Thyra_ProductVectorSpaceBase.hpp>
80 #include <Thyra_ProductMultiVectorBase.hpp>
81 #include <Thyra_VectorSpaceBase.hpp>
82 #include <Thyra_DefaultProductVectorSpace.hpp>
83 #include <Thyra_DefaultBlockedLinearOp.hpp>
84 #include <Thyra_LinearOpBase.hpp>
85 #include "Thyra_DiagonalLinearOpBase.hpp"
86 #include <Thyra_DetachedMultiVectorView.hpp>
87 #include <Thyra_MultiVectorStdOps.hpp>
89 #ifdef HAVE_XPETRA_TPETRA
90 #include <Thyra_TpetraThyraWrappers.hpp>
91 #include <Thyra_TpetraVector.hpp>
92 #include <Thyra_TpetraMultiVector.hpp>
93 #include <Thyra_TpetraVectorSpace.hpp>
94 #include <Tpetra_Map.hpp>
95 #include <Tpetra_Vector.hpp>
96 #include <Tpetra_CrsMatrix.hpp>
97 #include <Xpetra_TpetraMap.hpp>
99 #include <Xpetra_TpetraCrsMatrix.hpp>
101 #ifdef HAVE_XPETRA_EPETRA
102 #include <Thyra_EpetraLinearOp.hpp>
103 #include <Thyra_EpetraThyraWrappers.hpp>
104 #include <Thyra_SpmdVectorBase.hpp>
105 #include <Thyra_get_Epetra_Operator.hpp>
106 #include <Epetra_Map.h>
107 #include <Epetra_Vector.h>
108 #include <Epetra_CrsMatrix.h>
115 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
116 class BlockedCrsMatrix;
118 template <
class Scalar,
119 class LocalOrdinal = int,
120 class GlobalOrdinal = LocalOrdinal,
121 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
124 #undef XPETRA_THYRAUTILS_SHORT
128 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>>
129 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
130 Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> map =
toXpetra(vectorSpace);
132 if (stridedBlockId == -1) {
133 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo.size() != 0);
135 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo[stridedBlockId] != 0);
142 static Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
143 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
146 using Teuchos::rcp_dynamic_cast;
147 using ThyVecSpaceBase = Thyra::VectorSpaceBase<Scalar>;
148 using ThyProdVecSpaceBase = Thyra::ProductVectorSpaceBase<Scalar>;
149 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
151 RCP<Map> resultMap = Teuchos::null;
152 RCP<const ThyProdVecSpaceBase> prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase>(vectorSpace);
153 if (prodVectorSpace != Teuchos::null) {
156 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks() == 0, std::logic_error,
"Found a product vector space with zero blocks.");
157 std::vector<RCP<const Map>> mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
158 std::vector<RCP<const Map>> mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
159 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
160 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
167 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(), 0);
168 for (
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
169 gidOffsets[i] = mapsThyra[i - 1]->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
172 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
173 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
180 #ifdef HAVE_XPETRA_TPETRA
183 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(vectorSpace);
184 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(tpetra_vsc) ==
true,
Xpetra::Exceptions::RuntimeError,
"toXpetra failed to convert provided vector space to Thyra::TpetraVectorSpace. This is the general implementation for Tpetra only.");
186 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> TpMap;
187 typedef Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpVector;
188 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
189 typedef Thyra::VectorBase<Scalar> ThyVecBase;
190 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
191 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
192 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
193 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
194 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
195 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
198 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Cannot transform Thyra::VectorSpace to Xpetra::Map. This is the general implementation for Tpetra only, but Tpetra is disabled.");
201 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
206 static Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
207 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
210 using Teuchos::rcp_dynamic_cast;
212 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
213 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
214 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
217 RCP<MultiVector> xpMultVec = Teuchos::null;
220 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase>(v);
221 if (thyProdVec != Teuchos::null) {
225 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
230 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
233 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b) {
234 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
237 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
241 #ifdef HAVE_XPETRA_TPETRA
242 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> ConverterT;
243 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpMultVec;
245 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
246 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
248 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
249 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
250 TEUCHOS_TEST_FOR_EXCEPTION(thyraTpetraMultiVector == Teuchos::null,
Xpetra::Exceptions::RuntimeError,
"toXpetra failed to convert provided multi vector to Thyra::TpetraMultiVector. This is the general implementation for Tpetra only.");
251 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
252 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
253 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
254 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
255 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
257 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Cannot transform Thyra::MultiVector to Xpetra::MultiVector. This is the general implementation for Tpetra only, but Teptra is disabled.");
260 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
265 static Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
266 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
267 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> cv =
268 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar>>(v);
269 Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> r =
274 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
275 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(op));
278 bool bIsTpetra =
false;
279 #ifdef HAVE_XPETRA_TPETRA
280 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(op);
281 bIsTpetra = Teuchos::is_null(tpetra_op) ?
false :
true;
285 #ifdef HAVE_XPETRA_EPETRA
286 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
288 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar>>(op) == Teuchos::null) {
290 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
291 if (Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
292 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
293 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
294 std::cout <<
" properly set!" << std::endl;
295 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
304 if(bIsTpetra ==
false) {
305 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
306 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
307 if(ThyBlockedOp != Teuchos::null) {
308 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
309 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
310 ThyBlockedOp->getBlock(0,0);
311 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
312 bIsTpetra = isTpetra(b00);
320 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
324 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
326 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar>> ThyBlockedOp =
327 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar>>(op);
328 if (ThyBlockedOp != Teuchos::null) {
334 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
335 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
336 #ifdef HAVE_XPETRA_TPETRA
338 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
339 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
342 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
343 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
344 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
345 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat);
346 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
348 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
350 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
352 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
354 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
356 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
362 #ifdef HAVE_XPETRA_EPETRA
367 return Teuchos::null;
370 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
371 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
374 using Teuchos::rcp_const_cast;
375 using Teuchos::rcp_dynamic_cast;
377 #ifdef HAVE_XPETRA_TPETRA
379 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
380 typedef Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraOperator_t;
381 RCP<const TpetraOperator_t> TpetraOp = TOE::getConstTpetraOperator(op);
382 TEUCHOS_TEST_FOR_EXCEPT(is_null(TpetraOp));
383 RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat =
384 rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
385 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat =
386 rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
388 RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
390 rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat)));
391 TEUCHOS_TEST_FOR_EXCEPT(is_null(xTpetraCrsMat));
392 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
394 RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
396 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
402 #ifdef HAVE_XPETRA_EPETRA
407 return Teuchos::null;
410 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
411 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
412 #ifdef HAVE_XPETRA_TPETRA
414 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
415 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
417 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
419 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraOp));
421 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
427 #ifdef HAVE_XPETRA_EPETRA
432 return Teuchos::null;
435 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
436 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
437 #ifdef HAVE_XPETRA_TPETRA
439 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
440 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
442 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
444 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraOp));
446 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
452 #ifdef HAVE_XPETRA_EPETRA
457 return Teuchos::null;
460 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
461 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar>>& op) {
462 using Teuchos::rcp_const_cast;
463 using Teuchos::rcp_dynamic_cast;
465 RCP<const Thyra::VectorBase<Scalar>> diag = op->getDiag();
467 RCP<const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpDiag;
468 #ifdef HAVE_XPETRA_TPETRA
469 using thyTpV = Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
470 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
471 if (!rcp_dynamic_cast<const thyTpV>(diag).is_null()) {
472 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getConstTpetraVector(diag);
473 if (!tDiag.is_null())
477 TEUCHOS_ASSERT(!xpDiag.is_null());
482 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
483 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar>>& op) {
484 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar>>(op));
487 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>
489 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> thyraMap = Teuchos::null;
492 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
493 if (bmap.is_null() ==
false) {
494 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>> vecSpaces(bmap->getNumMaps());
495 for (
size_t i = 0; i < bmap->getNumMaps(); i++) {
497 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> vs =
498 Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(bmap->getMap(i,
true));
502 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
507 #ifdef HAVE_XPETRA_TPETRA
510 if (tpetraMap == Teuchos::null)
511 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
512 RCP<Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
513 thyraMap = thyraTpetraMap;
517 #ifdef HAVE_XPETRA_EPETRA
526 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
529 #ifdef HAVE_XPETRA_TPETRA
531 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
532 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
533 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
534 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
535 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
540 #ifdef HAVE_XPETRA_EPETRA
549 static Teuchos::RCP<const Thyra::VectorBase<Scalar>>
552 #ifdef HAVE_XPETRA_TPETRA
554 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
555 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
556 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
557 thyVec->initialize(thyTpMap, tpVec);
562 #ifdef HAVE_XPETRA_EPETRA
577 using Teuchos::rcp_dynamic_cast;
578 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
579 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
580 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
583 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
586 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
587 if (prodTarget != Teuchos::null) {
588 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
589 if (bSourceVec.is_null() ==
true) {
593 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
594 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(mapExtractor->NumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::MapExtractor.");
596 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
598 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
601 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
602 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
603 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
604 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
605 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim());
606 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
607 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
610 for (
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
611 Teuchos::ArrayRCP<const Scalar> xpData = xpSubBlock->getData(j);
614 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
615 (*thyData)(i, j) = xpData[i];
622 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(bSourceVec->getBlockedMap()->getNumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::BlockedMultiVector.");
624 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
626 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
628 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
631 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
632 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
640 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
641 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
642 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
643 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim());
644 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
645 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
648 for (
size_t j = 0; j < source->getNumVectors(); ++j) {
649 Teuchos::ArrayRCP<const Scalar> xpData = source->getData(j);
651 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
652 (*thyData)(i, j) = xpData[i];
658 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar>>
661 Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
665 #ifdef HAVE_XPETRA_TPETRA
667 if (tpetraMat != Teuchos::null) {
670 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpCrsMat = xTpCrsMat->
getTpetra_CrsMatrix();
671 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
673 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
674 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
676 thyraOp = Thyra::createConstLinearOp(tpOperator);
677 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
679 #ifdef HAVE_XPETRA_EPETRA
680 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
682 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. No Epetra available");
688 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
692 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
695 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
699 #ifdef HAVE_XPETRA_TPETRA
701 if (tpetraMat != Teuchos::null) {
705 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
707 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
708 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
710 thyraOp = Thyra::createLinearOp(tpOperator);
711 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
714 #ifdef HAVE_XPETRA_EPETRA
715 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
717 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
723 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
727 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
729 int nRows = mat->Rows();
730 int nCols = mat->Cols();
732 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> Ablock = mat->getInnermostCrsMatrix();
734 TEUCHOS_TEST_FOR_EXCEPT(Ablock_wrap.is_null() ==
true);
736 #ifdef HAVE_XPETRA_TPETRA
738 if (tpetraMat != Teuchos::null) {
740 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar>> blockMat =
741 Thyra::defaultBlockedLinearOp<Scalar>();
743 blockMat->beginBlockFill(nRows, nCols);
745 for (
int r = 0; r < nRows; ++r) {
746 for (
int c = 0; c < nCols; ++c) {
747 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r, c);
749 if (xpmat == Teuchos::null)
continue;
751 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thBlock = Teuchos::null;
754 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpblock =
756 if (xpblock != Teuchos::null) {
757 if (xpblock->Rows() == 1 && xpblock->Cols() == 1) {
759 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
760 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
761 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
764 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpblock);
768 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
769 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
770 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
773 blockMat->setBlock(r, c, thBlock);
777 blockMat->endBlockFill();
782 #ifdef HAVE_XPETRA_EPETRA
783 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
785 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
787 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
789 #endif // endif HAVE_XPETRA_TPETRA
793 #if defined(HAVE_XPETRA_EPETRA) && !defined(HAVE_XPETRA_TPETRA)
795 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
796 #endif // endif HAVE_XPETRA_EPETRA
803 #ifdef HAVE_XPETRA_EPETRA
805 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
807 class ThyraUtils<double, int, int,
EpetraNode> {
809 typedef double Scalar;
810 typedef int LocalOrdinal;
811 typedef int GlobalOrdinal;
815 #undef XPETRA_THYRAUTILS_SHORT
819 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>>
820 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
823 if (stridedBlockId == -1) {
824 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo.size() != 0);
826 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo[stridedBlockId] != 0);
833 static Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
834 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
837 using Teuchos::rcp_dynamic_cast;
838 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
839 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
840 typedef Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyUtils;
842 RCP<Map> resultMap = Teuchos::null;
844 RCP<const ThyProdVecSpaceBase> prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase>(vectorSpace);
845 if (prodVectorSpace != Teuchos::null) {
848 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks() == 0, std::logic_error,
"Found a product vector space with zero blocks.");
849 std::vector<RCP<const Map>> mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
850 std::vector<RCP<const Map>> mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
851 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
852 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
859 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(), 0);
860 for (
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
861 gidOffsets[i] = mapsThyra[i - 1]->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
864 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
865 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
876 bool bIsTpetra =
false;
877 #ifdef HAVE_XPETRA_TPETRA
878 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
879 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
880 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(vectorSpace);
881 bIsTpetra = Teuchos::is_null(tpetra_vsc) ?
false :
true;
886 bool bIsEpetra = !bIsTpetra;
888 #ifdef HAVE_XPETRA_TPETRA
890 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
891 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
892 typedef Thyra::VectorBase<Scalar> ThyVecBase;
893 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> TpMap;
894 typedef Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpVector;
895 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
896 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
897 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
898 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
899 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
900 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
901 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
910 #ifdef HAVE_XPETRA_EPETRA
913 RCP<const Epetra_Map>
914 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map>>(vectorSpace,
"epetra_map");
915 if (!Teuchos::is_null(epetra_map)) {
917 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
919 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
924 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
929 static Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
930 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
933 using Teuchos::rcp_dynamic_cast;
935 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
936 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
937 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
940 RCP<MultiVector> xpMultVec = Teuchos::null;
943 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase>(v);
944 if (thyProdVec != Teuchos::null) {
948 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
953 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
956 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b) {
957 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
960 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
963 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
968 bool bIsTpetra =
false;
969 #ifdef HAVE_XPETRA_TPETRA
970 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
971 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
975 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
976 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> ConverterT;
977 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpMultVec;
979 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
981 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
982 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
983 if (thyraTpetraMultiVector != Teuchos::null) {
985 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
986 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
987 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
988 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
989 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
994 #ifdef HAVE_XPETRA_EPETRA
995 if (bIsTpetra ==
false) {
998 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
1001 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
1002 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1003 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
1004 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1005 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
1009 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1015 static Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1016 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
1017 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> cv =
1018 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar>>(v);
1019 Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> r =
1024 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1026 bool bIsTpetra =
false;
1027 #ifdef HAVE_XPETRA_TPETRA
1028 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1029 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1031 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(op);
1032 bIsTpetra = Teuchos::is_null(tpetra_op) ?
false :
true;
1036 #ifdef HAVE_XPETRA_EPETRA
1037 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1039 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar>>(op) == Teuchos::null) {
1041 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1042 if (Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1043 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1044 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1045 std::cout <<
" properly set!" << std::endl;
1046 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1056 if(bIsTpetra ==
false) {
1057 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1058 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1059 if(ThyBlockedOp != Teuchos::null) {
1060 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1061 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1062 ThyBlockedOp->getBlock(0,0);
1063 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1064 bIsTpetra = isTpetra(b00);
1072 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1074 bool bIsEpetra =
false;
1076 #ifdef HAVE_XPETRA_EPETRA
1077 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
1078 bIsEpetra = Teuchos::is_null(epetra_op) ?
false :
true;
1085 if(bIsEpetra ==
false) {
1086 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1087 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1088 if(ThyBlockedOp != Teuchos::null) {
1089 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1090 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1091 ThyBlockedOp->getBlock(0,0);
1092 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1093 bIsEpetra = isEpetra(b00);
1101 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1103 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar>> ThyBlockedOp =
1104 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar>>(op);
1105 if (ThyBlockedOp != Teuchos::null) {
1111 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1112 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1113 #ifdef HAVE_XPETRA_TPETRA
1115 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1116 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1118 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1119 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
1122 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1123 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp);
1124 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1125 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
1126 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat);
1127 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1129 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
1131 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1132 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> ret =
1134 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1136 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1138 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1147 #ifdef HAVE_XPETRA_EPETRA
1149 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator(*op);
1150 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1151 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op,
true);
1152 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat,
true);
1153 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1154 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1156 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> xEpetraCrsMat =
1158 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1160 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1162 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1164 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1169 return Teuchos::null;
1172 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1173 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
1174 #ifdef HAVE_XPETRA_TPETRA
1176 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1177 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1179 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1180 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
1181 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1182 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
1183 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
1185 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
1187 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1188 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1190 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1192 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1201 #ifdef HAVE_XPETRA_EPETRA
1203 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator(*op);
1204 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1205 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op,
true);
1206 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat,
true);
1208 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> xEpetraCrsMat =
1210 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1211 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1213 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1215 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1220 return Teuchos::null;
1223 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1224 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1225 return toXpetraOperator(Teuchos::rcp_const_cast<Thyra::LinearOpBase<Scalar>>(op));
1253 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1254 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
1255 #ifdef HAVE_XPETRA_TPETRA
1257 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1258 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
1260 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
1262 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraOp));
1264 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
1270 #ifdef HAVE_XPETRA_EPETRA
1275 return Teuchos::null;
1278 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1279 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar>>& op) {
1280 using Teuchos::rcp_const_cast;
1281 using Teuchos::rcp_dynamic_cast;
1283 RCP<const Thyra::VectorBase<Scalar>> diag = op->getDiag();
1285 RCP<const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpDiag;
1286 #ifdef HAVE_XPETRA_TPETRA
1287 using thyTpV = Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
1288 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
1289 if (!rcp_dynamic_cast<const thyTpV>(diag).is_null()) {
1290 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getConstTpetraVector(diag);
1291 if (!tDiag.is_null())
1295 #ifdef HAVE_XPETRA_EPETRA
1296 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
1297 if (xpDiag.is_null()) {
1298 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
1299 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
1300 if (!map.is_null()) {
1301 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
1302 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
1308 TEUCHOS_ASSERT(!xpDiag.is_null());
1313 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1314 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar>>& op) {
1315 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar>>(op));
1318 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>
1320 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> thyraMap = Teuchos::null;
1323 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
1324 if (bmap.is_null() ==
false) {
1325 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>> vecSpaces(bmap->getNumMaps());
1326 for (
size_t i = 0; i < bmap->getNumMaps(); i++) {
1328 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> vs =
1329 Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(bmap->getMap(i,
true));
1333 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1338 #ifdef HAVE_XPETRA_TPETRA
1340 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1341 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1343 if (tpetraMap == Teuchos::null)
1344 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1345 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> tpMap = tpetraMap->getTpetra_Map();
1346 RCP<Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1347 thyraMap = thyraTpetraMap;
1354 #ifdef HAVE_XPETRA_EPETRA
1357 if (epetraMap == Teuchos::null)
1358 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1359 RCP<const Thyra::VectorSpaceBase<Scalar>> thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
1360 thyraMap = thyraEpetraMap;
1367 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
1370 #ifdef HAVE_XPETRA_TPETRA
1372 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1373 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
1374 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
1375 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1376 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
1381 #ifdef HAVE_XPETRA_EPETRA
1383 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node>>(vec->getMap())->getEpetra_MapRCP());
1384 auto epMV = Teuchos::rcp_dynamic_cast<
const EpetraMultiVectorT<GlobalOrdinal, Node>>(vec)->getEpetra_MultiVector();
1385 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
1393 static Teuchos::RCP<const Thyra::VectorBase<Scalar>>
1396 #ifdef HAVE_XPETRA_TPETRA
1398 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1399 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
1400 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1401 thyVec->initialize(thyTpMap, tpVec);
1406 #ifdef HAVE_XPETRA_EPETRA
1408 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node>>(vec->getMap())->getEpetra_MapRCP());
1409 auto epVec = rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node>>(vec)->getEpetra_Vector(),
false);
1410 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
1421 using Teuchos::rcp_dynamic_cast;
1422 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1423 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1424 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1427 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1430 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1431 if (prodTarget != Teuchos::null) {
1432 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
1433 if (bSourceVec.is_null() ==
true) {
1437 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1438 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(mapExtractor->NumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::MapExtractor.");
1440 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1442 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1445 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1446 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1447 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1448 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
1449 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim());
1450 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
1451 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
1454 for (
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1455 Teuchos::ArrayRCP<const Scalar> xpData = xpSubBlock->getData(j);
1458 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
1459 (*thyData)(i, j) = xpData[i];
1466 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(bSourceVec->getBlockedMap()->getNumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::BlockedMultiVector.");
1468 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1470 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
1472 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
1475 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1476 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
1484 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
1485 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1486 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
1487 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim());
1488 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
1489 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
1492 for (
size_t j = 0; j < source->getNumVectors(); ++j) {
1493 Teuchos::ArrayRCP<const Scalar> xpData = source->getData(j);
1495 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
1496 (*thyData)(i, j) = xpData[i];
1502 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar>>
1505 Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
1507 #ifdef HAVE_XPETRA_TPETRA
1509 if (tpetraMat != Teuchos::null) {
1510 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1511 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1514 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpCrsMat = xTpCrsMat->
getTpetra_CrsMatrix();
1515 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1517 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
1518 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
1520 thyraOp = Thyra::createConstLinearOp(tpOperator);
1521 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1528 #ifdef HAVE_XPETRA_EPETRA
1530 if (epetraMat != Teuchos::null) {
1532 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
1533 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
1534 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1536 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
1537 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1538 thyraOp = thyraEpOp;
1544 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
1547 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
1549 #ifdef HAVE_XPETRA_TPETRA
1551 if (tpetraMat != Teuchos::null) {
1552 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1553 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1557 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1559 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
1560 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
1562 thyraOp = Thyra::createLinearOp(tpOperator);
1563 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1570 #ifdef HAVE_XPETRA_EPETRA
1572 if (epetraMat != Teuchos::null) {
1575 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1577 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
1578 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1579 thyraOp = thyraEpOp;
1585 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
1589 #endif // #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
1591 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
1593 class ThyraUtils<double, int, long long,
EpetraNode> {
1595 typedef double Scalar;
1596 typedef int LocalOrdinal;
1597 typedef long long GlobalOrdinal;
1601 #undef XPETRA_THYRAUTILS_SHORT
1605 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>>
1606 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
1609 if (stridedBlockId == -1) {
1610 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo.size() != 0);
1612 TEUCHOS_TEST_FOR_EXCEPT(map->getLocalNumElements() % stridingInfo[stridedBlockId] != 0);
1619 static Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
1620 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
1623 using Teuchos::rcp_dynamic_cast;
1624 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1625 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1626 typedef Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyUtils;
1628 RCP<const ThyProdVecSpaceBase> prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase>(vectorSpace);
1629 if (prodVectorSpace != Teuchos::null) {
1632 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks() == 0, std::logic_error,
"Found a product vector space with zero blocks.");
1633 std::vector<RCP<const Map>> mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
1634 std::vector<RCP<const Map>> mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
1635 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
1636 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
1643 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(), 0);
1644 for (
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1645 gidOffsets[i] = mapsThyra[i - 1]->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
1648 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
1649 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
1655 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
1662 bool bIsTpetra =
false;
1663 #ifdef HAVE_XPETRA_TPETRA
1664 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1665 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1666 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(vectorSpace);
1667 bIsTpetra = Teuchos::is_null(tpetra_vsc) ?
false :
true;
1672 bool bIsEpetra = !bIsTpetra;
1674 #ifdef HAVE_XPETRA_TPETRA
1676 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1677 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1678 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1679 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> TpMap;
1680 typedef Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpVector;
1681 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1682 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1683 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
1684 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1685 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
1686 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1687 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
1690 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1698 #ifdef HAVE_XPETRA_EPETRA
1701 RCP<const Epetra_Map>
1702 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map>>(vectorSpace,
"epetra_map");
1703 if (!Teuchos::is_null(epetra_map)) {
1705 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1708 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
1713 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Cannot transform Thyra::VectorSpace to Xpetra::Map.");
1718 static Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1719 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
1722 using Teuchos::rcp_dynamic_cast;
1723 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1724 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1725 typedef Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyUtils;
1728 RCP<MultiVector> xpMultVec = Teuchos::null;
1731 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase>(v);
1732 if (thyProdVec != Teuchos::null) {
1736 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
1741 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
1742 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpBlockedMultVec));
1745 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b) {
1746 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
1749 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
1752 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1757 bool bIsTpetra =
false;
1758 #ifdef HAVE_XPETRA_TPETRA
1759 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1760 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1764 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1765 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> ConverterT;
1766 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpMultVec;
1768 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1770 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
1771 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
1772 if (thyraTpetraMultiVector != Teuchos::null) {
1774 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1775 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
1776 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1777 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
1778 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
1779 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1785 #ifdef HAVE_XPETRA_EPETRA
1786 if (bIsTpetra ==
false) {
1789 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
1792 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
1793 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1794 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
1795 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1796 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
1798 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1803 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Cannot transform Thyra::MultiVector to Xpetra::MultiVector.");
1808 static Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1809 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
1810 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> cv =
1811 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar>>(v);
1812 Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> r =
1817 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1819 bool bIsTpetra =
false;
1820 #ifdef HAVE_XPETRA_TPETRA
1821 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1822 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1824 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(op);
1825 bIsTpetra = Teuchos::is_null(tpetra_op) ?
false :
true;
1829 #ifdef HAVE_XPETRA_EPETRA
1830 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1832 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar>>(op) == Teuchos::null) {
1834 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1835 if (Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1836 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1837 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1838 std::cout <<
" properly set!" << std::endl;
1839 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1849 if(bIsTpetra ==
false) {
1850 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1851 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1852 if(ThyBlockedOp != Teuchos::null) {
1853 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1854 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1855 ThyBlockedOp->getBlock(0,0);
1856 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1857 bIsTpetra = isTpetra(b00);
1865 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1867 bool bIsEpetra =
false;
1869 #ifdef HAVE_XPETRA_EPETRA
1870 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
1871 bIsEpetra = Teuchos::is_null(epetra_op) ?
false :
true;
1878 if(bIsEpetra ==
false) {
1879 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1880 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1881 if(ThyBlockedOp != Teuchos::null) {
1882 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1883 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1884 ThyBlockedOp->getBlock(0,0);
1885 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1886 bIsEpetra = isEpetra(b00);
1894 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1896 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar>> ThyBlockedOp =
1897 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar>>(op);
1898 if (ThyBlockedOp != Teuchos::null) {
1904 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1905 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
1906 #ifdef HAVE_XPETRA_TPETRA
1908 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1909 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1911 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1912 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
1915 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1916 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
1917 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
1918 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat);
1919 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1921 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
1923 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1925 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1927 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1929 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1938 #ifdef HAVE_XPETRA_EPETRA
1940 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator(*op);
1941 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1942 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op,
true);
1943 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat,
true);
1944 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1945 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1947 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> xEpetraCrsMat =
1949 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1951 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1953 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1955 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1960 return Teuchos::null;
1963 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1964 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
1965 #ifdef HAVE_XPETRA_TPETRA
1967 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1968 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1970 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
1971 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
1972 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1973 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
1974 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
1976 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
1978 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1980 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
1982 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
1984 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
1993 #ifdef HAVE_XPETRA_EPETRA
1995 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator(*op);
1996 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1997 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op,
true);
1998 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat,
true);
2000 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> xEpetraCrsMat =
2002 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
2004 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
2006 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
2008 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
2013 return Teuchos::null;
2016 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
2017 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
2018 #ifdef HAVE_XPETRA_TPETRA
2020 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
2021 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
2023 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
2025 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraOp));
2027 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
2033 #ifdef HAVE_XPETRA_EPETRA
2038 return Teuchos::null;
2041 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
2042 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
2043 #ifdef HAVE_XPETRA_TPETRA
2045 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
2046 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
2048 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
2050 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraOp));
2052 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
2058 #ifdef HAVE_XPETRA_EPETRA
2063 return Teuchos::null;
2066 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
2067 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar>>& op) {
2068 using Teuchos::rcp_const_cast;
2069 using Teuchos::rcp_dynamic_cast;
2070 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
2071 using thyTpV = Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
2072 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
2074 RCP<const Thyra::VectorBase<Scalar>> diag = op->getDiag();
2076 RCP<const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpDiag;
2077 #ifdef HAVE_XPETRA_TPETRA
2078 if (!rcp_dynamic_cast<const thyTpV>(diag).is_null()) {
2079 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getConstTpetraVector(diag);
2080 if (!tDiag.is_null())
2084 #ifdef HAVE_XPETRA_EPETRA
2085 if (xpDiag.is_null()) {
2086 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
2087 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
2088 if (!map.is_null()) {
2089 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
2090 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
2096 TEUCHOS_ASSERT(!xpDiag.is_null());
2101 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
2102 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar>>& op) {
2103 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar>>(op));
2106 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>
2108 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> thyraMap = Teuchos::null;
2111 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
2112 if (bmap.is_null() ==
false) {
2113 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>> vecSpaces(bmap->getNumMaps());
2114 for (
size_t i = 0; i < bmap->getNumMaps(); i++) {
2116 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> vs =
2117 Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(bmap->getMap(i,
true));
2121 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
2126 #ifdef HAVE_XPETRA_TPETRA
2128 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2129 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2131 if (tpetraMap == Teuchos::null)
2132 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
2133 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> tpMap = tpetraMap->getTpetra_Map();
2134 RCP<Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
2135 thyraMap = thyraTpetraMap;
2142 #ifdef HAVE_XPETRA_EPETRA
2145 if (epetraMap == Teuchos::null)
2146 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
2147 RCP<const Thyra::VectorSpaceBase<Scalar>> thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
2148 thyraMap = thyraEpetraMap;
2155 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
2158 #ifdef HAVE_XPETRA_TPETRA
2160 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
2161 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
2162 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
2163 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2164 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
2169 #ifdef HAVE_XPETRA_EPETRA
2171 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node>>(vec->getMap())->getEpetra_MapRCP());
2172 auto epMV = Teuchos::rcp_dynamic_cast<
const EpetraMultiVectorT<GlobalOrdinal, Node>>(vec)->getEpetra_MultiVector();
2173 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
2181 static Teuchos::RCP<const Thyra::VectorBase<Scalar>>
2184 #ifdef HAVE_XPETRA_TPETRA
2186 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
2187 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
2188 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2189 thyVec->initialize(thyTpMap, tpVec);
2194 #ifdef HAVE_XPETRA_EPETRA
2196 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node>>(vec->getMap())->getEpetra_MapRCP());
2197 auto epVec = rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node>>(vec)->getEpetra_Vector(),
false);
2198 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
2209 using Teuchos::rcp_dynamic_cast;
2210 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
2211 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
2212 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
2215 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
2218 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
2219 if (prodTarget != Teuchos::null) {
2220 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
2221 if (bSourceVec.is_null() ==
true) {
2225 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
2226 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(mapExtractor->NumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::MapExtractor.");
2228 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2230 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
2233 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
2234 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
2235 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
2236 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
2237 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim());
2238 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
2239 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
2242 for (
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
2243 Teuchos::ArrayRCP<const Scalar> xpData = xpSubBlock->getData(j);
2246 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
2247 (*thyData)(i, j) = xpData[i];
2254 TEUCHOS_TEST_FOR_EXCEPTION(prodTarget->productSpace()->numBlocks() != as<int>(bSourceVec->getBlockedMap()->getNumMaps()), std::logic_error,
"Inconsistent numbers of sub maps in Thyra::ProductVectorSpace and Xpetra::BlockedMultiVector.");
2256 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2258 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
2260 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
2263 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
2264 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
2272 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
2273 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
2274 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
2275 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim());
2276 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
2277 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
2280 for (
size_t j = 0; j < source->getNumVectors(); ++j) {
2281 Teuchos::ArrayRCP<const Scalar> xpData = source->getData(j);
2283 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
2284 (*thyData)(i, j) = xpData[i];
2290 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar>>
2293 Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
2295 #ifdef HAVE_XPETRA_TPETRA
2297 if (tpetraMat != Teuchos::null) {
2298 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2299 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2302 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpCrsMat = xTpCrsMat->
getTpetra_CrsMatrix();
2303 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2305 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
2306 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
2308 thyraOp = Thyra::createConstLinearOp(tpOperator);
2309 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2316 #ifdef HAVE_XPETRA_EPETRA
2318 if (epetraMat != Teuchos::null) {
2321 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2323 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
2324 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2325 thyraOp = thyraEpOp;
2331 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
2334 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
2336 #ifdef HAVE_XPETRA_TPETRA
2338 if (tpetraMat != Teuchos::null) {
2339 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2340 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2344 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2346 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
2347 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
2349 thyraOp = Thyra::createLinearOp(tpOperator);
2350 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2357 #ifdef HAVE_XPETRA_EPETRA
2359 if (epetraMat != Teuchos::null) {
2362 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2364 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
2365 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2366 thyraOp = thyraEpOp;
2372 static Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
2376 #endif // XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
2378 #endif // HAVE_XPETRA_EPETRA
2382 #define XPETRA_THYRAUTILS_SHORT
2383 #endif // HAVE_XPETRA_THYRA
2385 #endif // XPETRA_THYRAUTILS_HPP
static Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node >> &map, size_t NumVectors, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.
RCP< Epetra_CrsMatrix > getEpetra_CrsMatrixNonConst() const
static RCP< Matrix > Build(const RCP< const Map > &rowMap)
Exception throws to report errors in the internal logical of the program.
static Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > transformThyra2XpetraGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlInput, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlReferenceInput)
replace set of global ids by new global ids
RCP< const Epetra_CrsMatrix > getEpetra_CrsMatrix() const
Tpetra::KokkosCompat::KokkosSerialWrapperNode EpetraNode
RCP< const Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetra_CrsMatrix() const
Get the underlying Tpetra matrix.
const RCP< const Epetra_Map > & getEpetra_MapRCP() const
Get the underlying Epetra map.
RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetra_CrsMatrixNonConst() const
Get the underlying Tpetra matrix.
Concrete implementation of Xpetra::Matrix.
static RCP< Xpetra::StridedMap< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int >> &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, LocalGlobal lg=Xpetra::GloballyDistributed)
Map constructor with Xpetra-defined contiguous uniform distribution.
Xpetra-specific matrix class.
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &map)
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)