Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 21509)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 21510)
@@ -60,4 +60,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.results_on_nodes",SettingsResultsOnNodesEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.io_gather",SettingsIoGatherEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.settings.solver_residue_threshold",SettingsSolverResidueThresholdEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.isautodiff",AutodiffIsautodiffEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.qmu.isdakota",QmuIsdakotaEnum));
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 21509)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 21510)
@@ -309,4 +309,5 @@
 	SettingsRecordingFrequencyEnum,
 	SettingsWaitonlockEnum,
+	SettingsSolverResidueThresholdEnum,
 	DebugProfilingEnum,
 	ProfilingCurrentMemEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 21509)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 21510)
@@ -315,4 +315,5 @@
 		case SettingsRecordingFrequencyEnum : return "SettingsRecordingFrequency";
 		case SettingsWaitonlockEnum : return "SettingsWaitonlock";
+		case SettingsSolverResidueThresholdEnum : return "SettingsSolverResidueThreshold";
 		case DebugProfilingEnum : return "DebugProfiling";
 		case ProfilingCurrentMemEnum : return "ProfilingCurrentMem";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 21509)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 21510)
@@ -321,4 +321,5 @@
 	      else if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
+	      else if (strcmp(name,"SettingsSolverResidueThreshold")==0) return SettingsSolverResidueThresholdEnum;
 	      else if (strcmp(name,"DebugProfiling")==0) return DebugProfilingEnum;
 	      else if (strcmp(name,"ProfilingCurrentMem")==0) return ProfilingCurrentMemEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"SmbWini")==0) return SmbWiniEnum;
 	      else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum;
-	      else if (strcmp(name,"SmbTini")==0) return SmbTiniEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbSizeini")==0) return SmbSizeiniEnum;
+	      if (strcmp(name,"SmbTini")==0) return SmbTiniEnum;
+	      else if (strcmp(name,"SmbSizeini")==0) return SmbSizeiniEnum;
 	      else if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum;
 	      else if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"Temperature")==0) return TemperatureEnum;
 	      else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
-	      else if (strcmp(name,"TemperaturePDD")==0) return TemperaturePDDEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
+	      if (strcmp(name,"TemperaturePDD")==0) return TemperaturePDDEnum;
+	      else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
 	      else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
 	      else if (strcmp(name,"Vel")==0) return VelEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"Outputdefinition39")==0) return Outputdefinition39Enum;
 	      else if (strcmp(name,"Outputdefinition40")==0) return Outputdefinition40Enum;
-	      else if (strcmp(name,"Outputdefinition41")==0) return Outputdefinition41Enum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"Outputdefinition42")==0) return Outputdefinition42Enum;
+	      if (strcmp(name,"Outputdefinition41")==0) return Outputdefinition41Enum;
+	      else if (strcmp(name,"Outputdefinition42")==0) return Outputdefinition42Enum;
 	      else if (strcmp(name,"Outputdefinition43")==0) return Outputdefinition43Enum;
 	      else if (strcmp(name,"Outputdefinition44")==0) return Outputdefinition44Enum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
-	      else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"BuddJacka")==0) return BuddJackaEnum;
+	      if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
+	      else if (strcmp(name,"BuddJacka")==0) return BuddJackaEnum;
 	      else if (strcmp(name,"CuffeyTemperate")==0) return CuffeyTemperateEnum;
 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
-	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+	      if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"Contours")==0) return ContoursEnum;
 	      else if (strcmp(name,"Parameters")==0) return ParametersEnum;
-	      else if (strcmp(name,"Vertices")==0) return VerticesEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Results")==0) return ResultsEnum;
+	      if (strcmp(name,"Vertices")==0) return VerticesEnum;
+	      else if (strcmp(name,"Results")==0) return ResultsEnum;
 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
          else stage=10;
Index: /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp	(revision 21509)
+++ /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp	(revision 21510)
@@ -19,4 +19,5 @@
 	Vector<IssmDouble>*  ys  = NULL;
 	int  configuration_type;
+	IssmDouble solver_residue_threshold;
 	
 	/*solver convergence test: */
@@ -27,8 +28,7 @@
 	Vector<IssmDouble>* KUF=NULL;
 
-
-
 	/*Recover parameters: */
 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+	femmodel->parameters->FindParam(&solver_residue_threshold,SettingsSolverResidueThresholdEnum);
 	femmodel->UpdateConstraintsx();
 	SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
@@ -47,5 +47,5 @@
 	nF=pf->Norm(NORM_TWO);
 	solver_residue=nKUF/nF;
-	if(solver_residue>1.e-6)_error_("   solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << "\n");
+	if(isnan(solver_residue_threshold) == false && solver_residue>solver_residue_threshold)_error_("   solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << "\n");
 
 	//clean up
Index: /issm/trunk-jpl/src/m/classes/settings.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.js	(revision 21509)
+++ /issm/trunk-jpl/src/m/classes/settings.js	(revision 21510)
@@ -27,4 +27,7 @@
 		//upload options: 
 		upload_port         = 0;
+		
+		//throw an error if solver residue exceeds this value
+		self.solver_residue_threshold=1e-6;
 
 	}// }}}
@@ -43,4 +46,5 @@
 		fielddisplay(this,'upload_port','port login (default is 0)');
 		fielddisplay(this,'upload_filename','unique id generated when uploading the file to server');
+		fielddisplay(this,'solver_residue_threshold','throw an error if solver residue exceeds this value');
 
 
@@ -58,4 +62,5 @@
 			checkfield(md,'fieldname','settings.recording_frequency','numel',[1],'>=',0);
 			checkfield(md,'fieldname','settings.waitonlock','numel',[1]);
+			checkfield(md,'fieldname','settings.solver_residue_threshold','numel',[1],'>',0);
 		} // }}}
 		this.marshall=function(md,prefix,fid) { //{{{
@@ -65,4 +70,5 @@
 			WriteData(fid,prefix,'object',this,'fieldname','output_frequency','format','Integer');
 			WriteData(fid,prefix,'object',this,'fieldname','recording_frequency','format','Integer');
+			WriteData(fid,prefix,'object',this,'fieldname','solver_residue_threshold','format','Double');
 			if (this.waitonlock>0) WriteData(fid,prefix,'name','md.settings.waitonlock','data',true,'format','Boolean');
 			else WriteData(fid,prefix,'name','md.settings.waitonlock','data',false,'format','Boolean');
@@ -83,4 +89,5 @@
 	this.upload_port         = 0;
 	this.upload_filename     = '';
+	this.solver_residue_threshold = 0;
 	this.setdefaultparameters();
 	//}}}
Index: /issm/trunk-jpl/src/m/classes/settings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.m	(revision 21509)
+++ /issm/trunk-jpl/src/m/classes/settings.m	(revision 21510)
@@ -17,4 +17,5 @@
 		upload_port         = 0;
 		upload_filename     = '';
+		solver_residue_threshold = 0;
 	end
 	methods
@@ -48,5 +49,8 @@
 
 			%upload options: 
-			upload_port         = 0;
+			self.upload_port         = 0;
+
+			%throw an error if solver residue exceeds this value
+			self.solver_residue_threshold = 1e-6;
 
 		end % }}}
@@ -59,4 +63,5 @@
 			md = checkfield(md,'fieldname','settings.recording_frequency','numel',[1],'>=',0);
 			md = checkfield(md,'fieldname','settings.waitonlock','numel',[1]);
+			md = checkfield(md,'fieldname','settings.solver_residue_threshold','numel',[1],'>',0);
 
 		end % }}}
@@ -75,4 +80,5 @@
 			fielddisplay(self,'upload_port','port login (default is 0)');
 			fielddisplay(self,'upload_filename','unique id generated when uploading the file to server');
+			fielddisplay(self,'solver_residue_threshold','throw an error if solver residue exceeds this value (NaN to deactivate)');
 
 		end % }}}
@@ -84,4 +90,5 @@
 			WriteData(fid,prefix,'object',self,'fieldname','recording_frequency','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','waitonlock','data',self.waitonlock>0,'format','Boolean');
+			WriteData(fid,prefix,'object',self,'fieldname','solver_residue_threshold','format','Double');
 		end % }}}
 		function savemodeljs(self,fid,modelname) % {{{
@@ -98,5 +105,5 @@
 			writejsdouble(fid,[modelname '.settings.upload_port'],self.upload_port);
 			writejsstring(fid,[modelname '.settings.upload_filename'],self.upload_filename);
-
+			writejsstring(fid,[modelname '.settings.solver_residue_threshold'],self.solver_residue_threshold);
 		end % }}}
 	end
Index: /issm/trunk-jpl/src/m/classes/settings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.py	(revision 21509)
+++ /issm/trunk-jpl/src/m/classes/settings.py	(revision 21510)
@@ -18,4 +18,5 @@
 		self.recording_frequency = 0
 		self.waitonlock          = 0
+		self.solver_residue_threshold = 0
 
 		#set defaults
@@ -32,4 +33,5 @@
 		string="%s\n%s"%(string,fielddisplay(self,"recording_frequency","frequency at which the runs are being recorded, allowing for a restart"))
 		string="%s\n%s"%(string,fielddisplay(self,"waitonlock","maximum number of minutes to wait for batch results, or return 0"))
+		string="%s\n%s"%(string,fielddisplay(self,"solver_residue_threshold","throw an error if solver residue exceeds this value (NaN to deactivate)"))
 		return string
 		#}}}
@@ -55,4 +57,7 @@
 		self.waitonlock=2**31-1
 
+      #throw an error if solver residue exceeds this value
+		self.solver_residue_threshold=1e-6;
+
 		return self
 	#}}}
@@ -64,4 +69,5 @@
 		md = checkfield(md,'fieldname','settings.recording_frequency','numel',[1],'>=',0)
 		md = checkfield(md,'fieldname','settings.waitonlock','numel',[1])
+		md = checkfield(md,'fieldname','settings.solver_residue_threshold','numel',[1],'>',0)
 
 		return md
@@ -73,4 +79,5 @@
 		WriteData(fid,prefix,'object',self,'fieldname','output_frequency','format','Integer')
 		WriteData(fid,prefix,'object',self,'fieldname','recording_frequency','format','Integer')
+		WriteData(fid,prefix,'object',self,'fieldname','solver_residue_threshold','format','Double')
 		if self.waitonlock>0:
 			WriteData(fid,prefix,'name','md.settings.waitonlock','data',True,'format','Boolean');
