#!/bin/sh
################################################################################
####  UNIX Script Documentation Block
#                      .                                             .
# Script name:         exglobal_enkfpos.sh.sms
# Script description:  global_enkf forecast post processing
#
# Author:        Russ Treadon       Org: NP23         Date: 2011-12-16
#
# Abstract: This script runs the global_enkf forecast post processing
#
# Script history log:
# 2011-12-16  Russ Treadon   based on GCWMB parallel script epos.sh
#
# Usage:  exglobal_enkfpos.sh.sms
#
#   Input script positional parameters:
#                   defaults to $IGEN, then to 0
#
#   Imported Shell Variables:
#     FIXGLOBAL     Directory for global fixed files
#                   defaults to /nwprod/fix
#     EXECGLOBAL    Directory for global executables
#                   defaults to /nwprod/exec
#     USHGLOBAL     Directory for global scripts
#                   defaults to /nwprod/ush
#     DATA          working directory
#                   (if nonexistent will be made, used and deleted)
#                   defaults to current working directory
#     COMIN         input directory
#                   defaults to current working directory
#     COMOUT        output directory
#                   (if nonexistent will be made)
#                   defaults to current working directory
#     XC            Suffix to add to executables
#                   defaults to none
#     NCP           Copy command
#                   defaults to cp
#     GETATMENSMEANEXEC   Compute ensemble mean sigma (optonally smoothed)
#                   defaults to ${EXECGLOBAL}/getsigensmean_smooth$XC
#     GETSFCENSMEANEXEC   Compute ensemble mean surface file
#                   defaults to ${EXECGLOBAL}/getsfcensmean_smooth$XC
#     HYBENSMOOTH   Input level dependent smoothing paramters for sigma file
#                   defaults to ${FIXGLOBAL}/global_hybens_smoothinfo.l${LEVS}.txt
#     INISCRIPT     Preprocessing script
#                   defaults to none
#     LOGSCRIPT     Log posting script
#                   defaults to none
#     ERRSCRIPT     Error processing script
#                   defaults to 'eval [[ $err = 0 ]]'
#     ENDSCRIPT     Postprocessing script
#                   defaults to none
#     LEVS          Number of levels
#                   defaults to 64
#     CDATE         Current analysis date in yyyymmddhh format
#                   defaults to the value in the input surface file header
#     NTHREADS      Number of threads
#                   defaults to 1
#     NTHSTACK      Size of stack per thread
#                   defaults to 1024000000
#     FILESTYLE     File management style flag
#                   ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA,
#                    'X' to use XLFUNIT or symbolic links where appropriate)
#                   defaults to 'X'
#     PGMOUT        Executable standard output
#                   defaults to $pgmout, then to '&1'
#     PGMERR        Executable standard error
#                   defaults to $pgmerr, then to '&1'
#     pgmout        Executable standard output default
#     pgmerr        Executable standard error default
#     REDOUT        standard output redirect ('1>' or '1>>')
#                   defaults to '1>', or to '1>>' to append if $PGMOUT is a file
#     REDERR        standard error redirect ('2>' or '2>>')
#                   defaults to '2>', or to '2>>' to append if $PGMERR is a file
#     VERBOSE       Verbose flag (YES or NO)
#                   defaults to NO
#
#   Exported Shell Variables:
#     PGM           Current program name
#     pgm
#     ERR           Last return code
#     err
#
#   Modules and files referenced:
#     scripts    : $INISCRIPT
#                  $LOGSCRIPT
#                  $ERRSCRIPT
#                  $ENDSCRIPT
#
#     programs   : $GETATMENSMEANEXEC
#                  $GETATMENSMEANEXEC
#
#     fixed data : $HYBENSMOOTH
#
#     input data : 
#
#     output data: 
#
# Remarks:
#
#   Condition codes
#      0 - no problem encountered
#     >0 - some problem encountered
#
#  Control variable resolution priority
#    1 Command line argument.
#    2 Environment variable.
#    3 Inline default.
#
# Attributes:
#   Language: POSIX shell
#   Machine: IBM SP
#
################################################################################
#  Set environment.
export VERBOSE=${VERBOSE:-"NO"}
if [[ "$VERBOSE" = "YES" ]]
then
   echo $(date) EXECUTING $0 $* >&2
   set -x
fi
#  Command line arguments.
# none
#  Directories.
export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix}
export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec}
export USHGLOBAL=${USHGLOBAL:-/nwprod/ush}
export utilscript=${utilscript:-/nwprod/util/ush}
export DATA=${DATA:-$(pwd)}
export COMIN=${COMIN:-$(pwd)}
export COMOUT=${COMOUT:-$(pwd)}
#  Filenames.
export XC=${XC:-".x"}
export LEVS=${LEVS:-64}
export INISCRIPT=${INISCRIPT}
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT}
export ENDSCRIPT=${ENDSCRIPT}
export HYBENSMOOTH=${HYBENSMOOTH:-$FIXGLOBAL/global_hybens_smoothinfo.l${LEVS}.txt}
#  I/O filenames.
export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)}
export SIGENS_IN=${SIGENS_IN:-$COMIN/sfg_${CDATE}_fhr}
export SFCENS=${SFCENS:-$COMIN/bfg_${CDATE}_fhr}
export ENSSTAT=${ENSSTAT:-$COMOUT/ensstat_${CDATE}_all}
export SIGENSMEAN=${SIGENSMEAN:-$COMOUT/sfg_${CDATE}_fhr}
export SFCENSMEAN=${SFCENSMEAN:-$COMOUT/bfg_${CDATE}_fhr}
export SIGENS_OUT=${SIGENS_OUT:-${COMOUT}/sfg_${CDATE}_fhr}
#  Executables.
export GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$EXECGLOBAL/getsigensmean_smooth$XC}
export GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$EXECGLOBAL/getsfcensmean_smooth$XC}
#  Other variables.
export FHOUTEFCS=${FHOUTEFCS:-3}
export FHMINEFCS=${FHMINEFCS:-3}
export FHMAXEFCS=${FHMAXEFCS:-9}
export NMEM_ENKF=${NMEM_ENKF:-80}
export POE_OPTS=${POE_OPTS:-"-pgmmodel mpmd -ilevel 2 -labelio yes  -stdoutmode ordered"}
export NTHREADS=${NTHREADS:-1}
export NTHSTACK=${NTHSTACK:-1024000000}
export FILESTYLE=${FILESTYLE:-'X'}
export PGMOUT=${PGMOUT:-${pgmout:-'&1'}}
export PGMERR=${PGMERR:-${pgmerr:-'&2'}}
export NCP=${NCP:-cp}
typeset -L1 l=$PGMOUT
[[ $l = '&' ]]&&a=''||a='>'
export REDOUT=${REDOUT:-'1>'$a}
typeset -L1 l=$PGMERR
[[ $l = '&' ]]&&a=''||a='>'
export REDERR=${REDERR:-'2>'$a}

################################################################################
#  Preprocessing
$INISCRIPT
pwd=$(pwd)
if [[ -d $DATA ]]
then
   mkdata=NO
else
   mkdir -p $DATA
   mkdata=YES
fi
cd $DATA||exit 99


################################################################################
#  Copy or link files
export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK"
$LOGSCRIPT

rm getsigensmean_smooth.x getsfcensmean_smooth.x hybens_smoothinfo
rm sfg*fhr03* sfg*f06* sfg*f09*
rm bfg*fhr03* bfg*f06* bfg*f09*


$NCP $GETSFCENSMEANEXEC $DATA
$NCP $GETATMENSMEANEXEC $DATA

if [[ $FILESTYLE = 'C' ]]
then
   # Forecast fields

   FHOUT=$FHOUTEFCS
   FHMIN=$FHMINEFCS
   FHMAX=$FHMAXEFCS
   imem=1
   while [[ $imem -le $NMEM_ENKF ]]; do
      member="_mem"`printf %03i $imem`
      FHBEG=$FHMIN
      FHEND=$FHMAX
      FH=$FHBEG
      until [[ $FH -gt $FHEND ]];do
         [[ $FH -lt 10 ]]&&FH=0$FH
         $NCP ${SFCENS}${FH}${member} bfg_${CDATE}_fhr${FH}$member
         $NCP ${SIGENS_IN}${FH}${member} sfg_${CDATE}_fhr${FH}$member
         FH=`expr $FH + $FHOUT`
      done
      (( imem = $imem + 1 ))
   done

else
   # Forecast fields
   FHOUT=$FHOUTEFCS
   FHMIN=$FHMINEFCS
   FHMAX=$FHMAXEFCS

   imem=1
   while [[ $imem -le $NMEM_ENKF ]]; do
      member="_mem"`printf %03i $imem`
      FHBEG=$FHMIN
      FHEND=$FHMAX
      FH=$FHBEG
      until [[ $FH -gt $FHEND ]];do
         [[ $FH -lt 10 ]]&&FH=0$FH
         ln -fs ${SFCENS}${FH}${member} bfg_${CDATE}_fhr${FH}$member
         ln -fs ${SIGENS_IN}${FH}${member} sfg_${CDATE}_fhr${FH}$member
         FH=`expr $FH + $FHOUT`
      done
      (( imem = $imem + 1 ))
   done

   # Output files

fi

################################################################################
# Set output data
ENSSTAT=$COMOUT/ensstat_${CDATE}_all
rm -f $ENSSTAT


################################################################################
# Generate ensemble mean surface and atmospheric files
analdate=$CDATE
datapath=.
FHBEG=$FHMIN
FHEND=$FHMAX
FH=$FHBEG

cp $HYBENSMOOTH ./hybens_smoothinfo

  nprocs=$(echo $LOADL_PROCESSOR_LIST|wc -w)
  >cmd
   cmd[0]="$GETSFCENSMEANEXEC ${datapath}/  bfg_${analdate}_fhr03_ensmean bfg_${analdate}_fhr03 $NMEM_ENKF"
   cmd[1]="$GETSFCENSMEANEXEC ${datapath}/  bfg_${analdate}_fhr06_ensmean bfg_${analdate}_fhr06 $NMEM_ENKF"
   cmd[2]="$GETSFCENSMEANEXEC ${datapath}/  bfg_${analdate}_fhr09_ensmean bfg_${analdate}_fhr09 $NMEM_ENKF"
   cmd[3]="$GETATMENSMEANEXEC ${datapath}/ sfg_${analdate}_fhr03_ensmean sfg_${analdate}_fhr03 $NMEM_ENKF"
   cmd[4]="$GETATMENSMEANEXEC ${datapath}/ sfg_${analdate}_fhr06_ensmean sfg_${analdate}_fhr06 $NMEM_ENKF"
   cmd[5]="$GETATMENSMEANEXEC ${datapath}/ sfg_${analdate}_fhr09_ensmean sfg_${analdate}_fhr09 $NMEM_ENKF"
   m=-1
   n=-1
   while [ $((n+=1)) -le $nprocs ] ;do
      while [ $((m+=1)) -le 5 ] ;do
         eval echo ${cmd[m]} | tee -a cmd
         ((n+=1))
      done
     echo "echo do-nothing" >>cmd
   done


/usr/bin/poe -cmdfile cmd $POE_OPTS
rc=$?

export ERR=$rc
export err=$ERR
$ERRSCRIPT||exit 2

################################################################################
# If no smoothing, copy smoothed ensemble atmospheric files
if [[ ! -s sfg_${CDATE}_fhr06s_mem001 ]]; then
  imem=1
  while [[ $imem -le $NMEM_ENKF ]]; do
     member="_mem"`printf %03i $imem`
     FHBEG=$FHMIN
     FHEND=$FHMAX
     FH=$FHBEG
     until [[ $FH -gt $FHEND ]];do
        [[ $FH -lt 10 ]]&&FH=0$FH
        cp sfg_${CDATE}_fhr${FH}$member sfg_${CDATE}_fhr${FH}s$member
        FH=`expr $FH + $FHOUT`
     done
     (( imem = $imem + 1 ))
  done
fi

################################################################################
# Copy output files

FHBEG=$FHMIN
FHEND=$FHMAX
FH=$FHBEG
until [[ $FH -gt $FHEND ]];do
   [[ $FH -lt 10 ]]&&FH=0$FH
   cp sfg_${CDATE}_fhr${FH}_ensmean ${SIGENSMEAN}${FH}_ensmean
   cp bfg_${CDATE}_fhr${FH}_ensmean ${SFCENSMEAN}${FH}_ensmean
   FH=`expr $FH + $FHOUT`
done

imem=1
while [[ $imem -le $NMEM_ENKF ]]; do
   member="_mem"`printf %03i $imem`
   FHBEG=$FHMIN
   FHEND=$FHMAX
   FH=$FHBEG
   until [[ $FH -gt $FHEND ]];do
      [[ $FH -lt 10 ]]&&FH=0$FH
      cp sfg_${CDATE}_fhr${FH}s$member ${SIGENS_OUT}${FH}s${member}
      FH=`expr $FH + $FHOUT`
   done
   (( imem = $imem + 1 ))
done


################################################################################
# Generate status log
rm log_allsfc
rm log_allatm

FHBEG=$FHMIN
FHEND=$FHMAX
FH=$FHBEG
until [[ $FH -gt $FHEND ]];do
  [[ $FH -lt 10 ]]&&FH=0$FH

  if [[ -s ${datapath}/bfg_${analdate}_fhr${FH}_ensmean ]]; then
     string="DONE bfg fhr $FH"
  else
     string="MISS bfg fhr $FH"
  fi
  rm log log_old log_new
  cp log_allsfc ./log_old
  echo $string > log
  cat log_old log > log_new
  cp log_new log_allsfc

  if [[ -s ${datapath}/sfg_${analdate}_fhr${FH}_ensmean ]]; then
     string="DONE sfg fhr $FH"
  else
     string="MISS sfg fhr $FH"
  fi
  rm log log_old log_new
  cp log_allatm ./log_old
  echo $string > log
  cat log_old log > log_new
  cp log_new log_allatm

  FH=`expr $FH + $FHOUT`
done

rm log_all
cat log_allsfc log_allatm > log_all
cp log_all $ENSSTAT

if [ $SENDDBN = YES ] ; then
imem=1
while [[ $imem -le $NMEM_ENKF ]]; do
   member="_mem"`printf %03i $imem`
   #FHBEG=$FHMIN
   FHEND=$FHMAX
   FH=6
   until [[ $FH -gt $FHEND ]];do
      [[ $FH -lt 10 ]]&&FH=0$FH
      $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job ${SIGENS_OUT}${FH}s${member}
      FH=`expr $FH + $FHOUT`
   done
   (( imem = $imem + 1 ))
done
fi

################################################################################
#  Postprocessing
cd $pwd
[[ $mkdata = YES ]]&&rmdir $DATA
$ENDSCRIPT
set +x
if [[ "$VERBOSE" = "YES" ]]
then
   echo $(date) EXITING $0 with return code $err >&2
fi
exit $err
