257 FluxVariables& fluxVars,
260 auto upwindTerm = [phaseIdx](
const auto& volVars)
261 {
return volVars.density(phaseIdx)*volVars.mobility(phaseIdx)*volVars.enthalpy(phaseIdx); };
264 flux[energyEq0Idx+phaseIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm);
267 const auto diffusiveFluxes = fluxVars.molecularDiffusionFlux(phaseIdx);
268 const auto& elemVolVars = fluxVars.elemVolVars();
269 const auto& scvf = fluxVars.scvFace();
270 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
271 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
273 for (
int compIdx = 0; compIdx < numComponents; ++compIdx)
276 if (phaseIdx == compIdx)
280 if (diffusiveFluxes[compIdx] > 0)
281 enthalpy += insideVolVars.enthalpy(phaseIdx);
283 enthalpy += outsideVolVars.enthalpy(phaseIdx);
284 flux[energyEq0Idx+phaseIdx] += diffusiveFluxes[compIdx]*FluidSystem::molarMass(compIdx)*enthalpy;
311 const Element& element,
312 const FVElementGeometry& fvGeometry,
313 const ElementVolumeVariables& elemVolVars,
314 const SubControlVolume &scv)
317 const auto &volVars = elemVolVars[scv];
319 const Scalar awn = volVars.interfacialArea(phase0Idx, phase1Idx);
320 const Scalar aws = volVars.interfacialArea(phase0Idx, sPhaseIdx);
321 const Scalar ans = volVars.interfacialArea(phase1Idx, sPhaseIdx);
323 const Scalar Tw = volVars.temperatureFluid(phase0Idx);
324 const Scalar Tn = volVars.temperatureFluid(phase1Idx);
325 const Scalar Ts = volVars.temperatureSolid();
327 const Scalar lambdaWetting = volVars.fluidThermalConductivity(phase0Idx);
328 const Scalar lambdaNonWetting = volVars.fluidThermalConductivity(phase1Idx);
329 const Scalar lambdaSolid = volVars.solidThermalConductivity();
331 const Scalar lambdaWN =
harmonicMean(lambdaWetting, lambdaNonWetting);
332 const Scalar lambdaWS =
harmonicMean(lambdaWetting, lambdaSolid);
333 const Scalar lambdaNS =
harmonicMean(lambdaNonWetting, lambdaSolid);
335 const Scalar characteristicLength = volVars.characteristicLength() ;
336 const Scalar factorEnergyTransfer = volVars.factorEnergyTransfer() ;
338 const Scalar nusseltWN =
harmonicMean(volVars.nusseltNumber(phase0Idx), volVars.nusseltNumber(phase1Idx));
339 const Scalar nusseltWS = volVars.nusseltNumber(phase0Idx);
340 const Scalar nusseltNS = volVars.nusseltNumber(phase1Idx);
342 const Scalar wettingToNonWettingEnergyExchange = factorEnergyTransfer * (Tw - Tn) / characteristicLength * awn * lambdaWN * nusseltWN ;
343 const Scalar wettingToSolidEnergyExchange = factorEnergyTransfer * (Tw - Ts) / characteristicLength * aws * lambdaWS * nusseltWS ;
344 const Scalar nonWettingToSolidEnergyExchange = factorEnergyTransfer * (Tn - Ts) / characteristicLength * ans * lambdaNS * nusseltNS ;
346 for(
int phaseIdx = 0; phaseIdx < numEnergyEqFluid+numEnergyEqSolid; ++phaseIdx)
351 source[energyEq0Idx + phaseIdx] += ( - wettingToNonWettingEnergyExchange - wettingToSolidEnergyExchange);
354 source[energyEq0Idx + phaseIdx] += (+ wettingToNonWettingEnergyExchange - nonWettingToSolidEnergyExchange);
357 source[energyEq0Idx + phaseIdx] += (+ wettingToSolidEnergyExchange + nonWettingToSolidEnergyExchange);
360 DUNE_THROW(Dune::NotImplemented,
366 if (!isfinite(source[energyEq0Idx + phaseIdx]))
367 DUNE_THROW(
NumericalProblem,
"Calculated non-finite source, " <<
"Tw="<< Tw <<
" Tn="<< Tn<<
" Ts="<< Ts);
371 if (enableChemicalNonEquilibrium)
384 const auto& fluidState = volVars.fluidState();
386 for(
int phaseIdx = 0; phaseIdx < numEnergyEqFluid+numEnergyEqSolid; ++phaseIdx)
392 for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
394 const unsigned int eqIdx = conti0EqIdx + compIdx + phaseIdx*numComponents;
395 source[energyEq0Idx + phaseIdx] += (source[eqIdx]
396 * FluidSystem::molarMass(compIdx)
397 * FluidSystem::componentEnthalpy(fluidState, phase1Idx, compIdx) );
402 for(
int compIdx =0; compIdx<numComponents; ++compIdx)
404 const unsigned int eqIdx = conti0EqIdx + compIdx + phaseIdx*numComponents;
405 source[energyEq0Idx + phaseIdx] += (source[eqIdx]
406 * FluidSystem::molarMass(compIdx)
407 *FluidSystem::componentEnthalpy(fluidState, phase0Idx, compIdx));
413 DUNE_THROW(Dune::NotImplemented,