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"
28 ModALPrecondState::ModALPrecondState()
29 : pressureMassMatrix_(Teuchos::null), invPressureMassMatrix_(Teuchos::null) {}
31 ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory>& factory)
32 : invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(factory))), isSymmetric_(true) {}
34 ModALPreconditionerFactory::ModALPreconditionerFactory(
35 const Teuchos::RCP<InverseFactory>& invFactoryA,
36 const Teuchos::RCP<InverseFactory>& invFactoryS)
37 : invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(invFactoryA, invFactoryS))),
40 ModALPreconditionerFactory::ModALPreconditionerFactory(
const Teuchos::RCP<InverseFactory>& factory,
41 LinearOp& pressureMassMatrix)
42 : invOpsStrategy_(Teuchos::rcp(new InvModALStrategy(factory, pressureMassMatrix))),
45 ModALPreconditionerFactory::ModALPreconditionerFactory(
46 const Teuchos::RCP<InverseFactory>& invFactoryA,
47 const Teuchos::RCP<InverseFactory>& invFactoryS, LinearOp& pressureMassMatrix)
49 Teuchos::rcp(new InvModALStrategy(invFactoryA, invFactoryS, pressureMassMatrix))),
53 ModALPreconditionerFactory::ModALPreconditionerFactory(
54 const Teuchos::RCP<InvModALStrategy>& strategy)
55 : invOpsStrategy_(strategy), isSymmetric_(true) {}
57 LinearOp ModALPreconditionerFactory::buildPreconditionerOperator(
59 Teko_DEBUG_SCOPE(
"ModALPreconditionerFactory::buildPreconditionerOperator()", 10);
60 Teko_DEBUG_EXPR(Teuchos::Time timer(
""));
61 Teko_DEBUG_EXPR(Teuchos::Time totalTimer(
""));
62 Teko_DEBUG_EXPR(totalTimer.start());
65 int dim = blockRowCount(alOp) - 1;
66 TEUCHOS_ASSERT(dim == 2 || dim == 3);
69 Teko_DEBUG_EXPR(timer.start(
true));
70 invOpsStrategy_->buildState(alOp, state);
71 Teko_DEBUG_EXPR(timer.stop());
72 Teko_DEBUG_MSG(
"ModALPreconditionerFactory::buildPreconditionerOperator():BuildStateTime = "
73 << timer.totalElapsedTime(),
77 Teko_DEBUG_EXPR(timer.start(
true));
78 LinearOp invA11p = invOpsStrategy_->getInvA11p(state);
79 LinearOp invA22p = invOpsStrategy_->getInvA22p(state);
82 invA33p = invOpsStrategy_->getInvA33p(state);
88 TEUCHOS_ASSERT(modALState != NULL);
90 if (modALState->isStabilized_) {
91 invS = invOpsStrategy_->getInvS(state);
93 invS = scale(modALState->gamma_, modALState->invPressureMassMatrix_);
96 Teko_DEBUG_EXPR(timer.stop());
98 "ModALPrecFact::buildPreconditionerOperator(): GetInvTime = " << timer.totalElapsedTime(), 2);
101 std::vector<LinearOp> invDiag;
102 invDiag.resize(dim + 1);
103 invDiag[0] = invA11p;
104 invDiag[1] = invA22p;
106 invDiag[2] = scale(-1.0, invS);
107 }
else if (dim == 3) {
108 invDiag[2] = invA33p;
109 invDiag[3] = scale(-1.0, invS);
113 BlockedLinearOp U = getUpperTriBlocks(alOp);
115 Teko_DEBUG_EXPR(totalTimer.stop());
117 "ModALPrecFact::buildPreconditionerOperator TotalTime = " << totalTimer.totalElapsedTime(),
121 return createBlockUpperTriInverseOp(U, invDiag,
"Modified AL preconditioner-Upper");
An implementation of a state object for block preconditioners.
Class for saving state variables for ModALPreconditionerFactory.