88 const SubControlVolume& scv,
89 const VolumeVariables& volVars)
const
91 NumEqVector storage(0.0);
93 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
94 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
96 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
97 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
100 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
102 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
104 auto eqIdx = conti0EqIdx + compIdx;
105 if (eqIdx != replaceCompEqIdx)
106 storage[eqIdx] += volVars.porosity()
107 * volVars.saturation(phaseIdx)
108 * massOrMoleDensity(volVars, phaseIdx)
113 if (useTotalMoleOrMassBalance)
114 storage[replaceCompEqIdx] += massOrMoleDensity(volVars, phaseIdx)
116 * volVars.saturation(phaseIdx);
119 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, phaseIdx);
123 EnergyLocalResidual::solidPhaseStorage(storage, scv, volVars);
140 const Element& element,
141 const FVElementGeometry& fvGeometry,
142 const ElementVolumeVariables& elemVolVars,
143 const SubControlVolumeFace& scvf,
144 const ElementFluxVariablesCache& elemFluxVarsCache)
const
146 FluxVariables fluxVars;
147 fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache);
148 static constexpr auto referenceSystemFormulation = FluxVariables::MolecularDiffusionType::referenceSystemFormulation();
150 NumEqVector flux(0.0);
152 const auto massOrMoleDensity = [](
const auto& volVars,
const int phaseIdx)
153 {
return useMoles ? volVars.molarDensity(phaseIdx) : volVars.density(phaseIdx); };
155 const auto massOrMoleFraction= [](
const auto& volVars,
const int phaseIdx,
const int compIdx)
156 {
return useMoles ? volVars.moleFraction(phaseIdx, compIdx) : volVars.massFraction(phaseIdx, compIdx); };
159 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
161 const auto diffusiveFluxes = fluxVars.molecularDiffusionFlux(phaseIdx);
162 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
165 const auto eqIdx = conti0EqIdx + compIdx;
168 const auto upwindTerm = [&massOrMoleDensity, &
massOrMoleFraction, phaseIdx, compIdx] (
const auto& volVars)
169 {
return massOrMoleDensity(volVars, phaseIdx)*
massOrMoleFraction(volVars, phaseIdx, compIdx)*volVars.mobility(phaseIdx); };
171 if (eqIdx != replaceCompEqIdx)
172 flux[eqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
175 if(eqIdx != replaceCompEqIdx)
179 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx)
180 : diffusiveFluxes[compIdx];
182 flux[eqIdx] += useMoles ? diffusiveFluxes[compIdx]
183 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
185 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
190 if (useTotalMoleOrMassBalance)
193 const auto upwindTerm = [&massOrMoleDensity, phaseIdx] (
const auto& volVars)
194 {
return massOrMoleDensity(volVars, phaseIdx)*volVars.mobility(phaseIdx); };
196 flux[replaceCompEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
198 for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
202 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx) : diffusiveFluxes[compIdx];
204 flux[replaceCompEqIdx] += useMoles ? diffusiveFluxes[compIdx]
205 : diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx);
207 DUNE_THROW(Dune::NotImplemented,
"other reference systems than mass and molar averaged are not implemented");
212 EnergyLocalResidual::heatConvectionFlux(flux, fluxVars, phaseIdx);
216 EnergyLocalResidual::heatConductionFlux(flux, fluxVars);