Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 17309)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 17310)
@@ -138,4 +138,32 @@
 /*}}}*/
 
+void  Seg::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+	
+	/* Intermediaries */
+	int nrfrontnodes,index;
+	IssmDouble  levelset[NUMVERTICES];
+
+	/*Recover parameters and values*/
+	GetInputListOnVertices(&levelset[0],levelsetenum);
+	/* Get nodes where there is no ice */
+	nrfrontnodes=0;
+	for(int i=0;i<NUMVERTICES;i++){
+		if(levelset[i]>=0.){
+			index=i;
+			nrfrontnodes++;
+		}
+	}
+
+	_assert_(nrfrontnodes==1);
+
+	IssmDouble* xyz_front = xNew<IssmDouble>(3);
+
+	/* Return nodes */
+	for(int dir=0;dir<3;dir++){
+		xyz_front[dir]=xyz_list[3*index+dir];
+	}
+
+	*pxyz_front=xyz_front;
+}/*}}}*/
 /*FUNCTION Seg::GetNumberOfNodes;{{{*/
 int Seg::GetNumberOfNodes(void){
@@ -209,4 +237,23 @@
 }
 /*}}}*/
+/*FUNCTION Seg::NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){{{*/
+Gauss* Seg::NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){
+
+	/*Output*/
+	Gauss* gauss = NULL;
+
+	if(xyz_list_front[0] == xyz_list[0]){
+		gauss = new GaussSeg(+1.);
+	}
+	else if(xyz_list_front[0] == xyz_list[3*1+0]){
+		gauss = new GaussSeg(-1.);
+	}
+	else{
+		_error_("front is not located on element edge");
+	}
+
+	return gauss;
+}
+/*}}}*/
 /*FUNCTION Seg::NewElementVector{{{*/
 ElementVector* Seg::NewElementVector(int approximation_enum){
@@ -235,2 +282,16 @@
 }
 /*}}}*/
+/*FUNCTION Seg::NormalSection{{{*/
+void Seg::NormalSection(IssmDouble* normal,IssmDouble* xyz_list_front){
+
+	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES*3);
+	::GetVerticesCoordinates(xyz_list,this->vertices,NUMVERTICES);
+
+	if(xyz_list_front[0]>xyz_list[0])
+	 normal[0]= + 1.;
+	else
+	 normal[0]= - 1.;
+
+	xDelete<IssmDouble>(xyz_list);
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17309)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17310)
@@ -109,5 +109,5 @@
 		void        NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
 		bool        IsIceInElement();
-		void        NormalSection(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
+		void        NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
 		void        NormalTop(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
 		void        NormalBase(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
@@ -136,5 +136,5 @@
 		Gauss*      NewGauss(void);
 		Gauss*      NewGauss(int order);
-      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){_error_("not implemented yet");};
+      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order);
       Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert){_error_("not implemented yet");};
       Gauss*      NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order){_error_("not implemented yet");};
@@ -151,5 +151,5 @@
 		bool		   IsIcefront(void);
 		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");};
+		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
 		void        GetNormalFromLSF(IssmDouble *pnormal){_error_("not implemented yet");};
 
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.cpp	(revision 17309)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.cpp	(revision 17310)
@@ -46,4 +46,22 @@
 	xDelete<IssmPDouble>(pcoords1);
 	xDelete<IssmPDouble>(pweights);
+
+	/*Initialize static fields as undefinite*/
+	weight=UNDEF;
+	coord1=UNDEF;
+}
+/*}}}*/
+/*FUNCTION GaussSeg::GaussSeg(IssmDouble position) {{{*/
+GaussSeg::GaussSeg(IssmDouble position){
+
+	/*Get gauss points*/
+	this->numgauss = 1;
+	this->coords1=xNew<IssmDouble>(numgauss);
+	this->weights=xNew<IssmDouble>(numgauss);
+
+	/*cast : */
+	_assert_(position>=-1. && position<=+1.);
+	this->coords1[0]=position;
+	this->weights[0]=1.;
 
 	/*Initialize static fields as undefinite*/
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.h	(revision 17309)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussSeg.h	(revision 17310)
@@ -25,4 +25,5 @@
 		GaussSeg();
 		GaussSeg(int order);
+		GaussSeg(IssmDouble position);
 		~GaussSeg();
 
