ECC-1672: Tools: Add '-d' option for grib_compare

This commit is contained in:
Shahram Najm 2023-08-24 13:06:09 +01:00
parent 516c7c3f62
commit e81e3ed65f
2 changed files with 73 additions and 7 deletions

View File

@ -46,6 +46,20 @@ cat temp.$label.3 temp.$label.2 temp.$label.1 > temp.$label.321
# Compare files in which the messages are not in the same order
${tools_dir}/grib_compare -r temp.$label.213 temp.$label.321
# Make a change in the data values of 2nd file
${tools_dir}/grib_set -s scaleValuesBy=1.1 temp.$label.2 temp.$label.2.changed
cat temp.$label.2 temp.$label.1 temp.$label.3 > temp.$label.213
cat temp.$label.3 temp.$label.2.changed temp.$label.1 > temp.$label.321
set +e
${tools_dir}/grib_compare -d -r temp.$label.213 temp.$label.321
status=$?
set -e
[ $status -eq 1 ]
cmp temp.$label.2.changed error2_1.grib
cmp temp.$label.2 error1_1.grib
rm -f error1_1.grib error2_1.grib
rm -f temp.$label.2.changed
rm -f temp.$label.1 temp.$label.2 temp.$label.3 temp.$label.213 temp.$label.321
# ----------------------------------------------

View File

@ -14,6 +14,7 @@ grib_option grib_options[] = {
/* {id, args, help}, on, command_line, value*/
{ "r", 0, "Compare files in which the messages are not in the same order. This option is time expensive.\n", 0, 1, 0 },
{ "b:", 0, 0, 0, 1, 0 },
{ "d", 0, "Write different messages on files.\n", 0, 1, 0 },
{ "e", 0, "Edition independent compare. It is used to compare GRIB edition 1 and 2.\n", 0, 1, 0 },
{ "2", 0, "Enable two-way comparison.\n", 0, 1, 0 },
{ "c:", 0, 0, 0, 1, 0 },
@ -64,7 +65,6 @@ static double global_tolerance = 0;
static int packingCompare = 0;
static grib_string_list* blocklist = 0;
static int compareAbsolute = 1;
static int error = 0;
static int count = 0;
static int lastPrint = 0;
@ -87,6 +87,8 @@ static int listFromCommandLine = 0;
static int editionIndependent = 0;
static int verbose = 0;
static double tolerance_factor = 1;
static int write_error = 0;
static int write_count = 0;
static grib_handle* handle1 = NULL;
static int global_counter = 0;
@ -152,6 +154,42 @@ static double compare_double_relative(const double* a, const double* b, double t
return relativeError > tolerance ? relativeError : 0;
}
static void write_message(grib_handle* h, const char* str)
{
const void* m;
size_t s;
char fname[1024] = {0,};
FILE* fh;
grib_get_message(h, &m, &s);
snprintf(fname, sizeof(fname), "%s_%d.grib", str, write_count);
fh = fopen(fname, "w");
if (!fh) {
grib_context_log(h->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR),
"Error opening %s", fname);
exit(GRIB_IO_PROBLEM);
}
if (fwrite(m, 1, s, fh) != s) {
grib_context_log(h->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR),
"Error writing to %s", fname);
exit(GRIB_IO_PROBLEM);
}
fclose(fh);
}
static void write_messages(grib_handle* handle1, grib_handle* handle2)
{
if (!write_error)
return;
write_count++;
write_message(handle1, "error1");
write_message(handle2, "error2");
}
static int blocklisted(const char* name)
{
grib_string_list* b = blocklist;
@ -212,6 +250,11 @@ int grib_tool_init(grib_runtime_options* options)
else
two_way = 0;
if (grib_options_on("d"))
write_error = 1;
else
write_error = 0;
verbose = grib_options_on("v");
listFromCommandLine = 0;
@ -460,6 +503,7 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* hand
if (compare_handles(handle2, handle1, options)) {
error++;
write_messages(handle2, handle1);
if (!force) exit(1);
}
@ -481,6 +525,7 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* hand
if (compare_handles(handle1, handle2, options)) {
error++;
write_messages(handle1, handle2);
if (!two_way) {
/* If two_way mode: Don't exit yet. Show further differences */
if (!force) exit(1);
@ -491,6 +536,7 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* hand
handles_swapped = 1;
if (compare_handles(handle2, handle1, options)) {
error++;
write_messages(handle2, handle1);
if (!force) exit(1);
}
else {
@ -1192,9 +1238,10 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option
if (blocklisted(name))
continue;
if (compare_values(options, h11, h22, name, GRIB_TYPE_UNDEFINED))
if (compare_values(options, h11, h22, name, GRIB_TYPE_UNDEFINED)) {
err++;
}
}
grib_keys_iterator_delete(iter);
grib_handle_delete(h11);
@ -1219,20 +1266,22 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option
if (blocklisted(name))
continue;
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED))
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED)) {
err++;
}
}
grib_keys_iterator_delete(iter);
if (num_keys_in_namespace == 0 && !editionIndependent) {
printf("ERROR: namespace \"%s\" does not contain any key.\n", options->compare[i].name);
}
}
else {
if (compare_values(options, h1, h2, options->compare[i].name, options->compare[i].type))
if (compare_values(options, h1, h2, options->compare[i].name, options->compare[i].type)) {
err++;
}
}
}
}
else {
const void *msg1 = NULL, *msg2 = NULL;
size_t size1 = 0, size2 = 0;
@ -1254,9 +1303,10 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option
if (blocklisted(name))
continue;
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED))
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED)) {
err++;
}
}
grib_keys_iterator_delete(iter);
@ -1276,18 +1326,20 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option
if (blocklisted(name))
continue;
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED))
if (compare_values(options, h1, h2, name, GRIB_TYPE_UNDEFINED)) {
err++;
}
}
grib_keys_iterator_delete(iter);
}
else {
if (compare_values(options, h1, h2, options->compare[i].name, options->compare[i].type))
if (compare_values(options, h1, h2, options->compare[i].name, options->compare[i].type)) {
err++;
}
}
}
}
}
return err;
}