Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 21496)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 21497)
@@ -138,4 +138,8 @@
 	if(parameters)delete parameters;
 	if(results)delete results;
+	
+	#ifdef _HAVE_NEOPZ_
+	if(amr)delete amr;
+	#endif
 
 	/*Now delete: */
@@ -2920,13 +2924,17 @@
 	
 	/*Initialize AMR*/
-	//AdaptiveMeshRefinement *AMR = new AdaptiveMeshRefinement();
-	
-	/*Set max level of refinement*/
-	int hmax = 2;
-	//AMR->SetHMax(hmax);
+	if(my_rank==0){
+		/*Just CPU #0 should keep AMR object*/
+		this->amr = new AdaptiveMeshRefinement();
+		int hmax = 2; //itapopo: it must be defined by interface. Using 2 just to test
+		this->amr->SetHMax(hmax); //Set max level of refinement
+	} 
+	else{
+		this->amr=NULL;
+	}
 	
 	/*Get initial mesh*/
 	/*Get total number of elements and total numbers of elements in the initial mesh*/
-	int numberofvertices, numberofelements, numberofsegments;
+	long numberofvertices, numberofelements, numberofsegments;
 	numberofvertices = this->vertices->NumberOfVertices();
 	numberofelements = this->elements->NumberOfElements();
@@ -2946,6 +2954,6 @@
 	Vector<IssmDouble>* vid3= new Vector<IssmDouble>(numberofelements);
 
-	/*Go through elements, and for each element, object*/
-    for(int i=0;i<this->elements->Size();i++){
+	/*Go through elements, and for each element, get vertices*/
+   for(int i=0;i<this->elements->Size();i++){
     	Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
     	element->GetVerticesSidList(elem_vertices);
@@ -2953,47 +2961,45 @@
     	vid2->SetValue(element->sid,elem_vertices[1],INS_VAL);
     	vid3->SetValue(element->sid,elem_vertices[2],INS_VAL);
-    }
+   }
 		
 	/*Assemble*/
-    vid1->Assemble();
-    vid2->Assemble();
-    vid3->Assemble();
-
-    /*Serialize*/
+   vid1->Assemble();
+   vid2->Assemble();
+   vid3->Assemble();
+
+   /*Serialize*/
 	IssmDouble *id1 = vid1->ToMPISerial();
    IssmDouble *id2 = vid2->ToMPISerial();
 	IssmDouble *id3 = vid3->ToMPISerial();
 	
-	int **elementsptr;
-	elementsptr = new int*[numberofelements];
-    for(int i=0;i<numberofelements;i++){
-        elementsptr[i] = new int[elementswidth];
-        elementsptr[i][0] = (int)id1[i];
-        elementsptr[i][1] = (int)id2[i];
-        elementsptr[i][2] = (int)id3[i];
-    }
-
-	//if(my_rank==0){
-	//	_printf_("   PRINTING COORDINATES... \n");	    
-   // 		for(long i=0;i<numberofvertices;i++) _printf_("ID: " << i << "\t" << "X: " << x[i] << "\t" << "Y: " << y[i] << "\n");
-   // 	_printf_("   PRINTING ELEMENTS... \n");	   
-   // 	for(int i=0;i<numberofelements;i++) _printf_("El: " << i << "\t" << elementsptr[i][0] << "\t" << elementsptr[i][1] << "\t" << elementsptr[i][2] << "\n");
-	//}
-
-    //AMR->CreateInitialMesh(numberofvertices, numberofelements, 0, elementswidth, x, y, z, elementsptr, NULL);
+	long **elementsptr;
+	elementsptr = new long*[numberofelements];
+   for(int i=0;i<numberofelements;i++){
+		elementsptr[i] = new long[elementswidth];
+      elementsptr[i][0] = (long)id1[i];
+		elementsptr[i][1] = (long)id2[i];
+      elementsptr[i][2] = (long)id3[i];
+	}
+
+	/*Create initial mesh (coarse mesh) in neopz data structure*/ 
+   if(my_rank==0){ 
+		long nsegments=0;
+		this->amr->CreateInitialMesh(numberofvertices, numberofelements, nsegments, elementswidth, x, y, z, elementsptr, NULL);
+	}
 
 	/*Free the vectors*/
-	delete x;
-	delete y;
-	delete z;
+	xDelete<IssmDouble>(x);
+	xDelete<IssmDouble>(y);
+	xDelete<IssmDouble>(z);
 	delete vid1;
 	delete vid2;
 	delete vid3;
-	delete id1;
-	delete id2;
-	delete id3;
-	for(int i=0;i<numberofelements;i++) delete elementsptr[i];
-   if(elementsptr) delete elementsptr;
-	xDelete<int>(elem_vertices); 
+	xDelete<IssmDouble>(id1);
+	xDelete<IssmDouble>(id2);
+	xDelete<IssmDouble>(id3);			
+	for(int i=0;i<numberofelements;i++) delete [] elementsptr[i];
+   if(elementsptr) delete [] elementsptr;
+	xDelete<int>(elem_vertices);
+
 }
 /*}}}*/
@@ -3491,6 +3497,6 @@
 
 	//itapopo voltar aqui
-	InterpFromMeshToMesh2dx(&newspcvx,oldelements,oldx,oldy,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,options);
-	InterpFromMeshToMesh2dx(&newspcvx,oldelements,oldx,oldy,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,options);
+	//InterpFromMeshToMesh2dx(&newspcvx,oldelements,oldx,oldy,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,options);
+	//InterpFromMeshToMesh2dx(&newspcvx,oldelements,oldx,oldy,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,options);
 
 	output->constraints = new Constraints();
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 21496)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 21497)
@@ -20,4 +20,7 @@
 class Profiler;
 class Elements;
+#ifdef _HAVE_NEOPZ_
+#include "./AdaptiveMeshRefinement.h"
+#endif
 /*}}}*/
 
@@ -43,4 +46,8 @@
 		Results     *results;              //results that cannot be fit into the elements 
 		Vertices    *vertices;             //one set of vertices
+
+		#ifdef _HAVE_NEOPZ_
+		AdaptiveMeshRefinement *amr;		  //adaptive mesh refinement object. It keeps coarse mesh and execute refinement process
+		#endif
 
 		/*constructors, destructors: */
