44 #include "Stratimikos_InternalConfig.h" 
   46 #include "Thyra_DelayedLinearOpWithSolveFactory.hpp" 
   52 #ifdef HAVE_STRATIMIKOS_AMESOS 
   55 #ifdef HAVE_STRATIMIKOS_AMESOS2 
   56 #  include "Thyra_Amesos2LinearOpWithSolveFactory.hpp" 
   58 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 
   61 #ifdef HAVE_STRATIMIKOS_BELOS 
   62 #  include "Thyra_BelosLinearOpWithSolveFactory.hpp" 
   64 #ifdef HAVE_STRATIMIKOS_IFPACK 
   67 #ifdef HAVE_STRATIMIKOS_ML 
   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)
 
  126   &solveStrategyFactory,
 
  127   const std::string &solveStrategyName,
 
  128   const bool makeDefault
 
  141   const std::string &solveStrategyName)
 
  149   &precStrategyFactory,
 
  150   const std::string &precStrategyName,
 
  151   const bool makeDefault
 
  155   pfArray_.push_back(precStrategyFactory);
 
  164   const std::string &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;
 
  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());
 
  220   const Thyra::LinearOpWithSolveFactoryBase<double> &,
 
  221   const std::string &outputXmlFileName
 
  225   const std::string xmlOutputFile =
 
  226     ( outputXmlFileName.length() ? outputXmlFileName : paramsUsedXmlOutFileName() );
 
  227   if (xmlOutputFile.length()) {
 
  228     Teuchos::writeParameterListToXmlFile(*
paramList_, xmlOutputFile);
 
  262     EnableDelayedSolverConstruction_name, EnableDelayedSolverConstruction_default );
 
  292   using Teuchos::rcp_implicit_cast;
 
  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(),
 
  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 ) {
 
  323       linearSolverTypesSL.
sublist(lsname).setParameters(*lowsf->getValidParameters()
 
  324         ).disableRecursiveValidation();
 
  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(),
 
  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 ) {
 
  352       precTypesSL.
sublist(pfname).setParameters(*pf->getValidParameters()
 
  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." 
  378   const std::string &linearSolveStrategyName
 
  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";
 
  412   if(lowsf->acceptsPreconditionerFactory()) {
 
  417       lowsf->setPreconditionerFactory(pf,pfName);
 
  422   lowsf->setParameterList(
 
  423     sublist(sublist(
paramList_, LinearSolverTypes_name), lsname));
 
  427       new Thyra::DelayedLinearOpWithSolveFactory<double>(lowsf)
 
  438   const std::string &preconditioningStrategyName
 
  445     pfname = ( preconditioningStrategyName.length()
 
  446              ? preconditioningStrategyName
 
  456     pf->setParameterList(
 
  457       sublist(sublist(
paramList_, PreconditionerTypes_name), pfname));
 
  472   using Teuchos::abstractFactoryStd;
 
  484 #ifdef HAVE_STRATIMIKOS_AMESOS2 
  486     abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
 
  492 #ifdef HAVE_STRATIMIKOS_BELOS 
  494     abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
 
  500 #ifdef HAVE_STRATIMIKOS_AMESOS 
  502     abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
 
  508 #if defined(HAVE_STRATIMIKOS_EPETRAEXT) && defined(HAVE_STRATIMIKOS_AZTECOO) 
  510     abstractFactoryStd<Thyra::LinearOpWithSolveFactoryBase<double>,
 
  519 #ifdef HAVE_STRATIMIKOS_AMESOS 
  529 #ifdef HAVE_STRATIMIKOS_ML 
  531     abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,
 
  537 #ifdef HAVE_STRATIMIKOS_IFPACK 
  539     abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,
 
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...
 
Array< pf_fcty_t > pfArray_
 
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. 
 
Array< std::string > validLowsfNames_
 
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. 
 
Array< std::string > validPfNames_
 
Array< lowsf_fcty_t > lowsfArray_
 
RCP< ParameterList > sublist(const RCP< ParameterList > ¶mList, const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
 
Concrete preconditioner factory subclass based on ML. 
 
std::string defaultLOWSF_
 
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. 
 
RCP< ParameterList > paramList_
 
void initializeDefaults()
 
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)
 
std::string getStringValue(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const 
 
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 justInTimeInitialize() const 
 
void resize(size_type new_size, const value_type &x=value_type())
 
bool enableDelayedSolverConstruction_
 
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 
 
RCP< const Teuchos::StringToIntegralParameterEntryValidator< int > > lowsfValidator_
 
IntegralType getIntegralValue(const std::string &str, const std::string ¶mName="", const std::string &sublistName="") const 
 
RCP< ParameterList > unsetParameterList()
 
bool nonnull(const boost::shared_ptr< T > &p)
 
~DefaultLinearSolverBuilder()
 
RCP< ParameterList > getNonconstParameterList()
 
RCP< const ParameterList > validParamList_
 
void push_back(const value_type &x)
 
RCP< const Teuchos::StringToIntegralParameterEntryValidator< int > > pfValidator_
 
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