44 #include "Stratimikos_InternalConfig.h" 45 #include "Stratimikos_DefaultLinearSolverBuilder.hpp" 46 #include "Thyra_DelayedLinearOpWithSolveFactory.hpp" 47 #include "Teuchos_AbstractFactoryStd.hpp" 48 #include "Teuchos_CommandLineProcessor.hpp" 49 #include "Teuchos_XMLParameterListHelpers.hpp" 50 #include "Teuchos_GlobalMPISession.hpp" 52 #ifdef HAVE_STRATIMIKOS_AMESOS 53 # include "Thyra_AmesosLinearOpWithSolveFactory.hpp" 55 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 56 # include "Thyra_AztecOOLinearOpWithSolveFactory.hpp" 58 #ifdef HAVE_STRATIMIKOS_BELOS 59 # include "Thyra_BelosLinearOpWithSolveFactory.hpp" 61 #ifdef HAVE_STRATIMIKOS_IFPACK 62 # include "Thyra_IfpackPreconditionerFactory.hpp" 64 #ifdef HAVE_STRATIMIKOS_ML 65 # include "Thyra_MLPreconditionerFactory.hpp" 72 const std::string LinearSolverType_name =
"Linear Solver Type";
73 const std::string LinearSolverTypes_name =
"Linear Solver Types";
74 const std::string PreconditionerType_name =
"Preconditioner Type";
75 const std::string PreconditionerTypes_name =
"Preconditioner Types";
76 const std::string None_name =
"None";
77 const std::string EnableDelayedSolverConstruction_name =
"Enable Delayed Solver Construction";
78 const bool EnableDelayedSolverConstruction_default =
false;
91 const std::string ¶msXmlFileName_in
92 ,
const std::string &extraParamsXmlString_in
93 ,
const std::string ¶msUsedXmlOutFileName_in
94 ,
const std::string ¶msXmlFileNameOption_in
95 ,
const std::string &extraParamsXmlStringOption_in
96 ,
const std::string ¶msUsedXmlOutFileNameOption_in
98 :paramsXmlFileName_(paramsXmlFileName_in)
99 ,extraParamsXmlString_(extraParamsXmlString_in)
100 ,paramsUsedXmlOutFileName_(paramsUsedXmlOutFileName_in)
101 ,paramsXmlFileNameOption_(paramsXmlFileNameOption_in)
102 ,extraParamsXmlStringOption_(extraParamsXmlStringOption_in)
103 ,paramsUsedXmlOutFileNameOption_(paramsUsedXmlOutFileNameOption_in)
104 ,enableDelayedSolverConstruction_(EnableDelayedSolverConstruction_default)
106 this->initializeDefaults();
114 if (nonnull(paramList_)) {
122 const RCP<
const AbstractFactory<Thyra::LinearOpWithSolveFactoryBase<double> > >
123 &solveStrategyFactory,
124 const std::string &solveStrategyName,
125 const bool makeDefault
128 validLowsfNames_.push_back(solveStrategyName);
129 lowsfArray_.push_back(solveStrategyFactory);
130 validParamList_ = Teuchos::null;
138 const std::string &solveStrategyName)
140 defaultLOWSF_ = solveStrategyName;
145 const RCP<
const AbstractFactory<Thyra::PreconditionerFactoryBase<double> > >
146 &precStrategyFactory,
147 const std::string &precStrategyName,
148 const bool makeDefault
151 validPfNames_.push_back(precStrategyName);
152 pfArray_.push_back(precStrategyFactory);
153 validParamList_ = Teuchos::null;
161 const std::string &precStrategyName)
163 defaultPF_ = precStrategyName;
169 TEUCHOS_TEST_FOR_EXCEPT(clp==NULL);
171 paramsXmlFileNameOption().c_str(),¶msXmlFileName_
172 ,
"Name of an XML file containing parameters for linear solver " 173 "options to be appended first." 176 extraParamsXmlStringOption().c_str(),&extraParamsXmlString_
177 ,
"An XML string containing linear solver parameters to be appended second." 180 paramsUsedXmlOutFileNameOption().c_str(),¶msUsedXmlOutFileName_
181 ,
"Name of an XML file that can be written with the parameter list after it " 182 "has been used on completion of this program." 189 using Teuchos::parameterList;
191 using Teuchos::updateParametersFromXmlFile;
192 using Teuchos::updateParametersFromXmlString;
195 if (!paramList_.get()) {
196 paramList_ = parameterList(
"DefaultLinearSolverBuilder");
198 if (paramsXmlFileName().length()) {
200 *out << endl <<
"Reading parameters from XML file \"" 201 << paramsXmlFileName() <<
"\" ..." << endl;
203 updateParametersFromXmlFile (paramsXmlFileName (), paramList_.ptr());
205 if (extraParamsXmlString().length()) {
207 *out << endl <<
"Appending extra parameters from the XML string \"" 208 << extraParamsXmlString() <<
"\" ..." << endl;
210 updateParametersFromXmlString (extraParamsXmlString (), paramList_.ptr());
217 const Thyra::LinearOpWithSolveFactoryBase<double> &lowsFactory,
218 const std::string &outputXmlFileName
221 justInTimeInitialize();
222 const std::string xmlOutputFile =
223 ( outputXmlFileName.length() ? outputXmlFileName : paramsUsedXmlOutFileName() );
224 if (xmlOutputFile.length()) {
225 Teuchos::writeParameterListToXmlFile(*paramList_, xmlOutputFile);
233 justInTimeInitialize();
234 return lowsfValidator_->getStringValue(*paramList_, LinearSolverType_name,
242 justInTimeInitialize();
243 return pfValidator_->getStringValue(*paramList_, PreconditionerType_name,
252 RCP<Teuchos::ParameterList>
const& paramList
255 TEUCHOS_TEST_FOR_EXCEPT(is_null(paramList));
257 paramList_ = paramList;
258 enableDelayedSolverConstruction_ = paramList_->get(
259 EnableDelayedSolverConstruction_name, EnableDelayedSolverConstruction_default );
263 RCP<Teuchos::ParameterList>
270 RCP<Teuchos::ParameterList>
273 RCP<Teuchos::ParameterList> _paramList = paramList_;
274 paramList_ = Teuchos::null;
279 RCP<const Teuchos::ParameterList>
286 RCP<const Teuchos::ParameterList>
289 using Teuchos::rcp_implicit_cast;
290 typedef Teuchos::ParameterEntryValidator PEV;
291 if (is_null(validParamList_)) {
292 RCP<Teuchos::ParameterList>
293 validParamList = Teuchos::rcp(
new Teuchos::ParameterList);
295 lowsfValidator_ = Teuchos::rcp(
296 new Teuchos::StringToIntegralParameterEntryValidator<int>(
297 validLowsfNames_,LinearSolverType_name
301 LinearSolverType_name, defaultLOWSF_,
302 (std::string(
"Determines the type of linear solver that will be used.\n")
303 +
"The parameters for each solver type are specified in the sublist \"" 304 + LinearSolverTypes_name +
"\"").c_str(),
305 rcp_implicit_cast<const PEV>(lowsfValidator_)
307 Teuchos::ParameterList &linearSolverTypesSL = validParamList->sublist(
308 LinearSolverTypes_name,
false,
309 "Sublists for each of the linear solver types set using the parameter\n" 310 "\"" + LinearSolverType_name +
"\". Note that the options for each\n" 311 "linear solver type given below will only be used if linear solvers\n" 312 "of that type are created. It is fine to list parameter sublists for\n" 313 "linear solver types that are not used." 315 for(
int i = 0; i < static_cast<int>(lowsfArray_.size()); ++i ) {
317 &lsname = validLowsfNames_[i];
318 const RCP<Thyra::LinearOpWithSolveFactoryBase<double> >
319 lowsf = lowsfArray_[i]->create();
320 linearSolverTypesSL.sublist(lsname).setParameters(*lowsf->getValidParameters()
321 ).disableRecursiveValidation();
324 pfValidator_ = Teuchos::rcp(
325 new Teuchos::StringToIntegralParameterEntryValidator<int>(
326 validPfNames_, PreconditionerType_name ) );
328 PreconditionerType_name, defaultPF_,
329 (std::string(
"Determines the type of preconditioner that will be used.\n")
330 +
"This option is only meaningful for linear solvers that accept preconditioner" 331 +
" factory objects!\n" 332 +
"The parameters for each preconditioner are specified in the sublist \"" 333 + PreconditionerTypes_name +
"\"").c_str(),
334 rcp_implicit_cast<const PEV>(pfValidator_)
336 Teuchos::ParameterList &precTypesSL = validParamList->sublist(
337 PreconditionerTypes_name,
false,
338 "Sublists for each of the preconditioner types set using the parameter\n" 339 "\"" + PreconditionerType_name +
"\". Note that the options for each\n" 340 "preconditioner type given below will only be used if preconditioners\n" 341 "of that type are created. It is fine to list parameter sublists for\n" 342 "preconditioner types that are not used." 344 for(
int i = 0; i < static_cast<int>(pfArray_.size()); ++i ) {
346 &pfname = validPfNames_[i+1];
347 const RCP<Thyra::PreconditionerFactoryBase<double> >
348 pf = pfArray_[i]->create();
349 precTypesSL.sublist(pfname).setParameters(*pf->getValidParameters()
350 ).disableRecursiveValidation();
354 EnableDelayedSolverConstruction_name, EnableDelayedSolverConstruction_default,
355 "When this option is set to true, the linear solver factory will be wrapped\n" 356 "in a delayed evaluation Decorator factory object. This results in a delay\n" 357 "in the creation of a linear solver (and the associated preconditioner) until\n" 358 "the first solve is actually performed. This helps in cases where it is not\n" 359 "known a-priori if a linear solve will be needed on a given linear operator and\n" 360 "therefore can significantly improve performance for some types of algorithms\n" 361 "such as NOX and LOCA." 364 validParamList_ = validParamList;
366 return validParamList_;
373 RCP<Thyra::LinearOpWithSolveFactoryBase<double> >
375 const std::string &linearSolveStrategyName
378 justInTimeInitialize();
381 #ifdef THYRA_DEFAULT_REAL_LINEAR_SOLVER_BUILDER_DUMP 382 std::cout <<
"\nEntering DefaultLinearSolverBuilder" 383 <<
"::createLinearSolveStrategy(...) ...\n";
384 std::cout <<
"\nlinearSolveStrategyName = \"" 385 << linearSolveStrategyName <<
"\"\n";
386 std::cout <<
"\nlinearSolveStrategyName.length() = " 387 << linearSolveStrategyName.length() <<
"\n";
388 std::cout <<
"\ndefaultLOWSF_ = \"" << defaultLOWSF_ <<
"\"\n";
389 std::cout <<
"\nthis->getLinearSolveStrategyName() = \"" 393 lsname = ( linearSolveStrategyName.length()
394 ? linearSolveStrategyName
396 #ifdef THYRA_DEFAULT_REAL_LINEAR_SOLVER_BUILDER_DUMP 397 std::cout <<
"\nlsname = \"" << lsname <<
"\"\n";
402 ls_idx = lowsfValidator_->getIntegralValue(lsname, LinearSolverType_name);
405 RCP<Thyra::LinearOpWithSolveFactoryBase<double> >
406 lowsf = lowsfArray_[ls_idx]->create();
409 if(lowsf->acceptsPreconditionerFactory()) {
411 RCP<Thyra::PreconditionerFactoryBase<double> >
414 lowsf->setPreconditionerFactory(pf,pfName);
419 lowsf->setParameterList(
420 sublist(sublist(paramList_, LinearSolverTypes_name), lsname));
422 if (enableDelayedSolverConstruction_) {
424 new Thyra::DelayedLinearOpWithSolveFactory<double>(lowsf)
433 RCP<Thyra::PreconditionerFactoryBase<double> >
435 const std::string &preconditioningStrategyName
438 justInTimeInitialize();
442 pfname = ( preconditioningStrategyName.length()
443 ? preconditioningStrategyName
445 RCP<Thyra::PreconditionerFactoryBase<double> >
450 pf_idx = pfValidator_->getIntegralValue(pfname, PreconditionerType_name);
452 pf = pfArray_[pf_idx-1]->create();
453 pf->setParameterList(
454 sublist(sublist(paramList_, PreconditionerTypes_name), pfname));
465 void DefaultLinearSolverBuilder::initializeDefaults()
469 using Teuchos::abstractFactoryStd;
472 defaultPF_ = None_name;
473 validLowsfNames_.resize(0);
474 validPfNames_.resize(0);
475 validPfNames_.push_back(None_name);
481 #ifdef HAVE_STRATIMIKOS_BELOS 483 abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
489 #ifdef HAVE_STRATIMIKOS_AMESOS 491 abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
497 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 499 abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
505 #ifdef HAVE_STRATIMIKOS_AMESOS 506 if (Teuchos::GlobalMPISession::getNProc() == 1) {
518 #ifdef HAVE_STRATIMIKOS_ML 520 abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,
526 #ifdef HAVE_STRATIMIKOS_IFPACK 528 abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,
539 void DefaultLinearSolverBuilder::justInTimeInitialize()
const 541 paramList_.assert_not_null();
542 if (is_null(validParamList_)) {
Concrete LinearOpWithSolveFactoryBase adapter subclass that uses Amesos direct solvers.
RCP< Thyra::PreconditionerFactoryBase< double > > createPreconditioningStrategy(const std::string &preconditioningStrategyName) const
void setPreconditioningStrategyFactory(const RCP< const AbstractFactory< Thyra::PreconditionerFactoryBase< double > > > &precStrategyFactory, const std::string &precStrategyName, const bool makeDefault=false)
Set a new preconditioner strategy factory object.
Concrete preconditioner factory subclass based on Ifpack.
RCP< const ParameterList > getValidParameters() const
LinearOpWithSolveFactoryBase subclass implemented in terms of AztecOO.
void setupCLP(Teuchos::CommandLineProcessor *clp)
Setup the command-line processor to read in the needed data to extra the parameters from...
void setDefaultLinearSolveStrategyFactoryName(const std::string &solveStrategyName)
Set the default linear solver factory name.
RCP< Thyra::LinearOpWithSolveFactoryBase< double > > createLinearSolveStrategy(const std::string &linearSolveStrategyName) const
Concrete preconditioner factory subclass based on ML.
void setParameterList(RCP< ParameterList > const ¶mList)
void readParameters(std::ostream *out)
Force the parameters to be read from a file and/or an extra XML string.
std::string getPreconditionerStrategyName() const
Get the name of the preconditioner strategy that will be created on the next call to this->createPrec...
RCP< const ParameterList > getParameterList() const
LinearOpWithSolveFactoryBase subclass implemented in terms of Belos.
RCP< ParameterList > unsetParameterList()
~DefaultLinearSolverBuilder()
RCP< ParameterList > getNonconstParameterList()
void writeParamsFile(const Thyra::LinearOpWithSolveFactoryBase< double > &lowsFactory, const std::string &outputXmlFileName="") const
Write the parameters list for a LinearOpWithSolveFactoryBase object to a file after the parameters ar...
DefaultLinearSolverBuilder(const std::string ¶msXmlFileName="", const std::string &extraParamsXmlString="", const std::string ¶msUsedXmlOutFileName="", const std::string ¶msXmlFileNameOption="linear-solver-params-file", const std::string &extraParamsXmlStringOption="extra-linear-solver-params", const std::string ¶msUsedXmlOutFileNameOption="linear-solver-params-used-file")
Construct with default parameters.
void setLinearSolveStrategyFactory(const RCP< const AbstractFactory< Thyra::LinearOpWithSolveFactoryBase< double > > > &solveStrategyFactory, const std::string &solveStrategyName, const bool makeDefault=false)
Set a new linear solver strategy factory object.
std::string getLinearSolveStrategyName() const
Get the name of the linear solver strategy that will be created on the next call to this->createLinea...
void setDefaultPreconditioningStrategyFactoryName(const std::string &precStrategyName)
Set the default linear solver factory name.