Index: /issm/trunk/src/c/Bamgx/objects/GeometricalEdge.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/GeometricalEdge.cpp	(revision 3334)
+++ /issm/trunk/src/c/Bamgx/objects/GeometricalEdge.cpp	(revision 3335)
@@ -2,5 +2,4 @@
 #include <string.h>
 #include <cmath>
-#include <assert.h>
 
 #include "GeometricalEdge.h"
@@ -25,5 +24,5 @@
 
 		//check theta
-		assert(theta>=0 && theta<=1);
+		ISSMASSERT(theta>=0 && theta<=1);
 
 		if (TgA()){ 
Index: /issm/trunk/src/c/Bamgx/objects/GeometricalVertex.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/GeometricalVertex.cpp	(revision 3334)
+++ /issm/trunk/src/c/Bamgx/objects/GeometricalVertex.cpp	(revision 3335)
@@ -3,5 +3,4 @@
 #include <cmath>
 #include <ctime>
-#include <assert.h>
 
 #include "GeometricalVertex.h"
@@ -47,5 +46,5 @@
 	GeometricalVertex* GeometricalVertex::The(){
 		// return a unique vertex
-		assert(link);
+		ISSMASSERT(link);
 		return link;
 	}/*}}}*/
Index: /issm/trunk/src/c/Bamgx/objects/Geometry.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/Geometry.cpp	(revision 3334)
+++ /issm/trunk/src/c/Bamgx/objects/Geometry.cpp	(revision 3335)
@@ -3,5 +3,4 @@
 #include <cmath>
 #include <ctime>
-#include <assert.h>
 
 #include "BamgObjects.h"
@@ -735,5 +734,5 @@
 				 }
 			 } 
-			assert(nbgem && nbe);
+			ISSMASSERT(nbgem && nbe);
 			if(step==0){
 				curves = new Curve[NbOfCurves];
@@ -894,5 +893,5 @@
 			GeometricalEdge* tmpge = eg0;
 			ge[--bge] =eg0 = eg0->Adj[sens0];
-			assert(bge>=0 && bge<=mxe);
+			ISSMASSERT(bge>=0 && bge<=mxe);
 			sens0 = 1-( sensge[bge] = tmpge->DirAdj[sens0]);
 		}
@@ -912,5 +911,5 @@
 			ge[++tge] =eg1 = eg1->Adj[sens1];
 			sensge[tge]= sens1 = 1-tmpge->DirAdj[sens1];
-			assert(tge>=0 && tge<=mxe);
+			ISSMASSERT(tge>=0 && tge<=mxe);
 		}
 
@@ -934,5 +933,5 @@
 			double ll=0;
 			for(i=bge;i<tge;i++){
-				assert(i>=0 && i<=mxe);
+				ISSMASSERT(i>=0 && i<=mxe);
 				BB =  (*ge[i])[sensge[i]];
 				lge[i]=ll += Norme2(AA-BB);
@@ -962,5 +961,5 @@
 				sg =s0*(1.0-s)+s*s1;    
 		} 
-		assert(on);
+		ISSMASSERT(on);
 		V.r= on->F(sg);
 		GV=VertexOnGeom(V,*on,sg);
Index: /issm/trunk/src/c/Bamgx/objects/SetOfE4.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/SetOfE4.cpp	(revision 3334)
+++ /issm/trunk/src/c/Bamgx/objects/SetOfE4.cpp	(revision 3335)
@@ -1,3 +1,2 @@
-#include <assert.h>
 #include "BamgObjects.h"
 
@@ -35,5 +34,5 @@
 
 		//check that head is not empty
-		assert(head);
+		ISSMASSERT(head);
 
 		//get n from h (usually h=ii)
@@ -62,5 +61,5 @@
 
 		//get n from h (usually h=ii)
-		assert(head);
+		ISSMASSERT(head);
 		n=head[h=Abs(ii)%nx];
 
Index: /issm/trunk/src/c/Bamgx/objects/Triangles.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/Triangles.cpp	(revision 3334)
+++ /issm/trunk/src/c/Bamgx/objects/Triangles.cpp	(revision 3335)
@@ -3,5 +3,4 @@
 #include <cmath>
 #include <ctime>
-#include <assert.h>
 
 #include "BamgObjects.h"
@@ -459,5 +458,5 @@
 						j0 = i0%2;
 						i0 = i0/2;
-						assert(v==edges[i0 ].v[j0]);
+						ISSMASSERT(v==edges[i0 ].v[j0]);
 						edges[i ].adj[j ] =edges +i0;
 						edges[i0].adj[j0] =edges +i ;
@@ -759,5 +758,5 @@
 			for (i=0;i<NbVerticesOnGeomVertex;i++){
 				VertexOnGeom &v=VerticesOnGeomVertex[i];
-				assert(v.OnGeomVertex());
+				ISSMASSERT(v.OnGeomVertex());
 				bamgmesh->VerticesOnGeometricVertex[i*2+0]=Number((Vertex*)v)+1; //back to Matlab indexing
 				bamgmesh->VerticesOnGeometricVertex[i*2+1]=Gh.Number((GeometricalVertex*)v)+1; //back to Matlab indexing
@@ -814,5 +813,5 @@
 					k=Number(triangles[i].TriangleAdj(j));
 					if (reft[k]>=0){
-						assert(3*num+j<3*(nbt-NbOutT));
+						ISSMASSERT(3*num+j<3*(nbt-NbOutT));
 						bamgmesh->ElementConnectivity[3*num+j]=k+1; // back to Matlab indexing
 					}
@@ -831,5 +830,5 @@
 			k=0;
 			for(j=head_1[i];j!=-1;j=next_1[j]){
-				assert(connectivitymax_1*i+k < connectivitymax_1*nbv);
+				ISSMASSERT(connectivitymax_1*i+k < connectivitymax_1*nbv);
 				bamgmesh->NodalElementConnectivity[connectivitymax_1*i+k]=floor(j/3)+1;
 				k++;
@@ -876,5 +875,5 @@
 			k=0;
 			for(j=head_2[i];j!=-1;j=next_2[j]){
-				assert(connectivitymax_2*i+k < connectivitymax_2*nbv);
+				ISSMASSERT(connectivitymax_2*i+k < connectivitymax_2*nbv);
 				num=(int)bamgmesh->ElementEdges[int(j/2)*i2+0];
 				if (i+1==num){ //carefull, ElementEdge is in M indexing
@@ -2211,5 +2210,5 @@
 				i1=Number(edges[i][0]);
 				i2=Number(edges[i][1]);
-				assert(i1>=0 && i1<nbv && i2>=0 && i2<nbv);
+				ISSMASSERT(i1>=0 && i1<nbv && i2>=0 && i2<nbv);
 				splitvertex[i1]++;
 				splitvertex[i2]++;
@@ -2225,5 +2224,5 @@
 			}
 		}
-		assert(k==NbCrackedEdges);
+		ISSMASSERT(k==NbCrackedEdges);
 
 		//Add new vertices
@@ -2239,5 +2238,5 @@
 				}
 			}
-			assert(num==NbCrackedVertices);
+			ISSMASSERT(num==NbCrackedVertices);
 		}
 		delete [] splitvertex;
@@ -2257,5 +2256,5 @@
 			Triangle* tbegin=vertices[i1].t;
 			k=vertices[i1].vint;//local number of i in triangle tbegin
-			assert(Number((*tbegin)[k])==Number(vertices[i1]));
+			ISSMASSERT(Number((*tbegin)[k])==Number(vertices[i1]));
 
 			//Now, we are going to go through the adjacent triangle that hold i1 till
@@ -2283,13 +2282,13 @@
 						if (Edgeflags[i]==0){
 							//first element
-							CrackedEdges[k].a=ta.t;
-							CrackedEdges[k].length=Norme2((*ta.t)[j1].r-(*ta.t)[j2].r);
-							CrackedEdges[k].normal=Orthogonal((*ta.t)[j1].r-(*ta.t)[j2].r);
+							CrackedEdges[i].a=ta.t;
+							CrackedEdges[i].length=Norme2((*ta.t)[j1].r-(*ta.t)[j2].r);
+							CrackedEdges[i].normal=Orthogonal((*ta.t)[j1].r-(*ta.t)[j2].r);
 						}
 						else{
 							//Second element -> to renumber
-							CrackedEdges[k].b=ta.t;
-							CrackedEdges[k].length=Norme2((*ta.t)[j1].r-(*ta.t)[j2].r);
-							CrackedEdges[k].normal=Orthogonal((*ta.t)[j1].r-(*ta.t)[j2].r);
+							CrackedEdges[i].b=ta.t;
+							CrackedEdges[i].length=Norme2((*ta.t)[j1].r-(*ta.t)[j2].r);
+							CrackedEdges[i].normal=Orthogonal((*ta.t)[j1].r-(*ta.t)[j2].r);
 						}
 						Edgeflags[i]++;
@@ -3056,5 +3055,5 @@
 
 		//Check that background mesh and current mesh do have the same geometry
-		assert(&BTh.Gh==&Gh);
+		ISSMASSERT(&BTh.Gh==&Gh);
 		BTh.NbRef++; // add a ref to BackGround Mesh
 
@@ -3088,5 +3087,5 @@
 
 		//At this point there is NO vertex but vertices should be have been allocated by PreInit
-		assert(vertices);
+		ISSMASSERT(vertices);
 		for (i=0;i<Gh.nbv;i++){
 			if (Gh[i].Required()) {//Gh vertices Required
@@ -3104,10 +3103,10 @@
 				GeometricalVertex* gv=vog;
 				Vertex *bv = vog;
-				assert(gv->to); // use of Geom -> Th
+				ISSMASSERT(gv->to); // use of Geom -> Th
 				VertexOnBThVertex[NbVertexOnBThVertex++]=VertexOnVertex(gv->to,bv);
 				gv->to->m = bv->m; // for taking the metrix of the background mesh
 			}
 		}
-		assert(NbVertexOnBThVertex==NbVerticesOnGeomVertex);
+		ISSMASSERT(NbVertexOnBThVertex==NbVerticesOnGeomVertex);
 
 		/*STEP 2: reseed bounday edges*/
@@ -3197,5 +3196,5 @@
 
 						// New Curve phase 
-						assert(A0-vertices>=0 && A0-vertices<nbv);
+						ISSMASSERT(A0-vertices>=0 && A0-vertices<nbv);
 						if(ongequi->Required()){
 							GeometricalVertex *GA1 = *(*peequi)[1-k0equi].onGeometry;
@@ -3208,5 +3207,5 @@
 								k1 = 1-k0; // next vertex of the edge 
 								k1equi= 1 - k0equi;
-								assert(pe && ee.onGeometry);
+								ISSMASSERT(pe && ee.onGeometry);
 								ee.onGeometry->SetMark();
 								Vertex & v0=ee[0], & v1=ee[1];
@@ -3221,9 +3220,9 @@
 
 										//some checks
-										assert(sNew>=L0);
-										assert(LAB);
-										assert(vertices && nbv<nbvx);
-										assert(edges && nbe<nbex);
-										assert(VerticesOnGeomEdge && NbVerticesOnGeomEdge<NbVerticesOnGeomEdgex);
+										ISSMASSERT(sNew>=L0);
+										ISSMASSERT(LAB);
+										ISSMASSERT(vertices && nbv<nbvx);
+										ISSMASSERT(edges && nbe<nbex);
+										ISSMASSERT(VerticesOnGeomEdge && NbVerticesOnGeomEdge<NbVerticesOnGeomEdgex);
 
 										// new vertex on edge
@@ -3260,10 +3259,10 @@
 
 								//some checks
-								assert(ee.onGeometry->CurveNumber==ei.onGeometry->CurveNumber);
+								ISSMASSERT(ee.onGeometry->CurveNumber==ei.onGeometry->CurveNumber);
 								if (ee[k1].onGeometry->IsRequiredVertex()) {
-									assert(eeequi[k1equi].onGeometry->IsRequiredVertex());
+									ISSMASSERT(eeequi[k1equi].onGeometry->IsRequiredVertex());
 									register GeometricalVertex * GA1 = *eeequi[k1equi].onGeometry;
 									A1=GA1->to;// the vertex in new mesh
-									assert(A1-vertices>=0 && A1-vertices<nbv);
+									ISSMASSERT(A1-vertices>=0 && A1-vertices<nbv);
 									break;
 								}
@@ -3290,5 +3289,5 @@
 							PreviousNewEdge = e;
 
-							assert(i==NbCreatePointOnCurve);
+							ISSMASSERT(i==NbCreatePointOnCurve);
 						}
 					} //  end loop on equi curve 
@@ -3325,5 +3324,5 @@
 			}
 		}
-		assert(nbe!=0);
+		ISSMASSERT(nbe!=0);
 		delete [] bcurve;
 
@@ -4093,5 +4092,5 @@
 
 	//initialize ordre
-	assert(ordre);
+	ISSMASSERT(ordre);
 	for (i=0;i<nbv;i++) ordre[i]=0;
 
@@ -4127,6 +4126,6 @@
 			//If the edge already exists, add adjacency
 			else if(st[k]>=0) {
-				assert(!triangles[i].TriangleAdj(j));
-				assert(!triangles[st[k]/3].TriangleAdj((int) (st[k]%3)));
+				ISSMASSERT(!triangles[i].TriangleAdj(j));
+				ISSMASSERT(!triangles[st[k]/3].TriangleAdj((int) (st[k]%3)));
 
 				triangles[i].SetAdj2(j,triangles+st[k]/3,(int)(st[k]%3));
@@ -4287,5 +4286,5 @@
 					long k =edge4->SortAndAdd(v0?Number(v0):nbv,v1? Number(v1):nbv);
 
-					assert(st[k]>=0);
+					ISSMASSERT(st[k]>=0);
 					tta.SetAdj2(ja,savetriangles + st[k] / 3,(int) (st[k]%3));
 					ta.SetLock();
@@ -4305,5 +4304,5 @@
 		}
 	}
-	assert(savenbt+NbTfillHoll<=savenbtx);
+	ISSMASSERT(savenbt+NbTfillHoll<=savenbtx);
 
 	// copy of the outside triangles in saveTriangles 
Index: /issm/trunk/src/c/include/macros.h
===================================================================
--- /issm/trunk/src/c/include/macros.h	(revision 3334)
+++ /issm/trunk/src/c/include/macros.h	(revision 3335)
@@ -18,8 +18,11 @@
 #endif
 
+/*Assertion macro*/
+#define ISSMASSERT(statement)\
+  if (!(statement)) ISSMERROR(exprintf("Assertion %s failed, please report bug to an ISSM developer",#statement))
+
 /*The following macros hide the error exception handling in a matlab module. Just put 
  * MODULEBOOT(); and MODULEEND(); at the beginning and end of a module, and c++ exceptions 
  * will be trapped. Really nifty!*/
-
 #ifdef _SERIAL_
 
@@ -51,5 +54,4 @@
 		return 1;\
 	}
-
 #endif
 
Index: /issm/trunk/src/c/io/WriteData.cpp
===================================================================
--- /issm/trunk/src/c/io/WriteData.cpp	(revision 3334)
+++ /issm/trunk/src/c/io/WriteData.cpp	(revision 3335)
@@ -16,5 +16,4 @@
 
 #include <mex.h>
-#include <assert.h>
 
 /*Several prototypes for WriteData, according to type: */
@@ -211,5 +210,5 @@
 	fnames[++i] = "CrackedVertices";          fsize[i][0]=bm->CrackedVerticesSize[0];           fsize[i][1]=bm->CrackedVerticesSize[1];          fpointer[i]=&bm->CrackedVertices;
 	fnames[++i] = "CrackedEdges";             fsize[i][0]=bm->CrackedEdgesSize[0];              fsize[i][1]=bm->CrackedEdgesSize[1];             fpointer[i]=&bm->CrackedEdges;
-	assert(i==numfields-1);
+	ISSMASSERT(i==numfields-1);
 
 	/*Initialize Matlab structure*/
@@ -255,5 +254,5 @@
 	fnames[++i] = "CrackedEdges";    fsize[i][0]=bg->CrackedEdgesSize[0];    fsize[i][1]=bg->CrackedEdgesSize[1];    fpointer[i]=&bg->CrackedEdges;
 	fnames[++i] = "SubDomains";      fsize[i][0]=bg->SubDomainsSize[0];      fsize[i][1]=bg->SubDomainsSize[1];      fpointer[i]=&bg->SubDomains;
-	assert(i==numfields-1);
+	ISSMASSERT(i==numfields-1);
 
 	/*Initialize Matlab structure*/
Index: /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp
===================================================================
--- /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 3334)
+++ /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 3335)
@@ -4,9 +4,9 @@
 
 #include <stdio.h>
-#include <assert.h>
 
 #include "./trimesh.h"
-
+#include "../Exceptions/exceptions.h"
 #include "../Alloc/alloc.h"
+#include "../../include/macros.h"
 
 int IsGridOnRift(int* riftsegments, int nriftsegs, int grid){
@@ -968,5 +968,5 @@
 		/*Using the order vector, and the riftsegments_copy and riftspairs_copy, reorder the segments and the pairs: */
 		for (j=0;j<numsegs;j++){
-			assert(order[j]<numsegs);
+			ISSMASSERT(order[j]<numsegs);
 			*(riftsegments_copy+3*j+0)=*(riftsegments+3*order[j]+0);
 			*(riftsegments_copy+3*j+1)=*(riftsegments+3*order[j]+1);
