29#ifndef OPM_INIT_STATE_EQUIL_HPP
30#define OPM_INIT_STATE_EQUIL_HPP
34#include <opm/material/common/Tabulated1DFunction.hpp>
35#include <opm/material/fluidstates/SimpleModularFluidState.hpp>
51class NumericalAquifers;
63 std::array<Scalar, 8>
X;
64 std::array<Scalar, 8>
Y;
65 std::array<Scalar, 8>
Z;
69 const std::array<Scalar, 8>& y,
70 const std::array<Scalar, 8>& z)
75template<
class Scalar>
class EquilReg;
76namespace Miscibility {
template<
class Scalar>
class RsFunction; }
80namespace PhasePressODE {
81template <
class Flu
idSystem>
84 using Scalar =
typename FluidSystem::Scalar;
85 using TabulatedFunction = Tabulated1DFunction<Scalar>;
88 Water(
const TabulatedFunction& tempVdTable,
89 const TabulatedFunction& saltVdTable,
90 const int pvtRegionIdx,
91 const Scalar normGrav);
94 const Scalar press)
const;
97 const TabulatedFunction& tempVdTable_;
98 const TabulatedFunction& saltVdTable_;
99 const int pvtRegionIdx_;
102 Scalar density(
const Scalar depth,
103 const Scalar press)
const;
106template <
class Flu
idSystem,
class RS>
109 using Scalar =
typename FluidSystem::Scalar;
110 using TabulatedFunction = Tabulated1DFunction<Scalar>;
113 Oil(
const TabulatedFunction& tempVdTable,
115 const int pvtRegionIdx,
116 const Scalar normGrav);
119 const Scalar press)
const;
122 const TabulatedFunction& tempVdTable_;
124 const int pvtRegionIdx_;
127 Scalar density(
const Scalar depth,
128 const Scalar press)
const;
131template <
class Flu
idSystem,
class RV,
class RVW>
134 using Scalar =
typename FluidSystem::Scalar;
135 using TabulatedFunction = Tabulated1DFunction<Scalar>;
138 Gas(
const TabulatedFunction& tempVdTable,
141 const int pvtRegionIdx,
142 const Scalar normGrav);
145 const Scalar press)
const;
148 const TabulatedFunction& tempVdTable_;
151 const int pvtRegionIdx_;
154 Scalar density(
const Scalar depth,
155 const Scalar press)
const;
160template <
class Flu
idSystem,
class Region>
164 using Scalar =
typename FluidSystem::Scalar;
165 using VSpan = std::array<Scalar, 2>;
176 const int samplePoints = 2000);
250 FluidSystem,
typename Region::CalcDissolution
254 FluidSystem,
typename Region::CalcEvaporation,
typename Region::CalcWaterEvaporation
264 (
const Region&,
const VSpan&);
269 std::unique_ptr<OPress> oil_{};
270 std::unique_ptr<GPress> gas_{};
271 std::unique_ptr<WPress> wat_{};
273 template <
typename PressFunc>
274 void checkPtr(
const PressFunc* phasePress,
275 const std::string& phaseName)
const;
277 Strategy selectEquilibrationStrategy(
const Region& reg)
const;
281 void equil_WOG(
const Region& reg,
const VSpan& span);
282 void equil_GOW(
const Region& reg,
const VSpan& span);
283 void equil_OWG(
const Region& reg,
const VSpan& span);
285 void makeOilPressure(
const typename OPress::InitCond& ic,
289 void makeGasPressure(
const typename GPress::InitCond& ic,
293 void makeWatPressure(
const typename WPress::InitCond& ic,
301template<
class Scalar>
348template <
class MaterialLawManager,
class Flu
idSystem,
class Region,
typename CellID>
352 using Scalar =
typename FluidSystem::Scalar;
372 const std::vector<Scalar>& swatInit);
414 struct EvaluationPoint {
415 const Position* position{
nullptr};
416 const Region* region {
nullptr};
417 const PTable* ptable {
nullptr};
423 using FluidState = ::Opm::
424 SimpleModularFluidState<
Scalar, 3, 3,
436 using MaterialLaw =
typename MaterialLawManager::MaterialLaw;
439 using PhaseIdx = std::remove_cv_t<
440 std::remove_reference_t<
decltype(FluidSystem::oilPhaseIdx)>
444 MaterialLawManager& matLawMgr_;
447 const std::vector<Scalar>& swatInit_;
450 PhaseQuantityValue<Scalar> sat_;
453 PhaseQuantityValue<Scalar> press_;
456 EvaluationPoint evalPt_;
459 FluidState fluidState_;
462 std::array<Scalar, FluidSystem::numPhases> matLawCapPress_;
473 void setEvaluationPoint(
const Position& x,
480 void initializePhaseQuantities();
499 void deriveWaterSat();
503 void fixUnphysicalTransition();
507 void accountForScaledSaturations();
523 std::pair<Scalar, bool> applySwatInit(
const Scalar pcow);
537 std::pair<Scalar, bool> applySwatInit(
const Scalar pc,
const Scalar sw);
541 void computeMaterialLawCapPress();
545 Scalar materialLawCapPressGasOil()
const;
549 Scalar materialLawCapPressOilWater()
const;
553 Scalar materialLawCapPressGasWater()
const;
562 bool isConstCapPress(
const PhaseIdx phaseIdx)
const;
569 bool isOverlappingTransition()
const;
591 const PhaseIdx phasePos,
592 const bool isincr)
const;
612 const PhaseIdx phasePos,
613 const bool isincr)
const;
616 PhaseIdx oilPos()
const
618 return FluidSystem::oilPhaseIdx;
622 PhaseIdx gasPos()
const
624 return FluidSystem::gasPhaseIdx;
628 PhaseIdx waterPos()
const
630 return FluidSystem::waterPhaseIdx;
636template <
typename CellRange,
class Scalar>
638 const std::vector<std::pair<Scalar, Scalar>>&
cellZMinMax,
640 std::array<Scalar,2>& span);
642template <
class Scalar,
class Element>
643std::pair<Scalar,Scalar>
cellZMinMax(
const Element& element);
647namespace DeckDependent {
649template<
class FluidSystem,
653 class CartesianIndexMapper>
656 using Element =
typename GridView::template Codim<0>::Entity;
657 using Scalar =
typename FluidSystem::Scalar;
659 template<
class MaterialLawManager>
661 const EclipseState& eclipseState,
663 const GridView& gridView,
664 const CartesianIndexMapper& cartMapper,
666 const int num_pressure_points = 2000,
667 const bool applySwatInit =
true);
669 using Vec = std::vector<Scalar>;
677 const Vec&
rs()
const {
return rs_; }
678 const Vec&
rv()
const {
return rv_; }
682 template <
class RMap>
683 void updateInitialTemperature_(
const EclipseState& eclState,
const RMap& reg);
685 template <
class RMap>
686 void updateInitialSaltConcentration_(
const EclipseState& eclState,
const RMap& reg);
688 template <
class RMap>
689 void updateInitialSaltSaturation_(
const EclipseState& eclState,
const RMap& reg);
691 void updateCellProps_(
const GridView& gridView,
692 const NumericalAquifers& aquifer);
694 void applyNumericalAquifers_(
const GridView& gridView,
695 const NumericalAquifers& aquifer,
696 const bool co2store_or_h2store);
699 void setRegionPvtIdx(
const EclipseState& eclState,
const GridView& gridView,
const RMap& reg);
701 template <
class RMap,
class MaterialLawManager,
class Comm>
702 void calcPressSatRsRv(
const RMap& reg,
703 const std::vector<EquilRecord>& rec,
704 MaterialLawManager& materialLawManager,
705 const GridView& gridView,
709 template <
class CellRange,
class EquilibrationMethod>
710 void cellLoop(
const CellRange& cells,
711 EquilibrationMethod&& eqmethod);
713 template <
class CellRange,
class PressTable,
class PhaseSat>
714 void equilibrateCellCentres(
const CellRange& cells,
716 const PressTable& ptable,
719 template <
class CellRange,
class PressTable,
class PhaseSat>
720 void equilibrateHorizontal(
const CellRange& cells,
723 const PressTable& ptable,
726 template<
class CellRange,
class PressTable,
class PhaseSat>
727 void equilibrateTiltedFaultBlock(
const CellRange& cells,
729 const GridView& gridView,
const int numLevels,
730 const PressTable& ptable, PhaseSat& psat);
732 template<
class CellRange,
class PressTable,
class PhaseSat>
733 void equilibrateTiltedFaultBlockSimple(
const CellRange& cells,
735 const GridView& gridView,
const int numLevels,
736 const PressTable& ptable, PhaseSat& psat);
738 std::vector< std::shared_ptr<Miscibility::RsFunction<Scalar>> > rsFunc_;
739 std::vector< std::shared_ptr<Miscibility::RsFunction<Scalar>> > rvFunc_;
740 std::vector< std::shared_ptr<Miscibility::RsFunction<Scalar>> > rvwFunc_;
741 using TabulatedFunction = Tabulated1DFunction<Scalar>;
742 std::vector<TabulatedFunction> tempVdTable_;
743 std::vector<TabulatedFunction> saltVdTable_;
744 std::vector<TabulatedFunction> saltpVdTable_;
745 std::vector<int> regionPvtIdx_;
747 Vec saltConcentration_;
754 const CartesianIndexMapper& cartesianIndexMapper_;
756 Vec cellCenterDepth_;
757 std::vector<std::pair<Scalar,Scalar>> cellCenterXY_;
758 std::vector<std::pair<Scalar,Scalar>> cellZSpan_;
759 std::vector<std::pair<Scalar,Scalar>> cellZMinMax_;
760 std::vector<CellCornerData<Scalar>> cellCorners_;
761 int num_pressure_points_;
Dune::OwnerOverlapCopyCommunication< int, int > Comm
Definition: FlexibleSolver_impl.hpp:394
The ODE integrator and phase-pressure function used to solve the hydrostatic equilibrium problem,...
Definition: InitStateEquil.hpp:655
std::vector< Vec > PVec
Definition: InitStateEquil.hpp:670
const PVec & press() const
Definition: InitStateEquil.hpp:675
const Vec & rvw() const
Definition: InitStateEquil.hpp:679
InitialStateComputer(MaterialLawManager &materialLawManager, const EclipseState &eclipseState, const Grid &grid, const GridView &gridView, const CartesianIndexMapper &cartMapper, const Scalar grav, const int num_pressure_points=2000, const bool applySwatInit=true)
Definition: InitStateEquil_impl.hpp:1359
const Vec & rv() const
Definition: InitStateEquil.hpp:678
const Vec & saltSaturation() const
Definition: InitStateEquil.hpp:674
const Vec & saltConcentration() const
Definition: InitStateEquil.hpp:673
const Vec & temperature() const
Definition: InitStateEquil.hpp:672
std::vector< Scalar > Vec
Definition: InitStateEquil.hpp:669
const Vec & rs() const
Definition: InitStateEquil.hpp:677
const PVec & saturation() const
Definition: InitStateEquil.hpp:676
Definition: InitStateEquil.hpp:133
Gas(const TabulatedFunction &tempVdTable, const RV &rv, const RVW &rvw, const int pvtRegionIdx, const Scalar normGrav)
Definition: InitStateEquil_impl.hpp:411
Scalar operator()(const Scalar depth, const Scalar press) const
Definition: InitStateEquil_impl.hpp:427
Definition: InitStateEquil.hpp:108
Oil(const TabulatedFunction &tempVdTable, const RS &rs, const int pvtRegionIdx, const Scalar normGrav)
Definition: InitStateEquil_impl.hpp:363
Scalar operator()(const Scalar depth, const Scalar press) const
Definition: InitStateEquil_impl.hpp:377
Definition: InitStateEquil.hpp:83
Scalar operator()(const Scalar depth, const Scalar press) const
Definition: InitStateEquil_impl.hpp:337
Water(const TabulatedFunction &tempVdTable, const TabulatedFunction &saltVdTable, const int pvtRegionIdx, const Scalar normGrav)
Definition: InitStateEquil_impl.hpp:323
Definition: InitStateEquil.hpp:350
const PhaseQuantityValue< Scalar > & deriveSaturations(const Position &x, const Region ®, const PTable &ptable)
Definition: InitStateEquil_impl.hpp:587
PhaseSaturations(MaterialLawManager &matLawMgr, const std::vector< Scalar > &swatInit)
Definition: InitStateEquil_impl.hpp:563
typename FluidSystem::Scalar Scalar
Definition: InitStateEquil.hpp:352
PressureTable< FluidSystem, Region > PTable
Convenience type alias.
Definition: InitStateEquil.hpp:362
PhaseSaturations & operator=(const PhaseSaturations &)=delete
Disabled assignment operator.
PhaseSaturations & operator=(PhaseSaturations &&)=delete
Disabled move-assignment operator.
const PhaseQuantityValue< Scalar > & correctedPhasePressures() const
Definition: InitStateEquil.hpp:406
Definition: PressureFunction.hpp:128
Definition: InitStateEquil.hpp:162
PressureTable & operator=(const PressureTable &rhs)
Definition: InitStateEquil_impl.hpp:1027
Scalar water(const Scalar depth) const
Definition: InitStateEquil_impl.hpp:1107
Scalar gas(const Scalar depth) const
Definition: InitStateEquil_impl.hpp:1096
bool waterActive() const
Predicate for whether or not water is an active phase.
Definition: InitStateEquil_impl.hpp:1078
bool gasActive() const
Predicate for whether or not gas is an active phase.
Definition: InitStateEquil_impl.hpp:1071
Scalar oil(const Scalar depth) const
Definition: InitStateEquil_impl.hpp:1086
std::array< Scalar, 2 > VSpan
Definition: InitStateEquil.hpp:165
bool oilActive() const
Predicate for whether or not oil is an active phase.
Definition: InitStateEquil_impl.hpp:1064
typename FluidSystem::Scalar Scalar
Definition: InitStateEquil.hpp:164
void equilibrate(const Region ®, const VSpan &span)
Definition: InitStateEquil_impl.hpp:1053
PressureTable(const Scalar gravity, const int samplePoints=2000)
Definition: InitStateEquil_impl.hpp:997
Definition: EquilibrationHelpers.hpp:676
std::pair< Scalar, Scalar > cellZMinMax(const Element &element)
Definition: InitStateEquil_impl.hpp:187
void verticalExtent(const CellRange &cells, const std::vector< std::pair< Scalar, Scalar > > &cellZMinMax, const Parallel::Communication &comm, std::array< Scalar, 2 > &span)
Definition: InitStateEquil_impl.hpp:70
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Definition: blackoilbioeffectsmodules.hh:45
The Opm property system, traits with inheritance.
Definition: InitStateEquil.hpp:62
std::array< Scalar, 8 > X
Definition: InitStateEquil.hpp:63
std::array< Scalar, 8 > Y
Definition: InitStateEquil.hpp:64
CellCornerData(const std::array< Scalar, 8 > &x, const std::array< Scalar, 8 > &y, const std::array< Scalar, 8 > &z)
Definition: InitStateEquil.hpp:68
std::array< Scalar, 8 > Z
Definition: InitStateEquil.hpp:65
Simple set of per-phase (named by primary component) quantities.
Definition: InitStateEquil.hpp:302
void reset()
Definition: InitStateEquil.hpp:325
Scalar gas
Definition: InitStateEquil.hpp:304
Scalar water
Definition: InitStateEquil.hpp:305
PhaseQuantityValue & operator/=(const Scalar x)
Definition: InitStateEquil.hpp:316
Scalar oil
Definition: InitStateEquil.hpp:303
PhaseQuantityValue & axpy(const PhaseQuantityValue &rhs, const Scalar a)
Definition: InitStateEquil.hpp:307
Definition: InitStateEquil.hpp:356
CellID cell
Definition: InitStateEquil.hpp:357
Scalar depth
Definition: InitStateEquil.hpp:358