Index: /issm/trunk-jpl/src/c/solutions/controltao_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11512)
+++ /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11513)
@@ -17,6 +17,6 @@
 
 /*Local prototype*/
-int FormFunctionGradient(TaoSolver tao,Vec,double*,Vec,void*);
-int IssmMonitor(TaoSolver,void *);
+int FormFunctionGradient(TaoSolver,Vec,double*,Vec,void*);
+int IssmMonitor(TaoSolver,void*);
 typedef struct {
 	FemModel* femmodel;
@@ -60,5 +60,5 @@
 
 	/*Prepare all TAO parameters*/
-	TaoSetMonitor(tao,IssmMonitor,NULL,NULL);
+	TaoSetMonitor(tao,IssmMonitor,&user,NULL);
 	TaoSetMaximumFunctionEvaluations(tao,maxiter);
 	TaoSetMaximumIterations(tao,nsteps);
@@ -146,12 +146,28 @@
 int IssmMonitor(TaoSolver tao, void *userCtx){
 
-	AppCtx *user = (AppCtx *)userCtx;
-	int     its;
-	double  f,gnorm,cnorm,xdiff;
+	int       i,its,num_responses;
+	double    f,gnorm,cnorm,xdiff;
+	AppCtx   *user      = (AppCtx *)userCtx;
+	FemModel *femmodel  = user->femmodel;
+	Element  *element   = NULL;
+	int      *responses = NULL;
+
+	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+	femmodel->parameters->FindParam(&responses,NULL,NULL,StepResponsesEnum);
 
 	TaoGetSolutionStatus(tao, &its, &f, &gnorm, &cnorm, &xdiff, NULL);
-	if(its==0)printf("Iter       Function      Residual\n");
-	printf("%4i   %12.7g  %12.7g\n",its,f,gnorm);
-	printf("iter: %i\n",tao->niter);
+	if(its==0) _printf_(true,"Iter       Function      Residual  |  List of contributions\n");
+	if(its==0) _printf_(true,"-----------------------------------+-----------------------\n");
+	_printf_(true,"%4i   %12.7g  %12.7g  | ",its,f,gnorm);
+
+	/*Retrieve objective functions independently*/
+	for(i=0;i<num_responses;i++){
+		Responsex(&f,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,EnumToStringx(responses[i]),false,i);
+		_printf_(true," %12.7g ","",f);
+	}
+	_printf_(true,"\n");
+
+	/*Clean-up and return*/
+	xfree((void**)&responses);
 	return 0;
 }
