Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 20722)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 20723)
@@ -113,6 +113,6 @@
 	if(save_results){
 		if(VerboseSolution()) _printf0_("   saving results\n");
-		int outputs[2] = {MaskIceLevelsetEnum, CalvingCalvingrateEnum};
-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2);
+		int outputs[1] = {MaskIceLevelsetEnum};
+		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
 	}
 }/*}}}*/
@@ -198,5 +198,4 @@
 		case DefaultCalvingEnum:
 		case CalvingDevEnum:
-		case CalvingMinthicknessEnum:
 			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
 			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
@@ -221,4 +220,9 @@
 			meltingrate_input = basalelement->GetInput(CalvinglevermannMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
+		case CalvingMinthicknessEnum:
+			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			break;
 		default:
 			_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
@@ -253,5 +257,4 @@
 			case DefaultCalvingEnum:
 			case CalvingDevEnum:
-			case CalvingMinthicknessEnum:
 				lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
 				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
@@ -281,4 +284,25 @@
 				norm_calving=sqrt(norm_calving)+1.e-14;
 				for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
+				break;
+
+			case CalvingMinthicknessEnum:
+				lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+				meltingrate_input->GetInputValue(&meltingrate,gauss);
+
+				norm_dlsf=0.;
+				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
+				norm_dlsf=sqrt(norm_dlsf);
+
+				if(norm_dlsf>1.e-10)
+				 for(i=0;i<dim;i++){ 
+					 c[i]=0.;
+					 m[i]=meltingrate*dlsf[i]/norm_dlsf;
+				 }
+				else
+				 for(i=0;i<dim;i++){
+					 c[i]=0.;
+					 m[i]=0.;
+				 }
 				break;
 
@@ -621,4 +645,39 @@
 }/*}}}*/
 void           LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+
+	/*Intermediaries*/
+	int         calvinglaw;
+	IssmDouble  min_thickness,thickness; 
+	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
+
+	if(calvinglaw==CalvingMinthicknessEnum){
+
+		/*Get minimum thickness threshold*/
+		femmodel->parameters->FindParam(&min_thickness,CalvingMinthicknessEnum);
+
+		/*Loop over all elements of this partition*/
+		for(int i=0;i<femmodel->elements->Size();i++){
+			Element* element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+			int      numnodes = element->GetNumberOfNodes();	
+			Gauss*   gauss    = element->NewGauss();
+			Input*   H_input  = element->GetInput(ThicknessEnum); _assert_(H_input);
+
+			/*Potentially constrain nodes of this element*/
+			for(int in=0;in<numnodes;in++){
+				gauss->GaussNode(element->GetElementType(),in);
+				Node* node=element->GetNode(in);
+				H_input->GetInputValue(&thickness,gauss);
+				if(thickness<min_thickness){
+					node->ApplyConstraint(0,+1.);
+				}
+				else {
+					/* no ice, set no spc */
+					node->DofInFSet(0); 
+				}
+			}
+			delete gauss;
+		}
+	}
 	/*Default, do nothing*/
 	return;
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 20723)
@@ -2069,4 +2069,5 @@
 			switch(calvinglaw){
 				case DefaultCalvingEnum:
+				case CalvingMinthicknessEnum:
 					//do nothing
 					break;
@@ -2076,7 +2077,4 @@
 				case CalvingDevEnum:
 					this->CalvingRateDev();
-					break;
-				case CalvingMinthicknessEnum:
-					this->CalvingRateMinthickness();
 					break;
 				default:
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 20723)
@@ -176,5 +176,4 @@
 		virtual void	    CalvingRateLevermann(void)=0;
 		virtual void       CalvingRateDev(void){_error_("not implemented yet");};
-		virtual void       CalvingRateMinthickness(void){_error_("not implemented yet");};
 		virtual void       WriteLevelsetSegment(DataSet* segments){_error_("not implemented yet");};
 		virtual void       ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 20723)
@@ -327,49 +327,4 @@
 		calvingratey[iv]=vy*sigma_vm/sigma_max;
 		calvingrate[iv]=sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
-	}
-
-	/*Add input*/
-	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
-
-	/*Clean up and return*/
-	delete gauss;
-}
-/*}}}*/
-void       Tria::CalvingRateMinthickness(){/*{{{*/
-
-	IssmDouble  calvingratex[NUMVERTICES];
-	IssmDouble  calvingratey[NUMVERTICES];
-	IssmDouble  calvingrate[NUMVERTICES];
-	IssmDouble  vx,vy,H,minH;
-
-	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);
-	Input* H_input  = inputs->GetInput(ThicknessEnum); _assert_(H_input);
-	parameters->FindParam(&minH,CalvingMinthicknessEnum);
-
-	/* Start looping on the number of vertices: */
-	GaussTria* gauss=new GaussTria();
-	for(int iv=0;iv<NUMVERTICES;iv++){
-		gauss->GaussVertex(iv);
-
-		/*Get velocity components and thickness*/
-		vx_input->GetInputValue(&vx,gauss);
-		vy_input->GetInputValue(&vy,gauss);
-		H_input->GetInputValue(&H,gauss);
-
-		/*Assign values*/
-		if(H>minH){
-			calvingratex[iv]=0.;
-			calvingratey[iv]=0.;
-			calvingrate[iv]=0.;
-		}
-		else{
-			calvingratex[iv]=vx+1e-2; //counter balance advance + add some retreat
-			calvingratey[iv]=vy+1e-2;
-			calvingrate[iv]=sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
-		}
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 20723)
@@ -54,5 +54,4 @@
 		void			CalvingRateLevermann();
 		void			CalvingRateDev();
-		void			CalvingRateMinthickness();
 		void			WriteLevelsetSegment(DataSet* segments);
 		void        ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments);
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 20723)
@@ -2166,12 +2166,4 @@
 }
 /*}}}*/
-void FemModel::CalvingRateMinthicknessx(){/*{{{*/
-
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
-		element->CalvingRateMinthickness();
-	}
-}
-/*}}}*/
 void FemModel::StrainRateparallelx(){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 20722)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 20723)
@@ -95,5 +95,4 @@
 		void CalvingRateLevermannx();
 		void CalvingRateDevx();
-		void CalvingRateMinthicknessx();
 		void ResetLevelset();
 		#ifdef  _HAVE_DAKOTA_
Index: /issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp	(revision 20722)
+++ /issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp	(revision 20723)
@@ -16,4 +16,5 @@
 	switch(calvinglaw){
 		case DefaultCalvingEnum:
+		case CalvingMinthicknessEnum:
 			break;
 		case CalvingLevermannEnum:
@@ -27,7 +28,4 @@
 			femmodel->ElementOperationx(&Element::CalvingRateDev);
 			break;
-		case CalvingMinthicknessEnum:
-			femmodel->CalvingRateMinthicknessx();
-			break;
 		default:
 			_error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
