eccodes/tests/grib_step.sh

290 lines
10 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.
#
# 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
2013-03-25 12:04:10 +00:00
REDIRECT=/dev/null
2021-11-25 16:41:46 +00:00
label=grib_step_test
tempGrb=${data_dir}/temp.$label.out.grib
2024-03-04 18:35:10 +00:00
tempLog=${data_dir}/temp.$label.log
tempFilt=${data_dir}/temp.$label.filt
rm -f $tempLog $tempGrb
2021-11-25 16:41:46 +00:00
2023-10-13 11:28:32 +00:00
grib1_sample=$ECCODES_SAMPLES_PATH/GRIB1.tmpl
grib2_sample=$ECCODES_SAMPLES_PATH/GRIB2.tmpl
2013-03-25 12:04:10 +00:00
for i in 0 10
do
for s in 0 1200 600 6000
do
for key in stepRange:s startStep endStep
do
2021-11-25 16:41:46 +00:00
rm -f $tempGrb
${tools_dir}/grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
#echo grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
#grib_get -p step,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \
2024-03-04 18:35:10 +00:00
${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> $tempLog
2013-03-25 12:04:10 +00:00
done
done
done
i=5
key=stepRange:s
for s in "0-24" "600-1200" "24-48" "36-66"
do
2021-11-25 16:41:46 +00:00
${tools_dir}/grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
#echo grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
#grib_ls -p step,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb
${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \
2024-03-04 18:35:10 +00:00
${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> $tempLog
2013-03-25 12:04:10 +00:00
done
2021-11-25 16:41:46 +00:00
rm -f $tempGrb
2013-03-25 12:04:10 +00:00
# test added for ifs stepType=max,min
2021-11-25 16:41:46 +00:00
${tools_dir}/grib_set -s stepType=max,startStep=3,endStep=6 ${data_dir}/reduced_gaussian_model_level.grib1 $tempGrb
${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \
2024-03-04 18:35:10 +00:00
${data_dir}/reduced_gaussian_model_level.grib1 $tempGrb >> $tempLog
2013-03-25 12:04:10 +00:00
2021-11-25 16:41:46 +00:00
rm -f $tempGrb
2013-03-25 12:04:10 +00:00
2024-03-04 18:35:10 +00:00
diff ${data_dir}/step.log $tempLog
2013-03-25 12:04:10 +00:00
2024-03-04 18:35:10 +00:00
(${tools_dir}/grib_filter ${data_dir}/step_grib1.filter ${data_dir}/timeRangeIndicator_0.grib > $tempLog) 2>$REDIRECT
2013-03-25 12:04:10 +00:00
2024-03-04 18:35:10 +00:00
diff ${data_dir}/step_grib1.log $tempLog
2013-03-25 12:04:10 +00:00
2024-03-04 18:35:10 +00:00
rm -f $tempLog
2013-03-25 12:04:10 +00:00
# GRIB-180
# ------------
2013-03-25 12:04:10 +00:00
# Set PDT 4.8 where you can find the EndOfOverallTimeInterval keys
2014-08-28 09:03:16 +00:00
grib2File=${data_dir}/reduced_latlon_surface_constant.grib2
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -sproductDefinitionTemplateNumber=8 $grib2File ${grib2File}.p8tmp
2013-03-25 12:04:10 +00:00
# 78 hours is 3 days and 6 hours
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s step=78 $grib2File.p8tmp ${grib2File}.tmp
set `${tools_dir}/grib_get -p hourOfEndOfOverallTimeInterval,dayOfEndOfOverallTimeInterval ${grib2File}.tmp`
2013-03-25 12:04:10 +00:00
hourEnd=$1; dayEnd=$2
[ "$hourEnd" = "18" ]
2014-08-28 09:03:16 +00:00
[ "$dayEnd" = "8" ]
2013-03-25 12:04:10 +00:00
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s step=12 $grib2File.p8tmp ${grib2File}.tmp
set `${tools_dir}/grib_get -p hourOfEndOfOverallTimeInterval,dayOfEndOfOverallTimeInterval ${grib2File}.tmp`
2013-03-25 12:04:10 +00:00
hourEnd=$1; dayEnd=$2
[ "$hourEnd" = "0" ]
2014-08-28 09:03:16 +00:00
[ "$dayEnd" = "6" ]
2013-03-25 12:04:10 +00:00
# ECC-134 case-sensitivity
2023-10-15 14:28:46 +00:00
# ------------------------
temp=temp.step.$$.grib
# M is for Month (code 3)
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s indicatorOfUnitOfTimeRange=M $grib1_sample $temp
unit=`${tools_dir}/grib_get -p unitOfTimeRange $temp`
[ "$unit" = "3" ]
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s indicatorOfUnitOfTimeRange=M $grib2_sample $temp
unit=`${tools_dir}/grib_get -p indicatorOfUnitOfTimeRange $temp`
[ "$unit" = "3" ]
# m is for Minute (code 0)
2023-10-15 14:28:46 +00:00
# ------------------------
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s indicatorOfUnitOfTimeRange=m $grib1_sample $temp
unit=`${tools_dir}/grib_get -p unitOfTimeRange $temp`
[ "$unit" = "0" ]
2017-02-03 14:21:24 +00:00
${tools_dir}/grib_set -s indicatorOfUnitOfTimeRange=m $grib2_sample $temp
2023-10-30 15:02:13 +00:00
unit=`${tools_dir}/grib_get -p indicatorOfUnitForForecastTime $temp`
[ "$unit" = "0" ]
# ECC-457
# ---------
input=${data_dir}/tp_ecmwf.grib
stepRange=`${tools_dir}/grib_get -w count=1 -p stepRange,startStep,endStep,stepType $input`
[ "$stepRange" = "12 12 12 instant" ]
# ECC-1430: stepType: 'severity' and 'mode'
# -----------------------------------------
${tools_dir}/grib_set -s stepType=severity,paramId=260318 $grib2_sample $temp
grib_check_key_equals $temp productDefinitionTemplateNumber,typeOfStatisticalProcessing '8 100'
${tools_dir}/grib_set -s stepType=mode,paramId=260320 $grib2_sample $temp
grib_check_key_equals $temp productDefinitionTemplateNumber,typeOfStatisticalProcessing '8 101'
# ECC-1991: stepType for index processing
# -----------------------------------------
${tools_dir}/grib_set -s stepType=index $grib2_sample $temp
grib_check_key_equals $temp productDefinitionTemplateNumber,typeOfStatisticalProcessing '8 102'
2023-05-03 15:51:37 +00:00
# ECC-1577: stepType when typeOfTimeIncrement=255
# -----------------------------------------------
${tools_dir}/grib_set -s stepType=accum,typeOfTimeIncrement=255 $grib2_sample $temp
grib_check_key_equals $temp stepType accum
${tools_dir}/grib_set -s stepType=accum $grib2_sample $temp
grib_check_key_equals $temp typeOfTimeIncrement 2
${tools_dir}/grib_set -s stepType=avg,typeOfTimeIncrement=255 $grib2_sample $temp
grib_check_key_equals $temp stepType avg
${tools_dir}/grib_set -s stepType=avg $grib2_sample $temp
2024-08-29 07:54:50 +00:00
grib_check_key_equals $temp typeOfTimeIncrement 2 # default is 2
2023-05-03 15:51:37 +00:00
2023-06-26 16:12:29 +00:00
# Decode/Encode stepRange as an int and double
2023-06-26 15:55:08 +00:00
${tools_dir}/grib_set -s stepType=accum,stepRange=23-28 $grib2_sample $temp
grib_check_key_equals $temp "stepRange:s" "23-28"
grib_check_key_equals $temp "stepRange:i" "28"
grib_check_key_equals $temp "stepRange:d" "28"
2023-05-03 15:51:37 +00:00
2023-06-26 16:12:29 +00:00
${tools_dir}/grib_set -s stepRange:i=24 $grib2_sample $temp
grib_check_key_equals $temp "stepRange,startStep,endStep" "24 24 24"
# Should this be an error? currently this gets cast from double to int
${tools_dir}/grib_set -s stepRange:d=14.56 $grib2_sample $temp
grib_check_key_equals $temp "stepRange,startStep,endStep" "14 14 14"
# Key validityDateTime
2023-10-15 14:28:46 +00:00
# --------------------
input=${data_dir}/constant_field.grib2
grib_check_key_equals $input "dataDate,dataTime,step" "20061205 1200 6"
grib_check_key_equals $input "validityDate,validityTime" "20061205 1800"
grib_check_key_equals $input "validityDateTime:s" "20061205 180000"
2023-10-13 11:28:32 +00:00
# ECC-1704: Key validityTime as string
2023-10-15 14:28:46 +00:00
# -------------------------------------
2023-10-13 11:28:32 +00:00
result=$( ${tools_dir}/grib_get -p validityTime:s -s dataTime=0000 $grib2_sample )
[ "$result" = "0000" ]
input=$data_dir/simple.grib
grib_check_key_equals $input "validityTime:s" "0600"
2023-08-11 13:18:52 +00:00
# Key julianDay
2023-10-15 14:28:46 +00:00
# -------------
2023-08-11 13:18:52 +00:00
input=${data_dir}/sample.grib2
grib_check_key_equals $input 'julianDay:i' '2454503'
${tools_dir}/grib_set -s julianDay=2454504 $input $temp
grib_check_key_equals $input day 6
grib_check_key_equals $temp day 7
2023-08-23 13:17:27 +00:00
# Seconds (ignored)
2023-10-15 14:28:46 +00:00
# -----------------
2024-03-04 18:35:10 +00:00
${tools_dir}/grib_ls -s second=9 -n time $grib2_sample 2>$tempLog
2023-08-23 13:17:27 +00:00
# Something should have been written to stderr
2024-03-04 18:35:10 +00:00
[ -s $tempLog ]
grep -q "Truncating time: non-zero seconds.* ignored" $tempLog
2023-06-26 16:12:29 +00:00
2023-10-15 14:28:46 +00:00
# Hour or minute set to 255
# ---------------------------
input=${data_dir}/simple.grib
result=$( ${tools_dir}/grib_get -p dataTime -s hour=255 $input )
[ "$result" = "1200" ]
result=$( ${tools_dir}/grib_get -p dataTime -s hour=2,minute=255 $input )
[ "$result" = "200" ]
2023-10-17 12:57:37 +00:00
# Various step units
# --------------------
input=${data_dir}/tigge_cf_ecmwf.grib2
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=h $input)
2023-10-17 12:57:37 +00:00
[ $result = 96 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=30m $input)
2023-10-17 12:57:37 +00:00
[ $result = 192 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=15m $input)
2023-10-17 12:57:37 +00:00
[ $result = 384 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=s $input)
2023-10-17 12:57:37 +00:00
[ $result = 345600 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=12h $input)
2023-10-17 12:57:37 +00:00
[ $result = 8 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=6h $input)
2023-10-17 12:57:37 +00:00
[ $result = 16 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=D $input)
2023-10-17 12:57:37 +00:00
[ $result = 4 ]
2023-11-03 12:26:00 +00:00
result=$(${tools_dir}/grib_get -w count=1 -p step:i -s stepUnits=m $input)
2023-10-17 12:57:37 +00:00
[ $result = 5760 ]
2023-10-19 16:50:50 +00:00
# GRIB1 stepRange and timeRangeIndicator=10
# -----------------------------------------
input=${data_dir}/reduced_latlon_surface.grib1
grib_check_key_equals $input timeRangeIndicator,P1,P2 '10 0 0'
ECCODES_GRIBEX_MODE_ON=1 ${tools_dir}/grib_set -s stepRange=11-12 $input $temp
grib_check_key_equals $temp P1,P2 '0 11'
set +e
2024-03-04 18:35:10 +00:00
${tools_dir}/grib_set -s stepRange=11-12 $input $temp 2>$tempLog
2023-10-19 16:50:50 +00:00
status=$?
set -e
[ $status -ne 0 ]
2024-03-04 18:35:10 +00:00
grep -q "Unable to set stepRange" $tempLog
2023-10-19 16:50:50 +00:00
2023-12-10 14:04:22 +00:00
# GRIB1: sub-hourly
# -----------------
${tools_dir}/grib_set -s unitOfTimeRange=0,P1=5 $grib1_sample $temp
set +e
2024-03-04 18:35:10 +00:00
${tools_dir}/grib_get -p step $temp 2>$tempLog
2023-12-10 14:04:22 +00:00
status=$?
set -e
[ $status -ne 0 ]
2024-03-04 18:35:10 +00:00
grep -q "unable to represent the step in h" $tempLog
2023-12-10 14:04:22 +00:00
# GRIB1: Unknown timeRangeIndicator
${tools_dir}/grib_set -s timeRangeIndicator=138 $grib1_sample $temp
set +e
2024-03-04 18:35:10 +00:00
${tools_dir}/grib_get -p step $temp 2>$tempLog
2023-12-10 14:04:22 +00:00
status=$?
set -e
[ $status -ne 0 ]
2024-03-04 18:35:10 +00:00
grep -q "Unknown stepType" $tempLog
2023-12-10 14:04:22 +00:00
2024-03-04 18:35:10 +00:00
# Several time ranges
# --------------------
cat >$tempFilt <<EOF
set productDefinitionTemplateNumber = 8;
set numberOfTimeRange = 3;
meta elem_penultimate element(typeOfStatisticalProcessing, numberOfTimeRange - 2);
set elem_penultimate = 8;
meta elem_last element(typeOfStatisticalProcessing, numberOfTimeRange - 1);
set elem_last = 7;
print "[typeOfStatisticalProcessing]";
EOF
${tools_dir}/grib_filter $tempFilt $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempLog
grep -q "255 8 7" $tempLog
2023-12-10 14:04:22 +00:00
# ECC-1866: Setting step on interval-based message with dataDate=0000
# -------------------------------------------------------------------
tempGrbA=${data_dir}/temp.$label.A.grib
tempGrbB=${data_dir}/temp.$label.B.grib
${tools_dir}/grib_set -s stepType=accum $ECCODES_SAMPLES_PATH/GRIB2.tmpl $tempGrbA
set +e
${tools_dir}/grib_set -s year=0,month=0,day=0,step=0 $tempGrbA $tempGrbB 2>$tempLog
status=$?
set -e
[ $status -ne 0 ]
grep -q "Date/Time is not valid" $tempLog
set +e
${tools_dir}/grib_set -s year=0,month=0,day=0,stepUnits=1 $tempGrbA $tempGrbB 2>$tempLog
status=$?
set -e
[ $status -ne 0 ]
grep -q "Date/Time is not valid" $tempLog
rm -f $tempGrbA $tempGrbB
# Clean up
2024-03-04 18:35:10 +00:00
rm -f $temp $tempLog $tempFilt
2015-12-01 16:04:09 +00:00
rm -f $grib2File.p8tmp ${grib2File}.tmp x.grib