46 #include "Thyra_AmesosLinearOpWithSolveFactory.hpp"
48 #include "Thyra_AmesosLinearOpWithSolve.hpp"
49 #include "Thyra_EpetraOperatorViewExtractorStd.hpp"
51 #include "Teuchos_dyn_cast.hpp"
52 #include "Teuchos_TimeMonitor.hpp"
53 #include "Teuchos_TypeNameTraits.hpp"
54 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
56 #ifdef HAVE_AMESOS_KLU
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
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
89 #ifdef HAVE_AMESOS_PARAKLETE
95 const std::string epetraFwdOp_str =
"epetraFwdOp";
119 *this->getValidParameters(),0
125 const Amesos::ESolverType solverType
126 ,
const Amesos::ERefactorizationPolicy refactorizationPolicy
127 ,
const bool throwOnPrecInput
130 ,solverType_(solverType)
131 ,refactorizationPolicy_(refactorizationPolicy)
132 ,throwOnPrecInput_(throwOnPrecInput)
141 using Teuchos::outArg;
143 fwdOp = fwdOpSrc.
getOp();
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) )
172 using Teuchos::outArg;
173 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWSF");
178 fwdOp = fwdOpSrc->getOp();
186 double epetraFwdOpScalar;
187 epetraFwdOpViewExtractor_->getEpetraOpView(
189 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
190 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
191 outArg(epetraFwdOpScalar)
195 *amesosOp = &Teuchos::dyn_cast<AmesosLinearOpWithSolve>(*Op);
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",
231 switch(solverType_) {
232 case Thyra::Amesos::LAPACK :
235 #ifdef HAVE_AMESOS_KLU
236 case Thyra::Amesos::KLU :
237 amesosSolver = Teuchos::rcp(
new Amesos_Klu(*epetraLP));
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 :
255 #ifdef HAVE_AMESOS_UMFPACK
256 case Thyra::Amesos::UMFPACK :
260 #ifdef HAVE_AMESOS_SUPERLUDIST
261 case Thyra::Amesos::SUPERLUDIST :
265 #ifdef HAVE_AMESOS_SUPERLU
266 case Thyra::Amesos::SUPERLU :
270 #ifdef HAVE_AMESOS_DSCPACK
271 case Thyra::Amesos::DSCPACK :
275 #ifdef HAVE_AMESOS_PARDISO
276 case Thyra::Amesos::PARDISO :
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 :
292 true, std::logic_error
293 ,
"Error, the solver type ID = " << solverType_ <<
" is invalid!"
298 if(paramList_.
get()) amesosSolver->SetParameters(paramList_->
sublist(
"Amesos Settings"));
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;
334 if(refactorizationPolicy_==Amesos::REPIVOT_ON_REFACTORIZATION) {
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);
373 this->throwOnPrecInput_, std::logic_error
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!"
388 this->throwOnPrecInput_, std::logic_error
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!"
407 *amesosOp = &Teuchos::dyn_cast<AmesosLinearOpWithSolve>(*Op);
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;
435 paramList_ = paramList;
437 Amesos::solverTypeNameToEnumMap.get<Amesos::ESolverType>(
444 refactorizationPolicy_ =
445 Amesos::refactorizationPolicyNameToEnumMap.get<Amesos::ERefactorizationPolicy>(
453 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
466 paramList_ = Teuchos::null;
479 return generateAndGetValidParameters();
486 std::ostringstream oss;
487 oss <<
"Thyra::AmesosLinearOpWithSolveFactory{";
488 oss <<
"solverType=" <<
toString(solverType_);
496 AmesosLinearOpWithSolveFactory::generateAndGetValidParameters()
499 if(validParamList.
get()==NULL) {
503 #ifdef HAVE_AMESOS_KLU
512 Teuchos::setupVerboseObjectSublist(&*validParamList);
514 return validParamList;