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>
22Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, 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) {
25 Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> map =
toXpetra(vectorSpace, comm);
27 if (stridedBlockId == -1) {
37template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
38Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
39Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
40 toXpetra(
const Teuchos::RCP<
const Thyra::VectorSpaceBase<Scalar>>& vectorSpace,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
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>;
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) {
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) {
75 resultMap =
Teuchos::rcp(
new Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node>(mapsXpetra, mapsThyra));
77#ifdef HAVE_XPETRA_TPETRA
80 Teuchos::RCP<const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_vsc = Teuchos::rcp_dynamic_cast<const Thyra::TpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(vectorSpace);
81 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.");
83 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> TpMap;
84 typedef Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpVector;
85 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
86 typedef Thyra::VectorBase<Scalar> ThyVecBase;
87 RCP<ThyVecBase> rgVec = Thyra::createMember<Scalar>(vectorSpace, std::string(
"label"));
95 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.");
102template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
103Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
104Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
105 toXpetra(Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
108 using Teuchos::rcp_dynamic_cast;
110 using ThyMultVecBase = Thyra::MultiVectorBase<Scalar>;
111 using ThyProdMultVecBase = Thyra::ProductMultiVectorBase<Scalar>;
112 using ThyUtils = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
118 Teuchos::RCP<const ThyProdMultVecBase> thyProdVec = rcp_dynamic_cast<const ThyProdMultVecBase>(v);
119 if (thyProdVec != Teuchos::null) {
122 RCP<Map> fullMap = ThyUtils::toXpetra(v->range(), comm);
131 for (
int b = 0; b < thyProdVec->productSpace()->numBlocks(); ++b) {
135 xpBlockedMultVec->setMultiVector(b, xpBlockMV,
true );
139#ifdef HAVE_XPETRA_TPETRA
140 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> ConverterT;
141 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpMultVec;
142 typedef Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> XpTpMultVec;
143 typedef Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> ThyTpMultVec;
144 typedef Thyra::SpmdMultiVectorBase<Scalar> ThySpmdMultVecBase;
148 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.");
151 RCP<TpMultVec> tpNonConstMultVec = Teuchos::rcp_const_cast<TpMultVec>(tpMultVec);
153 xpMultVec =
rcp(
new XpTpMultVec(tpNonConstMultVec));
155 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.");
162template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
163Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
164Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
165 toXpetra(Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> v,
const Teuchos::RCP<
const Teuchos::Comm<int>>& comm) {
166 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> cv =
167 Teuchos::rcp_const_cast<const Thyra::MultiVectorBase<Scalar>>(v);
168 Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> r =
170 return Teuchos::rcp_const_cast<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(r);
173template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
174bool Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
175 isTpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
179 bool bIsTpetra =
false;
180#ifdef HAVE_XPETRA_TPETRA
181 Teuchos::RCP<const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetra_op = Teuchos::rcp_dynamic_cast<const Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(op);
186#ifdef HAVE_XPETRA_EPETRA
187 Teuchos::rcp_dynamic_cast<const Thyra::EpetraLinearOp>(op) == Teuchos::null &&
189 Teuchos::rcp_dynamic_cast<
const Thyra::DefaultBlockedLinearOp<Scalar>>(op) == Teuchos::null) {
191 typedef Thyra::TpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraLinearOp_t;
192 if (Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op) == Teuchos::null) {
193 std::cout <<
"ATTENTION: The dynamic cast to the TpetraLinearOp failed even though it should be a TpetraLinearOp." << std::endl;
194 std::cout <<
" If you are using Panzer or Stratimikos you might check that the template parameters are " << std::endl;
195 std::cout <<
" properly set!" << std::endl;
196 std::cout << Teuchos::rcp_dynamic_cast<const TpetraLinearOp_t>(op,
true) << std::endl;
205 if(bIsTpetra ==
false) {
206 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
207 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar> >(op);
208 if(ThyBlockedOp != Teuchos::null) {
210 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > b00 =
211 ThyBlockedOp->getBlock(0,0);
213 bIsTpetra = isTpetra(b00);
221template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
222bool Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
223 isEpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
227template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
228bool Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
229 isBlockedOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
231 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar>> ThyBlockedOp =
232 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<Scalar>>(op);
233 if (ThyBlockedOp != Teuchos::null) {
239template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
240Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
241Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
242 toXpetra(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
243#ifdef HAVE_XPETRA_TPETRA
245 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
246 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
250 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
251 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraCrsMat = Teuchos::rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
252 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraNcnstCrsMat = Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat);
255 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraCrsMat =
256 Teuchos::rcp(
new Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(TpetraNcnstCrsMat));
259 Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsMat =
260 Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraCrsMat,
true);
261 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpCrsWrap =
262 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
263 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpMat =
264 Teuchos::rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpCrsWrap,
true);
269#ifdef HAVE_XPETRA_EPETRA
271 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
274 return Teuchos::null;
277template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
278Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
279Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
280 toXpetra(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
283 using Teuchos::rcp_const_cast;
284 using Teuchos::rcp_dynamic_cast;
286#ifdef HAVE_XPETRA_TPETRA
288 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
289 typedef Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> TpetraOperator_t;
293 rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp,
true);
295 rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraRowMat,
true);
298 rcp(
new Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
299 rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraCrsMat)));
302 rcp_dynamic_cast<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraCrsMat,
true);
304 rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(xpCrsMat));
306 rcp_dynamic_cast<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpCrsWrap,
true);
311#ifdef HAVE_XPETRA_EPETRA
313 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
316 return Teuchos::null;
319template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
320Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
321Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
322 toXpetraOperator(
const Teuchos::RCP<
const Thyra::LinearOpBase<Scalar>>& op) {
323#ifdef HAVE_XPETRA_TPETRA
325 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
326 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getConstTpetraOperator(op);
328 auto nonConstTpetraOp = Teuchos::rcp_const_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(TpetraOp);
330 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
331 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>(nonConstTpetraOp));
334 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
335 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraOp,
true);
340#ifdef HAVE_XPETRA_EPETRA
342 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
345 return Teuchos::null;
348template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
349Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
350Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
351 toXpetraOperator(
const Teuchos::RCP<Thyra::LinearOpBase<Scalar>>& op) {
352#ifdef HAVE_XPETRA_TPETRA
354 typedef Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node> TOE;
355 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> TpetraOp = TOE::getTpetraOperator(op);
357 Teuchos::RCP<Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpetraOp =
358 Teuchos::rcp(
new Xpetra::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>(TpetraOp));
361 Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpOp =
362 Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xTpetraOp,
true);
367#ifdef HAVE_XPETRA_EPETRA
369 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
372 return Teuchos::null;
375template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
376Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
377Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
378 toXpetra(
const Teuchos::RCP<Thyra::DiagonalLinearOpBase<Scalar>>& op) {
379 using Teuchos::rcp_const_cast;
380 using Teuchos::rcp_dynamic_cast;
385#ifdef HAVE_XPETRA_TPETRA
386 using thyTpV = Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
387 using tV = Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
388 if (!rcp_dynamic_cast<const thyTpV>(diag).
is_null()) {
389 RCP<const tV> tDiag = Thyra::TpetraOperatorVectorExtraction<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getConstTpetraVector(diag);
390 if (!tDiag.is_null())
399template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
400Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
401Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
402 toXpetra(
const Teuchos::RCP<
const Thyra::DiagonalLinearOpBase<Scalar>>& op) {
403 return toXpetra(Teuchos::rcp_const_cast<Thyra::DiagonalLinearOpBase<Scalar>>(op));
406template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
407Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>
408Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
409 toThyra(Teuchos::RCP<
const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> map) {
410 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> thyraMap = Teuchos::null;
414 if (bmap.is_null() ==
false) {
415 Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>>> vecSpaces(bmap->getNumMaps());
416 for (
size_t i = 0; i < bmap->getNumMaps(); i++) {
418 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>> vs =
419 Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(bmap->getMap(i,
true));
423 thyraMap = Thyra::productVectorSpace<Scalar>(vecSpaces());
428#ifdef HAVE_XPETRA_TPETRA
430 Teuchos::RCP<const Xpetra::TpetraMap<LocalOrdinal, GlobalOrdinal, Node>> tpetraMap = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraMap<LocalOrdinal, GlobalOrdinal, Node>>(map);
431 if (tpetraMap == Teuchos::null)
432 throw Exceptions::BadCast(
"Xpetra::ThyraUtils::toThyra: Cast from Xpetra::Map to Xpetra::TpetraMap failed");
434 thyraMap = thyraTpetraMap;
438#ifdef HAVE_XPETRA_EPETRA
440 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
447template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
448Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
449Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
450 toThyraMultiVector(Teuchos::RCP<
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> vec) {
452#ifdef HAVE_XPETRA_TPETRA
454 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
456 auto thyDomMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(vec->getNumVectors(), vec->getMap()->getComm()));
457 auto thyMV =
rcp(
new Thyra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
458 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
463#ifdef HAVE_XPETRA_EPETRA
465 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
472template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
473Teuchos::RCP<const Thyra::VectorBase<Scalar>>
474Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
475 toThyraVector(Teuchos::RCP<
const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> vec) {
477#ifdef HAVE_XPETRA_TPETRA
479 auto thyTpMap = Thyra::tpetraVectorSpace<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Teuchos::rcp_dynamic_cast<const TpetraMap>(vec->getMap())->getTpetra_Map());
481 auto thyVec =
rcp(
new Thyra::TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>());
482 thyVec->initialize(thyTpMap, tpVec);
487#ifdef HAVE_XPETRA_EPETRA
489 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
496template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
497void Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
498 updateThyra(Teuchos::RCP<
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> source, Teuchos::RCP<
const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node>> mapExtractor,
const Teuchos::RCP<Thyra::MultiVectorBase<Scalar>>& target) {
501 using Teuchos::rcp_dynamic_cast;
502 typedef Thyra::VectorSpaceBase<Scalar> ThyVecSpaceBase;
503 typedef Thyra::SpmdVectorSpaceBase<Scalar> ThySpmdVecSpaceBase;
504 typedef Thyra::MultiVectorBase<Scalar> ThyMultVecBase;
507 typedef Thyra::ProductMultiVectorBase<Scalar> ThyProdMultVecBase;
511 if (prodTarget != Teuchos::null) {
513 if (bSourceVec.is_null() ==
true) {
517 TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor == Teuchos::null, std::logic_error,
"Found a Thyra product vector, but user did not provide an Xpetra::MapExtractor.");
518 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.");
520 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
522 RCP<MultiVector> xpSubBlock = mapExtractor->ExtractVector(source, bbb,
false);
525 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
528 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
529 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : vs->dim());
531 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*thySubBlock, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
534 for (
size_t j = 0; j < xpSubBlock->getNumVectors(); ++j) {
535 Teuchos::ArrayRCP<const Scalar> xpData = xpSubBlock->getData(j);
538 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
539 (*thyData)(i, j) = xpData[i];
546 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.");
548 for (
int bbb = 0; bbb < prodTarget->productSpace()->numBlocks(); ++bbb) {
552 Teuchos::RCP<const ThyMultVecBase> thyXpSubBlock = toThyraMultiVector(xpSubBlock);
555 Teuchos::RCP<ThyMultVecBase> thySubBlock = prodTarget->getNonconstMultiVectorBlock(bbb);
556 Thyra::assign(thySubBlock.
ptr(), *thyXpSubBlock);
565 TEUCHOS_TEST_FOR_EXCEPTION(mpi_vs == Teuchos::null, std::logic_error,
"Failed to cast Thyra::VectorSpaceBase to Thyra::SpmdVectorSpaceBase.");
566 const LocalOrdinal localOffset = (mpi_vs != Teuchos::null ? mpi_vs->localOffset() : 0);
567 const LocalOrdinal localSubDim = (mpi_vs != Teuchos::null ? mpi_vs->localSubDim() : target->range()->dim());
569 Teuchos::rcp(
new Thyra::DetachedMultiVectorView<Scalar>(*target, Teuchos::Range1D(localOffset, localOffset + localSubDim - 1)));
572 for (
size_t j = 0; j < source->getNumVectors(); ++j) {
573 Teuchos::ArrayRCP<const Scalar> xpData = source->getData(j);
575 for (LocalOrdinal i = 0; i < localSubDim; ++i) {
576 (*thyData)(i, j) = xpData[i];
582template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
583Teuchos::RCP<const Thyra::LinearOpBase<Scalar>>
584Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
585 toThyra(
const Teuchos::RCP<
const Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& mat) {
587 Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
591#ifdef HAVE_XPETRA_TPETRA
592 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetraMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(mat);
593 if (tpetraMat != Teuchos::null) {
595 Teuchos::RCP<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpCrsMat = Teuchos::rcp_dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(mat,
true);
596 Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpCrsMat = xTpCrsMat->getTpetra_CrsMatrix();
599 Teuchos::RCP<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
600 Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
602 thyraOp = Thyra::createConstLinearOp(tpOperator);
605#ifdef HAVE_XPETRA_EPETRA
606 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
608 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to Tpetra::CrsMatrix failed. Assume matrix should be Epetra then. No Epetra available");
613 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
618template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
619Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
620Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
621 toThyra(
const Teuchos::RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& mat) {
623 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thyraOp = Teuchos::null;
627#ifdef HAVE_XPETRA_TPETRA
628 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(mat);
629 if (tpetraMat != Teuchos::null) {
631 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xTpCrsMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(mat,
true);
632 Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpCrsMat = xTpCrsMat->getTpetra_CrsMatrixNonConst();
635 Teuchos::RCP<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpRowMat = Teuchos::rcp_dynamic_cast<Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpCrsMat,
true);
636 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpOperator = Teuchos::rcp_dynamic_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(tpRowMat,
true);
638 thyraOp = Thyra::createLinearOp(tpOperator);
642#ifdef HAVE_XPETRA_EPETRA
643 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
645 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
650 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
655template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
656Teuchos::RCP<Thyra::LinearOpBase<Scalar>>
657Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
658 toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& mat) {
659 int nRows = mat->Rows();
660 int nCols = mat->Cols();
662 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> Ablock = mat->getInnermostCrsMatrix();
663 Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> Ablock_wrap = Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(Ablock);
666#ifdef HAVE_XPETRA_TPETRA
667 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(Ablock_wrap->getCrsMatrix());
668 if (tpetraMat != Teuchos::null) {
670 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar>> blockMat =
671 Thyra::defaultBlockedLinearOp<Scalar>();
673 blockMat->beginBlockFill(nRows, nCols);
675 for (
int r = 0; r < nRows; ++r) {
676 for (
int c = 0; c < nCols; ++c) {
677 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r, c);
679 if (xpmat == Teuchos::null)
continue;
681 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thBlock = Teuchos::null;
684 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xpblock =
685 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xpmat);
686 if (xpblock != Teuchos::null) {
687 if (xpblock->Rows() == 1 && xpblock->Cols() == 1) {
689 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
691 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
694 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpblock);
698 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
700 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
703 blockMat->setBlock(r, c, thBlock);
707 blockMat->endBlockFill();
712#ifdef HAVE_XPETRA_EPETRA
713 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Assuming matrix supposed to be Epetra. Epetra needs SC=double, LO=int, and GO=int or GO=long long");
715 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Cast to TpetraCrsMatrix failed. Guess, matrix should be Epetra then, but no Epetra available.");
723#if defined(HAVE_XPETRA_EPETRA) && !defined(HAVE_XPETRA_TPETRA)
724 TEUCHOS_TEST_FOR_EXCEPTION(
true, Xpetra::Exceptions::RuntimeError,
"Epetra needs SC=double, LO=int, and GO=int or GO=long long");
729#ifdef HAVE_XPETRA_EPETRA
731#ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
734Teuchos::RCP<Thyra::LinearOpBase<double>>
735ThyraUtils<double, int, int, EpetraNode>::toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<double, int, int, EpetraNode>>& mat) {
736 int nRows = mat->Rows();
737 int nCols = mat->Cols();
739 Teuchos::RCP<Xpetra::Matrix<double, int, int, EpetraNode>> Ablock = mat->getInnermostCrsMatrix();
740 Teuchos::RCP<Xpetra::CrsMatrixWrap<double, int, int, EpetraNode>> Ablock_wrap = Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<double, int, int, EpetraNode>>(Ablock);
743 bool bTpetra =
false;
744 bool bEpetra =
false;
745#ifdef HAVE_XPETRA_TPETRA
747#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
748 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT) && defined(HAVE_TPETRA_INST_DOUBLE)))
749 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(Ablock_wrap->getCrsMatrix());
750 if (tpetraMat != Teuchos::null) bTpetra =
true;
756#ifdef HAVE_XPETRA_EPETRA
757 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> epetraMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>>(Ablock_wrap->getCrsMatrix());
758 if (epetraMat != Teuchos::null) bEpetra =
true;
764 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar>> blockMat =
765 Thyra::defaultBlockedLinearOp<Scalar>();
767 blockMat->beginBlockFill(nRows, nCols);
769 for (
int r = 0; r < nRows; ++r) {
770 for (
int c = 0; c < nCols; ++c) {
771 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r, c);
773 if (xpmat == Teuchos::null)
continue;
775 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thBlock = Teuchos::null;
778 Teuchos::RCP<BlockedCrsMatrix> xpblock = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(xpmat);
779 if (xpblock != Teuchos::null) {
780 if (xpblock->Rows() == 1 && xpblock->Cols() == 1) {
782 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
784 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
787 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpblock);
791 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
793 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
796 blockMat->setBlock(r, c, thBlock);
800 blockMat->endBlockFill();
806#ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
809Teuchos::RCP<Thyra::LinearOpBase<double>>
810ThyraUtils<double, int, long long, EpetraNode>::toThyra(
const Teuchos::RCP<Xpetra::BlockedCrsMatrix<double, int, long long, EpetraNode>>& mat) {
811 int nRows = mat->Rows();
812 int nCols = mat->Cols();
814 Teuchos::RCP<Xpetra::Matrix<double, int, long long, EpetraNode>> Ablock = mat->getInnermostCrsMatrix();
815 Teuchos::RCP<Xpetra::CrsMatrixWrap<double, int, long long, EpetraNode>> Ablock_wrap = Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<double, int, long long, EpetraNode>>(Ablock);
818 bool bTpetra =
false;
819 bool bEpetra =
false;
820#ifdef HAVE_XPETRA_TPETRA
822#if ((defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)) || \
823 (!defined(EPETRA_HAVE_OMP) && defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG) && defined(HAVE_TPETRA_INST_DOUBLE)))
824 Teuchos::RCP<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> tpetraMat = Teuchos::rcp_dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(Ablock_wrap->getCrsMatrix());
825 if (tpetraMat != Teuchos::null) bTpetra =
true;
831#ifdef HAVE_XPETRA_EPETRA
832 Teuchos::RCP<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>> epetraMat = Teuchos::rcp_dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal, Node>>(Ablock_wrap->getCrsMatrix());
833 if (epetraMat != Teuchos::null) bEpetra =
true;
839 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<Scalar>> blockMat =
840 Thyra::defaultBlockedLinearOp<Scalar>();
842 blockMat->beginBlockFill(nRows, nCols);
844 for (
int r = 0; r < nRows; ++r) {
845 for (
int c = 0; c < nCols; ++c) {
846 Teuchos::RCP<Matrix> xpmat = mat->getMatrix(r, c);
848 if (xpmat == Teuchos::null)
continue;
850 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thBlock = Teuchos::null;
853 Teuchos::RCP<BlockedCrsMatrix> xpblock = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(xpmat);
854 if (xpblock != Teuchos::null) {
855 if (xpblock->Rows() == 1 && xpblock->Cols() == 1) {
857 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpblock->getCrsMatrix());
859 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
862 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpblock);
866 Teuchos::RCP<CrsMatrixWrap> xpwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(xpmat);
868 thBlock = Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(xpwrap->getCrsMatrix());
871 blockMat->setBlock(r, c, thBlock);
875 blockMat->endBlockFill();
Exception indicating invalid cast attempted.
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 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< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)