Index: /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 25329)
+++ /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 25330)
@@ -197,13 +197,14 @@
 
 	/*Recover some parameters*/
-	IssmDouble *scaling_factors = NULL;
-	int        *N               = NULL;
-	int        *control_enum    = NULL;
+	double *scaling_factors = NULL;
+	int    *M = NULL;
+	int    *N = NULL;
+	int    *control_enum    = NULL;
 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
-	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+	femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 	femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum);
+	femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
 	femmodel->parameters->FindParam(&control_enum,NULL,InversionControlParametersEnum);
-	int numberofvertices=femmodel->vertices->NumberOfVertices();
 
 	/*Constrain input vector and update controls*/
@@ -213,13 +214,13 @@
 	GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
 
-	int N_add = 0;
+	int offset = 0;
 	for (int c=0;c<num_controls;c++){
-		for(int i=0;i<numberofvertices*N[c];i++){
-			int index = N_add*numberofvertices+i;
-			X[index] = X[index]*reCast<double>(scaling_factors[c]);
+		for(int i=0;i<M[c]*N[c];i++){
+			int index = offset+i;
+			X[index] = X[index]*scaling_factors[c];
 			if(X[index]>XU[index]) X[index]=XU[index];
 			if(X[index]<XL[index]) X[index]=XL[index];
 		}
-		N_add+=N[c];
+		offset += M[c]*N[c];
 	}
 
@@ -439,15 +440,15 @@
 	/*Constrain Gradient*/
 	IssmDouble  Gnorm = 0.;
-	N_add = 0;
-	for (int c=0;c<num_controls;c++){
-		for(int i=0;i<numberofvertices*N[c];i++){
-			int index = N_add*numberofvertices+i;
+	offset = 0;
+	for(int c=0;c<num_controls;c++){
+		for(int i=0;i<M[c]*N[c];i++){
+			int index = offset+i;
 			if(X[index]>=XU[index]) G[index]=0.;
 			if(X[index]<=XL[index]) G[index]=0.;
-			G[index] = G[index]*reCast<double>(scaling_factors[c]);
-			X[index] = X[index]/reCast<double>(scaling_factors[c]);
+			G[index] = G[index]*scaling_factors[c];
+			X[index] = X[index]/scaling_factors[c];
 			Gnorm += G[index]*G[index];
 		}
-		N_add+=N[c];
+		offset += M[c]*N[c];
 	}
 	Gnorm = sqrt(Gnorm);
@@ -464,5 +465,5 @@
 	xDelete<int>(control_enum);
 	xDelete<int>(N);
-	xDelete<IssmDouble>(scaling_factors);
+	xDelete<double>(scaling_factors);
 	xDelete<IssmPDouble>(totalgradient);
 }/*}}}*/
@@ -474,11 +475,10 @@
 	double		 dxmin,gttol; 
 	int          maxsteps,maxiter;
-	int          intn,numberofvertices,num_controls,num_cost_functions,solution_type;
-	IssmDouble	*scaling_factors = NULL;
+	int          intn,num_controls,num_cost_functions,solution_type;
+	double*      scaling_factors = NULL;
 	double      *X  = NULL;
 	double      *G  = NULL;
 	int*			N	= NULL;
-	int offset = 0;
-	int N_add;
+   int*			M	= NULL;
 	int* control_enum;
 
@@ -491,9 +491,9 @@
 	femmodel->parameters->FindParamAndMakePassive(&dxmin,InversionDxminEnum);
 	femmodel->parameters->FindParamAndMakePassive(&gttol,InversionGttolEnum);
-	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+	femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 	femmodel->parameters->FindParam(&control_enum,NULL,InversionControlParametersEnum);
 	femmodel->parameters->SetParam(false,SaveResultsEnum);
 	femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum);
-	numberofvertices=femmodel->vertices->NumberOfVertices();
+   femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
 
 	/*Initialize M1QN3 parameters*/
@@ -517,5 +517,4 @@
 	/*Get initial guess*/
 	GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
-	//_assert_(intn==numberofvertices*num_controls);
 
 	/*Get problem dimension and initialize gradient and initial guess*/
@@ -524,12 +523,12 @@
 
 	/*Scale control for M1QN3*/
-	N_add = 0;
-	for (int c=0;c<num_controls;c++){
-		for(int i=0;i<numberofvertices*N[c];i++){
-			int index = N_add*numberofvertices+i;
-			X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);
-		}
-		N_add+=N[c];
-	}
+   int offset = 0;
+   for(int c=0;c<num_controls;c++){
+      for(int i=0;i<M[c]*N[c];i++){
+         int index = offset+i;
+         X[index] = X[index]/scaling_factors[c];
+      }
+      offset += M[c]*N[c];
+   }
 
 	/*Allocate m1qn3 working arrays (see documentation)*/
@@ -578,14 +577,14 @@
 	GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
 
-	N_add = 0;
-	for (int c=0;c<num_controls;c++){
-		for(int i=0;i<numberofvertices*N[c];i++){
-			int index = N_add*numberofvertices+i;
-			X[index] = X[index]*reCast<double>(scaling_factors[c]);
-			if(X[index]>XU[index]) X[index]=XU[index];
-			if(X[index]<XL[index]) X[index]=XL[index];
-		}
-		N_add +=N[c];
-	}
+   offset = 0;
+   for (int c=0;c<num_controls;c++){
+      for(int i=0;i<M[c]*N[c];i++){
+         int index = offset+i;
+         X[index] = X[index]*scaling_factors[c];
+         if(X[index]>XU[index]) X[index]=XU[index];
+         if(X[index]<XL[index]) X[index]=XL[index];
+      }
+      offset += M[c]*N[c];
+   }
 
 	/*Set X as our new control*/
@@ -612,6 +611,6 @@
 
 			/*Disect results*/
-			GenericExternalResult<IssmPDouble*>* G_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Gradient1Enum+i,&G[offset],N[i],numberofvertices,1,0.);
-			GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i],numberofvertices,1,0.);
+			GenericExternalResult<IssmPDouble*>* G_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Gradient1Enum+i,&G[offset],N[i],M[i],1,0.);
+			GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i],M[i],1,0.);
 
 			/*transpose for consistency with MATLAB's formating*/
@@ -623,5 +622,5 @@
 			femmodel->results->AddObject(X_output);
 
-			offset += N[i]*numberofvertices;
+			offset += N[i]*M[i];
 		}
 	}
@@ -649,5 +648,5 @@
 	xDelete<double>(XU);
 	xDelete<double>(XL);
-	xDelete<IssmDouble>(scaling_factors);
+	xDelete<double>(scaling_factors);
 	xDelete<IssmPDouble>(mystruct.Jlist);
 	xDelete<int>(mystruct.i);
Index: /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 25329)
+++ /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 25330)
@@ -42,5 +42,5 @@
 	double  f,dxmin,gttol; 
 	int     maxsteps,maxiter;
-	int     intn,numberofvertices,num_controls,num_cost_functions,solution_type;
+	int     intn,num_controls,num_cost_functions,solution_type;
 	double *scaling_factors = NULL;
 	double *X  = NULL;
@@ -63,5 +63,4 @@
 	femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 	femmodel->parameters->SetParam(false,SaveResultsEnum);
-	numberofvertices=femmodel->vertices->NumberOfVertices();
 
 	/*Initialize M1QN3 parameters*/
@@ -211,5 +210,5 @@
 
 	/*Recover some parameters*/
-	int num_responses,num_controls,numberofvertices,solution_type;
+	int num_responses,num_controls,solution_type;
 	double* scaling_factors = NULL;
 	int* M = NULL;
@@ -221,5 +220,4 @@
 	femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
-	numberofvertices=femmodel->vertices->NumberOfVertices();
 
 	/*Constrain input vector and update controls*/
