28 #ifndef OPM_ECL_MATERIAL_LAW_MANAGER_HPP 29 #define OPM_ECL_MATERIAL_LAW_MANAGER_HPP 31 #include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp> 32 #include <opm/input/eclipse/EclipseState/WagHysteresisConfig.hpp> 51 class EclEpsGridProperties;
52 template<
class Scalar>
class EclEpsScalingPoints;
53 template<
class Scalar>
struct EclEpsScalingPointsInfo;
54 class EclHysteresisConfig;
56 class FieldPropsManager;
67 template<
class Traits>
class InitParams;
75 template <
class TraitsT>
78 using Traits = TraitsT;
79 using Scalar =
typename Traits::Scalar;
80 static constexpr
int gasPhaseIdx = Traits::gasPhaseIdx;
81 static constexpr
int oilPhaseIdx = Traits::nonWettingPhaseIdx;
82 static constexpr
int waterPhaseIdx = Traits::wettingPhaseIdx;
83 static constexpr
int numPhases = Traits::numPhases;
84 using GasOilEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilEffectiveParamVector;
85 using GasWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterEffectiveParamVector;
86 using OilWaterEffectiveParamVector =
typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterEffectiveParamVector;
90 using MaterialLaw = EclMultiplexerMaterial<Traits,
91 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasOilLaw,
92 typename EclMaterialLaw::TwoPhaseTypes<Traits>::OilWaterLaw,
93 typename EclMaterialLaw::TwoPhaseTypes<Traits>::GasWaterLaw>;
94 using MaterialLawParams =
typename MaterialLaw::Params;
95 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
98 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
99 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
100 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
101 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
102 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
107 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage{};
108 GasOilEffectiveParamVector gasOilEffectiveParamVector{};
109 OilWaterEffectiveParamVector oilWaterEffectiveParamVector{};
110 GasWaterEffectiveParamVector gasWaterEffectiveParamVector{};
111 GasOilScalingPointsVector gasOilUnscaledPointsVector{};
112 OilWaterScalingPointsVector oilWaterUnscaledPointsVector{};
113 GasWaterScalingPointsVector gasWaterUnscaledPointsVector{};
114 std::vector<int> krnumXArray{};
115 std::vector<int> krnumYArray{};
116 std::vector<int> krnumZArray{};
117 std::vector<int> imbnumXArray{};
118 std::vector<int> imbnumYArray{};
119 std::vector<int> imbnumZArray{};
120 std::vector<int> satnumRegionArray{};
121 std::vector<int> imbnumRegionArray{};
122 std::vector<MaterialLawParams> materialLawParams{};
123 DirectionalMaterialLawParamsPtr dirMaterialLawParams{};
124 bool onlyPiecewiseLinear =
true;
126 bool hasDirectionalRelperms()
const 128 return !krnumXArray.empty() ||
129 !krnumYArray.empty() ||
130 !krnumZArray.empty();
133 bool hasDirectionalImbnum()
const 135 return !imbnumXArray.empty() ||
136 !imbnumYArray.empty() ||
137 !imbnumZArray.empty();
147 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems,
148 const std::function<std::vector<int>(
const FieldPropsManager&,
const std::string&,
bool)>&
149 fieldPropIntOnLeafAssigner,
150 const std::function<
unsigned(
unsigned)>& lookupIdxOnLevelZeroAssigner);
160 std::pair<Scalar, bool>
175 bool enableEndPointScaling()
const 176 {
return enableEndPointScaling_; }
178 bool enablePpcwmax()
const 179 {
return enablePpcwmax_; }
182 {
return hysteresisConfig_; }
184 bool enableHysteresis()
const 187 bool enablePCHysteresis()
const 188 {
return hysteresisConfig_.enablePCHysteresis(); }
190 bool enableWettingHysteresis()
const 191 {
return hysteresisConfig_.enableWettingHysteresis(); }
193 bool enableNonWettingHysteresis()
const 194 {
return hysteresisConfig_.enableNonWettingHysteresis(); }
202 bool hasWater()
const 203 {
return hasWater_; }
205 const EclEpsScalingPointsInfo<Scalar>& unscaledEpsInfo(
unsigned satRegionIdx)
const 206 {
return unscaledEpsInfo_[satRegionIdx]; }
208 std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>
209 wagHystersisConfig(
unsigned satRegionIdx)
const 210 {
return wagHystersisConfig_[satRegionIdx]; }
212 const EclEpsConfig& gasOilConfig()
const 213 {
return gasOilConfig_; }
215 const EclEpsConfig& gasWaterConfig()
const 216 {
return gasWaterConfig_; }
218 const EclEpsConfig& oilWaterConfig()
const 219 {
return oilWaterConfig_; }
221 MaterialLawParams& materialLawParams(
unsigned elemIdx)
223 assert(elemIdx < params_.materialLawParams.size());
224 return params_.materialLawParams[elemIdx];
227 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const 229 assert(elemIdx < params_.materialLawParams.size());
230 return params_.materialLawParams[elemIdx];
233 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const 234 {
return materialLawParamsFunc_(elemIdx, facedir); }
236 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
237 {
return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir)); }
249 int satnumRegionIdx(
unsigned elemIdx)
const 250 {
return params_.satnumRegionArray[elemIdx]; }
252 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
254 bool hasDirectionalRelperms()
const 255 {
return params_.hasDirectionalRelperms(); }
257 bool hasDirectionalImbnum()
const 258 {
return params_.hasDirectionalImbnum(); }
260 int imbnumRegionIdx(
unsigned elemIdx)
const 261 {
return params_.imbnumRegionArray[elemIdx]; }
263 EclMultiplexerApproach threePhaseApproach()
const 264 {
return threePhaseApproach_; }
266 EclTwoPhaseApproach twoPhaseApproach()
const 267 {
return twoPhaseApproach_; }
269 const std::vector<Scalar>& stoneEtas()
const 270 {
return stoneEtas_; }
272 template <
class Flu
idState>
273 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
275 OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
276 if (!enableHysteresis())
279 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
280 using Dir = FaceDir::DirEnum;
281 constexpr
int ndim = 3;
282 const Dir facedirs[] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
283 for (
int i = 0; i<ndim; i++) {
284 const bool ischanged =
286 changed = changed || ischanged;
292 void oilWaterHysteresisParams(Scalar& soMax,
295 unsigned elemIdx)
const;
297 void setOilWaterHysteresisParams(
const Scalar& soMax,
302 void gasOilHysteresisParams(Scalar& sgmax,
305 unsigned elemIdx)
const;
307 void setGasOilHysteresisParams(
const Scalar& sgmax,
312 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
314 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(
size_t elemIdx)
const 315 {
return params_.oilWaterScaledEpsInfoDrainage[elemIdx]; }
317 template<
class Serializer>
318 void serializeOp(Serializer& serializer)
324 for (
auto& mat : params_.materialLawParams) {
329 bool satCurveIsAllPiecewiseLinear()
const 331 return this->params_.onlyPiecewiseLinear;
335 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
337 void readGlobalEpsOptions_(
const EclipseState& eclState);
339 void readGlobalHysteresisOptions_(
const EclipseState& state);
341 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
343 bool enableEndPointScaling_{
false};
344 EclHysteresisConfig hysteresisConfig_;
345 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
347 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
351 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
353 EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
355 std::vector<Scalar> stoneEtas_;
357 bool enablePpcwmax_{
false};
358 std::vector<Scalar> maxAllowPc_;
359 std::vector<bool> modifySwl_;
363 bool hasWater_{
true};
365 EclEpsConfig gasOilConfig_;
366 EclEpsConfig oilWaterConfig_;
367 EclEpsConfig gasWaterConfig_;
This material law implements the hysteresis model of the ECL file format.
EclTwoPhaseSystemType
Specified which fluids are involved in a given twophase material law for endpoint scaling...
Definition: EclEpsConfig.hpp:40
static bool updateHysteresis(Params ¶ms, const FluidState &fluidState)
Update the hysteresis parameters after a time step.
Definition: EclMultiplexerMaterial.hpp:555
Definition: EclMaterialLawHystParams.cpp:28
This file contains definitions related to directional material law parameters.
Definition: FieldPropsManager.hpp:42
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
This file contains helper classes for the material laws.
Definition: EclipseState.hpp:66
This material law takes a material law defined for unscaled saturation and converts it to a material ...
const MaterialLawParams & connectionMaterialLawParams(unsigned satRegionIdx, unsigned elemIdx) const
Returns a material parameter object for a given element and saturation region.
Definition: EclMaterialLawManager.cpp:244
Specifies the configuration used by the ECL kr/pC hysteresis code.
Definition: EclHysteresisConfig.hpp:39
Specifies the configuration used by the endpoint scaling code.
std::pair< Scalar, bool > applySwatinit(unsigned elemIdx, Scalar pcow, Scalar Sw)
Modify the initial condition according to the SWATINIT keyword.
Definition: EclMaterialLawManager.cpp:136
bool enableHysteresis() const
Returns whether hysteresis is enabled.
Definition: EclHysteresisConfig.hpp:51
Implements a multiplexer class that provides all three phase capillary pressure laws used by the ECLi...
void applyRestartSwatInit(const unsigned elemIdx, const Scalar maxPcow)
Apply SWATINIT-like scaling of oil/water capillary pressure curve at simulation restart.
Definition: EclMaterialLawManager.cpp:211
Definition: EclMaterialLawManager.hpp:105
Implements a multiplexer class that provides LET curves and piecewise linear saturation functions...