
#======================================================================
# Clear coupler log files for comparison tests
#======================================================================

unsetenv CPLLOG_INIT
unsetenv CPLLOG_HYBR
unsetenv CPLLOG_BRCH
unsetenv CPLLOG_REST
setenv DETECT_MEMORY_LEAK
# if comparing with baseline also compare memory highwater mark from baseline
# and throughput
if ($?COMPARE_BASELINE ) then
  setenv COMPARE_MEMORY
  setenv COMPARE_THROUGHPUT
endif

#--- clone the main case to create ref1 and ref2 cases
set CASER0  = ${CASEROOT}
set CASERR1 = ${CASEROOT}.ref1
set CASERR2 = ${CASEROOT}.ref2
set CASE0   = ${CASE}

cd $CCSMROOT/scripts
rm -r -f ${CASERR1}; ./create_clone -case ${CASERR1} -clone ${CASER0} 
rm -r -f ${CASERR2}; ./create_clone -case ${CASERR2} -clone ${CASER0} 

cd $CASERR1
./xmlchange -file env_build.xml -id EXEROOT        -val ${EXEROOT}
./xmlchange -file env_build.xml -id BUILD_COMPLETE -val TRUE
./cesm_setup

cd $CASERR2
./xmlchange -file env_build.xml -id EXEROOT        -val ${EXEROOT}
./xmlchange -file env_build.xml -id BUILD_COMPLETE -val TRUE
./cesm_setup

#---- determine run lengths needed below 
cd $CASER0
source ./Tools/ccsm_getenv || exit -1

@ stopn0 = ${STOP_N}
set start0 = $RUN_STARTDATE

@ stopn1 = ${STOP_N} / 6
@ restn1 = ${stopn1}
set start1 = ${RUN_STARTDATE}

@ stopn2 = ${STOP_N} - ${stopn1}
@ restn2 = ${stopn2} / 2 + 1
@ histn  = ${stopn2}
set sy = `echo $start1 | cut -f 1 -d "-"`
set sc = `echo $start1 | cut -f 2- -d "-"`
@ sy = $sy + 2
set sy2 = `$CCSMROOT/scripts/ccsm_utils/Tools/year_string.sh $sy`
set start2 = "${sy2}-${sc}"

@ stopn3 = ${stopn2} - ${restn2}
@ restn3 = ${stopn3} / 2 + 1

@ stopn4 = ${stopn3} - ${restn3}

if (${stopn4} < 1 || ${stopn1} < 1) then
  echo "ERROR in ${0}:  run length too short" >>& $TESTSTATUS_LOG
  echo "TFAIL ${CASEBASEID} " >&! $TESTSTATUS_OUT
  exit -1
endif

#======================================================================
# do an initial ref1 case run, with restart,
#   by cloning the case and running there
#======================================================================

cd ${CASERR1}
source ./Tools/ccsm_getenv || exit -1
echo "ref1: doing a ${stopn1} ${STOP_OPTION} initial startup from ${start1}" >>& $TESTSTATUS_LOG 

#--- setup ref1 case 
./xmlchange -file env_run.xml -id CONTINUE_RUN  -val FALSE
./xmlchange -file env_run.xml -id RUN_STARTDATE -val ${start1}
./xmlchange -file env_run.xml -id STOP_N        -val ${stopn1}
./xmlchange -file env_run.xml -id REST_OPTION   -val ${STOP_OPTION}
./xmlchange -file env_run.xml -id REST_N        -val ${restn1}
./xmlchange -file env_run.xml -id HIST_OPTION   -val never

#--- force cam namelist to write out initial file at end of run
if (-e user_nl_cam) then
  set cnt = `grep inithist user_nl_cam | wc -l`
  if ($cnt == 0) then
     echo "inithist = 'ENDOFRUN'" >> user_nl_cam
  endif
endif

#--- run ref1 case
./$CASE.run

gunzip ${DOUT_S_ROOT}/cpl/logs/cpl.log*.gz
set CplLogFile = `ls -1t ${DOUT_S_ROOT}/cpl/logs/cpl.log* | head -1`
setenv CPLLOG_INIT $CplLogFile
setenv BASEGEN_FILE01 $CplLogFile

set DOUTSR1 = ${DOUT_S_ROOT}
set basestatus = "FAIL "
if ( $?CPLLOG_INIT ) then
  echo "Checking successful completion of init cpl log file" >>& $TESTSTATUS_LOG
  set pass = `zgrep "SUCCESSFUL TERM" $CPLLOG_INIT | wc -l`
  if ( $pass != 0 ) then
    set basestatus = "PASS "
    echo "$basestatus ${CASEBASEID}.1 " >>& $TESTSTATUS_LOG
  else
    set basestatus = "FAIL "
    echo "$basestatus ${CASEBASEID}.1 " >>& $TESTSTATUS_LOG
    echo "$basestatus ${CASEBASEID} " >&! $TESTSTATUS_OUT
    exit -5
  endif
endif

#======================================================================
# do a hybrid ref2 case run
#   by cloning the main case and running with ref1 restarts
#======================================================================

cd ${CASERR2}
source ./Tools/ccsm_getenv
# Set startdate to start2, set ref date based on ref1 restart
set refdate2   = `ls -1dt ${DOUTSR1}/rest/*-00000* | head -1 | sed "s/-00000.*//" | sed "s/^.*rest\///" `
echo "ref2: doing a ${stopn2} ${STOP_OPTION} hybrid startup from $start2 using ref1 ${refdate2}" >>& $TESTSTATUS_LOG 

#--- setup ref2 case 
./xmlchange -file env_run.xml -id RUN_TYPE      -val hybrid
./xmlchange -file env_run.xml -id RUN_STARTDATE -val ${start2}
./xmlchange -file env_run.xml -id RUN_REFCASE   -val $CASE0.ref1
./xmlchange -file env_run.xml -id RUN_REFDATE   -val ${refdate2}
./xmlchange -file env_run.xml -id GET_REFCASE   -val FALSE
./xmlchange -file env_run.xml -id CONTINUE_RUN  -val FALSE
./xmlchange -file env_run.xml -id STOP_N        -val ${stopn2}
./xmlchange -file env_run.xml -id REST_OPTION   -val ${STOP_OPTION}
./xmlchange -file env_run.xml -id REST_N        -val ${restn2}
./xmlchange -file env_run.xml -id HIST_OPTION   -val ${STOP_OPTION}
./xmlchange -file env_run.xml -id HIST_N        -val ${histn}

mkdir -p $RUNDIR
ln -s ${DOUTSR1}/rest/${refdate2}-00000/*${refdate2}* $RUNDIR/.
cp    ${DOUTSR1}/rest/${refdate2}-00000/*rpointer*    $RUNDIR/.

#--- run ref case
./$CASE.run

gunzip ${DOUT_S_ROOT}/cpl/logs/cpl.log*.gz
set CplLogFile = `ls -1t ${DOUT_S_ROOT}/cpl/logs/cpl.log* | head -1`
setenv CPLLOG_HYBR $CplLogFile
setenv BASEGEN_FILE02 $CplLogFile
set cplhist_hybr = `ls -1t ${DOUT_S_ROOT}/cpl/hist/*.cpl.hi.*.nc | head -1`
mv ${cplhist_hybr} ${cplhist_hybr}.base
set cplhist_hybr = ${cplhist_hybr}.base

set DOUTSR2 = ${DOUT_S_ROOT}

set basestatus = "FAIL "
if ( $?CPLLOG_HYBR ) then
  echo "Checking successful completion of hybr cpl log file" >>& $TESTSTATUS_LOG
  set pass = `zgrep "SUCCESSFUL TERM" $CPLLOG_HYBR | wc -l`
  if ( $pass != 0 ) then
    set basestatus = "PASS "
    echo "$basestatus ${CASEBASEID}.2 " >>& $TESTSTATUS_LOG
  else
    set basestatus = "FAIL "
    echo "$basestatus ${CASEBASEID}.2 " >>& $TESTSTATUS_LOG
    echo "$basestatus ${CASEBASEID} " >&! $TESTSTATUS_OUT
    exit -5
  endif
endif

#======================================================================
# do a branch run from ref2 restart
#======================================================================

cd $CASER0
source ./Tools/ccsm_getenv
set refdate3   = `ls -1dt ${DOUTSR2}/rest/*-00000* | head -1 | sed "s/-00000.*//" | sed "s/^.*rest\///" `
echo "doing a ${stopn3} ${STOP_OPTION} branch startup from ref2 ${refdate3}" >>& $TESTSTATUS_LOG 

cp -f env_run.xml env_run.xml.base # save the original settings

./xmlchange -file env_run.xml -id RUN_TYPE      -val branch
./xmlchange -file env_run.xml -id RUN_REFCASE   -val $CASE0.ref2
./xmlchange -file env_run.xml -id RUN_REFDATE   -val ${refdate3}
./xmlchange -file env_run.xml -id GET_REFCASE   -val FALSE
./xmlchange -file env_run.xml -id CONTINUE_RUN  -val FALSE
./xmlchange -file env_run.xml -id STOP_N        -val ${stopn3}
./xmlchange -file env_run.xml -id REST_OPTION   -val ${STOP_OPTION}
./xmlchange -file env_run.xml -id REST_N        -val ${restn3}
./xmlchange -file env_run.xml -id HIST_OPTION   -val never

mkdir -p $RUNDIR
ln -s ${DOUTSR2}/rest/${refdate3}-00000/*${refdate3}* $RUNDIR/.
cp    ${DOUTSR2}/rest/${refdate3}-00000/*rpointer*    $RUNDIR/.
./$CASE.run

gunzip ${DOUT_S_ROOT}/cpl/logs/cpl.log*.gz
set CplLogFile = `ls -1t ${DOUT_S_ROOT}/cpl/logs/cpl.log* | head -1`
setenv CPLLOG_BRCH    $CplLogFile
setenv BASEGEN_FILE03 $CplLogFile

set basestatus = "FAIL "
if ( $?CPLLOG_BRCH ) then
  echo "Checking successful completion of brch cpl log file" >>& $TESTSTATUS_LOG
  set pass = `zgrep "SUCCESSFUL TERM" $CPLLOG_BRCH | wc -l`
  if ( $pass != 0 ) then
    set basestatus = "PASS "
    echo "$basestatus ${CASEBASEID}.3 " >>& $TESTSTATUS_LOG
  else
    set basestatus = "FAIL "
    echo "$basestatus ${CASEBASEID}.3 " >>& $TESTSTATUS_LOG
    echo "$basestatus ${CASEBASEID} "   >&! $TESTSTATUS_OUT
  endif
endif

#======================================================================
# do a true restart continue run
#======================================================================

cd $CASEROOT
echo "doing a ${stopn4} ${STOP_OPTION} continue restart test" >>& $TESTSTATUS_LOG 

./xmlchange -file env_run.xml -id CONTINUE_RUN  -val TRUE
./xmlchange -file env_run.xml -id STOP_N        -val ${stopn4}
./xmlchange -file env_run.xml -id REST_OPTION   -val never
./xmlchange -file env_run.xml -id DOUT_S        -val FALSE
./xmlchange -file env_run.xml -id HIST_OPTION   -val ${STOP_OPTION}
./xmlchange -file env_run.xml -id HIST_N        -val ${histn}

./$CASE.run

gunzip $RUNDIR/cpl.log*.gz
set CplLogFile = `ls -1t $RUNDIR/cpl.log* | head -1`
setenv CPLLOG_REST $CplLogFile
setenv BASEGEN_FILE04 $CplLogFile
set cplhist_rest = `ls -1t $RUNDIR/*.cpl.hi.*.nc | head -1`

# restore to original settings
cp -f env_run.xml      env_run.xml.run
cp -f env_run.xml.base env_run.xml

#======================================================================
# runs complete, compare hybrid run and restart run
#======================================================================
setenv CPLLOG_GENCMP $CPLLOG_REST 
echo "Initial Test log is $CPLLOG_INIT" >>& $TESTSTATUS_LOG 
echo "Hybrid  Test log is $CPLLOG_HYBR" >>& $TESTSTATUS_LOG 
echo "Branch  Test log is $CPLLOG_BRCH" >>& $TESTSTATUS_LOG 
echo "Restart Test log is $CPLLOG_REST" >>& $TESTSTATUS_LOG 
echo "Hybrid  Test hist is $cplhist_hybr" >>& $TESTSTATUS_LOG 
echo "Restart Test hist is $cplhist_rest" >>& $TESTSTATUS_LOG 

#======================================================================
# Check case validation first
#======================================================================

set basestatus = "UNDEF"

if ( $?CPLLOG_INIT ) then
  echo "Checking successful completion in init cpl log file" >>& $TESTSTATUS_LOG
  set pass = `zgrep "SUCCESSFUL TERM" $CPLLOG_INIT | wc -l`
  if ( $pass != 0 ) then
    set basestatus = "PASS "
  else
    set basestatus = "FAIL "
  endif

  if ( $?CPLLOG_HYBR ) then
    if ( $?CPLLOG_REST ) then
    echo "CPLLOG_HYBR $CPLLOG_HYBR"  >>& $TESTSTATUS_LOG
    echo "CPLLOG_REST $CPLLOG_REST"  >>& $TESTSTATUS_LOG
    set CPLLOG_HYBR_GZ = `basename $CPLLOG_HYBR`
    set CPLLOG_HYBR_ORIG=`echo $CPLLOG_HYBR_GZ:r`
    echo "copying hybrid coupler log file from archive directory to run directory.." >>& $TESTSTATUS_LOG
    cp -p  $CPLLOG_HYBR ${RUNDIR}/$CPLLOG_HYBR_GZ
    echo "gunzipping hybrid coupler log file for comparison to restart log file.." >>& $TESTSTATUS_LOG
    gunzip ${RUNDIR}/$CPLLOG_HYBR_GZ

    echo "Comparing hybrid log file with restart log file" >>& $TESTSTATUS_LOG
    $CASETOOLS/check_exactrestart.pl ${RUNDIR}/$CPLLOG_HYBR_ORIG  $CPLLOG_REST >>& $TESTSTATUS_LOG
      set pass = `tail -1 $TESTSTATUS_LOG | grep PASS | wc -l`
      if ( $pass != 0 ) then
        set basestatus = "PASS "
      else
        set basestatus = "FAIL "
      endif
    else
      echo "ERROR in ${0}:  restart coupler log file NOT set" >>& $TESTSTATUS_LOG
      set basestatus = "ERROR"
    endif
  else
    echo "ERROR in ${0}:  hybrid coupler log file NOT set" >>& $TESTSTATUS_LOG
    set basestatus = "ERROR"
  endif

else
  echo "ERROR in ${0}:  initial coupler log file NOT set" >>& $TESTSTATUS_LOG
  set basestatus = "ERROR"
endif

if ($basestatus == "PASS") then
if ( $?cplhist_hybr ) then
  if ( $?cplhist_rest ) then
    echo "Comparing initial hist file with second hist file" >>& $TESTSTATUS_LOG
    cd $RUNDIR
    $CASETOOLS/hist_compare.csh $cplhist_hybr $cplhist_rest >>& $TESTSTATUS_LOG
    cd $CASEROOT
    set pass = `tail -1 $TESTSTATUS_LOG | grep PASS | wc -l`
    if ( $pass != 0 ) then
      set basestatus = "PASS "
    else
      set basestatus = "FAIL "
    endif
  else
    echo "ERROR in ${0}:  restart coupler hist file NOT set" >>& $TESTSTATUS_LOG
    set basestatus = "ERROR"
  endif
else
  echo "ERROR in ${0}:  initial coupler hist file NOT set" >>& $TESTSTATUS_LOG
  set basestatus = "ERROR"
endif
endif

echo "$basestatus ${CASEBASEID} " >&! $TESTSTATUS_OUT

