45 #include "Thyra_DefaultPreconditioner.hpp"
46 #include "Ifpack_ValidParameters.h"
47 #include "Ifpack_Preconditioner.h"
49 #include "Epetra_RowMatrix.h"
63 const std::string Ifpack_name =
"Ifpack";
65 const std::string IfpackSettings_name =
"Ifpack Settings";
67 const std::string PrecType_name =
"Prec Type";
70 const Ifpack::EPrecType PrecType_default = Ifpack::ILU;
71 const std::string PrecTypeName_default = Ifpack::precTypeNames[PrecType_default];
73 const std::string Overlap_name =
"Overlap";
74 const int Overlap_default = 0;
91 ,precType_(PrecType_default)
92 ,overlap_(Overlap_default)
101 const LinearOpSourceBase<double> &fwdOpSrc
104 using Teuchos::outArg;
106 EOpTransp epetraFwdOpTransp;
109 double epetraFwdOpScalar;
110 epetraFwdOpViewExtractor_->getEpetraOpView(
112 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
113 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
114 outArg(epetraFwdOpScalar)
116 if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
134 return Teuchos::rcp(
new DefaultPreconditioner<double>());
138 const Teuchos::RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
139 ,PreconditionerBase<double> *prec
140 ,
const ESupportSolveUse supportSolveUse
143 using Teuchos::outArg;
149 using Teuchos::rcp_dynamic_cast;
150 using Teuchos::rcp_const_cast;
151 using Teuchos::set_extra_data;
152 using Teuchos::get_optional_extra_data;
155 totalTimer.start(
true);
156 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
163 *out <<
"\nEntering Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
169 fwdOp = fwdOpSrc->getOp();
177 EOpTransp epetraFwdOpTransp;
180 double epetraFwdOpScalar;
181 epetraFwdOpViewExtractor_->getEpetraOpView(
183 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
184 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
185 outArg(epetraFwdOpScalar)
189 epetraFwdRowMat = rcp_dynamic_cast<const Epetra_RowMatrix>(epetraFwdOp,
true);
192 ,
"Error, incorrect apply mode for an Epetra_RowMatrix"
197 DefaultPreconditioner<double>
203 epetra_precOp = rcp_dynamic_cast<EpetraLinearOp>(defaultPrec->getNonconstUnspecifiedPrecOp(),
true);
209 if(epetra_precOp.
get())
210 ifpack_precOp = rcp_dynamic_cast<Ifpack_Preconditioner>(epetra_precOp->epetra_op(),
true);
214 if(ifpack_precOp.get()) {
222 const bool startingOver =
true;
232 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
239 ,const_cast<Epetra_RowMatrix*>(&*epetraFwdRowMat)
261 set_extra_data(epetraFwdOp,
"IFPF::epetraFwdOp", Teuchos::inOutArg(ifpack_precOp),
268 *out <<
"\nComputing the preconditioner ...\n";
269 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
287 set_extra_data(fwdOpSrc,
"IFPF::fwdOpSrc", Teuchos::inOutArg(ifpack_precOp),
295 epetra_precOp->initialize(
302 *out <<
"\nDescription of created preconditioner:\n";
304 ifpack_precOp->Print(*out);
310 defaultPrec->initializeUnspecified(
311 Teuchos::rcp_implicit_cast<LinearOpBase<double> >(epetra_precOp)
315 *out <<
"\nTotal time in IfpackPreconditionerFactory = "<<totalTimer.totalElapsedTime()<<
" sec\n";
317 *out <<
"\nLeaving Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
321 PreconditionerBase<double> *prec
322 ,
Teuchos::RCP<
const LinearOpSourceBase<double> > *fwdOpSrc
323 ,ESupportSolveUse *supportSolveUse
339 std::ostringstream oss;
340 oss <<
"(sub)list \""<<paramList->
name()<<
"\"parameter \"Prec Type\"";
346 Teuchos::readVerboseObjectSublist(&*
paramList_,
this);
377 using Teuchos::rcp_implicit_cast;
380 if(validParamList.
get()==NULL) {
387 precTypeNames.
begin(),
388 &Ifpack::precTypeNames[0],
389 &Ifpack::precTypeNames[0] + Ifpack::numPrecTypes
394 precTypeValues.
begin(),
395 &Ifpack::precTypeValues[0],
396 &Ifpack::precTypeValues[0] + Ifpack::numPrecTypes
398 precTypeValidator =
rcp(
400 precTypeNames,precTypeValues,PrecType_name
405 PrecType_name, PrecTypeName_default,
406 "Type of Ifpack preconditioner to use.",
407 rcp_implicit_cast<const PEV>(precTypeValidator)
410 Overlap_name, Overlap_default,
411 "Number of rows/columns overlapped between subdomains in different"
412 "\nprocesses in the additive Schwarz-type domain-decomposition preconditioners."
415 IfpackSettings_name,
false,
416 "Preconditioner settings that are passed onto the Ifpack preconditioners themselves."
417 ).setParameters(Ifpack_GetValidParameters());
423 Teuchos::setupVerboseObjectSublist(&*validParamList);
425 return validParamList;
432 std::ostringstream oss;
433 oss <<
"Thyra::IfpackPreconditionerFactory{";
444 if(!overallTimer.get()) {
445 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR