5 #include <amdis/LinearAlgebra.hpp> 6 #include <amdis/Observer.hpp> 7 #include <amdis/OperatorList.hpp> 8 #include <amdis/common/Concepts.hpp> 9 #include <amdis/common/ConceptsBase.hpp> 10 #include <amdis/common/FlatMatrix.hpp> 11 #include <amdis/common/TypeTraits.hpp> 12 #include <amdis/linearalgebra/SymmetryStructure.hpp> 13 #include <amdis/typetree/TreePath.hpp> 26 template <
class RB,
class CB,
class T =
double,
class Traits = BackendTraits<RB>>
29 ,
private ObserverSequence<event::adapt,2>
52 BiLinearForm(std::shared_ptr<RB>
const& rowBasis, std::shared_ptr<CB>
const& colBasis)
53 :
Super(*rowBasis, *colBasis)
54 , ObserverSequence<event::adapt,2>(*rowBasis, *colBasis)
58 , updatePattern_(true)
60 auto const rowSize = rowBasis_->localView().maxSize();
61 auto const colSize = colBasis_->localView().maxSize();
66 template <
class RB_,
class CB_,
67 REQUIRES(Concepts::Similar<RB_,RB>),
68 REQUIRES(Concepts::Similar<CB_,CB>)>
74 template <
class RB_ = RB,
class CB_ = CB,
75 REQUIRES(std::is_same_v<RB_,CB_>)>
82 REQUIRES(Concepts::Similar<RB_,RB>)>
87 RowBasis const& rowBasis()
const {
return *rowBasis_; }
88 ColBasis const& colBasis()
const {
return *colBasis_; }
110 template <
class ContextTag,
class Operator,
class Row,
class Col>
114 template <
class Operator,
class Row = RootTreePath,
class Col = RootTreePath>
117 using E =
typename RowBasis::LocalView::Element;
122 template <
class Operator,
class Row = RootTreePath,
class Col = RootTreePath>
123 void addIntersectionOperator(
Operator const& op, Row row = {}, Col col = {})
125 using I =
typename RowBasis::LocalView::GridView::Intersection;
137 updatePattern_ = updatePattern_ || (
symmetry_ != symm);
148 template <
class RowLocalView,
class ColLocalView,
class LocalOperators,
149 REQUIRES(Concepts::LocalView<RowLocalView>),
150 REQUIRES(Concepts::LocalView<ColLocalView>)>
151 void assemble(RowLocalView
const& rowLocalView,
152 ColLocalView
const& colLocalView,
168 void init(
bool forcePatternRebuild =
false)
170 if (updatePattern_ || forcePatternRebuild)
173 updatePattern_ =
false;
189 template <
class Basis>
190 void updateImpl2(Basis
const& basis)
193 Recursive::forEach(
operators_, [&](
auto& op) { op.
update(basis.gridView()); });
194 updatePattern_ =
true;
207 std::shared_ptr<RowBasis const> rowBasis_;
208 std::shared_ptr<ColBasis const> colBasis_;
217 template <
class RB,
class CB>
226 template <
class T =
double,
class RB,
class CB>
227 auto makeBiLinearForm(RB&& rowBasis, CB&& colBasis)
230 return BLF{FWD(rowBasis), FWD(colBasis)};
233 template <
class T =
double,
class RB>
234 auto makeBiLinearForm(RB&& rowBasis)
237 return BLF{FWD(rowBasis)};
242 #include <amdis/BiLinearForm.inc.hpp>
auto localOperators(Container const &c)
Definition: Operator.hpp:125
The base class for an operator to be used in an Assembler.
Definition: Operator.hpp:79
Definition: AdaptiveGrid.hpp:373
Definition: AdaptBase.hpp:6
void resize(size_type r, size_type c, value_type v={})
Resizes the container to contain r x c elements.
Definition: FlatMatrix.hpp:70
Definition: Observer.hpp:25
Definition: OperatorList.hpp:15
void update(GridView const &gv)
Update the operator data on a GridView.
Definition: Operator.hpp:103
Definition: OperatorList.hpp:16
void init()
Initialize the matrix for insertion while keeping the pattern unchanged.
Definition: MatrixFacade.hpp:49
Definition: MatrixFacade.hpp:24