12#ifndef DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_LOCAL_RESIDUAL_HH
13#define DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_LOCAL_RESIDUAL_HH
15#include <dune/common/hybridutilities.hh>
16#include <dune/geometry/quadraturerules.hh>
20#include <dumux/common/concepts/variables_.hh>
21#include <dumux/common/typetraits/localdofs_.hh>
40template<
class P,
class FVG,
class EV,
class IPD>
42 std::declval<P>().source(std::declval<FVG>(), std::declval<EV>(), std::declval<IPD>())
45template<
class P,
class FVG,
class EV,
class IPD>
47{
return Dune::Std::is_detected<SourceWithIpDataInterface, P, FVG, EV, IPD>::value; }
55template<
class TypeTag>
63 using GridVariablesCache = Concept::GridVariablesCache_t<GridVariables>;
64 using ElementVariables =
typename GridVariablesCache::LocalView;
65 using Variables = Concept::Variables_t<GridVariables>;
70 using ElementDiscretization =
typename GridGeometry::LocalView;
71 using SubControlVolume =
typename ElementDiscretization::SubControlVolume;
72 using SubControlVolumeFace =
typename ElementDiscretization::SubControlVolumeFace;
73 using GridView =
typename GridGeometry::GridView;
74 using Element =
typename GridView::template Codim<0>::Entity;
84 static constexpr auto dim = GridView::dimension;
86 using LocalBasis =
typename GridGeometry::FeCache::FiniteElementType::Traits::LocalBasisType;
87 using GlobalPosition =
typename Element::Geometry::GlobalCoordinate;
97 using ParentType::ParentType;
110 const ElementDiscretization& elemDisc,
111 const SubControlVolume& scv,
112 const Variables& vars,
113 const bool isPreviousStorage)
const
115 return problem.density(elemDisc.element(), elemDisc, ipData(elemDisc, scv), isPreviousStorage) * vars.velocity();
128 const ElementVariables& elemVars,
129 const SubControlVolume& scv,
130 bool isPreviousTimeLevel)
const
132 const auto& vars = elemVars[scv];
134 NumEqVector storage = this->asImp().problem().density(elemDisc.element(), elemDisc, ipData(elemDisc, scv), isPreviousTimeLevel)
137 storage *= Extrusion::volume(elemDisc, scv) * vars.extrusionFactor();
154 const Element& element,
155 const ElementDiscretization& elemDisc,
156 const ElementVariables& elemVars,
157 const SubControlVolume& scv)
const
163 source = problem.source(elemDisc, elemVars, ipData(elemDisc, scv.center()));
167 if (!problem.pointSourceMap().empty())
168 source += problem.scvPointSources(element, elemDisc, elemVars, scv);
171 source = ParentType::computeSource(problem, element, elemDisc, elemVars, scv);
175 const auto& data = ipData(elemDisc, scv);
176 source += problem.density(element, elemDisc, data) * problem.gravity();
186 const auto r = scv.center()[Extrusion::radialAxis] -
gridDiscretization.bBoxMin()[Extrusion::radialAxis];
190 source[Extrusion::radialAxis] += -2.0*problem.effectiveViscosity(element, elemDisc, data)
191 * elemVars[scv].velocity(Extrusion::radialAxis) / (r*r);
196 source[Extrusion::radialAxis] += problem.pressure(element, elemDisc, data)/r;
211 const ElementVariables& elemVars,
212 const SubControlVolume& scv)
const
216 const auto& problem = this->asImp().problem();
218 NumEqVector source(0.0);
221 source += qpData.weight() * (problem.source(elemDisc, elemVars, qpData.ipData())
222 + problem.density(elemDisc.element(), elemDisc, qpData.ipData()) * problem.gravity());
225 source *= elemVars[scv].extrusionFactor();
228 const auto& pointSources = problem.pointSources();
229 if (!pointSources.empty())
230 for (
const auto& context : pointSources.contexts(elemDisc, scv))
232 auto psValues = pointSources.eval(elemDisc, elemVars, context);
249 template<
class ElementFluxVariablesCache>
251 const Element& element,
252 const ElementDiscretization& elemDisc,
253 const ElementVariables& elemVars,
254 const SubControlVolumeFace& scvf,
255 const ElementFluxVariablesCache& elemFluxVarsCache)
const
258 FluxContext context(problem, elemDisc, elemVars, elemFluxVarsCache, scvf);
259 FluxHelper fluxHelper;
261 NumEqVector flux(0.0);
277 const ElementVariables& elemVars,
278 const SubControlVolumeFace& scvf)
const
280 const auto& problem = this->asImp().problem();
281 const auto& element = elemDisc.element();
283 NumEqVector flux(0.0);
284 GlobalPosition velocityIntegral(0.0);
287 const auto& faceIpData = qpData.ipData();
288 const auto& ipCache = cache(elemVars, faceIpData);
289 if (problem.enableInertiaTerms())
292 const auto&
normal = faceIpData.unitOuterNormal();
298 if (problem.enableInertiaTerms())
302 static const bool upwindMomentumDensity =
getParamFromGroup<bool>(problem.paramGroup(),
"Flux.UpwindMomentumDensity",
true);
304 const auto& insideScv = elemDisc.scv(scvf.insideScvIdx());
305 const auto& outsideScv = elemDisc.scv(scvf.outsideScvIdx());
306 const auto& insideVars = elemVars[insideScv];
307 const auto& outsideVars = elemVars[outsideScv];
308 const bool insideIsUpwind = velocityIntegral*scvf.unitOuterNormal() > 0;
309 const auto faceIpData = ipData(elemDisc, scvf);
311 GlobalPosition momentum(0.0);
312 if (upwindMomentumDensity)
315 const GlobalPosition insideMomentum = problem.density(element, elemDisc, ipData(elemDisc, insideScv))*insideVars.velocity();
316 const GlobalPosition outsideMomentum = problem.density(element, elemDisc, ipData(elemDisc, outsideScv))*outsideVars.velocity();
317 const auto& upwindMomentum = insideIsUpwind ? insideMomentum : outsideMomentum;
318 const auto& downwindMomentum = insideIsUpwind ? outsideMomentum : insideMomentum;
319 momentum = upwindWeight*upwindMomentum + (1.0 - upwindWeight)*downwindMomentum;
323 const auto& upwindVelocity = insideIsUpwind ? insideVars.velocity() : outsideVars.velocity();
324 const auto& downwindVelocity = insideIsUpwind ? outsideVars.velocity() : insideVars.velocity();
326 const Scalar density = problem.density(element, elemDisc, faceIpData);
327 momentum = density*(upwindWeight*upwindVelocity + (1.0 - upwindWeight)*downwindVelocity);
330 const auto momentumAtIp = [&](
const auto&,
const auto&,
const auto&) {
return momentum; };
331 const auto transportingVelocity = [&](
const auto&,
const auto&,
const auto&) {
return velocityIntegral; };
333 .umv(scvf.unitOuterNormal(), flux);
336 flux *= elemVars[elemDisc.scv(scvf.insideScvIdx())].extrusionFactor();
342 const Problem& problem,
343 const Element& element,
344 const ElementDiscretization& elemDisc,
345 const ElementVariables& elemVars,
346 bool isPreviousTimeLevel)
const
352 const Problem& problem,
353 const Element& element,
354 const ElementDiscretization& elemDisc,
355 const ElementVariables& elemVars)
const
358 residual, problem, elemDisc, elemVars
Boundary flag to store e.g. in sub control volume faces.
An interpolation point related to an element that includes global and local positions.
Definition cvfe/interpolationpointdata.hh:31
Momentum flux of the Navier-Stokes equations for control-volume finite element schemes,...
Definition flux.hh:245
static GlobalPosition velocity(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const IpData &ipData)
Definition flux.hh:265
static PressureTensor pressureFluxTerm(const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const IpData &ipData)
Definition flux.hh:392
static Tensor advectiveFluxTerm(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const IpData &ipData, const TransportedMomentum &transportedMomentum, const TransportingVelocity &transportingVelocity)
Definition flux.hh:411
static Tensor diffusiveFluxTerm(const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const IpData &ipData)
Definition flux.hh:337
Element-wise calculation of the Navier-Stokes residual for models using CVFE discretizations.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:58
NumEqVector computeSource(const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolume &scv) const
Calculate the source term of the equation.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:153
NumEqVector computeStorage(const Problem &problem, const ElementDiscretization &elemDisc, const SubControlVolume &scv, const Variables &vars, const bool isPreviousStorage) const
Calculate the storage term of the equation.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:109
NumEqVector sourceIntegral(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolume &scv) const
Calculate the source integral.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:210
void addToElementStorage(ElementResidualVector &storage, const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, bool isPreviousTimeLevel) const
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:341
NumEqVector computeFlux(const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolumeFace &scvf, const ElementFluxVariablesCache &elemFluxVarsCache) const
Evaluates the mass flux over a face of a sub control volume.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:250
typename ParentType::ElementResidualVector ElementResidualVector
Use the parent type's constructor.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:96
NumEqVector storageIntegral(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolume &scv, bool isPreviousTimeLevel) const
Calculate the storage integral.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:127
NumEqVector fluxIntegral(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolumeFace &scvf) const
Calculates the flux integral over a sub control volume face.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:276
void addToElementFluxAndSourceResidual(ElementResidualVector &residual, const Problem &problem, const Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars) const
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:351
Helper class for evaluating FE-based local residuals.
Definition momentum/cvfe/felocalresidual.hh:32
static void addStorageTerms(ResidualVector &storage, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const bool isPreviousTimeLevel)
Add the storage of non-CV local dofs at one time level.
Definition momentum/cvfe/felocalresidual.hh:46
static void addFluxAndSourceTerms(ResidualVector &residual, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars)
Add flux and source residual contribution for non-CV local dofs.
Definition momentum/cvfe/felocalresidual.hh:100
The flux variables class for the Navier-Stokes model using control-volume finite element schemes.
Definition flux.hh:97
NumEqVector advectiveMomentumFlux(const Context &context) const
Returns the advective momentum flux.
Definition flux.hh:119
NumEqVector diffusiveMomentumFlux(const Context &context) const
Returns the diffusive momentum flux due to viscous forces.
Definition flux.hh:168
NumEqVector pressureContribution(const Context &context) const
Definition flux.hh:207
Context for computing fluxes.
Definition flux.hh:45
Defines all properties used in Dumux.
Classes representing interpolation point data for control-volume finite element schemes.
The default local operator than can be specialized for each discretization scheme.
Helper classes to compute the integration elements.
Shape functions and gradients at an interpolation point.
The flux variables class for the Navier-Stokes model using control-volume finite element schemes.
Type traits for classes providing a grid discretization.
typename NumEqVectorTraits< PrimaryVariables >::type NumEqVector
A vector with the same size as numbers of equations This is the default implementation and has to be ...
Definition numeqvector.hh:34
Vector normal(const Vector &v)
Create a vector normal to the given one (v is expected to be non-zero).
Definition normal.hh:26
T getParamFromGroup(Args &&... args)
A free function to get a parameter from the parameter tree singleton with a model group.
Definition parameters.hh:165
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
The available discretization methods in Dumux.
Helper functions for assembling FE-based local residuals.
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:160
Definition cvfelocalresidual.hh:25
decltype( std::declval< P >().source(std::declval< FVG >(), std::declval< EV >(), std::declval< IPD >())) SourceWithIpDataInterface
helper struct detecting if a problem has new source interface
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:41
constexpr bool hasProblemSourceWithIpDataInterface()
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:46
constexpr bool isRotationalExtrusion
Convenience trait to check whether the extrusion is rotational.
Definition extrusion.hh:263
typename Detail::DiscretizationDefaultLocalOperator< TypeTag >::type DiscretizationDefaultLocalOperator
Definition defaultlocaloperator.hh:26
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
A helper to deduce a vector with the same size as numbers of equations.
Quadrature rules over sub-control volumes and sub-control volume faces.