#!/bin/sh
###############################################################################
#                                                                             #
# This script is the product generator ("graphics job")  for the multi-grid   #
# MWW3 wave model.                                                            #
#                                                                             #
# Remarks :                                                                   #
# - Supplemental error output is witten to the wave.log file.                 #
#                                                                             #
#                                                                             #
# Origination  : 05/02/2007                                                   #
# Last update  : 05/04/2007                                                   # 
#                                                                             #
###############################################################################
# --------------------------------------------------------------------------- #
# 0.  Preparations
# 0.a Basic modes of operation
  set -xa
  # Use LOUD variable to turn on/off trace.  Defaults to YES (on).
  export LOUD=${LOUD:-YES}; [[ $LOUD = yes ]] && export LOUD=YES
  [[ "$LOUD" != YES ]] && set +x

  cd $DATA

  postmsg "$jlogfile" "HAS BEGUN on `hostname`"

  msg="Starting MWW3 PRODUCTS SCRIPT"
  postmsg "$jlogfile" "$msg"

  grids='glo_30m at_10m wc_10m ep_10m ak_10m at_4m wc_4m ak_4m'
  awipsgrib='no'
  awipsbull='yes'

# 0.b Date and time stuff

  export date=$PDY
  export YMDH=${PDY}${cyc}

  set +x
  echo ' '
  echo '                         ****************************'
  echo '                         *** MWW3 PRODUCTS SCRIPT ***'
  echo '                         ****************************'
  echo "                                       $date $cycle"
  echo ' '
  echo "Starting at : `date`"
  echo ' '
  echo "   AWIPS grib fields : $awipsgrib"
  echo "   AWIPS bulletins   : $awipsbull"
  echo "   Wave  Grids       : $grids"
  echo ' '
  [[ "$LOUD" = YES ]] && set -x

# --------------------------------------------------------------------------- #
# 1.  Get necessary files

  set +x
  echo ' '
  echo 'Preparing input files :'
  echo '-----------------------'
  [[ "$LOUD" = YES ]] && set -x

# 1.a Grib file (AWIPS and FAX charts)

  if [ "$awipsgrib" = 'yes' ]
  then
    for grdID in $grids
    do
      if [ ! -f gribfile.$grdID ]
      then
        set +x
        echo "   Copying $modID.$grdID.$cycle.grib2 from $COMIN"
        [[ "$LOUD" = YES ]] && set -x
        cp $COMIN/$modID.$grdID.$cycle.grib2 gribfile.$grdID
      fi

      if [ -f gribfile.$grdID ]
      then
        set +x
        echo "   gribfile.$grdID exists."
        [[ "$LOUD" = YES ]] && set -x
      else
        msg="ABNORMAL EXIT: NO GRIB FILE FOR GRID $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '**************************** '
        echo '*** ERROR : NO GRIB FILE *** '
        echo '**************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : GRIB file missing." >> $wavelog
        awipsgrib='no'
        err=1;export err;err_chk
      fi

      if [ ! -f gribfile_wstp.$grdID ]
      then
        set +x
        echo "   Copying $modID.wstp.$grdID.$cycle.grib2 from $COMIN"
        [[ "$LOUD" = YES ]] && set -x
        cp $COMIN/$modID.wstp.$grdID.$cycle.grib2 gribfile_wstp.$grdID
      fi

      if [ -f gribfile_wstp.$grdID ]
      then
        set +x
        echo "   gribfile_wstp.$grdID exists."
        [[ "$LOUD" = YES ]] && set -x
      else
        msg="ABNORMAL EXIT: NO WSTP GRIB FILE FOR GRID $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '********************************* '
        echo '*** ERROR : NO WSTP GRIB FILE *** '
        echo '********************************* '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : WSTP GRIB file missing." >> $wavelog
        awipsgrib='no'
        err=1;export err;err_chk
      fi

    done

  fi

# 1.b Bulletin files ( AWIPS )

  if [ "$awipsbull" = 'yes' ]
  then

    set +x
    echo "   Copying bulletins from $COMIN"
    [[ "$LOUD" = YES ]] && set -x
    cp $COMIN/$modID.$cycle.cbull_tar cbull.tar

    if [ ! -f cbull.tar ]
    then
      msg="ABNORMAL EXIT: NO BULLETIN TAR FILE"
      postmsg "$jlogfile" "$msg"
      set +x
      echo ' '
      echo '************************************ '
      echo '*** ERROR : NO BULLETIN TAR FILE *** '
      echo '************************************ '
      echo ' '
      echo $msg
      [[ "$LOUD" = YES ]] && set -x
      echo "$modID prdgen $date $cycle : bulletin tar missing." >> $wavelog
      awipsbull='no'
      err=2;export err;err_chk
    fi

    set +x
    echo "   Untarring bulletins ..."
    [[ "$LOUD" = YES ]] && set -x
    tar -xf cbull.tar
    OK=$?

    if [ "$OK" = '0' ]
    then
      set +x
      echo "      Unpacking successfull ..."
      [[ "$LOUD" = YES ]] && set -x
      rm -f cbull.tar
    else
      msg="ABNORMAL EXIT: ERROR IN BULLETIN UNTAR"
      postmsg "$jlogfile" "$msg"
      set +x
      echo ' '
      echo '****************************************** '
      echo '*** ERROR : ERROR IN BULLETIN TAR FILE *** '
      echo '****************************************** '
      echo ' '
      echo $msg
      [[ "$LOUD" = YES ]] && set -x
      echo "$modID prdgen $date $cycle : bulletin untar error." >> $wavelog
      awipsbull='yes'
      err=3;export err;err_chk
    fi

# 1.c Output locations from bulletin files

    set +x
    echo ' Nb=`ls -1 *.cbull | wc -l`'
    Nb=`ls -1 *.cbull | wc -l`
    [[ "$LOUD" = YES ]] && set -x

# end of if statement from 1.b

  fi 

# 1.d Input template files

  if [ "$awipsgrib" = 'yes' ]
  then

    for grdID in $grids
    do

      if [ -f $PARMwave/grib2_awips_${modID}.$grdID ]
      then
        cp $PARMwave/grib2_awips_${modID}.$grdID awipsgrb.$grdID
      fi

      if [ -f awipsgrb.$grdID ]
      then
        set +x
        echo "   awipsgrb.$grdID copied."
        [[ "$LOUD" = YES ]] && set -x
      else
        msg="ABNORMAL EXIT: NO AWIPS GRIB HEADER DATA FILE FOR GRID $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '*************************************** '
        echo '*** ERROR : NO AWIPS GRIB DATA FILE *** '
        echo '*************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : GRIB template file missing." >> $wavelog
        err=7;export err;err_chk
        awipsgrib='no'
      fi
 
      if [ -f $PARMwave/grib2_awips_wstp_${modID}.$grdID ]
      then
        cp $PARMwave/grib2_awips_wstp_${modID}.$grdID awipsgrb_wstp.$grdID
      fi

      if [ -f awipsgrb_wstp.$grdID ]
      then
        set +x
        echo "   awipsgrb_wstp.$grdID copied."
        [[ "$LOUD" = YES ]] && set -x
      else
        msg="ABNORMAL EXIT: NO AWIPS WSTP GRIB HEADER DATA FILE FOR GRID $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '******************************************** '
        echo '*** ERROR : NO AWIPS WSTP GRIB DATA FILE *** '
        echo '******************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : WSTP GRIB template file missing." >> $wavelog
        err=7;export err;err_chk
        awipsgrib='no'
      fi

    done

  fi

  if [ "$awipsbull" = 'yes' ]
  then 
    if [ -f $PARMwave/bull_awp$modID ]
    then
      cp $PARMwave/bull_awp$modID awipsbull.data
    fi
  
    if [ -f awipsbull.data ]
    then
      set +x
      echo "   awipsbull.data copied."
      [[ "$LOUD" = YES ]] && set -x
    else
      msg="ABNORMAL EXIT: NO AWIPS BULLETIN HEADER DATA FILE"
      postmsg "$jlogfile" "$msg"
      set +x
      echo ' '
      echo '******************************************* '
      echo '*** ERROR : NO AWIPS BULLETIN DATA FILE *** '
      echo '******************************************* '
      echo ' '
      echo $msg
      [[ "$LOUD" = YES ]] && set -x
      echo "$modID prdgen $date $cycle : Bulletin header data file  missing." >> $wavelog
      err=7;export err;err_chk
    fi

  fi

# 1.d Data summary

  set +x
  echo ' '
  echo '   All data files accounted for.'
  echo ' '
  echo "                 AWIPSGRIB? : $awipsgrib"
  echo "                 AWIPSBULL? : $awipsbull"
  echo "   Number of bulletin files :   $Nb"
  echo '   --------------------------'
  echo ' '
  [[ "$LOUD" = YES ]] && set -x

# --------------------------------------------------------------------------- #
# 2.  AWIPS product generation
# 2.a AWIPS GRIB file with headers

  if [ "$awipsgrib" = 'yes' ]
  then

    for grdID in $grids
    do

      set +x
      echo ' '
      echo 'AWIPS headers to GRIB file ...'
      echo '------------------------------'

# 2.a.1 Set up for tocgrib2

      echo "   Do set up for tocgrib2."
      [[ "$LOUD" = YES ]] && set -x

      AWIPSGRB=awipsgrib.$grdID

# 2.a.2 Make GRIB index

      set +x
      echo "   Make GRIB index for tocgrib2."
      [[ "$LOUD" = YES ]] && set -x


      $utilexec/grb2index gribfile.$grdID gribindex.$grdID
      OK=$?

      if [ "$OK" != '0' ]
      then
        msg="ABNORMAL EXIT: ERROR IN grb2index MWW3 for grid $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '******************************************** '
        echo '*** FATAL ERROR : ERROR IN grb2index MWW3 *** '
        echo '******************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : error in grbindex." >> $wavelog
        err=20;export err;err_chk
      fi

# 2.a.3 Run AWIPS GRIB packing program tocgrib2

      set +x
      echo "   Run tocgrib2"
      [[ "$LOUD" = YES ]] && set -x

      export pgm=tocgrib2
      export pgmout=tocgrib2.out
      . prep_step

      export XLFUNIT_11="gribfile.$grdID"
      export XLFUNIT_31="gribindex.$grdID"
      export XLFUNIT_51="$AWIPSGRB.$grdID"

      $utilexec/tocgrib2 < awipsgrb.$grdID parm='KWBJ' > tocgrib2.out 2>&1
      OK=$?

      if [ "$OK" != '0' ]
      then
        cat tocgrib2.out
        msg="ABNORMAL EXIT: ERROR IN tocgrib2"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '*************************************** '
        echo '*** FATAL ERROR : ERROR IN tocgrib2 *** '
        echo '*************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID prdgen $date $cycle : error in tocgrib2." >> $wavelog
        err=21;export err;err_chk
      fi

# 2.a.4 Set up for tocgrib2 for wave steepness

      set +x
      echo "   Do set up for tocgrib2."
      [[ "$LOUD" = YES ]] && set -x

      AWIPSGRB_WSTP=awipsgrib_wstp.$grdID

# 2.a.5 Make WSTP GRIB index

      set +x
      echo "   Make WSTP GRIB index for tocgrib2."
      [[ "$LOUD" = YES ]] && set -x


      $utilexec/grb2index gribfile_wstp.$grdID gribindex_wstp.$grdID
      OK=$?

      if [ "$OK" != '0' ]
      then
        msg="ABNORMAL EXIT: ERROR IN grb2index MWW3 for grid $grdID"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '******************************************** '
        echo '*** FATAL ERROR : ERROR IN grb2index MWW3 *** '
        echo '******************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID $grdID prdgen $date $cycle : error in grbindex." >> $wavelog
        err=20;export err;err_chk
      fi

# 2.a.6 Run AWIPS GRIB packing program tocgrib2

      set +x
      echo "   Run tocgrib2"
      [[ "$LOUD" = YES ]] && set -x

      export pgm=tocgrib2
      export pgmout=tocgrib2.out
      . prep_step

      export XLFUNIT_11="gribfile_wstp.$grdID"
      export XLFUNIT_31="gribindex_wstp.$grdID"
      export XLFUNIT_51="$AWIPSGRB_WSTP.$grdID"

      $utilexec/tocgrib2 < awipsgrb_wstp.$grdID parm='KWBJ' > tocgrib2.out 2>&1
      OK=$?

      if [ "$OK" != '0' ]
      then
        cat tocgrib2.out
        msg="ABNORMAL EXIT: ERROR IN tocgrib2"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '*************************************** '
        echo '*** FATAL ERROR : ERROR IN tocgrib2 *** '
        echo '*************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID prdgen $date $cycle : error in tocgrib2." >> $wavelog
        err=21;export err;err_chk
      fi

# 2.a.7 Get the AWIPS grib bulletin out ...
 
      set +x
      echo "   Get awips GRIB bulletins out ..."
      [[ "$LOUD" = YES ]] && set -x

      if [ "$SENDCOM" = 'YES' ]
      then
        set +x
        echo "      Saving $AWIPSGRB.$grdID as grib2.$cycle.awipsww3_${grdID}"
        echo "          in $PCOM"
        [[ "$LOUD" = YES ]] && set -x
        cp $AWIPSGRB.$grdID $PCOM/grib2.$cycle.awipsww3_${grdID}
        set +x
        echo "      Saving $AWIPSGRB_WSTP.$grdID as grib2.wstp.$cycle.awipsww3_${grdID}"
        echo "          in $PCOM"
        [[ "$LOUD" = YES ]] && set -x
        cp $AWIPSGRB_WSTP.$grdID $PCOM/grib2.wstp.$cycle.awipsww3_${grdID}
      fi

      if [ "$SENDDBN_NTC" = 'YES' ]
      then
        echo "      Sending $AWIPSGRB.$grdID to DBNET."
        $DBNROOT/bin/dbn_alert GRIB_LOW $NET $job $PCOM/grib2.$cycle.awipsww3_${grdID}
        echo "      Sending $AWIPSGRB_WSTP.$grdID to DBNET."
        $DBNROOT/bin/dbn_alert GRIB_LOW $NET $job $PCOM/grib2.wstp.$cycle.awipsww3_${grdID}
      fi

      rm -f $AWIPSGRB.$grdID $AWIPSGRB_WSTP.$grdID tocgrib2.out

    done

  fi

# 2.b AWIPS bulletins for output points

  if [ "$awipsbull" = 'yes' ]
  then
      
    set +x
    echo ' '
    echo 'AWIPS bulletins ...'
    echo '-------------------'
    echo '   Sourcing data file with header info ...'

# 2.b.1 Set up environment variables

    [[ "$LOUD" = YES ]] && set -x
    . awipsbull.data

# 2.b.2 Generate list of bulletins to process

    set +x
    echo '   Generating buoy list ...'
  
    echo 'bulls=`sed -e 's/export b//g' -e 's/=/ /' awipsbull.data | awk '{ print $1}'`'
    bulls=`sed -e 's/export b//g' -e 's/=/ /' awipsbull.data | awk '{ print $1}'`
  
# 2.b.3 Looping over buoys running formbul
  
    set +x
    echo '   Looping over buoys ... \n'
  
    for bull in $bulls
    do
      bname="b$bull"
      fname="$modID.$bull.cbull"
      oname="awipsbull.$bull.$job"
      headr=`grep "b${bull}=" awipsbull.data | sed 's/=/ /g' |  awk '{ print $3}'`
  
      echo "      Processing $bull ($headr $oname) ..."
  
      if [ -z "$headr" ] || [ ! -s $fname ]
      then
        [[ "$LOUD" = YES ]] && set -x
        msg="ABNORMAL EXIT: MISSING BULLETING INFO"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '******************************************** '
        echo '*** FATAL ERROR : MISSING BULLETING INFO *** '
        echo '******************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID prdgen $date $cycle : Missing bulletin data." >> $wavelog
        err=22;export err;err_chk
      fi
  
      [[ "$LOUD" = YES ]] && set -x

      ${FORMBUL:-${utilscript}/formbul.pl} -d $headr -f $fname -j $job -m $modID \
           -p $PCOM -s NO -o $oname > formbul.out 2>&1
       set +x

      OK=$?

      if [ "$OK" != '0' ]
      then
        [[ "$LOUD" = YES ]] && set -x
        cat formbul.out
        msg="ABNORMAL EXIT: ERROR IN formbul"
        postmsg "$jlogfile" "$msg"
        set +x
        echo ' '
        echo '************************************** '
        echo '*** FATAL ERROR : ERROR IN formbul *** '
        echo '************************************** '
        echo ' '
        echo $msg
        [[ "$LOUD" = YES ]] && set -x
        echo "$modID prdgen $date $cycle : error in formbul." >> $wavelog
        err=23;export err;err_chk
      fi
        
      cat $oname >> awipsbull.$job
      rm -f formbul.out $oname

    done

    [[ "$LOUD" = YES ]] && set -x
    if [ $SENDCOM = "YES" ]
    then
      cp  awipsbull.$job $PCOM/awipsbull.$job
      if [ "$SENDDBN_NTC" = "YES" ]
      then
         ${MAKE_NTC_BULL:-${utilscript}/make_ntc_bull.pl}  WMOBH NONE KWBC NONE $DATA/awipsbull.$job $PCOM/awipsbull.$job
      else
        if [ ${envir} = "para" ] || [ ${envir} = "test" ] || [ ${envir} = "dev" ]
        then
           set +x
           echo "Making NTC bulletin for parallel environment, but do not alert."
           [[ "$LOUD" = YES ]] && set -x
           (export SENDDBN=NO; ${MAKE_NTC_BULL:-${utilscript}/make_ntc_bull.pl}  WMOBH NONE KWBC NONE $DATA/awipsbull.$job $PCOM/awipsbull.$job)
        fi
      fi
    fi

  fi

# --------------------------------------------------------------------------- #
# 5.  Clean up

  set +x; [[ "$LOUD" = YES ]] && set -v
  rm -f gribfile gribindex.* awipsgrb.* awipsbull.data
  rm -f $modID.*.cbull
  set +v

# --------------------------------------------------------------------------- #
# 6.  Ending output

  set +x
  echo ' '
  echo ' '
  echo "Ending at : `date`"
  echo ' '
  echo '                *** End of MWW3 product generation ***'
  echo ' '
  [[ "$LOUD" = YES ]] && set -x

  msg="$job completed normally"
  postmsg "$jlogfile" "$msg"

# End of MWW3 product generation script -------------------------------------- #
