#! /usr/bin/env bash

# $Header: /u/gcmpack/MITgcm/tools/example_scripts/csail/test_dickens,v 1.26 2013/06/28 15:38:19 jmc Exp $

#  Test script for MITgcm that should work on most of the csail.mit.edu
#  Linux machines.

# defaults
export PATH="$PATH:/usr/local/bin"
#if [ -d ~/bin ]; then export PATH=$PATH:~/bin ; fi
#- to get case insensitive "ls" (and order of tested experiments)
export LC_ALL="en_US.UTF-8"
#  Turn off stack limit for FIZHI & AD-tests
ulimit -s unlimited
#  MPI test (for now, only with gfortran)
#  export MPI_GCC_DIR=/srv/software/gcc/gcc-packages/gcc-4.4.5/mpich2/mpich2-1.3
#  export MPI_INC_DIR=$MPI_GCC_DIR/include
#  export PATH="$PATH:$MPI_GCC_DIR/bin"

#- method to acces CVS:
 # export CVSROOT='/u/gcmpack'
 # export CVSROOT=':ext:@mitgcm.org:/u/gcmpack'
 # export CVS_RSH='ssh' ; cvs co -P MITgcm > /dev/null
 # cvs -d :pserver:cvsanon@mitgcm.org:/u/gcmpack co -P MITgcm > /dev/null
cmdCVS='cvs -d :pserver:cvsanon@mitgcm.org:/u/gcmpack'
cmdCVS='cvs -d /u/gcmpack'

# checkOut=2 : download new code ;
#   =1 : update code       (if no existing code -> swith to 2)
#   =0 : use existing code (if no existing code -> swith to 2)
dInWeek=`date +%a`
TESTDIR="/tmp/jmc/test_"`hostname -s`
MC=13
checkOut=2
sepDir=0
option=
#tst_list='g7a adm mpa g77 gfo+rs mth mp2+rs mpi ifc'
#if test "x$dInWeek" = xSun ; then tst_list="$tst_list tlm oad" ; fi
#tst_list='g77 adm gfo ifc mth pgi+rs'
tst_list='g77 gfo+rs mth'

#option="-nc" ; checkOut=1
#option="-q"  ; checkOut=1

TODAY=`date +%d`
tdir=$TESTDIR
if test $checkOut != 2 ; then
  if test -e $tdir/MITgcm/CVS ; then
    echo $tdir/MITgcm/CVS 'exist'
    if test $sepDir = 0 -a $checkOut = 1 ; then
      echo -n "Update the MITgcm code using: $cmdCVS ..."
      cd $tdir/MITgcm
      $cmdCVS update -P -d
      echo "  done"
    fi
  else
    echo -n $tdir/MITgcm 'missing ; '
    checkOut=2
  fi
fi
if test $checkOut = 2 ; then
  if test -e $tdir ; then
    echo -n "Removing working copy: $tdir/MITgcm ..."
    test -e $tdir/MITgcm  &&  rm -rf $tdir/MITgcm
  else
    echo -n "Creating a working dir: $tdir ..."
    mkdir $tdir
  fi
  echo "  done"
  echo -n "Downloading the MITgcm code using: $cmdCVS ..."
  cd $tdir
  $cmdCVS co -P MITgcm > /dev/null
  echo "  done"
else
  cd $tdir
fi

#------------------------------------------------------------------------

firstTst=`echo $tst_list | awk '{print $1}'`
last_Tst=`echo $tst_list | awk '{print $NF}'`
for tt in $tst_list
do

  echo "================================================================"
  typ=`echo $tt | sed 's/+rs//'`
  #- check day and time:
  curDay=`date +%d` ; curHour=`date +%H`
  if [ $curDay -ne $TODAY ] ; then
    date ; echo "day is over => skip test $typ"
    continue
  fi
  if [ $curHour -ge 18 ] ; then
    date ; echo "too late to run test $typ"
    continue
  fi
  if test $sepDir = 0 -a "x$option" != x -a  $tt != $last_Tst ; then
    echo "using option='$option' prevent multi-tests => skip test $typ"
    continue
  fi
  #- clean-up old output files
  rm -f $tdir/output_${typ}*
  touch $tdir/output_$tt
  if test $sepDir = 1 ; then
    new_dir="MITgcm_$typ"
    if test -d $new_dir/CVS -a $checkOut != 2 ; then
      pushd $new_dir
      if test $tt != $typ ; then
        ( cd verification ; ../tools/do_tst_2+2 -clean )
      fi
      if test $checkOut = 1 ; then
        echo -n "Update the MITgcm code using: $cmdCVS ..."
        $cmdCVS update -P -d
        echo "  done"
      fi
    else
      test -e $new_dir  &&  rm -rf $new_dir
      mkdir $new_dir
      pushd $new_dir
      cp -ra ../MITgcm/* .
    fi
  else
    pushd MITgcm
  fi
  cd verification

#-- set the testreport command:
  comm="./testreport"
  if test $typ = 'g7a' -o  $typ = 'adm' -o  $typ = 'mpa' ; then
    comm="$comm -adm"
  elif test $typ = 'oad' ; then
    comm="$comm -oad"
  elif test $typ = 'tlm' ; then
    comm="$comm -tlm"
  elif test $typ = 'mth' -o  $typ = 'mp2' ; then
    export GOMP_STACKSIZE=400m
    export OMP_NUM_THREADS=2
    comm="$comm -mth"
  else
    comm="$comm -md makedepend"
  fi
  comm="$comm -a jmc@mitgcm.org"
#-- set the optfile (+ mpi & match-precision)
  MPI=0
  case $typ in
   'g77'|'g7a')		OPTFILE='../tools/build_options/linux_amd64_g77' ;;
   'gfo'|'adm'|'oad'|'tlm'|'mth') comm="$comm -match $MC"
			OPTFILE='../tools/build_options/linux_amd64_gfortran' ;;
   'ifc')		OPTFILE='../tools/build_options/linux_amd64_ifort11' ;;
   'pgi')		OPTFILE='../tools/build_options/linux_amd64_pgf77' ;;
   'mpa'|'mpi'|'mp2')	comm="$comm -match $MC" ; MPI=6
			OPTFILE='../tools/build_options/linux_amd64_gfortran' ;;
       *)		OPTFILE= ;;
  esac
#-- set MPI command:
  if test $MPI != 0 ; then
    if test $typ = 'mp2' ; then MPI=3 ; fi
    if test $typ = 'mpa' ; then
      EXE="mpirun -np TR_NPROC ./mitgcmuv_ad"
    else
      EXE="mpirun -np TR_NPROC ./mitgcmuv"
    fi
  fi

#-- set specific Env Vars:
  if test $typ = 'oad' ; then
    source ~jmc/mitgcm/bin/setenv_OpenAD.sh
  fi
  if test $typ = 'ifc' ; then
    source /srv/software/intel/intel-11.1.073/bin/ifortvars.sh intel64
  fi
  if test $typ = 'pgi' ; then
   #listT='fizhi-cs-32x32x40 fizhi-cs-aqualev20'
    export PGI=/srv/software/pgi/pgi-10.9
    export PATH="$PATH:$PGI/linux86-64/10.9/bin"
    export LM_LICENSE_FILE=$PGI/license.dat
  fi

  if test $sepDir = 0 -a "x$option" = x -a $tt = $firstTst -a $checkOut != 2 ; then
#-- cleaning:
    echo "======================"
    echo "Cleaning test directories:"	| tee -a $tdir/output_$tt
    cmdCLN="./testreport -clean"
    echo " clean dir running: $cmdCLN"	| tee -a $tdir/output_$tt
    $cmdCLN >> $tdir/output_$tt 2>&1
    echo "======================"
    echo ""				| tee -a $tdir/output_$tt
  fi

#-- run the testreport command:
  echo -n "Running testreport using:"	| tee -a $tdir/output_$tt
  if test "x$OPTFILE" != x ; then
    comm="$comm -of=$OPTFILE"
  fi
  if test $MPI = 0 ; then  echo ''	| tee -a $tdir/output_$tt
  else echo " (EXE='$EXE')"		| tee -a $tdir/output_$tt
    comm="$comm -MPI $MPI -command \"\$EXE\""
  fi
  if test "x$option" != x ; then comm="$comm $option" ; fi
 #if test $typ = 'pgi' ; then comm="$comm -t \"\$listT\"" ; fi
  echo "  \"eval $comm\""		| tee -a $tdir/output_$tt
  echo "======================"
  eval $comm >> $tdir/output_$tt 2>&1
  sed -n "/^An email /,/^======== End of testreport / p" $tdir/output_$tt
  echo ""				| tee -a $tdir/output_$tt

#-- also test restart (test 2+2=4)
  if test $tt != $typ
  then
    echo "testing restart using:"	| tee -a $tdir/output_$tt
    comm="../tools/do_tst_2+2 -a jmc@mitgcm.org"
    if test $MPI = 0 ; then
      echo "  \"$comm\""		| tee -a $tdir/output_$tt
      echo "======================"
      $comm >> $tdir/output_$tt 2>&1
    else
      echo "  \"$comm -mpi -exe $EXE\""	| tee -a $tdir/output_$tt
      echo "======================"
      $comm -mpi -exe "$EXE" >> $tdir/output_$tt 2>&1
    fi
    echo ; cat tst_2+2_out.txt
    echo
  fi
  export OMP_NUM_THREADS=1

  if test $sepDir = 0 ; then
#-- cleaning:
    echo "======================"
    echo "Cleaning test directories:"	| tee -a $tdir/output_$tt
    if test $tt != $typ ; then
      cmdCLN="../tools/do_tst_2+2 -clean"
      echo " clean tst_2+2 running: $cmdCLN"	| tee -a $tdir/output_$tt
      $cmdCLN >> $tdir/output_$tt 2>&1
    fi
    if test $tt != $last_Tst ; then
      cmdCLN="./testreport -clean"
      echo " clean dir running: $cmdCLN"	| tee -a $tdir/output_$tt
      $cmdCLN >> $tdir/output_$tt 2>&1
    fi
    echo "======================"
    echo
  fi
  popd

done
