Index: /issm/trunk/src/c/Container/Elements.cpp
===================================================================
--- /issm/trunk/src/c/Container/Elements.cpp	(revision 8966)
+++ /issm/trunk/src/c/Container/Elements.cpp	(revision 8967)
@@ -220,2 +220,13 @@
 }
 /*}}}*/
+/*FUNCTION Elements::InputCopy{{{1*/
+void Elements::InputDuplicate(int input_enum,int output_enum){
+	
+	int i;
+
+	for(i=0;i<this->Size();i++){
+		Element* element=(Element*)this->GetObjectByOffset(i);
+		element->InputDuplicate(input_enum,output_enum);
+	}
+}
+/*}}}*/
Index: /issm/trunk/src/c/Container/Elements.h
===================================================================
--- /issm/trunk/src/c/Container/Elements.h	(revision 8966)
+++ /issm/trunk/src/c/Container/Elements.h	(revision 8967)
@@ -34,4 +34,5 @@
 		Patch* ResultsToPatch(void);
 		int   NumberOfElements(void);
+		void InputDuplicate(int input_enum,int output_enum);
 		/*}}}*/
 
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 8966)
+++ /issm/trunk/src/c/Makefile.am	(revision 8967)
@@ -564,4 +564,6 @@
 					./modules/Gradjx/Gradjx.h\
 					./modules/Gradjx/Gradjx.cpp\
+					./modules/IoModelToInputsx/IoModelToInputsx.h\
+					./modules/IoModelToInputsx/IoModelToInputsx.cpp\
 					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h\
 					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp\
@@ -1234,4 +1236,6 @@
 					./modules/Gradjx/Gradjx.h\
 					./modules/Gradjx/Gradjx.cpp\
+					./modules/IoModelToInputsx/IoModelToInputsx.h\
+					./modules/IoModelToInputsx/IoModelToInputsx.cpp\
 					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h\
 					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp\
Index: /issm/trunk/src/c/io/Disk/IoModelFetchData.cpp
===================================================================
--- /issm/trunk/src/c/io/Disk/IoModelFetchData.cpp	(revision 8966)
+++ /issm/trunk/src/c/io/Disk/IoModelFetchData.cpp	(revision 8967)
@@ -13,54 +13,89 @@
 #include "./diskio.h"
 
-/*FUNCTION IoModelFetchData(double** pmatrix,int* pM,int* pN,FILE* model_handle,int data_enum){{{1*/
-void  IoModelFetchData(double** pmatrix,int* pM,int* pN,FILE* model_handle,int data_enum){
-
-	extern int my_rank;
-	extern int num_procs;
-
-	/*output: */
-	int M,N;
-	double* matrix=NULL;
-	
-	FILE* fid=NULL;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
-	
-	/*Now fetch: */
-
-	/*We have to read a matrix from disk. First read the dimensions of the matrix, then the whole matrix: */
-	/*numberofelements: */
-	if(my_rank==0){  
-		if(fread(&M,sizeof(int),1,fid)!=1) _error_("could not read number of rows for matrix ");
-	}
-
-	MPI_Bcast(&M,1,MPI_INT,0,MPI_COMM_WORLD); 
-
-	if(my_rank==0){  
-		if(fread(&N,sizeof(int),1,fid)!=1) _error_("could not read number of columns for matrix ");
-	}
-	MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD); 
-
-	/*Now allocate matrix: */
-	if(M*N){
-		matrix=(double*)xmalloc(M*N*sizeof(double));
-
-		/*Read matrix on node 0, then broadcast: */
-		if(my_rank==0){  
-			if(fread(matrix,M*N*sizeof(double),1,fid)!=1) _error_("could not read matrix ");
-		}
-		
-		MPI_Bcast(matrix,M*N,MPI_DOUBLE,0,MPI_COMM_WORLD); 
-	}
-
-	/*Assign output pointers: */
-	*pmatrix=matrix;
-	if (pM)*pM=M;
-	if (pN)*pN=N;
-
-}
-/*}}}*/
-/*FUNCTION IoModelFetchData(char** pstring,FILE* model_handle,int data_enum){{{1*/
+/*FUNCTION IoModelFetchData(bool*     pbool,FILE* model_handle,int data_enum){{{1*/
+void  IoModelFetchData(bool* pboolean,FILE* model_handle,int data_enum){
+
+	extern int my_rank;
+	extern int num_procs;
+	FILE* fid=NULL;
+
+	/*output: */
+	bool  boolean;
+	int   code;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=1)_error_("%s%s","IoModelFetchData expecting a boolean for enum ",EnumToStringx(data_enum));
+	
+	/*We have to read a boolean from disk. */
+	if(my_rank==0){  
+		if(fread(&boolean,sizeof(bool),1,fid)!=1) _error_(" could not read boolean ");
+	}
+
+	MPI_Bcast(&boolean,1,MPI_BYTE,0,MPI_COMM_WORLD); 
+
+	/*Assign output pointers: */
+	*pboolean=boolean;
+
+}
+/*}}}*/
+/*FUNCTION IoModelFetchData(int*      pinteger,FILE* model_handle,int data_enum){{{1*/
+void  IoModelFetchData(int* pinteger,FILE* model_handle,int data_enum){
+
+	extern int my_rank;
+	extern int num_procs;
+	FILE* fid=NULL;
+
+	/*output: */
+	int   integer;
+	int   code;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=2)_error_("%s%s","IoModelFetchData expecting an integer for enum ",EnumToStringx(data_enum));
+	
+	/*We have to read a integer from disk. First read the dimensions of the integer, then the integer: */
+	if(my_rank==0){  
+		if(fread(&integer,sizeof(int),1,fid)!=1) _error_(" could not read integer ");
+	}
+
+	MPI_Bcast(&integer,1,MPI_INT,0,MPI_COMM_WORLD); 
+
+	/*Assign output pointers: */
+	*pinteger=integer;
+
+}
+/*}}}*/
+/*FUNCTION IoModelFetchData(double*   pscalar,FILE* model_handle,int data_enum){{{1*/
+void  IoModelFetchData(double* pscalar,FILE* model_handle,int data_enum){
+
+
+	extern int my_rank;
+	extern int num_procs;
+	FILE* fid=NULL;
+
+	/*output: */
+	double   scalar;
+	int      code;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=3)_error_("%s%s","IoModelFetchData expecting a double for enum ",EnumToStringx(data_enum));
+	
+	/*We have to read a scalar from disk. First read the dimensions of the scalar, then the scalar: */
+	if(my_rank==0){
+		if(fread(&scalar,sizeof(double),1,fid)!=1)_error_(" could not read scalar ");
+	}
+	MPI_Bcast(&scalar,1,MPI_DOUBLE,0,MPI_COMM_WORLD); 
+
+	/*Assign output pointers: */
+	*pscalar=scalar;
+		 
+}
+/*}}}*/
+/*FUNCTION IoModelFetchData(char**    pstring,FILE* model_handle,int data_enum){{{1*/
 void  IoModelFetchData(char** pstring,FILE* model_handle,int data_enum){
 
@@ -72,7 +107,10 @@
 	char* string=NULL;
 	int   string_size;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
+	int code=0;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=4)_error_("%s%s","IoModelFetchData expecting a string for enum ",EnumToStringx(data_enum));
 	
 	/*Now fetch: */
@@ -106,5 +144,58 @@
 }
 /*}}}*/
-/*FUNCTION IoModelFetchData(char*** pstrings,int* pnumstrings,FILE* model_handle,int data_enum){{{1*/
+/*FUNCTION IoModelFetchData(double**  pdoublematrix,int* pM,int* pN,FILE* model_handle,int data_enum){{{1*/
+void  IoModelFetchData(double** pmatrix,int* pM,int* pN,FILE* model_handle,int data_enum){
+
+	extern int my_rank;
+	extern int num_procs;
+
+	/*output: */
+	int M,N;
+	double* matrix=NULL;
+	int code=0;
+	int vector_type=0;
+	
+	FILE* fid=NULL;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,&vector_type,model_handle,data_enum);
+
+	if((code!=5) && (code!=6) && (code!=7))_error_("%s%s","IoModelFetchData expecting a double, integer or boolean matrix for enum ",EnumToStringx(data_enum));
+	
+	/*Now fetch: */
+
+	/*We have to read a matrix from disk. First read the dimensions of the matrix, then the whole matrix: */
+	/*numberofelements: */
+	if(my_rank==0){  
+		if(fread(&M,sizeof(int),1,fid)!=1) _error_("could not read number of rows for matrix ");
+	}
+
+	MPI_Bcast(&M,1,MPI_INT,0,MPI_COMM_WORLD); 
+
+	if(my_rank==0){  
+		if(fread(&N,sizeof(int),1,fid)!=1) _error_("could not read number of columns for matrix ");
+	}
+	MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD); 
+
+	/*Now allocate matrix: */
+	if(M*N){
+		matrix=(double*)xmalloc(M*N*sizeof(double));
+
+		/*Read matrix on node 0, then broadcast: */
+		if(my_rank==0){  
+			if(fread(matrix,M*N*sizeof(double),1,fid)!=1) _error_("could not read matrix ");
+		}
+		
+		MPI_Bcast(matrix,M*N,MPI_DOUBLE,0,MPI_COMM_WORLD); 
+	}
+
+	/*Assign output pointers: */
+	*pmatrix=matrix;
+	if (pM)*pM=M;
+	if (pN)*pN=N;
+
+}
+/*}}}*/
+/*FUNCTION IoModelFetchData(char***   pstrings,int* pnumstrings,FILE* model_handle,int data_enum){{{1*/
 void  IoModelFetchData(char*** pstrings,int* pnumstrings,FILE* model_handle,int data_enum){
 
@@ -121,7 +212,10 @@
 	char* string=NULL;
 	int   string_size;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
+	int   code;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=9)_error_("%s%s","IoModelFetchData expecting a string array for enum ",EnumToStringx(data_enum));
 	
 	/*We have to read a bunch of strings from disk. First read the number of strings, and allocate: */
@@ -167,54 +261,4 @@
 }
 /*}}}*/
-/*FUNCTION IoModelFetchData(double* pscalar,FILE* model_handle,int data_enum){{{1*/
-void  IoModelFetchData(double* pscalar,FILE* model_handle,int data_enum){
-
-
-	extern int my_rank;
-	extern int num_procs;
-	FILE* fid=NULL;
-
-	/*output: */
-	double   scalar;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
-	
-	/*We have to read a scalar from disk. First read the dimensions of the scalar, then the scalar: */
-	if(my_rank==0){
-		if(fread(&scalar,sizeof(double),1,fid)!=1)_error_(" could not read scalar ");
-	}
-	MPI_Bcast(&scalar,1,MPI_DOUBLE,0,MPI_COMM_WORLD); 
-
-	/*Assign output pointers: */
-	*pscalar=scalar;
-		 
-}
-/*}}}*/
-/*FUNCTION IoModelFetchData(int* pinteger,FILE* model_handle,int data_enum){{{1*/
-void  IoModelFetchData(int* pinteger,FILE* model_handle,int data_enum){
-
-	extern int my_rank;
-	extern int num_procs;
-	FILE* fid=NULL;
-
-	/*output: */
-	int   integer;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
-	
-	/*We have to read a integer from disk. First read the dimensions of the integer, then the integer: */
-	if(my_rank==0){  
-		if(fread(&integer,sizeof(int),1,fid)!=1) _error_(" could not read integer ");
-	}
-
-	MPI_Bcast(&integer,1,MPI_INT,0,MPI_COMM_WORLD); 
-
-	/*Assign output pointers: */
-	*pinteger=integer;
-
-}
-/*}}}*/
 /*FUNCTION IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pM,FILE* model_handle,int data_enum){{{1*/
 void  IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,FILE* model_handle,int data_enum){
@@ -236,7 +280,10 @@
 	
 	FILE* fid=NULL;
-	
-	/*Set file pointer to beginning of the data: */
-	fid=SetFilePointerToData(model_handle,data_enum);
+	int   code;
+	
+	/*Set file pointer to beginning of the data: */
+	fid=SetFilePointerToData(&code,NULL,model_handle,data_enum);
+	
+	if(code!=8)_error_("%s%s","IoModelFetchData expecting a double mat  array for enum ",EnumToStringx(data_enum));
 	
 	/*Now fetch: */
@@ -298,15 +345,18 @@
 }
 /*}}}*/
-/*FUNCTION SetFilePointerToData(FILE* model_handle,int data_enum){{{1*/
-FILE* SetFilePointerToData(FILE* model_handle,int data_enum){
-
-	extern int my_rank;
-	extern int num_procs;
-	
-	int record_length;
+
+/*FUNCTION SetFilePointerToData(int* pcode,int* pvector_type, FILE* model_handle,int data_enum){{{1*/
+FILE* SetFilePointerToData(int* pcode,int* pvector_type, FILE* model_handle,int data_enum){
+
+	extern int my_rank;
+	extern int num_procs;
+	
 	FILE* fid=NULL;
 	int found=0;
 	int record_enum;
-
+	int record_length;
+	int record_code; //1 to 7 number
+	int vector_type; //nodal or elementary
+ 
 	/*Go find in the binary file, the position of the data we want to fetch: */
 	if(my_rank==0){
@@ -327,11 +377,15 @@
 			/*Is this the record sought for? : */
 			if (data_enum==record_enum){
-				/*Ok, we have found the correct string. Pass the record length, and break: */
+				/*Ok, we have found the correct string. Pass the record length, and read data type code: */
 				fseek(fid,sizeof(int),SEEK_CUR);
+				fread(&record_code,sizeof(int),1,fid);
+
+				/*if record_code points to a vector, get its type (nodal or elementary): */
+				if(5<=record_code && record_code<=7)fread(&vector_type,sizeof(int),1,fid);
 				found=1;
 				break;
 			}
 			else{
-				/*This is not the correct string, read the record length, and skip it: */
+				/*This is not the correct string, read the record length, and use it to skip this record: */
 				fread(&record_length,sizeof(int),1,fid);
 				/*skip: */
@@ -341,7 +395,14 @@
 	}
 	MPI_Bcast(&found,1,MPI_INT,0,MPI_COMM_WORLD); 
-
 	if(!found)_error_("%s %s ","could not find data with name",EnumToStringx(data_enum));
 
+	/*Broadcast code and vector type: */
+	MPI_Bcast(&record_code,1,MPI_INT,0,MPI_COMM_WORLD); 
+	if(record_code==5) MPI_Bcast(&vector_type,1,MPI_INT,0,MPI_COMM_WORLD); 
+
+	/*Assign output pointers:*/
+	*pcode=record_code;
+	if(pvector_type)*pvector_type=vector_type;
+
 	return fid;
 }
Index: /issm/trunk/src/c/io/Disk/diskio.h
===================================================================
--- /issm/trunk/src/c/io/Disk/diskio.h	(revision 8966)
+++ /issm/trunk/src/c/io/Disk/diskio.h	(revision 8967)
@@ -16,12 +16,13 @@
 void  pfclose(FILE* fid,char* filename);
 
-void  IoModelFetchData(double** pmatrix,int* pM,int* pN,FILE* model_handle,int data_enum);
-void  IoModelFetchData(char** pstring,FILE* model_handle,int data_enum);
-void  IoModelFetchData(double* pscalar,FILE* model_handle,int data_enum);
-void  IoModelFetchData(int* pinteger,FILE* model_handle,int data_enum);
-void  IoModelFetchData(char*** pstrings,int* pnumstrings,FILE* model_handle,int data_enum);
-void  IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,FILE* model_handle,int data_enum);
+void  IoModelFetchData(bool*     pboolean,FILE* model_handle,int data_enum);
+void  IoModelFetchData(int*      pinteger,FILE* model_handle,int data_enum);
+void  IoModelFetchData(double*   pscalar,FILE* model_handle,int data_enum);
+void  IoModelFetchData(char**    pstring,FILE* model_handle,int data_enum);
+void  IoModelFetchData(double**  pscalarmatrix,int* pM,int* pN,FILE* model_handle,int data_enum);
+void  IoModelFetchData(char***   pstringarray,int* pnumstrings,FILE* model_handle,int data_enum);
+void  IoModelFetchData(double*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,FILE* model_handle,int data_enum);
 
-FILE* SetFilePointerToData(FILE* model_handle,int data_enum);
+FILE* SetFilePointerToData(int* pcode,int* pvector_type, FILE* model_handle,int data_enum);
 
 #endif	/* _IO_H_ */
Index: /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.cpp	(revision 8967)
+++ /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.cpp	(revision 8967)
@@ -0,0 +1,205 @@
+/*!\file IoModelToInputsx
+ * \brief: used in ModelProcessor, to retrieve a nodal vector  and to * create corresponding inputs inside the elements. 
+ */
+
+#include "./IoModelToInputsx.h"
+#include "../../shared/shared.h"
+#include "../../io/io.h"
+#include "../../include/include.h"
+#include "../../toolkits/toolkits.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+
+void IoModelToInputsx(Elements* elements,IoModel* iomodel,FILE* iomodel_handle,int vector_enum,int default_vector_enum,double default_value){
+	
+
+	/*intermediary: */
+	int     i;
+	bool    defaulting    = false;
+	bool    transient     = false;
+
+	FILE   *fid           = NULL;
+	int     code          = 0;
+	int     vector_layout = 0;
+	int     counter;
+	int     nods;
+	int     nel;
+
+
+	/*variables being fetched: */
+	bool    boolean;
+	int     integer;
+	double  scalar;
+	char   *string        = NULL;
+	double *doublevector  = NULL;
+	int     M,N;
+
+	/*First of, find the record for the enum, and get code  of data type: */
+	fid=SetFilePointerToData(&code, &vector_layout,iomodel_handle,vector_enum);
+
+	switch(code){
+		case 1: //boolean constant.  {{{1
+			IoModelFetchData(&boolean,iomodel_handle,vector_enum);
+
+			/*Add boolean constant input to all elements: */
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					element->InputCreate((double)boolean,vector_enum,code); 
+				}
+				counter++;
+			}
+			break; /*}}}*/
+		case 2: //integer constant.  {{{1
+			IoModelFetchData(&integer,iomodel_handle,vector_enum);
+
+			/*Add integer constant input to all elements: */
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					element->InputCreate((double)integer,vector_enum,code); 
+				}
+				counter++;
+			}
+			break; /*}}}*/
+		case 3: //double constant.  {{{1
+			IoModelFetchData(&scalar,iomodel_handle,vector_enum);
+
+			/*Add double constant input to all elements: */
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					element->InputCreate(scalar,vector_enum,code); 
+				}
+				counter++;
+			}
+			break; /*}}}*/
+		case 5: //boolean vector.  {{{1
+			/*Fetch vector: {{{2*/
+			IoModelFetchData(&doublevector,&M,&N,iomodel_handle,vector_enum); //we still have a doublevector, because it might include times in transient mode
+			/*Check we got something, otherwise fetch default: */
+			if(doublevector){ 
+				defaulting=false;  //we are not defaulting, because  we do have a vector
+			}
+			else{
+				/*do we have a default enum to go fetch? */
+				if(default_vector_enum!=NoneEnum){
+					/*yes. fetch it: */
+					IoModelFetchData(&doublevector,&M,&N,iomodel_handle,default_vector_enum);
+					if(doublevector){
+						defaulting=false;  //we are not defaulting, because  we do have a vector
+					}
+					else{
+						/*even the default vector is non existent. we are defaulting to the default value: */
+						defaulting=true;
+					}
+				}
+				else{
+					/*we are left with the default value: */
+					defaulting=true;
+				}
+			}
+			/*}}}*/
+			/*Create inputs: {{{2*/
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					if(defaulting) element->InputCreate(default_value,vector_enum,code); 
+					else           element->InputCreate(doublevector,i,iomodel,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+				}
+				counter++;
+			}
+			/*}}}*/
+			break; /*}}}*/
+		case 6: //int vector.  {{{1
+			/*Fetch vector: {{{2*/
+			IoModelFetchData(&doublevector,&M,&N,iomodel_handle,vector_enum); //we still have a doublevector, because it might include times in transient mode
+			/*Check we got something, otherwise fetch default: */
+			if(doublevector){ 
+				defaulting=false;  //we are not defaulting, because  we do have a vector
+			}
+			else{
+				/*do we have a default enum to go fetch? */
+				if(default_vector_enum!=NoneEnum){
+					/*yes. fetch it: */
+					IoModelFetchData(&doublevector,&M,&N,iomodel_handle,default_vector_enum);
+					if(doublevector){
+						defaulting=false;  //we are not defaulting, because  we do have a vector
+					}
+					else{
+						/*even the default vector is non existent. we are defaulting to the default value: */
+						defaulting=true;
+					}
+				}
+				else{
+					/*we are left with the default value: */
+					defaulting=true;
+				}
+			}
+			/*}}}*/
+			/*Create inputs: {{{2*/
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					if(defaulting) element->InputCreate(default_value,vector_enum,code); 
+					else           element->InputCreate(doublevector,i,iomodel,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+				}
+				counter++;
+			}
+			/*}}}*/
+			break; /*}}}*/
+		case 7: //double vector.  {{{1
+
+			/*Fetch vector: {{{2*/
+			IoModelFetchData(&doublevector,&M,&N,iomodel_handle,vector_enum);
+			/*Check we got something, otherwise fetch default: */
+			if(doublevector){ 
+				defaulting=false;  //we are not defaulting, because  we do have a vector
+			}
+			else{
+				/*do we have a default enum to go fetch? */
+				if(default_vector_enum!=NoneEnum){
+					/*yes. fetch it: */
+					IoModelFetchData(&doublevector,&M,&N,iomodel_handle,default_vector_enum);
+					if(doublevector){
+						defaulting=false;  //we are not defaulting, because  we do have a vector
+					}
+					else{
+						/*even the default vector is non existent. we are defaulting to the default value: */
+						defaulting=true;
+					}
+				}
+				else{
+					/*we are left with the default value: */
+					defaulting=true;
+				}
+			}
+
+			/*}}}*/
+			/*Create inputs: {{{2*/
+			counter=0;
+			for (i=0;i<iomodel->numberofelements;i++){
+				if(iomodel->my_elements[i]){
+					Element* element=(Element*)elements->GetObjectByOffset(counter);
+					if(defaulting) element->InputCreate(default_value,vector_enum,code); 
+					else           element->InputCreate(doublevector,i,iomodel,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+				}
+				counter++;
+			}
+			/*}}}*/
+
+			break; /*}}}*/
+		default: /*{{{1*/
+			_error_("%s%i%s","data code ",code," not supported yet!");
+			break;
+			/*}}}*/
+	}
+	/*Free ressources:*/
+	xfree((void**)&doublevector);
+	xfree((void**)&string);
+
+}
Index: /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.h
===================================================================
--- /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.h	(revision 8967)
+++ /issm/trunk/src/c/modules/IoModelToInputsx/IoModelToInputsx.h	(revision 8967)
@@ -0,0 +1,13 @@
+/*!\file:  IoModelToInputsx.h
+ */ 
+
+#ifndef _IOMODEL_TO_INPUTS_H_
+#define _IOMODEL_TO_INPUTS_H_
+
+#include "../../Container/Container.h"
+#include "../../objects/objects.h"
+
+/* local prototypes: */
+void IoModelToInputsx(Elements* elements,IoModel* iomodel,FILE* iomodel_handle,int vector_enum,int default_vector_enum=NoneEnum,double default_value=0);
+
+#endif  /* _IOMODELTOELEMENTINPUTX_H */
Index: /issm/trunk/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -15,52 +16,27 @@
 void	UpdateElementsBalancethickness(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-   IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-	IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-	IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
-	IoModelFetchData(&iomodel->dhdt,NULL,NULL,iomodel_handle,DhdtEnum);
+
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DhdtEnum);
+
 	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
 	}
-
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->basal_melting_rate);
-   xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
+
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Balancevelocities/UpdateElementsBalancevelocities.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Balancevelocities/UpdateElementsBalancevelocities.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Balancevelocities/UpdateElementsBalancevelocities.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -15,53 +16,25 @@
 void	UpdateElementsBalancevelocities(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-	IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-	IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-	IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
+
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
 
 	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
 	}
-
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->vz);
-	xfree((void**)&iomodel->basal_melting_rate);
-	xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 8967)
@@ -4,4 +4,5 @@
 
 #include "../../../Container/Container.h"
+#include "../../../modules/modules.h"
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
@@ -15,36 +16,13 @@
 void	UpdateElementsBedSlope(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
 
-	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	}
-
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -26,11 +27,13 @@
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
+
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxObsEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyObsEnum); 
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessObsEnum);
+
 	IoModelFetchData(&iomodel->control_type,NULL,NULL,iomodel_handle,ControlTypeEnum);
 	IoModelFetchData(&iomodel->weights,NULL,NULL,iomodel_handle,WeightsEnum);
 	IoModelFetchData(&iomodel->cm_min,NULL,NULL,iomodel_handle,CmMinEnum);
 	IoModelFetchData(&iomodel->cm_max,NULL,NULL,iomodel_handle,CmMaxEnum);
-	IoModelFetchData(&iomodel->vx_obs,NULL,NULL,iomodel_handle,VxObsEnum);
-	IoModelFetchData(&iomodel->vy_obs,NULL,NULL,iomodel_handle,VyObsEnum);
-	IoModelFetchData(&iomodel->thickness_obs,NULL,NULL,iomodel_handle,ThicknessObsEnum);
 	for(i=0;i<iomodel->num_control_type;i++){
 		switch((int)iomodel->control_type[i]){
@@ -55,5 +58,5 @@
 	}
 
-	/*Update elements: */
+	/*Update elements and materials: */
 	counter=0;
 	for (i=0;i<iomodel->numberofelements;i++){
@@ -67,5 +70,5 @@
 		}
 	}
-
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
@@ -74,7 +77,4 @@
 	xfree((void**)&iomodel->cm_max);
 	xfree((void**)&iomodel->control_type);
-	xfree((void**)&iomodel->vx_obs);
-	xfree((void**)&iomodel->vy_obs);
-	xfree((void**)&iomodel->thickness_obs);
 	xfree((void**)&iomodel->dhdt);
 	xfree((void**)&iomodel->vx);
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 8967)
@@ -4,4 +4,5 @@
 
 #include "../../../Container/Container.h"
+#include "../../../modules/modules.h"
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
@@ -26,33 +27,4 @@
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
 	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->thickness_coeff,NULL,NULL,iomodel_handle,ThicknessCoeffEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->drag_p,NULL,NULL,iomodel_handle,DragPEnum);
-	IoModelFetchData(&iomodel->drag_q,NULL,NULL,iomodel_handle,DragQEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	if(iomodel->gl_migration!=NoneEnum) IoModelFetchData(&iomodel->bathymetry,NULL,NULL,iomodel_handle,BathymetryEnum);
-
-	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-		IoModelFetchData(&iomodel->vz,NULL,NULL,iomodel_handle,VzEnum);
-		IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-		IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-		IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
-		IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-		IoModelFetchData(&iomodel->nodeonstokes,NULL,NULL,iomodel_handle,NodeOnStokesEnum);
-	}
-	if(iomodel->control_analysis){
-		IoModelFetchData(&iomodel->vx_obs,NULL,NULL,iomodel_handle,VxObsEnum);
-		IoModelFetchData(&iomodel->vy_obs,NULL,NULL,iomodel_handle,VyObsEnum);
-	}
 
 	/*Update elements: */
@@ -65,31 +37,58 @@
 		}
 	}
-cleanup_and_return:
 
+	/*Create inputs: */
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessCoeffEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragCoefficientEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragPEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragQEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragTypeEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyBEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyNEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum,VxObsEnum,0);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum,VyObsEnum,0);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BathymetryEnum);
+
+	if (iomodel->dim==3){
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,VzEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,NodeOnStokesEnum);
+	}
+
+	if(iomodel->control_analysis){
+		IoModelToInputsx(elements,iomodel,iomodel_handle,VxObsEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,VyObsEnum);
+	}
+
+	/*Post-process: */
+
+	elements->InputDuplicate(VxEnum,VxPicardEnum);
+	elements->InputDuplicate(VxEnum,VxObsEnum);
+	if(iomodel->qmu_analysis)elements->InputDuplicate(VxEnum,QmuVxEnum);
+	
+	elements->InputDuplicate(VyEnum,VyPicardEnum);
+	elements->InputDuplicate(VyEnum,VyObsEnum);
+	if(iomodel->qmu_analysis)elements->InputDuplicate(VyEnum,QmuVyEnum);
+	
+	if(iomodel->dim==3){
+		elements->InputDuplicate(VzEnum,VzPicardEnum);
+		elements->InputDuplicate(VzEnum,VzObsEnum);
+		if(iomodel->qmu_analysis)elements->InputDuplicate(VzEnum,QmuVzEnum);
+	}
+
+	
+	cleanup_and_return:
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
 	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->thickness_coeff);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->drag_p);
-	xfree((void**)&iomodel->drag_q);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-   xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
-	xfree((void**)&iomodel->basal_melting_rate);
-	xfree((void**)&iomodel->nodeonstokes);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->vz);
-	xfree((void**)&iomodel->vx_obs);
-	xfree((void**)&iomodel->vy_obs);
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 8967)
@@ -6,4 +6,5 @@
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
+#include "../../../modules/modules.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
 #include "../../../objects/objects.h"
@@ -15,55 +16,16 @@
 void	UpdateElementsDiagnosticHutter(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Now, is the flag hutter on? otherwise, do nothing: */
-	if (!iomodel->ishutter)goto cleanup_and_return;
+	if (!iomodel->ishutter)return;
 
 	/*Fetch data needed: */
-	IoModelFetchData(&iomodel->nodeonhutter,NULL,NULL,iomodel_handle,NodeOnHutterEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->thickness_coeff,NULL,NULL,iomodel_handle,ThicknessCoeffEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->nodeonsurface,NULL,NULL,iomodel_handle,NodeOnSurfaceEnum);
-	IoModelFetchData(&iomodel->nodeonbed,NULL,NULL,iomodel_handle,NodeOnBedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
+	
+	IoModelToInputsx(elements,iomodel,iomodel_handle,NodeOnHutterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessCoeffEnum);
+	
+	/*Free data: */
+	xfree((void**)&iomodel->elements);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-	cleanup_and_return:
-
-	/*Free data: */
-	xfree((void**)&iomodel->nodeonhutter);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->thickness_coeff);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->nodeonsurface);
-	xfree((void**)&iomodel->nodeonbed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elements);
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 8967)
@@ -6,4 +6,5 @@
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
+#include "../../../modules/modules.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
 #include "../../../objects/objects.h"
@@ -15,55 +16,27 @@
 void	UpdateElementsDiagnosticVert(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Now, is the model 3d? otherwise, do nothing: */
-	if (iomodel->dim==2)goto cleanup_and_return;
+	if (iomodel->dim==2)return;
 
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->thickness_coeff,NULL,NULL,iomodel_handle,ThicknessCoeffEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-	IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-	IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-	IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-	cleanup_and_return:
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessCoeffEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
 
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->thickness_coeff);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->basal_melting_rate);
-	xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
+	
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 8967)
@@ -7,4 +7,5 @@
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
+#include "../../../modules/modules.h"
 #include "../../../objects/objects.h"
 #include "../../../shared/shared.h"
@@ -15,68 +16,33 @@
 void	UpdateElementsEnthalpy(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Now, is the model 3d? otherwise, do nothing: */
-	if (iomodel->dim==2)goto cleanup_and_return;
+	if (iomodel->dim==2)return;
 
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->drag_p,NULL,NULL,iomodel_handle,DragPEnum);
-	IoModelFetchData(&iomodel->drag_q,NULL,NULL,iomodel_handle,DragQEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-	IoModelFetchData(&iomodel->pressure,NULL,NULL,iomodel_handle,PressureEnum);
-	IoModelFetchData(&iomodel->temperature,NULL,NULL,iomodel_handle,TemperatureEnum);
-	IoModelFetchData(&iomodel->waterfraction,NULL,NULL,iomodel_handle,WaterfractionEnum);
-	IoModelFetchData(&iomodel->geothermalflux,NULL,NULL,iomodel_handle,GeothermalfluxEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	IoModelFetchData(&iomodel->vz,NULL,NULL,iomodel_handle,VzEnum);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
-	cleanup_and_return:
-
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragCoefficientEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragPEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragQEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementsTypeEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyBEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyNEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,PressureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,TemperatureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,WaterfractionEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,GeothermalfluxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VzEnum);
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->drag_p);
-	xfree((void**)&iomodel->drag_q);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->pressure);
-	xfree((void**)&iomodel->temperature);
-	xfree((void**)&iomodel->waterfraction);
-	xfree((void**)&iomodel->geothermalflux);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->vz);
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Hydrology/UpdateElementsHydrology.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Hydrology/UpdateElementsHydrology.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Hydrology/UpdateElementsHydrology.cpp	(revision 8967)
@@ -6,4 +6,5 @@
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
+#include "../../../modules/modules.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
 #include "../../../objects/objects.h"
@@ -15,67 +16,35 @@
 void	UpdateElementsHydrology(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->drag_p,NULL,NULL,iomodel_handle,DragPEnum);
-	IoModelFetchData(&iomodel->drag_q,NULL,NULL,iomodel_handle,DragQEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-	IoModelFetchData(&iomodel->pressure,NULL,NULL,iomodel_handle,PressureEnum);
-	IoModelFetchData(&iomodel->temperature,NULL,NULL,iomodel_handle,TemperatureEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-	IoModelFetchData(&iomodel->watercolumn,NULL,NULL,iomodel_handle,WatercolumnEnum);
-	IoModelFetchData(&iomodel->geothermalflux,NULL,NULL,iomodel_handle,GeothermalfluxEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	IoModelFetchData(&iomodel->vz,NULL,NULL,iomodel_handle,VzEnum);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragCoefficientEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragPEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragQEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementsTypeEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyBEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyNEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,PressureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,TemperatureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,WatercolumnEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,GeothermalfluxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VzEnum);
 
-	cleanup_and_return:
-
+	elements->InputDuplicate(WatercolumnEnum,WaterColumnOldEnum);
+	elements->InputDuplicate(WatercolumnEnum,WaterColumnPicardEnum);
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->drag_p);
-	xfree((void**)&iomodel->drag_q);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->pressure);
-	xfree((void**)&iomodel->temperature);
-	xfree((void**)&iomodel->basal_melting_rate);
-	xfree((void**)&iomodel->watercolumn);
-	xfree((void**)&iomodel->geothermalflux);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->vz);
+
+	
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -15,63 +16,32 @@
 void	UpdateElementsMelting(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Now, is the model 3d? otherwise, do nothing: */
-	if (iomodel->dim==2)goto cleanup_and_return;
+	if (iomodel->dim==2)return;
 
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->drag_p,NULL,NULL,iomodel_handle,DragPEnum);
-	IoModelFetchData(&iomodel->drag_q,NULL,NULL,iomodel_handle,DragQEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-   IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-	IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-	IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-	IoModelFetchData(&iomodel->pressure,NULL,NULL,iomodel_handle,PressureEnum);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
-	cleanup_and_return:
+	/*Create inputs: */
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragCoefficientEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragPEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragQEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementsTypeEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyBEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyNEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,PressureEnum);
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->drag_p);
-	xfree((void**)&iomodel->drag_q);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->basal_melting_rate);
-   xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
-	xfree((void**)&iomodel->pressure);
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -15,58 +16,30 @@
 void	UpdateElementsPrognostic(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->surface_accumulation_rate,NULL,NULL,iomodel_handle,SurfaceAccumulationRateEnum);
-	IoModelFetchData(&iomodel->surface_ablation_rate,NULL,NULL,iomodel_handle,SurfaceAblationRateEnum);
-	IoModelFetchData(&iomodel->surface_mass_balance,NULL,NULL,iomodel_handle,SurfaceMassBalanceEnum);
-	IoModelFetchData(&iomodel->basal_melting_rate,NULL,NULL,iomodel_handle,BasalMeltingRateEnum);
-	if(iomodel->basal_melting_rate_correction_apply)IoModelFetchData(&iomodel->basal_melting_rate_correction,NULL,NULL,iomodel_handle,BasalMeltingRateCorrectionEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
 
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAccumulationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceAblationRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceMassBalanceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BasalMeltingRateCorrectionEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	
 	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-		IoModelFetchData(&iomodel->pressure,NULL,NULL,iomodel_handle,PressureEnum);
-		IoModelFetchData(&iomodel->temperature,NULL,NULL,iomodel_handle,TemperatureEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,PressureEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,TemperatureEnum);
 	}
-
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-   xfree((void**)&iomodel->surface_accumulation_rate);
-	xfree((void**)&iomodel->surface_ablation_rate);
-	xfree((void**)&iomodel->surface_mass_balance);
-	xfree((void**)&iomodel->basal_melting_rate);
-	xfree((void**)&iomodel->basal_melting_rate_correction);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->pressure);
-	xfree((void**)&iomodel->temperature);
+
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 8967)
@@ -116,5 +116,5 @@
 
 				/*Convert units: */
-				UnitConversion(dakota_parameter,iomodel->numberofvertices,ExtToIuEnum,StringToEnumx(tag),parameters);
+				UnitConversion(dakota_parameter,iomodel->numberofvertices,ExtToIuEnum,StringToEnumx(tag));
 
 				/*Add to parameters: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 8967)
@@ -5,4 +5,5 @@
 #include "../../../Container/Container.h"
 #include "../../../toolkits/toolkits.h"
+#include "../../../modules/modules.h"
 #include "../../../io/io.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
@@ -15,36 +16,18 @@
 void	UpdateElementsSurfaceSlope(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
 
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	
 	if (iomodel->dim==3){
-		IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-		IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+		IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
 	}
-
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
+
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 8967)
@@ -4,4 +4,5 @@
 
 #include "../../../Container/Container.h"
+#include "../../../modules/modules.h"
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
@@ -15,66 +16,33 @@
 void	UpdateElementsThermal(Elements* elements, IoModel* iomodel,FILE* iomodel_handle,int analysis_counter,int analysis_type){
 
-	/*Intermediary*/
-	int i;
-	int counter;
-	Element* element=NULL;
-
 	/*Now, is the model 3d? otherwise, do nothing: */
-	if (iomodel->dim==2)goto cleanup_and_return;
+	if (iomodel->dim==2)return;
 
 	/*Fetch data needed: */
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,ElementsEnum);
-	IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,ThicknessEnum);
-	IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,SurfaceEnum);
-	IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,BedEnum);
-	IoModelFetchData(&iomodel->drag_coefficient,NULL,NULL,iomodel_handle,DragCoefficientEnum);
-	IoModelFetchData(&iomodel->drag_p,NULL,NULL,iomodel_handle,DragPEnum);
-	IoModelFetchData(&iomodel->drag_q,NULL,NULL,iomodel_handle,DragQEnum);
-	IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,ElementOnIceShelfEnum);
-	IoModelFetchData(&iomodel->elementonbed,NULL,NULL,iomodel_handle,ElementOnBedEnum);
-	IoModelFetchData(&iomodel->elementonsurface,NULL,NULL,iomodel_handle,ElementOnSurfaceEnum);
-	IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,ElementOnWaterEnum);
-	IoModelFetchData(&iomodel->elements_type,NULL,NULL,iomodel_handle,ElementsTypeEnum);
-	IoModelFetchData(&iomodel->rheology_B,NULL,NULL,iomodel_handle,RheologyBEnum);
-	IoModelFetchData(&iomodel->rheology_n,NULL,NULL,iomodel_handle,RheologyNEnum);
-	IoModelFetchData(&iomodel->pressure,NULL,NULL,iomodel_handle,PressureEnum);
-	IoModelFetchData(&iomodel->temperature,NULL,NULL,iomodel_handle,TemperatureEnum);
-	IoModelFetchData(&iomodel->geothermalflux,NULL,NULL,iomodel_handle,GeothermalfluxEnum);
-	IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,VxEnum);
-	IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,VyEnum);
-	IoModelFetchData(&iomodel->vz,NULL,NULL,iomodel_handle,VzEnum);
 
-	/*Update elements: */
-	counter=0;
-	for (i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
-			counter++;
-		}
-	}
-
-	cleanup_and_return:
-
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ThicknessEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,SurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,BedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragCoefficientEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragPEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,DragQEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnIceShelfEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnBedEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnSurfaceEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementOnWaterEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,ElementsTypeEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyBEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,RheologyNEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,PressureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,TemperatureEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,GeothermalfluxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VxEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VyEnum);
+	IoModelToInputsx(elements,iomodel,iomodel_handle,VzEnum);
+	
 	/*Free data: */
 	xfree((void**)&iomodel->elements);
-	xfree((void**)&iomodel->thickness);
-	xfree((void**)&iomodel->surface);
-	xfree((void**)&iomodel->bed);
-	xfree((void**)&iomodel->drag_coefficient);
-	xfree((void**)&iomodel->drag_p);
-	xfree((void**)&iomodel->drag_q);
-	xfree((void**)&iomodel->elementoniceshelf);
-	xfree((void**)&iomodel->elementonbed);
-	xfree((void**)&iomodel->elementonsurface);
-	xfree((void**)&iomodel->elementonwater);
-	xfree((void**)&iomodel->elements_type);
-	xfree((void**)&iomodel->rheology_B);
-	xfree((void**)&iomodel->rheology_n);
-	xfree((void**)&iomodel->pressure);
-	xfree((void**)&iomodel->temperature);
-	xfree((void**)&iomodel->geothermalflux);
-	xfree((void**)&iomodel->vx);
-	xfree((void**)&iomodel->vy);
-	xfree((void**)&iomodel->vz);
+
+	
 }
Index: /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 8966)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 8967)
@@ -6,4 +6,5 @@
 #include "../../../toolkits/toolkits.h"
 #include "../../../io/io.h"
+#include "../../../modules/modules.h"
 #include "../../../EnumDefinitions/EnumDefinitions.h"
 #include "../../../objects/objects.h"
Index: /issm/trunk/src/c/modules/modules.h
===================================================================
--- /issm/trunk/src/c/modules/modules.h	(revision 8966)
+++ /issm/trunk/src/c/modules/modules.h	(revision 8967)
@@ -49,4 +49,5 @@
 #include "./InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.h"
 #include "./InputArtificialNoisex/InputArtificialNoisex.h"
+#include "./IoModelToInputsx/IoModelToInputsx.h"
 #include "./KMLMeshWritex/KMLFileReadx.h"
 #include "./KMLMeshWritex/KMLMeshWritex.h"
Index: /issm/trunk/src/c/objects/ElementResults/BoolElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/BoolElementResult.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/ElementResults/BoolElementResult.cpp	(revision 8967)
@@ -162,5 +162,5 @@
 void BoolElementResult::ProcessUnits(Parameters* parameters){
 	
-	this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type,parameters);
+	this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type);
 
 }
Index: /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp	(revision 8967)
@@ -162,5 +162,5 @@
 void DoubleElementResult::ProcessUnits(Parameters* parameters){
 	
-	this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type,parameters);
+	this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type);
 
 }
Index: /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 8967)
@@ -173,5 +173,5 @@
 void PentaVertexElementResult::ProcessUnits(Parameters* parameters){
 	
-	UnitConversion(this->values,6,IuToExtEnum,this->enum_type,parameters);
+	UnitConversion(this->values,6,IuToExtEnum,this->enum_type);
 
 }
Index: /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 8967)
@@ -162,5 +162,5 @@
 void TriaVertexElementResult::ProcessUnits(Parameters* parameters){
 	
-	UnitConversion(this->values,3,IuToExtEnum,this->enum_type,parameters);
+	UnitConversion(this->values,3,IuToExtEnum,this->enum_type);
 
 }
Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 8966)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 8967)
@@ -60,4 +60,7 @@
 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
 		virtual void   InputToResult(int enum_type,int step,double time)=0;
+		virtual void   InputDuplicate(int original_enum,int new_enum)=0;
+		virtual void   InputCreate(double scalar,int name,int code)=0;
+		virtual void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
 		virtual void   ControlInputGetGradient(Vec gradient,int enum_type)=0;
 		virtual void   ControlInputSetGradient(double* gradient,int enum_type)=0;
@@ -75,5 +78,4 @@
 		virtual void   MaxVz(double* pmaxvz, bool process_units)=0;
 		virtual void   MaxAbsVz(double* pmaxabsvz, bool process_units)=0;
-		virtual void   InputDuplicate(int original_enum,int new_enum)=0;
 		virtual void   InputScale(int enum_type,double scale_factor)=0;
 		virtual void   GetVectorFromInputs(Vec vector,int NameEnum)=0;
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 8967)
@@ -4866,4 +4866,102 @@
 }
 /*}}}*/
+/*FUNCTION Penta::InputCreate(double scalar,int enum,int code);{{{1*/
+void Penta::InputCreate(double scalar,int name,int code){
+
+	/*Check that name is an element input*/
+	if (!IsInput(name)) return;
+	
+	if ((code==5) || (code==1)){ //boolean
+		this->inputs->AddInput(new BoolInput(name,(bool)scalar));
+	}
+	else if ((code==6) || (code==2)){ //integer
+		this->inputs->AddInput(new IntInput(name,(int)scalar));
+	}
+	else if ((code==7) || (code==3)){ //double
+		this->inputs->AddInput(new DoubleInput(name,(int)scalar));
+	}
+	else _error_("%s%i"," could not recognize nature of vector from code ",code);
+
+}
+/*}}}*/
+/*FUNCTION Penta::InputCreate(double* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{1*/
+void Penta::InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
+
+	/*Intermediaries*/
+	int    i,j,t;
+	int    penta_vertex_ids[6];
+	int    row;
+	double nodeinputs[6];
+	double time;
+	TransientInput* transientinput=NULL;
+		
+	/*Branch on type of vector: nodal or elementary: */
+	if(vector_type==1){ //nodal vector
+
+		/*Recover vertices ids needed to initialize inputs*/
+		for(i=0;i<6;i++){ 
+			penta_vertex_ids[i]=(int)iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
+		}
+
+		/*Are we in transient or static? */
+		if(iomodel->numberofvertices==M){
+
+			/*create input values: */
+			for(i=0;i<6;i++)nodeinputs[i]=(double)vector[penta_vertex_ids[i]-1];
+
+			/*process units: */
+			UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum);
+
+			/*create static input: */
+			this->inputs->AddInput(new PentaVertexInput(vector_enum,nodeinputs));
+		}
+		else if(iomodel->numberofvertices==(M+1)){
+			/*create transient input: */
+			for(t=0;t<N;t++){ //N is the number of times
+
+				/*create input values: */
+				for(i=0;i<6;i++){
+					row=penta_vertex_ids[i]-1;
+					nodeinputs[i]=(double)vector[N*row+t];
+				}
+
+				/*process units: */
+				UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum);
+
+				/*time? :*/
+				time=(double)vector[(M-1)*N+t];
+
+				if(t==0)transientinput=new TransientInput(vector_enum);
+				transientinput->AddTimeInput(new PentaVertexInput(vector_enum,nodeinputs),time);
+			}
+
+
+		}
+		else _error_("nodal vector is either numberofnodes, or numberofnodes+1 long");
+	}
+	else if(vector_type==2){ //element vector
+		/*Are we in transient or static? */
+		if(iomodel->numberofelements==M){
+
+			/*static mode: create an input out of the element value: */
+
+			if (code==5){ //boolean
+				this->inputs->AddInput(new BoolInput(vector_enum,(bool)vector[i]));
+			}
+			else if (code==6){ //integer
+				this->inputs->AddInput(new IntInput(vector_enum,(int)vector[i]));
+			}
+			else if (code==7){ //double
+				this->inputs->AddInput(new DoubleInput(vector_enum,(double)vector[i]));
+			}
+			else _error_("%s%i"," could not recognize nature of vector from code ",code);
+		}
+		else {
+			_error_("transient elementary inputs not supported yet!");
+		}
+	}
+
+}
+/*}}}*/
 /*FUNCTION Penta::InputDepthAverageAtBase{{{1*/
 void  Penta::InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum){
@@ -5103,98 +5201,5 @@
 	}
 
-	//add as many inputs per element as requested: 
-	if (iomodel->thickness) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->thickness[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(ThicknessEnum,nodeinputs));
-	}
-	if (iomodel->surface) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->surface[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(SurfaceEnum,nodeinputs));
-	}
-	if (iomodel->bed) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->bed[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(BedEnum,nodeinputs));
-	}
-	if (iomodel->drag_coefficient) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->drag_coefficient[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(DragCoefficientEnum,nodeinputs));
-
-		if (iomodel->drag_p) this->inputs->AddInput(new DoubleInput(DragPEnum,iomodel->drag_p[index]));
-		if (iomodel->drag_q) this->inputs->AddInput(new DoubleInput(DragQEnum,iomodel->drag_q[index]));
-		this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));
-
-	}
-	if (iomodel->basal_melting_rate) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->basal_melting_rate[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(BasalMeltingRateEnum,nodeinputs));
-	}
-	if (iomodel->surface_accumulation_rate) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->surface_accumulation_rate[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(SurfaceAccumulationRateEnum,nodeinputs));
-	}
-	if (iomodel->surface_ablation_rate) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->surface_ablation_rate[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(SurfaceAblationRateEnum,nodeinputs));
-	}
-	if (iomodel->surface_mass_balance) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->surface_mass_balance[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(SurfaceMassBalanceEnum,nodeinputs));
-	}
-	if (iomodel->geothermalflux) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->geothermalflux[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(GeothermalfluxEnum,nodeinputs));
-	}	
-	if (iomodel->pressure) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->pressure[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(PressureEnum,nodeinputs));
-	}
-	if (iomodel->temperature) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->temperature[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(TemperatureEnum,nodeinputs));
-	}
-	if (iomodel->waterfraction) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->waterfraction[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(WaterfractionEnum,nodeinputs));
-	}
-	if (iomodel->dhdt) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->dhdt[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(DhdtEnum,nodeinputs));
-	}
-	/*vx,vy and vz: */
-	if (iomodel->vx) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vx[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VxEnum,nodeinputs));
-		this->inputs->AddInput(new PentaVertexInput(VxPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new PentaVertexInput(QmuVxEnum,nodeinputs));
-	}
-	if (iomodel->vy) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vy[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VyEnum,nodeinputs));
-		this->inputs->AddInput(new PentaVertexInput(VyPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new PentaVertexInput(QmuVyEnum,nodeinputs));
-	}
-	if (iomodel->vz) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vz[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VzEnum,nodeinputs));
-		this->inputs->AddInput(new PentaVertexInput(VzPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new PentaVertexInput(QmuVzEnum,nodeinputs));
-	}
-	if (iomodel->vx_obs) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vx_obs[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VxObsEnum,nodeinputs));
-	}
-	if (iomodel->vy_obs) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vy_obs[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VyObsEnum,nodeinputs));
-	}
-	if (iomodel->vz_obs) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->vz_obs[penta_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new PentaVertexInput(VzObsEnum,nodeinputs));
-	}
-	if (iomodel->elementoniceshelf) this->inputs->AddInput(new BoolInput(ElementOnIceShelfEnum,(IssmBool)iomodel->elementoniceshelf[index]));
-	if (iomodel->elementonbed) this->inputs->AddInput(new BoolInput(ElementOnBedEnum,(IssmBool)iomodel->elementonbed[index]));
-	if (iomodel->elementonwater) this->inputs->AddInput(new BoolInput(ElementOnWaterEnum,(IssmBool)iomodel->elementonwater[index]));
-	if (iomodel->elementonsurface) this->inputs->AddInput(new BoolInput(ElementOnSurfaceEnum,(IssmBool)iomodel->elementonsurface[index]));
-
+	
 	/*Control Inputs*/
 	if (iomodel->control_analysis && iomodel->control_type){
@@ -6540,4 +6545,5 @@
 				name==TemperatureEnum ||
 				name==DragCoefficientEnum ||
+				name==DragTypeEnum ||
 				name==GradientEnum ||
 				name==OldGradientEnum  ||
@@ -6615,5 +6621,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -6628,5 +6634,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -6641,5 +6647,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -6654,5 +6660,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum);
 
 	/*Assign output pointers:*/
@@ -6668,5 +6674,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -6681,5 +6687,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -6694,5 +6700,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum);
 
 	/*Assign output pointers:*/
@@ -6734,5 +6740,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum);
 
 	/*Assign output pointers:*/
@@ -6747,5 +6753,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -6760,5 +6766,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -6773,5 +6779,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum);
 
 	/*Assign output pointers:*/
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 8966)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 8967)
@@ -95,7 +95,9 @@
 		void   GradjBbarStokes(Vec gradient);
 		int    Sid();
+		void   InputArtificialNoise(int enum_type,double min, double max);
 		void   InputControlUpdate(double scalar,bool save_parameter);
-		void   InputArtificialNoise(int enum_type,double min, double max);
 		bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums);
+		void   InputCreate(double scalar,int name,int code);
+		void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
 		void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=ElementsEnum);
 		void   InputDuplicate(int original_enum,int new_enum);
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 8967)
@@ -3468,115 +3468,4 @@
 	}
 
-	/*add as many inputs per element as requested:*/
-	if (iomodel->thickness) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->thickness[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(ThicknessEnum,nodeinputs));
-	}
-	if (iomodel->thickness_coeff) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->thickness_coeff[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(ThicknessCoeffEnum,nodeinputs));
-	}
-	if (iomodel->surface) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->surface[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(SurfaceEnum,nodeinputs));
-	}
-	if (iomodel->bed) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->bed[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(BedEnum,nodeinputs));
-	}
-	if(iomodel->gl_migration!=NoneEnum){
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->bathymetry[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(BathymetryEnum,nodeinputs));
-	}
-	if (iomodel->drag_coefficient) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->drag_coefficient[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(DragCoefficientEnum,nodeinputs));
-
-		if (iomodel->drag_p) this->inputs->AddInput(new DoubleInput(DragPEnum,iomodel->drag_p[index]));
-		if (iomodel->drag_q) this->inputs->AddInput(new DoubleInput(DragQEnum,iomodel->drag_q[index]));
-		this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));
-	}
-	if (iomodel->thickness_obs) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->thickness_obs[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(ThicknessObsEnum,nodeinputs));
-	}
-	if (iomodel->basal_melting_rate) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->basal_melting_rate[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(BasalMeltingRateEnum,nodeinputs));
-	}
-	if (iomodel->basal_melting_rate_correction) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->basal_melting_rate_correction[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(BasalMeltingRateCorrectionEnum,nodeinputs));
-	}
-	if (iomodel->watercolumn){
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->watercolumn[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(WatercolumnEnum,nodeinputs));
-		this->inputs->AddInput(new TriaVertexInput(WaterColumnOldEnum,nodeinputs));
-	}
-	if (iomodel->surface_accumulation_rate) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->surface_accumulation_rate[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(SurfaceAccumulationRateEnum,nodeinputs));
-	}
-	if (iomodel->surface_ablation_rate) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->surface_ablation_rate[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(SurfaceAblationRateEnum,nodeinputs));
-	}
-	if (iomodel->surface_mass_balance) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->surface_mass_balance[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(SurfaceMassBalanceEnum,nodeinputs));
-	}
-	if (iomodel->geothermalflux) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->geothermalflux[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(GeothermalfluxEnum,nodeinputs));
-	}
-	if (iomodel->dhdt){
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->dhdt[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(DhdtEnum,nodeinputs));
-	}
-	if (iomodel->pressure){
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->pressure[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(PressureEnum,nodeinputs));
-	}
-	if (iomodel->temperature) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->temperature[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(TemperatureEnum,nodeinputs));
-	}
-	/*vx,vy and vz: */
-	if (iomodel->vx) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vx[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VxEnum,nodeinputs));
-		this->inputs->AddInput(new TriaVertexInput(VxPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new TriaVertexInput(QmuVxEnum,nodeinputs));
-	}
-	if (iomodel->vy) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vy[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VyEnum,nodeinputs));
-		this->inputs->AddInput(new TriaVertexInput(VyPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new TriaVertexInput(QmuVyEnum,nodeinputs));
-	}
-	if (iomodel->vz) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vz[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VzEnum,nodeinputs));
-		this->inputs->AddInput(new TriaVertexInput(VzPicardEnum,nodeinputs));
-		if(iomodel->qmu_analysis)this->inputs->AddInput(new TriaVertexInput(QmuVzEnum,nodeinputs));
-	}
-	if (iomodel->vx_obs) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vx_obs[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VxObsEnum,nodeinputs));
-	}
-	if (iomodel->vy_obs) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vy_obs[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VyObsEnum,nodeinputs));
-	}
-	if (iomodel->vz_obs) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->vz_obs[tria_vertex_ids[i]-1]/iomodel->yts;
-		this->inputs->AddInput(new TriaVertexInput(VzObsEnum,nodeinputs));
-	}
-
-	if (iomodel->elementoniceshelf) this->inputs->AddInput(new BoolInput(ElementOnIceShelfEnum,(IssmBool)iomodel->elementoniceshelf[index]));
-	if (iomodel->elementonbed) this->inputs->AddInput(new BoolInput(ElementOnBedEnum,(IssmBool)iomodel->elementonbed[index]));
-	if (iomodel->elementonwater) this->inputs->AddInput(new BoolInput(ElementOnWaterEnum,(IssmBool)iomodel->elementonwater[index]));
-	if (iomodel->elementonsurface) this->inputs->AddInput(new BoolInput(ElementOnSurfaceEnum,(IssmBool)iomodel->elementonsurface[index]));
-
 	/*Control Inputs*/
 	if (iomodel->control_analysis && iomodel->control_type){
@@ -4168,4 +4057,103 @@
 }
 /*}}}*/
+/*FUNCTION Tria::InputCreate(double scalar,int enum,int code);{{{1*/
+void Tria::InputCreate(double scalar,int name,int code){
+
+	/*Check that name is an element input*/
+	if (!IsInput(name)) return;
+	
+	if ((code==5) || (code==1)){ //boolean
+		this->inputs->AddInput(new BoolInput(name,(bool)scalar));
+	}
+	else if ((code==6) || (code==2)){ //integer
+		this->inputs->AddInput(new IntInput(name,(int)scalar));
+	}
+	else if ((code==7) || (code==3)){ //double
+		this->inputs->AddInput(new DoubleInput(name,(int)scalar));
+	}
+	else _error_("%s%i"," could not recognize nature of vector from code ",code);
+
+}
+/*}}}*/
+/*FUNCTION Tria::InputCreate(double* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{1*/
+void Tria::InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
+
+	/*Intermediaries*/
+	int    i,j,t;
+	int    tria_vertex_ids[3];
+	int    row;
+	double nodeinputs[3];
+	double time;
+		
+	TransientInput* transientinput=NULL;
+
+	/*Branch on type of vector: nodal or elementary: */
+	if(vector_type==1){ //nodal vector
+
+		/*Recover vertices ids needed to initialize inputs*/
+		for(i=0;i<3;i++){ 
+			tria_vertex_ids[i]=(int)iomodel->elements[3*index+i]; //ids for vertices are in the elements array from Matlab
+		}
+
+		/*Are we in transient or static? */
+		if(iomodel->numberofvertices==M){
+
+			/*create input values: */
+			for(i=0;i<3;i++)nodeinputs[i]=(double)vector[tria_vertex_ids[i]-1];
+
+			/*process units: */
+			UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum);
+
+			/*create static input: */
+			this->inputs->AddInput(new TriaVertexInput(vector_enum,nodeinputs));
+		}
+		else if(iomodel->numberofvertices==(M+1)){
+			/*create transient input: */
+			for(t=0;t<N;t++){ //N is the number of times
+
+				/*create input values: */
+				for(i=0;i<3;i++){
+					row=tria_vertex_ids[i]-1;
+					nodeinputs[i]=(double)vector[N*row+t];
+				}
+
+				/*process units: */
+				UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum);
+
+				/*time? :*/
+				time=(double)vector[(M-1)*N+t];
+
+				if(t==0)transientinput=new TransientInput(vector_enum);
+				transientinput->AddTimeInput(new TriaVertexInput(vector_enum,nodeinputs),time);
+			}
+
+
+		}
+		else _error_("nodal vector is either numberofnodes, or numberofnodes+1 long");
+	}
+	else if(vector_type==2){ //element vector
+		/*Are we in transient or static? */
+		if(iomodel->numberofelements==M){
+
+			/*static mode: create an input out of the element value: */
+
+			if (code==5){ //boolean
+				this->inputs->AddInput(new BoolInput(vector_enum,(bool)vector[i]));
+			}
+			else if (code==6){ //integer
+				this->inputs->AddInput(new IntInput(vector_enum,(int)vector[i]));
+			}
+			else if (code==7){ //double
+				this->inputs->AddInput(new DoubleInput(vector_enum,(double)vector[i]));
+			}
+			else _error_("%s%i"," could not recognize nature of vector from code ",code);
+		}
+		else {
+			_error_("transient elementary inputs not supported yet!");
+		}
+	}
+
+}
+/*}}}*/
 /*FUNCTION Tria::IsInput{{{1*/
 bool Tria::IsInput(int name){
@@ -4186,4 +4174,5 @@
 				name==DragCoefficientEnum ||
 				name==GradientEnum ||
+				name==DragTypeEnum ||
 				name==OldGradientEnum
 		){
@@ -4302,5 +4291,5 @@
 
 	/*Process units: */
-	mass_flux=UnitConversion(mass_flux,IuToExtEnum,MassFluxEnum,this->parameters);
+	mass_flux=UnitConversion(mass_flux,IuToExtEnum,MassFluxEnum);
 
 	/*clean up and return:*/
@@ -4317,5 +4306,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -4330,5 +4319,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -4343,5 +4332,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -4356,5 +4345,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum);
 
 	/*Assign output pointers:*/
@@ -4369,5 +4358,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -4382,5 +4371,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -4396,5 +4385,5 @@
 
 	/*process units if requested: */
-	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum);
 
 	/*Assign output pointers:*/
@@ -4484,5 +4473,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum);
 
 	/*Assign output pointers:*/
@@ -4497,5 +4486,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum);
 
 	/*Assign output pointers:*/
@@ -4510,5 +4499,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum);
 
 	/*Assign output pointers:*/
@@ -4523,5 +4512,5 @@
 
 	/*process units if requested: */
-	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum);
 
 	/*Assign output pointers:*/
@@ -4888,5 +4877,5 @@
 		misfit=0.5*( pow(vx-vxobs,2.) + pow(vy-vyobs,2.) );
 
-		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
+		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceAverageVelMisfitEnum);
 
 		/*Add to cost function*/
@@ -4978,5 +4967,5 @@
 		misfit=1/S*pow( pow(vx-vxobs,2.) + pow(vy-vyobs,2.) ,0.5);
 
-		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
+		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceAverageVelMisfitEnum);
 
 		/*Add to cost function*/
@@ -5043,5 +5032,5 @@
 		misfit=4*pow(meanvel,2.)*pow(log(velocity_mag/obs_velocity_mag),2.);
 
-		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceLogVelMisfitEnum,this->parameters);
+		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceLogVelMisfitEnum);
 
 		/*Add to cost function*/
@@ -5109,5 +5098,5 @@
 					pow(log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)),2.) );
 
-		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceLogVxVyMisfitEnum,this->parameters);
+		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceLogVxVyMisfitEnum);
 
 		/*Add to cost function*/
@@ -5197,5 +5186,5 @@
 		scaley=pow(meanvel/(vyobs+epsvel),2.); if(vyobs==0)scaley=0;
 		misfit=0.5*(scalex*pow((vx-vxobs),2.)+scaley*pow((vy-vyobs),2.));
-		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceRelVelMisfitEnum,this->parameters);
+		if(process_units)UnitConversion(misfit,IuToExtEnum,SurfaceRelVelMisfitEnum);
 
 		/*Add to cost function*/
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 8966)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 8967)
@@ -97,7 +97,9 @@
 		void   GradjVxBalancedthickness(Vec gradient);
 		void   GradjVyBalancedthickness(Vec gradient);
+		void   InputArtificialNoise(int enum_type,double min, double max);
 		void   InputControlUpdate(double scalar,bool save_parameter);
-		void   InputArtificialNoise(int enum_type,double min, double max);
 		bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums);
+		void   InputCreate(double scalar,int name,int code);
+		void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
 		void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=ElementsEnum);
 		void   InputDuplicate(int original_enum,int new_enum);
Index: /issm/trunk/src/c/objects/Inputs/Input.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/Input.h	(revision 8966)
+++ /issm/trunk/src/c/objects/Inputs/Input.h	(revision 8967)
@@ -64,5 +64,4 @@
 		virtual Input* PointwiseMin(Input* inputmin)=0;
 		virtual ElementResult* SpawnResult(int step, double time)=0;
-		virtual void AddTimeValues(double* values,int step,double time)=0;
 
 		/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 8967)
@@ -399,5 +399,5 @@
 
 	/*Process units if requested: */
-	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
+	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type);
 
 	/*Now, figure out minimum of valuescopy: */
Index: /issm/trunk/src/c/objects/Inputs/TransientInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TransientInput.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Inputs/TransientInput.cpp	(revision 8967)
@@ -22,5 +22,5 @@
 TransientInput::TransientInput(){
 
-   enum_type=UNDEF;
+	enum_type=UNDEF;
 	inputs=NULL;
 	this->numtimesteps=0;
@@ -54,5 +54,5 @@
 }
 /*}}}*/
-/*FUNCTION TransientInput::AddTimeInput(double* values,int step,double time);{{{1*/
+/*FUNCTION void TransientInput::AddTimeInput(Input* input,double time){{{1*/
 void TransientInput::AddTimeInput(Input* input,double time){
 
Index: /issm/trunk/src/c/objects/Inputs/TransientInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TransientInput.h	(revision 8966)
+++ /issm/trunk/src/c/objects/Inputs/TransientInput.h	(revision 8967)
@@ -27,5 +27,4 @@
 		TransientInput(int enum_type);
 		~TransientInput();
-		void AddTimeValues(double* values,int step,double time){_error_("not implemented yet");};
 		void AddTimeInput(Input* input,double time);
 		/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 8967)
@@ -250,5 +250,5 @@
 
 	/*Process units if requested: */
-	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
+	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type);
 
 	/*Now, figure out minimum of valuescopy: */
Index: /issm/trunk/src/c/objects/Materials/Matice.cpp
===================================================================
--- /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 8966)
+++ /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 8967)
@@ -593,5 +593,5 @@
 					for (int i=0;i<3;i++) values[i]=vector[((Tria*)element)->nodes[i]->GetSidList()]; //use sid list, to index into serial oriented vector 
 					this->inputs->AddInput(new TriaVertexInput(name,values));
-					/*Special case for rheology B in 2D: Pourave land for this solution{{{1*/
+					/*Special case for rheology B in 2D: Pourave land for this solution{{{2*/
 					if(name==RheologyBEnum){
 						/*Are we in 2D?:*/
Index: /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp
===================================================================
--- /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 8966)
+++ /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 8967)
@@ -15,8 +15,8 @@
 #include "../../shared/shared.h"
 
-double UnitConversionScaleFactor(int type_enum,Parameters* parameters);
+double UnitConversionScaleFactor(int type_enum);
 /*}}}*/
 
-void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters){
+void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum){
 
 	double scale;
@@ -24,5 +24,5 @@
 
 	/*Get scaling factor: */
-	scale=UnitConversionScaleFactor(type_enum,parameters);
+	scale=UnitConversionScaleFactor(type_enum);
 
 	/*Now, which direction are we going? once determined, use scale factor: */
@@ -33,15 +33,7 @@
 }
 
-double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters){
+double UnitConversion(double value, int direction_enum, int type_enum){
 
-	double scale;
-
-	/*Get scaling factor: */
-	scale=UnitConversionScaleFactor(type_enum,parameters);
-
-	/*Now, which direction are we going? once determined, use scale factor: */
-	if(direction_enum==IuToExtEnum)value=value*scale;
-	else if(direction_enum==ExtToIuEnum)value=value/scale;
-	else _error_(" wrong direction for unit conversion, either IuToExtEnum or ExtToIuEnum. ");
+	UnitConversion(&value,1,direction_enum,type_enum);
 
 	return value;
@@ -49,12 +41,8 @@
 
 
+double UnitConversionScaleFactor(int type_enum){
 
-double UnitConversionScaleFactor(int type_enum,Parameters* parameters){
-
-	double yts;
+	double yts=365.0*24.0*3600.0;
 	
-	/*Get some values from parameters, that are often needed: */
-	parameters->FindParam(&yts,YtsEnum);
-
 	double scale;
 	switch(type_enum){
Index: /issm/trunk/src/c/shared/Numerics/numerics.h
===================================================================
--- /issm/trunk/src/c/shared/Numerics/numerics.h	(revision 8966)
+++ /issm/trunk/src/c/shared/Numerics/numerics.h	(revision 8967)
@@ -26,6 +26,6 @@
 double norm(double* vector);
 void IsInputConverged(double* peps, Input** new_inputs,Input** old_inputs,int num_inputs,int criterion_enum);
-void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters);
-double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters);
+void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum);
+double UnitConversion(double value, int direction_enum, int type_enum);
 void PetscOptionsFromAnalysis(Parameters* parameters,int analysis_type);
 
Index: /issm/trunk/src/m/classes/model.m
===================================================================
--- /issm/trunk/src/m/classes/model.m	(revision 8966)
+++ /issm/trunk/src/m/classes/model.m	(revision 8967)
@@ -11,5 +11,5 @@
 
 		 %in what follows, any field is defined according to the following convention: 
-		 %field={defaultvalue,ismarshalled,type}
+		 %field={defaultvalue,marshall?,data type,matrix type}
 
 		 %Model general information
@@ -31,10 +31,10 @@
 		 numberofelements={0,true,'Integer'};
 		 numberofnodes={0,true,'Integer'};
-		 elements={NaN,true,'Mat'};
-		 elements_type={NaN,true,'Mat'};
-		 vertices_type={NaN,true,'Mat'};
-		 x={NaN,true,'Mat'};
-		 y={NaN,true,'Mat'};
-		 z={NaN,true,'Mat'};
+		 elements={NaN,true,'DoubleMat',2};
+		 elements_type={NaN,true,'DoubleMat',2};
+		 vertices_type={NaN,true,'DoubleMat',1};
+		 x={NaN,true,'DoubleMat',1};
+		 y={NaN,true,'DoubleMat',1};
+		 z={NaN,true,'DoubleMat',1};
 		 bed_slopex={NaN,false};
 		 bed_slopey={NaN,false};
@@ -42,6 +42,6 @@
 		 surface_slopey={NaN,false};
 		 nodeconnectivity={NaN,false};
-		 elementconnectivity={NaN,true,'Mat'};
-		 edges={NaN,true,'Mat'};
+		 elementconnectivity={NaN,true,'DoubleMat',3};
+		 edges={NaN,true,'DoubleMat',3};
 
 		 %I/O
@@ -51,5 +51,5 @@
 		 numberofelements2d={0,true,'Integer'};
 		 numberofnodes2d={0,true,'Integer'};
-		 elements2d={NaN,true,'Mat'};
+		 elements2d={NaN,true,'DoubleMat',3};
 		 elements_type2d={NaN,false};
 		 vertices_type2d={NaN,false};
@@ -75,23 +75,23 @@
 
 		 %Nodes
-		 nodeonhutter={NaN,true,'Mat'};
-		 nodeonmacayeal={NaN,true,'Mat'};
-		 nodeonpattyn={NaN,true,'Mat'};
-		 nodeonstokes={NaN,true,'Mat'};
-		 borderstokes={NaN,true,'Mat'};
+		 nodeonhutter={NaN,true,'DoubleMat',1};
+		 nodeonmacayeal={NaN,true,'DoubleMat',1};
+		 nodeonpattyn={NaN,true,'DoubleMat',1};
+		 nodeonstokes={NaN,true,'DoubleMat',1};
+		 borderstokes={NaN,true,'DoubleMat',3};
 
 		 %Stokes
-		 stokesreconditioning={0,true,'Scalar'};
+		 stokesreconditioning={0,true,'Double'};
 		 shelf_dampening={0,true,'Integer'};
 
 		 %Penalties
-		 penalties={NaN,true,'Mat'};
-		 penalty_offset={0,true,'Scalar'};
-		 penalty_melting={0,true,'Scalar'};
+		 penalties={NaN,true,'DoubleMat',3};
+		 penalty_offset={0,true,'Double'};
+		 penalty_melting={0,true,'Double'};
 		 penalty_lock={0,true,'Integer'};
 		 segments={NaN,false};
 		 segmentmarkers={NaN,false};
 		 rifts={NaN,false};
-		 riftinfo={NaN,true,'Mat'};
+		 riftinfo={NaN,true,'DoubleMat',3};
 		 riftproperties={NaN,false};
 		 numrifts={0,false};
@@ -99,6 +99,6 @@
 		 %Projections
 		 uppernodes={NaN,false};
-		 upperelements={NaN,true,'Mat'};
-		 lowerelements={NaN,true,'Mat'};
+		 upperelements={NaN,true,'DoubleMat',2};
+		 lowerelements={NaN,true,'DoubleMat',2};
 		 lowernodes={NaN,false};
 
@@ -106,8 +106,8 @@
 		 numlayers={0,true,'Integer'};
 		 extrusionexponent={0,false};
-		 elementonbed={NaN,true,'Mat'};
-		 elementonsurface={NaN,true,'Mat'};
-		 nodeonbed={NaN,true,'Mat'};
-		 nodeonsurface={NaN,true,'Mat'};
+		 elementonbed={NaN,true,'DoubleMat',2};
+		 elementonsurface={NaN,true,'DoubleMat',2};
+		 nodeonbed={NaN,true,'DoubleMat',1};
+		 nodeonsurface={NaN,true,'DoubleMat',1};
 		 minh={0,false};
 		 firn_layer={NaN,false};
@@ -118,16 +118,16 @@
 
 		 %Materials parameters
-		 rho_ice={0,true,'Scalar'};
-		 rho_water={0,true,'Scalar'};
+		 rho_ice={0,true,'Double'};
+		 rho_water={0,true,'Double'};
 		 rho_firn={0,false};
-		 heatcapacity={0,true,'Scalar'};
-		 latentheat={0,true,'Scalar'};
-		 thermalconductivity={0,true,'Scalar'};
-		 meltingpoint={0,true,'Scalar'};
-		 referencetemperature={0,true,'Scalar'}; %for enthalpy
-		 beta={0,true,'Scalar'};
+		 heatcapacity={0,true,'Double'};
+		 latentheat={0,true,'Double'};
+		 thermalconductivity={0,true,'Double'};
+		 meltingpoint={0,true,'Double'};
+		 referencetemperature={0,true,'Double'}; %for enthalpy
+		 beta={0,true,'Double'};
 		 
-		 mixed_layer_capacity={0,true,'Scalar'};
-		 thermal_exchange_velocity={0,true,'Scalar'};
+		 mixed_layer_capacity={0,true,'Double'};
+		 thermal_exchange_velocity={0,true,'Double'};
 		 min_thermal_constraints={0,true,'Integer'};
 		 min_mechanical_constraints={0,true,'Integer'};
@@ -135,44 +135,44 @@
 
 		 %Physical parameters
-		 g={0,true,'Scalar'};
-		 yts={0,true,'Scalar'};
+		 g={0,true,'Double'};
+		 yts={0,true,'Double'};
 		 drag_type={0,true,'Integer'};
-		 drag_coefficient={NaN,true,'Mat'};
-		 drag_p={NaN,true,'Mat'};
-		 drag_q={NaN,true,'Mat'};
-		 rheology_B={NaN,true,'Mat'};
-		 rheology_n={NaN,true,'Mat'};
+		 drag_coefficient={NaN,true,'DoubleMat',1};
+		 drag_p={NaN,true,'DoubleMat',2};
+		 drag_q={NaN,true,'DoubleMat',2};
+		 rheology_B={NaN,true,'DoubleMat',1};
+		 rheology_n={NaN,true,'DoubleMat',2};
 		 rheology_law={0,true,'Integer'};
 
 		 %Geometrical parameters
-		 elementoniceshelf={NaN,true,'Mat'};
-		 elementonicesheet={NaN,true,'Mat'};
-		 elementonwater={NaN,true,'Mat'};
-		 elementonnuna={NaN,false};
-		 nodeoniceshelf={NaN,true,'Mat'};
-		 nodeonicesheet={NaN,true,'Mat'};
-		 nodeonwater={NaN,true,'Mat'};
+		 elementoniceshelf={NaN,true,'BooleanMat',2};
+		 elementonicesheet={NaN,true,'BooleanMat',2};
+		 elementonwater={NaN,true,'BooleanMat',2};
+		 elementonnuna={NaN,false,'BooleanMat',2};
+		 nodeoniceshelf={NaN,true,'DoubleMat',1};
+		 nodeonicesheet={NaN,true,'DoubleMat',1};
+		 nodeonwater={NaN,true,'DoubleMat',1};
 		 nodeonnuna={NaN,false};
-		 surface={NaN,true,'Mat'};
-		 thickness={NaN,true,'Mat'};
-		 thickness_coeff={NaN,true,'Mat'};
-		 bed={NaN,true,'Mat'};
-		 bathymetry={NaN,true,'Mat'};
+		 surface={NaN,true,'DoubleMat',1};
+		 thickness={NaN,true,'DoubleMat',1};
+		 thickness_coeff={NaN,true,'DoubleMat',1};
+		 bed={NaN,true,'DoubleMat',1};
+		 bathymetry={NaN,true,'DoubleMat',1};
 		 mask={NaN,false};
 
 		 %Boundary conditions
 		 nodeonboundary={NaN,false};
-		 pressureload={NaN,true,'Mat'};
-		 spcvx={NaN,true,'Mat'};
-		 spcvy={NaN,true,'Mat'};
-		 spcvz={NaN,true,'Mat'};
-		 spctemperature={NaN,true,'Mat'};
-		 spcthickness={NaN,true,'Mat'};
-		 spcwatercolumn={NaN,true,'Mat'};
-		 diagnostic_ref={NaN,true,'Mat'};
+		 pressureload={NaN,true,'DoubleMat',3};
+		 spcvx={NaN,true,'DoubleMat',1};
+		 spcvy={NaN,true,'DoubleMat',1};
+		 spcvz={NaN,true,'DoubleMat',1};
+		 spctemperature={NaN,true,'DoubleMat',1};
+		 spcthickness={NaN,true,'DoubleMat',1};
+		 spcwatercolumn={NaN,true,'DoubleMat',1};
+		 diagnostic_ref={NaN,true,'DoubleMat',1};
 
 		 %Observations 
-		 vx_obs={NaN,true,'Mat'};
-		 vy_obs={NaN,true,'Mat'};
+		 vx_obs={NaN,true,'DoubleMat',1};
+		 vy_obs={NaN,true,'DoubleMat',1};
 		 vel_obs={NaN,false};
 		 vx_obs_raw={NaN,false};
@@ -182,11 +182,11 @@
 		 vel_bal={NaN,false};
 		 vel_obs_raw={NaN,false};
-		 surface_accumulation_rate={NaN,true,'Mat'};
-		 surface_ablation_rate={NaN,true,'Mat'};
-		 surface_mass_balance={NaN,true,'Mat'};
-		 dhdt={NaN,true,'Mat'};
-		 geothermalflux={NaN,true,'Mat'};
+		 surface_accumulation_rate={NaN,true,'DoubleMat',1};
+		 surface_ablation_rate={NaN,true,'DoubleMat',1};
+		 surface_mass_balance={NaN,true,'DoubleMat',1};
+		 dhdt={NaN,true,'DoubleMat',1};
+		 geothermalflux={NaN,true,'DoubleMat',1};
 		 observed_temperature={NaN,false};
-		 thickness_obs={NaN,true,'Mat'};
+		 thickness_obs={NaN,true,'DoubleMat',1};
 
 		 %Forcings
@@ -194,18 +194,18 @@
 
 		 %Statics parameters
-		 eps_res={0,true,'Scalar'};
-		 eps_rel={0,true,'Scalar'};
-		 eps_abs={0,true,'Scalar'};
-		 max_nonlinear_iterations={0,true,'Scalar'};
-		 sparsity={0,true,'Scalar'};
+		 eps_res={0,true,'Double'};
+		 eps_rel={0,true,'Double'};
+		 eps_abs={0,true,'Double'};
+		 max_nonlinear_iterations={0,true,'Double'};
+		 sparsity={0,true,'Double'};
 		 connectivity={0,true,'Integer'};
 		 lowmem={0,true,'Integer'};
-		 viscosity_overshoot={0,true,'Scalar'};
+		 viscosity_overshoot={0,true,'Double'};
 
 		 %Transient parameters
-		 dt={0,true,'Scalar'};
-		 ndt={0,true,'Scalar'};
+		 dt={0,true,'Double'};
+		 ndt={0,true,'Double'};
 		 time_adapt={0,true,'Integer'};
-		 cfl_coefficient={1/2,true,'Scalar'};
+		 cfl_coefficient={1/2,true,'Double'};
 		 adaptative_cfl={0,false};
 		 artificial_diffusivity={0,true,'Integer'};
@@ -226,18 +226,18 @@
 		 %Control
 		 control_analysis={0,true,'Integer'};
-		 control_type={0,true,'Mat'};
-		 weights={[],true,'Mat'};
+		 control_type={0,true,'DoubleMat',3};
+		 weights={[],true,'DoubleMat',1};
 		 nsteps={0,true,'Integer'};
-		 maxiter={[],true,'Mat'};
-		 cm_responses={[],true,'Mat'};
-		 tolx={0,true,'Scalar'};
-		 optscal={[],true,'Mat'};
-		 eps_cm={0,true,'Scalar'};
-		 cm_min={NaN,true,'Mat'};
-		 cm_max={NaN,true,'Mat'};
-		 cm_jump={[],true,'Mat'};
+		 maxiter={[],true,'DoubleMat',3};
+		 cm_responses={[],true,'DoubleMat',3};
+		 tolx={0,true,'Double'};
+		 optscal={[],true,'DoubleMat',3};
+		 eps_cm={0,true,'Double'};
+		 cm_min={NaN,true,'DoubleMat',3};
+		 cm_max={NaN,true,'DoubleMat',3};
+		 cm_jump={[],true,'DoubleMat',3};
 		 cm_gradient={0,true,'Integer'};
-		 epsvel={0,true,'Scalar'};
-		 meanvel={0,true,'Scalar'};
+		 epsvel={0,true,'Double'};
+		 meanvel={0,true,'Double'};
 		 num_control_type={0,true,'Integer'};
 		 num_cm_responses={0,true,'Integer'};
@@ -267,23 +267,23 @@
 		 outputfilename={'',true,'String'};
 		 results={struct(),false};
-		 vx={NaN,true,'Mat'};
-		 vy={NaN,true,'Mat'};
-		 vz={NaN,true,'Mat'};
+		 vx={NaN,true,'DoubleMat',1};
+		 vy={NaN,true,'DoubleMat',1};
+		 vz={NaN,true,'DoubleMat',1};
 		 vel={NaN,false};
-		 temperature={NaN,true,'Mat'}; %temperature solution vector
-		 waterfraction={NaN,true,'Mat'};
-		 gl_melting_rate={NaN,true,'Scalar'};
-		 basal_melting_rate={NaN,true,'Mat'};
-		 basal_melting_rate_correction={NaN,true,'Mat'};
+		 temperature={NaN,true,'DoubleMat',1}; %temperature solution vector
+		 waterfraction={NaN,true,'DoubleMat',1};
+		 gl_melting_rate={NaN,true,'Double'};
+		 basal_melting_rate={NaN,true,'DoubleMat',1};
+		 basal_melting_rate_correction={NaN,true,'DoubleMat',1};
 		 basal_melting_rate_correction_apply={0,true,'Integer'};
-		 pressure={NaN,true,'Mat'};
+		 pressure={NaN,true,'DoubleMat',1};
 		 
 		 %hydrology
-		 watercolumn={NaN,true,'Scalar'};
-		 hydro_n={0,true,'Scalar'};
-		 hydro_CR={0,true,'Scalar'};
-		 hydro_p={0,true,'Scalar'};
-		 hydro_q={0,true,'Scalar'};
-		 hydro_kn={0,true,'Scalar'};
+		 watercolumn={NaN,true,'Double'};
+		 hydro_n={0,true,'Double'};
+		 hydro_CR={0,true,'Double'};
+		 hydro_p={0,true,'Double'};
+		 hydro_q={0,true,'Double'};
+		 hydro_kn={0,true,'Double'};
 		 
 		 %Parallelisation parameters
@@ -292,5 +292,5 @@
 		 errlog={'',false};
 		 alloc_cleanup={1,false};
-		 waitonlock={0,true,'Scalar'};
+		 waitonlock={0,true,'Double'};
 
 		 %mesh2grid
@@ -332,5 +332,5 @@
 		 dakotadat={'',false};
 		 qmu_analysis={0,true,'Integer'};
-		 part={[],true,'Mat'};
+		 part={[],true,'DoubleMat',2};
 		 npart={0,true,'Integer'};
 		 numberofvariables={0,true,'Integer'};
Index: /issm/trunk/src/m/model/WriteData.m
===================================================================
--- /issm/trunk/src/m/model/WriteData.m	(revision 8966)
+++ /issm/trunk/src/m/model/WriteData.m	(revision 8967)
@@ -1,9 +1,15 @@
-function WriteData(fid,data,data_type,enum)
-%WRITEDATA - ...
+function WriteData(md,fid,template,field)
+%WRITEDATA 
 %
 %   Usage:
-%      WriteData(fid,data,data_type,enum)
+%      WriteData(md,fid,template,field)
 %
-%   Eg: WriteData(fid,md.elementoniceshelf,'Mat',ElementOnIceShelfEnum);
+%   Eg: WriteData(md,fid,template,'thickness')
+
+
+%first recover data, enum of the data and type of data
+data=md.(field);
+enum=BuildEnum(field);
+data_type=template.(field){3};
 
 if issparse(data),
@@ -11,14 +17,55 @@
 end
 
-%Ok! put the length of the name, and the "name" string first!
+%Ok! write the enum (name) to identify this record uniquely
 fwrite(fid,enum,'int'); 
 
-if strcmpi(data_type,'String'),
-	%first write length of record
-	fwrite(fid,length(data)+4,'int');  %4 for int32
+%Now, write the data itself.
+
+if     strcmpi(data_type,'Boolean'),%{{{
+	%first write length of record
+	fwrite(fid,1+4,'int');  %1 bool+code
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+
+	%now write integer
+	fwrite(fid,data,'uint'); 
+	%}}}
+elseif strcmpi(data_type,'Integer'), %{{{
+	%first write length of record
+	fwrite(fid,4+4,'int');  %1 integer + code
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+
+	%now write integer
+	fwrite(fid,data,'int'); 
+	%}}}
+elseif strcmpi(data_type,'Double'), %{{{
+	%first write length of record
+	fwrite(fid,8+4,'int');  %1 double+code
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+
+	%now write double
+	fwrite(fid,data,'double'); 
+	%}}}
+elseif strcmpi(data_type,'String'), %{{{
+	%first write length of record
+	fwrite(fid,length(data)+4+4,'int');  %string + string size + code
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+
 	%now write string
 	fwrite(fid,length(data),'int'); 
 	fwrite(fid,data,'char'); 
-elseif strcmpi(data_type,'Mat'),
+	%}}}
+elseif strcmpi(data_type,'BooleanMat'), %{{{
+
+	%matrix type:
+	mattype=template.(field){4};
+
 	%Get size
 	s=size(data);
@@ -29,5 +76,9 @@
 	
 	%first write length of record
-	fwrite(fid,4+4+8*s(1)*s(2),'int');  %2 integers (32 bits) + the double matrix
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+	fwrite(fid,mattype,'int');
 
 	%now write matrix
@@ -37,44 +88,63 @@
 		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
 	end
-elseif strcmpi(data_type,'Integer'),
-	%first write length of record
-	fwrite(fid,4,'int');  %1 integer
-
-	%now write integer
-	fwrite(fid,data,'int'); 
-elseif strcmpi(data_type,'Scalar'),
-	%first write length of record
-	fwrite(fid,8,'int');  %1 double
-	%now write double
-	fwrite(fid,data,'double'); 
-elseif strcmpi(data_type,'StringArray'),
-
-	%first get length of string array: 
-	num=numel(data);
-	%now get length of record: 
-	recordlength=4; %for length of array
-	for i=1:num,
-		string=data{i};
-		recordlength=recordlength+4+length(string); %for each string
-	end
-
-	%write length of record
-	fwrite(fid,recordlength,'int'); 
-
-	%now write length of string array
-	fwrite(fid,num,'int'); 
-	
-	%now write the strings
-	for i=1:num,
-		string=data{i};
-		fwrite(fid,length(string),'int'); 
-		fwrite(fid,string,'char'); 
-	end
-elseif strcmpi(data_type,'MatArray'),
+	%}}}
+elseif strcmpi(data_type,'IntMat'), %{{{
+
+	%matrix type:
+	mattype=template.(field){4};
+
+	%Get size
+	s=size(data);
+	%if matrix = NaN, then do not write anything
+	if (s(1)==1 & s(2)==1 & isnan(data)),
+		s(1)=0; s(2)=0;
+	end
+	
+	%first write length of record
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+	fwrite(fid,mattype,'int');
+
+	%now write matrix
+	fwrite(fid,s(1),'int'); 
+	fwrite(fid,s(2),'int'); 
+	if s(1)*s(2),
+		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
+	end
+	%}}}
+elseif strcmpi(data_type,'DoubleMat'), %{{{
+
+	%matrix type:
+	mattype=template.(field){4};
+
+	%Get size
+	s=size(data);
+	%if matrix = NaN, then do not write anything
+	if (s(1)==1 & s(2)==1 & isnan(data)),
+		s(1)=0; s(2)=0;
+	end
+	
+	%first write length of record
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+	fwrite(fid,mattype,'int');
+
+	%now write matrix
+	fwrite(fid,s(1),'int'); 
+	fwrite(fid,s(2),'int'); 
+	if s(1)*s(2),
+		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
+	end
+	%}}}
+elseif strcmpi(data_type,'MatArray'), %{{{1
 
 	numrecords=numel(data);
 	
 	%first get length of record
-	recordlength=4; %number of records=
+	recordlength=4+4; %number of records + code
 	for i=1:numrecords,
 		matrix=data{i};
@@ -86,4 +156,7 @@
 	%write length of record
 	fwrite(fid,recordlength,'int'); 
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
 
 	%write data, first number of records
@@ -98,5 +171,59 @@
 		fwrite(fid,matrix','double');
 	end
+	%}}}
+elseif strcmpi(data_type,'StringArray'), %{{{1
+
+	%first get length of string array: 
+	num=numel(data);
+	%now get length of record: 
+	recordlength=4+4; %for length of array + code
+	for i=1:num,
+		string=data{i};
+		recordlength=recordlength+4+length(string); %for each string
+	end
+
+	%write length of record
+	fwrite(fid,recordlength,'int'); 
+
+	%write data code: 
+	fwrite(fid,TypeToCode(data_type),'int'); 
+
+	%now write length of string array
+	fwrite(fid,num,'int'); 
+	
+	%now write the strings
+	for i=1:num,
+		string=data{i};
+		fwrite(fid,length(string),'int'); 
+		fwrite(fid,string,'char'); 
+	end
+	%}}}
 else 
 	error('WriteData error message: data type not supported yet!');
 end
+
+function code=TypeToCode(data_type) %{{{1
+%This routine takes the data_type string, and hardcodes it into an integer, which 
+%is passed along the record, in order to identify the nature of the dataset being 
+%sent.
+if     strcmpi(data_type,'Boolean'),
+	code=1;
+elseif strcmpi(data_type,'Integer'), 
+	code=2;
+elseif strcmpi(data_type,'Double'), 
+	code=3;
+elseif strcmpi(data_type,'String'), 
+	code=4;
+elseif strcmpi(data_type,'BooleanMat'),
+	code=5;
+elseif strcmpi(data_type,'IntMat'),
+	code=6;
+elseif strcmpi(data_type,'DoubleMat'),
+	code=7;
+elseif strcmpi(data_type,'MatArray'), 
+	code=8;
+elseif strcmpi(data_type,'StringArray'),
+	code=9;
+else 
+	error('TypeToCode error message: data type not supported yet!');
+end%}}}
Index: /issm/trunk/src/m/model/marshall.m
===================================================================
--- /issm/trunk/src/m/model/marshall.m	(revision 8966)
+++ /issm/trunk/src/m/model/marshall.m	(revision 8967)
@@ -23,7 +23,5 @@
 	marshall=template.(field){2};
 	if marshall,
-		enum=BuildEnum(field);
-		type=template.(field){3};
-		WriteData(fid,md.(field),type,enum);
+		WriteData(md,fid,template,field);
 	end
 end
