Update restart output from EclRegressionTest
This commit is contained in:
parent
59115f818d
commit
e561e3fb43
@ -30,6 +30,7 @@
|
||||
|
||||
#include <opm/common/utility/FileSystem.hpp>
|
||||
#include <opm/common/ErrorMacros.hpp>
|
||||
#include <opm/common/utility/numeric/cmp.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
@ -65,43 +66,198 @@ int compare(const std::string& name, const T& v1, const T& v2, const std::string
|
||||
if (v1 == v2)
|
||||
return 0;
|
||||
else {
|
||||
fmt::print(stderr, fmt + std::string{"\n"}, name, v1, v2);
|
||||
fmt::print(stdout, fmt + std::string{"\n"}, name, v1, v2);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
int compare(const std::string& name, const float& v1, const float& v2, const std::string& fmt) {
|
||||
if (Opm::cmp::scalar_equal(v1, v2))
|
||||
return 0;
|
||||
else {
|
||||
fmt::print(stdout, fmt + std::string{"\n"}, name, v1, v2);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
int compare(const std::string& name, const double& v1, const double& v2, const std::string& fmt) {
|
||||
if (Opm::cmp::scalar_equal(v1, v2))
|
||||
return 0;
|
||||
else {
|
||||
fmt::print(stdout, fmt + std::string{"\n"}, name, v1, v2);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
int compare_header(const std::string& name, const T& v1, const T& v2) {
|
||||
return compare(name, v1, v2, "Different header: {} case1: {} case2: {}");
|
||||
}
|
||||
|
||||
int rst_cmp_well(const Opm::RestartIO::RstWell& well1, const Opm::RestartIO::RstWell& well2) {
|
||||
int error_count = 0;
|
||||
|
||||
error_count += compare(well1.name, well1.name, well2.name, "Different names for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.group, well2.group, "Different groups for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.ij[0], well2.ij[0], "Different wellhead.i for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.ij[1], well2.ij[1], "Different wellhead.j for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.k1k2.first, well2.k1k2.first, "Different k1 for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.k1k2.second, well2.k1k2.second, "Different k2 for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.wtype.ecl_wtype(), well2.wtype.ecl_wtype(), "Different well_type for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.wtype.producer(), well2.wtype.producer(), "Different producer for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.well_status, well2.well_status, "Different status for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.active_control, well2.active_control, "Different active_control for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.vfp_table, well2.vfp_table, "Different vfp_table for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.allow_xflow, well2.allow_xflow, "Different allow_xflow for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.hist_requested_control, well2.hist_requested_control,"Different hist_requested_control for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.msw_index, well2.msw_index, "Different msw_index for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.completion_ordering, well2.completion_ordering, "Different completion_ordering for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.pvt_table, well2.pvt_table, "Different pvt_table for well: {} case1: {} case2: {}");
|
||||
|
||||
return error_count;
|
||||
}
|
||||
|
||||
int rst_cmp_group(const Opm::RestartIO::RstGroup& group1, const Opm::RestartIO::RstGroup& group2) {
|
||||
int error_count = 0;
|
||||
|
||||
error_count += compare(group1.name, group1.name, group2.name, "Different names for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.parent_group, group2.parent_group, "Different parent_group for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.prod_cmode, group2.prod_cmode, "Different prod_cmode for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.winj_cmode, group2.winj_cmode, "Different winj_cmode for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.ginj_cmode, group2.ginj_cmode, "Different ginj_cmode for group: {} case1: {} case2: {}");
|
||||
|
||||
error_count += compare(group1.name, group1.oil_rate_limit, group2.oil_rate_limit, "Different OIL rate target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.water_rate_limit, group2.water_rate_limit, "Different WATER rate target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.gas_rate_limit, group2.gas_rate_limit, "Different GAS rate target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.liquid_rate_limit, group2.liquid_rate_limit, "Different LIQUID rate target for group: {} case1: {} case2: {}");
|
||||
|
||||
error_count += compare(group1.name, group1.water_surface_limit, group2.water_surface_limit, "Different water surface injection target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.water_reservoir_limit, group2.water_reservoir_limit, "Different water reservoir target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.water_reinject_limit, group2.water_reinject_limit, "Different water reinject target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.water_voidage_limit, group2.water_voidage_limit, "Different water voidage target for group: {} case1: {} case2: {}");
|
||||
|
||||
error_count += compare(group1.name, group1.gas_surface_limit, group2.gas_surface_limit, "Different gas surface injection target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.gas_reservoir_limit, group2.gas_reservoir_limit, "Different gas reservoir target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.gas_reinject_limit, group2.gas_reinject_limit, "Different gas reinject target for group: {} case1: {} case2: {}");
|
||||
error_count += compare(group1.name, group1.gas_voidage_limit, group2.gas_voidage_limit, "Different gas voidage target for group: {} case1: {} case2: {}");
|
||||
|
||||
return error_count;
|
||||
}
|
||||
|
||||
|
||||
int rst_cmp_header(const Opm::RestartIO::RstHeader& header1, const Opm::RestartIO::RstHeader& header2) {
|
||||
int error_count = 0;
|
||||
error_count += compare_header("num_wells", header1.num_wells, header2.num_wells);
|
||||
error_count += compare_header("group_control_active", header1.group_control_active, header2.group_control_active);
|
||||
error_count += compare_header("nx", header1.nx, header2.nx);
|
||||
error_count += compare_header("ny", header1.ny, header2.ny);
|
||||
error_count += compare_header("nz", header1.nz, header2.nz);
|
||||
error_count += compare_header("nactive", header1.nactive, header2.nactive);
|
||||
error_count += compare_header("num_wells", header1.num_wells, header2.num_wells);
|
||||
error_count += compare_header("ncwmax", header1.ncwmax, header2.ncwmax);
|
||||
error_count += compare_header("max_wells_in_group", header1.max_wells_in_group, header2.max_wells_in_group);
|
||||
error_count += compare_header("max_groups_in_field", header1.max_groups_in_field, header2.max_groups_in_field);
|
||||
error_count += compare_header("max_wells_in_field", header1.max_wells_in_field, header2.max_wells_in_field);
|
||||
error_count += compare_header("year", header1.year, header2.year);
|
||||
error_count += compare_header("month", header1.month, header2.month);
|
||||
error_count += compare_header("mday", header1.mday, header2.mday);
|
||||
error_count += compare_header("hour", header1.hour, header2.hour);
|
||||
error_count += compare_header("minute", header1.minute, header2.minute);
|
||||
error_count += compare_header("microsecond", header1.microsecond, header2.microsecond);
|
||||
error_count += compare_header("phase_sum", header1.phase_sum, header2.phase_sum);
|
||||
error_count += compare_header("niwelz", header1.niwelz, header2.niwelz);
|
||||
error_count += compare_header("nswelz", header1.nswelz, header2.nswelz);
|
||||
error_count += compare_header("nxwelz", header1.nxwelz, header2.nxwelz);
|
||||
error_count += compare_header("nzwelz", header1.nzwelz, header2.nzwelz);
|
||||
error_count += compare_header("niconz", header1.niconz, header2.niconz);
|
||||
error_count += compare_header("nsconz", header1.nsconz, header2.nsconz);
|
||||
error_count += compare_header("nxconz", header1.nxconz, header2.nxconz);
|
||||
error_count += compare_header("nigrpz", header1.nigrpz, header2.nigrpz);
|
||||
error_count += compare_header("nsgrpz", header1.nsgrpz, header2.nsgrpz);
|
||||
error_count += compare_header("nxgrpz", header1.nxgrpz, header2.nxgrpz);
|
||||
error_count += compare_header("nzgrpz", header1.nzgrpz, header2.nzgrpz);
|
||||
error_count += compare_header("ncamax", header1.ncamax, header2.ncamax);
|
||||
error_count += compare_header("niaaqz", header1.niaaqz, header2.niaaqz);
|
||||
error_count += compare_header("nsaaqz", header1.nsaaqz, header2.nsaaqz);
|
||||
error_count += compare_header("nxaaqz", header1.nxaaqz, header2.nxaaqz);
|
||||
error_count += compare_header("nicaqz", header1.nicaqz, header2.nicaqz);
|
||||
error_count += compare_header("nscaqz", header1.nscaqz, header2.nscaqz);
|
||||
error_count += compare_header("nacaqz", header1.nacaqz, header2.nacaqz);
|
||||
error_count += compare_header("tstep", header1.tstep, header2.tstep);
|
||||
error_count += compare_header("report_step", header1.report_step, header2.report_step);
|
||||
error_count += compare_header("newtmx", header1.newtmx, header2.newtmx);
|
||||
error_count += compare_header("newtmn", header1.newtmn, header2.newtmn);
|
||||
error_count += compare_header("litmax", header1.litmax, header2.litmax);
|
||||
error_count += compare_header("litmin", header1.litmin, header2.litmin);
|
||||
error_count += compare_header("mxwsit", header1.mxwsit, header2.mxwsit);
|
||||
error_count += compare_header("mxwpit", header1.mxwpit, header2.mxwpit);
|
||||
error_count += compare_header("version", header1.version, header2.version);
|
||||
error_count += compare_header("iprog", header1.iprog, header2.iprog);
|
||||
error_count += compare_header("nsegwl", header1.nsegwl, header2.nsegwl);
|
||||
error_count += compare_header("nswlmx", header1.nswlmx, header2.nswlmx);
|
||||
error_count += compare_header("nsegmx", header1.nsegmx, header2.nsegmx);
|
||||
error_count += compare_header("nlbrmx", header1.nlbrmx, header2.nlbrmx);
|
||||
error_count += compare_header("nisegz", header1.nisegz, header2.nisegz);
|
||||
error_count += compare_header("nrsegz", header1.nrsegz, header2.nrsegz);
|
||||
error_count += compare_header("nilbrz", header1.nilbrz, header2.nilbrz);
|
||||
error_count += compare_header("ntfip ", header1.ntfip , header2.ntfip );
|
||||
error_count += compare_header("nmfipr", header1.nmfipr, header2.nmfipr);
|
||||
error_count += compare_header("ngroup", header1.ngroup, header2.ngroup);
|
||||
error_count += compare_header("nwgmax", header1.nwgmax, header2.nwgmax);
|
||||
error_count += compare_header("next_timestep1", header1.next_timestep1, header2.next_timestep1);
|
||||
error_count += compare_header("next_timestep2", header1.next_timestep2, header2.next_timestep2);
|
||||
error_count += compare_header("max_timestep", header1.max_timestep, header2.max_timestep);
|
||||
error_count += compare_header("guide_rate_a", header1.guide_rate_a, header2.guide_rate_a);
|
||||
error_count += compare_header("guide_rate_b", header1.guide_rate_b, header2.guide_rate_b);
|
||||
error_count += compare_header("guide_rate_c", header1.guide_rate_c, header2.guide_rate_c);
|
||||
error_count += compare_header("guide_rate_d", header1.guide_rate_d, header2.guide_rate_d);
|
||||
error_count += compare_header("guide_rate_e", header1.guide_rate_e, header2.guide_rate_e);
|
||||
error_count += compare_header("guide_rate_f", header1.guide_rate_f, header2.guide_rate_f);
|
||||
error_count += compare_header("guide_rate_delay", header1.guide_rate_delay, header2.guide_rate_delay);
|
||||
error_count += compare_header("guide_rate_damping", header1.guide_rate_damping, header2.guide_rate_damping);
|
||||
|
||||
if (error_count)
|
||||
fmt::print(stdout, "\n");
|
||||
return error_count;
|
||||
}
|
||||
|
||||
|
||||
bool rst_cmp(const Opm::RestartIO::RstState& rst1, const Opm::RestartIO::RstState& rst2) {
|
||||
int error_count = 0;
|
||||
const auto& header1 = rst1.header;
|
||||
const auto& header2 = rst2.header;
|
||||
|
||||
error_count += rst_cmp_header(header1, header2);
|
||||
|
||||
if (header1.num_wells != header2.num_wells) {
|
||||
fmt::print(stderr,"Different number of wells - reference: {} simulation: {}\n", header1.num_wells, header2.num_wells);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (std::size_t iw=0; iw < static_cast<std::size_t>(header1.num_wells); iw++) {
|
||||
const auto& well1 = rst1.wells[iw];
|
||||
const auto& well2 = rst2.wells[iw];
|
||||
|
||||
error_count += compare(well1.name, well1.name, well2.name, "Different names for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.group, well2.group, "Different groups for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.ij[0], well2.ij[0], "Different wellhead.i for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.ij[1], well2.ij[1], "Different wellhead.j for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.k1k2.first, well2.k1k2.first, "Different k1 for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.k1k2.second, well2.k1k2.second, "Different k2 for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.wtype.ecl_wtype(), well2.wtype.ecl_wtype(), "Different well_type for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.wtype.producer(), well2.wtype.producer(), "Different producer for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.well_status, well2.well_status, "Different status for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.active_control, well2.active_control, "Different active_control for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.vfp_table, well2.vfp_table, "Different vfp_table for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.allow_xflow, well2.allow_xflow, "Different allow_xflow for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.preferred_phase, well2.preferred_phase, "Different preferred_phase for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.hist_requested_control, well2.hist_requested_control,"Different hist_requested_control for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.msw_index, well2.msw_index, "Different msw_index for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.completion_ordering, well2.completion_ordering, "Different completion_ordering for well: {} case1: {} case2: {}");
|
||||
error_count += compare(well1.name, well1.pvt_table, well2.pvt_table, "Different pvt_table for well: {} case1: {} case2: {}");
|
||||
auto count = rst_cmp_well(well1, well2);
|
||||
if (count)
|
||||
fmt::print(stdout, "\n");
|
||||
error_count += count;
|
||||
}
|
||||
|
||||
if (header1.ngroup != header2.ngroup) {
|
||||
fmt::print(stderr,"Different number of groups - reference: {} simulation: {}\n", header1.ngroup, header2.ngroup);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (std::size_t ig=0; ig < static_cast<std::size_t>(header1.ngroup); ig++) {
|
||||
const auto& group1 = rst1.groups[ig];
|
||||
const auto& group2 = rst2.groups[ig];
|
||||
auto count = rst_cmp_group(group1, group2);
|
||||
if (count)
|
||||
fmt::print(stdout, "\n");
|
||||
error_count += count;
|
||||
}
|
||||
|
||||
return error_count == 0;
|
||||
}
|
||||
}
|
||||
@ -837,7 +993,20 @@ void ECLRegressionTest::results_rst()
|
||||
checkSpesificKeyword(keywords1, keywords2, arrayType1, arrayType2, reference);
|
||||
}
|
||||
|
||||
{
|
||||
const auto& rst_state1 = Opm::RestartIO::RstState::load(rst1, seqn);
|
||||
const auto& rst_state2 = Opm::RestartIO::RstState::load(rst2, seqn);
|
||||
rst_cmp(rst_state1, rst_state2);
|
||||
}
|
||||
|
||||
|
||||
std::unordered_set<std::string> keywords = {"IGRP"};
|
||||
|
||||
|
||||
for (size_t i = 0; i < keywords1.size(); i++) {
|
||||
//if (keywords.count(keywords1[i]) == 0)
|
||||
// continue;
|
||||
|
||||
auto it1 = std::find(keywords2.begin(), keywords2.end(), keywords1[i]);
|
||||
int ind2 = std::distance(keywords2.begin(), it1);
|
||||
|
||||
@ -891,7 +1060,7 @@ void ECLRegressionTest::results_rst()
|
||||
std::cout << " done." << std::endl;
|
||||
}
|
||||
}
|
||||
if (seqn > 0) {
|
||||
{
|
||||
const auto& rst_state1 = Opm::RestartIO::RstState::load(rst1, seqn);
|
||||
const auto& rst_state2 = Opm::RestartIO::RstState::load(rst2, seqn);
|
||||
rst_cmp(rst_state1, rst_state2);
|
||||
|
Loading…
Reference in New Issue
Block a user