#!/bin/sh
########################### EXCMCENS ################################
echo "------------------------------------------------"
echo "CMC Ensemble Postprocessing"
echo "------------------------------------------------"
echo "History: April 2004 - First implementation of this new script."
echo "based on exenspost"
echo "AUTHOR: Richard Wobus wd20rw)"
echo "Sept 2004 - Yuejian Zhu - pqpf added"
echo "Sept 2004 - Richard Wobus - additional variables processed"

### need pass the values of CYC, YMD, DATA, COMIN and COMOUT

if [[ ! -d $DATA ]]; then
  mkdir -p $DATA
fi

set -x

cd $DATA
#rm $DATA/*

#####################################
# Define ensemble message switch
#   iens_msg=0 will add ensemble extension message
#   iens_msg=1 do not need to add ensemble extension message
#              only if evry members have
#              extension message
#####################################
export iens_msg=0

#####################################
# Define Script/Exec Variables
#####################################
export WGRIB="$EXECUTIL/wgrib -ncep_opn"
export GRBIDX=$EXECUTIL/grbindex
export COPYGB=$EXECUTIL/copygb

#export PRCPCV=$USHGLOBAL/global_ensprcpcv.sh
export ENSPPF=$USHGLOBAL/global_enspqpf_24h_cmc.sh
export ENSADD=$USHGLOBAL/global_ensadd.sh
export ENSSTAT=$USHGLOBAL/global_ensstat_cmc.sh
export ENSPQPF=$USHGLOBAL/global_enspqpf.sh

#####################################
# START TO DUMP DATA FOR $cycle CYCLE
# START TO DUMP DATA FROM PGB FORECAST FILES
#####################################


varlboth="\
  z1000 z925  z850  z700  z500  z250  z200 zsfc \
  u1000 u925  u850  u700  u500  u250  u200 u10m \
  v1000 v925  v850  v700  v500  v250  v200 v10m \
  t1000 t925  t850  t700  t500  t250  t200 t2m  \
  prmsl psfc \
  prcp  pwat  tcdc \
  t2max t2min \
  cape \
  arain afrzr aicep asnow \
  "

varlnostat=" \
 "

varlin=" \
  d1000 d925  d850  d700  d500  d250  d200 d2m  \
 "

varlout=" \
  rh1000 rh925 rh850 rh700 rh500 rh250 rh200 rh2m \
 "

varloutnostat="
  rain   frzr  icep  snow \
  "

if test "$SENDCOM" = 'YES'
then
   for FIELD in $varlboth $varlnostat $varlin $varlout $varloutnostat
   do
      if [ -e $COMOUT/enspostc.${cycle}.${FIELD} ]
      then
         rm $COMOUT/enspostc.${cycle}.${FIELD}
         rm $COMOUT/enspostc.${cycle}.${FIELD}i
      fi
      if [ -e $COMOUT/ensstatc.${cycle}.${FIELD} ]
      then
         rm $COMOUT/ensstatc.${cycle}.${FIELD}
         rm $COMOUT/ensstatc.${cycle}.${FIELD}i
      fi
      if [ -e $COMOUT/enspostc.${cycle}.${FIELD}hr ]
      then
         rm $COMOUT/enspostc.${cycle}.${FIELD}hr
         rm $COMOUT/enspostc.${cycle}.${FIELD}hri
      fi
      if [ -e $COMOUT/ensstatc.${cycle}.${FIELD}hr ]
      then
         rm $COMOUT/ensstatc.${cycle}.${FIELD}hr
         rm $COMOUT/ensstatc.${cycle}.${FIELD}hri
      fi
   done
fi

   RUN="cmcens"
   hourlist1="000 024 048 072 096 120 144 168 192 216 240"
   hourlist2="00 12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192 204 216 228 240"

   memberlist1="00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16"
   memberlist2="c0 n1 p1 n2 p2 n3 p3 n4 p4 n5 p5 n6 p6 n7 p7 n8 p8"


##################################
# Begin Processing Members
##################################
msg="Starting postprocessing for $cycle Ensemble memebers"
postmsg "$jlogfile" "$msg"

for RUNNAME in $memberlist1
do
   for FHOUR in $hourlist1
   do
      PGBF=$COMIN/cmcens_${PDY}0${RUNNAME}f$FHOUR
      echo $PGBF
      echo $PGBF >>FL$RUNNAME
   done

done

### waiting for finish all processes
wait

for RUNNAME in $memberlist1
do
   case $RUNNAME in
       00) iensi=11;echo $iensi;;
       01) iensi=21;echo $iensi;;
       02) iensi=31;echo $iensi;;
       03) iensi=22;echo $iensi;;
       04) iensi=32;echo $iensi;;
       05) iensi=23;echo $iensi;;
       06) iensi=33;echo $iensi;;
       07) iensi=24;echo $iensi;;
       08) iensi=34;echo $iensi;;
       09) iensi=25;echo $iensi;;
       10) iensi=35;echo $iensi;;
       11) iensi=26;echo $iensi;;
       12) iensi=36;echo $iensi;;
       13) iensi=27;echo $iensi;;
       14) iensi=37;echo $iensi;;
       15) iensi=28;echo $iensi;;
       16) iensi=38;echo $iensi;;
   esac
   e1=`echo $iensi | cut -c1-1`
   e2=`echo $iensi | cut -c2-2`

   if [ ${iens_msg} -eq 1 ]; then

###############################################################################
## Cat files only, assume ensemble message has been added to individual members 
## Interpolation in copygb added here (04/22/2004)
###############################################################################

     echo "cat PGRB.$RUNNAME "
#     (cat `cat FL$RUNNAME` >PGt.$RUNNAME) &
     (cat `cat FL$RUNNAME` >PGC.$RUNNAME;$GRBIDX PGC.$RUNNAME PGCI.$RUNNAME;$COPYGB -g3 -i1 PGC.$RUNNAME PGCI.$RUNNAME PGt.$RUNNAME;rm PGC.$RUNNAME PGCI.$RUNNAMEPG.$RUNNAME) &

   else

################################################################################
### Cat files and adding ensemble message, for current job (06/07/2000) 
## Interpolation in copygb added here (04/22/2004)
################################################################################

     echo "cat PGRB.$RUNNAME and add ensemble message"
     (cat `cat FL$RUNNAME` >PGC.$RUNNAME;$GRBIDX PGC.$RUNNAME PGCI.$RUNNAME;$COPYGB -g3 -i1 PGC.$RUNNAME PGCI.$RUNNAME PG.$RUNNAME;rm PGC.$RUNNAME PGCI.$RUNNAME;$ENSADD $e1 $e2 PG.$RUNNAME PGi.$RUNNAME PGt.$RUNNAME;rm PG.$RUNNAME) &

   fi

done

### waiting for finish all processes
wait

rm $DATA/cmcens_$PDY* 

for RUNNAME in $memberlist1
do
    if [ -s pgrb$RUNNAME.$PDY$cyc ]
    then
        rm pgrb$RUNNAME.$PDY$cyc
    fi
done  

echo "cat PGt.* to pgrb.$PDY$cyc"
for RUNNAME in $memberlist1
do
   (mv PGt.$RUNNAME pgrb$RUNNAME.$PDY$cyc
    rm PGi.$RUNNAME) &
done

### waiting for finish all processes
wait

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


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

### waiting for finish all processes
wait 

for file in $varlboth $varlin $varlnostat
do
   case $file in
      z1000)  CSEL=":HGT:1000 mb";     echo $CSEL;;
      z925)   CSEL=":HGT:925 mb";      echo $CSEL;;
      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;;
      z200)   CSEL=":HGT:200 mb";      echo $CSEL;;
      zsfc)   CSEL=":HGT:1.00000 (ETA";echo $CSEL;;
      u1000)  CSEL=":UGRD:1000 mb";    echo $CSEL;;
      u925)   CSEL=":UGRD:925 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;;
      u200)   CSEL=":UGRD:200 mb";     echo $CSEL;;
      u10m)   CSEL=":UGRD:10 m";       echo $CSEL;;
      v1000)  CSEL=":VGRD:1000 mb";    echo $CSEL;;
      v925)   CSEL=":VGRD:925 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;;
      v200)   CSEL=":VGRD:200 mb";     echo $CSEL;;
      v10m)   CSEL=":VGRD:10 m";       echo $CSEL;;
      t1000)  CSEL=":TMP:1000 mb";     echo $CSEL;;
      t925)   CSEL=":TMP:925 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;;
      t200)   CSEL=":TMP:200 mb";      echo $CSEL;;
      t2m)    CSEL=":TMP:2 m";         echo $CSEL;;
      t2max)  CSEL=":TMAX:2 m";        echo $CSEL;;
      t2min)  CSEL=":TMIN:2 m";        echo $CSEL;;
      d1000)  CSEL=":DEPR:1000 mb";    echo $CSEL;;
      d925)   CSEL=":DEPR:925 mb";     echo $CSEL;;
      d850)   CSEL=":DEPR:850 mb";     echo $CSEL;;
      d700)   CSEL=":DEPR:700 mb";     echo $CSEL;;
      d500)   CSEL=":DEPR:500 mb";     echo $CSEL;;
      d250)   CSEL=":DEPR:250 mb";     echo $CSEL;;
      d200)   CSEL=":DEPR:200 mb";     echo $CSEL;;
      d2m)    CSEL=":DEPR:2 m";        echo $CSEL;;
      prmsl)  CSEL=":PRMSL:MSL";       echo $CSEL;;
      psfc)   CSEL=":PRES:sfc";        echo $CSEL;;
      prcp)   CSEL=":APCP:sfc";        echo $CSEL;;
      tcdc)   CSEL=":TCDC:sfc";        echo $CSEL;;
      pwat)   CSEL=":[PC]WAT:atmos co";echo $CSEL;;
      cape)   CSEL=":CAPE:sfc";        echo $CSEL;;
      arain)  CSEL=":DZDT:sfc";        echo $CSEL;;
      afrzr)  CSEL=":ABSV:sfc";        echo $CSEL;;
      aicep)  CSEL=":ABSD:sfc";        echo $CSEL;;
      asnow)  CSEL=":RELV:sfc";        echo $CSEL;;
   esac


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

done
wait

rm pgrb*.$PDY$cyc pgrbhr*.$PDY$cyc 

echo " "
echo "      ==== END  OF  DUMP DATA FROM PGB FORECAST FILES ====="
#echo " "
#echo "      ==== START TO CREAT INDEX FILES AND PRECIP POST PROCESS ===="
#echo " "
#
##
## convert precipitation forecast unit from hour to 12 hours
##
#$GRBIDX prcp.$PDY$cyc prcpi.$PDY$cyc
#$PRCPCV prcp.$PDY$cyc prcpi.$PDY$cyc precip.$PDY$cyc
#cp precip.$PDY$cyc prcp.$PDY$cyc
#
##
## calculate PQPF (named ensppf ) for each 24 hours period, for 23 ens members 
## write out with ensemble extended messages
##
#
#if test "$cycle" = "t00z"
#then
#   cat $COMINm1/enspost.t12z.prcp precip.$PDY$cyc >prcp_24.$PDY$cyc
#   $GRBIDX prcp_24.$PDY$cyc prcp_24i.$PDY$cyc
#   $ENSPPF prcp_24.$PDY$cyc prcp_24i.$PDY$cyc ensppf.$PDY$cyc
#fi
#
##
## calculate PQPF, PQSF, PQFF, PQRF, PQIF for 12-hour period, for 11 ens members, 
## for each cycle (t00z,t06z,t12z,t18z), write out with ensemble extended messages
##
#
#export CDATE=$CDATE; /nfsuser/g01/wx20yz/jif0101/scripts/enspqpf.sh
#

#
# convert to ncep hr grid (3)
#

for file in $varlboth $varlnostat $varlin
do
  f1=`echo $file|cut -c1`
  f2=`echo $file|cut -c2-`
  if [[ $file = prcp ]]; then
    mv ${file}hr.$PDY$cyc tempgribin
    $USHGLOBAL/global_prcp_cmc.sh tempgribin ${file}hr.$PDY$cyc
    rm tempgribin
    $GRBIDX ${file}hr.$PDY$cyc   ${file}hri.$PDY$cyc
  elif [[ $f1 = d ]]; then
    filt=t$f2
    filo=rh$f2
    $GRBIDX ${file}hr.$PDY$cyc   ${file}hri.$PDY$cyc
    $USHGLOBAL/global_rh_cmc.sh  ${filt}hr.$PDY$cyc ${file}hr.$PDY$cyc ${filo}hr.$PDY$cyc
    $GRBIDX ${filo}hr.$PDY$cyc   ${filo}hri.$PDY$cyc
  elif [[ $file = arain ]] || [[ $file = afrzr ]] || [[ $file = aicep ]] || [[ $file = asnow ]]; then
  #elif [[ $f1 = a ]]; then
    echo type accumulation section begin
    echo file=$file
    mv ${file}hr.$PDY$cyc tempgribin
    $USHGLOBAL/global_prcp_cmc.sh tempgribin ${file}hr.$PDY$cyc
    rm tempgribin
    $GRBIDX ${file}hr.$PDY$cyc   ${file}hri.$PDY$cyc
    echo type accumulation section end
  else
    $GRBIDX ${file}hr.$PDY$cyc   ${file}hri.$PDY$cyc
  fi
  if [[ $file = z500 ]]; then
    $WGRIB -v -PDS -GDS ${file}hr.$PDY$cyc
  fi
done

#
# convert precip accumulations to masks
#
$USHGLOBAL/global_mprcp_cmc.sh \
  arainhr.$PDY$cyc afrzrhr.$PDY$cyc aicephr.$PDY$cyc asnowhr.$PDY$cyc \
   rainhr.$PDY$cyc  frzrhr.$PDY$cyc  icephr.$PDY$cyc  snowhr.$PDY$cyc

for file in rain frzr icep snow
do
  $GRBIDX ${file}hr.$PDY$cyc ${file}hri.$PDY$cyc
done

#
# copy output enspostc files
#

for file in $varlboth $varlnostat $varlout $varloutnostat
do
  if [ "$SENDCOM" = "YES" ]
  then
     cp ${file}hr.$PDY$cyc  $COMOUT/enspostc.${cycle}.${file}hr
     cp ${file}hri.$PDY$cyc $COMOUT/enspostc.${cycle}.${file}hri
  fi

  if [ "$SENDDBN" = "YES" ]
  then
     $DBNROOT/bin/dbn_alert MODEL ENS_POST_CMC $job $COMOUT/enspostc.${cycle}.${file}hr
     $DBNROOT/bin/dbn_alert MODEL ENS_POST_CMC $job $COMOUT/enspostc.${cycle}.${file}hri
  fi
done

#
# create ensemble statistics files
#

  ## part (1a)calculate PQPF (named ensppf ) for each 24 hours period, for 23 ens members 
  ## write out with ensemble extended messages
  ##
  #
  if test "$cycle" = "t00z"
  then
  #   $GRBIDX precip.$PDY$cyc precipi.$PDY$cyc
     $ENSPPF prcphr.$PDY$cyc ensppf.$PDY$cyc
     $GRBIDX ensppf.$PDY$cyc ensppfi.$PDY$cyc
     if [ $SENDCOM = "YES" ]
     then
       cp ensppf.$PDY$cyc $COMOUT/ensstatc.$cycle.pqpfhr_24h
       cp ensppfi.$PDY$cyc $COMOUT/ensstatc.$cycle.pqpfhri_24h
     fi
     if [ "$SENDDBN" = "YES" ]
     then
       $DBNROOT/bin/dbn_alert MODEL ENS_STAT_CMC $job $COMOUT/ensstatc.${cycle}.pqpfhr_24h
       $DBNROOT/bin/dbn_alert MODEL ENS_STAT_CMC $job $COMOUT/ensstatc.${cycle}.pqpfhri_24h
     fi
  fi

if (( 0 == 1 )); then
# this section disabled for Canadian ensemble

  # part (1b): probabilistic forecasts ( PQPF, PQRF, PQFF, PQSF and PQIF )
  export CDATE=$PDY$cyc; $ENSPQPF

  for file in pqpf pqrf pqff pqsf pqif
  do
     $GRBIDX $DATA/$file $DATA/${file}i
     if [ $SENDCOM = "YES" ]
     then
       cp $DATA/$file $COMOUT/ensstatc.$cycle.$file
       cp $DATA/${file}i $COMOUT/ensstatc.$cycle.${file}i
     fi
  done

fi

# part (2): ensemble mean, ensemble spread, etc,,,
export RUN
export HLRLIST="$hourlist2"
export HHRLIST="$hourlist2"
export MEMLIST="$memberlist2"
export VARLIST="$varlboth $varlout"

$ENSSTAT

#############################################
# Run extrkr.sh to compute the TC storm
# tracks for each of the 16 member forecasts,
# then run ens_trak_ave.sh to compute the
# Canadian ensemble mean forecast track.
#############################################
if [ ${RUN_TCTRACK} = 'YES' ]
then
    
  export cmodel=cens
  for pert in p01 p02 p03 p04 p05 p06 p07 p08    \
              n01 n02 n03 n04 n05 n06 n07 n08 c00
  do
    export pert
    sh ${utilscript}/extrkr.sh
  done

  export cmodel=cens
  sh ${utilscript}/ens_trak_ave.sh

fi
 
msg="HAS COMPLETED NORMALLY!"
postmsg "$jlogfile" "$msg"
