update the guide rates for all the wells at the same time.
This commit is contained in:
parent
e7c223bc00
commit
23d0185acd
@ -92,7 +92,7 @@ struct GRValState {
|
||||
|
||||
public:
|
||||
GuideRate(const Schedule& schedule);
|
||||
void compute(const std::string& wgname, size_t report_step, double sim_time, double oil_pot, double gas_pot, double wat_pot);
|
||||
void compute(const std::string& wgname, size_t report_step, double sim_time, double oil_pot, double gas_pot, double wat_pot);
|
||||
void compute(const std::string& wgname, const Phase& phase, size_t report_step, double guide_rate);
|
||||
double get(const std::string& well, Well::GuideRateTarget target, const RateVector& rates) const;
|
||||
double get(const std::string& group, Group::GuideRateProdTarget target, const RateVector& rates) const;
|
||||
@ -102,6 +102,8 @@ public:
|
||||
bool has(const std::string& name, const Phase& phase) const;
|
||||
void init_grvalue(std::size_t report_step, const std::string& wgname, GuideRateValue value);
|
||||
|
||||
void updateGuideRateExpiration(double sim_time, size_t report_step);
|
||||
|
||||
private:
|
||||
void well_compute(const std::string& wgname, size_t report_step, double sim_time, double oil_pot, double gas_pot, double wat_pot);
|
||||
void group_compute(const std::string& wgname, size_t report_step, double sim_time, double oil_pot, double gas_pot, double wat_pot);
|
||||
@ -128,6 +130,7 @@ private:
|
||||
std::unordered_map<std::string, GRValPtr> values;
|
||||
std::unordered_map<pair, double, pair_hash> injection_group_values;
|
||||
std::unordered_map<std::string, RateVector > potentials;
|
||||
bool guide_rates_expired {false};
|
||||
const Schedule& schedule;
|
||||
};
|
||||
|
||||
|
@ -174,11 +174,7 @@ void GuideRate::group_compute(const std::string& wgname,
|
||||
};
|
||||
}
|
||||
|
||||
const auto& grv = iter->second->curr;
|
||||
const auto time_diff = sim_time - grv.sim_time;
|
||||
if (config.model().update_delay() > time_diff) {
|
||||
return;
|
||||
}
|
||||
if (!this->guide_rates_expired && this->values.at(wgname)->curr.value > 0) return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -257,13 +253,11 @@ void GuideRate::well_compute(const std::string& wgname,
|
||||
return;
|
||||
}
|
||||
|
||||
auto iter = this->values.find(wgname);
|
||||
if (iter != this->values.end()) {
|
||||
const auto& grv = iter->second->curr;
|
||||
const auto time_diff = sim_time - grv.sim_time;
|
||||
if (config.model().update_delay() > time_diff) {
|
||||
return;
|
||||
}
|
||||
// Newly opened wells without calculated guide rates always need to update guide rates
|
||||
// With a non-zero guide rate value basically mean the well exisits in GuideRate already, aka, NOT new well
|
||||
if (!this->guide_rates_expired &&
|
||||
(this->values.count(wgname) > 0 && this->values.at(wgname)->curr.value > 0) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto guide_rate = this->eval_form(config.model(), oil_pot, gas_pot, wat_pot);
|
||||
@ -300,9 +294,7 @@ void GuideRate::assign_grvalue(const std::string& wgname,
|
||||
// We've advanced in time since we previously calculated/stored this
|
||||
// guiderate value. Push current value into the past and prepare to
|
||||
// capture new value.
|
||||
using std::swap;
|
||||
|
||||
swap(v->prev, v->curr);
|
||||
std::swap(v->prev, v->curr);
|
||||
}
|
||||
|
||||
v->curr = std::move(value);
|
||||
@ -334,4 +326,27 @@ double GuideRate::get_grvalue_result(const GRValState& gr) const
|
||||
: std::max(gr.curr.value, 0.0);
|
||||
}
|
||||
|
||||
|
||||
void GuideRate::updateGuideRateExpiration(double sim_time, size_t report_step)
|
||||
{
|
||||
const auto& config = this->schedule[report_step].guide_rate();
|
||||
|
||||
if (!config.has_model()) {
|
||||
this->guide_rates_expired = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// getting the last update time
|
||||
double last_update_time = std::numeric_limits<double>::max();
|
||||
for ([[maybe_unused]] const auto& [wgname, value] : this->values) {
|
||||
const double update_time = value->curr.sim_time;
|
||||
if (value->curr.value > 0 && update_time < last_update_time) {
|
||||
last_update_time = update_time;
|
||||
}
|
||||
}
|
||||
|
||||
const double update_delay = config.model().update_delay();
|
||||
this->guide_rates_expired = (sim_time >= (last_update_time + update_delay));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -203,6 +203,7 @@ BOOST_AUTO_TEST_CASE(P1_First)
|
||||
const auto stm = 0.0;
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P1", rpt, stm, wopp, wgpp, wwpp);
|
||||
|
||||
const auto orat = 2.0;
|
||||
@ -246,6 +247,7 @@ BOOST_AUTO_TEST_CASE(P2_Second)
|
||||
const auto stm = 0.0;
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P2", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -256,6 +258,7 @@ BOOST_AUTO_TEST_CASE(P2_Second)
|
||||
const auto stm = 10.0*Opm::unit::second; // Before recalculation delay
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P2", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -295,6 +298,7 @@ BOOST_AUTO_TEST_CASE(P2_Second)
|
||||
const auto stm = 10.0*Opm::unit::day; // After recalculation delay
|
||||
const auto rpt = size_t{3};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P2", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -336,6 +340,7 @@ BOOST_AUTO_TEST_CASE(P_Third)
|
||||
const auto stm = 0.0;
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -346,6 +351,7 @@ BOOST_AUTO_TEST_CASE(P_Third)
|
||||
const auto stm = 10.0*Opm::unit::day;
|
||||
const auto rpt = size_t{3};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -356,6 +362,7 @@ BOOST_AUTO_TEST_CASE(P_Third)
|
||||
const auto stm = 20.0*Opm::unit::day;
|
||||
const auto rpt = size_t{4};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -403,6 +410,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df01)
|
||||
const auto stm = 0.0;
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -413,6 +421,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df01)
|
||||
const auto stm = 10.0*Opm::unit::day;
|
||||
const auto rpt = size_t{3};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -423,6 +432,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df01)
|
||||
const auto stm = 20.0*Opm::unit::day;
|
||||
const auto rpt = size_t{4};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -470,6 +480,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df09)
|
||||
const auto stm = 0.0;
|
||||
const auto rpt = size_t{1};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -480,6 +491,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df09)
|
||||
const auto stm = 10.0*Opm::unit::day;
|
||||
const auto rpt = size_t{3};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
@ -490,6 +502,7 @@ BOOST_AUTO_TEST_CASE(P_Third_df09)
|
||||
const auto stm = 20.0*Opm::unit::day;
|
||||
const auto rpt = size_t{4};
|
||||
|
||||
cse.gr.updateGuideRateExpiration(stm, rpt);
|
||||
cse.gr.compute("P", rpt, stm, wopp, wgpp, wwpp);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user