Index: /issm/trunk/src/c/Bamgx/Bamgx.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/Bamgx.cpp	(revision 3216)
+++ /issm/trunk/src/c/Bamgx/Bamgx.cpp	(revision 3217)
@@ -23,5 +23,5 @@
 using namespace std;
 
-int Bamgx(BamgMesh* bamgmesh,BamgGeom* bamggeom,BamgOpts* bamgopts){
+int Bamgx(BamgMesh* bamgmesh_out,BamgGeom* bamggeom_out,BamgMesh* bamgmesh_in,BamgGeom* bamggeom_in,BamgOpts* bamgopts){
 
 	/*Bamg options*/
@@ -66,10 +66,10 @@
 	/*If no mesh in input, generate one*/
 
-	if(bamgmesh->NumTriangles==0){
+	if(bamgmesh_in->NumTriangles==0){
 		/*Mesh generation {{{1*/
 
 		if (verbosity>0) printf("Construction of a mesh from a given geometry\n");
 		if (verbosity>1) printf("   Processing geometry...\n");
-		Geometry Gh(bamggeom,bamgopts);
+		Geometry Gh(bamggeom_in,bamgopts);
 		if (verbosity>10){
 			Gh.Echo();
@@ -98,7 +98,7 @@
 		//Build output
 		if (verbosity>1) printf("   Write Mesh...\n");
-		Th.WriteMesh(bamgmesh,bamgopts);
+		Th.WriteMesh(bamgmesh_out,bamgopts);
 		if (verbosity>1) printf("   Write Geometry...\n");
-		Gh.WriteGeometry(bamggeom,bamgopts);
+		Gh.WriteGeometry(bamggeom_out,bamgopts);
 
 		//clean up
@@ -114,5 +114,5 @@
 		if (verbosity>0) printf("Anisotropic mesh adaptation\n");
 		if (verbosity>1) printf("   Processing initial mesh and geometry...\n");
-		Triangles BTh(bamgmesh,bamgopts); 
+		Triangles BTh(bamgmesh_in,bamgopts); 
 		hmin = Max(hmin,BTh.MinimalHmin());
 		hmax = Min(hmax,BTh.MaximalHmax());
@@ -132,8 +132,8 @@
 			for (Int4 iv=0;iv<BTh.nbv;iv++) BTh[iv].m = Mhmax;
 			// change using hVertices if required
-			if (bamgmesh->hVertices){
+			if (bamgmesh_in->hVertices){
 				for (i=0;i<BTh.nbv;i++){
-					if (!isnan(bamgmesh->hVertices[i])){
-						BTh[i].m=Metric((Real4)bamgmesh->hVertices[i]);
+					if (!isnan(bamgmesh_in->hVertices[i])){
+						BTh[i].m=Metric((Real4)bamgmesh_in->hVertices[i]);
 					}
 				}
@@ -177,7 +177,7 @@
 		//Build output
 		if (verbosity>1) printf("   Write Mesh...\n");
-		Th.WriteMesh(bamgmesh,bamgopts);
+		Th.WriteMesh(bamgmesh_out,bamgopts);
 		if (verbosity>1) printf("   Write Geometry...\n");
-		Th.Gh.WriteGeometry(bamggeom,bamgopts);
+		Th.Gh.WriteGeometry(bamggeom_out,bamgopts);
 		if (verbosity>1) printf("   Write Metric...\n");
 		BTh.WriteMetric(bamgopts);
Index: /issm/trunk/src/c/Bamgx/Bamgx.h
===================================================================
--- /issm/trunk/src/c/Bamgx/Bamgx.h	(revision 3216)
+++ /issm/trunk/src/c/Bamgx/Bamgx.h	(revision 3217)
@@ -9,5 +9,5 @@
 
 /* local prototypes: */
-int     Bamgx(BamgMesh* bamgmesh,BamgGeom* bamggeom,BamgOpts* bamgopts);
+int     Bamgx(BamgMesh* bamgmesh_out,BamgGeom* bamggeom_out,BamgMesh* bamgmesh_in,BamgGeom* bamggeom_in,BamgOpts* bamgopts);
 
 #endif  /* _BAMGX_H */
Index: /issm/trunk/src/c/Bamgx/objects/Geometry.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/Geometry.cpp	(revision 3216)
+++ /issm/trunk/src/c/Bamgx/objects/Geometry.cpp	(revision 3217)
@@ -74,10 +74,13 @@
 		int i,count;
 
+		/*Get options*/
 		verbose=bamgopts->verbose;
+
+		/*Initialize output*/
+		BamgGeomInit(bamggeom);
 
 		//Vertices
 		if(verbose>5) printf("      writing Vertices\n");
 		bamggeom->NumVertices=nbv;
-		xfree((void**)&bamggeom->Vertices);
 		if (nbv){
 			bamggeom->Vertices=(double*)xmalloc(3*nbv*sizeof(double));
@@ -98,5 +101,4 @@
 		if(verbose>5) printf("      writing Edges\n");
 		bamggeom->NumEdges=nbe;
-		xfree((void**)&bamggeom->Edges);
 		if (nbe){
 			bamggeom->Edges=(double*)xmalloc(3*nbe*sizeof(double));
@@ -123,5 +125,4 @@
 		if(verbose>5) printf("      writing CrackedEdges\n");
 		bamggeom->NumCrackedEdges=nbcracked;
-		xfree((void**)&bamggeom->CrackedEdges);
 		if (nbcracked){
 			bamggeom->CrackedEdges=(double*)xmalloc(2*nbcracked*sizeof(double));
@@ -144,5 +145,4 @@
 		if(verbose>5) printf("      writing RequiredEdges\n");
 		bamggeom->NumRequiredEdges=nbreq;
-		xfree((void**)&bamggeom->RequiredEdges);
 		if (nbreq){
 			bamggeom->RequiredEdges=(double*)xmalloc(1*nbreq*sizeof(double));
@@ -164,5 +164,4 @@
 		if(verbose>5) printf("      writing RequiredVertices\n");
 		bamggeom->NumRequiredVertices=nbreqv;
-		xfree((void**)&bamggeom->RequiredVertices);
 		if (nbreqv){
 			bamggeom->RequiredVertices=(double*)xmalloc(1*nbreqv*sizeof(double));
@@ -182,5 +181,4 @@
 		if(verbose>5) printf("      writing SubDomains\n");
 		bamggeom->NumSubDomains=NbSubDomains;
-		xfree((void**)&bamggeom->SubDomains);
 		if (NbSubDomains){
 			bamggeom->SubDomains=(double*)xmalloc(4*NbSubDomains*sizeof(double));
@@ -199,5 +197,4 @@
 		if(verbose>5) printf("      writing TangentAtEdges\n");
 		bamggeom->NumTangentAtEdges=nbtan;
-		xfree((void**)&bamggeom->TangentAtEdges);
 		if (nbtan){
 			bamggeom->TangentAtEdges=(double*)xmalloc(4*nbtan*sizeof(double));
Index: /issm/trunk/src/c/Bamgx/objects/Triangles.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/objects/Triangles.cpp	(revision 3216)
+++ /issm/trunk/src/c/Bamgx/objects/Triangles.cpp	(revision 3217)
@@ -536,5 +536,10 @@
 
 		int i,j,k,num;
+		/*Get options*/
 		int verbose=bamgopts->verbose;
+
+		/*Initialize output*/
+		BamgMeshInit(bamgmesh);
+
 
 		//renumber
@@ -552,5 +557,4 @@
 		if(verbose>5) printf("      writing Vertices\n");
 		bamgmesh->NumVertices=nbv;
-		xfree((void**)&bamgmesh->Vertices);
 		if (nbv){
 			bamgmesh->Vertices=(double*)xmalloc(3*nbv*sizeof(double));
@@ -568,5 +572,4 @@
 		if(verbose>5) printf("      writing Edges\n");
 		bamgmesh->NumEdges=nbe;
-		xfree((void**)&bamgmesh->Edges);
 		int NumSegments=0;
 		if (nbe){
@@ -609,6 +612,4 @@
 			}
 		}
-		xfree((void**)&bamgmesh->Segments);
-		xfree((void**)&bamgmesh->SegmentsMarkers);
 		bamgmesh->NumSegments=NumSegments;
 		bamgmesh->Segments=(double*)xmalloc(3*NumSegments*sizeof(double));
@@ -658,5 +659,4 @@
 		if(verbose>5) printf("      writing CrackedEdges\n");
 		bamgmesh->NumCrackedEdges=NbCrackedEdges;
-		xfree((void**)&bamgmesh->CrackedEdges);
 		if (NbCrackedEdges){
 			bamgmesh->CrackedEdges=(double*)xmalloc(2*NbCrackedEdges*sizeof(double));
@@ -675,5 +675,4 @@
 		num=0;
 		bamgmesh->NumTriangles=k;
-		xfree((void**)&bamgmesh->Triangles);
 		if (k){
 			bamgmesh->Triangles=(double*)xmalloc(4*k*sizeof(double));
@@ -697,5 +696,4 @@
 		if(verbose>5) printf("      writing Quadrilaterals\n");
 		bamgmesh->NumQuadrilaterals=NbOfQuad;
-		xfree((void**)&bamgmesh->Quadrilaterals);
 		if (NbOfQuad){
 			bamgmesh->Quadrilaterals=(double*)xmalloc(5*NbOfQuad*sizeof(double));
@@ -721,5 +719,4 @@
 		if(verbose>5) printf("      writing SubDomains\n");
 		bamgmesh->NumSubDomains=NbSubDomains;
-		xfree((void**)&bamgmesh->SubDomains);
 		if (NbSubDomains){
 			bamgmesh->SubDomains=(double*)xmalloc(4*NbSubDomains*sizeof(double));
@@ -738,5 +735,4 @@
 		if(verbose>5) printf("      writing SubDomainsFromGeom\n");
 		bamgmesh->NumSubDomainsFromGeom=Gh.NbSubDomains;
-		xfree((void**)&bamgmesh->SubDomainsFromGeom);
 		if (Gh.NbSubDomains){
 			bamgmesh->SubDomainsFromGeom=(double*)xmalloc(4*Gh.NbSubDomains*sizeof(double));
@@ -755,5 +751,4 @@
 		if(verbose>5) printf("      writing VerticesOnGeometricVertex\n");
 		bamgmesh->NumVerticesOnGeometricVertex=NbVerticesOnGeomVertex;
-		xfree((void**)&bamgmesh->VerticesOnGeometricVertex);
 		if (NbVerticesOnGeomVertex){
 			bamgmesh->VerticesOnGeometricVertex=(double*)xmalloc(2*NbVerticesOnGeomVertex*sizeof(double));
@@ -774,5 +769,4 @@
 		if(verbose>5) printf("      writing VerticesOnGeometricEdge\n");
 		bamgmesh->NumVerticesOnGeometricEdge=NbVerticesOnGeomEdge;
-		xfree((void**)&bamgmesh->VerticesOnGeometricEdge);
 		if (NbVerticesOnGeomEdge){
 			bamgmesh->VerticesOnGeometricEdge=(double*)xmalloc(3*NbVerticesOnGeomEdge*sizeof(double));
@@ -798,5 +792,4 @@
 		}
 		bamgmesh->NumEdgesOnGeometricEdge=k;
-		xfree((void**)&bamgmesh->EdgesOnGeometricEdge);
 		if (k){
 			bamgmesh->EdgesOnGeometricEdge=(double*)xmalloc(2*(int)k*sizeof(double));
