Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 1264)
+++ /issm/trunk/src/c/Makefile.am	(revision 1265)
@@ -575,4 +575,5 @@
 					./parallel/control_core.cpp\
 					./parallel/ControlPrepareStokes.cpp\
+					./parallel/ControlTemporaryResults.cpp\
 					./parallel/objectivefunctionC.cpp\
 					./parallel/GradJCompute.cpp\
Index: /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp	(revision 1265)
+++ /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp	(revision 1265)
@@ -0,0 +1,75 @@
+
+/*!\file: ControlTemporaryResults.cpp
+ * \brief: core of the control solution 
+ */ 
+
+#undef __FUNCT__ 
+#define __FUNCT__ "ControlTemporaryResults"
+
+#include "./parallel.h"
+#include "../issm.h"
+
+void ControlTemporaryResults(FemModel* fems,double* param_g,double* J,int n,ParameterInputs* inputs){
+
+	extern int my_rank;
+
+	/*fem models: */
+	FemModel* fem_dh=NULL;
+
+	/*output: */
+	DataSet* temporary_results=NULL;
+	Result*  result=NULL;
+	char*    outputfilename=NULL;
+
+	/*Intermediary: */
+	int      i;
+	DataSet* diagnostic_results=NULL;
+	Vec      u_g=NULL;
+	char*    control_type=NULL;
+	int      gsize;
+	int      numberofnodes;
+	double* param_g_copy;
+	double* J_copy;
+
+	/*recover fem models: */
+	fem_dh=fems+0;
+
+	/*Recover parameters used throughout the solution:*/
+	fem_dh->parameters->FindParam((void*)&control_type,"control_type");
+	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	fem_dh->parameters->FindParam((void*)&outputfilename,"outputfilename");
+	gsize=fem_dh->nodes->NumberOfDofs();
+
+	/*Launch diagnostic with the last parameter distribution*/
+	inputs->Add(control_type,param_g,1,numberofnodes);
+	diagnostic_results=new DataSet(ResultsEnum()); 
+	diagnostic_core(diagnostic_results,fems, inputs);
+
+	//extract u_g from diagnostic_results, and erase diagnostic_results;
+	diagnostic_results->FindResult(&u_g,"u_g");
+	delete diagnostic_results;
+
+	/*Plug COPYS of the results into output dataset: 
+	 * only the pointer is given to temporary_results and at the
+	 * end of ProcessResults the pointer is deleted. That would 
+	 * destroy param_g and J*/
+
+	J_copy=(double*)xcalloc(n+1,sizeof(double));
+	for(i=0;i<n+1;i++) J_copy[i]=J[i];
+	param_g_copy=(double*)xcalloc(numberofnodes,sizeof(double));
+	for(i=0;i<numberofnodes;i++) param_g_copy[i]=param_g[i];
+
+	temporary_results=new DataSet(ResultsEnum()); 
+	result=new Result(temporary_results->Size()+1,0,1,"u_g",u_g);
+	temporary_results->AddObject(result);
+	result=new Result(temporary_results->Size()+1,0,1,"param_g",param_g_copy,gsize);
+	temporary_results->AddObject(result);
+	result=new Result(temporary_results->Size()+1,0,1,"J",J_copy,n+1);
+	temporary_results->AddObject(result);
+
+	//process results
+	ProcessResults(&temporary_results,&fems[0],ControlAnalysisEnum());
+
+	//Write results on disk
+	OutputResults(temporary_results,outputfilename);
+}
Index: /issm/trunk/src/c/parallel/control.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control.cpp	(revision 1264)
+++ /issm/trunk/src/c/parallel/control.cpp	(revision 1265)
@@ -38,4 +38,5 @@
 	double* u_g_obs=NULL;
 	Param*  param=NULL;
+	int      count;
 
 	MODULEBOOT();
@@ -90,4 +91,10 @@
 	results=new DataSet(ResultsEnum());
 
+	//Add output file name to parameters of femmodels[0]
+	count=femmodels[0].parameters->Size()+1;
+	param= new Param(count,"outputfilename",STRING);
+	param->SetString(outputfilename);
+	femmodels[0].parameters->AddObject(param);
+
 	/*are we running the solution sequence, or a qmu wrapper around it? : */
 	femmodels[0].parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
Index: /issm/trunk/src/c/parallel/control_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control_core.cpp	(revision 1264)
+++ /issm/trunk/src/c/parallel/control_core.cpp	(revision 1265)
@@ -141,8 +141,15 @@
 		_printf_("%s\n","      done.");
 
-		_printf_("%s%i%s%g\n","      value of misfit J after optimization #",n,": ",J[n]);
+		_printf_("%s%i%s%g\n","      value of misfit J after optimization #",n+1,": ",J[n]);
 
 		/*some freeing:*/
 		xfree((void**)&grad_g_double);
+
+		//some temporary saving
+		if (((n+1)%5)==0){
+			_printf_("%s\n","      saving temporary results...");
+			ControlTemporaryResults(fems,param_g,J,n,inputs);
+			_printf_("%s\n","      done.");
+		}
 	}
 
Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1264)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1265)
@@ -134,4 +134,5 @@
 		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);
+		if (isnan(ndu) || isnan(nu)) throw ErrorException(__FUNCT__,exprintf("convergence criterion is NaN! "));
 
 		//residue
Index: /issm/trunk/src/c/parallel/parallel.h
===================================================================
--- /issm/trunk/src/c/parallel/parallel.h	(revision 1264)
+++ /issm/trunk/src/c/parallel/parallel.h	(revision 1265)
@@ -41,4 +41,5 @@
 
 void ControlPrepareStokes(FemModel* fems, ParameterInputs* inputs);
+void ControlTemporaryResults(FemModel* fems,double* param_g,double* J,int n,ParameterInputs* inputs);
 
 void CreateFemModel(FemModel* femmodel,ConstDataHandle MODEL,char* analysis_type,char* sub_analysis_type);
