Extend relperm and capilary pressure tables with constant values such

that the derivatives at the endpoints are zero
This commit is contained in:
Tor Harald Sandve
2013-09-24 11:14:22 +02:00
parent badc3c0e9e
commit 62f81859cd
4 changed files with 208 additions and 24 deletions
+97 -12
View File
@@ -47,9 +47,23 @@ namespace Opm
const std::vector<double>& krw = swof_table[table_num][1];
const std::vector<double>& krow = swof_table[table_num][2];
const std::vector<double>& pcow = swof_table[table_num][3];
buildUniformMonotoneTable(sw, krw, samples, krw_);
buildUniformMonotoneTable(sw, krow, samples, krow_);
buildUniformMonotoneTable(sw, pcow, samples, pcow_);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sw.size();
std::vector<double> sw_ex(n+2);
std::vector<double> krw_ex(n+2);
std::vector<double> krow_ex(n+2);
std::vector<double> pcow_ex(n+2);
SatFuncGwsegUniform::ExtendTable(sw,sw_ex,1);
SatFuncGwsegUniform::ExtendTable(krw,krw_ex,0);
SatFuncGwsegUniform::ExtendTable(krow,krow_ex,0);
SatFuncGwsegUniform::ExtendTable(pcow,pcow_ex,0);
buildUniformMonotoneTable(sw_ex, krw_ex, samples, krw_);
buildUniformMonotoneTable(sw_ex, krow_ex, samples, krow_);
buildUniformMonotoneTable(sw_ex, pcow_ex, samples, pcow_);
krocw_ = krow[0]; // At connate water -> ecl. SWOF
swco = sw[0];
smin_[phase_usage.phase_pos[Aqua]] = sw[0];
@@ -62,9 +76,23 @@ namespace Opm
const std::vector<double>& krg = sgof_table[table_num][1];
const std::vector<double>& krog = sgof_table[table_num][2];
const std::vector<double>& pcog = sgof_table[table_num][3];
buildUniformMonotoneTable(sg, krg, samples, krg_);
buildUniformMonotoneTable(sg, krog, samples, krog_);
buildUniformMonotoneTable(sg, pcog, samples, pcog_);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sg.size();
std::vector<double> sg_ex(n+2);
std::vector<double> krg_ex(n+2);
std::vector<double> krog_ex(n+2);
std::vector<double> pcog_ex(n+2);
SatFuncGwsegUniform::ExtendTable(sg,sg_ex,1);
SatFuncGwsegUniform::ExtendTable(krg,krg_ex,0);
SatFuncGwsegUniform::ExtendTable(krog,krog_ex,0);
SatFuncGwsegUniform::ExtendTable(pcog,pcog_ex,0);
buildUniformMonotoneTable(sg_ex, krg_ex, samples, krg_);
buildUniformMonotoneTable(sg_ex, krog_ex, samples, krog_);
buildUniformMonotoneTable(sg_ex, pcog_ex, samples, pcog_);
smin_[phase_usage.phase_pos[Vapour]] = sg[0];
if (std::fabs(sg.back() + swco - 1.0) > 1e-3) {
OPM_THROW(std::runtime_error, "Gas maximum saturation in SGOF table = " << sg.back() <<
@@ -77,6 +105,20 @@ namespace Opm
smax_[phase_usage.phase_pos[Liquid]] = 1.0 - swco;
}
void SatFuncGwsegUniform::ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const
{
int n = xv.size();
xv_ex[0] = xv[0]-pm;
xv_ex[n+1] = xv[n-1]+pm;
for (int i=0; i<n; i++)
{
xv_ex[i+1] = xv[i];
}
}
void SatFuncGwsegUniform::evalKr(const double* s, double* kr) const
{
@@ -252,9 +294,23 @@ namespace Opm
const std::vector<double>& krw = swof_table[table_num][1];
const std::vector<double>& krow = swof_table[table_num][2];
const std::vector<double>& pcow = swof_table[table_num][3];
krw_ = NonuniformTableLinear<double>(sw, krw);
krow_ = NonuniformTableLinear<double>(sw, krow);
pcow_ = NonuniformTableLinear<double>(sw, pcow);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sw.size();
std::vector<double> sw_ex(n+2);
std::vector<double> krw_ex(n+2);
std::vector<double> krow_ex(n+2);
std::vector<double> pcow_ex(n+2);
SatFuncGwsegNonuniform::ExtendTable(sw,sw_ex,1);
SatFuncGwsegNonuniform::ExtendTable(krw,krw_ex,0);
SatFuncGwsegNonuniform::ExtendTable(krow,krow_ex,0);
SatFuncGwsegNonuniform::ExtendTable(pcow,pcow_ex,0);
krw_ = NonuniformTableLinear<double>(sw_ex, krw_ex);
krow_ = NonuniformTableLinear<double>(sw_ex, krow_ex);
pcow_ = NonuniformTableLinear<double>(sw_ex, pcow_ex);
krocw_ = krow[0]; // At connate water -> ecl. SWOF
swco = sw[0];
smin_[phase_usage.phase_pos[Aqua]] = sw[0];
@@ -267,9 +323,24 @@ namespace Opm
const std::vector<double>& krg = sgof_table[table_num][1];
const std::vector<double>& krog = sgof_table[table_num][2];
const std::vector<double>& pcog = sgof_table[table_num][3];
krg_ = NonuniformTableLinear<double>(sg, krg);
krog_ = NonuniformTableLinear<double>(sg, krog);
pcog_ = NonuniformTableLinear<double>(sg, pcog);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sg.size();
std::vector<double> sg_ex(n+2);
std::vector<double> krg_ex(n+2);
std::vector<double> krog_ex(n+2);
std::vector<double> pcog_ex(n+2);
SatFuncGwsegNonuniform::ExtendTable(sg,sg_ex,1);
SatFuncGwsegNonuniform::ExtendTable(krg,krg_ex,0);
SatFuncGwsegNonuniform::ExtendTable(krog,krog_ex,0);
SatFuncGwsegNonuniform::ExtendTable(pcog,pcog_ex,0);
krg_ = NonuniformTableLinear<double>(sg_ex, krg_ex);
krog_ = NonuniformTableLinear<double>(sg_ex, krog_ex);
pcog_ = NonuniformTableLinear<double>(sg_ex, pcog_ex);
smin_[phase_usage.phase_pos[Vapour]] = sg[0];
if (std::fabs(sg.back() + swco - 1.0) > 1e-3) {
OPM_THROW(std::runtime_error, "Gas maximum saturation in SGOF table = " << sg.back() <<
@@ -282,6 +353,20 @@ namespace Opm
smax_[phase_usage.phase_pos[Liquid]] = 1.0 - swco;
}
void SatFuncGwsegNonuniform::ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const
{
int n = xv.size();
xv_ex[0] = xv[0]-pm;
xv_ex[n+1] = xv[n-1]+pm;
for (int i=0; i<n; i++)
{
xv_ex[i+1] = xv[i];
}
}
void SatFuncGwsegNonuniform::evalKr(const double* s, double* kr) const
{
+7
View File
@@ -38,6 +38,9 @@ namespace Opm
void evalKrDeriv(const double* s, double* kr, double* dkrds) const;
void evalPc(const double* s, double* pc) const;
void evalPcDeriv(const double* s, double* pc, double* dpcds) const;
void ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const;
double smin_[PhaseUsage::MaxNumPhases];
double smax_[PhaseUsage::MaxNumPhases];
double krwmax_; // Max water relperm
@@ -69,6 +72,10 @@ namespace Opm
void evalKrDeriv(const double* s, double* kr, double* dkrds) const;
void evalPc(const double* s, double* pc) const;
void evalPcDeriv(const double* s, double* pc, double* dpcds) const;
void ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const;
double smin_[PhaseUsage::MaxNumPhases];
double smax_[PhaseUsage::MaxNumPhases];
double krwmax_; // Max water relperm
+98 -12
View File
@@ -50,9 +50,24 @@ namespace Opm
if (krw.front() != 0.0 || krow.back() != 0.0) {
OPM_THROW(std::runtime_error, "Error SWOF data - non-zero krw(swco) and/or krow(1-sor)");
}
buildUniformMonotoneTable(sw, krw, samples, krw_);
buildUniformMonotoneTable(sw, krow, samples, krow_);
buildUniformMonotoneTable(sw, pcow, samples, pcow_);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sw.size();
std::vector<double> sw_ex(n+2);
std::vector<double> krw_ex(n+2);
std::vector<double> krow_ex(n+2);
std::vector<double> pcow_ex(n+2);
SatFuncSimpleUniform::ExtendTable(sw,sw_ex,1);
SatFuncSimpleUniform::ExtendTable(krw,krw_ex,0);
SatFuncSimpleUniform::ExtendTable(krow,krow_ex,0);
SatFuncSimpleUniform::ExtendTable(pcow,pcow_ex,0);
buildUniformMonotoneTable(sw_ex, krw_ex, samples, krw_);
buildUniformMonotoneTable(sw_ex, krow_ex, samples, krow_);
buildUniformMonotoneTable(sw_ex, pcow_ex, samples, pcow_);
krocw_ = krow[0]; // At connate water -> ecl. SWOF
swco = sw[0];
smin_[phase_usage.phase_pos[Aqua]] = sw[0];
@@ -86,9 +101,23 @@ namespace Opm
const std::vector<double>& krg = sgof_table[table_num][1];
const std::vector<double>& krog = sgof_table[table_num][2];
const std::vector<double>& pcog = sgof_table[table_num][3];
buildUniformMonotoneTable(sg, krg, samples, krg_);
buildUniformMonotoneTable(sg, krog, samples, krog_);
buildUniformMonotoneTable(sg, pcog, samples, pcog_);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sg.size();
std::vector<double> sg_ex(n+2);
std::vector<double> krg_ex(n+2);
std::vector<double> krog_ex(n+2);
std::vector<double> pcog_ex(n+2);
SatFuncSimpleUniform::ExtendTable(sg,sg_ex,1);
SatFuncSimpleUniform::ExtendTable(krg,krg_ex,0);
SatFuncSimpleUniform::ExtendTable(krog,krog_ex,0);
SatFuncSimpleUniform::ExtendTable(pcog,pcog_ex,0);
buildUniformMonotoneTable(sg_ex, krg_ex, samples, krg_);
buildUniformMonotoneTable(sg_ex, krog_ex, samples, krog_);
buildUniformMonotoneTable(sg_ex, pcog_ex, samples, pcog_);
smin_[phase_usage.phase_pos[Vapour]] = sg[0];
if (std::fabs(sg.back() + swco - 1.0) > 1e-3) {
OPM_THROW(std::runtime_error, "Gas maximum saturation in SGOF table = " << sg.back() <<
@@ -102,6 +131,22 @@ namespace Opm
}
void SatFuncSimpleUniform::ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const
{
int n = xv.size();
xv_ex[0] = xv[0]-pm;
xv_ex[n+1] = xv[n-1]+pm;
for (int i=0; i<n; i++)
{
xv_ex[i+1] = xv[i];
}
}
void SatFuncSimpleUniform::evalKr(const double* s, double* kr) const
{
if (phase_usage.num_phases == 3) {
@@ -255,7 +300,20 @@ namespace Opm
void SatFuncSimpleNonuniform::ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const
{
int n = xv.size();
xv_ex[0] = xv[0]-pm;
xv_ex[n+1] = xv[n-1]+pm;
for (int i=0; i<n; i++)
{
xv_ex[i+1] = xv[i];
}
}
void SatFuncSimpleNonuniform::init(const EclipseGridParser& deck,
@@ -275,9 +333,23 @@ namespace Opm
if (krw.front() != 0.0 || krow.back() != 0.0) {
OPM_THROW(std::runtime_error, "Error SWOF data - non-zero krw(swco) and/or krow(1-sor)");
}
krw_ = NonuniformTableLinear<double>(sw, krw);
krow_ = NonuniformTableLinear<double>(sw, krow);
pcow_ = NonuniformTableLinear<double>(sw, pcow);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sw.size();
std::vector<double> sw_ex(n+2);
std::vector<double> krw_ex(n+2);
std::vector<double> krow_ex(n+2);
std::vector<double> pcow_ex(n+2);
SatFuncSimpleNonuniform::ExtendTable(sw,sw_ex,1);
SatFuncSimpleNonuniform::ExtendTable(krw,krw_ex,0);
SatFuncSimpleNonuniform::ExtendTable(krow,krow_ex,0);
SatFuncSimpleNonuniform::ExtendTable(pcow,pcow_ex,0);
krw_ = NonuniformTableLinear<double>(sw_ex, krw_ex);
krow_ = NonuniformTableLinear<double>(sw_ex, krow_ex);
pcow_ = NonuniformTableLinear<double>(sw_ex, pcow_ex);
krocw_ = krow[0]; // At connate water -> ecl. SWOF
swco = sw[0];
smin_[phase_usage.phase_pos[Aqua]] = sw[0];
@@ -312,9 +384,23 @@ namespace Opm
const std::vector<double>& krg = sgof_table[table_num][1];
const std::vector<double>& krog = sgof_table[table_num][2];
const std::vector<double>& pcog = sgof_table[table_num][3];
krg_ = NonuniformTableLinear<double>(sg, krg);
krog_ = NonuniformTableLinear<double>(sg, krog);
pcog_ = NonuniformTableLinear<double>(sg, pcog);
// Extend the tables with constant values such that the
// derivatives at the endpoints are zero
int n = sg.size();
std::vector<double> sg_ex(n+2);
std::vector<double> krg_ex(n+2);
std::vector<double> krog_ex(n+2);
std::vector<double> pcog_ex(n+2);
SatFuncSimpleNonuniform::ExtendTable(sg,sg_ex,1);
SatFuncSimpleNonuniform::ExtendTable(krg,krg_ex,0);
SatFuncSimpleNonuniform::ExtendTable(krog,krog_ex,0);
SatFuncSimpleNonuniform::ExtendTable(pcog,pcog_ex,0);
krg_ = NonuniformTableLinear<double>(sg_ex, krg_ex);
krog_ = NonuniformTableLinear<double>(sg_ex, krog_ex);
pcog_ = NonuniformTableLinear<double>(sg_ex, pcog_ex);
smin_[phase_usage.phase_pos[Vapour]] = sg[0];
if (std::fabs(sg.back() + swco - 1.0) > 1e-3) {
OPM_THROW(std::runtime_error, "Gas maximum saturation in SGOF table = " << sg.back() <<
+6
View File
@@ -38,6 +38,9 @@ namespace Opm
void evalKrDeriv(const double* s, double* kr, double* dkrds) const;
void evalPc(const double* s, double* pc) const;
void evalPcDeriv(const double* s, double* pc, double* dpcds) const;
void ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const;
double smin_[PhaseUsage::MaxNumPhases];
double smax_[PhaseUsage::MaxNumPhases];
double krwmax_; // Max water relperm
@@ -69,6 +72,9 @@ namespace Opm
void evalKrDeriv(const double* s, double* kr, double* dkrds) const;
void evalPc(const double* s, double* pc) const;
void evalPcDeriv(const double* s, double* pc, double* dpcds) const;
void ExtendTable(const std::vector<double>& xv,
std::vector<double>& xv_ex,
double pm) const;
double smin_[PhaseUsage::MaxNumPhases];
double smax_[PhaseUsage::MaxNumPhases];
double krwmax_; // Max water relperm