Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18570)
+++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18571)
@@ -80,8 +80,8 @@
 
 	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);
 	double f1=f;
@@ -161,13 +161,17 @@
 	femmodel->CostFunctionx(pf,&Jlist,NULL);
 	_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);
 		return;
@@ -184,12 +188,21 @@
 	xDelete<IssmDouble>(G2);
 
 	/*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);
 }
