47 #ifndef XPETRA_THYRAUTILS_HPP 48 #define XPETRA_THYRAUTILS_HPP 51 #ifdef HAVE_XPETRA_THYRA 55 #ifdef HAVE_XPETRA_TPETRA 56 #include "Tpetra_ConfigDefs.hpp" 59 #ifdef HAVE_XPETRA_EPETRA 60 #include "Epetra_config.h" 61 #include "Epetra_CombineMode.h" 71 #include <Thyra_VectorSpaceBase.hpp> 72 #include <Thyra_SpmdVectorSpaceBase.hpp> 73 #include <Thyra_ProductVectorSpaceBase.hpp> 74 #include <Thyra_ProductMultiVectorBase.hpp> 75 #include <Thyra_VectorSpaceBase.hpp> 76 #include <Thyra_DefaultBlockedLinearOp.hpp> 77 #include <Thyra_LinearOpBase.hpp> 78 #include <Thyra_DetachedMultiVectorView.hpp> 80 #ifdef HAVE_XPETRA_TPETRA 81 #include <Thyra_TpetraThyraWrappers.hpp> 82 #include <Thyra_TpetraVector.hpp> 83 #include <Thyra_TpetraVectorSpace.hpp> 84 #include <Tpetra_Map.hpp> 85 #include <Tpetra_Vector.hpp> 86 #include <Tpetra_CrsMatrix.hpp> 90 #ifdef HAVE_XPETRA_EPETRA 91 #include <Thyra_EpetraLinearOp.hpp> 92 #include <Thyra_EpetraThyraWrappers.hpp> 93 #include <Thyra_SpmdVectorBase.hpp> 94 #include <Thyra_get_Epetra_Operator.hpp> 95 #include <Epetra_Map.h> 96 #include <Epetra_Vector.h> 97 #include <Epetra_CrsMatrix.h> 104 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class BlockedCrsMatrix;
106 template <
class Scalar,
107 class LocalOrdinal = int,
108 class GlobalOrdinal = LocalOrdinal,
113 #undef XPETRA_THYRAUTILS_SHORT 117 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
118 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) {
120 Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > map =
toXpetra(vectorSpace);
122 if(stridedBlockId == -1) {
123 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
126 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
133 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
134 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
136 using Teuchos::rcp_dynamic_cast;
138 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
139 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
142 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
144 RCP<Map> resultMap = Teuchos::null;
145 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
146 if(prodVectorSpace != Teuchos::null) {
149 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
150 std::vector<RCP<Map> > maps(prodVectorSpace->numBlocks(), Teuchos::null);
151 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
152 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
158 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
159 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
160 gidOffsets[i] = maps[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
164 std::vector<GlobalOrdinal> gids;
165 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
166 for(LocalOrdinal l = 0; l < as<LocalOrdinal>(maps[b]->getNodeNumElements()); ++l) {
167 GlobalOrdinal gid = maps[b]->getGlobalElement(l) + gidOffsets[b];
173 const GO INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
174 Teuchos::ArrayView<GO> gidsView(&gids[0], gids.size());
175 resultMap =
MapFactory::Build(maps[0]->lib(), INVALID, gidsView, maps[0]->getIndexBase(), comm);
177 #ifdef HAVE_XPETRA_TPETRA 180 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
181 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.");
183 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
184 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
185 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
186 typedef Thyra::VectorBase<Scalar> ThyVecBase;
187 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
188 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
189 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
190 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
191 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
192 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
195 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.");
198 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
203 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
204 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
206 using Teuchos::rcp_dynamic_cast;
208 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
209 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
210 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
214 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
217 RCP<MultiVector> xpMultVec = Teuchos::null;
220 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
221 if(thyProdVec != Teuchos::null) {
230 std::vector<GlobalOrdinal> lidOffsets(thyProdVec->productSpace()->numBlocks()+1,0);
231 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
232 Teuchos::RCP<const ThyVecSpaceBase> thySubMap = thyProdVec->productSpace()->getBlock(b);
233 Teuchos::RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(thySubMap);
234 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
235 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : thySubMap->dim() );
236 lidOffsets[b+1] = localSubDim + lidOffsets[b];
237 RCP<Thyra::ConstDetachedMultiVectorView<Scalar> > thyData =
238 Teuchos::rcp(
new Thyra::ConstDetachedMultiVectorView<Scalar>(thyProdVec->getMultiVectorBlock(b),Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
239 for(
size_t vv = 0; vv < xpMultVec->getNumVectors(); ++vv) {
240 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
241 xpMultVec->replaceLocalValue(i + lidOffsets[b] , vv, (*thyData)(i,vv));
247 #ifdef HAVE_XPETRA_TPETRA 248 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
249 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
251 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
252 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
254 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
255 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
256 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.");
257 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
258 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
259 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
260 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
261 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
263 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.");
266 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
271 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
272 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
273 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
274 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
275 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
281 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
282 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(op));
285 bool bIsTpetra =
false;
286 #ifdef HAVE_XPETRA_TPETRA 287 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
288 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
292 #ifdef HAVE_XPETRA_EPETRA
293 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
295 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
297 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
298 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
299 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
300 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
301 std::cout <<
" properly set!" << std::endl;
302 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
311 if(bIsTpetra ==
false) {
312 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
313 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
314 if(ThyBlockedOp != Teuchos::null) {
315 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
316 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
317 ThyBlockedOp->getBlock(0,0);
318 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
319 bIsTpetra = isTpetra(b00);
327 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
331 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
333 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
334 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
335 if(ThyBlockedOp != Teuchos::null) {
341 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
342 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
344 #ifdef HAVE_XPETRA_TPETRA 346 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
347 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
350 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
351 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
352 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
353 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
354 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
355 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
356 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
358 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
360 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
362 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
368 #ifdef HAVE_XPETRA_EPETRA 373 return Teuchos::null;
376 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
377 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
379 #ifdef HAVE_XPETRA_TPETRA 381 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
382 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
383 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
384 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
385 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
386 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
387 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
389 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
391 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
392 return xTpetraCrsMat;
396 #ifdef HAVE_XPETRA_EPETRA 401 return Teuchos::null;
404 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
406 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
407 #ifdef HAVE_XPETRA_TPETRA 410 if (tpetraMap == Teuchos::null)
411 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
412 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
413 thyraMap = thyraTpetraMap;
417 #ifdef HAVE_XPETRA_EPETRA 426 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
430 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
431 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
432 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
433 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
434 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
437 Teuchos::RCP< Thyra::MultiVectorBase<Scalar> > thMVec = Thyra::createMembers(thMap, vec->getNumVectors());
438 Teuchos::RCP< Thyra::SpmdMultiVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdMultiVectorBase<Scalar> >(thMVec);
439 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
442 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
443 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
444 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
445 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
448 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
449 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
451 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
452 (*thyData)(i,j) = vecData[i];
459 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
463 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
464 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
465 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
466 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
467 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
470 Teuchos::RCP< Thyra::VectorBase<Scalar> > thMVec = Thyra::createMember(thMap);
471 Teuchos::RCP< Thyra::SpmdVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(thMVec);
472 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast VectorBase to SpmdVectorBase.");
475 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
476 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
477 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
478 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
481 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
482 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
484 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
485 (*thyData)(i,j) = vecData[i];
497 using Teuchos::rcp_dynamic_cast;
499 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
500 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
501 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
504 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
508 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
509 if(prodTarget != Teuchos::null) {
513 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
514 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.");
516 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
518 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
521 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
522 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
523 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
524 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
525 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
526 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
527 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
530 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
531 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
534 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
535 (*thyData)(i,j) = xpData[i];
544 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
545 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
546 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
547 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
548 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
549 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
552 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
553 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
555 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
556 (*thyData)(i,j) = xpData[i];
562 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
565 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
567 bool bIsTpetra =
false;
569 #ifdef HAVE_XPETRA_TPETRA 571 if(tpetraMat!=Teuchos::null) {
574 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
575 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
576 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
578 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
579 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
580 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
581 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
583 thyraOp = Thyra::createConstLinearOp(tpOperator);
584 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
588 #ifdef HAVE_XPETRA_EPETRA 594 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
597 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
599 bool bIsTpetra =
false;
601 #ifdef HAVE_XPETRA_TPETRA 603 if(tpetraMat!=Teuchos::null) {
606 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
607 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
608 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
610 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
611 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
612 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
613 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
615 thyraOp = Thyra::createLinearOp(tpOperator);
616 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
620 #ifdef HAVE_XPETRA_EPETRA 626 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
629 int nRows = mat->Rows();
630 int nCols = mat->Cols();
632 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Ablock = mat->getInnermostCrsMatrix();
634 TEUCHOS_TEST_FOR_EXCEPT(Ablock_wrap.is_null() ==
true);
636 bool bTpetra =
false;
637 #ifdef HAVE_XPETRA_TPETRA 639 if(tpetraMat!=Teuchos::null) bTpetra =
true;
642 #ifdef HAVE_XPETRA_EPETRA 647 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar> > blockMat =
648 Thyra::defaultBlockedLinearOp<Scalar>();
650 blockMat->beginBlockFill(nRows,nCols);
652 for (
int r=0; r<nRows; ++r) {
653 for (
int c=0; c<nCols; ++c) {
654 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r,c);
656 if(xpmat == Teuchos::null)
continue;
658 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thBlock = Teuchos::null;
661 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpblock =
663 if(xpblock != Teuchos::null) {
664 if(xpblock->Rows() == 1 && xpblock->Cols() == 1) {
666 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
667 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
668 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
671 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpblock);
675 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
676 TEUCHOS_TEST_FOR_EXCEPT(xpwrap.is_null() ==
true);
677 thBlock = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(xpwrap->getCrsMatrix());
680 blockMat->setBlock(r,c,thBlock);
684 blockMat->endBlockFill();
694 #ifdef HAVE_XPETRA_EPETRA 696 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 698 class ThyraUtils<double, int, int,
EpetraNode> {
700 typedef double Scalar;
701 typedef int LocalOrdinal;
702 typedef int GlobalOrdinal;
706 #undef XPETRA_THYRAUTILS_SHORT 711 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
712 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) {
716 if(stridedBlockId == -1) {
717 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
720 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
727 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
728 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
730 using Teuchos::rcp_dynamic_cast;
732 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
733 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
736 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
738 RCP<Map> resultMap = Teuchos::null;
740 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
741 if(prodVectorSpace != Teuchos::null) {
744 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
745 std::vector<RCP<Map> > maps(prodVectorSpace->numBlocks(), Teuchos::null);
746 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
747 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
753 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
754 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
755 gidOffsets[i] = maps[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
759 std::vector<GlobalOrdinal> gids;
760 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
761 for(LocalOrdinal l = 0; l < as<LocalOrdinal>(maps[b]->getNodeNumElements()); ++l) {
762 GlobalOrdinal gid = maps[b]->getGlobalElement(l) + gidOffsets[b];
768 const GO INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
769 Teuchos::ArrayView<GO> gidsView(&gids[0], gids.size());
770 resultMap =
MapFactory::Build(maps[0]->lib(), INVALID, gidsView, maps[0]->getIndexBase(), comm);
776 bool bIsTpetra =
false;
777 #ifdef HAVE_XPETRA_TPETRA 778 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 779 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 780 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
781 bIsTpetra = Teuchos::is_null(tpetra_vsc) ? false :
true;
786 bool bIsEpetra = !bIsTpetra;
788 #ifdef HAVE_XPETRA_TPETRA 790 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 791 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 792 typedef Thyra::VectorBase<Scalar> ThyVecBase;
793 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
794 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
795 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
796 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
797 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
798 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
799 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
800 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
801 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
810 #ifdef HAVE_XPETRA_EPETRA 813 RCP<const Epetra_Map>
814 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
815 if(!Teuchos::is_null(epetra_map)) {
817 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
819 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
824 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(resultMap));
829 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
830 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
832 using Teuchos::rcp_dynamic_cast;
834 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
835 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
838 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
843 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
846 RCP<MultiVector> xpMultVec = Teuchos::null;
849 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
850 if(thyProdVec != Teuchos::null) {
859 std::vector<GlobalOrdinal> lidOffsets(thyProdVec->productSpace()->numBlocks()+1,0);
860 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
861 Teuchos::RCP<const ThyVecSpaceBase> thySubMap = thyProdVec->productSpace()->getBlock(b);
862 Teuchos::RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(thySubMap);
863 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
864 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : thySubMap->dim() );
865 lidOffsets[b+1] = localSubDim + lidOffsets[b];
866 RCP<Thyra::ConstDetachedMultiVectorView<Scalar> > thyData =
867 Teuchos::rcp(
new Thyra::ConstDetachedMultiVectorView<Scalar>(thyProdVec->getMultiVectorBlock(b),Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
868 for(
size_t vv = 0; vv < xpMultVec->getNumVectors(); ++vv) {
869 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
870 xpMultVec->replaceLocalValue(i + lidOffsets[b] , vv, (*thyData)(i,vv));
874 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
879 bool bIsTpetra =
false;
880 #ifdef HAVE_XPETRA_TPETRA 881 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 882 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 886 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
887 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
888 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
890 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
892 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
893 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
894 if(thyraTpetraMultiVector != Teuchos::null) {
896 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
897 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
898 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
899 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
900 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
905 #ifdef HAVE_XPETRA_EPETRA 906 if(bIsTpetra ==
false) {
909 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
911 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xeMap));
912 RCP<const Epetra_Map> eMap = Teuchos::rcpFromRef(xeMap->getEpetra_Map());
913 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
914 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
915 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
916 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
917 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
921 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
924 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Cannot transform Thyra::MultiVector to Xpetra::MultiVector.");
925 return Teuchos::null;
929 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
930 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
931 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
932 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
933 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
938 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
940 bool bIsTpetra =
false;
941 #ifdef HAVE_XPETRA_TPETRA 942 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 943 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 945 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
946 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
950 #ifdef HAVE_XPETRA_EPETRA
951 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
953 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
955 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
956 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
957 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
958 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
959 std::cout <<
" properly set!" << std::endl;
960 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
970 if(bIsTpetra ==
false) {
971 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
972 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
973 if(ThyBlockedOp != Teuchos::null) {
974 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
975 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
976 ThyBlockedOp->getBlock(0,0);
977 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
978 bIsTpetra = isTpetra(b00);
986 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
988 bool bIsEpetra =
false;
990 #ifdef HAVE_XPETRA_EPETRA 991 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
992 bIsEpetra = Teuchos::is_null(epetra_op) ? false :
true;
999 if(bIsEpetra ==
false) {
1000 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1001 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1002 if(ThyBlockedOp != Teuchos::null) {
1003 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1004 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1005 ThyBlockedOp->getBlock(0,0);
1006 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1007 bIsEpetra = isEpetra(b00);
1015 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1017 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1018 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1019 if(ThyBlockedOp != Teuchos::null) {
1025 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1026 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1028 #ifdef HAVE_XPETRA_TPETRA 1030 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1031 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1033 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1034 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1037 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1038 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1039 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1040 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1041 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1042 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1043 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1045 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1047 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1048 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1050 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1058 #ifdef HAVE_XPETRA_EPETRA 1060 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1061 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1062 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op);
1063 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1064 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat);
1065 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1066 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1067 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1069 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1071 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1073 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1075 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1079 return Teuchos::null;
1082 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1083 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1085 #ifdef HAVE_XPETRA_TPETRA 1087 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1088 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1090 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1091 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1092 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1093 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1094 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1095 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1096 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1098 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1100 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1101 return xTpetraCrsMat;
1108 #ifdef HAVE_XPETRA_EPETRA 1110 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1111 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1112 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op);
1113 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1114 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat);
1115 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1117 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1119 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1120 return xEpetraCrsMat;
1123 return Teuchos::null;
1126 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
1128 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
1129 #ifdef HAVE_XPETRA_TPETRA 1131 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1132 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1134 if (tpetraMap == Teuchos::null)
1135 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1136 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1137 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1138 thyraMap = thyraTpetraMap;
1145 #ifdef HAVE_XPETRA_EPETRA 1148 if (epetraMap == Teuchos::null)
1149 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1150 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(Teuchos::rcpFromRef(epetraMap->getEpetra_Map()));
1151 thyraMap = thyraEpetraMap;
1158 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
1162 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
1163 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1164 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
1165 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1166 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1169 Teuchos::RCP< Thyra::MultiVectorBase<Scalar> > thMVec = Thyra::createMembers(thMap, vec->getNumVectors());
1170 Teuchos::RCP< Thyra::SpmdMultiVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdMultiVectorBase<Scalar> >(thMVec);
1171 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
1174 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1175 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1176 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1177 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1180 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1181 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
1183 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1184 (*thyData)(i,j) = vecData[i];
1191 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
1195 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
1196 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1197 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
1198 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1199 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1202 Teuchos::RCP< Thyra::VectorBase<Scalar> > thMVec = Thyra::createMember(thMap);
1203 Teuchos::RCP< Thyra::SpmdVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(thMVec);
1204 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast VectorBase to SpmdVectorBase.");
1207 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1208 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1209 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1210 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1213 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1214 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
1216 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1217 (*thyData)(i,j) = vecData[i];
1226 using Teuchos::rcp_dynamic_cast;
1228 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1229 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1230 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1233 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1237 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1238 if(prodTarget != Teuchos::null) {
1242 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1243 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.");
1245 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1247 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1250 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1251 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1252 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1253 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1254 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1255 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1256 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1259 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1260 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
1263 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1264 (*thyData)(i,j) = xpData[i];
1273 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
1274 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1275 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1276 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1277 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1278 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1281 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1282 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
1284 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1285 (*thyData)(i,j) = xpData[i];
1291 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
1294 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1296 #ifdef HAVE_XPETRA_TPETRA 1298 if(tpetraMat!=Teuchos::null) {
1299 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1300 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1303 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
1304 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
1305 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1307 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
1308 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
1309 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
1310 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
1312 thyraOp = Thyra::createConstLinearOp(tpOperator);
1313 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1320 #ifdef HAVE_XPETRA_EPETRA 1322 if(epetraMat!=Teuchos::null) {
1324 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
1325 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
1326 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1328 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
1329 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1330 thyraOp = thyraEpOp;
1336 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1339 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1341 #ifdef HAVE_XPETRA_TPETRA 1343 if(tpetraMat!=Teuchos::null) {
1344 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1345 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE))) 1348 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
1349 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
1350 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
1352 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
1353 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
1354 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
1355 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
1357 thyraOp = Thyra::createLinearOp(tpOperator);
1358 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
1365 #ifdef HAVE_XPETRA_EPETRA 1367 if(epetraMat!=Teuchos::null) {
1369 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
1370 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
1371 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
1373 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
1374 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
1375 thyraOp = thyraEpOp;
1381 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
1385 #endif // #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 1387 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 1389 class ThyraUtils<double, int, long long,
EpetraNode> {
1391 typedef double Scalar;
1392 typedef int LocalOrdinal;
1393 typedef long long GlobalOrdinal;
1397 #undef XPETRA_THYRAUTILS_SHORT 1402 static Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal,GlobalOrdinal,Node> >
1403 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) {
1407 if(stridedBlockId == -1) {
1408 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo.size() != 0);
1411 TEUCHOS_TEST_FOR_EXCEPT(map->getNodeNumElements() % stridingInfo[stridedBlockId] != 0);
1418 static Teuchos::RCP<Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
1419 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar> >& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1421 using Teuchos::rcp_dynamic_cast;
1423 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1424 typedef Thyra::ProductVectorSpaceBase<Scalar> ThyProdVecSpaceBase;
1427 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1429 RCP<const ThyProdVecSpaceBase > prodVectorSpace = rcp_dynamic_cast<
const ThyProdVecSpaceBase >(vectorSpace);
1430 if(prodVectorSpace != Teuchos::null) {
1433 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks()==0, std::logic_error,
"Found a product vector space with zero blocks.");
1434 std::vector<RCP<Map> > maps(prodVectorSpace->numBlocks(), Teuchos::null);
1435 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1436 RCP<const ThyVecSpaceBase > bv = prodVectorSpace->getBlock(b);
1442 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(),0);
1443 for(
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
1444 gidOffsets[i] = maps[i-1]->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
1448 std::vector<GlobalOrdinal> gids;
1449 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b){
1450 for(LocalOrdinal l = 0; l < as<LocalOrdinal>(maps[b]->getNodeNumElements()); ++l) {
1451 GlobalOrdinal gid = maps[b]->getGlobalElement(l) + gidOffsets[b];
1452 gids.push_back(gid);
1457 const GO INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
1458 Teuchos::ArrayView<GO> gidsView(&gids[0], gids.size());
1459 RCP<Map> fullMap =
MapFactory::Build(maps[0]->lib(), INVALID, gidsView, maps[0]->getIndexBase(), comm);
1461 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(fullMap));
1468 bool bIsTpetra =
false;
1469 #ifdef HAVE_XPETRA_TPETRA 1470 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1471 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1472 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_vsc = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(vectorSpace);
1473 bIsTpetra = Teuchos::is_null(tpetra_vsc) ? false :
true;
1478 bool bIsEpetra = !bIsTpetra;
1480 #ifdef HAVE_XPETRA_TPETRA 1482 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1483 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1484 typedef Thyra::VectorBase<Scalar> ThyVecBase;
1485 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> TpMap;
1486 typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpVector;
1487 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1488 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
1489 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgVec));
1490 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
1491 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraVec));
1492 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
1493 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgTpetraMap));
1496 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1504 #ifdef HAVE_XPETRA_EPETRA 1507 RCP<const Epetra_Map>
1508 epetra_map = Teuchos::get_extra_data<RCP<const Epetra_Map> >(vectorSpace,
"epetra_map");
1509 if(!Teuchos::is_null(epetra_map)) {
1511 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgXpetraMap));
1514 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"No Epetra_Map data found in Thyra::VectorSpace.");
1519 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Cannot transform Thyra::VectorSpace to Xpetra::Map.");
1520 return Teuchos::null;
1524 static Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1525 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1527 using Teuchos::rcp_dynamic_cast;
1529 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1530 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1533 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1538 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyUtils;
1541 RCP<MultiVector> xpMultVec = Teuchos::null;
1544 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<
const ThyProdMultVecBase >(v);
1545 if(thyProdVec != Teuchos::null) {
1554 std::vector<GlobalOrdinal> lidOffsets(thyProdVec->productSpace()->numBlocks()+1,0);
1555 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b){
1556 Teuchos::RCP<const ThyVecSpaceBase> thySubMap = thyProdVec->productSpace()->getBlock(b);
1557 Teuchos::RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(thySubMap);
1558 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1559 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : thySubMap->dim() );
1560 lidOffsets[b+1] = localSubDim + lidOffsets[b];
1561 RCP<Thyra::ConstDetachedMultiVectorView<Scalar> > thyData =
1562 Teuchos::rcp(
new Thyra::ConstDetachedMultiVectorView<Scalar>(thyProdVec->getMultiVectorBlock(b),Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1563 for(
size_t vv = 0; vv < xpMultVec->getNumVectors(); ++vv) {
1564 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1565 xpMultVec->replaceLocalValue(i + lidOffsets[b] , vv, (*thyData)(i,vv));
1569 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1574 bool bIsTpetra =
false;
1575 #ifdef HAVE_XPETRA_TPETRA 1576 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1577 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1581 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
1582 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> ConverterT;
1583 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpMultVec;
1585 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
1587 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<
const ThySpmdMultVecBase>(v);
1588 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<
const ThyTpMultVec>(thyraSpmdMultiVector);
1589 if(thyraTpetraMultiVector != Teuchos::null) {
1591 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
1592 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpMultVec));
1593 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
1594 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpNonConstMultVec));
1595 xpMultVec = rcp(
new XpTpMultVec(tpNonConstMultVec));
1596 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1602 #ifdef HAVE_XPETRA_EPETRA 1603 if(bIsTpetra ==
false) {
1606 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(map));
1608 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xeMap));
1609 RCP<const Epetra_Map> eMap = Teuchos::rcpFromRef(xeMap->getEpetra_Map());
1610 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(eMap));
1611 Teuchos::RCP<const Epetra_MultiVector> epMultVec = Thyra::get_Epetra_MultiVector(*eMap, v);
1612 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epMultVec));
1613 RCP<Epetra_MultiVector> epNonConstMultVec = Teuchos::rcp_const_cast<Epetra_MultiVector>(epMultVec);
1614 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epNonConstMultVec));
1616 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpMultVec));
1621 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Cannot transform Thyra::MultiVector to Xpetra::MultiVector.");
1622 return Teuchos::null;
1626 static Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
1627 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > v,
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm) {
1628 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > cv =
1629 Teuchos::rcp_const_cast<
const Thyra::MultiVectorBase<Scalar> >(v);
1630 Teuchos::RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > r =
1635 static bool isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1637 bool bIsTpetra =
false;
1638 #ifdef HAVE_XPETRA_TPETRA 1639 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1640 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1642 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(op);
1643 bIsTpetra = Teuchos::is_null(tpetra_op) ? false :
true;
1647 #ifdef HAVE_XPETRA_EPETRA
1648 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
1650 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar> >(op) == Teuchos::null) {
1652 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
1653 if(Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
1654 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
1655 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
1656 std::cout <<
" properly set!" << std::endl;
1657 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
1667 if(bIsTpetra ==
false) {
1668 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1669 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1670 if(ThyBlockedOp != Teuchos::null) {
1671 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1672 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1673 ThyBlockedOp->getBlock(0,0);
1674 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1675 bIsTpetra = isTpetra(b00);
1683 static bool isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1685 bool bIsEpetra =
false;
1687 #ifdef HAVE_XPETRA_EPETRA 1688 Teuchos::RCP<const Thyra::EpetraLinearOp> epetra_op = Teuchos::rcp_dynamic_cast<
const Thyra::EpetraLinearOp>(op,
false);
1689 bIsEpetra = Teuchos::is_null(epetra_op) ? false :
true;
1696 if(bIsEpetra ==
false) {
1697 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1698 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op,
false);
1699 if(ThyBlockedOp != Teuchos::null) {
1700 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
1701 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
1702 ThyBlockedOp->getBlock(0,0);
1703 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
1704 bIsEpetra = isEpetra(b00);
1712 static bool isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> > & op){
1714 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
1715 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(op);
1716 if(ThyBlockedOp != Teuchos::null) {
1722 static Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1723 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar> >& op) {
1725 #ifdef HAVE_XPETRA_TPETRA 1727 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1728 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1730 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1731 Teuchos::RCP<const Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getConstTpetraOperator(op);
1734 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1735 Teuchos::RCP<const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1736 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1737 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<
const Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1738 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1739 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraCrsMat);
1740 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraNcnstCrsMat));
1742 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1744 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1745 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1747 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1755 #ifdef HAVE_XPETRA_EPETRA 1757 Teuchos::RCP<const Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1758 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1759 Teuchos::RCP<const Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(epetra_op);
1760 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1761 Teuchos::RCP<const Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(epetra_rowmat);
1762 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1763 Teuchos::RCP<Epetra_CrsMatrix> epetra_ncnstcrsmat = Teuchos::rcp_const_cast<Epetra_CrsMatrix>(epetra_crsmat);
1764 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_ncnstcrsmat));
1766 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1768 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1770 Teuchos::RCP<const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > ret =
1772 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ret));
1776 return Teuchos::null;
1779 static Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1780 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar> >& op) {
1782 #ifdef HAVE_XPETRA_TPETRA 1784 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1785 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1787 typedef Thyra::TpetraOperatorVectorExtraction<Scalar,LocalOrdinal,GlobalOrdinal,Node> TOE;
1788 Teuchos::RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraOp = TOE::getTpetraOperator(op);
1789 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraOp));
1790 Teuchos::RCP<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraOp);
1791 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraRowMat));
1792 Teuchos::RCP<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > TpetraCrsMat = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(TpetraRowMat);
1793 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(TpetraCrsMat));
1795 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > xTpetraCrsMat =
1797 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpetraCrsMat));
1798 return xTpetraCrsMat;
1805 #ifdef HAVE_XPETRA_EPETRA 1807 Teuchos::RCP<Epetra_Operator> epetra_op = Thyra::get_Epetra_Operator( *op );
1808 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_op));
1809 Teuchos::RCP<Epetra_RowMatrix> epetra_rowmat = Teuchos::rcp_dynamic_cast<Epetra_RowMatrix>(epetra_op);
1810 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_rowmat));
1811 Teuchos::RCP<Epetra_CrsMatrix> epetra_crsmat = Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(epetra_rowmat);
1812 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epetra_crsmat));
1814 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node> > xEpetraCrsMat =
1816 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpetraCrsMat));
1817 return xEpetraCrsMat;
1820 return Teuchos::null;
1823 static Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
1825 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thyraMap = Teuchos::null;
1826 #ifdef HAVE_XPETRA_TPETRA 1828 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1829 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 1831 if (tpetraMap == Teuchos::null)
1832 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
1833 RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > tpMap = tpetraMap->getTpetra_Map();
1834 RCP<Thyra::TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpMap);
1835 thyraMap = thyraTpetraMap;
1842 #ifdef HAVE_XPETRA_EPETRA 1845 if (epetraMap == Teuchos::null)
1846 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::EpetraMap failed");
1847 RCP<const Thyra::VectorSpaceBase<Scalar> > thyraEpetraMap = Thyra::create_VectorSpace(Teuchos::rcpFromRef(epetraMap->getEpetra_Map()));
1848 thyraMap = thyraEpetraMap;
1855 static Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
1859 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
1860 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1861 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
1862 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1863 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1866 Teuchos::RCP< Thyra::MultiVectorBase<Scalar> > thMVec = Thyra::createMembers(thMap, vec->getNumVectors());
1867 Teuchos::RCP< Thyra::SpmdMultiVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdMultiVectorBase<Scalar> >(thMVec);
1868 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast MultiVectorBase to SpmdMultiVectorBase.");
1871 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1872 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1873 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1874 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1877 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1878 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
1880 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1881 (*thyData)(i,j) = vecData[i];
1888 static Teuchos::RCP<const Thyra::VectorBase<Scalar> >
1892 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > thMap = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(vec->getMap());
1893 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getGlobalNumElements())!=thMap->dim(), std::logic_error,
"Global dimension of Xpetra map and Thyra VectorSpaceBase are different.");
1894 Teuchos::RCP<const Thyra::SpmdVectorSpaceBase<Scalar> > thSpmdMap = Teuchos::rcp_dynamic_cast<
const Thyra::SpmdVectorSpaceBase<Scalar> >(thMap);
1895 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMap == Teuchos::null, std::logic_error,
"Cannot cast VectorSpaceBase to SpmdVectorSpaceBase.");
1896 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<Teuchos::Ordinal>(vec->getMap()->getNodeNumElements())!=thSpmdMap->localSubDim(), std::logic_error,
"Local dimension of Xpetra map and Thyra VectorSpaceBase on one (or more) processor(s) are different.");
1899 Teuchos::RCP< Thyra::VectorBase<Scalar> > thMVec = Thyra::createMember(thMap);
1900 Teuchos::RCP< Thyra::SpmdVectorBase<Scalar> > thSpmdMVec = Teuchos::rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(thMVec);
1901 TEUCHOS_TEST_FOR_EXCEPTION(thSpmdMVec == Teuchos::null, std::logic_error,
"Cannot cast VectorBase to SpmdVectorBase.");
1904 const LocalOrdinal localOffset = ( thSpmdMap != Teuchos::null ? thSpmdMap->localOffset() : 0 );
1905 const LocalOrdinal localSubDim = ( thSpmdMap != Teuchos::null ? thSpmdMap->localSubDim() : thMap->dim() );
1906 Teuchos::RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1907 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thSpmdMVec,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1910 for(
size_t j = 0; j < Teuchos::as<size_t>(thSpmdMVec->domain()->dim()); ++j) {
1911 Teuchos::ArrayRCP< const Scalar > vecData = vec->getData(j);
1913 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1914 (*thyData)(i,j) = vecData[i];
1923 using Teuchos::rcp_dynamic_cast;
1925 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
1926 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
1927 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
1930 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
1934 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
1935 if(prodTarget != Teuchos::null) {
1939 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
1940 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.");
1942 for(
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
1944 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
1947 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
1948 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
1949 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(vs);
1950 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1951 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim() );
1952 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1953 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1956 for(
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
1957 Teuchos::ArrayRCP< const Scalar > xpData = xpSubBlock->getData(j);
1960 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1961 (*thyData)(i,j) = xpData[i];
1970 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<
const ThySpmdVecSpaceBase>(target->range());
1971 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
1972 const LocalOrdinal localOffset = ( mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0 );
1973 const LocalOrdinal localSubDim = ( mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim() );
1974 RCP<Thyra::DetachedMultiVectorView<Scalar> > thyData =
1975 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target,Teuchos::Range1D(localOffset,localOffset+localSubDim-1)));
1978 for(
size_t j = 0; j < source->getNumVectors(); ++j) {
1979 Teuchos::ArrayRCP< const Scalar > xpData = source->getData(j);
1981 for(LocalOrdinal i = 0; i < localSubDim; ++i) {
1982 (*thyData)(i,j) = xpData[i];
1988 static Teuchos::RCP<const Thyra::LinearOpBase<Scalar> >
1991 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
1993 #ifdef HAVE_XPETRA_TPETRA 1995 if(tpetraMat!=Teuchos::null) {
1996 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 1997 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2000 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
2001 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
2002 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2004 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<
const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
2005 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
2006 Teuchos::RCP<const Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<
const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
2007 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
2009 thyraOp = Thyra::createConstLinearOp(tpOperator);
2010 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2017 #ifdef HAVE_XPETRA_EPETRA 2019 if(epetraMat!=Teuchos::null) {
2021 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
2022 Teuchos::RCP<const Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrix();
2023 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2025 Teuchos::RCP<const Thyra::EpetraLinearOp> thyraEpOp = Thyra::epetraLinearOp(epCrsMat,
"op");
2026 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2027 thyraOp = thyraEpOp;
2033 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2036 Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thyraOp = Teuchos::null;
2038 #ifdef HAVE_XPETRA_TPETRA 2040 if(tpetraMat!=Teuchos::null) {
2041 #if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \ 2042 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE))) 2045 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xTpCrsMat));
2046 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
2047 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpCrsMat));
2049 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpCrsMat);
2050 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpRowMat));
2051 Teuchos::RCP<Tpetra::Operator <Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tpRowMat);
2052 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(tpOperator));
2054 thyraOp = Thyra::createLinearOp(tpOperator);
2055 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraOp));
2062 #ifdef HAVE_XPETRA_EPETRA 2064 if(epetraMat!=Teuchos::null) {
2066 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xEpCrsMat));
2067 Teuchos::RCP<Epetra_CrsMatrix> epCrsMat = xEpCrsMat->getEpetra_CrsMatrixNonConst();
2068 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(epCrsMat));
2070 Teuchos::RCP<Thyra::EpetraLinearOp> thyraEpOp = Thyra::nonconstEpetraLinearOp(epCrsMat,
"op");
2071 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraEpOp));
2072 thyraOp = thyraEpOp;
2078 static Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
2082 #endif // XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 2084 #endif // HAVE_XPETRA_EPETRA 2088 #define XPETRA_THYRAUTILS_SHORT 2089 #endif // HAVE_XPETRA_THYRA 2091 #endif // XPETRA_THYRAUTILS_HPP static Teuchos::RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalGlobal lg=Xpetra::GloballyDistributed, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
Exception throws to report errors in the internal logical of the program.
Kokkos::Compat::KokkosSerialWrapperNode EpetraNode
static RCP< StridedMap > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, LocalGlobal lg=Xpetra::GloballyDistributed, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &)
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
Concrete implementation of Xpetra::Matrix.
Create an Xpetra::Map instance.
static Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t NumVectors, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.