Pull Basic Connection Information Out To Helper

This commit introduces a new helper class, WellConnectionRecord,
which holds the connection IJK and host grid information.  Said
information must be output if the run requests either RFT, PLT, or
both RFT and PLT data and so should not be tied to the RFT writer.

This is in preparation of adding PLT output.
This commit is contained in:
Bård Skaflestad 2022-09-22 14:38:58 +02:00
parent 040e4fd5ef
commit 078b7b2e28

View File

@ -205,6 +205,68 @@ namespace {
// ======================================================================= // =======================================================================
class WellConnectionRecord
{
public:
explicit WellConnectionRecord(const std::size_t nconn = 0);
void collectRecordData(const ::Opm::EclipseGrid& grid,
const ::Opm::Well& well);
void write(::Opm::EclIO::OutputStream::RFT& rftFile) const;
private:
std::vector<int> i_;
std::vector<int> j_;
std::vector<int> k_;
std::vector<Opm::EclIO::PaddedOutputString<8>> host_;
void addConnection(const ::Opm::Connection& conn);
};
WellConnectionRecord::WellConnectionRecord(const std::size_t nconn)
{
if (nconn == std::size_t{0}) { return; }
this->i_.reserve(nconn);
this->j_.reserve(nconn);
this->k_.reserve(nconn);
this->host_.reserve(nconn);
}
void WellConnectionRecord::collectRecordData(const ::Opm::EclipseGrid& grid,
const ::Opm::Well& well)
{
using ConnPos = ::Opm::WellConnections::const_iterator;
connectionLoop(well.getConnections(), grid, [this](ConnPos connPos)
{
this->addConnection(*connPos);
});
}
void WellConnectionRecord::write(::Opm::EclIO::OutputStream::RFT& rftFile) const
{
rftFile.write("CONIPOS", this->i_);
rftFile.write("CONJPOS", this->j_);
rftFile.write("CONKPOS", this->k_);
rftFile.write("HOSTGRID", this->host_);
}
void WellConnectionRecord::addConnection(const ::Opm::Connection& conn)
{
this->i_.push_back(conn.getI() + 1);
this->j_.push_back(conn.getJ() + 1);
this->k_.push_back(conn.getK() + 1);
this->host_.emplace_back();
}
// =======================================================================
class RFTRecord class RFTRecord
{ {
public: public:
@ -215,22 +277,16 @@ namespace {
const ::Opm::Well& well, const ::Opm::Well& well,
const ::Opm::data::Well& wellSol); const ::Opm::data::Well& wellSol);
std::size_t nConn() const { return this->i_.size(); } std::size_t nConn() const { return this->depth_.size(); }
void write(::Opm::EclIO::OutputStream::RFT& rftFile) const; void write(::Opm::EclIO::OutputStream::RFT& rftFile) const;
private: private:
std::vector<int> i_;
std::vector<int> j_;
std::vector<int> k_;
std::vector<float> depth_; std::vector<float> depth_;
std::vector<float> press_; std::vector<float> press_;
std::vector<float> swat_; std::vector<float> swat_;
std::vector<float> sgas_; std::vector<float> sgas_;
std::vector<Opm::EclIO::PaddedOutputString<8>> host_;
void addConnection(const ::Opm::UnitSystem& usys, void addConnection(const ::Opm::UnitSystem& usys,
const ::Opm::Connection& conn, const ::Opm::Connection& conn,
const ::Opm::data::Connection& xcon); const ::Opm::data::Connection& xcon);
@ -238,18 +294,12 @@ namespace {
RFTRecord::RFTRecord(const std::size_t nconn) RFTRecord::RFTRecord(const std::size_t nconn)
{ {
if (nconn == 0) { return; } if (nconn == std::size_t{0}) { return; }
this->i_.reserve(nconn);
this->j_.reserve(nconn);
this->k_.reserve(nconn);
this->depth_.reserve(nconn); this->depth_.reserve(nconn);
this->press_.reserve(nconn); this->press_.reserve(nconn);
this->swat_ .reserve(nconn); this->swat_ .reserve(nconn);
this->sgas_ .reserve(nconn); this->sgas_ .reserve(nconn);
this->host_.reserve(nconn);
} }
void RFTRecord::collectRecordData(const ::Opm::UnitSystem& usys, void RFTRecord::collectRecordData(const ::Opm::UnitSystem& usys,
@ -277,12 +327,6 @@ namespace {
void RFTRecord::write(::Opm::EclIO::OutputStream::RFT& rftFile) const void RFTRecord::write(::Opm::EclIO::OutputStream::RFT& rftFile) const
{ {
rftFile.write("CONIPOS", this->i_);
rftFile.write("CONJPOS", this->j_);
rftFile.write("CONKPOS", this->k_);
rftFile.write("HOSTGRID", this->host_);
rftFile.write("DEPTH" , this->depth_); rftFile.write("DEPTH" , this->depth_);
rftFile.write("PRESSURE", this->press_); rftFile.write("PRESSURE", this->press_);
rftFile.write("SWAT" , this->swat_); rftFile.write("SWAT" , this->swat_);
@ -293,10 +337,6 @@ namespace {
const ::Opm::Connection& conn, const ::Opm::Connection& conn,
const ::Opm::data::Connection& xcon) const ::Opm::data::Connection& xcon)
{ {
this->i_.push_back(conn.getI() + 1);
this->j_.push_back(conn.getJ() + 1);
this->k_.push_back(conn.getK() + 1);
using M = ::Opm::UnitSystem::measure; using M = ::Opm::UnitSystem::measure;
auto cvrt = [&usys](const M meas, const double x) -> float auto cvrt = [&usys](const M meas, const double x) -> float
{ {
@ -309,7 +349,6 @@ namespace {
this->swat_.push_back(xcon.cell_saturation_water); this->swat_.push_back(xcon.cell_saturation_water);
this->sgas_.push_back(xcon.cell_saturation_gas); this->sgas_.push_back(xcon.cell_saturation_gas);
this->host_.emplace_back();
} }
// ======================================================================= // =======================================================================
@ -349,13 +388,15 @@ namespace {
double elapsed_{}; double elapsed_{};
Opm::RestartIO::InteHEAD::TimePoint timeStamp_{}; Opm::RestartIO::InteHEAD::TimePoint timeStamp_{};
std::optional<RFTRecord> rft_{}; std::unique_ptr<WellConnectionRecord> wconns_{};
std::unique_ptr<RFTRecord> rft_{};
std::vector<DataHandler> dataHandlers_{}; std::vector<DataHandler> dataHandlers_{};
std::vector<RecordWriter> recordWriters_{}; std::vector<RecordWriter> recordWriters_{};
static std::map<DataTypes, CreateTypeHandler> creators_; static std::map<DataTypes, CreateTypeHandler> creators_;
void initialiseConnHandlers();
void initialiseRFTHandlers(); void initialiseRFTHandlers();
bool haveOutputData() const; bool haveOutputData() const;
bool haveRFTData() const; bool haveRFTData() const;
@ -379,6 +420,8 @@ namespace {
, elapsed_ { elapsed } , elapsed_ { elapsed }
, timeStamp_{ timeStamp } , timeStamp_{ timeStamp }
{ {
this->initialiseConnHandlers();
for (const auto& type : types) { for (const auto& type : types) {
auto handler = creators_.find(type); auto handler = creators_.find(type);
if (handler == creators_.end()) { if (handler == creators_.end()) {
@ -414,13 +457,36 @@ namespace {
} }
} }
void WellRFTOutputData::initialiseConnHandlers()
{
if (this->well_.get().getConnections().empty()) {
return;
}
this->wconns_ = std::make_unique<WellConnectionRecord>
(this->well_.get().getConnections().size());
this->dataHandlers_.emplace_back(
[this]([[maybe_unused]] const Opm::data::Well& wellSol)
{
this->wconns_->collectRecordData(this->grid_, this->well_);
});
this->recordWriters_.emplace_back(
[this](::Opm::EclIO::OutputStream::RFT& rftFile)
{
this->wconns_->write(rftFile);
});
}
void WellRFTOutputData::initialiseRFTHandlers() void WellRFTOutputData::initialiseRFTHandlers()
{ {
if (this->well_.get().getConnections().empty()) { if (this->well_.get().getConnections().empty()) {
return; return;
} }
this->rft_ = RFTRecord{ this->well_.get().getConnections().size() }; this->rft_ = std::make_unique<RFTRecord>
(this->well_.get().getConnections().size());
this->dataHandlers_.emplace_back( this->dataHandlers_.emplace_back(
[this](const Opm::data::Well& wellSol) [this](const Opm::data::Well& wellSol)
@ -438,7 +504,7 @@ namespace {
bool WellRFTOutputData::haveRFTData() const bool WellRFTOutputData::haveRFTData() const
{ {
return this->rft_.has_value() return (this->rft_ != nullptr)
&& (this->rft_->nConn() > std::size_t{0}); && (this->rft_->nConn() > std::size_t{0});
} }