46 #ifndef THYRA_MUELU_PRECONDITIONER_FACTORY_DEF_HPP 47 #define THYRA_MUELU_PRECONDITIONER_FACTORY_DEF_HPP 51 #ifdef HAVE_MUELU_STRATIMIKOS 54 #include "Thyra_DefaultPreconditioner.hpp" 55 #include "Thyra_BlockedLinearOpBase.hpp" 57 #ifdef HAVE_MUELU_TPETRA 58 #include "Thyra_TpetraLinearOp.hpp" 59 #include "Thyra_TpetraThyraWrappers.hpp" 61 #ifdef HAVE_MUELU_TPETRA 62 #include "Thyra_EpetraLinearOp.hpp" 65 #include "Teuchos_Ptr.hpp" 66 #include "Teuchos_TestForException.hpp" 67 #include "Teuchos_Assert.hpp" 68 #include "Teuchos_Time.hpp" 70 #include <Xpetra_CrsMatrixWrap.hpp> 71 #include <Xpetra_CrsMatrix.hpp> 72 #include <Xpetra_Matrix.hpp> 73 #include <Xpetra_ThyraUtils.hpp> 75 #include <MueLu_Hierarchy.hpp> 77 #include <MueLu_HierarchyHelpers.hpp> 78 #include <MueLu_ParameterListInterpreter.hpp> 79 #include <MueLu_MLParameterListInterpreter.hpp> 82 #ifdef HAVE_MUELU_TPETRA 83 #include <MueLu_TpetraOperator.hpp> 85 #ifdef HAVE_MUELU_EPETRA 93 using Teuchos::ParameterList;
98 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
100 paramList_(rcp(new ParameterList()))
105 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
107 const RCP<const LinearOpBase<Scalar> > fwdOp = fwdOpSrc.getOp();
109 #ifdef HAVE_MUELU_TPETRA 110 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isTpetra(fwdOp))
return true;
113 #ifdef HAVE_MUELU_EPETRA 114 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isEpetra(fwdOp))
return true;
117 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isBlockedOperator(fwdOp))
return true;
123 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
125 return Teuchos::rcp(
new DefaultPreconditioner<Scalar>);
128 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
130 initializePrec(
const RCP<
const LinearOpSourceBase<Scalar> >& fwdOpSrc, PreconditionerBase<Scalar>* prec,
const ESupportSolveUse supportSolveUse)
const {
131 using Teuchos::rcp_dynamic_cast;
134 typedef Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> XpMap;
135 typedef Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> XpOp;
136 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpThyUtils;
137 typedef Xpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpCrsMat;
138 typedef Xpetra::BlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpBlockedCrsMat;
139 typedef Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpMat;
140 typedef Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpMultVec;
141 typedef Xpetra::MultiVector<double,LocalOrdinal,GlobalOrdinal,Node> XpMultVecDouble;
142 typedef Thyra::LinearOpBase<Scalar> ThyLinOpBase;
143 #ifdef HAVE_MUELU_TPETRA 145 typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> TpOp;
146 typedef Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyTpLinOp;
148 #if defined(HAVE_MUELU_EPETRA) and defined(HAVE_MUELU_SERIAL) 149 typedef MueLu::EpetraOperator MueEpOp;
150 typedef Thyra::EpetraLinearOp ThyEpLinOp;
158 TEUCHOS_ASSERT(Teuchos::nonnull(fwdOpSrc));
160 TEUCHOS_ASSERT(prec);
166 const RCP<const ThyLinOpBase> fwdOp = fwdOpSrc->getOp();
167 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(fwdOp));
170 bool bIsEpetra = XpThyUtils::isEpetra(fwdOp);
171 bool bIsTpetra = XpThyUtils::isTpetra(fwdOp);
172 bool bIsBlocked = XpThyUtils::isBlockedOperator(fwdOp);
173 TEUCHOS_TEST_FOR_EXCEPT((bIsEpetra ==
true && bIsTpetra ==
true));
174 TEUCHOS_TEST_FOR_EXCEPT((bIsEpetra == bIsTpetra) && bIsBlocked ==
false);
175 TEUCHOS_TEST_FOR_EXCEPT((bIsEpetra != bIsTpetra) && bIsBlocked ==
true);
177 RCP<XpMat> A = Teuchos::null;
179 Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> > ThyBlockedOp =
180 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(fwdOp);
181 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(ThyBlockedOp));
183 TEUCHOS_TEST_FOR_EXCEPT(ThyBlockedOp->blockExists(0,0)==
false);
185 Teuchos::RCP<const LinearOpBase<Scalar> > b00 = ThyBlockedOp->getBlock(0,0);
186 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(b00));
188 RCP<const XpCrsMat > xpetraFwdCrsMat00 = XpThyUtils::toXpetra(b00);
189 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpetraFwdCrsMat00));
192 RCP<XpCrsMat> xpetraFwdCrsMatNonConst00 = Teuchos::rcp_const_cast<XpCrsMat>(xpetraFwdCrsMat00);
193 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpetraFwdCrsMatNonConst00));
196 RCP<XpMat> A00 = rcp(
new Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>(xpetraFwdCrsMatNonConst00));
197 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(A00));
199 RCP<const XpMap> rowmap00 = A00->getRowMap();
200 RCP< const Teuchos::Comm< int > > comm = rowmap00->getComm();
203 RCP<XpBlockedCrsMat> bMat = Teuchos::rcp(
new XpBlockedCrsMat(ThyBlockedOp, comm));
204 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(bMat));
209 RCP<const XpCrsMat > xpetraFwdCrsMat = XpThyUtils::toXpetra(fwdOp);
210 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpetraFwdCrsMat));
213 RCP<XpCrsMat> xpetraFwdCrsMatNonConst = Teuchos::rcp_const_cast<XpCrsMat>(xpetraFwdCrsMat);
214 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(xpetraFwdCrsMatNonConst));
217 A = rcp(
new Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>(xpetraFwdCrsMatNonConst));
219 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(A));
222 const Teuchos::Ptr<DefaultPreconditioner<Scalar> > defaultPrec = Teuchos::ptr(
dynamic_cast<DefaultPreconditioner<Scalar> *
>(prec));
223 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(defaultPrec));
226 RCP<ThyLinOpBase> thyra_precOp = Teuchos::null;
227 thyra_precOp = rcp_dynamic_cast<Thyra::LinearOpBase<Scalar> >(defaultPrec->getNonconstUnspecifiedPrecOp(),
true);
230 RCP<MueLu::Hierarchy<Scalar,LocalOrdinal,GlobalOrdinal,Node> > H = Teuchos::null;
235 const bool startingOver = (thyra_precOp.is_null() || !paramList.isParameter(
"reuse: type") || paramList.get<std::string>(
"reuse: type") ==
"none");
237 if (startingOver ==
true) {
239 Teuchos::RCP<XpMultVecDouble> coordinates = Teuchos::null;
240 #ifdef HAVE_MUELU_TPETRA 244 # if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_MUELU_INST_FLOAT_INT_INT) 245 typedef Tpetra::MultiVector<float, LocalOrdinal, GlobalOrdinal, Node> tfMV;
246 RCP<tfMV> floatCoords = Teuchos::null;
248 typedef Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> tdMV;
249 RCP<tdMV> doubleCoords = Teuchos::null;
250 if (paramList.isType<RCP<tdMV> >(
"Coordinates")) {
251 doubleCoords = paramList.get<RCP<tdMV> >(
"Coordinates");
252 paramList.remove(
"Coordinates");
254 # if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_MUELU_INST_FLOAT_INT_INT) 255 else if (paramList.isType<RCP<tfMV> >(
"Coordinates")) {
256 floatCoords = paramList.get<RCP<tfMV> >(
"Coordinates");
257 paramList.remove(
"Coordinates");
258 doubleCoords = rcp(
new tdMV(floatCoords->getMap(), floatCoords->getNumVectors()));
259 deep_copy(*doubleCoords, *floatCoords);
262 if(doubleCoords != Teuchos::null) {
263 coordinates = MueLu::TpetraMultiVector_To_XpetraMultiVector<double,LocalOrdinal,GlobalOrdinal,Node>(doubleCoords);
264 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(coordinates));
265 TEUCHOS_TEST_FOR_EXCEPT(doubleCoords->getNumVectors() != coordinates->getNumVectors());
268 #endif // HAVE_MUELU_TPETRA 270 #ifdef HAVE_MUELU_EPETRA 272 RCP<Epetra_MultiVector> doubleCoords;
273 if (paramList.isType<RCP<Epetra_MultiVector> >(
"Coordinates")) {
274 doubleCoords = paramList.get<RCP<Epetra_MultiVector> >(
"Coordinates");
275 paramList.remove(
"Coordinates");
276 RCP<Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node> > epCoordinates = Teuchos::rcp(
new Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node>(doubleCoords));
277 RCP<Xpetra::MultiVector<double,int,int,Node> > epCoordinatesMult = rcp_dynamic_cast<Xpetra::MultiVector<double,int,int,Node> >(epCoordinates);
278 coordinates = rcp_dynamic_cast<Xpetra::MultiVector<double,LocalOrdinal,GlobalOrdinal,Node> >(epCoordinatesMult);
279 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(coordinates));
280 TEUCHOS_TEST_FOR_EXCEPT(doubleCoords->NumVectors() != Teuchos::as<int>(coordinates->getNumVectors()));
283 #endif // HAVE_MUELU_EPETRA 287 RCP<XpMultVec> nullspace = Teuchos::null;
288 #ifdef HAVE_MUELU_TPETRA 290 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tMV;
291 RCP<tMV> tpetra_nullspace = Teuchos::null;
292 if (paramList.isType<Teuchos::RCP<tMV> >(
"Nullspace")) {
293 tpetra_nullspace = paramList.get<RCP<tMV> >(
"Nullspace");
294 paramList.remove(
"Nullspace");
295 nullspace = MueLu::TpetraMultiVector_To_XpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(tpetra_nullspace);
296 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(nullspace));
300 #ifdef HAVE_MUELU_EPETRA 302 RCP<Epetra_MultiVector> epetra_nullspace = Teuchos::null;
303 if (paramList.isType<RCP<Epetra_MultiVector> >(
"Nullspace")) {
304 epetra_nullspace = paramList.get<RCP<Epetra_MultiVector> >(
"Nullspace");
305 paramList.remove(
"Nullspace");
306 RCP<Xpetra::EpetraMultiVectorT<int,Node> > xpEpNullspace = Teuchos::rcp(
new Xpetra::EpetraMultiVectorT<int,Node>(epetra_nullspace));
307 RCP<Xpetra::MultiVector<double,int,int,Node> > xpEpNullspaceMult = rcp_dynamic_cast<Xpetra::MultiVector<double,int,int,Node> >(xpEpNullspace);
308 nullspace = rcp_dynamic_cast<XpMultVec>(xpEpNullspaceMult);
309 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(nullspace));
321 #ifdef HAVE_MUELU_TPETRA 324 RCP<ThyTpLinOp> tpetr_precOp = rcp_dynamic_cast<ThyTpLinOp>(thyra_precOp);
325 RCP<MueTpOp> muelu_precOp = rcp_dynamic_cast<MueTpOp>(tpetr_precOp->getTpetraOperator(),
true);
327 H = muelu_precOp->GetHierarchy();
330 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_SERIAL) 332 RCP<ThyEpLinOp> epetr_precOp = rcp_dynamic_cast<ThyEpLinOp>(thyra_precOp);
333 RCP<MueEpOp> muelu_precOp = rcp_dynamic_cast<MueEpOp>(epetr_precOp->epetra_op(),
true);
341 "Thyra::MueLuPreconditionerFactory: Hierarchy has no levels in it");
343 "Thyra::MueLuPreconditionerFactory: Hierarchy has no fine level operator");
344 RCP<MueLu::Level> level0 = H->
GetLevel(0);
345 RCP<XpOp> O0 = level0->Get<RCP<XpOp> >(
"A");
346 RCP<XpMat> A0 = rcp_dynamic_cast<XpMat>(O0);
352 A->SetFixedBlockSize(A0->GetFixedBlockSize());
362 RCP<ThyLinOpBase > thyraPrecOp = Teuchos::null;
363 #ifdef HAVE_MUELU_TPETRA 365 RCP<MueTpOp> muelu_tpetraOp = rcp(
new MueTpOp(H));
366 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(muelu_tpetraOp));
367 thyraPrecOp = Thyra::createLinearOp(RCP<TpOp>(muelu_tpetraOp));
371 #if defined(HAVE_MUELU_EPETRA) 373 RCP<MueLu::Hierarchy<double,int,int,Xpetra::EpetraNode> > epetraH =
376 "Thyra::MueLuPreconditionerFactory: Failed to cast Hierarchy to Hierarchy<double,int,int,Xpetra::EpetraNode>. Epetra runs only on the Serial node.");
377 RCP<MueEpOp> muelu_epetraOp = rcp(
new MueEpOp(epetraH));
378 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(muelu_epetraOp));
380 set_extra_data(fwdOp,
"IFPF::fwdOp", Teuchos::inOutArg(muelu_epetraOp), Teuchos::POST_DESTROY,
false);
381 RCP<ThyEpLinOp> thyra_epetraOp = Thyra::nonconstEpetraLinearOp(muelu_epetraOp, NOTRANS, EPETRA_OP_APPLY_APPLY_INVERSE, EPETRA_OP_ADJOINT_UNSUPPORTED);
382 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyra_epetraOp));
383 thyraPrecOp = rcp_dynamic_cast<ThyLinOpBase>(thyra_epetraOp);
388 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::nonnull(thyraPrecOp));
392 const RCP<MueXpOp> muelu_xpetraOp = rcp(
new MueXpOp(H));
394 RCP<const VectorSpaceBase<Scalar> > thyraRangeSpace = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(muelu_xpetraOp->getRangeMap());
395 RCP<const VectorSpaceBase<Scalar> > thyraDomainSpace = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toThyra(muelu_xpetraOp->getDomainMap());
397 RCP <Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > xpOp = Teuchos::rcp_dynamic_cast<Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(muelu_xpetraOp);
398 thyraPrecOp = Thyra::xpetraLinearOp(thyraRangeSpace, thyraDomainSpace,xpOp);
401 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thyraPrecOp));
403 defaultPrec->initializeUnspecified(thyraPrecOp);
407 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
409 CreateXpetraPreconditioner(Teuchos::RCP<Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > op,
const Teuchos::ParameterList& inParamList, Teuchos::RCP<Xpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> > coords, Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > nullspace)
const {
414 Teuchos::ParameterList paramList = inParamList;
416 bool hasParamList = paramList.numParams();
418 RCP<HierarchyManager> mueLuFactory;
420 std::string syntaxStr =
"parameterlist: syntax";
421 if (hasParamList && paramList.isParameter(syntaxStr) && paramList.get<std::string>(syntaxStr) ==
"ml") {
422 paramList.remove(syntaxStr);
428 RCP<Hierarchy> H = mueLuFactory->CreateHierarchy();
429 H->setlib(op->getDomainMap()->lib());
433 H->GetLevel(0)->Set(
"A", op);
436 if (coords != Teuchos::null) {
437 H->GetLevel(0)->Set(
"Coordinates", coords);
441 if (nullspace == Teuchos::null) {
442 int nPDE = MueLu::MasterList::getDefault<int>(
"number of equations");
443 if (paramList.isSublist(
"Matrix")) {
445 const Teuchos::ParameterList& operatorList = paramList.sublist(
"Matrix");
446 if (operatorList.isParameter(
"PDE equations"))
447 nPDE = operatorList.get<
int>(
"PDE equations");
449 }
else if (paramList.isParameter(
"number of equations")) {
451 nPDE = paramList.get<
int>(
"number of equations");
454 nullspace = Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Build(op->getDomainMap(), nPDE);
456 nullspace->putScalar(Teuchos::ScalarTraits<Scalar>::one());
459 for (
int i = 0; i < nPDE; i++) {
460 Teuchos::ArrayRCP<Scalar> nsData = nullspace->getDataNonConst(i);
461 for (
int j = 0; j < nsData.size(); j++) {
462 GlobalOrdinal GID = op->getDomainMap()->getGlobalElement(j) - op->getDomainMap()->getIndexBase();
464 if ((GID-i) % nPDE == 0)
465 nsData[j] = Teuchos::ScalarTraits<Scalar>::one();
470 H->GetLevel(0)->Set(
"Nullspace", nullspace);
473 Teuchos::ParameterList nonSerialList,dummyList;
477 mueLuFactory->SetupHierarchy(*H);
482 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
484 uninitializePrec(PreconditionerBase<Scalar>* prec, RCP<
const LinearOpSourceBase<Scalar> >* fwdOp, ESupportSolveUse* supportSolveUse)
const {
485 TEUCHOS_ASSERT(prec);
488 const Teuchos::Ptr<DefaultPreconditioner<Scalar> > defaultPrec = Teuchos::ptr(
dynamic_cast<DefaultPreconditioner<Scalar> *
>(prec));
489 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(defaultPrec));
493 *fwdOp = Teuchos::null;
496 if (supportSolveUse) {
498 *supportSolveUse = Thyra::SUPPORT_SOLVE_UNSPECIFIED;
501 defaultPrec->uninitialize();
506 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
508 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(paramList));
512 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
517 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
519 RCP<ParameterList> savedParamList =
paramList_;
521 return savedParamList;
524 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
529 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
531 static RCP<const ParameterList> validPL;
533 if (Teuchos::is_null(validPL))
534 validPL = rcp(
new ParameterList());
541 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
543 return "Thyra::MueLuPreconditionerFactory";
547 #endif // HAVE_MUELU_STRATIMIKOS 549 #endif // ifdef THYRA_MUELU_PRECONDITIONER_FACTORY_DEF_HPP RCP< Level > & GetLevel(const int levelID=0)
Retrieve a certain level from hierarchy.
static void AddNonSerializableDataToHierarchy(HierarchyManager &HM, Hierarchy &H, const ParameterList &nonSerialList)
void initializePrec(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOp, PreconditionerBase< Scalar > *prec, const ESupportSolveUse supportSolveUse) const
void uninitializePrec(PreconditionerBase< Scalar > *prec, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *fwdOp, ESupportSolveUse *supportSolveUse) const
Teuchos::RCP< Teuchos::ParameterList > paramList_
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOp) const
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
MueLuPreconditionerFactory()
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
std::string description() const
Class that accepts ML-style parameters and builds a MueLu preconditioner. This interpreter uses the s...
Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateXpetraPreconditioner(Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op, const Teuchos::ParameterList ¶mList, Teuchos::RCP< Xpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node > > coords, Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > nullspace) const
Teuchos::RCP< PreconditionerBase< Scalar > > createPrec() const
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
Exception throws to report errors in the internal logical of the program.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
long ExtractNonSerializableData(const Teuchos::ParameterList &inList, Teuchos::ParameterList &serialList, Teuchos::ParameterList &nonSerialList)
Wraps an existing MueLu::Hierarchy as a Xpetra::Operator.