461 lines
16 KiB
Bash
Executable File
461 lines
16 KiB
Bash
Executable File
#!/bin/sh
|
|
#BHEADER***********************************************************************
|
|
# (c) 2000 The Regents of the University of California
|
|
#
|
|
# See the file COPYRIGHT_and_DISCLAIMER for a complete copyright
|
|
# notice, contact person, and disclaimer.
|
|
#
|
|
# $Revision$
|
|
#EHEADER***********************************************************************
|
|
|
|
#=============================================================================
|
|
# Create a few temporary variables, and assign default values to any
|
|
# unexported environment variables.
|
|
#=============================================================================
|
|
initialize_variables ()
|
|
{
|
|
seconds; TOTAL=$SECS
|
|
OldMask=`umask`
|
|
umask 007
|
|
Hdr="autotest"
|
|
Skip=0
|
|
Build=1
|
|
Run=2
|
|
PurifytoFile="--with-purify-to-file"
|
|
InsuretoFile="--with-insure-to-file"
|
|
if [ -z "$MAKE" -o "$MAKE" = "" ] ; then
|
|
MAKE="make -i"
|
|
fi
|
|
#
|
|
# Assume that we are started from autotest and have done
|
|
# a "cd ${HYPRE_AUTOTEST_DIR}", however as long as we are
|
|
# above a "linear_solvers" directory we should be ok.
|
|
#
|
|
if test ! "${HYPRE_AUTOTEST_DIR}" ; then
|
|
HYPRE_AUTOTEST_DIR=`pwd`
|
|
else # assume we're executing from autotest
|
|
if [ ! -d ${HYPRE_AUTOTEST_DIR} ] ; then
|
|
if [ ! -d ./linear_solvers ] ; then
|
|
echo "$0: no HYPRE_AUTOTEST_DIR environment variable"
|
|
exit 2
|
|
fi
|
|
fi
|
|
fi
|
|
if [ -d ${HYPRE_AUTOTEST_DIR}/linear_solvers/test ] ; then
|
|
SRC=linear_solvers
|
|
fi
|
|
if [ -d ${HYPRE_AUTOTEST_DIR}/src/test ] ; then
|
|
SRC=src
|
|
fi
|
|
StdBuildDir=${HYPRE_AUTOTEST_DIR}/${SRC}
|
|
StdTestDir=${HYPRE_AUTOTEST_DIR}/${SRC}/test
|
|
#
|
|
# Define HYPRE_ARCH
|
|
#
|
|
. $StdTestDir/hypre_arch.sh
|
|
if [ -r $StdTestDir/env.${HYPRE_ARCH} ] ; then
|
|
. $StdTestDir/env.${HYPRE_ARCH}
|
|
fi
|
|
#
|
|
# If NOT started by autotest (hence no HYPRE_*_EMAIL variable
|
|
# defined) default mail to UID only.
|
|
#
|
|
if test ! "$HYPRE_MAIL" ; then
|
|
[ -x /usr/bin/Mail ] && HYPRE_MAIL=/usr/bin/Mail
|
|
[ -x /usr/bin/mailx ] && HYPRE_MAIL=/usr/bin/mailx
|
|
[ -x /usr/sbin/mailx ] && HYPRE_MAIL=/usr/sbin/mailx
|
|
fi
|
|
if test ! "${HYPRE_DEFAULT_EMAIL}" ; then
|
|
if test ! "${USER}" ; then
|
|
USER=`who am I|cut -f 1 -d \ `
|
|
fi
|
|
HYPRE_DEFAULT_EMAIL=${HYPRE_DEFAULT_EMAIL:=$USER}
|
|
HYPRE_CHECKOUT_EMAIL=${HYPRE_CHECKOUT_EMAIL:=$USER}
|
|
HYPRE_CONFIGURE_EMAIL=${HYPRE_CONFIGURE_EMAIL:=$USER}
|
|
HYPRE_STRUCT_EMAIL=${HYPRE_STRUCT_EMAIL:=$USER}
|
|
HYPRE_IJ_EMAIL=${HYPRE_IJ_EMAIL:=$USER}
|
|
HYPRE_FEI_EMAIL=${HYPRE_FEI_EMAIL:=$USER}
|
|
HYPRE_ALL_EMAIL=${HYPRE_ALL_EMAIL:=$USER}
|
|
fi
|
|
}
|
|
|
|
#=============================================================================
|
|
# Function for parsing of input arguments
|
|
#=============================================================================
|
|
|
|
parse_arguments () {
|
|
#
|
|
# The getopts follows posix.2, if sh is a posix shell as
|
|
# (as required by posix.2) then getopts is a built-in.
|
|
# If sh is a non posix.2 or a early Bourne shell (that
|
|
# probably implement the obsolute getopt) then
|
|
# getopts(1) will be used.
|
|
#
|
|
while getopts :a:b:cDdfhi:mno:p:q:r:st:xy arg
|
|
do
|
|
argcur=$arg
|
|
case $arg in
|
|
a) confbuildtest $OPTARG " " "default" 1 1 1 1 1 1 1;;
|
|
b) confbuildtest $OPTARG " " "beta" 0 0 0 0 0 1 1;;
|
|
c) build $Build "all++" "all++" "test";;
|
|
D) DEBUG_MODE="yes";;
|
|
d) build $Build " " "docs" "docs";;
|
|
f) build $Build "all77" "all77" "test";;
|
|
h) usage; exit 2;;
|
|
i) confbuildtest $OPTARG "--with-insure-to-file" \
|
|
"insure" 0 0 0 0 1 0 1;;
|
|
+i) confbuildtest $OPTARG "--with-insure" "insure" 0 0 0 0 1 0 1;;
|
|
m) HYPRE_SEND_MAIL="no"; MailOpt="";;
|
|
+m) HYPRE_SEND_MAIL="yes"; MailOpt="-mail";;
|
|
n) confbuildtest $Build "--without-MPI" "no_mpi" 1 0 1 1 1 1 0;;
|
|
o) confbuildtest $OPTARG "--with-openmp" "openmp" 1 1 1 1 1 1 1;;
|
|
p) confbuildtest $OPTARG "--with-petac" "petac" 0 0 0 0 1 0 0;;
|
|
q) confbuildtest $OPTARG "--with-purify-to-file" \
|
|
"purify" 0 0 0 0 1 0 1;;
|
|
+q) confbuildtest $OPTARG "--with-purify" "purify" 0 0 0 0 1 0 1;;
|
|
r) HYPRE_RUN_MACHINE=$OPTARG;;
|
|
s) confbuildtest $Build "--with-strict-checking" \
|
|
"strict_checking" 1 1 1 1 1 1 0;;
|
|
t) confbuildtest $OPTARG "--with-pthreads" "pthreads" 0 0 1 0 0 0 0;;
|
|
x) build $Build "beta++" "beta++" "test";;
|
|
y) build $Build "beta77" "beta77" "test";;
|
|
:) echo "$0: \"$argcur\" requires a value"; exit 2;;
|
|
\?) echo "$0: INVALID option \"$argcur\" at $OPTIND"; exit 2;;
|
|
esac
|
|
done
|
|
shift `expr $OPTIND - 1`
|
|
#printf "Remaining arguments are: %s\n" "$*"
|
|
}
|
|
|
|
#=============================================================================
|
|
# Function for display of help/usage
|
|
#=============================================================================
|
|
usage () {
|
|
printf "Usage: %s [-cdfhmns] [-a opt] [-b opt]\n" $0
|
|
printf " [-o opt] [-p opt] [-r host] [-t opt]\n"
|
|
printf "\n"
|
|
printf "Hypre autotest (Note: all options are positional dependent\n"
|
|
printf "i.e., options are sequentially executed in left-to-right order).\n"
|
|
printf "\n"
|
|
printf "Options for the "opt" argument are "0", "1", or "2" where:\n"
|
|
printf " 0=skip (ignore this test),\n"
|
|
printf " 1=configure and make, and\n"
|
|
printf " 2=configure, make and run.\n"
|
|
printf "\n"
|
|
printf "-a opt All; the (default) configure, make, and execute. Also\n"
|
|
printf " performs make struct, IJ, fei, all, beta, nofei, and\n"
|
|
printf " fei++, followed by the test_drivers script (when opt=2).\n"
|
|
printf "-b opt Beta; perform the (default) configure, make beta, nofei,\n"
|
|
printf " fei++, followed by the test_drivers script (when opt=2).\n"
|
|
printf "-c C++; make all++ (no configure, or execute).\n"
|
|
printf "-d Docs; make the documentation directory.\n"
|
|
printf "-f F77; make all77 (no configure, or execute).\n"
|
|
printf "-h Help; display this help message.\n"
|
|
printf "-m Mail; mail error summary to developers.\n"
|
|
printf "+m Mail+; mail error logs to developers.\n"
|
|
printf "-n NoMPI; configure --without-MPI, make struct, IJ,\n"
|
|
printf " all, and beta (no execute option).\n"
|
|
printf "-o opt openMP; configure --with-openmp, make beta.\n"
|
|
printf "-p opt PETSc; perform configure --with-petsc, make all.\n"
|
|
printf "-q opt Purify; perform configure --with-purify-to-file. Output \n"
|
|
printf " is appended to a file called purify.log.\n"
|
|
printf "+q opt Purify; no file output option (interactive).\n"
|
|
printf "-r host Remote; remote exection is performed on "host".\n"
|
|
printf "-s Strict; configure --with-strict-checking,\n"
|
|
printf " followed by make struct, IJ, all, beta(no execute option).\n"
|
|
printf "-t opt Thread; perform configure --with-pthreads, make struct.\n"
|
|
printf "-x BetaC++; make beta++ (no configure, or execute).\n"
|
|
printf "-y BetaF77; make beta77 (no configure, or execute).\n"
|
|
}
|
|
|
|
#=============================================================================
|
|
# Function for mailing error messages
|
|
#=============================================================================
|
|
|
|
mail_summary () {
|
|
echo "Autotest mailing error summary"
|
|
CTOTCNT=0; ETOTCNT=0
|
|
CLOGCNT=0; ELOGCNT=0
|
|
CERRCNT=0; EERRCNT=0; TOTCNT=0
|
|
CLIST=""; ELIST=""
|
|
DWRNCNT=0; DERRCNT=0
|
|
cd $HYPRE_AUTOTEST_DIR
|
|
SUMFILE="autotest.$HYPRE_ARCH.`date '+%Y%m%d'`"
|
|
if [ -z "$HYPRE_COMPILE_MACHINE" -o "$HYPRE_COMPILE_MACHINE" = "" ] ; then
|
|
HYPRE_COMPILE_MACHINE=`hostname`
|
|
fi
|
|
if [ -z "$HYPRE_RUN_MACHINE" -o "$HYPRE_RUN_MACHINE" = "" ] ; then
|
|
HYPRE_RUN_MACHINE=`hostname`
|
|
fi
|
|
printf "%s\n" "--------------------------------------------" > $SUMFILE
|
|
printf "Autotest error summary for `date`\n" >> $SUMFILE
|
|
printf "Target architecure: %s\n" $HYPRE_ARCH >> $SUMFILE
|
|
printf "Compile machine: %s\n" $HYPRE_COMPILE_MACHINE >> $SUMFILE
|
|
printf "Execute machine: %s\n" $HYPRE_RUN_MACHINE >> $SUMFILE
|
|
printf "Directory: %s\n" ${HYPRE_AUTOTEST_DIR} >> $SUMFILE
|
|
printf "%s\n" "--------------------------------------------" >> $SUMFILE
|
|
printf "Compile summary: Status: Warnings: Errors\n" >> $SUMFILE
|
|
for ConfOpt in default beta no_mpi openmp petac \
|
|
pthreads purify strict_checking \
|
|
docs all++ all77 beta++ beta77
|
|
do
|
|
printf "%-15s: " $ConfOpt >> $SUMFILE
|
|
COLFLG=0; COLCNT=0;
|
|
DWRNCNT=0; DERRCNT=0;
|
|
for MakeOpt in "" all beta configure IJ fei++ \
|
|
fei nofei sstruct struct
|
|
do
|
|
FILE=autotest.$ConfOpt.$MakeOpt
|
|
LFILE=`echo $FILE|sed -e 's/\.$//'`.log
|
|
for i in $LFILE ${SRC}/${LFILE} \
|
|
${SRC}/test/${LFILE} ${SRC}/docs/${LFILE}
|
|
do
|
|
if [ -r "${i}" ] ; then
|
|
CTOTCNT=`expr $CTOTCNT + 1`
|
|
EFILE=`echo $i|sed -e 's/log$//'`err
|
|
if [ -s "${EFILE}" ] ; then
|
|
TOTCNT=`expr $TOTCNT + 1`
|
|
CERRCNT=`expr $CERRCNT + 1`
|
|
COLCNT=`expr $COLCNT + 1`
|
|
CLIST="${CLIST}${EFILE}\n"
|
|
DWRNNUM=0; DERRNUM=0;
|
|
DWRNNUM=`grep -i warning ${EFILE}|wc -l`
|
|
DERRNUM=`grep -i error ${EFILE}|wc -l`
|
|
DWRNCNT=`expr $DWRNCNT + $DWRNNUM`
|
|
DERRCNT=`expr $DERRCNT + $DERRNUM`
|
|
else
|
|
CLOGCNT=`expr $CLOGCNT + 1`
|
|
COLFLG=`expr $COLFLG + 1`
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
if [ "$COLCNT" != "0" ] ; then
|
|
printf "Failed: %2d : %2d\n" $DWRNCNT $DERRCNT >> $SUMFILE
|
|
elif [ "$COLFLG" != "0" ] ; then
|
|
printf "Passed\n" >> $SUMFILE
|
|
else
|
|
printf "N/A\n" >> $SUMFILE
|
|
fi
|
|
done
|
|
printf "\n" >> $SUMFILE
|
|
printf "%2d test failed\n" $CERRCNT >> $SUMFILE
|
|
printf "%2d test succeeded\n" $CLOGCNT >> $SUMFILE
|
|
printf "%2d test total\n" $CTOTCNT >> $SUMFILE
|
|
if [ "$CLIST" != "" ] ; then
|
|
printf "non zero error log file(s):\n" >> $SUMFILE
|
|
printf "${CLIST}" >> $SUMFILE
|
|
fi
|
|
printf "%s\n" "--------------------------------------------" >> $SUMFILE
|
|
# currently only a single instance of opt=2 (configure, make, and run)
|
|
# can be processed (actually earlier information gets overwritten).
|
|
printf "Execute summary:\n" >> $SUMFILE
|
|
for i in IJ fei sstruct struct ; do
|
|
LFILE=${SRC}/test/${i}_linear_solvers.log
|
|
if [ -r "${LFILE}" ] ; then
|
|
printf "%-15s: " $i >> $SUMFILE
|
|
COLFLG=0; COLCNT=0;
|
|
ETOTCNT=`expr $ETOTCNT + 1`
|
|
EFILE=${SRC}/test/${i}_linear_solvers.err
|
|
if [ -s "${EFILE}" ] ; then
|
|
TOTCNT=`expr $TOTCNT + 1`
|
|
EERRCNT=`expr $EERRCNT + 1`
|
|
COLCNT=`expr $COLCNT + 1`
|
|
ELIST="${ELIST}${EFILE}\n"
|
|
else
|
|
ELOGCNT=`expr $ELOGCNT + 1`
|
|
COLFLG=`expr $COLFLG + 1`
|
|
fi
|
|
if [ "$COLCNT" != "0" ] ; then
|
|
printf "Failed\n" >> $SUMFILE
|
|
elif [ "$COLFLG" != "0" ] ; then
|
|
printf "Passed\n" >> $SUMFILE
|
|
else
|
|
printf "N/A\n" >> $SUMFILE
|
|
fi
|
|
fi
|
|
done
|
|
printf "\n" >> $SUMFILE
|
|
printf "%2d test failed\n" $EERRCNT >> $SUMFILE
|
|
printf "%2d test succeeded\n" $ELOGCNT >> $SUMFILE
|
|
printf "%2d test total\n" $ETOTCNT >> $SUMFILE
|
|
if [ "$ELIST" != "" ] ; then
|
|
printf "non zero error log file(s):\n" >> $SUMFILE
|
|
printf "${ELIST}" >> $SUMFILE
|
|
fi
|
|
printf "%s\n" "--------------------------------------------" >> $SUMFILE
|
|
if [ "$TOTCNT" = "0" ] ; then
|
|
SUBJECT="Autotest NO Errors ($HYPRE_ARCH)"
|
|
else
|
|
SUBJECT="Autotest $TOTCNT Errors ($HYPRE_ARCH)"
|
|
fi
|
|
if [ "$DEBUG_MODE" = "yes" ] ; then
|
|
${HYPRE_MAIL} -s "$SUBJECT" $USER < $SUMFILE
|
|
else
|
|
${HYPRE_MAIL} -s "$SUBJECT" $HYPRE_ALL_EMAIL < $SUMFILE
|
|
fi
|
|
echo "Autotest mail sent"
|
|
}
|
|
|
|
mail_errors () {
|
|
if [ "$HYPRE_SEND_MAIL" = "yes" ] ; then
|
|
echo "Autotest mailing error messages"
|
|
cd $HYPRE_AUTOTEST_DIR
|
|
for i in *.err \
|
|
${SRC}/*.err \
|
|
${SRC}/test/*.err \
|
|
${SRC}/docs/*.err
|
|
do
|
|
if [ -s "$i" ] ; then
|
|
if [ -r "${i}.email" ] ; then
|
|
RECIPIENTS=`cat ${i}.email`
|
|
SUBJECT="Autotest error: ${i} ($HYPRE_ARCH)"
|
|
if [ "$DEBUG_MODE" = "yes" ] ; then
|
|
${HYPRE_MAIL} -s "$SUBJECT" $USER < $i
|
|
else
|
|
${HYPRE_MAIL} -s "$SUBJECT" $RECIPIENTS < $i
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
echo "Autotest mail sent"
|
|
else
|
|
mail_summary
|
|
fi
|
|
}
|
|
|
|
cleanup () {
|
|
umask $OldMask
|
|
seconds; TOTAL=`expr $SECS - $TOTAL`
|
|
echo "Autotest finished leaving $* after $TOTAL seconds"
|
|
}
|
|
#=============================================================================
|
|
# General purpose make function /w strict_checking error output redirection
|
|
#=============================================================================
|
|
|
|
makeit ()
|
|
{
|
|
MakeStr=$1 MessageStr=$2
|
|
MailGroup=$3
|
|
if [ "$MessageStr" = "purify" ]
|
|
then # don't need extra purify status messages
|
|
$MAKE $MakeStr 1> ${Hdr}.${MessageStr}.${MakeStr}.log 2>&1
|
|
else
|
|
$MAKE $MakeStr 1> ${Hdr}.${MessageStr}.${MakeStr}.log \
|
|
2> ${Hdr}.${MessageStr}.${MakeStr}.err
|
|
fi
|
|
echo "$MailGroup" > ${Hdr}.${MessageStr}.${MakeStr}.err.email
|
|
}
|
|
#=============================================================================
|
|
# General purpose function for configure, make and execute
|
|
#=============================================================================
|
|
|
|
confbuildtest ()
|
|
{
|
|
BuildOpt=$1 ConfigOption=$2 MessageStr=$3
|
|
IJOpt=$4 FeiOpt=$5 StructOpt=$6
|
|
SstructOpt=$7 MakeOpt=$8 BetaOpt=$9
|
|
shift
|
|
NoFeiOpt=$9
|
|
if [ ${BuildOpt} -ne $Skip ] ; then
|
|
seconds; TIME=$SECS
|
|
echo "Autotest starting configure and make of $MessageStr"
|
|
if [ ${BuildOpt} -eq $Build -o ${BuildOpt} -eq $Run ] ; then
|
|
cd $StdBuildDir
|
|
./configure "$ConfigOption" 1> ${Hdr}.${MessageStr}.configure.log \
|
|
2> ${Hdr}.${MessageStr}.configure.err
|
|
echo "$HYPRE_CONFIGURE_EMAIL" > ${Hdr}.${MessageStr}.configure.err.email
|
|
|
|
$MAKE veryclean
|
|
|
|
if [ $IJOpt -ne $Skip ] ; then
|
|
makeit "IJ" $MessageStr "$HYPRE_IJ_EMAIL"
|
|
fi
|
|
|
|
if [ $FeiOpt -ne $Skip ] ; then
|
|
makeit "fei" $MessageStr "$HYPRE_FEI_EMAIL"
|
|
fi
|
|
|
|
if [ $StructOpt -ne $Skip ] ; then
|
|
makeit "struct" $MessageStr "$HYPRE_STRUCT_EMAIL"
|
|
fi
|
|
|
|
if [ $SstructOpt -ne $Skip ] ; then
|
|
makeit "sstruct" $MessageStr "$HYPRE_STRUCT_EMAIL"
|
|
fi
|
|
|
|
if [ $MakeOpt -ne $Skip ] ; then
|
|
makeit "all" $MessageStr "$HYPRE_DEFAULT_EMAIL"
|
|
fi
|
|
|
|
if [ $BetaOpt -ne $Skip ] ; then
|
|
makeit "beta" $MessageStr "$HYPRE_DEFAULT_EMAIL"
|
|
fi
|
|
fi
|
|
if [ ${BuildOpt} -eq $Run ] ; then
|
|
echo "Autotest starting execution of $MessageStr"
|
|
if [ $NoFeiOpt -ne $Skip ] ; then
|
|
makeit "nofei" $MessageStr "$HYPRE_FEI_EMAIL"
|
|
cd ${HYPRE_AUTOTEST_DIR}/${SRC}/test
|
|
makeit "fei++" $MessageStr "$HYPRE_FEI_EMAIL"
|
|
fi
|
|
if test ! "${HYPRE_RUN_MACHINE}" ; then
|
|
cd $HYPRE_AUTOTEST_DIR/${SRC}/test
|
|
./test_drivers.sh $MailOpt
|
|
else
|
|
ssh ${HYPRE_RUN_MACHINE} "\
|
|
(\
|
|
cd ${HYPRE_AUTOTEST_DIR}/${SRC}/test;\
|
|
[ -r ./env.${HYPRE_ARCH} ] && . ./env.${HYPRE_ARCH};\
|
|
./test_drivers.sh $MailOpt\
|
|
)"
|
|
fi
|
|
fi
|
|
seconds; TIME=`expr $SECS - $TIME`
|
|
echo "Autotest finished $MessageStr taking $TIME seconds"
|
|
fi
|
|
}
|
|
#=============================================================================
|
|
# General purpose make function
|
|
#=============================================================================
|
|
|
|
build ()
|
|
{
|
|
BuildOpt=$1 MakeOption=$2 MessageStr=$3 MakeDir=$4
|
|
if [ $BuildOpt -ne $Skip ]
|
|
then
|
|
seconds; TIME=$SECS
|
|
echo "Autotest starting make of $MessageStr"
|
|
cd $StdBuildDir/$MakeDir
|
|
$MAKE $MakeOption 1> ${Hdr}.${MessageStr}.log \
|
|
2> ${Hdr}.${MessageStr}.err
|
|
echo "$HYPRE_ALL_EMAIL" > ${Hdr}.${MessageStr}.err.email
|
|
seconds; TIME=`expr $SECS - $TIME`
|
|
echo "Autotest finished $MessageStr taking $TIME seconds"
|
|
fi
|
|
}
|
|
|
|
#==============================================================================
|
|
# return the seconds since midnight in the variable SECS
|
|
#==============================================================================
|
|
|
|
seconds ()
|
|
{
|
|
HOUR=`date '+%H'`
|
|
HOUR=`expr $HOUR \* 3600`
|
|
MINS=`date '+%M'`
|
|
MINS=`expr $MINS \* 60`
|
|
SECS=`date '+%S'`
|
|
SECS=`expr $SECS + $MINS`
|
|
SECS=`expr $SECS + $HOUR`
|
|
}
|
|
|
|
#==============================================================================
|
|
# This script is the implementation script used to regression test hypre.
|
|
#==============================================================================
|
|
|
|
initialize_variables
|
|
parse_arguments $*
|
|
mail_errors
|
|
cleanup
|