Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17194)
@@ -221,4 +221,6 @@
 		virtual bool   IsZeroLevelset(int levelset_enum)=0;
 		virtual void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
+		virtual void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
+		virtual void   GetNormalFromLSF(IssmDouble *pnormal)=0;
 
 		#ifdef _HAVE_RESPONSES_
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 17194)
@@ -3166,5 +3166,5 @@
 	GetInputListOnVertices(&ls[0],levelset_enum);
 
-	/*If the level set is awlays <=0, there is no ice front here*/
+	/*If the level set has always same sign, there is no ice front here*/
 	iszerols = false;
 	if(IsIceInElement()){
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17194)
@@ -115,4 +115,6 @@
 		bool   IsZeroLevelset(int levelset_enum);
 		void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+		void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
+		void   GetNormalFromLSF(IssmDouble *pnormal){_error_("not implemented yet");};
 		void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
 		void   ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17194)
@@ -160,4 +160,6 @@
 		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented");};
+		void		GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
+		void        GetNormalFromLSF(IssmDouble *pnormal){_error_("not implemented yet");};
 
 		#ifdef _HAVE_HYDROLOGY_
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17194)
@@ -891,4 +891,67 @@
 }
 /*}}}*/
+void  Tria::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+	
+	/* Intermediaries */
+	int i, dir,nrfrontnodes;
+	IssmDouble  levelset[NUMVERTICES];
+
+	/*Recover parameters and values*/
+	GetInputListOnVertices(&levelset[0],levelsetenum);
+
+	int* indicesfront = xNew<int>(NUMVERTICES);
+	/* Get nodes where there is no ice */
+	nrfrontnodes=0;
+	for(i=0;i<NUMVERTICES;i++){
+		if(levelset[i]>=0.){
+			indicesfront[nrfrontnodes]=i;
+			nrfrontnodes++;
+		}
+	}
+
+	IssmDouble* xyz_front = xNew<IssmDouble>(3*nrfrontnodes);
+	/* Return nodes */
+	for(i=0;i<nrfrontnodes;i++){
+		for(dir=0;dir<3;dir++){
+			xyz_front[3*i+dir]=xyz_list[indicesfront[i]+dir];
+		}
+	}
+
+	*pxyz_front=xyz_front;
+
+	xDelete<int>(indicesfront);
+}/*}}}*/
+void  Tria::GetNormalFromLSF(IssmDouble *pnormal){/*{{{*/
+
+	/* Intermediaries */
+	const int dim=2;
+	int i,counter;
+	IssmDouble* xyz_list = NULL;
+	IssmDouble  dlevelset[dim], norm_dlevelset;
+	IssmDouble  normal[dim]={0.};
+
+	/*Retrieve all inputs and parameters*/
+	Input* levelset_input=this->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input);
+	this->GetVerticesCoordinates(&xyz_list);
+	
+	counter=0;
+	Gauss* gauss = this->NewGauss(2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+		/* 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;
+		counter++;
+	}
+	_assert_(counter>0);
+	for(i=0;i<dim;i++) normal[i]/counter;
+	
+	pnormal=&normal[0];
+
+	delete gauss;
+	xDelete<IssmDouble>(xyz_list);
+}/*}}}*/
 /*FUNCTION Tria::GetNodeIndex {{{*/
 int Tria::GetNodeIndex(Node* node){
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17193)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17194)
@@ -131,4 +131,6 @@
 		void   VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+		void	    GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+	    void        GetNormalFromLSF(IssmDouble *pnormal);
 		bool        IsZeroLevelset(int levelset_enum);
 
