47 #include "Teko_LU2x2DiagonalStrategy.hpp"
49 #include "Teuchos_TimeMonitor.hpp"
53 using Teuchos::TimeMonitor;
55 Teuchos::RCP<Teuchos::Time> LU2x2DiagonalStrategy::initTimer_;
56 Teuchos::RCP<Teuchos::Time> LU2x2DiagonalStrategy::invSTimer_;
57 Teuchos::RCP<Teuchos::Time> LU2x2DiagonalStrategy::invA00Timer_;
58 Teuchos::RCP<Teuchos::Time> LU2x2DiagonalStrategy::opsTimer_;
61 if (initTimer_ == Teuchos::null)
62 initTimer_ = TimeMonitor::getNewTimer(
"LU2x2DiagonalStrategy::initializePrec");
64 if (invSTimer_ == Teuchos::null)
65 invSTimer_ = TimeMonitor::getNewTimer(
"LU2x2DiagonalStrategy::initializePrec invS");
67 if (invA00Timer_ == Teuchos::null)
68 invA00Timer_ = TimeMonitor::getNewTimer(
"LU2x2DiagonalStrategy::initializePrec invA00");
70 if (opsTimer_ == Teuchos::null)
71 opsTimer_ = TimeMonitor::getNewTimer(
"LU2x2DiagonalStrategy::initializePrec buildOps");
78 const Teuchos::RCP<InverseFactory>& invS)
79 : invFactoryA00_(invFA), invFactoryS_(invS), a00InverseType_(Diagonal) {
110 Teko_DEBUG_SCOPE(
"LU2x2DiagonalStrategy::initializeState", 10);
115 Teuchos::TimeMonitor timer(*initTimer_,
true);
118 LinearOp A00 = Teko::getBlock(0, 0, A);
119 LinearOp A01 = Teko::getBlock(0, 1, A);
120 LinearOp A10 = Teko::getBlock(1, 0, A);
121 LinearOp A11 = Teko::getBlock(1, 1, A);
127 Teko_DEBUG_SCOPE(
"Building S", 5);
128 Teuchos::TimeMonitor timerS(*opsTimer_,
true);
130 LinearOp diagA00 = getInvDiagonalOp(A00, a00InverseType_);
134 triple = explicitMultiply(A10, diagA00, A01, triple);
135 S = explicitAdd(scale(-1.0, A11), triple, S);
141 Teko_DEBUG_SCOPE(
"Building inverse(S)", 5);
142 Teuchos::TimeMonitor timerInvS(*invSTimer_,
true);
145 if (invS == Teuchos::null)
154 Teko_DEBUG_SCOPE(
"Building inverse(A00)", 5);
155 Teuchos::TimeMonitor timerInvA00(*invA00Timer_,
true);
158 *getOutputStream() <<
"(LU2x2) invA00 pointer = " << invA00 << std::endl;
159 if (invA00 == Teuchos::null)
181 const InverseLibrary& invLib) {
182 Teko_DEBUG_SCOPE(
"LU2x2DiagonalStrategy::initializeFromParameterList", 10);
184 std::string invStr =
"", invA00Str =
"", invSStr =
"";
185 #if defined(Teko_ENABLE_Amesos)
187 #elif defined(Teko_ENABLE_Amesos2)
192 if (pl.isParameter(
"Inverse Type")) invStr = pl.get<std::string>(
"Inverse Type");
193 if (pl.isParameter(
"Inverse A00 Type")) invA00Str = pl.get<std::string>(
"Inverse A00 Type");
194 if (pl.isParameter(
"Inverse Schur Type")) invSStr = pl.get<std::string>(
"Inverse Schur Type");
195 if (pl.isParameter(
"Diagonal Type")) {
196 std::string massInverseStr = pl.get<std::string>(
"Diagonal Type");
199 a00InverseType_ = getDiagonalType(massInverseStr);
203 if (invA00Str ==
"") invA00Str = invStr;
204 if (invSStr ==
"") invSStr = invStr;
206 Teko_DEBUG_MSG_BEGIN(5) DEBUG_STREAM <<
"LU2x2 Diagonal Strategy Parameters: " << std::endl;
207 DEBUG_STREAM <<
" inv type = \"" << invStr <<
"\"" << std::endl;
208 DEBUG_STREAM <<
" inv A00 type = \"" << invA00Str <<
"\"" << std::endl;
209 DEBUG_STREAM <<
" inv S type = \"" << invSStr <<
"\"" << std::endl;
210 DEBUG_STREAM <<
"LU2x2 Diagonal Strategy Parameter list: " << std::endl;
211 pl.print(DEBUG_STREAM);
215 invFactoryA00_ = invLib.getInverseFactory(invA00Str);
217 if (invA00Str == invSStr)
218 invFactoryS_ = invFactoryA00_;
220 invFactoryS_ = invLib.getInverseFactory(invSStr);
void rebuildInverse(const InverseFactory &factory, const LinearOp &A, InverseLinearOp &invA)
virtual const Teko::LinearOp getTildeInvA00(const Teko::BlockedLinearOp &A, BlockPreconditionerState &state) const
LU2x2DiagonalStrategy()
default Constructor
An implementation of a state object for block preconditioners.
void initializeState(const Teko::BlockedLinearOp &A, BlockPreconditionerState &state) const
virtual bool isInitialized() const
static void buildTimers()
virtual const Teko::LinearOp getHatInvA00(const Teko::BlockedLinearOp &A, BlockPreconditionerState &state) const
virtual const Teko::LinearOp getInvS(const Teko::BlockedLinearOp &A, BlockPreconditionerState &state) const
InverseLinearOp buildInverse(const InverseFactory &factory, const LinearOp &A)
Build an inverse operator using a factory and a linear operator.
virtual void initializeFromParameterList(const Teuchos::ParameterList &settings, const InverseLibrary &invLib)
This function builds the internals of the state from a parameter list.
virtual void setInitialized(bool init=true)
virtual Teko::ModifiableLinearOp & getModifiableOp(const std::string &name)
Add a named operator to the state object.