#! /bin/ksh

# This script will run the tracker in parallel with the forecast
# and post-processors.  All tracks are produced by this one job.

set -x
PS4='$SECONDS + exhwrf_track_swath.sh.sms line $LINENO: ' 

sh ${utilscript}/setup.sh
export pgm=exhwrf_track_swath.sh.sms
. prep_step
startmsg

# ----------------------------------------------------------------------
# Source the holdvars file if it exists

if test -f ${COMOUT}/${stormlabel}.holdvars.txt
then
   . ${COMOUT}/${stormlabel}.holdvars.txt
else
   set +x
   echo " "
   echo "!!! ERROR: holdvars.txt file missing"
   echo " "
   set -x
   msg="Hurricane to Run But No ${stormlabel}.holdvars.txt file found."
   postmsg "$jlogfile" "$msg"
   export err=911;err_chk
   err_exit "Hurricane to Run But No ${stormlabel}.holdvars.txt file found."
fi

export ATMOS_DOMAINS="${ATMOS_DOMAINS:-3}"
export CSTREAM=${DATA}/$STORM.$PDY$cyc
echo 'CSTREAM = ' ${CSTREAM} 
export TRKDIR="$CSTREAM/TRACK"

# ----------------------------------------------------------------------
# Figure out where WRF is running

# This is dependent on whether th ocean vetoed coupling, so we need
# to check the ocean_status file now.

if [ -s ${COMOUT}/ocean_status.${STORM}${STORMID}.${YYYYMMDDHH} ]  
then
   echo "Will source file ${COMOUT}/ocean_status.${STORM}${STORMID}.${YYYYMMDDHH}"
   . ${COMOUT}/ocean_status.${STORM}${STORMID}.${YYYYMMDDHH}    
   echo 'RUN_COUPLED = ' ${RUN_COUPLED} 
else
   echo 'No ocean_status file present; set RUN_COUPLED=NO'  
   RUN_COUPLED=NO
fi     

if [ ${RUN_COUPLED} = YES ] 
then
   MODEL=COUPLED
else
   MODEL=ATMOS
fi
echo 'MODEL = ' ${MODEL}

if [[ $MODEL == COUPLED ]]; then
    WRFDIR=${DATA}/$STORM.${YYYYMMDDHH}/COUPLED_FCST
else
    WRFDIR=${DATA}/$STORM.${YYYYMMDDHH}/ATMOS_FCST
fi
echo "For MODEL = ${MODEL}:  WRFDIR =  ${WRFDIR}" 

# ----------------------------------------------------------------------
# Prepare the directories

function fail {
    msg="$*"
    "${utilscript:-${NWPROD}/util/ush}/setup.sh"
    ./err_exit "$exitmsg"
}

rm -rf "$TRKDIR"
$USHhwrf/hwrf_mkdirp.sh "$TRKDIR/run"
$USHhwrf/hwrf_mkdirp.sh "$TRKDIR/27km/grib" "$TRKDIR/27km/trak"
$USHhwrf/hwrf_mkdirp.sh "$TRKDIR/9km/grib" "$TRKDIR/9km/trak"
if [[ "$ATMOS_DOMAINS" == 3 ]] ; then
    $USHhwrf/hwrf_mkdirp.sh "$TRKDIR/3km/grib" "$TRKDIR/3km/trak"
fi

cd "$TRKDIR/run"
if [[ "$?" != 0 ]] ; then
    fail "Cannot cd to $TRKDIR/run"
fi

# ----------------------------------------------------------------------
# Generate the POE command file

cmdnum=1

function commandify {
    $USHhwrf/hwrf_mkdirp.sh "$TRKDIR/$1/grib" "$TRKDIR/$1/trak" 1>&2

    echo '#! /bin/ksh'
    echo ' '
    echo '# DO NOT EDIT THIS SCRIPT.  IT IS AUTOMATICALLY GENERATED.'
    echo '# YOUR CHANGES WILL BE LOST.  EDIT exhwrf_tracker.sh.sms'
    echo '# INSTEAD.'
    echo ' '
    echo $USHhwrf/hwrf_realtime_tracker.sh $2 $3 \
         $YMDH $STORM $STORMID $CSTREAM/MESSAGES/storm_vit $COMOUT \
         $TRKDIR/$1/grib $TRKDIR/$1/trak $WRFDIR/ \
        '>' $TRKDIR/run/${2}_${1}.out \
        '2>' $TRKDIR/run/${2}_${1}.err
    echo "echo job $cmdnum done at" '$( date )' ">> done.$cmdnum.stamp"

    echo "./${1}_${2}.cmd" >> cmdf

    cmdnum=$(( cmdnum + 1 ))
}

# SET UP THE COMMAND FILE

# We will have three MPI ranks:
# 1. grib file processor for the tracker
# 2. tracker
# 3. aux_rw

if [[ "$ATMOS_DOMAINS" == 3 ]] ; then
    # Operational configuration: run the 27:9:3 tracker
    commandify 3km make_grib 27:9:3    > 3km_make_grib.cmd
    commandify 3km track 27:9:3        > 3km_track.cmd
elif [[ "$ATMOS_DOMAINS" == 2 ]] ; then
    # Two domain case (27:9) runs the 27:9km tracker
    commandify 9km make_grib 27:9          > 9km_make_grib.cmd
    commandify 9km track 27:9              > 9km_track.cmd
else
    # Single domain doesn't actually work yet due to limitations of
    # the underlying hwrf_realtime_tracker.sh script.  The single
    # domain case requires the old tracker scripts for now.
    commandify 27km make_grib 27           > 27km_make_grib.cmd
    commandify 27km track 27               > 27km_track.cmd
fi

# Now add the aux_rw to the command file:
cat<<EOF > aux_rw.cmd
#! /bin/ksh

${USHhwrf}/hwrf_aux_rw.sh $STORM $YYYY $MM $DD $CYC $MODEL \
    > $TRKDIR/run/aux_rw.out
    2> $TRKDIR/run/aux_rw.err
echo "job $cmdnum done"
EOF
echo "./aux_rw.cmd" >> cmdf

# RUN THE TRACKER AND AUX_RW

export MP_PGMMODEL=mpmd
export MP_CMDFILE=cmdf
export USE_SERPOE=yes

echo STARTING REAL-TIME TRACKER SCRIPTS
echo LOOK IN THIS DIRECTORY FOR STDOUT AND STDERR LOGS:
echo "$TRKDIR/run/"

chmod 755 *.cmd

$utilscript/setup.sh
poe
export err="$?" ; err_chk

# for icmd in $( seq 1 2 ) ; do
#     if ( ! "$USHhwrf/hwrf_file_complete.pl" -v -w $(( 2*3600+40*60 )) \
#                -S 30 -o 0 -s 1 done.$icmd.stamp ) ; then
#         fail "Something is wrong with the tracker.  Process $cmdnum is taking too long to exit."
#     fi
# done

echo ALL REAL-TIME TRACKER AND SWATH SCRIPTS HAVE RETURNED.

# Run the tracker delivery script.  We do this even if the tracker
# claims to have failed, so that we will deliver data just in case it
# really did succeed.

echo NOW RUNNING TRACK DELIVERY SCRIPT

$USHhwrf/hwrf_realtime_tracker.sh deliver 27:9:3 \
    $YMDH $STORM $STORMID $CSTREAM/MESSAGES/storm_vit $COMOUT \
    $TRKDIR/3km/grib $TRKDIR/3km/trak $WRFDIR/ 

export err="$?"
if [[ "$err" != 0 ]] ; then
    fail "Tracker delivery script failed -- non-zero exit status $err"
fi
