90 const SubControlVolume& scv,
91 const VolumeVariables& volVars)
const
93 NumEqVector storage(0.0);
95 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
96 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
98 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
99 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
102 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
104 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
106 auto eqIdx = conti0EqIdx + compIdx;
107 if (eqIdx != replaceCompEqIdx)
108 storage[eqIdx] += volVars.porosity()
109 * volVars.saturation(phaseIdx)
110 * massOrMoleDensity(volVars, phaseIdx)
115 if (useTotalMoleOrMassBalance)
116 storage[replaceCompEqIdx] += massOrMoleDensity(volVars, phaseIdx)
118 * volVars.saturation(phaseIdx);
121 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, phaseIdx);
125 EnergyLocalResidual::solidPhaseStorage(storage, scv, volVars);
142 const Element& element,
143 const FVElementGeometry& fvGeometry,
144 const ElementVolumeVariables& elemVolVars,
145 const SubControlVolumeFace& scvf,
146 const ElementFluxVariablesCache& elemFluxVarsCache)
const
148 FluxVariables fluxVars;
149 fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache);
150 static constexpr auto referenceSystemFormulation = FluxVariables::MolecularDiffusionType::referenceSystemFormulation();
152 NumEqVector flux(0.0);
154 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
155 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
157 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
158 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
161 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
163 const auto diffusiveFluxes = fluxVars.molecularDiffusionFlux(phaseIdx);
164 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
167 const auto eqIdx = conti0EqIdx + compIdx;
170 const auto upwindTerm = [&massOrMoleDensity, &
massOrMoleFraction, phaseIdx, compIdx] (
const auto& volVars)
171 {
return massOrMoleDensity(volVars, phaseIdx)*
massOrMoleFraction(volVars, phaseIdx, compIdx)*volVars.mobility(phaseIdx); };
173 if (eqIdx != replaceCompEqIdx)
174 flux[eqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
177 if(eqIdx != replaceCompEqIdx)
181 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx)
182 : diffusiveFluxes[compIdx];
184 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]
185 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
187 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
192 if (useTotalMoleOrMassBalance)
195 const auto upwindTerm = [&massOrMoleDensity, phaseIdx] (
const auto& volVars)
196 {
return massOrMoleDensity(volVars, phaseIdx)*volVars.mobility(phaseIdx); };
198 flux[replaceCompEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
200 for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
204 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx) : diffusiveFluxes[compIdx];
206 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]
207 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
209 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
214 EnergyLocalResidual::heatConvectionFlux(flux, fluxVars, phaseIdx);
216 if constexpr (ModelTraits::enableCompositionalDispersion())
220 const auto dispersionFluxes = fluxVars.compositionalDispersionFlux(phaseIdx);
221 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
223 flux[compIdx] += dispersionFluxes[compIdx];
227 DUNE_THROW(Dune::NotImplemented,
"Dispersion Fluxes are only implemented for single phase flows using the Box method.");
233 EnergyLocalResidual::heatConductionFlux(flux, fluxVars);
234 EnergyLocalResidual::heatDispersionFlux(flux, fluxVars);