Index: /issm/trunk-jpl/jenkins/jenkins.sh
===================================================================
--- /issm/trunk-jpl/jenkins/jenkins.sh	(revision 23148)
+++ /issm/trunk-jpl/jenkins/jenkins.sh	(revision 23149)
@@ -245,5 +245,5 @@
 	if [ $? -ne 0 ] && [ $NUMCPUS_INSTALL -gt 1 ]; then 
 		echo " "
-		echo "Compilation failed, trying to compile with only one threatd"
+		echo "Compilation failed, trying to compile with only one thread"
 		echo " "
 		make
Index: /issm/trunk-jpl/jenkins/linux64_ross
===================================================================
--- /issm/trunk-jpl/jenkins/linux64_ross	(revision 23148)
+++ /issm/trunk-jpl/jenkins/linux64_ross	(revision 23149)
@@ -29,5 +29,5 @@
 
 #PYTHON and MATLAB testing
-MATLAB_TEST=1
+MATLAB_TEST=0
 PYTHON_TEST=1
 
@@ -37,14 +37,5 @@
 
 #List of external packages to be installed and their installation scripts
-EXTERNALPACKAGES="autotools     install.sh
-						cmake        install.sh
-						mpich         install-3.2-linux64.sh
-						petsc         install-3.7-linux64.sh
-						triangle      install-linux64.sh
-						chaco         install.sh
-						m1qn3         install.sh
-						hdf5          install.sh
-						netcdf        install.sh
-						shell2junit   install.sh"
+EXTERNALPACKAGES=""
 
 #-----------------#
@@ -63,4 +54,4 @@
 #by Matlab and runme.m
 #ex: "'id',[101 102 103]"
-PYTHON_NROPTIONS=""
+PYTHON_NROPTIONS="--exclude_name 'Dakota'"
 MATLAB_NROPTIONS="'exclude',[IdFromString('Dakota')]"
Index: /issm/trunk-jpl/test/NightlyRun/IdFromString.py
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/IdFromString.py	(revision 23148)
+++ /issm/trunk-jpl/test/NightlyRun/IdFromString.py	(revision 23149)
@@ -1,16 +1,18 @@
 #! /usr/bin/env python
 from IdToName import IdToName
+import os
 
-def IdFromString(string):
+# use verbose=False to print output when this is called by command line
+def IdFromString(string,verbose=False):
 	"""
 	IDFROMSTRING - output ids from a given string
  
 	    Usage:
-	       ids=IdFromString(string)
+		ids=IdFromString(string)
  
 	    Examples:
-	       ids=IdFromString('Parallel')
-	       ids=IdFromString('79North')
-			 ids=IdFromString('*')
+		ids=IdFromString('Parallel')
+		ids=IdFromString('79North')
+		ids=IdFromString('*')
 	"""
 
@@ -18,19 +20,40 @@
 	if not isinstance(string,str):
 		raise TypeError('IdFromString error message: input argument is not a string.')
+	string = string.replace("'",'')
+	string = string.replace('"','')
 
-	#Get the dictionary and scan for matches
-	idnames=IdToName(0)
-	ids=[item[0] for item in idnames.iteritems() if string in item[1]]
+	#Get the test ids and names and scan for matches
+
+	ids = []
+	idnames = []
+	for f in os.listdir('.'):
+		if f.endswith('.py') and f.startswith('test'):
+			# all tests look like: "testwxyz.py" so 5th to 3rd to last is always the full id
+			s = int(f[4:-3])
+			name = IdToName(s)
+			if (string == '*') or (name != None and string in name):
+				ids.append(s)
+				idnames.append(name)
 
 	#Return if no test found
 	if not ids:
-		print "No test matches '%s'." % string
+		if verbose:
+			print "No test matches '%s'." % string
+		#else:
+			#print []
 		return ids
 
 	#Display names
+	if verbose:
+		idnames = [i for _,i in sorted(zip(ids,idnames), key=lambda pair: pair[0])]
+
 	ids.sort()
-	print "%d tests match '%s':" % (len(ids),string)
-	for id in ids:
-		print "   %d : %s" % (id,idnames[id])
+
+	if verbose:
+		print "%s tests match '%s':" % (len(ids),string)
+		for i in range(len(ids)):
+			print "   %s : %s" % (ids[i],idnames[i])
+	#else:
+		#print ids
 
 	return ids
Index: /issm/trunk-jpl/test/NightlyRun/IdToName.py
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/IdToName.py	(revision 23148)
+++ /issm/trunk-jpl/test/NightlyRun/IdToName.py	(revision 23149)
@@ -1,17 +1,19 @@
 #! /usr/bin/env python
 
-def IdToName(id):
+def IdToName(test_id):
 	"""
 	IDTONAME- return name of test
  
 	    Usage:
-	       name=IdToName(id)
+	       name=IdToName(test_id)
 	"""
+	#try:
+	infile = open('test' + str(test_id) + '.py','r')
+	file_text = infile.readline()
 
-	infile  = open('test' + str(id) + '.py','r')
-	file_text  = infile.readlines()
-
-	string='#Test Name:'
-	name=file_text[0]
-	name=name[len(string)+1:-1]
+	string = '#Test Name:'
+	name = file_text[len(string)+1:-1]
 	return name
+	#except IOError:
+		# no test with that name, so ignore it
+		#return None
Index: /issm/trunk-jpl/test/NightlyRun/runme.py
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/runme.py	(revision 23148)
+++ /issm/trunk-jpl/test/NightlyRun/runme.py	(revision 23149)
@@ -6,4 +6,5 @@
 from glob import glob
 from socket import gethostname
+from IdFromString import *
 
 def runme(id=None,exclude=None,benchmark='nightly',procedure='check',output='none',rank=1,numprocs=1):
@@ -20,5 +21,5 @@
 	    Available options:
 	       'id'            followed by the list of ids requested
-	       'exclude'       ids to be excluded from the test
+	       'exclude'       ids or (parts of) test names to be excluded from the test
 	       'benchmark'     'all' (all of the tests)
                           'nightly' (nightly run/ daily run)
@@ -39,4 +40,6 @@
 	       runme()
 	       runme(exclude=101)
+	       runme(exclude='Dakota')
+	       runme(exclude=[[101,102],['Dakota','Slr']])
 	       runme(id=102,procedure='update')
 	"""
@@ -92,12 +95,44 @@
 	# }}}
 	#GET exclude {{{
-	if exclude:
-		if isinstance(exclude,list):
-			exclude_ids=exclude
-		else:
-			exclude_ids=[exclude]
-		test_ids=test_ids.difference(set(exclude_ids))
-#	print 'test_ids after exclude =',test_ids
-	# }}}
+	exclude_ids = []
+	if np.size(exclude) > 0:
+		# 1 exclusion, either an id or a test name
+		if type(exclude) == str:
+			exclude_ids = IdFromString(exclude)
+		if type(exclude) == int:
+			exclude_ids = [exclude]
+
+		# many exclusions of either ids or test names
+		if type(exclude) == list and len(exclude) > 0:
+			# is everything a string or int?
+			if np.array([type(i) == int for i in exclude]).all():
+				exclude_ids = exclude
+			elif np.array([type(i) == str for i in exclude]).all():
+				exclude_ids = np.concatenate([IdFromString(i) for i in exclude])
+
+		# many exclusions of both ids and test names
+		# exclude[0] -> exclude by id
+		# exclude[1] -> exclude by test name
+		if type(exclude) == list and len(exclude) == 2:
+			if type(exclude[0]) == list and len(exclude[0]) > 0 and type(exclude[0][0]) == int:
+				exclude_ids = np.concatenate([exclude_ids,exclude[0]])
+			if type(exclude[1]) == list and len(exclude[1]) > 0 and type(exclude[1][0]) == str:
+				exclude_ids = np.concatenate([exclude_ids,np.concatenate([IdFromString(i) for i in exclude[1]])])
+
+		# no recognizable exclusion
+		if np.size(exclude_ids) == 0:
+			print exclude
+			raise RuntimeError('''runme.py: exclude (-e/-exclude) and exclude-name (-en/-exclude_name) options must appear as one of the following:
+
+exclude=101					OR -e 101
+exclude=\'Dakota\'				OR -en 'Dakota'
+exclude=[101,102...]				OR -e 101 102 ...
+exclude=[\'Dakota\',\'Slr\'...]			OR -en 'Dakota' 'Slr' ...
+exclude=[[101,102...],[\'Dakota\',\'Slr\'...]]	OR -e 101 102 ... -en 'Dakota' 'Slr' ...
+''')
+		test_ids=test_ids.difference(exclude_ids)
+	print 'test_ids after exclude =',sorted(test_ids)
+	# }}}
+	return
 	#Process Ids according to benchmarks {{{
 	if benchmark=='nightly':
@@ -248,4 +283,5 @@
 	parser.add_argument('-i','--id', nargs='*', type=int, help='followed by the list of ids requested', default=[])
 	parser.add_argument('-e','--exclude', nargs='+', type=int, help='ids to be excluded from the test', default=[])
+	parser.add_argument('-en','--exclude_name', nargs='+', type=str, help='test names to be excluded from the test', default=[])
 	parser.add_argument('-b','--benchmark', help='nightly/ismip/eismint/thermal/mesh/...', default='nightly')
 	parser.add_argument('-p','--procedure', help='check/update', default='check')
@@ -255,5 +291,5 @@
 	args = parser.parse_args()
 
-	md = runme(args.id, args.exclude, args.benchmark, args.procedure, args.output, args.rank, args.numprocs)
+	md = runme(args.id, [args.exclude,args.exclude_name], args.benchmark, args.procedure, args.output, args.rank, args.numprocs)
 
 	if args.output=='nightly':
