44#ifndef THYRA_AMESOS2_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
45#define THYRA_AMESOS2_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
49#include "Thyra_Amesos2LinearOpWithSolve.hpp"
51#include "Amesos2_Details_LinearSolverFactory.hpp"
52#include "Amesos2_Version.hpp"
53#include "Amesos2_Factory.hpp"
54#include "Thyra_TpetraLinearOp.hpp"
55#include "Thyra_TpetraThyraWrappers.hpp"
56#include "Thyra_DefaultDiagonalLinearOp.hpp"
57#include "Teuchos_dyn_cast.hpp"
58#include "Teuchos_TimeMonitor.hpp"
59#include "Teuchos_TypeNameTraits.hpp"
60#include "Teuchos_TypeTraits.hpp"
61#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
68template<
typename Scalar>
72template<
typename Scalar>
74 =
"Refactorization Policy";
76template<
typename Scalar>
78 =
"Throw on Preconditioner Input";
80template<
typename Scalar>
86template<
typename Scalar>
91 paramList_->validateParameters(
92 *this->getValidParameters(),0
97template<
typename Scalar>
101 const bool throwOnPrecInput
103 :solverType_(solverType)
104 ,refactorizationPolicy_(refactorizationPolicy)
105 ,throwOnPrecInput_(throwOnPrecInput)
111template<
typename Scalar>
113 const LinearOpSourceBase<Scalar> &fwdOpSrc
116 Teuchos::RCP<const LinearOpBase<Scalar> >
117 fwdOp = fwdOpSrc.getOp();
118 auto tpetraFwdOp = ConverterT::getConstTpetraOperator(fwdOp);
119 if ( !
dynamic_cast<const MAT *
>(&*tpetraFwdOp) )
124template<
typename Scalar>
125RCP<LinearOpWithSolveBase<Scalar> >
131template<
typename Scalar>
133 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
134 LinearOpWithSolveBase<Scalar> *Op,
135 const ESupportSolveUse
138 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: Amesos2LOWSF");
140 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
141 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc.get()==NULL);
142 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc->getOp().get()==NULL);
143 RCP<const LinearOpBase<Scalar> > fwdOp = fwdOpSrc->getOp();
145 Teuchos::RCP<Teuchos::FancyOStream>
146 out = Teuchos::VerboseObjectBase::getDefaultOStream();
151 auto tpetraFwdOp = ConverterT::getConstTpetraOperator(fwdOp);
152 auto tpetraCrsMat = Teuchos::rcp_dynamic_cast<const MAT>(tpetraFwdOp);
155 *amesos2Op = &Teuchos::dyn_cast<Amesos2LinearOpWithSolve<Scalar>>(*Op);
162 auto oldTpetraFwdOp = ConverterT::getConstTpetraOperator(amesos2Op->
get_fwdOp());
165 tpetraFwdOp.get() != oldTpetraFwdOp.get()
179 Teuchos::RCP<Solver> amesos2Solver;
181 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: Amesos2LOWSF:InitConstruct",
183 switch(solverType_) {
185 amesos2Solver = ::Amesos2::create<MAT,MV>(
"klu2", tpetraCrsMat);
187#ifdef HAVE_AMESOS2_LAPACK
188 case Thyra::Amesos2::LAPACK:
189 amesos2Solver = ::Amesos2::create<MAT,MV>(
"lapack", tpetraCrsMat);
192#ifdef HAVE_AMESOS2_SUPERLU
193 case Thyra::Amesos2::SUPERLU:
194 amesos2Solver = ::Amesos2::create<MAT,MV>(
"superlu", tpetraCrsMat);
197#ifdef HAVE_AMESOS2_SUPERLUMT
198 case Thyra::Amesos2::SUPERLUMT:
199 amesos2Solver = ::Amesos2::create<MAT,MV>(
"superlumt", tpetraCrsMat);
202#ifdef HAVE_AMESOS2_SUPERLUDIST
203 case Thyra::Amesos2::SUPERLUDIST:
204 amesos2Solver = ::Amesos2::create<MAT,MV>(
"superludist", tpetraCrsMat);
207#ifdef HAVE_AMESOS2_PARDISO_MKL
208 case Thyra::Amesos2::PARDISO_MKL:
209 amesos2Solver = ::Amesos2::create<MAT,MV>(
"pardiso_mkl", tpetraCrsMat);
212#ifdef HAVE_AMESOS2_CHOLMOD
213 case Thyra::Amesos2::CHOLMOD:
214 amesos2Solver = ::Amesos2::create<MAT,MV>(
"cholmod", tpetraCrsMat);
217#ifdef HAVE_AMESOS2_BASKER
218 case Thyra::Amesos2::BASKER:
219 amesos2Solver = ::Amesos2::create<MAT,MV>(
"basker", tpetraCrsMat);
222#ifdef HAVE_AMESOS2_MUMPS
223 case Thyra::Amesos2::MUMPS:
224 amesos2Solver = ::Amesos2::create<MAT,MV>(
"mumps", tpetraCrsMat);
228 TEUCHOS_TEST_FOR_EXCEPTION(
229 true, std::logic_error
230 ,
"Error, the solver type ID = " << solverType_ <<
" is invalid!"
237 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: Amesos2LOWSF:Symbolic", Symbolic);
238 amesos2Solver->symbolicFactorization();
241 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: Amesos2LOWSF:Factor", Factor);
242 amesos2Solver->numericFactorization();
247 const Teuchos::RCP<Teuchos::ParameterList> dup_list
248 = Teuchos::rcp(
new Teuchos::ParameterList(*paramList_));
249 dup_list->remove(SolverType_name);
250 dup_list->remove(RefactorizationPolicy_name);
251 dup_list->remove(ThrowOnPreconditionerInput_name);
252 dup_list->remove(
"VerboseObject");
253 amesos2Solver->setParameters(dup_list);
256 amesos2Op->
initialize(fwdOp,fwdOpSrc,amesos2Solver);
265 amesos2Solver->setA(tpetraCrsMat);
269 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: Amesos2LOWSF:Symbolic", Symbolic);
270 amesos2Solver->symbolicFactorization();
273 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: Amesos2LOWSF::Factor", Factor);
274 amesos2Solver->numericFactorization();
278 amesos2Op->
initialize(fwdOp,fwdOpSrc,amesos2Solver);
280 amesos2Op->setOStream(this->getOStream());
281 amesos2Op->setVerbLevel(this->getVerbLevel());
284template<
typename Scalar>
290template<
typename Scalar>
292 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
293 const RCP<
const PreconditionerBase<Scalar> > &,
294 LinearOpWithSolveBase<Scalar> *Op,
295 const ESupportSolveUse supportSolveUse
298 TEUCHOS_TEST_FOR_EXCEPTION(
299 this->throwOnPrecInput_, std::logic_error,
300 "Error, the concrete implementation described as \'"<<this->description()
301 <<
"\' does not support preconditioners"
302 " and has been configured to throw this exception when the"
303 " initializePreconditionedOp(...) function is called!"
305 this->initializeOp(fwdOpSrc,Op,supportSolveUse);
308template<
typename Scalar>
310 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
311 const RCP<
const LinearOpSourceBase<Scalar> > &,
312 LinearOpWithSolveBase<Scalar> *Op,
313 const ESupportSolveUse supportSolveUse
316 TEUCHOS_TEST_FOR_EXCEPTION(
317 this->throwOnPrecInput_, std::logic_error,
318 "Error, the concrete implementation described as \'"<<this->description()
319 <<
"\' does not support preconditioners"
320 " and has been configured to throw this exception when the"
321 " initializePreconditionedOp(...) function is called!"
323 this->initializeOp(fwdOpSrc,Op,supportSolveUse);
326template<
typename Scalar>
328 LinearOpWithSolveBase<Scalar> *Op,
329 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
330 RCP<
const PreconditionerBase<Scalar> > *prec,
331 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
336 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
339 *amesos2Op = &Teuchos::dyn_cast<Amesos2LinearOpWithSolve<Scalar>>(*Op);
340 RCP<const LinearOpSourceBase<Scalar> >
342 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
343 if(prec) *prec = Teuchos::null;
344 if(approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
349template<
typename Scalar>
351 RCP<Teuchos::ParameterList>
const& paramList
354 TEUCHOS_TEST_FOR_EXCEPT(paramList.get()==NULL);
357 paramList->validateParameters(*this->getValidParameters(),0);
358 paramList_ = paramList;
365 ,paramList_->name()+
"->"+SolverType_name
367 refactorizationPolicy_ =
370 RefactorizationPolicy_name
373 ,paramList_->name()+
"->"+RefactorizationPolicy_name
375 throwOnPrecInput_ = paramList_->get(ThrowOnPreconditionerInput_name,throwOnPrecInput_);
376 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
379template<
typename Scalar>
380RCP<Teuchos::ParameterList>
386template<
typename Scalar>
387RCP<Teuchos::ParameterList>
390 RCP<Teuchos::ParameterList> _paramList = paramList_;
391 paramList_ = Teuchos::null;
395template<
typename Scalar>
396RCP<const Teuchos::ParameterList>
402template<
typename Scalar>
403RCP<const Teuchos::ParameterList>
406 return generateAndGetValidParameters();
411template<
typename Scalar>
414 std::ostringstream oss;
415 oss <<
"Thyra::Amesos2LinearOpWithSolveFactory{";
416 oss <<
"solverType=" << toString(solverType_);
423template<
typename Scalar>
424RCP<const Teuchos::ParameterList>
427 static RCP<Teuchos::ParameterList> validParamList;
428 if (validParamList.get()==NULL) {
429 validParamList = Teuchos::rcp(
new Teuchos::ParameterList(
"Amesos2"));
431 validParamList->set(RefactorizationPolicy_name,
433 validParamList->set(ThrowOnPreconditionerInput_name,
bool(
true));
434 Teuchos::setupVerboseObjectSublist(&*validParamList);
436 return validParamList;
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Amesos2LinearOpWithSolveFactory(const Amesos2::ESolverType solverType=Amesos2::LAPACK, const Amesos2::ERefactorizationPolicy refactorizationPolicy=Amesos2::REPIVOT_ON_REFACTORIZATION, const bool throwOnPrecInput=true)
Constructor which sets the defaults.
Teuchos::RCP< LinearOpWithSolveBase< Scalar > > createOp() const
static Teuchos::RCP< const Teuchos::ParameterList > generateAndGetValidParameters()
static const std::string ThrowOnPreconditionerInput_name
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
static const std::string SolverType_name
~Amesos2LinearOpWithSolveFactory()
void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, Teuchos::RCP< const PreconditionerBase< Scalar > > *prec, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
typename Amesos2LinearOpWithSolve< Scalar >::MAT MAT
static const std::string RefactorizationPolicy_name
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
static const std::string Amesos2_Settings_name
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
void initializeOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
std::string description() const
bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
Returns false .
void initializePreconditionedOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const Teuchos::RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Throws exception if this->throwOnPrecInput()==true and calls this->initializeOp(fwdOpSrc,...
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Concrete LinearOpWithSolveBase subclass in terms of Amesos2.
Teuchos::RCP< const LinearOpSourceBase< Scalar > > extract_fwdOpSrc()
Extract the forward LinearOpSourceBase<double> object so that it can be modified and remove it from t...
Teuchos::RCP< Solver > get_amesos2Solver()
Teuchos::RCP< const LinearOpBase< Scalar > > get_fwdOp() const
void initialize(const Teuchos::RCP< const LinearOpBase< Scalar > > &fwdOp, const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const Teuchos::RCP< Solver > &amesos2Solver)
Initialize after construction.
ERefactorizationPolicy
The policy used on refactoring a matrix.
@ REPIVOT_ON_REFACTORIZATION
Completely new pivoting will be used on refactorizations!
const char * solverTypeNames[numSolverTypes]
Teuchos::StringToIntMap refactorizationPolicyNameToEnumMap
const char * toString(const ESolverType solverType)
Teuchos::StringToIntMap solverTypeNameToEnumMap