Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 79)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 80)
@@ -119,17 +119,27 @@
 			VecNorm(dug,NORM_2,&ndu);VecNorm(old_ug,NORM_2,&nu);VecNorm(dug,NORM_INFINITY,&nduinf); VecFree(&dug);
 
+			//relative criterion
 			if((ndu/nu)<eps_rel){
-				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);
+				converged=1;
+				}
+			else{ 
+				if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: norm(du)/norm(u)=",ndu/nu," > ",eps_rel);
+				converged=0;
+			}
+
+			//Absolute criterion (Optional)
+			if (!isnan(eps_abs)){
+				if ((nduinf*yts)<eps_abs){
+					if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: max(du)=",nduinf*yts," < ",eps_abs);
+				}
+				else{
+					if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: max(du)=",nduinf*yts," > ",eps_abs);
+					converged=0;
 				}
 			}
-		
-			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);
-			}
+			//rift convergence
+			if (!constraints_converged) converged=0;
 		}
 
