74 using FluidState =
typename IntensiveQuantities::FluidState;
76 enum { conti0EqIdx = Indices::conti0EqIdx };
81 enum { dimWorld = GridView::dimensionworld };
82 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
83 enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
84 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
86 enum { gasCompIdx = FluidSystem::gasCompIdx };
87 enum { oilCompIdx = FluidSystem::oilCompIdx };
88 enum { waterCompIdx = FluidSystem::waterCompIdx };
89 enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
91 static constexpr bool waterEnabled = Indices::waterEnabled;
92 static constexpr bool gasEnabled = Indices::gasEnabled;
93 static constexpr bool oilEnabled = Indices::oilEnabled;
94 static constexpr bool compositionSwitchEnabled = compositionSwitchIdx >= 0;
96 static constexpr bool blackoilConserveSurfaceVolume =
109 static constexpr bool enableMICP = Indices::enableMICP;
119 using ConvectiveMixingModuleParam =
typename ConvectiveMixingModule::ConvectiveMixingModuleParam;
124 using Toolbox = MathToolbox<Evaluation>;
133 FaceDir::DirEnum faceDir;
136 ConditionalStorage<enableEnergy, double> inAlpha;
137 ConditionalStorage<enableEnergy, double> outAlpha;
138 ConditionalStorage<enableDiffusion, double> diffusivity;
139 ConditionalStorage<enableDispersion, double> dispersivity;
144 ConvectiveMixingModuleParam convectiveMixingModuleParam;
150 template <
class LhsEval>
152 const ElementContext& elemCtx,
154 unsigned timeIdx)
const
156 const IntensiveQuantities& intQuants = elemCtx.intensiveQuantities(dofIdx, timeIdx);
160 template <
class LhsEval>
161 static void computeStorage(Dune::FieldVector<LhsEval, numEq>& storage,
162 const IntensiveQuantities& intQuants)
166 const auto& fs = intQuants.fluidState();
169 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
170 if (!FluidSystem::phaseIsActive(phaseIdx)) {
173 unsigned activeCompIdx =
174 FluidSystem::canonicalToActiveCompIdx(FluidSystem::solventComponentIndex(phaseIdx));
175 LhsEval surfaceVolume =
176 Toolbox::template decay<LhsEval>(fs.saturation(phaseIdx)) *
177 Toolbox::template decay<LhsEval>(fs.invB(phaseIdx)) *
178 Toolbox::template decay<LhsEval>(intQuants.porosity());
180 storage[conti0EqIdx + activeCompIdx] += surfaceVolume;
183 if (phaseIdx == oilPhaseIdx && FluidSystem::enableDissolvedGas()) {
184 unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
185 storage[conti0EqIdx + activeGasCompIdx] +=
186 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rs()) *
191 if (phaseIdx == waterPhaseIdx && FluidSystem::enableDissolvedGasInWater()) {
192 unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
193 storage[conti0EqIdx + activeGasCompIdx] +=
194 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rsw()) *
199 if (phaseIdx == gasPhaseIdx && FluidSystem::enableVaporizedOil()) {
200 unsigned activeOilCompIdx = FluidSystem::canonicalToActiveCompIdx(oilCompIdx);
201 storage[conti0EqIdx + activeOilCompIdx] +=
202 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rv()) *
207 if (phaseIdx == gasPhaseIdx && FluidSystem::enableVaporizedWater()) {
208 unsigned activeWaterCompIdx = FluidSystem::canonicalToActiveCompIdx(waterCompIdx);
209 storage[conti0EqIdx + activeWaterCompIdx] +=
210 Toolbox::template decay<LhsEval>(intQuants.fluidState().Rvw()) *
218 SolventModule::addStorage(storage, intQuants);
221 ExtboModule::addStorage(storage, intQuants);
224 PolymerModule::addStorage(storage, intQuants);
227 EnergyModule::addStorage(storage, intQuants);
230 FoamModule::addStorage(storage, intQuants);
233 BrineModule::addStorage(storage, intQuants);
236 BioeffectsModule::addStorage(storage, intQuants);
246 const unsigned globalIndexIn,
247 const unsigned globalIndexEx,
248 const IntensiveQuantities& intQuantsIn,
249 const IntensiveQuantities& intQuantsEx,
253 OPM_TIMEBLOCK_LOCAL(
computeFlux, Subsystem::Assembly);
257 calculateFluxes_(flux,
271 const ElementContext& elemCtx,
275 OPM_TIMEBLOCK_LOCAL(
computeFlux, Subsystem::Assembly);
276 assert(timeIdx == 0);
279 RateVector darcy = 0.0;
281 const auto& problem = elemCtx.problem();
282 const auto& stencil = elemCtx.stencil(timeIdx);
283 const auto& scvf = stencil.interiorFace(scvfIdx);
285 unsigned interiorDofIdx = scvf.interiorIndex();
286 unsigned exteriorDofIdx = scvf.exteriorIndex();
287 assert(interiorDofIdx != exteriorDofIdx);
291 Scalar Vin = elemCtx.dofVolume(interiorDofIdx, 0);
292 Scalar Vex = elemCtx.dofVolume(exteriorDofIdx, 0);
293 const auto& globalIndexIn = stencil.globalSpaceIndex(interiorDofIdx);
294 const auto& globalIndexEx = stencil.globalSpaceIndex(exteriorDofIdx);
295 Scalar trans = problem.transmissibility(elemCtx, interiorDofIdx, exteriorDofIdx);
296 Scalar faceArea = scvf.area();
297 const auto faceDir = faceDirFromDirId(scvf.dirId());
298 Scalar thpres = problem.thresholdPressure(globalIndexIn, globalIndexEx);
303 const Scalar g = problem.gravity()[dimWorld - 1];
304 const auto& intQuantsIn = elemCtx.intensiveQuantities(interiorDofIdx, timeIdx);
305 const auto& intQuantsEx = elemCtx.intensiveQuantities(exteriorDofIdx, timeIdx);
312 const Scalar zIn = problem.dofCenterDepth(elemCtx, interiorDofIdx, timeIdx);
313 const Scalar zEx = problem.dofCenterDepth(elemCtx, exteriorDofIdx, timeIdx);
316 const Scalar distZ = zIn - zEx;
318 const Scalar inAlpha = problem.thermalHalfTransmissibility(globalIndexIn, globalIndexEx);
319 const Scalar outAlpha = problem.thermalHalfTransmissibility(globalIndexEx, globalIndexIn);
320 const Scalar diffusivity = problem.diffusivity(globalIndexEx, globalIndexIn);
321 const Scalar dispersivity = problem.dispersivity(globalIndexEx, globalIndexIn);
323 const ResidualNBInfo res_nbinfo {
324 trans, faceArea, thpres, distZ * g, faceDir, Vin, Vex,
325 inAlpha, outAlpha, diffusivity, dispersivity
328 calculateFluxes_(flux,
335 problem.moduleParams());
338 static void calculateFluxes_(RateVector& flux,
340 const IntensiveQuantities& intQuantsIn,
341 const IntensiveQuantities& intQuantsEx,
342 const unsigned& globalIndexIn,
343 const unsigned& globalIndexEx,
347 OPM_TIMEBLOCK_LOCAL(calculateFluxes, Subsystem::Assembly);
348 const Scalar Vin = nbInfo.Vin;
349 const Scalar Vex = nbInfo.Vex;
350 const Scalar distZg = nbInfo.dZg;
351 const Scalar thpres = nbInfo.thpres;
352 const Scalar trans = nbInfo.trans;
353 const Scalar faceArea = nbInfo.faceArea;
354 FaceDir::DirEnum facedir = nbInfo.faceDir;
356 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
357 if (!FluidSystem::phaseIsActive(phaseIdx)) {
365 short interiorDofIdx = 0;
366 short exteriorDofIdx = 1;
367 Evaluation pressureDifference;
368 ExtensiveQuantities::calculatePhasePressureDiff_(upIdx,
384 const IntensiveQuantities& up = (upIdx == interiorDofIdx) ? intQuantsIn : intQuantsEx;
385 unsigned globalUpIndex = (upIdx == interiorDofIdx) ? globalIndexIn : globalIndexEx;
387 Evaluation transMult = (intQuantsIn.rockCompTransMultiplier() +
388 Toolbox::value(intQuantsEx.rockCompTransMultiplier())) / 2;
389 if constexpr (enableBioeffects) {
390 transMult *= (intQuantsIn.permFactor() + Toolbox::value(intQuantsEx.permFactor())) / 2;
392 Evaluation darcyFlux;
393 if (globalUpIndex == globalIndexIn) {
394 darcyFlux = pressureDifference * up.mobility(phaseIdx, facedir) * transMult * (-trans / faceArea);
396 darcyFlux = pressureDifference *
397 (Toolbox::value(up.mobility(phaseIdx, facedir)) * transMult * (-trans / faceArea));
400 unsigned activeCompIdx =
401 FluidSystem::canonicalToActiveCompIdx(FluidSystem::solventComponentIndex(phaseIdx));
403 darcy[conti0EqIdx + activeCompIdx] = darcyFlux.value() * faceArea;
405 unsigned pvtRegionIdx = up.pvtRegionIndex();
407 if (globalUpIndex == globalIndexIn) {
409 = getInvB_<FluidSystem, FluidState, Evaluation>(up.fluidState(), phaseIdx, pvtRegionIdx);
410 const auto& surfaceVolumeFlux = invB * darcyFlux;
411 evalPhaseFluxes_<Evaluation>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, up.fluidState());
412 if constexpr (enableEnergy) {
413 EnergyModule::template
414 addPhaseEnthalpyFluxes_<Evaluation>(flux, phaseIdx, darcyFlux, up.fluidState());
416 if constexpr (enableBioeffects) {
417 BioeffectsModule::template
418 addBioeffectsFluxes_<Evaluation>(flux, phaseIdx, darcyFlux, up);
420 if constexpr (enableBrine) {
421 BrineModule::template
422 addBrineFluxes_<Evaluation, FluidState>(flux, phaseIdx, darcyFlux, up.fluidState());
425 const auto& invB = getInvB_<FluidSystem, FluidState, Scalar>(up.fluidState(), phaseIdx, pvtRegionIdx);
426 const auto& surfaceVolumeFlux = invB * darcyFlux;
427 evalPhaseFluxes_<Scalar>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, up.fluidState());
428 if constexpr (enableEnergy) {
429 EnergyModule::template
430 addPhaseEnthalpyFluxes_<Scalar>(flux, phaseIdx, darcyFlux, up.fluidState());
432 if constexpr (enableBioeffects) {
433 BioeffectsModule::template
434 addBioeffectsFluxes_<Scalar>(flux, phaseIdx, darcyFlux, up);
436 if constexpr (enableBrine) {
437 BrineModule::template
438 addBrineFluxes_<Scalar, FluidState>(flux, phaseIdx, darcyFlux, up.fluidState());
444 static_assert(!enableSolvent,
445 "Relevant computeFlux() method must be implemented for this module before enabling.");
449 static_assert(!enableExtbo,
450 "Relevant computeFlux() method must be implemented for this module before enabling.");
454 static_assert(!enablePolymer,
455 "Relevant computeFlux() method must be implemented for this module before enabling.");
459 if constexpr (enableConvectiveMixing) {
460 ConvectiveMixingModule::addConvectiveMixingFlux(flux,
468 moduleParams.convectiveMixingModuleParam);
472 if constexpr (enableEnergy) {
473 const Scalar inAlpha = nbInfo.inAlpha;
474 const Scalar outAlpha = nbInfo.outAlpha;
477 short interiorDofIdx = 0;
478 short exteriorDofIdx = 1;
480 EnergyModule::ExtensiveQuantities::updateEnergy(heatFlux,
486 intQuantsIn.fluidState(),
487 intQuantsEx.fluidState(),
491 EnergyModule::addHeatFlux(flux, heatFlux);
497 static_assert(!enableFoam,
498 "Relevant computeFlux() method must be implemented for this module before enabling.");
502 if constexpr (enableDiffusion) {
503 typename DiffusionModule::ExtensiveQuantities::EvaluationArray effectiveDiffusionCoefficient;
504 DiffusionModule::ExtensiveQuantities::update(effectiveDiffusionCoefficient, intQuantsIn, intQuantsEx);
505 const Scalar diffusivity = nbInfo.diffusivity;
506 const Scalar tmpdiffusivity = diffusivity / faceArea;
507 DiffusionModule::addDiffusiveFlux(flux,
511 effectiveDiffusionCoefficient);
515 if constexpr (enableDispersion) {
516 typename DispersionModule::ExtensiveQuantities::ScalarArray normVelocityAvg;
517 DispersionModule::ExtensiveQuantities::update(normVelocityAvg, intQuantsIn, intQuantsEx);
518 const Scalar dispersivity = nbInfo.dispersivity;
519 const Scalar tmpdispersivity = dispersivity / faceArea;
520 DispersionModule::addDispersiveFlux(flux,
528 if constexpr (enableMICP) {
529 BioeffectsModule::applyScaling(flux);
533 template <
class BoundaryConditionData>
534 static void computeBoundaryFlux(RateVector& bdyFlux,
535 const Problem& problem,
536 const BoundaryConditionData& bdyInfo,
537 const IntensiveQuantities& insideIntQuants,
538 unsigned globalSpaceIdx)
540 switch (bdyInfo.type) {
545 computeBoundaryFluxRate(bdyFlux, bdyInfo);
548 case BCType::DIRICHLET:
549 computeBoundaryFluxFree(problem, bdyFlux, bdyInfo, insideIntQuants, globalSpaceIdx);
551 case BCType::THERMAL:
552 computeBoundaryThermal(problem, bdyFlux, bdyInfo, insideIntQuants, globalSpaceIdx);
555 throw std::logic_error(
"Unknown boundary condition type " +
556 std::to_string(
static_cast<int>(bdyInfo.type)) +
557 " in computeBoundaryFlux()." );
561 template <
class BoundaryConditionData>
562 static void computeBoundaryFluxRate(RateVector& bdyFlux,
563 const BoundaryConditionData& bdyInfo)
565 bdyFlux.setMassRate(bdyInfo.massRate, bdyInfo.pvtRegionIdx);
568 template <
class BoundaryConditionData>
569 static void computeBoundaryFluxFree(
const Problem& problem,
571 const BoundaryConditionData& bdyInfo,
572 const IntensiveQuantities& insideIntQuants,
573 unsigned globalSpaceIdx)
575 OPM_TIMEBLOCK_LOCAL(computeBoundaryFluxFree, Subsystem::Assembly);
576 std::array<short, numPhases> upIdx;
577 std::array<short, numPhases> dnIdx;
578 std::array<Evaluation, numPhases> volumeFlux;
579 std::array<Evaluation, numPhases> pressureDifference;
581 ExtensiveQuantities::calculateBoundaryGradients_(problem,
584 bdyInfo.boundaryFaceIndex,
587 bdyInfo.exFluidState,
597 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
598 if (!FluidSystem::phaseIsActive(phaseIdx)) {
601 const auto& pBoundary = bdyInfo.exFluidState.pressure(phaseIdx);
602 const Evaluation& pInside = insideIntQuants.fluidState().pressure(phaseIdx);
603 const unsigned pvtRegionIdx = insideIntQuants.pvtRegionIndex();
606 const auto& darcyFlux = volumeFlux[phaseIdx];
608 if (pBoundary < pInside) {
611 getInvB_<FluidSystem, FluidState, Evaluation>(insideIntQuants.fluidState(), phaseIdx, pvtRegionIdx);
612 Evaluation surfaceVolumeFlux = invB * darcyFlux;
613 evalPhaseFluxes_<Evaluation>(tmp,
615 insideIntQuants.pvtRegionIndex(),
617 insideIntQuants.fluidState());
618 if constexpr (enableEnergy) {
619 EnergyModule::template
620 addPhaseEnthalpyFluxes_<Evaluation>(tmp, phaseIdx, darcyFlux, insideIntQuants.fluidState());
622 }
else if (pBoundary > pInside) {
624 using ScalarFluidState =
decltype(bdyInfo.exFluidState);
626 getInvB_<FluidSystem, ScalarFluidState, Scalar>(bdyInfo.exFluidState, phaseIdx, pvtRegionIdx);
627 Evaluation surfaceVolumeFlux = invB * darcyFlux;
628 evalPhaseFluxes_<Scalar>(tmp,
630 insideIntQuants.pvtRegionIndex(),
632 bdyInfo.exFluidState);
633 if constexpr (enableEnergy) {
634 EnergyModule::template
635 addPhaseEnthalpyFluxes_<Scalar>(tmp, phaseIdx, darcyFlux, bdyInfo.exFluidState);
639 for (
unsigned i = 0; i < tmp.size(); ++i) {
640 bdyFlux[i] += tmp[i];
645 if constexpr (enableEnergy) {
649 problem.eclTransmissibilities().thermalHalfTransBoundary(globalSpaceIdx, bdyInfo.boundaryFaceIndex);
652 EnergyModule::ExtensiveQuantities::updateEnergyBoundary(heatFlux,
657 bdyInfo.exFluidState);
658 EnergyModule::addHeatFlux(bdyFlux, heatFlux);
661 static_assert(!enableSolvent,
662 "Relevant treatment of boundary conditions must be implemented before enabling.");
663 static_assert(!enablePolymer,
664 "Relevant treatment of boundary conditions must be implemented before enabling.");
670 for (
unsigned i = 0; i < numEq; ++i) {
671 Valgrind::CheckDefined(bdyFlux[i]);
673 Valgrind::CheckDefined(bdyFlux);
677 template <
class BoundaryConditionData>
678 static void computeBoundaryThermal(
const Problem& problem,
680 const BoundaryConditionData& bdyInfo,
681 const IntensiveQuantities& insideIntQuants,
682 [[maybe_unused]]
unsigned globalSpaceIdx)
684 OPM_TIMEBLOCK_LOCAL(computeBoundaryThermal, Subsystem::Assembly);
689 if constexpr (enableEnergy) {
693 problem.eclTransmissibilities().thermalHalfTransBoundary(globalSpaceIdx, bdyInfo.boundaryFaceIndex);
696 EnergyModule::ExtensiveQuantities::updateEnergyBoundary(heatFlux,
701 bdyInfo.exFluidState);
702 EnergyModule::addHeatFlux(bdyFlux, heatFlux);
706 for (
unsigned i = 0; i < numEq; ++i) {
707 Valgrind::CheckDefined(bdyFlux[i]);
709 Valgrind::CheckDefined(bdyFlux);
713 static void computeSource(RateVector& source,
714 const Problem& problem,
715 const IntensiveQuantities& insideIntQuants,
716 unsigned globalSpaceIdex,
719 OPM_TIMEBLOCK_LOCAL(computeSource, Subsystem::Assembly);
721 problem.source(source, globalSpaceIdex, timeIdx);
724 BioeffectsModule::addSource(source, problem, insideIntQuants, globalSpaceIdex);
727 if constexpr (enableEnergy) {
732 static void computeSourceDense(RateVector& source,
733 const Problem& problem,
734 const IntensiveQuantities& insideIntQuants,
735 unsigned globalSpaceIdex,
739 problem.addToSourceDense(source, globalSpaceIdex, timeIdx);
742 BioeffectsModule::addSource(source, problem, insideIntQuants, globalSpaceIdex);
745 if constexpr (enableEnergy) {
754 const ElementContext& elemCtx,
756 unsigned timeIdx)
const
758 OPM_TIMEBLOCK_LOCAL(computeSource, Subsystem::Assembly);
760 elemCtx.problem().source(source, elemCtx, dofIdx, timeIdx);
763 BioeffectsModule::addSource(source, elemCtx, dofIdx, timeIdx);
766 if constexpr (enableEnergy) {
771 template <
class UpEval,
class Flu
idState>
772 static void evalPhaseFluxes_(RateVector& flux,
774 unsigned pvtRegionIdx,
775 const ExtensiveQuantities& extQuants,
776 const FluidState& upFs)
778 const auto& invB = getInvB_<FluidSystem, FluidState, UpEval>(upFs, phaseIdx, pvtRegionIdx);
779 const auto& surfaceVolumeFlux = invB * extQuants.volumeFlux(phaseIdx);
780 evalPhaseFluxes_<UpEval>(flux, phaseIdx, pvtRegionIdx, surfaceVolumeFlux, upFs);
787 template <
class UpEval,
class Eval,
class Flu
idState>
790 unsigned pvtRegionIdx,
791 const Eval& surfaceVolumeFlux,
792 const FluidState& upFs)
794 unsigned activeCompIdx =
795 FluidSystem::canonicalToActiveCompIdx(FluidSystem::solventComponentIndex(phaseIdx));
797 if constexpr (blackoilConserveSurfaceVolume) {
798 flux[conti0EqIdx + activeCompIdx] += surfaceVolumeFlux;
801 flux[conti0EqIdx + activeCompIdx] += surfaceVolumeFlux *
802 FluidSystem::referenceDensity(phaseIdx, pvtRegionIdx);
805 if (phaseIdx == oilPhaseIdx) {
807 if (FluidSystem::enableDissolvedGas()) {
808 const auto& Rs = BlackOil::getRs_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
810 const unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
811 if constexpr (blackoilConserveSurfaceVolume) {
812 flux[conti0EqIdx + activeGasCompIdx] += Rs * surfaceVolumeFlux;
815 flux[conti0EqIdx + activeGasCompIdx] +=
816 Rs * surfaceVolumeFlux *
817 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
821 else if (phaseIdx == waterPhaseIdx) {
823 if (FluidSystem::enableDissolvedGasInWater()) {
824 const auto& Rsw = BlackOil::getRsw_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
826 const unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
827 if constexpr (blackoilConserveSurfaceVolume) {
828 flux[conti0EqIdx + activeGasCompIdx] += Rsw * surfaceVolumeFlux;
831 flux[conti0EqIdx + activeGasCompIdx] +=
832 Rsw * surfaceVolumeFlux *
833 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
837 else if (phaseIdx == gasPhaseIdx) {
839 if (FluidSystem::enableVaporizedOil()) {
840 const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
842 const unsigned activeOilCompIdx = FluidSystem::canonicalToActiveCompIdx(oilCompIdx);
843 if constexpr (blackoilConserveSurfaceVolume) {
844 flux[conti0EqIdx + activeOilCompIdx] += Rv * surfaceVolumeFlux;
847 flux[conti0EqIdx + activeOilCompIdx] +=
848 Rv * surfaceVolumeFlux *
849 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
853 if (FluidSystem::enableVaporizedWater()) {
854 const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, UpEval>(upFs, pvtRegionIdx);
856 const unsigned activeWaterCompIdx = FluidSystem::canonicalToActiveCompIdx(waterCompIdx);
857 if constexpr (blackoilConserveSurfaceVolume) {
858 flux[conti0EqIdx + activeWaterCompIdx] += Rvw * surfaceVolumeFlux;
861 flux[conti0EqIdx + activeWaterCompIdx] +=
862 Rvw * surfaceVolumeFlux *
863 FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
880 template <
class Scalar>
882 unsigned pvtRegionIdx)
884 if constexpr (!blackoilConserveSurfaceVolume) {
889 if constexpr (waterEnabled) {
890 const unsigned activeWaterCompIdx = FluidSystem::canonicalToActiveCompIdx(waterCompIdx);
891 container[conti0EqIdx + activeWaterCompIdx] *=
892 FluidSystem::referenceDensity(waterPhaseIdx, pvtRegionIdx);
895 if constexpr (gasEnabled) {
896 const unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
897 container[conti0EqIdx + activeGasCompIdx] *=
898 FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx);
901 if constexpr (oilEnabled) {
902 const unsigned activeOilCompIdx = FluidSystem::canonicalToActiveCompIdx(oilCompIdx);
903 container[conti0EqIdx + activeOilCompIdx] *=
904 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx);
910 static FaceDir::DirEnum faceDirFromDirId(
const int dirId)
911 {
return dirId < 0 ? FaceDir::DirEnum::Unknown : FaceDir::FromIntersectionIndex(dirId); }