Index: /issm/trunk-jpl/externalpackages/boost/install-1.7-linux-valgrind.sh
===================================================================
--- /issm/trunk-jpl/externalpackages/boost/install-1.7-linux-valgrind.sh	(revision 27426)
+++ /issm/trunk-jpl/externalpackages/boost/install-1.7-linux-valgrind.sh	(revision 27427)
@@ -10,5 +10,5 @@
 
 # Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/boost_${VER}.tar.gz" "boost_${VER}.tar.gz"
+${ISSM_DIR}/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/boost_${VER}.tar.gz" "boost_${VER}.tar.gz"
 
 # Unpack source
@@ -23,6 +23,6 @@
 rm -rf boost_${VER}
 
-# Copy customized source and config files to 'src' directory
-cp ./configs/1.73/boost/math/tools/user.hpp ./src/boost/math/tools/
+# Copy customized source and configuration files to 'src' directory
+cp ./configs/1.73/boost/math/tools/user.hpp ./src/boost/math/tools
 
 # Configure
Index: /issm/trunk-jpl/externalpackages/boost/install-1.7-mac-valgrind.sh
===================================================================
--- /issm/trunk-jpl/externalpackages/boost/install-1.7-mac-valgrind.sh	(revision 27427)
+++ /issm/trunk-jpl/externalpackages/boost/install-1.7-mac-valgrind.sh	(revision 27427)
@@ -0,0 +1,66 @@
+#!/bin/bash
+#set -eu # Do not `run set -eu` because it causes some targets to fail
+
+
+## Constants
+#
+VER="1_73_0"
+
+PREFIX="${ISSM_DIR}/externalpackages/boost/install" # Set to location where external package should be installed
+
+## Environment
+#
+export LDFLAGS="-Wl,-headerpad_max_install_names"
+
+# Download source
+${ISSM_DIR}/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/boost_${VER}.tar.gz" "boost_${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf boost_${VER}.tar.gz
+
+# Cleanup
+rm -rf ${PREFIX} src
+mkdir -p ${PREFIX} src
+
+# Move source into 'src' directory
+mv boost_${VER}/* src
+rm -rf boost_${VER}
+
+# Copy customized source and configuration files to 'src' directory
+cp ./configs/1.73/boost/math/tools/user.hpp ./src/boost/math/tools
+
+# Configure
+cd src
+./bootstrap.sh \
+	--prefix=${PREFIX} \
+	--with-python=python2.7
+
+# Modify project config to enable MPI
+printf "\n# Enable MPI\nusing mpi ;\n" >> project-config.jam
+
+# Compile and install
+./b2 install link=shared runtime-link=shared
+
+# Set install_name for all shared libraries
+#
+# NOTE: The install_name_tool prints an error message on some installations, 
+#		but this is not a shell error, and it does not seem to affect the 
+#		Boost libraries called by ISSM. For now, we are simply redirecting the 
+#		error to null.
+#
+# TODO:
+# - Modify the source to apply absolute paths to the library ids so that 
+#	patching it after the fact with install_name_tool is not necessary.
+#
+cd ${PREFIX}/lib
+for name in *.dylib; do
+	install_name_tool -id ${PREFIX}/lib/${name} ${name} 2>/dev/null
+done
+
+if [ "${VER}" == "1_79_0" ]; then
+	## Patch install names for certain libraries
+	#
+	# TODO: Figure out how to reconfigure source to apply these install names at compile time
+	#
+	install_name_tool -change @rpath/libboost_atomic.dylib ${PREFIX}/lib/libboost_atomic.dylib libboost_filesystem.dylib
+fi
Index: /issm/trunk-jpl/jenkins/pine_island-mac-full-valgrind
===================================================================
--- /issm/trunk-jpl/jenkins/pine_island-mac-full-valgrind	(revision 27426)
+++ /issm/trunk-jpl/jenkins/pine_island-mac-full-valgrind	(revision 27427)
@@ -46,9 +46,10 @@
 	petsc		install-3.16-mac.sh
 	gsl			install.sh
-	boost		install-1.7-mac.sh
+	boost		install-1.7-mac-valgrind.sh
 	dakota		install-6.2-mac.sh
 	curl		install-7-mac.sh
 	netcdf		install-4.7-parallel.sh
 	proj		install-6.sh
+	sqlite		install.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk-jpl/jenkins/ross-debian_linux-full-valgrind
===================================================================
--- /issm/trunk-jpl/jenkins/ross-debian_linux-full-valgrind	(revision 27426)
+++ /issm/trunk-jpl/jenkins/ross-debian_linux-full-valgrind	(revision 27427)
@@ -51,4 +51,5 @@
 	netcdf		install-4.7-parallel.sh
 	proj		install-6.sh
+	sqlite		install.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk-jpl/src/m/classes/toolkits.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/toolkits.py	(revision 27426)
+++ /issm/trunk-jpl/src/m/classes/toolkits.py	(revision 27427)
@@ -8,15 +8,14 @@
 
 class toolkits(object):
-    '''
-    TOOLKITS class definition
+    """TOOLKITS class definition
 
-        Usage:
-            self = toolkits()
-    '''
+    Usage:
+        self = toolkits()
+    """
 
     def __init__(self): #{{{
-        #default toolkits
+        # Default toolkits
         if IssmConfig('_HAVE_PETSC_')[0]:
-            #MUMPS is the default toolkits
+            # MUMPS is the default toolkits
             if IssmConfig('_HAVE_MUMPS_')[0]:
                 self.DefaultAnalysis = mumpsoptions()
@@ -31,8 +30,8 @@
                 raise IOError("ToolkitsFile error: need at least Mumps or Gsl to define issm solver type")
 
-        #Use same solver for Recovery mode
+        # Use same solver for Recovery mode
         self.RecoveryAnalysis = self.DefaultAnalysis
 
-        #The other properties are dynamic
+        # The other properties are dynamic
     #}}}
 
@@ -50,9 +49,9 @@
         #    md.toolkits = addoptions(md.toolkits, 'StressbalanceAnalysis')
 
-        #Create dynamic property if property does not exist yet
+        # Create dynamic property if property does not exist yet
         if not hasattr(self, analysis):
             setattr(self, analysis, None)
 
-        #Add toolkits options to analysis
+        # Add toolkits options to analysis
         if len(args) == 1:
             setattr(self, analysis, args[0])
@@ -62,5 +61,5 @@
 
     def checkconsistency(self, md, solution, analyses): #{{{
-        # TODO
+        # TODO:
         # - Implement something closer to a switch as in 
         # src/m/classes/toolkits.m?
@@ -74,17 +73,14 @@
 
     def ToolkitsFile(self, filename): #{{{
-        '''
-        TOOLKITSFILE - build toolkits file
+        """TOOLKITSFILE - build toolkits file
 
-            Build a Petsc compatible options file, from the toolkits model 
-            field + return options string.
-            This file will also be used when the toolkit used is 'issm' instead 
-            of 'petsc'.s
+        Build a PETSc compatible options file, from the toolkits model field + return options string.
+        This file will also be used when the toolkit used is 'issm' instead of 'petsc'.
 
-            Usage:
-                ToolkitsFile(toolkits, filename)
-        '''
+        Usage:
+            ToolkitsFile(toolkits, filename)
+        """
 
-        #open file for writing
+        # Open file for writing
         try:
             fid = open(filename, 'w')
@@ -92,21 +88,21 @@
             raise IOError("ToolkitsFile error: could not open {}' for writing due to".format(filename), e)
 
-        #write header
+        # Write header
         fid.write("%s%s%s\n" % ('%Toolkits options file: ', filename, ' written from Python toolkits array'))
 
-        #start writing options
+        # Start writing options
         for analysis in list(vars(self).keys()):
             options = getattr(self, analysis)
 
-            #first write analysis:
-            fid.write("\n+{}\n".format(analysis))  #append a + to recognize it's an analysis enum
-            #now, write options
+            # First write analysis
+            fid.write("\n+{}\n".format(analysis))  # Append a + to recognize it's an analysis enum
+            # Now, write options
             for optionname, optionvalue in list(options.items()):
 
                 if not optionvalue:
-                    #this option has only one argument
+                    # This option has only one argument
                     fid.write("-{}\n".format(optionname))
                 else:
-                    #option with value. value can be string or scalar
+                    # Option with value. Value can be string or scalar.
                     if isinstance(optionvalue, (bool, int, float)):
                         fid.write("-{} {}\n".format(optionname, optionvalue))
