1*bcd4bb4aSBarry Smith#!/bin/bash 2*bcd4bb4aSBarry Smithscriptname=$(basename "$0") 329921a8fSScott Krugerrundir=${scriptname%.sh} 434929e0eSSatish BalayTIMEOUT=60 5*bcd4bb4aSBarry Smithtimeoutfactor=${timeoutfactor:=} 6*bcd4bb4aSBarry Smithfilter=${filter:=} 7*bcd4bb4aSBarry Smithfilter_output=${filter_output:=} 8*bcd4bb4aSBarry Smithexec=${exec:=} 9*bcd4bb4aSBarry Smithexecutable=${executable:=} 10*bcd4bb4aSBarry Smithpetsc_dir=${petsc_dir:=} 11*bcd4bb4aSBarry Smithtestlogtapfile=${testlogtapfile:=} 12*bcd4bb4aSBarry Smithtestlogerrfile=${testlogerrfile:=} 13*bcd4bb4aSBarry Smithlabel=${label:=} 1429921a8fSScott Kruger 15*bcd4bb4aSBarry Smithif test "$PWD"!="$(dirname "$0")"; then 16*bcd4bb4aSBarry Smith cd "$(dirname "$0")" || exit 17aec279ffSScott Kruger abspath_scriptdir=$PWD 1829921a8fSScott Krugerfi 196c91caf2SScott Krugerif test -d "${rundir}" && test -n "${rundir}"; then 20*bcd4bb4aSBarry Smith rm -f "${rundir}"/*.tmp "${rundir}"/*.err "${rundir}"/*.out 216c91caf2SScott Krugerfi 22*bcd4bb4aSBarry Smithmkdir -p "${rundir}" 23*bcd4bb4aSBarry Smithif test -n "${runfiles:=}"; then 2480a579ceSSatish Balay for runfile in ${runfiles}; do 25*bcd4bb4aSBarry Smith subdir=$(dirname "${runfile}") 26*bcd4bb4aSBarry Smith mkdir -p "${rundir}"/"${subdir}" 27*bcd4bb4aSBarry Smith cp -r "${runfile}" "${rundir}"/"${subdir}" 2880a579ceSSatish Balay done 29d7871bd4SScott Krugerfi 30*bcd4bb4aSBarry Smithcd "${rundir}" || exit 3129921a8fSScott Kruger 3229921a8fSScott Kruger# 3329921a8fSScott Kruger# Method to print out general and script specific options 3429921a8fSScott Kruger# 3529921a8fSScott Krugerprint_usage() { 3629921a8fSScott Kruger 3729921a8fSScott Krugercat >&2 <<EOF 38*bcd4bb4aSBarry SmithUsage: $1 [options] 3929921a8fSScott Kruger 4029921a8fSScott KrugerOPTIONS 4129921a8fSScott Kruger -a <args> ......... Override default arguments 42aec279ffSScott Kruger -c ................ Cleanup (remove generated files) 43aec279ffSScott Kruger -C ................ Compile 44e53dc769SScott Kruger -d ................ Launch in debugger 4529921a8fSScott Kruger -e <args> ......... Add extra arguments to default 46c1139c55SMatthew Knepley -E <args> ......... Add final arguments to default 472f2809e3SToby Isaac -f ................ force attempt to run test that would otherwise be skipped 4829921a8fSScott Kruger -h ................ help: print this message 4929921a8fSScott Kruger -n <integer> ...... Override the number of processors to use 50ba2c5286SScott Kruger -j ................ Pass -j to petscdiff (just use diff) 51ba2c5286SScott Kruger -J <arg> .......... Pass -J to petscdiff (just use diff with arg) 52ba2c5286SScott Kruger -m ................ Update results using petscdiff 53f50802fbSScott Kruger -M ................ Update alt files using petscdiff 545e361860SScott Kruger -o <arg> .......... Output format: 'interactive', 'err_only' 55a6f3f80dSScott Kruger -p ................ Print command: Print first command and exit 560a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 57baa5c0f4SScott Kruger -U ................ run cUda-memcheck 58b047ed2bSScott Kruger -V ................ run Valgrind 5929921a8fSScott Kruger -v ................ Verbose: Print commands 6029921a8fSScott KrugerEOF 6129921a8fSScott Kruger 6229921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 63*bcd4bb4aSBarry Smith exit 1 6429921a8fSScott Kruger} 6529921a8fSScott Kruger### 6629921a8fSScott Kruger## Arguments for overriding things 6729921a8fSScott Kruger# 685e361860SScott Krugeroutput_fmt="interactive" 6929921a8fSScott Krugerverbose=false 7029921a8fSScott Krugercleanup=false 71aec279ffSScott Krugercompile=false 72e53dc769SScott Krugerdebugger=false 73a6f3f80dSScott Krugerprintcmd=false 7463cf4119SScott Krugermpiexec_function=false 752f2809e3SToby Isaacforce=false 76d4417257SScott Krugerdiff_flags="" 77c1139c55SMatthew Knepleywhile getopts "a:cCde:E:fhjJ:mMn:o:pt:UvV" arg 7829921a8fSScott Krugerdo 7929921a8fSScott Kruger case $arg in 80ba2c5286SScott Kruger a ) args="$OPTARG" ;; 8129921a8fSScott Kruger c ) cleanup=true ;; 82aec279ffSScott Kruger C ) compile=true ;; 83e53dc769SScott Kruger d ) debugger=true ;; 84ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 85c1139c55SMatthew Knepley E ) final_args="$OPTARG" ;; 862f2809e3SToby Isaac f ) force=true ;; 87*bcd4bb4aSBarry Smith h ) print_usage "$0" ;; 88ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 8929dac19bSScott Kruger j ) diff_flags=$diff_flags" -j" ;; 9029dac19bSScott Kruger J ) diff_flags=$diff_flags" -J $OPTARG" ;; 9129dac19bSScott Kruger m ) diff_flags=$diff_flags" -m" ;; 9229dac19bSScott Kruger M ) diff_flags=$diff_flags" -M" ;; 935e361860SScott Kruger o ) output_fmt=$OPTARG ;; 94a6f3f80dSScott Kruger p ) printcmd=true ;; 950a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 9663cf4119SScott Kruger U ) mpiexec="petsc_mpiexec_cudamemcheck $mpiexec" 9763cf4119SScott Kruger mpiexec_function=true 9863cf4119SScott Kruger ;; 9963cf4119SScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" 10063cf4119SScott Kruger mpiexec_function=true 10163cf4119SScott Kruger ;; 10229921a8fSScott Kruger v ) verbose=true ;; 10329921a8fSScott Kruger *) # To take care of any extra args 10429921a8fSScott Kruger if test -n "$OPTARG"; then 105*bcd4bb4aSBarry Smith eval "$arg"=\""$OPTARG"\" 10629921a8fSScott Kruger else 107*bcd4bb4aSBarry Smith eval "$arg"=found 10829921a8fSScott Kruger fi 10929921a8fSScott Kruger ;; 11029921a8fSScott Kruger esac 11129921a8fSScott Krugerdone 112*bcd4bb4aSBarry Smithshift $(( OPTIND - 1 )) 11329921a8fSScott Kruger 1140a091e3eSScott Kruger# Individual tests can extend the default 11575ea7643SJed Brownexport MPIEXEC_TIMEOUT=$((TIMEOUT*timeoutfactor)) 116*bcd4bb4aSBarry SmithSTARTTIME=$(date +%s) 1170a091e3eSScott Kruger 11829921a8fSScott Krugerif test -n "$extra_args"; then 1193176fa97SBarry Smith args="$extra_args $args" 12029921a8fSScott Krugerfi 121c1139c55SMatthew Knepleyif test -n "$final_args"; then 122c1139c55SMatthew Knepley args="$args $final_args" 123c1139c55SMatthew Knepleyfi 124e53dc769SScott Krugerif $debugger; then 125e53dc769SScott Kruger args="-start_in_debugger $args" 126e53dc769SScott Krugerfi 1271725bfbfSScott Krugerif test -n "$filter"; then 1281725bfbfSScott Kruger diff_flags=$diff_flags" -F \$'$filter'" 1291725bfbfSScott Krugerfi 1301725bfbfSScott Krugerif test -n "$filter_output"; then 1311725bfbfSScott Kruger diff_flags=$diff_flags" -f \$'$filter_output'" 1321725bfbfSScott Krugerfi 133e53dc769SScott Kruger 13429921a8fSScott Kruger# Init 13529921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 13629921a8fSScott Krugertotal=0 13729921a8fSScott Krugertodo=-1; skip=-1 1380a091e3eSScott Krugerjob_level=0 13929921a8fSScott Kruger 14063cf4119SScott Krugerif $compile; then 141*bcd4bb4aSBarry Smith curexec=$(basename "${exec}") 14263cf4119SScott Kruger fullexec=${abspath_scriptdir}/${curexec} 143*bcd4bb4aSBarry Smith maketarget=$(echo "${fullexec}" | sed "s#${petsc_dir}/*##") 144*bcd4bb4aSBarry Smith (cd "$petsc_dir" && make -f gmakefile.test "${maketarget}") 14563cf4119SScott Krugerfi 14663cf4119SScott Kruger 14763cf4119SScott Kruger### 14863cf4119SScott Kruger## Rest of code is functions 14963cf4119SScott Kruger# 1505e361860SScott Krugerfunction petsc_report_tapoutput() { 1515e361860SScott Kruger notornot=$1 1525e361860SScott Kruger test_label=$2 1535e361860SScott Kruger comment=$3 1545e361860SScott Kruger if test -n "$comment"; then 1555e361860SScott Kruger comment=" # ${comment}" 1565e361860SScott Kruger fi 1575e361860SScott Kruger 1585e361860SScott Kruger tap_message="${notornot} ok ${test_label}${comment}" 1595e361860SScott Kruger 1605e361860SScott Kruger # Log messages 161*bcd4bb4aSBarry Smith printf '%s\n' "${tap_message}" >> "${testlogtapfile}" 1625e361860SScott Kruger 163*bcd4bb4aSBarry Smith if test "${output_fmt}" == "err_only"; then 1645e361860SScott Kruger if test -n "${notornot}"; then 165*bcd4bb4aSBarry Smith printf '%s\n' "${tap_message}" | tee -a "${testlogerrfile}" 1665e361860SScott Kruger fi 1675e361860SScott Kruger else 168*bcd4bb4aSBarry Smith printf '%s\n' "${tap_message}" 1695e361860SScott Kruger fi 1705e361860SScott Kruger} 1715e361860SScott Kruger 172a6f3f80dSScott Krugerfunction printcmd() { 173a6f3f80dSScott Kruger # Print command that can be run from PETSC_DIR 174a6f3f80dSScott Kruger cmd="$1" 175*bcd4bb4aSBarry Smith basedir=$(dirname "${PWD}" | sed "s#${petsc_dir}/##") 176*bcd4bb4aSBarry Smith modcmd=$(echo "${cmd}" | sed -e "s#\.\.#${basedir}#" | sed s#\>.*## | sed s#\%#\%\%#) 17763cf4119SScott Kruger if $mpiexec_function; then 1780a6ed61bSStefano Zampini # Have to expand valgrind/cudamemcheck 179*bcd4bb4aSBarry Smith modcmd=$(eval "$modcmd") 18063cf4119SScott Kruger fi 181*bcd4bb4aSBarry Smith printf '%s\n' "${modcmd}" 182a6f3f80dSScott Kruger exit 183a6f3f80dSScott Kruger} 184a6f3f80dSScott Kruger 18529921a8fSScott Krugerfunction petsc_testrun() { 18629921a8fSScott Kruger # First arg = Basic command 18729921a8fSScott Kruger # Second arg = stdout file 18829921a8fSScott Kruger # Third arg = stderr file 18929921a8fSScott Kruger # Fourth arg = label for reporting 19029921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 19129921a8fSScott Kruger tlabel=$4 1921725bfbfSScott Kruger error=$5 19329921a8fSScott Kruger cmd="$1 > $2 2> $3" 1941725bfbfSScott Kruger if test -n "$error"; then 1950e86256eSScott Kruger cmd="$1 1> $2 2>&1" 19629921a8fSScott Kruger fi 197*bcd4bb4aSBarry Smith echo "$cmd" > "${tlabel}".sh; chmod 755 "${tlabel}".sh 198a6f3f80dSScott Kruger if $printcmd; then 199a6f3f80dSScott Kruger printcmd "$cmd" 200a6f3f80dSScott Kruger fi 2017a853109SScott Kruger 202d8e31410SScott Kruger eval "{ time -p $cmd ; } 2>> timing.out" 203679e9f5cSJed Brown cmd_res=$? 2040e86256eSScott Kruger # If testing the error output then we don't test the error code itself 2050e86256eSScott Kruger if test -n "$error"; then 2060e86256eSScott Kruger cmd_res=0 2070e86256eSScott Kruger fi 208ffc4695bSBarry Smith # If it is a lack of GPU resources or MPI failure (Intel) then try once more 209e57d7714SBarry Smith # See: src/sys/error/err.c 210601ce43eSScott Kruger # Error #134 added to handle problems with the Radeon card for hip testing 211f5c39320SBarry Smith # Error #144 added to handle problems with the MPI [ch3:sock] received packet of unknown type (1852472100) 212*bcd4bb4aSBarry Smith if [ $cmd_res -eq 96 ] || [ $cmd_res -eq 97 ] || [ $cmd_res -eq 98 ] || [ $cmd_res -eq 134 ] || [ $cmd_res -eq 144 ]; then 213*bcd4bb4aSBarry Smith printf "# retrying %s\n" "${tlabel}" | tee -a "${testlogerrfile}" 21428f1f2fbSBarry Smith sleep 3 215e57d7714SBarry Smith eval "{ time -p $cmd ; } 2>> timing.out" 216e57d7714SBarry Smith cmd_res=$? 217e57d7714SBarry Smith fi 2180da08ecbSSatish Balay touch "$2" "$3" 219d5b43468SJose E. Roman # It appears current MPICH and Open MPI just shut down the job execution and do not return an error code to the executable 22028f1f2fbSBarry Smith # ETIMEDOUT=110 was used by Open MPI 3.0. MPICH used 255 22128f1f2fbSBarry Smith # Earlier Open MPI versions returned 1 and the error string 222db2f5e4bSStefano Zampini # Here we only grep for error strings in output 223db2f5e4bSStefano Zampini #if [ $cmd_res -eq 110 -o $cmd_res -eq 255 ] || \ 224db2f5e4bSStefano Zampini if \ 225db2f5e4bSStefano Zampini grep -F -q -s 'I_MPI_JOB_TIMEOUT' "$2" "$3" || \ 226ef0d7cd8SPierre Jolivet grep -F -q -s 'APPLICATION TIMED OUT' "$2" "$3" || \ 227ef0d7cd8SPierre Jolivet grep -F -q -s MPIEXEC_TIMEOUT "$2" "$3" || \ 228ef0d7cd8SPierre Jolivet grep -F -q -s 'APPLICATION TERMINATED WITH THE EXIT STRING: job ending due to timeout' "$2" "$3" || \ 2298fb2ab26SSatish Balay grep -q -s "Timeout after [0-9]* seconds. Terminating job" "$2" "$3"; then 230984117c4SJed Brown timed_out=1 2317c0e31c5SScott Kruger # If timed out, then ensure non-zero error code 2327c0e31c5SScott Kruger if [ $cmd_res -eq 0 ]; then 2337c0e31c5SScott Kruger cmd_res=1 2347c0e31c5SScott Kruger fi 235984117c4SJed Brown fi 2360a091e3eSScott Kruger 2370a091e3eSScott Kruger # Report errors 2385e361860SScott Kruger comment="" 2397a853109SScott Kruger if test $cmd_res == 0; then 24002afe9ecSJed Brown if "${verbose}"; then 2415e361860SScott Kruger comment="${cmd}" 24202afe9ecSJed Brown fi 2435e361860SScott Kruger petsc_report_tapoutput "" "$tlabel" "$comment" 244*bcd4bb4aSBarry Smith (( success=success+1 )) 24529921a8fSScott Kruger else 2464d9d3ee5SSatish Balay if [ -n "$timed_out" ]; then 2475e361860SScott Kruger comment="Exceeded timeout limit of $MPIEXEC_TIMEOUT s" 2484d9d3ee5SSatish Balay else 2495e361860SScott Kruger comment="Error code: ${cmd_res}" 25064ca018dSScott Kruger fi 2515e361860SScott Kruger petsc_report_tapoutput "not" "$tlabel" "$comment" 2525e361860SScott Kruger 2535e361860SScott Kruger # Report errors in detail 2545e361860SScott Kruger if [ -z "$timed_out" ]; then 255570dea68SScott Kruger # We've had tests fail but stderr->stdout, as well as having 256570dea68SScott Kruger # mpi_abort go to stderr which throws this test off. Show both 257570dea68SScott Kruger # with stdout first 258*bcd4bb4aSBarry Smith awk '{print "#\t" $0}' < "$2" | tee -a "${testlogerrfile}" 25929dac19bSScott Kruger # if statement is for diff tests 26029dac19bSScott Kruger if test "$2" != "$3"; then 261*bcd4bb4aSBarry Smith awk '{print "#\t" $0}' < "$3" | tee -a "${testlogerrfile}" 262984117c4SJed Brown fi 26329dac19bSScott Kruger fi 264*bcd4bb4aSBarry Smith (( failed=failed+1 )) 26529921a8fSScott Kruger failures="$failures $tlabel" 26629921a8fSScott Kruger fi 267*bcd4bb4aSBarry Smith (( total=success+failed )) 2687a853109SScott Kruger return $cmd_res 26929921a8fSScott Kruger} 27029921a8fSScott Kruger 27129921a8fSScott Krugerfunction petsc_testend() { 27229921a8fSScott Kruger logfile=$1/counts/${label}.counts 273*bcd4bb4aSBarry Smith logdir=$(dirname "$logfile") 27429921a8fSScott Kruger if ! test -d "$logdir"; then 275*bcd4bb4aSBarry Smith mkdir -p "$logdir" 27629921a8fSScott Kruger fi 27729921a8fSScott Kruger if ! test -e "$logfile"; then 278*bcd4bb4aSBarry Smith touch "$logfile" 27929921a8fSScott Kruger fi 280*bcd4bb4aSBarry Smith printf "total %s\n" "$total" > "$logfile" 281*bcd4bb4aSBarry Smith printf "success %s\n" "$success" >> "$logfile" 282*bcd4bb4aSBarry Smith printf "failed %s\n" "$failed" >> "$logfile" 283*bcd4bb4aSBarry Smith printf "failures %s\n" "$failures" >> "$logfile" 28429921a8fSScott Kruger if test ${todo} -gt 0; then 285*bcd4bb4aSBarry Smith printf "todo %s\n" "$todo" >> "$logfile" 28629921a8fSScott Kruger fi 28729921a8fSScott Kruger if test ${skip} -gt 0; then 288*bcd4bb4aSBarry Smith printf "skip %s\n" "$skip" >> "$logfile" 28929921a8fSScott Kruger fi 290*bcd4bb4aSBarry Smith ENDTIME=$(date +%s) 291*bcd4bb4aSBarry Smith timing=$(touch timing.out && grep -E '(user|sys)' timing.out | awk '{if( sum1 == "" || $2 > sum1 ) { sum1=sprintf("%.2f",$2) } ; sum2 += sprintf("%.2f",$2)} END {printf "%.2f %.2f\n",sum1,sum2}') 292*bcd4bb4aSBarry Smith printf "time %s\n" "$timing" >> "$logfile" 29329921a8fSScott Kruger if $cleanup; then 29429921a8fSScott Kruger echo "Cleaning up" 295*bcd4bb4aSBarry Smith /bin/rm -f "$rmfiles" 29629921a8fSScott Kruger fi 29729921a8fSScott Kruger} 298296e37cfSJed Brown 299baa5c0f4SScott Krugerfunction petsc_mpiexec_cudamemcheck() { 300636bfc99SJacob Faibussowitsch # loops over the argument list to find the call to the test executable and insert the 301636bfc99SJacob Faibussowitsch # cuda memcheck command before it. 302636bfc99SJacob Faibussowitsch # first check if compute-sanitizer exists, since cuda-memcheck is deprecated from CUDA 303636bfc99SJacob Faibussowitsch # 11-ish onwards 304636bfc99SJacob Faibussowitsch if command -v compute-sanitizer &> /dev/null; then 305636bfc99SJacob Faibussowitsch memcheck_cmd="${PETSC_CUDAMEMCHECK_COMMAND:-compute-sanitizer}" 306636bfc99SJacob Faibussowitsch declare -a default_args_to_check=('--target-processes all' '--track-stream-ordered-races all') 307636bfc99SJacob Faibussowitsch else 308636bfc99SJacob Faibussowitsch memcheck_cmd="${PETSC_CUDAMEMCHECK_COMMAND:-cuda-memcheck}" 309636bfc99SJacob Faibussowitsch declare -a default_args_to_check=('--flush-to-disk yes') 310636bfc99SJacob Faibussowitsch fi 311636bfc99SJacob Faibussowitsch if [[ -z ${PETSC_CUDAMEMCHECK_ARGS} ]]; then 312636bfc99SJacob Faibussowitsch # if user has not set the memcheck args themselves loop over the predefined default 313636bfc99SJacob Faibussowitsch # arguments and check if they can be used 314636bfc99SJacob Faibussowitsch memcheck_args='--leak-check full --report-api-errors no ' 315636bfc99SJacob Faibussowitsch for option in "${default_args_to_check[@]}"; do 316*bcd4bb4aSBarry Smith ${memcheck_cmd} "${memcheck_args}" "${option}" &> /dev/null 317636bfc99SJacob Faibussowitsch if [ $? -eq 0 ]; then 318636bfc99SJacob Faibussowitsch memcheck_args+="${option} " 319636bfc99SJacob Faibussowitsch fi 320636bfc99SJacob Faibussowitsch done 321636bfc99SJacob Faibussowitsch else 322636bfc99SJacob Faibussowitsch memcheck_args="${PETSC_CUDAMEMCHECK_ARGS}" 323636bfc99SJacob Faibussowitsch fi 324636bfc99SJacob Faibussowitsch pre_args=() 3252ef0b79dSStefano Zampini # regex to detect where the test lives in the command line. This 326636bfc99SJacob Faibussowitsch # marks the end of the options to mpiexec, and hence where we should insert the 327636bfc99SJacob Faibussowitsch # cuda-memcheck command 3282ef0b79dSStefano Zampini re="${executable}" 329636bfc99SJacob Faibussowitsch for i in "$@"; do 330d8b4a066SPierre Jolivet # first occurrence of the presence of petsc_arch is the executable, 3310a6ed61bSStefano Zampini # except when we install MPI ourselves 3322ef0b79dSStefano Zampini if [[ $i =~ ${re} ]]; then 333636bfc99SJacob Faibussowitsch # found it, put cuda memcheck command in 334636bfc99SJacob Faibussowitsch pre_args+=("${memcheck_cmd} ${memcheck_args}") 335636bfc99SJacob Faibussowitsch break 336636bfc99SJacob Faibussowitsch fi 337636bfc99SJacob Faibussowitsch pre_args+=("$i") 338636bfc99SJacob Faibussowitsch shift 339636bfc99SJacob Faibussowitsch done 340636bfc99SJacob Faibussowitsch # run command, but filter out 341636bfc99SJacob Faibussowitsch # ===== CUDA-MEMCHECK or ==== COMPUTE-SANITIZER 342636bfc99SJacob Faibussowitsch # and 343636bfc99SJacob Faibussowitsch # ===== ERROR SUMMARY: 0 errors 344636bfc99SJacob Faibussowitsch if ${printcmd}; then 345*bcd4bb4aSBarry Smith echo "${pre_args[@]}" "$@" 346636bfc99SJacob Faibussowitsch else 347*bcd4bb4aSBarry Smith "${pre_args[@]}" "$@" \ 348636bfc99SJacob Faibussowitsch | grep -v 'CUDA-MEMCHECK' \ 349636bfc99SJacob Faibussowitsch | grep -v 'COMPUTE-SANITIZER' \ 350636bfc99SJacob Faibussowitsch | grep -v 'LEAK SUMMARY: 0 bytes leaked in 0 allocations' \ 351636bfc99SJacob Faibussowitsch | grep -v 'ERROR SUMMARY: 0 errors' || [[ $? == 1 ]] 352636bfc99SJacob Faibussowitsch fi 353636bfc99SJacob Faibussowitsch # last or is needed to suppress grep exiting with error code 1 if it doesn't find a 354636bfc99SJacob Faibussowitsch # match 355baa5c0f4SScott Kruger} 356baa5c0f4SScott Kruger 35726646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 3580a6ed61bSStefano Zampini valgrind_cmd="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --keep-debuginfo=yes --suppressions=${PETSC_DIR}/share/petsc/suppressions/valgrind --error-exitcode=10" 3590a6ed61bSStefano Zampini pre_args=() 3602ef0b79dSStefano Zampini re="${executable}" 3610a6ed61bSStefano Zampini for i in "$@"; do 3622ef0b79dSStefano Zampini if [[ $i =~ ${re} ]]; then 3630a6ed61bSStefano Zampini pre_args+=("${valgrind_cmd}") 3640a6ed61bSStefano Zampini break 36590544984SBarry Smith fi 3660a6ed61bSStefano Zampini pre_args+=("$i") 3670a6ed61bSStefano Zampini shift 3680a6ed61bSStefano Zampini done 3690a6ed61bSStefano Zampini if ${printcmd}; then 3700a6ed61bSStefano Zampini echo ${pre_args[@]} "$@" 37163cf4119SScott Kruger else 3720a6ed61bSStefano Zampini ${pre_args[@]} "$@" 37363cf4119SScott Kruger fi 37426646c0bSSatish Balay} 375296e37cfSJed Brownexport LC_ALL=C 376