10#include "Teko_LU2x2PreconditionerFactory.hpp"
14#include "Teko_BlockUpperTriInverseOp.hpp"
17#include "Teko_LU2x2DiagonalStrategy.hpp"
18#include "NS/Teko_PCDStrategy.hpp"
26LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp& invA00, LinearOp& invS)
30LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp& hatInvA00, LinearOp& tildeInvA00,
32 : invOpsStrategy_(rcp(new StaticLU2x2Strategy(hatInvA00, tildeInvA00, invS))),
35LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(
const RCP<LU2x2Strategy>& strategy)
36 : invOpsStrategy_(strategy), useFullLDU_(true) {}
38LU2x2PreconditionerFactory::LU2x2PreconditionerFactory()
39 : invOpsStrategy_(Teuchos::null), useFullLDU_(true) {}
45LinearOp LU2x2PreconditionerFactory::buildPreconditionerOperator(
46 BlockedLinearOp& A, BlockPreconditionerState& state)
const {
47 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::buildPreconditionerOperator", 10);
48 LinearOp hatInvA00 = invOpsStrategy_->getHatInvA00(A, state);
49 LinearOp tildeInvA00 = invOpsStrategy_->getTildeInvA00(A, state);
50 LinearOp invS = invOpsStrategy_->getInvS(A, state);
56 std::vector<LinearOp> invDiag(2);
57 invDiag[0] = hatInvA00;
58 invDiag[1] = scale(-1.0, invS);
59 return createBlockUpperTriInverseOp(A, invDiag,
"LU2x2-Upper");
75void LU2x2PreconditionerFactory::initializeFromParameterList(
76 const Teuchos::ParameterList& settings) {
77 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::initializeFromParameterList", 10);
81 if (settings.isParameter(
"Use LDU")) useLDU = settings.get<
bool>(
"Use LDU");
85 std::string stratName = settings.get<std::string>(
"Strategy Name");
86 const Teuchos::ParameterList& pl = settings.sublist(
"Strategy Settings");
87 invOpsStrategy_ = buildStrategy(stratName, pl, getInverseLibrary(), getRequestHandler());
104Teuchos::RCP<Teuchos::ParameterList> LU2x2PreconditionerFactory::getRequestedParameters()
const {
105 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::getRequestedParameters", 0);
106 return invOpsStrategy_->getRequestedParameters();
122bool LU2x2PreconditionerFactory::updateRequestedParameters(
const Teuchos::ParameterList& pl) {
123 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::updateRequestedParameters", 0);
124 return invOpsStrategy_->updateRequestedParameters(pl);
132CloneFactory<LU2x2Strategy> LU2x2PreconditionerFactory::strategyBuilder_;
146RCP<LU2x2Strategy> LU2x2PreconditionerFactory::buildStrategy(
147 const std::string& name,
const Teuchos::ParameterList& settings,
148 const RCP<const InverseLibrary>& invLib,
const RCP<RequestHandler>& rh) {
149 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::buildStrategy", 0);
152 if (strategyBuilder_.cloneCount() == 0) initializeStrategyBuilder();
154 Teko_DEBUG_MSG_BEGIN(1) std::vector<std::
string> names;
155 strategyBuilder_.getCloneNames(names);
156 DEBUG_STREAM <<
"Strategy names = ";
157 for (std::
size_t i = 0; i < names.size(); i++) DEBUG_STREAM << names[i] <<
", ";
158 DEBUG_STREAM << std::endl;
163 strategy = strategyBuilder_.build(name);
165 if (strategy == Teuchos::null) {
166 Teko_DEBUG_MSG(
"Warning: Could not build LU2x2Strategy named \""
167 << name <<
"\"...pressing on, failure expected",
168 0) return Teuchos::null;
173 strategy->setRequestHandler(rh);
174 strategy->initializeFromParameterList(settings, *invLib);
192void LU2x2PreconditionerFactory::addStrategy(const std::
string& name, const RCP<Cloneable>& clone) {
193 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::addStrategy", 10);
196 if (strategyBuilder_.cloneCount() == 0) initializeStrategyBuilder();
199 strategyBuilder_.addClone(name, clone);
203void LU2x2PreconditionerFactory::initializeStrategyBuilder() {
204 Teko_DEBUG_SCOPE(
"LU2x2PreconditionerFactory::initializeStrategyBuilder", 10);
206 RCP<Cloneable> clone;
209 clone = rcp(
new AutoClone<LU2x2DiagonalStrategy>());
210 strategyBuilder_.addClone(
"Diagonal Strategy", clone);
213 clone = rcp(
new AutoClone<NS::PCDStrategy>());
214 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 ...