mirror of https://github.com/ecmwf/eccodes.git
212 lines
4.8 KiB
Bash
Executable File
212 lines
4.8 KiB
Bash
Executable File
#!/bin/ksh
|
|
|
|
set -e # Stop on error
|
|
set -u # Catche undefined variable
|
|
set +x # Trace
|
|
|
|
# During development
|
|
|
|
PATH=$PATH:/path/to/install/p4/grib_api/main/tigge:/path/to/install/p4/grib_api/main/tools
|
|
RULES=/path/to/install/p4/grib_api/main/tigge/ncep.rules
|
|
|
|
# Cycle should be an argument
|
|
|
|
cycle=2007051300
|
|
|
|
# This should match the value of productionStatusOfProcessedData in $RULES (prod=4, test=5)
|
|
prod=prod
|
|
|
|
# Where the tar files are
|
|
datadir=`pwd`/data
|
|
|
|
# Point to some work directory
|
|
workdir=`pwd`/work
|
|
|
|
# Where the z_c_tigge... goes
|
|
output=`pwd`/output
|
|
|
|
|
|
cd $workdir
|
|
|
|
# Extract cf and pf data from tar files
|
|
echo $(date +'%F %X') Extract from tar files
|
|
|
|
if [[ ! -f done.$cycle.step0 ]]
|
|
then
|
|
rm -f done.$cycle.step[1-9]
|
|
rm -fr tmp.data.$cycle
|
|
mkdir tmp.data.$cycle
|
|
for n in a c
|
|
do
|
|
cd tmp.data.$cycle
|
|
tar xf $datadir/$cycle.pgrb2$n.tar
|
|
cd $workdir
|
|
done
|
|
|
|
echo $(date +'%F %X') Find CF and PF data
|
|
|
|
find tmp.data.$cycle -type f | egrep '/ge[pc][0-9]+\.t[0-9]+z\.pgrb2[a-z]+[0-9]+$' | xargs cat > tmp.all.$cycle
|
|
rm -fr tmp.data.$cycle
|
|
touch done.$cycle.step0
|
|
fi
|
|
|
|
# Split in TP, TCC and "other"
|
|
# TCC will be discarded
|
|
# TP split into individual files
|
|
|
|
echo $(date +'%F %X') Sort fields
|
|
|
|
if [[ ! -f done.$cycle.step1 ]]
|
|
then
|
|
rm -f done.$cycle.step[2-9]
|
|
|
|
rm -f tmp.data.$cycle.*
|
|
|
|
cat > tmp.$cycle.filter <<@
|
|
|
|
if(discipline==0 && parameterCategory == 6 && parameterNumber == 1 && typeOfFirstFixedSurface == 200)
|
|
{
|
|
# Ignore TCC for now
|
|
write "tmp.data.$cycle.discarded_tcc";
|
|
}
|
|
else {
|
|
if(discipline==0 && parameterCategory == 1 && parameterNumber == 8 && typeOfFirstFixedSurface == 1)
|
|
{
|
|
if(marsEndStep - marsStartStep == 6)
|
|
{
|
|
write "tmp.data.$cycle.tp.[step].[number]";
|
|
}
|
|
else
|
|
{
|
|
write "tmp.data.$cycle.discarded_tp";
|
|
}
|
|
}
|
|
else {
|
|
write "tmp.data.$cycle.other";
|
|
}
|
|
}
|
|
|
|
@
|
|
|
|
grib_filter tmp.$cycle.filter tmp.all.$cycle
|
|
|
|
touch done.$cycle.step1
|
|
|
|
rm -f tmp.$cycle.filter tmp.all.$cycle
|
|
rm -f tmp.data.$cycle.discarded_tcc tmp.data.$cycle.discarded_tp
|
|
fi
|
|
|
|
# Create accumulations from TP
|
|
|
|
echo $(date +'%F %X') Compute accumulations
|
|
|
|
if [[ ! -f done.$cycle.step2 ]]
|
|
then
|
|
rm -f done.$cycle.step[3-9]
|
|
|
|
# Get the greatest ensemble number and the greatest step
|
|
|
|
set $(ls -1 tmp.data.$cycle.tp.* | awk -F. '
|
|
BEGIN { s= 0; e = 0; }
|
|
{
|
|
if($5>s) { s=$5;}
|
|
if($6>e) { e=$6;}
|
|
}
|
|
END { printf("%d %d\n",s,e); }
|
|
')
|
|
|
|
last_s=$1
|
|
last_e=$2
|
|
|
|
# Compute accumulations
|
|
|
|
e=0
|
|
while [[ $e -le $last_e ]]
|
|
do
|
|
rm -f tmp.data.$cycle.precip.$e
|
|
s=6
|
|
while [[ $s -le $last_s ]]
|
|
do
|
|
touch tmp.data.$cycle.tp.$s.$e
|
|
cat tmp.data.$cycle.tp.$s.$e >> tmp.data.$cycle.precip.$e
|
|
s=$((s+6))
|
|
done
|
|
set +e
|
|
tigge_accumulations tmp.data.$cycle.precip.$e tmp.data.$cycle.precip.$e.accumulated
|
|
set -e
|
|
rm tmp.data.$cycle.precip.$e
|
|
e=$((e+1))
|
|
done
|
|
|
|
cat tmp.data.$cycle.precip.*.accumulated > tmp.data.$cycle.precip_accumulated
|
|
|
|
# Cleanup
|
|
|
|
rm -f tmp.data.$cycle.precip.*.accumulated
|
|
rm -f tmp.data.$cycle.tp.*
|
|
|
|
touch done.$cycle.step2
|
|
fi
|
|
|
|
# Run grib_conver to convert to TIGGE complient fields
|
|
echo $(date +'%F %X') Patch headers
|
|
|
|
if [[ ! -f done.$cycle.step3 ]]
|
|
then
|
|
rm -f done.$cycle.step[4-9]
|
|
|
|
for n in tmp.data.$cycle.precip_accumulated tmp.data.$cycle.other
|
|
do
|
|
grib_convert $RULES $n $n.tigge
|
|
done
|
|
|
|
rm -f tmp.data.$cycle.precip_accumulated tmp.data.$cycle.other
|
|
touch done.$cycle.step3
|
|
fi
|
|
|
|
# Run tigge_check to weed out the unwanted fields
|
|
|
|
echo $(date +'%F %X') Remove unwanted fields
|
|
|
|
if [[ ! -f done.$cycle.step4 ]]
|
|
then
|
|
rm -f done.$cycle.step[5-9]
|
|
|
|
# -z means return 'zero' to the shell even if some fields are not TIGGE complient
|
|
tigge_check -z -g tmp.data.$cycle.good tmp.data.$cycle.precip_accumulated.tigge tmp.data.$cycle.other.tigge > /dev/null
|
|
|
|
rm -f tmp.data.$cycle.precip_accumulated.tigge tmp.data.$cycle.other.tigge
|
|
|
|
touch done.$cycle.step4
|
|
fi
|
|
|
|
# Split into individual fields and create manifest
|
|
|
|
echo $(date +'%F %X') Create TIGGE files
|
|
|
|
if [[ ! -f done.$cycle.step5 ]]
|
|
then
|
|
rm -f done.$cycle.step[6-9]
|
|
|
|
rm -fr $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod
|
|
mkdir $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod
|
|
cd $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod
|
|
|
|
# -p means 'print' names. Switch off if the manifest is done by another script
|
|
# -u means 'unique', checks that there are not two fields with the same name. Switch off once script is debugged
|
|
|
|
#tigge_split -p -u $workdir/tmp.data.$cycle.good > $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod.manifest
|
|
tigge_split -p $workdir/tmp.data.$cycle.good > $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod.manifest
|
|
|
|
cd $workdir
|
|
rm -f tmp.data.$cycle.good
|
|
rm -f tmp.data.$cycle.*
|
|
touch done.$cycle.step5
|
|
fi
|
|
|
|
# Remove check points
|
|
rm -f done.$cycle.step*
|
|
|
|
n=$(wc -l $output/z_tigge_c_kwbc_${cycle}0000_glob_$prod.manifest | awk '{print $1;}')
|
|
echo $(date +'%F %X') Recovered $n fields
|