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" 73 #include <Thyra_VectorSpaceBase.hpp> 74 #include <Thyra_SpmdVectorSpaceBase.hpp> 75 #include <Thyra_ProductVectorSpaceBase.hpp> 76 #include <Thyra_ProductMultiVectorBase.hpp> 77 #include <Thyra_VectorSpaceBase.hpp> 78 #include <Thyra_DefaultProductVectorSpace.hpp> 79 #include <Thyra_DefaultBlockedLinearOp.hpp> 80 #include <Thyra_LinearOpBase.hpp> 81 #include <Thyra_DetachedMultiVectorView.hpp> 82 #include <Thyra_MultiVectorStdOps.hpp> 84 #ifdef HAVE_XPETRA_TPETRA 85 #include <Thyra_TpetraThyraWrappers.hpp> 86 #include <Thyra_TpetraVector.hpp> 87 #include <Thyra_TpetraVectorSpace.hpp> 88 #include <Tpetra_Map.hpp> 89 #include <Tpetra_Vector.hpp> 90 #include <Tpetra_CrsMatrix.hpp> 94 #ifdef HAVE_XPETRA_EPETRA 95 #include <Thyra_EpetraLinearOp.hpp> 96 #include <Thyra_EpetraThyraWrappers.hpp> 97 #include <Thyra_SpmdVectorBase.hpp> 98 #include <Thyra_get_Epetra_Operator.hpp> 99 #include <Epetra_Map.h> 100 #include <Epetra_Vector.h> 101 #include <Epetra_CrsMatrix.h> 108 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class BlockedCrsMatrix;
110 template <
class Scalar,
111 class LocalOrdinal = int,
112 class GlobalOrdinal = LocalOrdinal,
117 #undef XPETRA_THYRAUTILS_SHORT 126 if(stridedBlockId == -1) {
140 using Teuchos::rcp_dynamic_cast;
142 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
143 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
145 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
147 RCP<Map> resultMap = Teuchos::null;
148 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
149 if(prodVectorSpace != Teuchos::null) {
152 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
153 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
154 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
155 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
156 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
163 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
164 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
165 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
168 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
169 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
176 #ifdef HAVE_XPETRA_TPETRA 182 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
183 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
184 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
185 typedef Thyra::VectorBase<Scalar> ThyVecBase;
186 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
188 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
190 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
194 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.");
205 using Teuchos::rcp_dynamic_cast;
207 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
208 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
212 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
215 RCP<MultiVector> xpMultVec = Teuchos::null;
219 if(thyProdVec != Teuchos::null) {
228 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
232 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
233 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
236 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
240 #ifdef HAVE_XPETRA_TPETRA 241 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
242 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
244 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
245 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
247 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
248 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
250 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
252 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
254 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
256 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.");
267 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
274 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
278 bool bIsTpetra =
false;
279 #ifdef HAVE_XPETRA_TPETRA 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) {
306 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
307 if(ThyBlockedOp != Teuchos::null) {
310 ThyBlockedOp->getBlock(0,0);
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){
327 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
328 if(ThyBlockedOp != Teuchos::null) {
337 #ifdef HAVE_XPETRA_TPETRA 339 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
361 #ifdef HAVE_XPETRA_EPETRA 366 return Teuchos::null;
372 #ifdef HAVE_XPETRA_TPETRA 374 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
385 return xTpetraCrsMat;
389 #ifdef HAVE_XPETRA_EPETRA 394 return Teuchos::null;
402 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
403 if(bmap.is_null() ==
false) {
406 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
409 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
413 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
418 #ifdef HAVE_XPETRA_TPETRA 421 if (tpetraMap == Teuchos::null)
422 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
423 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
424 thyraMap = thyraTpetraMap;
428 #ifdef HAVE_XPETRA_EPETRA 442 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
444 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
445 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
450 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
453 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
454 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
459 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
462 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
463 (*thyData)(i,j) = vecData[i];
475 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
477 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
478 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
486 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
487 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
492 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
495 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
496 (*thyData)(i,j) = vecData[i];
508 using Teuchos::rcp_dynamic_cast;
510 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
511 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
512 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
515 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
519 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
520 if(prodTarget != Teuchos::null) {
521 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
522 if(bSourceVec.is_null() ==
true) {
526 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
527 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.");
529 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
531 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
535 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
536 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
537 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
538 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
539 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
543 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
547 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
548 (*thyData)(i,j) = xpData[i];
555 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.");
557 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
559 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
565 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
574 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
575 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
576 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
577 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
578 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
582 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
585 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
586 (*thyData)(i,j) = xpData[i];
599 #ifdef HAVE_XPETRA_TPETRA 601 if(tpetraMat!=Teuchos::null) {
613 thyraOp = Thyra::createConstLinearOp(tpOperator);
616 #ifdef HAVE_XPETRA_EPETRA 625 return Teuchos::null;
636 #ifdef HAVE_XPETRA_TPETRA 638 if(tpetraMat!=Teuchos::null) {
650 thyraOp = Thyra::createLinearOp(tpOperator);
654 #ifdef HAVE_XPETRA_EPETRA 663 return Teuchos::null;
670 int nRows = mat->Rows();
671 int nCols = mat->Cols();
677 #ifdef HAVE_XPETRA_TPETRA 679 if(tpetraMat!=Teuchos::null) {
683 Thyra::defaultBlockedLinearOp<Scalar>();
685 blockMat->beginBlockFill(nRows,nCols);
687 for (
int r=0; r<nRows; ++r) {
688 for (
int c=0; c<nCols; ++c) {
691 if(xpmat == Teuchos::null)
continue;
698 if(xpblock != Teuchos::null) {
699 if(xpblock->Rows() == 1 && xpblock->Cols() == 1) {
703 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
706 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpblock);
712 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
715 blockMat->setBlock(r,c,thBlock);
719 blockMat->endBlockFill();
724 #ifdef HAVE_XPETRA_EPETRA 729 return Teuchos::null;
731 #endif // endif HAVE_XPETRA_TPETRA 733 #ifdef HAVE_XPETRA_EPETRA 735 return Teuchos::null;
736 #endif // endif HAVE_XPETRA_EPETRA 744 #ifdef HAVE_XPETRA_EPETRA 746 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 748 class ThyraUtils<double, int, int,
EpetraNode> {
750 typedef double Scalar;
751 typedef int LocalOrdinal;
752 typedef int GlobalOrdinal;
756 #undef XPETRA_THYRAUTILS_SHORT 766 if(stridedBlockId == -1) {
780 using Teuchos::rcp_dynamic_cast;
782 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
783 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
786 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
788 RCP<Map> resultMap = Teuchos::null;
790 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
791 if(prodVectorSpace != Teuchos::null) {
794 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
795 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
796 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
797 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
798 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
805 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
806 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
807 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
810 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
811 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
822 bool bIsTpetra =
false;
823 #ifdef HAVE_XPETRA_TPETRA 824 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 825 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 832 bool bIsEpetra = !bIsTpetra;
834 #ifdef HAVE_XPETRA_TPETRA 836 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 837 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 838 typedef Thyra::VectorBase<Scalar> ThyVecBase;
839 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
840 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
841 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
842 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
844 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
846 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
856 #ifdef HAVE_XPETRA_EPETRA 859 RCP<const Epetra_Map>
860 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
878 using Teuchos::rcp_dynamic_cast;
880 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
881 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
885 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
888 RCP<MultiVector> xpMultVec = Teuchos::null;
892 if(thyProdVec != Teuchos::null) {
901 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
905 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
906 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
909 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
917 bool bIsTpetra =
false;
918 #ifdef HAVE_XPETRA_TPETRA 919 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 920 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 924 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
925 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
926 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
928 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
930 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
931 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
932 if(thyraTpetraMultiVector != Teuchos::null) {
934 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
936 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
938 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
943 #ifdef HAVE_XPETRA_EPETRA 944 if(bIsTpetra ==
false) {
950 RCP<const Epetra_Map> eMap = Teuchos::rcpFromRef(xeMap->getEpetra_Map());
954 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
963 return Teuchos::null;
970 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
976 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
978 bool bIsTpetra =
false;
979 #ifdef HAVE_XPETRA_TPETRA 980 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 981 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 988 #ifdef HAVE_XPETRA_EPETRA
989 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
991 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
993 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
994 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
995 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
996 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
997 std::cout <<
" properly set!" << std::endl;
998 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1008 if(bIsTpetra ==
false) {
1010 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1011 if(ThyBlockedOp != Teuchos::null) {
1014 ThyBlockedOp->getBlock(0,0);
1016 bIsTpetra = isTpetra(b00);
1024 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1026 bool bIsEpetra =
false;
1028 #ifdef HAVE_XPETRA_EPETRA 1037 if(bIsEpetra ==
false) {
1039 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1040 if(ThyBlockedOp != Teuchos::null) {
1043 ThyBlockedOp->getBlock(0,0);
1045 bIsEpetra = isEpetra(b00);
1053 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1056 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1057 if(ThyBlockedOp != Teuchos::null) {
1066 #ifdef HAVE_XPETRA_TPETRA 1068 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1069 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1071 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1096 #ifdef HAVE_XPETRA_EPETRA 1117 return Teuchos::null;
1123 #ifdef HAVE_XPETRA_TPETRA 1125 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1126 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1128 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1139 return xTpetraCrsMat;
1146 #ifdef HAVE_XPETRA_EPETRA 1158 return xEpetraCrsMat;
1161 return Teuchos::null;
1169 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
1170 if(bmap.is_null() ==
false) {
1173 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1176 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1180 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1185 #ifdef HAVE_XPETRA_TPETRA 1187 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1188 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1190 if (tpetraMap == Teuchos::null)
1191 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1192 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1193 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1194 thyraMap = thyraTpetraMap;
1201 #ifdef HAVE_XPETRA_EPETRA 1204 if (epetraMap == Teuchos::null)
1205 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1206 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(Teuchos::rcpFromRef(epetraMap->getEpetra_Map()));
1207 thyraMap = thyraEpetraMap;
1219 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1221 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1222 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1227 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
1230 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1231 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1236 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1239 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1240 (*thyData)(i,j) = vecData[i];
1252 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1254 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1255 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1263 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1264 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1269 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1272 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1273 (*thyData)(i,j) = vecData[i];
1282 using Teuchos::rcp_dynamic_cast;
1284 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1285 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1286 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1289 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1293 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1294 if(prodTarget != Teuchos::null) {
1296 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
1297 if(bSourceVec.is_null() ==
true) {
1301 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1302 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.");
1304 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1306 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1310 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1311 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1312 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1313 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1314 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1318 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1322 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1323 (*thyData)(i,j) = xpData[i];
1330 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.");
1332 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1334 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
1340 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
1349 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
1350 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1351 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1352 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1353 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1357 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1360 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1361 (*thyData)(i,j) = xpData[i];
1372 #ifdef HAVE_XPETRA_TPETRA 1374 if(tpetraMat!=Teuchos::null) {
1375 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1376 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1388 thyraOp = Thyra::createConstLinearOp(tpOperator);
1396 #ifdef HAVE_XPETRA_EPETRA 1398 if(epetraMat!=Teuchos::null) {
1406 thyraOp = thyraEpOp;
1417 #ifdef HAVE_XPETRA_TPETRA 1419 if(tpetraMat!=Teuchos::null) {
1420 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1421 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1433 thyraOp = Thyra::createLinearOp(tpOperator);
1441 #ifdef HAVE_XPETRA_EPETRA 1443 if(epetraMat!=Teuchos::null) {
1451 thyraOp = thyraEpOp;
1461 #endif // #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 1463 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 1465 class ThyraUtils<double, int, long long,
EpetraNode> {
1467 typedef double Scalar;
1468 typedef int LocalOrdinal;
1469 typedef long long GlobalOrdinal;
1473 #undef XPETRA_THYRAUTILS_SHORT 1483 if(stridedBlockId == -1) {
1497 using Teuchos::rcp_dynamic_cast;
1499 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1500 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1502 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1504 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
1505 if(prodVectorSpace != Teuchos::null) {
1508 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
1509 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
1510 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
1511 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1512 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1519 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
1520 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1521 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
1524 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1525 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1538 bool bIsTpetra =
false;
1539 #ifdef HAVE_XPETRA_TPETRA 1540 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1541 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1548 bool bIsEpetra = !bIsTpetra;
1550 #ifdef HAVE_XPETRA_TPETRA 1552 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1553 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1554 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1555 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
1556 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
1557 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1558 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1560 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1562 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1574 #ifdef HAVE_XPETRA_EPETRA 1577 RCP<const Epetra_Map>
1578 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
1590 return Teuchos::null;
1597 using Teuchos::rcp_dynamic_cast;
1599 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1600 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1604 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1607 RCP<MultiVector> xpMultVec = Teuchos::null;
1611 if(thyProdVec != Teuchos::null) {
1620 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
1624 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
1625 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
1628 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
1636 bool bIsTpetra =
false;
1637 #ifdef HAVE_XPETRA_TPETRA 1638 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1639 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1643 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1644 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
1645 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
1647 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1649 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
1650 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
1651 if(thyraTpetraMultiVector != Teuchos::null) {
1653 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1655 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1657 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
1664 #ifdef HAVE_XPETRA_EPETRA 1665 if(bIsTpetra ==
false) {
1671 RCP<const Epetra_Map> eMap = Teuchos::rcpFromRef(xeMap->getEpetra_Map());
1675 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1684 return Teuchos::null;
1691 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
1697 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1699 bool bIsTpetra =
false;
1700 #ifdef HAVE_XPETRA_TPETRA 1701 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1702 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1709 #ifdef HAVE_XPETRA_EPETRA
1710 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1712 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1714 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1715 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1716 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1717 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1718 std::cout <<
" properly set!" << std::endl;
1719 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1729 if(bIsTpetra ==
false) {
1731 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1732 if(ThyBlockedOp != Teuchos::null) {
1735 ThyBlockedOp->getBlock(0,0);
1737 bIsTpetra = isTpetra(b00);
1745 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1747 bool bIsEpetra =
false;
1749 #ifdef HAVE_XPETRA_EPETRA 1758 if(bIsEpetra ==
false) {
1760 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1761 if(ThyBlockedOp != Teuchos::null) {
1764 ThyBlockedOp->getBlock(0,0);
1766 bIsEpetra = isEpetra(b00);
1774 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1777 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1778 if(ThyBlockedOp != Teuchos::null) {
1787 #ifdef HAVE_XPETRA_TPETRA 1789 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1790 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1792 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1817 #ifdef HAVE_XPETRA_EPETRA 1838 return Teuchos::null;
1844 #ifdef HAVE_XPETRA_TPETRA 1846 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1847 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1849 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1860 return xTpetraCrsMat;
1867 #ifdef HAVE_XPETRA_EPETRA 1879 return xEpetraCrsMat;
1882 return Teuchos::null;
1890 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<
const BlockedMap>(map);
1891 if(bmap.is_null() ==
false) {
1894 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1897 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1901 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
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 if (tpetraMap == Teuchos::null)
1912 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1913 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1914 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1915 thyraMap = thyraTpetraMap;
1922 #ifdef HAVE_XPETRA_EPETRA 1925 if (epetraMap == Teuchos::null)
1926 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1927 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(Teuchos::rcpFromRef(epetraMap->getEpetra_Map()));
1928 thyraMap = thyraEpetraMap;
1940 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1942 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1943 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1948 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
1951 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1952 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1957 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1960 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1961 (*thyData)(i,j) = vecData[i];
1973 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1975 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1976 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1984 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1985 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1990 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1993 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1994 (*thyData)(i,j) = vecData[i];
2003 using Teuchos::rcp_dynamic_cast;
2005 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
2006 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
2007 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
2010 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
2014 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
2015 if(prodTarget != Teuchos::null) {
2016 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<
const BlockedMultiVector>(source);
2017 if(bSourceVec.is_null() ==
true) {
2021 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
2022 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.");
2024 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2026 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
2030 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
2031 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
2032 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2033 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
2034 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2038 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
2042 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2043 (*thyData)(i,j) = xpData[i];
2050 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.");
2052 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2054 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
2060 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
2069 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
2070 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
2071 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2072 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
2073 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2077 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
2080 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2081 (*thyData)(i,j) = xpData[i];
2092 #ifdef HAVE_XPETRA_TPETRA 2094 if(tpetraMat!=Teuchos::null) {
2095 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 2096 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2108 thyraOp = Thyra::createConstLinearOp(tpOperator);
2116 #ifdef HAVE_XPETRA_EPETRA 2118 if(epetraMat!=Teuchos::null) {
2126 thyraOp = thyraEpOp;
2137 #ifdef HAVE_XPETRA_TPETRA 2139 if(tpetraMat!=Teuchos::null) {
2140 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 2141 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2153 thyraOp = Thyra::createLinearOp(tpOperator);
2161 #ifdef HAVE_XPETRA_EPETRA 2163 if(epetraMat!=Teuchos::null) {
2171 thyraOp = thyraEpOp;
2181 #endif // XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 2183 #endif // HAVE_XPETRA_EPETRA 2187 #define XPETRA_THYRAUTILS_SHORT 2188 #endif // HAVE_XPETRA_THYRA 2190 #endif // XPETRA_THYRAUTILS_HPP
bool is_null(const std::shared_ptr< T > &p)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Exception throws to report errors in the internal logical of the program.
Kokkos::Compat::KokkosSerialWrapperNode EpetraNode
Xpetra utility class for common map-related routines.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static RCP< StridedMap > 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, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
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
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &)
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
TypeTo as(const TypeFrom &t)
Concrete implementation of Xpetra::Matrix.
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.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)