7#include "Teko_ModALPreconditionerFactory.hpp"
9#include "Thyra_DefaultMultipliedLinearOp.hpp"
10#include "Thyra_DefaultAddedLinearOp.hpp"
11#include "Thyra_DefaultIdentityLinearOp.hpp"
12#include "Thyra_DefaultZeroLinearOp.hpp"
16#include "Teko_BlockLowerTriInverseOp.hpp"
17#include "Teko_BlockUpperTriInverseOp.hpp"
18#include "Teko_StaticLSCStrategy.hpp"
19#include "Teko_InvLSCStrategy.hpp"
20#include "Teko_PresLaplaceLSCStrategy.hpp"
22#include "Teuchos_Time.hpp"
30ModALPrecondState::ModALPrecondState():
31pressureMassMatrix_(Teuchos::null), invPressureMassMatrix_(Teuchos::null)
35ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory> & factory) :
36 invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(factory))),
41ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory> & invFactoryA,
42 const Teuchos::RCP<InverseFactory> & invFactoryS) :
43 invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(invFactoryA, invFactoryS))),
48ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory> & factory,
49 LinearOp & pressureMassMatrix) :
50 invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(factory, pressureMassMatrix))), isSymmetric_(true)
54ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory> & invFactoryA,
55 const Teuchos::RCP<InverseFactory> & invFactoryS,
56 LinearOp & pressureMassMatrix) :
57 invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(invFactoryA, invFactoryS, pressureMassMatrix))),
63ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InvModALStrategy> & strategy) :
64 invOpsStrategy_(strategy), isSymmetric_(true)
68LinearOp ModALPreconditionerFactory::buildPreconditionerOperator(BlockedLinearOp & alOp,
71 Teko_DEBUG_SCOPE(
"ModALPreconditionerFactory::buildPreconditionerOperator()", 10);
72 Teko_DEBUG_EXPR(Teuchos::Time timer(
""));
73 Teko_DEBUG_EXPR(Teuchos::Time totalTimer(
""));
74 Teko_DEBUG_EXPR(totalTimer.start());
78 TEUCHOS_ASSERT(dim == 2 || dim == 3);
81 Teko_DEBUG_EXPR(timer.start(
true));
82 invOpsStrategy_->buildState(alOp, state);
83 Teko_DEBUG_EXPR(timer.stop());
84 Teko_DEBUG_MSG(
"ModALPreconditionerFactory::buildPreconditionerOperator():BuildStateTime = "
85 << timer.totalElapsedTime(), 2);
88 Teko_DEBUG_EXPR(timer.start(
true));
89 LinearOp invA11p = invOpsStrategy_->getInvA11p(state);
90 LinearOp invA22p = invOpsStrategy_->getInvA22p(state);
94 invA33p = invOpsStrategy_->getInvA33p(state);
100 TEUCHOS_ASSERT(modALState != NULL);
102 if(modALState->isStabilized_)
104 invS = invOpsStrategy_->getInvS(state);
108 invS = scale(modALState->gamma_, modALState->invPressureMassMatrix_);
111 Teko_DEBUG_EXPR(timer.stop());
112 Teko_DEBUG_MSG(
"ModALPrecFact::buildPreconditionerOperator(): GetInvTime = "
113 << timer.totalElapsedTime(), 2);
116 std::vector<LinearOp> invDiag;
117 invDiag.resize(dim + 1);
118 invDiag[0] = invA11p;
119 invDiag[1] = invA22p;
122 invDiag[2] = scale(-1.0, invS);
126 invDiag[2] = invA33p;
127 invDiag[3] = scale(-1.0, invS);
131 BlockedLinearOp U = getUpperTriBlocks(alOp);
133 Teko_DEBUG_EXPR(totalTimer.stop());
134 Teko_DEBUG_MSG(
"ModALPrecFact::buildPreconditionerOperator TotalTime = "
135 << totalTimer.totalElapsedTime(), 2);
138 return createBlockUpperTriInverseOp(U, invDiag,
"Modified AL preconditioner-Upper");
int blockRowCount(const BlockedLinearOp &blo)
Get the row count in a block linear operator.
An implementation of a state object for block preconditioners.
Class for saving state variables for ModALPreconditionerFactory.