Added improvements to handle more general recompletion strategies

to eclipse compatible restart file
This commit is contained in:
Jostein Alvestad
2018-11-29 09:30:30 +01:00
parent 01e3aa377c
commit dc3f1cbf40
3 changed files with 43 additions and 14 deletions

View File

@@ -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);
}
});
}

View File

@@ -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);

View File

@@ -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);
}