Finite Element Domain Decomposition Library
FEDDLib
Loading...
Searching...
No Matches
PreconditionerOperator_decl.hpp
1#ifndef PreconditionerOperator_DECL_hpp
2#define PreconditionerOperator_DECL_hpp
3#include "feddlib/core/FEDDCore.hpp"
4#include "feddlib/core/General/DefaultTypeDefs.hpp"
5#include "feddlib/problems/problems_config.h"
6#include <Thyra_PhysicallyBlockedLinearOpBase.hpp>
7#include <Thyra_DefaultProductVectorSpace_decl.hpp>
8#include <Teuchos_ConstNonconstObjectContainer.hpp>
9#include <Thyra_DefaultMultiVectorProductVectorSpace_decl.hpp>
10
19
20namespace FEDD {
21
22template <class SC = default_sc, class LO = default_lo, class GO = default_go, class NO = default_no>
23class PreconditionerOperator : virtual public Thyra::PhysicallyBlockedLinearOpBase<SC> {
24
25public:
26
27 PreconditionerOperator();
28
31
33 virtual void beginBlockFill();
35 virtual void beginBlockFill(
36 const int numRowBlocks, const int numColBlocks
37 );
39 virtual void beginBlockFill(
40 const Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> > &productRange,
41 const Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> > &productDomain
42 );
44 virtual bool blockFillIsActive() const;
46 virtual bool acceptsBlock(const int i, const int j) const;
48 virtual void setNonconstBlock(
49 const int i, const int j,
50 const Teuchos::RCP<Thyra::LinearOpBase<SC> > &block
51 );
53 virtual void setBlock(
54 const int i, const int j
55 ,const Teuchos::RCP<const Thyra::LinearOpBase<SC> > &block
56 );
58 virtual void endBlockFill();
60 virtual void uninitialize();
61
63
66
68 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> >
69 productRange() const;
71 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> >
72 productDomain() const;
74 bool blockExists(const int i, const int j) const;
76 bool blockIsConst(const int i, const int j) const;
78 Teuchos::RCP<Thyra::LinearOpBase<SC> >
79 getNonconstBlock(const int i, const int j);
81 Teuchos::RCP<const Thyra::LinearOpBase<SC> >
82 getBlock(const int i, const int j) const;
83
84 Teuchos::RCP< const Thyra::VectorSpaceBase<SC> > range() const;
85
86 Teuchos::RCP< const Thyra::VectorSpaceBase<SC> > domain() const;
87
88 Teuchos::RCP<const Thyra::LinearOpBase<SC> > clone() const;
89
90 std::string description() const;
91
92 void describe(
93 Teuchos::FancyOStream &out,
94 const Teuchos::EVerbosityLevel verbLevel
95 ) const;
96
97protected:
98
101
105 bool opSupportedImpl(Thyra::EOpTransp M_trans) const;
106
108 virtual void applyImpl(
109 const Thyra::EOpTransp M_trans,
110 const Thyra::MultiVectorBase<SC> &X,
111 const Teuchos::Ptr<Thyra::MultiVectorBase<SC> > &Y,
112 const SC alpha,
113 const SC beta
114 ) const = 0;
115
117 Teuchos::RCP<const Thyra::DefaultProductVectorSpace<SC> > defaultProductRange_;
118 Teuchos::RCP<const Thyra::DefaultProductVectorSpace<SC> > defaultProductDomain_;
119
120// Teuchos::RCP<const Thyra::DefaultMultiVectorProductVectorSpace< SC > > defaultProductRange_;
121// Teuchos::RCP<const Thyra::DefaultMultiVectorProductVectorSpace< SC > > defaultProductDomain_;
122
123private:
124
125 // ///////////////////
126 // Private types
127
128 typedef Teuchos::ConstNonconstObjectContainer<Thyra::LinearOpBase<SC> > CNCLO;
129 typedef Teuchos::Array<Teuchos::RCP<const Thyra::VectorSpaceBase<SC> > > vec_array_t;
130
131 template<class SC2>
132 struct BlockEntry {
133 BlockEntry() : i(-1), j(-1) {}
134 BlockEntry( const int i_in, const int j_in, const CNCLO &block_in )
135 :i(i_in),j(j_in),block(block_in)
136 {}
137 int i;
138 int j;
139 CNCLO block;
140 };
141
142 // /////////////////////////
143 // Private data members
144
145 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> > productRange_;
146 Teuchos::RCP<const Thyra::ProductVectorSpaceBase<SC> > productDomain_;
147
148 int numRowBlocks_; // M
149 int numColBlocks_; // N
150
151 std::vector<CNCLO> Ops_; // Final M x N storage
152
153 vec_array_t rangeBlocks_;
154 vec_array_t domainBlocks_;
155 std::vector<BlockEntry<SC> > Ops_stack_; // Temp stack of ops begin filled (if Ops_.size()==0).
156 bool blockFillIsActive_;
157
158 // ///////////////////////////
159 // Private member functions
160
161 void resetStorage( const int numRowBlocks, const int numColBlocks );
162 void assertBlockFillIsActive(bool) const;
163 void assertBlockRowCol(const int i, const int j) const;
164 void setBlockSpaces(
165 const int i, const int j, const Thyra::LinearOpBase<SC> &block
166 );
167 template<class LinearOpType>
168 void setBlockImpl(
169 const int i, const int j,
170 const Teuchos::RCP<LinearOpType> &block
171 );
172 void adjustBlockSpaces();
173
174};
175}
176#endif
virtual void setBlock(const int i, const int j, const Teuchos::RCP< const Thyra::LinearOpBase< SC > > &block)
Definition PreconditionerOperator_def.hpp:88
bool blockIsConst(const int i, const int j) const
Definition PreconditionerOperator_def.hpp:221
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< SC > > productDomain() const
Definition PreconditionerOperator_def.hpp:203
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< SC > > productRange() const
Definition PreconditionerOperator_def.hpp:195
virtual bool blockFillIsActive() const
Definition PreconditionerOperator_def.hpp:60
virtual void uninitialize()
Definition PreconditionerOperator_def.hpp:176
virtual void beginBlockFill()
Definition PreconditionerOperator_def.hpp:31
virtual void endBlockFill()
Definition PreconditionerOperator_def.hpp:98
Teuchos::RCP< const Thyra::LinearOpBase< SC > > getBlock(const int i, const int j) const
Definition PreconditionerOperator_def.hpp:249
virtual void applyImpl(const Thyra::EOpTransp M_trans, const Thyra::MultiVectorBase< SC > &X, const Teuchos::Ptr< Thyra::MultiVectorBase< SC > > &Y, const SC alpha, const SC beta) const =0
bool opSupportedImpl(Thyra::EOpTransp M_trans) const
Returns true only if all constituent operators support M_trans.
Definition PreconditionerOperator_def.hpp:363
virtual void beginBlockFill(const Teuchos::RCP< const Thyra::ProductVectorSpaceBase< SC > > &productRange, const Teuchos::RCP< const Thyra::ProductVectorSpaceBase< SC > > &productDomain)
virtual void setNonconstBlock(const int i, const int j, const Teuchos::RCP< Thyra::LinearOpBase< SC > > &block)
Definition PreconditionerOperator_def.hpp:78
virtual bool acceptsBlock(const int i, const int j) const
Definition PreconditionerOperator_def.hpp:67
bool blockExists(const int i, const int j) const
Definition PreconditionerOperator_def.hpp:210
Teuchos::RCP< Thyra::LinearOpBase< SC > > getNonconstBlock(const int i, const int j)
Definition PreconditionerOperator_def.hpp:236
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5