Index: /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18570)
+++ /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18571)
@@ -81,6 +81,6 @@
 	if(VerboseControl())_printf0_("   Computing initial solution\n");
 	_printf0_("\n");
-	_printf0_("Cost function f(x)   |  List of contributions\n");
-	_printf0_("_____________________________________________\n");
+	_printf0_("Cost function f(x)   | Gradient norm |g(x)| |  List of contributions\n");
+	_printf0_("____________________________________________________________________\n");
 	indic = 0; //no adjoint required
 	simul(&indic,&n,X,&f,G,izs,rzs,(void*)femmodel);
@@ -162,11 +162,15 @@
 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
 
-	/*Retrieve objective functions independently*/
-	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
-	_printf0_("\n");
-	xDelete<IssmDouble>(Jlist);
+
 
 	if(indic==0){
 		/*dry run, no gradient required*/
+
+		/*Retrieve objective functions independently*/
+		_printf0_("            N/A |\n");
+		for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
+		_printf0_("\n");
+
+		xDelete<IssmDouble>(Jlist);
 		xDelete<IssmDouble>(XU);
 		xDelete<IssmDouble>(XL);
@@ -185,10 +189,19 @@
 
 	/*Constrain Gradient*/
+	IssmDouble  Gnorm = 0.;
 	for(long i=0;i<*n;i++){
 		if(X[i]>=XU[i]) G[i]=0.;
 		if(X[i]<=XL[i]) G[i]=0.;
-	}
+		Gnorm += G[i]*G[i];
+	}
+	Gnorm = sqrt(Gnorm);
+
+	/*Print info*/
+	_printf0_("       "<<setw(12)<<setprecision(7)<<Gnorm<<" |");
+	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
+	_printf0_("\n");
 
 	/*Clean-up and return*/
+		xDelete<IssmDouble>(Jlist);
 	xDelete<IssmDouble>(XU);
 	xDelete<IssmDouble>(XL);
