eccodes/tigge/reprocess_ncep.ksh

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