Index: /issm/trunk/src/c/Container/Elements.cpp
===================================================================
--- /issm/trunk/src/c/Container/Elements.cpp	(revision 9873)
+++ /issm/trunk/src/c/Container/Elements.cpp	(revision 9874)
@@ -171,26 +171,66 @@
 void Elements::ToResults(Results* results,Parameters* parameters,int step, double time){
 
-	Patch* patch=NULL;
+	Patch  *patch        = NULL;
+	int    *resultsenums = NULL;
+	double *vector_serial= NULL;
+	Vec     vector       = NULL;
 	bool   io_gather;
+	bool   results_on_vertices;
+	int    numberofvertices;
+	int    numberofresults;
 
 	/*Recover parameters: */
 	parameters->FindParam(&io_gather,SettingsIoGatherEnum);
-
-	/*create patch object out of all results in this dataset: */
-	patch=this->ResultsToPatch();
-
-	/*Gather onto master cpu 0, if needed: */
+	parameters->FindParam(&results_on_vertices,SettingsResultsOnVerticesEnum);
+	parameters->FindParam(&numberofvertices,MeshNumberofverticesEnum);
+
+	if(results_on_vertices){
+		/*No patch here, we prepare vectors*/
+
+		/*OK, see what the first element of this partition has in stock (this is common to all partitions)*/
+		Element* element=(Element*)this->GetObjectByOffset(0);
+		element->ListResultsEnums(&resultsenums,&numberofresults);
+
+		/*Loop over all results and get nodal vector*/
+		for(int i=0;i<numberofresults;i++){
+
+			/*Get vector for result number i*/
+			vector=NewVec(numberofvertices);
+			for(int j=0;j<this->Size();j++){
+				Element* element=(Element*)this->GetObjectByOffset(j);
+				element->GetVectorFromResults(vector,resultsenums[i]);
+			}
+			VecAssemblyBegin(vector);
+			VecAssemblyEnd(vector);
+
+			/*Serialize and add to results*/
+			VecToMPISerial(&vector_serial,vector);
+			results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,numberofvertices,step,time));
+
+			/*clean up*/
+			VecFree(&vector);
+			xfree((void**)&vector_serial);
+		}
+
+	}
+	else{
+		/*create patch object out of all results in this dataset: */
+		patch=this->ResultsToPatch();
+
+		/*Gather onto master cpu 0, if needed: */
 #ifdef _PARALLEL_
-	if(io_gather)patch->Gather();
+		if(io_gather)patch->Gather();
 #endif
 
-	/*create result object and add to results dataset:*/
-	if (patch->maxvertices && patch->maxnodes){
-		results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,step,time));
-		results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,step,time));
-		results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,patch->values,patch->numrows,patch->numcols,step,time));
+		/*create result object and add to results dataset:*/
+		if (patch->maxvertices && patch->maxnodes){
+			results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,step,time));
+			results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,step,time));
+			results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,patch->values,patch->numrows,patch->numcols,step,time));
+		}
 	}
 
 	/*Free ressources:*/
+	xfree((void**)&resultsenums);
 	delete patch;
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 9873)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 9874)
@@ -69,5 +69,7 @@
 	parameters->AddObject(iomodel->CopyConstantObject(SettingsWaitonlockEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofelementsEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofverticesEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(SettingsIoGatherEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(SettingsResultsOnVerticesEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(TransientIsdiagnosticEnum));
Index: /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 9873)
+++ /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 9874)
@@ -18,5 +18,5 @@
 #ifdef _SERIAL_
 void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
-#else                                                                                                                                                                                             
+#else 
 void OutputResultsx(                    Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
 #endif
Index: /issm/trunk/src/c/objects/ElementResults/ElementResult.h
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/ElementResult.h	(revision 9873)
+++ /issm/trunk/src/c/objects/ElementResults/ElementResult.h	(revision 9874)
@@ -22,4 +22,5 @@
 		virtual int     NumberOfNodalValues(void)=0;
 		virtual void    PatchFill(int row, Patch* patch)=0;
+		virtual int     EnumType()=0;
 
 };
Index: /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 9873)
+++ /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 9874)
@@ -194,2 +194,9 @@
 }
 /*}}}*/
+/*FUNCTION PentaVertexElementResult::GetVectorFromResults{{{1*/
+void PentaVertexElementResult::GetVectorFromResults(Vec vector,int* doflist){
+
+	const int numvertices=6;
+	VecSetValues(vector,numvertices,doflist,(const double*)this->values,INSERT_VALUES);
+
+} /*}}}*/
Index: /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.h
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.h	(revision 9873)
+++ /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.h	(revision 9874)
@@ -50,4 +50,5 @@
 		/*PentaVertexElementResult management: {{{1*/
 		int   EnumType();
+		void GetVectorFromResults(Vec vector,int* doflist);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 9873)
+++ /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 9874)
@@ -183,2 +183,9 @@
 }
 /*}}}*/
+/*FUNCTION TriaVertexElementResult::GetVectorFromResults{{{1*/
+void TriaVertexElementResult::GetVectorFromResults(Vec vector,int* doflist){
+
+	const int numvertices=3;
+	VecSetValues(vector,numvertices,doflist,(const double*)this->values,INSERT_VALUES);
+
+} /*}}}*/
Index: /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.h
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.h	(revision 9873)
+++ /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.h	(revision 9874)
@@ -49,4 +49,5 @@
 		/*TriaVertexElementResult management: {{{1*/
 		int   EnumType();
+		void GetVectorFromResults(Vec vector,int* doflist);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 9873)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 9874)
@@ -47,4 +47,5 @@
 		virtual void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes)=0;
 		virtual void   PatchFill(int* pcount, Patch* patch)=0;
+		virtual void   ListResultsEnums(int** results_enums,int* num_results)=0;
 		virtual void   DeleteResults(void)=0;
 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
@@ -57,5 +58,6 @@
 		
 		virtual void   InputScale(int enum_type,double scale_factor)=0;
-		virtual void   GetVectorFromInputs(Vec vector,int NameEnum)=0;
+		virtual void   GetVectorFromInputs(Vec vector, int name_enum)=0;
+		virtual void   GetVectorFromResults(Vec vector,int name_enum)=0;
 		virtual void   InputArtificialNoise(int enum_type,double min,double max)=0;
 		virtual bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums)=0;
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 9873)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 9874)
@@ -1126,4 +1126,25 @@
 }
 /*}}}*/
+/*FUNCTION Penta::GetVectorFromResults{{{1*/
+void  Penta::GetVectorFromResults(Vec vector,int result_enum){
+
+	bool found=false;
+	int doflist1[NUMVERTICES];
+
+	/*Prepare index list*/
+	this->GetSidList(&doflist1[0]);
+
+	/*Get result)*/
+	for(int i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		if(elementresult->EnumType()!=result_enum) continue;
+		if(elementresult->Enum()    !=PentaVertexElementResultEnum) _error_("Result %s found but is not of class PentaVertexElementResultEnum");
+
+		found=true;
+		PentaVertexElementResult* result=(PentaVertexElementResult*)elementresult;
+		result->GetVectorFromResults(vector,&doflist1[0]);
+	}
+}
+/*}}}*/
 /*FUNCTION Penta::GetZcoord {{{1*/
 double Penta::GetZcoord(GaussPenta* gauss){
@@ -2001,4 +2022,35 @@
 }
 /*}}}*/
+/*FUNCTION Penta::ListResultsEnums{{{*/
+void Penta::ListResultsEnums(int** in_results_enums,int* in_num_results){
+
+	/*Intermediaries*/
+	int     i;
+	int     numberofresults = 0;
+	int     *resultsenums =NULL;
+
+	/*Checks*/
+	_assert_(in_num_results);
+
+	/*Count number of results*/
+	for(i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		numberofresults++;
+	}
+
+	/*Allocate output*/
+	resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
+
+	/*populate enums*/
+	for(i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		resultsenums[i]=elementresult->EnumType();
+	}
+
+	/*Assign output pointers:*/
+	*in_num_results=numberofresults;
+	*in_results_enums=resultsenums;
+
+}/*}}}*/
 /*FUNCTION Penta::MigrateGroundingLine{{{1*/
 void  Penta::MigrateGroundingLine(void){
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 9873)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 9874)
@@ -91,4 +91,5 @@
 		double GetZcoord(GaussPenta* gauss);
 		void   GetVectorFromInputs(Vec vector,int NameEnum);
+		void   GetVectorFromResults(Vec vector,int name_enum);
 		
 		int    Sid();
@@ -107,4 +108,5 @@
 		void   ShelfSync();
 		void   RequestedOutput(int output_enum,int step,double time);
+		void   ListResultsEnums(int** results_enums,int* num_results);
 		void   MigrateGroundingLine();
 		void   PatchFill(int* pcount, Patch* patch);
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 9873)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 9874)
@@ -1305,4 +1305,25 @@
 	/*We found the enum.  Use its values to fill into the vector, using the vertices ids: */
 	input->GetVectorFromInputs(vector,&doflist1[0]);
+}
+/*}}}*/
+/*FUNCTION Tria::GetVectorFromResults{{{1*/
+void  Tria::GetVectorFromResults(Vec vector,int result_enum){
+
+	bool found=false;
+	int doflist1[NUMVERTICES];
+
+	/*Prepare index list*/
+	this->GetSidList(&doflist1[0]);
+
+	/*Get result)*/
+	for(int i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		if(elementresult->EnumType()!=result_enum) continue;
+		if(elementresult->Enum()    !=TriaVertexElementResultEnum) _error_("Result %s found but is not of class TriaVertexElementResultEnum");
+
+		found=true;
+		TriaVertexElementResult* result=(TriaVertexElementResult*)elementresult;
+		result->GetVectorFromResults(vector,&doflist1[0]);
+	}
 }
 /*}}}*/
@@ -1926,4 +1947,35 @@
 }
 /*}}}*/
+/*FUNCTION Tria::ListResultsEnums{{{*/
+void Tria::ListResultsEnums(int** in_results_enums,int* in_num_results){
+
+	/*Intermediaries*/
+	int     i;
+	int     numberofresults = 0;
+	int     *resultsenums =NULL;
+
+	/*Checks*/
+	_assert_(in_num_results);
+
+	/*Count number of results*/
+	for(i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		numberofresults++;
+	}
+
+	/*Allocate output*/
+	resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
+
+	/*populate enums*/
+	for(i=0;i<this->results->Size();i++){
+		ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
+		resultsenums[i]=elementresult->EnumType();
+	}
+
+	/*Assign output pointers:*/
+	*in_num_results=numberofresults;
+	*in_results_enums=resultsenums;
+
+}/*}}}*/
 /*FUNCTION Tria::MigrateGroundingLine{{{1*/
 void  Tria::MigrateGroundingLine(void){
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 9873)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 9874)
@@ -90,5 +90,6 @@
 		bool   IsOnWater(); 
 		void   GetSolutionFromInputs(Vec solution);
-		void   GetVectorFromInputs(Vec vector,int NameEnum);
+		void   GetVectorFromInputs(Vec vector, int name_enum);
+		void   GetVectorFromResults(Vec vector,int name_enum);
 		
 		void   InputArtificialNoise(int enum_type,double min, double max);
@@ -110,4 +111,5 @@
 		
 		void   RequestedOutput(int output_enum,int step,double time);
+		void   ListResultsEnums(int** results_enums,int* num_results);
 		void   PatchFill(int* pcount, Patch* patch);
 		void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
Index: /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 9873)
+++ /issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp	(revision 9874)
@@ -26,5 +26,5 @@
 }
 /*}}}*/
-/*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(int enum_type,IssmDoubleVec values,int M){{{1*/
+/*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(int enum_type,IssmDoubleVec values,int M,int in_step,double in_time){{{1*/
 DoubleVecExternalResult::DoubleVecExternalResult(int in_id, int in_enum_type,double* in_values, int in_M,int in_step,double in_time){
 
