Index: /issm/branches/trunk-jpl-damage/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/EnumDefinitions/EnumDefinitions.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/EnumDefinitions/EnumDefinitions.h	(revision 11984)
@@ -82,4 +82,5 @@
 	InversionStepThresholdEnum,
 	InversionThicknessObsEnum,
+	InversionThreshParametersEnum,
 	InversionVelObsEnum,
 	InversionVxObsEnum,
Index: /issm/branches/trunk-jpl-damage/src/c/modules/EnumToStringx/EnumToStringx.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 11984)
@@ -86,4 +86,5 @@
 		case InversionStepThresholdEnum : return "InversionStepThreshold";
 		case InversionThicknessObsEnum : return "InversionThicknessObs";
+		case InversionThreshParametersEnum : return "InversionThreshParameters";
 		case InversionVelObsEnum : return "InversionVelObs";
 		case InversionVxObsEnum : return "InversionVxObs";
Index: /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 11984)
@@ -40,5 +40,5 @@
 	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum);
 
-	iomodel->FetchData(4,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,InversionThreshParametersEnum);
 	for(i=0;i<num_control_type;i++){
 		switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
@@ -67,4 +67,4 @@
 	
 	/*Free data: */
-	iomodel->DeleteData(1+4+6,MeshElementsEnum,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,MaterialsRheologyZEnum);
+	iomodel->DeleteData(1+5+6,MeshElementsEnum,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,InversionThreshParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,MaterialsRheologyZEnum);
 }
Index: /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 11984)
@@ -49,5 +49,5 @@
 	if(dim==3)iomodel->FetchData(2,MeshUpperelementsEnum,MeshLowerelementsEnum);
 	#endif
-	if(control_analysis)iomodel->FetchData(3,InversionControlParametersEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+	if(control_analysis)iomodel->FetchData(4,InversionControlParametersEnum,InversionMinParametersEnum,InversionMaxParametersEnum,InversionThreshParametersEnum);
 	
 	/*Create elements and materials: */
@@ -67,7 +67,7 @@
 	
 	/*Free data: */
-	iomodel->DeleteData(10,MeshElementsEnum,MeshElementconnectivityEnum,MeshUpperelementsEnum,MeshLowerelementsEnum,
+	iomodel->DeleteData(11,MeshElementsEnum,MeshElementconnectivityEnum,MeshUpperelementsEnum,MeshLowerelementsEnum,
 				MaterialsRheologyBEnum,MaterialsRheologyNEnum,MaterialsRheologyZEnum,InversionControlParametersEnum,InversionMinParametersEnum,
-				InversionMaxParametersEnum);
+				InversionMaxParametersEnum,InversionThreshParametersEnum);
 
 	/*Add new constrant material property tgo materials, at the end: */
Index: /issm/branches/trunk-jpl-damage/src/c/modules/StringToEnumx/StringToEnumx.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 11984)
@@ -87,4 +87,5 @@
 	      else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum;
 	      else if (strcmp(name,"InversionThicknessObs")==0) return InversionThicknessObsEnum;
+	      else if (strcmp(name,"InversionThreshParameters")==0) return InversionThreshParametersEnum;
 	      else if (strcmp(name,"InversionVelObs")==0) return InversionVelObsEnum;
 	      else if (strcmp(name,"InversionVxObs")==0) return InversionVxObsEnum;
@@ -136,9 +137,9 @@
 	      else if (strcmp(name,"MiscellaneousName")==0) return MiscellaneousNameEnum;
 	      else if (strcmp(name,"PrognosticHydrostaticAdjustment")==0) return PrognosticHydrostaticAdjustmentEnum;
-	      else if (strcmp(name,"PrognosticMinThickness")==0) return PrognosticMinThicknessEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"PrognosticPenaltyFactor")==0) return PrognosticPenaltyFactorEnum;
+	      if (strcmp(name,"PrognosticMinThickness")==0) return PrognosticMinThicknessEnum;
+	      else if (strcmp(name,"PrognosticPenaltyFactor")==0) return PrognosticPenaltyFactorEnum;
 	      else if (strcmp(name,"PrognosticSpcthickness")==0) return PrognosticSpcthicknessEnum;
 	      else if (strcmp(name,"PrognosticStabilization")==0) return PrognosticStabilizationEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"Matpar")==0) return MatparEnum;
 	      else if (strcmp(name,"Node")==0) return NodeEnum;
-	      else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"Param")==0) return ParamEnum;
+	      if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
+	      else if (strcmp(name,"Param")==0) return ParamEnum;
 	      else if (strcmp(name,"PattynIceFront")==0) return PattynIceFrontEnum;
 	      else if (strcmp(name,"Pengrid")==0) return PengridEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
 	      else if (strcmp(name,"DoubleElementResult")==0) return DoubleElementResultEnum;
-	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
+	      if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
+	      else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
 	      else if (strcmp(name,"DoubleVecExternalResult")==0) return DoubleVecExternalResultEnum;
 	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Penta.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Penta.cpp	(revision 11984)
@@ -1689,4 +1689,5 @@
 	double  cmmininputs[6];
 	double  cmmaxinputs[6];
+	double  cmthreshinputs[6];
 
 	double  yts;
@@ -1721,5 +1722,6 @@
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<6;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1729,5 +1731,6 @@
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VxEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<6;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(VxEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1737,5 +1740,6 @@
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VyEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<6;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(VyEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1745,5 +1749,6 @@
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];
 						for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<6;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Tria.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Elements/Tria.cpp	(revision 11984)
@@ -1528,4 +1528,5 @@
 	double cmmininputs[3];
 	double cmmaxinputs[3];
+	double cmthreshinputs[3];
 	bool   control_analysis=false;
 	int    num_control_type;
@@ -1554,5 +1555,6 @@
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<3;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1562,5 +1564,6 @@
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VxEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<3;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(VxEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1570,5 +1573,6 @@
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
 						for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VyEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<3;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(VyEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
@@ -1578,5 +1582,6 @@
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
 						for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+						for(j=0;j<3;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 					}
 					break;
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.cpp	(revision 11984)
@@ -218,8 +218,9 @@
 /*}}}*/
 /*FUNCTION BoolInput::Constrain{{{1*/
-void BoolInput::Constrain(double cm_min, double cm_max){
+void BoolInput::Constrain(double cm_min, double cm_max, double cm_thresh){
 
 	if(!isnan(cm_min)) if (this->value<cm_min)this->value=cm_min;
 	if(!isnan(cm_max)) if (this->value>cm_max)this->value=cm_max;
+	if(!isnan(cm_thresh)) if (this->value<cm_thresh)this->value=cm_min;
 
 }
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/BoolInput.h	(revision 11984)
@@ -78,5 +78,5 @@
 		void ArtificialNoise(double min,double max){_error_("not implemented yet");};
 		void AXPY(Input* xinput,double scalar);
-		void Constrain(double cm_min, double cm_max);
+		void Constrain(double cm_min, double cm_max, double cm_thresh);
 		void Extrude(void);
 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.cpp	(revision 11984)
@@ -25,9 +25,10 @@
 	minvalues   = NULL;
 	maxvalues   = NULL;
+	threshvalues   = NULL;
 	gradient    = NULL;
 }
 /*}}}*/
-/*FUNCTION ControlInput::ControlInput(int enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,int id){{{1*/
-ControlInput::ControlInput(int in_enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,int id){
+/*FUNCTION ControlInput::ControlInput(int enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,double* pthresh,int id){{{1*/
+ControlInput::ControlInput(int in_enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,double* pthresh,int id){
 
 	control_id=id;
@@ -40,4 +41,5 @@
 			minvalues  =new TriaP1Input(enum_type,pmin);
 			maxvalues  =new TriaP1Input(enum_type,pmax);
+			threshvalues  =new TriaP1Input(enum_type,pthresh);
 			break;
 		case PentaP1InputEnum:
@@ -46,4 +48,5 @@
 			minvalues  =new PentaP1Input(enum_type,pmin);
 			maxvalues  =new PentaP1Input(enum_type,pmax);
+			threshvalues  =new TriaP1Input(enum_type,pthresh);
 			break;
 		default:
@@ -59,4 +62,5 @@
 	delete minvalues;
 	delete maxvalues;
+	delete threshvalues;
 	delete gradient;
 }
@@ -344,7 +348,7 @@
 	delete values; this->values=newvalues;
 }/*}}}*/
-/*FUNCTION ControlInput::Constrain(double min, double max){{{1*/
-void ControlInput::Constrain(double min, double max){
-	   values->Constrain(min,max);
+/*FUNCTION ControlInput::Constrain(double min, double max, double thresh){{{1*/
+void ControlInput::Constrain(double min, double max, double thresh){
+	   values->Constrain(min,max,thresh);
 }/*}}}*/
 /*FUNCTION ControlInput::Extrude{{{1*/
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/ControlInput.h	(revision 11984)
@@ -23,9 +23,10 @@
 		Input* minvalues;
 		Input* maxvalues;
+		Input* threshvalues;
 		Input* gradient;
 
 		/*ControlInput constructors, destructors: {{{1*/
 		ControlInput();
-		ControlInput(int enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,int id);
+		ControlInput(int enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,double* pthresh,int id);
 		~ControlInput();
 		/*}}}*/
@@ -79,5 +80,5 @@
 		void AXPY(Input* xinput,double scalar){_error_("not implemented yet");};
 		void Constrain(void);
-		void Constrain(double min,double max);
+		void Constrain(double min,double max, double thresh);
 		double InfinityNorm(void){_error_("not implemented yet");};
 		double Max(void){_error_("not implemented yet");};
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DatasetInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DatasetInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DatasetInput.h	(revision 11984)
@@ -49,5 +49,5 @@
 		void Configure(Parameters* parameters);
 		/*}}}*/
-		/*numeriics: {{{1*/
+		/*numerics: {{{1*/
 		void GetInputValue(bool* pvalue){_error_("not implemented yet");};
 		void GetInputValue(int* pvalue){_error_("not implemented yet");};
@@ -74,5 +74,5 @@
 		void AXPY(Input* xinput,double scalar){_error_("not implemented yet");};
 		void Constrain(void){_error_("not implemented yet");};
-		void Constrain(double min,double max){_error_("not implemented yet");};
+		void Constrain(double min,double max, double thresh){_error_("not implemented yet");};
 		double InfinityNorm(void){_error_("not implemented yet");};
 		double Max(void){_error_("not implemented yet");};
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.cpp	(revision 11984)
@@ -282,8 +282,9 @@
 /*}}}*/
 /*FUNCTION DoubleInput::Constrain{{{1*/
-void DoubleInput::Constrain(double cm_min, double cm_max){
+void DoubleInput::Constrain(double cm_min, double cm_max, double cm_thresh){
 
 	if(!isnan(cm_min)) if (this->value<cm_min)this->value=cm_min;
 	if(!isnan(cm_max)) if (this->value>cm_max)this->value=cm_max;
+	if(!isnan(cm_thresh)) if (this->value<cm_thresh)this->value=cm_min;
 
 }
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/DoubleInput.h	(revision 11984)
@@ -72,5 +72,5 @@
 		void ArtificialNoise(double min,double max){_error_("not implemented yet");};
 		void AXPY(Input* xinput,double scalar);
-		void Constrain(double cm_min, double cm_max);
+		void Constrain(double cm_min, double cm_max, double cm_thresh);
 		double InfinityNorm(void){_error_("not implemented yet");};
 		double Max(void);
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/Input.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/Input.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/Input.h	(revision 11984)
@@ -53,5 +53,5 @@
 		virtual void   ArtificialNoise(double min,double max)=0;
 		virtual void   AXPY(Input* xinput,double scalar)=0;
-		virtual void   Constrain(double cm_min, double cm_max)=0;
+		virtual void   Constrain(double cm_min, double cm_max, double cm_thresh)=0;
 		virtual void   VerticallyIntegrate(Input* thickness_input)=0;
 		virtual void   Extrude()=0;
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.cpp	(revision 11984)
@@ -223,8 +223,9 @@
 /*}}}*/
 /*FUNCTION IntInput::Constrain{{{1*/
-void IntInput::Constrain(double cm_min, double cm_max){
+void IntInput::Constrain(double cm_min, double cm_max, double cm_thresh){
 
 	if(!isnan(cm_min)) if (this->value<cm_min)this->value=(int)cm_min;
 	if(!isnan(cm_max)) if (this->value>cm_max)this->value=(int)cm_max;
+	if(!isnan(cm_thresh)) if (this->value<cm_thresh)this->value=(int)cm_min;
 
 }
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/IntInput.h	(revision 11984)
@@ -73,5 +73,5 @@
 		void ArtificialNoise(double min,double max){_error_("not implemented yet");};
 		void AXPY(Input* xinput,double scalar);
-		void Constrain(double cm_min, double cm_max);
+		void Constrain(double cm_min, double cm_max, double cm_thresh);
 		double InfinityNorm(void){_error_("InfinityNorm not implemented for integers");};
 		double Max(void){_error_("Max not implemented for integers");};
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.cpp	(revision 11984)
@@ -517,5 +517,5 @@
 /*}}}*/
 /*FUNCTION PentaP1Input::Constrain{{{1*/
-void PentaP1Input::Constrain(double cm_min, double cm_max){
+void PentaP1Input::Constrain(double cm_min, double cm_max, double cm_thresh){
 
 	int i;
@@ -524,4 +524,5 @@
 	if(!isnan(cm_min)) for(i=0;i<numnodes;i++)if (this->values[i]<cm_min)this->values[i]=cm_min;
 	if(!isnan(cm_max)) for(i=0;i<numnodes;i++)if (this->values[i]>cm_max)this->values[i]=cm_max;
+	if(!isnan(cm_thresh)) for(i=0;i<numnodes;i++)if (this->values[i]<cm_thresh)this->values[i]=cm_min;
 
 }
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/PentaP1Input.h	(revision 11984)
@@ -74,5 +74,5 @@
 		void ArtificialNoise(double min,double max){_error_("not implemented yet");};
 		void AXPY(Input* xinput,double scalar);
-		void Constrain(double cm_min, double cm_max);
+		void Constrain(double cm_min, double cm_max, double cm_thresh);
 		double InfinityNorm(void);
 		double Max(void);
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TransientInput.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TransientInput.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TransientInput.h	(revision 11984)
@@ -76,5 +76,5 @@
 		void ArtificialNoise(double min,double max){_error_("not implemented yet");};
 		void AXPY(Input* xforcing,double scalar){_error_("not implemented yet");};
-		void Constrain(double cm_min, double cm_max){_error_("not implemented yet");};
+		void Constrain(double cm_min, double cm_max, double cm_thresh){_error_("not implemented yet");};
 		double InfinityNorm(void);
 		double Max(void);
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.cpp	(revision 11984)
@@ -380,5 +380,5 @@
 /*}}}*/
 /*FUNCTION TriaP1Input::Constrain{{{1*/
-void TriaP1Input::Constrain(double cm_min, double cm_max){
+void TriaP1Input::Constrain(double cm_min, double cm_max, double cm_thresh){
 
 	int i;
@@ -387,4 +387,5 @@
 	if(!isnan(cm_min)) for(i=0;i<numnodes;i++)if (this->values[i]<cm_min)this->values[i]=cm_min;
 	if(!isnan(cm_max)) for(i=0;i<numnodes;i++)if (this->values[i]>cm_max)this->values[i]=cm_max;
+	if(!isnan(cm_thresh)) for(i=0;i<numnodes;i++)if (this->values[i]<cm_thresh)this->values[i]=cm_min;
 
 }
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.h
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.h	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Inputs/TriaP1Input.h	(revision 11984)
@@ -74,5 +74,5 @@
 		void ArtificialNoise(double min,double max);
 		void AXPY(Input* xinput,double scalar);
-		void Constrain(double cm_min, double cm_max);
+		void Constrain(double cm_min, double cm_max, double cm_thresh);
 		double InfinityNorm(void);
 		double Max(void);
Index: /issm/branches/trunk-jpl-damage/src/c/objects/Materials/Matice.cpp
===================================================================
--- /issm/branches/trunk-jpl-damage/src/c/objects/Materials/Matice.cpp	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/c/objects/Materials/Matice.cpp	(revision 11984)
@@ -828,4 +828,5 @@
 		double    cmmininputs[num_vertices];
 		double    cmmaxinputs[num_vertices];
+		double    cmthreshinputs[num_vertices];
 
 		/*Get B*/
@@ -858,5 +859,6 @@
 							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+							for(j=0;j<num_vertices;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 						}
 						break;
@@ -867,5 +869,6 @@
 							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							this->inputs->AddInput(new ControlInput(MaterialsRheologyZbarEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+							for(j=0;j<num_vertices;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							this->inputs->AddInput(new ControlInput(MaterialsRheologyZbarEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 						}
 						break;
@@ -885,4 +888,5 @@
 		double    cmmininputs[num_vertices];
 		double    cmmaxinputs[num_vertices];
+		double    cmthreshinputs[num_vertices];
 
 		/*Get B*/
@@ -915,5 +919,6 @@
 							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+							for(j=0;j<num_vertices;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 						}
 						break;
@@ -924,5 +929,6 @@
 							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							this->inputs->AddInput(new ControlInput(MaterialsRheologyZEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+							for(j=0;j<num_vertices;j++)cmthreshinputs[j]=iomodel->Data(InversionThreshParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							this->inputs->AddInput(new ControlInput(MaterialsRheologyZEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,cmthreshinputs,i+1));
 						}
 						break;
Index: /issm/branches/trunk-jpl-damage/src/m/classes/inversion.m
===================================================================
--- /issm/branches/trunk-jpl-damage/src/m/classes/inversion.m	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/m/classes/inversion.m	(revision 11984)
@@ -18,4 +18,5 @@
 		min_parameters              = NaN
 		max_parameters              = NaN
+		thresh_parameters           = NaN
 		step_threshold              = NaN
 		gradient_only               = 0
@@ -103,4 +104,5 @@
 			checkfield(md,'inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
 			checkfield(md,'inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+			checkfield(md,'inversion.thresh_parameters','size',[md.mesh.numberofvertices num_controls]);
 
 			if solution==BalancethicknessSolutionEnum
@@ -124,4 +126,5 @@
 			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
 			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+			fielddisplay(obj,'thresh_parameters','threshold value of the inversed parameter above which value jumps to max_parameters');
 			fielddisplay(obj,'gradient_only','stop control method solution at gradient');
 			fielddisplay(obj,'vx_obs','observed velocity x component [m/a]');
@@ -153,4 +156,5 @@
 			WriteData(fid,'object',obj,'fieldname','min_parameters','format','DoubleMat','mattype',3);
 			WriteData(fid,'object',obj,'fieldname','max_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','thresh_parameters','format','DoubleMat','mattype',3);
 			WriteData(fid,'object',obj,'fieldname','step_threshold','format','DoubleMat','mattype',3);
 			WriteData(fid,'object',obj,'fieldname','gradient_only','format','Boolean');
Index: /issm/branches/trunk-jpl-damage/src/m/classes/model/model.m
===================================================================
--- /issm/branches/trunk-jpl-damage/src/m/classes/model/model.m	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/m/classes/model/model.m	(revision 11984)
@@ -222,4 +222,5 @@
 			 if isfield(structmd,'cm_min'), md.inversion.min_parameters=structmd.cm_min; end
 			 if isfield(structmd,'cm_max'), md.inversion.max_parameters=structmd.cm_max; end
+			 if isfield(structmd,'cm_thresh'), md.inversion.thresh_parameters=structmd.cm_thresh; end
 			 if isfield(structmd,'vx_obs'), md.inversion.vx_obs=structmd.vx_obs; end
 			 if isfield(structmd,'vy_obs'), md.inversion.vy_obs=structmd.vy_obs; end
Index: /issm/branches/trunk-jpl-damage/src/m/enum/InversionThreshParametersEnum.m
===================================================================
--- /issm/branches/trunk-jpl-damage/src/m/enum/InversionThreshParametersEnum.m	(revision 11984)
+++ /issm/branches/trunk-jpl-damage/src/m/enum/InversionThreshParametersEnum.m	(revision 11984)
@@ -0,0 +1,11 @@
+function macro=InversionThreshParametersEnum()
+%INVERSIONTHRESHPARAMETERSENUM - Enum of InversionThreshParameters
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=InversionThreshParametersEnum()
+
+macro=StringToEnum('InversionThreshParameters');
Index: /issm/branches/trunk-jpl-damage/src/m/model/parameterization/parametercontrolZ.m
===================================================================
--- /issm/branches/trunk-jpl-damage/src/m/model/parameterization/parametercontrolZ.m	(revision 11983)
+++ /issm/branches/trunk-jpl-damage/src/m/model/parameterization/parametercontrolZ.m	(revision 11984)
@@ -57,4 +57,14 @@
 else
 	md.inversion.max_parameters=cm_max;
+end
+
+%cm_thresh
+cm_thresh=getfieldvalue(options,'cm_thresh',ones(md.mesh.numberofvertices,1));
+if (length(cm_thresh)==1)
+	md.inversion.thresh_parameters=cm_thresh*ones(md.mesh.numberofvertices,1);
+elseif (length(cm_thresh)==md.mesh.numberofvertices)
+	md.inversion.thresh_parameters=cm_thresh;
+else
+	md.inversion.thresh_parameters=cm_thresh;
 end
 
