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 FVElementGeometry = 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,
57 localView(assembler.gridGeometry()),
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 FVElementGeometry& fvGeometry,
71 const ElementVariables& curElemVars,
72 const ElementVariables& prevElemVars,
74 const bool elementIsGhost)
75 : assembler_(assembler)
76 , element_(element)
77 , curSol_(curSol)
78 , fvGeometry_(fvGeometry)
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
112 ElementResidualVector evalLocalResidual(const ElementVariables& elemVars) const
113 {
114 if (!assembler().isStationaryProblem())
115 {
117 residual += evalLocalStorageResidual();
118 return residual;
119 }
120 else
121 return evalLocalFluxAndSourceResidual(elemVars);
122 }
123
134
141 ElementResidualVector evalLocalFluxAndSourceResidual(const ElementVariables& elemVars) const
142 {
143 return localResidual_.evalFluxAndSource(element_, fvGeometry_, elemVars);
144 }
145
151 {
152 return localResidual_.evalStorage(element_, fvGeometry_, prevElemVars_, curElemVars_);
153 }
154
160 {
161 // get some references for convenience
162 const auto& element = this->element();
163 const auto& curSol = this->curSol();
164 const auto& prevSol = this->assembler().prevSol();
165 auto&& fvGeometry = this->fvGeometry();
166 auto&& curElemVars = this->curElemVars();
167 auto&& prevElemVars = this->prevElemVars();
168
169 // bind the caches
170 fvGeometry.bind(element);
171
172 if (isImplicit())
173 {
175 if (!this->assembler().isStationaryProblem())
176 prevElemVars.bindElement(element, fvGeometry, this->assembler().prevSol());
177 }
178 else
179 {
180 curElemVars.bindElement(element, fvGeometry, curSol);
181 prevElemVars.bind(element, fvGeometry, prevSol);
182 }
183 }
184
186 const Problem& problem() const
187 { return assembler_.problem(); }
188
190 const Assembler& assembler() const
191 { return assembler_; }
192
194 const Element& element() const
195 { return element_; }
196
198 bool elementIsGhost() const
199 { return elementIsGhost_; }
200
202 const SolutionVector& curSol() const
203 { return curSol_; }
204
206 FVElementGeometry& fvGeometry()
207 { return fvGeometry_; }
208
210 ElementVariables& curElemVars()
211 { return curElemVars_; }
212
214 ElementVariables& prevElemVars()
215 { return prevElemVars_; }
216
219 { return localResidual_; }
220
222 const FVElementGeometry& fvGeometry() const
223 { return fvGeometry_; }
224
226 const ElementVariables& curElemVars() const
227 { return curElemVars_; }
228
230 const ElementVariables& prevElemVars() const
231 { return prevElemVars_; }
232
235 { return localResidual_; }
236
237protected:
238 Implementation& asImp_()
239 { return *static_cast<Implementation*>(this); }
240
241 const Implementation& asImp_() const
242 { return *static_cast<const Implementation*>(this); }
243
244private:
245
246 const Assembler& assembler_;
247 const Element& element_;
248 const SolutionVector& curSol_;
249
250 FVElementGeometry fvGeometry_;
251 ElementVariables curElemVars_;
252 ElementVariables prevElemVars_;
253
254 LocalResidual localResidual_;
255 bool elementIsGhost_;
256};
257
258} // end namespace Dumux::Experimental
259
260#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
GVC GridVariablesCache
export type of the grid variables cache
Definition discretization/gridvariables.hh:33
const Assembler & assembler() const
The assembler.
Definition assembly/localassemblerbase.hh:190
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:226
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:150
void bindLocalViews()
Convenience function bind and prepare all relevant variables required for the evaluation of the local...
Definition assembly/localassemblerbase.hh:159
ElementResidualVector evalLocalResidual(const ElementVariables &elemVars) const
Evaluates the complete local residual for the current element.
Definition assembly/localassemblerbase.hh:112
const ElementVariables & prevElemVars() const
The element variables of the previous time step.
Definition assembly/localassemblerbase.hh:230
typename LocalResidual::ElementResidualVector ElementResidualVector
Definition assembly/localassemblerbase.hh:46
const Element & element() const
The current element.
Definition assembly/localassemblerbase.hh:194
const LocalResidual & localResidual() const
The local residual for the current element.
Definition assembly/localassemblerbase.hh:234
const FVElementGeometry & fvGeometry() const
The finite volume geometry.
Definition assembly/localassemblerbase.hh:222
bool elementIsGhost() const
Returns if element is a ghost entity.
Definition assembly/localassemblerbase.hh:198
Implementation & asImp_()
Definition assembly/localassemblerbase.hh:238
ElementVariables & curElemVars()
The current element variables.
Definition assembly/localassemblerbase.hh:210
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:186
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:141
ElementResidualVector evalLocalFluxAndSourceResidual() const
Convenience function to evaluate the flux and source terms (i.e., the terms without a time derivative...
Definition assembly/localassemblerbase.hh:129
LocalResidual & localResidual()
The local residual for the current element.
Definition assembly/localassemblerbase.hh:218
std::decay_t< decltype(std::declval< Assembler >().localResidual())> LocalResidual
Definition assembly/localassemblerbase.hh:45
const Implementation & asImp_() const
Definition assembly/localassemblerbase.hh:241
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:67
ElementVariables & prevElemVars()
The element variables of the previous time step.
Definition assembly/localassemblerbase.hh:214
FVElementGeometry & fvGeometry()
The element discretization.
Definition assembly/localassemblerbase.hh:206
const SolutionVector & curSol() const
The current solution.
Definition assembly/localassemblerbase.hh:202
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
Definition assembly/assembler.hh:44
Definition common/pdesolver.hh:24