104 const LinearOpSourceBase<double> &fwdOpSrc
107 using Teuchos::outArg;
108 RCP<const LinearOpBase<double> >
109 fwdOp = fwdOpSrc.getOp();
110 RCP<const Epetra_Operator> epetraFwdOp;
111 EOpTransp epetraFwdOpTransp;
112 EApplyEpetraOpAs epetraFwdOpApplyAs;
113 EAdjointEpetraOp epetraFwdOpAdjointSupport;
114 double epetraFwdOpScalar;
115 epetraFwdOpViewExtractor_->getEpetraOpView(
117 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
118 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
119 outArg(epetraFwdOpScalar)
133 const RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
134 ,LinearOpWithSolveBase<double> *Op
135 ,
const ESupportSolveUse
138 using Teuchos::outArg;
139 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWSF");
141 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
143 const RCP<const LinearOpBase<double> >
144 fwdOp = fwdOpSrc->getOp();
148 RCP<const Epetra_Operator> epetraFwdOp;
149 EOpTransp epetraFwdOpTransp;
150 EApplyEpetraOpAs epetraFwdOpApplyAs;
151 EAdjointEpetraOp epetraFwdOpAdjointSupport;
152 double epetraFwdOpScalar;
153 epetraFwdOpViewExtractor_->getEpetraOpView(
155 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
156 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
157 outArg(epetraFwdOpScalar)
161 *amesosOp = &Teuchos::dyn_cast<AmesosLinearOpWithSolve>(*Op);
170 epetraFwdOp.get() != amesosOp->
get_epetraLP()->GetOperator()
186 RCP<Epetra_LinearProblem>
189 Teuchos::set_extra_data< RCP<const Epetra_Operator> >( epetraFwdOp, epetraFwdOp_str,
190 Teuchos::inOutArg(epetraLP) );
192 RCP<Amesos_BaseSolver>
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 :
203 amesosSolver = Teuchos::rcp(
new Amesos_Klu(*epetraLP));
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 :
213 amesosSolver = Teuchos::rcp(
new Amesos_Mumps(*epetraLP));
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 :
248 amesosSolver = Teuchos::rcp(
new Amesos_Taucs(*epetraLP));
251#ifdef HAVE_AMESOS_PARAKLETE
252 case Thyra::Amesos::PARAKLETE :
257 TEUCHOS_TEST_FOR_EXCEPTION(
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();
269 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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();
276 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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);
290 RCP<Epetra_LinearProblem>
291 epetraLP = Teuchos::rcp_const_cast<Epetra_LinearProblem>(amesosOp->
get_epetraLP());
292 RCP<Amesos_BaseSolver>
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();
303 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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();
310 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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());