#!/bin/sh
#
################################################################################
# This script runs the global land analysis.
# Usage: excfs_cdas_gldas.sh.sms
# Imported variables:
#   CDATE
#   CDUMP
# Configuration variables:
#   COMDIR
#   COMRS
#   COMROT
#   NCP
#   NDATE
#   PBEG
#   PERR
#   PEND
#------------------------------------------------------------------------------#
################################################################################
####  UNIX Script Documentation Block
#                      .                                             .
# Script name:         excfs_cdas_gldas.sh.sms
# Script description:  Runs global land analysis for CFSV2
#
# Authors:        Jesse Meng and Shrinivas Moorthi
#
# Abstract: This script assimilates CPC produced observed precipitation in Noah
#           land model using the Land Information System (LIS) package.
#   The initial conditions and run parameters are passed through environment variables.
#
#  Script history log :
#  Aug 2010   Shrinivas Moorthi - write the main script to be able to use both
#                                 in production and in CFSR
################################################################################
set -ux

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

export REALTIME=${REALTIME:-1}  # "1" for realtime run and "0" for reanalysis
export DATA=${DATA:-$(pwd)}
export PBEG=${PBEG:-""}
export PEND=${PEND:-""}
export PERR=${PERR:-""}

if [ ! -z $PBEG ]; then $PBEG ; fi

################################################################################
# Set other variables

export CDATE=${CDATE:-$PDY$cyc}
export CDUMP=${CDUMP:-gdas}
export gdas_cyc=${gdas_cyc:-4}

export NDATE=${NDATE:-/nwprod/util/exec/ndate}
export WGRIB=${WGRIB:-/nwprod/util/exec/wgrib}
export COPYGB=${COPYGB:-/nwprod/util/exec/copygb}
export GRBINDEX=${GRBINDEX:-/nwprod/util/exec/grbindex}
export HOMEcfs=${HOMEcfs:-/nwprod}
export USHcfs=${USHcfs:-$HOMEcfs/ush}
export cfss=${cfss:-"/cfs"}

export MP_SHARED_MEMORY=yes
export MP_LABELIO=yes
export MP_COREFILE_FORMAT=lite

export VERBOSE=YES
export GLDASCYCHR=${GLDASCYCHR:-24}
export GDATE=$($NDATE -$GLDASCYCHR $CDATE)
cycle=$(echo $CDATE|cut -c9-10)
cdump=$(echo $CDUMP|tr '[a-z]' '[A-Z]')
export grid=${grid:-${JCAP:-574}}
export PARM_LM=${PARM_LM:-$HOMEcfs/parm/cfs_parm_lm}
export FIX_LM=${FIX_LM:-$HOMEcfs/fix/cfs_fix_lm/FIX_T$grid}
export LISEXEC=${LISEXEC:-$HOMEcfs/exec/cfs_cdas_gldas_LIS}
export exec_gldas2gdas=${exec_gldas2gdas:-$HOMEcfs/exec/cfs_cdas_gldas_gldas2gdas}
fghr=$((24/$gdas_cyc)) ; [[ $fghr -lt 10 ]]&&fghr=0$fghr
export RUN_ENVIR=${RUN_ENVIR:-prod}
export rundir=${LIS_rundir:-$DATA}
export COMROT=${COMROT:-$rundir}
mkdir -p $rundir
cd $rundir
if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
 #export RESDIR=${RESDIR:-$COMDIR/RESTART}
 export RESDIR=${RESDIR:-$COMOUT}
else
 export RESDIR=${RESDIR:-$COMROT/RESTART}
 mkdir -p $RESDIR
fi
export NCP=${NCP:-/bin/cp}
#
export PGMOUT=${PGMOUT:-${pgmout:-'&1'}}
export PGMERR=${PGMERR:-${pgmerr:-'&2'}}
export OBERRFLAG=${OBERRFLAG:-.false.}
typeset -L1 l=$PGMOUT
[[ $l = '&' ]]&&a=''||a='>'
export REDOUT=${REDOUT:-'1>'$a}
typeset -L1 l=$PGMERR
[[ $l = '&' ]]&&a=''||a='>'
export REDERR=${REDERR:-'2>'$a}
#
if [[ $grid -ne 126 && $grid -ne 382 && $grid -ne 574 ]]; then
 echo "GFS/CFS/LIS supports T126/T382/T574 resolutions only"
 exit
fi
#
#                     Run gldas analysis
#                     ------------------
start_date=$GDATE
end_date=$CDATE
#
################################################################################
#
mkdir -p $rundir/input
#
script=$USHcfs
if [ $RUN_ENVIR != prod -a $RUN_ENVIR != devpara ]
then
 ln -s $COMROT $rundir/input/GDAS
fi

### LOG

date1=$(echo $start_date | cut -c1-8)
date2=$(echo $end_date | cut -c1-8)
log="LIS.T${grid}.log.$date1.$date2.log"
rm -f $log ; touch $log ; echo $script  >> $log

### CHECK CMAP UPDATE

currdir=$(pwd)
if [ $REALTIME != 1 ] ; then   # This is for regular CFSR dumps
####################################################
# Get the CMAP data when runnng in reanalysis mode
#CMAP is available every day.
####################################################
  COMDMPTMP=${COMDMPTMP:-$COMDMP}

# This will use precip data $PRECIP_DATA_DELAY hours before $CDATE

  CMAPDIR=${CMAPDIR:-$COMROT}
  PRECIP_DATA_DELAY=${PRECIP_DATA_DELAY:-0}
  XDATE=$($NDATE -$PRECIP_DATA_DELAY $CDATE)
  eval COMDMP=$(CDATE=$XDATE CDUMP=gdas eval echo $COMDMPTMP)
  CMAPDMP=$(eval echo $COMDMP|cut -f2 -d,)
  $NCP $CMAPDMP/cmap.gdas.* $COMROT
  for cyc in 18 12 06 ; do
    YDATE=$($NDATE -$cyc $XDATE)
    eval COMDMP=$(CDATE=$YDATE CDUMP=gdas eval echo $COMDMPTMP)
    CMAPDMP=$(eval echo $COMDMP|cut -f2 -d,)
    $NCP $CMAPDMP/cmap.gdas.* $CMAPDIR
  done

  if [ $RUN_ENVIR != prod -a $RUN_ENVIR != devpara ]
  then
   ln -s $COMROT $rundir/input/GDAS
  fi
  prev_date=$($NDATE -$GLDASCYCHR $CDATE)
  if [ -s $COMROT/cmap.date ] ; then
   CMAPdate1=`cat $COMROT/cmap.date`
   nn=$(echo $CMAPdate1 | wc -c)
   if [ $nn -gt 1 ] ; then
     if [ $CMAPdate1 -gt $CDATE ] ; then
      CMAPdate1=$prev_date
     else
      yyyymmdd=$(echo $CMAPdate1 | cut -c1-8)
      prev_cyc=$(echo $prev_date | cut -c9-10)
      CMAPdate1=${yyyymmdd}${prev_cyc}
     fi
   else
    CMAPdate1=$prev_date
   fi
  else
   CMAPdate1=$prev_date
  fi
#
  cd $CMAPDIR
  #cyc=$(echo $CMAPdate1 | cut -c9-10)    
  cyc1=$(echo $CMAPdate1 | cut -c9-10)
  CMAPfile=$(ls -1 cmap.${CDUMP}*${cyc1} | tail -1)
# CMAPdate2=$(basename $CMAPfile | cut -c 11-20)
  CMAPdate2=$(basename $CMAPfile | awk -F"." '{print $3}')
  nn=$(echo $CMAPdate2 | wc -c)
  if [ $nn -gt 1 ] ; then
   if [ $CMAPdate2 -gt $CDATE ] ; then CMAPdate2=$CDATE ; fi
   echo "CMAP UPDATES FROM $CMAPdate1 TO $CMAPdate2"   >> $log

### DETERMINE CURRENT EXECUTION TIME

   if [[ $CMAPdate1 -ne $CMAPdate2 && $CMAPdate1 -lt ${date1}00 ]]; then
    start_date=$CMAPdate1
    date1=$(echo $start_date | cut -c1-8)
   fi
  else
   echo "NO CMAP PRECIP files available - fcst precip used" >> $log
  fi

else

### Realtime mode. CMAP is lag. Check operational archive for update.

  CMAPDIR=${CMAPDIR:-$rundir}
# dumpdate=$date1
  dumpdate=$date2
  if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
    COMCMAP=${COMCMAP:-$COMDIR}
    CMAP_DMPSUF=${CMAP_DMPSUF:-""}
    export CMAPfile0=$COMCMAP/cdas.${dumpdate}/cdas1.t00z.cmapgrb
  else
    CMAPDMP=${CMAPDMP:-/climate/noscrub/wx24ds/dump}
    CMAP_DMPSUF=${CMAP_DMPSUF:-/gdasc}
#   ln -s $COMROT $rundir/input/GDAS
    export CMAPfile0=$CMAPDMP/${dumpdate}00$CMAP_DMPSUF/cmapgrb.gdas.${dumpdate}00
  fi
#  export CMAPfile0=$CMAPDMP/${dumpdate}00$CMAP_DMPSUF/cmapgrb.gdas.${dumpdate}00
  export CMAPfile=cmapgrb.gdas.${dumpdate}00.$grid
  if [ -s $CMAPfile0 ] ; then
    export LONB=${LONB:-1760}
    export LATB=${LATB:-880}
    $COPYGB -g"255 4 $LONB $LATB 89843 0 128 -89843 -204 204 440" -x $CMAPfile0 $CMAPfile
  fi
  if [ -e $CMAPfile ] ; then
   echo $CMAPfile
   for rec in `$WGRIB -s -4yr $CMAPfile | cut -f1-3 -d:3` ; do
    recnum=`echo $rec | cut -f1 -d:`
    cmapdate=`echo $rec | cut -f3 -d: | cut -c3-12`
    if [ -s $rundir/cmap.gdas.$cmapdate ] ; then rm $rundir/cmap.gdas.$cmapdate ; fi
    $WGRIB $CMAPfile | grep "^$recnum:" | $WGRIB -i $CMAPfile -grib -o $rundir/cmap.gdas.$cmapdate
   done
   CMAPdate1=$(ls -1 $rundir/cmap.gdas.* | head -1 | awk ' BEGIN { FS="."} { print $NF }')
   CMAPdate2=$(ls -1 $rundir/cmap.gdas.* | tail -1 | awk ' BEGIN { FS="."} { print $NF }')
   echo "CMAP UPDATES FROM $CMAPdate1 TO $CMAPdate2"   >> $log
   if [[ $CMAPdate1 -ne $CMAPdate2 && $CMAPdate1 -lt ${date1}00 ]]; then
    start_date=$CMAPdate1
    date1=$(echo $start_date | cut -c1-8)
   fi
  else
   echo "NO CMAP PRECIP files available - fcst precip used" >> $log
  fi

fi

date=$($NDATE -24 $start_date)
while [[ $date -lt $end_date ]]; do
  yymmdd=`echo $date | cut -c1-8`
  if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
    FLXF06=$COMDIR/cdas.$yymmdd/cdas1.t18z.sfluxgrbf06
  else
    FLXF06=$COMROT/flxf06.$CDUMP.${yymmdd}${cyc}
  fi
  if [ ! -s $FLXF06 ]; then start_date=$($NDATE 24 $start_date); fi
  date=$($NDATE 24 $date)
done

### DONE CMAP

cd $currdir

date1=$(echo $start_date | cut -c1-8)
echo "LIS  RUNS    FROM $date1 TO $date2"  >> $log

### CARDFILE
################################################################################
# Import and execute lis.crd.sh
# $script/lis.crd.sh $date1 $date2 $grid $rundir

#cp ${script}lis.crd $rundir/lis.crd

export yyyy1=`echo $date1 | cut -c 1-4`
export   mm1=`echo $date1 | cut -c 5-6`
export   dd1=`echo $date1 | cut -c 7-8`
export yyyy2=`echo $date2 | cut -c 1-4`
export   mm2=`echo $date2 | cut -c 5-6`
export   dd2=`echo $date2 | cut -c 7-8`
export  grid=$grid
export currPath=${rundir:-$(pwd)}
export PARM_LM=$PARM_LM
#
export  LISCARD="$currPath/lis.crd"

rm -f $LISCARD
touch $LISCARD
#cat $currPath/lis.crd.T${grid}.tmp.1 >> $LISCARD
cat $PARM_LM/lis.crd.T${grid}.tmp.1   >> $LISCARD
echo "LIS%t%SSS        = 0     "      >> $LISCARD
echo "LIS%t%SMN        = 00    "      >> $LISCARD
echo "LIS%t%SHR        = 00    "      >> $LISCARD
echo "LIS%t%SDA        = $dd1  "      >> $LISCARD
echo "LIS%t%SMO        = $mm1  "      >> $LISCARD
echo "LIS%t%SYR        = $yyyy1"      >> $LISCARD
echo "LIS%t%ENDCODE    = 1     "      >> $LISCARD
echo "LIS%t%ESS        = 0     "      >> $LISCARD
echo "LIS%t%EMN        = 00    "      >> $LISCARD
echo "LIS%t%EHR        = 00    "      >> $LISCARD
echo "LIS%t%EDA        = $dd2  "      >> $LISCARD
echo "LIS%t%EMO        = $mm2  "      >> $LISCARD
echo "LIS%t%EYR        = $yyyy2"      >> $LISCARD
cat $PARM_LM/lis.crd.T${grid}.tmp.2   >> $LISCARD
#cat $currPath/lis.crd.T${grid}.tmp.2 >> $LISCARD

### DONE lis.crd
### FIX FIELDS

#rm -fr ${LIS}FIX
rm -fr $rundir/FIX
ln -s  $FIX_LM $rundir/FIX

### INITIAL LAND STATES

yyyy=`echo $date1 | cut -c1-4`

rm -f $rundir/noah.rst

#
rst_date=$start_date

if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
  rdir=$COMDIR/cdas.$(echo $rst_date | cut -c1-8)
  #echo $rdir/noah.rst.$CDUMP.$rst_date >> $log
  echo $rdir/${RUN}.t${cyc}z.noah.rst >> $log
  if [ ! -s $rdir/${RUN}.t${cyc}z.noah.rst ]; then
    echo "Restart File ${RUN}.t${cyc}z.noah.rst for $rst_date is not available"
    $DATA/err_exit
  else
    $NCP $rdir/${RUN}.t${cyc}z.noah.rst $rundir/noah.rst
  fi
else
  echo $RESDIR/noah.rst.$CDUMP.$rst_date >> $log
  $NCP $RESDIR/noah.rst.$CDUMP.$rst_date $rundir/noah.rst
fi

### Make the LIS RUN

date=$($NDATE -24 $start_date)
gdas_int=$((24/gdas_cyc))
while [[ $date -lt $end_date ]]; do
 yymmdd=`echo $date | cut -c1-8`
 tcyc=`echo $date | cut -c9-10`
 for fhr in 00 01 02 03 04 05 06 ; do
  mkdir -p $rundir/input/GDAS/$CDUMP.$yymmdd
  if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
    $NCP $COMDIR/cdas.$yymmdd/cdas1.t${tcyc}z.sfluxgrbf$fhr $rundir/input/GDAS/$CDUMP.$yymmdd/gdas1.t${tcyc}z.sfluxgrbf$fhr
    if [ -s $COMDIR/cdas.$yymmdd/cdas1.t${tcyc}z.sfluxgrbif$fhr ]
    then
      $NCP $COMDIR/cdas.$yymmdd/cdas1.t${tcyc}z.sfluxgrbif$fhr $rundir/input/GDAS/$CDUMP.$yymmdd/gdas1.t${tcyc}z.sfluxgrbf$fhr.index
    else
      $GRBINDEX $COMDIR/cdas.$yymmdd/cdas1.t${tcyc}z.sfluxgrbf$fhr $rundir/input/GDAS/$CDUMP.$yymmdd/gdas1.t${tcyc}z.sfluxgrbf$fhr.index
    fi
  else
    ln -fs $COMROT/flxf$fhr.$CDUMP.${yymmdd}${cyc} $rundir/input/GDAS/$CDUMP.$yymmdd/gdas1.t${tcyc}z.sfluxgrbf$fhr 
    ln -fs $COMROT/flxf$fhr.$CDUMP.${yymmdd}${cyc}.index $rundir/input/GDAS/$CDUMP.$yymmdd/gdas1.t${tcyc}z.sfluxgrbf$fhr.index
  fi
 done
 date=$($NDATE $gdas_int $date)
done
#
if [ $CMAPDIR != $rundir ] ; then
  date=$start_date
  while [[ $date -le $end_date ]]; do
   yymmdd=`echo $date | cut -c1-8`
   cyc=`echo $date | cut -c9-10`
   fname=cmap.$CDUMP.${yymmdd}$cyc
   if [ -s $CMAPDIR/$fname ] ; then ln -fs $CMAPDIR/$fname $rundir/$fname ; fi
   date=$($NDATE $gdas_int $date)
  done
fi
#
ls -ltr $LISCARD
echo 'executing LIS in directory ' $(pwd)

PGM=$LISEXEC
eval $PGM $REDOUT$PGMOUT $REDERR$PGMERR

export err=$?; $DATA/err_chk
### REPORT

if [ $REALTIME != 1 ] ; then   # This is for regular CFSR dumps
 if [ $(echo $CMAPdate2 | wc -c) -gt 1 ] ; then
  rm -f ./tmp
  echo  $CMAPdate2 > ./tmp
  mv ./tmp $COMROT/cmap.date
 fi
fi

rm -f ./tmp
echo $date1 $date2 $grid > ./tmp
mv ./tmp $COMROT/gldas2gfs.T${grid}.date

yyyymmdd=$(echo $end_date | cut -c1-8)
PDY_edate=$yyyymmdd
yyyy=$(echo $end_date | cut -c1-4)
mkdir -p $rundir/EXP$grid/NOAH/$yyyy/$yyyymmdd
cd $rundir/EXP$grid/NOAH/$yyyy/$yyyymmdd
if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
  for file in `ls LIS.E$grid.${yyyymmdd}*.NOAH.grb`
  do
    hh=`echo $file |awk -F"." '{print $3}' |cut -c9-10`
    $NCP LIS.E$grid.${yyyymmdd}${hh}.NOAH.grb $COMDIR/cdas.$PDY_edate/${RUN}.t${cyc}z.noahgrb.lis${hh}
  done
  $NCP LIS.E$grid.${yyyymmdd}*.NOAHgbin $COMDIR/cdas.$PDY_edate/${RUN}.t${cyc}z.noahbin.lis
  $NCP LIS.E$grid.${end_date}.Noahrst   $COMDIR/cdas.$PDY_edate/${RUN}.t${cyc}z.noah.rst
else
  $NCP LIS.E$grid.${yyyymmdd}*.NOAH.grb $COMROT
  $NCP LIS.E$grid.${yyyymmdd}*.NOAHgbin $COMROT
  $NCP LIS.E$grid.${end_date}.Noahrst   $RESDIR/noah.rst.$CDUMP.$end_date
fi
#
### Save the LIS files updated for the previous days covered in the CMAP GRIB ####
### They will be saved in the current day's output directory in a tarball ###
date=$($NDATE -24 $end_date)
until [[ $date -lt $start_date ]] ; do
 yyyymmdd=$(echo $date | cut -c1-8)
 yyyy=$(echo $date | cut -c1-4)
 mkdir -p $rundir/EXP$grid/NOAH/$yyyy/$yyyymmdd
 cd $rundir/EXP$grid/NOAH/$yyyy/$yyyymmdd
 if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
   tarfile=$COMDIR/cdas.$PDY_edate/${RUN}.t${cyc}z.LIS.diagnos.${yyyymmdd}.tar
   tar -cvf $tarfile LIS.E$grid.${yyyymmdd}*.N* 
 else
   tar -cvf $COMROT/LIS.diagnos.${yyyymmdd}.tar LIS.E$grid.${yyyymmdd}*.N* 
 fi
 date=$($NDATE -24 $date)
done

################################################################################
rc=$?
if [[ $rc -ne 0 ]];then $PERR;exit 1;fi
#
################################################################################
# create updated sfc file
################################################################################

suffix=f$fghr
fcst_date=$($NDATE -6 $CDATE)
date=$CDATE

yyyy=$(echo $date | cut -c1-4)
yymmdd=$(echo $date | cut -c1-8)
if [ $RUN_ENVIR = prod -o $RUN_ENVIR = devpara ] ; then
  scyc=`echo $fcst_date |cut -c9-10`
  sdate=`echo $fcst_date |cut -c1-8`
  SFCINP=$COMDIR/cdas.${sdate}/cdas1.t${scyc}z.b${suffix}
  SFCGLD=$rundir/EXP$grid/NOAH/$yyyy/$yymmdd/LIS.E${grid}.$date.NOAHgbin
  SFCOUT=$COMDIR/cdas.${sdate}/cdas1.t${scyc}z.b${suffix}.LIS
else
  SFCINP=$COMROT/sfc$suffix.$CDUMP.$fcst_date
  SFCGLD=$rundir/EXP$grid/NOAH/$yyyy/$yymmdd/LIS.E${grid}.$date.NOAHgbin
  SFCOUT=$COMROT/sfc$suffix.$CDUMP.$fcst_date.LIS
fi
#
 $exec_gldas2gdas $SFCINP $SFCOUT $SFCGLD
 export err=$?; $DATA/err_chk


 rc=$?
 if [[ $rc -ne 0 ]];then $PERR;exit 1;fi

################################################################################
# Copy out restart and output files

rc=$?

################################################################################
# Exit gracefully

if [[ $rc -ne 0 ]];then $PERR;exit 1;fi
if [ ! -z $PEND ]; then $PEND ; fi
