Index: /issm/trunk/src/c/DataSet/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 3937)
+++ /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 3938)
@@ -436,66 +436,4 @@
 	}
 	return;
-}
-/*}}}*/
-/*FUNCTION DataSet::FindResult(Vec* presult,char* name){{{1*/
-int   DataSet::FindResult(Vec* presult,char* name){
-
-	/*Go through a dataset, and find a Result* object 
-	 *whith result name is "name" : */
-	
-	vector<Object*>::iterator object;
-	Result* result=NULL;
-
-	int found=0;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		/*Find param type objects: */
-		if((*object)->Enum()==ResultEnum){
-
-			/*Ok, this object is a result,recover it and ask which name it has: */
-			result=(Result*)(*object);
-
-			if (strcmp(result->GetFieldName(),name)==0){
-				/*Ok, this is the one! Recover the value of this result: */
-				result->GetField(presult);
-				found=1;
-				break;
-			}
-		}
-	}
-	return found;
-}
-/*}}}*/
-/*FUNCTION DataSet::FindResult(void* pvalue, char* name){{{1*/
-int   DataSet::FindResult(void* pvalue, char* name){
-
-	/*Go through a dataset, and find a Result* object 
-	 *which field name is "name" : */
-	
-	vector<Object*>::iterator object;
-	Result* result=NULL;
-
-	int found=0;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		/*Find param type objects: */
-		if((*object)->Enum()==ResultEnum){
-
-			/*Ok, this object is a result, recover it and ask which name it has: */
-			result=(Result*)(*object);
-
-			if (strcmp(result->GetFieldName(),name)==0){
-				/*Ok, this is the one! Recover the value of this result: */
-				double** field=NULL;
-				field=(double**)pvalue; //not very safe, but hey!
-				result->GetField(field);
-				found=1;
-				break;
-			}
-		}
-	}
-	return found;
 }
 /*}}}*/
Index: /issm/trunk/src/c/DataSet/DataSet.h
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.h	(revision 3937)
+++ /issm/trunk/src/c/DataSet/DataSet.h	(revision 3938)
@@ -51,5 +51,4 @@
 		int   Size();
 		
-		int   FindResult(Vec* presult,char* name);
 		Object* FindParamObject(char* name);
 		void  Ranks(int* ranks);
@@ -99,5 +98,4 @@
 		void  ComputePressure(Vec p_g,int analysis_type,int sub_analysis_type);
 		void  ComputeStrainRate(Vec eps,int analysis_type,int sub_analysis_type);
-		int   FindResult(void* pvalue, char* name);
 		void  FieldExtrude(Vec field,double* field_serial,char* field_name, int collapse);
 		void  InputToResult(Mat* psolution,int enum_type);
@@ -153,4 +151,7 @@
 
 		void ChangeEnum(int enumtype,int new_enumtype);
+		void PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);
+		void PatchFill(int* pcount, double* patches,int patch_numcols,Parameters* parameters);
+
 		/*}}}*/
 
@@ -184,4 +185,22 @@
 };
 
+/********************************************************RESULTS************************************************/
+
+class Results: public DataSet{
+
+	public:
+
+		/*constructors, destructors: {{{1*/
+		Results();
+		Results(int enum_type);
+		~Results();
+		/*}}}*/
+		/*methods: {{{1*/
+		int   FindResult(Vec* presult,char* name);
+		int   FindResult(void* pvalue, char* name);
+		/*}}}*/
+
+};
+
 
 #endif
Index: /issm/trunk/src/c/DataSet/Inputs.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/Inputs.cpp	(revision 3937)
+++ /issm/trunk/src/c/DataSet/Inputs.cpp	(revision 3938)
@@ -628,2 +628,82 @@
 }
 /*}}}*/
+/*FUNCTION Inputs::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);{{{1*/
+void Inputs::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){
+
+	int i;
+
+	vector<Object*>::iterator object;
+	Input* input=NULL;
+	bool   found=false;
+
+	int patch_numrows=0;
+	int numcols=0;
+
+	/*First, recover the counter patch_numrows: */
+	patch_numrows=*ppatch_numrows;
+
+	/*Go through all the input objects, and find the one corresponding to enum_type, if it exists: */
+	for ( object=objects.begin() ; object < objects.end(); object++ ){
+
+		input=(Input*)(*object); 
+		if (input->EnumType()==enum_type){
+			found=true;
+			break;
+		}
+	}
+
+	if (!found){
+		/*Ok, the input looked for does not exist. No problem. Just return a patch size of 0, and do 
+		 * not increment the counter: */
+		numcols=0;
+	}
+	else{
+		/*We found the input, get it to tell us the size of the patch information it returns, and increment 
+		 * the counter: */
+		patch_numrows++;
+		numcols=input->PatchSize();
+	}
+
+	/*Assign output pointers:*/
+	*ppatch_numrows=patch_numrows;
+	*pnumcols=numcols;
+
+}
+/*}}}*/
+/*FUNCTION Inputs::PatchFill(int* pcount, double* patches,int patch_numcols);{{{1*/
+void Inputs::PatchFill(int* pcount, double* patches,int patch_numcols,Parameters* parameters){
+
+	int i;
+
+	vector<Object*>::iterator object;
+	Input* input=NULL;
+	bool   found=false;
+
+	int count=0;
+
+	/*First, recover the counter patch_numrows: */
+	count=*pcount;
+
+	/*Go through all the input objects, and find the one corresponding to enum_type, if it exists: */
+	for ( object=objects.begin() ; object < objects.end(); object++ ){
+
+		input=(Input*)(*object); 
+		if (input->EnumType()==enum_type){
+			found=true;
+			break;
+		}
+	}
+
+	if (!found){
+		/*Ok, the input looked for does not exist. No problem. Just return :*/
+	}
+	else{
+		/*We found the input, get it to fill the patch, at the right position in the patches matrix: */
+		input->PatchFill(patches+patch_numcols*count,parameters);
+		count++;
+	}
+
+	/*Assign output pointers:*/
+	*pcount=count;
+}
+/*}}}*/
Index: /issm/trunk/src/c/DataSet/Results.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/Results.cpp	(revision 3938)
+++ /issm/trunk/src/c/DataSet/Results.cpp	(revision 3938)
@@ -0,0 +1,107 @@
+/*
+ * \file Results.c
+ * \brief: implementation of the Results class, derived from DataSet class
+ */
+
+/*Headers: {{{1*/
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include <vector>
+#include <functional>
+#include <algorithm>
+#include <iostream>
+
+#include "./DataSet.h"
+#include "../shared/shared.h"
+#include "../include/include.h"
+#include "../EnumDefinitions/EnumDefinitions.h"
+
+using namespace std;
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION Results::Results(){{{1*/
+Results::Results(){
+	return;
+}
+/*}}}*/
+/*FUNCTION Results::Results(int in_enum){{{1*/
+Results::Results(int in_enum): DataSet(in_enum){
+	//do nothing;
+	return;
+}
+/*}}}*/
+/*FUNCTION Results::~Results(){{{1*/
+Results::~Results(){
+	return;
+}
+/*}}}*/
+
+/*Object methods*/
+/*FUNCTION Results::FindResult(Vec* presult,char* name){{{1*/
+int   Results::FindResult(Vec* presult,char* name){
+
+	/*Go through a dataset, and find a Result* object 
+	 *whith result name is "name" : */
+	
+	vector<Object*>::iterator object;
+	Result* result=NULL;
+
+	int found=0;
+
+	for ( object=objects.begin() ; object < objects.end(); object++ ){
+
+		/*Find param type objects: */
+		if((*object)->Enum()==ResultEnum){
+
+			/*Ok, this object is a result,recover it and ask which name it has: */
+			result=(Result*)(*object);
+
+			if (strcmp(result->GetFieldName(),name)==0){
+				/*Ok, this is the one! Recover the value of this result: */
+				result->GetField(presult);
+				found=1;
+				break;
+			}
+		}
+	}
+	return found;
+}
+/*}}}*/
+/*FUNCTION Results::FindResult(void* pvalue, char* name){{{1*/
+int   Results::FindResult(void* pvalue, char* name){
+
+	/*Go through a dataset, and find a Result* object 
+	 *which field name is "name" : */
+	
+	vector<Object*>::iterator object;
+	Result* result=NULL;
+
+	int found=0;
+
+	for ( object=objects.begin() ; object < objects.end(); object++ ){
+
+		/*Find param type objects: */
+		if((*object)->Enum()==ResultEnum){
+
+			/*Ok, this object is a result, recover it and ask which name it has: */
+			result=(Result*)(*object);
+
+			if (strcmp(result->GetFieldName(),name)==0){
+				/*Ok, this is the one! Recover the value of this result: */
+				double** field=NULL;
+				field=(double**)pvalue; //not very safe, but hey!
+				result->GetField(field);
+				found=1;
+				break;
+			}
+		}
+	}
+	return found;
+}
+/*}}}*/
+
Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 3937)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 3938)
@@ -221,5 +221,11 @@
 	/*}}}*/
 	/*Element types{{{1*/
+	P0Enum,
 	P1Enum,
+	/*}}}*/
+	/*Results{{{1*/
+	StringResultEnum,
+	DoubleVecResultEnum,
+	DoubleMatResultEnum,
 	/*}}}*/
 	/*Parameters{{{1*/
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 3937)
+++ /issm/trunk/src/c/Makefile.am	(revision 3938)
@@ -105,6 +105,11 @@
 					./objects/Node.h\
 					./objects/Node.cpp\
-					./objects/Result.h\
-					./objects/Result.cpp\
+					./objects/Results/Result.h\
+					./objects/Results/DoubleVecResult.h\
+					./objects/Results/DoubleVecResult.cpp\
+					./objects/Results/DoubleMatResult.h\
+					./objects/Results/DoubleMatResult.cpp\
+					./objects/Results/StringResult.h\
+					./objects/Results/StringResult.cpp\
 					./objects/Elements/Tria.h\
 					./objects/Elements/Tria.cpp\
@@ -114,4 +119,5 @@
 					./objects/Elements/TriaRef.cpp\
 					./objects/Inputs/Input.h\
+					./objects/Inputs/InputLocal.h\
 					./objects/Inputs/TriaVertexInput.h\
 					./objects/Inputs/TriaVertexInput.cpp\
@@ -128,4 +134,5 @@
 					./objects/Inputs/DoubleInput.h\
 					./objects/Inputs/DoubleInput.cpp\
+					./objects/Inputs/ProcessResults.cpp\
 					./objects/Elements/Sing.h\
 					./objects/Elements/Sing.cpp\
@@ -179,4 +186,5 @@
 					./DataSet/Parameters.cpp\
 					./DataSet/Inputs.cpp\
+					./DataSet/Results.cpp\
 					./shared/shared.h\
 					./shared/Alloc/alloc.h\
@@ -447,4 +455,6 @@
 					./modules/InputToResultx/InputToResultx.cpp\
 					./modules/InputToResultx/InputToResultx.h\
+					./modules/InputToResultx/PatchesSize.cpp\
+					./modules/InputToResultx/InputToPatches.cpp\
 					./modules/ExtrudeInputx/ExtrudeInputx.cpp\
 					./modules/ExtrudeInputx/ExtrudeInputx.h\
@@ -550,6 +560,11 @@
 					./objects/Hook.h\
 					./objects/Hook.cpp\
-					./objects/Result.h\
-					./objects/Result.cpp\
+					./objects/Results/Result.h\
+					./objects/Results/DoubleVecResult.h\
+					./objects/Results/DoubleVecResult.cpp\
+					./objects/Results/DoubleMatResult.h\
+					./objects/Results/DoubleMatResult.cpp\
+					./objects/Results/StringResult.h\
+					./objects/Results/StringResult.cpp\
 					./objects/Elements/Tria.h\
 					./objects/Elements/Tria.cpp\
@@ -559,4 +574,5 @@
 					./objects/Elements/TriaRef.cpp\
 					./objects/Inputs/Input.h\
+					./objects/Inputs/InputLocal.h\
 					./objects/Inputs/TriaVertexInput.h\
 					./objects/Inputs/TriaVertexInput.cpp\
@@ -573,4 +589,5 @@
 					./objects/Inputs/DoubleInput.h\
 					./objects/Inputs/DoubleInput.cpp\
+					./objects/Inputs/ProcessResults.cpp\
 					./objects/Elements/Sing.h\
 					./objects/Elements/Sing.cpp\
@@ -624,4 +641,5 @@
 					./DataSet/Parameters.cpp\
 					./DataSet/Inputs.cpp\
+					./DataSet/Results.cpp\
 					./shared/shared.h\
 					./shared/Threads/issm_threads.h\
@@ -779,4 +797,6 @@
 					./modules/Dofx/Dofx.h\
 					./modules/Dofx/Dofx.cpp\
+					./modules/OutputResultsx/OutputResultsx.h\
+					./modules/OutputResultsx/OutputResultsx.cpp\
 					./modules/Dux/Dux.h\
 					./modules/Dux/Dux.cpp\
@@ -882,4 +902,6 @@
 					./modules/InputToResultx/InputToResultx.cpp\
 					./modules/InputToResultx/InputToResultx.h\
+					./modules/InputToResultx/PatchesSize.cpp\
+					./modules/InputToResultx/InputToPatches.cpp\
 					./modules/ExtrudeInputx/ExtrudeInputx.cpp\
 					./modules/ExtrudeInputx/ExtrudeInputx.h\
@@ -898,5 +920,4 @@
 					./solutions/objectivefunctionC.cpp\
 					./solutions/gradjcompute_core.cpp\
-					./solutions/ProcessResults.cpp\
 					./solutions/prognostic_core.cpp\
 					./solutions/prognostic2_core.cpp\
@@ -910,5 +931,4 @@
 					./solutions/transient_core_3d.cpp\
 					./solutions/steadystate_core.cpp\
-					./solutions/OutputResults.cpp\
 					./modules/Bamgx/Bamgx.cpp\
 					./modules/Bamgx/Bamgx.h\
Index: /issm/trunk/src/c/modules/InputToResultx/InputToPatches.cpp
===================================================================
--- /issm/trunk/src/c/modules/InputToResultx/InputToPatches.cpp	(revision 3938)
+++ /issm/trunk/src/c/modules/InputToResultx/InputToPatches.cpp	(revision 3938)
@@ -0,0 +1,35 @@
+/*!\file:  InputsToPatches.cpp
+ * \brief  fill patches from inputs
+ */ 
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#undef __FUNCT__ 
+#define __FUNCT__ "InputsToPatches"
+
+#include "./InputToResultx.h"
+#include "../../DataSet/DataSet.h"
+
+void InputToPatches(DataSet* elements,double* patches,int patch_numrows,int patch_numcols){
+
+	int i;
+
+	/*intermediary:*/
+	Element* element=NULL;
+	int count=0;
+
+	/*Go through elemnets, and each time an element holds an input with the correct enum_type, increase count by 1, and fill the 
+	 * patches matrix with the input data: */
+	 
+	for(i=0;i<elements->Size();i++){
+
+		element=(Element*)elements->GetObjectByOffset(i);
+		element->PatchFill(&count,patches,patch_numcols);
+
+	}
+
+}
Index: /issm/trunk/src/c/modules/InputToResultx/InputToResultx.cpp
===================================================================
--- /issm/trunk/src/c/modules/InputToResultx/InputToResultx.cpp	(revision 3937)
+++ /issm/trunk/src/c/modules/InputToResultx/InputToResultx.cpp	(revision 3938)
@@ -13,18 +13,34 @@
 void InputToResultx(Result** presult,DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials,Parameters* parameters,int enum_type,int id, double time, int step){
 
+	int i,j,count;
+
+	/*output: */
+	Result* result=NULL;
+
 	/*Intermediary output vector*/
-	Mat     solution=NULL;
-	Result* result=NULL;
+	double* patches=NULL; //build a matrix of patch information, corresponding to the input with  name enum_type
+	int     patch_numrows,patch_numcols;
 
 	/*First, get elements*/
 	elements->Configure(elements,loads, nodes,vertices, materials,parameters);
 
-	/*Then extrude vertically the new inputs*/
-	elements->InputToResult(&solution,enum_type);
+	/*Figure out size of patches matrix: */
+	PatchesSize(elements,&patch_numrows, &patch_numcols,enum_type);
 
-	/*Create Result and clean up*/
-	/*Mat support in result to be added!!!!!!*/
-	//result=new Result(id,time,step,enum_type,solution);
-	MatFree(&solution);
+	/*Allocate matrix: */
+	patches=(double*)xmalloc(patch_numrows*patch_numcols*sizeof(double));
+
+	/*Fill patches with NaN, default value: */
+	for(i=0;i<patch_numrows;i++){
+		for(j=0;j<patch_numcols;j++){
+			*(patches+patch_numcols*i+j)=NAN;
+		}
+	}
+
+	/*Now, go through elements, their inputs with the correct enum_type, and fill the patches: */
+	InputToPatches(elements,patches,patch_numrows,patch_numcols);
+
+	/*Create result object embedding patches: */
+	result=new DoubleMatResult(id,enum_type,time,step,patches,patch_numrows,patch_numcols);
 
 	/*Assign output pointer*/
Index: /issm/trunk/src/c/modules/InputToResultx/InputToResultx.h
===================================================================
--- /issm/trunk/src/c/modules/InputToResultx/InputToResultx.h	(revision 3937)
+++ /issm/trunk/src/c/modules/InputToResultx/InputToResultx.h	(revision 3938)
@@ -8,7 +8,10 @@
 #include "../../DataSet/DataSet.h"
 
-/* local prototypes: */
+/* global prototype: */
 void InputToResultx(Result** presult,DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials,Parameters* parameters,int enum_type,int id, double time, int step);
 
+/* local prototypes: */
+void PatchesSize(DataSet* elements,int* ppatch_numrows, int* ppatch_numcols,int enum_type);
+void InputToPatches(DataSet* elements,double* patches,int patch_numrows,int patch_numcols);
+
 #endif  /* _INPUTTORESULTX_H */
-
Index: /issm/trunk/src/c/modules/InputToResultx/PatchesSize.cpp
===================================================================
--- /issm/trunk/src/c/modules/InputToResultx/PatchesSize.cpp	(revision 3938)
+++ /issm/trunk/src/c/modules/InputToResultx/PatchesSize.cpp	(revision 3938)
@@ -0,0 +1,52 @@
+/*!\file:  PatchesSize.cpp
+ * \brief  determine size of patches from inputs
+ */ 
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#undef __FUNCT__ 
+#define __FUNCT__ "PatchesSize"
+
+#include "./InputToResultx.h"
+#include "../../DataSet/DataSet.h"
+
+void PatchesSize(DataSet* elements,int* ppatch_numrows, int* ppatch_numcols,int enum_type){
+
+	int i;
+
+	/*output: */
+	int patch_numrows;
+	int patch_numcols;
+
+	/*intermediary:*/
+	Element* element=NULL;
+	int count=0;
+	int numcols=0;
+	int max_numcols=0;
+
+	/*Go through elemnets, and each time an element holds an input with the correct enum_type, increase count by 1. At the 
+	 * same time, retrieve size of patch that this input will output, and during the loop, figure out the max of that patch size. 
+	 * The final count will be the number of rows in the patches array, and max_numcols will be the number of columns of the 
+	 * p[atches array: */
+	 
+	patch_numrows=0;
+	patch_numcols=0;
+	numcols=0;
+	
+	for(i=0;i<elements->Size();i++){
+
+		element=(Element*)elements->GetObjectByOffset(i);
+		element->PatchSize(&patch_numrows,&numcols,enum_type);
+		if(numcols>patch_numcols)patch_numcols=numcols;
+
+	}
+
+	/*Assign output pointers:*/
+	*ppatch_numrows=patch_numrows;
+	*ppatch_numcols=patch_numcols;
+}
+
Index: /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 3938)
+++ /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp	(revision 3938)
@@ -0,0 +1,37 @@
+/*!\file:  OutputResults.cpp
+ * \brief: go through results dataset, and for each result, write it to disk.
+ */ 
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "stdio.h"
+#include "../../DataSet/DataSet.h"
+#include "../../io/io.h"
+#include "../../objects/objects.h"
+
+void OutputResults(DataSet* results,char* filename){
+
+	int i;
+	Result* result=NULL;
+	FILE* fid=NULL;
+	extern int my_rank;
+
+	/* Open output file to write raw binary data: */
+	if(my_rank==0){
+		fid=pfopen(filename,"wb");
+
+		for(i=0;i<results->Size();i++){
+			result=(Result*)results->GetObjectByOffset(i);
+
+			/*write result to disk: */
+			result->WriteData(fid);
+		}
+		
+		/*Close file: */
+		pfclose(fid,filename);
+	}
+}
Index: /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.h
===================================================================
--- /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.h	(revision 3938)
+++ /issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.h	(revision 3938)
@@ -0,0 +1,14 @@
+/*!\file:  OutputResultsx.h
+ * \brief header file for outputing results
+ */ 
+
+#ifndef _OUTPUTRESULTS_H
+#define _OUTPUTRESULTS_H
+
+class DataSet;
+
+/* local prototypes: */
+void OutputResults(DataSet* results,char* filename);
+
+#endif  /* _OUTPUTRESULTS_H */
+
Index: /issm/trunk/src/c/modules/Qmux/DakotaResponses.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/DakotaResponses.cpp	(revision 3937)
+++ /issm/trunk/src/c/modules/Qmux/DakotaResponses.cpp	(revision 3938)
@@ -17,5 +17,5 @@
 #include "../modules.h"
 
-void DakotaResponses(double* responses,char** responses_descriptors,int numresponses,Model* model,DataSet* results,DataSet* processed_results,int analysis_type,int sub_analysis_type){
+void DakotaResponses(double* responses,char** responses_descriptors,int numresponses,Model* model,Results* results,Results* processed_results,int analysis_type,int sub_analysis_type){
 
 	int i,j;
Index: /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp	(revision 3937)
+++ /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp	(revision 3938)
@@ -39,6 +39,6 @@
 	
 	/*output from core solutions: */
-	DataSet* results=NULL;
-	DataSet* processed_results=NULL;
+	Results* results=NULL;
+	Results* processed_results=NULL;
 
 	char** responses_descriptors=NULL;
@@ -123,11 +123,4 @@
 	else ISSMERROR("%s%i%s%i%s"," analysis_type ",analysis_type," and sub_analysis_type ",sub_analysis_type," not supported yet!");
 	
-		
-
-	/*Now process the outputs, before computing the dakota responses: */
-	if(verbose)_printf_("process results:\n");
-
-	ProcessResults(&processed_results,results,model,analysis_type); 
-
 	/*compute responses on cpu 0: dummy for now! */
 	if(verbose)_printf_("compute dakota responses:\n");
Index: /issm/trunk/src/c/modules/modules.h
===================================================================
--- /issm/trunk/src/c/modules/modules.h	(revision 3937)
+++ /issm/trunk/src/c/modules/modules.h	(revision 3938)
@@ -64,3 +64,4 @@
 #include "./InputToResultx/InputToResultx.h"
 #include "./GetSolutionFromInputsx/GetSolutionFromInputsx.h"
+#include "./OutputResultsx/OutputResultsx.h"
 #endif
Index: /issm/trunk/src/c/objects/Elements/Beam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Beam.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Beam.cpp	(revision 3938)
@@ -808,2 +808,12 @@
 }
 /*}}}*/
+/*FUNCTION Beam::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){{{1*/
+void  Beam::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){
+	this->inputs->PatchSize(ppatch_numrows,pnumcols,enum_type);
+}
+/*}}}*/
+/*FUNCTION Beam::PatchFill(int* pcount, double* patches,int patch_numcols);{{{1*/
+void  Beam::PatchFill(int* pcount, double* patches,int patch_numcols){
+	this->inputs->PatchFill(pcount,patches,patch_numcols,this->parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Elements/Beam.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Beam.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Beam.h	(revision 3938)
@@ -79,4 +79,7 @@
 		void  ComputeStrainRate(Vec eps,int analysis_type,int sub_analysis_type);
 		void  GetNodes(void** vpnodes);
+		void  PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);
+		void  PatchFill(int* pcount, double* patches,int patch_numcols);
+
 		/*}}}*/
 		/*not implemented: {{{1*/
Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 3938)
@@ -47,4 +47,6 @@
 		virtual void   ComputeStrainRate(Vec eps,     int analysis_type,int sub_analysis_type)=0;
 		virtual double MassFlux(double* segment,double* ug)=0;
+		virtual void   PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type)=0;
+		virtual void   PatchFill(int* pcount, double* patches,int patch_numcols)=0;
 
 		/*Implementation: */
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 3938)
@@ -4693,2 +4693,12 @@
 }
 /*}}}*/
+/*FUNCTION Penta::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){{{1*/
+void  Penta::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){
+	this->inputs->PatchSize(ppatch_numrows,pnumcols,enum_type);
+}
+/*}}}*/
+/*FUNCTION Penta::PatchFill(int* pcount, double* patches,int patch_numcols);{{{1*/
+void  Penta::PatchFill(int* pcount, double* patches,int patch_numcols){
+	this->inputs->PatchFill(pcount,patches,patch_numcols,this->parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 3938)
@@ -143,4 +143,6 @@
 		void  GetPhi(double* phi, double*  epsilon, double viscosity);
 		double MassFlux(double* segment,double* ug);
+		void  PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);
+		void  PatchFill(int* pcount, double* patches,int patch_numcols);
 
 		/*updates: */
@@ -160,4 +162,6 @@
 		void  UpdateInputsFromConstant(int constant, int name);
 		void  UpdateInputsFromConstant(bool constant, int name);
+		
+	
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Elements/Sing.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Sing.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Sing.cpp	(revision 3938)
@@ -595,2 +595,12 @@
 }
 /*}}}*/
+/*FUNCTION Sing::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){{{1*/
+void  Sing::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){
+	this->inputs->PatchSize(ppatch_numrows,pnumcols,enum_type);
+}
+/*}}}*/
+/*FUNCTION Sing::PatchFill(int* pcount, double* patches,int patch_numcols);{{{1*/
+void  Sing::PatchFill(int* pcount, double* patches,int patch_numcols){
+	this->inputs->PatchFill(pcount,patches,patch_numcols,this->parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Elements/Sing.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Sing.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Sing.h	(revision 3938)
@@ -78,4 +78,7 @@
 		void  ComputeStrainRate(Vec eps,int analysis_type,int sub_analysis_type);
 		void  GetNodes(void** vpnodes);
+		void  PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);
+		void  PatchFill(int* pcount, double* patches,int patch_numcols);
+
 		/*}}}*/
 		/*not implemented: {{{1*/
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 3938)
@@ -4747,2 +4747,12 @@
 }
 /*}}}*/
+/*FUNCTION Tria::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){{{1*/
+void  Tria::PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type){
+	this->inputs->PatchSize(ppatch_numrows,pnumcols,enum_type);
+}
+/*}}}*/
+/*FUNCTION Tria::PatchFill(int* pcount, double* patches,int patch_numcols);{{{1*/
+void  Tria::PatchFill(int* pcount, double* patches,int patch_numcols){
+	this->inputs->PatchFill(pcount,patches,patch_numcols,this->parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 3938)
@@ -118,4 +118,7 @@
 		double GetArea(void);
 		double GetAreaCoordinate(double x, double y, int which_one);
+		void  PatchSize(int* ppatch_numrows,int* pnumcols, int enum_type);
+		void  PatchFill(int* pcount, double* patches,int patch_numcols);
+
 		/*}}}*/
 		/*FUNCTION updates{{{1*/
Index: /issm/trunk/src/c/objects/Inputs/BeamVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BeamVertexInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/BeamVertexInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -205,2 +206,17 @@
 }
 /*}}}*/
+/*FUNCTION BeamVertexInput::PatchSize(void);{{{1*/
+int BeamVertexInput::PatchSize(void){
+	return 2;
+}
+/*}}}*/
+/*FUNCTION BeamVertexInput::PatchFill(double* patches);{{{1*/
+void BeamVertexInput::PatchFill(double* patches,Parameters* parameters){
+	patches[0]=values[0];
+	patches[1]=values[1];
+
+	/*Now, post-processing: */
+	ProcessResults(patches,2,this->enum_type,parameters);
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/BeamVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BeamVertexInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/BeamVertexInput.h	(revision 3938)
@@ -72,4 +72,6 @@
 		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
 		void ChangeEnum(int newenumtype);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/BoolInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BoolInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/BoolInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -195,2 +196,15 @@
 }
 /*}}}*/
+/*FUNCTION BoolInput::PatchSize(void);{{{1*/
+int BoolInput::PatchSize(void){
+	return 1;
+}
+/*}}}*/
+/*FUNCTION BoolInput::PatchFill(double* patches);{{{1*/
+void BoolInput::PatchFill(double* patches,Parameters* parameters){
+	patches[0]=(double)value;
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,1,this->enum_type,parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/BoolInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 3938)
@@ -72,4 +72,6 @@
 		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
 		void ChangeEnum(int newenumtype);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -205,2 +206,15 @@
 }
 /*}}}*/
+/*FUNCTION DoubleInput::PatchSize(void);{{{1*/
+int DoubleInput::PatchSize(void){
+	return 1;
+}
+/*}}}*/
+/*FUNCTION DoubleInput::PatchFill(double* patches);{{{1*/
+void DoubleInput::PatchFill(double* patches,Parameters* parameters){
+	patches[0]=value;
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,1,this->enum_type,parameters);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 3938)
@@ -72,4 +72,6 @@
 		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
 		void ChangeEnum(int newenumtype);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/Input.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/Input.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/Input.h	(revision 3938)
@@ -46,4 +46,6 @@
 		virtual Input* SpawnBeamInput(int* indices)=0;
 		virtual Input* SpawnTriaInput(int* indices)=0;
+		virtual int  PatchSize(void)=0;
+		virtual void PatchFill(double* patches,Parameters* parameters)=0;
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/InputLocal.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/InputLocal.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Inputs/InputLocal.h	(revision 3938)
@@ -0,0 +1,14 @@
+/*!\file: InputLocal.h
+ * \brief prototypes for InputLocal.h
+ */ 
+
+#ifndef _INPUTLOCAL_H_
+#define  _INPUTLOCAL_H_
+
+class Parameters;
+
+void ProcessResults(double* patch, int patch_size,int enum_type,Parameters* parameters);
+
+
+#endif //ifndef _INPUTLOCAL_H_
+
Index: /issm/trunk/src/c/objects/Inputs/IntInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/IntInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/IntInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -193,2 +194,16 @@
 }
 /*}}}*/
+/*FUNCTION IntInput::PatchSize(void);{{{1*/
+int IntInput::PatchSize(void){
+	return 1;
+}
+/*}}}*/
+/*FUNCTION IntInput::PatchFill(double* patches);{{{1*/
+void IntInput::PatchFill(double* patches,Parameters* parameters){
+	patches[0]=(double)value;
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,1,this->enum_type,parameters);
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/IntInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 3938)
@@ -72,4 +72,6 @@
 		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
 		void ChangeEnum(int newenumtype);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -854,2 +855,22 @@
 }
 /*}}}*/
+/*FUNCTION PentaVertexInput::PatchSize(void);{{{1*/
+int PentaVertexInput::PatchSize(void){
+	return 6;
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::PatchFill(double* patches);{{{1*/
+void PentaVertexInput::PatchFill(double* patches,Parameters* parameters){
+
+	patches[0]=values[0];
+	patches[1]=values[1];
+	patches[2]=values[2];
+	patches[3]=values[3];
+	patches[4]=values[4];
+	patches[5]=values[5];
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,6,this->enum_type,parameters);
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 3938)
@@ -81,4 +81,6 @@
 		void GetBPattyn(double* B, double* xyz_list, double* gauss_coord);
 		void GetBStokes(double* B, double* xyz_list, double* gauss_coord);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/ProcessResults.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/ProcessResults.cpp	(revision 3938)
+++ /issm/trunk/src/c/objects/Inputs/ProcessResults.cpp	(revision 3938)
@@ -0,0 +1,36 @@
+/*!\file:  ProcessResults.cpp
+ * \brief: process patch that was created by an input, for results purposes.
+ * For example, velocities need to be in m/yr, melting rates in m/yr, etc ...
+ * This centralizes all post-processing of inputs when they are being output to 
+ * patched results.
+ *
+ */ 
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./InputLocal.h"
+#include "../../DataSet/DataSet.h"
+#include "../../objects/objects.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+#include "../../shared/shared.h"
+
+void ProcessResults(double* patch, int patch_size,int enum_type,Parameters* parameters){
+
+	int i;
+	double yts;
+
+	/*Gete some values from parameters, that are often needed: */
+	parameters->FindParam(&yts,YtsEnum);
+
+	switch(enum_type){
+		case VxEnum: for(i=0;i<patch_size;i++)patch[i]=patch[i]/yts;break;
+		case VyEnum: for(i=0;i<patch_size;i++)patch[i]=patch[i]/yts;break;
+		case VzEnum: for(i=0;i<patch_size;i++)patch[i]=patch[i]/yts;break;
+		case MeltingRateEnum: for(i=0;i<patch_size;i++)patch[i]=patch[i]/yts;break;
+		default: break;
+	}
+}
Index: /issm/trunk/src/c/objects/Inputs/SingVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/SingVertexInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/SingVertexInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -184,2 +185,16 @@
 }
 /*}}}*/
+/*FUNCTION SingVertexInput::PatchSize(void);{{{1*/
+int SingVertexInput::PatchSize(void){
+	return 1;
+}
+/*}}}*/
+/*FUNCTION SingVertexInput::PatchFill(double* patches);{{{1*/
+void SingVertexInput::PatchFill(double* patches,Parameters* parameters){
+	patches[0]=value;
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,1,this->enum_type,parameters);
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/SingVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/SingVertexInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/SingVertexInput.h	(revision 3938)
@@ -71,4 +71,6 @@
 		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
 		void ChangeEnum(int newenumtype);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 3938)
@@ -11,4 +11,5 @@
 #include "stdio.h"
 #include <string.h>
+#include "./InputLocal.h"
 #include "../objects.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
@@ -428,2 +429,20 @@
 }
 /*}}}*/
+/*FUNCTION TriaVertexInput::PatchSize(void);{{{1*/
+int TriaVertexInput::PatchSize(void){
+	return 3;
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::PatchFill(double* patches);{{{1*/
+void TriaVertexInput::PatchFill(double* patches,Parameters* parameters){
+	
+	patches[0]=values[0];
+	patches[1]=values[1];
+	patches[2]=values[2];
+	
+	/*Now, post-processing: */
+	ProcessResults(patches,3,this->enum_type,parameters);
+
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 3937)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 3938)
@@ -79,4 +79,6 @@
 		void GetJacobian(double* J, double* xyz_list,double* gauss);
 		void GetJacobianInvert(double*  Jinv, double* xyz_list,double* gauss);
+		int  PatchSize(void);
+		void PatchFill(double* patches,Parameters* parameters);
 		/*}}}*/
 
Index: /issm/trunk/src/c/objects/Results/DoubleMatResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/Results/DoubleMatResult.cpp	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/DoubleMatResult.cpp	(revision 3938)
@@ -0,0 +1,200 @@
+/*!\file DoubleMatResult.c
+ * \brief: implementation of the DoubleMatResult object
+ */
+
+/*header files: */
+/*{{{1*/
+#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 "../../DataSet/DataSet.h"
+#include "../../include/include.h"
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION DoubleMatResult::DoubleMatResult(){{{1*/
+DoubleMatResult::DoubleMatResult(){
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::DoubleMatResult(int id, int enum_type,double time, int step, double* value,int M,int N);{{{1*/
+DoubleMatResult::DoubleMatResult(int in_id, int in_enum_type,double in_time, int in_step, double* in_value,int in_M,int in_N){
+
+	id=in_id;
+	enum_type=in_enum_type;
+	time=in_time;
+	step=in_step;
+
+	M=in_M;
+	N=in_N;
+	value=(double*)xmalloc(M*N*sizeof(double));
+	memcpy(value,in_value,M*N*sizeof(double));
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::~DoubleMatResult(){{{1*/
+DoubleMatResult::~DoubleMatResult(){
+	xfree((void**)&value);
+	return;
+}
+/*}}}*/
+
+/*Object methods*/
+/*FUNCTION DoubleMatResult::copy{{{1*/
+Object* DoubleMatResult::copy() {
+	
+	return new DoubleMatResult(this->id,this->enum_type,this->time,this->step,this->value,this->M,this->N);
+
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::DeepEcho{{{1*/
+void DoubleMatResult::DeepEcho(void){
+
+	int i,j;
+
+	printf("DoubleMatResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   matrix size: %ix%i\n",this->M,this->N);
+	for(i=0;i<this->M;i++){
+		for(i=0;i<this->N;i++){
+			printf("%i %i %g\n",i,j,*(this->value+N*i+j));
+		}
+	}
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::Demarshall{{{1*/
+void  DoubleMatResult::Demarshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   i;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*this time, no need to get enum value, the pointer directly points to the beginning of the 
+	 *object data (thanks to DataSet::Demarshall):*/
+
+	memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(&time,marshalled_dataset,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(&step,marshalled_dataset,sizeof(step));marshalled_dataset+=sizeof(step);
+	
+	/*data: */
+	memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M);
+	memcpy(&N,marshalled_dataset,sizeof(N));marshalled_dataset+=sizeof(N);
+	value=(double*)xmalloc(M*N*sizeof(double));
+	memcpy(value,marshalled_dataset,M*N*sizeof(double));marshalled_dataset+=M*N*sizeof(double);
+
+	/*return: */
+	*pmarshalled_dataset=marshalled_dataset;
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::Echo {{{1*/
+void DoubleMatResult::Echo(void){
+
+	printf("DoubleMatResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   matrix size: %ix%i\n",this->M,this->N);
+
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::Enum{{{1*/
+int DoubleMatResult::Enum(void){
+
+	return DoubleMatResultEnum;
+
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::Id{{{1*/
+int    DoubleMatResult::Id(void){ return this->id; }
+/*}}}*/
+/*FUNCTION DoubleMatResult::Marshall{{{1*/
+void  DoubleMatResult::Marshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   enum_value=0;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*get enum value of DoubleMatResult: */
+	enum_value=DoubleMatResultEnum;
+	
+	/*marshall enum: */
+	memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
+	
+	/*marshall DoubleMatResult data: */
+	memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(marshalled_dataset,&time,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(marshalled_dataset,&step,sizeof(step));marshalled_dataset+=sizeof(step);
+	memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M);
+	memcpy(marshalled_dataset,&N,sizeof(N));marshalled_dataset+=sizeof(N);
+	memcpy(marshalled_dataset,value,M*N*sizeof(double));marshalled_dataset+=M*N*sizeof(double);
+
+	*pmarshalled_dataset=marshalled_dataset;
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::MarshallSize{{{1*/
+int   DoubleMatResult::MarshallSize(){
+	
+	return sizeof(id)+
+		sizeof(enum_type)+
+		sizeof(time)+
+		sizeof(step)+
+		sizeof(M)+
+		sizeof(N)+
+		M*N*sizeof(double)+
+		sizeof(int); //sizeof(int) for enum value
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::MyRank{{{1*/
+int    DoubleMatResult::MyRank(void){ 
+	extern int my_rank;
+	return my_rank; 
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromVector(double* vector, int name, int type) {{{1*/
+void  DoubleMatResult::UpdateInputsFromVector(double* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromVector(int* vector, int name, int type) {{{1*/
+void  DoubleMatResult::UpdateInputsFromVector(int* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromVector(bool* vector, int name, int type) {{{1*/
+void  DoubleMatResult::UpdateInputsFromVector(bool* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromConstant(double constant, int name) {{{1*/
+void  DoubleMatResult::UpdateInputsFromConstant(double constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromConstant(int constant, int name) {{{1*/
+void  DoubleMatResult::UpdateInputsFromConstant(int constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleMatResult::UpdateInputsFromConstant(bool constant, int name) {{{1*/
+void  DoubleMatResult::UpdateInputsFromConstant(bool constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Results/DoubleMatResult.h
===================================================================
--- /issm/trunk/src/c/objects/Results/DoubleMatResult.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/DoubleMatResult.h	(revision 3938)
@@ -0,0 +1,71 @@
+/*! \file DoubleMatResult.h 
+ *  \brief: header file for triavertexinput object
+ */
+
+
+#ifndef _DOUBLEMATRESULT_H_
+#define _DOUBLEMATRESULT_H_
+
+/*Headers:*/
+/*{{{1*/
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
+
+
+#include "./Result.h"
+#include "../../include/include.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../include/include.h"
+/*}}}*/
+
+class DoubleMatResult: public Result{
+
+	private: 
+		
+		int    id;
+		int    enum_type;
+		double time;
+		int    step;
+	
+		double* value;
+		int M;
+		int N;
+
+	public:
+		/*constructors, destructors: {{{1*/
+		DoubleMatResult();
+		DoubleMatResult(int id, int enum_type,double time, int step, double* value,int M,int N);
+		~DoubleMatResult();
+		/*}}}*/
+		/*Object methods: {{{1*/
+		Object* copy();
+		void  DeepEcho();
+		void  Demarshall(char** pmarshalled_dataset);
+		void  Echo();
+		int   Enum();
+		int   Id();
+		void  Marshall(char** pmarshalled_dataset);
+		int   MarshallSize();
+		int   MyRank();
+		void  UpdateInputsFromVector(double* vector, int name, int type);
+		void  UpdateInputsFromVector(int* vector, int name, int type);
+		void  UpdateInputsFromVector(bool* vector, int name, int type);
+		void  UpdateInputsFromConstant(double constant, int name);
+		void  UpdateInputsFromConstant(int constant, int name);
+		void  UpdateInputsFromConstant(bool constant, int name);
+		void  UpdateInputsFromSolution(double* solution, int analysis_type, int sub_analysis_type){ISSMERROR("Not implemented yet!");}
+
+		/*}}}*/
+		/*Result methods: {{{1*/
+		/*}}}*/
+};
+#endif  /* _DOUBLEMATRESULT_H */
Index: /issm/trunk/src/c/objects/Results/DoubleVecResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/Results/DoubleVecResult.cpp	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/DoubleVecResult.cpp	(revision 3938)
@@ -0,0 +1,191 @@
+/*!\file DoubleVecResult.c
+ * \brief: implementation of the DoubleVecResult object
+ */
+
+/*header files: */
+/*{{{1*/
+#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 "../../DataSet/DataSet.h"
+#include "../../include/include.h"
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION DoubleVecResult::DoubleVecResult(){{{1*/
+DoubleVecResult::DoubleVecResult(){
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::DoubleVecResult(int id, int enum_type,double time, int step, double* value,int M){{{1*/
+DoubleVecResult::DoubleVecResult(int in_id, int in_enum_type,double in_time, int in_step, double* in_value,int in_M){
+
+	id=in_id;
+	enum_type=in_enum_type;
+	time=in_time;
+	step=in_step;
+	
+	M=in_M;
+	value=(double*)xmalloc(M*sizeof(double));
+	memcpy(value,in_value,M*sizeof(double));
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::~DoubleVecResult(){{{1*/
+DoubleVecResult::~DoubleVecResult(){
+	xfree((void**)&value);
+	return;
+}
+/*}}}*/
+
+/*Object methods*/
+/*FUNCTION DoubleVecResult::copy{{{1*/
+Object* DoubleVecResult::copy() {
+	
+	return new DoubleVecResult(this->id,this->enum_type,this->time,this->step,this->value,this->M);
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::DeepEcho{{{1*/
+void DoubleVecResult::DeepEcho(void){
+	
+	int i;
+
+	printf("DoubleVecResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   vector size: %i\n",this->M);
+	for(i=0;i<this->M;i++){
+		printf("%i %g\n",i,this->value[i]);
+	}
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Demarshall{{{1*/
+void  DoubleVecResult::Demarshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   i;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*this time, no need to get enum value, the pointer directly points to the beginning of the 
+	 *object data (thanks to DataSet::Demarshall):*/
+	memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(&time,marshalled_dataset,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(&step,marshalled_dataset,sizeof(step));marshalled_dataset+=sizeof(step);
+	memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M);
+	value=(double*)xmalloc(M*sizeof(double));
+	memcpy(value,marshalled_dataset,M*sizeof(double));marshalled_dataset+=M*sizeof(double);
+
+	/*return: */
+	*pmarshalled_dataset=marshalled_dataset;
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Echo {{{1*/
+void DoubleVecResult::Echo(void){
+
+	printf("DoubleVecResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   vector size: %i\n",this->M);
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Enum{{{1*/
+int DoubleVecResult::Enum(void){
+
+	return DoubleVecResultEnum;
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Id{{{1*/
+int    DoubleVecResult::Id(void){ return this->id; }
+/*}}}*/
+/*FUNCTION DoubleVecResult::Marshall{{{1*/
+void  DoubleVecResult::Marshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   enum_value=0;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*get enum value of DoubleVecResult: */
+	enum_value=DoubleVecResultEnum;
+	
+	/*marshall enum: */
+	memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
+	
+	/*marshall DoubleVecResult data: */
+	memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(marshalled_dataset,&time,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(marshalled_dataset,&step,sizeof(step));marshalled_dataset+=sizeof(step);
+	memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M);
+	memcpy(marshalled_dataset,value,M*sizeof(double));marshalled_dataset+=M*sizeof(double);
+
+	*pmarshalled_dataset=marshalled_dataset;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::MarshallSize{{{1*/
+int   DoubleVecResult::MarshallSize(){
+	
+	return sizeof(id)+
+		+sizeof(enum_type)+
+		+sizeof(time)+
+		+sizeof(step)+
+		sizeof(M)
+		+M*sizeof(double)
+		+sizeof(int); //sizeof(int) for enum value
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::MyRank{{{1*/
+int    DoubleVecResult::MyRank(void){ 
+	extern int my_rank;
+	return my_rank; 
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(double* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(double* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(int* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(int* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(bool* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(bool* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(double constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(double constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(int constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(int constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(bool constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(bool constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Results/DoubleVecResult.h
===================================================================
--- /issm/trunk/src/c/objects/Results/DoubleVecResult.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/DoubleVecResult.h	(revision 3938)
@@ -0,0 +1,69 @@
+/*! \file DoubleVecResult.h 
+ *  \brief: header file for DoubleVec result object
+ */
+
+
+#ifndef _DOUBLEVECRESULT_H_
+#define _DOUBLEVECRESULT_H_
+
+/*Headers:*/
+/*{{{1*/
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
+
+
+#include "./Result.h"
+#include "../../include/include.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../include/include.h"
+/*}}}*/
+
+class DoubleVecResult: public Result{
+
+	private: 
+		int    id;
+		int    enum_type;
+		double time;
+		int    step;
+	
+		double* value;
+		int M;
+
+	public:
+		/*constructors, destructors: {{{1*/
+		DoubleVecResult();
+		DoubleVecResult(int id, int enum_type,double time, int step, double* value,int M);
+		~DoubleVecResult();
+		/*}}}*/
+		/*Object methods: {{{1*/
+		Object* copy();
+		void  DeepEcho();
+		void  Demarshall(char** pmarshalled_dataset);
+		void  Echo();
+		int   Enum();
+		int   Id();
+		void  Marshall(char** pmarshalled_dataset);
+		int   MarshallSize();
+		int   MyRank();
+
+		void  UpdateInputsFromVector(double* vector, int name, int type);
+		void  UpdateInputsFromVector(int* vector, int name, int type);
+		void  UpdateInputsFromVector(bool* vector, int name, int type);
+		void  UpdateInputsFromConstant(double constant, int name);
+		void  UpdateInputsFromConstant(int constant, int name);
+		void  UpdateInputsFromConstant(bool constant, int name);
+		void  UpdateInputsFromSolution(double* solution, int analysis_type, int sub_analysis_type){ISSMERROR("Not implemented yet!");}
+		/*}}}*/
+		/*Result methods: {{{1*/
+		/*}}}*/
+};
+#endif  /* _DOUBLEVECRESULT_H */
Index: /issm/trunk/src/c/objects/Results/Result.h
===================================================================
--- /issm/trunk/src/c/objects/Results/Result.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/Result.h	(revision 3938)
@@ -0,0 +1,34 @@
+/*!\file:  Result.h
+ * \brief abstract class for Result object
+ */ 
+
+
+#ifndef _RESULT_H_
+#define _RESULT_H_
+
+/*Headers:*/
+/*{{{1*/
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
+
+#include "../Object.h"
+/*}}}*/
+
+class Result: public Object{
+
+	public: 
+		virtual        ~Result(){};
+
+		/*methods:{{{1*/
+		/*}}}*/
+
+};
+#endif
Index: /issm/trunk/src/c/objects/Results/StringResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/Results/StringResult.cpp	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/StringResult.cpp	(revision 3938)
@@ -0,0 +1,187 @@
+/*!\file StringResult.c
+ * \brief: implementation of the StringResult object
+ */
+
+/*header files: */
+/*{{{1*/
+#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 "../../DataSet/DataSet.h"
+#include "../../include/include.h"
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION StringResult::StringResult(){{{1*/
+StringResult::StringResult(){
+	return;
+}
+/*}}}*/
+/*FUNCTION StringResult::StringResult(int id, int enum_type,double time, int step, char* value){{{1*/
+StringResult::StringResult(int in_id, int in_enum_type,double in_time, int in_step, char* in_value){
+
+	id=in_id;
+	enum_type=in_enum_type;
+	time=in_time;
+	step=in_step;
+	value=(char*)xmalloc((strlen(in_value)+1)*sizeof(char));
+	strcpy(value,in_value);
+	
+}
+/*}}}*/
+/*FUNCTION StringResult::~StringResult(){{{1*/
+StringResult::~StringResult(){
+	xfree((void**)&value);
+}
+/*}}}*/
+
+/*Object methods*/
+/*FUNCTION StringResult::copy{{{1*/
+Object* StringResult::copy() {
+	
+	return new StringResult(this->id,this->enum_type,this->time,this->step,this->value);
+
+}
+/*}}}*/
+/*FUNCTION StringResult::DeepEcho{{{1*/
+void StringResult::DeepEcho(void){
+
+	printf("StringResult:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   string: %s\n",this->value);
+}
+/*}}}*/
+/*FUNCTION StringResult::Demarshall{{{1*/
+void  StringResult::Demarshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   i;
+	int   stringsize;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*this time, no need to get enum type, the pointer directly points to the beginning of the 
+	 *object data (thanks to DataSet::Demarshall):*/
+	memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(&time,marshalled_dataset,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(&step,marshalled_dataset,sizeof(step));marshalled_dataset+=sizeof(step);
+
+	memcpy(&stringsize,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
+	this->value=(char*)xmalloc(stringsize*sizeof(char));
+	memcpy(this->value,marshalled_dataset,stringsize*sizeof(char));marshalled_dataset+=stringsize*sizeof(char);
+
+	/*return: */
+	*pmarshalled_dataset=marshalled_dataset;
+	return;
+}
+/*}}}*/
+/*FUNCTION StringResult::Echo {{{1*/
+void StringResult::Echo(void){
+	this->DeepEcho();
+}
+/*}}}*/
+/*FUNCTION StringResult::Enum{{{1*/
+int StringResult::Enum(void){
+
+	return StringResultEnum;
+
+}
+/*}}}*/
+/*FUNCTION StringResult::Id{{{1*/
+int    StringResult::Id(void){ return this->id; }
+/*}}}*/
+/*FUNCTION StringResult::Marshall{{{1*/
+void  StringResult::Marshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   enum_value=0;
+	int   stringsize;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*get enum value of StringResult: */
+	enum_value=StringResultEnum;
+	
+	/*marshall enum: */
+	memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
+
+	/*marshall data: */
+	memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(marshalled_dataset,&time,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(marshalled_dataset,&step,sizeof(step));marshalled_dataset+=sizeof(step);
+	
+	stringsize=strlen(this->value)+1;
+	memcpy(marshalled_dataset,&stringsize,sizeof(stringsize));marshalled_dataset+=sizeof(stringsize);
+	memcpy(marshalled_dataset,this->value,stringsize*sizeof(char));marshalled_dataset+=stringsize*sizeof(char);
+
+	*pmarshalled_dataset=marshalled_dataset;
+}
+/*}}}*/
+/*FUNCTION StringResult::MarshallSize{{{1*/
+int   StringResult::MarshallSize(){
+
+	int stringsize;
+	stringsize=strlen(this->value)+1;
+	
+	return sizeof(id)+
+		sizeof(enum_type)+
+		sizeof(time)+
+		sizeof(step)+
+		sizeof(int)+
+		stringsize*sizeof(char)+
+		sizeof(int); //sizeof(int) for enum value
+}
+/*}}}*/
+/*FUNCTION StringResult::MyRank{{{1*/
+int    StringResult::MyRank(void){ 
+	extern int my_rank;
+	return my_rank; 
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromVector(double* vector, int name, int type) {{{1*/
+void  StringResult::UpdateInputsFromVector(double* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromVector(int* vector, int name, int type) {{{1*/
+void  StringResult::UpdateInputsFromVector(int* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromVector(bool* vector, int name, int type) {{{1*/
+void  StringResult::UpdateInputsFromVector(bool* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromConstant(double constant, int name) {{{1*/
+void  StringResult::UpdateInputsFromConstant(double constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromConstant(int constant, int name) {{{1*/
+void  StringResult::UpdateInputsFromConstant(int constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION StringResult::UpdateInputsFromConstant(bool constant, int name) {{{1*/
+void  StringResult::UpdateInputsFromConstant(bool constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+
+/*StringResult methods: */
Index: /issm/trunk/src/c/objects/Results/StringResult.h
===================================================================
--- /issm/trunk/src/c/objects/Results/StringResult.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/StringResult.h	(revision 3938)
@@ -0,0 +1,67 @@
+/*! \file StringResult.h 
+ *  \brief: header file for triavertexinput object
+ */
+
+
+#ifndef _STRINGRESULT_H_
+#define _STRINGRESULT_H_
+
+/*Headers:*/
+/*{{{1*/
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
+
+
+#include "./Result.h"
+#include "../../include/include.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../include/include.h"
+/*}}}*/
+
+class StringResult: public Result{
+
+	private: 
+		int    id;
+		int    enum_type;
+		double time;
+		int    step;
+	
+		char* value;
+
+	public:
+		/*constructors, destructors: {{{1*/
+		StringResult();
+		StringResult(int id, int enum_type,double time, int step, char* value);
+		~StringResult();
+		/*}}}*/
+		/*Object methods: {{{1*/
+		Object* copy();
+		void  DeepEcho();
+		void  Demarshall(char** pmarshalled_dataset);
+		void  Echo();
+		int   Enum();
+		int   Id();
+		void  Marshall(char** pmarshalled_dataset);
+		int   MarshallSize();
+		int   MyRank();
+		void  UpdateInputsFromVector(double* vector, int name, int type);
+		void  UpdateInputsFromVector(int* vector, int name, int type);
+		void  UpdateInputsFromVector(bool* vector, int name, int type);
+		void  UpdateInputsFromConstant(double constant, int name);
+		void  UpdateInputsFromConstant(int constant, int name);
+		void  UpdateInputsFromConstant(bool constant, int name);
+		void  UpdateInputsFromSolution(double* solution, int analysis_type, int sub_analysis_type){ISSMERROR("Not implemented yet!");}
+		/*}}}*/
+		/*Result methods: {{{1*/
+		/*}}}*/
+};
+#endif  /* _STRINGRESULT_H */
Index: /issm/trunk/src/c/objects/Results/VecResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/Results/VecResult.cpp	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/VecResult.cpp	(revision 3938)
@@ -0,0 +1,191 @@
+/*!\file DoubleVecResult.c
+ * \brief: implementation of the DoubleVecResult object
+ */
+
+/*header files: */
+/*{{{1*/
+#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 "../../DataSet/DataSet.h"
+#include "../../include/include.h"
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION DoubleVecResult::DoubleVecResult(){{{1*/
+DoubleVecResult::DoubleVecResult(){
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::DoubleVecResult(int id, int enum_type,double time, int step, double* value,int M){{{1*/
+DoubleVecResult::DoubleVecResult(int in_id, int in_enum_type,double in_time, int in_step, double* in_value,int in_M){
+
+	id=in_id;
+	enum_type=in_enum_type;
+	time=in_time;
+	step=in_step;
+	
+	M=in_M;
+	value=(double*)xmalloc(M*sizeof(double));
+	memcpy(value,in_value,M*sizeof(double));
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::~DoubleVecResult(){{{1*/
+DoubleVecResult::~DoubleVecResult(){
+	xfree((void**)&value);
+	return;
+}
+/*}}}*/
+
+/*Object methods*/
+/*FUNCTION DoubleVecResult::copy{{{1*/
+Object* DoubleVecResult::copy() {
+	
+	return new DoubleVecResult(this->id,this->enum_type,this->time,this->step,this->value,this->M);
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::DeepEcho{{{1*/
+void DoubleVecResult::DeepEcho(void){
+	
+	int i;
+
+	printf("DoubleVecResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   vector size: %i\n",this->M);
+	for(i=0;i<this->M;i++){
+		printf("%i %g\n",i,this->value[i]);
+	}
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Demarshall{{{1*/
+void  DoubleVecResult::Demarshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   i;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*this time, no need to get enum value, the pointer directly points to the beginning of the 
+	 *object data (thanks to DataSet::Demarshall):*/
+	memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(&time,marshalled_dataset,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(&step,marshalled_dataset,sizeof(step));marshalled_dataset+=sizeof(step);
+	memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M);
+	value=(double*)xmalloc(M*sizeof(double));
+	memcpy(value,marshalled_dataset,M*sizeof(double));marshalled_dataset+=M*sizeof(double);
+
+	/*return: */
+	*pmarshalled_dataset=marshalled_dataset;
+	return;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Echo {{{1*/
+void DoubleVecResult::Echo(void){
+
+	printf("DoubleVecResult echo:\n");
+	printf("   id:  %i \n",this->id);
+	printf("   enum:  %i (%s)\n",this->enum_type,EnumAsString(this->enum_type));
+	printf("   time:  %g \n",this->time);
+	printf("   step:  %i \n",this->step);
+	printf("   vector size: %i\n",this->M);
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Enum{{{1*/
+int DoubleVecResult::Enum(void){
+
+	return DoubleVecResultEnum;
+
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::Id{{{1*/
+int    DoubleVecResult::Id(void){ return this->id; }
+/*}}}*/
+/*FUNCTION DoubleVecResult::Marshall{{{1*/
+void  DoubleVecResult::Marshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   enum_value=0;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*get enum value of DoubleVecResult: */
+	enum_value=DoubleVecResultEnum;
+	
+	/*marshall enum: */
+	memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
+	
+	/*marshall DoubleVecResult data: */
+	memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);
+	memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+	memcpy(marshalled_dataset,&time,sizeof(time));marshalled_dataset+=sizeof(time);
+	memcpy(marshalled_dataset,&step,sizeof(step));marshalled_dataset+=sizeof(step);
+	memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M);
+	memcpy(marshalled_dataset,value,M*sizeof(double));marshalled_dataset+=M*sizeof(double);
+
+	*pmarshalled_dataset=marshalled_dataset;
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::MarshallSize{{{1*/
+int   DoubleVecResult::MarshallSize(){
+	
+	return sizeof(id)+
+		+sizeof(enum_type)+
+		+sizeof(time)+
+		+sizeof(step)+
+		sizeof(M)
+		+M*sizeof(double)
+		+sizeof(int); //sizeof(int) for enum value
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::MyRank{{{1*/
+int    DoubleVecResult::MyRank(void){ 
+	extern int my_rank;
+	return my_rank; 
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(double* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(double* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(int* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(int* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromVector(bool* vector, int name, int type) {{{1*/
+void  DoubleVecResult::UpdateInputsFromVector(bool* vector, int name, int type){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(double constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(double constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(int constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(int constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
+/*FUNCTION DoubleVecResult::UpdateInputsFromConstant(bool constant, int name) {{{1*/
+void  DoubleVecResult::UpdateInputsFromConstant(bool constant, int name){
+	/*Nothing updated yet*/
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Results/VecResult.h
===================================================================
--- /issm/trunk/src/c/objects/Results/VecResult.h	(revision 3938)
+++ /issm/trunk/src/c/objects/Results/VecResult.h	(revision 3938)
@@ -0,0 +1,69 @@
+/*! \file VecResult.h 
+ *  \brief: header file for Vec result object
+ */
+
+
+#ifndef _VECRESULT_H_
+#define _VECRESULT_H_
+
+/*Headers:*/
+/*{{{1*/
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
+
+
+#include "./Result.h"
+#include "../../include/include.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../include/include.h"
+/*}}}*/
+
+class VecResult: public Result{
+
+	private: 
+		int    id;
+		int    enum_type;
+		double time;
+		int    step;
+	
+		double* value;
+		int M;
+
+	public:
+		/*constructors, destructors: {{{1*/
+		VecResult();
+		VecResult(int id, int enum_type,double time, int step, double* value,int M);
+		~VecResult();
+		/*}}}*/
+		/*Object methods: {{{1*/
+		Object* copy();
+		void  DeepEcho();
+		void  Demarshall(char** pmarshalled_dataset);
+		void  Echo();
+		int   Enum();
+		int   Id();
+		void  Marshall(char** pmarshalled_dataset);
+		int   MarshallSize();
+		int   MyRank();
+
+		void  UpdateInputsFromVector(double* vector, int name, int type);
+		void  UpdateInputsFromVector(int* vector, int name, int type);
+		void  UpdateInputsFromVector(bool* vector, int name, int type);
+		void  UpdateInputsFromConstant(double constant, int name);
+		void  UpdateInputsFromConstant(int constant, int name);
+		void  UpdateInputsFromConstant(bool constant, int name);
+		void  UpdateInputsFromSolution(double* solution, int analysis_type, int sub_analysis_type){ISSMERROR("Not implemented yet!");}
+		/*}}}*/
+		/*Result methods: {{{1*/
+		/*}}}*/
+};
+#endif  /* _VECRESULT_H */
Index: /issm/trunk/src/c/objects/objects.h
===================================================================
--- /issm/trunk/src/c/objects/objects.h	(revision 3937)
+++ /issm/trunk/src/c/objects/objects.h	(revision 3938)
@@ -51,4 +51,10 @@
 #include "./Inputs/SingVertexInput.h"
 #include "./Inputs/TriaVertexInput.h"
+
+/*Results: */
+#include "./Results/Result.h"
+#include "./Results/StringResult.h"
+#include "./Results/DoubleVecResult.h"
+#include "./Results/DoubleMatResult.h"
 
 /*Materials: */
Index: /issm/trunk/src/c/solutions/ControlRestart.cpp
===================================================================
--- /issm/trunk/src/c/solutions/ControlRestart.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/ControlRestart.cpp	(revision 3938)
@@ -13,7 +13,5 @@
 
 	/*output: */
-	DataSet* temporary_results=NULL;
-	DataSet* results=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 	char*    outputfilename=NULL;
 
@@ -29,5 +27,5 @@
 	/*Plug COPYS of the results into output dataset: 
 	 * only the pointer is given to temporary_results and at the
-	 * end of ProcessResults the pointer is deleted. That would 
+	 * end of ProcessResultsx the pointer is deleted. That would 
 	 * destroy param_g*/
 
@@ -35,13 +33,7 @@
 	for(i=0;i<numberofnodes;i++) param_g_copy[i]=param_g[i];
 
-	temporary_results=new DataSet(ResultsEnum); 
-	result=new Result(temporary_results->Size()+1,0,1,"param_g",param_g_copy,numberofnodes);
-	temporary_results->AddObject(result);
-	
-	result=new Result(temporary_results->Size()+1,0,1,"analysis_type",EnumAsString(DiagnosticAnalysisEnum));
-	temporary_results->AddObject(result);
-
-	//process results
-	ProcessResults(&results,temporary_results,model,ControlAnalysisEnum);
+	results=new Results();
+	results->AddObject(new Result(results->Size()+1,0,1,"param_g",param_g_copy,numberofnodes));
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(DiagnosticAnalysisEnum)));
 
 	//Write results on disk
@@ -49,5 +41,4 @@
 	
 	/*Free ressources:*/
-	delete temporary_results;
 	delete results;
 	xfree((void**)&outputfilename);
Index: sm/trunk/src/c/solutions/OutputResults.cpp
===================================================================
--- /issm/trunk/src/c/solutions/OutputResults.cpp	(revision 3937)
+++ 	(revision )
@@ -1,37 +1,0 @@
-/*!\file:  OutputResults.cpp
- * \brief: go through results dataset, and for each result, write it to disk.
- */ 
-
-#ifdef HAVE_CONFIG_H
-	#include "config.h"
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "stdio.h"
-#include "../DataSet/DataSet.h"
-#include "../io/io.h"
-#include "../objects/objects.h"
-
-void OutputResults(DataSet* results,char* filename){
-
-	int i;
-	Result* result=NULL;
-	FILE* fid=NULL;
-	extern int my_rank;
-
-	/* Open output file to write raw binary data: */
-	if(my_rank==0){
-		fid=pfopen(filename,"wb");
-
-		for(i=0;i<results->Size();i++){
-			result=(Result*)results->GetObjectByOffset(i);
-
-			/*write result to disk: */
-			result->WriteData(fid);
-		}
-		
-		/*Close file: */
-		pfclose(fid,filename);
-	}
-}
Index: sm/trunk/src/c/solutions/ProcessResults.cpp
===================================================================
--- /issm/trunk/src/c/solutions/ProcessResults.cpp	(revision 3937)
+++ 	(revision )
@@ -1,546 +1,0 @@
-/*!\file:  ProcessResults.cpp
- * \brief: go through results dataset, and for each result, process it for easier retrieval 
- * by the Matlab side. This usually means splitting the velocities from the g-size nodeset 
- * to the grid set (ug->vx,vy,vz), same for pressure (p_g->pressure), etc ... It also implies 
- * departitioning of the results.
- * This phase is necessary prior to outputting the results on disk.
- */ 
-
-#ifdef HAVE_CONFIG_H
-	#include "config.h"
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "../DataSet/DataSet.h"
-#include "../objects/objects.h"
-#include "../EnumDefinitions/EnumDefinitions.h"
-#include "../shared/shared.h"
-
-void ProcessResults(DataSet** pnewresults, DataSet* results,Model* model,int analysis_type){
-
-	int i,n;
-	Result* result=NULL;
-	Result* newresult=NULL;
-	
-	/*output: */
-	DataSet* newresults=NULL;
-
-	/*fem diagnostic models: */
-	FemModel* fem_dh=NULL;
-	FemModel* fem_dv=NULL;
-	FemModel* fem_dhu=NULL;
-	FemModel* fem_ds=NULL;
-	FemModel* fem_sl=NULL;
-
-	/*fem thermal models: */
-	FemModel* fem_t=NULL;
-
-	/*fem prognostic models: */
-	FemModel* fem_p=NULL;
-
-	/*fem control models: */
-	FemModel* fem_c=NULL;
-
-	/*some parameters*/
-	bool ishutter;
-	bool ismacayealpattyn;
-	bool isstokes;
-	int  dim;
-
-	/*intermediary: */
-	Vec     u_g=NULL;
-	double* u_g_serial=NULL;
-	double* vx=NULL;
-	double* vy=NULL;
-	double* vz=NULL;
-	double* vel=NULL;
-	Vec     p_g=NULL;
-	double* p_g_serial=NULL;
-	double* pressure=NULL;
-	double* partition=NULL;
-	double  yts;
-
-	double* param_g=NULL;
-	double* parameter=NULL;
-	Vec     riftproperties=NULL;
-	double* riftproperties_serial=NULL;
-	int     numrifts=0;
-
-	Vec     s_g=NULL;
-	double* s_g_serial=NULL;
-	double* surface=NULL;
-
-	Vec     sx_g=NULL;
-	double* sx_g_serial=NULL;
-	double* slopex=NULL;
-
-	Vec     sy_g=NULL;
-	double* sy_g_serial=NULL;
-	double* slopey=NULL;
-
-	Vec     b_g=NULL;
-	double* b_g_serial=NULL;
-	double* bed=NULL;
-
-	Vec     h_g=NULL;
-	double* h_g_serial=NULL;
-	double* thickness=NULL;
-
-	Vec     t_g=NULL;
-	double* t_g_serial=NULL;
-	double* temperature=NULL;
-
-	Vec     m_g=NULL;
-	double* m_g_serial=NULL;
-	double* melting=NULL;
-
-	Vec     grad_g=NULL;
-	double* grad_g_serial=NULL;
-	double* gradient=NULL;
-
-	Vec     sigma_zz=NULL;
-	double* sigma_zz_serial=NULL;
-
-	Vec     v_g=NULL;
-	double* v_g_serial=NULL;
-
-	int numberofnodes,numberofvertices,numberofelements;
-
-	/*Initialize new results: */
-	newresults=new DataSet(ResultsEnum);
-	
-	/*some flags needed: */
-	model->FindParam(&dim,DimEnum);
-	model->FindParam(&ishutter,IsHutterEnum);
-	model->FindParam(&isstokes,IsStokesEnum);
-	model->FindParam(&ismacayealpattyn,IsMacAyealPattynEnum);
-
-	/*Recover femmodels first: */
-	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum,HorizAnalysisEnum);
-	fem_c=fem_dh;
-	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum,VertAnalysisEnum);
-	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum,StokesAnalysisEnum);
-	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum,HutterAnalysisEnum);
-	fem_sl=model->GetFormulation(SlopecomputeAnalysisEnum);
-	if(analysis_type==PrognosticAnalysisEnum){
-		fem_p=model->GetFormulation(PrognosticAnalysisEnum);
-	}
-	if(analysis_type==Prognostic2AnalysisEnum){
-		fem_p=model->GetFormulation(Prognostic2AnalysisEnum);
-	}
-	if(analysis_type==TransientAnalysisEnum){
-		fem_p=model->GetFormulation(PrognosticAnalysisEnum);
-	}
-	if(analysis_type==BalancedthicknessAnalysisEnum){
-		fem_p=model->GetFormulation(BalancedthicknessAnalysisEnum);
-	}
-	if(analysis_type==Balancedthickness2AnalysisEnum){
-		fem_p=model->GetFormulation(Balancedthickness2AnalysisEnum);
-	}
-	if(analysis_type==BalancedvelocitiesAnalysisEnum){
-		fem_p=model->GetFormulation(BalancedvelocitiesAnalysisEnum);
-	}
-	fem_t=model->GetFormulation(ThermalAnalysisEnum);
-
-	for(n=0;n<results->Size();n++){
-		result=(Result*)results->GetObjectByOffset(n);
-
-		if(strcmp(result->GetFieldName(),"u_g")==0){
-
-			/*Ok, are we dealing with velocities coming from MacAyeal, Pattyin, Hutter, on 2,3 dofs or
-			 *Stokes on 4 dofs: */
-			result->GetField(&u_g);
-			VecToMPISerial(&u_g_serial,u_g);
-
-			//2d results -> 2 dofs per node
-			if (dim==2){
-				/*ok, 2 dofs, on number of nodes: */
-				if(ismacayealpattyn){
-					fem_dh->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-					VecToMPISerial(&partition,fem_dh->partition->vector);
-					fem_dh->parameters->FindParam(&yts,YtsEnum);
-				}
-				else{
-					fem_dhu->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-					VecToMPISerial(&partition,fem_dhu->partition->vector);
-					fem_dhu->parameters->FindParam(&yts,YtsEnum);
-				}
-				vx=(double*)xmalloc(numberofnodes*sizeof(double));
-				vy=(double*)xmalloc(numberofnodes*sizeof(double));
-				vz=(double*)xmalloc(numberofnodes*sizeof(double)); 
-				vel=(double*)xmalloc(numberofnodes*sizeof(double)); 
-
-				for(i=0;i<numberofnodes;i++){
-					vx[i]=u_g_serial[2*(int)partition[i]+0]*yts;
-					vy[i]=u_g_serial[2*(int)partition[i]+1]*yts;
-					vz[i]=0;
-					vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
-				}
-			}
-			//3d results -> 3 or 4 (stokes) dofs per node
-			else{
-				if(!isstokes){
-					/*ok, 3 dofs, on number of nodes: */
-					if(ismacayealpattyn){
-						fem_dh->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-						VecToMPISerial(&partition,fem_dh->partition->vector);
-						fem_dh->parameters->FindParam(&yts,YtsEnum);
-					}
-					else{
-						fem_dhu->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-						VecToMPISerial(&partition,fem_dhu->partition->vector);
-						fem_dhu->parameters->FindParam(&yts,YtsEnum);
-					}
-					vx=(double*)xmalloc(numberofnodes*sizeof(double));
-					vy=(double*)xmalloc(numberofnodes*sizeof(double));
-					vz=(double*)xmalloc(numberofnodes*sizeof(double)); 
-					vel=(double*)xmalloc(numberofnodes*sizeof(double)); 
-
-					for(i=0;i<numberofnodes;i++){
-						vx[i]=u_g_serial[3*(int)partition[i]+0]*yts;
-						vy[i]=u_g_serial[3*(int)partition[i]+1]*yts;
-						vz[i]=u_g_serial[3*(int)partition[i]+2]*yts;
-						vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
-					}
-				}
-				else{
-					/* 4 dofs on number of nodes. discard pressure: */
-					fem_ds->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-					VecToMPISerial(&partition,fem_ds->partition->vector);
-					fem_ds->parameters->FindParam(&yts,YtsEnum);
-					vx=(double*)xmalloc(numberofnodes*sizeof(double));
-					vy=(double*)xmalloc(numberofnodes*sizeof(double));
-					vz=(double*)xmalloc(numberofnodes*sizeof(double));
-					vel=(double*)xmalloc(numberofnodes*sizeof(double));
-					for(i=0;i<numberofnodes;i++){
-						vx[i]=u_g_serial[4*(int)partition[i]+0]*yts;
-						vy[i]=u_g_serial[4*(int)partition[i]+1]*yts;
-						vz[i]=u_g_serial[4*(int)partition[i]+2]*yts;
-						vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
-					}
-				}
-			}
-
-			/*Ok, add vx,vy and vz to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"vx",vx,numberofnodes);
-			newresults->AddObject(newresult);
-
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"vy",vy,numberofnodes);
-			newresults->AddObject(newresult);
-
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"vz",vz,numberofnodes);
-			newresults->AddObject(newresult);
-
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"vel",vel,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&u_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&vx);
-			xfree((void**)&vy);
-			xfree((void**)&vz);
-			xfree((void**)&vel);
-			VecFree(&u_g);
-		}
-		else if(strcmp(result->GetFieldName(),"p_g")==0){
-			/*easy, p_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&p_g);
-			VecToMPISerial(&p_g_serial,p_g);
-
-			if(!isstokes){
-				if(ismacayealpattyn){
-					fem_dh->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-					VecToMPISerial(&partition,fem_dh->partition->vector);
-				}
-				else{
-					fem_dhu->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-					VecToMPISerial(&partition,fem_dhu->partition->vector);
-				}
-			}
-			else{
-				fem_ds->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-				VecToMPISerial(&partition,fem_ds->partition->vector);
-			}
-
-			pressure=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				pressure[i]=p_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure,vy and vz to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"pressure",pressure,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&p_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&pressure);
-			VecFree(&p_g);
-		}
-		else if(strcmp(result->GetFieldName(),"t_g")==0){
-			/*easy, t_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&t_g);
-			VecToMPISerial(&t_g_serial,t_g);
-			fem_t->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_t->partition->vector);
-
-			temperature=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				temperature[i]=t_g_serial[(int)partition[i]];
-			}
-
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"temperature",temperature,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&t_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&temperature);
-			VecFree(&t_g);
-		}
-		else if(strcmp(result->GetFieldName(),"grad_g")==0){
-			
-			/*easy, grad_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&grad_g);
-			VecToMPISerial(&grad_g_serial,grad_g);
-			fem_c->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_c->partition->vector);
-
-			gradient=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				gradient[i]=grad_g_serial[(int)partition[i]];
-			}
-
-			/*Ok, add gradient to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"gradient",gradient,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&grad_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&gradient);
-			VecFree(&grad_g);
-		}
-		else if(strcmp(result->GetFieldName(),"m_g")==0){
-			/*easy, m_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&m_g);
-			VecToMPISerial(&m_g_serial,m_g);
-			fem_t->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			fem_t->parameters->FindParam(&yts,YtsEnum);
-			VecToMPISerial(&partition,fem_t->partition->vector);
-
-			melting=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				melting[i]=m_g_serial[(int)partition[i]]*yts;
-			}
-
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"melting",melting,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&m_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&melting);
-			VecFree(&m_g);
-		}
-		else if(strcmp(result->GetFieldName(),"h_g")==0){
-			/*easy, h_g is of size numberofvertices, on 1 dof, just repartition: */
-			result->GetField(&h_g);
-			VecToMPISerial(&h_g_serial,h_g);
-			fem_p->parameters->FindParam(&numberofvertices,NumberOfVerticesEnum);
-			VecToMPISerial(&partition,fem_p->partition->vector);
-
-			thickness=(double*)xmalloc(numberofvertices*sizeof(double));
-
-			for(i=0;i<numberofvertices;i++){
-				thickness[i]=h_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"thickness",thickness,numberofvertices);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&h_g_serial);
-			xfree((void**)&thickness);
-			xfree((void**)&partition);
-			VecFree(&h_g);
-		}
-		else if(strcmp(result->GetFieldName(),"v_g")==0){
-			/*easy, v_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&v_g);
-			VecToMPISerial(&v_g_serial,v_g);
-			fem_p->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_p->partition->vector);
-
-			vel=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				vel[i]=v_g_serial[(int)partition[i]];
-			}
-
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"vel",vel,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&v_g_serial);
-			xfree((void**)&vel);
-			xfree((void**)&partition);
-			VecFree(&v_g);
-		}
-		else if(strcmp(result->GetFieldName(),"s_g")==0){
-			/*easy, s_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&s_g);
-			VecToMPISerial(&s_g_serial,s_g);
-			fem_p->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_p->partition->vector);
-
-			surface=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				surface[i]=s_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"surface",surface,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&s_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&surface);
-			VecFree(&s_g);
-		}
-		else if(strcmp(result->GetFieldName(),"sx_g")==0){
-			/*easy, s_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&sx_g);
-			VecToMPISerial(&sx_g_serial,sx_g);
-			fem_sl->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_sl->partition->vector);
-
-			slopex=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				slopex[i]=sx_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"slopex",slopex,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&sx_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&slopex);
-			VecFree(&sx_g);
-		}
-		else if(strcmp(result->GetFieldName(),"sy_g")==0){
-			/*easy, s_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&sy_g);
-			VecToMPISerial(&sy_g_serial,sy_g);
-			fem_sl->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_sl->partition->vector);
-
-			slopey=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				slopey[i]=sy_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"slopey",slopey,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&sy_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&slopey);
-			VecFree(&sy_g);
-		}
-		else if(strcmp(result->GetFieldName(),"b_g")==0){
-			/*easy, b_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&b_g);
-			VecToMPISerial(&b_g_serial,b_g);
-			fem_p->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_p->partition->vector);
-
-			bed=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				bed[i]=b_g_serial[(int)partition[i]];
-			}
-			
-			/*Ok, add pressure to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"bed",bed,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&b_g_serial);
-			xfree((void**)&partition);
-			xfree((void**)&bed);
-			VecFree(&b_g);
-		}
-		else if(strcmp(result->GetFieldName(),"param_g")==0){
-			/*easy, param_g is of size numberofnodes, on 1 dof, just repartition: */
-			result->GetField(&param_g);
-			fem_dh->parameters->FindParam(&numberofnodes,NumberOfNodesEnum);
-			VecToMPISerial(&partition,fem_dh->partition->vector);
-
-			parameter=(double*)xmalloc(numberofnodes*sizeof(double));
-
-			for(i=0;i<numberofnodes;i++){
-				parameter[i]=param_g[(int)partition[i]];
-			}
-			
-			/*Ok, add parameter to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"parameter",parameter,numberofnodes);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&partition);
-			xfree((void**)&param_g);
-			xfree((void**)&parameter);
-		}
-		else if(strcmp(result->GetFieldName(),"riftproperties")==0){
-			result->GetField(&riftproperties);
-			fem_dh->parameters->FindParam(&numrifts,NumRiftsEnum);
-			VecToMPISerial(&riftproperties_serial,riftproperties);
-			
-			/*Ok, add parameter to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"riftproperties",riftproperties_serial,numrifts);
-			newresults->AddObject(newresult);
-			xfree((void**)&riftproperties);
-
-		}
-		else if(strcmp(result->GetFieldName(),"sigma_zz")==0){
-			/*easy, param_g is of size numberofelements, on 1 dof, just repartition: */
-			fem_ds->parameters->FindParam(&numberofelements,NumberOfElementsEnum);
-			result->GetField(&sigma_zz);
-			VecToMPISerial(&sigma_zz_serial,sigma_zz);
-
-			/*Ok, add parameter to newresults: */
-			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"sigma_zz",sigma_zz_serial,numberofelements);
-			newresults->AddObject(newresult);
-
-			/*do some cleanup: */
-			xfree((void**)&sigma_zz_serial);
-
-		}
-		else{
-			/*Just copy the result into the new results dataset: */
-			newresults->AddObject(result->copy());
-		}
-	}
-
-	/*Assign output pointers:*/
-	*pnewresults=newresults;
-}
Index: /issm/trunk/src/c/solutions/balancedthickness.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedthickness.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedthickness.cpp	(revision 3938)
@@ -33,8 +33,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
-	Result*  result=NULL;
-
+	Results* results=NULL;
 	Param*   param=NULL;
 
@@ -105,9 +102,6 @@
 	}
 
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,BalancedthicknessAnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -117,5 +111,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/balancedthickness2.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedthickness2.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedthickness2.cpp	(revision 3938)
@@ -33,6 +33,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
+	Results* results=NULL;
 	Result*  result=NULL;
 
@@ -105,9 +104,6 @@
 	}
 
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,Balancedthickness2AnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -117,5 +113,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/balancedthickness2_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedthickness2_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedthickness2_core.cpp	(revision 3938)
@@ -11,11 +11,10 @@
 #include "../modules/modules.h"
 
-DataSet* balancedthickness2_core(Model* model){
+Results* balancedthickness2_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	Result* result=NULL;
-	DataSet* results=NULL;
+	Results* results=NULL;
 
 	/*intermediary: */
@@ -37,5 +36,5 @@
 
 	//initialize results:
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	fem_p=model->GetFormulation(Balancedthickness2AnalysisEnum);
@@ -68,10 +67,8 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"h_g",h_g);
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"h_g",h_g));
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type","balancedthickness2");
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(Balancedthickness2AnalysisEnum)));
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/balancedthickness_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedthickness_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedthickness_core.cpp	(revision 3938)
@@ -11,11 +11,10 @@
 #include "../modules/modules.h"
 
-DataSet* balancedthickness_core(Model* model){
+Results* balancedthickness_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	Result* result=NULL;
-	DataSet* results=NULL;
+	Results* results=NULL;
 
 	/*intermediary: */
@@ -35,5 +34,5 @@
 
 	//initialize results:
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem model: */
@@ -58,10 +57,8 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"h_g",h_g);
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"h_g",h_g));
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type","balancedthickness");
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(BalancedthicknessAnalysisEnum)));
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/balancedvelocities.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedvelocities.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedvelocities.cpp	(revision 3938)
@@ -32,6 +32,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
+	Results* results=NULL;
 	Result*  result=NULL;
 	Param*   param=NULL;
@@ -103,9 +102,6 @@
 	}
 
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,BalancedvelocitiesAnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -115,5 +111,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/balancedvelocities_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/balancedvelocities_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/balancedvelocities_core.cpp	(revision 3938)
@@ -10,11 +10,10 @@
 #include "../modules/modules.h"
 
-DataSet* balancedvelocities_core(Model* model){
+Results* balancedvelocities_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	Result* result=NULL;
-	DataSet* results=NULL;
+	Results* results=NULL;
 
 	/*intermediary: */
@@ -34,5 +33,5 @@
 
 	//initialize results:
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem model: */
@@ -57,10 +56,8 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"v_g",v_g);
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"v_g",v_g));
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type","balancedvelocities");
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(BalancedvelocitiesAnalysisEnum)));
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/control_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/control_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/control_core.cpp	(revision 3938)
@@ -7,5 +7,5 @@
 #include "../EnumDefinitions/EnumDefinitions.h"
 
-DataSet* control_core(Model* model){
+Results* control_core(Model* model){
 
 	extern int my_rank;
@@ -15,11 +15,10 @@
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*Intermediary: */
-	DataSet* diagnostic_results=NULL;
-	DataSet* gradjcompute_results=NULL;
-	DataSet* steadystate_results=NULL;
+	Results* diagnostic_results=NULL;
+	Results* gradjcompute_results=NULL;
+	Results* steadystate_results=NULL;
 	Vec     u_g=NULL;
 	Vec     t_g=NULL;
@@ -57,5 +56,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*Process models*/
@@ -110,9 +109,6 @@
 			
 			/*Plug results into output dataset: */
-			result=new Result(results->Size()+1,0,1,"grad_g",grad_g);
-			results->AddObject(result);
-	
-			result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(analysis_type));
-			results->AddObject(result);
+			results->AddObject(new Result(results->Size()+1,0,1,"grad_g",grad_g));
+			results->AddObject(new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(analysis_type)));
 	
 			/*Free ressources: */
@@ -219,23 +215,15 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"u_g",u_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"param_g",param_g,numberofnodes);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"J",J,nsteps);
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"u_g",u_g));
+	results->AddObject(new Result(results->Size()+1,0,1,"param_g",param_g,numberofnodes));
+	results->AddObject(new Result(results->Size()+1,0,1,"J",J,nsteps));
 	if (control_steady){
-		result=new Result(results->Size()+1,0,1,"t_g",t_g);
-		results->AddObject(result);
-		result=new Result(results->Size()+1,0,1,"m_g",m_g);
-		results->AddObject(result);
+		results->AddObject(new Result(results->Size()+1,0,1,"t_g",t_g));
+		results->AddObject(new Result(results->Size()+1,0,1,"m_g",m_g));
 	}
 	
 	/*Add analysis_type and control_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(analysis_type));
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"control_type",EnumAsString(control_type));
-	results->AddObject(result);
-
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(analysis_type)));
+	results->AddObject(new StringResult(results->Size()+1,ControlTypeEnum,0,1,EnumAsString(control_type)));
 
 	/*Free ressources: */
Index: /issm/trunk/src/c/solutions/diagnostic.cpp
===================================================================
--- /issm/trunk/src/c/solutions/diagnostic.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/diagnostic.cpp	(revision 3938)
@@ -31,7 +31,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processed_results=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 	
 	bool waitonlock=false;
@@ -100,6 +98,4 @@
 			MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-			_printf_("process results:\n");
-			ProcessResults(&processed_results,results,model,DiagnosticAnalysisEnum);
 		}
 		else{
@@ -110,10 +106,8 @@
 			MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-			_printf_("process results:\n");
-			ProcessResults(&processed_results,results,model,ControlAnalysisEnum);
 		}
 
 		_printf_("write results to disk:\n");
-		OutputResults(processed_results,outputfilename);
+		OutputResults(results,outputfilename);
 	}
 	else{
@@ -138,5 +132,4 @@
 	delete model;
 	delete results;
-	delete processed_results;
 
 	/*Get finish time and close*/
Index: /issm/trunk/src/c/solutions/diagnostic_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/diagnostic_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/diagnostic_core.cpp	(revision 3938)
@@ -11,5 +11,5 @@
 #include "../include/include.h"
 
-DataSet* diagnostic_core(Model* model){
+Results* diagnostic_core(Model* model){
 
 	extern int my_rank;
@@ -24,6 +24,6 @@
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
+	Result*  result=NULL;
 
 	/*solutions: */
@@ -68,5 +68,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	//first recover parameters common to all solutions
@@ -180,16 +180,46 @@
 	
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"u_g",ug);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"p_g",pg);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(DiagnosticAnalysisEnum));
-	results->AddObject(result);
+	if(dim==2){
+		if(ismacayealpattyn){
+			InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,VxEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,VyEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,PressureEnum,results->Size()+1,0,1); results->AddObject(result);
+		}
+		else{
+			InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,VxEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,VyEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,PressureEnum,results->Size()+1,0,1); results->AddObject(result);
+		}
+	}
+	else{
+		if(isstokes){
+			InputToResultx(&result,fem_ds->elements,fem_ds->nodes,fem_ds->vertices, fem_ds->loads, fem_ds->materials,fem_ds->parameters,VxEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_ds->elements,fem_ds->nodes,fem_ds->vertices, fem_ds->loads, fem_ds->materials,fem_ds->parameters,VyEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_ds->elements,fem_ds->nodes,fem_ds->vertices, fem_ds->loads, fem_ds->materials,fem_ds->parameters,VzEnum,results->Size()+1,0,1); results->AddObject(result);
+			InputToResultx(&result,fem_ds->elements,fem_ds->nodes,fem_ds->vertices, fem_ds->loads, fem_ds->materials,fem_ds->parameters,PressureEnum,results->Size()+1,0,1); results->AddObject(result);
+		}
+		else{
+			if(ismacayealpattyn){
+				InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,VxEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,VyEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,VzEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dh->elements,fem_dh->nodes,fem_dh->vertices, fem_dh->loads, fem_dh->materials,fem_dh->parameters,PressureEnum,results->Size()+1,0,1); results->AddObject(result);
+			}
+			else{
+				InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,VxEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,VyEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,VzEnum,results->Size()+1,0,1); results->AddObject(result);
+				InputToResultx(&result,fem_dhu->elements,fem_dhu->nodes,fem_dhu->vertices, fem_dhu->loads, fem_dhu->materials,fem_dhu->parameters,PressureEnum,results->Size()+1,0,1); results->AddObject(result);
+			}
+
+		}
+	}
+	
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(DiagnosticAnalysisEnum)));
 
 	/*output if we have rifts: */
 	if(numrifts){
 		OutputRiftsx( &riftproperties,fem_dh->loads,numrifts);
-		result=new Result(results->Size()+1,0,1,"riftproperties",riftproperties);
-		results->AddObject(result);
+		results->AddObject(new Result(results->Size()+1,0,1,"riftproperties",riftproperties));
 	}
 
Index: /issm/trunk/src/c/solutions/gradjcompute_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/gradjcompute_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/gradjcompute_core.cpp	(revision 3938)
@@ -13,10 +13,10 @@
 #endif
 
-DataSet* gradjcompute_core(Model* model){
+Results* gradjcompute_core(Model* model){
 	
 	
 	/*intermediary: */
 	FemModel* femmodel=NULL;
-	DataSet* diagnostic_results=NULL;
+	Results* diagnostic_results=NULL;
 	int analysis_type;
 	int sub_analysis_type;
@@ -45,6 +45,5 @@
 	
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*flags: */
@@ -54,5 +53,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 	
 	/*some parameters:*/
@@ -118,8 +117,6 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"grad_g",grad_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(GradientAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"grad_g",grad_g));
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(GradientAnalysisEnum)));
 	
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/objectivefunctionC.cpp
===================================================================
--- /issm/trunk/src/c/solutions/objectivefunctionC.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/objectivefunctionC.cpp	(revision 3938)
@@ -23,5 +23,5 @@
 	Model*    model=NULL;
 	FemModel* femmodel=NULL;
-	DataSet* diagnostic_results=NULL;
+	Results* diagnostic_results=NULL;
 	double* param_g=NULL;
 	double* grad_g=NULL;
@@ -51,5 +51,5 @@
 	int     dt=0;
 	int     isstokes=0;
-	DataSet* results_steadystate=NULL;
+	Results* results_steadystate=NULL;
 	int dofs01[2]={0,1};
 	double* dofset=NULL;
Index: /issm/trunk/src/c/solutions/prognostic.cpp
===================================================================
--- /issm/trunk/src/c/solutions/prognostic.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/prognostic.cpp	(revision 3938)
@@ -32,7 +32,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 
 	Param*   param=NULL;
@@ -103,9 +101,6 @@
 
 		
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,PrognosticAnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -115,5 +110,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/prognostic2.cpp
===================================================================
--- /issm/trunk/src/c/solutions/prognostic2.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/prognostic2.cpp	(revision 3938)
@@ -32,7 +32,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 
 	Param*   param=NULL;
@@ -103,9 +101,6 @@
 	}
 
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,Prognostic2AnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -115,5 +110,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/prognostic2_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/prognostic2_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/prognostic2_core.cpp	(revision 3938)
@@ -10,11 +10,10 @@
 #include "../modules/modules.h"
 
-DataSet* prognostic2_core(Model* model){
+Results* prognostic2_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	Result* result=NULL;
-	DataSet* results=NULL;
+	Results* results=NULL;
 
 	/*intermediary: */
@@ -36,5 +35,5 @@
 
 	//initialize results:
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem model: */
@@ -60,6 +59,5 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"h_g",h_g);
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"h_g",h_g));
 
 	/*Free ressources:*/
@@ -69,6 +67,5 @@
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(Prognostic2AnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(Prognostic2AnalysisEnum)));
 	
 	/*return: */
Index: /issm/trunk/src/c/solutions/prognostic_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/prognostic_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/prognostic_core.cpp	(revision 3938)
@@ -10,11 +10,11 @@
 #include "../modules/modules.h"
 
-DataSet* prognostic_core(Model* model){
+Results* prognostic_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
+	Result*  result=NULL;
 
 	/*solutions: */
@@ -28,5 +28,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem model: */
@@ -54,6 +54,5 @@
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(PrognosticAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(PrognosticAnalysisEnum)));
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/slopecompute.cpp
===================================================================
--- /issm/trunk/src/c/solutions/slopecompute.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/slopecompute.cpp	(revision 3938)
@@ -14,4 +14,5 @@
 #include "../EnumDefinitions/EnumDefinitions.h"
 #include "../include/include.h"
+#include "../modules/modules.h"
 #include "./solutions.h"
 
@@ -30,7 +31,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processedresults=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 
 	Param*   param=NULL;
@@ -84,9 +83,6 @@
 	MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-	_printf_("process results:\n");
-	ProcessResults(&processedresults,results,model,SlopecomputeAnalysisEnum);
-	
 	_printf_("write results to disk:\n");
-	OutputResults(processedresults,outputfilename);
+	OutputResults(results,outputfilename);
 
 	if (waitonlock>0){
@@ -96,5 +92,4 @@
 
 	/*Free ressources:*/
-	delete processedresults;
 	delete results;
 	delete model;
Index: /issm/trunk/src/c/solutions/slopecompute_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/slopecompute_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/slopecompute_core.cpp	(revision 3938)
@@ -10,11 +10,10 @@
 #include "../modules/modules.h"
 
-DataSet* slopecompute_core(Model* model){
+Results* slopecompute_core(Model* model){
 
 	extern int my_rank;
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*solutions: */
@@ -32,5 +31,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem model: */
@@ -51,10 +50,7 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"sx_g",sx_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"sy_g",sy_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(SlopecomputeAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"sx_g",sx_g));
+	results->AddObject(new Result(results->Size()+1,0,1,"sy_g",sy_g));
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(SlopecomputeAnalysisEnum)));
 
 
Index: /issm/trunk/src/c/solutions/solutions.h
===================================================================
--- /issm/trunk/src/c/solutions/solutions.h	(revision 3937)
+++ /issm/trunk/src/c/solutions/solutions.h	(revision 3938)
@@ -13,18 +13,18 @@
 
 /*cores: */
-DataSet* gradjcompute_core(Model* model);
-DataSet* diagnostic_core(Model* model);
-DataSet* prognostic_core(Model* model);
-DataSet* prognostic2_core(Model* model);
-DataSet* balancedthickness_core(Model* model);
-DataSet* balancedthickness2_core(Model* model);
-DataSet* balancedvelocities_core(Model* model);
-DataSet* slopecompute_core(Model* model);
-DataSet* control_core(Model* model);
-DataSet* steadystate_core(Model* model);
-DataSet* transient_core(Model* model);
-DataSet* transient_core_2d(Model* model);
-DataSet* transient_core_3d(Model* model);
-DataSet* thermal_core(Model* model);
+Results* gradjcompute_core(Model* model);
+Results* diagnostic_core(Model* model);
+Results* prognostic_core(Model* model);
+Results* prognostic2_core(Model* model);
+Results* balancedthickness_core(Model* model);
+Results* balancedthickness2_core(Model* model);
+Results* balancedvelocities_core(Model* model);
+Results* slopecompute_core(Model* model);
+Results* control_core(Model* model);
+Results* steadystate_core(Model* model);
+Results* transient_core(Model* model);
+Results* transient_core_2d(Model* model);
+Results* transient_core_3d(Model* model);
+Results* thermal_core(Model* model);
 
 /*computational cores: */
@@ -51,5 +51,4 @@
 
 //int ParameterUpdate(double* search_vector,int step, WorkspaceParams* workspaceparams,BatchParams* batchparams);
-void OutputResults(DataSet* results,char* filename);
 void WriteLockFile(char* filename);
 
@@ -59,5 +58,4 @@
 void CreateFemModel(FemModel* femmodel,ConstDataHandle MODEL,int analysis_type,int sub_analysis_type);
 //int BatchDebug(Mat* Kgg,Vec* pg,FemModel* femmodel,char* filename);
-void ProcessResults(DataSet** pnewresults, DataSet* results,Model* model,int analysis_type);
 
 #endif
Index: /issm/trunk/src/c/solutions/steadystate.cpp
===================================================================
--- /issm/trunk/src/c/solutions/steadystate.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/steadystate.cpp	(revision 3938)
@@ -35,7 +35,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processed_results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 	
 	bool waitonlock=false;
@@ -118,6 +116,4 @@
 			MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-			_printf_("process results:\n");
-			ProcessResults(&processed_results,results,model,SteadystateAnalysisEnum);
 		}
 		else{
@@ -135,10 +131,8 @@
 			MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-			_printf_("process results:\n");
-			ProcessResults(&processed_results,results,model,ControlAnalysisEnum);
 		}
 
 		_printf_("write results to disk:\n");
-		OutputResults(processed_results,outputfilename);
+		OutputResults(results,outputfilename);
 	}
 	else{
@@ -166,5 +160,4 @@
 	delete model;
 	delete results;
-	delete processed_results;
 
 	/*Get finish time and close*/
Index: /issm/trunk/src/c/solutions/steadystate_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/steadystate_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/steadystate_core.cpp	(revision 3938)
@@ -10,5 +10,5 @@
 #include "../modules/modules.h"
 
-DataSet* steadystate_core(Model* model){
+Results* steadystate_core(Model* model){
 
 	extern int my_rank;
@@ -24,8 +24,7 @@
 
 	/*output: */
-	Result* result=NULL;
-	DataSet* results=NULL;
-	DataSet* results_thermal=NULL;
-	DataSet* results_diagnostic=NULL;
+	Results* results=NULL;
+	Results* results_thermal=NULL;
+	Results* results_diagnostic=NULL;
 
 	/*solutions: */
@@ -128,14 +127,9 @@
 
 	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"u_g",u_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"p_g",p_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"t_g",t_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"m_g",m_g);
-	results->AddObject(result);
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(SteadyAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new Result(results->Size()+1,0,1,"u_g",u_g));
+	results->AddObject(new Result(results->Size()+1,0,1,"p_g",p_g));
+	results->AddObject(new Result(results->Size()+1,0,1,"t_g",t_g));
+	results->AddObject(new Result(results->Size()+1,0,1,"m_g",m_g));
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(SteadyAnalysisEnum)));
 
 
Index: /issm/trunk/src/c/solutions/thermal.cpp
===================================================================
--- /issm/trunk/src/c/solutions/thermal.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/thermal.cpp	(revision 3938)
@@ -34,7 +34,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processed_results=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 	
 	Param*           param=NULL;
@@ -92,9 +90,6 @@
 		MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 
-		_printf_("process results:\n");
-		ProcessResults(&processed_results,results,model,ThermalAnalysisEnum);
-		
 		_printf_("write results to disk:\n");
-		OutputResults(processed_results,outputfilename);
+		OutputResults(results,outputfilename);
 	}
 	else{
@@ -119,5 +114,4 @@
 	delete model;
 	delete results;
-	delete processed_results;
 
 	/*Get finish time and close*/
Index: /issm/trunk/src/c/solutions/thermal_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/thermal_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/thermal_core.cpp	(revision 3938)
@@ -10,5 +10,5 @@
 #include "../modules/modules.h"
 
-DataSet* thermal_core(Model* model){
+Results* thermal_core(Model* model){
 
 	extern int my_rank;
@@ -20,6 +20,5 @@
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*solutions vectors: */
@@ -46,5 +45,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem models: */
@@ -101,9 +100,6 @@
 	/*Plug results into output dataset: */
 	if(dt==0){
-		result=new Result(results->Size()+1,0,1,"t_g",t_g[0]);
-		results->AddObject(result);
-		
-		result=new Result(results->Size()+1,0,1,"m_g",m_g[0]);
-		results->AddObject(result);
+		results->AddObject(new Result(results->Size()+1,0,1,"t_g",t_g[0]));
+		results->AddObject(new Result(results->Size()+1,0,1,"m_g",m_g[0]));
 
 		/*free ressource*/
@@ -113,9 +109,6 @@
 	else{
 		for(i=0;i<nsteps;i++){
-			result=new Result(results->Size()+1,time[i],i+1,"t_g",t_g[i]);
-			results->AddObject(result);
-
-			result=new Result(results->Size()+1,time[i],i+1,"m_g",m_g[i]);
-			results->AddObject(result);
+			results->AddObject(new Result(results->Size()+1,time[i],i+1,"t_g",t_g[i]));
+			results->AddObject(new Result(results->Size()+1,time[i],i+1,"m_g",m_g[i]));
 
 			/*free ressource*/
@@ -125,6 +118,5 @@
 	}
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(ThermalAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(ThermalAnalysisEnum)));
 
 	/*free ressource*/
Index: /issm/trunk/src/c/solutions/transient.cpp
===================================================================
--- /issm/trunk/src/c/solutions/transient.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/transient.cpp	(revision 3938)
@@ -33,7 +33,5 @@
 
 	/*Results: */
-	DataSet* results=NULL;
-	DataSet* processed_results=NULL;
-	Result*  result=NULL;
+	Results* results=NULL;
 	
 	Param*  param=NULL;
@@ -113,9 +111,6 @@
 		MPI_Barrier(MPI_COMM_WORLD); finish_core=MPI_Wtime( );
 	
-		_printf_("process results:\n");
-		ProcessResults(&processed_results,results,model,TransientAnalysisEnum);
-		
 		_printf_("write results to disk:\n");
-		OutputResults(processed_results,outputfilename);
+		OutputResults(results,outputfilename);
 	}
 	else{
@@ -139,5 +134,4 @@
 	/*Free ressources:*/
 	delete results;
-	delete processed_results;
 	delete model;
 
Index: /issm/trunk/src/c/solutions/transient_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/transient_core.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/transient_core.cpp	(revision 3938)
@@ -10,8 +10,8 @@
 #include "../modules/modules.h"
 
-DataSet* transient_core(Model* model){
+Results* transient_core(Model* model){
 
 	int dim=-1;
-	DataSet* results=NULL;
+	Results* results=NULL;
 
 	//first recover parameters common to all solutions
Index: /issm/trunk/src/c/solutions/transient_core_2d.cpp
===================================================================
--- /issm/trunk/src/c/solutions/transient_core_2d.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/transient_core_2d.cpp	(revision 3938)
@@ -10,5 +10,5 @@
 #include "../modules/modules.h"
 
-DataSet* transient_core_2d(Model* model){
+Results* transient_core_2d(Model* model){
 
 	extern int my_rank;
@@ -23,6 +23,5 @@
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*solutions: */
@@ -45,6 +44,6 @@
 	double finaltime;
 	double dt;
-	DataSet* diagnostic_results=NULL;
-	DataSet* prognostic_results=NULL;
+	Results* diagnostic_results=NULL;
+	Results* prognostic_results=NULL;
 
 
@@ -60,5 +59,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem models: */
@@ -121,9 +120,9 @@
 
 		//plug into results.
-		result=new Result(results->Size()+1,time,step,"u_g",u_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"p_g",p_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"h_g",h_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"s_g",s_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"b_g",b_g); results->AddObject(result);
+		results->AddObject(new Result(results->Size()+1,time,step,"u_g",u_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"p_g",p_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"h_g",h_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"s_g",s_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"b_g",b_g)); 
 
 		//update inputs
@@ -139,6 +138,5 @@
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(TransientAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(TransientAnalysisEnum)));
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/solutions/transient_core_3d.cpp
===================================================================
--- /issm/trunk/src/c/solutions/transient_core_3d.cpp	(revision 3937)
+++ /issm/trunk/src/c/solutions/transient_core_3d.cpp	(revision 3938)
@@ -10,5 +10,5 @@
 #include "../modules/modules.h"
 
-DataSet* transient_core_3d(Model* model){
+Results* transient_core_3d(Model* model){
 
 	extern int my_rank;
@@ -25,6 +25,5 @@
 
 	/*output: */
-	DataSet* results=NULL;
-	Result* result=NULL;
+	Results* results=NULL;
 
 	/*solutions: */
@@ -50,6 +49,6 @@
 	double finaltime;
 	double dt;
-	DataSet* diagnostic_results=NULL;
-	DataSet* prognostic_results=NULL;
+	Results* diagnostic_results=NULL;
+	Results* prognostic_results=NULL;
 
 
@@ -65,5 +64,5 @@
 
 	//initialize results
-	results=new DataSet(ResultsEnum);
+	results=new Results();
 
 	/*recover fem models: */
@@ -149,11 +148,11 @@
 
 		//plug into results.
-		result=new Result(results->Size()+1,time,step,"u_g",u_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"p_g",p_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"h_g",h_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"s_g",s_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"b_g",b_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"t_g",t_g); results->AddObject(result);
-		result=new Result(results->Size()+1,time,step,"m_g",m_g); results->AddObject(result);
+		results->AddObject(new Result(results->Size()+1,time,step,"u_g",u_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"p_g",p_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"h_g",h_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"s_g",s_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"b_g",b_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"t_g",t_g)); 
+		results->AddObject(new Result(results->Size()+1,time,step,"m_g",m_g)); 
 
 		//update inputs
@@ -175,12 +174,9 @@
 			_printf_("%s","      saving temporary results...");
 
-			DataSet* processed_results=NULL;
 			char*    outputfilename=NULL;
 
 			model->FindParam(&outputfilename,OutputFileNameEnum);
-			ProcessResults(&processed_results,results,model,TransientAnalysisEnum);
-			OutputResults(processed_results,outputfilename);
-
-			delete processed_results;
+			OutputResults(results,outputfilename);
+
 			xfree((void**)&outputfilename);
 
@@ -190,6 +186,5 @@
 
 	/*Add analysis_type to results: */
-	result=new Result(results->Size()+1,0,1,"analysis_type",EnumAsString(TransientAnalysisEnum));
-	results->AddObject(result);
+	results->AddObject(new StringResult(results->Size()+1,AnalysisTypeEnum,0,1,EnumAsString(TransientAnalysisEnum)));
 
 
