#!/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. 22, 2016 - Only loop through available 
#                                    projections passed from J-Job.
#      Mike Baker:  Sept.  6, 2024 - Modifications to accommodate
#                                    embedded grib2 in model files.
#######################################################################

cd $DATA

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

echo MDLLOG: `date` - Begin execmmos_extprep23.sh.ecf

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

grib2_found='n'
grib2_count=0

#######################################################################
# LOOP THROUGH PROJECTIONS (99 to 144 at 3-hour intervals and 150 to 240 at 6-hour intervals)
#######################################################################
for tau in $foundproj
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`

   grid=`cat $FIXmdl/mdl_finegds23.grib1`
   if [ "$tau" != "00" ]; then
      g1=$DCOMIN/U1D${Ref_date}00${Valid_time}00${ECMWF_FILE_EXT}
   else
      g1=$DCOMIN/U1D${Ref_date}00${Valid_time}01${ECMWF_FILE_EXT}
   fi

   # 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_check.grib2 2>errfile
      if [[ -s grib2_only_check.grib2 && $? -eq 0 ]]; then
         $WGRIB2 grib2_only_check.grib2 > wgrib2_all.out
         grep -f $FIXmdl/mdl_ecmwf_xprecip_wgrib2 wgrib2_all.out |\
            $WGRIB2 -i grib2_only_check.grib2 -grib_out grib2_only.grib2 2>errfile
         if [[ -s grib2_only.grib2  && $? -eq 0  ]]; then
            grib2_found='y'
            grib2_count=$((grib2_count + 1))
         fi
      fi
   fi

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

   export pgm=copygb
   if [ "$tau" != "00" ]; then
      . prep_step
      startmsg
      grep -f $FIXmdl/mdl_ecmwf_xprecip_wgrib wgrib.out |\
         $COPYGB -a -N $FIXmdl/mdl_namelist -kw -g"$grid" -i0 -x grib1_only.grib \
         mdl_ecmwf.${cyc}z.pgrb1.f${tau} >> $pgmout 2>errfile
      export err=$?; err_chk
   else
      . prep_step
      startmsg
      grep -f $FIXmdl/mdl_ecmwf_xprecip_analysis_wgrib wgrib.out |\
         $COPYGB -a -N $FIXmdl/mdl_namelist -kw -g"$grid" -i0 -x grib1_only.grib \
         mdl_ecmwf.${cyc}z.pgrb1.f${tau} >> $pgmout 2>errfile
      export err=$?; err_chk
   fi

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

   # Run copygb on the precipitation fields.

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

   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

      grid_gb2="nps:255.0000:60.0000 210.0000:593:23813.0000 2.8320:337:23813.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 ${grid_gb2} mdl_ecmwf.${cyc}z.pgrb2.f${tau} > $pgmout 2>errfile
      export err=$?; err_chk

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

   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+pcpx.$cycle.pgrb
if [[ $process_grib2 == 'YES'  && $grib2_count > 0 ]]; then
   cat mdl_ecmwf.${cyc}z.pgrb2.f* >> mdl_xpcp+pcpx.$cycle.pgrb2
else
   export process_grib2='NO'
fi

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

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

#######################################################################
# USING GRIBTOMDLPK TO CONVERT GRIB FILE INTO TDLPACK.
#######################################################################

export pgm=mdl_gribtomdlpk
. prep_step
export FORT10="ncepdate"
export FORT20="mdl_xpcp+pcpx.$cycle.pgrb"
export FORT21="mdl_xpcp+pcpx.$cycle.pgrbi"
export FORT27="mdl_ecmxpkd23.$cycle.fromgrib1"
export FORT28="$FIXmdl/mdl_ecmxprep23_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

chgrp rstprod mdl_ecmxpkd23.$cycle.fromgrib1
chmod 640 mdl_ecmxpkd23.$cycle.fromgrib1

#######################################################################
# 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+pcpx.$cycle.pgrb2"
   export FORT21="mdl_xpcp+pcpx.$cycle.pgrb2.index"
   export FORT28="$FIXmdl/mdl_ecmxprep23_grb2tomdlp.lst"
   export FORT29="$FIXmdl/mdl_gridlst"
   export FORT30="$FIXmdl/mdl_mos2000id.tbl"
   export FORT60="mdl_ecmxpkd23.$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

   chgrp rstprod mdl_ecmxpkd23.$cycle.fromgrib2
   chmod 640 mdl_ecmxpkd23.$cycle.fromgrib2
   # CREATE THE MODEL ARCHIVE FILE
   cat mdl_ecmxpkd23.$cycle.fromgrib1 mdl_ecmxpkd23.$cycle.fromgrib2 > mdl_ecmxpkd23.$cycle
else
   # CREATE THE MODEL ARCHIVE FILE
   cat mdl_ecmxpkd23.$cycle.fromgrib1 > mdl_ecmxpkd23.$cycle
fi

chgrp rstprod mdl_ecmxpkd23.$cycle
chmod 640 mdl_ecmxpkd23.$cycle

#######################################################################
# COPY FILES TO COM
#######################################################################

if test $SENDCOM = 'YES'
then
  cpreq --preserve=mode,ownership mdl_ecmxpkd23.$cycle $COMOUT/mdl_ecmxpkd23.$cycle
  cpreq --preserve=mode,ownership mdl_xpcp+pcpx.$cycle.pgrb $COMOUT/mdl_xpcp+pcpx_23km.$cycle.pgrb
  cpreq --preserve=mode,ownership mdl_xpcp+pcpx.$cycle.pgrbi $COMOUT/mdl_xpcp+pcpx_23km.$cycle.pgrbi
  if [[ $process_grib2 == 'YES' ]]; then
    cpreq --preserve=mode,ownership mdl_xpcp+pcpx.$cycle.pgrb2 $COMOUT/mdl_xpcp+pcpx_23km.$cycle.pgrb2
    cpreq --preserve=mode,ownership mdl_xpcp+pcpx.$cycle.pgrb2.index $COMOUT/mdl_xpcp+pcpx23km.$cycle.pgrb2.index
  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_extprep23.sh.ecf has ended.

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