From e451babec78dee38884086301f8e8da5a9ce0748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Thu, 7 Oct 2021 09:29:24 +0200 Subject: [PATCH] Restore Guiderate's Nominated Phase From Restart File --- opm/io/eclipse/rst/header.hpp | 1 + .../Schedule/Group/GuideRateModel.hpp | 1 + src/opm/io/eclipse/rst/header.cpp | 1 + .../Schedule/Group/GuideRateModel.cpp | 14 +++++++ .../EclipseState/Schedule/Schedule.cpp | 40 ++++++++++--------- 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/opm/io/eclipse/rst/header.hpp b/opm/io/eclipse/rst/header.hpp index ddeda7114..088275ca3 100644 --- a/opm/io/eclipse/rst/header.hpp +++ b/opm/io/eclipse/rst/header.hpp @@ -90,6 +90,7 @@ struct RstHeader { int ngroup_udq; int nfield_udq; int num_action; + int guide_rate_nominated_phase; bool e300_radial; bool e100_radial; diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp index 7140d01ec..9098e0b22 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp @@ -40,6 +40,7 @@ public: }; static Target TargetFromString(const std::string& s); + static Target TargetFromRestart(const int nominated_phase); GuideRateModel(double time_interval_arg, Target target_arg, diff --git a/src/opm/io/eclipse/rst/header.cpp b/src/opm/io/eclipse/rst/header.cpp index 50d66b355..5b4414017 100644 --- a/src/opm/io/eclipse/rst/header.cpp +++ b/src/opm/io/eclipse/rst/header.cpp @@ -91,6 +91,7 @@ RstHeader::RstHeader(const Opm::UnitSystem& unit_system, const std::vector& ngroup_udq(intehead[VI::intehead::NO_GROUP_UDQS]), nfield_udq(intehead[VI::intehead::NO_FIELD_UDQS]), num_action(intehead[VI::intehead::NOOFACTIONS]), + guide_rate_nominated_phase(intehead[VI::intehead::NGRNPH]), // e300_radial(logihead[VI::logihead::E300Radial]), e100_radial(logihead[VI::logihead::E100Radial]), diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp index 90aaebead..b0776e833 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -277,6 +278,19 @@ GuideRateModel::Target GuideRateModel::TargetFromString(const std::string& s) { throw std::invalid_argument("Could not convert: " + s + " to a valid Target enum value"); } +GuideRateModel::Target GuideRateModel::TargetFromRestart(const int nominated_phase) { + static const auto int_to_target = std::unordered_map { + {0, Target::NONE}, + {1, Target::OIL }, + {3, Target::GAS }, + {4, Target::LIQ }, + {6, Target::RES }, + {9, Target::COMB}, + }; + + auto t = int_to_target.find(nominated_phase); + return (t == int_to_target.end()) ? Target::NONE : t->second; +} /* The COMB target - which requires parameters from the LINCOM keyword, is not diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp index 12b40b735..0be353ebc 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp @@ -1399,35 +1399,38 @@ namespace { OpmLog::info(fmt::format("Adding well {} from restart file", rst_well.name)); } + this->snapshots.back().update_tuning(rst_state.tuning); this->snapshots.back().events().addEvent( ScheduleEvents::TUNING_CHANGE ); - { const auto& header = rst_state.header; - bool time_interval = 0; - GuideRateModel::Target target = GuideRateModel::Target::OIL; - bool allow_increase = true; - bool use_free_gas = false; - if (GuideRateModel::rst_valid(time_interval, + if (GuideRateModel::rst_valid(header.guide_rate_delay, header.guide_rate_a, header.guide_rate_b, header.guide_rate_c, header.guide_rate_d, header.guide_rate_e, header.guide_rate_f, - header.guide_rate_damping)) { - auto guide_rate_model = GuideRateModel(time_interval, - target, - header.guide_rate_a, - header.guide_rate_b, - header.guide_rate_c, - header.guide_rate_d, - header.guide_rate_e, - header.guide_rate_f, - allow_increase, - header.guide_rate_damping, - use_free_gas); + header.guide_rate_damping)) + { + const bool allow_increase = true; + const bool use_free_gas = false; + + const auto guide_rate_model = GuideRateModel { + header.guide_rate_delay, + GuideRateModel::TargetFromRestart(header.guide_rate_nominated_phase), + header.guide_rate_a, + header.guide_rate_b, + header.guide_rate_c, + header.guide_rate_d, + header.guide_rate_e, + header.guide_rate_f, + allow_increase, + header.guide_rate_damping, + use_free_gas + }; + this->updateGuideRateModel(guide_rate_model, report_step); } } @@ -1469,7 +1472,6 @@ namespace { this->snapshots.back().udq_active.update( std::move(udq_active) ); } - if (!rst_state.actions.empty()) { auto actions = this->snapshots.back().actions(); for (const auto& rst_action : rst_state.actions)