12 #include "Thyra_AmesosLinearOpWithSolveFactory.hpp"
14 #include "Thyra_AmesosLinearOpWithSolve.hpp"
15 #include "Thyra_EpetraOperatorViewExtractorStd.hpp"
17 #include "Teuchos_dyn_cast.hpp"
18 #include "Teuchos_TimeMonitor.hpp"
19 #include "Teuchos_TypeNameTraits.hpp"
20 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
22 #ifdef HAVE_AMESOS_KLU
25 #ifdef HAVE_AMESOS_PASTIX
26 #include "Amesos_Pastix.h"
28 #ifdef HAVE_AMESOS_LAPACK
29 #include "Amesos_Lapack.h"
31 #ifdef HAVE_AMESOS_MUMPS
32 #include "Amesos_Mumps.h"
34 #ifdef HAVE_AMESOS_SCALAPACK
35 #include "Amesos_Scalapack.h"
37 #ifdef HAVE_AMESOS_UMFPACK
40 #ifdef HAVE_AMESOS_SUPERLUDIST
41 #include "Amesos_Superludist.h"
43 #ifdef HAVE_AMESOS_SUPERLU
44 #include "Amesos_Superlu.h"
46 #ifdef HAVE_AMESOS_DSCPACK
47 #include "Amesos_Dscpack.h"
49 #ifdef HAVE_AMESOS_PARDISO
50 #include "Amesos_Pardiso.h"
52 #ifdef HAVE_AMESOS_TAUCS
55 #ifdef HAVE_AMESOS_PARAKLETE
61 const std::string epetraFwdOp_str =
"epetraFwdOp";
85 *this->getValidParameters(),0
91 const Amesos::ESolverType solverType
92 ,
const Amesos::ERefactorizationPolicy refactorizationPolicy
93 ,
const bool throwOnPrecInput
96 ,solverType_(solverType)
97 ,refactorizationPolicy_(refactorizationPolicy)
98 ,throwOnPrecInput_(throwOnPrecInput)
107 using Teuchos::outArg;
109 fwdOp = fwdOpSrc.
getOp();
114 double epetraFwdOpScalar;
115 epetraFwdOpViewExtractor_->getEpetraOpView(
117 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
118 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
119 outArg(epetraFwdOpScalar)
121 if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
138 using Teuchos::outArg;
139 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWSF");
144 fwdOp = fwdOpSrc->getOp();
152 double epetraFwdOpScalar;
153 epetraFwdOpViewExtractor_->getEpetraOpView(
155 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
156 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
157 outArg(epetraFwdOpScalar)
188 epetraLP->
SetOperator(const_cast<Epetra_Operator*>(&*epetraFwdOp));
189 Teuchos::set_extra_data< RCP<const Epetra_Operator> >( epetraFwdOp, epetraFwdOp_str,
190 Teuchos::inOutArg(epetraLP) );
195 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:InitConstruct",
197 switch(solverType_) {
198 case Thyra::Amesos::LAPACK :
201 #ifdef HAVE_AMESOS_KLU
202 case Thyra::Amesos::KLU :
206 #ifdef HAVE_AMESOS_PASTIX
207 case Thyra::Amesos::PASTIX :
208 amesosSolver =
Teuchos::rcp(
new Amesos_Pastix(*epetraLP));
211 #ifdef HAVE_AMESOS_MUMPS
212 case Thyra::Amesos::MUMPS :
216 #ifdef HAVE_AMESOS_SCALAPACK
217 case Thyra::Amesos::SCALAPACK :
221 #ifdef HAVE_AMESOS_UMFPACK
222 case Thyra::Amesos::UMFPACK :
226 #ifdef HAVE_AMESOS_SUPERLUDIST
227 case Thyra::Amesos::SUPERLUDIST :
231 #ifdef HAVE_AMESOS_SUPERLU
232 case Thyra::Amesos::SUPERLU :
236 #ifdef HAVE_AMESOS_DSCPACK
237 case Thyra::Amesos::DSCPACK :
241 #ifdef HAVE_AMESOS_PARDISO
242 case Thyra::Amesos::PARDISO :
246 #ifdef HAVE_AMESOS_TAUCS
247 case Thyra::Amesos::TAUCS :
251 #ifdef HAVE_AMESOS_PARAKLETE
252 case Thyra::Amesos::PARAKLETE :
258 true, std::logic_error
259 ,
"Error, the solver type ID = " << solverType_ <<
" is invalid!"
264 if(paramList_.
get()) amesosSolver->SetParameters(paramList_->
sublist(
"Amesos Settings"));
267 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:Symbolic", Symbolic);
268 const int err = amesosSolver->SymbolicFactorization();
270 "Error, SymbolicFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n"
271 "returned error code "<<err<<
"!" );
274 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:Factor", Factor);
275 const int err = amesosSolver->NumericFactorization();
277 "Error, NumericFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n"
278 "returned error code "<<err<<
"!" );
281 amesosOp->
initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,epetraFwdOpTransp,epetraFwdOpScalar);
295 epetraLP->
SetOperator(const_cast<Epetra_Operator*>(&*epetraFwdOp));
296 Teuchos::get_nonconst_extra_data<RCP<const Epetra_Operator> >(epetraLP,epetraFwdOp_str) = epetraFwdOp;
300 if(refactorizationPolicy_==Amesos::REPIVOT_ON_REFACTORIZATION) {
301 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:Symbolic", Symbolic);
302 const int err = amesosSolver->SymbolicFactorization();
304 "Error, SymbolicFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n"
305 "returned error code "<<err<<
"!" );
308 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF::Factor", Factor);
309 const int err = amesosSolver->NumericFactorization();
311 "Error, NumericFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n"
312 "returned error code "<<err<<
"!" );
320 amesosOp->
initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,epetraFwdOpTransp,epetraFwdOpScalar);
322 amesosOp->setOStream(this->getOStream());
323 amesosOp->setVerbLevel(this->getVerbLevel());
339 this->throwOnPrecInput_, std::logic_error
340 ,
"Error, the concrete implementation described as \'"<<this->
description()<<
"\' does not support preconditioners "
341 "and has been configured to throw this exception when the initializePreconditionedOp(...) function is called!"
354 this->throwOnPrecInput_, std::logic_error
355 ,
"Error, the concrete implementation described as \'"<<this->
description()<<
"\' does not support preconditioners "
356 "and has been configured to throw this exception when the initializePreconditionedOp(...) function is called!"
376 if(_fwdOpSrc.
get()) {
379 Teuchos::get_nonconst_extra_data< RCP<const Epetra_Operator> >(
380 epetraLP,epetraFwdOp_str
388 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
389 if(prec) *prec = Teuchos::null;
390 if(approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
401 paramList_ = paramList;
403 Amesos::solverTypeNameToEnumMap.get<Amesos::ESolverType>(
410 refactorizationPolicy_ =
411 Amesos::refactorizationPolicyNameToEnumMap.get<Amesos::ERefactorizationPolicy>(
419 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
432 paramList_ = Teuchos::null;
445 return generateAndGetValidParameters();
452 std::ostringstream oss;
453 oss <<
"Thyra::AmesosLinearOpWithSolveFactory{";
454 oss <<
"solverType=" <<
toString(solverType_);
462 AmesosLinearOpWithSolveFactory::generateAndGetValidParameters()
465 if(validParamList.
get()==NULL) {
469 #ifdef HAVE_AMESOS_KLU
478 Teuchos::setupVerboseObjectSublist(&*validParamList);
480 return validParamList;
const std::string & name() const
Teuchos::RCP< const LinearOpSourceBase< double > > extract_fwdOpSrc()
Extract the LinearOpSourceBase<double> object so that it can be modified.
void SetOperator(Epetra_RowMatrix *A)
bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
Returns false .
T & get(const std::string &name, T def_value)
bool isCompatible(const LinearOpSourceBase< double > &fwdOpSrc) const
Returns true if dynamic_cast<const EpetraLinearOpBase*>(fwdOpSrc)!=NULL .
~AmesosLinearOpWithSolveFactory()
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< Amesos_BaseSolver > get_amesosSolver() const
static const std::string Amesos_Settings_name
T_To & dyn_cast(T_From &from)
static Teuchos::ParameterList GetValidParameters()
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
static const std::string SolverType_name
static const std::string RefactorizationPolicy_name
static const std::string ThrowOnPreconditionerInput_name
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
void uninitializeOp(LinearOpWithSolveBase< double > *Op, Teuchos::RCP< const LinearOpSourceBase< double > > *fwdOpSrc, Teuchos::RCP< const PreconditionerBase< double > > *prec, Teuchos::RCP< const LinearOpSourceBase< double > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
TEUCHOSCORE_LIB_DLL_EXPORT std::string toString(const EVerbosityLevel verbLevel)
void initialize(const Teuchos::RCP< const LinearOpBase< double > > &fwdOp, const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, const Teuchos::RCP< Epetra_LinearProblem > &epetraLP, const Teuchos::RCP< Amesos_BaseSolver > &amesosSolver, const EOpTransp amesosSolverTransp, const double amesosSolverScalar)
First initialization.
Concrete LinearOpWithSolveBase subclass that adapts any Amesos_BaseSolver object. ...
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
ParameterList & setParameters(const ParameterList &source)
Teuchos::RCP< LinearOpWithSolveBase< double > > createOp() const
void initializeOp(const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, LinearOpWithSolveBase< double > *Op, const ESupportSolveUse supportSolveUse) const
void initializePreconditionedOp(const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, const Teuchos::RCP< const PreconditionerBase< double > > &prec, LinearOpWithSolveBase< double > *Op, const ESupportSolveUse supportSolveUse) const
Throws exception if this->throwOnPrecInput()==true and calls this->initializeOp(fwdOpSrc,Op) otherwise.
AmesosLinearOpWithSolveFactory(const Amesos::ESolverType solverType=Amesos::LAPACK, const Amesos::ERefactorizationPolicy refactorizationPolicy=Amesos::REPIVOT_ON_REFACTORIZATION, const bool throwOnPrecInput=true)
Constructor which sets the defaults.
Teuchos::RCP< Epetra_LinearProblem > get_epetraLP() const
Epetra_Operator * GetOperator() const
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
std::string description() const
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp() const =0
EOpTransp get_amesosSolverTransp() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
std::string typeName(const T &t)
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()