#!/bin/sh

### For the parallel runs

###################### EXCMCENS ######################
# CMC Ensemble Postprocessing Script Function:
#   convert precipitation to 6h interval accumulations
#   convert precip accumulations to masks
#   create pgrba files directly
#   generate enspost files      
######################################################

echo "------------------------------------------------"
echo "       CMC Ensemble Postprocessing              "
echo "------------------------------------------------"
echo "History: March 2006 - Implementation of this new script."
echo "based on old exenspost"
echo "AUTHOR: Bo Cui    (wx20cb) "
echo "Sept 2004 - Yuejian Zhu - pqpf added"
echo "Sept 2004 - Richard Wobus - generate ensemble statistics file"
echo " Dec 2005 - Bo Cui  - new CMC ensemble forecast,384h forecast with 6h interval"
echo " Jun 2007 - Bo Cui  - CMC ensemble upgrad, member change from 16 to 20"
echo " Mar 2007 - Bo Cui & Doris Pan  - generate CMC ensemble pgrba and enspost files in parallel way"
echo " Mar 2010 - Bo Cui  - generate CMC ensemble pgrba and enspost files after CMC new implementation"

set -x

##############################
# Define Script/Exec Variables
##############################

export ENSPPF=$USHcmce/global_enspqpf_24h_cmc.sh
export ENSSTAT=$USHcmce/global_ensstat_cmc.sh
export ENSAVGSPR=$USHcmce/cmcens_avgspr.sh
export CNVGRIB=/nwprod/util/exec/cnvgrib
export WGRIB2=/nwprod/util/exec/wgrib2

#####################################
# START TO DUMP DATA FOR $cycle CYCLE
#####################################

msg="Starting postprocessing for $cycle Ensemble memebers"
postmsg "$jlogfile" "$msg"

export pgm=cmcens_post
. prep_step

########################################################
# Start Processing CMC Analysis at 00z, 06z, 12z and 18z
########################################################

if [ "$ANAPRDGEN" = "YES" ]; then

  iensi=11
  ens2=`echo $iensi | cut -c1-1`
  ens3=`echo $iensi | cut -c2-`

  echo "&message"  >input.anl.000
  echo " iens2=$ens2,"  >>input.anl.000
  echo " iens3=$ens3,"  >>input.anl.000
  echo " DATA_IN='$COMIN',"  >>input.anl.000
  echo " fhour='000',"  >>input.anl.000
  echo " fhour_m06='000'," >>input.anl.000
  echo " runname='anl'," >>input.anl.000
  echo " runmem='00'," >>input.anl.000
  echo " PDY='$PDY'," >>input.anl.000
  echo " PDYm1='$PDYm1'," >>input.anl.000
  echo " cyc='$cyc'," >>input.anl.000
  echo "/" >>input.anl.000

cat << EOF > cmcens_post.ana.input
1 1
000
anl
EOF

#######################################
# set the unit of input and output file 
# unit 11 : cmc analysis data 
# unit 51 : pgrba file
#######################################

# PGB=${DATA_IN}/cmc_gec00.t${cyc}z.pgrbaanl_prep

# ln -sf $PGB                        fort.11
# ln -sf cmc_gec00.t${cyc}z.pgrbaanl fort.51

##############
# start to run
##############

  startmsg
  poe $EXECcmce/$pgm.parallel < cmcens_post.ana.input
  export err=$?;err_chk

  if [ "$SENDCOM" = "YES" ]; then
    if [ -s cmc_gec00.t${cyc}z.pgrbaanl ]; then
      cp cmc_gec00.t${cyc}z.pgrbaanl   $COMOUTPGRBAm1/cmc_gec00.t${cyc}z.pgrbaanl
    fi
  fi

fi

##############################################################
# Begin Processing Ensemble Forecast Data for 00z or 12z cycle
##############################################################

if [ $cyc -eq 00 -o $cyc -eq 12 ]; then

varlboth="z1000 z500 u850 u200 v850 v200 t850 t2m rh700 prmsl u10m v10m"

varlnostat="rain frzr icep snow prcp" 

export hourlist="00  06  12  18  24  30  36  42  48  54  60  66  72  78  84  90  96 \
102 108 114 120 126 132 138 144 150 156 162 168 174 180 186 192 198 \
204 210 216 222 228 234 240 246 252 258 264 270 276 282 288 294 300 \
306 312 318 324 330 336 342 348 354 360 366 372 378 384"

export memberlist="c00 p01 p02 p03 p04 p05 p06 p07 p08 p09 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20"

###################################################################
# Write hourlist and memberlist into an input for the parallel code
###################################################################
cat << EOF > cmcens_post.input
65 21
EOF
echo "$hourlist" >> cmcens_post.input 
echo "$memberlist" >> cmcens_post.input 

##############################################
# Begin Processing Members, Forecast Lead Time
##############################################

for FHOUR in $hourlist; do
  for RUNNAME in $memberlist; do

  case $RUNNAME in
    c00) iensi=12;echo $iensi;;
    p01) iensi=31;echo $iensi;;
    p02) iensi=32;echo $iensi;;
    p03) iensi=33;echo $iensi;;
    p04) iensi=34;echo $iensi;;
    p05) iensi=35;echo $iensi;;
    p06) iensi=36;echo $iensi;;
    p07) iensi=37;echo $iensi;;
    p08) iensi=38;echo $iensi;;
    p09) iensi=39;echo $iensi;;
    p10) iensi=310;echo $iensi;;
    p11) iensi=311;echo $iensi;;
    p12) iensi=312;echo $iensi;;
    p13) iensi=313;echo $iensi;;
    p14) iensi=314;echo $iensi;;
    p15) iensi=315;echo $iensi;;
    p16) iensi=316;echo $iensi;;
    p17) iensi=317;echo $iensi;;
    p18) iensi=318;echo $iensi;;
    p19) iensi=319;echo $iensi;;
    p20) iensi=320;echo $iensi;;
  esac

    ens2=`echo $iensi | cut -c1-1`
    ens3=`echo $iensi | cut -c2-`

    echo "&message"  >input.$RUNNAME.$FHOUR
    echo " iens2=$ens2,"  >>input.$RUNNAME.$FHOUR
    echo " iens3=$ens3,"  >>input.$RUNNAME.$FHOUR

    PFHOUR=000        
    if [ $FHOUR -ge 12 ]; then   
      PFHOUR=`expr $FHOUR - 06`
      if [ $PFHOUR -le 9 ]; then
	PFHOUR=0$PFHOUR
      fi
    fi

    runmem=`echo $RUNNAME | cut -c2-3`

    echo " DATA_IN='$COMIN',"  >>input.$RUNNAME.$FHOUR
    echo " fhour='$FHOUR',"  >>input.$RUNNAME.$FHOUR
    echo " fhour_m06='$PFHOUR',"  >>input.$RUNNAME.$FHOUR
    echo " runname='$RUNNAME',"  >>input.$RUNNAME.$FHOUR
    echo " runmem='$runmem',"  >>input.$RUNNAME.$FHOUR
    echo " PDY='$PDY',"  >>input.$RUNNAME.$FHOUR
    echo " PDYm1='$PDYm1',"  >>input.$RUNNAME.$FHOUR
    echo " cyc='$cyc',"  >>input.$RUNNAME.$FHOUR

    echo "/" >>input.$RUNNAME.$FHOUR

#################################################################
# set the unit of input file 
# unit 11 -    : cmc forecasts input
# unit 12 - 16 : temporary files for arain afrzr aicep asnow prcp
#################################################################

#   PGB=${DATA_IN}/cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR}_prep

#   ln -sf $PGB fort.11
#   if [ $FHOUR -ge 12 ]; then   
#     PFHOUR=`expr $FHOUR - 06`
#     if [ $PFHOUR -le 9 ]; then
#       PFHOUR=0$PFHOUR
#     fi
#     ln -sf temp_arain_ge${RUNNAME}.f${PFHOUR} fort.12
#     ln -sf temp_afrzr_ge${RUNNAME}.f${PFHOUR} fort.13
#     ln -sf temp_aicep_ge${RUNNAME}.f${PFHOUR} fort.14
#     ln -sf temp_asnow_ge${RUNNAME}.f${PFHOUR} fort.15
#     ln -sf temp_prcp_ge${RUNNAME}.f${PFHOUR}  fort.16
#   fi

#################################################################
# set the unit of output pgrba file 
# unit 51 -    : pgrba file
# unit 52 - 56 : temporary files for arain afrzr aicep asnow prcp
#################################################################

#   ln -sf cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR} fort.51
#   if [ $FHOUR -ge 06 ]; then
#     ln -sf temp_arain_ge${RUNNAME}.f${FHOUR} fort.52
#     ln -sf temp_afrzr_ge${RUNNAME}.f${FHOUR} fort.53
#     ln -sf temp_aicep_ge${RUNNAME}.f${FHOUR} fort.54
#     ln -sf temp_asnow_ge${RUNNAME}.f${FHOUR} fort.55
#     ln -sf temp_prcp_ge${RUNNAME}.f${FHOUR}  fort.56
#   fi

####################################################################
# set the unit of enspost* file
# unit 61 - 70 : z1000 z500 u850 u200 v850 v200 t850 t2m rh700 prmsl
####################################################################

#   iunit=60
#   for file in $varlboth; do
#     iunit=`expr $iunit + 1`
#     ln -sf enspostc.ge${RUNNAME}.t${cyc}z.f${FHOUR}.${file}hr fort.$iunit
#   done

#########################################
# set the unit of enspost* file
# unit 71 - 75 : rain frzr icep snow prcp
#########################################

#   iunit=70
#   if [ $FHOUR -ge 06 ]; then
#     for file in $varlnostat; do
#     iunit=`expr $iunit + 1`
#     ln -sf enspostc.ge${RUNNAME}.t${cyc}z.f${FHOUR}.${file}hr fort.$iunit
#     done
#   fi

  done
done

##############
# start to run
##############
startmsg
poe $EXECcmce/${pgm}.parallel < cmcens_post.input 
export err=$?;err_chk

###############################
# account files number missing
###############################

icnt=0

for FHOUR in $hourlist; do
  for RUNNAME in $memberlist; do
      file=cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR}
      if [ ! -s $file ]; then
         icnt=`expr $icnt + 1`
      fi
  done
done
 
if [ $icnt -ge 1 ]; then 
  echo " There are ", $icnt, " files missing !!! "
  echo " Please check the PREP job to see if it complete normally."
  export err=1
  err_exit
fi

#############################################
# move pgrba data to /com/gens/prod directory
#############################################

for FHOUR in $hourlist; do
  for RUNNAME in $memberlist; do

    if [ "$SENDCOM" = "YES" ]; then
      if [ -s cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR} ]; then
        mv cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR} $COMOUTPGRBA/cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR}
      fi
    fi
  done
done

######################################
#  release the CMC ensemble debias job 
######################################
$SMSBIN/setev release_debias

##################################################################
# cat the enspostc* file (one variable) of all members to one file
##################################################################

for RUNNAME in $memberlist; do
  for file in $varlboth $varlnostat; do
    if [ -s enspostc.ge${RUNNAME}.t${cyc}z.${file}hr ]; then
      cat enspostc.ge${RUNNAME}.t${cyc}z.${file}hr >> enspostc.t${cyc}z.${file}hr
    fi
  done
done

############################
# copy output enspostc files
############################

for file in $varlboth $varlnostat 
do
  if [ "$SENDCOM" = "YES" ]; then
    if [ -s enspostc.${cycle}.${file}hr ]; then
      cp enspostc.${cycle}.${file}hr  $COMOUTENST/enspostc.${cycle}.${file}hr
###      if [ "$SENDDBN" = "YES" ]; then
###        $DBNROOT/bin/dbn_alert MODEL ENS_POST_CMC $job $COMOUTENST/enspostc.${cycle}.${file}hr
###      fi
    fi
  fi
done

########################################################
#  we add a script to calculate ensemble mean and spread
########################################################
                                                                                                             
for nfhrs in $hourlist
do
  export HRLIST=$nfhrs
  $ENSAVGSPR

  #########################
  # Convert to grib2 format
  #########################

  $CNVGRIB -g12 -p40 cmc_geavg.t${cyc}z.pgrbaf$nfhrs cmc_geavg.t${cyc}z.pgrb2af$nfhrs
  $WGRIB2 cmc_geavg.t${cyc}z.pgrb2af$nfhrs -s >cmc_geavg.t${cyc}z.pgrb2af$nfhrs.idx
  $CNVGRIB -g12 -p40 cmc_gespr.t${cyc}z.pgrbaf$nfhrs cmc_gespr.t${cyc}z.pgrb2af$nfhrs
  $WGRIB2 cmc_gespr.t${cyc}z.pgrb2af$nfhrs -s >cmc_gespr.t${cyc}z.pgrb2af$nfhrs.idx

  if [ "$SENDCOM" = "YES" ]; then
    if [ -s cmc_geavg.t${cyc}z.pgrbaf$nfhrs ]; then
      mv cmc_geavg.t${cyc}z.pgrbaf$nfhrs  $COMOUTPGRBA/cmc_geavg.t${cyc}z.pgrbaf$nfhrs
#      if [ "$SENDDBN" = "YES" ] ; then
#         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA $job $COMOUTPGRBA/cmc_geavg.t${cyc}z.pgrbaf$nfhrs
#      fi
    fi
    if [ -s cmc_gespr.t${cyc}z.pgrbaf$nfhrs ]; then
      mv cmc_gespr.t${cyc}z.pgrbaf$nfhrs  $COMOUTPGRBA/cmc_gespr.t${cyc}z.pgrbaf$nfhrs
#      if [ "$SENDDBN" = "YES" ] ; then
#         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA $job $COMOUTPGRBA/cmc_gespr.t${cyc}z.pgrbaf$nfhrs
#      fi
    fi

    ###########################
    # Save and send grib2 files 
    ###########################
    if [ $SENDCOM = YES ]
    then
      mv cmc_geavg.t${cyc}z.pgrb2af$nfhrs      $COMOUTPGRB2A/.
      mv cmc_geavg.t${cyc}z.pgrb2af$nfhrs.idx  $COMOUTPGRB2A/.
      mv cmc_gespr.t${cyc}z.pgrb2af$nfhrs      $COMOUTPGRB2A/.
      mv cmc_gespr.t${cyc}z.pgrb2af$nfhrs.idx  $COMOUTPGRB2A/.
     
      if [ $SENDDBN_GB2 = YES ]
      then
         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2 $job $COMOUTPGRB2A/cmc_geavg.t${cyc}z.pgrb2af$nfhrs       
         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2_WIDX $job $COMOUTPGRB2A/cmc_geavg.t${cyc}z.pgrb2af$nfhrs.idx
         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2 $job $COMOUTPGRB2A/cmc_gespr.t${cyc}z.pgrb2af$nfhrs       
         $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2_WIDX $job $COMOUTPGRB2A/cmc_gespr.t${cyc}z.pgrb2af$nfhrs.idx
      fi
    fi
  fi
done

#############################################################################
# calculate PQPF (named ensppf ) for each 24 hours period, for 21 ens members 
#############################################################################

if test "$cycle" = "t00z"; then
  $ENSPPF enspostc.t${cyc}z.prcphr ensppf.$PDY$cyc
  if [ $SENDCOM = "YES" ]; then
    if [ -s ensppf.$PDY$cyc ]; then
      cp ensppf.$PDY$cyc $COMOUTENST/ensstatc.$cycle.pqpfhr_24h
###      if [ "$SENDDBN" = "YES" ]; then
###        $DBNROOT/bin/dbn_alert MODEL ENS_STAT_CMC $job $COMOUTENST/ensstatc.${cycle}.pqpfhr_24h
###      fi
    fi
  fi
fi

##################################
# create ensemble statistics files
##################################

export HHRLIST="$hourlist"
export MEMLIST="$memberlist"
export VARLIST="$varlboth prcp"

$ENSSTAT

if [ "$SENDCOM" = "YES" ]; then
  for var in $VARLIST
  do
    cfosg=ensstatc.$cycle.${var}hr
    if [ -s $cfosg ]; then
      cp $cfosg $COMOUTENST/$cfosg
###      if [ "$SENDDBN" = "YES" ] ; then
###	$DBNROOT/bin/dbn_alert MODEL ENS_STAT_CMC $job $COMOUTENST/$cfosg
###      fi
    fi
  done
fi

cat OUTPUT.gep15.f252 OUTPUT.gep15.f258
cat output_avgspr_252 output_avgspr_258
cat $pgmout
cat $pgmout.*t2m*

#########################
# Convert to grib2 format
#########################

for FHOUR in $hourlist; do
  for RUNNAME in $memberlist; do

    $CNVGRIB -g12 -p40 $COMOUTPGRBA/cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR} cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}
    $WGRIB2 cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR} -s >cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}.idx

    if [ "$SENDCOM" = "YES" ]; then
      mv cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}     $COMOUTPGRB2A/.
      mv cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}.idx $COMOUTPGRB2A/.
#      if [ "$SENDDBN" = "YES" ] ; then
#        $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA $job $COMOUTPGRBA/cmc_ge${RUNNAME}.t${cyc}z.pgrbaf${FHOUR}
#      fi
      if [ $SENDDBN_GB2 = YES ]; then
        $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2 $job $COMOUTPGRB2A/cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}           
        $DBNROOT/bin/dbn_alert MODEL CMCENS_PGBA_GB2_WIDX $job $COMOUTPGRB2A/cmc_ge${RUNNAME}.t${cyc}z.pgrb2af${FHOUR}.idx       
      fi
    fi
  done
done

#############################################
# Run extrkr.sh to compute the TC storm
# tracks for each of the 20 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    \
              p09 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 c00
  do
    export pert
    sh ${utilscript}/extrkr.sh
  done

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

fi

###
# end of 00z and 12z cycle only
#
fi

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