Index: /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18615)
+++ /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18616)
@@ -33,4 +33,5 @@
 	int          maxsteps,maxiter;
 	int          intn,num_controls,solution_type;
+	IssmDouble  *scaling_factors = NULL;
 	IssmDouble  *X  = NULL;
 	IssmDouble  *G  = NULL;
@@ -43,4 +44,5 @@
 	femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
 	femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
+	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 	femmodel->parameters->SetParam(false,SaveResultsEnum);
 
@@ -74,4 +76,10 @@
 	G = xNew<double>(n);
 
+	/*Scale control for M1QN3*/
+	if(num_controls!=1) _error_("not supported yet...");
+	for(long i=0;i<n;i++){
+		X[i] = X[i]/scaling_factors[0];
+	}
+
 	/*Allocate m1qn3 working arrays (see doc)*/
 	long      m   = 100;
@@ -132,6 +140,10 @@
 
 	/*Recover number of cost functions responses*/
-	int num_responses;
+	int         num_responses;
+	int         num_controls;
+	IssmDouble* scaling_factors = NULL;
 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 
 	/*Constrain input vector*/
@@ -140,5 +152,7 @@
 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
+	if(num_controls!=1) _error_("not supported yet");
 	for(long i=0;i<*n;i++){
+		X[i] = X[i]*scaling_factors[0];
 		if(X[i]>XU[i]) X[i]=XU[i];
 		if(X[i]<XL[i]) X[i]=XL[i];
@@ -162,6 +176,4 @@
 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
 
-
-
 	if(indic==0){
 		/*dry run, no gradient required*/
@@ -190,7 +202,10 @@
 	/*Constrain Gradient*/
 	IssmDouble  Gnorm = 0.;
+	if(num_controls!=1) _error_("not supported yet");
 	for(long i=0;i<*n;i++){
 		if(X[i]>=XU[i]) G[i]=0.;
 		if(X[i]<=XL[i]) G[i]=0.;
+		G[i] = G[i]*scaling_factors[0];
+		X[i] = X[i]/scaling_factors[0];
 		Gnorm += G[i]*G[i];
 	}
@@ -203,5 +218,5 @@
 
 	/*Clean-up and return*/
-		xDelete<IssmDouble>(Jlist);
+	xDelete<IssmDouble>(Jlist);
 	xDelete<IssmDouble>(XU);
 	xDelete<IssmDouble>(XL);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18615)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18616)
@@ -13,6 +13,6 @@
 	int         inversiontype;
 	int         nsteps;
-	int         num_control_type;
-	int         num_cm_responses;
+	int         num_controls;
+	int         num_costfunc;
 	int        *control_type     = NULL;
 	int        *maxiter          = NULL;
@@ -20,4 +20,5 @@
 	IssmDouble *cm_jump          = NULL;
 	IssmDouble *optscal          = NULL;
+	IssmDouble *control_scaling_factors = NULL;
 
 	/*retrieve some parameters: */
@@ -41,8 +42,8 @@
 
 		/*Now, recover fit, optscal and maxiter as vectors: */
-		iomodel->FetchData(&control_type,NULL,&num_control_type,InversionControlParametersEnum);
-		iomodel->FetchData(&cm_responses,NULL,&num_cm_responses,InversionCostFunctionsEnum);
-		parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_control_type));
-		parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_cm_responses));
+		iomodel->FetchData(&control_type,NULL,&num_controls,InversionControlParametersEnum);
+		iomodel->FetchData(&cm_responses,NULL,&num_costfunc,InversionCostFunctionsEnum);
+		parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_controls));
+		parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_costfunc));
 
 		/*Inversion type specifics*/
@@ -54,5 +55,5 @@
 				iomodel->FetchData(&optscal,NULL,NULL,InversionGradientScalingEnum);
 				iomodel->FetchData(&maxiter,NULL,NULL,InversionMaxiterPerStepEnum);
-				parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_control_type));
+				parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_controls));
 				parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps));
 				parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));
@@ -73,4 +74,6 @@
 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
+				iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
+				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
 				break;
 			case 3:/*Validation*/
