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"
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,
120class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
124#undef XPETRA_THYRAUTILS_SHORT
128 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
129 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
131 Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map =
toXpetra(vectorSpace);
133 if(stridedBlockId == -1) {
144 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
145 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
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]);
181 resultMap =
Teuchos::rcp(
new Xpetra::BlockedMap<LocalOrdinal,GlobalOrdinal,Node>(mapsXpetra, mapsThyra));
183#ifdef HAVE_XPETRA_TPETRA
186 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
187 TEUCHOS_TEST_FOR_EXCEPTION(
Teuchos::is_null(tpetra_vsc)==
true, Xpetra::Exceptions::RuntimeError,
"toXpetra failed to convert provided vector space to Thyra::TpetraVectorSpace. This is the general implementation for Tpetra only.");
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.");
209 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
210 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
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;
223 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<const ThyProdMultVecBase >(v);
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;
247 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpTpMultVec;
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);
253 TEUCHOS_TEST_FOR_EXCEPTION(thyraTpetraMultiVector == Teuchos::null, Xpetra::Exceptions::RuntimeError,
"toXpetra failed to convert provided multi vector to Thyra::TpetraMultiVector. This is the general implementation for Tpetra only.");
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.");
268 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
269 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
270 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
271 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
272 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
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
284 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
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) {
309 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
310 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
311 if(ThyBlockedOp != Teuchos::null) {
313 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
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){
330 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
331 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
332 if(ThyBlockedOp != Teuchos::null) {
338 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
339 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
341#ifdef HAVE_XPETRA_TPETRA
343 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
344 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
348 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp,
true);
349 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat,
true);
350 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
353 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
354 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraNcnstCrsMat));
357 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
358 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
359 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
360 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
361 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
362 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
367#ifdef HAVE_XPETRA_EPETRA
369 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
372 return Teuchos::null;
375 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
376 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
380 using Teuchos::rcp_const_cast;
381 using Teuchos::rcp_dynamic_cast;
383#ifdef HAVE_XPETRA_TPETRA
385 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
386 typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpetraOperator_t;
387 RCP<const TpetraOperator_t> TpetraOp = TOE::getConstTpetraOperator(op);
389 RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>> TpetraRowMat =
390 rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>>(TpetraOp,
true);
391 RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>> TpetraCrsMat =
392 rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>>(TpetraRowMat,
true);
394 RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>> xTpetraCrsMat =
395 rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
396 rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>>(TpetraCrsMat)
399 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
400 rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraCrsMat,
true);
401 RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
402 rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
403 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
404 rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpCrsWrap,
true);
409#ifdef HAVE_XPETRA_EPETRA
411 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
414 return Teuchos::null;
417 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
418 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
420#ifdef HAVE_XPETRA_TPETRA
422 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
423 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
425 Teuchos::RCP<Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraOp =
426 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraOp));
429 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp =
430 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
435#ifdef HAVE_XPETRA_EPETRA
437 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
440 return Teuchos::null;
443 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
444 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
446#ifdef HAVE_XPETRA_TPETRA
448 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
449 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
451 Teuchos::RCP<Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraOp =
452 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraOp));
455 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp =
456 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
461#ifdef HAVE_XPETRA_EPETRA
463 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
466 return Teuchos::null;
469 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
470 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar> >& op) {
471 using Teuchos::rcp_dynamic_cast;
472 using Teuchos::rcp_const_cast;
474 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
476 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
477#ifdef HAVE_XPETRA_TPETRA
478 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
479 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
480 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
481 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
482 if (!tDiag.is_null())
491 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
492 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar> >& op) {
493 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
496 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
497 toThyra(Teuchos::RCP<
const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map) {
498 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
501 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
502 if(bmap.is_null() ==
false) {
504 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
505 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
507 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
508 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
512 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
517#ifdef HAVE_XPETRA_TPETRA
519 Teuchos::RCP<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> > tpetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> >(map);
520 if (tpetraMap == Teuchos::null)
521 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
522 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
523 thyraMap = thyraTpetraMap;
527#ifdef HAVE_XPETRA_EPETRA
529 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
536 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
537 toThyraMultiVector(Teuchos::RCP<
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
540#ifdef HAVE_XPETRA_TPETRA
542 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
543 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
544 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
545 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
546 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
551#ifdef HAVE_XPETRA_EPETRA
553 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
560 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
561 toThyraVector(Teuchos::RCP<
const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
564#ifdef HAVE_XPETRA_TPETRA
566 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
567 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
568 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
569 thyVec->initialize(thyTpMap, tpVec);
574#ifdef HAVE_XPETRA_EPETRA
576 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
586 updateThyra(Teuchos::RCP<
const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > source, Teuchos::RCP<
const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal,Node> > mapExtractor,
const Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > & target) {
588 using Teuchos::rcp_dynamic_cast;
590 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
591 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
592 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
595 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
599 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
600 if(prodTarget != Teuchos::null) {
601 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
602 if(bSourceVec.is_null() ==
true) {
606 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
607 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.");
609 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
611 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
614 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
615 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
616 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
617 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
618 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
619 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
620 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
623 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
624 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
627 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
628 (*thyData)(i,j) = xpData[i];
635 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.");
637 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
639 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
641 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
644 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
645 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
654 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
655 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
656 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
657 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
658 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
659 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
662 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
663 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
665 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
666 (*thyData)(i,j) = xpData[i];
672 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
673 toThyra(
const Teuchos::RCP<
const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
675 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
679#ifdef HAVE_XPETRA_TPETRA
680 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
681 if(tpetraMat!=Teuchos::null) {
683 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
684 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
687 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
688 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
690 thyraOp = Thyra::createConstLinearOp(tpOperator);
693#ifdef HAVE_XPETRA_EPETRA
694 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
696 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. No Epetra available");
701 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
706 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
707 toThyra(
const Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
709 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
713#ifdef HAVE_XPETRA_TPETRA
714 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
715 if(tpetraMat!=Teuchos::null) {
717 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
718 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
721 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
722 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
724 thyraOp = Thyra::createLinearOp(tpOperator);
728#ifdef HAVE_XPETRA_EPETRA
729 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
731 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
736 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
741 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
742 toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
744 int nRows = mat->Rows();
745 int nCols = mat->Cols();
747 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Ablock = mat->getInnermostCrsMatrix();
748 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Ablock_wrap = Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(Ablock);
751#ifdef HAVE_XPETRA_TPETRA
752 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(Ablock_wrap->getCrsMatrix());
753 if(tpetraMat!=Teuchos::null) {
756 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar> > blockMat =
757 Thyra::defaultBlockedLinearOp<Scalar>();
759 blockMat->beginBlockFill(nRows,nCols);
761 for (
int r=0; r<nRows; ++r) {
762 for (
int c=0; c<nCols; ++c) {
763 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r,c);
765 if(xpmat == Teuchos::null)
continue;
767 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thBlock = Teuchos::null;
770 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpblock =
771 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpmat);
772 if(xpblock != Teuchos::null) {
773 if(xpblock->Rows() == 1 && xpblock->Cols() == 1) {
775 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
777 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
780 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpblock);
784 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
786 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
789 blockMat->setBlock(r,c,thBlock);
793 blockMat->endBlockFill();
798#ifdef HAVE_XPETRA_EPETRA
799 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
801 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
809#if defined(HAVE_XPETRA_EPETRA) && !defined(HAVE_XPETRA_TPETRA)
810 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
820#ifdef HAVE_XPETRA_EPETRA
822#ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
824class ThyraUtils<double, int, int,
EpetraNode> {
826 typedef double Scalar;
827 typedef int LocalOrdinal;
828 typedef int GlobalOrdinal;
832#undef XPETRA_THYRAUTILS_SHORT
837 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
838 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
840 Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map = ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(vectorSpace,comm);
842 if(stridedBlockId == -1) {
853 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
854 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
856 using Teuchos::rcp_dynamic_cast;
858 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
859 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
860 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
862 RCP<Map> resultMap = Teuchos::null;
864 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase >(vectorSpace);
865 if(prodVectorSpace != Teuchos::null) {
868 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
869 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
870 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
871 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
872 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
874 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
879 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
880 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
881 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
884 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
885 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
887 mapsXpetra[b] = MapUtils::transformThyra2XpetraGIDs(*mapsThyra[b], gidOffsets[b]);
890 resultMap =
Teuchos::rcp(
new Xpetra::BlockedMap<LocalOrdinal,GlobalOrdinal,Node>(mapsXpetra, mapsThyra));
896 bool bIsTpetra =
false;
897#ifdef HAVE_XPETRA_TPETRA
898#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
899 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
900 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
906 bool bIsEpetra = !bIsTpetra;
908#ifdef HAVE_XPETRA_TPETRA
910#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
911 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
912 typedef Thyra::VectorBase<Scalar> ThyVecBase;
913 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
914 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
915 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
916 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
918 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
920 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
925 throw Xpetra::Exceptions::RuntimeError(
"Problem AAA. Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
930#ifdef HAVE_XPETRA_EPETRA
933 RCP<const Epetra_Map>
934 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
936 resultMap =
Teuchos::rcp(
new Xpetra::EpetraMapT<GlobalOrdinal,Node>(epetra_map));
949 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
950 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
952 using Teuchos::rcp_dynamic_cast;
955 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
956 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
957 using ThyUtils = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
960 RCP<MultiVector> xpMultVec = Teuchos::null;
963 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<const ThyProdMultVecBase >(v);
964 if(thyProdVec != Teuchos::null) {
967 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
971 xpMultVec = MultiVectorFactory::Build(fullMap, as<size_t>(thyProdVec->domain()->dim()));
973 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
976 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
977 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
979 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
980 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
988 bool bIsTpetra =
false;
989#ifdef HAVE_XPETRA_TPETRA
990#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
991 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
995 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
996 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
997 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
998 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpTpMultVec;
999 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1001 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
1002 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
1003 if(thyraTpetraMultiVector != Teuchos::null) {
1005 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1007 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1009 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
1014#ifdef HAVE_XPETRA_EPETRA
1015 if(bIsTpetra ==
false) {
1017 Teuchos::RCP<Map> map = ThyUtils::toXpetra(v->range(), comm);
1019 RCP<Xpetra::EpetraMapT<GlobalOrdinal,Node> > xeMap = rcp_dynamic_cast<Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map,
true);
1020 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
1022 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1024 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1026 xpMultVec =
Teuchos::rcp(
new Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node>(epNonConstMultVec));
1035 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1036 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1037 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
1038 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
1039 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
1041 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(r);
1044 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1046 bool bIsTpetra =
false;
1047#ifdef HAVE_XPETRA_TPETRA
1048#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1049 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1051 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
1056#ifdef HAVE_XPETRA_EPETRA
1057 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1059 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1061 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1062 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1063 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1064 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1065 std::cout <<
" properly set!" << std::endl;
1066 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1076 if(bIsTpetra ==
false) {
1077 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1078 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1079 if(ThyBlockedOp != Teuchos::null) {
1081 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1082 ThyBlockedOp->getBlock(0,0);
1084 bIsTpetra = isTpetra(b00);
1092 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1094 bool bIsEpetra =
false;
1096#ifdef HAVE_XPETRA_EPETRA
1097 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op,
false);
1105 if(bIsEpetra ==
false) {
1106 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1107 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1108 if(ThyBlockedOp != Teuchos::null) {
1110 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1111 ThyBlockedOp->getBlock(0,0);
1113 bIsEpetra = isEpetra(b00);
1121 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1123 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1124 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1125 if(ThyBlockedOp != Teuchos::null) {
1131 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1132 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1134#ifdef HAVE_XPETRA_TPETRA
1136#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1137 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1139 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1140 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1144 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1146 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat,
true);
1147 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1150 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1151 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraNcnstCrsMat));
1153 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1154 Teuchos::rcp_dynamic_cast<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat);
1155 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1156 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1157 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1158 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1159 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1160 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1163 throw Xpetra::Exceptions::RuntimeError(
"Problem BBB. Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
1168#ifdef HAVE_XPETRA_EPETRA
1170 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1172 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<const Epetra_RowMatrix>(epetra_op,
true);
1173 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<const Epetra_CrsMatrix>(epetra_rowmat,
true);
1174 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1177 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1178 Teuchos::rcp(
new Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> (epetra_ncnstcrsmat));
1181 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1182 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1183 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1184 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1185 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1186 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1190 return Teuchos::null;
1193 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1194 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1196#ifdef HAVE_XPETRA_TPETRA
1198#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1199 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1201 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1202 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1204 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp,
true);
1205 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat,
true);
1207 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1208 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraCrsMat));
1210 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1211 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1212 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1213 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1214 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1215 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1218 throw Xpetra::Exceptions::RuntimeError(
"Problem CCC. Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
1223#ifdef HAVE_XPETRA_EPETRA
1225 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1227 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op,
true);
1228 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat,
true);
1230 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1231 Teuchos::rcp(
new Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> (epetra_crsmat));
1233 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1234 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1235 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1236 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1237 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1238 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1242 return Teuchos::null;
1246 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1247 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1249 return toXpetraOperator(Teuchos::rcp_const_cast<Thyra::LinearOpBase<Scalar> >(op));
1277 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1278 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1280#ifdef HAVE_XPETRA_TPETRA
1282 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1283 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1285 Teuchos::RCP<Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraOp =
1286 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraOp));
1289 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp =
1290 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
1295#ifdef HAVE_XPETRA_EPETRA
1297 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
1300 return Teuchos::null;
1303 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1304 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar> >& op) {
1305 using Teuchos::rcp_dynamic_cast;
1306 using Teuchos::rcp_const_cast;
1308 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
1310 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
1311#ifdef HAVE_XPETRA_TPETRA
1312 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
1313 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
1314 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
1315 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
1316 if (!tDiag.is_null())
1320#ifdef HAVE_XPETRA_EPETRA
1321 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
1322 if (xpDiag.is_null()) {
1323 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
1324 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
1325 if (!map.is_null()) {
1326 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
1327 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
1328 RCP<Xpetra::EpetraVectorT<int,Node> > xpEpDiag =
rcp(
new Xpetra::EpetraVectorT<int,Node>(nceDiag));
1329 xpDiag = rcp_dynamic_cast<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(xpEpDiag,
true);
1338 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1339 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar> >& op) {
1340 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
1343 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
1344 toThyra(Teuchos::RCP<
const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map) {
1345 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
1348 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
1349 if(bmap.is_null() ==
false) {
1351 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
1352 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
1354 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
1355 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
1359 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
1364#ifdef HAVE_XPETRA_TPETRA
1366#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1367 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1368 Teuchos::RCP<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> > tpetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> >(map);
1369 if (tpetraMap == Teuchos::null)
1370 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1371 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1372 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1373 thyraMap = thyraTpetraMap;
1375 throw Xpetra::Exceptions::RuntimeError(
"Problem DDD. Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
1380#ifdef HAVE_XPETRA_EPETRA
1382 Teuchos::RCP<const Xpetra::EpetraMapT<GlobalOrdinal,Node> > epetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map);
1383 if (epetraMap == Teuchos::null)
1384 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1385 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
1386 thyraMap = thyraEpetraMap;
1393 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
1394 toThyraMultiVector(Teuchos::RCP<
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
1397#ifdef HAVE_XPETRA_TPETRA
1399 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
1400 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
1401 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
1402 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1403 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
1408#ifdef HAVE_XPETRA_EPETRA
1410 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1411 auto epMV = Teuchos::rcp_dynamic_cast<const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
1412 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
1421 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
1422 toThyraVector(Teuchos::RCP<
const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
1425#ifdef HAVE_XPETRA_TPETRA
1427 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
1428 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
1429 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
1430 thyVec->initialize(thyTpMap, tpVec);
1435#ifdef HAVE_XPETRA_EPETRA
1437 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
1438 auto epVec =
rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
1439 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
1447 static void updateThyra(Teuchos::RCP<
const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > source, Teuchos::RCP<
const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal,Node> > mapExtractor,
const Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > & target) {
1449 using Teuchos::rcp_dynamic_cast;
1451 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1452 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1453 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1456 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1459 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1460 if(prodTarget != Teuchos::null) {
1462 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
1463 if(bSourceVec.is_null() ==
true) {
1467 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1468 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.");
1470 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1472 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1475 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1476 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1477 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
1478 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1479 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1480 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1481 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1484 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1485 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
1488 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1489 (*thyData)(i,j) = xpData[i];
1496 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.");
1498 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1500 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
1502 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
1505 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1506 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
1515 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
1516 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1517 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1518 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1519 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1520 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1523 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1524 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
1526 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1527 (*thyData)(i,j) = xpData[i];
1533 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
1534 toThyra(
const Teuchos::RCP<
const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
1536 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1538#ifdef HAVE_XPETRA_TPETRA
1539 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
1540 if(tpetraMat!=Teuchos::null) {
1541#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1542 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1544 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
1545 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
1548 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
1549 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
1551 thyraOp = Thyra::createConstLinearOp(tpOperator);
1554 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
1559#ifdef HAVE_XPETRA_EPETRA
1560 Teuchos::RCP<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > epetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat);
1561 if(epetraMat!=Teuchos::null) {
1562 Teuchos::RCP<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat);
1564 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
1567 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
1569 thyraOp = thyraEpOp;
1575 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1576 toThyra(
const Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
1578 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1580#ifdef HAVE_XPETRA_TPETRA
1581 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
1582 if(tpetraMat!=Teuchos::null) {
1583#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1584 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
1586 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
1587 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
1590 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
1591 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
1593 thyraOp = Thyra::createLinearOp(tpOperator);
1596 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_INT:BOOL=ON in your configuration.");
1601#ifdef HAVE_XPETRA_EPETRA
1602 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > epetraMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat);
1603 if(epetraMat!=Teuchos::null) {
1604 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat,
true);
1605 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
1608 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
1610 thyraOp = thyraEpOp;
1616 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1617 toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<double, int, int, EpetraNode> >& mat);
1622#ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
1624class ThyraUtils<double, int, long long,
EpetraNode> {
1626 typedef double Scalar;
1627 typedef int LocalOrdinal;
1628 typedef long long GlobalOrdinal;
1632#undef XPETRA_THYRAUTILS_SHORT
1637 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
1638 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
1640 Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map = ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(vectorSpace,comm);
1642 if(stridedBlockId == -1) {
1653 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
1654 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1656 using Teuchos::rcp_dynamic_cast;
1658 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1659 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1660 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1662 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase >(vectorSpace);
1663 if(prodVectorSpace != Teuchos::null) {
1666 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
1667 std::vector<RCP<const Map> > mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
1668 std::vector<RCP<const Map> > mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
1669 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1670 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1672 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
1677 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
1678 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1679 gidOffsets[i] = mapsThyra[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
1682 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1683 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1685 mapsXpetra[b] = MapUtils::transformThyra2XpetraGIDs(*mapsThyra[b], gidOffsets[b]);
1688 Teuchos::RCP<Map> resultMap =
Teuchos::rcp(
new Xpetra::BlockedMap<LocalOrdinal,GlobalOrdinal,Node>(mapsXpetra, mapsThyra));
1696 bool bIsTpetra =
false;
1697#ifdef HAVE_XPETRA_TPETRA
1698#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1699 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1700 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
1706 bool bIsEpetra = !bIsTpetra;
1708#ifdef HAVE_XPETRA_TPETRA
1710#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1711 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1712 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1713 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
1714 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
1715 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1716 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1718 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1720 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1727 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
1732#ifdef HAVE_XPETRA_EPETRA
1735 RCP<const Epetra_Map>
1736 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
1738 Teuchos::RCP<Map> rgXpetraMap =
Teuchos::rcp(
new Xpetra::EpetraMapT<GlobalOrdinal,Node>(epetra_map));
1752 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1753 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1755 using Teuchos::rcp_dynamic_cast;
1757 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1758 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1759 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1762 RCP<MultiVector> xpMultVec = Teuchos::null;
1765 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<const ThyProdMultVecBase >(v);
1766 if(thyProdVec != Teuchos::null) {
1769 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
1773 xpMultVec = MultiVectorFactory::Build(fullMap, as<size_t>(thyProdVec->domain()->dim()));
1775 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec);
1779 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
1780 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
1782 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
1783 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
1791 bool bIsTpetra =
false;
1792#ifdef HAVE_XPETRA_TPETRA
1793#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1794 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1798 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1799 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
1800 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
1801 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpTpMultVec;
1802 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1804 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
1805 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
1806 if(thyraTpetraMultiVector != Teuchos::null) {
1808 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1810 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1812 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
1819#ifdef HAVE_XPETRA_EPETRA
1820 if(bIsTpetra ==
false) {
1822 Teuchos::RCP<Map> map = ThyUtils::toXpetra(v->range(), comm);
1824 RCP<Xpetra::EpetraMapT<GlobalOrdinal,Node> > xeMap = rcp_dynamic_cast<Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map,
true);
1825 RCP<const Epetra_Map> eMap = xeMap->getEpetra_MapRCP();
1827 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1829 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1831 xpMultVec =
Teuchos::rcp(
new Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node>(epNonConstMultVec));
1842 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1843 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1844 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
1845 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar> >(v);
1846 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
1848 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(r);
1851 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1853 bool bIsTpetra =
false;
1854#ifdef HAVE_XPETRA_TPETRA
1855#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1856 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1858 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
1863#ifdef HAVE_XPETRA_EPETRA
1864 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1866 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1868 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1869 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1870 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1871 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1872 std::cout <<
" properly set!" << std::endl;
1873 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1883 if(bIsTpetra ==
false) {
1884 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1885 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1886 if(ThyBlockedOp != Teuchos::null) {
1888 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1889 ThyBlockedOp->getBlock(0,0);
1891 bIsTpetra = isTpetra(b00);
1899 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1901 bool bIsEpetra =
false;
1903#ifdef HAVE_XPETRA_EPETRA
1904 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op,
false);
1912 if(bIsEpetra ==
false) {
1913 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1914 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1915 if(ThyBlockedOp != Teuchos::null) {
1917 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1918 ThyBlockedOp->getBlock(0,0);
1920 bIsEpetra = isEpetra(b00);
1928 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1930 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1931 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
1932 if(ThyBlockedOp != Teuchos::null) {
1938 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1939 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1941#ifdef HAVE_XPETRA_TPETRA
1943#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
1944 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
1946 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1947 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1951 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp,
true);
1952 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat,
true);
1953 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1956 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1957 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraNcnstCrsMat));
1960 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1961 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
1962 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1963 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1964 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1965 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1968 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
1973#ifdef HAVE_XPETRA_EPETRA
1975 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1977 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<const Epetra_RowMatrix>(epetra_op,
true);
1978 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<const Epetra_CrsMatrix>(epetra_rowmat,
true);
1979 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1982 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1983 Teuchos::rcp(
new Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> (epetra_ncnstcrsmat));
1986 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
1987 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
1988 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
1989 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
1990 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
1991 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
1995 return Teuchos::null;
1998 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1999 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
2001#ifdef HAVE_XPETRA_TPETRA
2003#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2004 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2006 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2007 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
2009 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp,
true);
2010 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat,
true);
2012 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
2013 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraCrsMat));
2016 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
2017 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraCrsMat,
true);
2018 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
2019 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
2020 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
2021 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
2024 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
2029#ifdef HAVE_XPETRA_EPETRA
2031 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
2033 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op,
true);
2034 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat,
true);
2036 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
2037 Teuchos::rcp(
new Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> (epetra_crsmat));
2040 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsMat =
2041 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xEpetraCrsMat,
true);
2042 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpCrsWrap =
2043 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
2044 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpMat =
2045 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpCrsWrap,
true);
2049 return Teuchos::null;
2052 static Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2053 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
2055#ifdef HAVE_XPETRA_TPETRA
2057 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2058 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
2060 Teuchos::RCP<Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraOp =
2061 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraOp));
2064 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp =
2065 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
2070#ifdef HAVE_XPETRA_EPETRA
2072 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
2075 return Teuchos::null;
2078 static Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2079 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
2081#ifdef HAVE_XPETRA_TPETRA
2083 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
2084 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
2086 Teuchos::RCP<Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraOp =
2087 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>(TpetraOp));
2090 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp =
2091 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xTpetraOp,
true);
2096#ifdef HAVE_XPETRA_EPETRA
2098 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
2101 return Teuchos::null;
2104 static Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2105 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar> >& op) {
2106 using Teuchos::rcp_dynamic_cast;
2107 using Teuchos::rcp_const_cast;
2108 using ThyVSBase = Thyra::SpmdVectorSpaceBase<Scalar>;
2109 using thyTpV = Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>;
2110 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
2112 RCP<const Thyra::VectorBase<Scalar> > diag = op->getDiag();
2114 RCP<const Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xpDiag;
2115#ifdef HAVE_XPETRA_TPETRA
2116 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
2117 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node>::getConstTpetraVector(diag);
2118 if (!tDiag.is_null())
2122#ifdef HAVE_XPETRA_EPETRA
2123 if (xpDiag.is_null()) {
2124 RCP<const Epetra_Comm> comm = Thyra::get_Epetra_Comm(*rcp_dynamic_cast<const ThyVSBase>(op->range())->getComm());
2125 RCP<const Epetra_Map> map = Thyra::get_Epetra_Map(*(op->range()), comm);
2126 if (!map.is_null()) {
2127 RCP<const Epetra_Vector> eDiag = Thyra::get_Epetra_Vector(*map, diag);
2128 RCP<Epetra_Vector> nceDiag = rcp_const_cast<Epetra_Vector>(eDiag);
2129 RCP<Xpetra::EpetraVectorT<int,Node> > xpEpDiag =
rcp(
new Xpetra::EpetraVectorT<int,Node>(nceDiag));
2130 xpDiag = rcp_dynamic_cast<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(xpEpDiag,
true);
2139 static Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2140 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar> >& op) {
2141 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar> >(op));
2144 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
2145 toThyra(Teuchos::RCP<
const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map) {
2146 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
2149 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
2150 if(bmap.is_null() ==
false) {
2152 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > > vecSpaces(bmap->getNumMaps());
2153 for(
size_t i = 0; i < bmap->getNumMaps(); i++) {
2155 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > vs =
2156 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bmap->getMap(i,
true));
2160 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
2165#ifdef HAVE_XPETRA_TPETRA
2167#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2168 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2169 Teuchos::RCP<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> > tpetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node> >(map);
2170 if (tpetraMap == Teuchos::null)
2171 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
2172 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
2173 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
2174 thyraMap = thyraTpetraMap;
2176 throw Xpetra::Exceptions::RuntimeError(
"Problem DDD. Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
2181#ifdef HAVE_XPETRA_EPETRA
2183 Teuchos::RCP<const Xpetra::EpetraMapT<GlobalOrdinal,Node> > epetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraMapT<GlobalOrdinal,Node> >(map);
2184 if (epetraMap == Teuchos::null)
2185 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
2186 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(epetraMap->getEpetra_MapRCP());
2187 thyraMap = thyraEpetraMap;
2194 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
2195 toThyraMultiVector(Teuchos::RCP<
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
2198#ifdef HAVE_XPETRA_TPETRA
2200 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
2201 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
2202 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
2203 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2204 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
2209#ifdef HAVE_XPETRA_EPETRA
2211 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
2212 auto epMV = Teuchos::rcp_dynamic_cast<const EpetraMultiVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_MultiVector();
2213 auto thyMV = Thyra::create_MultiVector(epMV, thyEpMap);
2221 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
2222 toThyraVector(Teuchos::RCP<
const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > vec) {
2225#ifdef HAVE_XPETRA_TPETRA
2227 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
2228 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
2229 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
2230 thyVec->initialize(thyTpMap, tpVec);
2235#ifdef HAVE_XPETRA_EPETRA
2237 auto thyEpMap = Thyra::create_VectorSpace(Teuchos::rcp_dynamic_cast<
const EpetraMapT<GlobalOrdinal, Node> >(vec->getMap())->getEpetra_MapRCP());
2238 auto epVec =
rcp(Teuchos::rcp_dynamic_cast<
const EpetraVectorT<GlobalOrdinal, Node> >(vec)->getEpetra_Vector(),
false);
2239 auto thyVec = Thyra::create_Vector(epVec, thyEpMap);
2247 static void updateThyra(Teuchos::RCP<
const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > source, Teuchos::RCP<
const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal,Node> > mapExtractor,
const Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > & target) {
2249 using Teuchos::rcp_dynamic_cast;
2251 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
2252 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
2253 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
2256 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
2259 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
2260 if(prodTarget != Teuchos::null) {
2261 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
2262 if(bSourceVec.is_null() ==
true) {
2266 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
2267 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.");
2269 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2271 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
2274 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
2275 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
2276 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
2277 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2278 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
2279 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2280 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
2283 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
2284 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
2287 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2288 (*thyData)(i,j) = xpData[i];
2295 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.");
2297 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
2299 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
2301 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
2304 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
2305 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
2314 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
2315 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
2316 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
2317 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
2318 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
2319 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
2322 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
2323 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
2325 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
2326 (*thyData)(i,j) = xpData[i];
2332 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
2333 toThyra(
const Teuchos::RCP<
const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
2335 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
2337#ifdef HAVE_XPETRA_TPETRA
2338 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
2339 if(tpetraMat!=Teuchos::null) {
2340#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2341 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2343 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
2344 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
2347 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
2348 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
2350 thyraOp = Thyra::createConstLinearOp(tpOperator);
2353 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
2358#ifdef HAVE_XPETRA_EPETRA
2359 Teuchos::RCP<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > epetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat);
2360 if(epetraMat!=Teuchos::null) {
2361 Teuchos::RCP<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat,
true);
2362 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
2365 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
2367 thyraOp = thyraEpOp;
2373 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2374 toThyra(
const Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& mat) {
2376 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
2378#ifdef HAVE_XPETRA_TPETRA
2379 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat);
2380 if(tpetraMat!=Teuchos::null) {
2381#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
2382 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
2384 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xTpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(mat,
true);
2385 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
2388 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat,
true);
2389 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat,
true);
2391 thyraOp = Thyra::createLinearOp(tpOperator);
2394 throw Xpetra::Exceptions::RuntimeError(
"Add TPETRA_INST_INT_LONG_LONG:BOOL=ON in your configuration.");
2399#ifdef HAVE_XPETRA_EPETRA
2400 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > epetraMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat);
2401 if(epetraMat!=Teuchos::null) {
2402 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> >(mat,
true);
2403 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
2406 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
2408 thyraOp = thyraEpOp;
2414 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2415 toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<double, int, long long, EpetraNode> >& mat);
2424#define XPETRA_THYRAUTILS_SHORT
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)
Tpetra::KokkosCompat::KokkosSerialWrapperNode EpetraNode
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)