#!/bin/sh
#
# author : A. Hebert
# use    : rtrivac [-c:|-q|-w|-p:|-i:] <file.x2m>
# note   : <file.x2m> must be located on directory ./data/
#          If <file.access> exists, it is executed.
#          -c name of compiler
#          -q quiet execution for regression testing
#          -w to execute in console (for debug purpose)
#          -p number of parallel threads (=1 by default)
#          -i name of x2m dataset (by default, use the last argument)
#
if [ $# = 0 ]
   then
   echo "usage: rtrivac [-c:|-q|-w|-p:|-i:] <file.x2m>" 1>&2
   exit 1
fi
System=`uname -s`
Sysx="`echo $System | cut -b -6`"
if [ $Sysx = "CYGWIN" ]; then
   MACH=`uname -o`
elif [ $Sysx = "AIX" ]; then
   MACH=`uname -s`
else
   MACH=`uname -sm | sed 's/[ ]/_/'`
fi

for last; do : ; done
mydata=${last}
typ='custom'
quiet=0
term=0
nomp=0

while getopts ":c:qwi:p:" opt; do
  case $opt in
    c) typ="$OPTARG"
    ;;
    q) quiet=1
    ;;
    w) term=1
    ;;
    p) nomp=$OPTARG
    ;;
    i) mydata=$OPTARG
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    exit 1
    ;;
  esac

  case $OPTARG in
    -*) echo "Option $opt needs a valid argument"
    exit 1
    ;;
  esac
done

xxx=`basename $mydata .x2m`
Code=`basename "$PWD"`
if [ $quiet = 0 ]; then
  echo 'execute' $xxx 'with' $Code 'on system' $MACH 'with' $typ 'compiler'
fi

if [ -d "$MACH" ]; then
  if [ $quiet = 0 ]; then
    echo 'use the existing directory' $MACH
  fi
else
  echo 'creation of directory' $MACH
  mkdir "$MACH"
fi
CodeDir=$PWD

if [ $Sysx = "AIX" ]; then
  Tmpdir=/usr/tmp
elif [ $Sysx = "SunOS" ]; then
  Tmpdir=/var/tmp
else
  Tmpdir=/tmp
fi
inum=1
while [ -d $Tmpdir/rundir$inum ]
  do
  inum=`expr $inum + 1 `
done
Rundir=$Tmpdir/rundir$inum
mkdir $Rundir
if [ $quiet = 0 ]; then
  echo "RunDirectory:" $Rundir
fi
cd $Rundir

if [ $typ = 'custom' ]; then
  cp "$CodeDir"/bin/"$MACH"/$Code ./code
else
  cp "$CodeDir"/bin/"$MACH"'_'$typ/$Code ./code
fi
cp "$CodeDir"/data/$mydata ./mydata

export NO_STOP_MESSAGE=1
if [ -d "$CodeDir"/data/`echo $xxx`_proc ]; then
  cp "$CodeDir"/data/`echo $xxx`_proc/*.c2m . 2> /dev/null
fi
if [ -f "$CodeDir"/data/$xxx.access ]; then
  if [ $quiet = 0 ]; then
    "$CodeDir"/data/$xxx.access "$CodeDir"
  else
    "$CodeDir"/data/$xxx.access "$CodeDir" > /dev/null
  fi
fi
if [ -f "$CodeDir"/data/assertS.c2m ]; then
  cp "$CodeDir"/data/assertS.c2m .
fi
if [ -f "$CodeDir"/data/assertV.c2m ]; then
  cp "$CodeDir"/data/assertV.c2m .
fi
before=$(date +%s)
if [ $nomp != 0 ]; then
  echo 'number of OpenMP threads=' $nomp
  export OMP_NUM_THREADS=$nomp
  if command -v numactl >&2; then
    numactl --cpunodebind=0 --membind=0 2>/dev/null
    echo "use NUMA memory policy"
  fi
else
  export OMP_NUM_THREADS=1
fi
if [ $term = 0 ]; then
  ./code <mydata >$xxx.result
elif [ $term = 1 ]; then
  ./code <mydata
fi
if [ $quiet = 0 ]; then
  time=$(( $(date +%s) - before))
  printf 'End of execution. Total execution time: %dh %dmin %ds\n' \
    $(($time/3600)) $(($time%3600/60)) $(($time%60))
fi
if [ -f "$CodeDir"/data/$xxx.save ]; then
  if [ $quiet = 0 ]; then
    "$CodeDir"/data/$xxx.save "$CodeDir"
  else
    "$CodeDir"/data/$xxx.save "$CodeDir" > /dev/null
  fi
fi
mv $xxx.result "$CodeDir"/"$MACH"
if [ $quiet = 0 ]; then
  echo 'the listing is located on ./'$MACH
fi

cd "$CodeDir"/"$MACH"
if [ $quiet = 0 ] && [ $term = 0 ]; then
  tail -15 $xxx.result
elif [ $term = 0 ]; then
  RED='\033[0;31m'
  GREEN='\033[0;32m'
  NC='\033[0m' # No Color
  if tail $xxx.result | grep -q "normal end" ; then
    printf "${GREEN}[OK]${NC}\n"
  else
    printf "${RED}[FAILED]${NC}\n"
  fi
fi
chmod -R 777 $Rundir
/bin/rm -r -f $Rundir
cd ..
