116 const Problem &problem,
117 const Element &element,
121 const auto&
priVars = elemSol[scv.localDofIndex()];
122 const auto phasePresence =
priVars.state();
124 constexpr bool useConstraintSolver = ModelTraits::useConstraintSolver();
127 const auto &materialParams =
128 problem.spatialParams().materialLawParams(element, scv, elemSol);
134 if (phasePresence == threePhases)
138 sg_ = 1. - sw_ - sn_;
140 else if (phasePresence == wPhaseOnly)
146 else if (phasePresence == gnPhaseOnly)
152 else if (phasePresence == wnPhaseOnly)
158 else if (phasePresence == gPhaseOnly)
164 else if (phasePresence == wgPhaseOnly)
171 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
182 using MaterialLaw =
typename Problem::SpatialParams::MaterialLaw;
183 Scalar pcgw = MaterialLaw::pcgw(materialParams, sw_);
184 Scalar pcnw = MaterialLaw::pcnw(materialParams, sw_);
185 Scalar pcgn = MaterialLaw::pcgn(materialParams, sw_ + sn_);
187 Scalar pcAlpha = MaterialLaw::pcAlpha(materialParams, sn_);
190 pn_ = pg_- pcAlpha * pcgn - (1.-pcAlpha)*(pcgw - pcNW1);
191 pw_ = pn_ - pcAlpha * pcnw - (1.-pcAlpha)*pcNW1;
201 typename FluidSystem::ParameterCache paramCache;
203 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++ phaseIdx) {
204 assert(FluidSystem::isIdealMixture(phaseIdx));
206 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++ compIdx) {
207 Scalar phi = FluidSystem::fugacityCoefficient(
fluidState_, paramCache, phaseIdx, compIdx);
208 fluidState_.setFugacityCoefficient(phaseIdx, compIdx, phi);
213 if (phasePresence == threePhases) {
218 if (useConstraintSolver) {
227 Scalar partPressH2O = FluidSystem::fugacityCoefficient(
fluidState_,
230 if (partPressH2O > pg_) partPressH2O = pg_;
231 Scalar partPressNAPL = FluidSystem::fugacityCoefficient(
fluidState_,
234 if (partPressNAPL > pg_) partPressNAPL = pg_;
235 Scalar partPressAir = pg_ - partPressH2O - partPressNAPL;
237 Scalar xgn = partPressNAPL/pg_;
238 Scalar xgw = partPressH2O/pg_;
239 Scalar xgg = partPressAir/pg_;
242 Scalar xwn = partPressNAPL
246 Scalar xwg = partPressAir
250 Scalar xww = 1.-xwg-xwn;
252 Scalar xnn = 1.-2.e-10;
256 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
257 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
258 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
259 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
260 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
261 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
262 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
263 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
264 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
266 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
267 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
268 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
269 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
270 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
271 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
281 else if (phasePresence == wPhaseOnly) {
286 Scalar xwg =
priVars[switch1Idx];
287 Scalar xwn =
priVars[switch2Idx];
288 Scalar xww = 1 - xwg - xwn;
291 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
292 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
293 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
298 if (useConstraintSolver)
308 Scalar xgg = xwg * FluidSystem::fugacityCoefficient(
fluidState_,
311 Scalar xgn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
314 Scalar xgw = FluidSystem::fugacityCoefficient(
fluidState_,
321 Scalar xnn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
327 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
328 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
329 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
330 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
331 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
332 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
334 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
335 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
336 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
337 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
338 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
339 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
349 else if (phasePresence == gnPhaseOnly) {
358 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx, nCompIdx)*pn_;
359 if (partPressNAPL > pg_) partPressNAPL = pg_;
361 Scalar xgw =
priVars[switch1Idx];
362 Scalar xgn = partPressNAPL/pg_;
363 Scalar xgg = 1.-xgw-xgn;
366 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
367 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
368 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
377 else if (phasePresence == wnPhaseOnly) {
379 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx,nCompIdx)*pn_;
380 if (partPressNAPL > pg_) partPressNAPL = pg_;
381 Scalar henryC =
fluidState_.fugacityCoefficient(wPhaseIdx,nCompIdx)*pw_;
383 Scalar xwg =
priVars[switch1Idx];
384 Scalar xwn = partPressNAPL/henryC;
385 Scalar xww = 1.-xwg-xwn;
388 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
389 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
390 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
399 else if (phasePresence == gPhaseOnly) {
403 const Scalar xgw =
priVars[switch1Idx];
404 const Scalar xgn =
priVars[switch2Idx];
405 Scalar xgg = 1 - xgw - xgn;
408 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
409 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
410 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
415 if (useConstraintSolver)
426 Scalar xww = xgw * pg_
435 Scalar xnn = xgn * pg_
442 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
443 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
444 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
445 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
446 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
447 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
449 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
450 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
451 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
452 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
453 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
454 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
464 else if (phasePresence == wgPhaseOnly) {
466 Scalar xgn =
priVars[switch2Idx];
467 Scalar partPressH2O =
fluidState_.fugacityCoefficient(wPhaseIdx, wCompIdx)*pw_;
468 if (partPressH2O > pg_) partPressH2O = pg_;
470 Scalar xgw = partPressH2O/pg_;
471 Scalar xgg = 1.-xgn-xgw;
474 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
475 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
476 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
481 if (useConstraintSolver)
490 Scalar xwn = xgn * pg_
494 Scalar xwg = xgg * pg_
498 Scalar xww = 1.-xwg-xwn;
502 Scalar xnn = xgn * pg_
509 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
510 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
511 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
512 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
513 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
514 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
516 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
517 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
518 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
519 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
520 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
521 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
533 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
536 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx) {
545 kr = MaterialLaw::kr(materialParams, phaseIdx,
549 mobility_[phaseIdx] = kr / mu;
554 bulkDensTimesAdsorpCoeff_ =
555 MaterialLaw::bulkDensTimesAdsorpCoeff(materialParams);
565 auto getEffectiveDiffusionCoefficient = [&](
int phaseIdx,
int compIIdx,
int compJIdx)
567 return EffDiffModel::effectiveDiffusionCoefficient(*
this, phaseIdx, compIIdx, compJIdx);
573 effectiveDiffCoeff_.update(getEffectiveDiffusionCoefficient);
575 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
576 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
577 EnergyVolVars::updateEffectiveThermalConductivity();
580 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
582 Scalar h = EnergyVolVars::enthalpy(
fluidState_, paramCache, phaseIdx);