#!/bin/sh
#
# Run PVM 3 application under SPMD-like model
#
# Usage :    pvmfork [-h hostfile]
#                    [-H hostname] # Specific host to run the programs on
#		     [-f node_definition_file]
#		     [-n mesh_dimensions_in_format NXxNYxNZ ('x'=times)]
#                    [-t]  # Enable PICL/ParaGraph-tracefiles
#                    [-v]  # Run pvmserver in verbose mode
#                    [node_program_name] [parameters]
# 
#--------------------------------------------------------------------------
# Author: Sami Saarinen
#         Center for Scientific Computing (CSC)
#         P.O.Box 405, Tietotie 6
#         FIN-02101 Espoo, Finland
#       >>e-mail: Sami.Saarinen@csc.fi
#
# Date:   11-NOV-1993
#--------------------------------------------------------------------------

if [ $# = 0 ]
then
	head -12 $0 | tail -11
	exit 1
fi

set -- `getopt h:f:n:H:vtd $*`

#
# Default values
#

: ${TMPDIR:=/tmp}
export TMPDIR

HOSTFILE=
NDFFILE=
MESHDIM=
NODEEXE=
VERBOSE=
HOSTNAME=
DEBUG=

#
# Parse parameters
#

while [ $1 != "--" ]
do
	case $1 in
	 -v) VERBOSE="-v";;
	 -H) HOSTNAME="${2}:";
	     shift;;	
	 -t) EASY_PICLTRACE=0; export EASY_PICLTRACE;;
	 -d) DEBUG="-d";;
	 -h) HOSTFILE="-h $2";
	     shift;;
	 -f) NDFFILE=$2;
	     shift;;
	 -n) MESHDIM=`echo "$2" | sed 's/,/x/g' |\
awk -Fx '{if (NF<1) print 1,1,1; else if (NF==1) print $1,1,1; else if (NF==2) print $1,$2,1; else print $1,$2,$3;}'`;
	     shift;;
	esac
	shift
done

shift
NODEEXE="$*"

if [ "$NDFFILE" != "" ] ; then
  if [ ! -f "$NDFFILE" ] ; then
    echo "pvmfork: Given node definition file '${NDFFILE}' not found."
    exit 1
  fi
#  echo "Using the following node definition file '${NDFFILE}' :"
#  cat $NDFFILE
  NDFFILE="-f $NDFFILE"
else
  if [ "$MESHDIM" != "" ] ; then
    EASY_NCPUS="$MESHDIM"
    export EASY_NCPUS
#    echo "pvmfork: EASY_NCPUS set to $EASY_NCPUS"
  fi
  NDFFILE="${HOSTNAME}${NODEEXE}"
fi

COMMAND="pvmrun $HOSTFILE pvmserver $VERBOSE $DEBUG $NDFFILE"

#echo "pvmfork% $COMMAND"
$COMMAND
RC=$?
if [ "$RC" != 0 ] ; then
  pvmclean
fi

if [ "$DELETENDF" = 1 ] ; then
  /bin/rm -f $NDFFILE
fi

exit $RC
