27 #ifndef OPM_ECL_EPS_SCALING_POINTS_HPP
28 #define OPM_ECL_EPS_SCALING_POINTS_HPP
34 #include <opm/input/eclipse/EclipseState/EclipseState.hpp>
35 #include <opm/input/eclipse/EclipseState/Runspec.hpp>
36 #include <opm/input/eclipse/EclipseState/Grid/SatfuncPropertyInitializers.hpp>
37 #include <opm/input/eclipse/EclipseState/Tables/TableManager.hpp>
58 template <
class Scalar>
81 Scalar pcowLeverettFactor;
82 Scalar pcgoLeverettFactor;
98 return Swl == data.Swl &&
102 Sowcr == data.Sowcr &&
103 Sogcr == data.Sogcr &&
106 maxPcow == data.maxPcow &&
107 maxPcgo == data.maxPcgo &&
108 pcowLeverettFactor == data.pcowLeverettFactor &&
109 pcgoLeverettFactor == data.pcgoLeverettFactor &&
112 Krorw == data.Krorw &&
113 Krorg == data.Krorg &&
114 maxKrw == data.maxKrw &&
115 maxKrow == data.maxKrow &&
116 maxKrog == data.maxKrog &&
117 maxKrg == data.maxKrg;
122 std::cout <<
" Swl: " << Swl <<
'\n'
123 <<
" Sgl: " << Sgl <<
'\n'
124 <<
" Swcr: " << Swcr <<
'\n'
125 <<
" Sgcr: " << Sgcr <<
'\n'
126 <<
" Sowcr: " << Sowcr <<
'\n'
127 <<
" Sogcr: " << Sogcr <<
'\n'
128 <<
" Swu: " << Swu <<
'\n'
129 <<
" Sgu: " << Sgu <<
'\n'
130 <<
" maxPcow: " << maxPcow <<
'\n'
131 <<
" maxPcgo: " << maxPcgo <<
'\n'
132 <<
" pcowLeverettFactor: " << pcowLeverettFactor <<
'\n'
133 <<
" pcgoLeverettFactor: " << pcgoLeverettFactor <<
'\n'
134 <<
" Krwr: " << Krwr <<
'\n'
135 <<
" Krgr: " << Krgr <<
'\n'
136 <<
" Krorw: " << Krorw <<
'\n'
137 <<
" Krorg: " << Krorg <<
'\n'
138 <<
" maxKrw: " << maxKrw <<
'\n'
139 <<
" maxKrg: " << maxKrg <<
'\n'
140 <<
" maxKrow: " << maxKrow <<
'\n'
141 <<
" maxKrog: " << maxKrog <<
'\n';
151 void extractUnscaled(
const satfunc::RawTableEndPoints& rtep,
152 const satfunc::RawFunctionValues& rfunc,
153 const std::vector<double>::size_type satRegionIdx)
155 this->Swl = rtep.connate.water[satRegionIdx];
156 this->Sgl = rtep.connate.gas [satRegionIdx];
158 this->Swcr = rtep.critical.water [satRegionIdx];
159 this->Sgcr = rtep.critical.gas [satRegionIdx];
160 this->Sowcr = rtep.critical.oil_in_water[satRegionIdx];
161 this->Sogcr = rtep.critical.oil_in_gas [satRegionIdx];
163 this->Swu = rtep.maximum.water[satRegionIdx];
164 this->Sgu = rtep.maximum.gas [satRegionIdx];
166 this->maxPcgo = rfunc.pc.g[satRegionIdx];
167 this->maxPcow = rfunc.pc.w[satRegionIdx];
170 this->pcowLeverettFactor = 1.0;
171 this->pcgoLeverettFactor = 1.0;
173 this->Krwr = rfunc.krw.r [satRegionIdx];
174 this->Krgr = rfunc.krg.r [satRegionIdx];
175 this->Krorw = rfunc.kro.rw[satRegionIdx];
176 this->Krorg = rfunc.kro.rg[satRegionIdx];
178 this->maxKrw = rfunc.krw.max[satRegionIdx];
179 this->maxKrow = rfunc.kro.max[satRegionIdx];
180 this->maxKrog = rfunc.kro.max[satRegionIdx];
181 this->maxKrg = rfunc.krg.max[satRegionIdx];
184 void update(Scalar& targetValue,
const double * value_ptr) {
186 targetValue = *value_ptr;
194 void extractScaled(
const EclipseState& eclState,
196 unsigned activeIndex)
200 update(Swl, epsProperties.swl(activeIndex));
201 update(Sgl, epsProperties.sgl(activeIndex));
202 update(Swcr, epsProperties.swcr(activeIndex));
203 update(Sgcr, epsProperties.sgcr(activeIndex));
205 update(Sowcr, epsProperties.sowcr(activeIndex));
206 update(Sogcr, epsProperties.sogcr(activeIndex));
207 update(Swu, epsProperties.swu(activeIndex));
208 update(Sgu, epsProperties.sgu(activeIndex));
209 update(maxPcow, epsProperties.pcw(activeIndex));
210 update(maxPcgo, epsProperties.pcg(activeIndex));
212 update(this->Krwr, epsProperties.krwr(activeIndex));
213 update(this->Krgr, epsProperties.krgr(activeIndex));
214 update(this->Krorw, epsProperties.krorw(activeIndex));
215 update(this->Krorg, epsProperties.krorg(activeIndex));
217 update(maxKrw, epsProperties.krw(activeIndex));
218 update(maxKrg, epsProperties.krg(activeIndex));
219 update(maxKrow, epsProperties.kro(activeIndex));
220 update(maxKrog, epsProperties.kro(activeIndex));
225 pcowLeverettFactor = 1.0;
226 pcgoLeverettFactor = 1.0;
227 if (eclState.getTableManager().useJFunc()) {
228 const auto& jfunc = eclState.getTableManager().getJFunc();
229 const auto& jfuncDir = jfunc.direction();
232 if (jfuncDir == JFunc::Direction::X)
233 perm = epsProperties.permx(activeIndex);
234 else if (jfuncDir == JFunc::Direction::Y)
235 perm = epsProperties.permy(activeIndex);
236 else if (jfuncDir == JFunc::Direction::Z)
237 perm = epsProperties.permz(activeIndex);
238 else if (jfuncDir == JFunc::Direction::XY)
244 double permx = epsProperties.permx(activeIndex);
245 double permy = epsProperties.permy(activeIndex);
248 throw std::runtime_error(
"Illegal direction indicator for the JFUNC "
249 "keyword ("+std::to_string(
int(jfuncDir))+
")");
254 Scalar poro = epsProperties.poro(activeIndex);
255 Scalar alpha = jfunc.alphaFactor();
256 Scalar beta = jfunc.betaFactor();
260 Scalar commonFactor = std::pow(poro, alpha)/std::pow(perm, beta);
264 const Scalar Uconst = 0.318316 * 1e5;
267 const auto& jfuncFlag = jfunc.flag();
268 if (jfuncFlag == JFunc::Flag::WATER || jfuncFlag == JFunc::Flag::BOTH) {
271 jfunc.owSurfaceTension();
272 pcowLeverettFactor = commonFactor*gamma*Uconst;
276 if (jfuncFlag == JFunc::Flag::GAS || jfuncFlag == JFunc::Flag::BOTH) {
279 jfunc.goSurfaceTension();
280 pcgoLeverettFactor = commonFactor*gamma*Uconst;
287 void extractGridPropertyValue_(Scalar& targetValue,
288 const std::vector<double>* propData,
289 unsigned cartesianCellIdx)
294 targetValue = (*propData)[cartesianCellIdx];
304 template <
class Scalar>
315 if (epsSystemType == EclOilWaterSystem) {
317 saturationPcPoints_[0] = epsInfo.Swl;
318 saturationPcPoints_[2] = saturationPcPoints_[1] = epsInfo.Swu;
321 saturationKrwPoints_[0] = epsInfo.Swcr;
322 saturationKrwPoints_[1] = 1.0 - epsInfo.Sowcr - epsInfo.Sgl;
323 saturationKrwPoints_[2] = epsInfo.Swu;
329 saturationKrnPoints_[2] = 1.0 - epsInfo.Sowcr;
330 saturationKrnPoints_[1] = epsInfo.Swcr + epsInfo.Sgl;
331 saturationKrnPoints_[0] = epsInfo.Swl + epsInfo.Sgl;
334 maxPcnwOrLeverettFactor_ = epsInfo.pcowLeverettFactor;
336 maxPcnwOrLeverettFactor_ = epsInfo.maxPcow;
338 Krwr_ = epsInfo.Krwr;
339 Krnr_ = epsInfo.Krorw;
341 maxKrw_ = epsInfo.maxKrw;
342 maxKrn_ = epsInfo.maxKrow;
345 assert((epsSystemType == EclGasOilSystem) ||(epsSystemType == EclGasWaterSystem) );
348 saturationPcPoints_[0] = 1.0 - epsInfo.Swl - epsInfo.Sgu;
349 saturationPcPoints_[2] = saturationPcPoints_[1] = 1.0 - epsInfo.Swl - epsInfo.Sgl;
352 saturationKrwPoints_[0] = epsInfo.Sogcr;
353 saturationKrwPoints_[1] = 1.0 - epsInfo.Sgcr - epsInfo.Swl;
354 saturationKrwPoints_[2] = 1.0 - epsInfo.Swl - epsInfo.Sgl;
362 saturationKrnPoints_[2] = 1.0 - epsInfo.Swl - epsInfo.Sgcr;
363 saturationKrnPoints_[1] = epsInfo.Sogcr;
364 saturationKrnPoints_[0] = 1.0 - epsInfo.Swl - epsInfo.Sgu;
367 maxPcnwOrLeverettFactor_ = epsInfo.pcgoLeverettFactor;
369 maxPcnwOrLeverettFactor_ = epsInfo.maxPcgo;
371 Krwr_ = epsInfo.Krorg;
372 Krnr_ = epsInfo.Krgr;
374 maxKrw_ = epsInfo.maxKrog;
375 maxKrn_ = epsInfo.maxKrg;
383 { saturationPcPoints_[pointIdx] = value; }
389 {
return saturationPcPoints_; }
395 { saturationKrwPoints_[pointIdx] = value; }
401 {
return saturationKrwPoints_; }
407 { saturationKrnPoints_[pointIdx] = value; }
413 {
return saturationKrnPoints_; }
419 { maxPcnwOrLeverettFactor_ = value; }
425 {
return maxPcnwOrLeverettFactor_; }
431 { maxPcnwOrLeverettFactor_ = value; }
437 {
return maxPcnwOrLeverettFactor_; }
444 { this->Krwr_ = value; }
451 {
return this->Krwr_; }
470 { this->Krnr_ = value; }
477 {
return this->Krnr_; }
493 std::cout <<
" saturationKrnPoints_[0]: " << saturationKrnPoints_[0] <<
"\n"
494 <<
" saturationKrnPoints_[1]: " << saturationKrnPoints_[1] <<
"\n"
495 <<
" saturationKrnPoints_[2]: " << saturationKrnPoints_[2] <<
"\n";
500 Scalar maxPcnwOrLeverettFactor_;
517 std::array<Scalar, 3> saturationPcPoints_;
520 std::array<Scalar, 3> saturationKrwPoints_;
523 std::array<Scalar, 3> saturationKrnPoints_;
Specifies the configuration used by the endpoint scaling code.
EclTwoPhaseSystemType
Specified which fluids are involved in a given twophase material law for endpoint scaling.
Definition: EclEpsConfig.hpp:43
Implements some common averages.
Scalar arithmeticMean(Scalar x, Scalar y)
Computes the arithmetic average of two values.
Definition: Means.hpp:45
Specifies the configuration used by the endpoint scaling code.
Definition: EclEpsConfig.hpp:57
bool enableLeverettScaling() const
Returns whether the Leverett capillary pressure scaling is enabled.
Definition: EclEpsConfig.hpp:177
Definition: EclEpsGridProperties.hpp:69
Represents the points on the X and Y axis to be scaled if endpoint scaling is used.
Definition: EclEpsScalingPoints.hpp:306
const std::array< Scalar, 3 > & saturationPcPoints() const
Returns the points used for capillary pressure saturation scaling.
Definition: EclEpsScalingPoints.hpp:388
void setMaxKrn(Scalar value)
Sets the maximum wetting phase relative permeability.
Definition: EclEpsScalingPoints.hpp:482
Scalar krnr() const
Returns non-wetting phase relative permeability at residual saturation of wetting phase.
Definition: EclEpsScalingPoints.hpp:476
Scalar maxKrn() const
Returns the maximum wetting phase relative permeability.
Definition: EclEpsScalingPoints.hpp:488
void setKrnr(Scalar value)
Set non-wetting phase relative permeability at residual saturation of wetting phase.
Definition: EclEpsScalingPoints.hpp:469
const std::array< Scalar, 3 > & saturationKrnPoints() const
Returns the points used for non-wetting phase relperm saturation scaling.
Definition: EclEpsScalingPoints.hpp:412
void setMaxKrw(Scalar value)
Sets the maximum wetting phase relative permeability.
Definition: EclEpsScalingPoints.hpp:456
Scalar maxKrw() const
Returns the maximum wetting phase relative permeability.
Definition: EclEpsScalingPoints.hpp:462
void setSaturationKrwPoint(unsigned pointIdx, Scalar value)
Sets an saturation value for wetting-phase relperm saturation scaling.
Definition: EclEpsScalingPoints.hpp:394
void setMaxPcnw(Scalar value)
Sets the maximum capillary pressure.
Definition: EclEpsScalingPoints.hpp:418
Scalar krwr() const
Returns wetting-phase relative permeability at residual saturation of non-wetting phase.
Definition: EclEpsScalingPoints.hpp:450
Scalar maxPcnw() const
Returns the maximum capillary pressure.
Definition: EclEpsScalingPoints.hpp:424
void setKrwr(Scalar value)
Set wetting-phase relative permeability at residual saturation of non-wetting phase.
Definition: EclEpsScalingPoints.hpp:443
void setSaturationPcPoint(unsigned pointIdx, Scalar value)
Sets an saturation value for capillary pressure saturation scaling.
Definition: EclEpsScalingPoints.hpp:382
void setLeverettFactor(Scalar value)
Sets the Leverett scaling factor for capillary pressure.
Definition: EclEpsScalingPoints.hpp:430
const std::array< Scalar, 3 > & saturationKrwPoints() const
Returns the points used for wetting phase relperm saturation scaling.
Definition: EclEpsScalingPoints.hpp:400
void init(const EclEpsScalingPointsInfo< Scalar > &epsInfo, const EclEpsConfig &config, EclTwoPhaseSystemType epsSystemType)
Assigns the scaling points which actually ought to be used.
Definition: EclEpsScalingPoints.hpp:311
void setSaturationKrnPoint(unsigned pointIdx, Scalar value)
Sets an saturation value for non-wetting phase relperm saturation scaling.
Definition: EclEpsScalingPoints.hpp:406
Scalar leverettFactor() const
Returns the Leverett scaling factor for capillary pressure.
Definition: EclEpsScalingPoints.hpp:436
This structure represents all values which can be possibly used as scaling points in the endpoint sca...
Definition: EclEpsScalingPoints.hpp:60