Added unit conversion for MSW data pluss correctin for complum
This commit is contained in:
parent
9d0604ad99
commit
17966d098b
@ -30,6 +30,7 @@
|
|||||||
namespace Opm {
|
namespace Opm {
|
||||||
class Phases;
|
class Phases;
|
||||||
class Schedule;
|
class Schedule;
|
||||||
|
class UnitSystem;
|
||||||
} // Opm
|
} // Opm
|
||||||
|
|
||||||
namespace Opm { namespace RestartIO { namespace Helpers {
|
namespace Opm { namespace RestartIO { namespace Helpers {
|
||||||
@ -49,6 +50,7 @@ namespace Opm { namespace RestartIO { namespace Helpers {
|
|||||||
|
|
||||||
void captureDeclaredMSWData(const Opm::Schedule& sched,
|
void captureDeclaredMSWData(const Opm::Schedule& sched,
|
||||||
const std::size_t rptStep,
|
const std::size_t rptStep,
|
||||||
|
const Opm::UnitSystem& units,
|
||||||
const std::vector<int>& inteHead);
|
const std::vector<int>& inteHead);
|
||||||
|
|
||||||
/// Retrieve Integer Multisegment well data Array.
|
/// Retrieve Integer Multisegment well data Array.
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
namespace VI = Opm::RestartIO::Helpers::VectorItems;
|
namespace VI = Opm::RestartIO::Helpers::VectorItems;
|
||||||
|
|
||||||
@ -52,9 +54,12 @@ namespace {
|
|||||||
{
|
{
|
||||||
// make seqIndex to Connection map
|
// make seqIndex to Connection map
|
||||||
std::map <std::size_t, const Opm::Connection*> seqIndConnMap;
|
std::map <std::size_t, const Opm::Connection*> seqIndConnMap;
|
||||||
for (const auto conn : conns) {
|
for (const auto & conn : conns) {
|
||||||
|
//for (auto it = conns.begin(); it < conns.end(); it++) {
|
||||||
std::size_t sI = conn.getSeqIndex();
|
std::size_t sI = conn.getSeqIndex();
|
||||||
seqIndConnMap.insert(std::make_pair(sI, &conn));
|
seqIndConnMap.insert(std::make_pair(sI, &conn));
|
||||||
|
std::cout << "seqIndex: " << sI << " i: " << conn.getI() << " j: " << conn.getJ() << " i: " << conn.getK() <<
|
||||||
|
" &conn->getSeqIndex(): " << (&conn)->getSeqIndex() << std::endl;
|
||||||
}
|
}
|
||||||
return seqIndConnMap;
|
return seqIndConnMap;
|
||||||
}
|
}
|
||||||
@ -63,9 +68,11 @@ namespace {
|
|||||||
{
|
{
|
||||||
// make CompSegSeqIndex to Connection map
|
// make CompSegSeqIndex to Connection map
|
||||||
std::map <std::size_t, const Opm::Connection*> cs_seqIndConnMap;
|
std::map <std::size_t, const Opm::Connection*> cs_seqIndConnMap;
|
||||||
for (const auto conn : conns) {
|
for (const auto & conn : conns) {
|
||||||
std::size_t sI = conn.getCompSegSeqIndex();
|
std::size_t sI = conn.getCompSegSeqIndex();
|
||||||
cs_seqIndConnMap.insert(std::make_pair(sI, &conn));
|
cs_seqIndConnMap.insert(std::make_pair(sI, &conn));
|
||||||
|
std::cout << "getCompSegSeqIndex: " << sI << " i: " << conn.getI() << " j: " << conn.getJ() << " i: " << conn.getK() <<
|
||||||
|
" &conn->getCompSegSeqIndex(): " << (&conn)->getCompSegSeqIndex() << std::endl;
|
||||||
}
|
}
|
||||||
return cs_seqIndConnMap;
|
return cs_seqIndConnMap;
|
||||||
}
|
}
|
||||||
@ -97,19 +104,29 @@ namespace {
|
|||||||
//sort connections according to input sequence in COMPDAT
|
//sort connections according to input sequence in COMPDAT
|
||||||
sIToConn = mapSeqIndexToConnection(conns);
|
sIToConn = mapSeqIndexToConnection(conns);
|
||||||
}
|
}
|
||||||
|
for (auto con : conns) {
|
||||||
|
std::cout << "loop act conns - seqIndex: " << con.getSeqIndex() << " i: " << con.getI() << " j: " << con.getJ() << " i: " << con.getK() << std::endl;
|
||||||
|
}
|
||||||
|
for (auto conp : sIToConn) {
|
||||||
|
std::cout << "loop sIToConn - seqIndex: " << conp.first << " conp.second->getSeqIndex(): " << conp.second->getSeqIndex() << std::endl;
|
||||||
|
}
|
||||||
std::vector<const Opm::Connection*> connSI;
|
std::vector<const Opm::Connection*> connSI;
|
||||||
int niSI = well->getConnections(sim_step).size();
|
int niSI = well->getConnections(sim_step).size();
|
||||||
|
std::cout << "No of Connections: " << niSI << std::endl;
|
||||||
for (int iSI = 0; iSI < niSI; iSI++) {
|
for (int iSI = 0; iSI < niSI; iSI++) {
|
||||||
const auto searchSI = sIToConn.find(static_cast<std::size_t>(iSI));
|
const auto searchSI = sIToConn.find(static_cast<std::size_t>(iSI));
|
||||||
|
std::cout << "Loop over connections, iSI: " << iSI << " searchSI->first: " << searchSI->first
|
||||||
|
<< " searchSI->second->getSeqIndex(): " << searchSI->second->getSeqIndex() << std::endl;
|
||||||
if (searchSI != sIToConn.end()) {
|
if (searchSI != sIToConn.end()) {
|
||||||
connSI.push_back(searchSI->second);
|
connSI.push_back(searchSI->second);
|
||||||
}
|
std::cout << "Store connection: " << searchSI->second->getSeqIndex() << " searchSI->first: " << searchSI->first << std::endl;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
std::cout << "connSI-size " << connSI.size() << std::endl;
|
||||||
for (auto nConn = connSI.size(), connID = 0*nConn;
|
for (auto nConn = connSI.size(), connID = 0*nConn;
|
||||||
connID < nConn; ++connID)
|
connID < nConn; ++connID)
|
||||||
{
|
{
|
||||||
connOp(*well, wellID, *connSI[connID], connID);
|
connOp(*well, wellID, *(connSI[connID]), connID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -154,7 +171,7 @@ namespace {
|
|||||||
// draining and imbibition curves at connections.
|
// draining and imbibition curves at connections.
|
||||||
iConn[9] = conn.sat_tableId;
|
iConn[9] = conn.sat_tableId;
|
||||||
|
|
||||||
iConn[12] = conn.complnum;
|
iConn[12] = std::abs(conn.complnum);
|
||||||
iConn[13] = conn.dir;
|
iConn[13] = conn.dir;
|
||||||
iConn[14] = conn.attachedToSegment()
|
iConn[14] = conn.attachedToSegment()
|
||||||
? conn.segment_number : 0;
|
? conn.segment_number : 0;
|
||||||
@ -243,9 +260,10 @@ captureDeclaredConnData(const Schedule& sched,
|
|||||||
(const Well& /* well */, const std::size_t wellID,
|
(const Well& /* well */, const std::size_t wellID,
|
||||||
const Connection& conn , const std::size_t connID) -> void
|
const Connection& conn , const std::size_t connID) -> void
|
||||||
{
|
{
|
||||||
|
std::cout << "Connection loop - wellID: " << wellID << " connID: " << connID << std::endl;
|
||||||
auto ic = this->iConn_(wellID, connID);
|
auto ic = this->iConn_(wellID, connID);
|
||||||
auto sc = this->sConn_(wellID, connID);
|
auto sc = this->sConn_(wellID, connID);
|
||||||
|
std::cout << "Conn loop - conn- seqIndex: " << conn.getSeqIndex() << std::endl;
|
||||||
IConn::staticContrib(conn, connID, ic);
|
IConn::staticContrib(conn, connID, ic);
|
||||||
SConn::staticContrib(conn, units, sc);
|
SConn::staticContrib(conn, units, sc);
|
||||||
});
|
});
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#include <opm/parser/eclipse/EclipseState/Schedule/Connection.hpp>
|
#include <opm/parser/eclipse/EclipseState/Schedule/Connection.hpp>
|
||||||
#include <opm/parser/eclipse/EclipseState/Schedule/WellConnections.hpp>
|
#include <opm/parser/eclipse/EclipseState/Schedule/WellConnections.hpp>
|
||||||
|
|
||||||
|
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
|
||||||
|
|
||||||
//#include <opm/output/data/Wells.hpp>
|
//#include <opm/output/data/Wells.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -351,9 +353,11 @@ namespace {
|
|||||||
void staticContrib(const Opm::Well& well,
|
void staticContrib(const Opm::Well& well,
|
||||||
const std::size_t rptStep,
|
const std::size_t rptStep,
|
||||||
const std::vector<int>& inteHead,
|
const std::vector<int>& inteHead,
|
||||||
|
const Opm::UnitSystem& units,
|
||||||
RSegArray& rSeg)
|
RSegArray& rSeg)
|
||||||
{
|
{
|
||||||
if (well.isMultiSegment(rptStep)) {
|
if (well.isMultiSegment(rptStep)) {
|
||||||
|
using M = ::Opm::UnitSystem::measure;
|
||||||
//loop over segment set and print out information
|
//loop over segment set and print out information
|
||||||
auto welSegSet = well.getWellSegments(rptStep);
|
auto welSegSet = well.getWellSegments(rptStep);
|
||||||
auto completionSet = well.getCompletions(rptStep);
|
auto completionSet = well.getCompletions(rptStep);
|
||||||
@ -361,9 +365,9 @@ namespace {
|
|||||||
//treat the top segment individually
|
//treat the top segment individually
|
||||||
int ind_seg = 1;
|
int ind_seg = 1;
|
||||||
auto ind = welSegSet.segmentNumberToIndex(ind_seg);
|
auto ind = welSegSet.segmentNumberToIndex(ind_seg);
|
||||||
rSeg[0] = welSegSet.lengthTopSegment();
|
rSeg[0] = units.from_si(M::length, welSegSet.lengthTopSegment());
|
||||||
rSeg[1] = welSegSet.depthTopSegment();
|
rSeg[1] = units.from_si(M::length, welSegSet.depthTopSegment());
|
||||||
rSeg[5] = welSegSet.volumeTopSegment();
|
rSeg[5] = units.from_si(M::volume, welSegSet.volumeTopSegment());
|
||||||
rSeg[6] = rSeg[0];
|
rSeg[6] = rSeg[0];
|
||||||
rSeg[7] = rSeg[1];
|
rSeg[7] = rSeg[1];
|
||||||
|
|
||||||
@ -387,14 +391,16 @@ namespace {
|
|||||||
auto outSeg = welSegSet[ind].outletSegment();
|
auto outSeg = welSegSet[ind].outletSegment();
|
||||||
auto ind_ofs = welSegSet.segmentNumberToIndex(outSeg);
|
auto ind_ofs = welSegSet.segmentNumberToIndex(outSeg);
|
||||||
auto iS = (ind_seg-1)*noElmSeg;
|
auto iS = (ind_seg-1)*noElmSeg;
|
||||||
rSeg[iS + 0] = welSegSet[ind].totalLength() - welSegSet[ind_ofs].totalLength();
|
rSeg[iS + 0] = units.from_si(M::length, (welSegSet[ind].totalLength() - welSegSet[ind_ofs].totalLength()));
|
||||||
rSeg[iS + 1] = welSegSet[ind].depth() - welSegSet[ind_ofs].depth();
|
rSeg[iS + 1] = units.from_si(M::length, (welSegSet[ind].depth() - welSegSet[ind_ofs].depth()));
|
||||||
rSeg[iS + 2] = welSegSet[ind].internalDiameter();
|
rSeg[iS + 2] = units.from_si(M::length, (welSegSet[ind].internalDiameter()));
|
||||||
rSeg[iS + 3] = welSegSet[ind].roughness();
|
rSeg[iS + 3] = units.from_si(M::length, (welSegSet[ind].roughness()));
|
||||||
rSeg[iS + 4] = welSegSet[ind].crossArea();
|
rSeg[iS + 4] = units.from_si(M::length, (welSegSet[ind].crossArea()));
|
||||||
rSeg[iS + 5] = welSegSet[ind].volume();
|
//repeat unit conversion to convert for area instead of length
|
||||||
rSeg[iS + 6] = welSegSet[ind].totalLength();
|
rSeg[iS + 4] = units.from_si(M::length, rSeg[iS + 4]);
|
||||||
rSeg[iS + 7] = welSegSet[ind].depth();
|
rSeg[iS + 5] = units.from_si(M::volume, (welSegSet[ind].volume()));
|
||||||
|
rSeg[iS + 6] = units.from_si(M::length, (welSegSet[ind].totalLength()));
|
||||||
|
rSeg[iS + 7] = units.from_si(M::length, (welSegSet[ind].depth()));
|
||||||
|
|
||||||
// segment pressure (to be added!!)
|
// segment pressure (to be added!!)
|
||||||
rSeg[iS + 11] = 0;
|
rSeg[iS + 11] = 0;
|
||||||
@ -517,6 +523,7 @@ void
|
|||||||
Opm::RestartIO::Helpers::AggregateMSWData::
|
Opm::RestartIO::Helpers::AggregateMSWData::
|
||||||
captureDeclaredMSWData(const Schedule& sched,
|
captureDeclaredMSWData(const Schedule& sched,
|
||||||
const std::size_t rptStep,
|
const std::size_t rptStep,
|
||||||
|
const Opm::UnitSystem& units,
|
||||||
const std::vector<int>& inteHead)
|
const std::vector<int>& inteHead)
|
||||||
{
|
{
|
||||||
const auto& wells = sched.getWells(rptStep);
|
const auto& wells = sched.getWells(rptStep);
|
||||||
@ -540,12 +547,12 @@ captureDeclaredMSWData(const Schedule& sched,
|
|||||||
|
|
||||||
// Extract Contributions to RSeg Array
|
// Extract Contributions to RSeg Array
|
||||||
{
|
{
|
||||||
MSWLoop(msw, [rptStep, inteHead, this]
|
MSWLoop(msw, [&units, rptStep, inteHead, this]
|
||||||
(const Well& well, const std::size_t mswID) -> void
|
(const Well& well, const std::size_t mswID) -> void
|
||||||
{
|
{
|
||||||
auto rmsw = this->rSeg_[mswID];
|
auto rmsw = this->rSeg_[mswID];
|
||||||
|
|
||||||
RSeg::staticContrib(well, rptStep, inteHead, rmsw);
|
RSeg::staticContrib(well, rptStep, inteHead, units, rmsw);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,7 +510,7 @@ void writeMSWData(::Opm::RestartIO::ecl_rst_file_type * rst_file,
|
|||||||
// write ISEG, RSEG, ILBS and ILBR to restart file
|
// write ISEG, RSEG, ILBS and ILBR to restart file
|
||||||
const size_t simStep = static_cast<size_t> (sim_step);
|
const size_t simStep = static_cast<size_t> (sim_step);
|
||||||
auto MSWData = Helpers::AggregateMSWData(ih);
|
auto MSWData = Helpers::AggregateMSWData(ih);
|
||||||
MSWData.captureDeclaredMSWData(schedule, simStep, ih);
|
MSWData.captureDeclaredMSWData(schedule, simStep, units, ih);
|
||||||
write_kw(rst_file, EclKW<int> ("ISEG", MSWData.getISeg()));
|
write_kw(rst_file, EclKW<int> ("ISEG", MSWData.getISeg()));
|
||||||
write_kw(rst_file, EclKW<int> ("ILBS", MSWData.getILBs()));
|
write_kw(rst_file, EclKW<int> ("ILBS", MSWData.getILBs()));
|
||||||
write_kw(rst_file, EclKW<int> ("ILBR", MSWData.getILBr()));
|
write_kw(rst_file, EclKW<int> ("ILBR", MSWData.getILBr()));
|
||||||
|
Loading…
Reference in New Issue
Block a user