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);
154 Amesos2LinearOpWithSolve<Scalar>
155 *amesos2Op = &Teuchos::dyn_cast<Amesos2LinearOpWithSolve<Scalar>>(*Op);
160 bool startOver = ( amesos2Op->get_amesos2Solver()==Teuchos::null );
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);
262 auto amesos2Solver = amesos2Op->get_amesos2Solver();
265 amesos2Solver->setA(tpetraCrsMat);
268 if(refactorizationPolicy_ == Amesos2::REPIVOT_ON_REFACTORIZATION) {
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());
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);
338 Amesos2LinearOpWithSolve<Scalar>
339 *amesos2Op = &Teuchos::dyn_cast<Amesos2LinearOpWithSolve<Scalar>>(*Op);
340 RCP<const LinearOpSourceBase<Scalar> >
341 _fwdOpSrc = amesos2Op->extract_fwdOpSrc();
342 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
343 if(prec) *prec = Teuchos::null;
344 if(approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
351 RCP<Teuchos::ParameterList>
const& paramList
354 TEUCHOS_TEST_FOR_EXCEPT(paramList.get()==NULL);
357 paramList->validateParameters(*this->getValidParameters(),0);
358 paramList_ = paramList;
363 ,Amesos2::toString(solverType_)
365 ,paramList_->name()+
"->"+SolverType_name
367 refactorizationPolicy_ =
370 RefactorizationPolicy_name
371 ,Amesos2::toString(refactorizationPolicy_)
373 ,paramList_->name()+
"->"+RefactorizationPolicy_name
375 throwOnPrecInput_ = paramList_->get(ThrowOnPreconditionerInput_name,throwOnPrecInput_);
376 Teuchos::readVerboseObjectSublist(&*paramList_,
this);