Index: /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.cpp
===================================================================
--- /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.cpp	(revision 2353)
+++ /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.cpp	(revision 2354)
@@ -13,9 +13,9 @@
 #include "../EnumDefinitions/EnumDefinitions.h"
 
-void ControlConstrainx( double* p_g, int numdofnodes, double mincontrolconstraint, double maxcontrolconstraint,char* control_type){
+void ControlConstrainx( double* p_g, int numdofnodes, double cm_min, double cm_max,char* control_type){
 
 	int i;
 	
-	if(isnan(mincontrolconstraint) & isnan(maxcontrolconstraint)){
+	if(isnan(cm_min) & isnan(cm_max)){
 		/*do nothing*/
 	}
@@ -23,10 +23,10 @@
 		for(i=0;i<numdofnodes;i++){
 
-			if(!isnan(mincontrolconstraint)){
-				if (p_g[i]<mincontrolconstraint)p_g[i]=mincontrolconstraint;
+			if(!isnan(cm_min)){
+				if (p_g[i]<cm_min)p_g[i]=cm_min;
 			}
 
-			if(!isnan(maxcontrolconstraint)){
-				if (p_g[i]>maxcontrolconstraint)p_g[i]=maxcontrolconstraint;
+			if(!isnan(cm_max)){
+				if (p_g[i]>cm_max)p_g[i]=cm_max;
 			}
 		}
Index: /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.h
===================================================================
--- /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.h	(revision 2353)
+++ /issm/trunk/src/c/ControlConstrainx/ControlConstrainx.h	(revision 2354)
@@ -9,5 +9,5 @@
 
 /* local prototypes: */
-void ControlConstrainx( double* p_g, int numberofnodes, double mincontrolconstraint, double maxcontrolconstraint,char* control_type);
+void ControlConstrainx( double* p_g, int numberofnodes, double cm_min, double cm_max,char* control_type);
 
 #endif  /* _CONTROLCONSTRAINX_H */
Index: /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 2353)
+++ /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 2354)
@@ -87,19 +87,58 @@
 		parameters->AddObject(param);
 
+		/*epsvel: */
+		count++;
+		param= new Param(count,"epsvel",DOUBLE);
+		param->SetDouble(iomodel->epsvel);
+		parameters->AddObject(param);
+
+		/*meanvel: */
+		count++;
+		param= new Param(count,"meanvel",DOUBLE);
+		param->SetDouble(iomodel->meanvel);
+		parameters->AddObject(param);
+
+		/*cm_noisedmp: */
+		count++;
+		param= new Param(count,"cm_noisedmp",DOUBLE);
+		param->SetDouble(iomodel->cm_noisedmp);
+		parameters->AddObject(param);
+
+		/*cm_mindmp_value: */
+		count++;
+		param= new Param(count,"cm_mindmp_value",DOUBLE);
+		param->SetDouble(iomodel->cm_mindmp_value);
+		parameters->AddObject(param);
+
+		/*cm_mindmp_slope: */
+		count++;
+		param= new Param(count,"cm_mindmp_slope",DOUBLE);
+		param->SetDouble(iomodel->cm_mindmp_slope);
+		parameters->AddObject(param);
+
+		/*cm_maxdmp_value: */
+		count++;
+		param= new Param(count,"cm_maxdmp_value",DOUBLE);
+		param->SetDouble(iomodel->cm_maxdmp_value);
+		parameters->AddObject(param);
+
+		/*cm_maxdmp_slope: */
+		count++;
+		param= new Param(count,"cm_maxdmp_slope",DOUBLE);
+		param->SetDouble(iomodel->cm_maxdmp_slope);
+		parameters->AddObject(param);
 		
-		/*mincontrolconstraint: */
-		count++;
-		param= new Param(count,"mincontrolconstraint",DOUBLE);
-		param->SetDouble(iomodel->mincontrolconstraint);
-		parameters->AddObject(param);
-
-		/*maxcontrolconstraint: */
-		count++;
-		param= new Param(count,"maxcontrolconstraint",DOUBLE);
-		param->SetDouble(iomodel->maxcontrolconstraint);
-		parameters->AddObject(param);
-		
-				
-		
+		/*cm_min: */
+		count++;
+		param= new Param(count,"cm_min",DOUBLE);
+		param->SetDouble(iomodel->cm_min);
+		parameters->AddObject(param);
+
+		/*cm_max: */
+		count++;
+		param= new Param(count,"cm_max",DOUBLE);
+		param->SetDouble(iomodel->cm_max);
+		parameters->AddObject(param);
+
 		/*Now, recover fit, optscal and maxiter as vectors: */
 		IoModelFetchData(&iomodel->fit,NULL,NULL,iomodel_handle,"fit");
Index: /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp	(revision 2353)
+++ /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp	(revision 2354)
@@ -205,22 +205,4 @@
 	parameters->AddObject(param);
 
-	/*meanvel: */
-	count++;
-	param= new Param(count,"meanvel",DOUBLE);
-	param->SetDouble(iomodel->meanvel);
-	parameters->AddObject(param);
-
-	/*cm_noisedampening: */
-	count++;
-	param= new Param(count,"cm_noisedampening",DOUBLE);
-	param->SetDouble(iomodel->cm_noisedampening);
-	parameters->AddObject(param);
-
-	/*epsvel: */
-	count++;
-	param= new Param(count,"epsvel",DOUBLE);
-	param->SetDouble(iomodel->epsvel);
-	parameters->AddObject(param);
-
 	/*waitonlock: */
 	count++;
@@ -262,5 +244,4 @@
 	parameters->AddObject(param);
 	xfree((void**)&iomodel->riftinfo); 
-	
 	
 	/*parameteroutput: */
Index: /issm/trunk/src/c/ModelProcessorx/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/IoModel.cpp	(revision 2353)
+++ /issm/trunk/src/c/ModelProcessorx/IoModel.cpp	(revision 2354)
@@ -116,7 +116,11 @@
 	iomodel->tolx=0;
 	iomodel->maxiter=NULL;
-	iomodel->cm_noisedampening=0;
-	iomodel->mincontrolconstraint=0;
-	iomodel->maxcontrolconstraint=0;
+	iomodel->cm_noisedmp=0;
+	iomodel->cm_mindmp_value=0;
+	iomodel->cm_mindmp_slope=0;
+	iomodel->cm_maxdmp_value=0;
+	iomodel->cm_maxdmp_slope=0;
+	iomodel->cm_min=0;
+	iomodel->cm_max=0;
 	iomodel->verbose=0;
 	iomodel->plot=0;
@@ -336,7 +340,11 @@
 	IoModelFetchData(&iomodel->eps_cm,iomodel_handle,"eps_cm");
 	IoModelFetchData(&iomodel->tolx,iomodel_handle,"tolx");
-	IoModelFetchData(&iomodel->cm_noisedampening,iomodel_handle,"cm_noisedampening");
-	IoModelFetchData(&iomodel->mincontrolconstraint,iomodel_handle,"mincontrolconstraint");
-	IoModelFetchData(&iomodel->maxcontrolconstraint,iomodel_handle,"maxcontrolconstraint");
+	IoModelFetchData(&iomodel->cm_noisedmp,iomodel_handle,"cm_noisedmp");
+	IoModelFetchData(&iomodel->cm_mindmp_value,iomodel_handle,"cm_mindmp_value");
+	IoModelFetchData(&iomodel->cm_mindmp_slope,iomodel_handle,"cm_mindmp_slope");
+	IoModelFetchData(&iomodel->cm_maxdmp_value,iomodel_handle,"cm_maxdmp_value");
+	IoModelFetchData(&iomodel->cm_maxdmp_slope,iomodel_handle,"cm_maxdmp_slope");
+	IoModelFetchData(&iomodel->cm_min,iomodel_handle,"cm_min");
+	IoModelFetchData(&iomodel->cm_max,iomodel_handle,"cm_max");
 	IoModelFetchData(&iomodel->eps_res,iomodel_handle,"eps_res");
 	IoModelFetchData(&iomodel->eps_rel,iomodel_handle,"eps_rel");
Index: /issm/trunk/src/c/ModelProcessorx/IoModel.h
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 2353)
+++ /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 2354)
@@ -104,8 +104,16 @@
 	/*numerical parameters: */
 	double  meanvel;
-	double 	epsvel;
+	double  epsvel;
 	int     artdiff;
 	double  viscosity_overshoot;
 	double  stokesreconditioning;
+	double  cm_noisedmp;
+	double  cm_mindmp_value;
+	double  cm_mindmp_slope;
+	double  cm_maxdmp_value;
+	double  cm_maxdmp_slope;
+	double  cm_min;
+	double  cm_max;
+
 	double  cm_noisedampening;
 
@@ -121,6 +129,4 @@
 	double  tolx;
 	double* maxiter;
-	double  mincontrolconstraint;
-	double  maxcontrolconstraint;
 	int     verbose;
 	int     plot;
Index: /issm/trunk/src/c/objects/Numpar.cpp
===================================================================
--- /issm/trunk/src/c/objects/Numpar.cpp	(revision 2353)
+++ /issm/trunk/src/c/objects/Numpar.cpp	(revision 2354)
@@ -32,5 +32,9 @@
 	stokesreconditioning=UNDEF;
 	control_type=NULL;
-	cm_noisedampening=UNDEF;
+	cm_noisedmp=UNDEF;
+	cm_mindmp_value=UNDEF;
+	cm_mindmp_slope=UNDEF;
+	cm_maxdmp_value=UNDEF;
+	cm_maxdmp_slope=UNDEF;
 
 	return;
@@ -53,5 +57,9 @@
 	printf("   stokesreconditioning: %g\n",stokesreconditioning);
 	printf("   control_type: %s\n",control_type);
-	printf("   cm_noisedampening: %g\n",cm_noisedampening);
+	printf("   cm_noisedmp: %g\n",cm_noisedmp);
+	printf("   cm_mindmp_value: %g\n",cm_mindmp_value);
+	printf("   cm_mindmp_slope: %g\n",cm_mindmp_slope);
+	printf("   cm_maxdmp_value: %g\n",cm_maxdmp_value);
+	printf("   cm_maxdmp_slope: %g\n",cm_maxdmp_slope);
 }
 
@@ -68,5 +76,9 @@
 	printf("   stokesreconditioning: %g\n",stokesreconditioning);
 	printf("   control_type: %s\n",control_type);
-	printf("   cm_noisedampening: %g\n",cm_noisedampening);
+	printf("   cm_noisedmp: %g\n",cm_noisedmp);
+	printf("   cm_mindmp_value: %g\n",cm_mindmp_value);
+	printf("   cm_mindmp_slope: %g\n",cm_mindmp_slope);
+	printf("   cm_maxdmp_value: %g\n",cm_maxdmp_value);
+	printf("   cm_maxdmp_slope: %g\n",cm_maxdmp_slope);
 }
 
@@ -94,5 +106,9 @@
 	memcpy(marshalled_dataset,&stokesreconditioning,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
 	memcpy(marshalled_dataset,&control_type,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
-	memcpy(marshalled_dataset,&cm_noisedampening,sizeof(cm_noisedampening));marshalled_dataset+=sizeof(cm_noisedampening);
+	memcpy(marshalled_dataset,&cm_noisedmp,sizeof(cm_noisedmp));marshalled_dataset+=sizeof(cm_noisedmp);
+	memcpy(marshalled_dataset,&cm_mindmp_value,sizeof(cm_mindmp_value));marshalled_dataset+=sizeof(cm_mindmp_value);
+	memcpy(marshalled_dataset,&cm_mindmp_slope,sizeof(cm_mindmp_slope));marshalled_dataset+=sizeof(cm_mindmp_slope);
+	memcpy(marshalled_dataset,&cm_maxdmp_value,sizeof(cm_maxdmp_value));marshalled_dataset+=sizeof(cm_maxdmp_value);
+	memcpy(marshalled_dataset,&cm_maxdmp_slope,sizeof(cm_maxdmp_slope));marshalled_dataset+=sizeof(cm_maxdmp_slope);
 	
 	*pmarshalled_dataset=marshalled_dataset;
@@ -108,5 +124,9 @@
 		+sizeof(stokesreconditioning)
 		+sizeof(control_type)
-		+sizeof(cm_noisedampening)
+		+sizeof(cm_noisedmp)
+		+sizeof(cm_mindmp_value)
+		+sizeof(cm_mindmp_slope)
+		+sizeof(cm_maxdmp_value)
+		+sizeof(cm_maxdmp_slope)
 		+sizeof(int); //sizeof(int) for enum type
 }
@@ -134,5 +154,9 @@
 	memcpy(&stokesreconditioning,marshalled_dataset,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
 	memcpy(&control_type,marshalled_dataset,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
-	memcpy(&cm_noisedampening,marshalled_dataset,sizeof(cm_noisedampening));marshalled_dataset+=sizeof(cm_noisedampening);
+	memcpy(&cm_noisedmp,marshalled_dataset,sizeof(cm_noisedmp));marshalled_dataset+=sizeof(cm_noisedmp);
+	memcpy(&cm_mindmp_value,marshalled_dataset,sizeof(cm_mindmp_value));marshalled_dataset+=sizeof(cm_mindmp_value);
+	memcpy(&cm_mindmp_slope,marshalled_dataset,sizeof(cm_mindmp_slope));marshalled_dataset+=sizeof(cm_mindmp_slope);
+	memcpy(&cm_maxdmp_value,marshalled_dataset,sizeof(cm_maxdmp_value));marshalled_dataset+=sizeof(cm_maxdmp_value);
+	memcpy(&cm_maxdmp_slope,marshalled_dataset,sizeof(cm_maxdmp_slope));marshalled_dataset+=sizeof(cm_maxdmp_slope);
 
 	/*return: */
@@ -164,11 +188,15 @@
 	/*Go through parameters dataset, and find the Param object corresponding to our fields, 
 	 * and update the fields: */
-	if(!parameters->FindParam(&meanvel,"meanvel"))throw ErrorException(__FUNCT__," error message: could not update meanvel field");
-	if(!parameters->FindParam(&epsvel,"epsvel"))throw ErrorException(__FUNCT__," error message: could not update epsvel field");
+	parameters->FindParam(&meanvel,"meanvel");
+	parameters->FindParam(&epsvel,"epsvel");
 	if(!parameters->FindParam(&artdiff,"artdiff"))throw ErrorException(__FUNCT__," error message: could not update artdiff field");
 	if(!parameters->FindParam(&viscosity_overshoot,"viscosity_overshoot"))throw ErrorException(__FUNCT__," error message: could not update viscosity_overshoot field");
 	if(!parameters->FindParam(&stokesreconditioning,"stokesreconditioning"))throw ErrorException(__FUNCT__," error message: could not update stokesreconditioning field");
 	parameters->FindParam(&control_type,"control_type");
-	if(!parameters->FindParam(&cm_noisedampening,"cm_noisedampening"))throw ErrorException(__FUNCT__," error message: could not update cm_noisedampening field");
+	parameters->FindParam(&cm_noisedmp,"cm_noisedmp");
+	parameters->FindParam(&cm_mindmp_value,"cm_mindmp_value");
+	parameters->FindParam(&cm_mindmp_slope,"cm_mindmp_slope");
+	parameters->FindParam(&cm_maxdmp_value,"cm_maxdmp_value");
+	parameters->FindParam(&cm_maxdmp_slope,"cm_maxdmp_slope");
 
 	return;
@@ -192,5 +220,9 @@
 	inputs->Recover("stokesreconditioning",&stokesreconditioning);
 	inputs->Recover("control_type",&control_type);
-	inputs->Recover("cm_noisedampening",&cm_noisedampening);
+	inputs->Recover("cm_noisedmp",&cm_noisedmp);
+	inputs->Recover("cm_mindmp_value",&cm_mindmp_value);
+	inputs->Recover("cm_mindmp_slope",&cm_mindmp_slope);
+	inputs->Recover("cm_maxdmp_value",&cm_maxdmp_value);
+	inputs->Recover("cm_maxdmp_slope",&cm_maxdmp_slope);
 
 }
Index: /issm/trunk/src/c/objects/Numpar.h
===================================================================
--- /issm/trunk/src/c/objects/Numpar.h	(revision 2353)
+++ /issm/trunk/src/c/objects/Numpar.h	(revision 2354)
@@ -22,5 +22,9 @@
 		double stokesreconditioning;
 		char*  control_type;
-		double cm_noisedampening;
+		double cm_noisedmp;
+		double cm_mindmp_value;
+		double cm_mindmp_slope;
+		double cm_maxdmp_value;
+		double cm_maxdmp_slope;
 
 		Numpar();
Index: /issm/trunk/src/c/objects/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Tria.cpp	(revision 2353)
+++ /issm/trunk/src/c/objects/Tria.cpp	(revision 2354)
@@ -2396,5 +2396,5 @@
 			grade_g_gaussian[i]=
 			  -2*drag*alpha_complement*((lambda*vx+mu*vy))*Jdet*gauss_weight*l1l2l3[i]                         //standard term dJ/dki
-			  -numpar->cm_noisedampening*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);  // regularization term d/dki(1/2*(dk/dx)^2)
+			  -numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);  // regularization term d/dki(1/2*(dk/dx)^2)
 		}
 		
@@ -2619,5 +2619,5 @@
 
 			//Add regularization term
-			grade_g_gaussian[i]-=numpar->cm_noisedampening*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
+			grade_g_gaussian[i]-=numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
 		}
 
@@ -2809,5 +2809,5 @@
 
 			//Add regularization term
-			grade_g_gaussian[i]-=numpar->cm_noisedampening*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
+			grade_g_gaussian[i]-=numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
 		}
 
@@ -2967,5 +2967,5 @@
 			if (!shelf){
 				GetParameterDerivativeValue(&dk[0], &k[0],&xyz_list[0][0], gauss_l1l2l3);
-				Jelem+=numpar->cm_noisedampening*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss_weight;
+				Jelem+=numpar->cm_noisedmp*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss_weight;
 			}
 		}
@@ -2975,5 +2975,5 @@
 			}
 			GetParameterDerivativeValue(&dB[0], &B[0],&xyz_list[0][0], gauss_l1l2l3);
-			Jelem+=numpar->cm_noisedampening*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
+			Jelem+=numpar->cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
 		}
 		else{
Index: /issm/trunk/src/c/parallel/control_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control_core.cpp	(revision 2353)
+++ /issm/trunk/src/c/parallel/control_core.cpp	(revision 2354)
@@ -40,6 +40,6 @@
 	Vec     grad_g_old=NULL;
 	double* grad_g_double=NULL;
-	double  mincontrolconstraint;
-	double  maxcontrolconstraint;
+	double  cm_min;
+	double  cm_max;
 	int     nsteps,n,i;
 	double* J=NULL;
@@ -69,6 +69,6 @@
 	model->FindParam(&eps_cm,"eps_cm");
 	model->FindParam(&tolx,"tolx");
-	model->FindParam(&mincontrolconstraint,"mincontrolconstraint");
-	model->FindParam(&maxcontrolconstraint,"maxcontrolconstraint");
+	model->FindParam(&cm_min,"cm_min");
+	model->FindParam(&cm_max,"cm_max");
 	model->FindParam(&param_g,NULL,NULL,"param_g");
 	model->FindParam(&analysis_type,"analysis_type");
@@ -134,5 +134,5 @@
 
 		_printf_("%s\n","      constraining the new distribution...");    
-		ControlConstrainx(param_g,numberofnodes,mincontrolconstraint,maxcontrolconstraint,control_type);
+		ControlConstrainx(param_g,numberofnodes,cm_min,cm_max,control_type);
 		_printf_("%s\n","      done.");
 		
Index: /issm/trunk/src/c/parallel/diagnostic.cpp
===================================================================
--- /issm/trunk/src/c/parallel/diagnostic.cpp	(revision 2353)
+++ /issm/trunk/src/c/parallel/diagnostic.cpp	(revision 2354)
@@ -44,5 +44,4 @@
 	int      count;
 	DataSet* parameters=NULL;
-	double cm_noisedampening;
 
 	MODULEBOOT();
@@ -100,6 +99,4 @@
 	inputs->Add("velocity",u_g_initial,3,numberofnodes);
 	if(control_analysis){
-		model->FindParam(&cm_noisedampening,"cm_noisedampening");
-		inputs->Add("cm_noisedampening",cm_noisedampening);
 		model->FindParam(&u_g_obs,NULL,NULL,"u_g_obs",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
 		inputs->Add("velocity_obs",u_g_obs,2,numberofnodes);
Index: /issm/trunk/src/c/parallel/objectivefunctionC.cpp
===================================================================
--- /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 2353)
+++ /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 2354)
@@ -35,6 +35,6 @@
 	double* optscal=NULL;
 	double* fit=NULL;
-	double  mincontrolconstraint;
-	double  maxcontrolconstraint;
+	double  cm_min;
+	double  cm_max;
 	char*   control_type=NULL;
 	double* param_g_copy=NULL;
@@ -67,6 +67,6 @@
 	femmodel->parameters->FindParam(&optscal,NULL,NULL,"optscal");
 	femmodel->parameters->FindParam(&fit,NULL,NULL,"fit");
-	femmodel->parameters->FindParam(&mincontrolconstraint,"mincontrolconstraint");
-	femmodel->parameters->FindParam(&maxcontrolconstraint,"maxcontrolconstraint");
+	femmodel->parameters->FindParam(&cm_min,"cm_min");
+	femmodel->parameters->FindParam(&cm_max,"cm_max");
 	femmodel->parameters->FindParam(&control_type,"control_type");
 	femmodel->parameters->FindParam(&analysis_type,"analysis_type");
@@ -85,5 +85,5 @@
 
 	/*Constrain:*/
-	ControlConstrainx(param_g_copy,numberofnodes,mincontrolconstraint,maxcontrolconstraint,control_type);
+	ControlConstrainx(param_g_copy,numberofnodes,cm_min,cm_max,control_type);
 
 	/*Add new parameter to inputs: */
Index: /issm/trunk/src/c/parallel/steadystate.cpp
===================================================================
--- /issm/trunk/src/c/parallel/steadystate.cpp	(revision 2353)
+++ /issm/trunk/src/c/parallel/steadystate.cpp	(revision 2354)
@@ -45,5 +45,4 @@
 	double* u_g_obs=NULL;
 	double  dt;
-	double  cm_noisedampening;
 	Param*  param=NULL;
 
@@ -110,6 +109,4 @@
 
 	if(control_analysis){
-		model->FindParam(&cm_noisedampening,"cm_noisedampening");
-		inputs->Add("cm_noisedampening",cm_noisedampening);
 		model->FindParam(&u_g_obs,NULL,NULL,"u_g_obs",DiagnosticAnalysisEnum(),HorizAnalysisEnum());
 		inputs->Add("velocity_obs",u_g_obs,2,numberofnodes);
Index: /issm/trunk/src/m/classes/@model/model.m
===================================================================
--- /issm/trunk/src/m/classes/@model/model.m	(revision 2353)
+++ /issm/trunk/src/m/classes/@model/model.m	(revision 2354)
@@ -189,9 +189,11 @@
 	md.tolx=0;
 	md.optscal=[];
-	md.cm_noisedampening=0;
-	md.cm_mindampening=[];
-	md.cm_maxdampening=[];
-	md.mincontrolconstraint=0;
-	md.maxcontrolconstraint=0;
+	md.cm_noisedmp=0;
+	md.cm_mindmp_value=0;
+	md.cm_mindmp_slope=0;
+	md.cm_maxdmp_value=0;
+	md.cm_maxdmp_slope=0;
+	md.cm_min=0;
+	md.cm_max=0;
 	md.fit=[];
 	md.cm_jump=[];
Index: /issm/trunk/src/m/classes/@model/setdefaultparameters.m
===================================================================
--- /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 2353)
+++ /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 2354)
@@ -188,17 +188,19 @@
 %cm_mindampening stabilize the inversed parameter above
 %a given scalar with a given penalty. Not applied by default
-md.cm_mindampening=0;
+md.cm_mindmp_value=0;
+md.cm_mindmp_slope=0;
 
 %cm_maxdampening stabilize the inversed parameter below
 %a given scalar with a given penalty. Not applied by default
-md.cm_maxdampening=0;
-
-%mincontrolconstraint is the minimum acceptable value of the
+md.cm_maxdmp_value=150;
+md.cm_maxdmp_value=0;
+
+%cm_min is the minimum acceptable value of the
 %inversed parameter (B>0 for example)
-md.mincontrolconstraint=0;
-
-%maxcontrolconstraint is the maximum acceptable value of the
+md.cm_min=0;
+
+%cm_max is the maximum acceptable value of the
 %inversed parameter (drag<200 for example)
-md.maxcontrolconstraint=200;
+md.cm_max=200;
 
 %eps_cm is a criteria to stop the control methods.
Index: /issm/trunk/src/m/classes/public/display/displaycontrol.m
===================================================================
--- /issm/trunk/src/m/classes/public/display/displaycontrol.m	(revision 2353)
+++ /issm/trunk/src/m/classes/public/display/displaycontrol.m	(revision 2354)
@@ -15,13 +15,13 @@
 	fielddisplay(md,'eps_cm','misfit convergence criterion. Default is 1%, NaN if not applied');
 	fielddisplay(md,'optscal','scaling factor on gradient direction during optimization, for each optimization step');
-	fielddisplay(md,'fit','''absolute: 0'', ''relative: 1'', or ''logarithmic: 2''. default is ''absolute: 0'', for each optimization steps');
+	fielddisplay(md,'fit','''absolute: 0'', ''relative: 1'', or ''logarithmic: 2''. for each optimization steps');
 	fielddisplay(md,'cm_jump','decrease threshold for misfit, default is 30%');
 	fielddisplay(md,'maxiter','maximum iterations during each optimization step');
 	fielddisplay(md,'tolx','minimum tolerance which will stop one optimization search');
-	fielddisplay(md,'cm_mindampening','minimum acceptable value (first argument) of the inversed parameter before being penalized (second argument)');
-	fielddisplay(md,'cm_maxdampening','maximum acceptable value (first argument) of the inversed parameter before being penalized (second argument)');
-	fielddisplay(md,'cm_noisedampening','noise dampening coefficient');
-	fielddisplay(md,'mincontrolconstraint','minimum contraint for the controlled parameters');
-	fielddisplay(md,'maxcontrolconstraint','maximum contraint for the controlled parameters');
+	fielddisplay(md,'cm_noisedmp','noise dampening coefficient, 0 if not applied');
+	fielddisplay(md,'cm_mindmp_value','minimum acceptable value of the inversed parameter before being dampened');
+	fielddisplay(md,'cm_mindmp_slope','dampening coefficient applied to parameter below minimum, 0 if not applied');
+	fielddisplay(md,'cm_maxdmp_value','maximum acceptable value of the inversed parameter before being dampened');
+	fielddisplay(md,'cm_maxdmp_slope','dampening coefficient applied to parameter above maximum, 0 if not applied');
 	fielddisplay(md,'meanvel','velocity scaling factor when evaluating relative or logarithmic misfit');
 	fielddisplay(md,'epsvel','for relative fit, avoids misfit becoming infinity, for logarithmic fit, threshold for velocity');
Index: /issm/trunk/src/m/classes/public/isresultconsistent.m
===================================================================
--- /issm/trunk/src/m/classes/public/isresultconsistent.m	(revision 2353)
+++ /issm/trunk/src/m/classes/public/isresultconsistent.m	(revision 2354)
@@ -85,13 +85,13 @@
 
 	%check inversed parameter
-	if ~isnan(md.maxcontrolconstraint),
-		if any(md.results.diagnostic.parameter>md.maxcontrolconstraint)
-			disp(['''control'' result not consistent: inverse parameter is greater than ' num2str(md.maxcontrolconstraint)]);
+	if ~isnan(md.cm_max),
+		if any(md.results.diagnostic.parameter>md.cm_max)
+			disp(['''control'' result not consistent: inverse parameter is greater than ' num2str(md.cm_max)]);
 			bool=0; return; 
 		end
 	end
-	if ~isnan(md.mincontrolconstraint),
-		if any(md.results.diagnostic.parameter<md.mincontrolconstraint)
-			disp(['''control'' result not consistent: inverse parameter is smaller than ' num2str(md.mincontrolconstraint)]);
+	if ~isnan(md.cm_min),
+		if any(md.results.diagnostic.parameter<md.cm_min)
+			disp(['''control'' result not consistent: inverse parameter is smaller than ' num2str(md.cm_min)]);
 			bool=0; return; 
 		end
Index: /issm/trunk/src/m/classes/public/marshall.m
===================================================================
--- /issm/trunk/src/m/classes/public/marshall.m	(revision 2353)
+++ /issm/trunk/src/m/classes/public/marshall.m	(revision 2354)
@@ -112,7 +112,11 @@
 WriteData(fid,md.tolx,'Scalar','tolx');
 WriteData(fid,md.maxiter,'Mat','maxiter');
-WriteData(fid,md.cm_noisedampening,'Scalar','cm_noisedampening');
-WriteData(fid,md.mincontrolconstraint,'Scalar','mincontrolconstraint');
-WriteData(fid,md.maxcontrolconstraint,'Scalar','maxcontrolconstraint');
+WriteData(fid,md.cm_noisedmp,'Scalar','cm_noisedmp');
+WriteData(fid,md.cm_mindmp_value,'Scalar','cm_mindmp_value');
+WriteData(fid,md.cm_mindmp_slope,'Scalar','cm_mindmp_slope');
+WriteData(fid,md.cm_maxdmp_value,'Scalar','cm_maxdmp_value');
+WriteData(fid,md.cm_maxdmp_slope,'Scalar','cm_maxdmp_slope');
+WriteData(fid,md.cm_min,'Scalar','cm_min');
+WriteData(fid,md.cm_max,'Scalar','cm_max');
 WriteData(fid,md.eps_res,'Scalar','eps_res');
 WriteData(fid,md.eps_rel,'Scalar','eps_rel');
Index: /issm/trunk/src/m/solutions/cielo/control_core.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/control_core.m	(revision 2353)
+++ /issm/trunk/src/m/solutions/cielo/control_core.m	(revision 2354)
@@ -79,6 +79,4 @@
 
 	displaystring(verbose,'\n%s',['      constraining the new distribution...']);
-	param_g=ControlConstrain(param_g,model.parameters);
-
 	
 	disp(['      value of misfit J after optimization #' num2str(n) ':' num2str(c(n).J)]);
Index: /issm/trunk/src/m/solutions/cielo/diagnostic.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/diagnostic.m	(revision 2353)
+++ /issm/trunk/src/m/solutions/cielo/diagnostic.m	(revision 2354)
@@ -33,5 +33,4 @@
 	inputs=add(inputs,'velocity',models.dh.parameters.u_g,'doublevec',3,models.dh.parameters.numberofnodes);
 	if md.control_analysis,
-		inputs=add(inputs,'cm_noisedampening',models.dh.parameters.cm_noisedampening,'double');
 		inputs=add(inputs,'velocity_obs',models.dh.parameters.u_g_obs,'doublevec',2,models.dh.parameters.numberofnodes);
 	end
Index: /issm/trunk/src/m/solutions/cielo/steadystate.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/steadystate.m	(revision 2353)
+++ /issm/trunk/src/m/solutions/cielo/steadystate.m	(revision 2354)
@@ -44,5 +44,4 @@
 	inputs=add(inputs,'dt',models.t.parameters.dt*models.t.parameters.yts,'double');
 	if md.control_analysis,
-		inputs=add(inputs,'cm_noisedampening',models.dh.parameters.cm_noisedampening,'double');
 		inputs=add(inputs,'velocity_obs',models.dh.parameters.u_g_obs,'doublevec',2,models.dh.parameters.numberofnodes);
 	end
Index: /issm/trunk/src/mex/ControlConstrain/ControlConstrain.cpp
===================================================================
--- /issm/trunk/src/mex/ControlConstrain/ControlConstrain.cpp	(revision 2353)
+++ /issm/trunk/src/mex/ControlConstrain/ControlConstrain.cpp	(revision 2354)
@@ -12,6 +12,6 @@
 	/*input datasets: */
 	double*  p_g=NULL;
-	double   mincontrolconstraint;
-	double   maxcontrolconstraint;
+	double   cm_min;
+	double   cm_max;
 	char*    control_type=NULL;
 	int      gsize;
@@ -28,10 +28,10 @@
 	FetchParams(&parameters,PARAMETERS);
 
-	parameters->FindParam(&mincontrolconstraint,"mincontrolconstraint");
-	parameters->FindParam(&maxcontrolconstraint,"maxcontrolconstraint");
+	parameters->FindParam(&cm_min,"cm_min");
+	parameters->FindParam(&cm_max,"cm_max");
 	parameters->FindParam(&control_type,"control_type");
 
 	/*!Call core code: */
-	ControlConstrainx(p_g,gsize,mincontrolconstraint,maxcontrolconstraint,control_type);
+	ControlConstrainx(p_g,gsize,cm_min,cm_max,control_type);
 
 	/*write output : */
