Teko  Version of the Day
 All Classes Files Functions Variables Pages
Teko_InvModALStrategy.hpp
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 /*
11  * Author: Zhen Wang
12  * Email: wangz@ornl.gov
13  * zhen.wang@alum.emory.edu
14  */
15 
16 #ifndef __Teko_ModALStrategy_hpp__
17 #define __Teko_ModALStrategy_hpp__
18 
19 #include "Teuchos_RCP.hpp"
20 
21 #include "Thyra_LinearOpBase.hpp"
22 
23 #include "Teko_Utilities.hpp"
24 #include "Teko_InverseFactory.hpp"
25 #include "Teko_BlockPreconditionerFactory.hpp"
26 
27 namespace Teko {
28 
29 namespace NS {
30 
31 class ModALPrecondState;
32 
33 class InvModALStrategy {
34  public:
36  InvModALStrategy();
37 
38  InvModALStrategy(const Teuchos::RCP<InverseFactory>& factory);
39 
40  InvModALStrategy(const Teuchos::RCP<InverseFactory>& factory, LinearOp& pressureMassMatrix);
41 
42  InvModALStrategy(const Teuchos::RCP<InverseFactory>& invFactA,
43  const Teuchos::RCP<InverseFactory>& invFactS);
44 
45  InvModALStrategy(const Teuchos::RCP<InverseFactory>& invFactA,
46  const Teuchos::RCP<InverseFactory>& invFactS, LinearOp& pressureMassMatrix);
47 
49  virtual ~InvModALStrategy() {}
50 
58  virtual LinearOp getInvA11p(BlockPreconditionerState& state) const;
59 
67  virtual LinearOp getInvA22p(BlockPreconditionerState& state) const;
68 
76  virtual LinearOp getInvA33p(BlockPreconditionerState& state) const;
77 
85  virtual LinearOp getInvS(BlockPreconditionerState& state) const;
86 
94  virtual void buildState(const BlockedLinearOp& A, BlockPreconditionerState& state) const;
95 
99  virtual void initializeState(const BlockedLinearOp& A, ModALPrecondState* state) const;
100 
107  virtual void computeInverses(const BlockedLinearOp& A, ModALPrecondState* state) const;
108 
114  void setPressureMassMatrix(const LinearOp& pressureMassMatrix);
115 
121  void setGamma(double gamma);
122 
127  virtual void setSymmetric(bool isSymmetric) { isSymmetric_ = isSymmetric; }
128 
129  protected:
130  // In the modified AL preconditioner, we need to two methods,
131  // one for solving \f$ A_{ii}, i = 1, 2(, 3) \f$,
132  // the other for solving \f$ S \f$.
133  Teuchos::RCP<InverseFactory> invFactoryA_;
134  Teuchos::RCP<InverseFactory> invFactoryS_;
135  LinearOp pressureMassMatrix_;
136  double gamma_;
137 
138  DiagonalType scaleType_;
139  bool isSymmetric_;
140  int dim_;
141 };
142 
143 } // end namespace NS
144 
145 } // end namespace Teko
146 
147 #endif /* __Teko_ModALStrategy_hpp__ */