eccodes/tests/grib_compare.sh

353 lines
11 KiB
Bash
Raw Normal View History

2013-03-25 12:04:10 +00:00
#!/bin/sh
2020-01-28 14:32:34 +00:00
# (C) Copyright 2005- ECMWF.
2013-03-25 12:04:10 +00:00
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
2013-03-25 12:04:10 +00:00
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#
. ./include.ctest.sh
2022-06-06 14:41:18 +00:00
2022-02-03 18:25:17 +00:00
label="grib_compare_test"
2013-03-25 12:04:10 +00:00
REDIRECT=/dev/null
2023-08-09 11:09:47 +00:00
outfile=temp.$label.grib
2016-04-11 12:36:57 +00:00
rm -f $outfile
2013-03-25 12:04:10 +00:00
2023-08-24 16:01:03 +00:00
# Use of -a/-c
set +e
infile1=$ECCODES_SAMPLES_PATH/reduced_gg_pl_32_grib2.tmpl
infile2=$ECCODES_SAMPLES_PATH/reduced_gg_pl_48_grib2.tmpl
${tools_dir}/grib_compare -a -c longitudeOfLastGridPoint $infile1 $infile2
status=$?
set -e
[ $status -eq 1 ]
# Use of -c namespace
infile1=$ECCODES_SAMPLES_PATH/reduced_gg_pl_32_grib2.tmpl
${tools_dir}/grib_set -s year=2019 $infile1 $outfile
${tools_dir}/grib_compare -c data:n $infile1 $outfile
2023-12-18 16:32:09 +00:00
set +e
${tools_dir}/grib_compare -a -c data:n $infile1 $outfile
status=$?
set -e
[ $status -eq 1 ]
2023-07-13 10:17:00 +00:00
# Header (meta-data) keys
infile=$ECCODES_SAMPLES_PATH/reduced_gg_pl_32_grib2.tmpl
${tools_dir}/grib_set -d4 $infile $outfile
set +e
2023-08-22 17:11:51 +00:00
${tools_dir}/grib_compare -v $infile $outfile
2023-07-13 10:17:00 +00:00
status=$?
set -e
[ $status -eq 1 ]
${tools_dir}/grib_compare -b referenceValue $infile $outfile
2023-07-13 10:17:00 +00:00
${tools_dir}/grib_compare -H $infile $outfile
infile="${data_dir}/regular_latlon_surface.grib1"
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s shortName=2d $infile $outfile
${tools_dir}/grib_compare -b indicatorOfParameter,paramId,shortName $infile $outfile > $REDIRECT
2013-03-25 12:04:10 +00:00
# ----------------------------------------
# Test the -r switch
2016-04-08 12:31:24 +00:00
# ----------------------------------------
2023-08-24 12:17:59 +00:00
infile=${data_dir}/tigge_cf_ecmwf.grib2
for i in 1 2 3; do
2022-02-03 18:25:17 +00:00
${tools_dir}/grib_copy -wcount=$i $infile temp.$label.$i
done
2022-02-03 18:25:17 +00:00
cat temp.$label.2 temp.$label.1 temp.$label.3 > temp.$label.213
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
2022-02-03 18:25:17 +00:00
${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
2022-02-03 18:25:17 +00:00
rm -f temp.$label.1 temp.$label.2 temp.$label.3 temp.$label.213 temp.$label.321
2016-04-08 12:31:24 +00:00
# ----------------------------------------------
# GRIB-797: test last argument being a directory
# ----------------------------------------------
temp_dir=tempdir.$label
2019-12-11 14:16:19 +00:00
rm -rf $temp_dir
mkdir $temp_dir
cp $infile $temp_dir
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_compare $infile $temp_dir
rm -rf $temp_dir
# ----------------------------------------
# ECC-1350: First arg is a directory
# ----------------------------------------
temp_dir=tempdir.$label
temp_err=temp.$label.err
rm -rf $temp_dir
mkdir $temp_dir
set +e
${tools_dir}/grib_compare $temp_dir $temp_dir 2>$temp_err
status=$?
set -e
[ $status -eq 1 ]
grep -q "ERROR:.*Is a directory" $temp_err
rm -rf $temp_dir $temp_err
# ----------------------------------------
2016-04-08 12:31:24 +00:00
# ECC-245: blacklist and 2nd order packing
# ----------------------------------------
2016-04-11 12:36:57 +00:00
temp1=grib_compare_temp1.grib
temp2=grib_compare_temp2.grib
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_copy -w count=25 ${data_dir}/lfpw.grib1 $temp1
${tools_dir}/grib_copy -w count=30 ${data_dir}/lfpw.grib1 $temp2
2016-04-08 12:31:24 +00:00
2022-06-27 10:31:46 +00:00
# Compare only message headers
${tools_dir}/grib_compare -H -b level,totalLength $temp1 $temp2
2016-04-08 12:31:24 +00:00
# This should fail but not crash! so check exit code is not 134
set +e
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_compare -b firstOrderValues $temp1 $temp2 >/dev/null
2016-04-08 12:31:24 +00:00
status=$?
set -e
[ $status -eq 1 ]
2016-04-11 12:36:57 +00:00
# GRIB-915: blacklisting totalLength key
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_copy -w count=1 ${data_dir}/v.grib2 $temp1
${tools_dir}/grib_copy -w count=2 ${data_dir}/v.grib2 $temp2
2016-04-11 12:36:57 +00:00
# This should fail as we only blacklisted one key
set +e
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_compare -b totalLength $temp1 $temp2 >/dev/null
2016-04-11 12:36:57 +00:00
status=$?
set -e
[ $status -eq 1 ]
2023-08-09 11:09:47 +00:00
# ----------------------------------------
# Test -A switch
# ----------------------------------------
infile=${data_dir}/sample.grib2
${tools_dir}/grib_set -s scaleValuesBy=1.01 $infile $temp1
# max absolute diff. = 3.11
set +e
${tools_dir}/grib_compare -b referenceValue -A 3.1 $infile $temp1
status=$?
set -e
[ $status -eq 1 ]
# Raise the tolerance
${tools_dir}/grib_compare -b referenceValue -A 3.2 $infile $temp1
2023-12-31 18:00:43 +00:00
# Invalid value
set +e
${tools_dir}/grib_compare -A badnum $infile $temp1 >$outfile 2>&1
status=$?
set -e
[ $status -eq 1 ]
grep -q "Invalid absolute error" $outfile
2024-08-20 16:16:40 +00:00
set +e
${tools_dir}/grib_compare -A badnum -R 88 $infile $temp1 >$outfile 2>&1
status=$?
set -e
[ $status -eq 1 ]
grep -q "Invalid absolute error" $outfile
2016-04-11 12:36:57 +00:00
# ----------------------------------------
# ECC-355: -R with "all" option
# ----------------------------------------
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_copy -w count=1 ${data_dir}/tigge_cf_ecmwf.grib2 $temp1
${tools_dir}/grib_copy -w count=1 ${data_dir}/tigge_pf_ecmwf.grib2 $temp2
BLACKLIST="typeOfProcessedData,typeOfEnsembleForecast,perturbationNumber"
# Specify relative tolerances for each floating point key
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_compare -b $BLACKLIST -R referenceValue=0.03,codedValues=2 $temp1 $temp2
# Now try the "all" option with the highest relative diff value
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_compare -b $BLACKLIST -R all=2 $temp1 $temp2
2023-12-31 18:00:43 +00:00
# ----------------------------------------
# Use -w switch
# ----------------------------------------
cp ${data_dir}/tigge_cf_ecmwf.grib2 $temp1
${tools_dir}/grib_compare -w typeOfLevel=surface ${data_dir}/tigge_cf_ecmwf.grib2 $temp1
2024-08-20 16:16:40 +00:00
# ----------------------------------------
# Use -T switch
# ----------------------------------------
${tools_dir}/grib_compare -T5 ${data_dir}/tigge_cf_ecmwf.grib2 ${data_dir}/tigge_cf_ecmwf.grib2
2024-01-03 13:17:53 +00:00
# ----------------------------------------
# Summary mode (-f)
# ----------------------------------------
set +e
${tools_dir}/grib_compare -f ${data_dir}/tigge_cf_ecmwf.grib2 ${data_dir}/tigge_pf_ecmwf.grib2 > $outfile 2>&1
status=$?
set -e
[ $status -eq 1 ]
grep -q "indicatorOfUnitForTimeIncrement . 7 different" $outfile
2023-12-31 18:00:43 +00:00
# ----------------------------------------
# ECC-651: Two-way (symmetric) comparison
# ----------------------------------------
sample_g1=$ECCODES_SAMPLES_PATH/GRIB1.tmpl
temp_nold=$temp1
${tools_dir}/grib_set -s deleteLocalDefinition=1 $sample_g1 $temp_nold
# Now the sample has a local definition but $temp_nold does not
set +e
${tools_dir}/grib_compare $temp_nold $sample_g1 > $outfile
status=$?
set -e
[ $status -eq 1 ]
reffile=grib_compare_temp1.ref
cat > $reffile <<EOF
-- GRIB #1 -- shortName=z paramId=129 stepRange=0 levelType=pl level=500 packingType=grid_simple gridType=regular_ll --
long [totalLength]: [84] != [107]
long [section1Length]: [28] != [52]
long [section4Length]: [12] != [11]
EOF
diff $reffile $outfile
# Two-way mode enabled
set +e
${tools_dir}/grib_compare -2 $temp_nold $sample_g1 > $outfile
status=$?
set -e
[ $status -eq 1 ]
cat > $reffile <<EOF
-- GRIB #1 -- shortName=z paramId=129 stepRange=0 levelType=pl level=500 packingType=grid_simple gridType=regular_ll --
long [totalLength]: [84] != [107]
long [section1Length]: [28] != [52]
long [section4Length]: [12] != [11]
[reservedNeedNotBePresent] not found in 1st field
[localDefinitionNumber] not found in 1st field
[marsClass] not found in 1st field
[marsType] not found in 1st field
[marsStream] not found in 1st field
[experimentVersionNumber] not found in 1st field
[perturbationNumber] not found in 1st field
[numberOfForecastsInEnsemble] not found in 1st field
[padding_local1_1] not found in 1st field
EOF
diff $reffile $outfile
rm -f $reffile
2023-08-09 11:24:15 +00:00
sample_g2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl
2023-08-09 12:24:56 +00:00
# --------------------------------------------
# Key='Missing' in one field and not the other
# --------------------------------------------
2023-08-09 11:24:15 +00:00
${tools_dir}/grib_set -s scaleFactorOfFirstFixedSurface=1 $sample_g2 $temp1
set +e
2023-12-31 18:00:43 +00:00
${tools_dir}/grib_compare -v $sample_g2 $temp1 > $outfile
2023-08-09 11:24:15 +00:00
status=$?
set -e
[ $status -eq 1 ]
grep -q "scaleFactorOfFirstFixedSurface is set to missing in 1st field but is not missing in 2nd field" $outfile
2023-08-09 12:24:56 +00:00
set +e
2023-12-31 18:00:43 +00:00
${tools_dir}/grib_compare -v $temp1 $sample_g2 > $outfile
2023-08-09 12:24:56 +00:00
status=$?
set -e
[ $status -eq 1 ]
grep -q "scaleFactorOfFirstFixedSurface is set to missing in 2nd field but is not missing in 1st field" $outfile
2023-08-09 11:24:15 +00:00
${tools_dir}/grib_compare -b scaleFactorOfFirstFixedSurface $sample_g2 $temp1 > $outfile
# ----------------------------------------
# Test -R overriding "referenceValueError"
# ----------------------------------------
echo 'set values = { 9.99999957911723157871e-26 }; write;' | ${tools_dir}/grib_filter -o $temp1 - $sample_g2
echo 'set values = { 1.00000001954148137826e-25 }; write;' | ${tools_dir}/grib_filter -o $temp2 - $sample_g2
# Plain grib_compare uses the referenceValueError as tolerance and will see the files as identical
${tools_dir}/grib_compare $temp1 $temp2
# Use relative error of 0 for all keys. Now comparison detects the difference
set +e
${tools_dir}/grib_compare -Rall=0 $temp1 $temp2 2>$outfile
status=$?
set -e
[ $status -eq 1 ]
# Now use relative error of 0 for the referenceValue only
set +e
${tools_dir}/grib_compare -R referenceValue=0 $temp1 $temp2
status=$?
set -e
[ $status -eq 1 ]
2024-08-20 16:06:26 +00:00
# ----------------------------------------
# Through index using -S and -E
# ----------------------------------------
tempIndex1=temp.$label.1.idx
tempIndex2=temp.$label.2.idx
${tools_dir}/grib_index_build -o $tempIndex1 -N -k time,date $data_dir/tigge_ecmwf.grib2
${tools_dir}/grib_index_build -o $tempIndex2 -N -k time,date $data_dir/tigge_cf_ecmwf.grib2
set +e
${tools_dir}/grib_compare -S 4 -E 5 $tempIndex1 $tempIndex2
status=$?
set -e
[ $status -ne 0 ]
# Key unpackedValues
#-------------------
${tools_dir}/grib_set -s scaleValuesBy=1.01 $ECCODES_SAMPLES_PATH/sh_ml_grib2.tmpl $temp1
${tools_dir}/grib_compare -c unpackedValues -A 1.86 $ECCODES_SAMPLES_PATH/sh_ml_grib2.tmpl $temp1
# -----------------
2023-08-22 17:11:51 +00:00
# Failing cases
# -----------------
set +e
${tools_dir}/grib_compare -Rxxxx $temp1 $temp2 > $outfile 2>&1
status=$?
set -e
[ $status -eq 1 ]
grep "Invalid argument" $outfile
set +e
${tools_dir}/grib_compare -H -c data:n $temp1 $temp2 > $outfile 2>&1
2023-08-22 17:11:51 +00:00
status=$?
set -e
[ $status -eq 1 ]
grep -q "options are incompatible" $outfile
2023-08-22 17:11:51 +00:00
set +e
${tools_dir}/grib_compare -a $temp1 $temp2 > $outfile 2>&1
2023-08-22 17:11:51 +00:00
status=$?
set -e
[ $status -eq 1 ]
grep -q "a option requires -c option" $outfile
2023-08-22 17:11:51 +00:00
2023-12-31 18:00:43 +00:00
echo GRIB > $temp1
echo GRIB > $temp2
set +e
${tools_dir}/grib_compare $temp1 $temp2 > $outfile 2>&1
status=$?
set -e
[ $status -ne 0 ]
grep "unreadable message" $outfile
# Clean up
# ---------
2016-04-08 12:31:24 +00:00
rm -f $temp1 $temp2
rm -f $outfile