75 using Traits = TraitsT;
76 using Scalar =
typename Traits::Scalar;
77 enum { waterPhaseIdx = Traits::wettingPhaseIdx };
78 enum { oilPhaseIdx = Traits::nonWettingPhaseIdx };
79 enum { gasPhaseIdx = Traits::gasPhaseIdx };
80 enum { numPhases = Traits::numPhases };
91 using GasOilEffectiveTwoPhaseParams =
typename GasOilEffectiveTwoPhaseLaw::Params;
92 using OilWaterEffectiveTwoPhaseParams =
typename OilWaterEffectiveTwoPhaseLaw::Params;
93 using GasWaterEffectiveTwoPhaseParams =
typename GasWaterEffectiveTwoPhaseLaw::Params;
99 using GasOilEpsTwoPhaseParams =
typename GasOilEpsTwoPhaseLaw::Params;
100 using OilWaterEpsTwoPhaseParams =
typename OilWaterEpsTwoPhaseLaw::Params;
101 using GasWaterEpsTwoPhaseParams =
typename GasWaterEpsTwoPhaseLaw::Params;
107 using GasOilTwoPhaseHystParams =
typename GasOilTwoPhaseLaw::Params;
108 using OilWaterTwoPhaseHystParams =
typename OilWaterTwoPhaseLaw::Params;
109 using GasWaterTwoPhaseHystParams =
typename GasWaterTwoPhaseLaw::Params;
114 using MaterialLawParams =
typename MaterialLaw::Params;
115 using DirectionalMaterialLawParamsPtr = std::unique_ptr<DirectionalMaterialLawParams<MaterialLawParams>>;
122 using GasOilEffectiveParamVector = std::vector<std::shared_ptr<GasOilEffectiveTwoPhaseParams>>;
123 using OilWaterEffectiveParamVector = std::vector<std::shared_ptr<OilWaterEffectiveTwoPhaseParams>>;
124 using GasWaterEffectiveParamVector = std::vector<std::shared_ptr<GasWaterEffectiveTwoPhaseParams>>;
126 using GasOilScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
127 using OilWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
128 using GasWaterScalingPointsVector = std::vector<std::shared_ptr<EclEpsScalingPoints<Scalar>>>;
129 using OilWaterScalingInfoVector = std::vector<EclEpsScalingPointsInfo<Scalar>>;
130 using GasOilParamVector = std::vector<std::shared_ptr<GasOilTwoPhaseHystParams>>;
131 using OilWaterParamVector = std::vector<std::shared_ptr<OilWaterTwoPhaseHystParams>>;
132 using GasWaterParamVector = std::vector<std::shared_ptr<GasWaterTwoPhaseHystParams>>;
133 using MaterialLawParamsVector = std::vector<std::shared_ptr<MaterialLawParams>>;
144 void copySatnumArrays_();
145 void copyIntArray_(std::vector<int>& dest,
const std::string keyword);
146 unsigned imbRegion_(std::vector<int>& array,
unsigned elemIdx);
148 std::vector<std::vector<int>*>& satnumArray,
149 std::vector<std::vector<int>*>& imbnumArray,
150 std::vector<std::vector<MaterialLawParams>*>& mlpArray);
151 void initMaterialLawParamVectors_();
152 void initOilWaterScaledEpsInfo_();
153 void initSatnumRegionArray_();
154 void initThreePhaseParams_(
155 HystParams &hystParams,
156 MaterialLawParams& materialParams,
157 unsigned satRegionIdx,
159 void readEffectiveParameters_();
160 void readUnscaledEpsPointsVectors_();
161 template <
class Container>
162 void readUnscaledEpsPoints_(Container& dest, std::shared_ptr<EclEpsConfig> config,
EclTwoPhaseSystemType system_type);
163 unsigned satRegion_(std::vector<int>& array,
unsigned elemIdx);
164 unsigned satOrImbRegion_(std::vector<int>& array, std::vector<int>& default_vec,
unsigned elemIdx);
171 std::shared_ptr<GasOilTwoPhaseHystParams> getGasOilParams();
172 std::shared_ptr<OilWaterTwoPhaseHystParams> getOilWaterParams();
173 std::shared_ptr<GasWaterTwoPhaseHystParams> getGasWaterParams();
174 void setConfig(
unsigned satRegionIdx);
175 void setDrainageParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx);
176 void setDrainageParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx);
177 void setDrainageParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx);
178 void setImbibitionParamsOilGas(
unsigned elemIdx,
unsigned satRegionIdx);
179 void setImbibitionParamsOilWater(
unsigned elemIdx,
unsigned satRegionIdx);
180 void setImbibitionParamsGasWater(
unsigned elemIdx,
unsigned satRegionIdx);
195 std::shared_ptr<GasOilTwoPhaseHystParams> gasOilParams_;
196 std::shared_ptr<OilWaterTwoPhaseHystParams> oilWaterParams_;
197 std::shared_ptr<GasWaterTwoPhaseHystParams> gasWaterParams_;
201 class ReadEffectiveParams {
206 std::vector<double> normalizeKrValues_(
const double tolcrit,
const TableColumn& krValues)
const;
207 void readGasOilParameters_(GasOilEffectiveParamVector& dest,
unsigned satRegionIdx);
208 template <
class TableType>
209 void readGasOilFamily2_(
210 GasOilEffectiveTwoPhaseParams& effParams,
212 const double tolcrit,
213 const TableType& sofTable,
215 const std::string& columnName);
216 void readGasOilSgof_(GasOilEffectiveTwoPhaseParams& effParams,
218 const double tolcrit,
221 void readGasOilSlgof_(GasOilEffectiveTwoPhaseParams& effParams,
223 const double tolcrit,
225 void readGasWaterParameters_(GasWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
226 void readOilWaterParameters_(OilWaterEffectiveParamVector& dest,
unsigned satRegionIdx);
235 size_t numCompressedElems_;
237 std::unique_ptr<EclEpsGridProperties> epsImbGridProperties_;
238 std::unique_ptr<EclEpsGridProperties> epsGridProperties_;
245 void initParamsForElements(
const EclipseState& eclState,
size_t numCompressedElems);
255 std::pair<Scalar, bool>
260 bool enableEndPointScaling()
const
261 {
return enableEndPointScaling_; }
263 bool enablePpcwmax()
const
264 {
return enablePpcwmax_; }
266 bool enableHysteresis()
const
267 {
return hysteresisConfig_->enableHysteresis(); }
269 MaterialLawParams& materialLawParams(
unsigned elemIdx)
271 assert(elemIdx < materialLawParams_.size());
272 return materialLawParams_[elemIdx];
275 const MaterialLawParams& materialLawParams(
unsigned elemIdx)
const
277 assert(elemIdx < materialLawParams_.size());
278 return materialLawParams_[elemIdx];
281 const MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
const
283 return materialLawParamsFunc_(elemIdx, facedir);
286 MaterialLawParams& materialLawParams(
unsigned elemIdx, FaceDir::DirEnum facedir)
288 return const_cast<MaterialLawParams&
>(materialLawParamsFunc_(elemIdx, facedir));
301 int satnumRegionIdx(
unsigned elemIdx)
const
302 {
return satnumRegionArray_[elemIdx]; }
304 int getKrnumSatIdx(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
306 bool hasDirectionalRelperms()
const
308 return !krnumXArray_.empty() || !krnumYArray_.empty() || !krnumZArray_.empty();
311 bool hasDirectionalImbnum()
const {
312 if (imbnumXArray_.size() > 0 || imbnumYArray_.size() > 0 || imbnumZArray_.size() > 0) {
318 int imbnumRegionIdx(
unsigned elemIdx)
const
319 {
return imbnumRegionArray_[elemIdx]; }
321 template <
class Flu
idState>
322 bool updateHysteresis(
const FluidState& fluidState,
unsigned elemIdx)
324 OPM_TIMEFUNCTION_LOCAL();
325 if (!enableHysteresis())
328 if (hasDirectionalRelperms() || hasDirectionalImbnum()) {
329 using Dir = FaceDir::DirEnum;
330 constexpr int ndim = 3;
331 Dir facedirs[ndim] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus};
332 for (
int i = 0; i<ndim; i++) {
334 changed = changed || ischanged;
340 void oilWaterHysteresisParams(Scalar& pcSwMdc,
342 unsigned elemIdx)
const;
344 void setOilWaterHysteresisParams(
const Scalar& pcSwMdc,
345 const Scalar& krnSwMdc,
348 void gasOilHysteresisParams(Scalar& pcSwMdc,
350 unsigned elemIdx)
const;
352 void setGasOilHysteresisParams(
const Scalar& pcSwMdc,
353 const Scalar& krnSwMdc,
356 EclEpsScalingPoints<Scalar>& oilWaterScaledEpsPointsDrainage(
unsigned elemIdx);
358 const EclEpsScalingPointsInfo<Scalar>& oilWaterScaledEpsInfoDrainage(
size_t elemIdx)
const
359 {
return oilWaterScaledEpsInfoDrainage_[elemIdx]; }
361 template<
class Serializer>
362 void serializeOp(Serializer& serializer)
368 for (
auto& mat : materialLawParams_) {
374 const MaterialLawParams& materialLawParamsFunc_(
unsigned elemIdx, FaceDir::DirEnum facedir)
const;
376 void readGlobalEpsOptions_(
const EclipseState& eclState);
378 void readGlobalHysteresisOptions_(
const EclipseState& state);
380 void readGlobalThreePhaseOptions_(
const Runspec& runspec);
382 bool enableEndPointScaling_;
383 std::shared_ptr<EclHysteresisConfig> hysteresisConfig_;
384 std::vector<std::shared_ptr<WagHysteresisConfig::WagHysteresisConfigRecord>> wagHystersisConfig_;
387 std::shared_ptr<EclEpsConfig> oilWaterEclEpsConfig_;
388 std::vector<EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
389 OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage_;
391 std::shared_ptr<EclEpsConfig> gasWaterEclEpsConfig_;
393 GasOilScalingPointsVector gasOilUnscaledPointsVector_;
394 OilWaterScalingPointsVector oilWaterUnscaledPointsVector_;
395 GasWaterScalingPointsVector gasWaterUnscaledPointsVector_;
397 GasOilEffectiveParamVector gasOilEffectiveParamVector_;
398 OilWaterEffectiveParamVector oilWaterEffectiveParamVector_;
399 GasWaterEffectiveParamVector gasWaterEffectiveParamVector_;
401 EclMultiplexerApproach threePhaseApproach_ = EclMultiplexerApproach::Default;
403 enum EclTwoPhaseApproach twoPhaseApproach_ = EclTwoPhaseApproach::GasOil;
405 std::vector<MaterialLawParams> materialLawParams_;
406 DirectionalMaterialLawParamsPtr dirMaterialLawParams_;
408 std::vector<int> satnumRegionArray_;
409 std::vector<int> krnumXArray_;
410 std::vector<int> krnumYArray_;
411 std::vector<int> krnumZArray_;
412 std::vector<int> imbnumXArray_;
413 std::vector<int> imbnumYArray_;
414 std::vector<int> imbnumZArray_;
415 std::vector<int> imbnumRegionArray_;
416 std::vector<Scalar> stoneEtas_;
419 std::vector<Scalar> maxAllowPc_;
420 std::vector<bool> modifySwl_;
426 std::shared_ptr<EclEpsConfig> gasOilConfig_;
427 std::shared_ptr<EclEpsConfig> oilWaterConfig_;
428 std::shared_ptr<EclEpsConfig> gasWaterConfig_;