#!/bin/sh
###############################################################
# Script -- excfs_cdas_preciplis.sh.sms 
# Purpose: to retrieve the pentad and gauge data from CPC
#          workstation and convert it to CFS LIS forcing format
# History: 2010-08-27 Jesse Meng First implementation
###############################################################
set -x
msg="HAS BEGUN on `hostname`"
postmsg "$jlogfile" "$msg"

currDIR=$DATA

cd $currDIR

export FIXcfs=${FIXcfs:-$HOMEcfs/fix}
export EXECcfs=${EXECcfs:-$HOMEcfs/exec}
export DATE2JDAY=${DATE2JDAY:-/nwprod/util/ush/date2jday.sh}
export FIX_LM=${FIX_LM:-$FIXcfs/cfs_fix_lm}

export wgrib=${wgrib:-/nwprod/util/exec/wgrib}
export copygb=${copygb:-/nwprod/util/exec/copygb}

CDATE=$PDY$cyc
export yyyy=`echo $PDY |cut -c1-4`
JDATE=`$DATE2JDAY $PDY`
JDAY=`echo $JDATE |cut -c5-`

if [ $JDAY -lt 7 ]; then (( yyyy = $yyyy - 1 )); fi

# Remote CPC directories
export account_cpc=${account_cpc:-climprod}
export cpc_workstation=${cpc_workstation:-vm-lnx-cpccf.ncep.noaa.gov}
export REMOTE_CMAP_DIR=${REMOTE_CMAP_DIR:-/cpc/data/cpcsat/CMAP_PEN_RT}
export REMOTE_GAGE_DIR=${REMOTE_GAGE_DIR:-/cpc/data/cpcsat/cpcUniGaugeRT/PRODUCTS/GRID/$yyyy/gridGLB/DEG0.500M}

# When GETPRECIP_FROM_CPC is set to NO, obtain the precip file from Jesse Meng's directory
# The following block is for Developer's use ONLY
cmapDIR=${cmapDIR:-/climate/noscrub/wx22mj/cpcsat/CMAP_PEN_RT}
gageDIR=${gageDIR:-/climate/noscrub/wx22mj/cpcsat/cpcUniGaugeRT/PRODUCTS/GRID/$yyyy/gridGLB/DEG0.500M}
gldasDIR=${gldasDIR:-/climate/noscrub/wx22mj/cmap/gldas}

LOCAL_CMAP_DIR=${LOCAL_CMAP_DIR:-/climate/noscrub/wx22mj/cpcsat/CMAP_PEN_RT}
LOCAL_GAGE_DIR=${LOCAL_GAGE_DIR:-/climate/noscrub/wx22mj/cpcsat/cpcUniGaugeRT/PRODUCTS/GRID/$yyyy/gridGLB/DEG0.500M}
# End of the block for Developer's use ONLY

# Local Input File directory:
export COMGDAS=${COMGDAS:-/com/gfs/prod}


# Local output file directory
export COMOUTCMAP=${COMOUTCMAP:-$COMOUT/pentad}
export COMOUTGAGE=${COMOUTGAGE:-$COMOUT/gauge}
export COMOUTGLDAS=${COMOUTGLDAS:-$COMOUT/gldas}

#########################################################
# Start retrieving the pentad file (in grads format)from 
# the CPC workstation.
#########################################################

#############################################################
# Use scp to copy Pingping's pentad file from CPC workstation
#############################################################
echo $REMOTE_CMAP_DIR
echo $COMOUTCMAP
if [ ! -e $COMOUTCMAP/$yyyy ]; then mkdir -p $COMOUTCMAP/$yyyy; fi

cmapFile=cmap_pen_rt_v0011_out.lnx.$yyyy

if [ $GETPRECIP_FROM_CPC = YES ]
then
  scp $account_cpc@$cpc_workstation:$REMOTE_CMAP_DIR/$cmapFile $COMOUTCMAP/$yyyy/.
  scp $account_cpc@$cpc_workstation:$REMOTE_CMAP_DIR/$cmapFile .

  scperror=$?
  if [ $scperror -ne 0 ] || [ ! -s $cmapFile ]
  then
    echo "Transfer of file $cmapFile from $REMOTE_CMAP_DIR failed."
  else
    echo "The pentad data is updated"
  fi
else
  if [ -f $LOCAL_CMAP_DIR/$cmapFile ]; then
    cp $LOCAL_CMAP_DIR/$cmapFile ./
  else
    echo "The $cmapFile is not updated yet on CCS"
  fi
fi

### FIND CMAP PENTAD UPDATE

if [ ! -f $cmapFile ]; then
    echo "$cmapFile not exist. Job stops."
    exit
fi
$EXECcfs/cfs_cdas_swapPentad $cmapFile
export err=$?; err_chk

k=1
list=`ls $currDIR/cmap_pentad??.dat`
for file in $list; do
  cksum $file | read s size name 
  if [ $size -eq 145152 ]; then
     break
  fi
  (( k=$k+1 ))
done

(( p2 = $k - 1 ))
(( d = $p2 * 5 ))

set -A dom 31 28 31 30 31 30 31 31 30 31 30 31
leap=0
if [ `expr $yyyy %   4` -eq 0 ]; then leap=1; fi
if [ `expr $yyyy % 100` -eq 0 ]; then leap=0; fi
if [ `expr $yyyy % 400` -eq 0 ]; then leap=1; fi
if [ $leap -eq 1 ]; then dom[1]=29; fi

m=1
while [ $d -gt ${dom[$m-1]} ]; do
  (( d = $d - ${dom[$m-1]} ))
  (( m=$m+1 ))
done
(( yyyymmdd2 = $yyyy * 10000 + $m * 100 + $d ))

echo "Pentad  updates to $yyyy P$p2 $yyyymmdd2"

### FIND CMAP 6HR UPDATE

echo $COMOUTCMAP

cmap6file=`ls -1 ${COMOUTCMAP}/*/cmap_gdas_*.grb | tail -1`
cp $cmap6file .
if [ -f $cmap6file ]; then
   yyyy1=`ls -1 cmap_gdas*.grb | tail -1 | cut -c 11-14`
   yyyymm1=`ls -1 cmap_gdas*.grb | tail -1 | cut -c 11-16`
   yyyymmdd1=`ls -1 cmap_gdas*.grb | tail -1 | cut -c 11-18` 
else
   yyyy1=$yyyy
   yyyymm1=${yyyy}01
   yyyymmdd1=${yyyy}0101
fi
(( mm1 = $yyyymm1   % 100 ))
(( dd1 = $yyyymmdd1 % 100 ))
d=0
m=1
while [ $m -lt $mm1 ]; do
  (( d = $d + ${dom[$m-1]} ))
  (( m=$m+1 ))
done
(( d = $d + $dd1 ))
(( p1 = $d / 5 ))
 
echo "CMAP6hr updates to ${yyyy1} P$p1 ${yyyymmdd1}"

#############################
# Disaggregate pentad to 6 hr
#############################

### Start pentad loop

(( pp = $p1 + 1 ))
if [ $pp -gt 73 ]; then
   pp=1
   p2=1
fi
if [ ${yyyy} -gt ${yyyy1} ]; then
   pp=1
   p2=1
fi
while [ $pp -le $p2 ]; do

((ppday=$yyyy*1000+($pp-1)*5+1))
yyyymmdd1=`$DATE2JDAY $ppday`
yyyymmdd1=`sh /nwprod/util/ush/finddate.sh $yyyymmdd1 d-1`

maxday=5
if [ $leap -eq 1 ] && [ $pp -eq 12 ]; then maxday=6; fi

set -A yy "00" "00" "00" "00" "00" "00"
set -A mm "00" "00" "00" "00" "00" "00"
set -A dd "00" "00" "00" "00" "00" "00"
set -A hh "00" "06" "12" "18"

i=0
while [ $i -lt $maxday ]; do
  (( k=$i+1 ))
  yy[$i]=`sh /nwprod/util/ush/finddate.sh $yyyymmdd1 d+$k | cut -c 1-4`
  mm[$i]=`sh /nwprod/util/ush/finddate.sh $yyyymmdd1 d+$k | cut -c 5-6`
  dd[$i]=`sh /nwprod/util/ush/finddate.sh $yyyymmdd1 d+$k | cut -c 7-8`
  echo ${yy[$i]} ${mm[$i]} ${dd[$i]} 
(( i=$i+1 ))
done

###### copygb gdas precip to T382

d=0
while [ $d -lt $maxday ]; do
  mkdir -p $currDIR/gdas.${yy[$d]}${mm[$d]}${dd[$d]}
  h=0
  while [ $h -lt 4 ]; do
    gdasflx6="$COMGDAS/gdas.${yy[$d]}${mm[$d]}${dd[$d]}/gdas1.t${hh[$h]}z.sfluxgrbf06"
    gdasT382="$currDIR/gdas.${yy[$d]}${mm[$d]}${dd[$d]}/gdas1.t${hh[$h]}z.sfluxgrbf06"
  if [ -f $gdasflx6 ]; then
    $wgrib -s $gdasflx6 | grep "PRATE:sfc" | grep "ave" | $wgrib -i $gdasflx6 -grib -o tmp
    $wgrib -s $gdasflx6 | grep "LAND:sfc"  | $wgrib -i $gdasflx6 -grib -append -o tmp
    $copygb -g128 -x tmp $gdasT382
    rm -f tmp
  else
    echo "$gdasflx6 not exist. Job stops."
    exit
  fi
  (( h=$h+1 ))
  done
(( d=$d+1 ))
done

### Create input file

rm -f pentad2gldas.in
touch pentad2gldas.in
echo $maxday >> pentad2gldas.in
echo $yy[1]  >> pentad2gldas.in
d=0
while [ $d -lt $maxday ]; do
  h=0
  while [ $h -lt 4 ]; do
    echo "${yy[$d]} ${mm[$d]} ${dd[$d]} ${hh[$h]}" >> pentad2gldas.in
  (( h=$h+1 ))
  done
(( d=$d+1 ))
done

echo "--------------------------- GDAS PATH  " >> pentad2gldas.in
echo "$currDIR/                              " >> pentad2gldas.in
echo "--------------------------- PENTAD FILE" >> pentad2gldas.in
if [ $pp -lt 10 ]; then
  echo "$currDIR/cmap_pentad0$pp.dat         " >> pentad2gldas.in
else
  echo "$currDIR/cmap_pentad$pp.dat          " >> pentad2gldas.in
fi
echo "--------------------------- OUTPUT PATH" >> pentad2gldas.in
echo "$currDIR/                              " >> pentad2gldas.in
echo "--------------------------- OPTIONS    " >> pentad2gldas.in
echo "1       !(I1) options(1) Search circle " >> pentad2gldas.in
echo "0       !(I1) options(2) Output all    " >> pentad2gldas.in

$EXECcfs/cfs_cdas_pentad2gldas
export err=$?; err_chk

n=1
d=0
while [ $d -lt $maxday ]; do
  h=0
  while [ $h -lt 4 ]; do
    if [ $n -lt 10 ]; then
       nn="0$n"
    else
       nn="$n"
    fi
    mv $currDIR/grib.08${nn} $COMOUTCMAP/$yyyy/cmap_gdas_${yy[$d]}${mm[$d]}${dd[$d]}${hh[$h]}.grb 
  (( n=$n+1 ))
  (( h=$h+1 ))
  done
(( d=$d+1 ))
done 

### Increment to next pentad

(( pp=$pp+1 ))
yyyymmdd1=`sh /nwprod/util/ush/finddate.sh $yyyymmdd1 d+5`
done

rm -f $currDIR/cmap_pentad??.dat

#############################################################
# Use scp to copy Pingping's pentad file from CPC workstation
#############################################################

echo $REMOTE_GAGE_DIR
echo $COMOUTGAGE
if [ ! -e $COMOUTGAGE/$yyyy ]; then mkdir -p $COMOUTGAGE/$yyyy; fi

gageFile=`ls -1 $COMOUTGAGE/*/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.*.RT | tail -1`
cp $gageFile .
if [ -f $gageFile ]; then
   gageDay=`ls -1 PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.*.RT | tail -1 | cut -c 35-42`
else
   gageDay=${yyyy}0101
fi
echo "Gauge   updates to $gageDay"

#yy=`date +%Y`
#mm=`date +%m`
#dd=`date +%d`
#today=$yy$mm$dd
yy=`echo $PDY |cut -c1-4`
mm=`echo $PDY |cut -c5-6`
dd=`echo $PDY |cut -c7-8`
today=$yy$mm$dd

day0=$gageDay
while [ $day0 -lt $today ]; do
  day0=`sh /nwprod/util/ush/finddate.sh $day0 d+1`
  yyyy0=`echo $day0 | cut -c 1-4`
  if [ ${yyyy0} -ne ${yyyy} ]; then break; fi
  if [ ! -e $COMOUTGAGE/$yyyy ]; then mkdir -p $COMOUTGAGE/$yyyy; fi
  if [ ! -e $COMOUTGAGE/$yyyy/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.$day0.RT ]; then
     scp $account_cpc@$cpc_workstation:$REMOTE_GAGE_DIR/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.$day0.RT $COMOUTGAGE/$yyyy/.
  fi
done

#############################
# Blend gauge and CMAP precip
#############################
echo $COMOUTGLDAS
if [ ! -e $COMOUTGLDAS/$yyyy ]; then mkdir -p $COMOUTGLDAS/$yyyy; fi

gldasFile=`ls -1 $COMOUTGLDAS/*/precip.gldas.* | tail -1`
cp $gldasFile ./
if [ -f $gldasFile ]; then
   gldasDay=`ls -1 precip.gldas.* | tail -1 | cut -c 14-21`
else
   gldasDay=$today
fi

cmap6file=`ls -1 ${COMOUTCMAP}/*/cmap_gdas_*.grb | tail -1`
cp $cmap6file ./
if [ -f $cmap6file ]; then
   cmapDay=`ls -1 cmap_gdas*.grb | tail -1 | cut -c 11-18`
else
   cmapDay=$today
fi

gageFile=`ls -1 $COMOUTGAGE/*/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.*.RT | tail -1`
cp $gageFile ./
if [ -f $gageFile ]; then
   gageDay=`ls -1 PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.*.RT | tail -1 | cut -c 35-42`
else
   gageDay=$today
fi

echo "gldasDay = $gldasDay"
echo "cmapDay  = $cmapDay"
echo "gageDay  = $gageDay"

lastDay=`sh /nwprod/util/ush/finddate.sh $gageDay d-1`
if [ $cmapDay -le $lastDay ]; then
   lastDay=$cmapDay
fi

rm -rf $DATA/cmapgrb.total

day0=$gldasDay
while [ $day0 -lt $lastDay ]; do

rm -f fort.10 fort.11 fort.12
rm -f fort.31 fort.32 fort.33 fort.34
blend=1

### GET GAGE

day1=`sh /nwprod/util/ush/finddate.sh $day0 d+1`
day2=`sh /nwprod/util/ush/finddate.sh $day0 d+2`
echo $day0 $day1 $day2
yyyy0=`echo $day0 | cut -c 1-4`
yyyy1=`echo $day1 | cut -c 1-4`
yyyy2=`echo $day2 | cut -c 1-4`
file0=$COMOUTGAGE/$yyyy0/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.$day0.RT
file1=$COMOUTGAGE/$yyyy1/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.$day1.RT
file2=$COMOUTGAGE/$yyyy2/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.$day2.RT
echo $file0
echo $file1
echo $file2
if [ ! -e $file0 ]; then blend=0; fi
if [ ! -e $file1 ]; then blend=0; fi
if [ ! -e $file2 ]; then blend=0; fi
cp $file0 ./fort.10
cp $file1 ./fort.11
cp $file2 ./fort.12

### GET CMAP

$copygb -g235 -x $COMOUTCMAP/$yyyy1/cmap_gdas_${day1}00.grb cmap1
$copygb -g235 -x $COMOUTCMAP/$yyyy1/cmap_gdas_${day1}06.grb cmap2
$copygb -g235 -x $COMOUTCMAP/$yyyy1/cmap_gdas_${day1}12.grb cmap3
$copygb -g235 -x $COMOUTCMAP/$yyyy1/cmap_gdas_${day1}18.grb cmap4
$wgrib  cmap1 -d -bin -nh -o ./fort.31
$wgrib  cmap2 -d -bin -nh -o ./fort.32
$wgrib  cmap3 -d -bin -nh -o ./fort.33
$wgrib  cmap4 -d -bin -nh -o ./fort.34
rm -f cmap1 cmap2 cmap3 cmap4
if [ ! -e ./fort.31 ]; then blend=0; fi
if [ ! -e ./fort.32 ]; then blend=0; fi
if [ ! -e ./fort.33 ]; then blend=0; fi
if [ ! -e ./fort.34 ]; then blend=0; fi

### BLEND GAUGE AND CMAP

cp $FIX_LM/PRCP_CU_GAUGE_V1.0GLB_0.50deg_EOD.lnx .
cp $FIX_LM/weight_gage_cmap.bin .

# Execution argument $day1 in YYYYMMDD format

if [ $blend -eq 1 ]; then
$EXECcfs/cfs_cdas_precipLIS $day1
fi
export err=$?; err_chk

###  Cat the updated precip.gldas files into one cmapgrb file 
cat $currDIR/precip.gldas.${day1}00 >>$DATA/cmapgrb.total
cat $currDIR/precip.gldas.${day1}06 >>$DATA/cmapgrb.total
cat $currDIR/precip.gldas.${day1}12 >>$DATA/cmapgrb.total
cat $currDIR/precip.gldas.${day1}18 >>$DATA/cmapgrb.total

mv $currDIR/precip.gldas.${day1}00 $COMOUTGLDAS/$yyyy
mv $currDIR/precip.gldas.${day1}06 $COMOUTGLDAS/$yyyy
mv $currDIR/precip.gldas.${day1}12 $COMOUTGLDAS/$yyyy
mv $currDIR/precip.gldas.${day1}18 $COMOUTGLDAS/$yyyy

day0=`sh /nwprod/util/ush/finddate.sh $day0 d+1`
done

if [ -f $DATA/cmapgrb.total ]; then
  if [ $SENDCOM = YES ]; then
    cp $DATA/cmapgrb.total $COMOUT/cdas1.t${cyc}z.cmapgrb
  
    if [ $SENDDBN = YES ]; then
      $DBNROOT/bin/dbn_alert MODEL CDAS1_CMAP_GRB $job $COMOUT/cdas1.t${cyc}z.cmapgrb
    fi
  fi
else
  echo " No update for cmapgrb file!"
fi

############## END OF SCRIPT #######################
echo $currDIR
echo $COMOUTCMAP
echo $COMOUTGAGE
echo $COMOUTGLDAS
