Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
integratedlinearform.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_INTEGRATEDLINEARFORM_HH
8#define DUNE_FUFEM_FORMS_INTEGRATEDLINEARFORM_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 LinearOperator, 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
51 using LocalOperator = decltype(localOperator(std::declval<LinearOperator>()));
52
53 public:
54 using Element = typename LinearOperator::Element;
55
56 IntegratedLinearForm(const LinearOperator& sumOperator, const Domain& domain, QuadratureHint quadratureHint)
57 : sumOperator_(sumOperator)
58 , sumLocalOperator_(localOperator(sumOperator_))
59 , domain_(domain)
60 , quadratureHint_(quadratureHint)
61 {}
62
63 IntegratedLinearForm(const LinearOperator& sumOperator, const Domain& domain)
65 : IntegratedLinearForm(sumOperator, domain, QuadratureHint{})
66 {}
67
68 IntegratedLinearForm(const LinearOperator& sumOperator, QuadratureHint quadratureHint)
70 : IntegratedLinearForm(sumOperator, Dune::Fufem::Forms::bulk, quadratureHint)
71 {}
72
77
79 {
80 return sumOperator_;
81 }
82
83 // Dune::Assembler interface
84
85 void bindLocalView (const TestRootLocalView& testLocalView)
86 {
87 cacheManager_.clear();
88 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
89 sumLocalOperator_.registerCaches(cacheManager_.prototype());
90 }
91
92 void bindElement (const Element& element)
93 {}
94
95 template <class LocalVector>
96 void assembleElementVector (const Element& element, LocalVector& localVector)
97 {
98 using namespace Dune::Indices;
99 using namespace Dune::Fufem::Forms::Impl::Tensor;
100
101 if (not domain_.contains(element))
102 return;
103 sumLocalOperator_.bind(element);
104
105 const auto& geometry = element.geometry();
106
107 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
108 cacheManager_[op.quadratureRuleKey()].invalidate();
109 cacheManager_[quadratureHint_(op.quadratureRuleKey())].invalidate();
110 });
111
112 // Lift rank by 1 to prepend zero index for inside
113 auto localTensor = LiftRank(TensorView(localVector, _1), _1);
114
115 Impl::forEachTupleEntry(sumLocalOperator_.operators(), [&](auto& op) {
116 auto& cacheForRule = cacheManager_[quadratureHint_(op.quadratureRuleKey())];
117 op.bindToCaches(cacheForRule);
118 const auto& quadRule = cacheForRule.rule();
119 for (auto k : Dune::range(quadRule.size()))
120 {
121 const auto& quadPoint = quadRule[k];
122 const auto integrationWeight = quadPoint.weight() * geometry.integrationElement(quadPoint.position());
123 axpy(integrationWeight, op(k), localTensor);
124 }
125 });
126 }
127
128 // Dune::Fufem interface
129
137 template<class TestLocalView>
138 void preprocess(const TestLocalView& testLocalView)
139 {
140 cacheManager_.clear();
141 sumLocalOperator_.registerLocalViews(testLocalView.rootLocalView());
142 sumLocalOperator_.registerCaches(cacheManager_.prototype());
143 }
144
145 template<class LocalVector, class TestLocalView>
146 void operator()(const Element& element, LocalVector& localVector, const TestLocalView& testSubspaceLocalView)
147 {
148 bindElement(element);
149 assembleElementVector(element, localVector);
150 }
151
152 private:
153 const LinearOperator sumOperator_;
154 LocalOperator sumLocalOperator_;
156 const Domain& domain_;
157 QuadratureHint quadratureHint_;
158 };
159
160 template<class LinearOperator, class Domain>
162
163
164
165 template<class LinearOperator, class Domain, class QuadratureHint>
166 struct IsLocalAssembler<IntegratedLinearForm<LinearOperator, Domain, QuadratureHint>> : public std::true_type {};
167
168
169
170} // namespace Dune::Fufem::Forms
171
172
173#endif // DUNE_FUFEM_FORMS_INTEGRATEDLINEARFORM_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 linear form.
Definition integratedlinearform.hh:46
void operator()(const Element &element, LocalVector &localVector, const TestLocalView &testSubspaceLocalView)
Definition integratedlinearform.hh:146
void preprocess(const TestLocalView &testLocalView)
Register local view.
Definition integratedlinearform.hh:138
IntegratedLinearForm(const LinearOperator &sumOperator, const Domain &domain, QuadratureHint quadratureHint)
Definition integratedlinearform.hh:56
void bindLocalView(const TestRootLocalView &testLocalView)
Definition integratedlinearform.hh:85
IntegratedLinearForm(const LinearOperator &sumOperator, const Domain &domain)
Definition integratedlinearform.hh:63
void bindElement(const Element &element)
Definition integratedlinearform.hh:92
IntegratedLinearForm(const LinearOperator &sumOperator, QuadratureHint quadratureHint)
Definition integratedlinearform.hh:68
IntegratedLinearForm(const LinearOperator &sumOperator)
Definition integratedlinearform.hh:73
void assembleElementVector(const Element &element, LocalVector &localVector)
Definition integratedlinearform.hh:96
typename LinearOperator::Element Element
Definition integratedlinearform.hh:54
const LinearOperator & integrandOperator() const
Definition integratedlinearform.hh:78
Definition localsumassembler.hh:80
A cache providing multiple versions for different quadrature rules.
Definition shapefunctioncache.hh:464
T forward(T... args)