47#ifndef XPETRA_THYRAUTILS_HPP
48#define XPETRA_THYRAUTILS_HPP
51#ifdef HAVE_XPETRA_THYRA
55#ifdef HAVE_XPETRA_TPETRA
56#include "Tpetra_ConfigDefs.hpp"
59#ifdef HAVE_XPETRA_EPETRA
60#include "Epetra_config.h"
61#include "Epetra_CombineMode.h"
64#include "Xpetra_Map.hpp"
65#include "Xpetra_BlockedMap.hpp"
66#include "Xpetra_BlockedMultiVector.hpp"
69#include "Xpetra_StridedMap.hpp"
70#include "Xpetra_StridedMapFactory.hpp"
71#include "Xpetra_MapExtractor.hpp"
74#include "Xpetra_CrsMatrixWrap.hpp"
75#include "Xpetra_MultiVectorFactory.hpp"
77#include <Thyra_VectorSpaceBase.hpp>
78#include <Thyra_SpmdVectorSpaceBase.hpp>
79#include <Thyra_ProductVectorSpaceBase.hpp>
80#include <Thyra_ProductMultiVectorBase.hpp>
81#include <Thyra_VectorSpaceBase.hpp>
82#include <Thyra_DefaultProductVectorSpace.hpp>
83#include <Thyra_DefaultBlockedLinearOp.hpp>
84#include <Thyra_LinearOpBase.hpp>
85#include "Thyra_DiagonalLinearOpBase.hpp"
86#include <Thyra_DetachedMultiVectorView.hpp>
87#include <Thyra_MultiVectorStdOps.hpp>
89#ifdef HAVE_XPETRA_TPETRA
90#include <Thyra_TpetraThyraWrappers.hpp>
91#include <Thyra_TpetraVector.hpp>
92#include <Thyra_TpetraMultiVector.hpp>
93#include <Thyra_TpetraVectorSpace.hpp>
94#include <Tpetra_Map.hpp>
95#include <Tpetra_Vector.hpp>
96#include <Tpetra_CrsMatrix.hpp>
97#include <Xpetra_TpetraMap.hpp>
99#include <Xpetra_TpetraCrsMatrix.hpp>
101#ifdef HAVE_XPETRA_EPETRA
102#include <Thyra_EpetraLinearOp.hpp>
103#include <Thyra_EpetraThyraWrappers.hpp>
104#include <Thyra_SpmdVectorBase.hpp>
105#include <Thyra_get_Epetra_Operator.hpp>
106#include <Epetra_Map.h>
107#include <Epetra_Vector.h>
108#include <Epetra_CrsMatrix.h>
115template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class BlockedCrsMatrix;
117template <
class Scalar,
118class LocalOrdinal = int,
119class GlobalOrdinal = LocalOrdinal,
124#undef XPETRA_THYRAUTILS_SHORT
133 if(stridedBlockId == -1) {
147 using Teuchos::rcp_dynamic_cast;
149 using ThyVecSpaceBase = Thyra::VectorSpaceBase<Scalar>;
150 using ThyProdVecSpaceBase = Thyra::ProductVectorSpaceBase<Scalar>;
151 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
154 RCP<Map> resultMap = Teuchos::null;
155 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase >(vectorSpace);
156 if(prodVectorSpace != Teuchos::null) {
159 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
160 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
161 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
162 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
163 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
165 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
170 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
171 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
172 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
175 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
176 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
178 mapsXpetra[b] = MapUtils::transformThyra2XpetraGIDs(*mapsThyra[b], gidOffsets[b]);
183#ifdef HAVE_XPETRA_TPETRA
189 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
190 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
191 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
192 typedef Thyra::VectorBase<Scalar> ThyVecBase;
193 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
195 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
197 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
201 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.");
212 using Teuchos::rcp_dynamic_cast;
215 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
216 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
217 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
220 RCP<MultiVector> xpMultVec = Teuchos::null;
224 if(thyProdVec != Teuchos::null) {
227 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
231 xpMultVec = MultiVectorFactory::Build(fullMap, as<size_t>(thyProdVec->domain()->dim()));
233 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
236 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
237 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
239 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
240 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
244#ifdef HAVE_XPETRA_TPETRA
245 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
246 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
248 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
249 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
251 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
252 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
254 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
256 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
258 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
260 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.");
271 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
274 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(r);
278 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
282 bool bIsTpetra =
false;
283#ifdef HAVE_XPETRA_TPETRA
289#ifdef HAVE_XPETRA_EPETRA
290 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
292 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
294 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
295 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
296 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
297 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
298 std::cout <<
" properly set!" << std::endl;
299 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
308 if(bIsTpetra ==
false) {
310 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
311 if(ThyBlockedOp != Teuchos::null) {
314 ThyBlockedOp->getBlock(0,0);
316 bIsTpetra = isTpetra(b00);
324 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
328 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
331 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
332 if(ThyBlockedOp != Teuchos::null) {
341#ifdef HAVE_XPETRA_TPETRA
343 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
358 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
362 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
367#ifdef HAVE_XPETRA_EPETRA
372 return Teuchos::null;
378#ifdef HAVE_XPETRA_TPETRA
380 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
390 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
394 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
399#ifdef HAVE_XPETRA_EPETRA
404 return Teuchos::null;
408 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
410#ifdef HAVE_XPETRA_TPETRA
412 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
420 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
425#ifdef HAVE_XPETRA_EPETRA
430 return Teuchos::null;
434 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
436#ifdef HAVE_XPETRA_TPETRA
438 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
446 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
451#ifdef HAVE_XPETRA_EPETRA
456 return Teuchos::null;
461 using Teuchos::rcp_dynamic_cast;
462 using Teuchos::rcp_const_cast;
464 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
466 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
467#ifdef HAVE_XPETRA_TPETRA
468 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
469 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
470 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
471 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
472 if (!tDiag.is_null())
483 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
491 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
492 if(bmap.is_null() ==
false) {
495 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
498 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
502 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
507#ifdef HAVE_XPETRA_TPETRA
510 if (tpetraMap == Teuchos::null)
511 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
512 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
513 thyraMap = thyraTpetraMap;
517#ifdef HAVE_XPETRA_EPETRA
530#ifdef HAVE_XPETRA_TPETRA
532 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
533 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
534 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
535 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
536 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
541#ifdef HAVE_XPETRA_EPETRA
554#ifdef HAVE_XPETRA_TPETRA
556 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
557 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
558 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
559 thyVec->initialize(thyTpMap, tpVec);
564#ifdef HAVE_XPETRA_EPETRA
578 using Teuchos::rcp_dynamic_cast;
580 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
581 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
582 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
585 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
589 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
590 if(prodTarget != Teuchos::null) {
591 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
592 if(bSourceVec.is_null() ==
true) {
596 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
597 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.");
599 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
601 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
605 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
606 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
607 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
608 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
609 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
613 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
617 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
618 (*thyData)(i,j) = xpData[i];
625 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.");
627 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
629 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
635 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
644 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
645 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
646 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
647 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
648 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
652 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
655 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
656 (*thyData)(i,j) = xpData[i];
669#ifdef HAVE_XPETRA_TPETRA
671 if(tpetraMat!=Teuchos::null) {
680 thyraOp = Thyra::createConstLinearOp(tpOperator);
683#ifdef HAVE_XPETRA_EPETRA
703#ifdef HAVE_XPETRA_TPETRA
705 if(tpetraMat!=Teuchos::null) {
714 thyraOp = Thyra::createLinearOp(tpOperator);
718#ifdef HAVE_XPETRA_EPETRA
734 int nRows = mat->Rows();
735 int nCols = mat->Cols();
741#ifdef HAVE_XPETRA_TPETRA
743 if(tpetraMat!=Teuchos::null) {
747 Thyra::defaultBlockedLinearOp<Scalar>();
749 blockMat->beginBlockFill(nRows,nCols);
751 for (
int r=0; r<nRows; ++r) {
752 for (
int c=0; c<nCols; ++c) {
755 if(xpmat == Teuchos::null)
continue;
761 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpmat);
762 if(xpblock != Teuchos::null) {
763 if(xpblock->Rows() == 1 && xpblock->Cols() == 1) {
767 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
770 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpblock);
776 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
779 blockMat->setBlock(r,c,thBlock);
783 blockMat->endBlockFill();
788#ifdef HAVE_XPETRA_EPETRA
799#if defined(HAVE_XPETRA_EPETRA) && !defined(HAVE_XPETRA_TPETRA)
810#ifdef HAVE_XPETRA_EPETRA
812#ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
814class ThyraUtils<double, int, int,
EpetraNode> {
816 typedef double Scalar;
817 typedef int LocalOrdinal;
818 typedef int GlobalOrdinal;
822#undef XPETRA_THYRAUTILS_SHORT
832 if(stridedBlockId == -1) {
846 using Teuchos::rcp_dynamic_cast;
848 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
849 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
850 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
852 RCP<Map> resultMap = Teuchos::null;
854 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase >(vectorSpace);
855 if(prodVectorSpace != Teuchos::null) {
858 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
859 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
860 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
861 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
862 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
864 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
869 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
870 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
871 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
874 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
875 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
877 mapsXpetra[b] = MapUtils::transformThyra2XpetraGIDs(*mapsThyra[b], gidOffsets[b]);
886 bool bIsTpetra =
false;
887#ifdef HAVE_XPETRA_TPETRA
888#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
889 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
896 bool bIsEpetra = !bIsTpetra;
898#ifdef HAVE_XPETRA_TPETRA
900#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
901 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
902 typedef Thyra::VectorBase<Scalar> ThyVecBase;
903 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
904 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
905 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
906 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
908 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
910 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
920#ifdef HAVE_XPETRA_EPETRA
923 RCP<const Epetra_Map>
924 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
942 using Teuchos::rcp_dynamic_cast;
945 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
946 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
947 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
950 RCP<MultiVector> xpMultVec = Teuchos::null;
954 if(thyProdVec != Teuchos::null) {
957 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
961 xpMultVec = MultiVectorFactory::Build(fullMap, as<size_t>(thyProdVec->domain()->dim()));
963 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
966 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
967 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
969 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
970 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
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)))
985 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
986 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
987 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
989 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
991 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
992 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
993 if(thyraTpetraMultiVector != Teuchos::null) {
995 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
997 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
999 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
1004#ifdef HAVE_XPETRA_EPETRA
1005 if(bIsTpetra ==
false) {
1009 RCP<Xpetra::EpetraMapT<GlobalOrdinal,Node> > xeMap = rcp_dynamic_cast<Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map,
true);
1010 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
1014 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1028 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
1031 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(r);
1034 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1036 bool bIsTpetra =
false;
1037#ifdef HAVE_XPETRA_TPETRA
1038#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1039 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1046#ifdef HAVE_XPETRA_EPETRA
1047 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1049 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1051 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1052 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1053 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1054 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1055 std::cout <<
" properly set!" << std::endl;
1056 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1066 if(bIsTpetra ==
false) {
1068 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1069 if(ThyBlockedOp != Teuchos::null) {
1072 ThyBlockedOp->getBlock(0,0);
1074 bIsTpetra = isTpetra(b00);
1082 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1084 bool bIsEpetra =
false;
1086#ifdef HAVE_XPETRA_EPETRA
1095 if(bIsEpetra ==
false) {
1097 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1098 if(ThyBlockedOp != Teuchos::null) {
1101 ThyBlockedOp->getBlock(0,0);
1103 bIsEpetra = isEpetra(b00);
1111 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1114 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1115 if(ThyBlockedOp != Teuchos::null) {
1124#ifdef HAVE_XPETRA_TPETRA
1126#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1127 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1129 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1144 Teuchos::rcp_dynamic_cast<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat);
1146 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1150 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1158#ifdef HAVE_XPETRA_EPETRA
1172 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1176 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1180 return Teuchos::null;
1186#ifdef HAVE_XPETRA_TPETRA
1188#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1189 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1191 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1201 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1205 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1213#ifdef HAVE_XPETRA_EPETRA
1224 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1228 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1232 return Teuchos::null;
1237 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1239 return toXpetraOperator(Teuchos::rcp_const_cast<Thyra::LinearOpBase<Scalar> >(op));
1268 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1270#ifdef HAVE_XPETRA_TPETRA
1272 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1280 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
1285#ifdef HAVE_XPETRA_EPETRA
1290 return Teuchos::null;
1295 using Teuchos::rcp_dynamic_cast;
1296 using Teuchos::rcp_const_cast;
1298 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
1300 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
1301#ifdef HAVE_XPETRA_TPETRA
1302 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
1303 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
1304 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
1305 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
1306 if (!tDiag.is_null())
1310#ifdef HAVE_XPETRA_EPETRA
1311 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
1312 if (xpDiag.is_null()) {
1313 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
1314 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
1315 if (!map.is_null()) {
1316 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
1317 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
1319 xpDiag = rcp_dynamic_cast<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(xpEpDiag,
true);
1330 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
1338 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
1339 if(bmap.is_null() ==
false) {
1342 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1345 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1349 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1354#ifdef HAVE_XPETRA_TPETRA
1356#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1357 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1359 if (tpetraMap == Teuchos::null)
1360 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1361 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1362 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1363 thyraMap = thyraTpetraMap;
1370#ifdef HAVE_XPETRA_EPETRA
1373 if (epetraMap == Teuchos::null)
1374 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1375 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
1376 thyraMap = thyraEpetraMap;
1387#ifdef HAVE_XPETRA_TPETRA
1389 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
1390 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
1391 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
1392 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1393 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
1398#ifdef HAVE_XPETRA_EPETRA
1400 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1401 auto epMV = Teuchos::rcp_dynamic_cast<const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
1402 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
1415#ifdef HAVE_XPETRA_TPETRA
1417 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
1418 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
1419 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1420 thyVec->initialize(thyTpMap, tpVec);
1425#ifdef HAVE_XPETRA_EPETRA
1427 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1428 auto epVec =
rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
1429 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
1439 using Teuchos::rcp_dynamic_cast;
1441 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1442 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1443 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1446 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1449 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1450 if(prodTarget != Teuchos::null) {
1452 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
1453 if(bSourceVec.is_null() ==
true) {
1457 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1458 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.");
1460 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1462 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1466 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1467 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
1468 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1469 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1470 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1474 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1478 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1479 (*thyData)(i,j) = xpData[i];
1486 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.");
1488 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1490 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
1496 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
1505 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
1506 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1507 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1508 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1509 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1513 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1516 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1517 (*thyData)(i,j) = xpData[i];
1528#ifdef HAVE_XPETRA_TPETRA
1530 if(tpetraMat!=Teuchos::null) {
1531#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1532 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1541 thyraOp = Thyra::createConstLinearOp(tpOperator);
1549#ifdef HAVE_XPETRA_EPETRA
1551 if(epetraMat!=Teuchos::null) {
1559 thyraOp = thyraEpOp;
1570#ifdef HAVE_XPETRA_TPETRA
1572 if(tpetraMat!=Teuchos::null) {
1573#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1574 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1583 thyraOp = Thyra::createLinearOp(tpOperator);
1591#ifdef HAVE_XPETRA_EPETRA
1593 if(epetraMat!=Teuchos::null) {
1600 thyraOp = thyraEpOp;
1612#ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
1614class ThyraUtils<double, int, long long,
EpetraNode> {
1616 typedef double Scalar;
1617 typedef int LocalOrdinal;
1618 typedef long long GlobalOrdinal;
1622#undef XPETRA_THYRAUTILS_SHORT
1632 if(stridedBlockId == -1) {
1646 using Teuchos::rcp_dynamic_cast;
1648 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1649 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1650 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1652 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase >(vectorSpace);
1653 if(prodVectorSpace != Teuchos::null) {
1656 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
1657 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
1658 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
1659 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1660 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1662 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
1667 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
1668 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1669 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
1672 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1673 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1675 mapsXpetra[b] = MapUtils::transformThyra2XpetraGIDs(*mapsThyra[b], gidOffsets[b]);
1686 bool bIsTpetra =
false;
1687#ifdef HAVE_XPETRA_TPETRA
1688#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1689 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1696 bool bIsEpetra = !bIsTpetra;
1698#ifdef HAVE_XPETRA_TPETRA
1700#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1701 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1702 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1703 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
1704 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
1705 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1706 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1708 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1710 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1722#ifdef HAVE_XPETRA_EPETRA
1725 RCP<const Epetra_Map>
1726 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
1745 using Teuchos::rcp_dynamic_cast;
1747 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1748 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1749 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1752 RCP<MultiVector> xpMultVec = Teuchos::null;
1756 if(thyProdVec != Teuchos::null) {
1759 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
1763 xpMultVec = MultiVectorFactory::Build(fullMap, as<size_t>(thyProdVec->domain()->dim()));
1765 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
1769 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
1770 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
1772 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
1773 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
1781 bool bIsTpetra =
false;
1782#ifdef HAVE_XPETRA_TPETRA
1783#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1784 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1788 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1789 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
1790 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
1792 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1794 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
1795 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
1796 if(thyraTpetraMultiVector != Teuchos::null) {
1798 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1800 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1802 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
1809#ifdef HAVE_XPETRA_EPETRA
1810 if(bIsTpetra ==
false) {
1814 RCP<Xpetra::EpetraMapT<GlobalOrdinal,Node> > xeMap = rcp_dynamic_cast<Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map,
true);
1815 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
1819 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1835 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
1838 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(r);
1841 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1843 bool bIsTpetra =
false;
1844#ifdef HAVE_XPETRA_TPETRA
1845#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1846 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1853#ifdef HAVE_XPETRA_EPETRA
1854 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1856 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1858 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1859 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1860 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1861 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1862 std::cout <<
" properly set!" << std::endl;
1863 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1873 if(bIsTpetra ==
false) {
1875 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1876 if(ThyBlockedOp != Teuchos::null) {
1879 ThyBlockedOp->getBlock(0,0);
1881 bIsTpetra = isTpetra(b00);
1889 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1891 bool bIsEpetra =
false;
1893#ifdef HAVE_XPETRA_EPETRA
1902 if(bIsEpetra ==
false) {
1904 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1905 if(ThyBlockedOp != Teuchos::null) {
1908 ThyBlockedOp->getBlock(0,0);
1910 bIsEpetra = isEpetra(b00);
1918 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1921 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1922 if(ThyBlockedOp != Teuchos::null) {
1931#ifdef HAVE_XPETRA_TPETRA
1933#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1934 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1936 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1951 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1955 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1963#ifdef HAVE_XPETRA_EPETRA
1977 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1981 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1985 return Teuchos::null;
1991#ifdef HAVE_XPETRA_TPETRA
1993#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1994 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1996 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2007 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
2011 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
2019#ifdef HAVE_XPETRA_EPETRA
2031 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
2035 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
2039 return Teuchos::null;
2043 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
2045#ifdef HAVE_XPETRA_TPETRA
2047 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2055 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
2060#ifdef HAVE_XPETRA_EPETRA
2065 return Teuchos::null;
2069 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
2071#ifdef HAVE_XPETRA_TPETRA
2073 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2081 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
2086#ifdef HAVE_XPETRA_EPETRA
2091 return Teuchos::null;
2096 using Teuchos::rcp_dynamic_cast;
2097 using Teuchos::rcp_const_cast;
2098 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
2099 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
2100 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
2102 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
2104 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
2105#ifdef HAVE_XPETRA_TPETRA
2106 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
2107 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
2108 if (!tDiag.is_null())
2112#ifdef HAVE_XPETRA_EPETRA
2113 if (xpDiag.is_null()) {
2114 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
2115 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
2116 if (!map.is_null()) {
2117 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
2118 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
2120 xpDiag = rcp_dynamic_cast<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(xpEpDiag,
true);
2131 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
2139 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
2140 if(bmap.is_null() ==
false) {
2143 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
2146 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
2150 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
2155#ifdef HAVE_XPETRA_TPETRA
2157#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2158 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2160 if (tpetraMap == Teuchos::null)
2161 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
2162 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
2163 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
2164 thyraMap = thyraTpetraMap;
2171#ifdef HAVE_XPETRA_EPETRA
2174 if (epetraMap == Teuchos::null)
2175 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
2176 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
2177 thyraMap = thyraEpetraMap;
2188#ifdef HAVE_XPETRA_TPETRA
2190 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
2191 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
2192 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
2193 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2194 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
2199#ifdef HAVE_XPETRA_EPETRA
2201 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
2202 auto epMV = Teuchos::rcp_dynamic_cast<const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
2203 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
2215#ifdef HAVE_XPETRA_TPETRA
2217 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
2218 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
2219 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2220 thyVec->initialize(thyTpMap, tpVec);
2225#ifdef HAVE_XPETRA_EPETRA
2227 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
2228 auto epVec =
rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
2229 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
2239 using Teuchos::rcp_dynamic_cast;
2241 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
2242 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
2243 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
2246 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
2249 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
2250 if(prodTarget != Teuchos::null) {
2251 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
2252 if(bSourceVec.is_null() ==
true) {
2256 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
2257 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.");
2259 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2261 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
2265 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
2266 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
2267 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2268 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
2269 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2273 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
2277 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2278 (*thyData)(i,j) = xpData[i];
2285 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.");
2287 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2289 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
2295 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
2304 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
2305 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
2306 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2307 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
2308 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2312 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
2315 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2316 (*thyData)(i,j) = xpData[i];
2327#ifdef HAVE_XPETRA_TPETRA
2329 if(tpetraMat!=Teuchos::null) {
2330#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2331 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2340 thyraOp = Thyra::createConstLinearOp(tpOperator);
2348#ifdef HAVE_XPETRA_EPETRA
2350 if(epetraMat!=Teuchos::null) {
2357 thyraOp = thyraEpOp;
2368#ifdef HAVE_XPETRA_TPETRA
2370 if(tpetraMat!=Teuchos::null) {
2371#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2372 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2381 thyraOp = Thyra::createLinearOp(tpOperator);
2389#ifdef HAVE_XPETRA_EPETRA
2391 if(epetraMat!=Teuchos::null) {
2398 thyraOp = thyraEpOp;
2414#define XPETRA_THYRAUTILS_SHORT
Concrete implementation of Xpetra::Matrix.
Exception throws to report errors in the internal logical of the program.
static RCP< Matrix > Build(const RCP< const Map > &rowMap)
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.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool is_null(const std::shared_ptr< T > &p)
TypeTo as(const TypeFrom &t)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &map)
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)