Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 22473)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 22474)
@@ -70,4 +70,5 @@
 		case CalvingHabEnum:
 			iomodel->FetchDataToInput(elements,"md.calving.meltingrate",CalvingMeltingrateEnum);
+			iomodel->FetchDataToInput(elements,"md.calving.flotation_fraction",CalvingHabFractionEnum);
 			break;
 		case CalvingCrevasseDepthEnum:
@@ -100,5 +101,4 @@
 			break;
 		case CalvingHabEnum:
-			parameters->AddObject(iomodel->CopyConstantObject("md.calving.flotation_fraction",CalvingHabEnum));
 			break;
 		case CalvingCrevasseDepthEnum:
@@ -740,7 +740,8 @@
 	/*Intermediaries*/
 	int         calvinglaw;
-	IssmDouble  min_thickness,thickness,flotation_fraction;
+	IssmDouble  min_thickness,thickness,hab_fraction;
 	IssmDouble  rho_ice,rho_water,constant_g,rheology_B,rheology_n;
 	IssmDouble  bed,water_depth;
+	IssmDouble  levelset;
 
 	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
@@ -779,6 +780,7 @@
 
 		/*Get the fraction of the flotation thickness at the terminus*/
-		femmodel->parameters->FindParam(&flotation_fraction,CalvingHabEnum);
-
+		femmodel->elements->InputDuplicate(MaskIceLevelsetEnum, DistanceToCalvingfrontEnum);
+		femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
+		
 		/*Loop over all elements of this partition*/
 		for(int i=0;i<femmodel->elements->Size();i++){
@@ -788,8 +790,10 @@
 			rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
 
-			int      numnodes = element->GetNumberOfNodes();
-			Gauss*   gauss    = element->NewGauss();
-			Input*   H_input  = element->GetInput(ThicknessEnum); _assert_(H_input);
-			Input*   bed      = element->GetInput(BedEnum); _assert_(bed);
+			int      numnodes           = element->GetNumberOfNodes();
+			Gauss*   gauss              = element->NewGauss();
+			Input*   H_input            = element->GetInput(ThicknessEnum); _assert_(H_input);
+			Input*   bed                = element->GetInput(BedEnum); _assert_(bed);
+			Input*   hab_fraction_input = element->GetInput(CalvingHabFractionEnum); _assert_(hab_fraction_input);
+			Input*   ls_input           = element->GetInput(DistanceToCalvingfrontEnum); _assert_(ls_input);
 
 			/*Potentially constrain nodes of this element*/
@@ -799,5 +803,8 @@
 				H_input->GetInputValue(&thickness,gauss);
 				bed->GetInputValue(&water_depth,gauss);
-				if(thickness<((rho_water/rho_ice)*(1+flotation_fraction)*-water_depth)){
+				ls_input->GetInputValue(&levelset,gauss);
+				hab_fraction_input->GetInputValue(&hab_fraction,gauss);
+
+				if(thickness<((rho_water/rho_ice)*(1+hab_fraction)*-water_depth) && levelset>-300){
 					node->ApplyConstraint(0,+1.);
 				}
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22473)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22474)
@@ -282,4 +282,5 @@
 	CalvingMinthicknessEnum,
 	CalvingHabEnum,
+	CalvingHabFractionEnum,
 	CalvingCrevasseDepthEnum,
 	CalvingDev2Enum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22473)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22474)
@@ -288,4 +288,5 @@
 		case CalvingMinthicknessEnum : return "CalvingMinthickness";
 		case CalvingHabEnum : return "CalvingHab";
+		case CalvingHabFractionEnum : return "CalvingHabFraction";
 		case CalvingCrevasseDepthEnum : return "CalvingCrevasseDepth";
 		case CalvingDev2Enum : return "CalvingDev2";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22473)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22474)
@@ -294,4 +294,5 @@
 	      else if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum;
 	      else if (strcmp(name,"CalvingHab")==0) return CalvingHabEnum;
+	      else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
 	      else if (strcmp(name,"CalvingCrevasseDepth")==0) return CalvingCrevasseDepthEnum;
 	      else if (strcmp(name,"CalvingDev2")==0) return CalvingDev2Enum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
 	      else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
-	      else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
+	      if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum;
+	      else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
 	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
 	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum;
 	      else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum;
-	      else if (strcmp(name,"SmbPrecipitation")==0) return SmbPrecipitationEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SmbPddfacSnow")==0) return SmbPddfacSnowEnum;
+	      if (strcmp(name,"SmbPrecipitation")==0) return SmbPrecipitationEnum;
+	      else if (strcmp(name,"SmbPddfacSnow")==0) return SmbPddfacSnowEnum;
 	      else if (strcmp(name,"SmbPddfacIce")==0) return SmbPddfacIceEnum;
 	      else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
 	      else if (strcmp(name,"LambdaS")==0) return LambdaSEnum;
-	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+	      if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"Outputdefinition93")==0) return Outputdefinition93Enum;
 	      else if (strcmp(name,"Outputdefinition94")==0) return Outputdefinition94Enum;
-	      else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
+	      if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
+	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
 	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
 	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"LoveG0")==0) return LoveG0Enum;
 	      else if (strcmp(name,"LoveR0")==0) return LoveR0Enum;
-	      else if (strcmp(name,"LoveMu0")==0) return LoveMu0Enum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
+	      if (strcmp(name,"LoveMu0")==0) return LoveMu0Enum;
+	      else if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
 	      else if (strcmp(name,"LoveForcingType")==0) return LoveForcingTypeEnum;
 	      else if (strcmp(name,"LoveHr")==0) return LoveHrEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"Vertex")==0) return VertexEnum;
 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
-	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Option")==0) return OptionEnum;
+	      if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
+	      else if (strcmp(name,"Option")==0) return OptionEnum;
 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
 	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
-	      else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+	      if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
+	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
 	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
