Index: /issm/trunk/src/c/DataSet/DataSet.h
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.h	(revision 4058)
+++ /issm/trunk/src/c/DataSet/DataSet.h	(revision 4059)
@@ -158,4 +158,15 @@
 		int   FindParam(Vec* pvec,int enum_type);
 		int   FindParam(Mat* pmat,int enum_type);
+		
+		void  SetParam(bool boolean,int enum_type);
+		void  SetParam(int integer,int enum_type);
+		void  SetParam(double scalar, int enum_type);
+		void  SetParam(char* string,int enum_type);
+		void  SetParam(char** stringarray,int M,int enum_type);
+		void  SetParam(double* doublearray,int M,int enum_type);
+		void  SetParam(double* doublearray,int M,int N,int enum_type);
+		void  SetParam(Vec vec,int enum_type);
+		void  SetParam(Mat mat,int enum_type);
+
 		Object* FindParamObject(int enum_type);
 		/*}}}*/
Index: /issm/trunk/src/c/DataSet/Parameters.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/Parameters.cpp	(revision 4058)
+++ /issm/trunk/src/c/DataSet/Parameters.cpp	(revision 4059)
@@ -256,5 +256,5 @@
 }
 /*}}}*/
-/*FUNCTION Parameters::FindParamMat* pmat,int enum_type){{{1*/
+/*FUNCTION Parameters::FindParam(Mat* pmat,int enum_type){{{1*/
 int   Parameters::FindParam(Mat* pmat,int enum_type){
 	
@@ -283,4 +283,114 @@
 }
 /*}}}*/
+
+/*FUNCTION Parameters::SetParam(bool boolean,int enum_type);{{{1*/
+void   Parameters::SetParam(bool boolean,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(boolean); //already exists, just set it.
+	else this->AddObject(new BoolParam(enum_type,boolean)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(int integer,int enum_type);{{{1*/
+void   Parameters::SetParam(int integer,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(integer); //already exists, just set it.
+	else this->AddObject(new IntParam(enum_type,integer)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(double scalar,int enum_type);{{{1*/
+void   Parameters::SetParam(double scalar,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(scalar); //already exists, just set it.
+	else this->AddObject(new DoubleParam(enum_type,scalar)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(char* string,int enum_type);{{{1*/
+void   Parameters::SetParam(char* string,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(string); //already exists, just set it.
+	else this->AddObject(new StringParam(enum_type,string)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(char** stringarray,int M, int enum_type);{{{1*/
+void   Parameters::SetParam(char** stringarray,int M, int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(stringarray,M); //already exists, just set it.
+	else this->AddObject(new StringArrayParam(enum_type,stringarray,M)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(double* doublearray,int M,int enum_type);{{{1*/
+void   Parameters::SetParam(double* doublearray,int M, int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(doublearray,M); //already exists, just set it.
+	else this->AddObject(new DoubleVecParam(enum_type,doublearray,M)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(double* doublearray,int M,int N, int enum_type);{{{1*/
+void   Parameters::SetParam(double* doublearray,int M, int N, int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(doublearray,M,N); //already exists, just set it.
+	else this->AddObject(new DoubleMatParam(enum_type,doublearray,M,N)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(Vec vector,int enum_type);{{{1*/
+void   Parameters::SetParam(Vec vector,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(vector); //already exists, just set it.
+	else this->AddObject(new PetscVecParam(enum_type,vector)); //just add the new parameter.
+}
+/*}}}*/
+/*FUNCTION Parameters::SetParam(Mat matrix,int enum_type);{{{1*/
+void   Parameters::SetParam(Mat matrix,int enum_type){
+
+	Param* param=NULL;
+	
+	/*first, figure out if the param has already been created: */
+	param=(Param*)this->FindParamObject(enum_type);
+
+	if(param) param->SetValue(matrix); //already exists, just set it.
+	else this->AddObject(new PetscMatParam(enum_type,matrix)); //just add the new parameter.
+}
+/*}}}*/
+
 /*FUNCTION Parameters::FindParamObject{{{1*/
 Object* Parameters::FindParamObject(int enum_type){
Index: /issm/trunk/src/c/objects/FemModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/FemModel.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/FemModel.cpp	(revision 4059)
@@ -169,8 +169,16 @@
 	ys=m_ys[analysis_counter];
 
+	/*Now, plug analysis_counter and analysis_type inside the parameters: */
+	this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
+	this->parameters->SetParam(analysis_type,AnalysisTypeEnum);
 }
 /*}}}1*/
 /*FUNCTION FemModel::SetCurrentAnalysisAlias {{{1*/
 void FemModel::SetCurrentAnalysisAlias(int base_analysis_type,int real_analysis_type){
+
+	/*Use base_analysis_type to setup the analysis counter, but the analysis type of the FemModel will remain 
+	 * real_analysis_type. This means we are using the base_analysis_type settings to run a similar, compatible 
+	 * analysis called real_analysis_type: */
+
 	int found=-1;
 	for(int i=0;i<nummodels;i++){
@@ -182,5 +190,15 @@
 	if(found!=-1) analysis_counter=found;
 	else ISSMERROR("Could not find alias for analysis_type %s in list of FemModel analyses",EnumAsString(base_analysis_type));
-}
-/*}}}1*/
-
+
+	/*activate matrices/vectors: */
+	Rmg=m_Rmg[analysis_counter];
+	Gmn=m_Gmn[analysis_counter];
+	nodesets=m_nodesets[analysis_counter];
+	yg=m_yg[analysis_counter];
+	ys=m_ys[analysis_counter];
+
+	/*Now, plug analysis_counter and real_analysis_type inside the parameters: */
+	this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
+	this->parameters->SetParam(real_analysis_type,AnalysisTypeEnum);
+}
+/*}}}1*/
Index: /issm/trunk/src/c/objects/Params/BoolParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/BoolParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/BoolParam.h	(revision 4059)
@@ -70,4 +70,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("Bool param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("Bool param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){this->value=boolean;}
+		void  SetValue(int integer){this->value=(bool)integer;}
+		void  SetValue(double scalar){this->value=(bool)scalar;}
+		void  SetValue(char* string){ISSMERROR("Bool param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("Bool param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("Bool param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("Bool param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("Bool param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("Bool param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+		
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/DoubleMatParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/DoubleMatParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/DoubleMatParam.cpp	(revision 4059)
@@ -230,2 +230,15 @@
 }
 /*}}}*/
+/*FUNCTION DoubleMatParam::SetValue(double* doublearray,int M,int N);{{{1*/
+void  DoubleMatParam::SetValue(double* doublearray,int in_M,int in_N){
+
+	/*avoid leak: */
+	xfree((void**)&this->value);
+
+	this->value=(double*)xmalloc(in_M*in_N*sizeof(double));
+	memcpy(this->value,doublearray,in_M*in_N*sizeof(double));
+
+	this->M=in_M;
+	this->N=in_N;
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/DoubleMatParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/DoubleMatParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/DoubleMatParam.h	(revision 4059)
@@ -74,4 +74,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("DoubleMat param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("DoubleMat param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a double vec array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M,int N);
+		void  SetValue(Vec vec){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("DoubleMat param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/DoubleParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/DoubleParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/DoubleParam.h	(revision 4059)
@@ -72,4 +72,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("Double param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("Double param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){this->value=(double)boolean;}
+		void  SetValue(int integer){this->value=(double)integer;}
+		void  SetValue(double scalar){this->value=(double)scalar;}
+		void  SetValue(char* string){ISSMERROR("Double param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("Double param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("Double param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("Double param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("Double param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("Double param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/DoubleVecParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/DoubleVecParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/DoubleVecParam.cpp	(revision 4059)
@@ -240,2 +240,14 @@
 }
 /*}}}*/
+/*FUNCTION DoubleVecParam::SetValue(double* doublearray,int M);{{{1*/
+void  DoubleVecParam::SetValue(double* doublearray,int in_M){
+
+	/*avoid leak: */
+	xfree((void**)&this->values);
+
+	this->values=(double*)xmalloc(in_M*sizeof(double));
+	memcpy(this->values,doublearray,in_M*sizeof(double));
+
+	this->M=in_M;
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/DoubleVecParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/DoubleVecParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/DoubleVecParam.h	(revision 4059)
@@ -71,4 +71,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("DoubleVec param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("DoubleVec param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M);
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a double mat array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("DoubleVec param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/IntParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/IntParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/IntParam.h	(revision 4059)
@@ -71,4 +71,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("Int param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("Int param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){this->value=(int)boolean;}
+		void  SetValue(int integer){this->value=integer;}
+		void  SetValue(double scalar){this->value=(int)scalar;}
+		void  SetValue(char* string){ISSMERROR("Int param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("Int param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("Int param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("Int param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("Int param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("Int param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/Param.h
===================================================================
--- /issm/trunk/src/c/objects/Params/Param.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/Param.h	(revision 4059)
@@ -41,4 +41,15 @@
 		virtual void  GetParameterValue(Vec* pvec)=0;
 		virtual void  GetParameterValue(Mat* pmat)=0;
+		
+		virtual void  SetValue(bool boolean)=0;
+		virtual void  SetValue(int integer)=0;
+		virtual void  SetValue(double scalar)=0;
+		virtual void  SetValue(char* string)=0;
+		virtual void  SetValue(char** stringarray,int M)=0;
+		virtual void  SetValue(double* doublearray,int M)=0;
+		virtual void  SetValue(double* pdoublearray,int M,int N)=0;
+		virtual void  SetValue(Vec vec)=0;
+		virtual void  SetValue(Mat mat)=0;
+
 		virtual char* GetParameterName(void)=0;
 		virtual void  Process(double* partition,int numberofvertices)=0;
Index: /issm/trunk/src/c/objects/Params/PetscMatParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/PetscMatParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/PetscMatParam.cpp	(revision 4059)
@@ -257,2 +257,12 @@
 }
 /*}}}*/
+/*FUNCTION PetscMatParam::SetValue(Mat matrix){{{1*/
+void  PetscMatParam::SetValue(Mat matrix){
+	
+	/*avoid leak: */
+	MatFree(&value);
+	
+	/*copy: */
+	MatDuplicate(matrix,MAT_COPY_VALUES,&value);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/PetscMatParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/PetscMatParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/PetscMatParam.h	(revision 4059)
@@ -71,4 +71,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("PetscMat param of enum %i (%s) cannot return a vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* poutput);
+
+		void  SetValue(bool boolean){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("PetscMat param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("PetscMat param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat);
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/PetscVecParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/PetscVecParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/PetscVecParam.cpp	(revision 4059)
@@ -251,2 +251,13 @@
 }
 /*}}}*/
+/*FUNCTION PetscVecParam::SetValue(Vec vector){{{1*/
+void  PetscVecParam::SetValue(Vec vector){
+
+	/*avoid leak: */
+	VecFree(&value);
+	
+	/*copy: */
+	VecDuplicate(vector,&value);
+	VecCopy(vector,value);
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/PetscVecParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/PetscVecParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/PetscVecParam.h	(revision 4059)
@@ -71,4 +71,15 @@
 		void  GetParameterValue(Mat* pmat){ISSMERROR("PetscVec param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Vec* poutput);
+
+		void  SetValue(bool boolean){ISSMERROR("Bool param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("Bool param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("Bool param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string){ISSMERROR("Bool param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M){ISSMERROR("Bool param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("Bool param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("Bool param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec);
+		void  SetValue(Mat mat){ISSMERROR("Bool param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/StringArrayParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/StringArrayParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/StringArrayParam.cpp	(revision 4059)
@@ -280,2 +280,31 @@
 }
 /*}}}*/
+/*FUNCTION StringArrayParam::SetValue(char** stringarray, int M){{{1*/
+void  StringArrayParam::SetValue(char** stringarray,int M){
+	
+	int   i;
+	char *string     = NULL;
+	char *string2    = NULL;
+	int   stringsize;
+
+	/*first, avoid leak: */
+	for(i=0;i<this->numstrings;i++){
+		string=this->value[i];
+		xfree((void**)&string);
+	}
+	xfree((void**)&this->value);
+
+	/*copy: */
+	this->numstrings=M;
+	this->value=(char**)xmalloc(this->numstrings*sizeof(char*));
+	for(i=0;i<this->numstrings;i++){
+		string=stringarray[i];
+		stringsize=strlen(string)+1;
+
+		string2=(char*)xmalloc(stringsize*sizeof(char));
+		memcpy(string2,string,stringsize*sizeof(char));
+
+		this->value[i]=string2;
+	}
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/StringArrayParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/StringArrayParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/StringArrayParam.h	(revision 4059)
@@ -73,4 +73,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("StringArray param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("StringArray param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){ISSMERROR("StringArray param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("StringArray param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("StringArray param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string){ISSMERROR("StringArray param of enum %i (%s) cannot hold a string",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char** stringarray,int M);
+		void  SetValue(double* doublearray,int M){ISSMERROR("StringArray param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("StringArray param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("StringArray param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("StringArray param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/c/objects/Params/StringParam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Params/StringParam.cpp	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/StringParam.cpp	(revision 4059)
@@ -206,2 +206,17 @@
 }
 /*}}}*/
+/*FUNCTION StringParam::SetValue(char* string){{{1*/
+void  StringParam::SetValue(char* string){
+	
+	int   stringsize;
+	
+	/*avoid leak: */
+	xfree((void**)&this->value);
+
+	/*copy: */
+	stringsize=strlen(string)+1;
+	this->value=(char*)xmalloc(stringsize*sizeof(char));
+	memcpy(this->value,string,stringsize*sizeof(char));
+
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Params/StringParam.h
===================================================================
--- /issm/trunk/src/c/objects/Params/StringParam.h	(revision 4058)
+++ /issm/trunk/src/c/objects/Params/StringParam.h	(revision 4059)
@@ -71,4 +71,15 @@
 		void  GetParameterValue(Vec* pvec){ISSMERROR("String param of enum %i (%s) cannot return a Vec",enum_type,EnumAsString(enum_type));}
 		void  GetParameterValue(Mat* pmat){ISSMERROR("String param of enum %i (%s) cannot return a Mat",enum_type,EnumAsString(enum_type));}
+
+		void  SetValue(bool boolean){ISSMERROR("String param of enum %i (%s) cannot hold a boolean",enum_type,EnumAsString(enum_type));}
+		void  SetValue(int integer){ISSMERROR("String param of enum %i (%s) cannot hold an integer",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double scalar){ISSMERROR("String param of enum %i (%s) cannot hold a scalar",enum_type,EnumAsString(enum_type));}
+		void  SetValue(char* string);
+		void  SetValue(char** stringarray,int M){ISSMERROR("String param of enum %i (%s) cannot hold a string array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* doublearray,int M){ISSMERROR("String param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(double* pdoublearray,int M,int N){ISSMERROR("String param of enum %i (%s) cannot hold a double array",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Vec vec){ISSMERROR("String param of enum %i (%s) cannot hold a Vec",enum_type,EnumAsString(enum_type));}
+		void  SetValue(Mat mat){ISSMERROR("String param of enum %i (%s) cannot hold a Mat",enum_type,EnumAsString(enum_type));}
+
 		char* GetParameterName(void);
 		void  Process(double* partition,int numberofvertices);
Index: /issm/trunk/src/m/solutions/jpl/diagnostic.m
===================================================================
--- /issm/trunk/src/m/solutions/jpl/diagnostic.m	(revision 4058)
+++ /issm/trunk/src/m/solutions/jpl/diagnostic.m	(revision 4059)
@@ -8,21 +8,26 @@
 	t1=clock;
 
+	analysis_types=[DiagnosticHorizAnalysisEnum,DiagnosticVertAnalysisEnum,DiagnosticStokesAnalysisEnum,DiagnosticHutterAnalysisEnum,SlopeAnalysisEnum];
 	solution_type=DiagnosticAnalysisEnum;
-	analysis_types=[DiagnosticHorizAnalysisEnum,DiagnosticVertAnalysisEnum,DiagnosticStokesAnalysisEnum,DiagnosticHutterAnalysisEnum,SlopecomputeAnalysisEnum];
 
-	displaystring(md.verbose,'%s',['create fem model']);
-	femmodel=CreateFemModel(md,solution_type,analysis_types);
+	displaystring(md.verbose,'%s',['create finite element model']);
+	femmodel=NewFemModel(md,solution_type,analysis_types);
+
+	%retrieve parameters
+	verbose=femmodel.parameters.Verbose;
+	qmu_analysis=femmodel.parameters.QmuAnalysis;
+	control_analysis=femmodel.parameters.ControlAnalysis;
 
 	%compute solution
-	if ~femmodel.parameters.QmuAnalysis,
-		if femodel.parameters.control_analysis,
+	if ~qmu_analysis,
+		if ~control_analysis,
 			
-			%launch core of control solution.
-			md.results.DiagnosticAnalysis=control_core(femmodel);
+			displaystring(verbose,'%s',['call computational core']);
+			diagnostic_core(femmodel);
 
 		else,
 			
-			%launch core of diagnostic solution.
-			md.results.DiagnosticAnalysis=diagnostic_core(femmodel);
+			displaystring(verbose,'%s',['call computational core']);
+			control_core(femmodel);
 
 		end
