155 const SubControlVolume& scv,
156 const VolumeVariables& volVars)
const
158 NumEqVector storage(0.0);
161 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
163 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
165 auto eqIdx = conti0EqIdx + phaseIdx*numComponents + compIdx;
166 storage[eqIdx] += volVars.porosity()
167 * volVars.saturation(phaseIdx)
168 * volVars.molarDensity(phaseIdx)
169 * volVars.moleFraction(phaseIdx, compIdx);
172 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, phaseIdx);
175 EnergyLocalResidual::solidPhaseStorage(storage, scv, volVars);
190 const Element& element,
191 const FVElementGeometry& fvGeometry,
192 const ElementVolumeVariables& elemVolVars,
193 const SubControlVolumeFace& scvf,
194 const ElementFluxVariablesCache& elemFluxVarsCache)
const
196 FluxVariables fluxVars;
197 fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache);
198 NumEqVector flux(0.0);
201 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
203 const auto diffusiveFluxes = fluxVars.molecularDiffusionFlux(phaseIdx);
204 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
207 const auto eqIdx = conti0EqIdx + phaseIdx*numComponents + compIdx;
210 const auto upwindTerm = [phaseIdx, compIdx] (
const auto& volVars)
211 {
return volVars.molarDensity(phaseIdx)*volVars.moleFraction(phaseIdx, compIdx)*volVars.mobility(phaseIdx); };
213 flux[eqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
216 if (compIdx == phaseIdx)
220 flux[eqIdx] += diffusiveFluxes[compIdx]/FluidSystem::molarMass(compIdx);
222 flux[eqIdx] += diffusiveFluxes[compIdx];
225 EnergyLocalResidual::heatConvectionFlux(flux, fluxVars, phaseIdx);
229 EnergyLocalResidual::heatConductionFlux(flux, fluxVars);
244 const Element& element,
245 const FVElementGeometry& fvGeometry,
246 const ElementVolumeVariables& elemVolVars,
247 const SubControlVolume &scv)
const
249 NumEqVector source(0.0);
253 const auto& volVars = elemVolVars[scv];
254 std::array<std::array<Scalar, numComponents>, numPhases> componentIntoPhaseMassTransfer = {{{0.0},{0.0}}};
257 const Scalar characteristicLength = volVars.characteristicLength() ;
258 const Scalar factorMassTransfer = volVars.factorMassTransfer() ;
260 const Scalar awn = volVars.interfacialArea(phase0Idx, phase1Idx);
262 for(
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
264 const Scalar sherwoodNumber = volVars.sherwoodNumber(phaseIdx);
266 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
268 if (compIdx <= numPhases)
271 if (phaseIdx == compIdx)
274 const Scalar xNonEquil = volVars.moleFraction(phaseIdx, compIdx);
277 const Scalar xEquil = volVars.xEquil(phaseIdx, compIdx);
279 const Scalar diffCoeff = volVars.diffusionCoefficient(phaseIdx, FluidSystem::getMainComponent(phaseIdx), compIdx);
282 const Scalar compFluxIntoOtherPhase = factorMassTransfer * (xEquil-xNonEquil)/characteristicLength * awn * volVars.molarDensity(phaseIdx) * diffCoeff * sherwoodNumber;
284 componentIntoPhaseMassTransfer[phaseIdx][compIdx] += compFluxIntoOtherPhase;
285 componentIntoPhaseMassTransfer[compIdx][compIdx] -= compFluxIntoOtherPhase;
292 for (
int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
294 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
296 const unsigned int eqIdx = conti0EqIdx + compIdx + phaseIdx*numComponents;
297 source[eqIdx] += componentIntoPhaseMassTransfer[phaseIdx][compIdx];
300 if (!isfinite(source[eqIdx]))
305 if constexpr (ModelTraits::enableThermalNonEquilibrium())
309 EnergyLocalResidual::computeSourceEnergy(source,
317 source += problem.source(element, fvGeometry, elemVolVars, scv);
320 source += problem.scvPointSources(element, fvGeometry, elemVolVars, scv);