Added improvements to handle more general recompletion strategies
to eclipse compatible restart file
This commit is contained in:
@@ -150,7 +150,7 @@ namespace {
|
||||
iConn[Ix::CellK] = conn.getK() + 1;
|
||||
|
||||
iConn[Ix::ConnStat] = (conn.state() == ConnState::OPEN)
|
||||
? 1 : -1000;
|
||||
? 1 : 0;
|
||||
|
||||
iConn[Ix::Drainage] = conn.getDefaultSatTabId()
|
||||
? 0 : conn.satTableId();
|
||||
@@ -302,8 +302,33 @@ captureDeclaredConnData(const Schedule& sched,
|
||||
const std::size_t sim_step)
|
||||
{
|
||||
const auto& wells = sched.getWells(sim_step);
|
||||
|
||||
connectionLoop(wells, grid, sim_step, [&units, &xw, this]
|
||||
//
|
||||
// construct a composite vector of connection objects holding
|
||||
// rates for all open connectons
|
||||
//
|
||||
std::map<std::string, std::vector<const Opm::data::Connection*> > allWellConnections;
|
||||
for (const auto wl : wells) {
|
||||
const auto& conns = wl->getActiveConnections(sim_step, grid);
|
||||
std::cout << "captureDeclaredConnData- well_name:" << wl->name() << " No conn: " <<
|
||||
conns.size() << std::endl;
|
||||
std::vector<const Opm::data::Connection*> initConn (conns.size(), {});
|
||||
allWellConnections.insert(std::make_pair(wl->name(), initConn));
|
||||
const auto it = allWellConnections.find(wl->name());
|
||||
const auto xr = xw.find(wl->name());
|
||||
int rCInd = 0;
|
||||
if ((it != allWellConnections.end()) && (xr != xw.end())) {
|
||||
for (auto nConn = conns.size(), connID = 0*nConn; connID < nConn; connID++) {
|
||||
std::cout << " connID: " << connID << std::endl;
|
||||
if ((conns[connID].state() == Opm::WellCompletion::StateEnum::OPEN) &&
|
||||
(rCInd < xr->second.connections.size())) {
|
||||
it->second[connID] = &(xr->second.connections[rCInd]);
|
||||
std::cout << "add xw-conn - glob-no: " << connID << " rate-no: " << rCInd << std::endl;
|
||||
rCInd+= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
connectionLoop(wells, grid, sim_step, [&units, &allWellConnections, this]
|
||||
(const Well& well, const std::size_t wellID,
|
||||
const Connection& conn, const std::size_t connID) -> void
|
||||
{
|
||||
@@ -313,14 +338,15 @@ captureDeclaredConnData(const Schedule& sched,
|
||||
IConn::staticContrib(conn, connID, ic);
|
||||
SConn::staticContrib(conn, units, sc);
|
||||
|
||||
auto xi = xw.find(well.name());
|
||||
if ((xi != xw.end()) &&
|
||||
(connID < xi->second.connections.size()))
|
||||
auto xi = allWellConnections.find(well.name());
|
||||
if ((xi != allWellConnections.end()) &&
|
||||
(connID < xi->second.size()))
|
||||
//(connID < xi->second.connections.size()))
|
||||
{
|
||||
auto xc = this->xConn_(wellID, connID);
|
||||
|
||||
XConn::dynamicContrib(xi->second.connections[connID],
|
||||
units, xc);
|
||||
//XConn::dynamicContrib(xi->second.connections[connID],
|
||||
if (xi->second[connID]) XConn::dynamicContrib(*(xi->second[connID]), units, xc);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -191,17 +191,21 @@ namespace {
|
||||
std::vector<double> qosc (segSet.size()+1, 0.);
|
||||
std::vector<double> qwsc (segSet.size()+1, 0.);
|
||||
std::vector<double> qgsc (segSet.size()+1, 0.);
|
||||
std::vector<const Opm::Connection* > openConnections;
|
||||
using M = ::Opm::UnitSystem::measure;
|
||||
using R = ::Opm::data::Rates::opt;
|
||||
if (welConns.size() != rateConns.size()) {
|
||||
for (auto nConn = welConns.size(), connID = 0*nConn; connID < nConn; connID++) {
|
||||
if (welConns[connID].state() == Opm::WellCompletion::StateEnum::OPEN) openConnections.push_back(&welConns[connID]);
|
||||
}
|
||||
if (openConnections.size() != rateConns.size()) {
|
||||
throw std::invalid_argument {
|
||||
"Inconsistent number of connections I in Opm::WellConnections (" +
|
||||
"Inconsistent number of open connections I in Opm::WellConnections (" +
|
||||
std::to_string(welConns.size()) + ") and vector<Opm::data::Connection> (" +
|
||||
std::to_string(rateConns.size()) + ") in Well " + segSet.wellName()
|
||||
};
|
||||
}
|
||||
for (auto nConn = welConns.size(), connID = 0*nConn; connID < nConn; connID++) {
|
||||
auto segNo = welConns[connID].segment();
|
||||
for (auto nConn = openConnections.size(), connID = 0*nConn; connID < nConn; connID++) {
|
||||
auto segNo = openConnections[connID]->segment();
|
||||
const auto& Q = rateConns[connID].rates;
|
||||
qosc[segNo] += -units.from_si(M::liquid_surface_rate, Q.get(R::oil));
|
||||
qwsc[segNo] += -units.from_si(M::liquid_surface_rate, Q.get(R::wat));
|
||||
@@ -337,7 +341,6 @@ namespace {
|
||||
// Segments with no inflow branches get the value zero
|
||||
int sumNoInFlowBranches(const Opm::WellSegments& segSet, std::size_t segIndex) {
|
||||
int sumIFB = 0;
|
||||
auto segBranch = segSet[segIndex].branchNumber();
|
||||
auto segNo =segSet[segIndex].segmentNumber();
|
||||
while (segNo >=1) {
|
||||
auto segInd = segSet.segmentNumberToIndex(segNo);
|
||||
|
||||
@@ -512,7 +512,7 @@ namespace {
|
||||
swprop(M::gas_surface_rate, pp.GasRate);
|
||||
}
|
||||
|
||||
if (pp.LiquidRate != 0.0) {
|
||||
if (pp.LiquidRate != 0.0 || (!predMode)) {
|
||||
sWell[Ix::LiqRateTarget] =
|
||||
swprop(M::liquid_surface_rate, pp.LiquidRate);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user