108 void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
110 ParentType::update(elemCtx, dofIdx, timeIdx);
111 EnergyIntensiveQuantities::updateTemperatures_(fluidState_, elemCtx, dofIdx, timeIdx);
113 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
114 const auto& problem = elemCtx.problem();
119 Evaluation sumSat = 0.0;
120 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
121 fluidState_.setSaturation(phaseIdx, priVars.explicitSaturationValue(phaseIdx, timeIdx));
122 Valgrind::CheckDefined(fluidState_.saturation(phaseIdx));
123 sumSat += fluidState_.saturation(phaseIdx);
125 Valgrind::CheckDefined(priVars.implicitSaturationIdx());
126 Valgrind::CheckDefined(sumSat);
127 fluidState_.setSaturation(priVars.implicitSaturationIdx(), 1.0 - sumSat);
134 const MaterialLawParams& materialParams =
135 problem.materialLawParams(elemCtx, dofIdx, timeIdx);
137 MaterialLaw::capillaryPressures(pC, materialParams, fluidState_);
140 const Evaluation& p0 = priVars.makeEvaluation(pressure0Idx, timeIdx);
141 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
142 fluidState_.setPressure(phaseIdx, p0 + (pC[phaseIdx] - pC[0]));
149 typename FluidSystem::template ParameterCache<Evaluation> paramCache;
150 unsigned lowestPresentPhaseIdx = priVars.lowestPresentPhaseIdx();
151 unsigned numNonPresentPhases = 0;
152 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
153 if (!priVars.phaseIsPresent(phaseIdx)) {
154 ++numNonPresentPhases;
159 if (numNonPresentPhases == numPhases - 1) {
162 Evaluation sumx = 0.0;
163 for (
unsigned compIdx = 1; compIdx < numComponents; ++compIdx) {
164 const Evaluation& x = priVars.makeEvaluation(switch0Idx + compIdx - 1, timeIdx);
165 fluidState_.setMoleFraction(lowestPresentPhaseIdx, compIdx, x);
170 fluidState_.setMoleFraction(lowestPresentPhaseIdx, 0, 1 - sumx);
175 ComputeFromReferencePhase::solve(fluidState_, paramCache,
176 lowestPresentPhaseIdx,
182 unsigned numAuxConstraints = numComponents + numNonPresentPhases - numPhases;
183 Opm::MMPCAuxConstraint<Evaluation> auxConstraints[numComponents];
186 unsigned switchIdx = 0;
187 for (; switchIdx < numPhases - 1; ++switchIdx) {
188 const unsigned compIdx = switchIdx + 1;
189 unsigned switchPhaseIdx = switchIdx;
190 if (switchIdx >= lowestPresentPhaseIdx)
193 if (!priVars.phaseIsPresent(switchPhaseIdx)) {
194 auxConstraints[auxIdx].set(lowestPresentPhaseIdx, compIdx,
195 priVars.makeEvaluation(switch0Idx + switchIdx, timeIdx));
200 for (; auxIdx < numAuxConstraints; ++auxIdx, ++switchIdx) {
201 const unsigned compIdx = numPhases - numNonPresentPhases + auxIdx;
202 auxConstraints[auxIdx].set(lowestPresentPhaseIdx, compIdx,
203 priVars.makeEvaluation(switch0Idx + switchIdx, timeIdx));
209 MiscibleMultiPhaseComposition::solve(fluidState_, paramCache,
210 priVars.phasePresence(),
219 if constexpr (!enableEnergy) {
220 constexpr Scalar myNan = std::numeric_limits<Scalar>::quiet_NaN();
221 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
222 fluidState_.setEnthalpy(phaseIdx, myNan);
232 MaterialLaw::relativePermeabilities(relativePermeability_,
233 materialParams, fluidState_);
234 Valgrind::CheckDefined(relativePermeability_);
237 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
238 mobility_[phaseIdx] =
239 relativePermeability_[phaseIdx] /
fluidState().viscosity(phaseIdx);
243 porosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
244 Valgrind::CheckDefined(porosity_);
247 intrinsicPerm_ = problem.intrinsicPermeability(elemCtx, dofIdx, timeIdx);
250 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
253 EnergyIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
256 DiffusionIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
258 fluidState_.checkDefined();