Index: /issm/trunk/src/c/Container/Results.cpp
===================================================================
--- /issm/trunk/src/c/Container/Results.cpp	(revision 6388)
+++ /issm/trunk/src/c/Container/Results.cpp	(revision 6389)
@@ -158,7 +158,9 @@
 	int         i;
 	FILE       *fid          = NULL;
+	bool        io_gather=true;
 
 	/*Recover file descriptor: */
 	parameters->FindParam(&fid,OutputFilePointerEnum);
+	parameters->FindParam(&io_gather,IoGatherEnum);
 
 	for(i=0;i<this->Size();i++){
@@ -167,5 +169,5 @@
 
 		/*write result to disk: */
-		result->WriteData(fid);
+		result->WriteData(fid,io_gather);
 
 	}
Index: /issm/trunk/src/c/io/pfclose.cpp
===================================================================
--- /issm/trunk/src/c/io/pfclose.cpp	(revision 6388)
+++ /issm/trunk/src/c/io/pfclose.cpp	(revision 6389)
@@ -17,6 +17,4 @@
 	/*Close file handle: */
 	extern int my_rank;
-	if(my_rank==0){
-		if(fclose(fid)!=0)ISSMERROR("%s%s","could not close file ",filename);
-	}
+	if(fclose(fid)!=0)ISSMERROR("%s%s","could not close file ",filename);
 }
Index: /issm/trunk/src/c/io/pfopen.cpp
===================================================================
--- /issm/trunk/src/c/io/pfopen.cpp	(revision 6388)
+++ /issm/trunk/src/c/io/pfopen.cpp	(revision 6389)
@@ -19,8 +19,6 @@
 	
 	/*Open handle to data on disk: */
-	if(my_rank==0){
-		fid=fopen(filename,format);
-		if(fid==NULL) ISSMERROR("%s%s%s","could not open file ",filename," for binary reading or writing"); 
-	}
+	fid=fopen(filename,format);
+	if(fid==NULL) ISSMERROR("%s%s%s","could not open file ",filename," for binary reading or writing"); 
 
 	return fid;
Index: /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 6388)
+++ /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 6389)
@@ -58,5 +58,4 @@
 		/*What strategy? : */
 		parameters->FindParam(&io_gather,IoGatherEnum);
-		
 
 		if(io_gather){
@@ -76,4 +75,5 @@
 	#endif
 
+
 	/*Write results to disk (in parallel), or to memory (in serial mode): */
 	#ifdef _SERIAL_
@@ -83,5 +83,4 @@
 	#endif
 
-
 	/*Delete and reinitialize results, in parallel: */
 	#ifdef _PARALLEL_
@@ -89,4 +88,12 @@
 	#endif
 
+	/*Close output file? :*/
+	if((step==1) && (time==0)){
+		if(io_gather){
+			if(my_rank==0) pfclose(fid,outputfilename);
+		}
+		else pfclose(fid,cpu_outputfilename);
+	}
+
 	/*Assign output pointers:*/
 	*presults=results;
Index: /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.cpp	(revision 6389)
@@ -143,5 +143,5 @@
 /*BoolExternalResult management: */
 /*FUNCTION BoolExternalResult::WriteData{{{1*/
-void   BoolExternalResult::WriteData(FILE* fid){
+void   BoolExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/BoolExternalResult.h	(revision 6389)
@@ -55,5 +55,5 @@
 		/*ExternalResult management: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 	    #ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.cpp	(revision 6389)
@@ -143,5 +143,5 @@
 /*DoubleExternalResult management: */
 /*FUNCTION DoubleExternalResult::WriteData{{{1*/
-void   DoubleExternalResult::WriteData(FILE* fid){
+void   DoubleExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleExternalResult.h	(revision 6389)
@@ -56,5 +56,5 @@
 		/*ExternalResult management: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.cpp	(revision 6389)
@@ -180,5 +180,5 @@
 /*DoubleMatExternalResult management: */
 /*FUNCTION DoubleMatExternalResult::WriteData{{{1*/
-void   DoubleMatExternalResult::WriteData(FILE* fid){
+void   DoubleMatExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
@@ -188,6 +188,8 @@
 	extern  int my_rank;
 
-	/*return if now on cpu 0: */
-	if(my_rank) return;
+	if(io_gather){
+		/*we are gathering the data on cpu 0, don't write on other cpus: */
+		if(my_rank) return;
+	}
 
 	/*First write enum: */
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleMatExternalResult.h	(revision 6389)
@@ -57,5 +57,5 @@
 		/*ExternalResult managemnet: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 6389)
@@ -168,5 +168,5 @@
 /*DoubleVecExternalResult management: */
 /*FUNCTION DoubleVecExternalResult::WriteData{{{1*/
-void   DoubleVecExternalResult::WriteData(FILE* fid){
+void   DoubleVecExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.h	(revision 6389)
@@ -56,5 +56,5 @@
 		/*ExternalResult management: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/ExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/ExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/ExternalResult.h	(revision 6389)
@@ -31,5 +31,5 @@
 		/*Virtual functions:{{{1*/
 		virtual int   EnumType()=0;
-		virtual void  WriteData(FILE* fid)=0;
+		virtual void  WriteData(FILE* fid,bool io_gather)=0;
 		virtual char* GetResultName(void)=0;
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.cpp	(revision 6389)
@@ -143,5 +143,5 @@
 /*IntExternalResult management: */
 /*FUNCTION IntExternalResult::WriteData{{{1*/
-void   IntExternalResult::WriteData(FILE* fid){
+void   IntExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h	(revision 6389)
@@ -54,5 +54,5 @@
 		/*ExternalResult managemnet: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.cpp	(revision 6389)
@@ -199,5 +199,5 @@
 /*PetscVecExternalResult management: */
 /*FUNCTION PetscVecExternalResult::WriteData{{{1*/
-void   PetscVecExternalResult::WriteData(FILE* fid){
+void   PetscVecExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/PetscVecExternalResult.h	(revision 6389)
@@ -56,5 +56,5 @@
 		/*ExternalResult management: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.cpp	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.cpp	(revision 6389)
@@ -158,5 +158,5 @@
 /*StringExternalResult management: */
 /*FUNCTION StringExternalResult::WriteData{{{1*/
-void   StringExternalResult::WriteData(FILE* fid){
+void   StringExternalResult::WriteData(FILE* fid,bool io_gather){
 
 	int     length;
Index: /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.h	(revision 6388)
+++ /issm/trunk/src/c/objects/ExternalResults/StringExternalResult.h	(revision 6389)
@@ -56,5 +56,5 @@
 		/*ExternalResult management: {{{1*/
 		int   EnumType(){return enum_type;}
-		void  WriteData(FILE* fid);
+		void  WriteData(FILE* fid,bool io_gather);
 		char* GetResultName(void);
 		#ifdef _SERIAL_
Index: /issm/trunk/src/c/solutions/issm.cpp
===================================================================
--- /issm/trunk/src/c/solutions/issm.cpp	(revision 6388)
+++ /issm/trunk/src/c/solutions/issm.cpp	(revision 6389)
@@ -100,5 +100,4 @@
 
 	/*Close output file and write lock file if requested*/
-	femmodel->parameters->FindParam(&output_fid,OutputFilePointerEnum); pfclose(output_fid,argv[5]);
 	if (waitonlock>0){
 		_printf_("write lock file:\n");
Index: /issm/trunk/src/m/classes/clusters/astrid.m
===================================================================
--- /issm/trunk/src/m/classes/clusters/astrid.m	(revision 6388)
+++ /issm/trunk/src/m/classes/clusters/astrid.m	(revision 6389)
@@ -71,12 +71,17 @@
 			 fprintf(fid,'#!/bin/sh\n');
 			 if mem_debug==0,
-				 fprintf(fid,'mpirun -np %i %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog & ',cluster.np,cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
+				 fprintf(fid,'mpirun -np %i %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog ',cluster.np,cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
 			 else
-				 %fprintf(fid,'LD_PRELOAD=%s mpirun -np %i %s --leak-check=full --gen-suppressions=all --suppressions=%s %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog & ',cluster.valgrindlib,cluster.np,cluster.valgrind,cluster.valgrindsup,cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
-				 fprintf(fid,'LD_PRELOAD=%s mpirun -np %i %s --leak-check=full --suppressions=%s %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog & ',cluster.valgrindlib,cluster.np,cluster.valgrind,cluster.valgrindsup, cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
+				 %fprintf(fid,'LD_PRELOAD=%s mpirun -np %i %s --leak-check=full --gen-suppressions=all --suppressions=%s %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog ',cluster.valgrindlib,cluster.np,cluster.valgrind,cluster.valgrindsup,cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
+				 fprintf(fid,'LD_PRELOAD=%s mpirun -np %i %s --leak-check=full --suppressions=%s %s/issm.exe %s %s %s.bin %s.petsc %s.outbin %s.lock  2> %s.errlog >%s.outlog ',cluster.valgrindlib,cluster.np,cluster.valgrind,cluster.valgrindsup, cluster.codepath,EnumToString(analysis_type),cluster.executionpath,modelname,modelname,modelname,modelname,modelname,modelname);
 			 end
 
 			 if md.gprof,
 				 fprintf(fid,'\n gprof %s/issm.exe gmon.out > %s.performance',cluster.codepath,modelname);
+			 end
+
+			 if ~md.io_gather,
+				 %concatenate the output files:
+				 fprintf(fid,'\ncat %s.outbin.* > %s.outbin',modelname,modelname);
 			 end
 
Index: /issm/trunk/src/m/model/parseresultsfromdisk.m
===================================================================
--- /issm/trunk/src/m/model/parseresultsfromdisk.m	(revision 6388)
+++ /issm/trunk/src/m/model/parseresultsfromdisk.m	(revision 6389)
@@ -21,5 +21,9 @@
 
 	%Add result
-	results(result.step).(result.fieldname)=result.field;
+	if (length(results)>=result.step & isfield(results,result.fieldname)),
+		results(result.step).(result.fieldname)=[ results(result.step).(result.fieldname); result.field];
+	else
+		results(result.step).(result.fieldname)=result.field;
+	end
 
 	%read next result
