46 #include "Thyra_DefaultPreconditioner.hpp"
47 #include "ml_MultiLevelPreconditioner.h"
48 #include "ml_MultiLevelOperator.h"
49 #include "ml_ValidateParameters.h"
50 #include "ml_RefMaxwell.h"
51 #include "Epetra_RowMatrix.h"
66 ML_PROBTYPE_SMOOTHED_AGGREGATION,
67 ML_PROBTYPE_NONSYMMETRIC_SMOOTHED_AGGREGATION,
68 ML_PROBTYPE_DOMAIN_DECOMPOSITION,
69 ML_PROBTYPE_DOMAIN_DECOMPOSITION_ML,
71 ML_PROBTYPE_REFMAXWELL
73 const std::string BaseMethodDefaults_valueNames_none =
"none";
75 = Teuchos::tuple<std::string>(
76 BaseMethodDefaults_valueNames_none,
89 TEUCHOS_STATIC_SETUP()
94 const std::string BaseMethodDefaults_name =
"Base Method Defaults";
95 const std::string BaseMethodDefaults_default =
"SA";
99 BaseMethodDefaults_validator;
101 const std::string ReuseFineLevelSmoother_name =
"Reuse Fine Level Smoother";
102 const bool ReuseFineLevelSmoother_default =
false;
104 const std::string MLSettings_name =
"ML Settings";
129 const LinearOpSourceBase<double> &fwdOpSrc
132 using Teuchos::outArg;
134 EOpTransp epetraFwdOpTransp;
137 double epetraFwdOpScalar;
139 fwdOp = fwdOpSrc.getOp();
140 epetraFwdOpViewExtractor_->getEpetraOpView(
142 outArg(epetraFwdOp),outArg(epetraFwdOpTransp),
143 outArg(epetraFwdOpApplyAs),
144 outArg(epetraFwdOpAdjointSupport),
145 outArg(epetraFwdOpScalar)
147 if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
168 return Teuchos::rcp(
new DefaultPreconditioner<double>());
173 const Teuchos::RCP<
const LinearOpSourceBase<double> > &fwdOpSrc,
174 PreconditionerBase<double> *prec,
175 const ESupportSolveUse
178 using Teuchos::outArg;
184 using Teuchos::rcp_dynamic_cast;
185 using Teuchos::rcp_const_cast;
186 using Teuchos::set_extra_data;
187 using Teuchos::get_optional_extra_data;
190 totalTimer.start(
true);
195 *out <<
"\nEntering Thyra::MLPreconditionerFactory::initializePrec(...) ...\n";
198 const EMLProblemType problemType = BaseMethodDefaults_validator->getIntegralValue(*
paramList_,BaseMethodDefaults_name,BaseMethodDefaults_default);
209 EOpTransp epetraFwdOpTransp;
212 double epetraFwdOpScalar;
213 epetraFwdOpViewExtractor_->getEpetraOpView(
214 fwdOp,outArg(epetraFwdOp),outArg(epetraFwdOpTransp),outArg(epetraFwdOpApplyAs),
215 outArg(epetraFwdOpAdjointSupport),outArg(epetraFwdOpScalar)
219 epetraFwdRowMat = rcp_dynamic_cast<
const Epetra_RowMatrix>(epetraFwdOp,
true);
222 ,
"Error, incorrect apply mode for an Epetra_RowMatrix"
229 DefaultPreconditioner<double>
235 epetra_precOp = rcp_dynamic_cast<
EpetraLinearOp>(defaultPrec->getNonconstUnspecifiedPrecOp(),
true);
241 if(epetra_precOp.
get()) {
242 if(problemType == ML_PROBTYPE_REFMAXWELL)
243 rm_precOp = rcp_dynamic_cast<ML_Epetra::RefMaxwellPreconditioner>(epetra_precOp->epetra_op(),
true);
245 ml_precOp = rcp_dynamic_cast<ML_Epetra::MultiLevelPreconditioner>(epetra_precOp->epetra_op(),
true);
253 const Epetra_RowMatrix & rm = ml_precOp->RowMatrix();
255 TEUCHOS_TEST_FOR_EXCEPTION(
256 &rm!=&*epetraFwdRowMat, std::logic_error
257 ,
"ML requires Epetra_RowMatrix to be the same for each initialization of the preconditioner"
265 const bool startingOver = (ml_precOp.get() == NULL && rm_precOp.
get() == NULL);
269 *out <<
"\nCreating the initial ML_Epetra::MultiLevelPreconditioner object...\n";
273 if(problemType==ML_PROBTYPE_REFMAXWELL)
274 rm_precOp =
rcp(
new ML_Epetra::RefMaxwellPreconditioner(*epetraFwdCrsMat,
paramList_->
sublist(MLSettings_name),
false));
276 ml_precOp =
rcp(
new ML_Epetra::MultiLevelPreconditioner(*epetraFwdRowMat,
paramList_->
sublist(MLSettings_name),
false));
290 if (problemType==ML_PROBTYPE_REFMAXWELL) {
291 TEUCHOS_TEST_FOR_EXCEPT(0!=rm_precOp->SetParameterList(
paramList_->
sublist(MLSettings_name)));
294 TEUCHOS_TEST_FOR_EXCEPT(0!=ml_precOp->SetParameterList(
paramList_->
sublist(MLSettings_name)));
301 if (problemType==ML_PROBTYPE_REFMAXWELL)
302 set_extra_data(epetraFwdOp,
"IFPF::epetraFwdOp", Teuchos::inOutArg(rm_precOp),
305 set_extra_data(epetraFwdOp,
"IFPF::epetraFwdOp", Teuchos::inOutArg(ml_precOp),
311 *out <<
"\nComputing the preconditioner ...\n";
313 if (problemType==ML_PROBTYPE_REFMAXWELL) {
315 TEUCHOS_TEST_FOR_EXCEPT(0!=rm_precOp->ComputePreconditioner());
318 TEUCHOS_TEST_FOR_EXCEPT(0!=rm_precOp->ReComputePreconditioner());
323 TEUCHOS_TEST_FOR_EXCEPT(0!=ml_precOp->ComputePreconditioner());
326 TEUCHOS_TEST_FOR_EXCEPT(0!=ml_precOp->ReComputePreconditioner(
paramList_->
get<
bool>(ReuseFineLevelSmoother_name)));
341 if (problemType==ML_PROBTYPE_REFMAXWELL)
342 set_extra_data(fwdOp,
"IFPF::fwdOp", Teuchos::inOutArg(rm_precOp),
345 set_extra_data(fwdOp,
"IFPF::fwdOp", Teuchos::inOutArg(ml_precOp),
354 if (problemType==ML_PROBTYPE_REFMAXWELL)
361 defaultPrec->initializeUnspecified(
362 Teuchos::rcp_implicit_cast<LinearOpBase<double> >(epetra_precOp)
366 *out <<
"\nTotal time in MLPreconditionerFactory = "<<totalTimer.totalElapsedTime()<<
" sec\n";
368 *out <<
"\nLeaving Thyra::MLPreconditionerFactory::initializePrec(...) ...\n";
373 PreconditionerBase<double> * ,
397 paramList_->
set<
bool>(ReuseFineLevelSmoother_name,ReuseFineLevelSmoother_default);
401 *
paramList_,BaseMethodDefaults_name,BaseMethodDefaults_default
403 if( ML_PROBTYPE_NONE != defaultType ) {
404 const std::string defaultTypeStr = BaseMethodDefaults_valueNames[defaultType];
408 if(defaultType == ML_PROBTYPE_REFMAXWELL) {
409 ML_Epetra::SetDefaultsRefMaxwell(defaultParams);
414 ,
"Error, the ML problem type \"" << defaultTypeStr <<
"\' is not recognized by ML!"
466 using Teuchos::tuple;
468 using Teuchos::rcp_implicit_cast;
478 BaseMethodDefaults_validator =
rcp(
480 BaseMethodDefaults_valueNames,
482 "Do not set any default parameters",
483 "Set default parameters for a smoothed aggregation method",
484 "Set default parameters for a nonsymmetric smoothed aggregation method",
485 "Set default parameters for a domain decomposition method",
486 "Set default parameters for a domain decomposition method special to ML",
487 "Set default parameters for a Maxwell-type of preconditioner",
488 "Set default parameters for a RefMaxwell-type preconditioner"
490 tuple<EMLProblemType>(
492 ML_PROBTYPE_SMOOTHED_AGGREGATION,
493 ML_PROBTYPE_NONSYMMETRIC_SMOOTHED_AGGREGATION,
494 ML_PROBTYPE_DOMAIN_DECOMPOSITION,
495 ML_PROBTYPE_DOMAIN_DECOMPOSITION_ML,
497 ML_PROBTYPE_REFMAXWELL
499 BaseMethodDefaults_name
503 pl->set(BaseMethodDefaults_name,BaseMethodDefaults_default,
504 "Select the default method type which also sets parameter defaults\n"
505 "in the sublist \"" + MLSettings_name +
"\"!",
506 rcp_implicit_cast<const PEV>(BaseMethodDefaults_validator)
509 pl->set(ReuseFineLevelSmoother_name,ReuseFineLevelSmoother_default,
510 "Enables/disables the reuse of the fine level smoother.");
513 pl->set(MLSettings_name,mlpl,
514 "Sampling of the parameters directly accepted by ML\n"
515 "This list of parameters is generated by combining all of\n"
516 "the parameters set for all of the default problem types supported\n"
517 "by ML. Therefore, do not assume these parameters are at values that\n"
518 "are reasonable to ML. This list is just to give a sense of some of\n"
519 "the parameters that ML accepts. Consult ML documentation on how to\n"
520 "set these parameters. Also, you can print the parameter list after\n"
521 "it is used and see what defaults where set for each default problem\n"
522 "type. Warning! the parameters in this sublist are currently *not*\n"
523 "being validated by ML!"
540 std::ostringstream oss;
541 oss <<
"Thyra::MLPreconditionerFactory";
std::string description() const
bool is_null(const boost::shared_ptr< T > &p)
Teuchos::RCP< Teuchos::ParameterList > paramList_
T & get(ParameterList &l, const std::string &name)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
MLPreconditionerFactory()
RCP< ParameterList > sublist(const RCP< ParameterList > ¶mList, const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
#define TEUCHOS_ENUM_INPUT_STREAM_OPERATOR(ENUMTYPE)
basic_OSTab< char > OSTab
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
IntegralType getIntegralValue(ParameterList const ¶mList, std::string const ¶mName)
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
void start(bool reset=false)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
bool applyTransposeSupportsConj(EConj conj) const
T_To & dyn_cast(T_From &from)
void initializePrec(const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOp, PreconditionerBase< double > *prec, const ESupportSolveUse supportSolveUse) const
TypeTo implicit_cast(const TypeFrom &t)
#define TEUCHOS_ADD_STRINGTOINTEGRALVALIDATOR_CONVERTER(INTEGRALTYPE)
void uninitializePrec(PreconditionerBase< double > *prec, Teuchos::RCP< const LinearOpSourceBase< double > > *fwdOp, ESupportSolveUse *supportSolveUse) const
Teuchos::RCP< PreconditionerBase< double > > createPrec() const
bool isType(const std::string &name) const
double totalElapsedTime(bool readCurrentTime=false) const
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
bool applySupportsConj(EConj conj) const
bool isCompatible(const LinearOpSourceBase< double > &fwdOp) const