83 PrimaryVariables& nextValue,
84 const PrimaryVariables& currentValue,
85 const EqVector& update,
89 nextValue = currentValue;
93 if (this->numIterations_ > 4) {
97 const auto& problem = this->simulator_.problem();
100 const MaterialLawParams& matParams =
101 problem.materialLawParams(globalDofIdx, 0);
103 ImmiscibleFluidState<Scalar, FluidSystem> fs;
106 const Scalar T = problem.temperature(globalDofIdx, 0);
107 fs.setTemperature(T);
115 fs.setSaturation(liquidPhaseIdx, 1.0);
116 fs.setSaturation(gasPhaseIdx, 0.0);
118 MaterialLaw::capillaryPressures(pC, matParams, fs);
123 const Scalar pWOld = currentValue[pressureWIdx];
125 std::max(problem.referencePressure(globalDofIdx, 0),
126 pWOld + (pC[gasPhaseIdx] - pC[liquidPhaseIdx]));
131 fs.setPressure(liquidPhaseIdx, pWOld);
132 fs.setPressure(gasPhaseIdx, pNOld);
135 MaterialLaw::saturations(satOld, matParams, fs);
136 satOld[liquidPhaseIdx] = std::max(Scalar{0.0}, satOld[liquidPhaseIdx]);
143 fs.setSaturation(liquidPhaseIdx, satOld[liquidPhaseIdx] - 0.2);
144 fs.setSaturation(gasPhaseIdx, 1.0 - (satOld[liquidPhaseIdx] - 0.2));
145 MaterialLaw::capillaryPressures(pC, matParams, fs);
146 const Scalar pwMin = pNOld - (pC[gasPhaseIdx] - pC[liquidPhaseIdx]);
148 fs.setSaturation(liquidPhaseIdx, satOld[liquidPhaseIdx] + 0.2);
149 fs.setSaturation(gasPhaseIdx, 1.0 - (satOld[liquidPhaseIdx] + 0.2));
150 MaterialLaw::capillaryPressures(pC, matParams, fs);
151 const Scalar pwMax = pNOld - (pC[gasPhaseIdx] - pC[liquidPhaseIdx]);
157 const Scalar pW = std::clamp(nextValue[pressureWIdx], pwMin, pwMax);
158 nextValue[pressureWIdx] = pW;