91 const SubControlVolume& scv,
92 const VolumeVariables& volVars)
const
94 NumEqVector storage(0.0);
96 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
97 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
99 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
100 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
103 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
105 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
107 auto eqIdx = conti0EqIdx + compIdx;
108 if (eqIdx != replaceCompEqIdx)
109 storage[eqIdx] += volVars.porosity()
110 * volVars.saturation(phaseIdx)
111 * massOrMoleDensity(volVars, phaseIdx)
116 if (useTotalMoleOrMassBalance)
117 storage[replaceCompEqIdx] += massOrMoleDensity(volVars, phaseIdx)
119 * volVars.saturation(phaseIdx);
122 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, phaseIdx);
126 EnergyLocalResidual::solidPhaseStorage(storage, scv, volVars);
143 const Element& element,
144 const FVElementGeometry& fvGeometry,
145 const ElementVolumeVariables& elemVolVars,
146 const SubControlVolumeFace& scvf,
147 const ElementFluxVariablesCache& elemFluxVarsCache)
const
149 FluxVariables fluxVars;
150 fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache);
151 static constexpr auto referenceSystemFormulation = FluxVariables::MolecularDiffusionType::referenceSystemFormulation();
153 NumEqVector flux(0.0);
155 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
156 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
158 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
159 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
162 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
164 const auto diffusiveFluxes = fluxVars.molecularDiffusionFlux(phaseIdx);
165 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
168 const auto eqIdx = conti0EqIdx + compIdx;
171 const auto upwindTerm = [&massOrMoleDensity, &
massOrMoleFraction, phaseIdx, compIdx] (
const auto& volVars)
172 {
return massOrMoleDensity(volVars, phaseIdx)*
massOrMoleFraction(volVars, phaseIdx, compIdx)*volVars.mobility(phaseIdx); };
174 if (eqIdx != replaceCompEqIdx)
175 flux[eqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
178 if(eqIdx != replaceCompEqIdx)
182 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx)
183 : diffusiveFluxes[compIdx];
185 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]
186 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
188 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
193 if (useTotalMoleOrMassBalance)
196 const auto upwindTerm = [&massOrMoleDensity, phaseIdx] (
const auto& volVars)
197 {
return massOrMoleDensity(volVars, phaseIdx)*volVars.mobility(phaseIdx); };
199 flux[replaceCompEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
201 for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
205 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx) : diffusiveFluxes[compIdx];
207 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]
208 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
210 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
215 EnergyLocalResidual::heatConvectionFlux(flux, fluxVars, phaseIdx);
217 if constexpr (Deprecated::hasEnableCompositionalDispersion<ModelTraits>())
219 if constexpr (ModelTraits::enableCompositionalDispersion())
223 const auto dispersionFluxes = fluxVars.compositionalDispersionFlux(phaseIdx);
224 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
226 flux[compIdx] += dispersionFluxes[compIdx];
230 DUNE_THROW(Dune::NotImplemented,
"Dispersion Fluxes are only implemented for single phase flows using the Box method.");
238 EnergyLocalResidual::heatConductionFlux(flux, fluxVars);
239 EnergyLocalResidual::heatDispersionFlux(flux, fluxVars);