47#include "Teko_LU2x2PreconditionerFactory.hpp"
51#include "Teko_BlockUpperTriInverseOp.hpp"
54#include "Teko_LU2x2DiagonalStrategy.hpp"
55#include "NS/Teko_PCDStrategy.hpp"
63LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp & invA00, LinearOp & invS)
68LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp & hatInvA00,LinearOp & tildeInvA00,LinearOp & invS)
69 : invOpsStrategy_(rcp(new StaticLU2x2Strategy(hatInvA00,tildeInvA00,invS))), useFullLDU_(true)
72LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(
const RCP<LU2x2Strategy> & strategy)
73 : invOpsStrategy_(strategy), useFullLDU_(true)
76LU2x2PreconditionerFactory::LU2x2PreconditionerFactory()
77 : invOpsStrategy_(Teuchos::null), useFullLDU_(true)
84LinearOp LU2x2PreconditionerFactory::buildPreconditionerOperator(BlockedLinearOp & A,BlockPreconditionerState & state)
const
86 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::buildPreconditionerOperator",10);
87 LinearOp hatInvA00 = invOpsStrategy_->getHatInvA00(A,state);
88 LinearOp tildeInvA00 = invOpsStrategy_->getTildeInvA00(A,state);
89 LinearOp invS = invOpsStrategy_->getInvS(A,state);
95 std::vector<LinearOp> invDiag(2);
96 invDiag[0] = hatInvA00;
97 invDiag[1] = scale(-1.0,invS);
98 return createBlockUpperTriInverseOp(A,invDiag,
"LU2x2-Upper");
114void LU2x2PreconditionerFactory::initializeFromParameterList(
const Teuchos::ParameterList & settings)
116 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::initializeFromParameterList",10);
120 if(settings.isParameter(
"Use LDU"))
121 useLDU = settings.get<
bool>(
"Use LDU");
125 std::string stratName = settings.get<std::string>(
"Strategy Name");
126 const Teuchos::ParameterList & pl = settings.sublist(
"Strategy Settings");
127 invOpsStrategy_ = buildStrategy(stratName,pl,getInverseLibrary(),getRequestHandler());
144Teuchos::RCP<Teuchos::ParameterList> LU2x2PreconditionerFactory::getRequestedParameters()
const
146 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::getRequestedParameters",0);
147 return invOpsStrategy_->getRequestedParameters();
163bool LU2x2PreconditionerFactory::updateRequestedParameters(
const Teuchos::ParameterList & pl)
165 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::updateRequestedParameters",0);
166 return invOpsStrategy_->updateRequestedParameters(pl);
174CloneFactory<LU2x2Strategy> LU2x2PreconditionerFactory::strategyBuilder_;
188RCP<LU2x2Strategy> LU2x2PreconditionerFactory::buildStrategy(
const std::string & name,
189 const Teuchos::ParameterList & settings,
190 const RCP<const InverseLibrary> & invLib,
191 const RCP<RequestHandler> & rh)
193 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::buildStrategy",0);
196 if(strategyBuilder_.cloneCount()==0) initializeStrategyBuilder();
198 Teko_DEBUG_MSG_BEGIN(1)
199 std::vector<std::
string> names;
200 strategyBuilder_.getCloneNames(names);
201 DEBUG_STREAM <<
"Strategy names = ";
202 for(std::
size_t i=0;i<names.size();i++)
203 DEBUG_STREAM << names[i] <<
", ";
204 DEBUG_STREAM << std::endl;
208 RCP<LU2x2Strategy> strategy = strategyBuilder_.build(name);
210 if(strategy==Teuchos::null) {
211 Teko_DEBUG_MSG(
"Warning: Could not build LU2x2Strategy named \""
212 << name <<
"\"...pressing on, failure expected",0)
213 return Teuchos::null;
218 strategy->setRequestHandler(rh);
219 strategy->initializeFromParameterList(settings,*invLib);
237void LU2x2PreconditionerFactory::addStrategy(const std::
string & name,const RCP<Cloneable> & clone)
239 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::addStrategy",10);
242 if(strategyBuilder_.cloneCount()==0) initializeStrategyBuilder();
245 strategyBuilder_.addClone(name,clone);
249void LU2x2PreconditionerFactory::initializeStrategyBuilder()
251 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::initializeStrategyBuilder",10);
253 RCP<Cloneable> clone;
256 clone = rcp(
new AutoClone<LU2x2DiagonalStrategy>());
257 strategyBuilder_.addClone(
"Diagonal Strategy",clone);
260 clone = rcp(
new AutoClone<NS::PCDStrategy>());
261 strategyBuilder_.addClone(
"NS PCD Strategy",clone);
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &invA00, LinearOp &invS)
Constructor method for building LU2x2InverseOp.
A simple strategy for use with LU2x2PreconditionerFactory, that offers static objects for inv(F) and ...