refactoring wdfac getDfactor
This commit is contained in:
parent
98220372eb
commit
e362e1018d
@ -43,18 +43,14 @@ namespace Opm {
|
|||||||
public:
|
public:
|
||||||
static WDFAC serializationTestObject();
|
static WDFAC serializationTestObject();
|
||||||
|
|
||||||
double getDFactor(double rho, double mu, double k, double phi, double rw, double h) const;
|
double getDFactor(const Connection& connection, double mu, double rho, double phi, double trans_mult) const;
|
||||||
void updateWDFAC(const DeckRecord& record);
|
void updateWDFAC(const DeckRecord& record);
|
||||||
//void updateWDFAC(const RestartIO::RstWell& rst_well);
|
//void updateWDFAC(const RestartIO::RstWell& rst_well);
|
||||||
void updateWDFACCOR(const DeckRecord& record);
|
void updateWDFACCOR(const DeckRecord& record);
|
||||||
//void updateWDFACOR(const RestartIO::RstWell& rst_well);
|
//void updateWDFACOR(const RestartIO::RstWell& rst_well);
|
||||||
|
|
||||||
void updateWDFACType(const WellConnections& connections);
|
void updateWDFACType(const WellConnections& connections);
|
||||||
|
|
||||||
bool useDFactor() const;
|
bool useDFactor() const;
|
||||||
bool useConnectionDFactor() const;
|
|
||||||
bool useWellDFactor() const;
|
|
||||||
WDFACTYPE getType() const;
|
|
||||||
|
|
||||||
bool operator==(const WDFAC& other) const;
|
bool operator==(const WDFAC& other) const;
|
||||||
bool operator!=(const WDFAC& other) const;
|
bool operator!=(const WDFAC& other) const;
|
||||||
@ -66,6 +62,7 @@ namespace Opm {
|
|||||||
serializer(m_b);
|
serializer(m_b);
|
||||||
serializer(m_c);
|
serializer(m_c);
|
||||||
serializer(m_d);
|
serializer(m_d);
|
||||||
|
serializer(m_total_cf);
|
||||||
serializer(m_type);
|
serializer(m_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +71,7 @@ namespace Opm {
|
|||||||
double m_b{0.0};
|
double m_b{0.0};
|
||||||
double m_c{0.0};
|
double m_c{0.0};
|
||||||
double m_d{0.0};
|
double m_d{0.0};
|
||||||
|
double m_total_cf{-1.0};
|
||||||
WDFACTYPE m_type = WDFACTYPE::NONE;
|
WDFACTYPE m_type = WDFACTYPE::NONE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
namespace Opm {
|
namespace Opm {
|
||||||
|
|
||||||
@ -44,6 +45,7 @@ namespace Opm {
|
|||||||
result.m_b = 0.456;
|
result.m_b = 0.456;
|
||||||
result.m_c = 0.457;
|
result.m_c = 0.457;
|
||||||
result.m_d = 0.458;
|
result.m_d = 0.458;
|
||||||
|
result.m_total_cf = 1.0;
|
||||||
result.m_type = WDFACTYPE::NONE;
|
result.m_type = WDFACTYPE::NONE;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -54,6 +56,7 @@ namespace Opm {
|
|||||||
&& (m_b == other.m_b)
|
&& (m_b == other.m_b)
|
||||||
&& (m_c == other.m_c)
|
&& (m_c == other.m_c)
|
||||||
&& (m_d == other.m_d)
|
&& (m_d == other.m_d)
|
||||||
|
&& (m_total_cf == other.m_total_cf)
|
||||||
&& (m_type == other.m_type);
|
&& (m_type == other.m_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,26 +82,43 @@ namespace Opm {
|
|||||||
if (non_trivial_dfactor) {
|
if (non_trivial_dfactor) {
|
||||||
m_type = WDFACTYPE::CON_DFACTOR;
|
m_type = WDFACTYPE::CON_DFACTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_total_cf = std::accumulate(connections.begin(), connections.end(), 0.0,
|
||||||
|
[](const double tot_cf, const auto& conn) { return tot_cf + conn.CF(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double WDFAC::getDFactor(const Connection& connection, double mu, double rho, double phi, double trans_mult) const {
|
||||||
|
|
||||||
double WDFAC::getDFactor(double rho, double mu, double k, double phi, double rw, double h) const {
|
if (m_total_cf < 0.0) {
|
||||||
|
throw std::invalid_argument { "Total connection factor is not set" };
|
||||||
|
}
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case WDFACTYPE::NONE:
|
case WDFACTYPE::NONE:
|
||||||
return 0.0;
|
return 0.0;
|
||||||
case WDFACTYPE::DFACTOR:
|
case WDFACTYPE::DFACTOR:
|
||||||
return m_d;
|
return m_d * m_total_cf / connection.CF();
|
||||||
|
case WDFACTYPE::CON_DFACTOR: {
|
||||||
|
double d = connection.dFactor();
|
||||||
|
// If a negative d factor is set in COMPDAT individual connection d factors should be used directly.
|
||||||
|
if (d < 0)
|
||||||
|
return -d;
|
||||||
|
// If a positive d factor is set in COMPDAT the connection d factors is treated like a well d factor.
|
||||||
|
// and thus scaled with the connection index
|
||||||
|
return d * m_total_cf / connection.CF();
|
||||||
|
}
|
||||||
case WDFACTYPE::DAKEMODEL:
|
case WDFACTYPE::DAKEMODEL:
|
||||||
{
|
{
|
||||||
const auto k_md = unit::convert::to(k, prefix::milli*unit::darcy);
|
double Kh = connection.Kh() * trans_mult;
|
||||||
|
double Ke = connection.Ke() * trans_mult;
|
||||||
|
double h = Kh / Ke;
|
||||||
|
double rw = connection.rw();
|
||||||
|
|
||||||
|
const auto k_md = unit::convert::to(Ke, prefix::milli*unit::darcy);
|
||||||
double beta = m_a * (std::pow(k_md, m_b) * std::pow(phi, m_c));
|
double beta = m_a * (std::pow(k_md, m_b) * std::pow(phi, m_c));
|
||||||
double specific_gravity = rho / 1.225; // divide by density of air at standard conditions.
|
double specific_gravity = rho / 1.225; // divide by density of air at standard conditions.
|
||||||
return beta * specific_gravity * k / (h * mu * rw );
|
return beta * specific_gravity * Ke / (h * mu * rw );
|
||||||
}
|
}
|
||||||
case WDFACTYPE::CON_DFACTOR:
|
|
||||||
throw std::invalid_argument { "getDFactor should not be called if D factor is given by COMPDAT item 12." };
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -109,9 +129,6 @@ namespace Opm {
|
|||||||
return m_type != WDFACTYPE::NONE;
|
return m_type != WDFACTYPE::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
WDFACTYPE WDFAC::getType() const {
|
|
||||||
return m_type;
|
|
||||||
}
|
|
||||||
bool WDFAC::operator!=(const WDFAC& other) const {
|
bool WDFAC::operator!=(const WDFAC& other) const {
|
||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
|
@ -5711,13 +5711,13 @@ DEPTHZ
|
|||||||
121*2000.0 /
|
121*2000.0 /
|
||||||
|
|
||||||
PORO
|
PORO
|
||||||
1000*0.1 /
|
1000*0.3 /
|
||||||
PERMX
|
PERMX
|
||||||
1000*1 /
|
1000*10 /
|
||||||
PERMY
|
PERMY
|
||||||
1000*0.1 /
|
1000*10 /
|
||||||
PERMZ
|
PERMZ
|
||||||
1000*0.01 /
|
1000*10 /
|
||||||
|
|
||||||
SCHEDULE
|
SCHEDULE
|
||||||
|
|
||||||
@ -5730,9 +5730,10 @@ WELSPECS
|
|||||||
/
|
/
|
||||||
|
|
||||||
COMPDAT
|
COMPDAT
|
||||||
'W1' 3 3 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
|
'W1' 3 3 1 1 'OPEN' 1* 1 0.216 200 1* 1* 'X' /
|
||||||
'W1' 3 3 2 2 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
|
'W1' 3 3 2 2 'OPEN' 1* 2 0.216 200 1* 1* 'X' /
|
||||||
'W1' 3 3 3 3 'OPEN' 1* 46.825 0.311 4332.346 1* 1* 'X' 22.123 /
|
'W1' 3 3 3 3 'OPEN' 1* 3 0.216 200 1* 1* 'X' /
|
||||||
|
'W2' 3 3 3 3 'OPEN' 1* 1 0.216 200 1* 11 'X' /
|
||||||
/
|
/
|
||||||
|
|
||||||
WDFAC
|
WDFAC
|
||||||
@ -5744,6 +5745,13 @@ DATES -- 2
|
|||||||
10 NOV 2008 /
|
10 NOV 2008 /
|
||||||
/
|
/
|
||||||
|
|
||||||
|
COMPDAT
|
||||||
|
'W1' 3 3 1 1 'OPEN' 1* 1* 0.216 200 1* 1* 'X' /
|
||||||
|
'W1' 3 3 2 2 'OPEN' 1* 1* 0.216 200 1* 1* 'X' /
|
||||||
|
'W1' 3 3 3 3 'OPEN' 1* 1* 0.216 200 1* 1* 'X' /
|
||||||
|
'W2' 3 3 3 3 'OPEN' 1* 1 0.216 200 1* 11 'X' /
|
||||||
|
/
|
||||||
|
|
||||||
WDFACCOR
|
WDFACCOR
|
||||||
-- 'W1' 8.957e10 1.1045 0.0 /
|
-- 'W1' 8.957e10 1.1045 0.0 /
|
||||||
'W1' 1.984e-7 -1.1045 0.0 /
|
'W1' 1.984e-7 -1.1045 0.0 /
|
||||||
@ -5754,9 +5762,10 @@ DATES -- 3
|
|||||||
/
|
/
|
||||||
|
|
||||||
COMPDAT
|
COMPDAT
|
||||||
'W1' 3 3 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
|
'W1' 3 3 1 1 'OPEN' 1* 1 0.216 200 1* 1* 'X' /
|
||||||
'W1' 3 3 2 2 'OPEN' 1* 32.948 0.311 3047.839 1* 0 'X' 22.100 /
|
'W1' 3 3 2 2 'OPEN' 1* 2 0.216 200 1* 0 'X' /
|
||||||
'W1' 3 3 3 3 'OPEN' 1* 46.825 0.311 4332.346 1* 11 'X' 22.123 /
|
'W1' 3 3 3 3 'OPEN' 1* 3 0.216 200 1* 11 'X' /
|
||||||
|
'W2' 3 3 3 3 'OPEN' 1* 1 0.216 200 1* 11 'X' /
|
||||||
/
|
/
|
||||||
|
|
||||||
|
|
||||||
@ -5774,43 +5783,37 @@ END
|
|||||||
|
|
||||||
double rho = 1.0;
|
double rho = 1.0;
|
||||||
double mu = 0.01*Opm::prefix::centi * Opm::unit::Poise;
|
double mu = 0.01*Opm::prefix::centi * Opm::unit::Poise;
|
||||||
double k = 10.0 * Opm::prefix::milli * Opm::unit::darcy;
|
|
||||||
double h = 20;
|
|
||||||
double rw = 0.108;
|
|
||||||
double phi = 0.3;
|
double phi = 0.3;
|
||||||
|
double trans_mult = 1.0;
|
||||||
|
|
||||||
// WDFAC overwrites D factor in COMDAT
|
// WDFAC overwrites D factor in COMDAT
|
||||||
BOOST_CHECK(wdfac11.getType() != WDFACTYPE::CON_DFACTOR);
|
|
||||||
BOOST_CHECK(wdfac11.useDFactor());
|
BOOST_CHECK(wdfac11.useDFactor());
|
||||||
BOOST_CHECK(wdfac21.getType() != WDFACTYPE::CON_DFACTOR);
|
|
||||||
|
|
||||||
BOOST_CHECK_CLOSE(wdfac11.getDFactor(rho, mu, k, phi, rw, h), 1*Opm::unit::day, 1e-12);
|
// well d factor scaled by connection CF.
|
||||||
BOOST_CHECK_CLOSE(wdfac21.getDFactor(rho, mu, k, phi, rw, h), 2*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(wdfac11.getDFactor(well11.getConnections()[0], mu, rho, phi, trans_mult), 6*1*Opm::unit::day, 1e-12);
|
||||||
|
BOOST_CHECK_CLOSE(wdfac21.getDFactor(well21.getConnections()[0], mu, rho, phi, trans_mult), 2*Opm::unit::day, 1e-12);
|
||||||
|
|
||||||
const auto& well12 = sched.getWell("W1", 2);
|
const auto& well12 = sched.getWell("W1", 2);
|
||||||
const auto& well22 = sched.getWell("W2", 2);
|
const auto& well22 = sched.getWell("W2", 2);
|
||||||
const auto& wdfac12 = well12.getWDFAC();
|
const auto& wdfac12 = well12.getWDFAC();
|
||||||
const auto& wdfac22 = well22.getWDFAC();
|
const auto& wdfac22 = well22.getWDFAC();
|
||||||
|
|
||||||
BOOST_CHECK_CLOSE(wdfac12.getDFactor(rho, mu, k, phi, rw, h), 5.19e-1, 3);
|
BOOST_CHECK_CLOSE(wdfac12.getDFactor(well12.getConnections()[0], mu, rho, phi, trans_mult), 5.19e-1, 3);
|
||||||
BOOST_CHECK_CLOSE(wdfac22.getDFactor(rho, mu, k, phi, rw, h), 2*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(wdfac22.getDFactor(well22.getConnections()[0], mu, rho, phi, trans_mult), 2*Opm::unit::day, 1e-12);
|
||||||
|
|
||||||
|
|
||||||
const auto& well13 = sched.getWell("W1", 3);
|
const auto& well13 = sched.getWell("W1", 3);
|
||||||
const auto& well23 = sched.getWell("W2", 3);
|
const auto& well23 = sched.getWell("W2", 3);
|
||||||
const auto& wdfac13 = well13.getWDFAC();
|
const auto& wdfac13 = well13.getWDFAC();
|
||||||
const auto& wdfac23 = well23.getWDFAC();
|
const auto& wdfac23 = well23.getWDFAC();
|
||||||
BOOST_CHECK(wdfac13.getType() == WDFACTYPE::CON_DFACTOR);
|
|
||||||
BOOST_CHECK(wdfac13.useDFactor());
|
BOOST_CHECK(wdfac13.useDFactor());
|
||||||
BOOST_CHECK(wdfac23.getType() != WDFACTYPE::CON_DFACTOR);
|
|
||||||
|
|
||||||
|
|
||||||
BOOST_CHECK_CLOSE(well13.getConnections()[0].dFactor(), 0*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(well13.getConnections()[0].dFactor(), 0*Opm::unit::day, 1e-12);
|
||||||
BOOST_CHECK_CLOSE(well13.getConnections()[1].dFactor(), 0*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(well13.getConnections()[1].dFactor(), 0*Opm::unit::day, 1e-12);
|
||||||
BOOST_CHECK_CLOSE(well13.getConnections()[2].dFactor(), 11*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(well13.getConnections()[2].dFactor(), 11*Opm::unit::day, 1e-12);
|
||||||
|
BOOST_CHECK_CLOSE(wdfac13.getDFactor(well13.getConnections()[2], mu, rho, phi, trans_mult), 6/3*11*Opm::unit::day, 1e-12);
|
||||||
BOOST_CHECK_CLOSE(wdfac23.getDFactor(rho, mu, k, phi, rw, h), 2*Opm::unit::day, 1e-12);
|
BOOST_CHECK_CLOSE(wdfac23.getDFactor(well23.getConnections()[0], mu, rho, phi, trans_mult), 2*Opm::unit::day, 1e-12);
|
||||||
BOOST_CHECK_THROW(wdfac13.getDFactor(rho, mu, k, phi, rw, h ), std::exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(createDeckWithBC) {
|
BOOST_AUTO_TEST_CASE(createDeckWithBC) {
|
||||||
|
Loading…
Reference in New Issue
Block a user