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" 68 #include "Xpetra_StridedMap.hpp" 69 #include "Xpetra_StridedMapFactory.hpp" 70 #include "Xpetra_MapExtractor.hpp" 72 #include "Xpetra_CrsMatrixWrap.hpp" 73 #include "Xpetra_MultiVectorFactory.hpp" 75 #include <Thyra_VectorSpaceBase.hpp> 76 #include <Thyra_SpmdVectorSpaceBase.hpp> 77 #include <Thyra_ProductVectorSpaceBase.hpp> 78 #include <Thyra_ProductMultiVectorBase.hpp> 79 #include <Thyra_VectorSpaceBase.hpp> 80 #include <Thyra_DefaultProductVectorSpace.hpp> 81 #include <Thyra_DefaultBlockedLinearOp.hpp> 82 #include <Thyra_LinearOpBase.hpp> 83 #include <Thyra_DetachedMultiVectorView.hpp> 84 #include <Thyra_MultiVectorStdOps.hpp> 86 #ifdef HAVE_XPETRA_TPETRA 87 #include <Thyra_TpetraThyraWrappers.hpp> 88 #include <Thyra_TpetraVector.hpp> 89 #include <Thyra_TpetraMultiVector.hpp> 90 #include <Thyra_TpetraVectorSpace.hpp> 91 #include <Tpetra_Map.hpp> 92 #include <Tpetra_Vector.hpp> 93 #include <Tpetra_CrsMatrix.hpp> 94 #include <Xpetra_TpetraMap.hpp> 95 #include <Xpetra_TpetraCrsMatrix.hpp> 97 #ifdef HAVE_XPETRA_EPETRA 98 #include <Thyra_EpetraLinearOp.hpp> 99 #include <Thyra_EpetraThyraWrappers.hpp> 100 #include <Thyra_SpmdVectorBase.hpp> 101 #include <Thyra_get_Epetra_Operator.hpp> 102 #include <Epetra_Map.h> 103 #include <Epetra_Vector.h> 104 #include <Epetra_CrsMatrix.h> 111 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class BlockedCrsMatrix;
113 template <
class Scalar,
114 class LocalOrdinal = int,
115 class GlobalOrdinal = LocalOrdinal,
120 #undef XPETRA_THYRAUTILS_SHORT 124 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
125 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) {
127 Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map =
toXpetra(vectorSpace);
129 if(stridedBlockId == -1) {
130 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
133 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
140 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
141 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
143 using Teuchos::rcp_dynamic_cast;
145 using ThyVecSpaceBase = Thyra::VectorSpaceBase<Scalar>;
146 using ThyProdVecSpaceBase = Thyra::ProductVectorSpaceBase<Scalar>;
147 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
150 RCP<Map> resultMap = Teuchos::null;
151 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
152 if(prodVectorSpace != Teuchos::null) {
155 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
156 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
157 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
158 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
159 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
166 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
167 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
168 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
171 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
172 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
179 #ifdef HAVE_XPETRA_TPETRA 182 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
183 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.");
185 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
186 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
187 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
188 typedef Thyra::VectorBase<Scalar> ThyVecBase;
189 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
190 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
191 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
192 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
193 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
194 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
197 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.");
200 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
205 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
206 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
208 using Teuchos::rcp_dynamic_cast;
211 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
212 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
213 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
216 RCP<MultiVector> xpMultVec = Teuchos::null;
219 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
220 if(thyProdVec != Teuchos::null) {
224 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
229 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
230 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpBlockedMultVec));
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 =
275 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
276 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(op));
279 bool bIsTpetra =
false;
280 #ifdef HAVE_XPETRA_TPETRA 281 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
282 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
286 #ifdef HAVE_XPETRA_EPETRA
287 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
289 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
291 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
292 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
293 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
294 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
295 std::cout <<
" properly set!" << std::endl;
296 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
305 if(bIsTpetra ==
false) {
306 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
307 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
308 if(ThyBlockedOp != Teuchos::null) {
309 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
310 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
311 ThyBlockedOp->getBlock(0,0);
312 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
313 bIsTpetra = isTpetra(b00);
321 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
325 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
327 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
328 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
329 if(ThyBlockedOp != Teuchos::null) {
335 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
336 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
338 #ifdef HAVE_XPETRA_TPETRA 340 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
341 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
344 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
345 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
346 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
347 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
348 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
349 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
350 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
352 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
354 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
356 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
362 #ifdef HAVE_XPETRA_EPETRA 367 return Teuchos::null;
370 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
371 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
373 #ifdef HAVE_XPETRA_TPETRA 375 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
376 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
377 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
378 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
379 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
380 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
381 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
383 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
385 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
386 return xTpetraCrsMat;
390 #ifdef HAVE_XPETRA_EPETRA 395 return Teuchos::null;
398 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
400 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
403 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
404 if(bmap.is_null() ==
false) {
406 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
407 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
409 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
410 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
414 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
419 #ifdef HAVE_XPETRA_TPETRA 422 if (tpetraMap == Teuchos::null)
423 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
424 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
425 thyraMap = thyraTpetraMap;
429 #ifdef HAVE_XPETRA_EPETRA 438 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
442 #ifdef HAVE_XPETRA_TPETRA 444 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
445 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
446 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
447 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
448 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
453 #ifdef HAVE_XPETRA_EPETRA 462 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
466 #ifdef HAVE_XPETRA_TPETRA 468 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
469 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
470 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
471 thyVec->initialize(thyTpMap, tpVec);
476 #ifdef HAVE_XPETRA_EPETRA 490 using Teuchos::rcp_dynamic_cast;
492 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
493 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
494 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
497 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
501 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
502 if(prodTarget != Teuchos::null) {
503 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
504 if(bSourceVec.is_null() ==
true) {
508 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
509 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.");
511 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
513 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
516 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
517 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
518 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
519 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
520 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
521 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
522 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
525 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
526 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
529 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
530 (*thyData)(i,j) = xpData[i];
537 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.");
539 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
541 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
543 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
546 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
547 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
556 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
557 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
558 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
559 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
560 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
561 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
564 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
565 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
567 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
568 (*thyData)(i,j) = xpData[i];
574 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
577 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
581 #ifdef HAVE_XPETRA_TPETRA 583 if(tpetraMat!=Teuchos::null) {
586 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
587 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
588 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
590 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
591 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
592 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
593 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
595 thyraOp = Thyra::createConstLinearOp(tpOperator);
596 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
598 #ifdef HAVE_XPETRA_EPETRA 599 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");
601 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. No Epetra available");
607 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
611 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
614 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
618 #ifdef HAVE_XPETRA_TPETRA 620 if(tpetraMat!=Teuchos::null) {
623 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
624 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
625 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
627 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
628 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
629 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
630 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
632 thyraOp = Thyra::createLinearOp(tpOperator);
633 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
636 #ifdef HAVE_XPETRA_EPETRA 637 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");
639 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
645 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
649 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
652 int nRows = mat->Rows();
653 int nCols = mat->Cols();
655 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Ablock = mat->getInnermostCrsMatrix();
657 TEUCHOS_TEST_FOR_EXCEPT(Ablock_wrap.is_null() ==
true);
659 #ifdef HAVE_XPETRA_TPETRA 661 if(tpetraMat!=Teuchos::null) {
664 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar> > blockMat =
665 Thyra::defaultBlockedLinearOp<Scalar>();
667 blockMat->beginBlockFill(nRows,nCols);
669 for (
int r=0; r<nRows; ++r) {
670 for (
int c=0; c<nCols; ++c) {
671 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r,c);
673 if(xpmat == Teuchos::null)
continue;
675 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thBlock = Teuchos::null;
678 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpblock =
680 if(xpblock != Teuchos::null) {
681 if(xpblock->Rows() == 1 && xpblock->Cols() == 1) {
683 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
684 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
685 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
688 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpblock);
692 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
693 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
694 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
697 blockMat->setBlock(r,c,thBlock);
701 blockMat->endBlockFill();
706 #ifdef HAVE_XPETRA_EPETRA 707 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");
709 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
711 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
713 #endif // endif HAVE_XPETRA_TPETRA 717 #if defined(HAVE_XPETRA_EPETRA) && !defined(HAVE_XPETRA_TPETRA) 719 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
720 #endif // endif HAVE_XPETRA_EPETRA 728 #ifdef HAVE_XPETRA_EPETRA 730 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 732 class ThyraUtils<double, int, int,
EpetraNode> {
734 typedef double Scalar;
735 typedef int LocalOrdinal;
736 typedef int GlobalOrdinal;
740 #undef XPETRA_THYRAUTILS_SHORT 745 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
746 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) {
750 if(stridedBlockId == -1) {
751 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
754 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
761 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
762 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
764 using Teuchos::rcp_dynamic_cast;
766 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
767 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
768 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
770 RCP<Map> resultMap = Teuchos::null;
772 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
773 if(prodVectorSpace != Teuchos::null) {
776 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
777 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
778 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
779 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
780 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
787 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
788 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
789 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
792 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
793 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
804 bool bIsTpetra =
false;
805 #ifdef HAVE_XPETRA_TPETRA 806 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 807 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 808 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
809 bIsTpetra = Teuchos::is_null(tpetra_vsc) ? false :
true;
814 bool bIsEpetra = !bIsTpetra;
816 #ifdef HAVE_XPETRA_TPETRA 818 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 819 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 820 typedef Thyra::VectorBase<Scalar> ThyVecBase;
821 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
822 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
823 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
824 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
825 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
826 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
827 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
828 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
829 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
838 #ifdef HAVE_XPETRA_EPETRA 841 RCP<const Epetra_Map>
842 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
843 if(!Teuchos::is_null(epetra_map)) {
845 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
847 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
852 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
857 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
858 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
860 using Teuchos::rcp_dynamic_cast;
863 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
864 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
865 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
868 RCP<MultiVector> xpMultVec = Teuchos::null;
871 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
872 if(thyProdVec != Teuchos::null) {
876 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
881 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
882 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpBlockedMultVec));
885 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
886 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
889 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
892 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
897 bool bIsTpetra =
false;
898 #ifdef HAVE_XPETRA_TPETRA 899 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 900 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 904 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
905 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
906 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
908 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
910 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
911 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
912 if(thyraTpetraMultiVector != Teuchos::null) {
914 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
915 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
916 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
917 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
918 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
923 #ifdef HAVE_XPETRA_EPETRA 924 if(bIsTpetra ==
false) {
927 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
929 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xeMap));
930 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
931 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
932 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
933 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
934 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
935 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
939 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
945 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
946 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
947 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
948 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
949 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
954 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
956 bool bIsTpetra =
false;
957 #ifdef HAVE_XPETRA_TPETRA 958 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 959 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 961 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
962 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
966 #ifdef HAVE_XPETRA_EPETRA
967 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
969 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
971 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
972 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
973 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
974 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
975 std::cout <<
" properly set!" << std::endl;
976 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
986 if(bIsTpetra ==
false) {
987 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
988 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
989 if(ThyBlockedOp != Teuchos::null) {
990 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
991 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
992 ThyBlockedOp->getBlock(0,0);
993 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
994 bIsTpetra = isTpetra(b00);
1002 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1004 bool bIsEpetra =
false;
1006 #ifdef HAVE_XPETRA_EPETRA 1007 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
1008 bIsEpetra = Teuchos::is_null(epetra_op) ? false :
true;
1015 if(bIsEpetra ==
false) {
1016 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1017 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1018 if(ThyBlockedOp != Teuchos::null) {
1019 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1020 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1021 ThyBlockedOp->getBlock(0,0);
1022 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1023 bIsEpetra = isEpetra(b00);
1031 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1033 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1034 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1035 if(ThyBlockedOp != Teuchos::null) {
1041 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1042 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1044 #ifdef HAVE_XPETRA_TPETRA 1046 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1047 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1049 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1050 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1053 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1054 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1055 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1056 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1057 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1058 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1059 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1061 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1063 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1064 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1066 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1074 #ifdef HAVE_XPETRA_EPETRA 1076 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1077 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1078 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op);
1079 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1080 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat);
1081 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1082 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1083 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1085 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1087 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1089 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1091 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1095 return Teuchos::null;
1098 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1099 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1101 #ifdef HAVE_XPETRA_TPETRA 1103 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1104 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1106 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1107 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1108 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1109 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1110 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1111 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1112 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1114 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1116 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1117 return xTpetraCrsMat;
1124 #ifdef HAVE_XPETRA_EPETRA 1126 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1127 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1128 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op);
1129 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1130 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat);
1131 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1133 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1135 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1136 return xEpetraCrsMat;
1139 return Teuchos::null;
1142 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
1144 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
1147 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
1148 if(bmap.is_null() ==
false) {
1150 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
1151 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1153 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
1154 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1158 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1163 #ifdef HAVE_XPETRA_TPETRA 1165 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1166 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1168 if (tpetraMap == Teuchos::null)
1169 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1170 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1171 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1172 thyraMap = thyraTpetraMap;
1179 #ifdef HAVE_XPETRA_EPETRA 1182 if (epetraMap == Teuchos::null)
1183 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1184 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
1185 thyraMap = thyraEpetraMap;
1192 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
1196 #ifdef HAVE_XPETRA_TPETRA 1198 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1199 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
1200 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
1201 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1202 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
1207 #ifdef HAVE_XPETRA_EPETRA 1209 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1210 auto epMV = Teuchos::rcp_dynamic_cast<
const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
1211 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
1220 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
1224 #ifdef HAVE_XPETRA_TPETRA 1226 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1227 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
1228 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1229 thyVec->initialize(thyTpMap, tpVec);
1234 #ifdef HAVE_XPETRA_EPETRA 1236 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1237 auto epVec = rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
1238 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
1248 using Teuchos::rcp_dynamic_cast;
1250 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1251 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1252 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1255 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1258 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1259 if(prodTarget != Teuchos::null) {
1261 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
1262 if(bSourceVec.is_null() ==
true) {
1266 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1267 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.");
1269 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1271 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1274 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1275 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1276 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1277 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1278 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1279 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1280 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1283 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1284 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
1287 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1288 (*thyData)(i,j) = xpData[i];
1295 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.");
1297 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1299 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
1301 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
1304 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1305 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
1314 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
1315 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1316 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1317 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1318 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1319 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1322 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1323 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
1325 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1326 (*thyData)(i,j) = xpData[i];
1332 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
1335 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1337 #ifdef HAVE_XPETRA_TPETRA 1339 if(tpetraMat!=Teuchos::null) {
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))) 1344 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
1345 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
1346 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1348 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
1349 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
1350 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
1351 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
1353 thyraOp = Thyra::createConstLinearOp(tpOperator);
1354 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1361 #ifdef HAVE_XPETRA_EPETRA 1363 if(epetraMat!=Teuchos::null) {
1365 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
1366 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
1367 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1369 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
1370 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1371 thyraOp = thyraEpOp;
1377 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1380 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1382 #ifdef HAVE_XPETRA_TPETRA 1384 if(tpetraMat!=Teuchos::null) {
1385 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1386 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1389 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
1390 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
1391 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1393 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
1394 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
1395 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
1396 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
1398 thyraOp = Thyra::createLinearOp(tpOperator);
1399 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1406 #ifdef HAVE_XPETRA_EPETRA 1408 if(epetraMat!=Teuchos::null) {
1410 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
1411 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
1412 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1414 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
1415 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1416 thyraOp = thyraEpOp;
1422 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1426 #endif // #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 1428 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 1430 class ThyraUtils<double, int, long long,
EpetraNode> {
1432 typedef double Scalar;
1433 typedef int LocalOrdinal;
1434 typedef long long GlobalOrdinal;
1438 #undef XPETRA_THYRAUTILS_SHORT 1443 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
1444 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) {
1448 if(stridedBlockId == -1) {
1449 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
1452 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
1459 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
1460 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1462 using Teuchos::rcp_dynamic_cast;
1464 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1465 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1466 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1468 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
1469 if(prodVectorSpace != Teuchos::null) {
1472 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
1473 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
1474 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
1475 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1476 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1483 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
1484 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1485 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
1488 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1489 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1495 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
1502 bool bIsTpetra =
false;
1503 #ifdef HAVE_XPETRA_TPETRA 1504 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1505 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1506 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
1507 bIsTpetra = Teuchos::is_null(tpetra_vsc) ? false :
true;
1512 bool bIsEpetra = !bIsTpetra;
1514 #ifdef HAVE_XPETRA_TPETRA 1516 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1517 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1518 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1519 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
1520 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
1521 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1522 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1523 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
1524 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1525 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
1526 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1527 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
1530 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1538 #ifdef HAVE_XPETRA_EPETRA 1541 RCP<const Epetra_Map>
1542 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
1543 if(!Teuchos::is_null(epetra_map)) {
1545 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1548 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
1553 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Cannot transform Thyra::VectorSpace to Xpetra::Map.");
1558 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1559 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1561 using Teuchos::rcp_dynamic_cast;
1563 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1564 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1565 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1568 RCP<MultiVector> xpMultVec = Teuchos::null;
1571 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
1572 if(thyProdVec != Teuchos::null) {
1576 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(Teuchos::rcp_dynamic_cast<BlockedMap>(fullMap)));
1581 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
1582 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpBlockedMultVec));
1585 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
1586 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
1589 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
1592 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1597 bool bIsTpetra =
false;
1598 #ifdef HAVE_XPETRA_TPETRA 1599 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1600 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1604 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1605 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
1606 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
1608 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1610 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
1611 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
1612 if(thyraTpetraMultiVector != Teuchos::null) {
1614 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1615 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
1616 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1617 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
1618 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
1619 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1625 #ifdef HAVE_XPETRA_EPETRA 1626 if(bIsTpetra ==
false) {
1629 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
1631 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xeMap));
1632 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
1633 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
1634 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1635 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
1636 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1637 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
1639 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1644 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Cannot transform Thyra::MultiVector to Xpetra::MultiVector.");
1649 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1650 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1651 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
1652 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
1653 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
1658 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1660 bool bIsTpetra =
false;
1661 #ifdef HAVE_XPETRA_TPETRA 1662 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1663 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1665 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
1666 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
1670 #ifdef HAVE_XPETRA_EPETRA
1671 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1673 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1675 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1676 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1677 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1678 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1679 std::cout <<
" properly set!" << std::endl;
1680 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1690 if(bIsTpetra ==
false) {
1691 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1692 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1693 if(ThyBlockedOp != Teuchos::null) {
1694 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1695 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1696 ThyBlockedOp->getBlock(0,0);
1697 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1698 bIsTpetra = isTpetra(b00);
1706 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1708 bool bIsEpetra =
false;
1710 #ifdef HAVE_XPETRA_EPETRA 1711 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
1712 bIsEpetra = Teuchos::is_null(epetra_op) ? false :
true;
1719 if(bIsEpetra ==
false) {
1720 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1721 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1722 if(ThyBlockedOp != Teuchos::null) {
1723 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1724 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1725 ThyBlockedOp->getBlock(0,0);
1726 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1727 bIsEpetra = isEpetra(b00);
1735 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1737 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1738 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1739 if(ThyBlockedOp != Teuchos::null) {
1745 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1746 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1748 #ifdef HAVE_XPETRA_TPETRA 1750 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1751 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1753 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1754 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1757 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1758 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1759 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1760 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1761 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1762 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1763 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1765 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1767 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1768 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1770 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1778 #ifdef HAVE_XPETRA_EPETRA 1780 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1781 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1782 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op);
1783 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1784 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat);
1785 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1786 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1787 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1789 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1791 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1793 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1795 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1799 return Teuchos::null;
1802 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1803 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1805 #ifdef HAVE_XPETRA_TPETRA 1807 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1808 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1810 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1811 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1812 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1813 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1814 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1815 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1816 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1818 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1820 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1821 return xTpetraCrsMat;
1828 #ifdef HAVE_XPETRA_EPETRA 1830 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1831 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1832 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op);
1833 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1834 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat);
1835 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1837 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1839 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1840 return xEpetraCrsMat;
1843 return Teuchos::null;
1846 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
1848 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
1851 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
1852 if(bmap.is_null() ==
false) {
1854 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
1855 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1857 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
1858 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1862 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1867 #ifdef HAVE_XPETRA_TPETRA 1869 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1870 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1872 if (tpetraMap == Teuchos::null)
1873 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1874 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1875 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1876 thyraMap = thyraTpetraMap;
1883 #ifdef HAVE_XPETRA_EPETRA 1886 if (epetraMap == Teuchos::null)
1887 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1888 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
1889 thyraMap = thyraEpetraMap;
1896 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
1900 #ifdef HAVE_XPETRA_TPETRA 1902 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1903 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<
const TpetraMultiVector>(vec)->getTpetra_MultiVector();
1904 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
1905 auto thyMV = rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1906 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
1911 #ifdef HAVE_XPETRA_EPETRA 1913 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1914 auto epMV = Teuchos::rcp_dynamic_cast<
const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
1915 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
1923 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
1927 #ifdef HAVE_XPETRA_TPETRA 1929 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<
const TpetraMap>(vec->getMap())->getTpetra_Map());
1930 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<
const TpetraVector>(vec)->getTpetra_Vector();
1931 auto thyVec = rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1932 thyVec->initialize(thyTpMap, tpVec);
1937 #ifdef HAVE_XPETRA_EPETRA 1939 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1940 auto epVec = rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
1941 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
1951 using Teuchos::rcp_dynamic_cast;
1953 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1954 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1955 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1958 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1961 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1962 if(prodTarget != Teuchos::null) {
1963 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
1964 if(bSourceVec.is_null() ==
true) {
1968 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1969 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.");
1971 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1973 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1976 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1977 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1978 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1979 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1980 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1981 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1982 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1985 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1986 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
1989 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1990 (*thyData)(i,j) = xpData[i];
1997 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.");
1999 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2001 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
2003 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
2006 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
2007 Thyra::assign(thySubBlock.ptr(), *thyXpSubBlock);
2016 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
2017 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
2018 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2019 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
2020 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2021 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
2024 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
2025 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
2027 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2028 (*thyData)(i,j) = xpData[i];
2034 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
2037 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
2039 #ifdef HAVE_XPETRA_TPETRA 2041 if(tpetraMat!=Teuchos::null) {
2042 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 2043 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2046 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
2047 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
2048 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2050 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
2051 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
2052 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
2053 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
2055 thyraOp = Thyra::createConstLinearOp(tpOperator);
2056 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2063 #ifdef HAVE_XPETRA_EPETRA 2065 if(epetraMat!=Teuchos::null) {
2067 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
2068 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
2069 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2071 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
2072 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2073 thyraOp = thyraEpOp;
2079 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2082 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
2084 #ifdef HAVE_XPETRA_TPETRA 2086 if(tpetraMat!=Teuchos::null) {
2087 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 2088 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2091 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
2092 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
2093 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2095 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
2096 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
2097 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
2098 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
2100 thyraOp = Thyra::createLinearOp(tpOperator);
2101 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2108 #ifdef HAVE_XPETRA_EPETRA 2110 if(epetraMat!=Teuchos::null) {
2112 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
2113 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
2114 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2116 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
2117 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2118 thyraOp = thyraEpOp;
2124 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2128 #endif // XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 2130 #endif // HAVE_XPETRA_EPETRA 2134 #define XPETRA_THYRAUTILS_SHORT 2135 #endif // HAVE_XPETRA_THYRA 2137 #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.
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 CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
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.
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &map)