From 32b65a142feb28f8e1c8c8c0c512cfa533aff167 Mon Sep 17 00:00:00 2001 From: Eugen Betke Date: Wed, 30 Aug 2023 08:52:27 +0000 Subject: [PATCH] ECC-1620: nai --- src/grib_accessor_class_step_in_units.cc | 42 ++++++++++++---- tests/grib_ecc-1620.sh | 61 +++++++++++++----------- 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/src/grib_accessor_class_step_in_units.cc b/src/grib_accessor_class_step_in_units.cc index 89c23b130..598015bd1 100644 --- a/src/grib_accessor_class_step_in_units.cc +++ b/src/grib_accessor_class_step_in_units.cc @@ -233,6 +233,8 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) if ((err = grib_get_long_internal(h, self->stepUnits, &stepUnits))) return err; + + unpack_long(a, &oldStep, len); if (stepUnits != codedUnits) { @@ -264,9 +266,18 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) else lengthOfTimeRange -= codedStep * u2s2[codedUnits] / u2s2[indicatorOfUnitForTimeRange]; lengthOfTimeRange = lengthOfTimeRange > 0 ? lengthOfTimeRange : 0; + + //lengthOfTimeRange = lengthOfTimeRange * u2s2[indicatorOfUnitForTimeRange] / u2s2[stepUnits]; + codedUnits = stepUnits; err = grib_set_long_internal(grib_handle_of_accessor(a), self->lengthOfTimeRange, lengthOfTimeRange); if (err != GRIB_SUCCESS) return err; + //err = grib_set_long_internal(grib_handle_of_accessor(a), self->indicatorOfUnitForTimeRange, codedUnits); + //if (err != GRIB_SUCCESS) + // return err; + //err = grib_set_long_internal(grib_handle_of_accessor(a), self->codedUnits, codedUnits); + //if (err != GRIB_SUCCESS) + // return err; } return grib_set_long_internal(grib_handle_of_accessor(a), self->codedStep, codedStep); @@ -285,16 +296,31 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) if ((ret = grib_get_long_internal(h, "stepUnits", &step_units)) != GRIB_SUCCESS) return ret; - long end_step_value; - if ((ret = grib_get_long_internal(h, "endStep", &end_step_value)) != GRIB_SUCCESS) - return ret; - Step end_step{end_step_value, UnitType{step_units}}; - auto [step_a, step_b] = find_common_units(step, end_step); - if ((ret = grib_set_long_internal(h, "stepUnits", step_a.unit().to_long())) != GRIB_SUCCESS) - return ret; - long value = step.value(step_a.unit()); + long value; + if (self->indicatorOfUnitForTimeRange != NULL) { + + long end_step_value; + if ((ret = grib_get_long_internal(h, "endStep", &end_step_value)) != GRIB_SUCCESS) + return ret; + Step end_step{end_step_value, UnitType{step_units}}; + + auto [step_a, step_b] = find_common_units(step, end_step); + if ((ret = grib_set_long_internal(h, "stepUnits", step_b.unit().to_long())) != GRIB_SUCCESS) + return ret; + + if ((ret = grib_set_long_internal(h, "endStep", step_b.value())) != GRIB_SUCCESS) + return ret; + + //if ((ret = set_step(h, self->lengthOfTimeRange, self->indicatorOfUnitForTimeRange, step_b)) != GRIB_SUCCESS) + //return ret; + + value = step.value(step_a.unit()); + } + else { + value = step.value(UnitType{step_units}); + } if ((ret = pack_long(a, &value, &value_len)) != GRIB_SUCCESS) return ret; diff --git a/tests/grib_ecc-1620.sh b/tests/grib_ecc-1620.sh index 8700b086b..3dc3583b7 100755 --- a/tests/grib_ecc-1620.sh +++ b/tests/grib_ecc-1620.sh @@ -92,44 +92,44 @@ grib_check_key_equals $temp2 "-y -p $low_level_keys" "2 h 1 D" -#${tools_dir}/grib_set -y -s stepRange:s=5h-30h $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "5 h 25 h" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "5-30" +${tools_dir}/grib_set -y -s stepRange:s=5h-30h $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "5 h 25 h" +grib_check_key_equals $temp2 "-y -p stepRange:s" "5-30" -#${tools_dir}/grib_set -y -s stepRange:s=5-30 $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "5 h 25 h" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "5-30" +${tools_dir}/grib_set -y -s stepRange:s=5-30 $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "5 h 25 h" +grib_check_key_equals $temp2 "-y -p stepRange:s" "5-30" -#${tools_dir}/grib_set -y -s stepRange:s=60m-120m $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 h 1 h" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "1-2" +${tools_dir}/grib_set -y -s stepRange:s=60m-120m $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 h 1 h" +grib_check_key_equals $temp2 "-y -p stepRange:s" "1-2" -#${tools_dir}/grib_set -y -s stepRange:s=60s-120s $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 m 1 m" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "1m-2m" +${tools_dir}/grib_set -y -s stepRange:s=60s-120s $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 m 1 m" +grib_check_key_equals $temp2 "-y -p stepRange:s" "1m-2m" -#${tools_dir}/grib_set -y -s stepRange:s=60m-121m $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 h 61 m" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "60m-121m" +${tools_dir}/grib_set -y -s stepRange:s=60m-121m $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "1 h 61 m" +grib_check_key_equals $temp2 "-y -p stepRange:s" "60m-121m" -#${tools_dir}/grib_set -y -s stepRange:s=62D-122D $temp $temp2 -#grib_check_key_equals $temp2 "-y -p $low_level_keys" "1488 h 60 D" -#grib_check_key_equals $temp2 "-y -p stepRange:s" "1488-2928" +${tools_dir}/grib_set -y -s stepRange:s=62D-122D $temp $temp2 +grib_check_key_equals $temp2 "-y -p $low_level_keys" "1488 h 60 D" +grib_check_key_equals $temp2 "-y -p stepRange:s" "1488-2928" -##${tools_dir}/grib_set -s $fn $temp +#${tools_dir}/grib_set -s $fn $temp -##fn="${data_dir}/reduced_gaussian_surface.grib2" -##low_level_keys="forecastTime,indicatorOfUnitOfTimeRange:s" -##keys__="step" -##keys_s="step:s" -##keys_i="step:i" -##keys_d="step:d" +#fn="${data_dir}/reduced_gaussian_surface.grib2" +#low_level_keys="forecastTime,indicatorOfUnitOfTimeRange:s" +#keys__="step" +#keys_s="step:s" +#keys_i="step:i" +#keys_d="step:d" -##${tools_dir}/grib_set -s forecastTime=59,indicatorOfUnitOfTimeRange=m $fn $temp -##${tools_dir}/grib_set -s step:d=10 $fn $temp -##grib_check_key_equals $temp "-y -p $keys_s -s stepUnits=s" "10m" -##exit +#${tools_dir}/grib_set -s forecastTime=59,indicatorOfUnitOfTimeRange=m $fn $temp +#${tools_dir}/grib_set -s step:d=10 $fn $temp +#grib_check_key_equals $temp "-y -p $keys_s -s stepUnits=s" "10m" +#exit @@ -362,5 +362,8 @@ grib_check_key_equals $temp "-y -p $keys_d" "24 18 24" rm -f $temp +#~/build/eccodes/bin/grib_ls -m /perm/maro/referenceGRIBfiles4MTG2testing/grib1+2_operational_and_rd/151145_s2_enfo_cf_o2d_zos_2002_prod_ecmf_glob.grib2 +#~/build/eccodes/bin/grib_ls -m /perm/maro/referenceGRIBfiles4MTG2testing/grib1+2_operational_and_rd/240023_ce_efas_fc_sfc_dis06_2022_0001_ecmf_lisflood.grib2 +