10 #include "Thyra_IfpackPreconditionerFactory.hpp"
11 #include "Thyra_EpetraOperatorViewExtractorStd.hpp"
12 #include "Thyra_EpetraLinearOp.hpp"
13 #include "Thyra_DefaultPreconditioner.hpp"
14 #include "Ifpack_ValidParameters.h"
15 #include "Ifpack_Preconditioner.h"
17 #include "Epetra_RowMatrix.h"
18 #include "Teuchos_TimeMonitor.hpp"
19 #include "Teuchos_dyn_cast.hpp"
20 #include "Teuchos_implicit_cast.hpp"
21 #include "Teuchos_StandardParameterEntryValidators.hpp"
22 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
23 #include "Teuchos_ValidatorXMLConverterDB.hpp"
24 #include "Teuchos_StaticSetupMacro.hpp"
31 const std::string Ifpack_name =
"Ifpack";
33 const std::string IfpackSettings_name =
"Ifpack Settings";
35 const std::string PrecType_name =
"Prec Type";
41 const std::string Overlap_name =
"Overlap";
42 const int Overlap_default = 0;
45 TEUCHOS_STATIC_SETUP()
59 ,precType_(PrecType_default)
60 ,overlap_(Overlap_default)
72 using Teuchos::outArg;
77 double epetraFwdOpScalar;
78 epetraFwdOpViewExtractor_->getEpetraOpView(
80 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
81 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
82 outArg(epetraFwdOpScalar)
84 if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
111 using Teuchos::outArg;
117 using Teuchos::rcp_dynamic_cast;
118 using Teuchos::rcp_const_cast;
119 using Teuchos::set_extra_data;
120 using Teuchos::get_optional_extra_data;
123 totalTimer.start(
true);
124 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
131 *out <<
"\nEntering Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
137 fwdOp = fwdOpSrc->getOp();
139 TEUCHOS_TEST_FOR_EXCEPT(fwdOp.
get()==NULL);
148 double epetraFwdOpScalar;
149 epetraFwdOpViewExtractor_->getEpetraOpView(
151 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
152 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
153 outArg(epetraFwdOpScalar)
157 epetraFwdRowMat = rcp_dynamic_cast<
const Epetra_RowMatrix>(epetraFwdOp,
true);
160 ,
"Error, incorrect apply mode for an Epetra_RowMatrix"
177 if(epetra_precOp.
get())
178 ifpack_precOp = rcp_dynamic_cast<Ifpack_Preconditioner>(epetra_precOp->epetra_op(),
true);
182 if(ifpack_precOp.get()) {
190 const bool startingOver =
true;
198 *out <<
"\nCreating the initial Ifpack_Preconditioner object of type \'"<<
Ifpack::toString(precType_)<<
"\' ...\n";
200 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
207 ,const_cast<Epetra_RowMatrix*>(&*epetraFwdRowMat)
215 if(paramList_.
get()) {
217 &ifpackSettingsPL = paramList_->
sublist(IfpackSettings_name);
219 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->SetParameters(ifpackSettingsPL));
224 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Initialize());
229 set_extra_data(epetraFwdOp,
"IFPF::epetraFwdOp", Teuchos::inOutArg(ifpack_precOp),
230 Teuchos::POST_DESTROY,
false);
236 *out <<
"\nComputing the preconditioner ...\n";
237 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
241 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Compute());
255 set_extra_data(fwdOpSrc,
"IFPF::fwdOpSrc", Teuchos::inOutArg(ifpack_precOp),
256 Teuchos::POST_DESTROY,
false);
263 epetra_precOp->initialize(
270 *out <<
"\nDescription of created preconditioner:\n";
272 ifpack_precOp->Print(*out);
283 *out <<
"\nTotal time in IfpackPreconditionerFactory = "<<totalTimer.totalElapsedTime()<<
" sec\n";
285 *out <<
"\nLeaving Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
305 paramList_ = paramList;
306 overlap_ = paramList_->
get(Overlap_name,Overlap_default);
307 std::ostringstream oss;
308 oss <<
"(sub)list \""<<paramList->
name()<<
"\"parameter \"Prec Type\"";
311 ? precTypeValidator->
getIntegralValue(*paramList_,PrecType_name,PrecTypeName_default)
314 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
331 paramList_ = Teuchos::null;
345 using Teuchos::rcp_implicit_cast;
348 if(validParamList.
get()==NULL) {
355 precTypeNames.
begin(),
362 precTypeValues.
begin(),
366 precTypeValidator =
rcp(
368 precTypeNames,precTypeValues,PrecType_name
373 PrecType_name, PrecTypeName_default,
374 "Type of Ifpack preconditioner to use.",
375 rcp_implicit_cast<const PEV>(precTypeValidator)
378 Overlap_name, Overlap_default,
379 "Number of rows/columns overlapped between subdomains in different"
380 "\nprocesses in the additive Schwarz-type domain-decomposition preconditioners."
383 IfpackSettings_name, Ifpack_GetValidParameters(),
384 "Preconditioner settings that are passed onto the Ifpack preconditioners themselves."
391 Teuchos::setupVerboseObjectSublist(&*validParamList);
393 return validParamList;
400 std::ostringstream oss;
401 oss <<
"Thyra::IfpackPreconditionerFactory{";
403 oss <<
",overlap=" << overlap_;
410 void IfpackPreconditionerFactory::initializeTimers()
412 if(!overallTimer.get()) {
413 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
const std::string & name() const
static const int numPrecTypes
void initializeUnspecified(const Teuchos::RCP< LinearOpBase< Scalar > > &unspecifiedPrecOp)
basic_OSTab< char > OSTab
std::string description() const
static const EPrecType precTypeValues[numPrecTypes]
Teuchos::RCP< PreconditionerBase< double > > createPrec() const
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool isCompatible(const LinearOpSourceBase< double > &fwdOpSrc) const
static const char * toString(const EPrecType precType)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
T_To & dyn_cast(T_From &from)
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
void uninitializePrec(PreconditionerBase< double > *prec, Teuchos::RCP< const LinearOpSourceBase< double > > *fwdOpSrc, ESupportSolveUse *supportSolveUse) const
Ifpack_Preconditioner * Create(const std::string PrecType, Epetra_RowMatrix *Matrix, const int overlap=0, bool overrideSerialDefault=false)
bool applyTransposeSupportsConj(EConj conj) const
IfpackPreconditionerFactory()
static const char * precTypeNames[numPrecTypes]
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
static RCP< Time > getNewTimer(const std::string &name)
IntegralType getIntegralValue(ParameterList const ¶mList, std::string const ¶mName)
void start(bool reset=false)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TypeTo implicit_cast(const TypeFrom &t)
bool applySupportsConj(EConj conj) const
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
#define TEUCHOS_ADD_STRINGTOINTEGRALVALIDATOR_CONVERTER(INTEGRALTYPE)
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
void initializePrec(const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, PreconditionerBase< double > *prec, const ESupportSolveUse supportSolveUse) const
double totalElapsedTime(bool readCurrentTime=false) const
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp() const =0
iterator insert(iterator position, const value_type &x)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()