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 FVElementGeometry =
typename GridGeometry::LocalView;
71 using SubControlVolume =
typename FVElementGeometry::SubControlVolume;
72 using SubControlVolumeFace =
typename FVElementGeometry::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 FVElementGeometry& fvGeometry,
111 const SubControlVolume& scv,
112 const Variables& vars,
113 const bool isPreviousStorage)
const
115 return problem.density(fvGeometry.element(), fvGeometry, ipData(fvGeometry, 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(fvGeometry.element(), fvGeometry, ipData(fvGeometry, scv), isPreviousTimeLevel)
137 storage *= Extrusion::volume(fvGeometry, scv) * vars.extrusionFactor();
154 const Element& element,
155 const FVElementGeometry& fvGeometry,
156 const ElementVariables& elemVars,
157 const SubControlVolume& scv)
const
163 source = problem.source(fvGeometry, elemVars, ipData(fvGeometry, scv.center()));
167 if (!problem.pointSourceMap().empty())
168 source += problem.scvPointSources(element, fvGeometry, elemVars, scv);
171 source = ParentType::computeSource(problem, element, fvGeometry, elemVars, scv);
175 const auto& data = ipData(fvGeometry, scv);
176 source += problem.density(element, fvGeometry, data) * problem.gravity();
185 const auto& gridDiscretization = Deprecated::gridGeometry(fvGeometry);
186 const auto r = scv.center()[Extrusion::radialAxis] - gridDiscretization.bBoxMin()[Extrusion::radialAxis];
190 source[Extrusion::radialAxis] += -2.0*problem.effectiveViscosity(element, fvGeometry, data)
191 * elemVars[scv].velocity(Extrusion::radialAxis) / (r*r);
196 source[Extrusion::radialAxis] += problem.pressure(element, fvGeometry, 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(fvGeometry, elemVars, qpData.ipData())
222 + problem.density(fvGeometry.element(), fvGeometry, 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(fvGeometry, scv))
232 auto psValues = pointSources.eval(fvGeometry, elemVars, context);
249 template<
class ElementFluxVariablesCache>
251 const Element& element,
252 const FVElementGeometry& fvGeometry,
253 const ElementVariables& elemVars,
254 const SubControlVolumeFace& scvf,
255 const ElementFluxVariablesCache& elemFluxVarsCache)
const
258 FluxContext context(problem, fvGeometry, 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();
282 NumEqVector flux(0.0);
283 GlobalPosition velIntegral(0.0);
284 FluxFunctionHelper fluxFunctionHelper;
289 const auto& ipCache = cache(elemVars, qpData.ipData());
290 FluxFunctionContext context(this->problem(), fvGeometry, elemVars, ipCache);
292 velIntegral += context.velocity() * qpData.weight();
298 flux *= elemVars[fvGeometry.scv(scvf.insideScvIdx())].extrusionFactor();
304 const Problem& problem,
305 const Element& element,
306 const FVElementGeometry& fvGeometry,
307 const ElementVariables& prevElemVolVars,
308 const ElementVariables& curElemVolVars)
const
311 residual, problem, fvGeometry, prevElemVolVars, curElemVolVars, this->timeLoop().timeStepSize()
316 const Problem& problem,
317 const Element& element,
318 const FVElementGeometry& fvGeometry,
319 const ElementVariables& elemVars)
const
322 residual, problem, fvGeometry, 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
Element-wise calculation of the Navier-Stokes residual for models using CVFE discretizations.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:58
NumEqVector sourceIntegral(const FVElementGeometry &fvGeometry, const ElementVariables &elemVars, const SubControlVolume &scv) const
Calculate the source integral.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:210
NumEqVector computeSource(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVariables &elemVars, const SubControlVolume &scv) const
Calculate the source term of the equation.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:153
NumEqVector computeFlux(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, 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
NumEqVector fluxIntegral(const FVElementGeometry &fvGeometry, 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
NumEqVector computeStorage(const Problem &problem, const FVElementGeometry &fvGeometry, 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
void addToElementStorageResidual(ElementResidualVector &residual, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVariables &prevElemVolVars, const ElementVariables &curElemVolVars) const
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:303
typename ParentType::ElementResidualVector ElementResidualVector
Use the parent type's constructor.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:96
NumEqVector storageIntegral(const FVElementGeometry &fvGeometry, const ElementVariables &elemVars, const SubControlVolume &scv, bool isPreviousTimeLevel) const
Calculate the storage integral.
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:127
void addToElementFluxAndSourceResidual(ElementResidualVector &residual, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVariables &elemVars) const
Definition freeflow/navierstokes/momentum/cvfe/localresidual.hh:315
Helper class for evaluating FE-based local residuals.
Definition felocalresidual.hh:31
static void addFluxAndSourceTerms(ResidualVector &residual, const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVariables &elemVars)
Add flux and source residual contribution for non-CV local dofs.
Definition felocalresidual.hh:106
static void addStorageTerms(ResidualVector &residual, const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVariables &prevElemVars, const ElementVariables &curElemVars, const Scalar timeStepSize)
Add storage residual contribution for non-CV local dofs.
Definition felocalresidual.hh:46
The flux variables class for the Navier-Stokes model using control-volume finite element schemes.
Definition flux.hh:178
NumEqVector advectiveMomentumFlux(const Context &context) const
Returns the advective momentum flux.
Definition flux.hh:196
NumEqVector diffusiveMomentumFlux(const Context &context) const
Returns the diffusive momentum flux due to viscous forces.
Definition flux.hh:230
NumEqVector pressureContribution(const Context &context) const
Definition flux.hh:269
Context for computing fluxes.
Definition flux.hh:39
The flux function class for the Navier-Stokes model using control-volume finite element schemes.
Definition flux.hh:299
NumEqVector pressureFluxIntegrand(const Context &context, const IpData &ipData) const
Definition flux.hh:372
NumEqVector diffusiveMomentumFluxIntegrand(const Context &context, const IpData &ipData) const
Returns the diffusive momentum flux due to viscous forces.
Definition flux.hh:345
NumEqVector advectiveMomentumFluxIntegral(const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVariables &elemVars, const SubControlVolumeFace &scvf, const VelocityVector &integratedVelocity) const
Returns the advective momentum flux contribution for a given integrated velocity at the face.
Definition flux.hh:318
Context for interpolating data on interpolation points.
Definition flux.hh:99
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.
Helper functions for assembling FE-based local residuals.
Shape functions and gradients at an interpolation point.
The flux variables class for the Navier-Stokes model using control-volume finite element schemes.
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
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition propertysystem.hh:296
The available discretization methods in Dumux.
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
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.