10#ifndef HAVE_XPETRA_THYRAUTILS_DEF_HPP
11#define HAVE_XPETRA_THYRAUTILS_DEF_HPP
13#ifdef HAVE_XPETRA_THYRA
15#include "Xpetra_BlockedCrsMatrix.hpp"
21template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
23Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
24 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId, GlobalOrdinal offset) {
27 if (stridedBlockId == -1) {
37template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
39Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
43 using Teuchos::rcp_dynamic_cast;
44 using ThyVecSpaceBase = Thyra::VectorSpaceBase<Scalar>;
45 using ThyProdVecSpaceBase = Thyra::ProductVectorSpaceBase<Scalar>;
46 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
48 RCP<Map> resultMap = Teuchos::null;
49 RCP<const ThyProdVecSpaceBase> prodVectorSpace = rcp_dynamic_cast<const ThyProdVecSpaceBase>(vectorSpace);
50 if (prodVectorSpace != Teuchos::null) {
53 TEUCHOS_TEST_FOR_EXCEPTION(prodVectorSpace->numBlocks() == 0, std::logic_error,
"Found a product vector space with zero blocks.");
54 std::vector<RCP<const Map>> mapsThyra(prodVectorSpace->numBlocks(), Teuchos::null);
55 std::vector<RCP<const Map>> mapsXpetra(prodVectorSpace->numBlocks(), Teuchos::null);
56 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
57 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
59 mapsThyra[b] = ThyUtils::toXpetra(bv, comm);
64 std::vector<GlobalOrdinal> gidOffsets(prodVectorSpace->numBlocks(), 0);
65 for (
int i = 1; i < prodVectorSpace->numBlocks(); ++i) {
66 gidOffsets[i] = mapsThyra[i - 1]->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
69 for (
int b = 0; b < prodVectorSpace->numBlocks(); ++b) {
70 RCP<const ThyVecSpaceBase> bv = prodVectorSpace->getBlock(b);
84 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
85 typedef Thyra::VectorBase<Scalar> ThyVecBase;
86 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
88 RCP<const TpVector> rgTpetraVec = TOE::getTpetraVector(rgVec);
90 RCP<const TpMap> rgTpetraMap = rgTpetraVec->getMap();
98template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
100Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
104 using Teuchos::rcp_dynamic_cast;
106 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
107 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
108 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
111 RCP<MultiVector> xpMultVec = Teuchos::null;
115 if (thyProdVec != Teuchos::null) {
118 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
124 RCP<BlockedMultiVector> xpBlockedMultVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(xpMultVec,
true);
127 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b) {
128 RCP<const ThyMultVecBase> thyBlockMV = thyProdVec->getMultiVectorBlock(b);
130 RCP<const MultiVector> xpBlockMV = ThyUtils::toXpetra(thyBlockMV, comm);
131 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
135 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> ConverterT;
138 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
139 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
141 RCP<const ThySpmdMultVecBase> thyraSpmdMultiVector = rcp_dynamic_cast<const ThySpmdMultVecBase>(v);
142 RCP<const ThyTpMultVec> thyraTpetraMultiVector = rcp_dynamic_cast<const ThyTpMultVec>(thyraSpmdMultiVector);
144 const RCP<const TpMultVec> tpMultVec = ConverterT::getConstTpetraMultiVector(v);
146 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
148 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
154template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
156Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
159 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar>>(v);
162 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(r);
165template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
166bool Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
167 isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
171 bool bIsTpetra =
false;
177 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar>>(op) == Teuchos::null) {
179 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
180 if (Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
181 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
182 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
183 std::cout <<
" properly set!" << std::endl;
184 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
192 if(bIsTpetra ==
false) {
194 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
195 if(ThyBlockedOp != Teuchos::null) {
198 ThyBlockedOp->getBlock(0,0);
200 bIsTpetra = isTpetra(b00);
208template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
209bool Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
210 isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
213 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar>>(op);
214 if (ThyBlockedOp != Teuchos::null) {
220template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
222Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
223 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
225 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
240 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraCrsMat,
true);
244 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpCrsWrap,
true);
248 return Teuchos::null;
251template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
253Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
254 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
257 using Teuchos::rcp_const_cast;
258 using Teuchos::rcp_dynamic_cast;
261 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
263 RCP<const TpetraOperator_t> TpetraOp = TOE::getConstTpetraOperator(op);
265 RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat =
266 rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
267 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat =
268 rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
270 RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
274 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
275 rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraCrsMat,
true);
276 RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
278 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
279 rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpCrsWrap,
true);
283 return Teuchos::null;
286template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
288Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
289 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
291 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
294 auto nonConstTpetraOp = Teuchos::rcp_const_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp);
301 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraOp,
true);
305 return Teuchos::null;
308template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
310Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
311 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
313 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
321 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraOp,
true);
325 return Teuchos::null;
328template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
330Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
331 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar>>& op) {
332 using Teuchos::rcp_const_cast;
333 using Teuchos::rcp_dynamic_cast;
335 RCP<const Thyra::VectorBase<Scalar>> diag = op->getDiag();
337 RCP<const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpDiag;
338 using thyTpV = Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
340 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
341 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getConstTpetraVector(diag);
342 if (!tDiag.is_null())
350template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
352Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
353 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar>>& op) {
354 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar>>(op));
357template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
359Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
364 RCP<const BlockedMap> bmap = Teuchos::rcp_dynamic_cast<const BlockedMap>(map);
365 if (bmap.is_null() ==
false) {
367 for (
size_t i = 0; i < bmap->getNumMaps(); i++) {
370 Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(bmap->getMap(i,
true));
374 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
381 if (tpetraMap == Teuchos::null)
382 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
383 RCP<Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> thyraTpetraMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpetraMap->getTpetra_Map());
384 thyraMap = thyraTpetraMap;
390template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
392Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
396 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
397 RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpMV = Teuchos::rcp_dynamic_cast<const TpetraMultiVector>(vec)->getTpetra_MultiVector();
398 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
399 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
400 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
407template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
409Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
413 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
414 RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpVec = Teuchos::rcp_dynamic_cast<const TpetraVector>(vec)->getTpetra_Vector();
415 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
416 thyVec->initialize(thyTpMap, tpVec);
423template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
424void Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
428 using Teuchos::rcp_dynamic_cast;
429 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
430 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
431 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
434 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
437 RCP<ThyProdMultVecBase> prodTarget = rcp_dynamic_cast<ThyProdMultVecBase>(target);
438 if (prodTarget != Teuchos::null) {
439 RCP<const BlockedMultiVector> bSourceVec = rcp_dynamic_cast<const BlockedMultiVector>(source);
440 if (bSourceVec.is_null() ==
true) {
444 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
445 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.");
447 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
449 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
453 RCP<const ThyVecSpaceBase> vs = thySubBlock->range();
454 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(vs);
455 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
456 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim());
457 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
461 for (
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
465 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
466 (*thyData)(i, j) = xpData[i];
473 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.");
475 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
477 RCP<MultiVector> xpSubBlock = bSourceVec->getMultiVector(bbb,
true);
483 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
491 RCP<const ThySpmdVecSpaceBase> mpi_vs = rcp_dynamic_cast<const ThySpmdVecSpaceBase>(target->range());
492 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
493 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
494 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim());
495 RCP<Thyra::DetachedMultiVectorView<Scalar>> thyData =
499 for (
size_t j = 0; j < source->getNumVectors(); ++j) {
502 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
503 (*thyData)(i, j) = xpData[i];
509template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
511Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
519 if (tpetraMat != Teuchos::null) {
528 thyraOp = Thyra::createConstLinearOp(tpOperator);
536template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
538Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
546 if (tpetraMat != Teuchos::null) {
555 thyraOp = Thyra::createLinearOp(tpOperator);
564template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
566Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
568 int nRows = mat->Rows();
569 int nCols = mat->Cols();
576 if (tpetraMat != Teuchos::null) {
579 Thyra::defaultBlockedLinearOp<Scalar>();
581 blockMat->beginBlockFill(nRows, nCols);
583 for (
int r = 0; r < nRows; ++r) {
584 for (
int c = 0; c < nCols; ++c) {
587 if (xpmat == Teuchos::null)
continue;
593 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpmat);
594 if (xpblock != Teuchos::null) {
595 if (xpblock->Rows() == 1 && xpblock->Cols() == 1) {
599 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
602 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpblock);
608 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
611 blockMat->setBlock(r, c, thBlock);
615 blockMat->endBlockFill();
Concrete implementation of Xpetra::Matrix.
Exception throws to report errors in the internal logical of the program.
static Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > transformThyra2XpetraGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlInput, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlReferenceInput)
replace set of global ids by new global ids
static RCP< Matrix > Build(const RCP< const Map > &rowMap)
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.
static RCP< Xpetra::StridedMap< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, LocalGlobal lg=Xpetra::GloballyDistributed)
Map constructor with Xpetra-defined contiguous uniform distribution.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool is_null(const std::shared_ptr< T > &p)
TypeTo as(const TypeFrom &t)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
const RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > toXpetraNonConst(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &map)
RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > toXpetra(RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > graph)