Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1223)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1224)
@@ -16,8 +16,10 @@
 	/*solution : */
 	Vec ug=NULL; 
+	Vec uf=NULL; 
 	Vec old_ug=NULL; 
 	Vec old_uf=NULL; 
-	Vec uf=NULL; 
 	DataSet* loads=NULL;
+	Vec residue=NULL;
+	Vec KU=NULL;
 
 	/*intermediary: */
@@ -35,4 +37,5 @@
 	Vec dug=NULL;
 	double ndu,nduinf,nu;
+	double nresidue;
 
 	/*parameters:*/
@@ -45,6 +48,4 @@
 	/*Recover parameters: */
 	kflag=1; pflag=1;
-
-
 
 	fem->parameters->FindParam((void*)&connectivity,"connectivity");
@@ -81,5 +82,4 @@
 		VecFree(&old_uf);old_uf=uf;
 
-
 		/*Update parameters: */
 		UpdateFromInputsx(fem->elements,fem->nodes,loads, fem->materials,inputs);
@@ -111,8 +111,12 @@
 		if (debug) _printf_("   solving\n");
 		Solverx(&uf, Kff, pf, old_uf, solver_string);
+
+		/*Compute residue*/
+		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);
 	
 		//no need for Kff and pf anymore
 		MatFree(&Kff);VecFree(&pf);
-
 		
 		if (debug) _printf_("   merging solution from f to g set\n");
@@ -130,4 +134,7 @@
 		VecDuplicate(old_ug,&dug);VecCopy(old_ug,dug); VecAYPX(dug,-1.0,ug);
 		VecNorm(dug,NORM_2,&ndu);VecNorm(old_ug,NORM_2,&nu);VecNorm(dug,NORM_INFINITY,&nduinf); VecFree(&dug);
+
+		//residue
+		if (debug) _printf_("%s%g\n","   Convergence criterion: norm(residue)=",nresidue);
 
 		//relative criterion
