42 #include "Thyra_IfpackPreconditionerFactory.hpp" 
   43 #include "Thyra_EpetraOperatorViewExtractorStd.hpp" 
   44 #include "Thyra_EpetraLinearOp.hpp" 
   45 #include "Thyra_DefaultPreconditioner.hpp" 
   46 #include "Ifpack_ValidParameters.h" 
   47 #include "Ifpack_Preconditioner.h" 
   49 #include "Epetra_RowMatrix.h" 
   50 #include "Teuchos_TimeMonitor.hpp" 
   51 #include "Teuchos_dyn_cast.hpp" 
   52 #include "Teuchos_implicit_cast.hpp" 
   53 #include "Teuchos_StandardParameterEntryValidators.hpp" 
   54 #include "Teuchos_VerboseObjectParameterListHelpers.hpp" 
   55 #include "Teuchos_ValidatorXMLConverterDB.hpp" 
   56 #include "Teuchos_StaticSetupMacro.hpp" 
   63 const std::string Ifpack_name = 
"Ifpack";
 
   65 const std::string IfpackSettings_name = 
"Ifpack Settings";
 
   67 const std::string PrecType_name = 
"Prec Type";
 
   73 const std::string Overlap_name = 
"Overlap";
 
   74 const int Overlap_default = 0;
 
   77 TEUCHOS_STATIC_SETUP()
 
   91   ,precType_(PrecType_default)
 
   92   ,overlap_(Overlap_default)
 
  104   using Teuchos::outArg;
 
  109   double epetraFwdOpScalar;
 
  110   epetraFwdOpViewExtractor_->getEpetraOpView(
 
  112     outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
 
  113     outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
 
  114     outArg(epetraFwdOpScalar)
 
  116   if( !dynamic_cast<const Epetra_RowMatrix*>(&*epetraFwdOp) )
 
  143   using Teuchos::outArg;
 
  149   using Teuchos::rcp_dynamic_cast;
 
  150   using Teuchos::rcp_const_cast;
 
  151   using Teuchos::set_extra_data;
 
  152   using Teuchos::get_optional_extra_data;
 
  155   totalTimer.start(
true);
 
  156 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR 
  163     *out << 
"\nEntering Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
 
  169     fwdOp = fwdOpSrc->getOp();
 
  171   TEUCHOS_TEST_FOR_EXCEPT(fwdOp.
get()==NULL);
 
  180   double epetraFwdOpScalar;
 
  181   epetraFwdOpViewExtractor_->getEpetraOpView(
 
  183     outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
 
  184     outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
 
  185     outArg(epetraFwdOpScalar)
 
  189     epetraFwdRowMat = rcp_dynamic_cast<
const Epetra_RowMatrix>(epetraFwdOp,
true);
 
  192     ,
"Error, incorrect apply mode for an Epetra_RowMatrix" 
  209   if(epetra_precOp.
get())
 
  210     ifpack_precOp = rcp_dynamic_cast<Ifpack_Preconditioner>(epetra_precOp->epetra_op(),
true);
 
  214   if(ifpack_precOp.get()) {
 
  222   const bool startingOver = 
true;
 
  230       *out << 
"\nCreating the initial Ifpack_Preconditioner object of type \'"<<
Ifpack::toString(precType_)<<
"\' ...\n";
 
  232 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR 
  239         ,const_cast<Epetra_RowMatrix*>(&*epetraFwdRowMat)
 
  247     if(paramList_.
get()) {
 
  249         &ifpackSettingsPL = paramList_->
sublist(IfpackSettings_name);
 
  251       TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->SetParameters(ifpackSettingsPL));
 
  256     TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Initialize());
 
  261   set_extra_data(epetraFwdOp, 
"IFPF::epetraFwdOp", Teuchos::inOutArg(ifpack_precOp),
 
  262     Teuchos::POST_DESTROY, 
false);
 
  268       *out << 
"\nComputing the preconditioner ...\n";
 
  269 #ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR 
  273     TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Compute());
 
  287   set_extra_data(fwdOpSrc, 
"IFPF::fwdOpSrc", Teuchos::inOutArg(ifpack_precOp),
 
  288     Teuchos::POST_DESTROY, 
false);
 
  295   epetra_precOp->initialize(
 
  302     *out << 
"\nDescription of created preconditioner:\n";
 
  304     ifpack_precOp->Print(*out);
 
  315     *out << 
"\nTotal time in IfpackPreconditionerFactory = "<<totalTimer.totalElapsedTime()<<
" sec\n";
 
  317     *out << 
"\nLeaving Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
 
  337   paramList_ = paramList;
 
  338   overlap_ = paramList_->
get(Overlap_name,Overlap_default);
 
  339   std::ostringstream oss;
 
  340   oss << 
"(sub)list \""<<paramList->
name()<<
"\"parameter \"Prec Type\"";
 
  343       ? precTypeValidator->
getIntegralValue(*paramList_,PrecType_name,PrecTypeName_default)
 
  346   Teuchos::readVerboseObjectSublist(&*paramList_,
this);
 
  363   paramList_ = Teuchos::null;
 
  377   using Teuchos::rcp_implicit_cast;
 
  380   if(validParamList.
get()==NULL) {
 
  387         precTypeNames.
begin(),
 
  394         precTypeValues.
begin(),
 
  398       precTypeValidator = 
rcp(
 
  400           precTypeNames,precTypeValues,PrecType_name
 
  405       PrecType_name, PrecTypeName_default,
 
  406       "Type of Ifpack preconditioner to use.",
 
  407       rcp_implicit_cast<const PEV>(precTypeValidator)
 
  410       Overlap_name, Overlap_default,
 
  411       "Number of rows/columns overlapped between subdomains in different" 
  412       "\nprocesses in the additive Schwarz-type domain-decomposition preconditioners." 
  415       IfpackSettings_name, 
false,
 
  416       "Preconditioner settings that are passed onto the Ifpack preconditioners themselves." 
  423     Teuchos::setupVerboseObjectSublist(&*validParamList);
 
  425   return validParamList;
 
  432   std::ostringstream oss;
 
  433   oss << 
"Thyra::IfpackPreconditionerFactory{";
 
  435   oss << 
",overlap=" << overlap_;
 
  442 void IfpackPreconditionerFactory::initializeTimers()
 
  444   if(!overallTimer.get()) {
 
  445 #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)
 
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)
 
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)
 
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 
 
ParameterList & setParameters(const ParameterList &source)
 
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()