[Darshan-commits] [Darshan] branch, master, updated. darshan-2.3.1-pre1-13-g23523f1

Service Account git at mcs.anl.gov
Wed Feb 4 10:49:59 CST 2015


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "".

The branch, master has been updated
       via  23523f15fa7e93d176ed90a42e096c1573b750b0 (commit)
       via  55e1f37ed5a377716789882ba2eeed0980fcfb0e (commit)
       via  4ec192f30eba792a9f40dbccd161352b38363369 (commit)
       via  ddfcbd5f31ac37be8a69062386ad40a3684242c9 (commit)
       via  48173bc1eef809adb980ee0bee7bd67ef7ce2bdb (commit)
       via  ffc2ef63e93ea0766e9f16754c2bbba3a584a1e4 (commit)
       via  4831753da8baf87b57d11f47b9d0d123632c0982 (commit)
       via  feb1fe1ede5a233948e1945538405eb5275b2222 (commit)
       via  34b666ac054982410282b84b454c0a538c9150ae (commit)
       via  edfe5fab24434c220f2f0ef32d192d7954e434fa (commit)
      from  c768c10e29b9a89b17ccae91b029c32a22cc66d0 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 23523f15fa7e93d176ed90a42e096c1573b750b0
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 21:37:17 2015 -0500

    Revert "experimenting with jenkins environment"
    
    This reverts commit 55e1f37ed5a377716789882ba2eeed0980fcfb0e.

commit 55e1f37ed5a377716789882ba2eeed0980fcfb0e
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 21:33:59 2015 -0500

    experimenting with jenkins environment

commit 4ec192f30eba792a9f40dbccd161352b38363369
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 21:27:36 2015 -0500

    more path cleanups

commit ddfcbd5f31ac37be8a69062386ad40a3684242c9
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 21:21:26 2015 -0500

    relax pwd restrictions

commit 48173bc1eef809adb980ee0bee7bd67ef7ce2bdb
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 20:49:30 2015 -0500

    fortran test cases

commit ffc2ef63e93ea0766e9f16754c2bbba3a584a1e4
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 17:39:17 2015 -0500

    add cxx test case
    
    -  also fix misc. bash comparison operator goofs

commit 4831753da8baf87b57d11f47b9d0d123632c0982
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 16:54:46 2015 -0500

    test basic counters

commit feb1fe1ede5a233948e1945538405eb5275b2222
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Tue Feb 3 16:45:51 2015 -0500

    stub in job execution

commit 34b666ac054982410282b84b454c0a538c9150ae
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Thu Jan 29 14:57:42 2015 -0500

    stub in subdirs for platforms and test cases

commit edfe5fab24434c220f2f0ef32d192d7954e434fa
Author: Phil Carns <carns at mcs.anl.gov>
Date:   Wed Jan 28 17:27:17 2015 -0500

    stub master script for regression testing

-----------------------------------------------------------------------

Summary of changes:
 darshan-test/regression/README.txt                 |   18 +
 darshan-test/regression/run-all.sh                 |   88 ++++
 darshan-test/regression/test-cases/cxxpi.sh        |   39 ++
 darshan-test/regression/test-cases/fperf-f77.sh    |   43 ++
 darshan-test/regression/test-cases/fperf-f90.sh    |   43 ++
 darshan-test/regression/test-cases/mpi-io-test.sh  |   44 ++
 darshan-test/regression/test-cases/src/cxxpi.cxx   |   63 +++
 darshan-test/regression/test-cases/src/fperf.f     |  180 ++++++++
 .../regression/test-cases/src/mpi-io-test.c        |  443 ++++++++++++++++++++
 darshan-test/regression/ws/setup-cc.sh             |   26 ++
 darshan-test/regression/ws/setup-cxx.sh            |   26 ++
 darshan-test/regression/ws/setup-f77.sh            |   26 ++
 darshan-test/regression/ws/setup-f90.sh            |   26 ++
 darshan-test/regression/ws/setup-runjob.sh         |   16 +
 14 files changed, 1081 insertions(+), 0 deletions(-)
 create mode 100644 darshan-test/regression/README.txt
 create mode 100755 darshan-test/regression/run-all.sh
 create mode 100755 darshan-test/regression/test-cases/cxxpi.sh
 create mode 100755 darshan-test/regression/test-cases/fperf-f77.sh
 create mode 100755 darshan-test/regression/test-cases/fperf-f90.sh
 create mode 100755 darshan-test/regression/test-cases/mpi-io-test.sh
 create mode 100644 darshan-test/regression/test-cases/src/cxxpi.cxx
 create mode 100644 darshan-test/regression/test-cases/src/fperf.f
 create mode 100644 darshan-test/regression/test-cases/src/mpi-io-test.c
 create mode 100755 darshan-test/regression/ws/setup-cc.sh
 create mode 100755 darshan-test/regression/ws/setup-cxx.sh
 create mode 100755 darshan-test/regression/ws/setup-f77.sh
 create mode 100755 darshan-test/regression/ws/setup-f90.sh
 create mode 100755 darshan-test/regression/ws/setup-runjob.sh


Diff of changes:
diff --git a/darshan-test/regression/README.txt b/darshan-test/regression/README.txt
new file mode 100644
index 0000000..41f6291
--- /dev/null
+++ b/darshan-test/regression/README.txt
@@ -0,0 +1,18 @@
+This directory contains regression tests for both the runtime and util components of Darshan,
+assuming that Darshan is already compiled and installed in a known path.
+
+The master script must be executed with three arguments:
+
+1) path to darshan installation
+2) path to temporary directory (for building executables, collecting logs, etc. during test)
+3) platform type; options include:
+   - ws (for a standard workstation)
+
+The platform type should map to a subdirectory containing scripts that describe how to
+perform platform-specific tasks (like loading or generating darshan wrappers and executing
+jobs).
+
+TODO:
+---------
+- tie this in with the "automated" directory in the tree, which already performs automated
+  build tests (but no runtime tests) in Jenkins
diff --git a/darshan-test/regression/run-all.sh b/darshan-test/regression/run-all.sh
new file mode 100755
index 0000000..6b9ee5e
--- /dev/null
+++ b/darshan-test/regression/run-all.sh
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+if [ "$#" -ne 3 ]; then
+    echo "Usage: run-all.sh <darshan_install_path> <tmp_path> <platform>" 1>&2
+    echo "Example: ./run-all.sh ~/darshan-install /tmp/test ws" 1>&2
+    exit 1
+fi
+
+# set variables for use by other sub-scripts
+export DARSHAN_PATH=$1
+export DARSHAN_TMP=$2
+export DARSHAN_PLATFORM=$3
+# number of procs that most test jobs will use
+export DARSHAN_DEFAULT_NPROCS=4
+
+DARSHAN_TESTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+export DARSHAN_TESTDIR
+
+# check darshan path
+if [ ! -x $DARSHAN_PATH/bin/darshan-parser ]; then
+    echo "Error: $DARSHAN_PATH doesn't contain a valid Darshan install." 1>&2
+    exit 1
+fi
+
+# check and/or create tmp path
+if [ ! -d $DARSHAN_TMP ]; then
+    mkdir -p $DARSHAN_TMP
+fi
+
+if [ ! -d $DARSHAN_TMP ]; then
+    echo "Error: unable to find or create $DARSHAN_TMP" 1>&2
+    exit 1
+fi
+if [ ! -w $DARSHAN_TMP ]; then
+    echo "Error: unable to write to $DARSHAN_TMP" 1>&2
+    exit 1
+fi
+
+# make sure that we have sub-scripts for the specified platform
+if [ ! -d $DARSHAN_TESTDIR/$DARSHAN_PLATFORM ]; then
+    echo "Error: unable to find scripts for platform $DARSHAN_PLATFORM" 1>&2
+    exit 1
+fi
+
+# set up c compiler for this platform
+DARSHAN_CC=`$DARSHAN_TESTDIR/$DARSHAN_PLATFORM/setup-cc.sh`
+if [ $? -ne 0 ]; then
+    exit 1
+fi
+export DARSHAN_CC
+
+# set up c++ compiler for this platform
+DARSHAN_CXX=`$DARSHAN_TESTDIR/$DARSHAN_PLATFORM/setup-cxx.sh`
+if [ $? -ne 0 ]; then
+    exit 1
+fi
+export DARSHAN_CXX
+
+# set up Fortran compilers for this platform
+DARSHAN_F77=`$DARSHAN_TESTDIR/$DARSHAN_PLATFORM/setup-f77.sh`
+if [ $? -ne 0 ]; then
+    exit 1
+fi
+export DARSHAN_F77
+DARSHAN_F90=`$DARSHAN_TESTDIR/$DARSHAN_PLATFORM/setup-f90.sh`
+if [ $? -ne 0 ]; then
+    exit 1
+fi
+export DARSHAN_F90
+
+# set up job execution wrapper for this platform
+DARSHAN_RUNJOB=`$DARSHAN_TESTDIR/$DARSHAN_PLATFORM/setup-runjob.sh`
+if [ $? -ne 0 ]; then
+    exit 1
+fi
+export DARSHAN_RUNJOB
+
+for i in `ls $DARSHAN_TESTDIR/test-cases/*.sh`; do
+    echo Running ${i}...
+    $i
+    if [ $? -ne 0 ]; then
+        echo "Error: failed to execute test case $i"
+        exit 1
+    fi
+    echo Done.
+done
+
+exit 0
diff --git a/darshan-test/regression/test-cases/cxxpi.sh b/darshan-test/regression/test-cases/cxxpi.sh
new file mode 100755
index 0000000..bea35e8
--- /dev/null
+++ b/darshan-test/regression/test-cases/cxxpi.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+PROG=cxxpi
+
+# set log file path; remove previous log if present
+export DARSHAN_LOGFILE=$DARSHAN_TMP/${PROG}.darshan.gz
+rm -f ${DARSHAN_LOGFILE}
+
+# compile
+$DARSHAN_CXX $DARSHAN_TESTDIR/test-cases/src/${PROG}.cxx -o $DARSHAN_TMP/${PROG}
+if [ $? -ne 0 ]; then
+    echo "Error: failed to compile ${PROG}" 1>&2
+    exit 1
+fi
+
+# execute
+$DARSHAN_RUNJOB $DARSHAN_TMP/${PROG} -f $DARSHAN_TMP/${PROG}.tmp.dat
+if [ $? -ne 0 ]; then
+    echo "Error: failed to execute ${PROG}" 1>&2
+    exit 1
+fi
+
+# parse log
+$DARSHAN_PATH/bin/darshan-parser $DARSHAN_LOGFILE > $DARSHAN_TMP/${PROG}.darshan.txt
+if [ $? -ne 0 ]; then
+    echo "Error: failed to parse ${DARSHAN_LOGFILE}" 1>&2
+    exit 1
+fi
+
+# check results
+# in this case we want to confirm that the open counts are zero; cxxpi does not do any IO
+POSIX_OPENS=`grep CP_POSIX_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ "$POSIX_OPENS"x != ""x ]; then
+    echo "Error: Found unexpected POSIX open count of $POSIX_OPENS" 1>&2
+    exit 1
+fi
+
+
+exit 0
diff --git a/darshan-test/regression/test-cases/fperf-f77.sh b/darshan-test/regression/test-cases/fperf-f77.sh
new file mode 100755
index 0000000..8f123d7
--- /dev/null
+++ b/darshan-test/regression/test-cases/fperf-f77.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+PROG=fperf-f77
+
+# set log file path; remove previous log if present
+export DARSHAN_LOGFILE=$DARSHAN_TMP/${PROG}.darshan.gz
+rm -f ${DARSHAN_LOGFILE}
+
+# compile
+$DARSHAN_F77 $DARSHAN_TESTDIR/test-cases/src/fperf.f -o $DARSHAN_TMP/${PROG}
+if [ $? -ne 0 ]; then
+    echo "Error: failed to compile ${PROG}" 1>&2
+    exit 1
+fi
+
+# execute
+$DARSHAN_RUNJOB $DARSHAN_TMP/${PROG} -fname $DARSHAN_TMP/${PROG}.tmp.dat
+if [ $? -ne 0 ]; then
+    echo "Error: failed to execute ${PROG}" 1>&2
+    exit 1
+fi
+
+# parse log
+$DARSHAN_PATH/bin/darshan-parser $DARSHAN_LOGFILE > $DARSHAN_TMP/${PROG}.darshan.txt
+if [ $? -ne 0 ]; then
+    echo "Error: failed to parse ${DARSHAN_LOGFILE}" 1>&2
+    exit 1
+fi
+
+# check results
+# in this case we want to confirm that both the MPI and POSIX open counters were triggered
+MPI_OPENS=`grep CP_COLL_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $MPI_OPENS -gt 0 ]; then
+    echo "Error: MPI open count of $MPI_OPENS is incorrect" 1>&2
+    exit 1
+fi
+POSIX_OPENS=`grep CP_POSIX_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $POSIX_OPENS -gt 0 ]; then
+    echo "Error: POSIX open count of $POSIX_OPENS is incorrect" 1>&2
+    exit 1
+fi
+
+exit 0
diff --git a/darshan-test/regression/test-cases/fperf-f90.sh b/darshan-test/regression/test-cases/fperf-f90.sh
new file mode 100755
index 0000000..69dbd4f
--- /dev/null
+++ b/darshan-test/regression/test-cases/fperf-f90.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+PROG=fperf-f90
+
+# set log file path; remove previous log if present
+export DARSHAN_LOGFILE=$DARSHAN_TMP/${PROG}.darshan.gz
+rm -f ${DARSHAN_LOGFILE}
+
+# compile
+$DARSHAN_F90 $DARSHAN_TESTDIR/test-cases/src/fperf.f -o $DARSHAN_TMP/${PROG}
+if [ $? -ne 0 ]; then
+    echo "Error: failed to compile ${PROG}" 1>&2
+    exit 1
+fi
+
+# execute
+$DARSHAN_RUNJOB $DARSHAN_TMP/${PROG} -fname $DARSHAN_TMP/${PROG}.tmp.dat
+if [ $? -ne 0 ]; then
+    echo "Error: failed to execute ${PROG}" 1>&2
+    exit 1
+fi
+
+# parse log
+$DARSHAN_PATH/bin/darshan-parser $DARSHAN_LOGFILE > $DARSHAN_TMP/${PROG}.darshan.txt
+if [ $? -ne 0 ]; then
+    echo "Error: failed to parse ${DARSHAN_LOGFILE}" 1>&2
+    exit 1
+fi
+
+# check results
+# in this case we want to confirm that both the MPI and POSIX open counters were triggered
+MPI_OPENS=`grep CP_COLL_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $MPI_OPENS -gt 0 ]; then
+    echo "Error: MPI open count of $MPI_OPENS is incorrect" 1>&2
+    exit 1
+fi
+POSIX_OPENS=`grep CP_POSIX_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $POSIX_OPENS -gt 0 ]; then
+    echo "Error: POSIX open count of $POSIX_OPENS is incorrect" 1>&2
+    exit 1
+fi
+
+exit 0
diff --git a/darshan-test/regression/test-cases/mpi-io-test.sh b/darshan-test/regression/test-cases/mpi-io-test.sh
new file mode 100755
index 0000000..82982c1
--- /dev/null
+++ b/darshan-test/regression/test-cases/mpi-io-test.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+PROG=mpi-io-test
+
+# set log file path; remove previous log if present
+export DARSHAN_LOGFILE=$DARSHAN_TMP/${PROG}.darshan.gz
+rm -f ${DARSHAN_LOGFILE}
+
+# compile
+$DARSHAN_CC $DARSHAN_TESTDIR/test-cases/src/${PROG}.c -o $DARSHAN_TMP/${PROG}
+if [ $? -ne 0 ]; then
+    echo "Error: failed to compile ${PROG}" 1>&2
+    exit 1
+fi
+
+# execute
+$DARSHAN_RUNJOB $DARSHAN_TMP/${PROG} -f $DARSHAN_TMP/${PROG}.tmp.dat
+if [ $? -ne 0 ]; then
+    echo "Error: failed to execute ${PROG}" 1>&2
+    exit 1
+fi
+
+# parse log
+$DARSHAN_PATH/bin/darshan-parser $DARSHAN_LOGFILE > $DARSHAN_TMP/${PROG}.darshan.txt
+if [ $? -ne 0 ]; then
+    echo "Error: failed to parse ${DARSHAN_LOGFILE}" 1>&2
+    exit 1
+fi
+
+# check results
+# in this case we want to confirm that both the MPI and POSIX open counters were triggered
+MPI_OPENS=`grep CP_INDEP_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $MPI_OPENS -gt 0 ]; then
+    echo "Error: MPI open count of $MPI_OPENS is incorrect" 1>&2
+    exit 1
+fi
+POSIX_OPENS=`grep CP_POSIX_OPENS $DARSHAN_TMP/${PROG}.darshan.txt |cut -f 4`
+if [ ! $POSIX_OPENS -gt 0 ]; then
+    echo "Error: POSIX open count of $POSIX_OPENS is incorrect" 1>&2
+    exit 1
+fi
+
+
+exit 0
diff --git a/darshan-test/regression/test-cases/src/cxxpi.cxx b/darshan-test/regression/test-cases/src/cxxpi.cxx
new file mode 100644
index 0000000..b7c28a6
--- /dev/null
+++ b/darshan-test/regression/test-cases/src/cxxpi.cxx
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; c-basic-offset:4 ; -*- */
+/*  
+ *  (C) 2004 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "mpi.h"
+#include <iostream>
+using namespace std;
+#include <math.h>
+
+double f(double);
+
+double f(double a)
+{
+    return (4.0 / (1.0 + a*a));
+}
+
+int main(int argc,char **argv)
+{
+    int n, myid, numprocs, i;
+    double PI25DT = 3.141592653589793238462643;
+    double mypi, pi, h, sum, x;
+    double startwtime = 0.0, endwtime;
+    int  namelen;
+    char processor_name[MPI_MAX_PROCESSOR_NAME];
+
+    MPI::Init(argc,argv);
+    numprocs = MPI::COMM_WORLD.Get_size();
+    myid     = MPI::COMM_WORLD.Get_rank();
+    MPI::Get_processor_name(processor_name,namelen);
+
+    cout << "Process " << myid << " of " << numprocs << " is on " <<
+	processor_name << endl;
+
+    n = 10000;			/* default # of rectangles */
+    if (myid == 0)
+	startwtime = MPI::Wtime();
+
+    MPI::COMM_WORLD.Bcast(&n, 1, MPI_INT, 0);
+
+    h   = 1.0 / (double) n;
+    sum = 0.0;
+    /* A slightly better approach starts from large i and works back */
+    for (i = myid + 1; i <= n; i += numprocs)
+    {
+	x = h * ((double)i - 0.5);
+	sum += f(x);
+    }
+    mypi = h * sum;
+
+    MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0);
+
+    if (myid == 0) {
+	endwtime = MPI::Wtime();
+	cout << "pi is approximately " << pi << " Error is " <<
+	    fabs(pi - PI25DT) << endl;
+	cout << "wall clock time = " << endwtime-startwtime << endl;
+    }
+
+    MPI::Finalize();
+    return 0;
+}
diff --git a/darshan-test/regression/test-cases/src/fperf.f b/darshan-test/regression/test-cases/src/fperf.f
new file mode 100644
index 0000000..a3fdfa2
--- /dev/null
+++ b/darshan-test/regression/test-cases/src/fperf.f
@@ -0,0 +1,180 @@
+! -*- Mode: Fortran; -*- 
+!  
+!  (C) 2001 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      implicit none
+
+      include 'mpif.h'
+      
+
+!     Fortran equivalent of perf.c
+
+      integer SIZE 
+      parameter (SIZE=1048576*4)
+!     read/write size per node in bytes
+
+      integer buf(SIZE/4), j, mynod, nprocs, ntimes, flag, foo
+      double precision stim, read_tim, write_tim, new_read_tim
+      double precision new_write_tim, min_read_tim, min_write_tim
+      double precision read_bw, write_bw
+      integer fh, status(MPI_STATUS_SIZE), ierr, argc, iargc, i
+      character*1024 str    ! used to store the filename
+      integer*8 offset
+      
+
+      ntimes = 5
+      min_read_tim = 10000000.0D0
+      min_write_tim = 10000000.0D0
+
+      call MPI_INIT(ierr)
+      call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, foo, ierr)
+      call MPI_COMM_RANK(MPI_COMM_WORLD, mynod, ierr)
+
+!     process 0 takes the file name as a command-line argument and 
+!     broadcasts it to other processes
+
+      if (mynod .eq. 0) then
+         argc = iargc()
+         i = 0
+         call getarg(i,str)
+         do while ((i .lt. argc) .and. (str .ne. '-fname'))
+            i = i + 1
+            call getarg(i,str)
+         end do
+         if (i .ge. argc) then
+            print *
+            print *, '*#  Usage: fperf -fname filename'
+            print *
+            call MPI_ABORT(MPI_COMM_WORLD, 1, ierr)
+         end if
+
+         i = i + 1
+         call getarg(i,str)
+         call MPI_BCAST(str, 1024, MPI_CHARACTER, 0,                    &  
+     &        MPI_COMM_WORLD, ierr)
+         print *, 'Access size per process = ', SIZE, ' bytes',         &
+     &        ', ntimes = ', ntimes
+      else 
+         call MPI_BCAST(str, 1024, MPI_CHARACTER, 0,                    &
+     &        MPI_COMM_WORLD, ierr)
+      end if
+
+
+      offset = mynod*SIZE
+      do j=1, ntimes
+         call MPI_FILE_OPEN(MPI_COMM_WORLD, str,                        &
+     &        MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
+
+         call MPI_FILE_SEEK(fh, offset, MPI_SEEK_SET, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+         stim = MPI_WTIME()
+         call MPI_FILE_WRITE(fh, buf, SIZE, MPI_BYTE, status, ierr)
+         write_tim = MPI_WTIME() - stim
+  
+         call MPI_FILE_CLOSE(fh, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+
+         call MPI_FILE_OPEN(MPI_COMM_WORLD, str,                        &
+     &        MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
+
+         call MPI_FILE_SEEK(fh, offset, MPI_SEEK_SET, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+         stim = MPI_WTIME()
+         call MPI_FILE_READ(fh, buf, SIZE, MPI_BYTE, status, ierr)
+         read_tim = MPI_WTIME() - stim
+  
+         call MPI_FILE_CLOSE(fh, ierr)
+
+         call MPI_ALLREDUCE(write_tim, new_write_tim, 1,                &
+     &        MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
+         call MPI_ALLREDUCE(read_tim, new_read_tim, 1,                  &
+     &        MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
+
+         if (new_read_tim .lt. min_read_tim) then
+            min_read_tim = new_read_tim
+         end if
+         if (new_write_tim .lt. min_write_tim) then
+            min_write_tim = new_write_tim
+         end if
+      end do
+    
+      if (mynod .eq. 0) then
+         read_bw = (SIZE*nprocs*1.0D0)/(min_read_tim*1000000.0D0)
+         write_bw = (SIZE*nprocs*1.0D0)/(min_write_tim*1000000.0D0)
+         print *, 'Write bandwidth without file sync = ',               &
+     &        write_bw, ' Mbytes/sec'
+         print *, 'Read bandwidth without prior file sync = ',          &
+     &        read_bw, ' Mbytes/sec'
+      end if 
+
+      min_read_tim = 10000000.0D0
+      min_write_tim = 10000000.0D0
+
+      flag = 0
+      do j=1, ntimes
+         call MPI_FILE_OPEN(MPI_COMM_WORLD, str,                        & 
+     &        MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
+
+         call MPI_FILE_SEEK(fh, offset, MPI_SEEK_SET, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+         stim = MPI_WTIME()
+         call MPI_FILE_WRITE(fh, buf, SIZE, MPI_BYTE, status, ierr)
+         call MPI_FILE_SYNC(fh, ierr)
+         write_tim = MPI_WTIME() - stim
+         if (ierr .eq. MPI_ERR_UNKNOWN) then 
+            flag = 1
+         end if
+  
+         call MPI_FILE_CLOSE(fh, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+
+         call MPI_FILE_OPEN(MPI_COMM_WORLD, str,                        & 
+     &        MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
+
+         call MPI_FILE_SEEK(fh, offset, MPI_SEEK_SET, ierr)
+
+         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+         stim = MPI_WTIME()
+         call MPI_FILE_READ(fh, buf, SIZE, MPI_BYTE, status, ierr)
+         read_tim = MPI_WTIME() - stim
+  
+         call MPI_FILE_CLOSE(fh, ierr)
+
+         call MPI_ALLREDUCE(write_tim, new_write_tim, 1,                &
+     &        MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
+         call MPI_ALLREDUCE(read_tim, new_read_tim, 1,                  &
+     &        MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
+
+         if (new_read_tim .lt. min_read_tim) then
+            min_read_tim = new_read_tim
+         end if
+         if (new_write_tim .lt. min_write_tim) then
+            min_write_tim = new_write_tim
+         end if
+
+      end do
+    
+      if (mynod .eq. 0) then
+         if (flag .eq. 1) then
+            print *, 'MPI_FILE_SYNC returns error.'
+         else
+            read_bw = (SIZE*nprocs*1.0D0)/(min_read_tim*1000000.0D0)
+            write_bw = (SIZE*nprocs*1.0D0)/(min_write_tim*1000000.0D0)
+            print *, 'Write bandwidth including file sync = ',          & 
+     &           write_bw, ' Mbytes/sec'
+            print *, 'Read bandwidth after file sync = ',               &
+     &           read_bw, ' Mbytes/sec'
+         end if 
+      end if
+
+      call MPI_FINALIZE(ierr)
+
+      stop
+      end
diff --git a/darshan-test/regression/test-cases/src/mpi-io-test.c b/darshan-test/regression/test-cases/src/mpi-io-test.c
new file mode 100644
index 0000000..152c24b
--- /dev/null
+++ b/darshan-test/regression/test-cases/src/mpi-io-test.c
@@ -0,0 +1,443 @@
+/*
+ * (C) 1995-2001 Clemson University and Argonne National Laboratory.
+ *
+ * See COPYING in top-level directory.
+ */
+
+/* mpi-io-test.c
+ *
+ * This is derived from code given to me by Rajeev Thakur.  Dunno where
+ * it originated.
+ *
+ * It's purpose is to produce aggregate bandwidth numbers for varying
+ * block sizes, number of processors, an number of iterations.
+ *
+ * This is strictly an MPI program - it is used to test the MPI I/O
+ * functionality implemented by Romio.
+ *
+ * Compiling is usually easiest with something like:
+ * mpicc -Wall -Wstrict-prototypes mpi-io-test.c -o mpi-io-test
+ *
+ * NOTE: This code assumes that all command line arguments make it out to all
+ * the processes that make up the parallel job, which isn't always the case.
+ * So if it doesn't work on some platform, that might be why.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/time.h>
+#include <mpi.h>
+#include <errno.h>
+#include <getopt.h>
+
+/* DEFAULT VALUES FOR OPTIONS */
+static int64_t opt_block     = 16*1024*1024;
+static int     opt_iter      = 1;
+static int     opt_coll      = 0;
+static int     opt_correct   = 0;
+static int     opt_sync      = 0;
+static int     opt_single    = 0;
+static int     opt_verbose   = 0;
+static int     opt_rdonly    = 0;
+static int     opt_wronly    = 0;
+static char    opt_file[256] = "test.out";
+static char    opt_pvfs2tab[256] = "notset";
+static int     opt_pvfstab_set = 0;
+
+/* function prototypes */
+static int parse_args(int argc, char **argv);
+static void usage(void);
+static void handle_error(int errcode, char *str);
+
+/* global vars */
+static int mynod = 0;
+static int nprocs = 1;
+
+int main(int argc, char **argv)
+{
+   char *buf, *tmp=NULL, *check;
+   int i, j, v, err, sync_err=0, my_correct = 1, correct, myerrno;
+   double stim, etim;
+   double write_tim = 0;
+   double read_tim = 0;
+   double read_bw, write_bw;
+   double max_read_tim, max_write_tim;
+   double min_read_tim, min_write_tim;
+   double ave_read_tim, ave_write_tim;
+   double sum_read_tim, sum_write_tim;
+   double sq_write_tim, sq_read_tim;
+   double sumsq_write_tim, sumsq_read_tim;
+   double var_read_tim, var_write_tim;
+   int64_t iter_jump = 0;
+   int64_t seek_position = 0;
+   MPI_File fh;
+   MPI_Status status;
+	MPI_Comm comm;
+   int nchars=0;
+   int namelen;
+   char processor_name[MPI_MAX_PROCESSOR_NAME];
+
+   /* startup MPI and determine the rank of this process */
+   MPI_Init(&argc,&argv);
+   MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+   MPI_Comm_rank(MPI_COMM_WORLD, &mynod);
+   MPI_Get_processor_name(processor_name, &namelen); 
+   
+   /* parse the command line arguments */
+   parse_args(argc, argv);
+
+   if (opt_verbose) fprintf(stdout,"Process %d of %d is on %s\n",
+									 mynod, nprocs, processor_name);
+
+   if (mynod == 0) printf("# Using mpi-io calls.\n");
+
+    //sleep(15);
+   
+   /* kindof a weird hack- if the location of the pvfstab file was 
+    * specified on the command line, then spit out this location into
+    * the appropriate environment variable: */
+   
+   if (opt_pvfstab_set) {
+      if ((setenv("PVFS2TAB_FILE", opt_pvfs2tab, 1)) < 0) {
+         perror("setenv");
+         goto die_jar_jar_die;
+      }
+   }
+   
+   /* this is how much of the file data is covered on each iteration of
+    * the test.  used to help determine the seek offset on each
+    * iteration */
+   iter_jump = nprocs * opt_block;
+      
+   /* setup a buffer of data to write */
+   if (!(tmp = malloc((size_t) opt_block + 256))) {
+      perror("malloc");
+      goto die_jar_jar_die;
+   }
+   buf = tmp + 128 - (((long)tmp) % 128);  /* align buffer */
+
+   /* open the file for writing */
+	if (opt_coll) {
+		comm = MPI_COMM_WORLD;
+	}
+	else {
+		comm = MPI_COMM_SELF;
+	}
+   err = MPI_File_open(comm, opt_file, 
+							  MPI_MODE_CREATE | MPI_MODE_RDWR, MPI_INFO_NULL, &fh);
+   if (err != MPI_SUCCESS) {
+      handle_error(err, "MPI_File_open");
+      goto die_jar_jar_die;
+   } 
+	
+	nchars = (int) (opt_block/sizeof(char));
+	if (!opt_rdonly) {
+
+   /* now repeat the seek and write operations the number of times
+    * specified on the command line */
+   for (j=0; j < opt_iter; j++) {
+
+      /* reading and writing to the same block is cheating, but sometimes
+       * we want to measure cached performance of file servers */
+      if (opt_single == 1)
+			seek_position = 0;
+      else
+			/* seek to an appropriate position depending on the iteration 
+			 * and rank of the current process */
+			seek_position = (j*iter_jump)+(mynod*opt_block);
+
+      MPI_File_seek(fh, seek_position, MPI_SEEK_SET);
+
+      if (opt_correct) /* fill in buffer for iteration */ {
+         for (i=0, v=mynod+j, check=buf; i<opt_block; i++, v++, check++) 
+            *check = (char) v;
+      }
+
+      /* discover the starting time of the operation */
+      MPI_Barrier(MPI_COMM_WORLD);
+      stim = MPI_Wtime();
+
+      /* write out the data */
+		if (opt_coll) {
+			err = MPI_File_write_all(fh, buf, nchars, MPI_CHAR, &status);
+		}
+		else {
+			err = MPI_File_write(fh, buf, nchars, MPI_CHAR, &status);
+		}
+      if(err){
+         fprintf(stderr, "node %d, write error: %s\n", mynod, 
+         strerror(errno));
+      }
+      if (opt_sync) sync_err = MPI_File_sync(fh);
+      if (sync_err) {
+         fprintf(stderr, "node %d, sync error: %s\n", mynod, 
+					  strerror(errno));
+      }
+
+      /* discover the ending time of the operation */
+      etim = MPI_Wtime();
+
+      write_tim += (etim - stim);
+      
+      /* we are done with this "write" iteration */
+   }
+	} /* ! opt_rdonly */
+
+   err = MPI_File_close(&fh);
+   if(err){
+      fprintf(stderr, "node %d, close error after write\n", mynod);
+   }
+    
+   /* wait for everyone to synchronize at this point */
+   MPI_Barrier(MPI_COMM_WORLD);
+
+   /* reopen the file to read the data back out */
+   err = MPI_File_open(comm, opt_file, 
+			   MPI_MODE_CREATE | MPI_MODE_RDWR, MPI_INFO_NULL, &fh);
+   if (err < 0) {
+      fprintf(stderr, "node %d, open error: %s\n", mynod, strerror(errno));
+      goto die_jar_jar_die;
+   }
+
+	if (!opt_wronly) {
+   /* we are going to repeat the read operation the number of iterations
+    * specified */
+   for (j=0; j < opt_iter; j++) {
+      /* reading and writing to the same block is cheating, but sometimes
+       * we want to measure cached performance of file servers */
+      if (opt_single == 1) {
+			seek_position = 0;
+		}
+      else {
+			/* seek to an appropriate position depending on the iteration 
+			 * and rank of the current process */
+			seek_position = (j*iter_jump)+(mynod*opt_block);
+		}
+
+      MPI_File_seek(fh, seek_position, MPI_SEEK_SET);
+
+      /* discover the start time */
+      MPI_Barrier(MPI_COMM_WORLD);
+      stim = MPI_Wtime();
+
+      /* read in the file data */
+		if (opt_coll) {
+			err = MPI_File_read_all(fh, buf, nchars, MPI_CHAR, &status);
+		}
+		else {
+			err = MPI_File_read(fh, buf, nchars, MPI_CHAR, &status);
+		}
+      myerrno = errno;
+
+      /* discover the end time */
+      etim = MPI_Wtime();
+      read_tim += (etim - stim);
+
+      if (err < 0) {
+			fprintf(stderr, "node %d, read error, loc = %lld: %s\n",
+				mynod, (long long) mynod*opt_block, strerror(myerrno));
+		}
+
+      /* if the user wanted to check correctness, compare the write
+       * buffer to the read buffer */
+      if (opt_correct) {
+         int badct = 0;
+
+         for (i=0, v=mynod+j, check=buf;
+              i < opt_block && badct < 10;
+              i++, v++, check++)
+         {
+            if (*check != (char) v) {
+               my_correct = 0;
+               if (badct < 10) {
+                  badct++;
+                  fprintf(stderr, "buf[%d] = %d, should be %d\n", 
+                          i, *check, (char) v);
+               }
+            }
+         }
+         MPI_Allreduce(&my_correct, &correct, 1, MPI_INT, MPI_MIN,
+                       MPI_COMM_WORLD);
+         if (badct == 10) fprintf(stderr, "...\n");
+      }
+
+      /* we are done with this read iteration */
+   }
+	} /* !opt_wronly */
+
+   /* close the file */
+   err = MPI_File_close(&fh);
+   if (err) {
+      fprintf(stderr, "node %d, close error after write\n", mynod);
+   }
+
+   /* compute the read and write times */
+   MPI_Allreduce(&read_tim, &max_read_tim, 1, MPI_DOUBLE, MPI_MAX,
+      MPI_COMM_WORLD);
+   MPI_Allreduce(&read_tim, &min_read_tim, 1, MPI_DOUBLE, MPI_MIN,
+      MPI_COMM_WORLD);
+   MPI_Allreduce(&read_tim, &sum_read_tim, 1, MPI_DOUBLE, MPI_SUM,
+      MPI_COMM_WORLD);
+
+   /* calculate our part of the summation used for variance */
+   sq_read_tim = read_tim - (sum_read_tim / nprocs);
+   sq_read_tim = sq_read_tim * sq_read_tim;
+   MPI_Allreduce(&sq_read_tim, &sumsq_read_tim, 1, MPI_DOUBLE, 
+                   MPI_SUM, MPI_COMM_WORLD);
+
+
+   MPI_Allreduce(&write_tim, &max_write_tim, 1, MPI_DOUBLE, MPI_MAX,
+      MPI_COMM_WORLD);
+   MPI_Allreduce(&write_tim, &min_write_tim, 1, MPI_DOUBLE, MPI_MIN,
+      MPI_COMM_WORLD);
+   MPI_Allreduce(&write_tim, &sum_write_tim, 1, MPI_DOUBLE, MPI_SUM,
+      MPI_COMM_WORLD);
+
+   /* calculate our part of the summation used for variance */
+   sq_write_tim = write_tim - (sum_write_tim / nprocs );
+   sq_write_tim = sq_write_tim * sq_write_tim;
+   MPI_Allreduce(&sq_write_tim, &sumsq_write_tim, 1, MPI_DOUBLE, 
+                   MPI_SUM, MPI_COMM_WORLD);
+
+   /* calculate the average from the sum */
+   ave_read_tim  = sum_read_tim / nprocs; 
+   ave_write_tim = sum_write_tim / nprocs; 
+
+   /* and finally compute variance */
+   if (nprocs > 1) {
+		var_read_tim  = sumsq_read_tim / (nprocs-1);
+		var_write_tim = sumsq_write_tim / (nprocs-1);
+   }
+   else {
+		var_read_tim = 0;
+		var_write_tim = 0;
+   }
+   
+   /* print out the results on one node */
+   if (mynod == 0) {
+      read_bw = (opt_block*nprocs*opt_iter)/(max_read_tim*1.0e6);
+      write_bw = (opt_block*nprocs*opt_iter)/(max_write_tim*1.0e6);
+      
+		printf("nr_procs = %d, nr_iter = %d, blk_sz = %lld, coll = %d\n",
+				 nprocs, opt_iter, (long long) opt_block, opt_coll);
+		
+		printf("# total_size = %lld\n",
+				 (long long) opt_block*nprocs*opt_iter);
+		printf("# Write: min_t = %f, max_t = %f, mean_t = %f, var_t = %f\n", 
+				 min_write_tim, max_write_tim, ave_write_tim, var_write_tim);
+		printf("# Read:  min_t = %f, max_t = %f, mean_t = %f, var_t = %f\n", 
+				 min_read_tim, max_read_tim, ave_read_tim, var_read_tim);
+      
+      printf("Write bandwidth = %f Mbytes/sec\n", write_bw);
+      printf("Read bandwidth = %f Mbytes/sec\n", read_bw);
+      
+      if (opt_correct) {
+         printf("Correctness test %s.\n", correct ? "passed" : "failed");
+      }
+   }
+
+
+die_jar_jar_die:   
+
+   free(tmp);
+   MPI_Finalize();
+   return(0);
+}
+
+static int parse_args(int argc, char **argv)
+{
+   int c;
+   
+   while ((c = getopt(argc, argv, "b:i:f:p:CcyShvrw")) != EOF) {
+      switch (c) {
+         case 'b': /* block size */
+            opt_block = atoi(optarg);
+            break;
+         case 'i': /* iterations */
+            opt_iter = atoi(optarg);
+            break;
+         case 'f': /* filename */
+            strncpy(opt_file, optarg, 255);
+            break;
+         case 'p': /* pvfstab file */
+            strncpy(opt_pvfs2tab, optarg, 255);
+            opt_pvfstab_set = 1;
+            break;
+         case 'c': /* correctness */
+            opt_correct = 1;
+            break;
+         case 'C': /* collective I/O */
+            opt_coll = 1;
+            break;
+         case 'y': /* sYnc */
+            opt_sync = 1;
+            break;
+         case 'S': /* Single region */
+            opt_single = 1;
+            break;
+         case 'v': /* verbose */
+            opt_verbose = 1;
+            break;
+			case 'r': /* read-only */
+				opt_rdonly = 1;
+				break;
+			case 'w': /* write-only */
+				opt_wronly = 1;
+				break;
+         case 'h':
+            if (mynod == 0)
+                usage();
+            exit(0);
+         case '?': /* unknown */
+            if (mynod == 0)
+                usage();
+            exit(1);
+         default:
+            break;
+      }
+   }
+   return(0);
+}
+
+static void usage(void)
+{
+    printf("Usage: mpi-io-test [<OPTIONS>...]\n");
+    printf("\n<OPTIONS> is one of\n");
+    printf(" -b       block size (in bytes) [default: 16777216]\n");
+    printf(" -c       verify correctness of file data [default: off]\n");
+    printf(" -C       perform operations Collectively [default: off]\n");
+    printf(" -i       iterations [default: 1]\n");
+    printf(" -f       filename [default: /foo/test.out]\n");
+    printf(" -p       path to pvfs2tab file to use [default: notset]\n");
+    printf(" -S       all process write to same Single region of file [default: off]\n");
+	 printf(" -r       read-only.  do no writes.  file must already exist\n");
+	 printf(" -w       write-only. do no reads.\n");
+    printf(" -v       be more verbose\n");
+    printf(" -y       sYnc the file after each write [default: off]\n");
+    printf(" -h       print this help\n");
+}
+
+static void handle_error(int errcode, char *str)
+{
+    char msg[MPI_MAX_ERROR_STRING];
+    int resultlen;
+
+    MPI_Error_string(errcode, msg, &resultlen);
+    fprintf(stderr, "%s: %s\n", str, msg);
+    MPI_Abort(MPI_COMM_WORLD, 1);
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 3
+ *  c-basic-offset: 3
+ *  tab-width: 3
+ *
+ * vim: ts=3
+ * End:
+ */ 
+
+
diff --git a/darshan-test/regression/ws/setup-cc.sh b/darshan-test/regression/ws/setup-cc.sh
new file mode 100755
index 0000000..37bb231
--- /dev/null
+++ b/darshan-test/regression/ws/setup-cc.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# General notes
+#######################
+# Script to set up the C compiler to use for subsequent test cases.  This
+# script may load optional modules (as in a Cray PE), set LD_PRELOAD
+# variables (as in a dynamically linked environment), or generate mpicc
+# wrappers (as in a statically linked environment).
+
+# The script should produce a single string to stdout, which is the command
+# line to use for invoking the C compiler
+
+# Notes specific to this platform (ws)
+########################
+# This particular version of the setup-cc script assumes that mpicc is
+# present in the path already, and that the C compiler to use for
+# subsequent tests should be generated from this using darshan-gen-cc.pl.
+
+$DARSHAN_PATH/bin/darshan-gen-cc.pl `which mpicc` --output $DARSHAN_TMP/mpicc
+if [ $? -ne 0 ]; then
+    echo "Error: failed to generate c compiler." 1>&2
+    exit 1
+fi
+
+echo $DARSHAN_TMP/mpicc
+exit 0
diff --git a/darshan-test/regression/ws/setup-cxx.sh b/darshan-test/regression/ws/setup-cxx.sh
new file mode 100755
index 0000000..7b75091
--- /dev/null
+++ b/darshan-test/regression/ws/setup-cxx.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# General notes
+#######################
+# Script to set up the C++ compiler to use for subsequent test cases.  This
+# script may load optional modules (as in a Cray PE), set LD_PRELOAD
+# variables (as in a dynamically linked environment), or generate mpicxx
+# wrappers (as in a statically linked environment).
+
+# The script should produce a single string to stdout, which is the command
+# line to use for invoking the C compiler
+
+# Notes specific to this platform (ws)
+########################
+# This particular version of the setup-cxx script assumes that mpicxx is
+# present in the path already, and that the C++ compiler to use for
+# subsequent tests should be generated from this using darshan-gen-cxx.pl.
+
+$DARSHAN_PATH/bin/darshan-gen-cxx.pl `which mpicxx` --output $DARSHAN_TMP/mpicxx
+if [ $? -ne 0 ]; then
+    echo "Error: failed to generate c compiler." 1>&2
+    exit 1
+fi
+
+echo $DARSHAN_TMP/mpicxx
+exit 0
diff --git a/darshan-test/regression/ws/setup-f77.sh b/darshan-test/regression/ws/setup-f77.sh
new file mode 100755
index 0000000..d370105
--- /dev/null
+++ b/darshan-test/regression/ws/setup-f77.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# General notes
+#######################
+# Script to set up the F77 compiler to use for subsequent test cases.  This
+# script may load optional modules (as in a Cray PE), set LD_PRELOAD
+# variables (as in a dynamically linked environment), or generate mpicc
+# wrappers (as in a statically linked environment).
+
+# The script should produce a single string to stdout, which is the command
+# line to use for invoking the F77 compiler
+
+# Notes specific to this platform (ws)
+########################
+# This particular version of the setup-cc script assumes that mpicc is
+# present in the path already, and that the F77 compiler to use for
+# subsequent tests should be generated from this using darshan-gen-fortran.pl.
+
+$DARSHAN_PATH/bin/darshan-gen-fortran.pl `which mpif77` --output $DARSHAN_TMP/mpif77
+if [ $? -ne 0 ]; then
+    echo "Error: failed to generate f77 compiler." 1>&2
+    exit 1
+fi
+
+echo $DARSHAN_TMP/mpif77
+exit 0
diff --git a/darshan-test/regression/ws/setup-f90.sh b/darshan-test/regression/ws/setup-f90.sh
new file mode 100755
index 0000000..1d5192c
--- /dev/null
+++ b/darshan-test/regression/ws/setup-f90.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# General notes
+#######################
+# Script to set up the F90 compiler to use for subsequent test cases.  This
+# script may load optional modules (as in a Cray PE), set LD_PRELOAD
+# variables (as in a dynamically linked environment), or generate mpicc
+# wrappers (as in a statically linked environment).
+
+# The script should produce a single string to stdout, which is the command
+# line to use for invoking the F90 compiler
+
+# Notes specific to this platform (ws)
+########################
+# This particular version of the setup-cc script assumes that mpicc is
+# present in the path already, and that the F90 compiler to use for
+# subsequent tests should be generated from this using darshan-gen-fortran.pl.
+
+$DARSHAN_PATH/bin/darshan-gen-fortran.pl `which mpif90` --output $DARSHAN_TMP/mpif90
+if [ $? -ne 0 ]; then
+    echo "Error: failed to generate f90 compiler." 1>&2
+    exit 1
+fi
+
+echo $DARSHAN_TMP/mpif90
+exit 0
diff --git a/darshan-test/regression/ws/setup-runjob.sh b/darshan-test/regression/ws/setup-runjob.sh
new file mode 100755
index 0000000..b62e205
--- /dev/null
+++ b/darshan-test/regression/ws/setup-runjob.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# General notes
+#######################
+# Script to set up whatever is needed to run an MPI job. This script should
+# produce the string of the command line prefix to use for job execution.
+# This could (for example) point to a wrapper script that will submit a job
+# to a scheduler and wait for its completion.
+
+# Notes specific to this platform (ws)
+########################
+# This particular version of the setup-runjob script just uses mpiexec,
+# assuming that is in the path already.
+
+echo mpiexec -n $DARSHAN_DEFAULT_NPROCS
+exit 0


hooks/post-receive
--



More information about the Darshan-commits mailing list