Teko Version of the Day
Loading...
Searching...
No Matches
Teko_LU2x2PreconditionerFactory.cpp
1// @HEADER
2// *****************************************************************************
3// Teko: A package for block and physics based preconditioning
4//
5// Copyright 2010 NTESS and the Teko contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#include "Teko_LU2x2PreconditionerFactory.hpp"
11
12// Teko includes
14#include "Teko_BlockUpperTriInverseOp.hpp"
15
16// default strategies
17#include "Teko_LU2x2DiagonalStrategy.hpp"
18#include "NS/Teko_PCDStrategy.hpp"
19
20using Teuchos::rcp;
21using Teuchos::RCP;
22
23namespace Teko {
24
25// construct a PreconditionerFactory
26LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp& invA00, LinearOp& invS)
27 : invOpsStrategy_(rcp(new StaticLU2x2Strategy(invA00, invA00, invS))), useFullLDU_(true) {}
28
30LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(LinearOp& hatInvA00, LinearOp& tildeInvA00,
31 LinearOp& invS)
32 : invOpsStrategy_(rcp(new StaticLU2x2Strategy(hatInvA00, tildeInvA00, invS))),
33 useFullLDU_(true) {}
34
35LU2x2PreconditionerFactory::LU2x2PreconditionerFactory(const RCP<LU2x2Strategy>& strategy)
36 : invOpsStrategy_(strategy), useFullLDU_(true) {}
37
38LU2x2PreconditionerFactory::LU2x2PreconditionerFactory()
39 : invOpsStrategy_(Teuchos::null), useFullLDU_(true) {}
40
41// for PreconditionerFactoryBase
43
44// initialize a newly created preconditioner object
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);
51
52 // build the SchurSolve LinearOp
53 if (useFullLDU())
54 return createLU2x2InverseOp(A, hatInvA00, tildeInvA00, invS, "LU2x2-Full");
55 else {
56 std::vector<LinearOp> invDiag(2);
57 invDiag[0] = hatInvA00;
58 invDiag[1] = scale(-1.0, invS);
59 return createBlockUpperTriInverseOp(A, invDiag, "LU2x2-Upper");
60 }
61}
62
75void LU2x2PreconditionerFactory::initializeFromParameterList(
76 const Teuchos::ParameterList& settings) {
77 Teko_DEBUG_SCOPE("LU2x2PreconditionerFactory::initializeFromParameterList", 10);
78
79 // use Golub & Wathen type or full LDU decomposition for inverse solve?
80 bool useLDU = true;
81 if (settings.isParameter("Use LDU")) useLDU = settings.get<bool>("Use LDU");
82 setFullLDU(useLDU);
83
84 // build strategy object
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());
88}
89
104Teuchos::RCP<Teuchos::ParameterList> LU2x2PreconditionerFactory::getRequestedParameters() const {
105 Teko_DEBUG_SCOPE("LU2x2PreconditionerFactory::getRequestedParameters", 0);
106 return invOpsStrategy_->getRequestedParameters();
107}
108
122bool LU2x2PreconditionerFactory::updateRequestedParameters(const Teuchos::ParameterList& pl) {
123 Teko_DEBUG_SCOPE("LU2x2PreconditionerFactory::updateRequestedParameters", 0);
124 return invOpsStrategy_->updateRequestedParameters(pl);
125}
126
128// Static members and methods
130
132CloneFactory<LU2x2Strategy> LU2x2PreconditionerFactory::strategyBuilder_;
133
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);
150
151 // initialize the defaults if necessary
152 if (strategyBuilder_.cloneCount() == 0) initializeStrategyBuilder();
153
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;
159 Teko_DEBUG_MSG_END()
160
161 // request the preconditioner factory from the CloneFactory
162 RCP<LU2x2Strategy>
163 strategy = strategyBuilder_.build(name);
164
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;
169 }
170
171 // now that inverse library has been set,
172 // pass in the parameter list
173 strategy->setRequestHandler(rh);
174 strategy->initializeFromParameterList(settings, *invLib);
175
176 return strategy;
177}
178
192void LU2x2PreconditionerFactory::addStrategy(const std::string& name, const RCP<Cloneable>& clone) {
193 Teko_DEBUG_SCOPE("LU2x2PreconditionerFactory::addStrategy", 10);
194
195 // initialize the defaults if necessary
196 if (strategyBuilder_.cloneCount() == 0) initializeStrategyBuilder();
197
198 // add clone to builder
199 strategyBuilder_.addClone(name, clone);
200}
201
203void LU2x2PreconditionerFactory::initializeStrategyBuilder() {
204 Teko_DEBUG_SCOPE("LU2x2PreconditionerFactory::initializeStrategyBuilder", 10);
205
206 RCP<Cloneable> clone;
207
208 // add various strategies to the factory
209 clone = rcp(new AutoClone<LU2x2DiagonalStrategy>());
210 strategyBuilder_.addClone("Diagonal Strategy", clone);
211
212 // add various strategies to the factory
213 clone = rcp(new AutoClone<NS::PCDStrategy>());
214 strategyBuilder_.addClone("NS PCD Strategy", clone);
215}
216
217} // end namespace Teko
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 ...