Index: /issm/trunk/src/c/ModelProcessorx/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/CreateConstraintsDiagnosticHoriz.cpp	(revision 59)
+++ /issm/trunk/src/c/ModelProcessorx/CreateConstraintsDiagnosticHoriz.cpp	(revision 60)
@@ -35,5 +35,4 @@
 	/*Create constraints: */
 	constraints = new DataSet(ConstraintsEnum());
-
 
 	/*Fetch data: */
Index: /issm/trunk/src/c/ModelProcessorx/ModelCreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/ModelCreateParameters.cpp	(revision 59)
+++ /issm/trunk/src/c/ModelProcessorx/ModelCreateParameters.cpp	(revision 60)
@@ -60,4 +60,10 @@
 	parameters->AddObject(param);
 
+	/*yts: */
+	count++;
+	param= new Param(count,"yts",DOUBLE);
+	param->SetDouble(model->yts);
+	parameters->AddObject(param);
+
 	/*dt: */
 	count++;
Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 59)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 60)
@@ -33,5 +33,5 @@
 
 	Vec dug;
-	double ndu,nu;
+	double ndu,nduinf,nu;
 
 	/*parameters:*/
@@ -40,5 +40,5 @@
 	char* solver_string=NULL;
 	int debug=0;
-	double eps_rel;
+	double eps_rel,eps_abs,yts;
 
 	/*Recover parameters: */
@@ -49,4 +49,6 @@
 	fem->parameters->FindParam((void*)&solver_string,"solverstring");
 	fem->parameters->FindParam((void*)&eps_rel,"eps_rel");
+	fem->parameters->FindParam((void*)&eps_abs,"eps_abs");
+	fem->parameters->FindParam((void*)&yts,"yts");
 	fem->parameters->FindParam((void*)&debug,"debug");
 	fem->parameters->FindParam((void*)&analysis_type,"analysis_type");
@@ -115,13 +117,18 @@
 		if(count>=2){
 			VecDuplicate(old_ug,&dug);VecCopy(old_ug,dug); VecAYPX(dug,-1.0,ug);
-			VecNorm(dug,NORM_2,&ndu); VecNorm(ug,NORM_2,&nu);VecFree(&dug);
-
+			VecNorm(dug,NORM_2,&ndu);VecNorm(old_ug,NORM_2,&nu);VecNorm(dug,NORM_INFINITY,&nduinf); VecFree(&dug);
 
 			if((ndu/nu)<eps_rel){
-				if (constraints_converged) converged=1;
+				if(isnan(eps_abs) | (nduinf*yts)<eps_abs){
+					if (constraints_converged) converged=1;
+				}
 			}
 		
 			if (debug){
 				_printf_("%s%g%s%g\n","   Convergence criterion: norm(du)/norm(u)=",ndu/nu," > ",eps_rel);
+			}
+
+			if (debug & !isnan(eps_abs)){
+				_printf_("%s%g%s%g\n","   Convergence criterion: max(du)=",nduinf*yts," > ",eps_abs);
 			}
 		}
