Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 17273)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 17274)
@@ -421,4 +421,5 @@
 					./cores/meshdeformation_core.cpp\
 					./cores/damage_core.cpp\
+					./cores/levelsetfunctionslope_core.cpp\
 					./analyses/DamageEvolutionAnalysis.cpp\
 					./solutionsequences/solutionsequence_damage_nonlinear.cpp\
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 17274)
@@ -74,6 +74,6 @@
 	int        i,row,col,stabilization;
 	IssmDouble Jdet,D_scalar,h;
-	IssmDouble dlevelset[dim],normal[dim];
-	IssmDouble norm_dlevelset;
+	IssmDouble dlsf[dim],normal[dim];
+	IssmDouble norm_dlsf;
 	IssmDouble hx,hy,hz,kappa;
 	IssmDouble* xyz_list = NULL;
@@ -89,5 +89,6 @@
 
 	/*Retrieve all inputs and parameters*/
-	Input* levelset_input=element->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input);
+	Input* lsf_slopex_input=element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+	Input* lsf_slopey_input=element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 	element->GetVerticesCoordinates(&xyz_list);
 	h = element->CharacteristicLength();
@@ -102,11 +103,13 @@
 		GetBprime(Bprime,element,xyz_list,gauss);
 
-		/* Get normal on node */
-		levelset_input->GetInputDerivativeValue(&dlevelset[0],xyz_list,gauss);
-		norm_dlevelset=0.;
-		for(i=0;i<dim;i++) norm_dlevelset+=dlevelset[i]*dlevelset[i]; 
-		norm_dlevelset=sqrt(norm_dlevelset)+1.e-14;
-		for(i=0;i<dim;i++) normal[i]=dlevelset[i]/norm_dlevelset;
-
+		/* Get normal on ice boundary */
+		lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+		lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+		norm_dlsf=0.;
+		for(i=0;i<dim;i++) norm_dlsf+=dlsf[i]*dlsf[i]; 
+		norm_dlsf=sqrt(norm_dlsf); _assert_(norm_dlsf>0.);
+		for(i=0;i<dim;i++)
+			normal[i]=dlsf[i]/norm_dlsf;
+		
 		D_scalar=gauss->weight*Jdet;
 
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 17274)
@@ -169,4 +169,6 @@
 		case BedSlopeXEnum:     input2 = basalelement->GetInput(BedEnum);     _assert_(input2); break;
 		case BedSlopeYEnum:     input2 = basalelement->GetInput(BedEnum);     _assert_(input2); break;
+		case LevelsetfunctionSlopeXEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
+		case LevelsetfunctionSlopeYEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
 		default: input = element->GetInput(input_enum);
 	}
@@ -182,6 +184,6 @@
 		if(input2) input2->GetInputDerivativeValue(&slopes[0],xyz_list,gauss);
 		switch(input_enum){
-			case SurfaceSlopeXEnum: case BedSlopeXEnum: value = slopes[0]; break;
-			case SurfaceSlopeYEnum: case BedSlopeYEnum: value = slopes[1]; break;
+			case SurfaceSlopeXEnum: case BedSlopeXEnum: case LevelsetfunctionSlopeXEnum: value = slopes[0]; break;
+			case SurfaceSlopeYEnum: case BedSlopeYEnum: case LevelsetfunctionSlopeYEnum: value = slopes[1]; break;
 			default: input->GetInputValue(&value,gauss);
 		}
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 17274)
@@ -1977,4 +1977,6 @@
 				name==MaskIceLevelsetEnum ||
 				name==IceMaskNodeActivationEnum ||
+				name==LevelsetfunctionSlopeXEnum ||
+				name==LevelsetfunctionSlopeYEnum ||
 				name==GradientEnum ||
 				name==OldGradientEnum  ||
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17274)
@@ -910,11 +910,4 @@
 	}
 
-	if(nrfrontnodes!=2){
-		_printf0_("in elt nr: " << this->Id() << "\n");
-		_printf0_("nrfrontnodes: " << nrfrontnodes << "\n");
-		for(i=0;i<NUMVERTICES;i++){
-			_printf_("levelsetfunction[" << i << "]=" << levelset[i] << "; indicesfront: " << indicesfront[i] << ";\n");
-		}
-	}
 	_assert_(nrfrontnodes==2);
 
@@ -1622,4 +1615,6 @@
 				name==MaskIceLevelsetEnum ||
 				name==IceMaskNodeActivationEnum ||
+				name==LevelsetfunctionSlopeXEnum ||
+				name==LevelsetfunctionSlopeYEnum ||
 				name==SurfaceSlopeXEnum ||
 				name==SurfaceSlopeYEnum ||
Index: /issm/trunk-jpl/src/c/cores/cores.h
===================================================================
--- /issm/trunk-jpl/src/c/cores/cores.h	(revision 17273)
+++ /issm/trunk-jpl/src/c/cores/cores.h	(revision 17274)
@@ -24,4 +24,5 @@
 void thermal_core(FemModel* femmodel);
 void surfaceslope_core(FemModel* femmodel);
+void levelsetfunctionslope_core(FemModel* femmodel);
 void bedslope_core(FemModel* femmodel);
 void meshdeformation_core(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/cores/levelsetfunctionslope_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/levelsetfunctionslope_core.cpp	(revision 17274)
+++ /issm/trunk-jpl/src/c/cores/levelsetfunctionslope_core.cpp	(revision 17274)
@@ -0,0 +1,52 @@
+/*!\file: levelsetfunctionslope_core.cpp
+ * \brief: core of the slope solution 
+ */ 
+
+#include "./cores.h"
+#include "../toolkits/toolkits.h"
+#include "../classes/classes.h"
+#include "../shared/shared.h"
+#include "../solutionsequences/solutionsequences.h"
+#include "../modules/modules.h"
+
+void levelsetfunctionslope_core(FemModel* femmodel){
+
+	/*parameters: */
+	bool save_results;
+	int  meshtype;
+
+	/*Recover some parameters: */
+	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+	femmodel->parameters->FindParam(&meshtype,MeshTypeEnum);
+
+	if(VerboseSolution()) _printf0_("computing slope of levelset function...\n");
+
+	/*Call on core computations: */
+	femmodel->SetCurrentConfiguration(L2ProjectionBaseAnalysisEnum);
+
+	femmodel->parameters->SetParam(LevelsetfunctionSlopeXEnum,InputToL2ProjectEnum);
+	solutionsequence_linear(femmodel);
+
+	if(meshtype!=Mesh2DverticalEnum){
+		femmodel->parameters->SetParam(LevelsetfunctionSlopeYEnum,InputToL2ProjectEnum);
+		solutionsequence_linear(femmodel);
+	}
+	if(meshtype==Mesh2DverticalEnum){
+	      femmodel->parameters->SetParam(LevelsetfunctionSlopeXEnum,InputToExtrudeEnum);
+		extrudefrombase_core(femmodel);
+	}
+
+	if(save_results){
+		if(VerboseSolution()) _printf0_("saving results:\n");
+		if(meshtype!=Mesh2DverticalEnum){
+			int outputs[2] = {LevelsetfunctionSlopeXEnum,LevelsetfunctionSlopeYEnum};
+			femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2);
+
+		}
+		else{
+			int outputs = LevelsetfunctionSlopeXEnum;
+			femmodel->RequestedOutputsx(&femmodel->results,&outputs,1);
+		}
+	}
+
+}
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 17274)
@@ -125,6 +125,9 @@
 		if(islevelset){
 			if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
+			
+			/* get slope of lsf for computation of normal on ice domain*/
+			levelsetfunctionslope_core(femmodel);
 
-			/* extrapolate required variables */
+			/* extrapolate along normal */
 			Analysis* extanalysis = new ExtrapolationAnalysis();
 			const int nvars=2;
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17273)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17274)
@@ -679,4 +679,6 @@
 	ExtrapolationVariableEnum,
 	IceMaskNodeActivationEnum,
+	LevelsetfunctionSlopeXEnum,
+	LevelsetfunctionSlopeYEnum,
 	/*}}}*/
 	MaximumNumberOfDefinitionsEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17274)
@@ -638,4 +638,6 @@
 		case ExtrapolationVariableEnum : return "ExtrapolationVariable";
 		case IceMaskNodeActivationEnum : return "IceMaskNodeActivation";
+		case LevelsetfunctionSlopeXEnum : return "LevelsetfunctionSlopeX";
+		case LevelsetfunctionSlopeYEnum : return "LevelsetfunctionSlopeY";
 		case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
 		default : return "unknown";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17273)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17274)
@@ -653,4 +653,6 @@
 	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
          else stage=7;
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17273)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17274)
@@ -630,3 +630,5 @@
 def ExtrapolationVariableEnum(): return StringToEnum("ExtrapolationVariable")[0]
 def IceMaskNodeActivationEnum(): return StringToEnum("IceMaskNodeActivation")[0]
+def LevelsetfunctionSlopeXEnum(): return StringToEnum("LevelsetfunctionSlopeX")[0]
+def LevelsetfunctionSlopeYEnum(): return StringToEnum("LevelsetfunctionSlopeY")[0]
 def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
Index: /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeXEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeXEnum.m	(revision 17274)
+++ /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeXEnum.m	(revision 17274)
@@ -0,0 +1,11 @@
+function macro=LevelsetfunctionSlopeXEnum()
+%LEVELSETFUNCTIONSLOPEXENUM - Enum of LevelsetfunctionSlopeX
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=LevelsetfunctionSlopeXEnum()
+
+macro=StringToEnum('LevelsetfunctionSlopeX');
Index: /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeYEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeYEnum.m	(revision 17274)
+++ /issm/trunk-jpl/src/m/enum/LevelsetfunctionSlopeYEnum.m	(revision 17274)
@@ -0,0 +1,11 @@
+function macro=LevelsetfunctionSlopeYEnum()
+%LEVELSETFUNCTIONSLOPEYENUM - Enum of LevelsetfunctionSlopeY
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=LevelsetfunctionSlopeYEnum()
+
+macro=StringToEnum('LevelsetfunctionSlopeY');
