Index: /issm/trunk/src/c/io/WriteData.cpp
===================================================================
--- /issm/trunk/src/c/io/WriteData.cpp	(revision 5171)
+++ /issm/trunk/src/c/io/WriteData.cpp	(revision 5172)
@@ -145,103 +145,4 @@
 }
 /*}}}*/
-/*FUNCTION WriteData(mxArray** pbamgmesh_mat,BamgMesh* bm){{{1*/
-void WriteData(mxArray** pbamgmesh_mat,BamgMesh* bm){
-
-	/*Output*/
-	mxArray*    bamgmesh_mat=NULL;
-
-	/*Intermediary*/
-	int         i,j;
-	mxArray*    pfield=NULL;
-	mxArray*    pfield2=NULL;
-	int         numfields=16;
-	const char* fnames[numfields];
-	int         fsize[numfields][2];
-	double**    fpointer[numfields];
-	mwSize      ndim=2;
-	mwSize      dimensions[2]={1,1};
-
-	/*Build fnames and fsize names and sizes of each field*/
-	i=-1;
-	fnames[++i] = "Triangles";                fsize[i][0]=bm->TrianglesSize[0];                 fsize[i][1]=bm->TrianglesSize[1];                fpointer[i]=&bm->Triangles;
-	fnames[++i] = "Vertices";                 fsize[i][0]=bm->VerticesSize[0];                  fsize[i][1]=bm->VerticesSize[1];                 fpointer[i]=&bm->Vertices;
-	fnames[++i] = "Edges";                    fsize[i][0]=bm->EdgesSize[0];                     fsize[i][1]=bm->EdgesSize[1];                    fpointer[i]=&bm->Edges;
-	fnames[++i] = "IssmSegments";             fsize[i][0]=bm->IssmSegmentsSize[0];              fsize[i][1]=bm->IssmSegmentsSize[1];             fpointer[i]=&bm->IssmSegments;
-	fnames[++i] = "IssmEdges";                fsize[i][0]=bm->IssmEdgesSize[0];                 fsize[i][1]=bm->IssmEdgesSize[1];                fpointer[i]=&bm->IssmEdges;
-	fnames[++i] = "Quadrilaterals";           fsize[i][0]=bm->QuadrilateralsSize[0];            fsize[i][1]=bm->QuadrilateralsSize[1];           fpointer[i]=&bm->Quadrilaterals;
-	fnames[++i] = "VerticesOnGeometricVertex";fsize[i][0]=bm->VerticesOnGeometricVertexSize[0]; fsize[i][1]=bm->VerticesOnGeometricVertexSize[1];fpointer[i]=&bm->VerticesOnGeometricVertex;
-	fnames[++i] = "VerticesOnGeometricEdge";  fsize[i][0]=bm->VerticesOnGeometricEdgeSize[0];   fsize[i][1]=bm->VerticesOnGeometricEdgeSize[1];  fpointer[i]=&bm->VerticesOnGeometricEdge;
-	fnames[++i] = "EdgesOnGeometricEdge";     fsize[i][0]=bm->EdgesOnGeometricEdgeSize[0];      fsize[i][1]=bm->EdgesOnGeometricEdgeSize[1];     fpointer[i]=&bm->EdgesOnGeometricEdge;
-	fnames[++i] = "SubDomains";               fsize[i][0]=bm->SubDomainsSize[0];                fsize[i][1]=bm->SubDomainsSize[1];               fpointer[i]=&bm->SubDomains;
-	fnames[++i] = "SubDomainsFromGeom";       fsize[i][0]=bm->SubDomainsFromGeomSize[0];        fsize[i][1]=bm->SubDomainsFromGeomSize[1];       fpointer[i]=&bm->SubDomainsFromGeom;
-	fnames[++i] = "ElementConnectivity";      fsize[i][0]=bm->ElementConnectivitySize[0];       fsize[i][1]=bm->ElementConnectivitySize[1];      fpointer[i]=&bm->ElementConnectivity;
-	fnames[++i] = "NodalConnectivity";        fsize[i][0]=bm->NodalConnectivitySize[0];         fsize[i][1]=bm->NodalConnectivitySize[1];        fpointer[i]=&bm->NodalConnectivity;
-	fnames[++i] = "NodalElementConnectivity"; fsize[i][0]=bm->NodalElementConnectivitySize[0];  fsize[i][1]=bm->NodalElementConnectivitySize[1]; fpointer[i]=&bm->NodalElementConnectivity;
-	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;
-	ISSMASSERT(i==numfields-1);
-
-	/*Initialize Matlab structure*/
-	bamgmesh_mat=mxCreateStructArray(ndim,dimensions,numfields,fnames);
-
-	/*Add every field to structure*/
-	for(i=0;i<numfields;i++){
-		pfield=mxCreateDoubleMatrix(0,0,mxREAL);
-		mxSetM(pfield,fsize[i][1]);
-		mxSetN(pfield,fsize[i][0]);
-		mxSetPr(pfield,*(fpointer[i]));
-		mexCallMATLAB(1,&pfield2,1,&pfield,"transpose");//transpose
-		mxSetField(bamgmesh_mat,0,fnames[i],pfield2);
-	}
-
-	/*Assign output pointer*/
-	*pbamgmesh_mat=bamgmesh_mat;
-}
-/*}}}*/
-/*FUNCTION WriteData(mxArray** pbamggeom_mat, BamgGeom* bg){{{1*/
-void WriteData(mxArray** pbamggeom_mat, BamgGeom* bg){
-
-	/*Output*/
-	mxArray*    bamggeom_mat=NULL;
-
-	/*Intermediary*/
-	int         i,j;
-	mxArray*    pfield=NULL;
-	mxArray*    pfield2=NULL;
-	int         numfields=7;
-	const char* fnames[numfields];
-	int         fsize[numfields][2];
-	double**    fpointer[numfields];
-	mwSize      ndim=2;
-	mwSize      dimensions[2]={1,1};
-
-	/*Build fnames and fsize names and sizes of each field*/
-	i=-1;
-	fnames[++i] = "Vertices";        fsize[i][0]=bg->VerticesSize[0];        fsize[i][1]=bg->VerticesSize[1];        fpointer[i]=&bg->Vertices;
-	fnames[++i] = "Edges";           fsize[i][0]=bg->EdgesSize[0];           fsize[i][1]=bg->EdgesSize[1];           fpointer[i]=&bg->Edges;
-	fnames[++i] = "TangentAtEdges";  fsize[i][0]=bg->TangentAtEdgesSize[0];  fsize[i][1]=bg->TangentAtEdgesSize[1];  fpointer[i]=&bg->TangentAtEdges;
-	fnames[++i] = "RequiredVertices";fsize[i][0]=bg->RequiredVerticesSize[0];fsize[i][1]=bg->RequiredVerticesSize[1];fpointer[i]=&bg->RequiredVertices;
-	fnames[++i] = "RequiredEdges";   fsize[i][0]=bg->RequiredEdgesSize[0];   fsize[i][1]=bg->RequiredEdgesSize[1];   fpointer[i]=&bg->RequiredEdges;
-	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;
-	ISSMASSERT(i==numfields-1);
-
-	/*Initialize Matlab structure*/
-	bamggeom_mat=mxCreateStructArray(ndim,dimensions,numfields,fnames);
-
-	/*Add every field tu structure*/
-	for(i=0;i<numfields;i++){
-		pfield=mxCreateDoubleMatrix(0,0,mxREAL);
-		mxSetM(pfield,fsize[i][1]);
-		mxSetN(pfield,fsize[i][0]);
-		mxSetPr(pfield,*(fpointer[i]));
-		mexCallMATLAB(1,&pfield2,1,&pfield,"transpose");//transpose
-		mxSetField(bamggeom_mat,0,fnames[i],pfield2);
-	}
-
-	/*Assign output pointer*/
-	*pbamggeom_mat=bamggeom_mat;
-}
-/*}}}*/
 
 #else
Index: /issm/trunk/src/c/io/io.h
===================================================================
--- /issm/trunk/src/c/io/io.h	(revision 5171)
+++ /issm/trunk/src/c/io/io.h	(revision 5172)
@@ -26,6 +26,4 @@
 void WriteData(mxArray** pdataref,double scalar);
 void WriteData(mxArray** pdataref,char* string);
-void WriteData(mxArray** pdataref,BamgMesh* bm);
-void WriteData(mxArray** pdataref,BamgGeom* bg);
 
 void WriteNodeSets(DataHandle* pdataref,NodeSets* nodesets);
Index: /issm/trunk/src/c/objects/Bamg/BamgGeom.cpp
===================================================================
--- /issm/trunk/src/c/objects/Bamg/BamgGeom.cpp	(revision 5171)
+++ /issm/trunk/src/c/objects/Bamg/BamgGeom.cpp	(revision 5172)
@@ -1,4 +1,5 @@
 #include "stdio.h"
 #include "../objects.h"
+#include "../../io/io.h"
 
 /*Constructors/Destructors*/
@@ -35,2 +36,82 @@
 }
 /*}}}*/
+
+/*Methods*/
+/*FUNCTION BamgGeom::GetMatlabStructureFields{{{1*/
+#ifdef _SERIAL_
+void BamgGeom::GetMatlabStructureFields(mxArray* matlab_struct){
+
+	int lines,cols;
+
+	FetchData(&this->Vertices,        &this->VerticesSize[0],        &this->VerticesSize[1],        mxGetField(matlab_struct,0,"Vertices"));
+	FetchData(&this->Edges,           &this->EdgesSize[0],           &this->EdgesSize[1],           mxGetField(matlab_struct,0,"Edges"));
+	FetchData(&this->Corners,         &this->CornersSize[0],         &this->CornersSize[1],         mxGetField(matlab_struct,0,"Corners"));
+	FetchData(&this->RequiredVertices,&this->RequiredVerticesSize[0],&this->RequiredVerticesSize[1],mxGetField(matlab_struct,0,"RequiredVertices"));
+	FetchData(&this->RequiredEdges,   &this->RequiredEdgesSize[0],   &this->RequiredEdgesSize[1],   mxGetField(matlab_struct,0,"RequiredEdges"));
+	FetchData(&this->CrackedEdges,    &this->CrackedEdgesSize[0],    &this->CrackedEdgesSize[1],    mxGetField(matlab_struct,0,"CrackedEdges"));
+	FetchData(&this->SubDomains,      &this->SubDomainsSize[0],      &this->SubDomainsSize[1],      mxGetField(matlab_struct,0,"SubDomains"));
+	FetchData(&this->hVertices,&lines,&cols,mxGetField(matlab_struct,0,"hVertices"));
+	if (this->hVertices && (cols!=1 || lines!=this->VerticesSize[0])){ISSMERROR("the size of 'hVertices' should be [%i %i]",this->VerticesSize[0],1);}
+
+}
+#endif
+/*}}}*/
+/*FUNCTION BamgGeom::SetMatlabStructureFields{{{1*/
+#ifdef _SERIAL_
+void BamgGeom::SetMatlabStructureFields(mxArray** matlab_struct){
+
+	/*Intermediary*/
+	int         i,i1,i2;
+	mxArray*    pfield=NULL;
+	mxArray*    pfield2=NULL;
+	mxArray*    output=NULL;
+	int         numfields=7;
+	const char* fnames[numfields];
+	int         fsize[numfields][2];
+	double**    fpointer[numfields];
+	mwSize      ndim=2;
+	mwSize      dimensions[2]={1,1};
+
+	/*Build fnames and fsize names and sizes of each field*/
+	i=-1;
+	fnames[++i] = "Vertices";        fsize[i][0]=this->VerticesSize[0];        fsize[i][1]=this->VerticesSize[1];        fpointer[i]=&this->Vertices;
+	fnames[++i] = "Edges";           fsize[i][0]=this->EdgesSize[0];           fsize[i][1]=this->EdgesSize[1];           fpointer[i]=&this->Edges;
+	fnames[++i] = "TangentAtEdges";  fsize[i][0]=this->TangentAtEdgesSize[0];  fsize[i][1]=this->TangentAtEdgesSize[1];  fpointer[i]=&this->TangentAtEdges;
+	fnames[++i] = "RequiredVertices";fsize[i][0]=this->RequiredVerticesSize[0];fsize[i][1]=this->RequiredVerticesSize[1];fpointer[i]=&this->RequiredVertices;
+	fnames[++i] = "RequiredEdges";   fsize[i][0]=this->RequiredEdgesSize[0];   fsize[i][1]=this->RequiredEdgesSize[1];   fpointer[i]=&this->RequiredEdges;
+	fnames[++i] = "CrackedEdges";    fsize[i][0]=this->CrackedEdgesSize[0];    fsize[i][1]=this->CrackedEdgesSize[1];    fpointer[i]=&this->CrackedEdges;
+	fnames[++i] = "SubDomains";      fsize[i][0]=this->SubDomainsSize[0];      fsize[i][1]=this->SubDomainsSize[1];      fpointer[i]=&this->SubDomains;
+	ISSMASSERT(i==numfields-1);
+
+	/*Initialize Matlab structure*/
+	output=mxCreateStructArray(ndim,dimensions,numfields,fnames);
+
+	/*Add every field tu structure*/
+	for(i=0;i<numfields;i++){
+
+		/*Copy field*/
+		double*  fieldcopy=NULL;
+		if (fsize[i][0]*fsize[i][1]){
+			fieldcopy=(double*)xmalloc(fsize[i][0]*fsize[i][1]*sizeof(double));
+			for(i1=0;i1<fsize[i][0];i1++){
+				for(i2=0;i2<fsize[i][1];i2++){
+					fieldcopy[fsize[i][1]*i1+i2]=*(*fpointer[i] + fsize[i][1]*i1+i2);
+				}
+			}
+		}
+
+		/*Set matlab field*/
+		pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+		mxSetM(pfield,fsize[i][1]);
+		mxSetN(pfield,fsize[i][0]);
+		mxSetPr(pfield,fieldcopy);
+		mexCallMATLAB(1,&pfield2,1,&pfield,"transpose");//transpose
+		mxSetField(output,0,fnames[i],pfield2);
+	}
+
+	/*Assign output*/
+	*matlab_struct=output;
+
+}
+#endif
+/*}}}*/
Index: /issm/trunk/src/c/objects/Bamg/BamgGeom.h
===================================================================
--- /issm/trunk/src/c/objects/Bamg/BamgGeom.h	(revision 5171)
+++ /issm/trunk/src/c/objects/Bamg/BamgGeom.h	(revision 5172)
@@ -4,4 +4,8 @@
 #ifndef _BAMGGEOM_H_
 #define _BAMGGEOM_H_
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
 
 class BamgGeom{
@@ -29,4 +33,9 @@
 		BamgGeom();
 		~BamgGeom();
+
+		#ifdef _SERIAL_
+		void GetMatlabStructureFields(mxArray* matlab_struct);
+		void SetMatlabStructureFields(mxArray** matlab_struct);
+		#endif
 };
 
Index: /issm/trunk/src/c/objects/Bamg/BamgMesh.cpp
===================================================================
--- /issm/trunk/src/c/objects/Bamg/BamgMesh.cpp	(revision 5171)
+++ /issm/trunk/src/c/objects/Bamg/BamgMesh.cpp	(revision 5172)
@@ -1,4 +1,5 @@
 #include "stdio.h"
 #include "../objects.h"
+#include "../../io/io.h"
 
 /*Constructors/Destructors*/
@@ -49,2 +50,92 @@
 }
 /*}}}*/
+
+/*Methods*/
+/*FUNCTION BamgMesh::GetMatlabStructureFields{{{1*/
+#ifdef _SERIAL_
+void BamgMesh::GetMatlabStructureFields(mxArray* matlab_struct){
+
+	int lines,cols;
+
+	FetchData(&this->Triangles,                &this->TrianglesSize[0],                &this->TrianglesSize[1],                mxGetField(matlab_struct,0,"Triangles"));
+	FetchData(&this->Vertices,                 &this->VerticesSize[0],                 &this->VerticesSize[1],                 mxGetField(matlab_struct,0,"Vertices"));
+	FetchData(&this->Edges,                    &this->EdgesSize[0],                    &this->EdgesSize[1],                    mxGetField(matlab_struct,0,"Edges"));
+	FetchData(&this->IssmSegments,             &this->IssmSegmentsSize[0],             &this->IssmSegmentsSize[1],             mxGetField(matlab_struct,0,"IssmSegments"));
+	FetchData(&this->CrackedEdges,            &this->CrackedEdgesSize[0],              &this->CrackedEdgesSize[1],             mxGetField(matlab_struct,0,"CrackedEdges"));
+	FetchData(&this->EdgesOnGeometricEdge,     &this->EdgesOnGeometricEdgeSize[0],     &this->EdgesOnGeometricEdgeSize[1],     mxGetField(matlab_struct,0,"EdgesOnGeometricEdge"));
+	FetchData(&this->VerticesOnGeometricEdge,  &this->VerticesOnGeometricEdgeSize[0],  &this->VerticesOnGeometricEdgeSize[1],  mxGetField(matlab_struct,0,"VerticesOnGeometricEdge"));
+	FetchData(&this->VerticesOnGeometricVertex,&this->VerticesOnGeometricVertexSize[0],&this->VerticesOnGeometricVertexSize[1],mxGetField(matlab_struct,0,"VerticesOnGeometricVertex"));
+	FetchData(&this->hVertices,                &lines,                                 &cols,                                  mxGetField(matlab_struct,0,"hVertices"));
+	if (this->hVertices && (cols!=1 || lines!=this->VerticesSize[0])){ISSMERROR("the size of 'hVertices' should be [%i %i]",this->VerticesSize[0],1);}
+
+}
+#endif
+/*}}}*/
+/*FUNCTION BamgMesh::SetMatlabStructureFields{{{1*/
+#ifdef _SERIAL_
+void BamgMesh::SetMatlabStructureFields(mxArray** matlab_struct){
+
+	/*Intermediary*/
+	int         i,i1,i2;
+	mxArray*    pfield=NULL;
+	mxArray*    pfield2=NULL;
+	mxArray*    output=NULL;
+	int         numfields=16;
+	const char* fnames[numfields];
+	int         fsize[numfields][2];
+	double**    fpointer[numfields];
+	mwSize      ndim=2;
+	mwSize      dimensions[2]={1,1};
+
+	/*Build fnames and fsize names and sizes of each field*/
+	i=-1;
+	fnames[++i] = "Triangles";                fsize[i][0]=this->TrianglesSize[0];                 fsize[i][1]=this->TrianglesSize[1];                fpointer[i]=&this->Triangles;
+	fnames[++i] = "Vertices";                 fsize[i][0]=this->VerticesSize[0];                  fsize[i][1]=this->VerticesSize[1];                 fpointer[i]=&this->Vertices;
+	fnames[++i] = "Edges";                    fsize[i][0]=this->EdgesSize[0];                     fsize[i][1]=this->EdgesSize[1];                    fpointer[i]=&this->Edges;
+	fnames[++i] = "IssmSegments";             fsize[i][0]=this->IssmSegmentsSize[0];              fsize[i][1]=this->IssmSegmentsSize[1];             fpointer[i]=&this->IssmSegments;
+	fnames[++i] = "IssmEdges";                fsize[i][0]=this->IssmEdgesSize[0];                 fsize[i][1]=this->IssmEdgesSize[1];                fpointer[i]=&this->IssmEdges;
+	fnames[++i] = "Quadrilaterals";           fsize[i][0]=this->QuadrilateralsSize[0];            fsize[i][1]=this->QuadrilateralsSize[1];           fpointer[i]=&this->Quadrilaterals;
+	fnames[++i] = "VerticesOnGeometricVertex";fsize[i][0]=this->VerticesOnGeometricVertexSize[0]; fsize[i][1]=this->VerticesOnGeometricVertexSize[1];fpointer[i]=&this->VerticesOnGeometricVertex;
+	fnames[++i] = "VerticesOnGeometricEdge";  fsize[i][0]=this->VerticesOnGeometricEdgeSize[0];   fsize[i][1]=this->VerticesOnGeometricEdgeSize[1];  fpointer[i]=&this->VerticesOnGeometricEdge;
+	fnames[++i] = "EdgesOnGeometricEdge";     fsize[i][0]=this->EdgesOnGeometricEdgeSize[0];      fsize[i][1]=this->EdgesOnGeometricEdgeSize[1];     fpointer[i]=&this->EdgesOnGeometricEdge;
+	fnames[++i] = "SubDomains";               fsize[i][0]=this->SubDomainsSize[0];                fsize[i][1]=this->SubDomainsSize[1];               fpointer[i]=&this->SubDomains;
+	fnames[++i] = "SubDomainsFromGeom";       fsize[i][0]=this->SubDomainsFromGeomSize[0];        fsize[i][1]=this->SubDomainsFromGeomSize[1];       fpointer[i]=&this->SubDomainsFromGeom;
+	fnames[++i] = "ElementConnectivity";      fsize[i][0]=this->ElementConnectivitySize[0];       fsize[i][1]=this->ElementConnectivitySize[1];      fpointer[i]=&this->ElementConnectivity;
+	fnames[++i] = "NodalConnectivity";        fsize[i][0]=this->NodalConnectivitySize[0];         fsize[i][1]=this->NodalConnectivitySize[1];        fpointer[i]=&this->NodalConnectivity;
+	fnames[++i] = "NodalElementConnectivity"; fsize[i][0]=this->NodalElementConnectivitySize[0];  fsize[i][1]=this->NodalElementConnectivitySize[1]; fpointer[i]=&this->NodalElementConnectivity;
+	fnames[++i] = "CrackedVertices";          fsize[i][0]=this->CrackedVerticesSize[0];           fsize[i][1]=this->CrackedVerticesSize[1];          fpointer[i]=&this->CrackedVertices;
+	fnames[++i] = "CrackedEdges";             fsize[i][0]=this->CrackedEdgesSize[0];              fsize[i][1]=this->CrackedEdgesSize[1];             fpointer[i]=&this->CrackedEdges;
+	ISSMASSERT(i==numfields-1);
+
+	/*Initialize Matlab structure*/
+	output=mxCreateStructArray(ndim,dimensions,numfields,fnames);
+
+	/*Add every field tu structure*/
+	for(i=0;i<numfields;i++){
+
+		/*Copy field*/
+		double*  fieldcopy=NULL;
+		if (fsize[i][0]*fsize[i][1]){
+			fieldcopy=(double*)xmalloc(fsize[i][0]*fsize[i][1]*sizeof(double));
+			for(i1=0;i1<fsize[i][0];i1++){
+				for(i2=0;i2<fsize[i][1];i2++){
+					fieldcopy[fsize[i][1]*i1+i2]=*(*fpointer[i] + fsize[i][1]*i1+i2);
+				}
+			}
+		}
+
+		/*Set matlab field*/
+		pfield=mxCreateDoubleMatrix(0,0,mxREAL);
+		mxSetM(pfield,fsize[i][1]);
+		mxSetN(pfield,fsize[i][0]);
+		mxSetPr(pfield,fieldcopy);
+		mexCallMATLAB(1,&pfield2,1,&pfield,"transpose");//transpose
+		mxSetField(output,0,fnames[i],pfield2);
+	}
+
+	/*Assign output*/
+	*matlab_struct=output;
+
+}
+#endif
+/*}}}*/
Index: /issm/trunk/src/c/objects/Bamg/BamgMesh.h
===================================================================
--- /issm/trunk/src/c/objects/Bamg/BamgMesh.h	(revision 5171)
+++ /issm/trunk/src/c/objects/Bamg/BamgMesh.h	(revision 5172)
@@ -4,4 +4,8 @@
 #ifndef _BAMGMESH_H_
 #define _BAMGMESH_H_
+
+#ifdef _SERIAL_
+#include <mex.h>
+#endif
 
 class BamgMesh{
@@ -48,4 +52,9 @@
 		~BamgMesh();
 
+		#ifdef _SERIAL_
+		void GetMatlabStructureFields(mxArray* matlab_struct);
+		void SetMatlabStructureFields(mxArray** matlab_struct);
+		#endif
+
 };
 
Index: /issm/trunk/src/c/objects/Bamg/Mesh.cpp
===================================================================
--- /issm/trunk/src/c/objects/Bamg/Mesh.cpp	(revision 5171)
+++ /issm/trunk/src/c/objects/Bamg/Mesh.cpp	(revision 5172)
@@ -232,9 +232,9 @@
 		/*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Triangles)*/
 
-		if (vertices)             delete [] vertices;
+		//if (vertices)             delete [] vertices;
 		if (edges)                delete [] edges;
 		if (triangles)            delete [] triangles;
 		if (quadtree)             delete    quadtree;
-		if (ordre)                delete [] ordre;
+		//if (ordre)                delete [] ordre;
 		if (subdomains)           delete []  subdomains;
 		if (VerticesOnGeomEdge)   delete [] VerticesOnGeomEdge;
Index: /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h
===================================================================
--- /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h	(revision 5171)
+++ /issm/trunk/src/c/objects/ExternalResults/IntExternalResult.h	(revision 5172)
@@ -20,10 +20,7 @@
 #endif
 
-
 #include "./ExternalResult.h"
 #include "../../include/include.h"
 #include "../../shared/shared.h"
-#include "../../include/include.h"
-#include "../../include/include.h"
 /*}}}*/
 
Index: /issm/trunk/src/mex/Bamg/Bamg.cpp
===================================================================
--- /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 5171)
+++ /issm/trunk/src/mex/Bamg/Bamg.cpp	(revision 5172)
@@ -32,26 +32,7 @@
 	bamgmesh_out=new BamgMesh;
 
-	/*create bamg geometry input*/
-	FetchData(&bamggeom_in->Vertices,        &bamggeom_in->VerticesSize[0],        &bamggeom_in->VerticesSize[1],        mxGetField(BAMGGEOMETRY,0,"Vertices"));
-	FetchData(&bamggeom_in->Edges,           &bamggeom_in->EdgesSize[0],           &bamggeom_in->EdgesSize[1],           mxGetField(BAMGGEOMETRY,0,"Edges"));
-	FetchData(&bamggeom_in->Corners,         &bamggeom_in->CornersSize[0],         &bamggeom_in->CornersSize[1],         mxGetField(BAMGGEOMETRY,0,"Corners"));
-	FetchData(&bamggeom_in->RequiredVertices,&bamggeom_in->RequiredVerticesSize[0],&bamggeom_in->RequiredVerticesSize[1],mxGetField(BAMGGEOMETRY,0,"RequiredVertices"));
-	FetchData(&bamggeom_in->RequiredEdges,   &bamggeom_in->RequiredEdgesSize[0],   &bamggeom_in->RequiredEdgesSize[1],   mxGetField(BAMGGEOMETRY,0,"RequiredEdges"));
-	FetchData(&bamggeom_in->CrackedEdges,    &bamggeom_in->CrackedEdgesSize[0],    &bamggeom_in->CrackedEdgesSize[1],    mxGetField(BAMGGEOMETRY,0,"CrackedEdges"));
-	FetchData(&bamggeom_in->SubDomains,      &bamggeom_in->SubDomainsSize[0],      &bamggeom_in->SubDomainsSize[1],      mxGetField(BAMGGEOMETRY,0,"SubDomains"));
-	FetchData(&bamggeom_in->hVertices,&lines,&cols,mxGetField(BAMGGEOMETRY,0,"hVertices"));
-	if (bamggeom_in->hVertices && (cols!=1 || lines!=bamggeom_in->VerticesSize[0])){ISSMERROR("the size of 'hVertices' should be [%i %i]",bamggeom_in->VerticesSize[0],1);}
-
-	/*create bamg mesh input*/
-	FetchData(&bamgmesh_in->Triangles,&bamgmesh_in->TrianglesSize[0],&bamgmesh_in->TrianglesSize[1],mxGetField(BAMGMESH,0,"Triangles"));
-	FetchData(&bamgmesh_in->Vertices, &bamgmesh_in->VerticesSize[0], &bamgmesh_in->VerticesSize[1], mxGetField(BAMGMESH,0,"Vertices"));
-	FetchData(&bamgmesh_in->Edges,    &bamgmesh_in->EdgesSize[0],    &bamgmesh_in->EdgesSize[1],    mxGetField(BAMGMESH,0,"Edges"));
-	FetchData(&bamgmesh_in->IssmSegments, &bamgmesh_in->IssmSegmentsSize[0], &bamgmesh_in->IssmSegmentsSize[1], mxGetField(BAMGMESH,0,"IssmSegments"));
-	FetchData(&bamgmesh_in->CrackedEdges,&bamgmesh_in->CrackedEdgesSize[0],&bamgmesh_in->CrackedEdgesSize[1],mxGetField(BAMGMESH,0,"CrackedEdges"));
-	FetchData(&bamgmesh_in->EdgesOnGeometricEdge,&bamgmesh_in->EdgesOnGeometricEdgeSize[0],&bamgmesh_in->EdgesOnGeometricEdgeSize[1],mxGetField(BAMGMESH,0,"EdgesOnGeometricEdge"));
-	FetchData(&bamgmesh_in->VerticesOnGeometricEdge,&bamgmesh_in->VerticesOnGeometricEdgeSize[0],&bamgmesh_in->VerticesOnGeometricEdgeSize[1],mxGetField(BAMGMESH,0,"VerticesOnGeometricEdge"));
-	FetchData(&bamgmesh_in->VerticesOnGeometricVertex,&bamgmesh_in->VerticesOnGeometricVertexSize[0],&bamgmesh_in->VerticesOnGeometricVertexSize[1],mxGetField(BAMGMESH,0,"VerticesOnGeometricVertex"));
-	FetchData(&bamgmesh_in->hVertices,&lines,&cols,mxGetField(BAMGMESH,0,"hVertices"));
-	if (bamgmesh_in->hVertices && (cols!=1 || lines!=bamgmesh_in->VerticesSize[0])){ISSMERROR("the size of 'hVertices' should be [%i %i]",bamgmesh_in->VerticesSize[0],1);}
+	/*Build objects from matlab structures*/
+	bamggeom_in->GetMatlabStructureFields(BAMGGEOMETRY);
+	bamgmesh_in->GetMatlabStructureFields(BAMGMESH);
 
 	/*create bamg options input*/
@@ -93,13 +74,13 @@
 
 	/*Generate output Matlab Structures*/
-	WriteData(&bamgmesh_mat,bamgmesh_out);
-	WriteData(&bamggeom_mat,bamggeom_out);
-
-	/*assign output datasets: */
-	*BAMGMESHOUT=bamgmesh_mat;
-	*BAMGGEOMOUT=bamggeom_mat;
+	bamggeom_out->SetMatlabStructureFields(BAMGGEOMOUT);
+	bamgmesh_out->SetMatlabStructureFields(BAMGMESHOUT);
 
 	/*Free ressources: */
-	//do not free any fields of bamgmesh or bamggeom as it has been freed in bamgx
+	delete bamgopts;
+	delete bamggeom_in;
+	delete bamggeom_out;
+	delete bamgmesh_in;
+	delete bamgmesh_out;
 
 	/*end module: */
Index: /issm/trunk/src/mex/BamgConvertMesh/BamgConvertMesh.cpp
===================================================================
--- /issm/trunk/src/mex/BamgConvertMesh/BamgConvertMesh.cpp	(revision 5171)
+++ /issm/trunk/src/mex/BamgConvertMesh/BamgConvertMesh.cpp	(revision 5172)
@@ -32,7 +32,7 @@
 	CheckNumMatlabArguments(nlhs,NLHS,nrhs,NRHS,__FUNCT__,&BamgConvertMeshUsage);
 
-	/*Initialize variables*/
-	bamggeom=new BamgGeom;
-	bamgmesh=new BamgMesh;
+	/*Initialize Bamg outputs*/
+	bamggeom=new BamgGeom();
+	bamgmesh=new BamgMesh();
 
 	/*Input datasets: */
@@ -64,10 +64,6 @@
 
 	/*Generate output Matlab Structures*/
-	WriteData(&bamgmesh_mat,bamgmesh);
-	WriteData(&bamggeom_mat,bamggeom);
-
-	/*assign output datasets: */
-	*BAMGMESHOUT=bamgmesh_mat;
-	*BAMGGEOMOUT=bamggeom_mat;
+	bamggeom->SetMatlabStructureFields(BAMGGEOMOUT);
+	bamgmesh->SetMatlabStructureFields(BAMGMESHOUT);
 
 	/*end module: */
