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 #ifdef HAVE_STRATIMIKOS_AMESOS2 
   56 #  include "Thyra_Amesos2LinearOpWithSolveFactory.hpp" 
   58 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 
   59 #  include "Thyra_AztecOOLinearOpWithSolveFactory.hpp" 
   61 #ifdef HAVE_STRATIMIKOS_BELOS 
   62 #  include "Thyra_BelosLinearOpWithSolveFactory.hpp" 
   64 #ifdef HAVE_STRATIMIKOS_IFPACK 
   65 #  include "Thyra_IfpackPreconditionerFactory.hpp" 
   67 #ifdef HAVE_STRATIMIKOS_ML 
   68 #  include "Thyra_MLPreconditionerFactory.hpp" 
   75 const std::string LinearSolverType_name    = 
"Linear Solver Type";
 
   76 const std::string LinearSolverTypes_name   = 
"Linear Solver Types";
 
   77 const std::string PreconditionerType_name    = 
"Preconditioner Type";
 
   78 const std::string PreconditionerTypes_name   = 
"Preconditioner Types";
 
   79 const std::string None_name = 
"None";
 
   80 const std::string EnableDelayedSolverConstruction_name = 
"Enable Delayed Solver Construction";
 
   81 const bool EnableDelayedSolverConstruction_default = 
false;
 
   87 namespace Stratimikos {
 
   94   const std::string    ¶msXmlFileName_in
 
   95   ,
const std::string   &extraParamsXmlString_in
 
   96   ,
const std::string   ¶msUsedXmlOutFileName_in
 
   97   ,
const std::string   ¶msXmlFileNameOption_in
 
   98   ,
const std::string   &extraParamsXmlStringOption_in
 
   99   ,
const std::string   ¶msUsedXmlOutFileNameOption_in
 
  101   :paramsXmlFileName_(paramsXmlFileName_in)
 
  102   ,extraParamsXmlString_(extraParamsXmlString_in)
 
  103   ,paramsUsedXmlOutFileName_(paramsUsedXmlOutFileName_in)
 
  104   ,paramsXmlFileNameOption_(paramsXmlFileNameOption_in)
 
  105   ,extraParamsXmlStringOption_(extraParamsXmlStringOption_in)
 
  106   ,paramsUsedXmlOutFileNameOption_(paramsUsedXmlOutFileNameOption_in)
 
  107   ,enableDelayedSolverConstruction_(EnableDelayedSolverConstruction_default)
 
  109   this->initializeDefaults();
 
  126   &solveStrategyFactory,
 
  127   const std::string &solveStrategyName,
 
  128   const bool makeDefault
 
  131   validLowsfNames_.
push_back(solveStrategyName);
 
  132   lowsfArray_.push_back(solveStrategyFactory);
 
  133   validParamList_ = Teuchos::null;
 
  141   const std::string &solveStrategyName)
 
  143   defaultLOWSF_ = solveStrategyName;
 
  149   &precStrategyFactory,
 
  150   const std::string &precStrategyName,
 
  151   const bool makeDefault
 
  154   validPfNames_.
push_back(precStrategyName);
 
  155   pfArray_.push_back(precStrategyFactory);
 
  156   validParamList_ = Teuchos::null;
 
  164   const std::string &precStrategyName)
 
  166   defaultPF_ = precStrategyName;
 
  174     paramsXmlFileNameOption().c_str(),¶msXmlFileName_
 
  175     ,
"Name of an XML file containing parameters for linear solver " 
  176     "options to be appended first." 
  179     extraParamsXmlStringOption().c_str(),&extraParamsXmlString_
 
  180     ,
"An XML string containing linear solver parameters to be appended second." 
  183     paramsUsedXmlOutFileNameOption().c_str(),¶msUsedXmlOutFileName_
 
  184     ,
"Name of an XML file that can be written with the parameter list after it " 
  185     "has been used on completion of this program." 
  192   using Teuchos::parameterList;
 
  194   using Teuchos::updateParametersFromXmlFile;
 
  195   using Teuchos::updateParametersFromXmlString;
 
  198   if (!paramList_.get()) {
 
  199     paramList_ = parameterList(
"DefaultLinearSolverBuilder");
 
  201   if (paramsXmlFileName().length()) {
 
  203       *out << endl << 
"Reading parameters from XML file \""  
  204            << paramsXmlFileName() << 
"\" ..." << endl;
 
  206     updateParametersFromXmlFile (paramsXmlFileName (), paramList_.ptr());
 
  208   if (extraParamsXmlString().length()) {
 
  210       *out << endl << 
"Appending extra parameters from the XML string \"" 
  211            << extraParamsXmlString() << 
"\" ..." << endl;
 
  213     updateParametersFromXmlString (extraParamsXmlString (), paramList_.ptr());
 
  221   const std::string &outputXmlFileName
 
  224   justInTimeInitialize();
 
  225   const std::string xmlOutputFile =
 
  226     ( outputXmlFileName.length() ? outputXmlFileName : paramsUsedXmlOutFileName() );
 
  227   if (xmlOutputFile.length()) {
 
  228     Teuchos::writeParameterListToXmlFile(*paramList_, xmlOutputFile);
 
  236   justInTimeInitialize();
 
  237   return lowsfValidator_->getStringValue(*paramList_, LinearSolverType_name,
 
  245   justInTimeInitialize();
 
  246   return pfValidator_->getStringValue(*paramList_, PreconditionerType_name,
 
  260   paramList_ = paramList;
 
  261   enableDelayedSolverConstruction_ = paramList_->get(
 
  262     EnableDelayedSolverConstruction_name, EnableDelayedSolverConstruction_default );
 
  277   paramList_ = Teuchos::null;
 
  292   using Teuchos::rcp_implicit_cast;
 
  294   if (
is_null(validParamList_)) {
 
  300         validLowsfNames_,LinearSolverType_name
 
  304       LinearSolverType_name, defaultLOWSF_,
 
  305       (std::string(
"Determines the type of linear solver that will be used.\n")
 
  306         + 
"The parameters for each solver type are specified in the sublist \"" 
  307         + LinearSolverTypes_name + 
"\"").c_str(),
 
  308       rcp_implicit_cast<const PEV>(lowsfValidator_)
 
  311       LinearSolverTypes_name,
false,
 
  312       "Sublists for each of the linear solver types set using the parameter\n" 
  313       "\"" + LinearSolverType_name + 
"\".  Note that the options for each\n" 
  314       "linear solver type given below will only be used if linear solvers\n" 
  315       "of that type are created.  It is fine to list parameter sublists for\n" 
  316       "linear solver types that are not used." 
  318     for( 
int i = 0; i < static_cast<int>(lowsfArray_.size()); ++i ) {
 
  320         &lsname = validLowsfNames_[i];
 
  322         lowsf = lowsfArray_[i]->create();
 
  324         ).disableRecursiveValidation();
 
  329         validPfNames_, PreconditionerType_name ) );
 
  331       PreconditionerType_name, defaultPF_,
 
  332       (std::string(
"Determines the type of preconditioner that will be used.\n")
 
  333         + 
"This option is only meaningful for linear solvers that accept preconditioner" 
  334         + 
" factory objects!\n" 
  335         + 
"The parameters for each preconditioner are specified in the sublist \"" 
  336         + PreconditionerTypes_name + 
"\"").c_str(),
 
  337       rcp_implicit_cast<const PEV>(pfValidator_)
 
  340         PreconditionerTypes_name,
false,
 
  341         "Sublists for each of the preconditioner types set using the parameter\n" 
  342         "\"" + PreconditionerType_name + 
"\".  Note that the options for each\n" 
  343         "preconditioner type given below will only be used if preconditioners\n" 
  344         "of that type are created.  It is fine to list parameter sublists for\n" 
  345         "preconditioner types that are not used." 
  347     for( 
int i = 0; i < static_cast<int>(pfArray_.size()); ++i ) {
 
  349         &pfname = validPfNames_[i+1]; 
 
  351         pf = pfArray_[i]->create();
 
  353         ).disableRecursiveValidation();
 
  357       EnableDelayedSolverConstruction_name, EnableDelayedSolverConstruction_default,
 
  358       "When this option is set to true, the linear solver factory will be wrapped\n" 
  359       "in a delayed evaluation Decorator factory object.  This results in a delay\n" 
  360       "in the creation of a linear solver (and the associated preconditioner) until\n" 
  361       "the first solve is actually performed.  This helps in cases where it is not\n" 
  362       "known a-priori if a linear solve will be needed on a given linear operator and\n" 
  363       "therefore can significantly improve performance for some types of algorithms\n" 
  364       "such as NOX and LOCA." 
  367     validParamList_ = validParamList;
 
  369   return validParamList_;
 
  378   const std::string &linearSolveStrategyName
 
  381   justInTimeInitialize();
 
  384 #ifdef THYRA_DEFAULT_REAL_LINEAR_SOLVER_BUILDER_DUMP 
  385   std::cout << 
"\nEntering DefaultLinearSolverBuilder" 
  386             << 
"::createLinearSolveStrategy(...) ...\n";
 
  387   std::cout << 
"\nlinearSolveStrategyName = \"" 
  388             << linearSolveStrategyName << 
"\"\n";
 
  389   std::cout << 
"\nlinearSolveStrategyName.length() = " 
  390             << linearSolveStrategyName.length() << 
"\n";
 
  391   std::cout << 
"\ndefaultLOWSF_ = \"" << defaultLOWSF_ << 
"\"\n";
 
  392   std::cout << 
"\nthis->getLinearSolveStrategyName() = \"" 
  396     lsname = ( linearSolveStrategyName.length()
 
  397              ? linearSolveStrategyName
 
  399 #ifdef THYRA_DEFAULT_REAL_LINEAR_SOLVER_BUILDER_DUMP 
  400   std::cout << 
"\nlsname = \"" << lsname << 
"\"\n";
 
  405     ls_idx = lowsfValidator_->getIntegralValue(lsname, LinearSolverType_name);
 
  409     lowsf = lowsfArray_[ls_idx]->create();
 
  412   if(lowsf->acceptsPreconditionerFactory()) {
 
  417       lowsf->setPreconditionerFactory(pf,pfName);
 
  422   lowsf->setParameterList(
 
  423     sublist(sublist(paramList_, LinearSolverTypes_name), lsname));
 
  425   if (enableDelayedSolverConstruction_) {
 
  438   const std::string &preconditioningStrategyName
 
  441   justInTimeInitialize();
 
  445     pfname = ( preconditioningStrategyName.length()
 
  446              ? preconditioningStrategyName
 
  453     pf_idx = pfValidator_->getIntegralValue(pfname, PreconditionerType_name);
 
  455     pf = pfArray_[pf_idx-1]->create(); 
 
  456     pf->setParameterList(
 
  457       sublist(sublist(paramList_, PreconditionerTypes_name), pfname));
 
  468 void DefaultLinearSolverBuilder::initializeDefaults()
 
  472   using Teuchos::abstractFactoryStd;
 
  475   defaultPF_ = None_name;
 
  476   validLowsfNames_.
resize(0);
 
  484 #ifdef HAVE_STRATIMIKOS_AMESOS2 
  487     Thyra::Amesos2LinearOpWithSolveFactory<double>>(),
 
  492 #ifdef HAVE_STRATIMIKOS_BELOS 
  500 #ifdef HAVE_STRATIMIKOS_AMESOS 
  508 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 
  519 #ifdef HAVE_STRATIMIKOS_AMESOS 
  529 #ifdef HAVE_STRATIMIKOS_ML 
  537 #ifdef HAVE_STRATIMIKOS_IFPACK 
  550 void DefaultLinearSolverBuilder::justInTimeInitialize()
 const 
  552   paramList_.assert_not_null();
 
  553   if (
is_null(validParamList_)) {
 
Concrete LinearOpWithSolveFactoryBase adapter subclass that uses Amesos direct solvers. 
 
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 > getValidParameters() 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. 
 
LinearOpWithSolveFactoryBase subclass implemented in terms of AztecOO. 
 
bool is_null(const boost::shared_ptr< T > &p)
 
RCP< const ParameterList > getParameterList() const 
 
void setupCLP(Teuchos::CommandLineProcessor *clp)
Setup the command-line processor to read in the needed data to extra the parameters from...
 
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
 
void setDefaultLinearSolveStrategyFactoryName(const std::string &solveStrategyName)
Set the default linear solver factory name. 
 
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. 
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
RCP< Thyra::LinearOpWithSolveFactoryBase< double > > createLinearSolveStrategy(const std::string &linearSolveStrategyName) const 
 
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
 
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...
 
std::string getLinearSolveStrategyName() const 
Get the name of the linear solver strategy that will be created on the next call to this->createLinea...
 
void resize(size_type new_size, const value_type &x=value_type())
 
LinearOpWithSolveFactoryBase subclass implemented in terms of Belos. 
 
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const 
 
ParameterList & setParameters(const ParameterList &source)
 
RCP< ParameterList > unsetParameterList()
 
bool nonnull(const boost::shared_ptr< T > &p)
 
~DefaultLinearSolverBuilder()
 
RCP< ParameterList > getNonconstParameterList()
 
void push_back(const value_type &x)
 
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
 
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. 
 
void setDefaultPreconditioningStrategyFactoryName(const std::string &precStrategyName)
Set the default linear solver factory name. 
 
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
 
RCP< Thyra::PreconditionerFactoryBase< double > > createPreconditioningStrategy(const std::string &preconditioningStrategyName) const