Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1659)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1660)
@@ -134,7 +134,10 @@
 		VecDuplicate(KU,&KUF);VecCopy(KU,KUF); VecAYPX(KUF,-1.0,pf);
 		//compute norm(KUF), norm(F) and residue
-		VecNorm(KUF,NORM_2,&nKUF); VecFree(&KUF);
+		VecNorm(KUF,NORM_2,&nKUF);
 		VecNorm(pf,NORM_2,&nF);
 		solver_residue=nKUF/nF;
+		//clean up
+		VecFree(&KU);
+		VecFree(&KUF);
 		if (debug) _printf_("%-50s%g\n","   Convergence criterion: norm(KU-F)/norm(F)",solver_residue);
 
@@ -143,8 +146,11 @@
 			//compute KUoldF = KUold - F = K*Uold - F
 			VecDuplicate(uf,&KUold); MatMultPatch(Kff,old_uf,KUold);
-			VecDuplicate(KUold,&KUoldF);VecCopy(KUold,KUoldF); VecAYPX(KUoldF,-1.0,pf); VecFree(&KUold);
+			VecDuplicate(KUold,&KUoldF);VecCopy(KUold,KUoldF); VecAYPX(KUoldF,-1.0,pf);
 			//compute norm(KUF), norm(F) and residue
-			VecNorm(KUoldF,NORM_2,&nKUoldF); VecFree(&KUoldF);
+			VecNorm(KUoldF,NORM_2,&nKUoldF);
 			mechanical_residue=nKUoldF/nF;
+			//clean up
+			VecFree(&KUold);
+			VecFree(&KUoldF);
 		}
 		else{
@@ -207,4 +213,10 @@
 	/*Delete loads: */
 	delete loads;
+
+	/*clean up*/
+	VecFree(&uf);
+	VecFree(&old_uf);
+	VecFree(&old_ug);
+	delete solver_string;
 	
 	/*Assign output pointers: */
@@ -214,3 +226,2 @@
 
 }
-
