47 #ifndef THYRA_MUELU_PRECONDITIONER_FACTORY_DECL_HPP 48 #define THYRA_MUELU_PRECONDITIONER_FACTORY_DECL_HPP 52 #ifdef HAVE_MUELU_STRATIMIKOS 55 #include "Thyra_DefaultPreconditioner.hpp" 56 #include "Thyra_BlockedLinearOpBase.hpp" 58 #ifdef HAVE_MUELU_TPETRA 59 #include "Thyra_TpetraLinearOp.hpp" 60 #include "Thyra_TpetraThyraWrappers.hpp" 62 #ifdef HAVE_MUELU_EPETRA 63 #include "Thyra_EpetraLinearOp.hpp" 66 #include "Teuchos_Ptr.hpp" 68 #include "Teuchos_Assert.hpp" 71 #include <Xpetra_CrsMatrixWrap.hpp> 72 #include <Xpetra_CrsMatrix.hpp> 73 #include <Xpetra_Matrix.hpp> 74 #include <Xpetra_ThyraUtils.hpp> 76 #include <MueLu_Hierarchy.hpp> 78 #include <MueLu_HierarchyUtils.hpp> 79 #include <MueLu_Utilities.hpp> 80 #include <MueLu_ParameterListInterpreter.hpp> 81 #include <MueLu_MLParameterListInterpreter.hpp> 85 #ifdef HAVE_MUELU_TPETRA 86 #include <MueLu_TpetraOperator.hpp> 88 #ifdef HAVE_MUELU_EPETRA 92 #include "Thyra_PreconditionerFactoryBase.hpp" 94 #include "Kokkos_DefaultNode.hpp" 107 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node = KokkosClassic::DefaultNode::DefaultNodeType>
122 bool isCompatible(
const LinearOpSourceBase<Scalar>& fwdOp)
const;
127 PreconditionerBase<Scalar>* prec,
128 const ESupportSolveUse supportSolveUse
133 ESupportSolveUse* supportSolveUse
171 #ifdef HAVE_MUELU_EPETRA 202 #ifdef HAVE_MUELU_TPETRA 203 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isTpetra(fwdOp))
return true;
206 #ifdef HAVE_MUELU_EPETRA 207 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isEpetra(fwdOp))
return true;
210 if (Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::isBlockedOperator(fwdOp))
return true;
222 PreconditionerBase<Scalar>* prec,
223 const ESupportSolveUse supportSolveUse
225 using Teuchos::rcp_dynamic_cast;
228 typedef Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> XpMap;
229 typedef Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> XpOp;
230 typedef Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpThyUtils;
231 typedef Xpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpCrsMat;
232 typedef Xpetra::BlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpBlockedCrsMat;
233 typedef Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpMat;
234 typedef Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XpMultVec;
235 typedef Xpetra::MultiVector<double,LocalOrdinal,GlobalOrdinal,Node> XpMultVecDouble;
236 typedef Thyra::LinearOpBase<Scalar> ThyLinOpBase;
237 #ifdef HAVE_MUELU_TPETRA 239 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 240 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 243 typedef Thyra::TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> ThyTpLinOp;
246 #if defined(HAVE_MUELU_EPETRA) 247 typedef MueLu::EpetraOperator MueEpOp;
248 typedef Thyra::EpetraLinearOp ThyEpLinOp;
268 bool bIsEpetra = XpThyUtils::isEpetra(fwdOp);
269 bool bIsTpetra = XpThyUtils::isTpetra(fwdOp);
270 bool bIsBlocked = XpThyUtils::isBlockedOperator(fwdOp);
278 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<Scalar> >(fwdOp);
290 RCP<XpCrsMat> xpetraFwdCrsMatNonConst00 = Teuchos::rcp_const_cast<XpCrsMat>(xpetraFwdCrsMat00);
294 RCP<XpMat> A00 =
rcp(
new Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>(xpetraFwdCrsMatNonConst00));
311 RCP<XpCrsMat> xpetraFwdCrsMatNonConst = Teuchos::rcp_const_cast<XpCrsMat>(xpetraFwdCrsMat);
315 A =
rcp(
new Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>(xpetraFwdCrsMatNonConst));
325 thyra_precOp = rcp_dynamic_cast<Thyra::LinearOpBase<Scalar> >(defaultPrec->getNonconstUnspecifiedPrecOp(),
true);
333 const bool startingOver = (thyra_precOp.
is_null() || !paramList.
isParameter(
"reuse: type") || paramList.
get<std::string>(
"reuse: type") ==
"none");
335 if (startingOver ==
true) {
342 #ifdef HAVE_MUELU_TPETRA 344 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 345 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 347 RCP<tMV> tpetra_nullspace = Teuchos::null;
349 tpetra_nullspace = paramList.
get<
RCP<tMV> >(
"Nullspace");
350 paramList.
remove(
"Nullspace");
351 nullspace = MueLu::TpetraMultiVector_To_XpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(tpetra_nullspace);
356 "Thyra::MueLuPreconditionerFactory: Tpetra does not support GO=int and or EpetraNode.");
360 #ifdef HAVE_MUELU_EPETRA 365 paramList.
remove(
"Nullspace");
368 nullspace = rcp_dynamic_cast<XpMultVec>(xpEpNullspaceMult);
380 #if defined(HAVE_MUELU_TPETRA) 382 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 383 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 384 RCP<ThyTpLinOp> tpetr_precOp = rcp_dynamic_cast<ThyTpLinOp>(thyra_precOp);
385 RCP<MueTpOp> muelu_precOp = rcp_dynamic_cast<MueTpOp>(tpetr_precOp->getTpetraOperator(),
true);
387 H = muelu_precOp->GetHierarchy();
390 "Thyra::MueLuPreconditionerFactory: Tpetra does not support GO=int and or EpetraNode.");
394 #if defined(HAVE_MUELU_EPETRA)// && defined(HAVE_MUELU_SERIAL) 396 RCP<ThyEpLinOp> epetr_precOp = rcp_dynamic_cast<ThyEpLinOp>(thyra_precOp);
397 RCP<MueEpOp> muelu_precOp = rcp_dynamic_cast<MueEpOp>(epetr_precOp->epetra_op(),
true);
405 "Thyra::MueLuPreconditionerFactory: Hierarchy has no levels in it");
407 "Thyra::MueLuPreconditionerFactory: Hierarchy has no fine level operator");
416 A->SetFixedBlockSize(A0->GetFixedBlockSize());
427 #if defined(HAVE_MUELU_TPETRA) 429 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 430 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 433 RCP<TpOp> tpOp = Teuchos::rcp_dynamic_cast<TpOp>(muelu_tpetraOp);
434 thyraPrecOp = Thyra::createLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tpOp);
437 "Thyra::MueLuPreconditionerFactory: Tpetra does not support GO=int and or EpetraNode.");
442 #if defined(HAVE_MUELU_EPETRA) 447 "Thyra::MueLuPreconditionerFactory: Failed to cast Hierarchy to Hierarchy<double,int,int,Xpetra::EpetraNode>. Epetra runs only on the Serial node.");
451 set_extra_data(fwdOp,
"IFPF::fwdOp", Teuchos::inOutArg(muelu_epetraOp), Teuchos::POST_DESTROY,
false);
452 RCP<ThyEpLinOp> thyra_epetraOp = Thyra::nonconstEpetraLinearOp(muelu_epetraOp, NOTRANS, EPETRA_OP_APPLY_APPLY_INVERSE, EPETRA_OP_ADJOINT_UNSUPPORTED);
454 thyraPrecOp = rcp_dynamic_cast<ThyLinOpBase>(thyra_epetraOp);
468 thyraPrecOp = Thyra::xpetraLinearOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>(thyraRangeSpace, thyraDomainSpace,xpOp);
473 defaultPrec->initializeUnspecified(thyraPrecOp);
479 ESupportSolveUse* supportSolveUse
489 *fwdOp = Teuchos::null;
492 if (supportSolveUse) {
494 *supportSolveUse = Thyra::SUPPORT_SOLVE_UNSPECIFIED;
497 defaultPrec->uninitialize();
514 return savedParamList;
535 std::string
description()
const {
return "Thyra::MueLuPreconditionerFactory"; }
545 #endif // HAVE_MUELU_EPETRA 549 #endif // #ifdef HAVE_MUELU_STRATIMIKOS 551 #endif // THYRA_MUELU_PRECONDITIONER_FACTORY_DECL_HPP MueLuPreconditionerFactory()
Various adapters that will create a MueLu preconditioner that is an Xpetra::Matrix.
void uninitializePrec(PreconditionerBase< Scalar > *prec, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *fwdOp, ESupportSolveUse *supportSolveUse) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
T & get(const std::string &name, T def_value)
bool nonnull(const std::shared_ptr< T > &p)
bool is_null(const std::shared_ptr< T > &p)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateXpetraPreconditioner(Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op, const Teuchos::ParameterList &inParamList, Teuchos::RCP< Xpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node > > coords=Teuchos::null, Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > nullspace=Teuchos::null)
Helper function to create a MueLu preconditioner that can be used by Xpetra.Given an Xpetra::Matrix...
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Teuchos::RCP< Teuchos::ParameterList > paramList_
static RCP< Xpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node > > ExtractCoordinatesFromParameterList(ParameterList ¶mList)
bool remove(std::string const &name, bool throwIfNotExists=true)
void initializePrec(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOp, PreconditionerBase< Scalar > *prec, const ESupportSolveUse supportSolveUse) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOp) const
Teuchos::RCP< Teuchos::ParameterList > paramList_
Concrete preconditioner factory subclass for Thyra based on MueLu.Add support for MueLu preconditione...
void uninitializePrec(PreconditionerBase< Scalar > *prec, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *fwdOp, ESupportSolveUse *supportSolveUse) const
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Teuchos::RCP< PreconditionerBase< Scalar > > createPrec() const
bool isType(const std::string &name) const
std::string description() const
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
Teuchos::RCP< PreconditionerBase< Scalar > > createPrec() const
std::string description() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
MueLuPreconditionerFactory()
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
bool isParameter(const std::string &name) const
void initializePrec(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *prec, const ESupportSolveUse supportSolveUse) const
Exception throws to report errors in the internal logical of the program.
Kokkos::Compat::KokkosSerialWrapperNode EpetraNode
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
Wraps an existing MueLu::Hierarchy as a Xpetra::Operator.