Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 23991)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 23992)
@@ -483,4 +483,5 @@
 issm_sources += ./analyses/LevelsetAnalysis.cpp
 issm_sources += ./modules/Calvingx/Calvingx.cpp
+issm_sources += ./modules/KillIcebergsx/KillIcebergsx.cpp
 endif
 if EXTRAPOLATION
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 23991)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 23992)
@@ -1411,5 +1411,5 @@
 
 /* 	/\*Fill in values*\/ */
-/* 	this->GetVertexPidList(vertexpidlist); */
+/* 	this->GetVerticesPidList(vertexpidlist); */
 /* 	this->GetInputListOnVertices(values,input_enum); */
 /* 	vector->SetValues(numvertices,vertexpidlist,values,INS_VAL); */
@@ -1441,5 +1441,5 @@
 			values = xNew<IssmDouble>(numvertices);
 			/*Fill in values*/
-			this->GetVertexPidList(doflist);
+			this->GetVerticesPidList(doflist);
 			this->GetInputListOnVertices(values,input_enum);
 			vector->SetValues(numvertices,doflist,values,INS_VAL);
@@ -1492,5 +1492,5 @@
 		values = xNew<IssmDouble>(numvertices);
 		/*Fill in values*/
-		this->GetVertexPidList(doflist);
+		this->GetVerticesPidList(doflist);
 		this->GetInputListOnVerticesAtTime(values,input_enum,time);
 		vector->SetValues(numvertices,doflist,values,INS_VAL);
@@ -1514,5 +1514,12 @@
 }
 /*}}}*/
-void       Element::GetVertexPidList(int* pidlist){/*{{{*/
+void       Element::GetVerticesLidList(int* lidlist){/*{{{*/
+
+	int numvertices = this->GetNumberOfVertices();
+	for(int i=0;i<numvertices;i++) lidlist[i]=vertices[i]->Lid();
+
+}
+/*}}}*/
+void       Element::GetVerticesPidList(int* pidlist){/*{{{*/
 
 	int numvertices = this->GetNumberOfVertices();
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 23991)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 23992)
@@ -104,5 +104,6 @@
 		void               GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum, int type);
 		void               GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum, int type,IssmDouble time);
-		void	             GetVertexPidList(int* pidlist);
+		void	             GetVerticesLidList(int* lidlist);
+		void	             GetVerticesPidList(int* pidlist);
 		void               GetVerticesConnectivityList(int* connectivitylist);
 		void               GetVerticesCoordinates(IssmDouble** xyz_list);
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 23991)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 23992)
@@ -211,5 +211,5 @@
 	/*Figure out the average for this element: */
 	this->GetVerticesSidList(&offsetsid[0]);
-	this->GetVertexPidList(&offsetdof[0]);
+	this->GetVerticesPidList(&offsetdof[0]);
 	mean=0;
 	for(i=0;i<NUMVERTICES;i++){
Index: /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 23992)
+++ /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 23992)
@@ -0,0 +1,114 @@
+/*!\file KillIcebergsx
+ * \brief: compute inverse method gradient
+ */
+
+#include "./KillIcebergsx.h"
+#include "../../shared/shared.h"
+#include "../../toolkits/toolkits.h"
+
+void KillIcebergsx(FemModel* femmodel){
+
+	/*Intermediaries*/
+	const int MAXVERTICES = 6;
+	bool      found1;
+	int       sidlist[MAXVERTICES];
+	int       lidlist[MAXVERTICES];
+
+	/*retrieve vertex info*/
+	int nbv_global = femmodel->vertices->NumberOfVerticesLocalAll();
+	int nbv_local  = femmodel->vertices->NumberOfVerticesLocal();
+	if(nbv_global==0)  return;
+	Vector<IssmDouble>* vec_connected_to_land=new Vector<IssmDouble>(nbv_local,nbv_global);
+
+	/*Fill vector with 1 where it is grounded*/
+	IssmDouble eflags[MAXVERTICES];
+	for(int i=0;i<MAXVERTICES;i++) eflags[i] = 1.;
+
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+		if(element->IsIceInElement()){
+			if(element->IsGrounded()){
+				int  numvertices = element->GetNumberOfVertices();
+				if(numvertices>MAXVERTICES) _error_("need to increase MAXVERTICES");
+				element->GetVerticesSidList(&sidlist[0]);
+				vec_connected_to_land->SetValues(numvertices,&sidlist[0],&eflags[0],ADD_VAL);
+			}
+		}
+	}
+	vec_connected_to_land->Assemble();
+
+	/*Prepare element flag to speed up process*/
+	bool* element_flag = xNewZeroInit<bool>(femmodel->elements->Size());
+
+	bool keepsyncing = true;
+
+	while(keepsyncing){
+
+		/*Need to place an outer loop here*/
+		IssmDouble* local_mask = NULL;
+		femmodel->GetLocalVectorWithClonesVertices(&local_mask,vec_connected_to_land);
+
+		/*Local iterations on partition*/
+		int  keepgoing = 1;
+		int  iter      = 1;
+		while(keepgoing){
+			_printf0_("Iteration "<<iter);
+
+			keepgoing = 0;
+			for(int i=0;i<femmodel->elements->Size();i++){
+				Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+				if(element->IsIceInElement() || element_flag[i]){
+					int numvertices = element->GetNumberOfVertices();
+					element->GetVerticesLidList(&lidlist[0]);
+					bool found1 = false;
+					for(int j=0;j<numvertices;j++){
+						if(local_mask[lidlist[j]]>0.){
+							found1 = true;
+							break;
+						}
+					}
+					if(found1){
+						element_flag[i] = true;
+						for(int j=0;j<numvertices;j++){
+							if(local_mask[lidlist[j]]==0.){
+								local_mask[lidlist[j]]=1.;
+								keepgoing = true;
+							}
+						}
+					}
+				}
+			}
+			iter++;
+		}
+
+		/*Check how many iterations all cpus did*/
+		int iter_max;
+		ISSM_MPI_Reduce(&iter,&iter_max,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());
+		if(iter_max==2){
+			xDelete<bool>(element_flag);
+			keepsyncing = false;
+		}
+		else{
+			for(int i=0;i<femmodel->elements->Size();i++){
+				Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+				if(element->IsIceInElement()){
+						int  numvertices = element->GetNumberOfVertices();
+						element->GetVerticesSidList(&sidlist[0]);
+						element->GetVerticesLidList(&lidlist[0]);
+						for(int j=0;j<numvertices;j++) eflags[j] = local_mask[lidlist[j]];
+						vec_connected_to_land->SetValues(numvertices,&sidlist[0],&eflags[0],ADD_VAL);
+					}
+			}
+			xDelete<bool>(element_flag);
+			vec_connected_to_land->Assemble();
+		}
+	}
+
+	delete vec_connected_to_land;
+
+	/*First, create a vector full of 0 and place 1 where the ice is grounded*/
+	_error_("Not implemented yet");
+}
Index: /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.h	(revision 23992)
+++ /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.h	(revision 23992)
@@ -0,0 +1,10 @@
+#ifndef _KILLICEBERGS_H
+#define _KILLICEBERGS_H
+
+#include "../../classes/classes.h"
+#include "../../analyses/analyses.h"
+
+/* local prototypes: */
+void KillIcebergsx(FemModel* femmodel);
+
+#endif
Index: /issm/trunk-jpl/src/c/modules/modules.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/modules.h	(revision 23991)
+++ /issm/trunk-jpl/src/c/modules/modules.h	(revision 23992)
@@ -58,4 +58,5 @@
 #include "./KMLOverlayx/KMLOverlayx.h"
 #include "./Exp2Kmlx/Exp2Kmlx.h"
+#include "./KillIcebergsx/KillIcebergsx.h"
 #include "./Kml2Expx/Kml2Expx.h"
 #include "./Krigingx/Krigingx.h"
