Dune-Fufem 2.11
Loading...
Searching...
No Matches
integratedboundarylinearform.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_INTEGRATEDBOUNDARYLINEARFORM_HH
8#define DUNE_FUFEM_FORMS_INTEGRATEDBOUNDARYLINEARFORM_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 LinearOperator, class Domain, class QuadratureHint=Dune::Fufem::Forms::QuadratureHints::KeepOrder>
45 {
47 using TestRootLocalView = typename TestRootBasis::LocalView;
48 using TestRootTree = typename TestRootLocalView::Tree;
49
50 using LocalOperator = decltype(localOperator(std::declval<LinearOperator>()));
51
53
54 public:
55
56 using Element = typename LocalOperator::Element;
57 using Intersection = typename LocalOperator::Intersection;
58
59 IntegratedBoundaryLinearForm(const LinearOperator& sumOperator, const Domain& domain, QuadratureHint quadratureHint)
60 : sumOperator_(sumOperator)
61 , sumLocalOperator_(localOperator(sumOperator_))
62 , domain_(domain)
63 , quadratureHint_(quadratureHint)
64 {}
65
66 IntegratedBoundaryLinearForm(const LinearOperator& sumOperator, const Domain& domain)
68 : IntegratedBoundaryLinearForm(sumOperator, domain, QuadratureHint{})
69 {}
70
72 {
73 return sumOperator_;
74 }
75
76 // Dune::Assembler interface
77
78 void bindLocalView(const TestRootLocalView& testLocalView)
79 {
80 cacheManager_.clear();
81 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
82 sumLocalOperator_.registerCaches(cacheManager_.prototype());
83 insidePtr_ = &testLocalView.element();
84 }
85
86 void bindElement (const Element& element)
87 {}
88
89 template<class LocalVector>
90 void assembleBoundaryIntersectionVector(const Intersection& intersection, LocalVector& localVector)
91 {
92 using namespace Dune::Indices;
93 using namespace Dune::Fufem::Forms::Impl::Tensor;
94
95 if (not domain_.contains(intersection))
96 return;
97
98 sumLocalOperator_.bind(intersection, *insidePtr_, *insidePtr_);
99
100 auto facet = intersection.indexInInside();
101
102 const auto& geometry = intersection.geometry();
103
104 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
105 cacheManager_[FacetKey(quadratureHint_(op.quadratureRuleKey()), facet)].invalidate();
106 });
107
108 // Lift rank by 1 to prepend zero index for inside
109 auto localTensor = LiftRank(TensorView(localVector, _1), _1);
110
111 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
112 auto& cacheForRule = cacheManager_[FacetKey(quadratureHint_(op.quadratureRuleKey()), facet)];
113 op.bindToCaches(cacheForRule);
114 const auto& quadRule = cacheForRule.rule();
115 for (auto k : Dune::range(quadRule.size()))
116 {
117 const auto& quadPoint = quadRule[k];
118 auto quadPointPositionInFacet = intersection.geometryInInside().local(quadPoint.position());
119 const auto integrationWeight = quadPoint.weight() * geometry.integrationElement(quadPointPositionInFacet);
120 axpy(integrationWeight, op(k), localTensor);
121 }
122 });
123 }
124
125 // Dune::Fufem interface
126
137 template<class TestLocalView>
138 [[deprecated("This method will be removed after 2.11. Use the local interface of dune-assembler instead")]]
139 void preprocess(const TestLocalView& testLocalView)
140 {
141 cacheManager_.clear();
142 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
143 sumLocalOperator_.registerCaches(cacheManager_.prototype());
144 insidePtr_ = &testLocalView.element();
145 }
146
151 template<class LocalVector, class TestLocalView>
152 [[deprecated("This method will be removed after 2.11. Use the local interface of dune-assembler instead")]]
153 void operator()(const Element& element, LocalVector& localVector, const TestLocalView& testSubspaceLocalView)
154 {
155 bool processElement = true;
156 if constexpr (requires{domain_.containsFaceOf(element);})
157 processElement = domain_.containsFaceOf(element);
158 if (processElement)
159 {
160 bindElement(element);
161 const auto& gridView = testSubspaceLocalView.globalBasis().rootBasis().gridView();
162 for(const auto& intersection : intersections(gridView, element))
163 if (intersection.boundary() && !intersection.neighbor())
164 assembleBoundaryIntersectionVector(intersection, localVector);
165 }
166 }
167
168 private:
169 const LinearOperator sumOperator_;
170 LocalOperator sumLocalOperator_;
171 const Element* insidePtr_ = nullptr;
173 const Domain& domain_;
174 QuadratureHint quadratureHint_;
175 };
176
177 template<class LinearOperator, class Domain>
179
180
181
182 template<class LinearOperator, class Domain, class QuadratureHint>
184
185
186
187} // namespace Dune::Fufem::Forms
188
189
190#endif // DUNE_FUFEM_FORMS_INTEGRATEDBOUNDARYLINEARFORM_HH
Local assembler corresponding to a boundary linear form.
Definition integratedboundarylinearform.hh:45
void bindElement(const Element &element)
Definition integratedboundarylinearform.hh:86
typename LocalOperator::Element Element
Definition integratedboundarylinearform.hh:56
void preprocess(const TestLocalView &testLocalView)
Register local view.
Definition integratedboundarylinearform.hh:139
IntegratedBoundaryLinearForm(const LinearOperator &sumOperator, const Domain &domain)
Definition integratedboundarylinearform.hh:66
void operator()(const Element &element, LocalVector &localVector, const TestLocalView &testSubspaceLocalView)
Definition integratedboundarylinearform.hh:153
const LinearOperator & integrandOperator() const
Definition integratedboundarylinearform.hh:71
IntegratedBoundaryLinearForm(const LinearOperator &sumOperator, const Domain &domain, QuadratureHint quadratureHint)
Definition integratedboundarylinearform.hh:59
void bindLocalView(const TestRootLocalView &testLocalView)
Definition integratedboundarylinearform.hh:78
void assembleBoundaryIntersectionVector(const Intersection &intersection, LocalVector &localVector)
Definition integratedboundarylinearform.hh:90
typename LocalOperator::Intersection Intersection
Definition integratedboundarylinearform.hh:57
A cache providing multiple versions for different quadrature rules.
Definition shapefunctioncache.hh:467
T forward(T... args)
Definition baseclass.hh:22
Definition localsumassembler.hh:80