Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 1880)
+++ /issm/trunk/src/c/Makefile.am	(revision 1881)
@@ -23,4 +23,6 @@
 					./objects/Model.h\
 					./objects/Model.cpp\
+					./objects/FemModel.h\
+					./objects/FemModel.cpp\
 					./objects/Material.h\
 					./objects/Material.cpp\
@@ -318,4 +320,6 @@
 					./objects/Model.h\
 					./objects/Model.cpp\
+					./objects/FemModel.h\
+					./objects/FemModel.cpp\
 					./objects/Material.h\
 					./objects/Material.cpp\
Index: /issm/trunk/src/c/ModelProcessorx/IoModel.h
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 1880)
+++ /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 1881)
@@ -11,5 +11,5 @@
 #include "../toolkits/toolkits.h"
 
-#define RIFTINFOSIZE 10
+#define RIFTINFOSIZE 11
 
 struct IoModel {
Index: /issm/trunk/src/c/Qmux/DakotaResponses.cpp
===================================================================
--- /issm/trunk/src/c/Qmux/DakotaResponses.cpp	(revision 1880)
+++ /issm/trunk/src/c/Qmux/DakotaResponses.cpp	(revision 1881)
@@ -20,14 +20,8 @@
 	char* response_descriptor=NULL;
 	int numberofnodes;
-	FemModel* fem=NULL;
 	extern int my_rank;
 
-	/*recover first model: */
-	fem=model->DiagnosticHorizontal();
-
 	/*some data needed across the responses: */
-	found=fem->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	if(!found)throw ErrorException(__FUNCT__," could not find numberofnodes in fem model");
-
+	model->FindParam(&numberofnodes,"numberofnodes");
 
 	for(i=0;i<numresponses;i++){
Index: /issm/trunk/src/c/Qmux/Qmux.cpp
===================================================================
--- /issm/trunk/src/c/Qmux/Qmux.cpp	(revision 1880)
+++ /issm/trunk/src/c/Qmux/Qmux.cpp	(revision 1881)
@@ -76,7 +76,7 @@
 	#ifdef _PARALLEL_
 	/*Recover dakota_input_file, dakota_output_file and dakota_error_file, in the parameters dataset in parallel */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&dakota_input_file,"qmuinname");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&dakota_output_file,"qmuoutname");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&dakota_error_file,"qmuerrname");
+	model->FindParam(&dakota_input_file,"qmuinname");
+	model->FindParam(&dakota_output_file,"qmuoutname");
+	model->FindParam(&dakota_error_file,"qmuerrname");
 	#endif
 
Index: /issm/trunk/src/c/Qmux/SpawnCoreParallel.cpp
===================================================================
--- /issm/trunk/src/c/Qmux/SpawnCoreParallel.cpp	(revision 1880)
+++ /issm/trunk/src/c/Qmux/SpawnCoreParallel.cpp	(revision 1881)
@@ -58,8 +58,8 @@
 	
 	/*some parameters needed: */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&debug,"debug");
+	model->FindParam(&debug,"debug");
 		
 	/*First off, recover the response descriptors for the response functions: */
-	param=(Param*)model->DiagnosticHorizontal()->parameters->FindParamObject("responsedescriptors");
+	param=(Param*)model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum())->parameters->FindParamObject("responsedescriptors");
 	if(!param)throw ErrorException(__FUNCT__," could not find response descriptors!");
 
@@ -67,6 +67,6 @@
 
 	/*Recover partitioning for dakota: */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&qmu_npart,"qmu_npart");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&qmu_part,"qmu_part");
+	model->FindParam(&qmu_npart,"qmu_npart");
+	model->FindParam(&qmu_part,"qmu_part");
 	#ifdef _DEBUG_
 	for(i=0;i<numresponses;i++){
@@ -116,5 +116,5 @@
 
 	/*Modify core inputs to reflect the dakota variables inputs: */
-	inputs->UpdateFromDakota(variables,variables_descriptors,numvariables,model->DiagnosticHorizontal()->parameters,qmu_part,qmu_npart); //diagnostic horiz model is the one holding the parameters for Dakota.
+	inputs->UpdateFromDakota(variables,variables_descriptors,numvariables,model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum())->parameters,qmu_part,qmu_npart); //diagnostic horiz model is the one holding the parameters for Dakota.
 
 	/*Run the analysis core solution sequence, with the updated inputs: */
Index: /issm/trunk/src/c/include/types.h
===================================================================
--- /issm/trunk/src/c/include/types.h	(revision 1881)
+++ /issm/trunk/src/c/include/types.h	(revision 1881)
@@ -0,0 +1,20 @@
+/*!\file: types.h
+ * \brief prototypes for types.h
+ */ 
+
+#ifndef _TYPES_H_
+#define  _TYPES_H_
+
+
+/*Define abstract type for I/O: */
+#ifdef _SERIAL_
+#include <mex.h>
+typedef const mxArray* ConstDataHandle;  //serially, we are reading data from a matlab array.
+typedef mxArray* DataHandle;  
+#else 
+typedef FILE* ConstDataHandle; //in parallel, we are reading data from a file.
+typedef FILE* DataHandle; 
+#endif
+
+#endif //ifndef _TYPES_H_
+
Index: /issm/trunk/src/c/io/io.h
===================================================================
--- /issm/trunk/src/c/io/io.h	(revision 1880)
+++ /issm/trunk/src/c/io/io.h	(revision 1881)
@@ -8,15 +8,7 @@
 #include "../objects/NodeSets.h"
 #include "../DataSet/DataSet.h"
+#include "../include/types.h"
 
-/*Define abstract type for I/O: */
-#ifdef _SERIAL_
-#include <mex.h>
-typedef const mxArray* ConstDataHandle;  //serially, we are reading data from a matlab array.
-typedef mxArray* DataHandle;  
-#else 
-typedef FILE* ConstDataHandle; //in parallel, we are reading data from a file.
-typedef FILE* DataHandle; 
-#endif
-
+class DataSet;
 
 void FetchData(void** pdata,int* pM,int* pN,ConstDataHandle data_handle,char* data_type,char* sub_data_type);
@@ -45,5 +37,5 @@
 /*File I/O: */
 FILE* pfopen(char* filename,char* format);
-void* pfclose(FILE* fid,char* filename);
+void  pfclose(FILE* fid,char* filename);
 
 #endif	/* _IMDB_H */
Index: /issm/trunk/src/c/issm.h
===================================================================
--- /issm/trunk/src/c/issm.h	(revision 1880)
+++ /issm/trunk/src/c/issm.h	(revision 1881)
@@ -16,4 +16,5 @@
 #include "include/macros.h"
 #include "include/globals.h"
+#include "include/types.h"
 
 /*Modules: */
Index: /issm/trunk/src/c/objects/FemModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/FemModel.cpp	(revision 1881)
+++ /issm/trunk/src/c/objects/FemModel.cpp	(revision 1881)
@@ -0,0 +1,158 @@
+/*!\file FemModel.c
+ * \brief: implementation of the FemModel object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./FemModel.h"
+#include "stdio.h"
+
+FemModel::FemModel(){
+
+	elements=NULL;
+	nodes=NULL;
+	constraints=NULL;
+	loads=NULL;
+	materials=NULL;
+	parameters=NULL;
+
+	partition=NULL;
+	tpartition=NULL;
+	yg=NULL;
+	Rmg=NULL;
+	nodesets=NULL;
+	ys=NULL;
+	ys0=NULL;
+	Gmn=NULL;
+
+}
+
+FemModel::FemModel(DataSet* femmodel_elements,DataSet* femmodel_nodes,DataSet* femmodel_constraints,DataSet* femmodel_loads,
+		DataSet* femmodel_materials,DataSet* femmodel_parameters, Vec femmodel_partition,Vec femmodel_tpartition,Vec femmodel_yg,
+		Mat femmodel_Rmg,Mat femmodel_Gmn,NodeSets* femmodel_nodesets,Vec femmodel_ys,Vec femmodel_ys0){
+
+
+	elements=femmodel_elements;
+	nodes=femmodel_nodes;
+	constraints=femmodel_constraints;
+	loads=femmodel_loads;
+	materials=femmodel_materials;
+	parameters=femmodel_parameters;
+
+	partition=femmodel_partition;
+	tpartition=femmodel_tpartition;
+	yg=femmodel_yg;
+	Rmg=femmodel_Rmg;
+	nodesets=femmodel_nodesets;
+	ys=femmodel_ys;
+	ys0=femmodel_ys0;
+	Gmn=femmodel_Gmn;
+
+}
+
+FemModel::~FemModel(){
+
+	delete elements;
+	delete nodes;
+	delete loads;
+	delete materials;
+	delete parameters;
+
+	VecFree(&partition);
+	VecFree(&tpartition);
+	VecFree(&yg);
+	MatFree(&Rmg);
+	delete nodesets;
+	VecFree(&ys);
+	VecFree(&ys0);
+	MatFree(&Gmn);
+
+}
+
+#undef __FUNCT__
+#define __FUNCT__ "FemModel::Echo"
+
+void FemModel::Echo(void){
+
+	printf("FemModels echo: \n");
+	printf("   elements: %p\n",elements);
+	printf("   nodes: %p\n",nodes);
+	printf("   loads: %p\n",loads);
+	printf("   materials: %p\n",materials);
+	printf("   parameters: %p\n",parameters);
+	
+	printf("   partition: %p\n",partition);
+	printf("   tpartition: %p\n",tpartition);
+	printf("   yg: %p\n",yg);
+	printf("   Rmg: %p\n",Rmg);
+	printf("   nodesets: %p\n",nodesets);
+	printf("   ys: %p\n",ys);
+	printf("   ys0: %p\n",ys0);
+	printf("   Gmn: %p\n",Gmn);
+
+}
+#undef __FUNCT__
+#define __FUNCT__ "FemModel::DeepEcho"
+
+void FemModel::DeepEcho(void){
+	
+	printf("FemModels echo: \n");
+	printf("   elements: \n");
+	elements->Echo();
+	printf("   nodes: \n");
+	nodes->Echo();
+	printf("   loads: \n");
+	nodes->Echo();
+	printf("   materials: \n");
+	nodes->Echo();
+	printf("   parameters: \n");
+	nodes->Echo();
+	
+	printf("   partition: \n");
+	VecView(partition,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   tpartition: \n");
+	VecView(tpartition,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   yg: \n");
+	VecView(yg,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   Rmg: \n");
+	MatView(Rmg,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   nodesets: \n");
+	nodesets->Echo();
+	printf("   ys: \n");
+	VecView(ys,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   ys0: \n");
+	VecView(ys0,PETSC_VIEWER_STDOUT_WORLD);
+	printf("   Gmn: \n");
+	MatView(Gmn,PETSC_VIEWER_STDOUT_WORLD);
+
+}
+
+#undef __FUNCT__
+#define __FUNCT__ "FemModel::FindParam"
+		
+int FemModel::FindParam(void* pparameter,char* parametername){
+	
+	return parameters->FindParam(pparameter,parametername);
+
+}
+
+
+/*access to internal data: */
+DataSet*            FemModel::get_elements(void){return elements;}
+DataSet*            FemModel::get_nodes(void){return nodes ;}
+DataSet*            FemModel::get_constraints(void){return constraints ;}
+DataSet*            FemModel::get_loads(void){return loads;}
+DataSet*            FemModel::get_materials(void){return materials;}
+DataSet*            FemModel::get_parameters(void){return parameters;}
+Vec                 FemModel::get_partition(void){return partition;}
+Vec                 FemModel::get_tpartition(void){return tpartition;}
+Vec                 FemModel::get_yg(void){return yg;}
+Mat                 FemModel::get_Rmg(void){return Rmg;}
+NodeSets*           FemModel::get_nodesets(void){return nodesets;}
+Vec                 FemModel::get_ys(void){return ys;}
+Vec                 FemModel::get_ys0(void){return ys0;}
+Mat                 FemModel::get_Gmn(void){return Gmn;}
Index: /issm/trunk/src/c/objects/FemModel.h
===================================================================
--- /issm/trunk/src/c/objects/FemModel.h	(revision 1880)
+++ /issm/trunk/src/c/objects/FemModel.h	(revision 1881)
@@ -8,26 +8,80 @@
 #include "../toolkits/toolkits.h"
 #include "../DataSet/DataSet.h"
+#include "../parallel/parallel.h"
 
 class DataSet;
+struct OptArgs;
 
-struct FemModel{
+class FemModel{
 
-	DataSet*            elements;
-	DataSet*            nodes;
-	DataSet*            constraints;
-	DataSet*            loads;
-	DataSet*            materials;
-	DataSet*            parameters;
+	friend  Vec GradJCompute(ParameterInputs* inputs,FemModel* femmodel);
+	friend	void diagnostic_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void prognostic_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void control_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void thermal_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void thermal_core_nonlinear(Vec* ptg,double* pmelting_offset,FemModel* fem,ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
+	friend	void steadystate_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void diagnostic_core_nonlinear(Vec* pug,Mat* pK_ff0,Mat* pK_fs0, DataSet* loads, FemModel* fem,ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
+	friend	void diagnostic_core_linear(Vec* ppg,FemModel* fem,ParameterInputs* inputs,int  analysis_type,int sub_analysis_type);
+	friend	void transient_core(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void transient_core_2d(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	void transient_core_3d(DataSet* results,Model* model, ParameterInputs* inputs);
+	friend	double objectivefunctionC(double search_scalar,OptArgs* optargs);
+	friend	int GradJSearch(double* search_vector,FemModel* femmodel,int step);
+	friend	void OutputResults(DataSet* results,char* filename);
+	friend	void WriteLockFile(char* filename);
+	friend	void ControlInitialization(Model* model, ParameterInputs* inputs);
+	friend	void ControlTemporaryResults(Model* model,double* param_g,double* J,int n,ParameterInputs* inputs);
+	friend	void CreateFemModel(FemModel* femmodel,ConstDataHandle MODEL,int analysis_type,int sub_analysis_type);
+	friend	void ProcessResults(DataSet** presults,Model* model,int analysis_type);
+	friend  void SpawnCoreParallel(double* responses, int numresponses, double* variables, char** variables_descriptors,int numvariables, Model* model,ParameterInputs* inputs,int analysis_type,int sub_analysis_type,int counter);
 
-	Vec                 partition;
-	Vec                 tpartition;
-	Vec                 yg;
-	Mat                 Rmg;
-	NodeSets*           nodesets;
-	Vec                 ys;
-	Vec                 ys0;
-	Mat                 Gmn;
+	private: 
+		DataSet*            elements;
+		DataSet*            nodes;
+		DataSet*            constraints;
+		DataSet*            loads;
+		DataSet*            materials;
+		DataSet*            parameters;
+
+		Vec                 partition;
+		Vec                 tpartition;
+		Vec                 yg;
+		Mat                 Rmg;
+		NodeSets*           nodesets;
+		Vec                 ys;
+		Vec                 ys0;
+		Mat                 Gmn;
+
+	public:
+
+		FemModel();
+		~FemModel();
+		FemModel(DataSet* elements,DataSet* nodes,DataSet* constraints,DataSet* loads,DataSet* materials,DataSet* parameters,
+			              Vec partition,Vec tpartition,Vec yg,Mat Rmg,Mat Gmn,NodeSets* nodesets,Vec ys,Vec ys0);
+      
+		void  Echo();
+		void  DeepEcho();
+		
+		int FindParam(void* pparameter,char* parametername);
+		DataSet* get_elements(void);
+		DataSet* get_nodes(void);
+		DataSet* get_constraints(void);
+		DataSet* get_loads(void);
+		DataSet* get_materials(void);
+		DataSet* get_parameters(void);
+		Vec      get_partition(void);
+		Vec      get_tpartition(void);
+		Vec      get_yg(void);
+		Mat      get_Rmg(void);
+		NodeSets* get_nodesets(void);
+		Vec      get_ys(void);
+		Vec      get_ys0(void);
+		Mat      get_Gmn(void);
+
+
 
 };
 
+
 #endif
Index: /issm/trunk/src/c/objects/Model.cpp
===================================================================
--- /issm/trunk/src/c/objects/Model.cpp	(revision 1880)
+++ /issm/trunk/src/c/objects/Model.cpp	(revision 1881)
@@ -2,4 +2,10 @@
  * \brief: implementation of the Model object
  */
+
+#include "./objects.h"
+#include "../io/io.h"
+#include "../shared/shared.h"
+#include "../include/macros.h"
+#include "../issm.h"
 
 #ifdef HAVE_CONFIG_H
@@ -13,10 +19,14 @@
 
 Model::Model(){
-	return;
+
+	femmodels=new DataSet(0);
+	active=NULL;
+
 }
 
 Model::~Model(){
-	/*none of the FemModels are copied, just pointers -> no dynamic allocation.*/
-	return;
+
+	delete femmodels;
+	/*do not delete active, it just points to one of the femmodels!*/
 }
 
@@ -26,14 +36,6 @@
 void Model::Echo(void){
 
-	printf("Model:\n");
-	printf("   diagnostichorizontal: %p\n",diagnostichorizontal);
-	printf("   diagnosticvertical: %p\n",diagnosticvertical);
-	printf("   diagnosticstokes: %p\n",diagnosticstokes);
-	printf("   diagnostichutter: %p\n",diagnostichutter);
-	printf("   slope: %p\n",slope);
-	printf("   prognostic: %p\n",prognostic);
-	printf("   thermal: %p\n",thermal);
-	printf("   melting: %p\n",melting);
-	printf("   active: %p\n",active);
+	printf("Models echo: \n");
+	printf("   number of fem models: %i\n",femmodels->Size());
 
 }
@@ -43,46 +45,320 @@
 void Model::DeepEcho(void){
 
-	printf("Model:\n");
-	printf("   diagnostichorizontal: %p\n",diagnostichorizontal);
-	printf("   diagnosticvertical: %p\n",diagnosticvertical);
-	printf("   diagnosticstokes: %p\n",diagnosticstokes);
-	printf("   diagnostichutter: %p\n",diagnostichutter);
-	printf("   slope: %p\n",slope);
-	printf("   prognostic: %p\n",prognostic);
-	printf("   thermal: %p\n",thermal);
-	printf("   melting: %p\n",melting);
-	printf("   active: %p\n",active);
-
-}
-
-FemModel* Model::DiagnosticHorizontal(void){
-	return diagnostichorizontal;
-}
-FemModel* Model::DiagnosticVertical(void){
-	return diagnosticvertical;
-}
-FemModel* Model::DiagnosticStokes(void){
-	return diagnosticstokes;
-}
-FemModel* Model::DiagnosticHutter(void){
-	return diagnostichutter;
-}
-FemModel* Model::Slope(void){
-	return slope;
-}
-FemModel* Model::Prognostic(void){
-	return prognostic;
-}
-FemModel* Model::Thermal(void){
-	return thermal;
-}
-FemModel* Model::Melting(void){
-	return melting;
-}
-FemModel* Model::Active(void){
-	return active;
+	femmodels->Echo();
+
 }
 		
-void      Model::SetActive(FemModel* femmodel){
+#undef __FUNCT__
+#define __FUNCT__ "Model::AddFormulation"
+void  Model::AddFormulation(ConstDataHandle MODEL, int analysis_type,int sub_analysis_type){
+
+	/*FemModel: */
+	FemModel*           femmodel=NULL;
+	DataSet*            elements=NULL;
+	DataSet*            nodes=NULL;
+	DataSet*            constraints=NULL;
+	DataSet*            loads=NULL;
+	DataSet*            materials=NULL;
+	DataSet*            parameters=NULL;
+	Vec                 partition=NULL;
+	Vec                 tpartition=NULL;
+	Vec                 yg=NULL;
+	Mat                 Rmg=NULL;
+	Mat                 Gmn=NULL;
+	NodeSets*           nodesets=NULL;
+	Vec                 ys=NULL;
+	Vec                 ys0=NULL;
+
+	/*intermediary: */
+	IoModel* iomodel=NULL;
+	
+	_printf_("   fill model with matlab workspace data\n");
+	IoModelInit(&iomodel,MODEL); 
+
+	_printf_("   specifying analysis\n");
+	if (analysis_type!=0){
+		iomodel->analysis_type=analysis_type;
+	}
+	if (sub_analysis_type!=0){
+		iomodel->sub_analysis_type=sub_analysis_type;
+	}
+
+	_printf_("   create datasets:\n");
+	CreateDataSets(&elements,&nodes,&materials,&constraints,&loads,&parameters,iomodel,MODEL);
+
+	_printf_("   create degrees of freedom: \n");
+	Dofx( &partition,&tpartition,elements,nodes, parameters);
+	
+	_printf_("   create single point constraints: \n");
+	SpcNodesx( &yg, nodes,constraints); 
+	
+	_printf_("   create rigid body constraints:\n");
+	MpcNodesx( &Rmg, nodes,constraints); 
+	
+	_printf_("   create node sets:\n");
+	BuildNodeSetsx(&nodesets, nodes);
+
+	_printf_("   reducing single point constraints vector:\n");
+	Reducevectorgtosx(&ys,&ys0, yg,nodesets);
+	
+	_printf_("   normalizing rigid body constraints matrix:\n");
+	NormalizeConstraintsx(&Gmn, Rmg,nodesets);
+
+	_printf_("   configuring element and loads:\n");
+	ConfigureObjectsx(elements, loads, nodes, materials);
+
+	_printf_("   process parameters:\n");
+	ProcessParamsx( parameters, partition);
+
+	_printf_("   free ressources:\n");
+	DeleteIoModel(&iomodel);
+
+	/*Use all the data created to create an femmodel: */
+	femmodel=new FemModel(elements,nodes,constraints,loads,materials,parameters,
+			              partition,tpartition,yg,Rmg,Gmn,nodesets,ys,ys0);
+
+	/*Add to femmodels in model: */
+	femmodels->AddObject((Object*)femmodel);
+
+}
+
+
+#undef __FUNCT__
+#define __FUNCT__ "Model::FindParam"
+
+int   Model::FindParam(int* pparameter,char* parametername){
+
+	FemModel* femmodel=NULL;
+
+	/*no analysis_type or sub_analysis_type, find the parameter in the first dataset we find: */
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*recover first femmodel: */
+	femmodel=(FemModel*)femmodels->GetObjectByOffset(0);
+
+	if(!femmodel)return 0;
+
+	femmodel->FindParam((void*)pparameter,parametername);
+
+}
+int   Model::FindParam(double* pparameter,char* parametername){
+	
+	FemModel* femmodel=NULL;
+
+	/*no analysis_type or sub_analysis_type, find the parameter in the first dataset we find: */
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*recover first femmodel: */
+	femmodel=(FemModel*)femmodels->GetObjectByOffset(0);
+	
+	if(!femmodel)return 0;
+	
+	femmodel->FindParam((void*)pparameter,parametername);
+
+
+}
+int   Model::FindParam(double** pparameter,char* parametername){
+	
+	FemModel* femmodel=NULL;
+
+	/*no analysis_type or sub_analysis_type, find the parameter in the first dataset we find: */
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*recover first femmodel: */
+	femmodel=(FemModel*)femmodels->GetObjectByOffset(0);
+	
+	if(!femmodel)return 0;
+	
+	femmodel->FindParam((void*)pparameter,parametername);
+
+
+}
+int   Model::FindParam(char** pparameter,char* parametername){
+	
+	FemModel* femmodel=NULL;
+
+	/*no analysis_type or sub_analysis_type, find the parameter in the first dataset we find: */
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*recover first femmodel: */
+	femmodel=(FemModel*)femmodels->GetObjectByOffset(0);
+	
+	if(!femmodel)return 0;
+	
+	femmodel->FindParam((void*)pparameter,parametername);
+
+}
+
+int   Model::FindParam(int* pparameter,char* parametername,int analysis_type,int sub_analysis_type){
+	
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type,sub_analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+int   Model::FindParam(double* pparameter,char* parametername,int analysis_type,int sub_analysis_type){
+	
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type,sub_analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+
+int   Model::FindParam(double** pparameter,char* parametername,int analysis_type,int sub_analysis_type){
+
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type,sub_analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+int   Model::FindParam(char** pparameter,char* parametername,int analysis_type,int sub_analysis_type){
+
+	FemModel* femmodel=NULL;
+	
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type,sub_analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+int   Model::FindParam(int* pparameter,char* parametername,int analysis_type){
+	
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+int   Model::FindParam(double* pparameter,char* parametername,int analysis_type){
+	
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+
+int   Model::FindParam(double** pparameter,char* parametername,int analysis_type){
+
+	FemModel* femmodel=NULL;
+
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}
+
+int   Model::FindParam(char** pparameter,char* parametername,int analysis_type){
+
+	FemModel* femmodel=NULL;
+	
+	/*find the correct formulation: */
+	femmodel=this->GetFormulation(analysis_type);
+	
+	if(!femmodel)return 0;
+
+	/*extract our parameter from the found formulation: */
+	femmodel->FindParam((void*)pparameter,parametername);
+}	
+
+#undef __FUNCT__
+#define __FUNCT__ "Model::GetFormulation"
+
+FemModel* Model::GetFormulation(int analysis_type,int sub_analysis_type){
+	
+	int i;
+	FemModel* femmodel=NULL;
+	int femmodel_analysis_type;
+	int femmodel_sub_analysis_type;
+	int found=0;
+	
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*find femmodel with correct analysis_type and sub_analysis_type: */
+	for(i=0;i<femmodels->Size();i++){
+
+		femmodel=(FemModel*)femmodels->GetObjectByOffset(i);
+		femmodel->FindParam((void*)&femmodel_analysis_type,"analysis_type");
+		femmodel->FindParam((void*)&femmodel_sub_analysis_type,"sub_analysis_type");
+
+		if((analysis_type==femmodel_analysis_type) && (sub_analysis_type==femmodel_sub_analysis_type)){
+			found=1;
+			break;
+		}
+	}
+
+	if(!found)return NULL;
+	else return femmodel;
+}
+		
+#undef __FUNCT__
+#define __FUNCT__ "Model::GetFormulation"
+
+FemModel* Model::GetFormulation(int analysis_type){
+	
+	int i;
+	FemModel* femmodel=NULL;
+	int femmodel_analysis_type;
+	int femmodel_sub_analysis_type;
+	int found=0;
+	
+	if (!femmodels->Size())throw ErrorException(__FUNCT__," no fem models were found!");
+
+	/*find femmodel with correct analysis_type and sub_analysis_type: */
+	for(i=0;i<femmodels->Size();i++){
+
+		femmodel=(FemModel*)femmodels->GetObjectByOffset(i);
+		femmodel->FindParam((void*)&femmodel_analysis_type,"analysis_type");
+
+		if((analysis_type==femmodel_analysis_type)){
+			found=1;
+			break;
+		}
+	}
+
+	if(!found)return NULL;
+	else return femmodel;
+}
+		
+
+FemModel* Model::GetActiveFormulation(){return active;}
+		
+
+void* Model::SetActiveFormulation(FemModel* femmodel){
 	active=femmodel;
 }
+
Index: /issm/trunk/src/c/objects/Model.h
===================================================================
--- /issm/trunk/src/c/objects/Model.h	(revision 1880)
+++ /issm/trunk/src/c/objects/Model.h	(revision 1881)
@@ -6,20 +6,17 @@
 #define _MODEL_H_
 
+#include "../include/types.h"
+
 struct FemModel;
+class DataSet;
+
 class Model{
 
 	private: 
 
-		/*femmodels for each formulation:*/
-		FemModel* diagnostichorizontal;
-		FemModel* diagnosticvertical;
-		FemModel* diagnosticstokes;
-		FemModel* diagnostichutter;
-		FemModel* slope;
-		FemModel* prognostic;
-		FemModel* thermal;
-		FemModel* melting;
+		/*femmodels for each formulation: dynamic, can have as many*/
+		DataSet* femmodels;
 		
-		/*active one: */
+		/*active femmodel: points to a FemModel in the femmodels dataset*/
 		FemModel* active;
 
@@ -31,14 +28,28 @@
 		void  Echo();
 		void  DeepEcho();
-		FemModel* DiagnosticHorizontal(void);
-		FemModel* DiagnosticVertical(void);
-		FemModel* DiagnosticStokes(void);
-		FemModel* DiagnosticHutter(void);
-		FemModel* Slope(void);
-		FemModel* Prognostic(void);
-		FemModel* Thermal(void);
-		FemModel* Melting(void);
-		FemModel* Active(void);
-		void      SetActive(FemModel* femmodel);
+
+		void  AddFormulation(ConstDataHandle MODEL, int analysis_type,int sub_analysis_type);
+
+		/*all overloaded forms of the FindParam routine: */
+		int   FindParam(int* pparameter,char* parametername);
+		int   FindParam(double* pparameter,char* parametername);
+		int   FindParam(double** pparameter,char* parametername);
+		int   FindParam(char** pparameter,char* parametername);
+
+		int   FindParam(int* pparameter,char* parametername,int analysis_type,int sub_analysis_type);
+		int   FindParam(double* pparameter,char* parametername,int analysis_type,int sub_analysis_type);
+		int   FindParam(double** pparameter,char* parametername,int analysis_type,int sub_analysis_type);
+		int   FindParam(char** pparameter,char* parametername,int analysis_type,int sub_analysis_type);
+
+		int   FindParam(int* pparameter,char* parametername,int analysis_type);
+		int   FindParam(double* pparameter,char* parametername,int analysis_type);
+		int   FindParam(double** pparameter,char* parametername,int analysis_type);
+		int   FindParam(char** pparameter,char* parametername,int analysis_type);
+
+		FemModel* GetFormulation(int analysis_type,int sub_analysis_type);
+		FemModel* GetFormulation(int analysis_type);
+
+		FemModel* GetActiveFormulation();
+		void* SetActiveFormulation(FemModel* femmodel);
 
 };
Index: /issm/trunk/src/c/objects/OptArgs.h
===================================================================
--- /issm/trunk/src/c/objects/OptArgs.h	(revision 1880)
+++ /issm/trunk/src/c/objects/OptArgs.h	(revision 1881)
@@ -24,5 +24,4 @@
 #else
 
-#include "./FemModel.h"
 #include "./ParameterInputs.h"
 class ParameterInputs;
Index: /issm/trunk/src/c/objects/Riftfront.cpp
===================================================================
--- /issm/trunk/src/c/objects/Riftfront.cpp	(revision 1880)
+++ /issm/trunk/src/c/objects/Riftfront.cpp	(revision 1881)
@@ -268,5 +268,5 @@
 	nodesin=(DataSet*)pnodesin;
 	materialsin=(DataSet*)pmaterialsin;
-	
+
 	/*Link this load with its nodes: */
 	ResolvePointers((Object**)nodes,node_ids,node_offsets,MAX_RIFTFRONT_GRIDS,nodesin);
Index: /issm/trunk/src/c/parallel/ControlInitialization.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ControlInitialization.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/ControlInitialization.cpp	(revision 1881)
@@ -52,28 +52,28 @@
 	int dof3[1]={3};
 
+	/*first recover parameters common to all solutions:*/
+	model->FindParam(&debug,"debug");
+	model->FindParam(&dim,"dim");
+	model->FindParam(&ishutter,"ishutter");
+	model->FindParam(&ismacayealpattyn,"ismacayealpattyn");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&isstokes,"isstokes");
+	model->FindParam(&stokesreconditioning,"stokesreconditioning");
+
 	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
-	fem_dv=model->DiagnosticVertical();
-	fem_ds=model->DiagnosticStokes();
-	fem_dhu=model->DiagnosticHutter();
-	fem_sl=model->Slope();
-
-	//first recover parameters common to all solutions
-	fem_dh->parameters->FindParam((void*)&debug,"debug");
-	fem_dh->parameters->FindParam((void*)&dim,"dim");
-	fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
-	fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
-	fem_ds->parameters->FindParam((void*)&stokesreconditioning,"stokesreconditioning");
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum());
 
 	//specific parameters for specific models
-	fem_dh->parameters->FindParam((void*)&numberofdofspernode_dh,"numberofdofspernode");
-	fem_sl->parameters->FindParam((void*)&numberofdofspernode_sl,"numberofdofspernode");
-	fem_ds->parameters->FindParam((void*)&numberofdofspernode_ds,"numberofdofspernode");
+	fem_dh->FindParam((void*)&numberofdofspernode_dh,"numberofdofspernode");
+	fem_sl->FindParam((void*)&numberofdofspernode_sl,"numberofdofspernode");
+	fem_ds->FindParam((void*)&numberofdofspernode_ds,"numberofdofspernode");
 
 	/*if no Stokes, assign output and return*/
 	if (!isstokes){
-		model->SetActive(fem_dh);
+		model->SetActiveFormulation(fem_dh);
 		return;
 	}
@@ -146,4 +146,4 @@
 
 	/*Assign output*/
-	model->SetActive(fem_ds);
+	model->SetActiveFormulation(fem_ds);
 }
Index: /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/ControlTemporaryResults.cpp	(revision 1881)
@@ -33,10 +33,10 @@
 
 	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
 
 	/*Recover parameters used throughout the solution:*/
-	fem_dh->parameters->FindParam((void*)&control_type,"control_type");
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_dh->parameters->FindParam((void*)&outputfilename,"outputfilename");
+	model->FindParam(&control_type,"control_type");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&outputfilename,"outputfilename");
 	gsize=fem_dh->nodes->NumberOfDofs();
 
Index: /issm/trunk/src/c/parallel/CreateFemModel.cpp
===================================================================
--- /issm/trunk/src/c/parallel/CreateFemModel.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/CreateFemModel.cpp	(revision 1881)
@@ -31,5 +31,4 @@
 	IoModel* model=NULL;
 	
-
 	_printf_("   fill model with matlab workspace data\n");
 	IoModelInit(&model,MODEL); 
@@ -71,20 +70,42 @@
 
 	_printf_("   free ressources:\n");
+	PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok1\n");
+	PetscSynchronizedFlush(MPI_COMM_WORLD);
+
 	DeleteIoModel(&model);
+	PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok2\n");
+	PetscSynchronizedFlush(MPI_COMM_WORLD);
+
 
 	/*Assign output pointers:*/
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok2a\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
 	femmodel->elements=elements;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok2b\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
 	femmodel->nodes=nodes;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok2c\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
 	femmodel->constraints=constraints;
-	femmodel->loads=loads;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok3\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
+femmodel->loads=loads;
 	femmodel->materials=materials;
 	femmodel->parameters=parameters;
 	femmodel->partition=partition;
 	femmodel->tpartition=tpartition;
-	femmodel->yg=yg;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok4\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
+femmodel->yg=yg;
 	femmodel->Rmg=Rmg;
 	femmodel->Gmn=Gmn;
 	femmodel->nodesets=nodesets;
-	femmodel->ys=ys;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok5\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
+femmodel->ys=ys;
 	femmodel->ys0=ys0;
+PetscSynchronizedPrintf(MPI_COMM_WORLD,"ok6\n");
+PetscSynchronizedFlush(MPI_COMM_WORLD);
+
+
 }
Index: /issm/trunk/src/c/parallel/ProcessResults.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 1881)
@@ -101,76 +101,20 @@
 	/*Initialize new results: */
 	newresults=new DataSet(ResultsEnum());
-		
+	
+	/*some flags needed: */
+	model->FindParam(&dim,"dim");
+	model->FindParam(&ishutter,"ishutter");
+	model->FindParam(&isstokes,"isstokes");
+	model->FindParam(&ismacayealpattyn,"ismacayealpattyn");
+
 	/*Recover femmodels first: */
-	if(analysis_type==DiagnosticAnalysisEnum()){
-		fem_dh=model->DiagnosticHorizontal();
-		fem_dv=model->DiagnosticVertical();
-		fem_ds=model->DiagnosticStokes();
-		fem_dhu=model->DiagnosticHutter();
-		fem_sl=model->Slope();
-	
-		/*some flags needed: */
-		fem_dh->parameters->FindParam((void*)&dim,"dim");
-		fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
-		fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
-		fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-	}
-	if(analysis_type==SteadystateAnalysisEnum()){
-		fem_dh=model->DiagnosticHorizontal();
-		fem_dv=model->DiagnosticVertical();
-		fem_ds=model->DiagnosticStokes();
-		fem_dhu=model->DiagnosticHutter();
-		fem_sl=model->Slope();
-		fem_t=model->Thermal();
-	
-		/*some flags needed: */
-		fem_dh->parameters->FindParam((void*)&dim,"dim");
-		fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
-		fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
-		fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-	}
-
-	if(analysis_type==TransientAnalysisEnum()){
-		fem_dh=model->DiagnosticHorizontal();
-		fem_dv=model->DiagnosticVertical();
-		fem_ds=model->DiagnosticStokes();
-		fem_dhu=model->DiagnosticHutter();
-		fem_sl=model->Slope();
-		fem_p=model->Prognostic();
-	
-		/*some flags needed: */
-		fem_dh->parameters->FindParam((void*)&dim,"dim");
-		fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
-		fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
-		fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-
-		if (dim==3){
-			fem_t=model->Thermal();
-		}
-	}
-	
-	if(analysis_type==PrognosticAnalysisEnum()){
-		fem_p=model->Prognostic();
-	}
-
-	if(analysis_type==ThermalAnalysisEnum()){
-		fem_t=model->Thermal();
-	}
-
-	if(analysis_type==ControlAnalysisEnum()){
-		fem_dh=model->DiagnosticHorizontal();
-		fem_dv=model->DiagnosticVertical();
-		fem_ds=model->DiagnosticStokes();
-		fem_dhu=model->DiagnosticHutter();
-		fem_sl=model->Slope();
-		fem_p=model->Prognostic();
-		fem_c=model->DiagnosticHorizontal(); //load param_g
-
-		/*some flags needed: */
-		fem_dh->parameters->FindParam((void*)&dim,"dim");
-		fem_dh->parameters->FindParam((void*)&ishutter,"ishutter");
-		fem_dh->parameters->FindParam((void*)&isstokes,"isstokes");
-		fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-	}
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_c=fem_dh;
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum());
+	fem_p=model->GetFormulation(PrognosticAnalysisEnum());
+	fem_t=model->GetFormulation(ThermalAnalysisEnum());
 
 	for(n=0;n<results->Size();n++){
Index: /issm/trunk/src/c/parallel/control.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/control.cpp	(revision 1881)
@@ -41,4 +41,5 @@
 	Param*  param=NULL;
 	int      count;
+	DataSet* parameters=NULL;
 
 	MODULEBOOT();
@@ -59,4 +60,7 @@
 	lockname=argv[4];
 
+	/*Initialize model structure: */
+	model=new Model();
+
 	/*Open handle to data on disk: */
 	fid=pfopen(inputfilename,"rb");
@@ -66,19 +70,23 @@
 
 	_printf_("read and create finite element model:\n");
-	_printf_("\n   reading control horiz model data:\n");
-	CreateFemModel(model->DiagnosticHorizontal(),fid,ControlAnalysisEnum(),HorizAnalysisEnum());
-	_printf_("\n   reading control vert model data:\n");
-	CreateFemModel(model->DiagnosticVertical(),fid,ControlAnalysisEnum(),VertAnalysisEnum());
-	_printf_("\n   reading control stokes model data:\n");
-	CreateFemModel(model->DiagnosticStokes(),fid,ControlAnalysisEnum(),StokesAnalysisEnum());
-	_printf_("\n   reading control hutter model data:\n");
-	CreateFemModel(model->DiagnosticHutter(),fid,ControlAnalysisEnum(),HutterAnalysisEnum());
+	_printf_("\n   reading diagnostic horiz model data:\n");
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+
+	_printf_("\n   reading diagnostic vert model data:\n");
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	
+	_printf_("\n   reading diagnostic stokes model data:\n");
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	
+	_printf_("\n   reading diagnostic hutter model data:\n");
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	
 	_printf_("\n   reading surface and bed slope computation model data:\n");
-	CreateFemModel(model->Slope(),fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
 
 	_printf_("initialize inputs:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&u_g_initial,"u_g");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&u_g_obs,"u_g_obs");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&u_g_initial,"u_g",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->FindParam(&u_g_obs,"u_g_obs",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->FindParam(&numberofnodes,"numberofnodes");
 
 	inputs=new ParameterInputs;
@@ -86,23 +94,16 @@
 	inputs->Add("velocity_obs",u_g_obs,2,numberofnodes);
 	
-
-	/*erase velocities: */
-	param=(Param*)model->DiagnosticHorizontal()->parameters->FindParamObject("u_g");
-	model->DiagnosticHorizontal()->parameters->DeleteObject((Object*)param);
-
-	param=(Param*)model->DiagnosticHorizontal()->parameters->FindParamObject("u_g_obs");
-	model->DiagnosticHorizontal()->parameters->DeleteObject((Object*)param);
-
 	_printf_("initialize results:\n");
 	results=new DataSet(ResultsEnum());
 
 	//Add output file name to parameters of femmodels[0]
-	count=model->DiagnosticHorizontal()->parameters->Size()+1;
+	parameters=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum())->get_parameters();
+	count=parameters->Size()+1;
 	param= new Param(count,"outputfilename",STRING);
 	param->SetString(outputfilename);
-	model->DiagnosticHorizontal()->parameters->AddObject(param);
+	parameters->AddObject(param);
 
 	/*are we running the solution sequence, or a qmu wrapper around it? : */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
 	
 	if(!qmu_analysis){
@@ -128,5 +129,5 @@
 	results->AddObject(result);
 	
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&control_type,"control_type");
+	model->FindParam(&control_type,"control_type");
 	result=new Result(results->Size()+1,0,1,"control_type",control_type);
 	results->AddObject(result);
@@ -139,5 +140,5 @@
 
 	_printf_("write lock file:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
+	model->FindParam(&waitonlock,"waitonlock");
 	if (waitonlock){
 		WriteLockFile(lockname);
Index: /issm/trunk/src/c/parallel/control_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/control_core.cpp	(revision 1881)
@@ -50,19 +50,19 @@
 	/*Process models*/
 	ControlInitialization(model,inputs);
-	fem_model=model->Active();
+	fem_model=model->GetActiveFormulation();
 
 	/*Recover parameters used throughout the solution:*/
-	fem_model->parameters->FindParam((void*)&nsteps,"nsteps");
-	fem_model->parameters->FindParam((void*)&control_type,"control_type");
-	fem_model->parameters->FindParam((void*)&fit,"fit");
-	fem_model->parameters->FindParam((void*)&optscal,"optscal");
-	fem_model->parameters->FindParam((void*)&maxiter,"maxiter");
-	fem_model->parameters->FindParam((void*)&tolx,"tolx");
-	fem_model->parameters->FindParam((void*)&mincontrolconstraint,"mincontrolconstraint");
-	fem_model->parameters->FindParam((void*)&maxcontrolconstraint,"maxcontrolconstraint");
-	fem_model->parameters->FindParam((void*)&param_g,"param_g");
-	fem_model->parameters->FindParam((void*)&analysis_type,"analysis_type");
-	fem_model->parameters->FindParam((void*)&sub_analysis_type,"sub_analysis_type");
-	fem_model->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&nsteps,"nsteps");
+	model->FindParam(&control_type,"control_type");
+	model->FindParam(&fit,"fit");
+	model->FindParam(&optscal,"optscal");
+	model->FindParam(&maxiter,"maxiter");
+	model->FindParam(&tolx,"tolx");
+	model->FindParam(&mincontrolconstraint,"mincontrolconstraint");
+	model->FindParam(&maxcontrolconstraint,"maxcontrolconstraint");
+	model->FindParam(&param_g,"param_g");
+	model->FindParam(&analysis_type,"analysis_type");
+	model->FindParam(&sub_analysis_type,"sub_analysis_type");
+	model->FindParam(&numberofnodes,"numberofnodes");
 	gsize=fem_model->nodes->NumberOfDofs();
 
Index: /issm/trunk/src/c/parallel/convergence.cpp
===================================================================
--- /issm/trunk/src/c/parallel/convergence.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/convergence.cpp	(revision 1881)
@@ -9,5 +9,5 @@
 #include "../issm.h"
 
-int convergence(int* pconverged, Mat Kff,Vec pf,Vec uf,Vec old_uf,DataSet* parameters){
+void convergence(int* pconverged, Mat Kff,Vec pf,Vec uf,Vec old_uf,DataSet* parameters){
 
 	/*output*/
Index: /issm/trunk/src/c/parallel/diagnostic.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/diagnostic.cpp	(revision 1881)
@@ -64,30 +64,31 @@
 	_printf_("read and create finite element model:\n");
 	_printf_("\n   reading diagnostic horiz model data:\n");
-	CreateFemModel(model->DiagnosticHorizontal(),fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+
 	_printf_("\n   reading diagnostic vert model data:\n");
-	CreateFemModel(model->DiagnosticVertical(),fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic stokes model data:\n");
-	CreateFemModel(model->DiagnosticStokes(),fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic hutter model data:\n");
-	CreateFemModel(model->DiagnosticHutter(),fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	
 	_printf_("\n   reading surface and bed slope computation model data:\n");
-	CreateFemModel(model->Slope(),fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
 
 	_printf_("initialize inputs:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&u_g_initial,"u_g");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&u_g_initial,"u_g",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->FindParam(&numberofnodes,"numberofnodes");
 
 	inputs=new ParameterInputs;
 	inputs->Add("velocity",u_g_initial,3,numberofnodes);
 	
-	/*erase velocities: */
-	param=(Param*)model->DiagnosticHorizontal()->parameters->FindParamObject("u_g");
-	model->DiagnosticHorizontal()->parameters->DeleteObject((Object*)param);
-
 	_printf_("initialize results:\n");
 	results=new DataSet(ResultsEnum());
 
 	/*are we running the solution sequence, or a qmu wrapper around it? : */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
+	
 	if(!qmu_analysis){
 
@@ -119,5 +120,5 @@
 
 	_printf_("write lock file:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
+	model->FindParam(&waitonlock,"waitonlock");
 	if (waitonlock){
 		WriteLockFile(lockname);
@@ -127,11 +128,7 @@
 	PetscFinalize(); 
 	
-
 	/*end module: */
 	MODULEEND();
 	
-	/*Free ressources */
-	xfree((void**)&u_g_initial);
-
 	return 0; //unix success return;
 }
Index: /issm/trunk/src/c/parallel/diagnostic_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/diagnostic_core.cpp	(revision 1881)
@@ -57,25 +57,26 @@
 	int dof3[1]={3};
 
-	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
-	fem_dv=model->DiagnosticVertical();
-	fem_ds=model->DiagnosticStokes();
-	fem_dhu=model->DiagnosticHutter();
-	fem_sl=model->Slope();
 
 	//first recover parameters common to all solutions
-	fem_dh->parameters->FindParam((void*)&debug,"debug");
-	fem_dh->parameters->FindParam((void*)&dim,"dim");
-	fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
-	fem_dh->parameters->FindParam((void*)&ismacayealpattyn,"ismacayealpattyn");
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
-	fem_ds->parameters->FindParam((void*)&stokesreconditioning,"stokesreconditioning");
-	fem_dh->parameters->FindParam((void*)&numrifts,"numrifts");
+	model->FindParam(&debug,"debug");
+	model->FindParam(&dim,"dim");
+	model->FindParam(&ishutter,"ishutter");
+	model->FindParam(&ismacayealpattyn,"ismacayealpattyn");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&isstokes,"isstokes");
+	model->FindParam(&stokesreconditioning,"stokesreconditioning");
+	model->FindParam(&numrifts,"numrifts");
+
+	/*recover fem models: */
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
 
 	//specific parameters for specific models
-	fem_dh->parameters->FindParam((void*)&numberofdofspernode_dh,"numberofdofspernode");
-	fem_sl->parameters->FindParam((void*)&numberofdofspernode_sl,"numberofdofspernode");
-	fem_ds->parameters->FindParam((void*)&numberofdofspernode_ds,"numberofdofspernode");
+	fem_dh->FindParam((void*)&numberofdofspernode_dh,"numberofdofspernode");
+	fem_sl->FindParam((void*)&numberofdofspernode_sl,"numberofdofspernode");
+	fem_ds->FindParam((void*)&numberofdofspernode_ds,"numberofdofspernode");
 
 	if(ishutter){
@@ -126,5 +127,5 @@
 
 		if(debug)_printf_("%s\n"," extruding horizontal velocities...");
-		VecDuplicatePatch(&ug_horiz,ug); FieldExtrudex( ug_horiz,fem_dh->elements,fem_dh->nodes, fem_dh->loads,fem_dh-> materials,"velocity",1);
+		VecDuplicatePatch(&ug_horiz,ug); FieldExtrudex( ug_horiz,fem_dh->elements,fem_dh->nodes, fem_dh->loads,fem_dh->materials,"velocity",1);
 
 		if(debug)_printf_("%s\n"," computing vertical velocities...");
Index: /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp	(revision 1881)
@@ -42,8 +42,9 @@
 	/*Recover parameters: */
 	kflag=1; pflag=1;
-	fem->parameters->FindParam((void*)&connectivity,"connectivity");
-	fem->parameters->FindParam((void*)&numberofdofspernode,"numberofdofspernode");
-	fem->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem->parameters->FindParam((void*)&solver_string,"solverstring");
+	fem->FindParam((void*)&connectivity,"connectivity");
+	fem->FindParam((void*)&numberofdofspernode,"numberofdofspernode");
+	fem->FindParam((void*)&numberofnodes,"numberofnodes");
+	fem->FindParam((void*)&solver_string,"solverstring");
+
 
 	/*Were loads requested as output? : */
Index: /issm/trunk/src/c/parallel/objectivefunctionC.cpp
===================================================================
--- /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 1881)
@@ -54,5 +54,5 @@
 	/*Recover active model: */
 	model=optargs->model;
-	femmodel=model->Active();
+	femmodel=model->GetActiveFormulation();
 
 	/*Recover parameters: */
Index: /issm/trunk/src/c/parallel/parallel.h
===================================================================
--- /issm/trunk/src/c/parallel/parallel.h	(revision 1880)
+++ /issm/trunk/src/c/parallel/parallel.h	(revision 1881)
@@ -8,4 +8,8 @@
 #include "../objects/objects.h"
 #include "../io/io.h"
+
+struct OptArgs;
+class ParameterInputs;
+class FemModel;
 
 Vec GradJCompute(ParameterInputs* inputs,FemModel* femmodel);
Index: /issm/trunk/src/c/parallel/prognostic.cpp
===================================================================
--- /issm/trunk/src/c/parallel/prognostic.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/prognostic.cpp	(revision 1881)
@@ -62,4 +62,7 @@
 	lockname=argv[4];
 
+	/*Initialize model structure: */
+	model=new Model();
+
 	/*Open handle to data on disk: */
 	fid=pfopen(inputfilename,"rb");
@@ -69,14 +72,16 @@
 
 	_printf_("read and create finite element model:\n");
-	CreateFemModel(model->Prognostic(),fid,PrognosticAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,PrognosticAnalysisEnum(),NoneAnalysisEnum());
 
 	//retrieve parameters used to fill inputs
-	model->Prognostic()->parameters->FindParam((void*)&u_g_serial,"u_g");
-	model->Prognostic()->parameters->FindParam((void*)&h_g_initial,"h_g");
-	model->Prognostic()->parameters->FindParam((void*)&melting_g,"m_g");
-	model->Prognostic()->parameters->FindParam((void*)&accumulation_g,"a_g");
-	model->Prognostic()->parameters->FindParam((void*)&dt,"dt");
-	model->Prognostic()->parameters->FindParam((void*)&yts,"yts");
-	model->Prognostic()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&u_g_serial,"u_g",PrognosticAnalysisEnum());
+	model->FindParam(&h_g_initial,"h_g",PrognosticAnalysisEnum());
+	model->FindParam(&melting_g,"m_g",PrognosticAnalysisEnum());
+	model->FindParam(&accumulation_g,"a_g",PrognosticAnalysisEnum());
+	model->FindParam(&dt,"dt");
+	model->FindParam(&yts,"yts");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
+	model->FindParam(&waitonlock,"waitonlock");
 
 	_printf_("initialize inputs:\n");
@@ -92,5 +97,4 @@
 
 	/*are we running the solutoin sequence, or a qmu wrapper around it? : */
-	model->Prognostic()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
 	if(!qmu_analysis){
 
@@ -123,5 +127,4 @@
 
 	_printf_("write lock file:\n");
-	model->Prognostic()->parameters->FindParam((void*)&waitonlock,"waitonlock");
 	if (waitonlock){
 		WriteLockFile(lockname);
Index: /issm/trunk/src/c/parallel/prognostic_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/prognostic_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/prognostic_core.cpp	(revision 1881)
@@ -37,10 +37,10 @@
 
 	/*recover fem model: */
-	fem_p=model->Prognostic();
+	fem_p=model->GetFormulation(PrognosticAnalysisEnum());
 
 	//first recover parameters common to all solutions
-	fem_p->parameters->FindParam((void*)&debug,"debug");
-	fem_p->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_p->parameters->FindParam((void*)&numberofdofspernode,"numberofdofspernode");
+	model->FindParam(&debug,"debug");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&numberofdofspernode,"numberofdofspernode");
 
 	_printf_("depth averaging velocity...\n");
Index: /issm/trunk/src/c/parallel/steadystate.cpp
===================================================================
--- /issm/trunk/src/c/parallel/steadystate.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/steadystate.cpp	(revision 1881)
@@ -58,4 +58,7 @@
 	lockname=argv[4];
 
+	/*Initialize model structure: */
+	model=new Model();
+
 	/*Open handle to data on disk: */
 	fid=pfopen(inputfilename,"rb");
@@ -65,24 +68,34 @@
 
 	_printf_("read and create finite element model:\n");
+	
 	_printf_("\n   reading diagnostic horiz model data:\n");
-	CreateFemModel(model->DiagnosticHorizontal(),fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+
 	_printf_("\n   reading diagnostic vert model data:\n");
-	CreateFemModel(model->DiagnosticVertical(),fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic stokes model data:\n");
-	CreateFemModel(model->DiagnosticStokes(),fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic hutter model data:\n");
-	CreateFemModel(model->DiagnosticHutter(),fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	
 	_printf_("\n   reading surface and bed slope computation model data:\n");
-	CreateFemModel(model->Slope(),fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+
 	_printf_("\n   read and create thermal finite element model:\n");
-	CreateFemModel(model->Thermal(),fid,ThermalAnalysisEnum(),SteadyAnalysisEnum());
+	model->AddFormulation(fid,ThermalAnalysisEnum(),SteadyAnalysisEnum());
 	_printf_("\n   read and create melting finite element model:\n");
-	CreateFemModel(model->Melting(),fid,MeltingAnalysisEnum(),SteadyAnalysisEnum());
+	model->AddFormulation(fid,MeltingAnalysisEnum(),SteadyAnalysisEnum());
 
 	_printf_("initialize inputs:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&u_g_initial,"u_g");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	model->Thermal()->parameters->FindParam((void*)&dt,"dt");
-	model->Thermal()->parameters->FindParam((void*)&p_g_initial,"p_g");
+	
+	model->FindParam(&u_g_initial,"u_g",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->FindParam(&p_g_initial,"p_g",ThermalAnalysisEnum());
+	model->FindParam(&dt,"dt");
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&waitonlock,"waitonlock");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
+
 
 	inputs=new ParameterInputs;
@@ -91,13 +104,8 @@
 	inputs->Add("dt",dt);
 	
-	/*erase velocities: */
-	param=(Param*)model->DiagnosticHorizontal()->parameters->FindParamObject("u_g");
-	model->DiagnosticHorizontal()->parameters->DeleteObject((Object*)param);
-
 	_printf_("initialize results:\n");
 	results=new DataSet(ResultsEnum());
 
 	/*are we running the solution sequence, or a qmu wrapper around it? : */
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
 	if(!qmu_analysis){
 
@@ -129,5 +137,4 @@
 
 	_printf_("write lock file:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
 	if (waitonlock){
 		WriteLockFile(lockname);
Index: /issm/trunk/src/c/parallel/steadystate_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/steadystate_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/steadystate_core.cpp	(revision 1881)
@@ -54,17 +54,18 @@
 
 	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
-	fem_dv=model->DiagnosticVertical();
-	fem_ds=model->DiagnosticStokes();
-	fem_dhu=model->DiagnosticHutter();
-	fem_sl=model->Slope();
-	fem_t=model->Thermal();
-	fem_m=model->Melting();
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum());
+	fem_t=model->GetFormulation(ThermalAnalysisEnum());
+	fem_m=model->GetFormulation(MeltingAnalysisEnum());
+
 
 	//first recover parameters common to all solutions
-	fem_dh->parameters->FindParam((void*)&debug,"debug");debug=1;
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_dh->parameters->FindParam((void*)&eps_rel,"eps_rel");
-	fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
+	model->FindParam(&debug,"debug");debug=1;
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&eps_rel,"eps_rel");
+	model->FindParam(&isstokes,"isstokes");
 
 	//initialize: 
Index: /issm/trunk/src/c/parallel/thermal.cpp
===================================================================
--- /issm/trunk/src/c/parallel/thermal.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/thermal.cpp	(revision 1881)
@@ -61,4 +61,7 @@
 	lockname=argv[4];
 
+	/*Initialize model structure: */
+	model=new Model();
+
 	/*Open handle to data on disk: */
 	fid=pfopen(inputfilename,"rb");
@@ -68,15 +71,16 @@
 
 	_printf_("read and create thermal finite element model:\n");
-	CreateFemModel(model->Thermal(),fid,ThermalAnalysisEnum(),0);
+	model->AddFormulation(fid,ThermalAnalysisEnum(),0);
 	_printf_("read and create melting finite element model:\n");
-	CreateFemModel(model->Melting(),fid,MeltingAnalysisEnum(),0);
+	model->AddFormulation(fid,MeltingAnalysisEnum(),0);
 
 	_printf_("initialize inputs:\n");
-	model->Thermal()->parameters->FindParam((void*)&u_g,"u_g");
-	model->Thermal()->parameters->FindParam((void*)&p_g,"p_g");
-	model->Thermal()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	model->Thermal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
-	model->Thermal()->parameters->FindParam((void*)&dt,"dt");
-	model->Thermal()->parameters->FindParam((void*)&yts,"yts");
+	model->FindParam(&u_g,"u_g",ThermalAnalysisEnum(),0);
+	model->FindParam(&p_g,"p_g",ThermalAnalysisEnum(),0);
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&waitonlock,"waitonlock");
+	model->FindParam(&dt,"dt");
+	model->FindParam(&yts,"yts");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
 
 	inputs=new ParameterInputs;
@@ -89,17 +93,5 @@
 	results=new DataSet(ResultsEnum());
 
-	//erase velocities and pressure embedded in parameters
-	param=(Param*)model->Thermal()->parameters->FindParamObject("u_g");
-	param=(Param*)model->Thermal()->parameters->FindParamObject("velocity");
-	model->Thermal()->parameters->DeleteObject((Object*)param);
-	param=(Param*)model->Thermal()->parameters->FindParamObject("p_g");
-	model->Thermal()->parameters->DeleteObject((Object*)param);
-	param=(Param*)model->Melting()->parameters->FindParamObject("u_g");
-	model->Melting()->parameters->DeleteObject((Object*)param);
-	param=(Param*)model->Melting()->parameters->FindParamObject("p_g");
-	model->Melting()->parameters->DeleteObject((Object*)param);
-
 	/*are we running the solutoin sequence, or a qmu wrapper around it? : */
-	model->Thermal()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
 	if(!qmu_analysis){
 
@@ -131,5 +123,5 @@
 
 	_printf_("write lock file:\n");
-	model->Thermal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
+	model->FindParam(&waitonlock,"waitonlock");
 
 	if (waitonlock){
Index: /issm/trunk/src/c/parallel/thermal_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/thermal_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/thermal_core.cpp	(revision 1881)
@@ -46,13 +46,13 @@
 
 	/*recover fem models: */
-	fem_t=model->Thermal();
-	fem_m=model->Melting();
+	fem_t=model->GetFormulation(ThermalAnalysisEnum());
+	fem_m=model->GetFormulation(MeltingAnalysisEnum());
 
 	//first recover parameters common to all solutions
-	fem_t->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	fem_t->parameters->FindParam((void*)&sub_analysis_type,"sub_analysis_type");
-	fem_t->parameters->FindParam((void*)&debug,"debug");
-	fem_t->parameters->FindParam((void*)&dt,"dt");
-	fem_t->parameters->FindParam((void*)&ndt,"ndt");
+	fem_t->FindParam((void*)&numberofnodes,"numberofnodes");
+	fem_t->FindParam((void*)&sub_analysis_type,"sub_analysis_type");
+	fem_t->FindParam((void*)&debug,"debug");
+	fem_t->FindParam((void*)&dt,"dt");
+	fem_t->FindParam((void*)&ndt,"ndt");
 
 	if(sub_analysis_type==SteadyAnalysisEnum()){
@@ -84,16 +84,10 @@
 
 		//initialize temperature and melting
-		fem_t->parameters->FindParam((void*)&t_g_serial,"t_g");
+		fem_t->FindParam((void*)&t_g_serial,"t_g");
 		t_g[0]=SerialToVec(t_g_serial,numberofnodes);
 		xfree((void**)&t_g_serial);
-		fem_m->parameters->FindParam((void*)&m_g_serial,"m_g");
+		fem_m->FindParam((void*)&m_g_serial,"m_g");
 		m_g[0]=SerialToVec(m_g_serial,numberofnodes);
 		xfree((void**)&m_g_serial);
-
-		//erase temperature and melting embedded in parameters
-		param=(Param*)fem_t->parameters->FindParamObject("t_g");
-		fem_t->parameters->DeleteObject((Object*)param);
-		param=(Param*)fem_m->parameters->FindParamObject("m_g");
-		fem_m->parameters->DeleteObject((Object*)param);
 
 		for(i=0;i<nsteps;i++){
Index: /issm/trunk/src/c/parallel/transient.cpp
===================================================================
--- /issm/trunk/src/c/parallel/transient.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/transient.cpp	(revision 1881)
@@ -62,4 +62,7 @@
 	lockname=argv[4];
 
+	/*Initialize model structure: */
+	model=new Model();
+
 	/*Open handle to data on disk: */
 	fid=pfopen(inputfilename,"rb");
@@ -70,40 +73,46 @@
 	_printf_("read and create finite element model:\n");
 	_printf_("\n   reading diagnostic horiz model data:\n");
-	CreateFemModel(model->DiagnosticHorizontal(),fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+
 	_printf_("\n   reading diagnostic vert model data:\n");
-	CreateFemModel(model->DiagnosticVertical(),fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic stokes model data:\n");
-	CreateFemModel(model->DiagnosticStokes(),fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	
 	_printf_("\n   reading diagnostic hutter model data:\n");
-	CreateFemModel(model->DiagnosticHutter(),fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	model->AddFormulation(fid,DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	
 	_printf_("\n   reading surface and bed slope computation model data:\n");
-	CreateFemModel(model->Slope(),fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,SlopeComputeAnalysisEnum(),NoneAnalysisEnum());
+
 	_printf_("\n   reading prognositc model data:\n");
-	CreateFemModel(model->Prognostic(),fid,PrognosticAnalysisEnum(),NoneAnalysisEnum());
+	model->AddFormulation(fid,PrognosticAnalysisEnum(),NoneAnalysisEnum());
 	
 	/*Do we run in 3d?, in which case we need thermal and melting also:*/
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&dim,"dim");
+	model->FindParam(&dim,"dim");
 	if(dim==3){
 		_printf_("read and create thermal finite element model:\n");
-		CreateFemModel(model->Thermal(),fid,ThermalAnalysisEnum(),TransientAnalysisEnum());
+		model->AddFormulation(fid,ThermalAnalysisEnum(),TransientAnalysisEnum());
 		_printf_("read and create melting finite element model:\n");
-		CreateFemModel(model->Melting(),fid,MeltingAnalysisEnum(),TransientAnalysisEnum());
+		model->AddFormulation(fid,MeltingAnalysisEnum(),TransientAnalysisEnum());
 	}
 
 	_printf_("initialize inputs:\n");
+	
+	model->FindParam(&u_g,"u_g",ThermalAnalysisEnum());
+	model->FindParam(&m_g,"m_g",ThermalAnalysisEnum());
+	model->FindParam(&a_g,"a_g",ThermalAnalysisEnum());
+	model->FindParam(&numberofnodes,"numberofnodes");
+	model->FindParam(&dt,"dt");
+	model->FindParam(&yts,"yts");
+	model->FindParam(&waitonlock,"waitonlock");
+	model->FindParam(&qmu_analysis,"qmu_analysis");
+
+
 	inputs=new ParameterInputs;
-	model->Thermal()->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-	
-	model->Thermal()->parameters->FindParam((void*)&u_g,"u_g");
 	inputs->Add("velocity",u_g,3,numberofnodes);
-
-	model->Thermal()->parameters->FindParam((void*)&m_g,"m_g");
 	inputs->Add("melting",m_g,1,numberofnodes);
-
-	model->Thermal()->parameters->FindParam((void*)&a_g,"a_g");
 	inputs->Add("accumulation",a_g,1,numberofnodes);
-
-	model->Thermal()->parameters->FindParam((void*)&dt,"dt");
-	model->Thermal()->parameters->FindParam((void*)&yts,"yts");
 	inputs->Add("dt",dt*yts);
 	
@@ -112,5 +121,4 @@
 
 	/*are we running the solution sequence, or a qmu wrapper around it? : */
-	model->Thermal()->parameters->FindParam((void*)&qmu_analysis,"qmu_analysis");
 	if(!qmu_analysis){
 
@@ -141,5 +149,4 @@
 
 	_printf_("write lock file:\n");
-	model->DiagnosticHorizontal()->parameters->FindParam((void*)&waitonlock,"waitonlock");
 	if (waitonlock){
 		WriteLockFile(lockname);
Index: /issm/trunk/src/c/parallel/transient_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/transient_core.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/transient_core.cpp	(revision 1881)
@@ -17,13 +17,8 @@
 	extern int my_rank;
 
-	/*fem models: */
-	FemModel* fem_p=NULL;
-
 	int dim=-1;
 
-	fem_p=model->Prognostic();
-
 	//first recover parameters common to all solutions
-	fem_p->parameters->FindParam((void*)&dim,"dim");
+	model->FindParam(&dim,"dim");
 
 	//branch out 
Index: /issm/trunk/src/c/parallel/transient_core_2d.cpp
===================================================================
--- /issm/trunk/src/c/parallel/transient_core_2d.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/transient_core_2d.cpp	(revision 1881)
@@ -64,17 +64,17 @@
 
 	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
-	fem_dv=model->DiagnosticVertical();
-	fem_ds=model->DiagnosticStokes();
-	fem_dhu=model->DiagnosticHutter();
-	fem_sl=model->Slope();
-	fem_p=model->Prognostic();
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum());
+	fem_p=model->GetFormulation(PrognosticAnalysisEnum());
 
 
 	//first recover parameters common to all solutions
-	fem_dh->parameters->FindParam((void*)&debug,"debug");
-	fem_dh->parameters->FindParam((void*)&finaltime,"ndt");
-	fem_dh->parameters->FindParam((void*)&dt,"dt");
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&debug,"debug");
+	model->FindParam(&finaltime,"ndt");
+	model->FindParam(&dt,"dt");
+	model->FindParam(&numberofnodes,"numberofnodes");
 
 	/*initialize: */
Index: /issm/trunk/src/c/parallel/transient_core_3d.cpp
===================================================================
--- /issm/trunk/src/c/parallel/transient_core_3d.cpp	(revision 1880)
+++ /issm/trunk/src/c/parallel/transient_core_3d.cpp	(revision 1881)
@@ -70,19 +70,19 @@
 
 	/*recover fem models: */
-	fem_dh=model->DiagnosticHorizontal();
-	fem_dv=model->DiagnosticVertical();
-	fem_ds=model->DiagnosticStokes();
-	fem_dhu=model->DiagnosticHutter();
-	fem_sl=model->Slope();
-	fem_p=model->Prognostic();
-	fem_t=model->Thermal();
-	fem_m=model->Melting();
+	fem_dh=model->GetFormulation(DiagnosticAnalysisEnum(),HorizAnalysisEnum());
+	fem_dv=model->GetFormulation(DiagnosticAnalysisEnum(),VertAnalysisEnum());
+	fem_ds=model->GetFormulation(DiagnosticAnalysisEnum(),StokesAnalysisEnum());
+	fem_dhu=model->GetFormulation(DiagnosticAnalysisEnum(),HutterAnalysisEnum());
+	fem_sl=model->GetFormulation(SlopeComputeAnalysisEnum());
+	fem_p=model->GetFormulation(PrognosticAnalysisEnum());
+	fem_t=model->GetFormulation(ThermalAnalysisEnum());
+	fem_m=model->GetFormulation(MeltingAnalysisEnum());
 
 
 	//first recover parameters common to all solutions
-	fem_dh->parameters->FindParam((void*)&debug,"debug");
-	fem_dh->parameters->FindParam((void*)&finaltime,"ndt");
-	fem_dh->parameters->FindParam((void*)&dt,"dt");
-	fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+	model->FindParam(&debug,"debug");
+	model->FindParam(&finaltime,"ndt");
+	model->FindParam(&dt,"dt");
+	model->FindParam(&numberofnodes,"numberofnodes");
 
 	/*initialize: */
