Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
integratedbilinearform.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUFEM_FORMS_INTEGRATEDBILINEARFORM_HH
8#define DUNE_FUFEM_FORMS_INTEGRATEDBILINEARFORM_HH
9
10#include <cstddef>
11#include <type_traits>
12#include <utility>
13
16
23
24
25
26namespace Dune::Fufem::Forms {
27
28
29
44 template<class BilinearOperator, class Domain=Dune::Fufem::Forms::Bulk, class QuadratureHint=Dune::Fufem::Forms::QuadratureHints::KeepOrder>
46 {
48 using TestRootLocalView = typename TestRootBasis::LocalView;
49 using TestRootTree = typename TestRootLocalView::Tree;
50
52 using AnsatzRootLocalView = typename AnsatzRootBasis::LocalView;
53 using AnsatzRootTree = typename AnsatzRootLocalView::Tree;
54
55 using LocalOperator = decltype(localOperator(std::declval<BilinearOperator>()));
56
57 public:
58 using Element = typename BilinearOperator::Element;
59
60 IntegratedBilinearForm(const BilinearOperator& sumOperator, const Domain& domain, QuadratureHint quadratureHint)
61 : sumOperator_(sumOperator)
62 , sumLocalOperator_(localOperator(sumOperator_))
63 , domain_(domain)
64 , quadratureHint_(quadratureHint)
65 {}
66
67 IntegratedBilinearForm(const BilinearOperator& sumOperator, const Domain& domain)
69 : IntegratedBilinearForm(sumOperator, domain, QuadratureHint{})
70 {}
71
72 IntegratedBilinearForm(const BilinearOperator& sumOperator, QuadratureHint quadratureHint)
74 : IntegratedBilinearForm(sumOperator, Dune::Fufem::Forms::bulk, quadratureHint)
75 {}
76
77 IntegratedBilinearForm(const BilinearOperator& sumOperator)
79 : IntegratedBilinearForm(sumOperator, Dune::Fufem::Forms::bulk, QuadratureHint{})
80 {}
81
82 const BilinearOperator& integrandOperator() const
83 {
84 return sumOperator_;
85 }
86
87 // Dune::Assembler interface
88
89 void bindLocalViews (const TestRootLocalView& testLocalView, const AnsatzRootLocalView& ansatzLocalView)
90 {
91 cacheManager_.clear();
92 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView(), ansatzLocalView.rootLocalView());
93 sumLocalOperator_.registerCaches(cacheManager_.prototype());
94 }
95
96 void bindElement (const Element& element)
97 {}
98
99 template <class LocalPattern>
100 void assembleElementMatrixPattern(const Element& element, LocalPattern& localPattern)
101 {
102 if (not domain_.contains(element))
103 return;
104 localPattern.addAll();
105 }
106
107 template <class LocalMatrix>
108 void assembleElementMatrix (const Element& element, LocalMatrix& localMatrix)
109 {
110 using namespace Dune::Indices;
111 using namespace Dune::Fufem::Forms::Impl::Tensor;
112
113 if (not domain_.contains(element))
114 return;
115 sumLocalOperator_.bind(element);
116
117 const auto& geometry = element.geometry();
118
119 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
120 cacheManager_[quadratureHint_(op.quadratureRuleKey())].invalidate();
121 });
122
123 // Lift rank by 2 to prepend zero indices for inside
124 auto localTensor = LiftRank(TensorView(localMatrix, _2), _2);
125
126 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
127 auto& cacheForRule = cacheManager_[quadratureHint_(op.quadratureRuleKey())];
128 op.bindToCaches(cacheForRule);
129 const auto& quadRule = cacheForRule.rule();
130 for (auto k : Dune::range(quadRule.size()))
131 {
132 const auto& quadPoint = quadRule[k];
133 const auto integrationWeight = quadPoint.weight() * geometry.integrationElement(quadPoint.position());
134 axpy(integrationWeight, op(k), localTensor);
135 }
136 });
137 }
138
139 // Dune::Fufem interface
140
148 template<class TestLocalView, class AnsatzLocalView>
149 void preprocess(const TestLocalView& testLocalView, const AnsatzLocalView& ansatzLocalView)
150 {
151 cacheManager_.clear();
152 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView(), ansatzLocalView.rootLocalView());
153 sumLocalOperator_.registerCaches(cacheManager_.prototype());
154 }
155
156 template<class LocalMatrix, class TestLocalView, class AnsatzLocalView>
157 void operator()(const Element& element, LocalMatrix& localMatrix, const TestLocalView& testSubspaceLocalView, const AnsatzLocalView& ansatzSubspaceLocalView)
158 {
159 bindElement(element);
160 assembleElementMatrix(element, localMatrix);
161 }
162
163 private:
164 const BilinearOperator sumOperator_;
165 mutable LocalOperator sumLocalOperator_;
167 const Domain& domain_;
168 QuadratureHint quadratureHint_;
169 };
170
171 template<class BilinearOperator, class Domain>
173
174
175
176 template<class BilinearOperator, class Domain, class QuadratureHint>
177 struct IsLocalAssembler<IntegratedBilinearForm<BilinearOperator, Domain, QuadratureHint>> : public std::true_type {};
178
179
180
181} // namespace Dune::Fufem::Forms
182
183
184#endif // DUNE_FUFEM_FORMS_INTEGRATEDBILINEARFORM_HH
constexpr Bulk bulk
Object representing the full grid view as integration domain.
Definition domains.hh:233
Definition baseclass.hh:22
Local assembler corresponding to a bulk bilinear form.
Definition integratedbilinearform.hh:46
IntegratedBilinearForm(const BilinearOperator &sumOperator, const Domain &domain, QuadratureHint quadratureHint)
Definition integratedbilinearform.hh:60
void operator()(const Element &element, LocalMatrix &localMatrix, const TestLocalView &testSubspaceLocalView, const AnsatzLocalView &ansatzSubspaceLocalView)
Definition integratedbilinearform.hh:157
IntegratedBilinearForm(const BilinearOperator &sumOperator)
Definition integratedbilinearform.hh:77
IntegratedBilinearForm(const BilinearOperator &sumOperator, const Domain &domain)
Definition integratedbilinearform.hh:67
typename BilinearOperator::Element Element
Definition integratedbilinearform.hh:58
void bindElement(const Element &element)
Definition integratedbilinearform.hh:96
void assembleElementMatrixPattern(const Element &element, LocalPattern &localPattern)
Definition integratedbilinearform.hh:100
IntegratedBilinearForm(const BilinearOperator &sumOperator, QuadratureHint quadratureHint)
Definition integratedbilinearform.hh:72
const BilinearOperator & integrandOperator() const
Definition integratedbilinearform.hh:82
void preprocess(const TestLocalView &testLocalView, const AnsatzLocalView &ansatzLocalView)
Register local views.
Definition integratedbilinearform.hh:149
void assembleElementMatrix(const Element &element, LocalMatrix &localMatrix)
Definition integratedbilinearform.hh:108
void bindLocalViews(const TestRootLocalView &testLocalView, const AnsatzRootLocalView &ansatzLocalView)
Definition integratedbilinearform.hh:89
Definition localsumassembler.hh:80
A cache providing multiple versions for different quadrature rules.
Definition shapefunctioncache.hh:464
T forward(T... args)