#!/bin/sh
#######################################################################
#  Purpose: To extract multiple parameters from the ECMWF deterministic 
#           model output GRIB file for one projection and interpolate 
#           the parameters to MDL's fine grid. Uses wgrib and copygb
#           utilities.
#
#     Dave Rudack:  August 8, 2013 - Adopted from GFS Prep Scripts that
#                                    were transitioned to WCOSS (Linux).
#  Scott Scallion:  Sept.  9, 2016 - Added error checking to grib 
#                                    utilities.
#  Scott Scallion:  Sept.  5, 2024 - Modifications to accommodate 
#                                    imbedded grib2 within model files.
#######################################################################

cd $DATA

########################################
set -x
msg="Begin job for $job"
postmsg "$jlogfile" "$msg"
########################################

echo MDLLOG: `date` - Begin execmmos_prep.sh.ecf 47km

Ref_date=`echo $PDY | cut -c 5-8`$cyc
PDYcycz=$PDY$cyc

grib2_found='n'
grib2_count=0

#######################################################################
# LOOP THROUGH PROJECTIONS (0 to 96 hours at 6-hour intervals)
#######################################################################
for tau in $(seq -f "%02g" 0 6 96)
do
#######################################################################
#     CALCULATE THE VALID DATA AND TIME OF THE PARTICULAR PROJECTION
#     BEING PROCESSED.
#######################################################################

   Valid_date=`$NDATE +${tau} ${PDYcycz}`
   Valid_time=`echo $Valid_date | cut -c5-10`

   grid47=`cat $FIXmdl/mdl_finegds47.grib1`
   g1=$DCOMIN/DCD${Ref_date}00${Valid_time}00${ECMWF_FILE_EXT}

   # CREATE SEPARATE FILES FOR GRIB1 AND GRIB2 PROCESSING
   $WGRIB $g1 -d all -grib -o grib1_only.grib 2>errfile
   export err=$?; err_chk
   if [[ $process_grib2 == 'YES' ]]; then
      $WGRIB2 $g1 -grib_out grib2_only.grib2 2>errfile
      export err=$?; err_chk
      if [[ -s grib2_only.grib2 ]]; then
         grib2_found='y'
         grib2_count=$((grib2_count + 1))
      fi
   fi

   ################################################################################
   # FIRST GO THROUGH GRIB1
   ################################################################################
   $WGRIB grib1_only.grib > wgrib.out
   export err=$?; err_chk

   export pgm=copygb

   . prep_step
   startmsg
   grep -f $FIXmdl/mdl_ecmwf_xprecip_wgrib wgrib.out |\
      $COPYGB -a -N $FIXmdl/mdl_namelist -kw -g"$grid47" -i0 -x grib1_only.grib \
      mdl_ecmwf.${cyc}z.pgrb1.f${tau} >> $pgmout 2>errfile
   export err=$?; err_chk

   # Run copygb on the precipitation fields.

   . prep_step
   startmsg
   grep -f $FIXmdl/mdl_ecmwf_precip_wgrib wgrib.out |\
      $COPYGB -a -N $FIXmdl/mdl_namelist -kw -g"$grid47" -i3 -x grib1_only.grib \
      mdl_ecmwf.${cyc}z.pgrb1.f${tau} >> $pgmout 2>errfile
   export err=$?; err_chk

   chgrp rstprod mdl_ecmwf.${cyc}z.pgrb1.f${tau}
   chmod 640 mdl_ecmwf.${cyc}z.pgrb1.f${tau}

   ################################################################################
   # NEXT GO THROUGH GRIB2
   ################################################################################
   if [[ $grib2_found == 'y' ]]; then
      $WGRIB2 grib2_only.grib2 > wgrib2.out
      export err=$?; err_chk

      grid47_gb2="nps:255.0000:60.0000 210.0000:297:47625.0000 2.8320:169:47625.0000"
      grep -f $FIXmdl/mdl_ecmwf_xprecip_wgrib2 wgrib2.out |\
         $WGRIB2 -i grib2_only.grib2 -new_grid_winds grid -new_grid_interpolation bilinear \
         -append -new_grid ${grid47_gb2} mdl_ecmwf.${cyc}z.pgrb2.f${tau} > $pgmout 2>errfile
      export err=$?; err_chk
   fi

   grib2_found='n'
done

###################################################################################
#  CAT ALL THE GRIB1 FILES SO THAT IT CAN BE TURNED INTO A TDLPACK SEQUENTIAL FILE.
###################################################################################

cat mdl_ecmwf.${cyc}z.pgrb1.f* >> mdl_xpcp+pcp.$cycle.pgrb
if [[ $process_grib2 == 'YES' && $grib2_count > 0 ]]; then
   cat mdl_ecmwf.${cyc}z.pgrb2.f* >> mdl_xpcp+pcp.$cycle.pgrb2
else
   export process_grib2='NO'
fi

#######################################################################
# GET INDICES AND INVENTORY
#######################################################################

$GRBINDEX mdl_xpcp+pcp.$cycle.pgrb mdl_xpcp+pcp.$cycle.pgrbi 2>errfile
export err=$?; err_chk
chgrp rstprod mdl_xpcp+pcp.$cycle.pgrb mdl_xpcp+pcp.$cycle.pgrbi
chmod 640 mdl_xpcp+pcp.$cycle.pgrb mdl_xpcp+pcp.$cycle.pgrbi
if [[ $process_grib2 == 'YES' ]]; then
   $GRB2INDEX mdl_xpcp+pcp.$cycle.pgrb2 mdl_xpcp+pcp.$cycle.pgrb2.index 2>errfile
   export err=$?; err_chk
   chgrp rstprod mdl_xpcp+pcp.$cycle.pgrb2 mdl_xpcp+pcp.$cycle.pgrb2.index
   chmod 640 mdl_xpcp+pcp.$cycle.pgrb2 mdl_xpcp+pcp.$cycle.pgrb2.index
fi

#######################################################################
# USING GRIBTOMDLPK TO CONVERT GRIB2 FILE INTO TDLPACK (DD=01).
#######################################################################

export pgm=mdl_gribtomdlpk
. prep_step
export FORT10="ncepdate"
export FORT20="mdl_xpcp+pcp.$cycle.pgrb"
export FORT21="mdl_xpcp+pcp.$cycle.pgrbi"
export FORT27="mdl_ecmpkd.$cycle.fromgrib1"
export FORT28="$FIXmdl/mdl_ecmprep47_grbtomdlp.lst"
export FORT29="$FIXmdl/mdl_gridlst"
export FORT30="$FIXmdl/mdl_mos2000id.tbl"
echo MDLLOG: `date` - Program mdl_gribtomdlpk has begun.
startmsg

$EXECmos_shared/mdl_gribtomdlpk < $PARMmdl/mdl_gribtomdlpk.cn >> $pgmout 2>errfile
export err=$?; err_chk

#######################################################################
# USING GRIB2TOMDLPK TO CONVERT GRIB2 FILE INTO TDLPACK (DD=01).
#######################################################################
if [[ $process_grib2 == 'YES' ]]; then
   export pgm=mdl_grb2tomdlp
   . prep_step
   export FORT10="ncepdate"
   export FORT20="mdl_xpcp+pcp.$cycle.pgrb2"
   export FORT21="mdl_xpcp+pcp.$cycle.pgrb2.index"
   export FORT28="$FIXmdl/mdl_ecmprep47_grb2tomdlp.lst"
   export FORT29="$FIXmdl/mdl_gridlst"
   export FORT30="$FIXmdl/mdl_mos2000id.tbl"
   export FORT60="mdl_ecmpkd.$cycle.fromgrib2"
   echo MDLLOG:  `date` - Program mdl_grb2tomdlp has begun
   startmsg

   $EXECmos_shared/mdl_grb2tomdlp < $PARMmdl/mdl_grb2tomdlp.cn >> $pgmout 2>errfile
   export err=$?; err_chk
   # CREATE THE MODEL ARCHIVE FILE FROM GRIB1 AND GRIB2
   cat mdl_ecmpkd.$cycle.fromgrib1 mdl_ecmpkd.$cycle.fromgrib2 > mdl_ecmpkd.$cycle
else
   # CREATE THE MODEL ARCHIVE FILE FROM GRIB1 ONLY
   cat mdl_ecmpkd.$cycle.fromgrib1 > mdl_ecmpkd.$cycle
fi

chgrp rstprod mdl_ecmpkd.$cycle
chmod 640 mdl_ecmpkd.$cycle
#######################################################################
# COPY FILES TO COM
#######################################################################

if test $SENDCOM = 'YES'
then
  cpreq --preserve=mode,ownership mdl_ecmpkd.$cycle $COMOUT/mdl_ecmpkd.$cycle
  cpreq --preserve=mode,ownership mdl_xpcp+pcp.$cycle.pgrb $COMOUT
  cpreq --preserve=mode,ownership mdl_xpcp+pcp.$cycle.pgrbi $COMOUT
  if [[ $process_grib2 == 'YES' ]]; then
     cpreq --preserve=mode,ownership mdl_xpcp+pcp.$cycle.pgrb2 $COMOUT
     cpreq --preserve=mode,ownership mdl_xpcp+pcp.$cycle.pgrb2.index $COMOUT
  fi
fi

#####################################################################
# GOOD RUN
set +x
echo "************** $job COMPLETED NORMALLY ON THE IBM WCOSS"
set -x
#####################################################################

msg="HAS COMPLETED NORMALLY!"
postmsg "$jlogfile" "$msg"
echo MDLLOG: `date` - Job execmmos_prep.sh.ecf 47km has ended.

#######################################################################
