Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
integratedboundarybilinearform.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_INTEGRATEDBOUNDARYBILINEARFORM_HH
8#define DUNE_FUFEM_FORMS_INTEGRATEDBOUNDARYBILINEARFORM_HH
9
10#include <cstddef>
11#include <type_traits>
12#include <utility>
13
16
22
23
24
25namespace Dune::Fufem::Forms {
26
27
28
43 template<class BilinearOperator, class Domain, class QuadratureHint=Dune::Fufem::Forms::QuadratureHints::KeepOrder>
45 {
47 using TestRootLocalView = typename TestRootBasis::LocalView;
48 using TestRootTree = typename TestRootLocalView::Tree;
49
51 using AnsatzRootLocalView = typename AnsatzRootBasis::LocalView;
52 using AnsatzRootTree = typename AnsatzRootLocalView::Tree;
53
54 using LocalOperator = decltype(localOperator(std::declval<BilinearOperator>()));
55
57
58 public:
59
60 using Element = typename LocalOperator::Element;
61 using Intersection = typename LocalOperator::Intersection;
62
63 IntegratedBoundaryBilinearForm(const BilinearOperator& sumOperator, const Domain& domain, QuadratureHint quadratureHint)
64 : sumOperator_(sumOperator)
65 , sumLocalOperator_(localOperator(sumOperator_))
66 , domain_(domain)
67 , quadratureHint_(quadratureHint)
68 {}
69
70 IntegratedBoundaryBilinearForm(const BilinearOperator& sumOperator, const Domain& domain)
72 : IntegratedBoundaryBilinearForm(sumOperator, domain, QuadratureHint{})
73 {}
74
75 const BilinearOperator& integrandOperator() const
76 {
77 return sumOperator_;
78 }
79
80 // Dune::Assembler interface
81
82 void bindLocalViews (const TestRootLocalView& testLocalView, const AnsatzRootLocalView& ansatzLocalView)
83 {
84 cacheManager_.clear();
85 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView(), ansatzLocalView.rootLocalView());
86 sumLocalOperator_.registerCaches(cacheManager_.prototype());
87 insidePtr_ = &testLocalView.element();
88 }
89
90 void bindElement (const Element& element)
91 {}
92
93 template <class LocalPattern>
94 void assembleBoundaryIntersectionMatrixPattern(const Intersection& intersection, LocalPattern& localPattern)
95 {
96 if (not domain_.contains(intersection))
97 return;
98 localPattern.addAll();
99 }
100
101 template<class LocalMatrix>
102 void assembleBoundaryIntersectionMatrix(const Intersection& intersection, LocalMatrix& localMatrix)
103 {
104 using namespace Dune::Indices;
105 using namespace Dune::Fufem::Forms::Impl::Tensor;
106
107 if (not domain_.contains(intersection))
108 return;
109
110 sumLocalOperator_.bind(intersection, *insidePtr_, *insidePtr_);
111
112 auto facet = intersection.indexInInside();
113
114 const auto& geometry = intersection.geometry();
115
116 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
117 cacheManager_[FacetKey(quadratureHint_(op.quadratureRuleKey()), facet)].invalidate();
118 });
119
120 // Lift rank by 2 to prepend zero indices for inside
121 auto localTensor = LiftRank(TensorView(localMatrix, _2), _2);
122
123 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
124 auto& cacheForRule = cacheManager_[FacetKey(quadratureHint_(op.quadratureRuleKey()), facet)];
125 op.bindToCaches(cacheForRule);
126 const auto& quadRule = cacheForRule.rule();
127 for (auto k : Dune::range(quadRule.size()))
128 {
129 const auto& quadPoint = quadRule[k];
130 auto quadPointPositionInFacet = intersection.geometryInInside().local(quadPoint.position());
131 const auto integrationWeight = quadPoint.weight() * geometry.integrationElement(quadPointPositionInFacet);
132 axpy(integrationWeight, op(k), localTensor);
133 }
134 });
135 }
136
137 // Dune::Fufem interface
138
146 template<class TestLocalView, class AnsatzLocalView>
147 void preprocess(const TestLocalView& testLocalView, const AnsatzLocalView& ansatzLocalView)
148 {
149 cacheManager_.clear();
150 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView(), ansatzLocalView.rootLocalView());
151 sumLocalOperator_.registerCaches(cacheManager_.prototype());
152 insidePtr_ = &testLocalView.element();
153 }
154
155 template<class LocalMatrix, class TestLocalView, class AnsatzLocalView>
156 void operator()(const Element& element, LocalMatrix& localMatrix, const TestLocalView& testSubspaceLocalView, const AnsatzLocalView& ansatzSubspaceLocalView)
157 {
158 bool processElement = true;
159 if constexpr (requires{domain_.containsFaceOf(element);})
160 processElement = domain_.containsFaceOf(element);
161 if (processElement)
162 {
163 bindElement(element);
164 const auto& gridView = testSubspaceLocalView.globalBasis().rootBasis().gridView();
165 for(const auto& intersection : intersections(gridView, element))
166 if (intersection.boundary() && !intersection.neighbor())
167 assembleBoundaryIntersectionMatrix(intersection, localMatrix);
168 }
169 }
170
171 private:
172 const BilinearOperator sumOperator_;
173 mutable LocalOperator sumLocalOperator_;
174 const Element* insidePtr_ = nullptr;
176 const Domain& domain_;
177 QuadratureHint quadratureHint_;
178 };
179
180 template<class BilinearOperator, class Domain>
182
183
184
185 template<class BilinearOperator, class Domain, class QuadratureHint>
186 struct IsLocalAssembler<IntegratedBoundaryBilinearForm<BilinearOperator, Domain, QuadratureHint>> : public std::true_type {};
187
188
189
190} // namespace Dune::Fufem::Forms
191
192
193#endif // DUNE_FUFEM_FORMS_INTEGRATEDBOUNDARYBILINEARFORM_HH
Definition baseclass.hh:22
Local assembler corresponding to a boundary bilinear form.
Definition integratedboundarybilinearform.hh:45
void bindElement(const Element &element)
Definition integratedboundarybilinearform.hh:90
IntegratedBoundaryBilinearForm(const BilinearOperator &sumOperator, const Domain &domain)
Definition integratedboundarybilinearform.hh:70
void bindLocalViews(const TestRootLocalView &testLocalView, const AnsatzRootLocalView &ansatzLocalView)
Definition integratedboundarybilinearform.hh:82
IntegratedBoundaryBilinearForm(const BilinearOperator &sumOperator, const Domain &domain, QuadratureHint quadratureHint)
Definition integratedboundarybilinearform.hh:63
void assembleBoundaryIntersectionMatrixPattern(const Intersection &intersection, LocalPattern &localPattern)
Definition integratedboundarybilinearform.hh:94
typename LocalOperator::Intersection Intersection
Definition integratedboundarybilinearform.hh:61
void assembleBoundaryIntersectionMatrix(const Intersection &intersection, LocalMatrix &localMatrix)
Definition integratedboundarybilinearform.hh:102
typename LocalOperator::Element Element
Definition integratedboundarybilinearform.hh:60
void operator()(const Element &element, LocalMatrix &localMatrix, const TestLocalView &testSubspaceLocalView, const AnsatzLocalView &ansatzSubspaceLocalView)
Definition integratedboundarybilinearform.hh:156
const BilinearOperator & integrandOperator() const
Definition integratedboundarybilinearform.hh:75
void preprocess(const TestLocalView &testLocalView, const AnsatzLocalView &ansatzLocalView)
Register local views.
Definition integratedboundarybilinearform.hh:147
Definition localsumassembler.hh:80
A cache providing multiple versions for different quadrature rules.
Definition shapefunctioncache.hh:464
T forward(T... args)