#!/bin/bash -e
#
# 2014/01/06 gabriel

function oar_fixldpath () {
   if [ -n "${LD_LIBRARY_PATH:+x}" ]
   then
      for ldpath in $(for lib in $(/sbin/ldconfig -p | awk 'BEGIN { FS = "=> " } ; {print $2}'); do dirname ${lib}; done | sort -u)
      do
         LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ldpath}"
      done
   fi
   }
declare -fx oar_fixldpath

exists_np=''
exists_mf=''
exists_vb=''

for opt in $*
do
   [ "${opt}" == "-np" ]           && exists_np='y'
   [ "${opt}" == "-machinefile" ]  && exists_mf='y'
   [ "${opt}" == "--machinefile" ] && exists_mf='y'
   [ "${opt}" == "-hostfile" ]     && exists_mf='y'
   [ "${opt}" == "--hostfile" ]    && exists_mf='y'
   [ "${opt}" == "--host" ]        && exists_mf='y'
   [ "${opt}" == "-host" ]         && exists_mf='y'
   [ "${opt}" == "-H" ]            && exists_mf='y'
   [ "${opt}" == "--verbose" ]     && exists_vb='y'
   [ "${opt}" == "-v" ]            && exists_vb='y'
   [ "${opt}" == "--" ]            && break
done

[ -n "${VERBOSE:+x}" ] && exists_vb='y'

mpi_option=''

# NODEFILE to use. By default specialized one
nodefile="${OAR_NODE_FILE}"
[ -n "${OAR_MSG_NODEFILE:+x}" -a -e "${OAR_MSG_NODEFILE}" ] && nodefile="${OAR_MSG_NODEFILE}"
if [ -z ${exists_mf} ]
then
   [ -e "${nodefile}" ] && mpi_option="-machinefile ${nodefile} ${mpi_option}"
fi

# Number of MPI parallel run. By default MAX.
nbcpus=''
[ -e "${nodefile}" ]  && nbcpus=$(cat ${nodefile} | wc -l)
[ -n "${OAR_NP:+x}" ] && nbcpus=${OAR_NP}
if [ -z ${exists_np} ]
then
   [ -z ${nbcpus} ] || mpi_option="-np ${nbcpus} ${mpi_option}"
fi

# VARIABLE to define in other MPI parallel run
for varenv in $(env \
   | grep "^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" \
   | egrep -v "^USER=|^TERM=|^OAR|^SGE_|^LS_COLORS=\
      |^ENV=|^BASH_ENV=|^BASH_FUNC_|^HOSTNAME=|^LOGNAME=|^MAIL=\
      |^MANPATH=|^PWD=\
      |^OMPI_MCA_orte_rsh_agent=|^OMPI_MCA_plm_rsh_agent=\
      |^SHELL=|^SSH_|^SUDO_COMMAND=|^HOME=|^DISPLAY=\
      |^SHLVL=" \
   | cut -f 1 -d '=' \
   | sort )
do
   mpi_option="${mpi_option} -x ${varenv}"
done

# Special case of LD_LIBRARY_PATH and system path
oar_fixldpath

[ ! -z ${exists_vb} ] && echo mpirun ${mpi_option} $*
exec mpirun ${mpi_option} $*
