Index: /issm/trunk/src/mex/Bamg/Bamg.cpp
===================================================================
--- /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 3270)
+++ /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 3271)
@@ -77,10 +77,247 @@
 	Bamgx(&bamgmesh_out,&bamggeom_out,&bamgmesh_in,&bamggeom_in,&bamgopts);
 
-	/*write output datasets: */
-	WriteData(TRIANGLESOUT,bamgmesh_out.Triangles,bamgmesh_out.NumTriangles,4);
-	WriteData(VERTICESOUT,bamgmesh_out.Vertices,bamgmesh_out.NumVertices,3);
-	WriteData(SEGMENTSOUT,bamgmesh_out.Segments,bamgmesh_out.NumSegments,3);
-	WriteData(SEGMENTSMARKERSOUT,bamgmesh_out.SegmentsMarkers,bamgmesh_out.NumSegments,1);
-	WriteData(METRICOUT,bamgopts.metric,bamgmesh_in.NumVertices,3);
+	printf("ok0\n");
+
+	/*Variables*/
+	mxArray*    bamgmesh_mat=NULL;
+	mxArray*    pfield=NULL;
+	mxArray*    pfield2=NULL;
+	int         numfields=23;
+	const char* fnames[numfields];
+	mwSize      ndim=2;
+	mwSize      dimensions[2]={1,1};
+
+	fnames[0] = "NumTriangles";
+	fnames[1] = "Triangles";
+	fnames[2] = "NumVertices";
+	fnames[3] = "Vertices";
+	fnames[4] = "NumEdges";
+	fnames[5] = "Edges";
+	fnames[6] = "NumSegments";
+	fnames[7] = "Segments";
+	fnames[8] = "SegmentsMarkers";
+	fnames[9] = "NumCrackedEdges";
+	fnames[10] = "CrackedEdges";
+	fnames[11] = "NumQuadrilaterals";
+	fnames[12] = "Quadrilaterals";
+	fnames[13] = "NumVerticesOnGeometricVertex";
+	fnames[14] = "VerticesOnGeometricVertex";
+	fnames[15] = "NumVerticesOnGeometricEdge";
+	fnames[16] = "VerticesOnGeometricEdge";
+	fnames[17] = "NumEdgesOnGeometricEdge";
+	fnames[18] = "EdgesOnGeometricEdge";
+	fnames[19] = "NumSubDomains";
+	fnames[20] = "SubDomains";
+	fnames[21] = "NumSubDomainsFromGeom";
+	fnames[22] = "SubDomainsFromGeom";
+
+	bamgmesh_mat=mxCreateStructArray(ndim,dimensions,numfields,fnames);
+
+	printf("ok2\n");
+	  
+	mxSetField(bamgmesh_mat,0,"NumTriangles",mxCreateDoubleScalar(bamgmesh_out.NumTriangles)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,4);
+	mxSetN(pfield,bamgmesh_out.NumTriangles);
+	mxSetPr(pfield,bamgmesh_out.Triangles);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"Triangles",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumVertices",mxCreateDoubleScalar(bamgmesh_out.NumVertices)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,3);
+	mxSetN(pfield,bamgmesh_out.NumVertices);
+	mxSetPr(pfield,bamgmesh_out.Vertices);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"Vertices",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumEdges",mxCreateDoubleScalar(bamgmesh_out.NumEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,3);
+	mxSetN(pfield,bamgmesh_out.NumEdges);
+	mxSetPr(pfield,bamgmesh_out.Edges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"Edges",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumSegments",mxCreateDoubleScalar(bamgmesh_out.NumSegments)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,3);
+	mxSetN(pfield,bamgmesh_out.NumSegments);
+	mxSetPr(pfield,bamgmesh_out.Segments);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"Segments",pfield2);
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,1);
+	mxSetN(pfield,bamgmesh_out.NumSegments);
+	mxSetPr(pfield,bamgmesh_out.SegmentsMarkers);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"SegmentsMarkers",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumCrackedEdges",mxCreateDoubleScalar(bamgmesh_out.NumCrackedEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,2);
+	mxSetN(pfield,bamgmesh_out.NumCrackedEdges);
+	mxSetPr(pfield,bamgmesh_out.CrackedEdges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"CrackedEdges",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumQuadrilaterals",mxCreateDoubleScalar(bamgmesh_out.NumQuadrilaterals)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,5);
+	mxSetN(pfield,bamgmesh_out.NumQuadrilaterals);
+	mxSetPr(pfield,bamgmesh_out.Quadrilaterals);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"Quadrilaterals",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumVerticesOnGeometricVertex",mxCreateDoubleScalar(bamgmesh_out.NumVerticesOnGeometricVertex)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,2);
+	mxSetN(pfield,bamgmesh_out.NumVerticesOnGeometricVertex);
+	mxSetPr(pfield,bamgmesh_out.VerticesOnGeometricVertex);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"VerticesOnGeometricVertex",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumVerticesOnGeometricEdge",mxCreateDoubleScalar(bamgmesh_out.NumVerticesOnGeometricEdge)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,2);
+	mxSetN(pfield,bamgmesh_out.NumVerticesOnGeometricEdge);
+	mxSetPr(pfield,bamgmesh_out.VerticesOnGeometricEdge);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"VerticesOnGeometricEdge",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumEdgesOnGeometricEdge",mxCreateDoubleScalar(bamgmesh_out.NumEdgesOnGeometricEdge)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,2);
+	mxSetN(pfield,bamgmesh_out.NumEdgesOnGeometricEdge);
+	mxSetPr(pfield,bamgmesh_out.EdgesOnGeometricEdge);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"EdgesOnGeometricEdge",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumSubDomains",mxCreateDoubleScalar(bamgmesh_out.NumSubDomains)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,4);
+	mxSetN(pfield,bamgmesh_out.NumSubDomains);
+	mxSetPr(pfield,bamgmesh_out.SubDomains);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"SubDomains",pfield2);
+
+	mxSetField(bamgmesh_mat,0,"NumSubDomainsFromGeom",mxCreateDoubleScalar(bamgmesh_out.NumSubDomainsFromGeom)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,4);
+	mxSetN(pfield,bamgmesh_out.NumSubDomainsFromGeom);
+	mxSetPr(pfield,bamgmesh_out.SubDomainsFromGeom);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamgmesh_mat,0,"SubDomainsFromGeom",pfield2);
+
+	printf("ok3\n");
+
+
+	/*assign output datasets: */
+	printf("ok4\n");
+	*BAMGMESHOUT=bamgmesh_mat;
+	printf("ok5\n");
+
+	/*Variables*/
+	mxArray*    bamggeom_mat=NULL;
+	int         numfields2=14;
+	const char* fnames2[numfields];
+
+	fnames[0] = "NumVertices";
+	fnames[1] = "Vertices";
+	fnames[2] = "NumEdges";
+	fnames[3] = "Edges";
+	fnames[4] = "NumTangentAtEdges";
+	fnames[5] = "TangentAtEdges";
+	fnames[6] = "NumRequiredVertices";
+	fnames[7] = "RequiredVertices";
+	fnames[8] = "NumRequiredEdges";
+	fnames[9] = "RequiredEdges";
+	fnames[10]= "NumCrackedEdges";
+	fnames[11]= "CrackedEdges";
+	fnames[12]= "NumEdges";
+	fnames[13]= "SubDomains";
+
+	bamggeom_mat=mxCreateStructArray(ndim,dimensions,numfields,fnames);
+
+	mxSetField(bamggeom_mat,0,"NumVertices",mxCreateDoubleScalar(bamggeom_out.NumVertices)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,3);
+	mxSetN(pfield,bamggeom_out.NumVertices);
+	mxSetPr(pfield,bamggeom_out.Vertices);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"Vertices",pfield2);
+
+	mxSetField(bamggeom_mat,0,"NumEdges",mxCreateDoubleScalar(bamggeom_out.NumEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,3);
+	mxSetN(pfield,bamggeom_out.NumEdges);
+	mxSetPr(pfield,bamggeom_out.Edges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"Edges",pfield2);
+
+
+	mxSetField(bamggeom_mat,0,"NumTangentAtEdges",mxCreateDoubleScalar(bamggeom_out.NumTangentAtEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,4);
+	mxSetN(pfield,bamggeom_out.NumTangentAtEdges);
+	mxSetPr(pfield,bamggeom_out.TangentAtEdges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"TangentAtEdges",pfield2);
+
+	mxSetField(bamggeom_mat,0,"NumRequiredVertices",mxCreateDoubleScalar(bamggeom_out.NumRequiredVertices)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,1);
+	mxSetN(pfield,bamggeom_out.NumRequiredVertices);
+	mxSetPr(pfield,bamggeom_out.RequiredVertices);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"RequiredVertices",pfield2);
+
+	mxSetField(bamggeom_mat,0,"NumRequiredEdges",mxCreateDoubleScalar(bamggeom_out.NumRequiredEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,1);
+	mxSetN(pfield,bamggeom_out.NumRequiredEdges);
+	mxSetPr(pfield,bamggeom_out.RequiredEdges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"RequiredEdges",pfield2);
+
+	mxSetField(bamggeom_mat,0,"NumCrackedEdges",mxCreateDoubleScalar(bamggeom_out.NumCrackedEdges)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,2);
+	mxSetN(pfield,bamggeom_out.NumCrackedEdges);
+	mxSetPr(pfield,bamggeom_out.CrackedEdges);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"CrackedEdges",pfield2);
+
+	mxSetField(bamggeom_mat,0,"NumSubDomains",mxCreateDoubleScalar(bamggeom_out.NumSubDomains)); 
+
+	pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+	mxSetM(pfield,4);
+	mxSetN(pfield,bamggeom_out.NumSubDomains);
+	mxSetPr(pfield,bamggeom_out.SubDomains);
+	mexCallMATLAB(1,&pfield2,1,&pfield,"'");//transpose
+	mxSetField(bamggeom_mat,0,"SubDomains",pfield2);
+
+	/*assign output datasets: */
+	printf("ok4\n");
+	*BAMGGEOMOUT=bamggeom_mat;
+	printf("ok5\n");
 
 	/*Free ressources: */
Index: /issm/trunk/src/mex/Bamg/Bamg.h
===================================================================
--- /issm/trunk/src/mex/Bamg/Bamg.h	(revision 3270)
+++ /issm/trunk/src/mex/Bamg/Bamg.h	(revision 3271)
@@ -23,13 +23,10 @@
 
 /* serial output macros: */
-#define TRIANGLESOUT       (mxArray**)&plhs[0]
-#define VERTICESOUT        (mxArray**)&plhs[1]
-#define SEGMENTSOUT        (mxArray**)&plhs[2]
-#define SEGMENTSMARKERSOUT (mxArray**)&plhs[3]
-#define METRICOUT          (mxArray**)&plhs[4]
+#define BAMGMESHOUT    (mxArray**)&plhs[0]
+#define BAMGGEOMOUT    (mxArray**)&plhs[1]
 
 /* serial arg counts: */
 #undef NLHS
-#define NLHS  5
+#define NLHS  2
 #undef NRHS
 #define NRHS  3
