version 3.11-dev
assembly/localassemblerbase.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_LOCAL_ASSEMBLER_BASE_HH
13#define DUMUX_LOCAL_ASSEMBLER_BASE_HH
14
15#include <type_traits>
16#include <utility>
17
18#include <dune/grid/common/gridenums.hh> // for GhostEntity
19
21
22namespace Dumux::Experimental {
23
32template<class TypeTag, class Assembler, class Implementation, bool useImplicitAssembly>
34{
38 using SolutionVector = typename Assembler::SolutionVector;
40 using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
41 using GridVariablesCache = typename GridVariables::GridVariablesCache;
42 using ElementVariables = typename GridVariablesCache::LocalView;
43 using Element = typename GridView::template Codim<0>::Entity;
44
45public:
46 using LocalResidual = std::decay_t<decltype(std::declval<Assembler>().localResidual())>;
48
53 const Element& element,
54 const SolutionVector& curSol)
56 element,
57 curSol,
58 localView(assembler.gridGeometry()),
59 localView(assembler.gridVariables().curGridVars()),
60 localView(assembler.gridVariables().prevGridVars()),
62 element.partitionType() == Dune::GhostEntity)
63 {}
64
69 const Element& element,
70 const SolutionVector& curSol,
71 const FVElementGeometry& fvGeometry,
72 const ElementVariables& curElemVars,
73 const ElementVariables& prevElemVars,
75 const bool elementIsGhost)
76 : assembler_(assembler)
77 , element_(element)
78 , curSol_(curSol)
79 , fvGeometry_(fvGeometry)
80 , curElemVars_(curElemVars)
81 , prevElemVars_(prevElemVars)
82 , localResidual_(localResidual)
83 , elementIsGhost_(elementIsGhost)
84 {}
85
89 static constexpr bool isImplicit()
90 { return useImplicitAssembly; }
91
97 {
98 if (!isImplicit())
99 if (this->assembler().isStationaryProblem())
100 DUNE_THROW(Dune::InvalidStateException, "Using explicit jacobian assembler with stationary local residual");
101
102 if (elementIsGhost())
103 return ElementResidualVector(0.0);
104
107 }
108
113 ElementResidualVector evalLocalResidual(const ElementVariables& elemVars) const
114 {
115 if (!assembler().isStationaryProblem())
116 {
118 residual += evalLocalStorageResidual();
119 return residual;
120 }
121 else
122 return evalLocalFluxAndSourceResidual(elemVars);
123 }
124
131 {
134 }
135
142 ElementResidualVector evalLocalFluxAndSourceResidual(const ElementVariables& elemVars) const
143 {
144 return localResidual_.evalFluxAndSource(element_, fvGeometry_, elemVars, elemBcTypes_);
145 }
146
152 {
153 return localResidual_.evalStorage(element_, fvGeometry_, prevElemVars_, curElemVars_);
154 }
155
161 {
162 // get some references for convenience
163 const auto& element = this->element();
164 const auto& curSol = this->curSol();
165 const auto& prevSol = this->assembler().prevSol();
166 auto&& fvGeometry = this->fvGeometry();
167 auto&& curElemVars = this->curElemVars();
168 auto&& prevElemVars = this->prevElemVars();
169
170 // bind the caches
171 fvGeometry.bind(element);
172
173 if (isImplicit())
174 {
176 if (!this->assembler().isStationaryProblem())
177 prevElemVars.bindElement(element, fvGeometry, this->assembler().prevSol());
178 }
179 else
180 {
181 curElemVars.bindElement(element, fvGeometry, curSol);
182 prevElemVars.bind(element, fvGeometry, prevSol);
183 }
184 }
185
187 const Problem& problem() const
188 { return assembler_.problem(); }
189
191 const Assembler& assembler() const
192 { return assembler_; }
193
195 const Element& element() const
196 { return element_; }
197
199 bool elementIsGhost() const
200 { return elementIsGhost_; }
201
203 const SolutionVector& curSol() const
204 { return curSol_; }
205
207 FVElementGeometry& fvGeometry()
208 { return fvGeometry_; }
209
211 ElementVariables& curElemVars()
212 { return curElemVars_; }
213
215 ElementVariables& prevElemVars()
216 { return prevElemVars_; }
217
220 { return localResidual_; }
221
223 ElementBoundaryTypes& elemBcTypes()
224 { return elemBcTypes_; }
225
227 const FVElementGeometry& fvGeometry() const
228 { return fvGeometry_; }
229
231 const ElementVariables& curElemVars() const
232 { return curElemVars_; }
233
235 const ElementVariables& prevElemVars() const
236 { return prevElemVars_; }
237
239 const ElementBoundaryTypes& elemBcTypes() const
240 { return elemBcTypes_; }
241
244 { return localResidual_; }
245
246protected:
247 Implementation& asImp_()
248 { return *static_cast<Implementation*>(this); }
249
250 const Implementation& asImp_() const
251 { return *static_cast<const Implementation*>(this); }
252
253private:
254
255 const Assembler& assembler_;
256 const Element& element_;
257 const SolutionVector& curSol_;
258
259 FVElementGeometry fvGeometry_;
260 ElementVariables curElemVars_;
261 ElementVariables prevElemVars_;
262 ElementBoundaryTypes elemBcTypes_;
263
264 LocalResidual localResidual_;
265 bool elementIsGhost_;
266};
267
268} // end namespace Dumux::Experimental
269
270#endif
A linear system assembler (residual and Jacobian) for general discretization schemes.
Definition: assembly/assembler.hh:83
const SolutionVector & prevSol() const
The solution of the previous time step.
Definition: assembly/assembler.hh:325
GetPropType< TypeTag, Properties::SolutionVector > SolutionVector
Definition: assembly/assembler.hh:96
const Problem & problem() const
The problem.
Definition: assembly/assembler.hh:297
GVC GridVariablesCache
export type of the grid variables cache
Definition: discretization/gridvariables.hh:33
A base class for all local assemblers.
Definition: assembly/localassemblerbase.hh:34
const Assembler & assembler() const
The assembler.
Definition: assembly/localassemblerbase.hh:191
static constexpr bool isImplicit()
Returns true if the assembler considers implicit assembly.
Definition: assembly/localassemblerbase.hh:89
const ElementVariables & curElemVars() const
The current element variables.
Definition: assembly/localassemblerbase.hh:231
ElementResidualVector evalLocalStorageResidual() const
Convenience function to evaluate storage term (i.e., the term with a time derivative) of the local re...
Definition: assembly/localassemblerbase.hh:151
void bindLocalViews()
Convenience function bind and prepare all relevant variables required for the evaluation of the local...
Definition: assembly/localassemblerbase.hh:160
ElementResidualVector evalLocalResidual(const ElementVariables &elemVars) const
Evaluates the complete local residual for the current element.
Definition: assembly/localassemblerbase.hh:113
const ElementVariables & prevElemVars() const
The element variables of the previous time step.
Definition: assembly/localassemblerbase.hh:235
typename LocalResidual::ElementResidualVector ElementResidualVector
Definition: assembly/localassemblerbase.hh:47
ElementBoundaryTypes & elemBcTypes()
The element's boundary types.
Definition: assembly/localassemblerbase.hh:223
const Element & element() const
The current element.
Definition: assembly/localassemblerbase.hh:195
const ElementBoundaryTypes & elemBcTypes() const
The element's boundary types.
Definition: assembly/localassemblerbase.hh:239
const LocalResidual & localResidual() const
The local residual for the current element.
Definition: assembly/localassemblerbase.hh:243
const FVElementGeometry & fvGeometry() const
The finite volume geometry.
Definition: assembly/localassemblerbase.hh:227
bool elementIsGhost() const
Returns if element is a ghost entity.
Definition: assembly/localassemblerbase.hh:199
Implementation & asImp_()
Definition: assembly/localassemblerbase.hh:247
ElementVariables & curElemVars()
The current element variables.
Definition: assembly/localassemblerbase.hh:211
ElementResidualVector evalLocalResidual() const
Convenience function to evaluate the complete local residual for the current element....
Definition: assembly/localassemblerbase.hh:96
LocalAssemblerBase(const Assembler &assembler, const Element &element, const SolutionVector &curSol)
The constructor. Delegates to the general constructor.
Definition: assembly/localassemblerbase.hh:52
const Problem & problem() const
The problem.
Definition: assembly/localassemblerbase.hh:187
ElementResidualVector evalLocalFluxAndSourceResidual(const ElementVariables &elemVars) const
Evaluates the flux and source terms (i.e., the terms without a time derivative) of the local residual...
Definition: assembly/localassemblerbase.hh:142
ElementResidualVector evalLocalFluxAndSourceResidual() const
Convenience function to evaluate the flux and source terms (i.e., the terms without a time derivative...
Definition: assembly/localassemblerbase.hh:130
LocalResidual & localResidual()
The local residual for the current element.
Definition: assembly/localassemblerbase.hh:219
std::decay_t< decltype(std::declval< Assembler >().localResidual())> LocalResidual
Definition: assembly/localassemblerbase.hh:46
const Implementation & asImp_() const
Definition: assembly/localassemblerbase.hh:250
LocalAssemblerBase(const Assembler &assembler, const Element &element, const SolutionVector &curSol, const FVElementGeometry &fvGeometry, const ElementVariables &curElemVars, const ElementVariables &prevElemVars, const LocalResidual &localResidual, const bool elementIsGhost)
The constructor. General version explicitly expecting each argument.
Definition: assembly/localassemblerbase.hh:68
ElementVariables & prevElemVars()
The element variables of the previous time step.
Definition: assembly/localassemblerbase.hh:215
FVElementGeometry & fvGeometry()
The element discretization.
Definition: assembly/localassemblerbase.hh:207
const SolutionVector & curSol() const
The current solution.
Definition: assembly/localassemblerbase.hh:203
The element-wise residual for grid-based discretization schemes.
Definition: assembly/localresidual.hh:37
ReservedBlockVector< NumEqVector, Dumux::Detail::LocalDofs::maxNumLocalDofs< FVElementGeometry >()> ElementResidualVector
the container storing all element residuals
Definition: assembly/localresidual.hh:55
Defines all properties used in Dumux.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition: localview.hh:26
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition: propertysystem.hh:296
Definition: assembly/assembler.hh:44
Definition: common/pdesolver.hh:24