47 #include "Teko_Config.h" 48 #include "Teko_PreconditionerFactory.hpp" 50 #include "Teko_InverseLibrary.hpp" 51 #include "Teko_Preconditioner.hpp" 54 #include "Teko_JacobiPreconditionerFactory.hpp" 55 #include "Teko_GaussSeidelPreconditionerFactory.hpp" 56 #include "Teko_AddPreconditionerFactory.hpp" 57 #include "Teko_MultPreconditionerFactory.hpp" 58 #include "Teko_LU2x2PreconditionerFactory.hpp" 59 #include "Teko_IterativePreconditionerFactory.hpp" 60 #include "Teko_DiagnosticPreconditionerFactory.hpp" 61 #include "Teko_DiagonallyScaledPreconditionerFactory.hpp" 62 #include "Teko_DiagonalPreconditionerFactory.hpp" 63 #include "Teko_ProbingPreconditionerFactory.hpp" 64 #include "Teko_IdentityPreconditionerFactory.hpp" 65 #include "NS/Teko_LSCPreconditionerFactory.hpp" 66 #include "NS/Teko_SIMPLEPreconditionerFactory.hpp" 68 #ifdef Teko_ENABLE_ML_SMOOTHERS 69 #include "Teko_SmootherPreconditionerFactory.hpp" 70 #include "Teko_MLPreconditionerFactory.hpp" 74 #include "Thyra_DefaultPreconditioner.hpp" 76 using namespace Thyra;
83 bool PreconditionerFactory::isCompatible(
const Thyra::LinearOpSourceBase<double> &fwdOpSrc)
const 85 RCP<const Thyra::LinearOpBase<double> > A = fwdOpSrc.getOp();
86 return A!=Teuchos::null;
90 RCP<Thyra::PreconditionerBase<double> > PreconditionerFactory::createPrec()
const 94 bp->setStateObject(buildPreconditionerState());
95 bp->getStateObject()->setInitialized(
false);
101 void PreconditionerFactory::initializePrec(
const RCP<
const LinearOpSourceBase<double> > & ASrc,
102 PreconditionerBase<double> * prec,
103 const ESupportSolveUse supportSolveUse)
const 106 LinearOp A = Teuchos::rcp_const_cast<Thyra::LinearOpBase<double> >(ASrc->getOp());
109 TEUCHOS_ASSERT(blkPrec!=0);
112 RCP<PreconditionerState> state = blkPrec->getStateObject();
113 state->setInitialized(
false);
116 const RCP<const LinearOpBase<double> > M = buildPreconditionerOperator(A,*state);
119 setOpRequestHandler(*
this,M);
122 DefaultPreconditioner<double> & dPrec = Teuchos::dyn_cast<DefaultPreconditioner<double> >(*prec);
123 dPrec.initializeUnspecified(Teuchos::rcp_const_cast<LinearOpBase<double> >(M));
127 void PreconditionerFactory::initializePrec(
const RCP<
const LinearOpSourceBase<double> > & ASrc,
128 const RCP<
const Thyra::MultiVectorBase<double> > & solnVec,
129 PreconditionerBase<double> * prec,
130 const ESupportSolveUse supportSolveUse)
const 133 blkPrec->
setSourceVector(Teuchos::rcp_const_cast<Thyra::MultiVectorBase<double> >(solnVec));
135 initializePrec(ASrc,prec,supportSolveUse);
139 void PreconditionerFactory::uninitializePrec(PreconditionerBase<double> * prec,
140 RCP<
const LinearOpSourceBase<double> > * fwdOpSrc,
141 ESupportSolveUse *supportSolveUse)
const 146 TEUCHOS_TEST_FOR_EXCEPT_MSG(
true,
"\"PreconditionerFactory::uninitializePrec not implemented\"");
153 void PreconditionerFactory::setParameterList(
const RCP<Teuchos::ParameterList> & paramList)
155 paramList_ = paramList;
159 RCP< Teuchos::ParameterList > PreconditionerFactory::getNonconstParameterList()
165 RCP< Teuchos::ParameterList > PreconditionerFactory::unsetParameterList()
167 RCP<Teuchos::ParameterList> _paramList = paramList_;
168 paramList_ = Teuchos::null;
173 void PreconditionerFactory::setInverseLibrary(
const RCP<const InverseLibrary> & il)
175 inverseLibrary_ = il;
179 RCP<const InverseLibrary> PreconditionerFactory::getInverseLibrary()
const 182 if(inverseLibrary_==Teuchos::null)
183 return InverseLibrary::buildFromStratimikos();
185 return inverseLibrary_;
195 ModifiableLinearOp mlo = Teuchos::rcp_const_cast<Thyra::LinearOpBase<double> >(op);
199 if(reqHandCont!=Teuchos::null) {
225 RCP<PreconditionerFactory>
226 PreconditionerFactory::buildPreconditionerFactory(
const std::string & name,
227 const Teuchos::ParameterList & settings,
228 const RCP<const InverseLibrary> & invLib)
230 Teko_DEBUG_SCOPE(
"PreconditionerFactory::buildPreconditionerFactory",10);
233 if(precFactoryBuilder_.cloneCount()==0) initializePrecFactoryBuilder();
236 RCP<PreconditionerFactory> precFact = precFactoryBuilder_.build(name);
238 Teko_DEBUG_MSG_BEGIN(5);
239 DEBUG_STREAM <<
"Looked up \"" << name <<
"\"" << std::endl;
240 DEBUG_STREAM <<
"Built " << precFact << std::endl;
241 Teko_DEBUG_MSG_END();
243 if(precFact==Teuchos::null)
244 return Teuchos::null;
247 if(invLib!=Teuchos::null) {
248 precFact->setInverseLibrary(invLib);
249 precFact->setRequestHandler(invLib->getRequestHandler());
254 precFact->initializeFromParameterList(settings);
272 void PreconditionerFactory::addPreconditionerFactory(
const std::string & name,
const RCP<Cloneable> & clone)
275 if(precFactoryBuilder_.cloneCount()==0) initializePrecFactoryBuilder();
278 precFactoryBuilder_.addClone(name,clone);
282 void PreconditionerFactory::initializePrecFactoryBuilder()
284 RCP<Cloneable> clone;
288 precFactoryBuilder_.addClone(
"Block LU2x2",clone);
291 precFactoryBuilder_.addClone(
"Block Jacobi",clone);
294 precFactoryBuilder_.addClone(
"Block Gauss-Seidel",clone);
297 precFactoryBuilder_.addClone(
"Block Add",clone);
300 precFactoryBuilder_.addClone(
"Block Multiply",clone);
303 precFactoryBuilder_.addClone(
"NS LSC",clone);
306 precFactoryBuilder_.addClone(
"NS SIMPLE",clone);
309 precFactoryBuilder_.addClone(
"Iterative Preconditioner",clone);
312 precFactoryBuilder_.addClone(
"Explicit Diagonal Preconditioner",clone);
315 precFactoryBuilder_.addClone(
"Diagnostic Inverse",clone);
318 precFactoryBuilder_.addClone(
"Diagonal Scaling",clone);
321 precFactoryBuilder_.addClone(
"Identity",clone);
323 #ifdef Teko_ENABLE_Isorropia 325 precFactoryBuilder_.addClone(
"Probing Preconditioner",clone);
328 #ifdef Teko_ENABLE_ML_SMOOTHERS 330 precFactoryBuilder_.addClone(
"Blocked ML Preconditioner",clone);
334 void PreconditionerFactory::getPreconditionerFactoryNames(std::vector<std::string> & names)
337 if(precFactoryBuilder_.cloneCount()==0) initializePrecFactoryBuilder();
338 precFactoryBuilder_.getCloneNames(names);
virtual void setRequestHandler(const Teuchos::RCP< RequestHandler > &rh)=0
Set the request handler with pointers to the appropriate callbacks.
virtual void setSourceVector(const RCP< Thyra::MultiVectorBase< double > > &srcVec)
An extension of the Thyra::DefaultPreconditioner class with some specializations useful for use withi...
virtual Teuchos::RCP< RequestHandler > getRequestHandler() const =0
Get the request handler with pointers to the appropriate callbacks.