Index: /issm/trunk-jpl/src/c/classes/Dakota/IssmParallelDirectApplicInterface.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Dakota/IssmParallelDirectApplicInterface.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/classes/Dakota/IssmParallelDirectApplicInterface.cpp	(revision 22617)
@@ -45,98 +45,97 @@
 	}
 	/*}}}*/
-			int IssmParallelDirectApplicInterface::derived_map_ac(const Dakota::String& ac_name){/*{{{*/
+	int IssmParallelDirectApplicInterface::derived_map_ac(const Dakota::String& ac_name){/*{{{*/
 
-				FemModel* femmodel;
-				
-				char     **responses_descriptors    = NULL;      //these are ours! there are only numresponsedescriptors of them, not d_numresponses!!!
-				char      *response_descriptor      = NULL;
-				int        numresponsedescriptors;
-				int        solution_type;
-				bool       control_analysis         = false;
-				void     (*solutioncore)(FemModel*) = NULL;
-				bool       nodakotacore             = true;
+		FemModel* femmodel;
 
-				int world_rank;
-				ISSM_MPI_Comm_rank(ISSM_MPI_COMM_WORLD,&world_rank);
+		char     **responses_descriptors    = NULL;      //these are ours! there are only numresponsedescriptors of them, not d_numresponses!!!
+		char      *response_descriptor      = NULL;
+		int        numresponsedescriptors;
+		int        solution_type;
+		bool       control_analysis         = false;
+		void     (*solutioncore)(FemModel*) = NULL;
+		bool       nodakotacore             = true;
 
-				/*Only have slaves work!:*/
-				if(world_rank==0)return 0;
+		int world_rank;
+		ISSM_MPI_Comm_rank(ISSM_MPI_COMM_WORLD,&world_rank);
 
-				#ifdef MPI_DEBUG
-				Cout << "eval server id" << evalServerId << " invoking " << ac_name << " within SIM::IssmParallelDirectApplicInterface." << std::endl;
-				#endif // MPI_DEBUG
+		/*Only have slaves work!:*/
+		if(world_rank==0)return 0;
 
-				int i;
-				IssmDouble* variables=NULL;
-				char** variable_descriptors=NULL;
-				char*  variable_descriptor=NULL;
-				IssmDouble* responses=NULL;
+		#ifdef MPI_DEBUG
+		Cout << "eval server id" << evalServerId << " invoking " << ac_name << " within SIM::IssmParallelDirectApplicInterface." << std::endl;
+		#endif // MPI_DEBUG
 
-				/*Before launching evaluation, we need to transfer the dakota inputs into Issm readable variables: */
+		int i;
+		IssmDouble  *variables            = NULL;
+		char       **variable_descriptors = NULL;
+		char        *variable_descriptor  = NULL;
+		IssmDouble  *responses            = NULL;
 
-				/*First, the variables: */
-				variables=xNew<IssmDouble>(numACV);
-				for(i=0;i<numACV;i++){
-					variables[i]=xC[i];
-				}
-				/*The descriptors: */
-				variable_descriptors=xNew<char*>(numACV);
-				for(i=0;i<numACV;i++){
-					std::string label=xCLabels[i];
-					variable_descriptor=xNew<char>(strlen(label.c_str())+1);
-					memcpy(variable_descriptor,label.c_str(),(strlen(label.c_str())+1)*sizeof(char));
+		/*Before launching evaluation, we need to transfer the dakota inputs into Issm readable variables: */
 
-					variable_descriptors[i]=variable_descriptor;
-				}
+		/*First, the variables: */
+		variables=xNew<IssmDouble>(numACV);
+		for(i=0;i<numACV;i++){
+			variables[i]=xC[i];
+		}
+		/*The descriptors: */
+		variable_descriptors=xNew<char*>(numACV);
+		for(i=0;i<numACV;i++){
+			std::string label=xCLabels[i];
+			variable_descriptor=xNew<char>(strlen(label.c_str())+1);
+			memcpy(variable_descriptor,label.c_str(),(strlen(label.c_str())+1)*sizeof(char));
 
-				/*Initialize responses: */
-				responses=xNewZeroInit<IssmDouble>(numFns);
+			variable_descriptors[i]=variable_descriptor;
+		}
 
-				/*Make a copy of femmodel, so we start this new evaluation run for this specific sample with a brand 
-				 * new copy of the model, which has not been tempered with by previous evaluation runs: */
+		/*Initialize responses: */
+		responses=xNewZeroInit<IssmDouble>(numFns);
 
-				femmodel=femmodel_init->copy();
+		/*Make a copy of femmodel, so we start this new evaluation run for this specific sample with a brand 
+		 * new copy of the model, which has not been tempered with by previous evaluation runs: */
+		femmodel=femmodel_init->copy();
 
-				/*retrieve parameters: */
-				femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,QmuResponsedescriptorsEnum);
-				femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
-				femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
+		/*retrieve parameters: */
+		femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,QmuResponsedescriptorsEnum);
+		femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+		femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
 
-				/*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
-				InputUpdateFromDakotax(femmodel,variables,variable_descriptors,numACV);
+		/*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
+		InputUpdateFromDakotax(femmodel,variables,variable_descriptors,numACV);
 
-				/*Determine solution sequence: */
-				if(VerboseQmu()) _printf0_("Starting " << EnumToStringx(solution_type) << " core:\n");
-				WrapperCorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type,nodakotacore);
+		/*Determine solution sequence: */
+		if(VerboseQmu()) _printf0_("Starting " << EnumToStringx(solution_type) << " core:\n");
+		WrapperCorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type,nodakotacore);
 
-				/*Run the core solution sequence: */
-				solutioncore(femmodel);
+		/*Run the core solution sequence: */
+		solutioncore(femmodel);
 
-				/*compute responses: */
-				if(VerboseQmu()) _printf0_("compute dakota responses:\n");
-				femmodel->DakotaResponsesx(responses,responses_descriptors,numresponsedescriptors,numFns);
+		/*compute responses: */
+		if(VerboseQmu()) _printf0_("compute dakota responses:\n");
+		femmodel->DakotaResponsesx(responses,responses_descriptors,numresponsedescriptors,numFns);
 
-				/*populate responses: */
-				for(i=0;i<numFns;i++){
-					fnVals[i]=responses[i];
-				}
+		/*populate responses: */
+		for(i=0;i<numFns;i++){
+			fnVals[i]=responses[i];
+		}
 
-				/*Free ressources:*/
-				xDelete<IssmDouble>(variables);
-				for(i=0;i<numACV;i++){
-					variable_descriptor=variable_descriptors[i];
-					xDelete<char>(variable_descriptor);
-				}
-				xDelete<char*>(variable_descriptors);
-				for(i=0;i<numresponsedescriptors;i++){
-					response_descriptor=responses_descriptors[i];
-					xDelete<char>(response_descriptor);
-				}
-				if(responses_descriptors) xDelete<char*>(responses_descriptors);
-				xDelete<IssmDouble>(responses);
-				delete femmodel;
+		/*Free ressources:*/
+		xDelete<IssmDouble>(variables);
+		for(i=0;i<numACV;i++){
+			variable_descriptor=variable_descriptors[i];
+			xDelete<char>(variable_descriptor);
+		}
+		xDelete<char*>(variable_descriptors);
+		for(i=0;i<numresponsedescriptors;i++){
+			response_descriptor=responses_descriptors[i];
+			xDelete<char>(response_descriptor);
+		}
+		if(responses_descriptors) xDelete<char*>(responses_descriptors);
+		xDelete<IssmDouble>(responses);
+		delete femmodel;
 
-				return 0;
-			}/*}}}*/
+		return 0;
+	}/*}}}*/
 }
 #endif
Index: /issm/trunk-jpl/src/c/classes/Params/Param.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 22616)
+++ /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 22617)
@@ -19,5 +19,5 @@
 /*}}}*/
 
-class Param{
+class Param: public Object{
 
 	public: 
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22617)
@@ -64,6 +64,6 @@
 	/*Get index in array*/
 	#ifdef _ISSM_DEBUG_
-	if(param_enum<=ParametersSTARTEnum) _error_("Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
-	if(param_enum>=ParametersENDEnum)   _error_("Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
+	if(param_enum<=ParametersSTARTEnum) _error_("Cannot add param: Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
+	if(param_enum>=ParametersENDEnum)   _error_("Cannot add param: Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
 	#endif
 	int index = param_enum - ParametersSTARTEnum -1;
@@ -414,4 +414,27 @@
 }
 /*}}}*/
+void Parameters::FindParamInDataset(IssmDouble** pIssmDoublearray,int* pM,int* pN,int dataset_type,int enum_type){/*{{{*/
+	_assert_(this);
+
+	_assert_(dataset_type>ParametersSTARTEnum);
+	_assert_(dataset_type<ParametersENDEnum);
+
+	int index = dataset_type - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(dataset_type) <<" not set");
+	if(this->params[index]->ObjectEnum()!=DataSetParamEnum) _error_("Parameter " << EnumToStringx(dataset_type) <<" is not a DataSetParam!");
+
+	DataSetParam* dataset_param = xDynamicCast<DataSetParam*>(this->params[index]);
+	for( vector<Object*>::iterator object=dataset_param->value->objects.begin() ; object < dataset_param->value->objects.end(); object++ ){
+		Param* param = xDynamicCast<Param*>(*object);
+		if(param->InstanceEnum()==enum_type){
+			param->GetParameterValue(pIssmDoublearray,pM,pN);
+			return;
+		}
+	}
+
+	/*Error out if we reached this point*/
+	_error_("Could not find Enum "<<EnumToStringx(enum_type)<<" in dataset param "<<EnumToStringx(dataset_type));
+}
+/*}}}*/
 
 void   Parameters::SetParam(bool boolean,int enum_type){/*{{{*/
@@ -566,6 +589,6 @@
 
 	#ifdef _ISSM_DEBUG_
-	if(param_enum<=ParametersSTARTEnum) _error_("Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
-	if(param_enum>=ParametersENDEnum)   _error_("Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
+	if(param_enum<=ParametersSTARTEnum) _error_("Cannot find param: Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
+	if(param_enum>=ParametersENDEnum)   _error_("Cannot find param: Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
 	#endif
 
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 22616)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 22617)
@@ -51,4 +51,5 @@
 		void  FindParam(FILE** pfid,int enum_type);
 		void  FindParam(DataSet** pdataset, int enum_type);
+		void  FindParamInDataset(IssmDouble** pIssmDoublearray,int* pM,int* pN,int dataset_type,int enum_type);
 
 		void  SetParam(bool boolean,int enum_type);
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 22617)
@@ -54,5 +54,5 @@
 
 			/*Now, pick up the parameter corresponding to root: */
-			femmodel->parameters->FindParam(&parameter,&nrows,&ncols,StringToEnumx(root));
+			femmodel->parameters->FindParamInDataset(&parameter,&nrows,&ncols,QmuVariableDescriptorsEnum,StringToEnumx(root));
 
 			/*We've got the parameter, we need to update it using qmu_part (a partitioning vector), 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 22617)
@@ -79,4 +79,5 @@
 
 		/*Deal with data needed because of qmu variables*/
+		DataSet* dataset_variable_descriptors = new DataSet(QmuVariableDescriptorsEnum);
 		for(i=0;i<numvariabledescriptors;i++){
 			if (strncmp(variabledescriptors[i],"scaled_",7)==0){
@@ -92,8 +93,8 @@
 				iomodel->FetchData(&dakota_parameter,&nrows,&ncols,fieldname);
 				if(nrows==iomodel->numberofvertices){
-					parameters->AddObject(new DoubleMatParam(param_enum,dakota_parameter,nrows,ncols));
+					dataset_variable_descriptors->AddObject(new DoubleMatParam(param_enum,dakota_parameter,nrows,ncols));
 				}
 				else{
-					parameters->AddObject(new DoubleTransientMatParam(param_enum,dakota_parameter,nrows,ncols));
+					dataset_variable_descriptors->AddObject(new DoubleTransientMatParam(param_enum,dakota_parameter,nrows,ncols));
 				}
 				xDelete<double>(dakota_parameter);
@@ -101,4 +102,6 @@
 			}
 		}
+		parameters->AddObject(new DataSetParam(QmuVariableDescriptorsEnum,dataset_variable_descriptors));
+		delete dataset_variable_descriptors;
 
 		/*clean-up*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22616)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22617)
@@ -214,4 +214,5 @@
 	QmuPartitionEnum,
 	QmuResponsedescriptorsEnum,
+	QmuVariableDescriptorsEnum,
 	RestartFileNameEnum,
 	ResultsEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22617)
@@ -222,4 +222,5 @@
 		case QmuPartitionEnum : return "QmuPartition";
 		case QmuResponsedescriptorsEnum : return "QmuResponsedescriptors";
+		case QmuVariableDescriptorsEnum : return "QmuVariableDescriptors";
 		case RestartFileNameEnum : return "RestartFileName";
 		case ResultsEnum : return "Results";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22616)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22617)
@@ -225,4 +225,5 @@
 	      else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
 	      else if (strcmp(name,"QmuResponsedescriptors")==0) return QmuResponsedescriptorsEnum;
+	      else if (strcmp(name,"QmuVariableDescriptors")==0) return QmuVariableDescriptorsEnum;
 	      else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
 	      else if (strcmp(name,"Results")==0) return ResultsEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"SmbCldFrac")==0) return SmbCldFracEnum;
 	      else if (strcmp(name,"SmbDelta18o")==0) return SmbDelta18oEnum;
-	      else if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
+	      if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
+	      else if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
 	      else if (strcmp(name,"SmbDt")==0) return SmbDtEnum;
 	      else if (strcmp(name,"Smb")==0) return SmbEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
 	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
-	      else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
+	      if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
+	      else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
 	      else if (strcmp(name,"CrevasseDepth")==0) return CrevasseDepthEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
 	      else if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
-	      else if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SmbDz")==0) return SmbDzEnum;
+	      if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
+	      else if (strcmp(name,"SmbDz")==0) return SmbDzEnum;
 	      else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum;
 	      else if (strcmp(name,"SmbDzMin")==0) return SmbDzMinEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum;
 	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
-	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"HydrologyBasalFlux")==0) return HydrologyBasalFluxEnum;
 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
-	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
+	      if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
+	      else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
 	      else if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
-	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Nodal")==0) return NodalEnum;
+	      if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
 	      else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
 	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
 	      else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
-	      else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+	      if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
+	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
 	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
-	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
+	      if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
+	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
 	      else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
 	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
