#!/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