Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16313)
@@ -2177,6 +2177,5 @@
 	IssmDouble  yts;
 	bool    control_analysis;
-	int     num_control_type;
-	int     num_cm_responses;
+	int     num_control_type,num_responses;
 
 	/*Fetch parameters: */
@@ -2184,5 +2183,5 @@
 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
 	if(control_analysis) iomodel->Constant(&num_control_type,InversionNumControlParametersEnum);
-	if(control_analysis) iomodel->Constant(&num_cm_responses,InversionNumCostFunctionsEnum);
+	if(control_analysis) iomodel->Constant(&num_responses,InversionNumCostFunctionsEnum);
 
 	/*Checks if debuging*/
@@ -2282,7 +2281,7 @@
 		/*Create inputs and add to DataSetInput*/
 		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
-		for(i=0;i<num_cm_responses;i++){
-			for(j=0;j<6;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(penta_vertex_ids[j]-1)*num_cm_responses+i];
-			datasetinput->inputs->AddObject(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum));
+		for(i=0;i<num_responses;i++){
+			for(j=0;j<6;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(penta_vertex_ids[j]-1)*num_responses+i];
+			datasetinput->AddInput(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),int(iomodel->Data(InversionCostFunctionsEnum)[i]));
 		}
 
@@ -5609,5 +5608,5 @@
 		for(resp=0;resp<num_responses;resp++){
 
-			weights_input->GetInputValue(&weight,gauss,resp);
+			weights_input->GetInputValue(&weight,gauss,responses[resp]);
 
 			switch(responses[resp]){
@@ -5805,5 +5804,5 @@
 		for(resp=0;resp<num_responses;resp++){
 
-			weights_input->GetInputValue(&weight,gauss,resp);
+			weights_input->GetInputValue(&weight,gauss,responses[resp]);
 
 			switch(responses[resp]){
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16313)
@@ -1519,7 +1519,6 @@
 	IssmDouble cmmaxinputs[3];
 	bool       control_analysis   = false;
-	int        num_control_type;
+	int        num_control_type,num_responses;
 	IssmDouble yts;
-	int        num_cm_responses;
 
 	/*Get parameters: */
@@ -1527,5 +1526,5 @@
 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
 	if(control_analysis) iomodel->Constant(&num_control_type,InversionNumControlParametersEnum);
-	if(control_analysis) iomodel->Constant(&num_cm_responses,InversionNumCostFunctionsEnum);
+	if(control_analysis) iomodel->Constant(&num_responses,InversionNumCostFunctionsEnum);
 
 	/*Recover vertices ids needed to initialize inputs*/
@@ -1594,7 +1593,7 @@
 		/*Create inputs and add to DataSetInput*/
 		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
-		for(i=0;i<num_cm_responses;i++){
-			for(j=0;j<3;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(tria_vertex_ids[j]-1)*num_cm_responses+i];
-			datasetinput->inputs->AddObject(new TriaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum));
+		for(i=0;i<num_responses;i++){
+			for(j=0;j<3;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(tria_vertex_ids[j]-1)*num_responses+i];
+			datasetinput->AddInput(new TriaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),int(iomodel->Data(InversionCostFunctionsEnum)[i]));
 		}
 
@@ -3650,5 +3649,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,BalancethicknessMisfitEnum);
 		thickness_input->GetInputValue(&H, gauss);
 		thickness_input->GetInputDerivativeValue(&dH[0],&xyz_list[0][0],gauss);
@@ -3859,5 +3858,5 @@
 		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
 		GetNodalFunctionsDerivatives(&dbasis[0][0],&xyz_list[0][0],gauss);
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);
 
 		/*Build alpha_complement_list: */
@@ -4100,5 +4099,5 @@
 		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
 		GetNodalFunctionsDerivatives(&dbasis[0][0],&xyz_list[0][0],gauss);
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
 
 		/*Build alpha_complement_list: */
@@ -4270,51 +4269,51 @@
 
 		/*Loop over all requested responses*/
-		for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
-
-			case ThicknessAbsMisfitEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				for(i=0;i<NUMVERTICES;i++) grade_g[i]+= (thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
-				break;
-			case ThicknessAbsGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*dH[0]*dbasis[0][i]*Jdet*gauss->weight;
-				for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*dH[1]*dbasis[1][i]*Jdet*gauss->weight;
-				break;
-			case ThicknessAlongGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				vx_input->GetInputValue(&vx,gauss);
-				vy_input->GetInputValue(&vy,gauss);
-				vel = sqrt(vx*vx+vy*vy);
-				vx  = vx/(vel+1.e-9);
-				vy  = vy/(vel+1.e-9);
-				for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0][i]*vx+dbasis[1][i]*vy)*Jdet*gauss->weight;
-				break;
-			case ThicknessAcrossGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				vx_input->GetInputValue(&vx,gauss);
-				vy_input->GetInputValue(&vy,gauss);
-				vel = sqrt(vx*vx+vy*vy);
-				vx  = vx/(vel+1.e-9);
-				vy  = vy/(vel+1.e-9);
-				for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0][i]*(-vy)+dbasis[1][i]*vx)*Jdet*gauss->weight;
-				break;
-			case BalancethicknessMisfitEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				surface_mass_balance_input->GetInputValue(&surface_mass_balance,gauss);
-				basal_melting_input->GetInputValue(&basal_melting,gauss);
-				dhdt_input->GetInputValue(&dhdt,gauss);
-				vx_input->GetInputValue(&vx,gauss);
-				vx_input->GetInputDerivativeValue(&dvx[0],&xyz_list[0][0],gauss);
-				vy_input->GetInputValue(&vy,gauss);
-				vy_input->GetInputDerivativeValue(&dvy[0],&xyz_list[0][0],gauss);
-				for(i=0;i<NUMVERTICES;i++){
-					grade_g[i]+= - weight*Jdet*gauss->weight*(
-								(vx*dH[0]+vy*dH[1] + thickness*(dvx[0]+dvy[1]))*(vx*dbasis[0][i]+ vy*dbasis[1][i] + basis[i]*(dvx[0]+dvy[1]))
-								-(surface_mass_balance-basal_melting-dhdt)*(vx*dbasis[0][i]+ vy*dbasis[1][i] + basis[i]*(dvx[0]+dvy[1]))
-								);
-				}
-				break;
-			default:
-				_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+		for(resp=0;resp<num_responses;resp++){
+
+			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+
+			switch(responses[resp]){
+
+				case ThicknessAbsMisfitEnum:
+					for(i=0;i<NUMVERTICES;i++) grade_g[i]+= (thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
+					break;
+				case ThicknessAbsGradientEnum:
+					for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*dH[0]*dbasis[0][i]*Jdet*gauss->weight;
+					for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*dH[1]*dbasis[1][i]*Jdet*gauss->weight;
+					break;
+				case ThicknessAlongGradientEnum:
+					vx_input->GetInputValue(&vx,gauss);
+					vy_input->GetInputValue(&vy,gauss);
+					vel = sqrt(vx*vx+vy*vy);
+					vx  = vx/(vel+1.e-9);
+					vy  = vy/(vel+1.e-9);
+					for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0][i]*vx+dbasis[1][i]*vy)*Jdet*gauss->weight;
+					break;
+				case ThicknessAcrossGradientEnum:
+					vx_input->GetInputValue(&vx,gauss);
+					vy_input->GetInputValue(&vy,gauss);
+					vel = sqrt(vx*vx+vy*vy);
+					vx  = vx/(vel+1.e-9);
+					vy  = vy/(vel+1.e-9);
+					for(i=0;i<NUMVERTICES;i++) grade_g[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0][i]*(-vy)+dbasis[1][i]*vx)*Jdet*gauss->weight;
+					break;
+				case BalancethicknessMisfitEnum:
+					surface_mass_balance_input->GetInputValue(&surface_mass_balance,gauss);
+					basal_melting_input->GetInputValue(&basal_melting,gauss);
+					dhdt_input->GetInputValue(&dhdt,gauss);
+					vx_input->GetInputValue(&vx,gauss);
+					vx_input->GetInputDerivativeValue(&dvx[0],&xyz_list[0][0],gauss);
+					vy_input->GetInputValue(&vy,gauss);
+					vy_input->GetInputDerivativeValue(&dvy[0],&xyz_list[0][0],gauss);
+					for(i=0;i<NUMVERTICES;i++){
+						grade_g[i]+= - weight*Jdet*gauss->weight*(
+									(vx*dH[0]+vy*dH[1] + thickness*(dvx[0]+dvy[1]))*(vx*dbasis[0][i]+ vy*dbasis[1][i] + basis[i]*(dvx[0]+dvy[1]))
+									-(surface_mass_balance-basal_melting-dhdt)*(vx*dbasis[0][i]+ vy*dbasis[1][i] + basis[i]*(dvx[0]+dvy[1]))
+									);
+					}
+					break;
+				default:
+					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+			}
 		}
 	}
@@ -4372,5 +4371,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);
 		rheologyb_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);
 
@@ -4417,5 +4416,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,SurfaceAverageVelMisfitEnum);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
@@ -4475,5 +4474,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,SurfaceLogVelMisfitEnum);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
@@ -4534,5 +4533,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,SurfaceLogVxVyMisfitEnum);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
@@ -4592,5 +4591,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,SurfaceAbsVelMisfitEnum);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
@@ -4651,5 +4650,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,SurfaceRelVelMisfitEnum);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
@@ -4708,5 +4707,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,ThicknessAbsGradientEnum);
 		thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);
 
@@ -4754,5 +4753,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,ThicknessAlongGradientEnum);
 		thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);
 		vx_input->GetInputValue(&vx,gauss);
@@ -4805,5 +4804,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,ThicknessAcrossGradientEnum);
 		thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);
 		vx_input->GetInputValue(&vx,gauss);
@@ -4855,5 +4854,5 @@
 		thickness_input->GetInputDerivativeValue(&dH[0],&xyz_list[0][0],gauss);
 		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,ThicknessAbsGradientEnum);
 
 		/*compute ThicknessAbsMisfit*/
@@ -4912,35 +4911,35 @@
 
 		/*Loop over all requested responses*/
-		for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
-
-			case ThicknessAbsMisfitEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				for(i=0;i<numnodes;i++) pe->values[i]+=(thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
-				break;
-			case ThicknessAbsGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[0]*dbasis[0*numnodes+i]*Jdet*gauss->weight;
-				for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[1]*dbasis[1*numnodes+i]*Jdet*gauss->weight;
-				break;
-			case ThicknessAlongGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				vx_input->GetInputValue(&vx,gauss);
-				vy_input->GetInputValue(&vy,gauss);
-				vel = sqrt(vx*vx+vy*vy);
-				vx  = vx/(vel+1.e-9);
-				vy  = vy/(vel+1.e-9);
-				for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numnodes+i]*vx+dbasis[1*numnodes+i]*vy)*Jdet*gauss->weight;
-				break;
-			case ThicknessAcrossGradientEnum:
-				weights_input->GetInputValue(&weight, gauss,resp);
-				vx_input->GetInputValue(&vx,gauss);
-				vy_input->GetInputValue(&vy,gauss);
-				vel = sqrt(vx*vx+vy*vy);
-				vx  = vx/(vel+1.e-9);
-				vy  = vy/(vel+1.e-9);
-				for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numnodes+i]*(-vy)+dbasis[1*numnodes+i]*vx)*Jdet*gauss->weight;
-				break;
-			default:
-				_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+		for(resp=0;resp<num_responses;resp++){
+
+			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+
+			switch(responses[resp]){
+				case ThicknessAbsMisfitEnum:
+					for(i=0;i<numnodes;i++) pe->values[i]+=(thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
+					break;
+				case ThicknessAbsGradientEnum:
+					for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[0]*dbasis[0*numnodes+i]*Jdet*gauss->weight;
+					for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[1]*dbasis[1*numnodes+i]*Jdet*gauss->weight;
+					break;
+				case ThicknessAlongGradientEnum:
+					vx_input->GetInputValue(&vx,gauss);
+					vy_input->GetInputValue(&vy,gauss);
+					vel = sqrt(vx*vx+vy*vy);
+					vx  = vx/(vel+1.e-9);
+					vy  = vy/(vel+1.e-9);
+					for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numnodes+i]*vx+dbasis[1*numnodes+i]*vy)*Jdet*gauss->weight;
+					break;
+				case ThicknessAcrossGradientEnum:
+					vx_input->GetInputValue(&vx,gauss);
+					vy_input->GetInputValue(&vy,gauss);
+					vel = sqrt(vx*vx+vy*vy);
+					vx  = vx/(vel+1.e-9);
+					vy  = vy/(vel+1.e-9);
+					for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numnodes+i]*(-vy)+dbasis[1*numnodes+i]*vx)*Jdet*gauss->weight;
+					break;
+				default:
+					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+			}
 		}
 	}
@@ -5013,5 +5012,5 @@
 		for(resp=0;resp<num_responses;resp++){
 
-			weights_input->GetInputValue(&weight,gauss,resp);
+			weights_input->GetInputValue(&weight,gauss,responses[resp]);
 
 			switch(responses[resp]){
@@ -5170,5 +5169,5 @@
 
 		/*Get all parameters at gaussian point*/
-		weights_input->GetInputValue(&weight,gauss,weight_index);
+		weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
 		drag_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);
 
Index: /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 16313)
@@ -16,13 +16,17 @@
 /*FUNCTION DatasetInput::DatasetInput(){{{*/
 DatasetInput::DatasetInput(){
-	enum_type=UNDEF;
-	inputs=NULL;
+	enum_type = UNDEF;
+	inputs    = NULL;
+	numids    = 0;
+	ids       = NULL;
 }
 /*}}}*/
-/*FUNCTION DatasetInput::DatasetInput(int in_enum_type) {{{*/
+/*FUNCTION DatasetInput::DatasetInput(int in_enum_type,int* idlist,int numids) {{{*/
 DatasetInput::DatasetInput(int in_enum_type){
 
-	enum_type  = in_enum_type;
-	inputs     = new Inputs();
+	enum_type = in_enum_type;
+	numids    = 0;
+	inputs    = new Inputs();
+	ids       = NULL;
 }
 /*}}}*/
@@ -44,5 +48,9 @@
 	_printf_("DatasetInput:\n");
 	_printf_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n");
-	_printf_("---inputs: \n"); inputs->Echo();
+	_printf_("   numids:"<< this->numids<< "\n");
+	_printf_("      ids: ");
+	for(int i=0;i<this->numids;i++) _printf_(this->ids[i]<<" ");
+	_printf_("\n");
+	_printf_("   inputs: \n"); inputs->Echo();
 }
 /*}}}*/
@@ -79,4 +87,7 @@
 	outinput->enum_type=this->enum_type;
 	outinput->inputs=dynamic_cast<Inputs*>(this->inputs->SpawnTriaInputs(location));
+	outinput->numids=this->numids;
+	outinput->ids=xNew<int>(this->numids);
+	xMemCpy(outinput->ids,this->ids,this->numids);
 
 	/*Assign output*/
@@ -86,4 +97,32 @@
 
 /*DatasetInput management*/
+/*FUNCTION DatasetInput::AddInput{{{*/
+void DatasetInput::AddInput(Input* input,int id){
+
+	_assert_(this->numids == this->inputs->Size());
+
+	int *old_ids = NULL;
+
+	if(this->numids>0){
+		old_ids=xNew<int>(this->numids);
+		xMemCpy(old_ids,this->ids,this->numids);
+		xDelete<int>(this->ids);
+	}
+
+	this->numids=this->numids+1;
+	this->ids=xNew<int>(this->numids);
+
+	if(this->numids>1){
+		xMemCpy(this->ids,old_ids,this->numids-1);
+		xDelete<int>(old_ids);
+	}
+
+	/*go ahead and plug: */
+	this->ids[this->numids-1]=id;
+	inputs->AddObject(input);
+
+	_assert_(this->numids == this->inputs->Size());
+}
+/*}}}*/
 /*FUNCTION DatasetInput::InstanceEnum{{{*/
 int DatasetInput::InstanceEnum(void){
@@ -100,6 +139,25 @@
 }
 /*}}}*/
-/*FUNCTION DatasetInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss,int index){{{*/
-void DatasetInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss,int index){
+/*FUNCTION DatasetInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss,int id){{{*/
+void DatasetInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss,int id){
+
+	int  offset = -1;
+	_assert_(this->numids == this->inputs->Size());
+
+	/*Get requested input within dataset*/
+	for(int i=0;i<this->numids;i++) if(this->ids[i]==id) offset=i;
+	if(offset<0){
+		this->Echo();
+		_error_("Could not find input of id "<<id);
+	}
+
+	Input* input=dynamic_cast<Input*>(this->inputs->GetObjectByOffset(offset));
+	input->GetInputValue(pvalue,gauss);
+}
+/*}}}*/
+/*FUNCTION DatasetInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss,int index){{{*/
+void DatasetInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss,int index){
+
+	_assert_(this->numids == this->inputs->Size());
 
 	/*Get requested input within dataset*/
@@ -110,12 +168,2 @@
 }
 /*}}}*/
-/*FUNCTION DatasetInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss,int index){{{*/
-void DatasetInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss,int index){
-
-	/*Get requested input within dataset*/
-	if(index<0 || index > inputs->Size()-1) _error_("index requested (" << index << ") exceeds dataset size (" << inputs->Size() << ")");
-	Input* input=dynamic_cast<Input*>(this->inputs->GetObjectByOffset(index));
-
-	input->GetInputValue(pvalue,gauss);
-}
-/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 16312)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 16313)
@@ -17,5 +17,7 @@
 	public:
 		int     enum_type;
+		int     numids;
 		Inputs *inputs;
+		int    *ids;
 
 		/*DatasetInput constructors, destructors: {{{*/
@@ -32,4 +34,5 @@
 		/*}}}*/
 		/*DatasetInput management: {{{*/
+		void   AddInput(Input* input,int id);
 		int    InstanceEnum();
 		Input* SpawnTriaInput(int location);
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 16313)
@@ -714,5 +714,5 @@
 	fid=this->SetFilePointerToData(&code,NULL,data_enum);
 
-	if((code!=5) && (code!=6) && (code!=7))_error_("expecting a IssmDouble, integer or boolean matrix for enum " << EnumToStringx(data_enum));
+	if(code!=5 && code!=6 && code!=7)_error_("expecting a IssmDouble, integer or boolean matrix for enum " << EnumToStringx(data_enum)<<" (Code is "<<code<<")");
 
 	/*Now fetch: */
@@ -780,5 +780,5 @@
 	/*Set file pointer to beginning of the data: */
 	fid=this->SetFilePointerToData(&code,NULL,data_enum);
-	if((code!=5) && (code!=6) && (code!=7))_error_("expecting a IssmDouble, integer or boolean matrix for enum " << EnumToStringx(data_enum));
+	if(code!=5 && code!=6 && code!=7)_error_("expecting a IssmDouble, integer or boolean matrix for enum " << EnumToStringx(data_enum)<<" (Code is "<<code<<")");
 
 	/*Now fetch: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 16313)
@@ -49,5 +49,5 @@
 		/*Now, recover fit, optscal and maxiter as vectors: */
 		iomodel->FetchData(&control_type,NULL,&num_control_type,InversionControlParametersEnum);
-		iomodel->FetchData(&cm_responses,&nsteps,&num_cm_responses,InversionCostFunctionsEnum);
+		iomodel->FetchData(&cm_responses,NULL,&num_cm_responses,InversionCostFunctionsEnum);
 		if(!tao_analysis){
 			iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 16312)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 16313)
@@ -31,5 +31,5 @@
 	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
 
-	iomodel->FetchData(4,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
 	for(i=0;i<num_control_type;i++){
 		switch(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])){
@@ -59,4 +59,4 @@
 
 	/*Free data: */
-	iomodel->DeleteData(4+7,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,ThicknessEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,DamageDEnum);
+	iomodel->DeleteData(5+7,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,ThicknessEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,DamageDEnum);
 }
