Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1412)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1413)
@@ -20,6 +20,6 @@
 	Vec old_uf=NULL; 
 	DataSet* loads=NULL;
-	Vec residue=NULL;
 	Vec KU=NULL;
+	Vec KUF=NULL;
 
 	/*intermediary: */
@@ -37,5 +37,7 @@
 	Vec dug=NULL;
 	double ndu,nduinf,nu;
-	double nresidue;
+	double nKUF;
+	double nF;
+	double residue;
 
 	/*parameters:*/
@@ -113,7 +115,11 @@
 
 		/*Compute residue*/
+		//compute KUF = KU - F = K*U - F
 		VecDuplicate(uf,&KU); MatMultPatch(Kff,uf,KU);
-		VecDuplicate(KU,&residue);VecCopy(KU,residue); VecAYPX(residue,-1.0,pf);
-		VecNorm(residue,NORM_2,&nresidue); VecFree(&residue);
+		VecDuplicate(KU,&KUF);VecCopy(KU,KUF); VecAYPX(KUF,-1.0,pf);
+		//comput norm(KUF), norm(F) and residue
+		VecNorm(KUF,NORM_2,&nKUF); VecFree(&KUF);
+		VecNorm(pf,NORM_2,&nF);
+		residue=nKUF/nF;
 	
 		//no need for Kff and pf anymore
@@ -137,5 +143,5 @@
 
 		//residue
-		if (debug) _printf_("%s%g\n","   Convergence criterion: norm(residue)=",nresidue);
+		if (debug) _printf_("%s%g\n","   Convergence criterion: norm(KU-F)/norm(F)=",residue);
 
 		//relative criterion
