Update restart output from EclRegressionTest

This commit is contained in:
Joakim Hove 2021-06-17 08:46:06 +02:00
parent 59115f818d
commit e561e3fb43

View File

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