Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/test/NightlyRun/ad.m
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/test/NightlyRun/ad.m	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/test/NightlyRun/ad.m	(revision 13325)
@@ -7,7 +7,8 @@
 md.autodiff.isautodiff=true;
 md.autodiff.independents={'Thickness','Surface'};
 md.autodiff.dependents={'IceVolume'};
-md=solve(md,TransientSolutionEnum);
+%md=solve(md,TransientSolutionEnum);
+md=solve(md,PrognosticSolutionEnum);
 
 %Fields and tolerances to track changes
 field_names     ={'Vx','Vy','Vel','Pressure',...
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/externalpackages/git/install.sh
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/externalpackages/git/install.sh	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/externalpackages/git/install.sh	(revision 13325)
@@ -17,7 +17,7 @@
 
 #install
 cd src 
-./configure  --prefix="$ISSM_DIR/externalpackages/git/install"
+./configure  --prefix="$ISSM_DIR/externalpackages/git/install" --with-python="$ISSM_DIR/externalpackages/python/install/bin/python"
 	
 #Compile
 make install
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/issm.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/issm.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/issm.cpp	(revision 13325)
@@ -164,9 +164,9 @@
 
 	if(profiling){
 		ProfilingEnd(&Solution_time,&Memory_use,&Current_flops,Time_start,Flops_start);
-		femmodel->results->AddObject(new DoubleExternalResult(femmodel->results->Size()+1, ProfilingSolutionTimeEnum, Solution_time, 1, 0));
-		femmodel->results->AddObject(new DoubleExternalResult(femmodel->results->Size()+1, ProfilingCurrentMemEnum, Memory_use, 1, 0));
-		femmodel->results->AddObject(new DoubleExternalResult(femmodel->results->Size()+1, ProfilingCurrentFlopsEnum, Current_flops, 1, 0));
+		femmodel->results->AddObject(new GenericExternalResult<double>(femmodel->results->Size()+1, ProfilingSolutionTimeEnum, Solution_time, 1, 0));
+		femmodel->results->AddObject(new GenericExternalResult<double>(femmodel->results->Size()+1, ProfilingCurrentMemEnum, Memory_use, 1, 0));
+		femmodel->results->AddObject(new GenericExternalResult<double>(femmodel->results->Size()+1, ProfilingCurrentFlopsEnum, Current_flops, 1, 0));
 	}
 
 	#ifdef _HAVE_ADOLC_
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controlrestart.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controlrestart.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controlrestart.cpp	(revision 13325)
@@ -24,8 +24,15 @@
 	if(!dakota_analysis){
 		/*we essentially want J and the parameter: */
 		for(int i=0;i<num_controls;i++) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i]);
-		femmodel->results->AddObject(new DoubleVecExternalResult(femmodel->results->Size()+1,JEnum,J,nsteps,1,0));
-		//femmodel->results->AddObject(new StringExternalResult(femmodel->results->Size()+1,InversionControlParametersEnum,EnumToStringx(control_type),1,0));
+		#ifdef _HAVE_ADOLC_
+		IssmPDouble* J_passive=xNew<IssmPDouble>(nsteps);
+		for(int i=0;i<nsteps;i++)J_passive[i]=reCast<IssmPDouble>(J[i]);
+		femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,JEnum,J_passive,nsteps,1,1,0));
+		xDelete<IssmPDouble>(J_passive);
+		#else
+		femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,JEnum,J,nsteps,1,1,0));
+		#endif
+		//femmodel->results->AddObject(new GenericExternalResult<char*>(femmodel->results->Size()+1,InversionControlParametersEnum,EnumToStringx(control_type),1,0));
 
 		/*write to disk: */
 		OutputResultsx(femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,femmodel->results);
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/control_core.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/control_core.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/control_core.cpp	(revision 13325)
@@ -114,7 +114,15 @@
 	/*some results not computed by steadystate_core or diagnostic_core: */
 	if(!dakota_analysis){ //do not save this if we are running the control core from a qmu run!
 		for(i=0;i<num_controls;i++) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i]);
-		femmodel->results->AddObject(new DoubleVecExternalResult(femmodel->results->Size()+1,JEnum,J,nsteps,1,0));
+
+		#ifdef _HAVE_ADOLC_
+		IssmPDouble* J_passive=xNew<IssmPDouble>(nsteps);
+		for(int i=0;i<nsteps;i++)J_passive[i]=reCast<IssmPDouble>(J[i]);
+		femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,JEnum,J_passive,nsteps,1,1,0));
+		xDelete<IssmPDouble>(J_passive);
+		#else
+		femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,JEnum,J,nsteps,1,1,0));
+		#endif
 	}
 
 	cleanup_and_return:
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/kriging.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/kriging.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/kriging.cpp	(revision 13325)
@@ -72,8 +72,8 @@
 	Results *results = new Results();
 	if(my_rank==0){
 		output_fid=pfopen(outbinfilename,"wb");
-		results->AddObject(new DoubleVecExternalResult(results->Size()+1,0,predictions,ninterp,1,0));
-		results->AddObject(new DoubleVecExternalResult(results->Size()+1,1,error,ninterp,1,0));
+		results->AddObject(new GenericExternalResult<double*>(results->Size()+1,0,predictions,ninterp,1,1,0));
+		results->AddObject(new GenericExternalResult<double*>(results->Size()+1,1,error,ninterp,1,1,0));
 		for(int i=0;i<results->Size();i++){
 			ExternalResult* result=(ExternalResult*)results->GetObjectByOffset(i);
 			result->WriteData(output_fid,1);
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controltao_core.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 13325)
@@ -87,7 +87,7 @@
 	for(int i=0;i<num_controls;i++){
 		InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_list[i]);
 	}
-	femmodel->results->AddObject(new DoubleVecExternalResult(femmodel->results->Size()+1,JEnum,user.J,maxiter+3,1,0));
+	femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,user.J,maxiter+3,1,1,0));
 
 	/*Finalize*/
 	if(VerboseControl()) _pprintLine_("   preparing final solution");
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Elements.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Elements.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Elements.cpp	(revision 13325)
@@ -165,6 +165,8 @@
 /*FUNCTION Elements::ToResults{{{*/
 void Elements::ToResults(Results* results,Parameters* parameters){
 
+	int i;
+	
 	extern int my_rank;
 	extern int num_procs;
 
@@ -244,7 +246,14 @@
 			vector_serial=vector->ToMPISerial();
 			if(my_rank==0){
 				/*No need to add this vector for all cpus*/
-				results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,vectorsize,resultssteps[i],resultstimes[i]));
+				#ifdef _HAVE_ADOLC_
+				IssmPDouble* vector_serial_passive=xNew<IssmPDouble>(vectorsize);
+				for(i=0;i<vectorsize;i++)vector_serial_passive[i]=reCast<IssmPDouble>(vector_serial[i]);
+				results->AddObject(new GenericExternalResult<double*>(results->Size()+1,resultsenums[i],vector_serial_passive,vectorsize,1,resultssteps[i],resultstimes[i]));
+				xDelete<IssmPDouble>(vector_serial_passive);
+				#else
+				results->AddObject(new GenericExternalResult<double*>(results->Size()+1,resultsenums[i],vector_serial,vectorsize,1,resultssteps[i],resultstimes[i]));
+				#endif
 			}
 
 			/*clean up*/
@@ -261,9 +270,16 @@
 
 		/*create result object and add to results dataset:*/
 		if (patch->maxvertices && patch->maxnodes){
-			results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,1,0));
-			results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,1,0));
-			results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,  patch->values,patch->numrows,patch->numcols,1,0));
+			results->AddObject(new GenericExternalResult<int>(results->Size()+1,PatchVerticesEnum,patch->maxvertices,1,0));
+			results->AddObject(new GenericExternalResult<int>(results->Size()+1,PatchNodesEnum,   patch->maxnodes,1,0));
+			#ifdef _HAVE_ADOLC_
+			IssmPDouble* values_passive=xNew<IssmPDouble>(patch->numrows);
+			for(i=0;i<patch->numrows;i++)values_passive[i]=reCast<IssmPDouble>(patch->values[i]);
+			results->AddObject(new GenericExternalResult<double*>(results->Size()+1,PatchEnum,  values_passive,patch->numrows,patch->numcols,1,0));
+			xDelete<IssmPDouble>(values_passive);
+			#else
+			results->AddObject(new GenericExternalResult<double*>(results->Size()+1,PatchEnum,  patch->values,patch->numrows,patch->numcols,1,0));
+			#endif
 		}
 	}
 
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp	(revision 13325)
@@ -66,19 +66,16 @@
                 double *theOutput=xNew<double>(num_dependents);
                 if (fos_forward(1,num_dependents,num_independents, 0, xp, tangentDir, theOutput, theJacVecProduct ))
                   _error_("fos_forward returned non-zero error code");
-                IssmDouble *theJacVecProductA=xNew<IssmDouble>(num_dependents);
-                for (int i=0;i<num_dependents;++i)
-                  theJacVecProductA[i]=theJacVecProduct[i];
-                results->AddObject(new DoubleVecExternalResult(results->Size()+1,AutodiffJacobianEnum,theJacVecProductA,num_dependents,1,0.0));
+                results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,theJacVecProduct,num_dependents,1,1,0.0));
 
 #if 0
                 double **J=xNew<double>(num_dependents,num_independents);
 		jacobian(1,num_dependents,num_independents,xp,J);
-		IssmDouble *matJ=xNew<IssmDouble>(num_dependents*num_independents);
+		IssmPDouble *matJ=xNew<IssmPDouble>(num_dependents*num_independents);
                 for (int i=0;i<num_dependents*num_independents;++i)
                   matJ[i]=J[i];
-                results->AddObject(new DoubleMatExternalResult(results->Size()+1,AutodiffJacobianEnum,matJ,num_independents,num_dependents,1,0.0));
-                xDelete(matJ);
+                results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,matJ,num_independents,num_dependents,1,1,0.0));
+                xDelete<IssmPDouble>(matJ);
                 xDelete(J);
 #endif
 
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/OutputResultsx/OutputResultsx.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 13325)
@@ -44,7 +44,7 @@
 	if(my_rank==0){
 		parameters->FindParam(&solutiontype,SolutionTypeEnum);
 		EnumToStringx(&solutiontypestring,solutiontype);
-		results->AddObject(new StringExternalResult(results->Size()+1,SolutionTypeEnum,solutiontypestring,1,0));
+		results->AddObject(new GenericExternalResult<char*>(results->Size()+1,SolutionTypeEnum,solutiontypestring,1,0));
 		xDelete<char>(solutiontypestring);
 	}
 
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AddExternalResultx/AddExternalResultx.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AddExternalResultx/AddExternalResultx.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/AddExternalResultx/AddExternalResultx.cpp	(revision 13325)
@@ -10,9 +10,16 @@
 		
 void AddExternalResultx( DataSet* results, int enumtype, IssmDouble value){
 	/* Add new result in into results*/
-	results->AddObject(new DoubleExternalResult(results->Size()+1,enumtype,value,1,0));
+	results->AddObject(new GenericExternalResult<double>(results->Size()+1,enumtype,reCast<IssmPDouble>(value),1,0));
 }
 void AddExternalResultx( DataSet* results, int enumtype, IssmDouble* value, int nraws){
 	/* Add new result in into results*/
-	results->AddObject(new DoubleVecExternalResult(results->Size()+1,enumtype,value,nraws,1,0));
+	#ifdef _HAVE_ADOLC_
+	IssmPDouble* value_passive=xNew<IssmPDouble>(nraws);
+	for(int i=0;i<nraws;i++)value_passive[i]=reCast<IssmPDouble>(value[i]);
+	results->AddObject(new GenericExternalResult<double*>(results->Size()+1,enumtype,value_passive,nraws,1,1,0));
+	xDelete<IssmPDouble>(value_passive);
+	#else
+	results->AddObject(new GenericExternalResult<double*>(results->Size()+1,enumtype,value,nraws,1,1,0));
+	#endif
 }
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/RequestedOutputsx/RequestedOutputsx.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/RequestedOutputsx/RequestedOutputsx.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/RequestedOutputsx/RequestedOutputsx.cpp	(revision 13325)
@@ -29,11 +29,11 @@
 
 				case IceVolumeEnum:
 					Responsex(&output_value,elements,nodes,vertices,loads,materials,parameters,"IceVolume",false,0);
-					results->AddObject(new DoubleExternalResult(results->Size()+1,IceVolumeEnum,output_value,step,time));
+					results->AddObject(new GenericExternalResult<double>(results->Size()+1,IceVolumeEnum,reCast<IssmPDouble>(output_value),step,time));
 					break;
 				case TotalSmbEnum:
 					Responsex(&output_value,elements,nodes,vertices,loads,materials,parameters,"TotalSmb",false,0);
-					results->AddObject(new DoubleExternalResult(results->Size()+1,TotalSmbEnum,output_value,step,time));
+					results->AddObject(new GenericExternalResult<double>(results->Size()+1,TotalSmbEnum,reCast<IssmPDouble>(output_value),step,time));
 					break;
 				default:
 					/*create this output in the element inputs, and then transfer to results:*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Makefile.am
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Makefile.am	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Makefile.am	(revision 13325)
@@ -74,18 +74,7 @@
 					./classes/objects/ElementResults/BoolElementResult.h\
 					./classes/objects/ElementResults/BoolElementResult.cpp\
 					./classes/objects/ExternalResults/ExternalResult.h\
-					./classes/objects/ExternalResults/BoolExternalResult.h\
-					./classes/objects/ExternalResults/BoolExternalResult.cpp\
-					./classes/objects/ExternalResults/DoubleExternalResult.h\
-					./classes/objects/ExternalResults/DoubleExternalResult.cpp\
-					./classes/objects/ExternalResults/DoubleVecExternalResult.h\
-					./classes/objects/ExternalResults/DoubleVecExternalResult.cpp\
-					./classes/objects/ExternalResults/DoubleMatExternalResult.h\
-					./classes/objects/ExternalResults/DoubleMatExternalResult.cpp\
-					./classes/objects/ExternalResults/IntExternalResult.h\
-					./classes/objects/ExternalResults/IntExternalResult.cpp\
-					./classes/objects/ExternalResults/StringExternalResult.h\
-					./classes/objects/ExternalResults/StringExternalResult.cpp\
+					./classes/objects/ExternalResults/GenericExternalResult.h\
 					./classes/objects/Elements/Tria.h\
 					./classes/objects/Elements/Tria.cpp\
 					./classes/objects/Elements/TriaHook.h\
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/objects.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/objects.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/objects.h	(revision 13325)
@@ -92,12 +92,7 @@
 
 /*ExternalResults: */
 #include "./ExternalResults/ExternalResult.h"
-#include "./ExternalResults/BoolExternalResult.h"
-#include "./ExternalResults/DoubleExternalResult.h"
-#include "./ExternalResults/DoubleVecExternalResult.h"
-#include "./ExternalResults/DoubleMatExternalResult.h"
-#include "./ExternalResults/IntExternalResult.h"
-#include "./ExternalResults/StringExternalResult.h"
+#include "./ExternalResults/GenericExternalResult.h"
 
 /*Materials: */
 #include "./Materials/Material.h"
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.cpp	(revision 13325)
@@ -1,166 +0,0 @@
-/*!\file DoubleMatExternalResult.c
- * \brief: implementation of the DoubleMatExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*DoubleMatExternalResult constructors and destructor*/
-/*FUNCTION DoubleMatExternalResult::DoubleMatExternalResult(){{{*/
-DoubleMatExternalResult::DoubleMatExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::DoubleMatExternalResult(int in_id, int enum_type,IssmDoubleMat values,int M,int N,int in_step,IssmDouble in_time){{{*/
-DoubleMatExternalResult::DoubleMatExternalResult(int in_id, int in_enum_type,IssmDouble* in_values, int in_M,int in_N,int in_step,IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	M=in_M;
-	N=in_N;
-
-	/*Copy result in values*/
-	if(M*N){
-		values=xNew<IssmDouble>(M*N);
-		xMemCpy<IssmDouble>(values,in_values,M*N);
-	}
-	else values=NULL;
-
-	step=in_step;
-	time=in_time;
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::~DoubleMatExternalResult(){{{*/
-DoubleMatExternalResult::~DoubleMatExternalResult(){
-
-	xDelete<IssmDouble>(this->values);
-	return;
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION DoubleMatExternalResult::Echo {{{*/
-void DoubleMatExternalResult::Echo(void){
-
-	_printLine_("DoubleMatExternalResult:");
-	_printLine_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-	_printLine_("   matrix size: " << this->M << "-" << this->N);
-
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::DeepEcho{{{*/
-void DoubleMatExternalResult::DeepEcho(void){
-
-	int i,j;
-	
-	_printLine_("DoubleMatExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-	_printLine_("   matrix size: " << this->M << "-" << this->N);
-	for (i=0;i<this->M;i++){  
-		_printString_("   [ ");
-		for (j=0;j<this->N;j++){
-			_printString_( " " << setw(11) << setprecision (5) << this->values[i*this->N+j]);
-		}  
-		_printLine_(" ]");
-	}  
-
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::Id{{{*/
-int    DoubleMatExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::MyRank{{{*/
-int    DoubleMatExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::ObjectEnum{{{*/
-int DoubleMatExternalResult::ObjectEnum(void){
-
-	return DoubleMatExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::copy{{{*/
-Object* DoubleMatExternalResult::copy() {
-	
-	return new DoubleMatExternalResult(this->id,this->enum_type,this->values,this->M,this->N,this->step,this->time);
-
-}
-/*}}}*/
-
-/*DoubleMatExternalResult management: */
-/*FUNCTION DoubleMatExternalResult::WriteData{{{*/
-void   DoubleMatExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	int     rows,cols;
-	char   *name    = NULL;
-	extern  int my_rank;
-	IssmPDouble *passiveDouble_p=NULL;
-	IssmPDouble passiveDouble;
-
-	if(io_gather){
-		/*we are gathering the data on cpu 0, don't write on other cpus: */
-		if(my_rank) return;
-	}
-
-	passiveDouble_p=xNew<IssmPDouble>(M*N);
-
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-	passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a IssmDouble array, type is 3:*/
-	type=3;
-	fwrite(&type,sizeof(int),1,fid);
-	rows=this->M;
-	fwrite(&rows,sizeof(int),1,fid);
-	cols=this->N;
-	fwrite(&cols,sizeof(int),1,fid);
-	for (int i=0; i<N*M; ++i) passiveDouble_p[i]=reCast<IssmPDouble>(values[i]);
-	fwrite(passiveDouble_p,cols*rows*sizeof(IssmPDouble),1,fid);
-	xDelete(passiveDouble_p);
-
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::GetResultName{{{*/
-void DoubleMatExternalResult::GetResultName(char** pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION DoubleMatExternalResult::GetStep{{{*/
-int DoubleMatExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.h	(revision 13325)
@@ -1,55 +0,0 @@
-/*! \file DoubleVecExternalResult.h 
- */
-
-
-#ifndef _DOUBLEVECEXTERNALRESULT_H_
-#define _DOUBLEVECEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-#include "../../../include/include.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-class DoubleVecExternalResult: public ExternalResult{
-
-	private: 
-		int id;
-		int enum_type;
-		IssmDouble* values;
-		int M;
-		int step;
-		IssmDouble time;
-
-	public:
-		/*DoubleVecExternalResult constructors, destructors: {{{*/
-		DoubleVecExternalResult();
-		DoubleVecExternalResult(int id,int enum_type,IssmDouble* values,int M,int step, IssmDouble time);
-		~DoubleVecExternalResult();
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult management: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif  /* _DOUBLEVECEXTERNALRESULT_H */
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.h	(revision 13325)
@@ -1,56 +0,0 @@
-/*! \file DoubleExternalResult.h 
- *  \brief: header file for triavertexinput object
- */
-
-
-#ifndef _DOUBLEEXTERNALRESULT_H_
-#define _DOUBLEEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-#include "../../../include/include.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-class DoubleExternalResult: public ExternalResult{
-
-	public:
-		int    id;
-		int    enum_type;
-		IssmDouble value;
-		int    step;
-		IssmDouble time;
-
-
-		/*DoubleExternalResult constructors, destructors: {{{*/
-		DoubleExternalResult();
-		DoubleExternalResult(int id,int enum_type,IssmDouble value,int step,IssmDouble time);
-		~DoubleExternalResult();
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult management: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif  /* _DOUBLEEXTERNALRESULT_H */
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.h	(revision 13325)
@@ -1,54 +0,0 @@
-/*! \file IntExternalResult.h 
- *  \brief: header file for triavertexinput object
- */
-
-
-#ifndef _INTEXTERNALRESULT_H_
-#define _INTEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-/*}}}*/
-
-class IntExternalResult: public ExternalResult{
-
-	public:
-		int    id;
-		int    enum_type;
-		int    value;
-		int    step;
-		IssmDouble time;
-
-
-		/*IntExternalResult constructors, destructors: {{{*/
-		IntExternalResult();
-		IntExternalResult(int id,int enum_type,int value,int step,IssmDouble time);
-		~IntExternalResult();
-
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult managemnet: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif  /* _INTEXTERNALRESULT_H */
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.h	(revision 13325)
@@ -1,54 +0,0 @@
-/*! \file BoolExternalResult.h 
- *  \brief: header file for triavertexinput object
- */
-
-
-#ifndef _BOOLEXTERNALRESULT_H_
-#define _BOOLEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-#include "../../../include/include.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-class BoolExternalResult: public ExternalResult{
-
-	public:
-		int    id;
-		int    enum_type;
-		bool   value;
-		int    step;
-		IssmDouble time;
-
-		/*BoolExternalResult constructors, destructors: {{{*/
-		BoolExternalResult();
-		BoolExternalResult(int id, int enum_type,bool value,int step,IssmDouble time);
-		~BoolExternalResult();
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult management: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleMatExternalResult.h	(revision 13325)
@@ -1,56 +0,0 @@
-/*! \file DoubleMatExternalResult.h 
- */
-
-
-#ifndef _DOUBLEMATEXTERNALRESULT_H_
-#define _DOUBLEMATEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-#include "../../../include/include.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-class DoubleMatExternalResult: public ExternalResult{
-
-	private: 
-		int id;
-		int enum_type;
-		IssmDouble* values;
-		int M;
-		int N;
-		int step;
-		IssmDouble time;
-
-	public:
-		/*DoubleMatExternalResult constructors, destructors: {{{*/
-		DoubleMatExternalResult();
-		DoubleMatExternalResult(int id,int enum_type,IssmDouble* values,int M,int N,int step, IssmDouble time);
-		~DoubleMatExternalResult();
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult managemnet: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif  /* _DOUBLEMATEXTERNALRESULT_H */
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.cpp	(revision 13325)
@@ -1,132 +0,0 @@
-/*!\file StringExternalResult.c
- * \brief: implementation of the StringExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*StringExternalResult constructors and destructor*/
-/*FUNCTION StringExternalResult::StringExternalResult(){{{*/
-StringExternalResult::StringExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::StringExternalResult(int enum_type,IssmString value){{{*/
-StringExternalResult::StringExternalResult(int in_id, int in_enum_type,char* in_value,int in_step, IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	value=xNew<char>(strlen(in_value)+1);
-	xMemCpy<char>(value,in_value,(strlen(in_value)+1));
-	step=in_step;
-	time=in_time;
-	
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::~StringExternalResult(){{{*/
-StringExternalResult::~StringExternalResult(){
-	xDelete<char>(value);
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION StringExternalResult::Echo {{{*/
-void StringExternalResult::Echo(void){
-	this->DeepEcho();
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::DeepEcho{{{*/
-void StringExternalResult::DeepEcho(void){
-
-	_printLine_("StringExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum:  " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   value: " << this->value);
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::Id{{{*/
-int    StringExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION StringExternalResult::MyRank{{{*/
-int    StringExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::ObjectEnum{{{*/
-int StringExternalResult::ObjectEnum(void){
-
-	return StringExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::copy{{{*/
-Object* StringExternalResult::copy() {
-	
-	return new StringExternalResult(this->id,this->enum_type,this->value,this->step,this->time);
-
-}
-/*}}}*/
-
-/*StringExternalResult management: */
-/*FUNCTION StringExternalResult::WriteData{{{*/
-void   StringExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	char   *name      = NULL;
-	extern  int my_rank;
-        IssmPDouble passiveDouble;
-
-	/*return if now on cpu 0: */
-	if(my_rank)return;
-
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-        passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a string, type is 2: */
-	type=2;
-	fwrite(&type,sizeof(int),1,fid);
-	
-	length=(strlen(this->value)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(this->value,length,1,fid);
-
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::GetResultName{{{*/
-void StringExternalResult::GetResultName(char**pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION StringExternalResult::GetStep{{{*/
-int StringExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 13325)
@@ -1,152 +0,0 @@
-/*!\file DoubleVecExternalResult.c
- * \brief: implementation of the DoubleVecExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*DoubleVecExternalResult constructors and destructor*/
-/*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(){{{*/
-DoubleVecExternalResult::DoubleVecExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(int enum_type,IssmDoubleVec values,int M,int in_step,IssmDouble in_time){{{*/
-DoubleVecExternalResult::DoubleVecExternalResult(int in_id, int in_enum_type,IssmDouble* in_values, int in_M,int in_step,IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	M=in_M;
-
-	if(M){
-		values=xNew<IssmDouble>(M);
-		xMemCpy<IssmDouble>(values,in_values,M);
-	}
-	else values=NULL;
-
-	step=in_step;
-	time=in_time;
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::~DoubleVecExternalResult(){{{*/
-DoubleVecExternalResult::~DoubleVecExternalResult(){
-	xDelete<IssmDouble>(values);
-	return;
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION DoubleVecExternalResult::Echo {{{*/
-void DoubleVecExternalResult::Echo(void){
-
-	_printLine_("DoubleVecExternalResult:");
-	_printLine_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   vector size: " << this->M);
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::DeepEcho{{{*/
-void DoubleVecExternalResult::DeepEcho(void){
-
-	int i;
-	
-	_printLine_("DoubleVecExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   vector size: " << this->M);
-	for(i=0;i<this->M;i++){
-		_printLine_(i << " " << this->values[i]);
-	}
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::Id{{{*/
-int    DoubleVecExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::MyRank{{{*/
-int    DoubleVecExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::ObjectEnum{{{*/
-int DoubleVecExternalResult::ObjectEnum(void){
-
-	return DoubleVecExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::copy{{{*/
-Object* DoubleVecExternalResult::copy() {
-	
-	return new DoubleVecExternalResult(this->id,this->enum_type,this->values,this->M,this->step,this->time);
-
-}
-/*}}}*/
-
-/*DoubleVecExternalResult management: */
-/*FUNCTION DoubleVecExternalResult::WriteData{{{*/
-void   DoubleVecExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	int     size;
-	char   *name    = NULL;
-	extern  int my_rank;
-	IssmPDouble *passiveDouble_p=NULL;
-	IssmPDouble passiveDouble;
-
-	/*return if now on cpu 0: */
-	if(my_rank)return;
-
-	passiveDouble_p=xNew<IssmPDouble>(M);
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-        passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a IssmDouble, type is 1, size is 1: */
-	type=1;
-	size=this->M;
-	fwrite(&type,sizeof(int),1,fid);
-	fwrite(&size,sizeof(int),1,fid);
-        for (int i=0; i<M; ++i) passiveDouble_p[i]=reCast<IssmPDouble>(values[i]);
-	fwrite(passiveDouble_p,size*sizeof(IssmPDouble),1,fid);
-        xDelete(passiveDouble_p);
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::GetResultName{{{*/
-void DoubleVecExternalResult::GetResultName(char** pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION DoubleVecExternalResult::GetStep{{{*/
-int DoubleVecExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/DoubleExternalResult.cpp	(revision 13325)
@@ -1,131 +0,0 @@
-/*!\file DoubleExternalResult.c
- * \brief: implementation of the DoubleExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*DoubleExternalResult constructors and destructor*/
-/*FUNCTION DoubleExternalResult::DoubleExternalResult(){{{*/
-DoubleExternalResult::DoubleExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::DoubleExternalResult(int enum_type,IssmDouble value){{{*/
-DoubleExternalResult::DoubleExternalResult(int in_id, int in_enum_type,IssmDouble in_value,int in_step, IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	value=in_value;
-	step=in_step;
-	time=in_time;
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::~DoubleExternalResult(){{{*/
-DoubleExternalResult::~DoubleExternalResult(){
-	return;
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION DoubleExternalResult::Echo {{{*/
-void DoubleExternalResult::Echo(void){
-	this->DeepEcho();
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::DeepEcho{{{*/
-void DoubleExternalResult::DeepEcho(void){
-
-	_printLine_("DoubleExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum:  " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   value: " << this->value);
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::Id{{{*/
-int    DoubleExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION DoubleExternalResult::MyRank{{{*/
-int    DoubleExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::ObjectEnum{{{*/
-int DoubleExternalResult::ObjectEnum(void){
-
-	return DoubleExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::copy{{{*/
-Object* DoubleExternalResult::copy() {
-	
-	return new DoubleExternalResult(this->id,this->enum_type,this->value,this->step,this->time);
-
-}
-/*}}}*/
-
-/*DoubleExternalResult management: */
-/*FUNCTION DoubleExternalResult::WriteData{{{*/
-void   DoubleExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	int     size;
-	char   *name    = NULL;
-	extern  int my_rank;
-	IssmPDouble passiveDouble;
-
-	/*return if now on cpu 0: */
-	if(my_rank)return;
-
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-	passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a IssmDouble, type is 1, size is 1: */
-	type=1;
-	size=1;
-	fwrite(&type,sizeof(int),1,fid);
-	fwrite(&size,sizeof(int),1,fid);
-        passiveDouble=reCast<IssmPDouble>(this->value);
-	fwrite(&passiveDouble,size*sizeof(IssmPDouble),1,fid);
-
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::GetResultName{{{*/
-void DoubleExternalResult::GetResultName(char** pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION DoubleExternalResult::GetStep{{{*/
-int DoubleExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/IntExternalResult.cpp	(revision 13325)
@@ -1,132 +0,0 @@
-/*!\file IntExternalResult.c
- * \brief: implementation of the IntExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*IntExternalResult constructors and destructor*/
-/*FUNCTION IntExternalResult::IntExternalResult(){{{*/
-IntExternalResult::IntExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::IntExternalResult(int in_id, int in_enum_type,int in_value,int in_step, IssmDouble in_time){{{*/
-IntExternalResult::IntExternalResult(int in_id, int in_enum_type,int in_value,int in_step, IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	value=in_value;
-	step=in_step;
-	time=in_time;
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::~IntExternalResult(){{{*/
-IntExternalResult::~IntExternalResult(){
-	return;
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION IntExternalResult::Echo {{{*/
-void IntExternalResult::Echo(void){
-	this->DeepEcho();
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::DeepEcho{{{*/
-void IntExternalResult::DeepEcho(void){
-
-	_printLine_("IntExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum:  " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   value: " << this->value);
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::Id{{{*/
-int    IntExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION IntExternalResult::MyRank{{{*/
-int    IntExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::ObjectEnum{{{*/
-int IntExternalResult::ObjectEnum(void){
-
-	return IntExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::copy{{{*/
-Object* IntExternalResult::copy() {
-	
-	return new IntExternalResult(this->id,this->enum_type,this->value,this->step,this->time);
-
-}
-/*}}}*/
-
-/*IntExternalResult management: */
-/*FUNCTION IntExternalResult::WriteData{{{*/
-void   IntExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	int     size;
-	char   *name    = NULL;
-	IssmPDouble  passiveDouble;
-	extern  int my_rank;
-
-	/*return if now on cpu 0: */
-	if(my_rank)return;
-
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-        passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a IssmPDouble, type is 1, size is 1: */
-	type=1;
-	size=1;
-	fwrite(&type,sizeof(int),1,fid);
-	fwrite(&size,sizeof(int),1,fid);
-        /*cast to a IssmPDouble: */
-        passiveDouble=reCast<IssmPDouble>(value);
-	fwrite(&passiveDouble,size*sizeof(IssmPDouble),1,fid);
-
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::GetResultName{{{*/
-void IntExternalResult::GetResultName(char** pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION IntExternalResult::GetStep{{{*/
-int IntExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/BoolExternalResult.cpp	(revision 13325)
@@ -1,132 +0,0 @@
-/*!\file BoolExternalResult.c
- * \brief: implementation of the BoolExternalResult object
- */
-
-/*header files: */
-/*{{{*/
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "../objects.h"
-#include "../../../EnumDefinitions/EnumDefinitions.h"
-#include "../../../shared/shared.h"
-#include "../../../Container/Container.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-/*BoolExternalResult constructors and destructor*/
-/*FUNCTION BoolExternalResult::BoolExternalResult(){{{*/
-BoolExternalResult::BoolExternalResult(){
-	return;
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::BoolExternalResult(int enum_type,bool value){{{*/
-BoolExternalResult::BoolExternalResult(int in_id, int in_enum_type,bool in_value,int in_step, IssmDouble in_time){
-
-	id=in_id;
-	enum_type=in_enum_type;
-	value=in_value;
-	step=in_step;
-	time=in_time;
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::~BoolExternalResult(){{{*/
-BoolExternalResult::~BoolExternalResult(){
-	return;
-}
-/*}}}*/
-
-/*Object virtual functions definitions:*/
-/*FUNCTION BoolExternalResult::Echo {{{*/
-void BoolExternalResult::Echo(void){
-	this->DeepEcho();
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::DeepEcho{{{*/
-void BoolExternalResult::DeepEcho(void){
-
-	_printLine_("BoolExternalResult:");
-	_printLine_("   id: " << this->id);
-	_printLine_("   enum:  " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
-	_printLine_("   value: " <<(this->value?"true":"false"));
-	_printLine_("   step: " << this->step);
-	_printLine_("   time: " << this->time);
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::Id{{{*/
-int    BoolExternalResult::Id(void){ return -1; }
-/*}}}*/
-/*FUNCTION BoolExternalResult::MyRank{{{*/
-int    BoolExternalResult::MyRank(void){ 
-	extern int my_rank;
-	return my_rank; 
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::ObjectEnum{{{*/
-int BoolExternalResult::ObjectEnum(void){
-
-	return BoolExternalResultEnum;
-
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::copy{{{*/
-Object* BoolExternalResult::copy() {
-	
-	return new BoolExternalResult(this->id,this->enum_type,this->value,this->step,this->time);
-
-}
-/*}}}*/
-
-/*BoolExternalResult management: */
-/*FUNCTION BoolExternalResult::WriteData{{{*/
-void   BoolExternalResult::WriteData(FILE* fid,bool io_gather){
-
-	int     length;
-	int     type;
-	int     size;
-	IssmPDouble  passiveDouble;
-	extern  int my_rank;
-	char*   name = NULL;
-
-	/*return if now on cpu 0: */
-	if(my_rank)return;
-
-	/*First write enum: */
-	EnumToStringx(&name,this->enum_type);
-	length=(strlen(name)+1)*sizeof(char);
-	fwrite(&length,sizeof(int),1,fid);
-	fwrite(name,length,1,fid);
-	xDelete<char>(name);
-
-	/*Now write time and step: */
-	passiveDouble=reCast<IssmPDouble>(time);
-	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
-	fwrite(&step,sizeof(int),1,fid);
-
-	/*writing a IssmDouble, type is 1, size is 1: */
-	type=1;
-	size=1;
-	fwrite(&type,sizeof(int),1,fid);
-	fwrite(&size,sizeof(int),1,fid);
-        /*Now write bool, after casting it: */
-        passiveDouble=reCast<IssmPDouble>(this->value);
-        fwrite(&passiveDouble,size*sizeof(IssmPDouble),1,fid);
-
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::GetResultName{{{*/
-void BoolExternalResult::GetResultName(char** pname){
-	EnumToStringx(pname,this->enum_type);
-}
-/*}}}*/
-/*FUNCTION BoolExternalResult::GetStep{{{*/
-int BoolExternalResult::GetStep(void){
-
-	return this->step;
-}
-/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.h	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/StringExternalResult.h	(revision 13325)
@@ -1,55 +0,0 @@
-/*! \file StringExternalResult.h 
- *  \brief: header file for triavertexinput object
- */
-
-
-#ifndef _STRINGEXTERNALRESULT_H_
-#define _STRINGEXTERNALRESULT_H_
-
-/*Headers:*/
-/*{{{*/
-
-#ifdef HAVE_CONFIG_H
-	#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "./ExternalResult.h"
-#include "../../../include/include.h"
-#include "../../../shared/shared.h"
-#include "../../../include/include.h"
-#include "../../../include/include.h"
-/*}}}*/
-
-class StringExternalResult: public ExternalResult{
-
-	private: 
-		int    id;
-		int    enum_type;
-		char*  value;
-		int    step;
-		IssmDouble time;
-
-	public:
-		/*StringExternalResult constructors, destructors: {{{*/
-		StringExternalResult();
-		StringExternalResult(int id,int enum_type,char* value,int step, IssmDouble time);
-		~StringExternalResult();
-		/*}}}*/
-		/*Object virtual functions definitions:{{{ */
-		void  Echo();
-		void  DeepEcho();
-		int   Id(); 
-		int   MyRank();
-		int   ObjectEnum();
-		Object* copy();
-		/*}}}*/
-		/*ExternalResult management: {{{*/
-		int   InstanceEnum(){return enum_type;}
-		void  WriteData(FILE* fid,bool io_gather);
-		void  GetResultName(char**);
-		int   GetStep(void);
-		/*}}}*/
-};
-#endif  /* _STRINGEXTERNALRESULT_H */
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/GenericExternalResult.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/GenericExternalResult.h	(revision 0)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/GenericExternalResult.h	(revision 13325)
@@ -0,0 +1,326 @@
+/*! \file GenericExternalResult.h 
+ *  \brief: header file for generic external result object
+ */
+
+#ifndef _GENERIC_EXTERNAL_RESULT_
+#define _GENERIC_EXTERNAL_RESULT_
+
+/*Headers:{{{*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include <cstring>
+
+#include "../../../include/include.h"
+#include "../../../shared/Exceptions/exceptions.h"
+#include "../../../shared/Numerics/recast.h"
+#include "../../../io/io.h"
+#include "../../../EnumDefinitions/EnumDefinitions.h"
+#include "./ExternalResult.h"
+/*}}}*/
+
+template <class ResultType> 
+class GenericExternalResult: public ExternalResult {
+
+	private: 
+		int id;
+		int enum_type;
+		ResultType value;
+		int M;
+		int N;
+		int step;
+		IssmDouble time;
+	
+	public:
+		/*Diverse: must be in front, as it is used in what follows*/
+		void GenericEcho(void){/*{{{*/
+			_printLine_("   id: " << this->id);
+			_printLine_("   enum:  " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
+			_printLine_("   step: " << this->step);
+			_printLine_("   time: " << this->time);
+		}
+		/*}}}*/
+		void GenericWriteData(FILE* fid){/*{{{*/ 
+
+			int     length;
+			IssmPDouble  passiveDouble;
+			char*   name = NULL;
+
+			/*First write enum: */
+			EnumToStringx(&name,this->enum_type);
+			length=(strlen(name)+1)*sizeof(char);
+			fwrite(&length,sizeof(int),1,fid);
+			fwrite(name,length,1,fid);
+			xDelete<char>(name);
+
+			/*Now write time and step: */
+			passiveDouble=reCast<IssmPDouble>(time);
+			fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
+			fwrite(&step,sizeof(int),1,fid);
+		} /*}}}*/
+
+		/*GenericExternalResult constructors and  destructors*/
+		GenericExternalResult(){ /*{{{*/
+			id  = 0;
+			enum_type = NoneEnum;
+			M=0;
+			N=0;
+			step=0;
+			time=0;
+		} /*}}}*/
+		GenericExternalResult(int in_id, int in_enum_type,ResultType in_values, int in_M,int in_N,int in_step,IssmDouble in_time){/*{{{*/
+			_error_("template GenericExternalResult(int in_id, int in_enum_type,double* in_values, int in_M,int in_N,int in_step,IssmDouble in_time) not implemented for this ResultType\n");
+		}
+/*}}}*/
+		GenericExternalResult(int in_id, int in_enum_type,ResultType in_value,int in_step, IssmDouble in_time){ /*{{{*/
+			id=in_id;
+			enum_type=in_enum_type;
+			value=in_value;
+			step=in_step;
+			time=in_time;
+		}
+		/*}}}*/
+		~GenericExternalResult(){ /*{{{*/
+		} /*}}}*/
+
+		/*Object virtual functions definitions:*/
+		void Echo(void){ /*{{{*/
+			this->DeepEcho();
+		}
+		/*}}}*/
+		void DeepEcho(void){ /*{{{*/
+			_error_("template DeepEcho not implemented for this ResultType\n");
+		}
+		/*}}}*/
+		int Id(void){ /*{{{*/ 
+			return -1; 
+		} /*}}}*/
+		int MyRank(void){ /*{{{*/
+			extern int my_rank;
+			return my_rank; 
+		} /*}}}*/
+		int ObjectEnum(void){ /*{{{*/
+			_error_("template ObjectEnum not implemented for this ResultType\n");
+		} /*}}}*/
+		Object* copy(void) { /*{{{*/
+			return new GenericExternalResult<ResultType>(this->id,this->enum_type,this->value,this->step,this->time);
+		} /*}}}*/
+
+		/*GenericExternalResult management: */
+void WriteData(FILE* fid,bool io_gather){ /*{{{*/
+			
+	extern  int my_rank;
+	int     type;
+	int     size;
+	IssmPDouble  passiveDouble;
+	
+	/*return if now on cpu 0: */
+	if(my_rank)return;
+
+	/*use generic part, same for all ResultTypes: */
+	this->GenericWriteData(fid);
+
+	/*writing a IssmPDouble for Matlab or Python to post-process, type is 1, size is 1: */
+	type=1;
+	size=1;
+	fwrite(&type,sizeof(int),1,fid);
+	fwrite(&size,sizeof(int),1,fid);
+
+	/*cast to a IssmPDouble: */
+	passiveDouble=reCast<IssmPDouble>(value);
+	fwrite(&passiveDouble,size*sizeof(IssmPDouble),1,fid);
+
+} /*}}}*/
+void GetResultName(char** pname){ /*{{{*/
+	EnumToStringx(pname,this->enum_type);
+} /*}}}*/
+int GetStep(void){ /*{{{*/
+	return this->step;
+} /*}}}*/
+int InstanceEnum(void){ /*{{{*/
+	return this->enum_type;
+} /*}}}*/
+};
+
+/*Specific instantiations for bool: */
+template <> inline void GenericExternalResult<bool>::DeepEcho(void){ /*{{{*/
+
+	_printLine_("GenericExternalResult<bool>:");
+	this->GenericEcho();
+	_printLine_("   value: " <<(this->value?"true":"false"));
+
+} /*}}}*/
+template <> inline int GenericExternalResult<bool>::ObjectEnum(void){ /*{{{*/
+	return BoolExternalResultEnum;
+} /*}}}*/
+
+/*Specific instantiations for int: */
+template <> inline void GenericExternalResult<int>::DeepEcho(void){ /*{{{*/
+
+	_printLine_("GenericExternalResult<int>:");
+	this->GenericEcho();
+	_printLine_("   value: " << this->value);
+
+} /*}}}*/
+template <> inline int GenericExternalResult<int>::ObjectEnum(void){ /*{{{*/
+	return IntExternalResultEnum;
+} /*}}}*/
+
+/*Specific instantiations for double: */
+template <> inline void GenericExternalResult<double>::DeepEcho(void){ /*{{{*/
+
+	_printLine_("GenericExternalResult<double>:");
+	this->GenericEcho();
+	_printLine_("   value: " << this->value);
+
+} /*}}}*/
+template <> inline int GenericExternalResult<double>::ObjectEnum(void){ /*{{{*/
+	return DoubleExternalResultEnum;
+} /*}}}*/
+
+/*Specific instantiations for char*: */
+template <> inline GenericExternalResult<char*>::GenericExternalResult(int in_id, int in_enum_type,char* in_value,int in_step, IssmDouble in_time){ /*{{{*/
+
+	id=in_id;
+	enum_type=in_enum_type;
+	value=xNew<char>(strlen(in_value)+1);
+	xMemCpy<char>(value,in_value,(strlen(in_value)+1));
+	step=in_step;
+	time=in_time;
+
+} /*}}}*/
+template <> inline GenericExternalResult<char*>::~GenericExternalResult(){ /*{{{*/
+	xDelete<char>(value);
+} /*}}}*/
+template <> inline void GenericExternalResult<char*>::DeepEcho(void){ /*{{{*/
+
+	_printLine_("GenericExternalResult<char*>:");
+	this->GenericEcho();
+	_printLine_("   value: " << this->value);
+
+} /*}}}*/
+template <> inline void GenericExternalResult<char*>::WriteData(FILE* fid,bool io_gather){ /*{{{*/
+
+	extern  int my_rank;
+	int     type;
+	int     length;
+
+	/*return if now on cpu 0: */
+	if(my_rank)return;
+
+	/*use generic part, same for all ResultTypes: */
+	this->GenericWriteData(fid);
+
+	/*writing a string, type is 2: */
+	type=2;
+	fwrite(&type,sizeof(int),1,fid);
+
+	length=(strlen(this->value)+1)*sizeof(char);
+	fwrite(&length,sizeof(int),1,fid);
+	fwrite(this->value,length,1,fid);
+}
+/*}}}*/
+template <> inline int GenericExternalResult<char*>::ObjectEnum(void){ /*{{{*/
+	return StringExternalResultEnum;
+} /*}}}*/
+
+/*Specific instantiations for IssmPDouble*: */
+template <> inline GenericExternalResult<IssmPDouble*>::GenericExternalResult(int in_id, int in_enum_type,IssmPDouble* in_values, int in_M,int in_N,int in_step,IssmDouble in_time){/*{{{*/
+
+	id=in_id;
+	enum_type=in_enum_type;
+	M=in_M;
+	N=in_N;
+	
+	step=in_step;
+	time=in_time;
+
+	/*Copy result in values*/
+	if(M*N){
+		value=xNew<IssmPDouble>(M*N);
+		xMemCpy<IssmPDouble>(value,in_values,M*N);
+	}
+	else value=NULL;
+}
+/*}}}*/
+template <> inline GenericExternalResult<IssmPDouble*>::GenericExternalResult(int in_id, int in_enum_type,IssmPDouble* in_value,int in_step, IssmDouble in_time){ /*{{{*/
+	_error_("you cannot initialize a GenericExternalResult<IssmPDouble*> without providing the dimensions of the matrix! Please use a more appropriate constructor!");
+} /*}}}*/
+template <> inline GenericExternalResult<IssmPDouble*>::~GenericExternalResult(){ /*{{{*/
+	xDelete<IssmPDouble>(value);
+} /*}}}*/
+template <> inline void GenericExternalResult<IssmPDouble*>::Echo(void){ /*{{{*/
+	
+	int i,j;
+
+	_printLine_("GenericExternalResult<IssmPDouble*>:");
+	this->GenericEcho();
+	_printLine_("   matrix size: " << this->M << "-" << this->N);
+
+} /*}}}*/
+template <> inline void GenericExternalResult<IssmPDouble*>::DeepEcho(void){ /*{{{*/
+	
+	int i,j;
+
+	_printLine_("GenericExternalResult<IssmPDouble*>:");
+	this->GenericEcho();
+	
+	_printLine_("   matrix size: " << this->M << "-" << this->N);
+	for (i=0;i<this->M;i++){  
+		_printString_("   [ ");
+		for (j=0;j<this->N;j++){
+			_printString_( " " << setw(11) << setprecision (5) << this->value[i*this->N+j]);
+		}  
+		_printLine_(" ]");
+	}  
+
+} /*}}}*/
+template <> inline Object* GenericExternalResult<IssmPDouble*>::copy(void){ /*{{{*/
+	return new GenericExternalResult<IssmPDouble*>(this->id,this->enum_type,this->value,this->M,this->N,this->step,this->time);
+} /*}}}*/
+template <> inline void GenericExternalResult<IssmPDouble*>::WriteData(FILE* fid,bool io_gather){ /*{{{*/
+	
+	extern  int my_rank;
+	int     length;
+	int     type;
+	int     rows,cols;
+	char   *name    = NULL;
+	extern  int my_rank;
+	IssmPDouble passiveDouble;
+
+	if(io_gather){
+		/*we are gathering the data on cpu 0, don't write on other cpus: */
+		if(my_rank) return;
+	}
+
+	/*First write enum: */
+	EnumToStringx(&name,this->enum_type);
+	length=(strlen(name)+1)*sizeof(char);
+	fwrite(&length,sizeof(int),1,fid);
+	fwrite(name,length,1,fid);
+	xDelete<char>(name);
+
+	/*Now write time and step: */
+	passiveDouble=reCast<IssmPDouble>(time);
+	fwrite(&passiveDouble,sizeof(IssmPDouble),1,fid);
+	fwrite(&step,sizeof(int),1,fid);
+
+	/*writing a IssmDouble array, type is 3:*/
+	type=3;
+	fwrite(&type,sizeof(int),1,fid);
+	rows=this->M;
+	fwrite(&rows,sizeof(int),1,fid);
+	cols=this->N;
+	fwrite(&cols,sizeof(int),1,fid);
+	fwrite(value,cols*rows*sizeof(IssmPDouble),1,fid);
+
+}
+/*}}}*/
+template <> inline int GenericExternalResult<IssmPDouble*>::ObjectEnum(void){ /*{{{*/
+	return DoubleMatExternalResultEnum;
+} /*}}}*/
+
+#endif  /* _EXTERNAL_RESULTOBJECT_H */

Property changes on: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/classes/objects/ExternalResults/GenericExternalResult.h
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_nonlinear.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_nonlinear.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_nonlinear.cpp	(revision 13325)
@@ -88,7 +88,7 @@
 			bool max_iteration_state=false;
 			int tempStep=1;
 			IssmDouble tempTime=1.0;
-			femmodel->results->AddObject(new BoolExternalResult(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
+			femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
 			break;
 		}
 		if(count>=max_nonlinear_iterations){
@@ -99,7 +99,7 @@
 			bool max_iteration_state=true;
 			int tempStep=1;
 			IssmDouble tempTime=1.0;
-			femmodel->results->AddObject(new BoolExternalResult(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
+			femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
 			break;
 		}
 	}
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_newton.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_newton.cpp	(revision 13324)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/solvers/solver_newton.cpp	(revision 13325)
@@ -70,7 +70,7 @@
 			bool max_iteration_state=false;
 			int tempStep=1;
 			IssmDouble tempTime=1.0;
-			femmodel->results->AddObject(new BoolExternalResult(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
+			femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
 			break;
 		}
 		if(count>=max_nonlinear_iterations){
@@ -78,7 +78,7 @@
 			bool max_iteration_state=true;
 			int tempStep=1;
 			IssmDouble tempTime=1.0;
-			femmodel->results->AddObject(new BoolExternalResult(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
+			femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
 			break;
 		}
 
