#! /bin/ksh
########################################################################
# hwrf_gfs_track0.sh
########################################################################
# This script runs the post-processor and tracker on the analysis
# output file, to generate an analysis time storm location for the 
# GFS
#
# Written March 2012 by Sam Trahan
########################################################################

set -x -u -e

STORM="$1"
STORMID="$2"
ymdh="$3"
CENLA="$4"
CENLO="$5"
STORM_LAT="$6"
STORM_LON="$7"
ATMOS="$8"
vit="$9"

storm=$( echo "$STORM" | tr A-Z a-z )
stormid=$( echo "$STORMID" | tr A-Z a-z )

outfile="$ATMOS/gfs-anl-fix.atcfunix"

wgrib="${WGRIB_PATH}"
cgb="${COPYGB_PATH}"
grb2ctl=${USHhwrf}/hwrf_grib2ctl.pl
gix="${GRIBINDEX_PATH:-${utilexec:-${NWPROD}/util/exec}/grbindex}"
gettrk="${GETTRK_PATH:-${EXEChwrf:-${NWPROD}/hwrf.${HWRF_VERSION}/exec}/hwrf_unified_tracker}"
vint="${VINT_PATH:-${EXEChwrf:-${NWPROD}/hwrf.${HWRF_VERSION}/exec}/hwrf_vint}"
tave="${TAVE_PATH:-${EXEChwrf:-${NWPROD}/hwrf.${HWRF_VERSION}/exec}/hwrf_tave}"
gribwork=.

wgrib_parmlist=" HGT:925 HGT:850 HGT:700 UGRD:850 UGRD:700 UGRD:500 VGRD:850 VGRD:700 VGRD:500 SurfaceU SurfaceV ABSV:850 ABSV:700 PRMSL HGT:900 HGT:800 HGT:750 HGT:650 HGT:600 HGT:550 HGT:500 HGT:450 HGT:400 HGT:350 HGT:300 HGT:250 TMP:500 TMP:450 TMP:400 TMP:350 TMP:300 TMP:250"
cmodel=hwrf # don't change

rm -f "$outfile"


# ----------------------------------------------------------------------
# Turn on/off various features here

# Currently, these are set the same as for HWRF.  
# That may or may not be a good idea.
phaseflag=n
structflag=n
ikeflag=n
write_vit=y
contour_interval=100.0
atcfnum=81
mslpthresh=0.0015
v850thresh=1.5000

#################### STEP 1: RUN THE POST-PROCESSOR ON D01:


yyyy=$( echo "$ymdh" | cut -c1-4 )
mm=$( echo "$ymdh" | cut -c5-6 )
dd=$( echo "$ymdh" | cut -c7-8 )
hh=$( echo "$ymdh" | cut -c9-10 )
PDY=$yyyy$mm$dd
CYL=$hh

#wrfinput="$ATMOS/wrfinput_d01"
wrfout1=$( ls -1 "$ATMOS/wrfout_d01_${yyyy}-${mm}-${dd}_${hh}:"0[1-9]* | head -1 )
#wrfout2="$ATMOS/wrfout_d02_${yyyy}-${mm}-${dd}_${hh}:00:00"
#wrfout3="$ATMOS/wrfout_d03_${yyyy}-${mm}-${dd}_${hh}:00:00"
if [[ "$IO_FORM" == 2 ]] ; then
    infile="$ATMOS/trackin_d01_$yyyy-$mm-${dd}_$hh:00:00"
    cp -pf "$wrfout1" "$infile"
    "$EXEChwrf/hwrf_wrfout_newtime" "$infile" "$yyyy-$mm-${dd}_$hh:00:00"
else
    infile="$wrfout1"
fi

rm -f fort.*
"$USHhwrf/hwrf_post_process.sh" -n -t "${yyyy}-${mm}-${dd}_${hh}:00:00" \
    "$STORM" "$STORMID" "$ymdh" "$PARMhwrf/hwrf_cntrl.tracker" \
    "$CENLA" "$CENLO" "$infile"
mv fort.14 post.14
rm -f fort.*

#################### STEP 2: PREPARE THE TRACKER INPUT FILE:



# We're going to make a lat-lon GRIB file that is centered on
# the tcvitals storm location, and is 20x20 degrees in size.

# Grab the subset of the file that we want:
#hwrf_p25_orig=hwrf_parent.grbf00       # only old tracker vars
hwrf_p25_orig=HWRF_PARENT.GrbF00       # full file
#hwrf_p25_orig=$STORM$STORMID.$ymdh.parent_grbf00   # original tracker infile
hwrf_p25=grbf00.subset
hwrf_merge_basic=grbf00.merge_basic

$wgrib -s ${hwrf_p25_orig} >hwrf_p25_orig.ix
for parm in ${wgrib_parmlist} ; do
    case ${parm} in
        "SurfaceU") parm="UGRD:10 m " ;;
        "SurfaceV") parm="VGRD:10 m " ;;
        *) true ;;
    esac
    grep "${parm}" hwrf_p25_orig.ix | $wgrib -s ${hwrf_p25_orig} -i -grib -append \
        -o $hwrf_p25
done

# Compute the grid:
newwestlon=`echo $STORM_LON | awk '{printf ("%d",$1*1000 - 10000)}'`
neweastlon=$(( newwestlon+20000 ))

newsolat=`echo $STORM_LAT | awk '{printf ("%d",$1*1000 - 10000)}'`
newnolat=$(( newsolat+20000 ))

grid="255 0 81 81 ${newnolat} ${newwestlon} 128 ${newsolat} ${neweastlon} 250 250 0"

# Create the merge_basic file
$cgb -xg"$grid" ${hwrf_p25} ${hwrf_merge_basic}



#################### STEP 3: RUN THE TRACKER PRE-PROCESSING



$gix ${hwrf_merge_basic} ${hwrf_merge_basic}.i
x1=${hwrf_merge_basic}.i

fhour=0
fhour00=00

set +x
echo " "
echo "TIMING: Date in interpolation for fhour= $fhour before = `date`"
echo " "
set -x

#      catfile=${gribwork}/${cmodel}_cat.${PDY}${CYL}.f${fhour}
#      >${catfile}

set +e

gfile=${hwrf_merge_basic}
ifile=${x1}

gparm=7
namelist=${gribwork}/vint_input.${PDY}${CYL}.z
echo "&timein ifcsthour=${fhour}, iparm=${gparm}/"  >${namelist}

ln -s -f ${gfile}                                   fort.11
ln -s -f $PARMhwrf/hwrf_hgt_levs.txt                fort.16
ln -s -f ${ifile}                                   fort.31
ln -s -f ${gribwork}/${cmodel}.${PDY}${CYL}.z.f${fhour} fort.51

$vint <${namelist}

gparm=11
namelist=${gribwork}/vint_input.${PDY}${CYL}
echo "&timein ifcsthour=${fhour}, iparm=${gparm}/"  >${namelist}

ln -s -f ${gfile}                                   fort.11
ln -s -f $PARMhwrf/hwrf_tmp_levs.txt                fort.16
ln -s -f ${ifile}                                   fort.31
ln -s -f ${gribwork}/${cmodel}.${PDY}${CYL}.t.f${fhour} fort.51

$vint <${namelist}

namelist=${gribwork}/tave_input.${PDY}${CYL}
echo "&timein ifcsthour=${fhour}, iparm=${gparm}/"   >${namelist}
#      echo "        lt_units='${lead_time_units}'/"       >>${namelist}

ffile=${gribwork}/${cmodel}.${PDY}${CYL}.t.f${fhour}
ifile=${gribwork}/${cmodel}.${PDY}${CYL}.t.f${fhour}.i
$gix ${ffile} ${ifile}

ln -s -f ${ffile}                                      fort.11
ln -s -f ${ifile}                                      fort.31
ln -s -f ${gribwork}/${cmodel}_tave.${PDY}${CYL}.f${fhour} fort.51

$tave <${namelist}

tavefile=${gribwork}/${cmodel}_tave.${PDY}${CYL}.f${fhour}
zfile=${gribwork}/${cmodel}.${PDY}${CYL}.z.f${fhour}
#      cat ${zfile} ${tavefile} >>${catfile}

#      g2=${catfile}
#      x2=${catfile}.i
#      $gix $g2 $x2

g2=${zfile}
x2=${zfile}.i
$gix $g2 $x2

g3=${tavefile}
x3=${tavefile}.i
$gix $g3 $x3

set -e

set +x
echo " "
echo " Extracting HWRF GRIB data for forecast hour = $fhour"
echo " "
set -x

g1=${hwrf_merge_basic}

$cgb -g"$grid" -k'4*-1 33 100 850' $g1 $x1 ${gribwork}/hwrfu850.grb.f${fhour};   rcc1=$?
$cgb -g"$grid" -k'4*-1 33 100 700' $g1 $x1 ${gribwork}/hwrfu700.grb.f${fhour};   rcc2=$?
$cgb -g"$grid" -k'4*-1 33 100 500' $g1 $x1 ${gribwork}/hwrfu500.grb.f${fhour};   rcc3=$?
$cgb -g"$grid" -k'4*-1 33 105  10' $g1 $x1 ${gribwork}/hwrfu10m.grb.f${fhour};   rcc4=$?
$cgb -g"$grid" -k'4*-1  7 100 850' $g1 $x1 ${gribwork}/hwrfz850.grb.f${fhour};   rcc7=$?
$cgb -g"$grid" -k'4*-1  7 100 700' $g1 $x1 ${gribwork}/hwrfz700.grb.f${fhour};   rcc8=$?
$cgb -g"$grid" -k'4*-1  2 102   0' $g1 $x1 ${gribwork}/hwrfmslp.grb.f${fhour};   rcc9=$?

set +e
$cgb -g"$grid"                     $g2 $x2 ${gribwork}/hwrfphase.grb.f${fhour}; rcc10=$?
$cgb -g"$grid"                     $g3 $x3 ${gribwork}/hwrftave.grb.f${fhour};  rcc11=$?
set -e

fmin=$(( fhour*60 ))
minstr=$( echo $fmin | awk '{printf ("%05d",$1)}' )
hwrf_20x20=20x20.grbf00

cat ${gribwork}/hwrfu850.grb.f${fhour} ${gribwork}/hwrfu700.grb.f${fhour} \
    ${gribwork}/hwrfu500.grb.f${fhour} ${gribwork}/hwrfz850.grb.f${fhour} \
    ${gribwork}/hwrfz700.grb.f${fhour} ${gribwork}/hwrfmslp.grb.f${fhour} \
    ${gribwork}/hwrfu10m.grb.f${fhour} ${gribwork}/hwrfphase.grb.f${fhour} \
    ${gribwork}/hwrftave.grb.f${fhour} >${hwrf_20x20}

$gix ${hwrf_20x20} ${hwrf_20x20}.ix





#################### STEP 4: RUN THE TRACKER



rm -f fort.*
true > NULL_USING_MULTI_OPTION

gribfile=NULL_USING_MULTI_OPTION
ixfile=NULL_USING_MULTI_OPTION

ln -fs "$hwrf_20x20"    \
    hwrf.20x20.$storm$stormid.$ymdh.f"$minstr"    > /dev/null
ln -fs "$hwrf_20x20".ix \
    hwrf.20x20.$storm$stormid.$ymdh.f"$minstr".ix > /dev/null
printf "%4d %5d\n" 1 "$fmin" > fort.15

namelist=input.namelist
cat<<EOF > $namelist
&datein inp%bcc=$( echo $ymdh | cut -c1-2 ),
        inp%byy=$( echo $ymdh | cut -c3-4 ),
        inp%bmm=$( echo $ymdh | cut -c5-6 ),
        inp%bdd=$( echo $ymdh | cut -c7-8 ),
        inp%bhh=$( echo $ymdh | cut -c9-10 ),
        inp%model=17,
        inp%modtyp='regional',
        inp%lt_units='hours',
        inp%file_seq='multi',
        inp%nesttyp='moveable'/
&atcfinfo atcfnum=81,atcfname='HWRF',
          atcfymdh=$ymdh,atcffreq=300/
&trackerinfo trkrinfo%westbd=,
      trkrinfo%eastbd=,
      trkrinfo%northbd=,
      trkrinfo%southbd=,
      trkrinfo%type='tracker',
      trkrinfo%mslpthresh=$mslpthresh,
      trkrinfo%v850thresh=$v850thresh,
      trkrinfo%gridtype='regional',
      trkrinfo%contint=$contour_interval,
      trkrinfo%out_vit='$write_vit'/
&phaseinfo phaseflag='$phaseflag',
           phasescheme='both',
           wcore_depth=1.0/
&structinfo structflag='$structflag',
            ikeflag='n'/
&fnameinfo  gmodname='hwrf',
            rundescr='20x20',
            atcfdescr='$storm$stormid'/
&verbose verb=3/
&waitinfo use_waitfor='n',
          wait_min_age=10,
          wait_min_size=100,
          wait_max_wait=5,
          wait_sleeptime=5
          use_per_fcst_command='n',
          per_fcst_command=" "/
EOF

# Input vitals:
cp -pf          $vit                                    fort.12
    
# Genesis vitals are disabled since HWRF only predicts one storm
# and/or genesis case, which is specified in fort.12:
true            >                                       fort.13
true            >                                       fort.14

# These two are for running with a giant combined GRIB input file:
ln -s -f        ${gribfile}                             fort.11
ln -s -f        ${ixfile}                               fort.31

set +x
echo "+++ TIMING: BEFORE hwrf_unified_tracker  ---> `date`"
set -x

set +e
$gettrk < $namelist
trkret=$?

set +x
echo "+++ TIMING: AFTER  hwrf_unified_tracker  ---> `date`"
set -x

# The final track file is in fort.64.  We need to copy that to the
# final output location.

if [[ -s fort.64 ]] ; then
    "$USHhwrf/hwrf_cleanup_track.sh" fort.64 "$outfile"
    exit 0
else
    echo "ERROR: NO fort.64 FILE CREATED OR FILE IS BLANK.  TRACKER FAILED."
    exit 1
fi
