diff --git a/opm/input/eclipse/Schedule/Well/Connection.hpp b/opm/input/eclipse/Schedule/Well/Connection.hpp index 2718ff91a..e607b0e30 100644 --- a/opm/input/eclipse/Schedule/Well/Connection.hpp +++ b/opm/input/eclipse/Schedule/Well/Connection.hpp @@ -123,6 +123,7 @@ namespace RestartIO { double skinFactor() const; CTFKind kind() const; const InjMult& injmult() const; + bool activeInjMult() const; void setInjMult(const InjMult& inj_mult); void setState(State state); @@ -191,7 +192,7 @@ namespace RestartIO { std::array ijk; CTFKind m_ctfkind; - InjMult m_injmult; + std::optional m_injmult; std::size_t m_global_index; /* The sort_value member is a peculiar quantity. The connections are diff --git a/opm/input/eclipse/Schedule/Well/WINJMULT.hpp b/opm/input/eclipse/Schedule/Well/WINJMULT.hpp index bc60ee1fd..9e43f04dc 100644 --- a/opm/input/eclipse/Schedule/Well/WINJMULT.hpp +++ b/opm/input/eclipse/Schedule/Well/WINJMULT.hpp @@ -36,18 +36,14 @@ struct InjMult { NONE, }; - bool is_active {false}; double fracture_pressure {std::numeric_limits::max()}; double multiplier_gradient {0.}; static InjMultMode injMultModeFromString(const std::string& str, const KeywordLocation& location); - bool active() const; - template void serializeOp(Serializer& serializer) { - serializer(is_active); serializer(fracture_pressure); serializer(multiplier_gradient); } diff --git a/opm/input/eclipse/Schedule/Well/Well.hpp b/opm/input/eclipse/Schedule/Well/Well.hpp index 02aa47f70..1bc1b9556 100644 --- a/opm/input/eclipse/Schedule/Well/Well.hpp +++ b/opm/input/eclipse/Schedule/Well/Well.hpp @@ -391,6 +391,7 @@ public: Phase getPreferredPhase() const; InjMultMode getInjMultMode() const; const InjMult& getWellInjMult() const; + bool aciveWellInjMult() const; bool hasConnections() const; const std::vector getConnections(int completion) const; @@ -596,7 +597,7 @@ private: PAvg m_pavg; double well_temperature; InjMultMode inj_mult_mode = InjMultMode::NONE; - InjMult well_inj_mult; + std::optional well_inj_mult; }; std::ostream& operator<<( std::ostream&, const Well::WellInjectionProperties& ); diff --git a/src/opm/input/eclipse/Schedule/Well/Connection.cpp b/src/opm/input/eclipse/Schedule/Well/Connection.cpp index 12c23ffbb..da5b0de80 100644 --- a/src/opm/input/eclipse/Schedule/Well/Connection.cpp +++ b/src/opm/input/eclipse/Schedule/Well/Connection.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace Opm { @@ -297,7 +298,9 @@ const std::optional>& Connection::perf_range() const { ss << "segment_nr " << this->segment_number << std::endl; ss << "center_depth " << this->center_depth << std::endl; ss << "sort_value" << this->m_sort_value<< std::endl; - ss << "INJMULT " << InjMult::InjMultToString(this->m_injmult) << std::endl; + if (this->m_injmult.has_value()) { + ss << "INJMULT " << InjMult::InjMultToString(this->m_injmult.value()) << std::endl; + } return ss.str(); } @@ -446,7 +449,12 @@ Connection::CTFKind Connection::kind() const { } const InjMult& Connection::injmult() const { - return m_injmult; + assert(this->activeInjMult()); + return m_injmult.value(); +} + +bool Connection::activeInjMult() const { + return this->m_injmult.has_value(); } void Connection::setInjMult(const InjMult& inj_mult) { diff --git a/src/opm/input/eclipse/Schedule/Well/WINJMULT.cpp b/src/opm/input/eclipse/Schedule/Well/WINJMULT.cpp index 3435000c0..1025ce20c 100644 --- a/src/opm/input/eclipse/Schedule/Well/WINJMULT.cpp +++ b/src/opm/input/eclipse/Schedule/Well/WINJMULT.cpp @@ -39,22 +39,15 @@ InjMult::InjMultMode InjMult::injMultModeFromString(const std::string& str, cons } -bool InjMult::active() const -{ - return this->is_active; -} - bool InjMult::operator==(const InjMult& rhs) const { - return is_active == rhs.is_active - && fracture_pressure == rhs.fracture_pressure + return fracture_pressure == rhs.fracture_pressure && multiplier_gradient == rhs.multiplier_gradient; } InjMult InjMult::serializationTestObject() { InjMult result; - result.is_active = false; result.fracture_pressure = 1.e9; result.multiplier_gradient = 2.; return result; @@ -62,8 +55,8 @@ InjMult InjMult::serializationTestObject() { std::string InjMult::InjMultToString(const InjMult& mult) { - std::string ss = fmt::format("active? {}, fracture_pressure {}, multiplier_gradient {}", - mult.is_active, mult.fracture_pressure, mult.multiplier_gradient); + std::string ss = fmt::format("fracture_pressure {}, multiplier_gradient {}", + mult.fracture_pressure, mult.multiplier_gradient); return ss; } diff --git a/src/opm/input/eclipse/Schedule/Well/Well.cpp b/src/opm/input/eclipse/Schedule/Well/Well.cpp index c7bff6f04..044161548 100644 --- a/src/opm/input/eclipse/Schedule/Well/Well.cpp +++ b/src/opm/input/eclipse/Schedule/Well/Well.cpp @@ -52,6 +52,7 @@ #include "../MSW/Compsegs.hpp" +#include #include #include #include @@ -310,7 +311,8 @@ Well::Well(const RestartIO::RstWell& rst_well, wvfpdp(std::make_shared()), wvfpexp(explicitTHPOptions(rst_well)), status(status_from_int(rst_well.well_status)), - well_temperature(Metric::TemperatureOffset + ParserKeywords::STCOND::TEMPERATURE::defaultValue) + well_temperature(Metric::TemperatureOffset + ParserKeywords::STCOND::TEMPERATURE::defaultValue), + well_inj_mult(std::nullopt) { if (this->wtype.producer()) { auto p = std::make_shared(this->unit_system, wname); @@ -489,7 +491,8 @@ Well::Well(const std::string& wname_arg, wvfpdp(std::make_shared()), wvfpexp(std::make_shared()), status(Status::SHUT), - well_temperature(Metric::TemperatureOffset + ParserKeywords::STCOND::TEMPERATURE::defaultValue) + well_temperature(Metric::TemperatureOffset + ParserKeywords::STCOND::TEMPERATURE::defaultValue), + well_inj_mult(std::nullopt) { auto p = std::make_shared(this->unit_system, this->wname); p->whistctl_cmode = whistctl_cmode; @@ -1325,7 +1328,7 @@ bool Well::handleWINJMULT(const Opm::DeckRecord& record, const KeywordLocation& const double fracture_pressure = record.getItem().getSIDouble(0); const double multiple_gradient = record.getItem().getSIDouble(0); auto new_connections = std::make_shared(this->connections->ordering(), this->headI, this->headJ); - const InjMult inj_mult {true, fracture_pressure, multiple_gradient}; + const InjMult inj_mult {fracture_pressure, multiple_gradient}; bool connections_update = false; bool well_inj_update = false; @@ -1614,7 +1617,7 @@ bool Well::operator==(const Well& data) const { && (this->getInjectionProperties() == data.getInjectionProperties()) && (this->well_temperature == data.well_temperature) && (this->inj_mult_mode == data.inj_mult_mode) - && (this->getWellInjMult() == data.getWellInjMult()) + && (this->well_inj_mult == data.well_inj_mult) ; } @@ -1701,7 +1704,12 @@ Opm::Well::InjMultMode Opm::Well::getInjMultMode() const { } const Opm::InjMult& Opm::Well::getWellInjMult() const { - return this->well_inj_mult; + assert(this->aciveWellInjMult()); + return this->well_inj_mult.value(); +} + +bool Opm::Well::aciveWellInjMult() const { + return this->well_inj_mult.has_value(); }