112 const Problem &problem,
113 const Element &element,
117 const auto&
priVars = elemSol[scv.localDofIndex()];
118 const auto phasePresence =
priVars.state();
120 constexpr bool useConstraintSolver = ModelTraits::useConstraintSolver();
123 const auto &materialParams =
124 problem.spatialParams().materialLawParams(element, scv, elemSol);
130 if (phasePresence == threePhases)
134 sg_ = 1. - sw_ - sn_;
136 else if (phasePresence == wPhaseOnly)
142 else if (phasePresence == gnPhaseOnly)
148 else if (phasePresence == wnPhaseOnly)
154 else if (phasePresence == gPhaseOnly)
160 else if (phasePresence == wgPhaseOnly)
167 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
178 using MaterialLaw =
typename Problem::SpatialParams::MaterialLaw;
179 Scalar pcgw = MaterialLaw::pcgw(materialParams, sw_);
180 Scalar pcnw = MaterialLaw::pcnw(materialParams, sw_);
181 Scalar pcgn = MaterialLaw::pcgn(materialParams, sw_ + sn_);
183 Scalar pcAlpha = MaterialLaw::pcAlpha(materialParams, sn_);
186 pn_ = pg_- pcAlpha * pcgn - (1.-pcAlpha)*(pcgw - pcNW1);
187 pw_ = pn_ - pcAlpha * pcnw - (1.-pcAlpha)*pcNW1;
197 typename FluidSystem::ParameterCache paramCache;
199 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++ phaseIdx) {
200 assert(FluidSystem::isIdealMixture(phaseIdx));
202 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++ compIdx) {
203 Scalar phi = FluidSystem::fugacityCoefficient(
fluidState_, paramCache, phaseIdx, compIdx);
204 fluidState_.setFugacityCoefficient(phaseIdx, compIdx, phi);
209 if (phasePresence == threePhases) {
214 if (useConstraintSolver) {
223 Scalar partPressH2O = FluidSystem::fugacityCoefficient(
fluidState_,
226 if (partPressH2O > pg_) partPressH2O = pg_;
227 Scalar partPressNAPL = FluidSystem::fugacityCoefficient(
fluidState_,
230 if (partPressNAPL > pg_) partPressNAPL = pg_;
231 Scalar partPressAir = pg_ - partPressH2O - partPressNAPL;
233 Scalar xgn = partPressNAPL/pg_;
234 Scalar xgw = partPressH2O/pg_;
235 Scalar xgg = partPressAir/pg_;
238 Scalar xwn = partPressNAPL
242 Scalar xwg = partPressAir
246 Scalar xww = 1.-xwg-xwn;
248 Scalar xnn = 1.-2.e-10;
252 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
253 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
254 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
255 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
256 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
257 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
258 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
259 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
260 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
262 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
263 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
264 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
265 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
266 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
267 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
277 else if (phasePresence == wPhaseOnly) {
282 Scalar xwg =
priVars[switch1Idx];
283 Scalar xwn =
priVars[switch2Idx];
284 Scalar xww = 1 - xwg - xwn;
287 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
288 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
289 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
294 if (useConstraintSolver)
304 Scalar xgg = xwg * FluidSystem::fugacityCoefficient(
fluidState_,
307 Scalar xgn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
310 Scalar xgw = FluidSystem::fugacityCoefficient(
fluidState_,
317 Scalar xnn = xwn * FluidSystem::fugacityCoefficient(
fluidState_,
323 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
324 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
325 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
326 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
327 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
328 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
330 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
331 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
332 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
333 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
334 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
335 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
345 else if (phasePresence == gnPhaseOnly) {
354 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx, nCompIdx)*pn_;
355 if (partPressNAPL > pg_) partPressNAPL = pg_;
357 Scalar xgw =
priVars[switch1Idx];
358 Scalar xgn = partPressNAPL/pg_;
359 Scalar xgg = 1.-xgw-xgn;
362 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
363 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
364 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
373 else if (phasePresence == wnPhaseOnly) {
375 Scalar partPressNAPL =
fluidState_.fugacityCoefficient(nPhaseIdx,nCompIdx)*pn_;
376 if (partPressNAPL > pg_) partPressNAPL = pg_;
377 Scalar henryC =
fluidState_.fugacityCoefficient(wPhaseIdx,nCompIdx)*pw_;
379 Scalar xwg =
priVars[switch1Idx];
380 Scalar xwn = partPressNAPL/henryC;
381 Scalar xww = 1.-xwg-xwn;
384 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
385 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
386 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
395 else if (phasePresence == gPhaseOnly) {
399 const Scalar xgw =
priVars[switch1Idx];
400 const Scalar xgn =
priVars[switch2Idx];
401 Scalar xgg = 1 - xgw - xgn;
404 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
405 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
406 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
411 if (useConstraintSolver)
422 Scalar xww = xgw * pg_
431 Scalar xnn = xgn * pg_
438 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
439 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
440 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
441 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
442 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
443 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
445 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
446 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
447 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
448 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
449 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
450 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
460 else if (phasePresence == wgPhaseOnly) {
462 Scalar xgn =
priVars[switch2Idx];
463 Scalar partPressH2O =
fluidState_.fugacityCoefficient(wPhaseIdx, wCompIdx)*pw_;
464 if (partPressH2O > pg_) partPressH2O = pg_;
466 Scalar xgw = partPressH2O/pg_;
467 Scalar xgg = 1.-xgn-xgw;
470 fluidState_.setMoleFraction(gPhaseIdx, wCompIdx, xgw);
471 fluidState_.setMoleFraction(gPhaseIdx, gCompIdx, xgg);
472 fluidState_.setMoleFraction(gPhaseIdx, nCompIdx, xgn);
477 if (useConstraintSolver)
486 Scalar xwn = xgn * pg_
490 Scalar xwg = xgg * pg_
494 Scalar xww = 1.-xwg-xwn;
498 Scalar xnn = xgn * pg_
505 fluidState_.setMoleFraction(wPhaseIdx, wCompIdx, xww);
506 fluidState_.setMoleFraction(wPhaseIdx, gCompIdx, xwg);
507 fluidState_.setMoleFraction(wPhaseIdx, nCompIdx, xwn);
508 fluidState_.setMoleFraction(nPhaseIdx, wCompIdx, xnw);
509 fluidState_.setMoleFraction(nPhaseIdx, gCompIdx, xna);
510 fluidState_.setMoleFraction(nPhaseIdx, nCompIdx, xnn);
512 Scalar rhoW = FluidSystem::density(
fluidState_, wPhaseIdx);
513 Scalar rhoG = FluidSystem::density(
fluidState_, gPhaseIdx);
514 Scalar rhoN = FluidSystem::density(
fluidState_, nPhaseIdx);
515 Scalar rhoWMolar = FluidSystem::molarDensity(
fluidState_, wPhaseIdx);
516 Scalar rhoGMolar = FluidSystem::molarDensity(
fluidState_, gPhaseIdx);
517 Scalar rhoNMolar = FluidSystem::molarDensity(
fluidState_, nPhaseIdx);
529 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " << phasePresence <<
" is invalid.");
532 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx) {
541 kr = MaterialLaw::kr(materialParams, phaseIdx,
545 mobility_[phaseIdx] = kr / mu;
550 bulkDensTimesAdsorpCoeff_ =
551 MaterialLaw::bulkDensTimesAdsorpCoeff(materialParams);
560 setDiffusionCoefficient_(gPhaseIdx, wCompIdx, FluidSystem::diffusionCoefficient(
fluidState_, paramCache, gPhaseIdx, wCompIdx));
561 setDiffusionCoefficient_(gPhaseIdx, nCompIdx, FluidSystem::diffusionCoefficient(
fluidState_, paramCache, gPhaseIdx, nCompIdx));
562 setDiffusionCoefficient_(wPhaseIdx, gCompIdx, FluidSystem::diffusionCoefficient(
fluidState_, paramCache, wPhaseIdx, gCompIdx));
563 setDiffusionCoefficient_(wPhaseIdx, nCompIdx, FluidSystem::diffusionCoefficient(
fluidState_, paramCache, wPhaseIdx, nCompIdx));
565 setDiffusionCoefficient_(nPhaseIdx, wCompIdx, 0.0);
566 setDiffusionCoefficient_(nPhaseIdx, gCompIdx, 0.0);
570 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
571 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
574 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
576 Scalar h = EnergyVolVars::enthalpy(
fluidState_, paramCache, phaseIdx);