update the guide rates for all the wells at the same time.

This commit is contained in:
Kai Bao 2021-06-28 23:11:11 +02:00
parent e7c223bc00
commit 23d0185acd
3 changed files with 47 additions and 16 deletions

View File

@ -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;
};

View File

@ -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));
}
}

View File

@ -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);
}