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 #ifdef TEKO_HAVE_EPETRA
63 #include "Teko_DiagonalPreconditionerFactory.hpp"
64 #include "Teko_ProbingPreconditionerFactory.hpp"
66 #include "Teko_IdentityPreconditionerFactory.hpp"
67 #include "NS/Teko_LSCPreconditionerFactory.hpp"
68 #include "NS/Teko_SIMPLEPreconditionerFactory.hpp"
69 #include "NS/Teko_TimingsSIMPLEPreconditionerFactory.hpp"
71 #ifdef Teko_ENABLE_ML_SMOOTHERS
72 #include "Teko_SmootherPreconditionerFactory.hpp"
73 #include "Teko_MLPreconditionerFactory.hpp"
76 #include "Thyra_DefaultPreconditioner.hpp"
78 using namespace Thyra;
85 bool PreconditionerFactory::isCompatible(
const Thyra::LinearOpSourceBase<double> &fwdOpSrc)
const {
86 RCP<const Thyra::LinearOpBase<double> > A = fwdOpSrc.getOp();
87 return A != Teuchos::null;
91 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 )
const {
105 LinearOp A = Teuchos::rcp_const_cast<Thyra::LinearOpBase<double> >(ASrc->getOp());
108 TEUCHOS_ASSERT(blkPrec != 0);
111 RCP<PreconditionerState> state = blkPrec->getStateObject();
112 state->setInitialized(
false);
115 const RCP<const LinearOpBase<double> > M = buildPreconditionerOperator(A, *state);
118 setOpRequestHandler(*
this, M);
121 DefaultPreconditioner<double> &dPrec = Teuchos::dyn_cast<DefaultPreconditioner<double> >(*prec);
122 dPrec.initializeUnspecified(Teuchos::rcp_const_cast<LinearOpBase<double> >(M));
126 void PreconditionerFactory::initializePrec(
127 const RCP<
const LinearOpSourceBase<double> > &ASrc,
128 const RCP<
const Thyra::MultiVectorBase<double> > &solnVec, PreconditionerBase<double> *prec,
129 const ESupportSolveUse supportSolveUse)
const {
130 Preconditioner *blkPrec =
dynamic_cast<Preconditioner *
>(prec);
131 blkPrec->setSourceVector(Teuchos::rcp_const_cast<Thyra::MultiVectorBase<double> >(solnVec));
133 initializePrec(ASrc, prec, supportSolveUse);
137 void PreconditionerFactory::uninitializePrec(
138 PreconditionerBase<double> * ,
139 RCP<
const LinearOpSourceBase<double> > * ,
140 ESupportSolveUse * )
const {
144 TEUCHOS_TEST_FOR_EXCEPT_MSG(
true,
"\"PreconditionerFactory::uninitializePrec not implemented\"");
151 void PreconditionerFactory::setParameterList(
const RCP<Teuchos::ParameterList> ¶mList) {
152 paramList_ = paramList;
156 RCP<Teuchos::ParameterList> PreconditionerFactory::getNonconstParameterList() {
return paramList_; }
159 RCP<Teuchos::ParameterList> PreconditionerFactory::unsetParameterList() {
160 RCP<Teuchos::ParameterList> _paramList = paramList_;
161 paramList_ = Teuchos::null;
166 void PreconditionerFactory::setInverseLibrary(
const RCP<const InverseLibrary> &il) {
167 inverseLibrary_ = il;
171 RCP<const InverseLibrary> PreconditionerFactory::getInverseLibrary()
const {
173 if (inverseLibrary_ == Teuchos::null)
return InverseLibrary::buildFromStratimikos();
175 return inverseLibrary_;
184 const LinearOp &op) {
185 ModifiableLinearOp mlo = Teuchos::rcp_const_cast<Thyra::LinearOpBase<double> >(op);
188 RCP<RequestHandlerContainer> reqHandCont =
190 if (reqHandCont != Teuchos::null) {
198 CloneFactory<PreconditionerFactory> PreconditionerFactory::precFactoryBuilder_;
214 RCP<PreconditionerFactory> PreconditionerFactory::buildPreconditionerFactory(
215 const std::string &name,
const Teuchos::ParameterList &settings,
216 const RCP<const InverseLibrary> &invLib) {
217 Teko_DEBUG_SCOPE(
"PreconditionerFactory::buildPreconditionerFactory", 10);
220 if (precFactoryBuilder_.cloneCount() == 0) initializePrecFactoryBuilder();
223 RCP<PreconditionerFactory> precFact = precFactoryBuilder_.build(name);
225 Teko_DEBUG_MSG_BEGIN(5);
226 DEBUG_STREAM <<
"Looked up \"" << name <<
"\"" << std::endl;
227 DEBUG_STREAM <<
"Built " << precFact << std::endl;
228 Teko_DEBUG_MSG_END();
230 if (precFact == Teuchos::null)
return Teuchos::null;
233 if (invLib != Teuchos::null) {
234 precFact->setInverseLibrary(invLib);
235 precFact->setRequestHandler(invLib->getRequestHandler());
240 precFact->initializeFromParameterList(settings);
258 void PreconditionerFactory::addPreconditionerFactory(
const std::string &name,
259 const RCP<Cloneable> &clone) {
261 if (precFactoryBuilder_.cloneCount() == 0) initializePrecFactoryBuilder();
264 precFactoryBuilder_.addClone(name, clone);
268 void PreconditionerFactory::initializePrecFactoryBuilder() {
269 RCP<Cloneable> clone;
273 precFactoryBuilder_.addClone(
"Block LU2x2", clone);
276 precFactoryBuilder_.addClone(
"Block Jacobi", clone);
279 precFactoryBuilder_.addClone(
"Block Gauss-Seidel", clone);
282 precFactoryBuilder_.addClone(
"Block Add", clone);
285 precFactoryBuilder_.addClone(
"Block Multiply", clone);
288 precFactoryBuilder_.addClone(
"NS LSC", clone);
291 precFactoryBuilder_.addClone(
"NS SIMPLE", clone);
294 precFactoryBuilder_.addClone(
"NS SIMPLE-Timed", clone);
297 precFactoryBuilder_.addClone(
"Iterative Preconditioner", clone);
299 #ifdef TEKO_HAVE_EPETRA
301 precFactoryBuilder_.addClone(
"Explicit Diagonal Preconditioner", clone);
305 precFactoryBuilder_.addClone(
"Diagnostic Inverse", clone);
308 precFactoryBuilder_.addClone(
"Diagonal Scaling", clone);
311 precFactoryBuilder_.addClone(
"Identity", clone);
313 #if defined(Teko_ENABLE_Isorropia) && defined(TEKO_HAVE_EPETRA)
315 precFactoryBuilder_.addClone(
"Probing Preconditioner", clone);
318 #ifdef Teko_ENABLE_ML_SMOOTHERS
320 precFactoryBuilder_.addClone(
"Blocked ML Preconditioner", clone);
324 void PreconditionerFactory::getPreconditionerFactoryNames(std::vector<std::string> &names) {
326 if (precFactoryBuilder_.cloneCount() == 0) initializePrecFactoryBuilder();
327 precFactoryBuilder_.getCloneNames(names);
virtual void setRequestHandler(const Teuchos::RCP< RequestHandler > &rh)=0
Set the request handler with pointers to the appropriate callbacks.
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.