28#error "Eclipse input support in opm-common is required to use the ECL material manager!"
31#ifndef OPM_ECL_MATERIAL_LAW_MANAGER_HPP
32#define OPM_ECL_MATERIAL_LAW_MANAGER_HPP
34#include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp>
42#include <opm/input/eclipse/EclipseState/Tables/TableColumn.hpp>
43#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
54class EclEpsGridProperties;
55template<
class Scalar>
class EclEpsScalingPoints;
56template<
class Scalar>
struct EclEpsScalingPointsInfo;
57class EclHysteresisConfig;
70template <
class TraitsT>
74 using Traits = TraitsT;
75 using Scalar =
typename Traits::Scalar;
76 enum { waterPhaseIdx = Traits::wettingPhaseIdx };
77 enum { oilPhaseIdx = Traits::nonWettingPhaseIdx };
78 enum { gasPhaseIdx = Traits::gasPhaseIdx };
79 enum { numPhases = Traits::numPhases };
90 using GasOilEffectiveTwoPhaseParams =
typename GasOilEffectiveTwoPhaseLaw::Params;
91 using OilWaterEffectiveTwoPhaseParams =
typename OilWaterEffectiveTwoPhaseLaw::Params;
92 using GasWaterEffectiveTwoPhaseParams =
typename GasWaterEffectiveTwoPhaseLaw::Params;
98 using GasOilEpsTwoPhaseParams =
typename GasOilEpsTwoPhaseLaw::Params;
99 using OilWaterEpsTwoPhaseParams =
typename OilWaterEpsTwoPhaseLaw::Params;
100 using GasWaterEpsTwoPhaseParams =
typename GasWaterEpsTwoPhaseLaw::Params;
106 using GasOilTwoPhaseHystParams =
typename GasOilTwoPhaseLaw::Params;
107 using OilWaterTwoPhaseHystParams =
typename OilWaterTwoPhaseLaw::Params;
108 using GasWaterTwoPhaseHystParams =
typename GasWaterTwoPhaseLaw::Params;
113 using MaterialLawParams =
typename MaterialLaw::Params;
114 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
121 using GasOilEffectiveParamVector = std::vector<std::shared_ptr<GasOilEffectiveTwoPhaseParams>>;
122 using OilWaterEffectiveParamVector = std::vector<std::shared_ptr<OilWaterEffectiveTwoPhaseParams>>;
123 using GasWaterEffectiveParamVector = std::vector<std::shared_ptr<GasWaterEffectiveTwoPhaseParams>>;
125 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
126 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
127 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
128 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
129 using GasOilParamVector = std::vector<std::shared_ptr<GasOilTwoPhaseHystParams>>;
130 using OilWaterParamVector = std::vector<std::shared_ptr<OilWaterTwoPhaseHystParams>>;
131 using GasWaterParamVector = std::vector<std::shared_ptr<GasWaterTwoPhaseHystParams>>;
132 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
143 void copySatnumArrays_();
144 void copyIntArray_(std::vector<int>& dest,
const std::string keyword);
145 unsigned imbRegion_(std::vector<int>& array,
unsigned elemIdx);
147 std::vector<std::vector<int>*>& satnumArray,
148 std::vector<std::vector<int>*>& imbnumArray,
149 std::vector<std::vector<MaterialLawParams>*>& mlpArray);
150 void initMaterialLawParamVectors_();
151 void initOilWaterScaledEpsInfo_();
152 void initSatnumRegionArray_();
153 void initThreePhaseParams_(
154 HystParams &hystParams,
155 MaterialLawParams& materialParams,
156 unsigned satRegionIdx,
158 void readEffectiveParameters_();
159 void readUnscaledEpsPointsVectors_();
160 template <
class Container>
161 void readUnscaledEpsPoints_(Container& dest, std::shared_ptr<EclEpsConfig> config,
EclTwoPhaseSystemType system_type);
162 unsigned satRegion_(std::vector<int>& array,
unsigned elemIdx);
163 unsigned satOrImbRegion_(std::vector<int>& array, std::vector<int>& default_vec,
unsigned elemIdx);
170 std::shared_ptr<GasOilTwoPhaseHystParams> getGasOilParams();
171 std::shared_ptr<OilWaterTwoPhaseHystParams> getOilWaterParams();
172 std::shared_ptr<GasWaterTwoPhaseHystParams> getGasWaterParams();
174 void setDrainageParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx);
175 void setDrainageParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx);
176 void setDrainageParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx);
177 void setImbibitionParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx);
178 void setImbibitionParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx);
179 void setImbibitionParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx);
194 std::shared_ptr<GasOilTwoPhaseHystParams> gasOilParams_;
195 std::shared_ptr<OilWaterTwoPhaseHystParams> oilWaterParams_;
196 std::shared_ptr<GasWaterTwoPhaseHystParams> gasWaterParams_;
200 class ReadEffectiveParams {
205 std::vector<double> normalizeKrValues_(
const double tolcrit,
const TableColumn& krValues)
const;
206 void readGasOilParameters_(GasOilEffectiveParamVector& dest,
unsigned satRegionIdx);
207 template <
class TableType>
208 void readGasOilFamily2_(
209 GasOilEffectiveTwoPhaseParams& effParams,
211 const double tolcrit,
212 const TableType& sofTable,
214 const std::string& columnName);
215 void readGasOilSgof_(GasOilEffectiveTwoPhaseParams& effParams,
217 const double tolcrit,
220 void readGasOilSlgof_(GasOilEffectiveTwoPhaseParams& effParams,
222 const double tolcrit,
224 void readGasWaterParameters_(GasWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
225 void readOilWaterParameters_(OilWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
234 size_t numCompressedElems_;
236 std::unique_ptr<EclEpsGridProperties> epsImbGridProperties_;
237 std::unique_ptr<EclEpsGridProperties> epsGridProperties_;
244 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems);
258 bool enableEndPointScaling()
const
259 {
return enableEndPointScaling_; }
261 bool enableHysteresis()
const
262 {
return hysteresisConfig_->enableHysteresis(); }
264 MaterialLawParams& materialLawParams(
unsigned elemIdx)
266 assert(elemIdx < materialLawParams_.size());
267 return materialLawParams_[elemIdx];
270 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
272 assert(elemIdx < materialLawParams_.size());
273 return materialLawParams_[elemIdx];
276 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
278 return materialLawParamsFunc_(elemIdx, facedir);
281 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
283 return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir));
296 int satnumRegionIdx(
unsigned elemIdx)
const
297 {
return satnumRegionArray_[elemIdx]; }
299 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
301 bool hasDirectionalRelperms()
const
303 return !krnumXArray_.empty() || !krnumYArray_.empty() || !krnumZArray_.empty();
306 bool hasDirectionalImbnum()
const {
307 if (imbnumXArray_.size() > 0 || imbnumYArray_.size() > 0 || imbnumZArray_.size() > 0) {
313 int imbnumRegionIdx(
unsigned elemIdx)
const
314 {
return imbnumRegionArray_[elemIdx]; }
316 template <
class Flu
idState>
317 void updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
319 if (!enableHysteresis())
323 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
324 using Dir = FaceDir::DirEnum;
325 constexpr int ndim = 3;
326 Dir facedirs[ndim] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
327 for (
int i = 0; i<ndim; i++) {
333 void oilWaterHysteresisParams(Scalar& pcSwMdc,
335 unsigned elemIdx)
const;
337 void setOilWaterHysteresisParams(
const Scalar& pcSwMdc,
338 const Scalar& krnSwMdc,
341 void gasOilHysteresisParams(Scalar& pcSwMdc,
343 unsigned elemIdx)
const;
345 void setGasOilHysteresisParams(
const Scalar& pcSwMdc,
346 const Scalar& krnSwMdc,
349 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
351 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(
size_t elemIdx)
const
352 {
return oilWaterScaledEpsInfoDrainage_[elemIdx]; }
354 template<
class Serializer>
355 void serializeOp(Serializer& serializer)
361 for (
auto& mat : materialLawParams_) {
367 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
369 void readGlobalEpsOptions_(
const EclipseState& eclState);
371 void readGlobalHysteresisOptions_(
const EclipseState& state);
373 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
375 bool enableEndPointScaling_;
376 std::shared_ptr<EclHysteresisConfig> hysteresisConfig_;
378 std::shared_ptr<EclEpsConfig> oilWaterEclEpsConfig_;
379 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
380 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage_;
382 std::shared_ptr<EclEpsConfig> gasWaterEclEpsConfig_;
384 GasOilScalingPointsVector gasOilUnscaledPointsVector_;
385 OilWaterScalingPointsVector oilWaterUnscaledPointsVector_;
386 GasWaterScalingPointsVector gasWaterUnscaledPointsVector_;
388 GasOilEffectiveParamVector gasOilEffectiveParamVector_;
389 OilWaterEffectiveParamVector oilWaterEffectiveParamVector_;
390 GasWaterEffectiveParamVector gasWaterEffectiveParamVector_;
392 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
394 enum EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
396 std::vector<MaterialLawParams> materialLawParams_;
397 DirectionalMaterialLawParamsPtr dirMaterialLawParams_;
399 std::vector<int> satnumRegionArray_;
400 std::vector<int> krnumXArray_;
401 std::vector<int> krnumYArray_;
402 std::vector<int> krnumZArray_;
403 std::vector<int> imbnumXArray_;
404 std::vector<int> imbnumYArray_;
405 std::vector<int> imbnumZArray_;
406 std::vector<int> imbnumRegionArray_;
407 std::vector<Scalar> stoneEtas_;
413 std::shared_ptr<EclEpsConfig> gasOilConfig_;
414 std::shared_ptr<EclEpsConfig> oilWaterConfig_;
415 std::shared_ptr<EclEpsConfig> gasWaterConfig_;
This file contains definitions related to directional material law parameters.
This file contains helper classes for the material laws.
Collects all grid properties which are relevant for end point scaling.
Definition: EclEpsGridProperties.hpp:47
Represents the points on the X and Y axis to be scaled if endpoint scaling is used.
Definition: EclEpsScalingPoints.hpp:166
This material law takes a material law defined for unscaled saturation and converts it to a material ...
Definition: EclEpsTwoPhaseLaw.hpp:51
This material law implements the hysteresis model of the ECL file format.
Definition: EclHysteresisTwoPhaseLaw.hpp:44
Provides an simple way to create and manage the material law objects for a complete ECL deck.
Definition: EclMaterialLawManager.hpp:72
const MaterialLawParams & connectionMaterialLawParams(unsigned satRegionIdx, unsigned elemIdx) const
Returns a material parameter object for a given element and saturation region.
Scalar applySwatinit(unsigned elemIdx, Scalar pcow, Scalar Sw)
Modify the initial condition according to the SWATINIT keyword.
Implements a multiplexer class that provides all three phase capillary pressure laws used by the ECLi...
Definition: EclMultiplexerMaterial.hpp:58
static void updateHysteresis(Params ¶ms, const FluidState &fluidState)
Update the hysteresis parameters after a time step.
Definition: EclMultiplexerMaterial.hpp:547
Definition: EclipseState.hpp:55
Implements a multiplexer class that provides LET curves and piecewise linear saturation functions.
Definition: SatCurveMultiplexer.hpp:44
Definition: SgfnTable.hpp:28
Definition: SgofTable.hpp:27
Definition: SlgofTable.hpp:28
Definition: TableColumn.hpp:32
A generic traits class for two-phase material laws.
Definition: MaterialTraits.hpp:61
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
EclTwoPhaseSystemType
Specified which fluids are involved in a given twophase material law for endpoint scaling.
Definition: EclEpsConfig.hpp:42