Dune-Fufem 2.11-git
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
21
22
23
24namespace Dune::Fufem::Forms {
25
26
27
41 template<class LinearOperator, class Domain>
43 {
45 using TestRootLocalView = typename TestRootBasis::LocalView;
46 using TestRootTree = typename TestRootLocalView::Tree;
47
48 using LocalOperator = decltype(localOperator(std::declval<LinearOperator>()));
49
51
52 public:
53
54 using Element = typename LocalOperator::Element;
55 using Intersection = typename LocalOperator::Intersection;
56
57 IntegratedBoundaryLinearForm(const LinearOperator& sumOperator, const Domain& domain) :
58 sumOperator_(sumOperator),
59 sumLocalOperator_(localOperator(sumOperator_)),
60 domain_(domain)
61 {}
62
64 {
65 return sumOperator_;
66 }
67
68 // Dune::Assembler interface
69
70 void bindLocalView(const TestRootLocalView& testLocalView)
71 {
72 cacheManager_.clear();
73 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
74 sumLocalOperator_.registerCaches(cacheManager_.prototype());
75 insidePtr_ = &testLocalView.element();
76 }
77
78 void bindElement (const Element& element)
79 {}
80
81 template<class LocalVector>
82 void assembleBoundaryIntersectionVector(const Intersection& intersection, LocalVector& localVector)
83 {
84 using namespace Dune::Indices;
85 using namespace Dune::Fufem::Forms::Impl::Tensor;
86
87 if (not domain_.contains(intersection))
88 return;
89
90 sumLocalOperator_.bind(intersection, *insidePtr_, *insidePtr_);
91
92 auto facet = intersection.indexInInside();
93
94 const auto& geometry = intersection.geometry();
95
96 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
97 cacheManager_[FacetKey(op.quadratureRuleKey(), facet)].invalidate();
98 });
99
100 // Lift rank by 1 to prepend zero index for inside
101 auto localTensor = LiftRank(TensorView(localVector, _1), _1);
102
103 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
104 auto& cacheForRule = cacheManager_[FacetKey(op.quadratureRuleKey(), facet)];
105 op.bindToCaches(cacheForRule);
106 const auto& quadRule = cacheForRule.rule();
107 for (auto k : Dune::range(quadRule.size()))
108 {
109 const auto& quadPoint = quadRule[k];
110 auto quadPointPositionInFacet = intersection.geometryInInside().local(quadPoint.position());
111 const auto integrationWeight = quadPoint.weight() * geometry.integrationElement(quadPointPositionInFacet);
112 axpy(integrationWeight, op(k), localTensor);
113 }
114 });
115 }
116
117 // Dune::Fufem interface
118
126 template<class TestLocalView>
127 void preprocess(const TestLocalView& testLocalView)
128 {
129 cacheManager_.clear();
130 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
131 sumLocalOperator_.registerCaches(cacheManager_.prototype());
132 insidePtr_ = &testLocalView.element();
133 }
134
135 template<class LocalVector, class TestLocalView>
136 void operator()(const Element& element, LocalVector& localVector, const TestLocalView& testSubspaceLocalView)
137 {
138 bool processElement = true;
139 if constexpr (requires{domain_.containsFaceOf(element);})
140 processElement = domain_.containsFaceOf(element);
141 if (processElement)
142 {
143 bindElement(element);
144 const auto& gridView = testSubspaceLocalView.globalBasis().rootBasis().gridView();
145 for(const auto& intersection : intersections(gridView, element))
146 if (intersection.boundary() && !intersection.neighbor())
147 assembleBoundaryIntersectionVector(intersection, localVector);
148 }
149 }
150
151 private:
152 const LinearOperator sumOperator_;
153 LocalOperator sumLocalOperator_;
154 const Element* insidePtr_ = nullptr;
156 const Domain& domain_;
157 };
158
159
160
161 template<class LinearOperator, class Domain>
163
164
165
166} // namespace Dune::Fufem::Forms
167
168
169#endif // DUNE_FUFEM_FORMS_INTEGRATEDBOUNDARYLINEARFORM_HH
Definition baseclass.hh:22
Local assembler corresponding to a boundary linear form.
Definition integratedboundarylinearform.hh:43
IntegratedBoundaryLinearForm(const LinearOperator &sumOperator, const Domain &domain)
Definition integratedboundarylinearform.hh:57
typename LocalOperator::Intersection Intersection
Definition integratedboundarylinearform.hh:55
void bindLocalView(const TestRootLocalView &testLocalView)
Definition integratedboundarylinearform.hh:70
typename LocalOperator::Element Element
Definition integratedboundarylinearform.hh:54
void assembleBoundaryIntersectionVector(const Intersection &intersection, LocalVector &localVector)
Definition integratedboundarylinearform.hh:82
void operator()(const Element &element, LocalVector &localVector, const TestLocalView &testSubspaceLocalView)
Definition integratedboundarylinearform.hh:136
void bindElement(const Element &element)
Definition integratedboundarylinearform.hh:78
void preprocess(const TestLocalView &testLocalView)
Register local view.
Definition integratedboundarylinearform.hh:127
const LinearOperator & integrandOperator() const
Definition integratedboundarylinearform.hh:63
Definition localsumassembler.hh:80
A cache providing multiple versions for different quadrature rules.
Definition shapefunctioncache.hh:467
T forward(T... args)