#!/bin/ksh
#
#####################################################
# produce common ensemble products (mean, spread and
# probability) of selected variables and write them 
# out in grib format
#
# programmer: Jun Du
# 07/10/2001: initial program
# 04/04/2002: J. Du, output 104 grid to ftp site
# 08/07/2003: J. Du, (1) 5 kfeta members added so products
#               is now 15 member based rather than 10 member 
#               based; (2) source code modified to follow 
#               NCEP ensemble grib extension standard
# 10/23/2003: J. Du, SREF member structure changed from
#               originally 3 5-member components (Eta,
#               kf_eta and RSM) to 2 component system
#               (10 Eta members and 5 RSM members)
# 02/22/2005: J. Du, added an extra program to produce similar
#                ensemble products -- mean, spread and prob --
#                but with more variables and levels as well as
#                outputs in individual forecast hours (instead of 
#                one big file) for the use by FVS (note: spread and
#                prob are produced but not saved since they are not 
#                used by FVS).
# 06/21/2005: J. Du, generalized the code to take any grids rather 
#                than one particular grid (212)
#
# 07/29/2005: B. Zhou, rewrite PART I 
#
# 10/26/2005: J. Du, Implemented in operational SREF
#
# 03/20/2010: J. Du, Adapted to the hi-res hybrid ensemble
#
# 04/12/2010: M. Pyle, Changed so can run hour by hour (run while the model 
#                      is running)
#
#####################################################
set -x

export XLFRTEOPTS="namelist=old"

# freq=$1
hour=$cyc
dom=$NEST

# Note: fileID = the first 4 characters of the last model's name
# from the list below i.e. MODEL[44]=${region}arw here, specifically,
# eastarw, westarw,akarw, hiarw and prarw

if [ $dom = east ]; then
 export region=east
 export grid=256
 export fileID=east
fi

if [ $dom  = west ]; then
 export region=west
 export grid=256
 export fileID=west
fi

if [ $dom = ak ]; then
 export region=ak
 export grid=257
 export fileID=akar
fi

if [ $dom = pr ]; then
 export region=pr
 export grid=259
 export fileID=prar
fi

if [ $dom = hi ]; then
 export region=hi
 export grid=258
 export fileID=hiar
fi

KM=39                                 #vertical pressure levels for all grid#

yy=`echo $PDY | cut -c 1-4`
mm=`echo $PDY | cut -c 5-6`
dd=`echo $PDY | cut -c 7-8`

######################################
# Part I: Fetching data from /com 
######################################
# clean directory before job starts
rm -f $DATA/*

MODEL[1]=${region}nmm
MODEL_PAIR[1]=c00
PAIR[1]=01
MODEL[2]=${region}nmm
MODEL_PAIR[2]=p01
PAIR[2]=02
MODEL[3]=${region}nmm
MODEL_PAIR[3]=p02
PAIR[3]=03
MODEL[4]=${region}nmm
MODEL_PAIR[4]=p03
PAIR[4]=04
MODEL[5]=${region}nmm
MODEL_PAIR[5]=p04
PAIR[5]=05
MODEL[6]=${region}nmm
MODEL_PAIR[6]=p05
PAIR[6]=06
MODEL[7]=${region}nmm
MODEL_PAIR[7]=p06
PAIR[7]=07
MODEL[8]=${region}nmm
MODEL_PAIR[8]=p07
PAIR[8]=08
MODEL[9]=${region}nmm
MODEL_PAIR[9]=p08
PAIR[9]=09
MODEL[10]=${region}nmm
MODEL_PAIR[10]=p09
PAIR[10]=10
MODEL[11]=${region}nmm
MODEL_PAIR[11]=p10
PAIR[11]=11
MODEL[12]=${region}nmm
MODEL_PAIR[12]=p11
PAIR[12]=12
MODEL[13]=${region}nmm
MODEL_PAIR[13]=p12
PAIR[13]=13
MODEL[14]=${region}nmm
MODEL_PAIR[14]=p13
PAIR[14]=14
MODEL[15]=${region}nmm
MODEL_PAIR[15]=p14
PAIR[15]=15
MODEL[16]=${region}nmm
MODEL_PAIR[16]=p15
PAIR[16]=16
MODEL[17]=${region}nmm
MODEL_PAIR[17]=p16
PAIR[17]=17
MODEL[18]=${region}nmm
MODEL_PAIR[18]=p17
PAIR[18]=18
MODEL[19]=${region}nmm
MODEL_PAIR[19]=p18
PAIR[19]=19
MODEL[20]=${region}nmm
MODEL_PAIR[20]=p19
PAIR[20]=20
MODEL[21]=${region}nmm
MODEL_PAIR[21]=p20
PAIR[21]=21
MODEL[22]=${region}nmm
MODEL_PAIR[22]=p21
PAIR[22]=22

MODEL[23]=${region}arw
MODEL_PAIR[23]=c00
PAIR[23]=23
MODEL[24]=${region}arw
MODEL_PAIR[24]=p01
PAIR[24]=24
MODEL[25]=${region}arw
MODEL_PAIR[25]=p02
PAIR[25]=25
MODEL[26]=${region}arw
MODEL_PAIR[26]=p03
PAIR[26]=26
MODEL[27]=${region}arw
MODEL_PAIR[27]=p04
PAIR[27]=27
MODEL[28]=${region}arw
MODEL_PAIR[28]=p05
PAIR[28]=28
MODEL[29]=${region}arw
MODEL_PAIR[29]=p06
PAIR[29]=29
MODEL[30]=${region}arw
MODEL_PAIR[30]=p07
PAIR[30]=30
MODEL[31]=${region}arw
MODEL_PAIR[31]=p08
PAIR[31]=31
MODEL[32]=${region}arw
MODEL_PAIR[32]=p09
PAIR[32]=32
MODEL[33]=${region}arw
MODEL_PAIR[33]=p10
PAIR[33]=33
MODEL[34]=${region}arw
MODEL_PAIR[34]=p11
PAIR[34]=34
MODEL[35]=${region}arw
MODEL_PAIR[35]=p12
PAIR[35]=35
MODEL[36]=${region}arw
MODEL_PAIR[36]=p13
PAIR[36]=36
MODEL[37]=${region}arw
MODEL_PAIR[37]=p14
PAIR[37]=37
MODEL[38]=${region}arw
MODEL_PAIR[38]=p15
PAIR[38]=38
MODEL[39]=${region}arw
MODEL_PAIR[39]=p16
PAIR[39]=39
MODEL[40]=${region}arw
MODEL_PAIR[40]=p17
PAIR[40]=40
MODEL[41]=${region}arw
MODEL_PAIR[41]=p18
PAIR[41]=41
MODEL[42]=${region}arw
MODEL_PAIR[42]=p19
PAIR[42]=42
MODEL[43]=${region}arw
MODEL_PAIR[43]=p20
PAIR[43]=43
MODEL[44]=${region}arw
MODEL_PAIR[44]=p21
PAIR[44]=44

ENDHOUR=48
TOTMBR=44

typeset -Z2 HR
HR=00

if [ $region = west -o $region = east ]
then
HRLIST="00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 39 42 45 48"
else
HRLIST="00 03 06 09 12 15 18 21 24 27 30 33 36 39 42 45 48"
fi

for HR in $HRLIST
do

if [ ${HR}%3 -eq 0 ]
then
freq="3hrly"
else
freq="1hrly"
fi

NENS=0                               #total number of available members counted
nf=1

while [ $nf -le $TOTMBR ]            #loop for all members
do

	if [ $HR -eq 0 ]
        then
        while [ ! -s $COMIN/${MODEL[$nf]}.t${cyc}z.${MODEL_PAIR[$nf]}.f${HR} ] # needed file is ready?
       	  do
	  sleep 10
        done
        fi

	if [ $HR -ne 0 ]
        then
        while [ ! -s $COMIN/${MODEL[$nf]}.t${cyc}z.${MODEL_PAIR[$nf]}.f${HR}_pcp ] # needed file is ready?
       	  do
	  sleep 10
        done
	fi

    echo ${MODEL[$nf]} ${MODEL_PAIR[$nf]} " done"  

      ln -s $COMIN/${MODEL[$nf]}.t${cyc}z.${MODEL_PAIR[$nf]}.f$HR r_gribawips.${PAIR[$nf]}.f$HR
      ln -s $COMIN/${MODEL[$nf]}.t${cyc}z.${MODEL_PAIR[$nf]}.f${HR}_pcp r_gribawips.${PAIR[$nf]}.f${HR}_pcp

      member[$nf]=1
      NENS=`expr $NENS + 1`
  nf=`expr $nf + 1`

done

echo $NENS $grid $KM $ENDHOUR $INCHOUR > filename

if [ $freq = "3hrly" ]; then
echo $NENS $grid $KM 01 03 > filename
echo $HR >> filename
fi
if [ $freq = "1hrly" ]; then
echo $NENS $grid $KM 01 01 > filename
echo $HR >> filename
fi


nf=1
while [ $nf -le $TOTMBR ]
do
 if [ ${member[$nf]} -eq 1 ] ; then
   echo r_gribawips.${PAIR[$nf]} "  "  ${MODEL[$nf]}  "   -> " ${MODEL[$nf]}.t${cyc}z.${MODEL_PAIR[$nf]} >> filename
 fi
 nf=`expr $nf + 1`
done

###############################################
# Part II: decode, calculate and write to grib 
###############################################
cat <<paramEOF >input
 &namin
   iyr=${yy},imon=${mm},idy=${dd},ihr=${cyc},fhr=${HR}
 &end
paramEOF

ln -sf $PARMhiresw/hiresw_product_variable.tbl.${freq} variable.tbl

$EXEChiresw/hiresw_ens_gen < input 1>output.f${HR} 2>errfile.f${HR}

###################################################
# Part III: output grib data with proper file names
###################################################
CNVGRIB=/nwprod/util/exec/cnvgrib
WGRIB2=/nwprod/util/exec/wgrib2

# send grib1 data to /com

if [ $SENDCOM = YES ]; then

mkdir -p $COMOUT    # shouldnt be needed, but J job was having trouble creating

 mv mean.${fileID}.f$HR       $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR
 mv spread.${fileID}.f$HR     $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR
 mv prob.${fileID}.f$HR       $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR
fi

# convert grib1 to grib2
if [ $SENDGB2 = YES ]; then
$CNVGRIB -g12 -p40 -nv $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR   $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR.grib2
$CNVGRIB -g12 -p40 -nv $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR.grib2
$CNVGRIB -g12 -p40 -nv $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR   $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR.grib2
$WGRIB2 $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR.grib2 -s >   $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR.grib2.idx
$WGRIB2 $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR.grib2 -s > $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR.grib2.idx
$WGRIB2 $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR.grib2 -s >   $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR.grib2.idx
fi

# Make an upper case version of the ${RUN} variable for the alert
export DBN_NEST=`echo ${RUN} | tr '[a-z]' '[A-Z]'`

if [ $SENDDBN == "YES" ]
then
  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_MEAN_GB2 $job $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR.grib2
  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_MEAN_GB2_WIDX $job $COMOUT/${region}.t${cyc}z.pgrb.mean.f$HR.grib2.idx

  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_SPREAD_GB2 $job $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR.grib2
  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_SPREAD_GB2_WIDX $job $COMOUT/${region}.t${cyc}z.pgrb.spread.f$HR.grib2.idx
  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_PROB_GB2 $job $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR.grib2
  $DBNROOT/bin/dbn_alert MODEL HIRESW_ENS_PROB_GB2_WIDX $job $COMOUT/${region}.t${cyc}z.pgrb.prob.f$HR.grib2.idx

fi

datestr=`date`
echo DONE TIME LOOP at $datestr
done   # ending while from top

# delete the raw core specific files

#rm $COMIN/${region}arw*
#rm $COMIN/${region}nmm*

exit
