129921a8fSScott Kruger 229921a8fSScott Kruger 329921a8fSScott Krugerscriptname=`basename $0` 429921a8fSScott Krugerrundir=${scriptname%.sh} 534929e0eSSatish BalayTIMEOUT=60 629921a8fSScott Kruger 729921a8fSScott Krugerif test "$PWD"!=`dirname $0`; then 829921a8fSScott Kruger cd `dirname $0` 9aec279ffSScott Kruger abspath_scriptdir=$PWD 1029921a8fSScott Krugerfi 116c91caf2SScott Krugerif test -d "${rundir}" && test -n "${rundir}"; then 1247e61e69SScott Kruger rm -f ${rundir}/*.tmp ${rundir}/*.err ${rundir}/*.out 136c91caf2SScott Krugerfi 1429921a8fSScott Krugermkdir -p ${rundir} 1580a579ceSSatish Balayif test -n "${runfiles}"; then 1680a579ceSSatish Balay for runfile in ${runfiles}; do 1780a579ceSSatish Balay subdir=`dirname ${runfile}` 1880a579ceSSatish Balay mkdir -p ${rundir}/${subdir} 1980a579ceSSatish Balay cp -r ${runfile} ${rundir}/${subdir} 2080a579ceSSatish Balay done 21d7871bd4SScott Krugerfi 2229921a8fSScott Krugercd ${rundir} 2329921a8fSScott Kruger 2429921a8fSScott Kruger# 2529921a8fSScott Kruger# Method to print out general and script specific options 2629921a8fSScott Kruger# 2729921a8fSScott Krugerprint_usage() { 2829921a8fSScott Kruger 2929921a8fSScott Krugercat >&2 <<EOF 3029921a8fSScott KrugerUsage: $0 [options] 3129921a8fSScott Kruger 3229921a8fSScott KrugerOPTIONS 3329921a8fSScott Kruger -a <args> ......... Override default arguments 34aec279ffSScott Kruger -c ................ Cleanup (remove generated files) 35aec279ffSScott Kruger -C ................ Compile 36e53dc769SScott Kruger -d ................ Launch in debugger 3729921a8fSScott Kruger -e <args> ......... Add extra arguments to default 382f2809e3SToby Isaac -f ................ force attempt to run test that would otherwise be skipped 3929921a8fSScott Kruger -h ................ help: print this message 4029921a8fSScott Kruger -n <integer> ...... Override the number of processors to use 41ba2c5286SScott Kruger -j ................ Pass -j to petscdiff (just use diff) 42ba2c5286SScott Kruger -J <arg> .......... Pass -J to petscdiff (just use diff with arg) 43ba2c5286SScott Kruger -m ................ Update results using petscdiff 44f50802fbSScott Kruger -M ................ Update alt files using petscdiff 455e361860SScott Kruger -o <arg> .......... Output format: 'interactive', 'err_only' 46a6f3f80dSScott Kruger -p ................ Print command: Print first command and exit 470a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 48*baa5c0f4SScott Kruger -U ................ run cUda-memcheck 49b047ed2bSScott Kruger -V ................ run Valgrind 5029921a8fSScott Kruger -v ................ Verbose: Print commands 5129921a8fSScott KrugerEOF 5229921a8fSScott Kruger 5329921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 5429921a8fSScott Kruger exit $1 5529921a8fSScott Kruger} 5629921a8fSScott Kruger### 5729921a8fSScott Kruger## Arguments for overriding things 5829921a8fSScott Kruger# 595e361860SScott Krugeroutput_fmt="interactive" 6029921a8fSScott Krugerverbose=false 6129921a8fSScott Krugercleanup=false 62aec279ffSScott Krugercompile=false 63e53dc769SScott Krugerdebugger=false 64a6f3f80dSScott Krugerprintcmd=false 652f2809e3SToby Isaacforce=false 66d4417257SScott Krugerdiff_flags="" 67*baa5c0f4SScott Krugerwhile getopts "a:cCde:fhjJ:mMn:o:pt:UvV" arg 6829921a8fSScott Krugerdo 6929921a8fSScott Kruger case $arg in 70ba2c5286SScott Kruger a ) args="$OPTARG" ;; 7129921a8fSScott Kruger c ) cleanup=true ;; 72aec279ffSScott Kruger C ) compile=true ;; 73e53dc769SScott Kruger d ) debugger=true ;; 74ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 752f2809e3SToby Isaac f ) force=true ;; 7629921a8fSScott Kruger h ) print_usage; exit ;; 77ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 7829dac19bSScott Kruger j ) diff_flags=$diff_flags" -j" ;; 7929dac19bSScott Kruger J ) diff_flags=$diff_flags" -J $OPTARG" ;; 8029dac19bSScott Kruger m ) diff_flags=$diff_flags" -m" ;; 8129dac19bSScott Kruger M ) diff_flags=$diff_flags" -M" ;; 825e361860SScott Kruger o ) output_fmt=$OPTARG ;; 83a6f3f80dSScott Kruger p ) printcmd=true ;; 840a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 85*baa5c0f4SScott Kruger U ) mpiexec="petsc_mpiexec_cudamemcheck $mpiexec" ;; 86b047ed2bSScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" ;; 8729921a8fSScott Kruger v ) verbose=true ;; 8829921a8fSScott Kruger *) # To take care of any extra args 8929921a8fSScott Kruger if test -n "$OPTARG"; then 9029921a8fSScott Kruger eval $arg=\"$OPTARG\" 9129921a8fSScott Kruger else 9229921a8fSScott Kruger eval $arg=found 9329921a8fSScott Kruger fi 9429921a8fSScott Kruger ;; 9529921a8fSScott Kruger esac 9629921a8fSScott Krugerdone 9729921a8fSScott Krugershift $(( $OPTIND - 1 )) 9829921a8fSScott Kruger 990a091e3eSScott Kruger# Individual tests can extend the default 10075ea7643SJed Brownexport MPIEXEC_TIMEOUT=$((TIMEOUT*timeoutfactor)) 101bbf1c217SScott KrugerSTARTTIME=`date +%s` 1020a091e3eSScott Kruger 10329921a8fSScott Krugerif test -n "$extra_args"; then 10429921a8fSScott Kruger args="$args $extra_args" 10529921a8fSScott Krugerfi 106e53dc769SScott Krugerif $debugger; then 107e53dc769SScott Kruger args="-start_in_debugger $args" 108e53dc769SScott Krugerfi 1091725bfbfSScott Krugerif test -n "$filter"; then 1101725bfbfSScott Kruger diff_flags=$diff_flags" -F \$'$filter'" 1111725bfbfSScott Krugerfi 1121725bfbfSScott Krugerif test -n "$filter_output"; then 1131725bfbfSScott Kruger diff_flags=$diff_flags" -f \$'$filter_output'" 1141725bfbfSScott Krugerfi 115e53dc769SScott Kruger 11629921a8fSScott Kruger 11729921a8fSScott Kruger# Init 11829921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 11929921a8fSScott Krugertotal=0 12029921a8fSScott Krugertodo=-1; skip=-1 1210a091e3eSScott Krugerjob_level=0 12229921a8fSScott Kruger 1235e361860SScott Krugerfunction petsc_report_tapoutput() { 1245e361860SScott Kruger notornot=$1 1255e361860SScott Kruger test_label=$2 1265e361860SScott Kruger comment=$3 1275e361860SScott Kruger if test -n "$comment"; then 1285e361860SScott Kruger comment=" # ${comment}" 1295e361860SScott Kruger fi 1305e361860SScott Kruger 1315e361860SScott Kruger tap_message="${notornot} ok ${test_label}${comment}" 1325e361860SScott Kruger 1335e361860SScott Kruger # Log messages 1345e361860SScott Kruger printf "${tap_message}\n" >> ${testlogtapfile} 1355e361860SScott Kruger 1365e361860SScott Kruger if test ${output_fmt} == "err_only"; then 1375e361860SScott Kruger if test -n "${notornot}"; then 1385e361860SScott Kruger printf "${tap_message}\n" | tee -a ${testlogerrfile} 1395e361860SScott Kruger fi 1405e361860SScott Kruger else 1415e361860SScott Kruger printf "${tap_message}\n" 1425e361860SScott Kruger fi 1435e361860SScott Kruger} 1445e361860SScott Kruger 145a6f3f80dSScott Krugerfunction printcmd() { 146a6f3f80dSScott Kruger # Print command that can be run from PETSC_DIR 147a6f3f80dSScott Kruger cmd="$1" 148a6f3f80dSScott Kruger basedir=`dirname ${PWD} | sed "s#${petsc_dir}/##"` 149a6f3f80dSScott Kruger modcmd=`echo ${cmd} | sed -e "s#\.\.#${basedir}#" | sed s#\>.*##` 150a6f3f80dSScott Kruger printf "${modcmd}\n" 151a6f3f80dSScott Kruger exit 152a6f3f80dSScott Kruger} 153a6f3f80dSScott Kruger 15429921a8fSScott Krugerfunction petsc_testrun() { 15529921a8fSScott Kruger # First arg = Basic command 15629921a8fSScott Kruger # Second arg = stdout file 15729921a8fSScott Kruger # Third arg = stderr file 15829921a8fSScott Kruger # Fourth arg = label for reporting 15929921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 16029921a8fSScott Kruger tlabel=$4 1611725bfbfSScott Kruger error=$5 16229921a8fSScott Kruger cmd="$1 > $2 2> $3" 1631725bfbfSScott Kruger if test -n "$error"; then 164fb2b1c94SScott Kruger cmd="$1 2>&1 | cat > $2" 16529921a8fSScott Kruger fi 1661263882eSScott Kruger echo "$cmd" > ${tlabel}.sh; chmod 755 ${tlabel}.sh 167a6f3f80dSScott Kruger if $printcmd; then 168a6f3f80dSScott Kruger printcmd "$cmd" 169a6f3f80dSScott Kruger fi 1707a853109SScott Kruger 171d8e31410SScott Kruger eval "{ time -p $cmd ; } 2>> timing.out" 172679e9f5cSJed Brown cmd_res=$? 173e57d7714SBarry Smith # If it is a lack of GPU resources, then try once more 174e57d7714SBarry Smith # See: src/sys/error/err.c 175e57d7714SBarry Smith if [ $cmd_res -eq 96 ]; then 176e57d7714SBarry Smith eval "{ time -p $cmd ; } 2>> timing.out" 177e57d7714SBarry Smith cmd_res=$? 178e57d7714SBarry Smith fi 1790da08ecbSSatish Balay touch "$2" "$3" 180984117c4SJed Brown # ETIMEDOUT=110 on most systems (used by Open MPI 3.0). MPICH uses 181984117c4SJed Brown # 255. Earlier Open MPI returns 1 but outputs about MPIEXEC_TIMEOUT. 1827c0e31c5SScott Kruger if [ $cmd_res -eq 110 -o $cmd_res -eq 255 ] || \ 18348237715SSatish Balay fgrep -q -s 'APPLICATION TIMED OUT' "$2" "$3" || \ 1848fb2ab26SSatish Balay fgrep -q -s MPIEXEC_TIMEOUT "$2" "$3" || \ 1858fb2ab26SSatish Balay fgrep -q -s 'APPLICATION TERMINATED WITH THE EXIT STRING: job ending due to timeout' "$2" "$3" || \ 1868fb2ab26SSatish Balay grep -q -s "Timeout after [0-9]* seconds. Terminating job" "$2" "$3"; then 187984117c4SJed Brown timed_out=1 1887c0e31c5SScott Kruger # If timed out, then ensure non-zero error code 1897c0e31c5SScott Kruger if [ $cmd_res -eq 0 ]; then 1907c0e31c5SScott Kruger cmd_res=1 1917c0e31c5SScott Kruger fi 192984117c4SJed Brown fi 1930a091e3eSScott Kruger 1940a091e3eSScott Kruger # Report errors 1955e361860SScott Kruger comment="" 1967a853109SScott Kruger if test $cmd_res == 0; then 19702afe9ecSJed Brown if "${verbose}"; then 1985e361860SScott Kruger comment="${cmd}" 19902afe9ecSJed Brown fi 2005e361860SScott Kruger petsc_report_tapoutput "" "$tlabel" "$comment" 20129921a8fSScott Kruger let success=$success+1 20229921a8fSScott Kruger else 2034d9d3ee5SSatish Balay if [ -n "$timed_out" ]; then 2045e361860SScott Kruger comment="Exceeded timeout limit of $MPIEXEC_TIMEOUT s" 2054d9d3ee5SSatish Balay else 2065e361860SScott Kruger comment="Error code: ${cmd_res}" 20764ca018dSScott Kruger fi 2085e361860SScott Kruger petsc_report_tapoutput "not" "$tlabel" "$comment" 2095e361860SScott Kruger 2105e361860SScott Kruger # Report errors in detail 2115e361860SScott Kruger if [ -z "$timed_out" ]; then 212570dea68SScott Kruger # We've had tests fail but stderr->stdout, as well as having 213570dea68SScott Kruger # mpi_abort go to stderr which throws this test off. Show both 214570dea68SScott Kruger # with stdout first 2155e361860SScott Kruger awk '{print "#\t" $0}' < $2 | tee -a ${testlogerrfile} 21629dac19bSScott Kruger # if statement is for diff tests 21729dac19bSScott Kruger if test "$2" != "$3"; then 218570dea68SScott Kruger awk '{print "#\t" $0}' < $3 | tee -a ${testlogerrfile} 219984117c4SJed Brown fi 22029dac19bSScott Kruger fi 22129921a8fSScott Kruger let failed=$failed+1 22229921a8fSScott Kruger failures="$failures $tlabel" 22329921a8fSScott Kruger fi 22429921a8fSScott Kruger let total=$success+$failed 2257a853109SScott Kruger return $cmd_res 22629921a8fSScott Kruger} 22729921a8fSScott Kruger 22829921a8fSScott Krugerfunction petsc_testend() { 22929921a8fSScott Kruger logfile=$1/counts/${label}.counts 23029921a8fSScott Kruger logdir=`dirname $logfile` 23129921a8fSScott Kruger if ! test -d "$logdir"; then 23229921a8fSScott Kruger mkdir -p $logdir 23329921a8fSScott Kruger fi 23429921a8fSScott Kruger if ! test -e "$logfile"; then 23529921a8fSScott Kruger touch $logfile 23629921a8fSScott Kruger fi 23729921a8fSScott Kruger printf "total $total\n" > $logfile 23829921a8fSScott Kruger printf "success $success\n" >> $logfile 23929921a8fSScott Kruger printf "failed $failed\n" >> $logfile 24029921a8fSScott Kruger printf "failures $failures\n" >> $logfile 24129921a8fSScott Kruger if test ${todo} -gt 0; then 24229921a8fSScott Kruger printf "todo $todo\n" >> $logfile 24329921a8fSScott Kruger fi 24429921a8fSScott Kruger if test ${skip} -gt 0; then 24529921a8fSScott Kruger printf "skip $skip\n" >> $logfile 24629921a8fSScott Kruger fi 247bbf1c217SScott Kruger ENDTIME=`date +%s` 2489b757ad5SKarl Rupp timing=`touch timing.out && egrep '(user|sys)' timing.out | awk '{if( sum1 == "" || $2 > sum1 ) { sum1=sprintf("%.2f",$2) } ; sum2 += sprintf("%.2f",$2)} END {printf "%.2f %.2f\n",sum1,sum2}'` 249521be42fSScott Kruger printf "time $timing\n" >> $logfile 25029921a8fSScott Kruger if $cleanup; then 25129921a8fSScott Kruger echo "Cleaning up" 25229921a8fSScott Kruger /bin/rm -f $rmfiles 25329921a8fSScott Kruger fi 25429921a8fSScott Kruger} 255296e37cfSJed Brown 256*baa5c0f4SScott Krugerfunction petsc_mpiexec_cudamemcheck() { 257*baa5c0f4SScott Kruger _mpiexec=$1;shift 258*baa5c0f4SScott Kruger npopt=$1;shift 259*baa5c0f4SScott Kruger np=$1;shift 260*baa5c0f4SScott Kruger 261*baa5c0f4SScott Kruger cudamemchk="cuda-memcheck" 262*baa5c0f4SScott Kruger 263*baa5c0f4SScott Kruger $_mpiexec $npopt $np $cudamemchk $* 264*baa5c0f4SScott Kruger} 265*baa5c0f4SScott Krugerexport LC_ALL=C 266*baa5c0f4SScott Kruger 267*baa5c0f4SScott Krugerif $compile; then 268*baa5c0f4SScott Kruger curexec=`basename ${exec}` 269*baa5c0f4SScott Kruger (cd $petsc_dir && make -f gmakefile.test ${abspath_scriptdir}/${curexec}) 270*baa5c0f4SScott Krugerfi 27126646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 2720f9322f4SToby Isaac _mpiexec=$1;shift 27326646c0bSSatish Balay npopt=$1;shift 27426646c0bSSatish Balay np=$1;shift 27526646c0bSSatish Balay 276ac71c9ffSScott Kruger valgrind="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --suppressions=$petsc_bindir/maint/petsc-val.supp --error-exitcode=10" 277c173c275SScott Kruger 278080f0011SToby Isaac $_mpiexec $npopt $np $valgrind "$@" 27926646c0bSSatish Balay} 280296e37cfSJed Brownexport LC_ALL=C 281aec279ffSScott Kruger 282aec279ffSScott Krugerif $compile; then 283aec279ffSScott Kruger curexec=`basename ${exec}` 284aec279ffSScott Kruger (cd $petsc_dir && make -f gmakefile.test ${abspath_scriptdir}/${curexec}) 285aec279ffSScott Krugerfi 286aec279ffSScott Kruger 287