56 #ifdef HAVE_AMESOS_KLU 57 #include "Amesos_Klu.h" 59 #ifdef HAVE_AMESOS_PASTIX 60 #include "Amesos_Pastix.h" 62 #ifdef HAVE_AMESOS_LAPACK 63 #include "Amesos_Lapack.h" 65 #ifdef HAVE_AMESOS_MUMPS 66 #include "Amesos_Mumps.h" 68 #ifdef HAVE_AMESOS_SCALAPACK 69 #include "Amesos_Scalapack.h" 71 #ifdef HAVE_AMESOS_UMFPACK 72 #include "Amesos_Umfpack.h" 74 #ifdef HAVE_AMESOS_SUPERLUDIST 75 #include "Amesos_Superludist.h" 77 #ifdef HAVE_AMESOS_SUPERLU 78 #include "Amesos_Superlu.h" 80 #ifdef HAVE_AMESOS_DSCPACK 81 #include "Amesos_Dscpack.h" 83 #ifdef HAVE_AMESOS_PARDISO 84 #include "Amesos_Pardiso.h" 86 #ifdef HAVE_AMESOS_TAUCS 87 #include "Amesos_Taucs.h" 89 #ifdef HAVE_AMESOS_PARAKLETE 90 #include "Amesos_Paraklete.h" 95 const std::string epetraFwdOp_str =
"epetraFwdOp";
119 *this->getValidParameters(),0
127 ,
const bool throwOnPrecInput
130 ,solverType_(solverType)
131 ,refactorizationPolicy_(refactorizationPolicy)
132 ,throwOnPrecInput_(throwOnPrecInput)
138 const LinearOpSourceBase<double> &fwdOpSrc
141 using Teuchos::outArg;
143 fwdOp = fwdOpSrc.getOp();
145 EOpTransp epetraFwdOpTransp;
148 double epetraFwdOpScalar;
149 epetraFwdOpViewExtractor_->getEpetraOpView(
151 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
152 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
153 outArg(epetraFwdOpScalar)
155 if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
167 const RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
168 ,LinearOpWithSolveBase<double> *Op
169 ,
const ESupportSolveUse supportSolveUse
172 using Teuchos::outArg;
173 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWSF");
178 fwdOp = fwdOpSrc->getOp();
183 EOpTransp epetraFwdOpTransp;
186 double epetraFwdOpScalar;
187 epetraFwdOpViewExtractor_->getEpetraOpView(
189 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
190 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
191 outArg(epetraFwdOpScalar)
222 epetraLP->SetOperator(const_cast<Epetra_Operator*>(&*epetraFwdOp));
223 Teuchos::set_extra_data< RCP<const Epetra_Operator> >( epetraFwdOp, epetraFwdOp_str,
224 Teuchos::inOutArg(epetraLP) );
229 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:InitConstruct",
233 amesosSolver =
Teuchos::rcp(
new Amesos_Lapack(*epetraLP));
235 #ifdef HAVE_AMESOS_KLU 236 case Thyra::Amesos::KLU :
240 #ifdef HAVE_AMESOS_PASTIX 241 case Thyra::Amesos::PASTIX :
242 amesosSolver =
Teuchos::rcp(
new Amesos_Pastix(*epetraLP));
245 #ifdef HAVE_AMESOS_MUMPS 246 case Thyra::Amesos::MUMPS :
247 amesosSolver =
Teuchos::rcp(
new Amesos_Mumps(*epetraLP));
250 #ifdef HAVE_AMESOS_SCALAPACK 251 case Thyra::Amesos::SCALAPACK :
252 amesosSolver =
Teuchos::rcp(
new Amesos_Scalapack(*epetraLP));
255 #ifdef HAVE_AMESOS_UMFPACK 256 case Thyra::Amesos::UMFPACK :
257 amesosSolver =
Teuchos::rcp(
new Amesos_Umfpack(*epetraLP));
260 #ifdef HAVE_AMESOS_SUPERLUDIST 261 case Thyra::Amesos::SUPERLUDIST :
262 amesosSolver =
Teuchos::rcp(
new Amesos_Superludist(*epetraLP));
265 #ifdef HAVE_AMESOS_SUPERLU 266 case Thyra::Amesos::SUPERLU :
267 amesosSolver =
Teuchos::rcp(
new Amesos_Superlu(*epetraLP));
270 #ifdef HAVE_AMESOS_DSCPACK 271 case Thyra::Amesos::DSCPACK :
272 amesosSolver =
Teuchos::rcp(
new Amesos_Dscpack(*epetraLP));
275 #ifdef HAVE_AMESOS_PARDISO 276 case Thyra::Amesos::PARDISO :
277 amesosSolver =
Teuchos::rcp(
new Amesos_Pardiso(*epetraLP));
280 #ifdef HAVE_AMESOS_TAUCS 281 case Thyra::Amesos::TAUCS :
282 amesosSolver =
Teuchos::rcp(
new Amesos_Taucs(*epetraLP));
285 #ifdef HAVE_AMESOS_PARAKLETE 286 case Thyra::Amesos::PARAKLETE :
287 amesosSolver =
Teuchos::rcp(
new Amesos_Paraklete(*epetraLP));
292 true, std::logic_error
293 ,
"Error, the solver type ID = " <<
solverType_ <<
" is invalid!" 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<<
"!" );
315 amesosOp->
initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,epetraFwdOpTransp,epetraFwdOpScalar);
325 epetraLP = Teuchos::rcp_const_cast<Epetra_LinearProblem>(amesosOp->
get_epetraLP());
329 epetraLP->SetOperator(const_cast<Epetra_Operator*>(&*epetraFwdOp));
330 Teuchos::get_nonconst_extra_data<RCP<const Epetra_Operator> >(epetraLP,epetraFwdOp_str) = epetraFwdOp;
335 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF:Symbolic", Symbolic);
336 const int err = amesosSolver->SymbolicFactorization();
338 "Error, SymbolicFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n" 339 "returned error code "<<err<<
"!" );
342 THYRA_FUNC_TIME_MONITOR_DIFF(
"Stratimikos: AmesosLOWSF::Factor", Factor);
343 const int err = amesosSolver->NumericFactorization();
345 "Error, NumericFactorization() on amesos solver of type \'"<<
Teuchos::typeName(*amesosSolver)<<
"\'\n" 346 "returned error code "<<err<<
"!" );
354 amesosOp->
initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,epetraFwdOpTransp,epetraFwdOpScalar);
356 amesosOp->setOStream(this->getOStream());
357 amesosOp->setVerbLevel(this->getVerbLevel());
366 const RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
367 ,
const RCP<
const PreconditionerBase<double> > &prec
368 ,LinearOpWithSolveBase<double> *Op
369 ,
const ESupportSolveUse supportSolveUse
374 ,
"Error, the concrete implementation described as \'"<<this->
description()<<
"\' does not support preconditioners " 375 "and has been configured to throw this exception when the initializePreconditionedOp(...) function is called!" 381 const RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
382 ,
const RCP<
const LinearOpSourceBase<double> > &approxFwdOpSrc
383 ,LinearOpWithSolveBase<double> *Op
384 ,
const ESupportSolveUse supportSolveUse
389 ,
"Error, the concrete implementation described as \'"<<this->
description()<<
"\' does not support preconditioners " 390 "and has been configured to throw this exception when the initializePreconditionedOp(...) function is called!" 396 LinearOpWithSolveBase<double> *Op
397 ,
RCP<
const LinearOpSourceBase<double> > *fwdOpSrc
398 ,
RCP<
const PreconditionerBase<double> > *prec
399 ,
RCP<
const LinearOpSourceBase<double> > *approxFwdOpSrc
400 ,ESupportSolveUse *supportSolveUse
410 if(_fwdOpSrc.
get()) {
413 Teuchos::get_nonconst_extra_data< RCP<const Epetra_Operator> >(
414 epetraLP,epetraFwdOp_str
422 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
423 if(prec) *prec = Teuchos::null;
424 if(approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
453 Teuchos::readVerboseObjectSublist(&*
paramList_,
this);
486 std::ostringstream oss;
487 oss <<
"Thyra::AmesosLinearOpWithSolveFactory{";
499 if(validParamList.
get()==NULL) {
503 #ifdef HAVE_AMESOS_KLU
512 Teuchos::setupVerboseObjectSublist(&*validParamList);
514 return validParamList;
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
int get(const std::string &option, const std::string &groupName="") const
ERefactorizationPolicy
The policy used on refactoring a matrix.
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.
Teuchos::RCP< Amesos_BaseSolver > get_amesosSolver() const
Teuchos::RCP< Epetra_LinearProblem > get_epetraLP() const
Teuchos::RCP< const LinearOpSourceBase< double > > extract_fwdOpSrc()
Extract the LinearOpSourceBase<double> object so that it can be modified.
std::string typeName(const T &t)
const std::string toString(const EAdjointEpetraOp adjointEpetraOp)
Teuchos::StringToIntMap refactorizationPolicyNameToEnumMap
T & get(ParameterList &l, const std::string &name)
bool isCompatible(const LinearOpSourceBase< double > &fwdOpSrc) const
Returns true if dynamic_cast<const EpetraLinearOpBase*>(fwdOpSrc)!=NULL .
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Amesos::ESolverType solverType_
~AmesosLinearOpWithSolveFactory()
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
static const std::string Amesos_Settings_name
RCP< ParameterList > sublist(const RCP< ParameterList > ¶mList, const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
EOpTransp get_amesosSolverTransp() const
static const std::string SolverType_name
static const std::string RefactorizationPolicy_name
static const std::string ThrowOnPreconditionerInput_name
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) 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()
Amesos::ERefactorizationPolicy refactorizationPolicy_
Teuchos::RCP< LinearOpWithSolveBase< double > > createOp() const
Teuchos::RCP< Teuchos::ParameterList > paramList_
T_To & dyn_cast(T_From &from)
Teuchos::StringToIntMap solverTypeNameToEnumMap
std::string description() const
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
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. ...
Completely new pivoting will be used on refactorizations!
const std::string & name() const
static Teuchos::RCP< const Teuchos::ParameterList > generateAndGetValidParameters()
bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
Returns false .
AmesosLinearOpWithSolveFactory(const Amesos::ESolverType solverType=Amesos::LAPACK, const Amesos::ERefactorizationPolicy refactorizationPolicy=Amesos::REPIVOT_ON_REFACTORIZATION, const bool throwOnPrecInput=true)
Constructor which sets the defaults.
void initializeOp(const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, LinearOpWithSolveBase< double > *Op, const ESupportSolveUse supportSolveUse) const
const char * toString(const ESolverType solverType)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()