#!/bin/sh
#####################################################################
# SCRIPT: cdc_postgb.sh                                             #
#                                                                   #
# LANGUAGE: Bourne Shell                                            #
#                                                                   #
# MACHINE: ccs                                                      #
#                                                                   #
#-------------------------------------------------------------------#
# INITIATION METHOD: NA                                             #
#                                                                   #
# INTITIATION SCRIPT: N/A                                           #
#                                                                   #
# CALLING SCRIPT: N/A                                               #
#-------------------------------------------------------------------#
# PURPOSE: postprocess cdc ensemble sigma files to enspost grib     #
#          files.                                                   #
#-------------------------------------------------------------------#
# USAGE: sh cdc_postgb.sh                                           #
#-------------------------------------------------------------------#
# INPUT FILES:                                                      #
#    ens${PP}.t${TT}z.sf${HHH} - Ensemble sigma files.              #
#        WHERE: PP = ensemble perturbation [p1,p2,n1,n2,...,etc]    #
#               TT = forecast cycle [00|12]                         #
#               HHH = forecast hour [24,36,48,...,etc]              #
# OUTPUT FILES:                                                     #
#    enspost.${cycle}.${file} - GRIB enspost file                   #
#    enspost.${cycle}.${file}i - GRIB enspost index file            #
#        WHERE: cycle = forecast cycle                              #
#               file = forecast parameter                           #
#-------------------------------------------------------------------#
# SUBROUTINES USED:                                                 #
# EXECUTABLES USED:                                                 #
#    cdas_sig2sig -  Converts sigma surface fields to either single #
#                    or double precision floating point formats.    #
#                    Single is used when archiving and double is    #
#                    used when running the model.                   #
#    cdc_pgb -  Transforms sigma files to pressure GRIB files       #
#               consisting of data on a regular lat/lon GRID.       #
#    wgrib -  Inventories and decodes GRIB files.                   #
#    grbindex -  Creates an index file from a GRIB file.            #
#    copygb -  Copies all or part of one GRIB file to another GRIB  #
#              file, interpolating if necessary.                    #
#    global_ensadd -  Extends the GRIB Product Definition Section   #
#                     (PDS) of all ensemble fields to fully describe#
#                     their content.                                #
#-------------------------------------------------------------------#
# COMMAND-LINE VARIABLES:                                           #
#    ${1} - Date of forecast in YYYYMMDD format                     #
# GLOBAL VARIABLES:                                                 #
#    COMIN - Location of model ensemble sigma files                 #
#    COMOUT - CDC Output Directory                                  #
#    DATA - Data directory name                                     #
#    EXECCDC - Location of CDC executable directory                 #
#    EXECGLOBAL - Location of NCEP executable directory             #
#    EXECUTIL - Location of NCEP utility executable directory       #
#    IGEN - GRIB Process Number                                     #
#    PDY - Date of forecast in YYYYMMDD format                      #
#    RUN - ???                                                      #
#    cyc - ???                                                      #
#    cycle - Forecast cycle                                         #
#    envir - Process environment                                    #
# LOCAL VARIABLES:                                                  #
#    COPYGB - Location of NCEP copygb program                       # 
#    CSEL - Forecast parameter contained within wgrib file          #
#    FHOUR - Counter for forecast hour                              #
#    GRBIDX - Location of of NCEP grbindex program                  #
#    PGB - Location of CDC PGB program                              #
#    PGBF - GRIB file name for a specific ensemble member and hour  #
#    PGBPARM - File containing list of PGB parameters               #
#    RUNNAME - Counter for ensemble member name                     #
#    SIG2SIG - Location of NCEP cdas_sig2sig program.               #
#    WGRIB - Location of NCEP wgrib program                         #
#    e1 - global_ensadd input parameter                             #
#    e2 - global_ensadd input parameter                             #
#    fhr - Counter for ensemble forecast hour                       #
#    file - Forecast parameter contained within wgrib file          #
#    hourlist - Array of forecast hours                             #
#    iensi - global_ensadd input parameter                          #
#    memberlist - Array of model ensemble members                   #
#    pert - Counter for ensemble member perturbation                #
#    pid - Process ID                                               #
#    vars - Array of model parameters                               #
#-------------------------------------------------------------------#
# Author: Jeffrey Whitaker                                          #
#         (Extra Documentation provided by Scott Handel)            #
#-------------------------------------------------------------------#
# Date: Feb 25, 2005                                                #
#-------------------------------------------------------------------#
# Modifications:                                                    #
#    20050307(SCH): Documentation blocks added                      #
#####################################################################
#####################################################################
# ESTABLISH DIRECTORY LOCATIONS FOR VARIOUS EXECUTABLES             #
#####################################################################
SIG2SIG=$EXECGLOBAL/cdas_sig2sig
PGB=$EXECCDC/cdc_pgb
WGRIB=$EXECUTIL/wgrib
GRBIDX=$EXECUTIL/grbindex
COPYGB=$EXECUTIL/copygb
#####################################################################
# SET FLAG SHELL FLAG SUCH THAT SCRIPT PRINTS OUT DIAGNOSTICS WHEN  #
# RUN                                                               #
#####################################################################
set -x
#####################################################################
# SET ARRAY OF MODEL VARIABLES                                      #
#####################################################################
vars="\
  z850  z700  z500  z250  z150 \
  u1000  u850  u700  u500  u250  u150 \
  v1000  v850  v700  v500  v250  v150 \
  t1000  t850  t700  t500  t250  t150 \
  rh700 prcp  prmsl t995  u995 v995 pwat \
  "
#####################################################################
# SET ARRAY OF ENSEMBLE MEMBERS                                     #
#####################################################################
memberlist="c0 p1 n1 p2 n2 p3 n3 p4 n4 p5 n5 p6 n6 p7 n7"
#####################################################################
# SET ARRAY OF FORECAST HOURS                                       #
#####################################################################
hourlist="12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192 204 216 228 240 252 264 276 288 300 312 324 336 348 360"
#####################################################################
# GENERATE FILE CONTAINING PGP PARAMETERS                           #
#####################################################################
PGBPARM=$DATA/pgb.parm
cat >$PGBPARM <<EOF
 &NAMPGB IO=144,JO=73,KO=6,NCPUS=1,ICEN2=1,IGEN=$IGEN,
 PO=1000.,850.,700.,500.,250.,150.,
 /
EOF
#####################################################################
# LOOP THROUGH ENSEMBLE FORECAST HOURS                              #
#####################################################################
for fhr in $hourlist
do
#####################################################################
# LOOP THROUGH ENSEMBLE FORECAST MEMBERS                            #
#####################################################################
for pert in $memberlist
do
#####################################################################
# SET NAME OF INPUT ENSEMBLE SIGMA FILE                             #
#####################################################################
sanl=$COMIN/ens${pert}.${cycle}.sf${fhr}
#####################################################################
# MAKE OUTPUT DIRECTORY IN TERMS OF ENSEMBLE PERTURBATION           #
#####################################################################
mkdir -p $pert
#####################################################################
# EXECUTE NCEP CDAS SIG2SIG PROGRAM                                 #
#####################################################################
$SIG2SIG -toR4 $sanl ${pert}/sanl.f${fhr}
cd $pert
#####################################################################
# SET NAME OF OUTPUT GRIB FILE                                      #
#####################################################################
#pgb=../ens${pert}.${cycle}.pgrbf${fhr}
pgb=$COMOUT/ens${pert}.${cycle}.pgrbf${fhr}
#####################################################################
# REMOVE OLD FILES USED BY FORTRAN PGB PROGRAM                      #
#####################################################################
rm fort.11
rm fort.51
#####################################################################
# LINK INPUT AND OUTPUT FILES TO APPROPRIATE FORTRAN UNIT NUMBERS   #
#####################################################################
ln -s sanl.f${fhr} fort.11
ln -s $pgb fort.51
#####################################################################
# GENERATE GRIB FILE USING PARAMETER LIST GENERATED EARLIER         #
#####################################################################

$PGB < $DATA/pgb.parm &

cd $DATA

done

#####################################################################
# wait till all runs done for the current ensemble member being     #
# processed                                                         #
#####################################################################
wait

done
#####################################################################
# GENERATE LISTS OF FORECAST HOURS FOR EACH ENSEMBLE MEMBER         #
#####################################################################
for RUNNAME in $memberlist
do
   /bin/rm -f FL$RUNNAME
   for FHOUR in $hourlist
   do
      PGBF=$COMOUT/ens$RUNNAME.${cycle}.pgrbf$FHOUR
      echo $PGBF
      echo $PGBF >>FL$RUNNAME
   done

done

#####################################################################
# add ens info to grib files.                                       #
#####################################################################

for RUNNAME in `echo $memberlist`
do
   case $RUNNAME in
       c0) iensi=12;echo $iensi;;
       n1) iensi=21;echo $iensi;;
       p1) iensi=31;echo $iensi;;
       n2) iensi=22;echo $iensi;;
       p2) iensi=32;echo $iensi;;
       n3) iensi=23;echo $iensi;;
       p3) iensi=33;echo $iensi;;
       n4) iensi=24;echo $iensi;;
       p4) iensi=34;echo $iensi;;
       n5) iensi=25;echo $iensi;;
       p5) iensi=35;echo $iensi;;
       n6) iensi=26;echo $iensi;;
       p6) iensi=36;echo $iensi;;
       n7) iensi=27;echo $iensi;;
       p7) iensi=37;echo $iensi;;
   esac
   e1=`echo $iensi | cut -c1-1`
   e2=`echo $iensi | cut -c2-2`

################################################################################
### Cat files and adding ensemble message, for current job
################################################################################
   echo "cat PGRB.$RUNNAME and add ensemble message"
   /bin/rm -f PG.$RUNNAME
   /bin/rm -f PGi.$RUNNAME
   cat `cat FL$RUNNAME` >PG.$RUNNAME
   $GRBIDX PG.$RUNNAME PGi.$RUNNAME

cat >ensadd_parm <<EOF
 &namin ienst=$e1,iensi=$e2,cpgb='PG.$RUNNAME',cpgi='PGi.$RUNNAME',cpge='PGt.$RUNNAME'
 /
EOF
#####################################################################
#  Extend the GRIB Product Definition Section (PDS) using the list  #
#  of parameters in file ensadd_parm                                #
#####################################################################

   $EXECGLOBAL/global_ensadd < ensadd_parm
   /bin/rm -f PG.$RUNNAME

done
#####################################################################
# REMOVE OLD GRIB FILES                                             #
#####################################################################

for RUNNAME in `echo $memberlist `
do
    if [ -s pgrb$RUNNAME.$PDY$cyc ]
    then
        rm pgrb$RUNNAME.$PDY$cyc
    fi
done  
#####################################################################
# RENAME OUTPUT GRIB FILES                                          #
#####################################################################

echo "cat PGt.* to pgrb.$PDY$cyc"
for RUNNAME in `echo $memberlist`
do
   (mv PGt.$RUNNAME pgrb$RUNNAME.$PDY$cyc
    rm PGi.$RUNNAME) 
done
#####################################################################
# INVENTORY OUTPUT GRIB FILES                                       #
#####################################################################

echo " Using wgrib to inventory pgrb.$PDY$cyc            "
echo " WGRIB -verf -s pgrb.$PDY$cyc to PGRB_INV.$PDY$cyc "


for RUNNAME in `echo $memberlist`
do
   ($WGRIB -verf -s pgrb$RUNNAME.$PDY$cyc   >PGRB${RUNNAME}_INV.$PDY$cyc  )
done  

for file in $vars
do
   case $file in
      z850)   CSEL=":HGT:850 mb";    echo $CSEL;;
      z700)   CSEL=":HGT:700 mb";    echo $CSEL;;
      z500)   CSEL=":HGT:500 mb";    echo $CSEL;;
      z250)   CSEL=":HGT:250 mb";    echo $CSEL;;
      z150)   CSEL=":HGT:150 mb";    echo $CSEL;;
      u995)   CSEL=":UGRD:sigma=0.9950";    echo $CSEL;;
     u1000)   CSEL=":UGRD:1000 mb";  echo $CSEL;;
      u850)   CSEL=":UGRD:850 mb";   echo $CSEL;;
      u700)   CSEL=":UGRD:700 mb";   echo $CSEL;;
      u500)   CSEL=":UGRD:500 mb";   echo $CSEL;;
      u250)   CSEL=":UGRD:250 mb";   echo $CSEL;;
      u150)   CSEL=":UGRD:150 mb";   echo $CSEL;;
      v995)   CSEL=":VGRD:sigma=0.9950";    echo $CSEL;;
     v1000)   CSEL=":VGRD:1000 mb";  echo $CSEL;;
      v850)   CSEL=":VGRD:850 mb";   echo $CSEL;;
      v700)   CSEL=":VGRD:700 mb";   echo $CSEL;;
      v500)   CSEL=":VGRD:500 mb";   echo $CSEL;;
      v250)   CSEL=":VGRD:250 mb";   echo $CSEL;;
      v150)   CSEL=":VGRD:150 mb";   echo $CSEL;;
     t1000)   CSEL=":TMP:1000 mb";   echo $CSEL;;
      t850)   CSEL=":TMP:850 mb";    echo $CSEL;;
      t700)   CSEL=":TMP:700 mb";    echo $CSEL;;
      t500)   CSEL=":TMP:500 mb";    echo $CSEL;;
      t250)   CSEL=":TMP:250 mb";    echo $CSEL;;
      t150)   CSEL=":TMP:150 mb";    echo $CSEL;;
     rh700)   CSEL=":RH:700 mb";     echo $CSEL;;
      prcp)   CSEL=":APCP";          echo $CSEL;;
     prmsl)   CSEL=":PRMSL:MSL";     echo $CSEL;;
      pwat)   CSEL=":PWAT:atmos col";echo $CSEL;;
      t995)   CSEL=":TMP:sigma=0.9950";     echo $CSEL;;
   esac
######################################################################
# GENERATE SEPERATE GRIB ENSPOST FILE FOR EACH FORECAST PARAMETER    #
######################################################################

  (grep "$CSEL"   <PGRB${RUNNAME}_INV.$PDY$cyc |
    $WGRIB pgrb$RUN.$PDY$cyc -s -grib -i -o $file.$PDY$cyc
    for RUNNAME in `echo $memberlist`
    do
      grep "$CSEL"   <PGRB${RUNNAME}_INV.$PDY$cyc |
      $WGRIB pgrb$RUNNAME.$PDY$cyc -s -grib -i -append -o $file.$PDY$cyc
    done) 

done

rm pgrb*.$PDY$cyc

echo " "
echo "      ==== END  OF  DUMP DATA FROM PGB FORECAST FILES ====="
echo " "
 
#####################################################################
# RENAME OUTPUT GRIB ENSPOST FILE IN TERMS OF FORECAST CYCLE AND    #
# PARAMETER                                                         #
#####################################################################
for file in $vars
do
  $GRBIDX ${file}.$PDY$cyc   ${file}i.$PDY$cyc
  cp ${file}.$PDY$cyc  $COMOUT/enspost.${cycle}.${file}
  cp ${file}i.$PDY$cyc $COMOUT/enspost.${cycle}.${file}i
done

exit 0
