msim updates:
- add boolean flag report_only to simulation run. - add SummaryState argument to well rate callbacks
This commit is contained in:
parent
6376e4dcc6
commit
fac74432d4
@ -48,6 +48,6 @@ int main(int /* argc */, char** argv) {
|
||||
|
||||
Opm::msim msim(state);
|
||||
Opm::EclipseIO io(state, state.getInputGrid(), schedule, summary_config);
|
||||
msim.run(schedule, io);
|
||||
msim.run(schedule, io, false);
|
||||
}
|
||||
|
||||
|
@ -25,24 +25,23 @@ class SummaryState;
|
||||
class msim {
|
||||
|
||||
public:
|
||||
using well_rate_function = double(const EclipseState&, const Schedule&, const data::Solution&, size_t report_step, double seconds_elapsed);
|
||||
using well_rate_function = double(const EclipseState&, const Schedule&, const SummaryState& st, const data::Solution&, size_t report_step, double seconds_elapsed);
|
||||
using solution_function = void(const EclipseState&, const Schedule&, data::Solution&, size_t report_step, double seconds_elapsed);
|
||||
|
||||
msim(const EclipseState& state);
|
||||
|
||||
void well_rate(const std::string& well, data::Rates::opt rate, std::function<well_rate_function> func);
|
||||
void solution(const std::string& field, std::function<solution_function> func);
|
||||
void run(Schedule& schedule, EclipseIO& io);
|
||||
void run(Schedule& schedule, EclipseIO& io, bool report_only);
|
||||
void post_step(Schedule& schedule, const SummaryState& st, data::Solution& sol, data::Wells& well_data, size_t report_step, EclipseIO& io) const;
|
||||
private:
|
||||
|
||||
void run_step(const Schedule& schedule, SummaryState& st, data::Solution& sol, data::Wells& well_data, size_t report_step, EclipseIO& io) const;
|
||||
void run_step(const Schedule& schedule, SummaryState& st, data::Solution& sol, data::Wells& well_data, size_t report_step, double dt, EclipseIO& io) const;
|
||||
void output(const SummaryState& st, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, EclipseIO& io) const;
|
||||
void simulate(const Schedule& schedule, data::Solution& sol, data::Wells& well_data, size_t report_step, double seconds_elapsed, double time_step) const;
|
||||
void output(SummaryState& st, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, EclipseIO& io) const;
|
||||
void simulate(const Schedule& schedule, const SummaryState& st, data::Solution& sol, data::Wells& well_data, size_t report_step, double seconds_elapsed, double time_step) const;
|
||||
|
||||
EclipseState state;
|
||||
|
||||
std::map<std::string, std::map<data::Rates::opt, std::function<well_rate_function>>> well_rates;
|
||||
std::map<std::string, std::function<solution_function>> solutions;
|
||||
};
|
||||
|
@ -37,7 +37,7 @@ msim::msim(const EclipseState& state) :
|
||||
state(state)
|
||||
{}
|
||||
|
||||
void msim::run(Schedule& schedule, EclipseIO& io) {
|
||||
void msim::run(Schedule& schedule, EclipseIO& io, bool report_only) {
|
||||
const double week = 7 * 86400;
|
||||
data::Solution sol;
|
||||
data::Wells well_data;
|
||||
@ -45,8 +45,12 @@ void msim::run(Schedule& schedule, EclipseIO& io) {
|
||||
|
||||
io.writeInitial();
|
||||
for (size_t report_step = 1; report_step < schedule.size(); report_step++) {
|
||||
double time_step = std::min(week, 0.5*schedule.stepLength(report_step - 1));
|
||||
run_step(schedule, st, sol, well_data, report_step, time_step, io);
|
||||
if (report_only)
|
||||
run_step(schedule, st, sol, well_data, report_step, io);
|
||||
else {
|
||||
double time_step = std::min(week, 0.5*schedule.stepLength(report_step - 1));
|
||||
run_step(schedule, st, sol, well_data, report_step, time_step, io);
|
||||
}
|
||||
post_step(schedule, st, sol, well_data, report_step, io);
|
||||
}
|
||||
}
|
||||
@ -84,7 +88,7 @@ void msim::run_step(const Schedule& schedule, SummaryState& st, data::Solution&
|
||||
if ((seconds_elapsed + time_step) > end_time)
|
||||
time_step = end_time - seconds_elapsed;
|
||||
|
||||
this->simulate(schedule, sol, well_data, report_step, seconds_elapsed, time_step);
|
||||
this->simulate(schedule, st, sol, well_data, report_step, seconds_elapsed, time_step);
|
||||
|
||||
seconds_elapsed += time_step;
|
||||
|
||||
@ -108,7 +112,7 @@ void msim::run_step(const Schedule& schedule, SummaryState& st, data::Solution&
|
||||
|
||||
|
||||
|
||||
void msim::output(const SummaryState& st, size_t report_step, bool /* substep */, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, EclipseIO& io) const {
|
||||
void msim::output(SummaryState& st, size_t report_step, bool /* substep */, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, EclipseIO& io) const {
|
||||
RestartValue value(sol, well_data);
|
||||
io.writeTimeStep(st,
|
||||
report_step,
|
||||
@ -121,7 +125,7 @@ void msim::output(const SummaryState& st, size_t report_step, bool /* substep */
|
||||
}
|
||||
|
||||
|
||||
void msim::simulate(const Schedule& schedule, data::Solution& sol, data::Wells& well_data, size_t report_step, double seconds_elapsed, double time_step) const {
|
||||
void msim::simulate(const Schedule& schedule, const SummaryState& st, data::Solution& sol, data::Wells& well_data, size_t report_step, double seconds_elapsed, double time_step) const {
|
||||
for (const auto& sol_pair : this->solutions) {
|
||||
auto func = sol_pair.second;
|
||||
func(this->state, schedule, sol, report_step, seconds_elapsed + time_step);
|
||||
@ -134,7 +138,7 @@ void msim::simulate(const Schedule& schedule, data::Solution& sol, data::Wells&
|
||||
auto rate = rate_pair.first;
|
||||
auto func = rate_pair.second;
|
||||
|
||||
well.rates.set(rate, func(this->state, schedule, sol, report_step, seconds_elapsed + time_step));
|
||||
well.rates.set(rate, func(this->state, schedule, st, sol, report_step, seconds_elapsed + time_step));
|
||||
}
|
||||
|
||||
// This is complete bogus; a temporary fix to pass an assert() in the
|
||||
|
@ -44,7 +44,7 @@
|
||||
using namespace Opm;
|
||||
|
||||
|
||||
double prod_opr(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t /* report_step */, double seconds_elapsed) {
|
||||
double prod_opr(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t /* report_step */, double seconds_elapsed) {
|
||||
const auto& units = es.getUnits();
|
||||
return -units.to_si(UnitSystem::measure::rate, seconds_elapsed);
|
||||
}
|
||||
@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(RUN) {
|
||||
test_work_area_type * work_area = test_work_area_alloc("test_msim");
|
||||
EclipseIO io(state, state.getInputGrid(), schedule, summary_config);
|
||||
|
||||
msim.run(schedule, io);
|
||||
msim.run(schedule, io, false);
|
||||
|
||||
for (const auto& fname : {"SPE1CASE1.INIT", "SPE1CASE1.UNRST", "SPE1CASE1.EGRID", "SPE1CASE1.SMSPEC", "SPE1CASE1.UNSMRY"})
|
||||
BOOST_CHECK( util_is_file( fname ));
|
||||
|
@ -66,25 +66,25 @@ struct test_data {
|
||||
};
|
||||
|
||||
|
||||
double prod_opr(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
double prod_opr(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double oil_rate = 1.0;
|
||||
return -units.to_si(UnitSystem::measure::rate, oil_rate);
|
||||
}
|
||||
|
||||
double prod_opr_low(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
double prod_opr_low(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double oil_rate = 0.5;
|
||||
return -units.to_si(UnitSystem::measure::rate, oil_rate);
|
||||
}
|
||||
|
||||
double prod_wpr_P1(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
double prod_wpr_P1(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double water_rate = 0.0;
|
||||
return -units.to_si(UnitSystem::measure::rate, water_rate);
|
||||
}
|
||||
|
||||
double prod_wpr_P2(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t report_step, double /* seconds_elapsed */) {
|
||||
double prod_wpr_P2(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t report_step, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double water_rate = 0.0;
|
||||
if (report_step > 5)
|
||||
@ -93,13 +93,13 @@ double prod_wpr_P2(const EclipseState& es, const Schedule& /* sched */, const d
|
||||
return -units.to_si(UnitSystem::measure::rate, water_rate);
|
||||
}
|
||||
|
||||
double prod_wpr_P3(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
double prod_wpr_P3(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t /* report_step */, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double water_rate = 0.0;
|
||||
return -units.to_si(UnitSystem::measure::rate, water_rate);
|
||||
}
|
||||
|
||||
double prod_wpr_P4(const EclipseState& es, const Schedule& /* sched */, const data::Solution& /* sol */, size_t report_step, double /* seconds_elapsed */) {
|
||||
double prod_wpr_P4(const EclipseState& es, const Schedule& /* sched */, const SummaryState&, const data::Solution& /* sol */, size_t report_step, double /* seconds_elapsed */) {
|
||||
const auto& units = es.getUnits();
|
||||
double water_rate = 0.0;
|
||||
if (report_step > 10)
|
||||
@ -128,7 +128,7 @@ BOOST_AUTO_TEST_CASE(UDQ_SORTA_EXAMPLE) {
|
||||
sim.well_rate("P3", data::Rates::opt::oil, prod_opr);
|
||||
sim.well_rate("P4", data::Rates::opt::oil, prod_opr_low);
|
||||
|
||||
sim.run(td.schedule, io);
|
||||
sim.run(td.schedule, io, false);
|
||||
{
|
||||
const auto& w1 = td.schedule.getWell2("P1", 1);
|
||||
const auto& w4 = td.schedule.getWell2("P4", 1);
|
||||
@ -179,7 +179,7 @@ BOOST_AUTO_TEST_CASE(WELL_CLOSE_EXAMPLE) {
|
||||
}
|
||||
|
||||
|
||||
sim.run(td.schedule, io);
|
||||
sim.run(td.schedule, io, false);
|
||||
{
|
||||
const auto& w1 = td.schedule.getWell2("P1", 15);
|
||||
const auto& w3 = td.schedule.getWell2("P3", 15);
|
||||
@ -222,7 +222,7 @@ BOOST_AUTO_TEST_CASE(UDQ_ASSIGN) {
|
||||
sim.well_rate("P3", data::Rates::opt::wat, prod_wpr_P3);
|
||||
sim.well_rate("P4", data::Rates::opt::wat, prod_wpr_P4);
|
||||
|
||||
sim.run(td.schedule, io);
|
||||
sim.run(td.schedule, io, false);
|
||||
|
||||
const auto& base_name = td.state.getIOConfig().getBaseName();
|
||||
|
||||
@ -269,7 +269,7 @@ BOOST_AUTO_TEST_CASE(UDQ_WUWCT) {
|
||||
sim.well_rate("P3", data::Rates::opt::wat, prod_wpr_P3);
|
||||
sim.well_rate("P4", data::Rates::opt::wat, prod_wpr_P4);
|
||||
|
||||
sim.run(td.schedule, io);
|
||||
sim.run(td.schedule, io, false);
|
||||
|
||||
const auto& base_name = td.state.getIOConfig().getBaseName();
|
||||
ecl_sum_type * ecl_sum = ecl_sum_fread_alloc_case( base_name.c_str(), ":");
|
||||
|
Loading…
Reference in New Issue
Block a user