167 const RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
168 ,LinearOpWithSolveBase<double> *Op
169 ,
const ESupportSolveUse
172 using Teuchos::outArg;
173 THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWSF");
175 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
177 const RCP<const LinearOpBase<double> >
178 fwdOp = fwdOpSrc->getOp();
182 RCP<const Epetra_Operator> epetraFwdOp;
183 EOpTransp epetraFwdOpTransp;
184 EApplyEpetraOpAs epetraFwdOpApplyAs;
185 EAdjointEpetraOp epetraFwdOpAdjointSupport;
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);
199 bool startOver = ( amesosOp->get_amesosSolver()==Teuchos::null );
203 epetraFwdOpTransp != amesosOp->get_amesosSolverTransp() ||
204 epetraFwdOp.get() != amesosOp->get_epetraLP()->GetOperator()
220 RCP<Epetra_LinearProblem>
221 epetraLP = Teuchos::rcp(
new Epetra_LinearProblem());
222 epetraLP->SetOperator(
const_cast<Epetra_Operator*
>(&*epetraFwdOp));
223 Teuchos::set_extra_data< RCP<const Epetra_Operator> >( epetraFwdOp, epetraFwdOp_str,
224 Teuchos::inOutArg(epetraLP) );
226 RCP<Amesos_BaseSolver>
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 :
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 :
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));
291 TEUCHOS_TEST_FOR_EXCEPTION(
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();
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<<
"!" );
315 amesosOp->initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,epetraFwdOpTransp,epetraFwdOpScalar);
324 RCP<Epetra_LinearProblem>
325 epetraLP = Teuchos::rcp_const_cast<Epetra_LinearProblem>(amesosOp->get_epetraLP());
326 RCP<Amesos_BaseSolver>
327 amesosSolver = amesosOp->get_amesosSolver();
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();
337 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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();
344 TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
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());