128 const Problem &problem,
129 const Element &element,
133 const auto&
priVars = elemSol[scv.localDofIndex()];
134 const auto phasePresence =
priVars.state();
136 constexpr bool useConstraintSolver = ModelTraits::useConstraintSolver();
141 if (phasePresence == threePhases)
145 sg_ = 1. - sw_ - sn_;
147 else if (phasePresence == wPhaseOnly)
153 else if (phasePresence == gnPhaseOnly)
159 else if (phasePresence == wnPhaseOnly)
165 else if (phasePresence == gPhaseOnly)
171 else if (phasePresence == wgPhaseOnly)
178 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
189 const auto fluidMatrixInteraction = problem.spatialParams().fluidMatrixInteraction(element, scv, elemSol);
190 Scalar pcgw = fluidMatrixInteraction.pcgw(sw_, sn_);
191 Scalar pcnw = fluidMatrixInteraction.pcnw(sw_, sn_);
192 Scalar pcgn = fluidMatrixInteraction.pcgn(sw_, sn_);
194 const Scalar pcAlpha = fluidMatrixInteraction.pcAlpha(sw_, sn_);
195 const Scalar pcNW1 = 0.0;
197 pn_ = pg_- pcAlpha * pcgn - (1.-pcAlpha)*(pcgw - pcNW1);
198 pw_ = pn_ - pcAlpha * pcnw - (1.-pcAlpha)*pcNW1;
208 typename FluidSystem::ParameterCache paramCache;
210 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++ phaseIdx) {
211 assert(FluidSystem::isIdealMixture(phaseIdx));
213 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++ compIdx) {
214 Scalar phi = FluidSystem::fugacityCoefficient(
fluidState_, paramCache, phaseIdx, compIdx);
215 fluidState_.setFugacityCoefficient(phaseIdx, compIdx, phi);
220 if (phasePresence == threePhases) {
225 if (useConstraintSolver) {
234 Scalar partPressH2O = FluidSystem::fugacityCoefficient(
fluidState_,
237 if (partPressH2O > pg_) partPressH2O = pg_;
238 Scalar partPressNAPL = FluidSystem::fugacityCoefficient(
fluidState_,
241 if (partPressNAPL > pg_) partPressNAPL = pg_;
242 Scalar partPressAir = pg_ - partPressH2O - partPressNAPL;
244 Scalar xgn = partPressNAPL/pg_;
245 Scalar xgw = partPressH2O/pg_;
246 Scalar xgg = partPressAir/pg_;
249 Scalar xwn = partPressNAPL
253 Scalar xwg = partPressAir
257 Scalar xww = 1.-xwg-xwn;
259 Scalar xnn = 1.-2.e-10;
263 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
264 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
265 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
266 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
267 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
268 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
269 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
270 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
271 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
273 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
274 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
275 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
276 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
277 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
278 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
288 else if (phasePresence == wPhaseOnly) {
293 Scalar xwg =
priVars[switch1Idx];
294 Scalar xwn =
priVars[switch2Idx];
295 Scalar xww = 1 - xwg - xwn;
298 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
299 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
300 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
305 if (useConstraintSolver)
315 Scalar xgg = xwg * FluidSystem::fugacityCoefficient(
fluidState_,
318 Scalar xgn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
321 Scalar xgw = FluidSystem::fugacityCoefficient(
fluidState_,
328 Scalar xnn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
334 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
335 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
336 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
337 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
338 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
339 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
341 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
342 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
343 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
344 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
345 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
346 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
356 else if (phasePresence == gnPhaseOnly) {
365 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx, nCompIdx)*pn_;
366 if (partPressNAPL > pg_) partPressNAPL = pg_;
368 Scalar xgw =
priVars[switch1Idx];
369 Scalar xgn = partPressNAPL/pg_;
370 Scalar xgg = 1.-xgw-xgn;
373 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
374 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
375 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
384 else if (phasePresence == wnPhaseOnly) {
386 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx,nCompIdx)*pn_;
387 if (partPressNAPL > pg_) partPressNAPL = pg_;
388 Scalar henryC =
fluidState_.fugacityCoefficient(wPhaseIdx,nCompIdx)*pw_;
390 Scalar xwg =
priVars[switch1Idx];
391 Scalar xwn = partPressNAPL/henryC;
392 Scalar xww = 1.-xwg-xwn;
395 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
396 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
397 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
406 else if (phasePresence == gPhaseOnly) {
410 const Scalar xgw =
priVars[switch1Idx];
411 const Scalar xgn =
priVars[switch2Idx];
412 Scalar xgg = 1 - xgw - xgn;
415 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
416 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
417 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
422 if (useConstraintSolver)
433 Scalar xww = xgw * pg_
442 Scalar xnn = xgn * pg_
449 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
450 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
451 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
452 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
453 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
454 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
456 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
457 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
458 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
459 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
460 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
461 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
471 else if (phasePresence == wgPhaseOnly) {
473 Scalar xgn =
priVars[switch2Idx];
474 Scalar partPressH2O =
fluidState_.fugacityCoefficient(wPhaseIdx, wCompIdx)*pw_;
475 if (partPressH2O > pg_) partPressH2O = pg_;
477 Scalar xgw = partPressH2O/pg_;
478 Scalar xgg = 1.-xgn-xgw;
481 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
482 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
483 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
488 if (useConstraintSolver)
497 Scalar xwn = xgn * pg_
501 Scalar xwg = xgg * pg_
505 Scalar xww = 1.-xwg-xwn;
509 Scalar xnn = xgn * pg_
516 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
517 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
518 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
519 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
520 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
521 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
523 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
524 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
525 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
526 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
527 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
528 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
539 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
541 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
550 const Scalar kr = fluidMatrixInteraction.kr(phaseIdx,
553 mobility_[phaseIdx] = kr / mu;
558 bulkDensTimesAdsorpCoeff_ = fluidMatrixInteraction.adsorptionModel().bulkDensTimesAdsorpCoeff();
568 auto getEffectiveDiffusionCoefficient = [&](
int phaseIdx,
int compIIdx,
int compJIdx)
570 return EffDiffModel::effectiveDiffusionCoefficient(*
this, phaseIdx, compIIdx, compJIdx);
576 effectiveDiffCoeff_.update(getEffectiveDiffusionCoefficient);
578 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
579 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
580 EnergyVolVars::updateEffectiveThermalConductivity();
583 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
585 Scalar h = EnergyVolVars::enthalpy(
fluidState_, paramCache, phaseIdx);