version 3.11-dev
Loading...
Searching...
No Matches
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;
39 using ElementDiscretization = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
40 using GridVariablesCache = typename GridVariables::GridVariablesCache;
41 using ElementVariables = typename GridVariablesCache::LocalView;
42 using Element = typename GridView::template Codim<0>::Entity;
43
44public:
45 using LocalResidual = std::decay_t<decltype(std::declval<Assembler>().localResidual())>;
47
52 const Element& element,
53 const SolutionVector& curSol)
55 element,
56 curSol,
58 localView(assembler.gridVariables().curGridVars()),
59 localView(assembler.gridVariables().prevGridVars()),
61 element.partitionType() == Dune::GhostEntity)
62 {}
63
68 const Element& element,
69 const SolutionVector& curSol,
70 const ElementDiscretization& elemDisc,
71 const ElementVariables& curElemVars,
72 const ElementVariables& prevElemVars,
74 const bool elementIsGhost)
75 : assembler_(assembler)
76 , element_(element)
77 , curSol_(curSol)
78 , elemDisc_(elemDisc)
79 , curElemVars_(curElemVars)
80 , prevElemVars_(prevElemVars)
81 , localResidual_(localResidual)
82 , elementIsGhost_(elementIsGhost)
83 {}
84
88 static constexpr bool isImplicit()
89 { return useImplicitAssembly; }
90
96 {
97 if (!isImplicit())
98 if (this->assembler().isStationaryProblem())
99 DUNE_THROW(Dune::InvalidStateException, "Using explicit jacobian assembler with stationary local residual");
100
101 if (elementIsGhost())
102 return ElementResidualVector(0.0);
103
106 }
107
113 ElementResidualVector evalLocalResidual(const ElementVariables& elemVars) const
114 {
115 if constexpr (requires (const Assembler& a) { a.currentStageWeights(); })
116 {
117 const auto [temporalWeight, spatialWeight] = assembler().currentStageWeights();
118 return evalLocalResidualForStage(elemVars, temporalWeight, spatialWeight);
119 }
120 else if (!assembler().isStationaryProblem())
121 {
123 residual += evalLocalStorageResidual();
124 return residual;
125 }
126 else
127 return evalLocalFluxAndSourceResidual(elemVars);
128 }
129
139 template<class Scalar>
140 ElementResidualVector evalLocalResidualForStage(const ElementVariables& elemVars,
141 Scalar temporalWeight,
142 Scalar spatialWeight) const
143 {
144 auto spatial = evalLocalFluxAndSourceResidual(elemVars);
145 for (auto& r : spatial) r *= spatialWeight;
146
147 auto temporal = localResidual_.evalStorageCurrentLevel(element_, elemDisc_, elemVars);
148 for (auto& r : temporal) r *= temporalWeight;
149
150 spatial += temporal;
151 return spatial;
152 }
153
164
171 ElementResidualVector evalLocalFluxAndSourceResidual(const ElementVariables& elemVars) const
172 {
173 return localResidual_.evalFluxAndSource(element_, elemDisc_, elemVars);
174 }
175
181 {
182 return localResidual_.evalStorage(element_, elemDisc_, prevElemVars_, curElemVars_);
183 }
184
190 {
191 // get some references for convenience
192 const auto& element = this->element();
193 const auto& curSol = this->curSol();
194 const auto& prevSol = this->assembler().prevSol();
195 auto&& elemDisc = this->elemDisc();
196 auto&& curElemVars = this->curElemVars();
197 auto&& prevElemVars = this->prevElemVars();
198
199 // bind the caches
200 elemDisc.bind(element);
201
202 if (isImplicit())
203 {
205 if (!this->assembler().isStationaryProblem())
206 prevElemVars.bindElement(element, elemDisc, this->assembler().prevSol());
207 }
208 else
209 {
210 curElemVars.bindElement(element, elemDisc, curSol);
211 prevElemVars.bind(element, elemDisc, prevSol);
212 }
213 }
214
216 const Problem& problem() const
217 { return assembler_.problem(); }
218
220 const Assembler& assembler() const
221 { return assembler_; }
222
224 const Element& element() const
225 { return element_; }
226
228 bool elementIsGhost() const
229 { return elementIsGhost_; }
230
232 const SolutionVector& curSol() const
233 { return curSol_; }
234
236 ElementDiscretization& elemDisc()
237 { return elemDisc_; }
238
240 ElementVariables& curElemVars()
241 { return curElemVars_; }
242
244 ElementVariables& prevElemVars()
245 { return prevElemVars_; }
246
249 { return localResidual_; }
250
252 const ElementDiscretization& elemDisc() const
253 { return elemDisc_; }
254
256 const ElementVariables& curElemVars() const
257 { return curElemVars_; }
258
260 const ElementVariables& prevElemVars() const
261 { return prevElemVars_; }
262
265 { return localResidual_; }
266
267protected:
268 Implementation& asImp_()
269 { return *static_cast<Implementation*>(this); }
270
271 const Implementation& asImp_() const
272 { return *static_cast<const Implementation*>(this); }
273
274private:
275
276 const Assembler& assembler_;
277 const Element& element_;
278 const SolutionVector& curSol_;
279
280 ElementDiscretization elemDisc_;
281 ElementVariables curElemVars_;
282 ElementVariables prevElemVars_;
283
284 LocalResidual localResidual_;
285 bool elementIsGhost_;
286};
287
288} // end namespace Dumux::Experimental
289
290#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:331
GetPropType< TypeTag, Properties::SolutionVector > SolutionVector
Definition assembly/assembler.hh:96
GVC GridVariablesCache
export type of the grid variables cache
Definition discretization/gridvariables.hh:33
const Assembler & assembler() const
The assembler.
Definition assembly/localassemblerbase.hh:220
static constexpr bool isImplicit()
Returns true if the assembler considers implicit assembly.
Definition assembly/localassemblerbase.hh:88
const ElementVariables & curElemVars() const
The current element variables.
Definition assembly/localassemblerbase.hh:256
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:180
void bindLocalViews()
Convenience function bind and prepare all relevant variables required for the evaluation of the local...
Definition assembly/localassemblerbase.hh:189
ElementResidualVector evalLocalResidual(const ElementVariables &elemVars) const
Evaluates the complete local residual for the current element.
Definition assembly/localassemblerbase.hh:113
LocalAssemblerBase(const Assembler &assembler, const Element &element, const SolutionVector &curSol, const ElementDiscretization &elemDisc, const ElementVariables &curElemVars, const ElementVariables &prevElemVars, const LocalResidual &localResidual, const bool elementIsGhost)
The constructor. General version explicitly expecting each argument.
Definition assembly/localassemblerbase.hh:67
const ElementVariables & prevElemVars() const
The element variables of the previous time step.
Definition assembly/localassemblerbase.hh:260
typename LocalResidual::ElementResidualVector ElementResidualVector
Definition assembly/localassemblerbase.hh:46
const Element & element() const
The current element.
Definition assembly/localassemblerbase.hh:224
const LocalResidual & localResidual() const
The local residual for the current element.
Definition assembly/localassemblerbase.hh:264
ElementDiscretization & elemDisc()
The element discretization.
Definition assembly/localassemblerbase.hh:236
bool elementIsGhost() const
Returns if element is a ghost entity.
Definition assembly/localassemblerbase.hh:228
Implementation & asImp_()
Definition assembly/localassemblerbase.hh:268
const ElementDiscretization & elemDisc() const
The element discretization.
Definition assembly/localassemblerbase.hh:252
ElementVariables & curElemVars()
The current element variables.
Definition assembly/localassemblerbase.hh:240
ElementResidualVector evalLocalResidual() const
Convenience function to evaluate the complete local residual for the current element....
Definition assembly/localassemblerbase.hh:95
LocalAssemblerBase(const Assembler &assembler, const Element &element, const SolutionVector &curSol)
The constructor. Delegates to the general constructor.
Definition assembly/localassemblerbase.hh:51
const Problem & problem() const
The problem.
Definition assembly/localassemblerbase.hh:216
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:171
ElementResidualVector evalLocalFluxAndSourceResidual() const
Convenience function to evaluate the flux and source terms (i.e., the terms without a time derivative...
Definition assembly/localassemblerbase.hh:159
LocalResidual & localResidual()
The local residual for the current element.
Definition assembly/localassemblerbase.hh:248
std::decay_t< decltype(std::declval< Assembler >().localResidual())> LocalResidual
Definition assembly/localassemblerbase.hh:45
const Implementation & asImp_() const
Definition assembly/localassemblerbase.hh:271
ElementVariables & prevElemVars()
The element variables of the previous time step.
Definition assembly/localassemblerbase.hh:244
const SolutionVector & curSol() const
The current solution.
Definition assembly/localassemblerbase.hh:232
ElementResidualVector evalLocalResidualForStage(const ElementVariables &elemVars, Scalar temporalWeight, Scalar spatialWeight) const
Evaluate the stage-weighted residual for multi-stage (e.g. Runge-Kutta) assembly.
Definition assembly/localassemblerbase.hh:140
The element-wise residual for grid-based discretization schemes.
Definition assembly/localresidual.hh:39
ReservedBlockVector< NumEqVector, Dumux::Detail::LocalDofs::maxNumLocalDofs< ElementDiscretization >()> ElementResidualVector
the container storing all element residuals
Definition assembly/localresidual.hh:56
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
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
Definition assembly/assembler.hh:44
Definition common/pdesolver.hh:24