Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 22986)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 22987)
@@ -663,57 +663,4 @@
 	}
 }/*}}}*/
-void           LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
-
-	if(!element->IsZeroLevelset(MaskIceLevelsetEnum))
-		return;
-
-	/* Intermediaries */
-	const int dim=3;
-	int i,d;
-	int numvertices=element->GetNumberOfVertices();
-	IssmDouble s0[dim], s1[dim], v[dim];
-	IssmDouble dist,lsf_old;
-
-	IssmDouble* lsf = xNew<IssmDouble>(numvertices);
-	IssmDouble* sign_lsf = xNew<IssmDouble>(numvertices);
-	IssmDouble* signed_dist = xNew<IssmDouble>(numvertices);
-	IssmDouble* xyz_list = NULL;
-	IssmDouble* xyz_list_zero = NULL;
-
-	/* retrieve inputs and parameters */
-	element->GetVerticesCoordinates(&xyz_list);
-	element->GetInputListOnVertices(lsf,MaskIceLevelsetEnum);
-
-	/* get sign of levelset function */
-	for(i=0;i<numvertices;i++)
-		sign_lsf[i]=(lsf[i]>=0.?1.:-1.);
-
-	element->ZeroLevelsetCoordinates(&xyz_list_zero, xyz_list, MaskIceLevelsetEnum);
-	for(d=0;d<dim;d++){
-		s0[d]=xyz_list_zero[0+d];
-		s1[d]=xyz_list_zero[3+d];
-	}
-
-	/* get signed_distance of vertices to zero levelset straight */
-	for(i=0;i<numvertices;i++){
-		for(d=0;d<dim;d++)
-			v[d]=xyz_list[3*i+d];
-		dist=GetDistanceToStraight(&v[0],&s0[0],&s1[0]);
-		signed_dist[i]=sign_lsf[i]*dist;
-	}
-	
-	/* insert signed_distance into vec_signed_dist, if computed distance is smaller */
-	for(i=0;i<numvertices;i++){
-		vec_signed_dist->GetValue(&lsf_old, element->vertices[i]->Sid());
-		if(xIsNan<IssmDouble>(lsf_old) || fabs(signed_dist[i])<fabs(lsf_old))
-			vec_signed_dist->SetValue(element->vertices[i]->Sid(),signed_dist[i],INS_VAL);
-	}
-
-	xDelete<IssmDouble>(lsf);
-	xDelete<IssmDouble>(sign_lsf);
-	xDelete<IssmDouble>(signed_dist);
-	xDelete<IssmDouble>(xyz_list);
-	xDelete<IssmDouble>(xyz_list_zero);
-}/*}}}*/
 void           LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 22986)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 22987)
@@ -32,5 +32,4 @@
 		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
-		void           SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element);
 		void           UpdateConstraints(FemModel* femmodel);
 };
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22986)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22987)
@@ -3301,60 +3301,19 @@
 }
 /*}}}*/
-void       Tria::ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){/*{{{*/
-
-	/*Intermediaries*/
-	IssmDouble d,xn,yn;
+void       Tria::ResetLevelsetFromSegmentlist(IssmDouble* distances){/*{{{*/
+
 
 	/*Get current levelset and vertex coordinates*/
 	IssmDouble ls[NUMVERTICES];
-	IssmDouble  xyz_list[NUMVERTICES][3];
-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
 
 	/*Get distance from list of segments and reset ls*/
 	for(int j=0;j<NUMVERTICES;j++){
-		IssmDouble dmin = 1.e+50;
-		for(int i=0;i<numsegments;i++){
-			IssmDouble x = xyz_list[j][0];
-			IssmDouble y = xyz_list[j][1];
-			IssmDouble l2 = (segments[4*i+2]-segments[4*i+0])*(segments[4*i+2]-segments[4*i+0]) + (segments[4*i+3]-segments[4*i+1])*(segments[4*i+3]-segments[4*i+1]);
-
-			/*Segment has a length of 0*/
-			if(l2==0.){
-				d = (x-segments[4*i+0])*(x-segments[4*i+0])+(y-segments[4*i+1])*(y-segments[4*i+1]);
-				if(d<dmin) dmin = d;
-				continue;
-			}
-
-			/*Consider the line extending the segment, parameterized as v + t (w - v).
-			 *We find projection of point p onto the line.
-			 *It falls where t = [(p-v) . (w-v)] / |w-v|^2*/
-			IssmDouble t = ((x-segments[4*i+0])*(segments[4*i+2]-segments[4*i+0]) + (y-segments[4*i+1])*(segments[4*i+3]-segments[4*i+1]))/l2;
-			if(t < 0.0){
-				// Beyond the 'v' end of the segment
-				d = (x-segments[4*i+0])*(x-segments[4*i+0])+(y-segments[4*i+1])*(y-segments[4*i+1]);
-			}
-			else if (t > 1.0){
-				// Beyond the 'w' end of the segment
-				d = (x-segments[4*i+2])*(x-segments[4*i+2])+(y-segments[4*i+3])*(y-segments[4*i+3]);
-			}
-			else{
-				// Projection falls on the segment
-				xn = segments[4*i+0] + t * (segments[4*i+2] - segments[4*i+0]);
-				yn = segments[4*i+1] + t * (segments[4*i+3] - segments[4*i+1]);
-				d = (x-xn)*(x-xn)+(y-yn)*(y-yn);
-			}
-
-			if(d<dmin) dmin = d;
-		}
-
-		/*Update signed distance*/
-		dmin = sqrt(dmin);
 		if(dmin>10000) dmin=10000;
 		if(ls[j]>0){
-			ls[j] = dmin;
+			ls[j] = distances[this->vertices->Pid()];
 		}
 		else{
-			ls[j] = - dmin;
+			ls[j] = - distances[this->vertices->Pid()];
 		}
 	}
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 22986)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 22987)
@@ -1050,24 +1050,54 @@
 
 	/*3: Add distance input to all elements*/
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
-		if(!element->IsOnBase()) continue;
-		element->CreateDistanceInputFromSegmentlist(allsegmentlist,numseg,distanceenum);
-	}
-
-	/*Extrude if necessary*/
-	int elementtype;
-	this->parameters->FindParam(&elementtype,MeshElementtypeEnum);
-	if(elementtype==PentaEnum){
-		InputExtrudex(this,distanceenum,-1);
-	}
-	else if(elementtype==TriaEnum){
-		/*no need to extrude*/
-	}
-	else{
-		_error_("not implemented yet");
-	}
+	IssmDouble* distances = xNew<IssmDouble>(vertices->Size());
+	IssmDouble  d,xn,yn;
+	for(int i=0;i<vertices->Size();i++){
+		Vertex* vertex=dynamic_cast<Vertex*>(this->vertices->GetObjectByOffset(i));
+		IssmDouble dmin = 1.e+50;
+
+		for(int i=0;i<numseg;i++){
+			IssmDouble x = vertex->x;
+			IssmDouble y = vertex->y;
+			IssmDouble l2 = (allsegmentlist[4*i+2]-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (allsegmentlist[4*i+3]-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]);
+
+			/*Segment has a length of 0*/
+			if(l2==0.){
+				d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
+				if(d<dmin) dmin = d;
+				continue;
+			}
+
+			/*Consider the line extending the segment, parameterized as v + t (w - v).
+			 *We find projection of point p onto the line.
+			 *It falls where t = [(p-v) . (w-v)] / |w-v|^2*/
+			IssmDouble t = ((x-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (y-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]))/l2;
+			if(t < 0.0){
+				// Beyond the 'v' end of the segment
+				d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
+			}
+			else if (t > 1.0){
+				// Beyond the 'w' end of the segment
+				d = (x-allsegmentlist[4*i+2])*(x-allsegmentlist[4*i+2])+(y-allsegmentlist[4*i+3])*(y-allsegmentlist[4*i+3]);
+			}
+			else{
+				// Projection falls on the segment
+				xn = allsegmentlist[4*i+0] + t * (allsegmentlist[4*i+2] - allsegmentlist[4*i+0]);
+				yn = allsegmentlist[4*i+1] + t * (allsegmentlist[4*i+3] - allsegmentlist[4*i+1]);
+				d = (x-xn)*(x-xn)+(y-yn)*(y-yn);
+			}
+
+			if(d<dmin) dmin = d;
+		}
+
+		/*Update signed distance*/
+		distances[vertex->pid] = sqrt(dmin);
+	}
+
+	//element->CreateDistanceInputFromSegmentlist(allsegmentlist,numseg,distanceenum);
+	InputUpdateFromVectorx(this,distances,distanceenum,VertexPIdEnum);
+	printf("-------------- file: FemModel.cpp line: %i\n",__LINE__); 
 
 	/*Clean up and return*/
+	xDelete<IssmDouble>(distances);
 	xDelete<IssmDouble>(allsegmentlist);
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/cores/movingfront_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/movingfront_core.cpp	(revision 22986)
+++ /issm/trunk-jpl/src/c/cores/movingfront_core.cpp	(revision 22987)
@@ -85,4 +85,5 @@
 
 	/*Reset levelset if needed*/
+	printf("-------------- file: movingfront_core.cpp line: %i\n",__LINE__); 
 	if(reinit_frequency && (step%reinit_frequency==0)){
 		if(VerboseSolution()) _printf0_("   reinitializing level set\n");
