Index: sm/trunk-jpl/jenkins/ross-debian_linux-binaries-python
===================================================================
--- /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python	(revision 26987)
+++ 	(revision )
@@ -1,89 +1,0 @@
-#--------------------#
-# ISSM Configuration #
-#--------------------#
-
-# NOTE:
-# - We can disable dependency tracking in the Autotools because the binaries
-#	should always be a one-time build.
-# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
-#	copied by packaging script.
-#
-ISSM_CONFIG='\
-	--prefix=${ISSM_DIR} \
-	--enable-standalone-executables \
-	--enable-standalone-modules \
-	--enable-standalone-libraries \
-	--disable-dependency-tracking \
-	--with-pic \
-	--with-python-dir=/usr \
-	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
-	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
-	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
-	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
-	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
-	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
-	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
-	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
-	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
-'
-#-------------------#
-# External Packages #
-#-------------------#
-
-EXTERNALPACKAGES="
-	autotools	install-linux.sh
-	cmake		install.sh
-	petsc		install-3.12-linux-static.sh
-	gsl			install-static.sh
-	boost		install-1.7-linux-static.sh
-	dakota		install-6.2-linux-static.sh
-	curl		install-7-linux-static.sh
-	netcdf		install-4.7-parallel-static.sh
-	proj		install-6-static.sh
-	gdal		install-3-python-static.sh
-	gshhg		install.sh
-	gmt			install-6-linux-static.sh
-	gmsh		install-4-static.sh
-	triangle	install-linux-static.sh
-	chaco		install.sh
-	m1qn3		install.sh
-	semic		install.sh
-	shell2junit	install.sh
-"
-
-#---------#
-# Testing #
-#---------#
-
-# Test suites
-MATLAB_TEST=0
-PYTHON_TEST=0
-JAVASCRIPT_TEST=0
-EXAMPLES_TEST=0
-
-# Number of CPUs used in ISSM compilation
-#
-# NOTE: One is usually safer as some packages are very sensitive to parallel
-# 		compilation.
-#
-NUMCPUS_INSTALL=8
-
-# Number of CPUs used in the nightly runs
-NUMCPUS_RUN=1
-
-# Nightly run options
-#
-# See documentation in test/NightlyRun/runme.* for more information.
-#
-MATLAB_NROPTIONS=""
-PYTHON_NROPTIONS=""
Index: /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-2
===================================================================
--- /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-2	(revision 26988)
+++ /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-2	(revision 26988)
@@ -0,0 +1,89 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
+#	copied by packaging script.
+#
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-pic \
+	--with-python-dir=/usr \
+	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
+	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-linux-static.sh
+	dakota		install-6.2-linux-static.sh
+	curl		install-7-linux-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-linux-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-linux-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-3
===================================================================
--- /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-3	(revision 26988)
+++ /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-python-3	(revision 26988)
@@ -0,0 +1,90 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
+#	copied by packaging script.
+#
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-pic \
+	--with-python-dir=/usr \
+	--with-python-version=3.7 \
+	--with-python-numpy-dir=/usr/local/lib/python3.7/dist-packages/numpy \
+	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-linux-static.sh
+	dakota		install-6.2-linux-static.sh
+	curl		install-7-linux-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-linux-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-linux-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-2.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-2.sh	(revision 26988)
+++ /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-2.sh	(revision 26988)
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
+# distributable package for Linux with Python 2 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Transmits package to ISSM Web site for distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-Linux-Python-2" # Name of directory to copy distributable files to
+
+COMPRESSED_PKG="${PKG}.tar.gz"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;				shift	;;
+		-s|--skiptests)		build=0;						;;
+		-t|--transferonly)	build=0;	package=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 		;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python-2
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/linux/package-issm-linux-binaries-python-2.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/linux/transfer-issm-linux-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-3.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-3.sh	(revision 26988)
+++ /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python-3.sh	(revision 26988)
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
+# distributable package for Linux with Python 3 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Transmits package to ISSM Web site for distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-Linux-Python-3" # Name of directory to copy distributable files to
+
+COMPRESSED_PKG="${PKG}.tar.gz"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;				shift	;;
+		-s|--skiptests)		build=0;						;;
+		-t|--transferonly)	build=0;	package=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 		;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python-3
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/linux/package-issm-linux-binaries-python-3.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/linux/transfer-issm-linux-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: sm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/complete-issm-linux-binaries-python.sh	(revision 26987)
+++ 	(revision )
@@ -1,94 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
-# distributable package for Linux with Python API.
-#
-# Normally, we would put this directly into the project configuration under 
-# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
-# good idea to version it.
-#
-# When no failures/errors occur, performs the following:
-# - Builds ISSM according to configuration.
-# - Packages executables and libraries.
-# - Runs test suite against package.
-# - Transmits package to ISSM Web site for distribution.
-#
-# Options:
-# -b/--skipbuild		Skip ISSM compilation.
-# -s/--skiptests		Skip ISSM compilation and testing during packaging 
-#						step. Use if packaging fails for some reason but build 
-#						is valid.
-# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
-#						fails for some reason to skip building, packaging, and 
-#						signing.
-#
-# NOTE:
-# - Use only *one* of the above options at a time, and make sure it is removed 
-#	again after a single run.
-# - Builds will fail when any of the above options are used on a clean 
-#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
-#	select menu is set to "Always check out a fresh copy".
-################################################################################
-
-## Constants
-#
-PKG="ISSM-Linux-Python" # Name of directory to copy distributable files to
-
-COMPRESSED_PKG="${PKG}.tar.gz"
-
-## Environment
-#
-export COMPRESSED_PKG
-export PKG
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
-#		but the following is self-documenting).
-#
-build=1
-package=1
-transfer=1
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-b|--skipbuild)		build=0;				shift	;;
-		-s|--skiptests)		build=0;						;;
-		-t|--transferonly)	build=0;	package=0;			;;
-		*) echo "Unknown parameter passed: $1"; exit 1 		;;
-	esac
-fi
-
-# Build
-if [ ${build} -eq 1 ]; then
-	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Package
-if [ ${package} -eq 1 ]; then
-	./packagers/linux/package-issm-linux-binaries-python.sh $1
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Transfer distributable package to ISSM Web site
-if [ ${transfer} -eq 1 ]; then
-	./packagers/linux/transfer-issm-linux-binaries.sh
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
Index: /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-2.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-2.sh	(revision 26988)
+++ /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-2.sh	(revision 26988)
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for Linux with Python 2 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/linux/complete-issm-linux-binaries-python-2.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+## Override certain aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
+LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests) skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+echo "Moving libgfortran to lib/"
+cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
+
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [[ ${numTestsFailed} -ne 0 ]]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+tar -czf ${COMPRESSED_PKG} ${PKG}
Index: /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-3.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-3.sh	(revision 26988)
+++ /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python-3.sh	(revision 26988)
@@ -0,0 +1,169 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for Linux with Python 3 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/linux/complete-issm-linux-binaries-python-3.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+## Override certain aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
+LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests) skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_EXT_STATIC_DIR}/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_EXT_STATIC_DIR}/petsc/install/bin/mpiexec .
+	cp ${ISSM_EXT_STATIC_DIR}/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_EXT_STATIC_DIR}/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_EXT_STATIC_DIR}/mpich/install/bin/mpiexec .
+	cp ${ISSM_EXT_STATIC_DIR}/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_EXT_STATIC_DIR}/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_EXT_STATIC_DIR}/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_EXT_STATIC_DIR}/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_EXT_STATIC_DIR}/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_EXT_STATIC_DIR}/gmt/install/bin/gmt .
+	cp ${ISSM_EXT_STATIC_DIR}/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_EXT_STATIC_DIR}/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_EXT_STATIC_DIR}/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+echo "Moving libgfortran to lib/"
+cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
+
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Ensure that runme.py uses Python 3 interpreter
+	sed -i "s|/usr/bin/env python|/usr/bin/python3|g" ./runme.py
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [[ ${numTestsFailed} -ne 0 ]]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+tar -czf ${COMPRESSED_PKG} ${PKG}
Index: sm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-python.sh	(revision 26987)
+++ 	(revision )
@@ -1,166 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Packages and tests ISSM distributable package for Linux with Python API.
-#
-# Options:
-# -s/--skiptests		Skip testing during packaging Use if packaging fails 
-#						for some reason but build is valid.
-#
-# NOTE:
-# - Assumes that the following constants are defined,
-#
-#		COMPRESSED_PKG
-#		ISSM_DIR
-#		PKG
-#
-# See also:
-# - packagers/linux/complete-issm-linux-binaries-python.sh
-################################################################################
-
-# Expand aliases within the context of this script
-shopt -s expand_aliases
-
-## Override certain aliases
-#
-alias grep=$(which grep)
-
-## Constants
-#
-LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
-LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
-PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
-
-## Environment
-#
-export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-skip_tests=0
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-s|--skiptests) skip_tests=1;					;;
-		*) echo "Unknown parameter passed: $1"; exit 1	;;
-	esac
-fi
-
-# Clean up from previous packaging
-echo "Cleaning up existing assets"
-cd ${ISSM_DIR}
-rm -rf ${PKG} ${COMPRESSED_PKG}
-mkdir ${PKG}
-
-# Add required binaries and libraries to package and modify them where needed
-cd ${ISSM_DIR}/bin
-
-echo "Modify generic"
-cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
-
-echo "Moving MPICH binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
-elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
-else
-	echo "MPICH not found"
-	exit 1
-fi
-
-echo "Moving GDAL binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
-else
-	echo "GDAL not found"
-	exit 1
-fi
-
-echo "Moving GMT binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
-else
-	echo "GMT not found"
-	exit 1
-fi
-
-echo "Moving Gmsh binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
-	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
-else
-	echo "Gmsh not found"
-	exit 1
-fi
-
-echo "Moving libgfortran to lib/"
-cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
-
-
-# Run tests
-if [ ${skip_tests} -eq 0 ]; then
-	echo "Running tests"
-	cd ${ISSM_DIR}/test/NightlyRun
-	rm python.log 2> /dev/null
-
-	# Set Python environment
-	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
-	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
-	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
-
-	# Run tests, redirecting output to logfile and suppressing output to console
-	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
-
-	# Check that Python did not exit in error
-	pythonExitCode=`echo $?`
-	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
-
-	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
-		echo "----------Python exited in error!----------"
-		cat python.log
-		echo "-----------End of python.log-----------"
-
-		# Clean up execution directory
-		rm -rf ${ISSM_DIR}/execution/*
-
-		exit 1
-	fi
-
-	# Check that all tests passed
-	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
-
-	if [[ ${numTestsFailed} -ne 0 ]]; then
-		echo "One or more tests FAILED"
-		exit 1
-	else
-		echo "All tests PASSED"
-	fi
-else
-	echo "Skipping tests"
-fi
-
-# Create package
-cd ${ISSM_DIR}
-svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
-echo "Copying assets to package: ${PKG}"
-cp -rf bin examples lib scripts test ${PKG}
-mkdir ${PKG}/execution
-${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
-echo "Cleaning up unneeded/unwanted files"
-rm -f ${PKG}/bin/*.py # Remove all Python scripts
-rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
-rm -f ${PKG}/lib/*.a # Remove static libraries from package
-rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
-rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
-
-# Compress package
-echo "Compressing package"
-tar -czf ${COMPRESSED_PKG} ${PKG}
Index: /issm/trunk-jpl/src/m/exp/expwrite.py
===================================================================
--- /issm/trunk-jpl/src/m/exp/expwrite.py	(revision 26987)
+++ /issm/trunk-jpl/src/m/exp/expwrite.py	(revision 26988)
@@ -23,5 +23,5 @@
     if isinstance(contours, list):
         for contour in contours:
-            #if it si some kind of array it is a contour and we loop on indexes
+            #if it is some kind of array it is a contour and we loop on indexes
             if isinstance(contour['x'], (list, tuple, np.ndarray)):
                 writegeomlist(contour, fid, filename)
@@ -31,5 +31,5 @@
     #if it is a dict type it means just one contour
     else:
-        #if it si some kind of array it is a contour and we loop on indexes
+        #if it is some kind of array it is a contour and we loop on indexes
         if isinstance(contours['x'], (list, tuple, np.ndarray)):
             writegeomlist(contours, fid, filename)
