Index: /issm/trunk/src/c/Bamgx/Bamgx.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/Bamgx.cpp	(revision 2771)
+++ /issm/trunk/src/c/Bamgx/Bamgx.cpp	(revision 2772)
@@ -82,6 +82,4 @@
 	double* elements=NULL;
 
-	printf("NumVertices = %i\nNumEdges = %i\n",bamggeom->NumVertices,bamggeom->NumEdges);
-
 	/*Recover options from inputs: */
 	if(splitpbedge)SplitEdgeWith2Boundary=1;
@@ -111,8 +109,6 @@
 
 	if(1){
-		if (verbosity) 
-		 printf("Construction of a mesh from a given geometry\n");
-
-		Geometry Gh(bamgargs->geomfile);
+		if (verbosity>0) printf("Construction of a mesh from a given geometry\n");
+		Geometry Gh(bamggeom);
 		hmin = Max(hmin,Gh.MinimalHmin());
 		hmax = Min(hmax,Gh.MaximalHmax());
@@ -131,5 +127,5 @@
 		Triangles Th(nbvx,Gh);
 
-		/*Build output{{{2*/
+		/*Build output {{{1*/
 		nelout=Th.nbt-Th.NbOutT; //number of triangles - number of external triangles
 		nodsout=Th.nbv;
@@ -163,5 +159,6 @@
 
 		return noerr;
-		/*}}}2*/
+		/*}}}1*/
+
 	}
 
Index: /issm/trunk/src/c/Bamgx/Mesh2.h
===================================================================
--- /issm/trunk/src/c/Bamgx/Mesh2.h	(revision 2771)
+++ /issm/trunk/src/c/Bamgx/Mesh2.h	(revision 2772)
@@ -28,4 +28,6 @@
 #ifndef _MESH2_H_
 #define _MESH2_H_
+
+#include "../objects/objects.h"
 
 #include <stdlib.h>
@@ -982,4 +984,5 @@
   Real8 MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);}
   void ReadGeometry(const char * ) ;
+  void ReadGeometry(BamgGeom* bamggeom);
   void ReadGeometry(MeshIstream & ,const char *)  ;
 
@@ -987,4 +990,5 @@
   Geometry() {EmptyGeometry();}// empty Geometry
   void AfterRead();
+  Geometry(BamgGeom* bamggeom) {EmptyGeometry();OnDisk=1;ReadGeometry(bamggeom);AfterRead();}
   Geometry(const char * filename) {EmptyGeometry();OnDisk=1;ReadGeometry(filename);AfterRead();}
 
Index: /issm/trunk/src/c/Bamgx/MeshRead.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/MeshRead.cpp	(revision 2771)
+++ /issm/trunk/src/c/Bamgx/MeshRead.cpp	(revision 2772)
@@ -976,5 +976,5 @@
 
   ReadFromMatlabMesh(elements,x,y,nel,nods,NBV,cutoffradian);
-printf("ok2\n");
+  printf("ok2\n");
 
   SetIntCoor();
@@ -986,4 +986,5 @@
 
 }
+
 void Geometry::ReadGeometry(const char * filename)
 {
@@ -995,4 +996,257 @@
   MeshIstream f_in (filename);
   ReadGeometry(f_in,filename);
+}
+
+void Geometry::ReadGeometry(BamgGeom* bamggeom){
+
+	int verbose=1;
+	assert(empty());
+	nbiv=nbv=nbvx=0;
+	nbe=nbt=nbtx=0;
+	NbOfCurves=0;
+
+	Real8 Hmin = HUGE_VAL;// the infinie value 
+	Int4 hvertices=0;
+	int i,j,k,n;
+
+	//initialize some variables
+	int Version=1,dim=2;
+	nbv=bamggeom->NumVertices;
+	nbe=bamggeom->NumEdges;
+	nbvx = nbv;
+	nbiv = nbv;
+
+	//some checks
+	if(verbose>3) printf("Enter ReadGeometry\n"); 
+	if (bamggeom->NumVertices<=0 || bamggeom->Vertices==NULL){
+		throw ErrorException(__FUNCT__,exprintf("the domain provided does not contain any vertex"));
+	}
+	if (bamggeom->NumEdges<=0 || bamggeom->Edges==NULL){
+		throw ErrorException(__FUNCT__,exprintf("the domain provided does not contain any edge"));
+	}
+
+	//Vertices
+	if (bamggeom->Vertices){
+		if(verbose>3) printf("Reading Vertices\n");
+		vertices = new GeometricalVertex[nbvx];
+		for (i=0;i<nbv;i++) {
+			vertices[i].r.x=(double)bamggeom->Vertices[i*3+0];
+			vertices[i].r.y=(double)bamggeom->Vertices[i*3+1];
+			vertices[i].ReferenceNumber=(Int4)bamggeom->Vertices[i*3+2];
+			vertices[i].DirOfSearch=NoDirOfSearch;
+			vertices[i].color =0;
+			vertices[i].Set();
+		}
+		//find domain extrema for pmin,pmax
+		pmin =  vertices[0].r;
+		pmax =  vertices[0].r;
+		for (i=0;i<nbv;i++) {
+			pmin.x = Min(pmin.x,vertices[i].r.x);
+			pmin.y = Min(pmin.y,vertices[i].r.y);
+			pmax.x = Max(pmax.x,vertices[i].r.x);
+			pmax.y = Max(pmax.y,vertices[i].r.y);
+		}
+		R2 DD05 = (pmax-pmin)*0.05;
+		pmin -=  DD05;
+		pmax +=  DD05;
+		coefIcoor= (MaxICoor)/(Max(pmax.x-pmin.x,pmax.y-pmin.y));
+		if(coefIcoor <=0){
+			throw ErrorException(__FUNCT__,exprintf("coefIcoor should be positive"));
+		}
+	}
+	else{
+		throw ErrorException(__FUNCT__,exprintf("No Vertex provided"));
+	}
+
+	//Edges
+	if (bamggeom->Edges){
+		int i1,i2;
+		R2 zero2(0,0);
+		Real4 *len =0;
+
+		if(verbose>3) printf("Reading Edges\n");
+		edges = new GeometricalEdge[nbe];
+
+		if (!hvertices) {
+			len = new Real4[nbv];
+			for(i=0;i<nbv;i++)
+			 len[i]=0;
+		}
+
+		for (i=0;i<nbe;i++){
+			i1=(int)bamggeom->Edges[i*3+0]-1; //-1 for C indexing
+			i2=(int)bamggeom->Edges[i*3+1]-1; //-1 for C indexing
+			edges[i].ref=(Int4)bamggeom->Edges[i*3+2];
+			edges[i].v[0]=  vertices + i1;
+			edges[i].v[1]=  vertices + i2;
+			R2 x12 = vertices[i2].r-vertices[i1].r;
+			Real8 l12=sqrt((x12,x12));
+			edges[i].tg[0]=zero2;
+			edges[i].tg[1]=zero2;
+			edges[i].SensAdj[0] = edges[i].SensAdj[1] = -1;
+			edges[i].Adj[0] = edges[i].Adj[1] = 0;
+			edges[i].flag = 0;
+			if (!hvertices) {
+				vertices[i1].color++;
+				vertices[i2].color++;
+				len[i1] += l12;
+				len[i2] += l12;
+			}
+
+			Hmin = Min(Hmin,l12);
+		}
+
+		// definition  the default of the given mesh size 
+		if (!hvertices){
+			for (i=0;i<nbv;i++) 
+			 if (vertices[i].color > 0) 
+			  vertices[i].m=  Metric(len[i] /(Real4) vertices[i].color);
+			 else 
+			  vertices[i].m=  Metric(Hmin);
+			delete [] len;
+		}
+	}
+	else{
+		throw ErrorException(__FUNCT__,exprintf("No edges provided"));
+	}
+
+	//hVertices
+	if(bamggeom->hVertices){
+		if(verbose>3) printf("Reading hVertices\n");
+		for (i=0;i< nbv;i++){
+			vertices[i].m=Metric((Real4)bamggeom->hVertices[i]);
+		}
+	}
+	else{
+		if(verbose>3) printf("No hVertices found\n");
+	}
+
+	//MetricVertices
+	if(bamggeom->MetricVertices){
+		if(verbose>3) printf("Reading MetricVertices\n");
+		hvertices=1;
+		for (i=0;i< nbv;i++) {
+			vertices[i].m = Metric((Real4)bamggeom->MetricVertices[i*3+0],(Real4)bamggeom->MetricVertices[i*3+1],(Real4)bamggeom->MetricVertices[i*3+2]);
+		}
+	}
+	else{
+		if(verbose>3) printf("No MetricVertices found\n");
+	}
+
+	//h1h2VpVertices
+	if(bamggeom->h1h2VpVertices){
+		if(verbose>3) printf("Reading h1h2VpVertices\n");
+		Real4 h1,h2,v1,v2;
+		hvertices =1;
+		for (i=0;i< nbv;i++) {
+			h1=(Real4)bamggeom->MetricVertices[i*4+0];
+			h2=(Real4)bamggeom->MetricVertices[i*4+1];
+			v1=(Real4)bamggeom->MetricVertices[i*4+2];
+			v2=(Real4)bamggeom->MetricVertices[i*4+3];
+			vertices[i].m = Metric(MatVVP2x2(1/(h1*h1),1/(h2*h2),D2(v1,v2)));
+		}
+	}
+	else{
+		if(verbose>3) printf("No h1h2VpVertices found\n");
+	}
+
+	//MaximalAngleOfCorner
+	if (bamggeom->MaximalAngleOfCorner){
+		if(verbose>3) printf("Reading MaximalAngleOfCorner\n");
+		MaximalAngleOfCorner=bamggeom->MaximalAngleOfCorner*Pi/180;
+	}
+	else{
+		if(verbose>3) printf("No MaximalAngleOfCorner found\n");
+	}
+
+	//TangentAtEdges
+	if (bamggeom->TangentAtEdges){
+		if(verbose>3) printf("Reading TangentAtEdges");
+		int n,i,j,k;
+		R2 tg;
+
+		n=bamggeom->NumTangentAtEdges;
+		for (k=0;k<n;k++) {
+			i=(int)bamggeom->TangentAtEdges[k*4+0]-1; //for C indexing
+			j=(int)bamggeom->TangentAtEdges[k*4+1]-1; //for C indexing
+			tg.x=bamggeom->TangentAtEdges[k*4+2];
+			tg.y=bamggeom->TangentAtEdges[k*4+3];
+			if (j!=0 && j!=1){
+				throw ErrorException(__FUNCT__,exprintf("TangentAtEdges second index should be 1 or 2 only"));
+			}
+			edges[i].tg[j] = tg;
+		}
+	}
+	else{
+		if(verbose>3) printf("No TangentAtEdges found\n");
+	}
+
+	//Corners
+	if(bamggeom->Corners){
+		if(verbose>3) printf("Reading Corners");
+		n=bamggeom->NumCorners;
+		for (i=0;i<n;i++) {     
+			j=(int)bamggeom->Corners[i]-1; //for C indexing
+			if (j>nbv-1 || j<0){
+				throw ErrorException(__FUNCT__,exprintf("Bad corner definition: should in [0 %i]",nbv));
+			}
+			vertices[j].SetCorner();
+			vertices[j].SetRequired();  }
+	}
+	else{
+		if(verbose>3) printf("No Corners found\n");
+	}
+
+	//RequiredVertices
+	if(bamggeom->RequiredVertices){
+		if(verbose>3) printf("Reading RequiredVertices");
+		n=bamggeom->NumRequiredVertices;
+		for (i=0;i<n;i++) {     
+			j=(int)bamggeom->RequiredVertices[i]-1; //for C indexing
+			if (j>nbv-1 || j<0){
+				throw ErrorException(__FUNCT__,exprintf("Bad RequiredVerticess  definition: should in [0 %i]",nbv));
+			}
+			vertices[j].SetRequired();  }
+	}
+	else{
+		if(verbose>3) printf("No RequiredVertices found\n");
+	}
+
+	//RequiredEdges
+	if(bamggeom->RequiredEdges){
+		if(verbose>3) printf("Reading RequiredEdges");
+		n=bamggeom->NumRequiredEdges;
+		for (i=0;i<n;i++) {     
+			j=(int)bamggeom->RequiredEdges[i]-1; //for C indexing
+			if (j>nbe-1 || j<0){
+				throw ErrorException(__FUNCT__,exprintf("Bad RequiredEdges definition: should in [0 %i]",nbv));
+			}
+			edges[j].SetRequired();  }
+	}
+	else{
+		if(verbose>3) printf("No RequiredEdges found\n");
+	}
+
+	//SubDomain
+	if(bamggeom->SubDomain){
+		Int4 i0,i1,i2,i3;
+		if(verbose>3) printf("Reading SubDomain");
+		NbSubDomains=bamggeom->NumSubDomain;
+		subdomains = new GeometricalSubDomain[NbSubDomains];
+		for (i=0;i<NbSubDomains;i++) {
+			i0=(int)bamggeom->SubDomain[i*4+0];
+			i1=(int)bamggeom->SubDomain[i*4+1];
+			i2=(int)bamggeom->SubDomain[i*4+2];
+			i3=(int)bamggeom->SubDomain[i*4+3];
+			if (i0!=2) throw ErrorException(__FUNCT__,exprintf("Bad Subdomain definition: first number should be 2"));
+			if (i1>nbe || i1<=0) throw ErrorException(__FUNCT__,exprintf("Bad Subdomain definition: second number should in [1 %i]",nbe));
+			subdomains[i].edge=edges + (i1-1);
+			subdomains[i].sens = (int) i2;
+			subdomains[i].ref = i3;
+		}
+	}
+	else{
+		if(verbose>3) printf("No SubDomain found\n");
+	}
 }
 
Index: /issm/trunk/src/c/Bamgx/Metric.cpp
===================================================================
--- /issm/trunk/src/c/Bamgx/Metric.cpp	(revision 2771)
+++ /issm/trunk/src/c/Bamgx/Metric.cpp	(revision 2772)
@@ -42,6 +42,5 @@
 SaveMetricInterpole  LastMetricInterpole;
 
-void ReductionSimultanee( MetricAnIso M1,  MetricAnIso M2,double & l1,double & l2, D2xD2 & V) 
-{
+void ReductionSimultanee( MetricAnIso M1,  MetricAnIso M2,double & l1,double & l2, D2xD2 & V) {
   double a11=M1.a11,a21=M1.a21,a22=M1.a22;
   double b11=M2.a11,b21=M2.a21,b22=M2.a22;
@@ -108,6 +107,5 @@
 
 MetricAnIso Intersection(const MetricAnIso M1,const MetricAnIso M2) ;
-MetricAnIso Intersection(const MetricAnIso M1,const MetricAnIso M2) 
-{
+MetricAnIso Intersection(const MetricAnIso M1,const MetricAnIso M2) {
       D2xD2 M;
       double l1,l2;
@@ -121,7 +119,5 @@
 }
 
-MetricAnIso::MetricAnIso(const Real8  a[3],const  MetricAnIso m0,
-	   const  MetricAnIso m1,const  MetricAnIso m2 )
-{
+MetricAnIso::MetricAnIso(const Real8  a[3],const  MetricAnIso m0, const  MetricAnIso m1,const  MetricAnIso m2 ){
   MetricAnIso mab(a[0]*m0.a11 + a[1]*m1.a11 + a[2]*m2.a11,
 		  a[0]*m0.a21 + a[1]*m1.a21 + a[2]*m2.a21,
@@ -141,7 +137,5 @@
 }
 
- MetricAnIso::MetricAnIso( Real8  a,const  MetricAnIso ma,
-	                   Real8  b,const  MetricAnIso mb)
-{ 
+ MetricAnIso::MetricAnIso( Real8  a,const  MetricAnIso ma, Real8  b,const  MetricAnIso mb) { 
   MetricAnIso mab(a*ma.a11+b*mb.a11,a*ma.a21+b*mb.a21,a*ma.a22+b*mb.a22);
   MatVVP2x2 vab(mab);
@@ -160,6 +154,5 @@
 
 
- MatVVP2x2::MatVVP2x2(const MetricAnIso M) 
-{
+ MatVVP2x2::MatVVP2x2(const MetricAnIso M){
   double a11=M.a11,a21=M.a21,a22=M.a22;
   const double eps = 1.e-5;
Index: /issm/trunk/src/c/objects/BamgGeom.h
===================================================================
--- /issm/trunk/src/c/objects/BamgGeom.h	(revision 2771)
+++ /issm/trunk/src/c/objects/BamgGeom.h	(revision 2772)
@@ -9,9 +9,29 @@
 
 	int     NumVertices;
-	double* Vertices; 
+	double* Vertices;
+
 	int     NumEdges;
 	double* Edges;
+
 	double* hVertices;
+	double* MetricVertices;
+	double* h1h2VpVertices;
 
+	double  MaximalAngleOfCorner;
+
+	int     NumTangentAtEdges;
+	double* TangentAtEdges;
+
+	int     NumCorners;
+	double* Corners;
+
+	int     NumRequiredVertices;
+	double* RequiredVertices;
+
+	int     NumRequiredEdges;
+	double* RequiredEdges;
+
+	int     NumSubDomain;
+	double* SubDomain;
 };
 #endif
Index: /issm/trunk/src/mex/Bamg/Bamg.cpp
===================================================================
--- /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 2771)
+++ /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 2772)
@@ -38,6 +38,4 @@
 
 	/*create bamg geometry input*/
-	bamgargs.geomfile=geomfile;
-
 	bamggeom.NumVertices=NumVertices;
 	bamggeom.Vertices=Vertices;
@@ -45,4 +43,23 @@
 	bamggeom.Edges=Edges;
 	bamggeom.hVertices=hVertices;
+	bamggeom.Edges=Edges;
+	bamggeom.MetricVertices=NULL;
+	bamggeom.h1h2VpVertices=NULL;
+	bamggeom.MaximalAngleOfCorner=10;
+	bamggeom.NumTangentAtEdges=0;
+	bamggeom.TangentAtEdges=NULL;
+	bamggeom.NumCorners=0;
+	bamggeom.Corners=NULL;
+	bamggeom.NumRequiredVertices=0;
+	bamggeom.RequiredVertices=NULL;
+	bamggeom.NumRequiredEdges=0;
+	bamggeom.RequiredEdges=NULL;
+	bamggeom.NumSubDomain=0;
+	bamggeom.SubDomain=NULL;
+
+	/*create bamg mesh input*/
+	bamgargs.geomfile=geomfile;
+
+	/*create bamg mesh input*/
 
 	/*!Generate internal degree of freedom numbers: */
