10#ifndef __Teko_HierarchicalGaussSeidelPreconditionerFactory_hpp__
11#define __Teko_HierarchicalGaussSeidelPreconditionerFactory_hpp__
13#include "Teuchos_RCP.hpp"
15#include "Teko_BlockPreconditionerFactory.hpp"
16#include "Teko_BlockImplicitLinearOp.hpp"
23class NestedBlockGS :
public BlockImplicitLinearOp {
25 NestedBlockGS(
const std::map<
int, std::vector<int>>& blockToRow_,
26 const std::map<int, LinearOp>& blockToInvOp_, BlockedLinearOp& A_,
27 bool useLowerTriangle_ =
false);
29 VectorSpace range()
const override {
return productRange_; }
30 VectorSpace domain()
const override {
return productDomain_; }
32 void implicitApply(
const BlockedMultiVector& r, BlockedMultiVector& z,
const double alpha = 1.0,
33 const double beta = 0.0)
const override;
36 void upperTriangularImplicitApply(std::vector<BlockedMultiVector>& r,
37 std::vector<BlockedMultiVector>& z,
const double alpha = 1.0,
38 const double beta = 0.0)
const;
40 void lowerTriangularImplicitApply(std::vector<BlockedMultiVector>& r,
41 std::vector<BlockedMultiVector>& z,
const double alpha = 1.0,
42 const double beta = 0.0)
const;
45 std::map<int, std::vector<int>> blockToRow;
46 std::map<int, LinearOp> blockToInvOp;
47 std::vector<LinearOp> invOps;
49 std::vector<BlockedLinearOp> Ab;
50 bool useLowerTriangle =
false;
52 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<double>> productRange_;
53 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<double>>
87 const Teuchos::RCP<InverseFactory>& precFact,
89 int hierarchicalBlockNum)
const;
90 template <
typename LinearOpType>
92 const Teuchos::RCP<InverseFactory>& precFact,
94 int hierarchicalBlockNum)
const {
96 ss <<
"hierarchical_block_" << hierarchicalBlockNum;
98 ModifiableLinearOp& invOp = state.getModifiableOp(ss.str());
99 ModifiableLinearOp& precOp = state.getModifiableOp(
"prec_" + ss.str());
101 if (precFact != Teuchos::null) {
102 if (precOp == Teuchos::null) {
103 precOp = precFact->buildInverse(matrix);
104 state.addModifiableOp(
"prec_" + ss.str(), precOp);
110 if (invOp == Teuchos::null)
111 if (precOp.is_null())
116 if (precOp.is_null())
125 std::map<int, std::vector<int>> blockToRow;
126 std::map<int, Teuchos::RCP<InverseFactory>> blockToInverse;
127 std::map<int, Teuchos::RCP<InverseFactory>> blockToPreconditioner;
128 mutable std::map<int, LinearOp> blockToInvOp;
130 bool useLowerTriangle =
false;
InverseLinearOp buildInverse(const InverseFactory &factory, const LinearOp &A)
Build an inverse operator using a factory and a linear operator.
void rebuildInverse(const InverseFactory &factory, const LinearOp &A, InverseLinearOp &invA)
virtual void implicitApply(const Thyra::EOpTransp M_trans, const BlockedMultiVector &x, BlockedMultiVector &y, const double alpha=1.0, const double beta=0.0) const
Perform a matrix vector multiply with this implicitly defined blocked operator.
Abstract class which block preconditioner factories in Teko should be based on.
virtual LinearOp buildPreconditionerOperator(BlockedLinearOp &blo, BlockPreconditionerState &state) const =0
Function that is called to build the preconditioner for the linear operator that is passed in.
An implementation of a state object for block preconditioners.
A block Gauss-Seidel preconditioner that groups the sub-blocks hierarchically before sweeping.
LinearOp buildPreconditionerOperator(BlockedLinearOp &blo, BlockPreconditionerState &state) const override
Function that is called to build the preconditioner for the linear operator that is passed in.
void initializeFromParameterList(const Teuchos::ParameterList &pl) override
This function builds the internals of the preconditioner factory from a parameter list.
Abstract class for building an inverse operator.