Changeset 21528


Ignore:
Timestamp:
02/08/17 17:13:30 (8 years ago)
Author:
tsantos
Message:

CHG: changes in AMR methods (in FemModel) and in AdaptiveMeshRefinement class. Cleanup done and parallel tested (ReMesh method, simple example). AMR not working yet.

Location:
issm/trunk-jpl/src/c/classes
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp

    r21503 r21528  
    33 */
    44
    5  #ifdef HAVE_CONFIG_H
     5#ifdef HAVE_CONFIG_H
    66    #include <config.h>
    77#else
     
    5252         this->hmax=-1;
    5353         this->elementswidth=-1;
     54         gRefDBase.clear();
    5455}
    5556/*}}}*/
     
    128129/*Mesh refinement methods*/
    129130#include "TPZVTKGeoMesh.h" //itapopo
    130 void AdaptiveMeshRefinement::ExecuteRefinement(int &type_process,double *vx, double *vy, double *masklevelset, int &nvertices, int &nelements, int &nsegments, double** x, double** y, double** z, int*** elements, int*** segments){/*{{{*/
     131#include "../shared/shared.h" //itapopo
     132void AdaptiveMeshRefinement::ExecuteRefinement(int &type_process,double *vx, double *vy, double *masklevelset, int &nvertices, int &nelements, int &nsegments, double** px, double** py, double** pz, int** pelements, int** psegments){/*{{{*/
     133
     134        /*IMPORTANT! pelements (and psegments) are in Matlab indexing*/
     135        /*NEOPZ works only in C indexing*/
    131136
    132137    //itapopo _assert_(this->fathermesh);
     
    171176   
    172177    /*Get new geometric mesh in ISSM data structure*/
    173     this->GetMesh(nohangingnodesmesh,nvertices,nelements,nsegments,x,y,z,elements,segments);
     178    this->GetMesh(nohangingnodesmesh,nvertices,nelements,nsegments,px,py,pz,pelements,psegments);
    174179         
    175180    /*Verify the new geometry*/
    176     this->CheckMesh(nvertices,nelements,nsegments,this->elementswidth,x,y,z,elements,segments);
     181    this->CheckMesh(nvertices,nelements,nsegments,this->elementswidth,px,py,pz,pelements,psegments);
    177182     
    178183    delete nohangingnodesmesh;
     
    255260}
    256261/*}}}*/
    257 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh *gmesh, int &nvertices, int &nelements, int &nsegments, double** meshX, double** meshY, double** meshZ, int*** elements, int*** segments){/*{{{*/
     262void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh *gmesh,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz, int** pelements, int** psegments){/*{{{*/
     263
     264        /*IMPORTANT! pelements (and psegments) are in Matlab indexing*/
     265        /*NEOPZ works only in C indexing*/
    258266
    259267        /* vertices */
     
    261269   
    262270    /* mesh coords */
    263     double *newmeshX = new double[ntotalvertices];
    264     double *newmeshY = new double[ntotalvertices];
    265     double *newmeshZ = new double[ntotalvertices];
     271         double* newmeshX = xNew<IssmDouble>(ntotalvertices);
     272    double* newmeshY = xNew<IssmDouble>(ntotalvertices);
     273    double* newmeshZ = xNew<IssmDouble>(ntotalvertices);
    266274       
    267275   /* getting mesh coords */
     
    283291   
    284292    int ntotalelements = (int)GeoVec.size();
    285     int ** newelements = new int*[ntotalelements];
     293    int* newelements = xNew<int>(ntotalelements*this->elementswidth);
    286294
    287295    if ( !(this->elementswidth == 3) && !(this->elementswidth == 4) && !(this->elementswidth == 6) ) DebugStop();
    288296
    289     for(int i = 0; i < GeoVec.size(); i++){
    290         newelements[i] = new int[this->elementswidth];
    291         for(int j = 0; j < this->elementswidth; j++) newelements[i][j] = (int)GeoVec[i]->NodeIndex(j);
    292     }
     297    for(int i=0;i<GeoVec.size();i++){
     298        for(int j=0;j<this->elementswidth;j++) newelements[i*this->elementswidth+j]=(int)GeoVec[i]->NodeIndex(j)+1;//C to Matlab indexing
     299         }
    293300   
    294301    /* segments */
     
    301308   
    302309    int ntotalsegments = (int)SegVec.size();
    303     int ** newsegments = new int*[ntotalsegments];
    304    
    305     for(int i = 0; i < SegVec.size(); i++){
    306        
    307         newsegments[i] = new int[3];
    308         for(int j = 0; j < 2; j++) newsegments[i][j] = SegVec[i]->NodeIndex(j);
     310    int *newsegments=NULL;
     311         if(ntotalsegments>0) newsegments=xNew<int>(ntotalsegments*3);
     312   
     313    for(int i=0;i<SegVec.size();i++){
     314       
     315        for(int j=0;j<2;j++) newsegments[i*3+j]=(int)SegVec[i]->NodeIndex(j)+1;//C to Matlab indexing
    309316       
    310317        int neighborindex = SegVec[i]->Neighbour(2).Element()->Index();
     
    319326       
    320327        if(neighbourid==-1) DebugStop(); //itapopo talvez passar para _assert_
    321         newsegments[i][2] = neighbourid;
     328        newsegments[i*3+2] = neighbourid+1;//C to Matlab indexing
    322329    }
    323330   
    324331    //setting outputs
    325     nvertices   = ntotalvertices;
    326     nelements   = ntotalelements;
    327     nsegments   = ntotalsegments;
    328     *meshX      = newmeshX;
    329     *meshY      = newmeshY;
    330     *meshZ      = newmeshZ;
    331     *elements  = newelements;
    332     *segments  = newsegments;
     332    nvertices  = ntotalvertices;
     333    nelements  = ntotalelements;
     334    nsegments  = ntotalsegments;
     335    *px            = newmeshX;
     336    *py            = newmeshY;
     337    *pz            = newmeshZ;
     338    *pelements = newelements;
     339    *psegments = newsegments;
    333340   
    334341}
     
    381388    ElemVec.clear();
    382389   
    383     // itapopo inserir modo de encontrar criterio
    384     if(false) this->TagAllElements(gmesh,ElemVec); //uniform, refine all elements!
     390    // itapopo inserir modo de encontrar criterio TESTING!!!! Come to false!
     391         if(true) this->TagAllElements(gmesh,ElemVec); //uniform, refine all elements!
    385392
    386393    /* Adaptive refinement. This refines some elements following some criteria*/
    387     this->TagElementsNearGroundingLine(gmesh, GLvec, hlevel, ElemVec);
     394    //this->TagElementsNearGroundingLine(gmesh, GLvec, hlevel, ElemVec);
    388395
    389396}
     
    437444}
    438445/*}}}*/
    439 void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices, int &nelements, int &nsegments, int &width, double* x, double* y, double* z, int** elements, int** segments){/*{{{*/
    440 
     446void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices,int &nelements,int &nsegments,int &width,double* x,double* y,double* z,int* elements,int* segments){/*{{{*/
     447
     448        /*IMPORTANT! elements come in Matlab indexing*/
     449        /*NEOPZ works only in C indexing*/
     450       
    441451        // itapopo _assert_(nvertices>0);
    442452    // itapoo _assert_(nelements>0);
    443    this->SetElementWidth(width);
     453        this->SetElementWidth(width);
    444454
    445455    /*Verify and creating initial mesh*/
     
    450460
    451461    /*Set the vertices (geometric nodes in NeoPZ context)*/
    452         for(int i=0;i<nvertices;i++){
    453        
    454         /*x,y,z coords*/
    455         TPZManVector<REAL,3> coord(3,0.);
    456         coord[0]= x[i];
    457         coord[1]= y[i];
    458         coord[2]= z[i];
    459                
    460         /*Insert in the mesh*/
    461         this->fathermesh->NodeVec()[i].SetCoord(coord);
    462                   this->fathermesh->NodeVec()[i].SetNodeId(i);
     462        for(int i=0;i<nvertices;i++){ 
     463      /*x,y,z coords*/
     464                TPZManVector<REAL,3> coord(3,0.);
     465      coord[0]= x[i];
     466      coord[1]= y[i];
     467      coord[2]= z[i];
     468      /*Insert in the mesh*/
     469      this->fathermesh->NodeVec()[i].SetCoord(coord);
     470                this->fathermesh->NodeVec()[i].SetNodeId(i);
    463471        }
    464472       
    465473        /*Generate the elements*/
    466     long index;
    467     const int mat = this->GetElemMaterialID();
    468     TPZManVector<long> elem(this->elementswidth,0);
     474        long index;
     475   const int mat = this->GetElemMaterialID();
     476   TPZManVector<long> elem(this->elementswidth,0);
    469477   
    470478        for(int iel=0;iel<nelements;iel++){
    471479
    472                 for(int jel=0;jel<this->elementswidth;jel++) elem[jel]=elements[iel][jel];
    473 
    474         /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
    475         const int reftype = 1;
    476         switch(this->elementswidth){
    477                         case 3: this->fathermesh->CreateGeoElement(ETriangle, elem, mat, index, reftype);                       break;
    478             case 4:     this->fathermesh->CreateGeoElement(ETetraedro, elem, mat, index, reftype); DebugStop(); break;// itapopo _error_("tetra elements must be verified!")    break;
    479                         case 6: this->fathermesh->CreateGeoElement(EPrisma, elem, mat, index, reftype);         break;
    480             default:    DebugStop();//itapopo _error_("mesh not supported yet");
     480                for(int jel=0;jel<this->elementswidth;jel++) elem[jel]=elements[iel*this->elementswidth+jel]-1;//Convert Matlab to C indexing
     481
     482      /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
     483      const int reftype = 1;
     484      switch(this->elementswidth){
     485                        case 3: this->fathermesh->CreateGeoElement(ETriangle, elem, mat, index, reftype);       break;
     486         case 4: this->fathermesh->CreateGeoElement(ETetraedro, elem, mat, index, reftype); DebugStop(); break;
     487                        case 6: this->fathermesh->CreateGeoElement(EPrisma, elem, mat, index, reftype); DebugStop(); break;
     488         default:       DebugStop();//itapopo _error_("mesh not supported yet");
    481489                }
    482490       
    483         /*Define the element ID*/       
    484         this->fathermesh->ElementVec()[index]->SetId(iel);
    485        
     491      /*Define the element ID*/       
     492      this->fathermesh->ElementVec()[index]->SetId(iel);
    486493        }
    487494   
    488     /*Generate the 1D segments elements (boundary)*/
    489     const int matboundary = this->GetBoundaryMaterialID();
    490     TPZManVector<long> boundary(2,0.);
    491    
    492     for(int iel=nelements;iel<nelements+nsegments;iel++){
    493        
    494         boundary[0] = segments[iel-nelements][0];
    495         boundary[1] = segments[iel-nelements][1];
    496        
    497         /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
    498         const int reftype = 0;
    499         this->fathermesh->CreateGeoElement(EOned, boundary, matboundary, index, reftype);//cria elemento unidimensional
    500         this->fathermesh->ElementVec()[index]->SetId(iel);
    501        
    502     }
    503    
    504     /*Build element and node connectivities*/
    505     this->fathermesh->BuildConnectivity();
    506     /*Create previous mesh as a copy of father mesh*/
    507     this->previousmesh = new TPZGeoMesh(*this->fathermesh);
    508    
     495   /*Generate the 1D segments elements (boundary)*/
     496   const int matboundary = this->GetBoundaryMaterialID();
     497   TPZManVector<long> boundary(2,0.);
     498   
     499   for(int iel=nelements;iel<nelements+nsegments;iel++){     
     500                boundary[0] = segments[(iel-nelements)*2+0]-1;//Convert Matlab to C indexing
     501      boundary[1] = segments[(iel-nelements)*2+1]-1;//Convert Matlab to C indexing
     502      /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
     503      const int reftype = 0;
     504      this->fathermesh->CreateGeoElement(EOned, boundary, matboundary, index, reftype);//cria elemento unidimensional
     505      this->fathermesh->ElementVec()[index]->SetId(iel);
     506        }
     507   
     508   /*Build element and node connectivities*/
     509   this->fathermesh->BuildConnectivity();
     510   
     511        /*Create previous mesh as a copy of father mesh*/
     512   this->previousmesh = new TPZGeoMesh(*this->fathermesh);
     513         
     514        /*Set refinement patterns*/
     515        this->SetRefPatterns();
     516
    509517}
    510518/*}}}*/
     
    517525}
    518526/*}}}*/
    519 void AdaptiveMeshRefinement::CheckMesh(int &nvertices, int &nelements, int &nsegments,int &width, double** x, double** y, double** z, int*** elements, int*** segments){/*{{{*/
     527void AdaptiveMeshRefinement::SetRefPatterns(){/*{{{*/
     528
     529        /*Initialize the global variable of refinement patterns*/
     530        gRefDBase.InitializeUniformRefPattern(EOned);
     531        gRefDBase.InitializeUniformRefPattern(ETriangle);
     532   
     533    //gRefDBase.InitializeRefPatterns();
     534        /*Insert specifics patterns to ISSM core*/
     535        std::string filepath     = REFPATTERNDIR;
     536   std::string filename1 = filepath + "/2D_Triang_Rib_3.rpt";
     537   std::string filename2 = filepath + "/2D_Triang_Rib_4.rpt";
     538   std::string filename3 = filepath + "/2D_Triang_Rib2_Side_3_4.rpt";
     539   std::string filename4 = filepath + "/2D_Triang_Rib2_Side_3_4permuted.rpt";
     540   std::string filename5 = filepath + "/2D_Triang_Rib2_Side_3_5.rpt";
     541        std::string filename6 = filepath + "/2D_Triang_Rib2_Side_3_5permuted.rpt";
     542   std::string filename7 = filepath + "/2D_Triang_Rib_5.rpt";
     543
     544   TPZAutoPointer<TPZRefPattern> refpat1 = new TPZRefPattern(filename1);
     545   TPZAutoPointer<TPZRefPattern> refpat2 = new TPZRefPattern(filename2);
     546   TPZAutoPointer<TPZRefPattern> refpat3 = new TPZRefPattern(filename3);
     547        TPZAutoPointer<TPZRefPattern> refpat4 = new TPZRefPattern(filename4);
     548   TPZAutoPointer<TPZRefPattern> refpat5 = new TPZRefPattern(filename5);
     549   TPZAutoPointer<TPZRefPattern> refpat6 = new TPZRefPattern(filename6);
     550   TPZAutoPointer<TPZRefPattern> refpat7 = new TPZRefPattern(filename7);
     551   
     552   if(!gRefDBase.FindRefPattern(refpat1)) gRefDBase.InsertRefPattern(refpat1);
     553   if(!gRefDBase.FindRefPattern(refpat2)) gRefDBase.InsertRefPattern(refpat2);
     554   if(!gRefDBase.FindRefPattern(refpat3)) gRefDBase.InsertRefPattern(refpat3);
     555   if(!gRefDBase.FindRefPattern(refpat4)) gRefDBase.InsertRefPattern(refpat4);
     556   if(!gRefDBase.FindRefPattern(refpat5)) gRefDBase.InsertRefPattern(refpat5);
     557   if(!gRefDBase.FindRefPattern(refpat6)) gRefDBase.InsertRefPattern(refpat6);
     558   if(!gRefDBase.FindRefPattern(refpat7)) gRefDBase.InsertRefPattern(refpat7);
     559}
     560/*}}}*/
     561void AdaptiveMeshRefinement::CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements, int** psegments){/*{{{*/
    520562
    521563    /*Basic verification*/
     
    524566    if ( !(width == 3) && !(width == 4) && !(width == 6) ) DebugStop(); // itapopo verifcar se irá usar o _assert_
    525567   
    526     if( !x || !y || !z || !elements ) DebugStop(); // itapopo verifcar se irá usar o _assert_
     568    if( !px || !py || !pz || !pelements ) DebugStop(); // itapopo verifcar se irá usar o _assert_
    527569   
    528570    /*Verify if there are orphan nodes*/
     
    531573    for(int i = 0; i < nelements; i++){
    532574        for(int j = 0; j < width; j++) {
    533             elemvertices.insert((*elements)[i][j]);
     575            elemvertices.insert((*pelements)[i*width+j]);
    534576                  }
    535577         }
     
    538580       
    539581    //Verify if there are inf or NaN in coords
    540     for(int i = 0; i < nvertices; i++) if(isnan((*x)[i]) || isinf((*x)[i])) DebugStop();
    541     for(int i = 0; i < nvertices; i++) if(isnan((*y)[i]) || isinf((*y)[i])) DebugStop();
    542     for(int i = 0; i < nvertices; i++) if(isnan((*z)[i]) || isinf((*z)[i])) DebugStop();
     582    for(int i = 0; i < nvertices; i++) if(isnan((*px)[i]) || isinf((*px)[i])) DebugStop();
     583    for(int i = 0; i < nvertices; i++) if(isnan((*py)[i]) || isinf((*py)[i])) DebugStop();
     584    for(int i = 0; i < nvertices; i++) if(isnan((*pz)[i]) || isinf((*pz)[i])) DebugStop();
    543585   
    544586         for(int i = 0; i < nelements; i++){
    545587        for(int j = 0; j < width; j++){
    546             if( isnan((*elements)[i][j]) || isinf((*elements)[i][j]) ) DebugStop();
    547         }
    548     }
    549    
    550 }
    551 /*}}}*/
     588            if( isnan((*pelements)[i*width+j]) || isinf((*pelements)[i*width+j]) ) DebugStop();
     589        }
     590    }
     591   
     592}
     593/*}}}*/
  • issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h

    r21503 r21528  
    1010
    1111/*NeoPZ includes*/
    12 /*REAL and STATE definitions, NeoPZ variables*/
     12/*REAL and STATE definitions, NeoPZ variables itapopo should be read by NeoPZ's config.h*/
     13#ifndef REFPATTERNDIR
     14        # define REFPATTERNDIR "/home/santos/trunk-jpl/externalpackages/neopz/install/include/refpatterns"
     15#endif
     16
    1317#ifndef REALdouble
    1418        #define REALdouble
     
    5559   void SetHMax(int &h);                                                   // Define the max level of refinement
    5660   void SetElementWidth(int &width);                                       // Define elements width
    57         void ExecuteRefinement(int &type_process,double *vx, double *vy, double *masklevelset, int &nvertices, int &nelements, int &nsegments, double** x, double** y, double** z, int*** elements, int*** segments=NULL);                                      // A new mesh will be created and refined. This returns the new mesh
    58         void CreateInitialMesh(int &nvertices, int &nelements, int &nsegments, int &width, double* x, double* y, double* z, int** elements, int** segments=NULL); // Create a NeoPZ geometric mesh by coords and elements
    59    void CheckMesh(int &nvertices, int &nelements, int &nsegments, int &width, double** x, double** y, double** z, int*** elements, int*** segments=NULL); // Check the consistency of the mesh
     61        void ExecuteRefinement(int &type_process,double *vx,double *vy,double *masklevelset,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz,int** pelements,int** psegments=NULL);                                     // A new mesh will be created and refined. This returns the new mesh
     62        void CreateInitialMesh(int &nvertices,int &nelements,int &nsegments,int &width,double* x,double* y,double* z,int* elements,int* segments=NULL); // Create a NeoPZ geometric mesh by coords and elements
     63   void CheckMesh(int &nvertices,int &nelements,int &nsegments,int &width,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // Check the consistency of the mesh
    6064
    6165private:
     
    7579   void TagElementsNearGroundingLine(TPZGeoMesh *gmesh,std::vector<TPZVec<REAL> > &GLvec,int &hlevel,std::vector<int> &ElemVec);    // This tag elements near the grounding line
    7680   void CalcGroundingLinePosition(double *masklevelset,std::vector<TPZVec<REAL> > &GLvec);      // Calculate the grounding line position using previous mesh
    77         void GetMesh(TPZGeoMesh *gmesh, int &nvertices, int &nelements, int &nsegments, double** meshX, double** meshY, double** meshZ, int*** elements, int*** segments=NULL); // Return coords and elements in ISSM data structure
     81        void GetMesh(TPZGeoMesh *gmesh,int &nvertices,int &nelements,int &nsegments,double** px,double** py,double** pz,int** pelements,int** psegments=NULL); // Return coords and elements in ISSM data structure
    7882   inline int GetElemMaterialID(){return 1;}                               // Return element material ID
    7983   inline int GetBoundaryMaterialID(){return 2;}                           // Return segment (2D boundary) material ID
    80 
     84        void SetRefPatterns();                                                                                                                                  // Initialize and insert the refinement patterns
    8185};
    8286
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r21518 r21528  
    15781578                 name==HydrologyHeadOldEnum ||         
    15791579                                name==StressbalanceConvergenceNumStepsEnum ||
    1580                                 name==MeshVertexonbaseEnum
     1580                                name==MeshVertexonbaseEnum ||
     1581                                name==FrictionPEnum ||
     1582                                name==FrictionQEnum ||
     1583                                name==LoadingforceXEnum ||
     1584                                name==LoadingforceYEnum
    15811585
    15821586                                ) {
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r21524 r21528  
    8282        #ifdef _HAVE_NEOPZ_
    8383        this->InitializeAdaptiveRefinement();
    84         FemModel *Test=this->ReMesh();//itapopo: just to test!;
    85         //Test->elements->DeepEcho();
    86         //Test->CleanUp();
    87         //delete Test;
     84        FemModel *Test=this->ReMesh();//itapopo: just to test!;;
     85        //if(IssmComm::GetRank()==0) Test->elements->DeepEcho();
    8886        #endif
    8987
     
    29242922void FemModel::InitializeAdaptiveRefinement(void){/*{{{*/
    29252923       
    2926         int my_rank=IssmComm::GetRank();
    2927        
    2928         /*Initialize AMR*/
    2929         if(my_rank==0){
    2930                 /*Just CPU #0 should keep AMR object*/
     2924        /*Define variables*/
     2925        int my_rank                             = IssmComm::GetRank();
     2926        this->amr                               = NULL;//initialize amr as NULL
     2927        int numberofvertices = this->vertices->NumberOfVertices();
     2928        int numberofelements = this->elements->NumberOfElements();
     2929        int numberofsegments = 0; //used on matlab
     2930        IssmDouble* x                   = NULL;
     2931        IssmDouble* y                   = NULL;
     2932        IssmDouble* z                   = NULL;
     2933        int* elements                   = NULL;
     2934        int elementswidth               = this->GetElementsWidth(); //just tria elements in this version. Itapopo:
     2935
     2936        /*Get vertices coordinates of the coarse mesh (father mesh)*/
     2937        /*elements comes in Matlab indexing*/
     2938        this->GetMesh(this,&x,&y,&z,&elements);
     2939       
     2940        /*Create initial mesh (coarse mesh) in neopz data structure*/
     2941        /*Just CPU #0 should keep AMR object*/
     2942   if(my_rank==0){
    29312943                this->amr = new AdaptiveMeshRefinement();
    2932                 int hmax = 2; //itapopo: it must be defined by interface. Using 2 just to test
     2944                int hmax         = 0; //itapopo: it must be defined by interface. Using 2 just to test
    29332945                this->amr->SetHMax(hmax); //Set max level of refinement
    2934         }
    2935         else{
    2936                 this->amr=NULL;
    2937         }
    2938        
    2939         /*Get initial mesh*/
    2940         /*Get total number of elements and total numbers of elements in the initial mesh*/
    2941         int numberofvertices, numberofelements, numberofsegments;
    2942         numberofvertices = this->vertices->NumberOfVertices();
    2943         numberofelements = this->elements->NumberOfElements();
    2944         numberofsegments = -1; //used on matlab
    2945 
    2946         /*Get vertices coordinates*/
    2947         IssmDouble *x = NULL;
    2948         IssmDouble *y = NULL;
    2949         IssmDouble *z = NULL;
    2950         VertexCoordinatesx(&x, &y, &z, this->vertices,false) ;
    2951 
    2952         /*Get element vertices*/
    2953         int elementswidth = 3; //just 2D mesh in this version (just tria elements)
    2954         int* elem_vertices=xNew<int>(elementswidth);
    2955         Vector<IssmDouble>* vid1= new Vector<IssmDouble>(numberofelements);
    2956         Vector<IssmDouble>* vid2= new Vector<IssmDouble>(numberofelements);
    2957         Vector<IssmDouble>* vid3= new Vector<IssmDouble>(numberofelements);
    2958 
    2959         /*Go through elements, and for each element, get vertices*/
    2960    for(int i=0;i<this->elements->Size();i++){
    2961         Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
    2962         element->GetVerticesSidList(elem_vertices);
    2963         vid1->SetValue(element->sid,elem_vertices[0],INS_VAL);
    2964         vid2->SetValue(element->sid,elem_vertices[1],INS_VAL);
    2965         vid3->SetValue(element->sid,elem_vertices[2],INS_VAL);
    2966    }
    2967                
    2968         /*Assemble*/
    2969    vid1->Assemble();
    2970    vid2->Assemble();
    2971    vid3->Assemble();
    2972 
    2973    /*Serialize*/
    2974         IssmDouble *id1 = vid1->ToMPISerial();
    2975    IssmDouble *id2 = vid2->ToMPISerial();
    2976         IssmDouble *id3 = vid3->ToMPISerial();
    2977        
    2978         int **elementsptr;
    2979         elementsptr = new int*[numberofelements];
    2980    for(int i=0;i<numberofelements;i++){
    2981                 elementsptr[i] = new int[elementswidth];
    2982       elementsptr[i][0] = (int)id1[i];
    2983                 elementsptr[i][1] = (int)id2[i];
    2984       elementsptr[i][2] = (int)id3[i];
    2985         }
    2986 
    2987         /*Create initial mesh (coarse mesh) in neopz data structure*/
    2988    if(my_rank==0){
    2989                 int nsegments=0;
    2990                 this->amr->CreateInitialMesh(numberofvertices, numberofelements, nsegments, elementswidth, x, y, z, elementsptr, NULL);
     2946                this->amr->CreateInitialMesh(numberofvertices,numberofelements,numberofsegments,elementswidth,x,y,z,elements,NULL);
    29912947        }
    29922948
     
    29952951        xDelete<IssmDouble>(y);
    29962952        xDelete<IssmDouble>(z);
    2997         delete vid1;
    2998         delete vid2;
    2999         delete vid3;
    3000         xDelete<IssmDouble>(id1);
    3001         xDelete<IssmDouble>(id2);
    3002         xDelete<IssmDouble>(id3);                       
    3003         for(int i=0;i<numberofelements;i++) delete [] elementsptr[i];
    3004    if(elementsptr) delete [] elementsptr;
    3005         xDelete<int>(elem_vertices);
     2953        xDelete<int>(elements);
    30062954
    30072955}
     
    30092957FemModel* FemModel::ReMesh(void){/*{{{*/
    30102958       
    3011         int numprocs=IssmComm::GetSize();
    3012         if(numprocs>1) _error_("Multithreading not tested yet. Run with 1 cpu.");
    3013        
    30142959        /*Variables*/
    3015         IssmDouble *newx=NULL;
    3016         IssmDouble *newy=NULL;
    3017         IssmDouble *newz=NULL;
    3018         int *newelementslist=NULL;
    3019         int newnumberofvertices=-1;
    3020         int newnumberofelements=-1;
    3021         bool* my_elements=NULL;
    3022         int* my_vertices=NULL;
    3023         int elementswidth=3;//just tria elements in this version
     2960        IssmDouble *newx                        = NULL;
     2961        IssmDouble *newy                        = NULL;
     2962        IssmDouble *newz                        = NULL;
     2963        int *newelementslist            = NULL;
     2964        int newnumberofvertices = -1;
     2965        int newnumberofelements = -1;
     2966        bool* my_elements                       = NULL;
     2967        int* my_vertices                        = NULL;
     2968        int elementswidth                       = this->GetElementsWidth();//just tria elements in this version
    30242969
    30252970        /*Execute refinement and get the new mesh*/
     2971        /*newelementslist come in Matlab indexing*/
    30262972        this->ExecuteRefinement(newnumberofvertices,newnumberofelements,&newx,&newy,&newz,&newelementslist);
    30272973
    30282974        /*Partitioning the new mesh. Maybe ElementsAndVerticesPartitioning.cpp could be modified to set this without iomodel.*/
    30292975        this->ElementsAndVerticesPartitioning(newnumberofvertices,newnumberofelements,elementswidth,newelementslist,&my_elements,&my_vertices);
    3030        
     2976
    30312977        /*Creating new femmodel with new mesh*/
    3032         FemModel* output=new FemModel(*this);
     2978        FemModel* output = new FemModel(*this);
    30332979
    30342980        /*Copy basic attributes:*/
     
    30553001        output->vertices=new Vertices();
    30563002        this->CreateVertices(newnumberofvertices,newnumberofelements,elementswidth,newelementslist,my_vertices,newx,newy,newz,output->vertices);
    3057 
     3003 
    30583004        /*Creating elements*/
    30593005        /*Just Tria in this version*/
    30603006        output->elements=new Elements();
    3061         this->CreateElements(newnumberofelements,elementswidth,newelementslist,my_elements,output->elements);
    3062         /*Cleanup*/
    3063 //      xDelete<int>(newelementslist); itapopo     
     3007        this->CreateElements(newnumberofelements,elementswidth,newelementslist,my_elements,output->elements);
    30643008
    30653009        /*Creating materials*/
     
    30893033        /*Create constraints*/
    30903034        output->constraints=new Constraints();
    3091         this->CreateConstraints(newnumberofvertices,newnumberofelements,newelementslist,newx,newy,my_vertices,output->constraints);
     3035        this->CreateConstraints(newnumberofvertices,newnumberofelements,newx,newy,my_vertices,output->constraints);
    30923036       
    30933037        output->elements->Presort();
     
    31173061        }
    31183062
    3119         /*Finally: interpolate all inputs*/
    3120         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
     3063        /*Finally: interpolate all inputs and insert them into the new elements.*/
    31213064        this->InterpolateInputs(output);
    3122        
     3065        GetMaskOfIceVerticesLSMx(output);
     3066
    31233067        /*Reset current configuration: */
    31243068        analysis_type=output->analysis_type_list[this->analysis_counter];
    31253069        output->SetCurrentConfiguration(analysis_type);
    31263070
     3071        /*Cleanup*/
     3072        xDelete<IssmDouble>(newx);
     3073        xDelete<IssmDouble>(newy);
     3074        xDelete<IssmDouble>(newz);
     3075        xDelete<int>(newelementslist);
     3076        xDelete<int>(my_vertices);
     3077        xDelete<bool>(my_elements);
    31273078
    31283079        return output;
     3080
    31293081}
    31303082/*}}}*/
     
    31903142        }
    31913143
    3192         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
    3193         printf("Found %i %i inputs\n",numP0inputs,numP1inputs);
    3194 
    31953144        /*========== Deal with P0 inputs ==========*/
    31963145        int numelementsold = this->elements->NumberOfElements();
     
    32033152
    32043153        for(int i=0;i<numP0inputs;i++){
    3205                 printf("Dealing with %s (type: %s)\n",EnumToStringx(P0input_enums[i]),EnumToStringx(P0input_interp[i]));
    32063154                GetVectorFromInputsx(&vector,this,P0input_enums[i],ElementSIdEnum);
    32073155
     
    32103158                xDelete<IssmDouble>(vector);
    32113159        }
    3212         printf("Printing array to make sure it looks alright\n");
    3213         printarray(P0inputsold,numelementsold,numP0inputs);
    32143160
    32153161        /*========== Deal with P1 inputs ==========*/
     
    32193165
    32203166        for(int i=0;i<numP1inputs;i++){
    3221                 printf("Dealing with %s (type: %s)\n",EnumToStringx(P1input_enums[i]),EnumToStringx(P1input_interp[i]));
    32223167                GetVectorFromInputsx(&vector,this,P1input_enums[i],VertexSIdEnum);
    32233168
     
    32263171                xDelete<IssmDouble>(vector);
    32273172        }
    3228         printf("Printing array to make sure it looks alright\n");
    3229         printarray(P1inputsold,numverticesold,numP1inputs);
    32303173       
    32313174        /*Old mesh coordinates*/
     
    32343177        IssmDouble *Zold                = NULL;
    32353178        int        *Indexold = NULL;
    3236         int        *Indexnew = NULL;
    32373179        IssmDouble *Xnew     = NULL;
    32383180        IssmDouble *Ynew     = NULL;
    32393181        IssmDouble *Znew                = NULL;
     3182        IssmDouble* XC_new   = NULL;
     3183        IssmDouble* YC_new   = NULL;
     3184        int        *Indexnew = NULL;
    32403185       
    32413186        /*Get the old mesh*/
    3242         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
    32433187        this->GetMesh(this,&Xold,&Yold,&Zold,&Indexold);
    32443188
    32453189        /*Get the new mesh*/
    3246         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
    32473190        this->GetMesh(newfemmodel,&Xnew,&Ynew,&Znew,&Indexnew);
    3248        
    3249         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
     3191
     3192        /*Calculate the center points xc and xy*/
     3193        int elementswidth = this->GetElementsWidth(); //just tria in this version
     3194        /*new mesh*/
     3195        XC_new=xNewZeroInit<IssmDouble>(numelementsnew);
     3196        YC_new=xNewZeroInit<IssmDouble>(numelementsnew);
     3197        for(int i=0;i<numelementsnew;i++){
     3198                for(int j=0;j<elementswidth;j++){
     3199                        int vid = Indexnew[i*elementswidth+j]-1;//Transform to C indexing
     3200                        XC_new[i]+=Xnew[vid];
     3201                        YC_new[i]+=Ynew[vid];
     3202                }
     3203                XC_new[i]=XC_new[i]/3;
     3204                YC_new[i]=YC_new[i]/3;
     3205        }
     3206
    32503207        /*Interplate P0 inputs in the new mesh*/
    32513208        InterpFromMeshToMesh2dx(&P0inputsnew,Indexold,Xold,Yold,numverticesold,numelementsold,
    32523209                                P0inputsold,numelementsold,numP0inputs,
    3253                                 Xnew,Ynew,numelementsnew,NULL);
    3254        
    3255         printf("Printing array AFTER INTERP - P0 INPUTS - to make sure it looks alright\n");
    3256         printarray(P0inputsnew,numelementsnew,numP0inputs);
     3210                                XC_new,YC_new,numelementsnew,NULL);
    32573211       
    32583212        /*Interpolate P1 inputs in the new mesh*/
     
    32613215                                Xnew,Ynew,numverticesnew,NULL);
    32623216
    3263         printf("Printing array AFTER INTERP - P1 INPUTS - to make sure it looks alright\n");
    3264         printarray(P1inputsnew,numverticesnew,numP1inputs);
    3265        
    3266         _error_("STOP");
    3267 
     3217        /*Insert P0 inputs into the new elements.*/
     3218        vector=NULL;
     3219        for(int i=0;i<numP0inputs;i++){
     3220               
     3221                /*Get P0 input vector from the interpolated matrix*/
     3222                vector=xNew<IssmDouble>(numelementsnew);
     3223                for(int j=0;j<numelementsnew;j++) vector[j]=P0inputsnew[j*numP0inputs+i];//vector has values for all elements (serial)
     3224
     3225                /*Update elements from inputs: */
     3226                for(int j=0;j<newfemmodel->elements->Size();j++){
     3227                        Element* element=xDynamicCast<Element*>(newfemmodel->elements->GetObjectByOffset(j));
     3228                        switch(P0input_interp[i]){     
     3229                                case P0Enum:
     3230                                case DoubleInputEnum:
     3231                                        element->AddInput(new DoubleInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning
     3232                                        break;
     3233                                case IntInputEnum:
     3234                                        element->AddInput(new IntInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning
     3235                                        break;
     3236                                case BoolInputEnum:
     3237                                        element->AddInput(new BoolInput(P0input_enums[i],vector[element->sid]));//sid because newfemmodel has just a partitioning
     3238                                        break;
     3239                                default:
     3240                                        _error_(EnumToStringx(P0input_enums[i])<<" Not supported yet");
     3241                        }
     3242                }
     3243
     3244                xDelete<IssmDouble>(vector);
     3245        }
     3246
     3247        /*Insert P1 inputs into the new elements.*/
     3248        vector=NULL;
     3249        for(int i=0;i<numP1inputs;i++){
     3250
     3251                /*Get P0 input vector from the interpolated matrix*/
     3252                vector=xNew<IssmDouble>(numverticesnew);
     3253                for(int j=0;j<numverticesnew;j++) vector[j]=P1inputsnew[j*numP1inputs+i];//vector has all vertices      (serial)
     3254
     3255                /*Update elements from inputs: */
     3256                InputUpdateFromVectorx(newfemmodel,vector,P1input_enums[i],VertexSIdEnum);//VertexSId because vector is serial in SId indexing
     3257               
     3258                xDelete<IssmDouble>(vector);
     3259        }
     3260
     3261        /*Cleanup*/
     3262        xDelete<IssmDouble>(input_interpolations_serial);
    32683263        xDelete<IssmDouble>(P0inputsold);
    32693264        xDelete<IssmDouble>(P0inputsnew);
     3265        xDelete<int>(P0input_enums);
     3266        xDelete<int>(P0input_interp);
    32703267        xDelete<IssmDouble>(P1inputsold);
    32713268        xDelete<IssmDouble>(P1inputsnew);
    3272 
    3273         _error_("STOP");
    3274 }
    3275 /*}}}*/
    3276 void FemModel::ExecuteRefinement(int &newnumberofvertices,int &newnumberofelements,IssmDouble** newx,IssmDouble** newy,IssmDouble** newz,int** pnewelementslist){/*{{{*/
    3277 
    3278         int **newelements=NULL;
    3279         int **newsegments=NULL;
    3280         int newnumberofsegments=-1;
    3281        
    3282         /*All indexing here is in C type: 0..n-1*/
    3283         int my_rank=IssmComm::GetRank();
    3284    const int elementswidth=3;//just 2D mesh, tria elements
     3269        xDelete<int>(P1input_enums);
     3270        xDelete<int>(P1input_interp);
     3271        xDelete<IssmDouble>(Xold);
     3272        xDelete<IssmDouble>(Yold);
     3273        xDelete<IssmDouble>(Zold);
     3274        xDelete<int>(Indexold);
     3275        xDelete<IssmDouble>(Xnew);
     3276        xDelete<IssmDouble>(Ynew);
     3277        xDelete<IssmDouble>(Znew);
     3278        xDelete<IssmDouble>(XC_new);
     3279        xDelete<IssmDouble>(YC_new);
     3280        xDelete<int>(Indexnew);
     3281
     3282}
     3283/*}}}*/
     3284void FemModel::ExecuteRefinement(int &numberofvertices,int &numberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist){/*{{{*/
     3285       
     3286        /*elements is in Matlab indexing*/
     3287       
     3288        int my_rank                                      = IssmComm::GetRank();
     3289        int numberofsegments             = -1;
     3290        IssmDouble* vx                           = NULL; //itapopo this is not being used
     3291        IssmDouble* vy                           = NULL; //itapopo this is not being used
     3292        IssmDouble* x                            = NULL;
     3293        IssmDouble* y                            = NULL;
     3294        IssmDouble* z                            = NULL;
     3295        int* elementslist                        = NULL;
     3296        int* segments                            = NULL;
     3297        IssmDouble* masklevelset = NULL;
     3298   const int elementswidth  = this->GetElementsWidth();//just 2D mesh, tria elements
    32853299       
    32863300        /*Solutions which will be used to refine the elements*/
    3287         IssmDouble* vx=NULL; //itapopo this is not being used
    3288         IssmDouble* vy=NULL; //itapopo this is not being used
    3289         IssmDouble* masklevelset=NULL;
    3290         int* newelementslist=NULL;
    3291 
    32923301        this->GetMaskLevelSet(&masklevelset);//itapopo verificar se já existe um método igual a esse
    32933302       
    3294         int type_process=1; //1: it refines father mesh. See AdaptiveMeshRefinement.h (.cpp)
    32953303        if(my_rank==0){
    3296                 this->amr->ExecuteRefinement(type_process,vx,vy,masklevelset,newnumberofvertices,newnumberofelements,newnumberofsegments,newx,newy,newz,&newelements,&newsegments);
    3297                 if(newnumberofvertices<=0 || newnumberofelements<=0 /*|| newnumberofsegments<=0*/) _error_("Error in the refinement process.");
    3298                
    3299 //              printf("   PRINTING COORDINATES... \n");           
    3300  //             for(int i=0;i<newnumberofvertices;i++) std::cout << "ID: " << i << "\t" << "X: " << newx[i] << "\t" << "Y: " << newy[i] << "\n";
    3301   //    printf("   PRINTING ELEMENTS... \n");     
    3302   //    for(int i=0;i<newnumberofelements;i++) std::cout << "El: " << i << "\t" << newelements[i][0] << "\t" << newelements[i][1] << "\t" << newelements[i][2] << "\n";
    3303         }
    3304        
    3305         /*Fill the element list to partitioning*/       
    3306         if(my_rank==0){
    3307                 newelementslist=xNew<int>(newnumberofelements*elementswidth);
    3308                 for(int i=0;i<newnumberofelements;i++){ //itapopo os elementos poderão sair do ExecuteRefinement nesse formato
    3309                         for(int j=0;j<elementswidth;j++){
    3310                                 newelementslist[elementswidth*i+j]=newelements[i][j]; //C indexing
    3311                         }
    3312                 }       
    3313                 (*pnewelementslist)=newelementslist;
    3314         }
    3315 
    3316         /*Cleanup masklevetset*/
     3304                int type_process=1; //1: it refines father mesh. See AdaptiveMeshRefinement.h (.cpp)
     3305                this->amr->ExecuteRefinement(type_process,vx,vy,masklevelset,
     3306                                                                                                numberofvertices,numberofelements,numberofsegments,&x,&y,&z,&elementslist,&segments);
     3307                if(numberofvertices<=0 || numberofelements<=0 /*|| newnumberofsegments<=0*/) _error_("Error in the refinement process.");
     3308        }
     3309        else{
     3310                x=xNew<IssmDouble>(numberofvertices);
     3311                y=xNew<IssmDouble>(numberofvertices);
     3312                z=xNew<IssmDouble>(numberofvertices);
     3313                elementslist=xNew<int>(numberofelements*this->GetElementsWidth());
     3314        }
     3315
     3316        /*Send new mesh to others CPU*/
     3317        ISSM_MPI_Bcast(&numberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm());
     3318        ISSM_MPI_Bcast(&numberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm());
     3319        ISSM_MPI_Bcast(x,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());     
     3320        ISSM_MPI_Bcast(y,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());     
     3321        ISSM_MPI_Bcast(z,numberofvertices,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());     
     3322        ISSM_MPI_Bcast(elementslist,numberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());     
     3323
     3324        /*Assign the pointers*/
     3325        (*pelementslist) = elementslist; //Matlab indexing
     3326        (*px)                             = x;
     3327        (*py)                             = y;
     3328        (*pz)                             = z;
     3329
     3330        /*Cleanup*/
     3331        if(segments) xDelete<int>(segments);
    33173332        xDelete<IssmDouble>(masklevelset);
     3333
    33183334}
    33193335/*}}}*/
    33203336void FemModel::GetMaskLevelSet(IssmDouble **pmasklevelset){/*{{{*/
    33213337
    3322         int elementswidth=3;//just 2D mesh, tria elements
    3323         int numberofelements=this->elements->NumberOfElements();
    3324         int numberofvertices=this->vertices->NumberOfVertices();
     3338        int elementswidth               = this->GetElementsWidth();//just 2D mesh, tria elements
     3339        int numberofelements = this->elements->NumberOfElements();
     3340        int numberofvertices = this->vertices->NumberOfVertices();
    33253341
    33263342        IssmDouble* elementlevelset=xNew<IssmDouble>(elementswidth);
     
    33523368void FemModel::CreateVertices(int newnumberofvertices,int newnumberofelements,int elementswidth,int* newelementslist,int* my_vertices,IssmDouble* newx,IssmDouble* newy,IssmDouble* newz,Vertices* vertices){/*{{{*/
    33533369
     3370        /*newelementslist is in Matlab indexing*/
     3371       
    33543372        /*Creating connectivity table*/
    33553373        int* connectivity=NULL;
     
    33583376        for (int i=0;i<newnumberofelements;i++){
    33593377                for (int j=0;j<elementswidth;j++){
    3360                         int vertexid = newelementslist[elementswidth*i+j];//C indexing
    3361                         _assert_(vertexid>-1 && vertexid<newnumberofvertices);
    3362                         connectivity[vertexid]+=1;
     3378                        int vertexid = newelementslist[elementswidth*i+j];
     3379                        _assert_(vertexid>0 && vertexid-1<newnumberofvertices);//Matlab indexing
     3380                        connectivity[vertexid-1]+=1;//Matlab to C indexing
    33633381                }
    33643382        }       
     
    33863404/*}}}*/
    33873405void FemModel::CreateElements(int newnumberofelements,int elementswidth,int* newelementslist,bool* my_elements,Elements* elements){/*{{{*/
     3406
     3407        /*newlementslist is in Matlab indexing*/
    33883408
    33893409        for(int i=0;i<newnumberofelements;i++){
     
    34103430                        /*retrieve vertices ids*/
    34113431                        int* vertex_ids=xNew<int>(elementswidth);
    3412                         for(int j=0;j<elementswidth;j++)        vertex_ids[j]=reCast<int>(newelementslist[elementswidth*i+j])+1;//this Hook wants Matlab indexing       
     3432                        for(int j=0;j<elementswidth;j++)        vertex_ids[j]=reCast<int>(newelementslist[elementswidth*i+j]);//this Hook wants Matlab indexing
    34133433                        /*Setting the hooks*/
    34143434                        newtria->numanalyses =this->nummodels;
     
    34263446        }
    34273447
    3428         //itapopo there is this line in CreateElementsVerticesAndMaterials.
    3429         //elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
    34303448}
    34313449/*}}}*/
     
    34413459        /*Add new constant material property to materials, at the end: */
    34423460        Matpar *newmatpar=static_cast<Matpar*>(this->materials->GetObjectByOffset(this->materials->Size()-1)->copy());
     3461        newmatpar->mid = newnumberofelements+1;//itapopo testando
    34433462        materials->AddObject(newmatpar);//put it at the end of the materials       
    34443463
     
    34483467
    34493468        int lid=0;
    3450 //itapopo use the GetMesh!!
    34513469        for(int j=0;j<newnumberofvertices;j++){
    34523470                if(my_vertices[j]){                             
     
    34973515       
    34983516        int numberofvertices, numberofelements;
    3499         int elementswidth = 3; //itapopo just 2D mesh in this version (just tria elements)
     3517        int elementswidth = this->GetElementsWidth(); // just 2D mesh in this version (just tria elements)
    35003518        IssmDouble *x           = NULL;
    35013519        IssmDouble *y           = NULL;
     
    35383556        if(numberofelements*elementswidth<0) _error_("numberofelements negative.");
    35393557        for(int i=0;i<numberofelements;i++){
    3540                 std::cout << (int)id1[i]+1 << " " << (int)id2[i]+1 <<" " << (int)id3[i]+1 <<  std::endl;
    35413558                elementslist[elementswidth*i+0] = (int)id1[i]+1; //InterpMesh wants Matlab indexing
    35423559                elementslist[elementswidth*i+1] = (int)id2[i]+1; //InterpMesh wants Matlab indexing
     
    35483565        *py                             = y;
    35493566        *pz                             = z;
    3550         *pelementslist = elementslist;
    3551 }
    3552 /*}}}*/
    3553 void FemModel::CreateConstraints(int newnumberofvertices,int newnumberofelements,int* newelementslist,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints){/*{{{*/
     3567        *pelementslist = elementslist; //Matlab indexing. InterMesh uses this type.
     3568
     3569        /*Cleanup*/
     3570        xDelete<int>(elem_vertices);
     3571        xDelete<IssmDouble>(id1);
     3572        xDelete<IssmDouble>(id2);
     3573        xDelete<IssmDouble>(id3);
     3574        delete vid1;
     3575        delete vid2;
     3576        delete vid3;
     3577}
     3578/*}}}*/
     3579void FemModel::CreateConstraints(int newnumberofvertices,int newnumberofelements,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints){/*{{{*/
    35543580
    35553581        /*Get x and y of the mesh i-1*/
    3556         int numberofvertices, numberofelements;
    3557         numberofvertices = this->vertices->NumberOfVertices();
    3558         numberofelements = this->elements->NumberOfElements();
    3559 
    3560         /*Get vertices coordinates*/
    3561         IssmDouble *x = NULL;
    3562         IssmDouble *y = NULL;
    3563         IssmDouble *z = NULL;
    3564         VertexCoordinatesx(&x, &y, &z, this->vertices,false) ;
    3565 
    3566         /*Get element vertices*/
    3567         int elementswidth = 3; //just 2D mesh in this version (just tria elements)
    3568         int* elem_vertices=xNew<int>(elementswidth);
    3569         Vector<IssmDouble>* vid1= new Vector<IssmDouble>(numberofelements);
    3570         Vector<IssmDouble>* vid2= new Vector<IssmDouble>(numberofelements);
    3571         Vector<IssmDouble>* vid3= new Vector<IssmDouble>(numberofelements);
    3572 
    3573         /*Go through elements, and for each element, get vertices*/
    3574    for(int i=0;i<this->elements->Size();i++){
    3575         Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
    3576         element->GetVerticesSidList(elem_vertices);
    3577         vid1->SetValue(element->sid,elem_vertices[0],INS_VAL);
    3578         vid2->SetValue(element->sid,elem_vertices[1],INS_VAL);
    3579         vid3->SetValue(element->sid,elem_vertices[2],INS_VAL);
    3580    }
    3581                
    3582         /*Assemble*/
    3583    vid1->Assemble();
    3584    vid2->Assemble();
    3585    vid3->Assemble();
    3586 
    3587    /*Serialize*/
    3588         IssmDouble *id1 = vid1->ToMPISerial();
    3589    IssmDouble *id2 = vid2->ToMPISerial();
    3590         IssmDouble *id3 = vid3->ToMPISerial();
    3591        
    3592         /*Construct elements list (mesh i-1)*/
    3593         int* elementslist=NULL;
    3594         elementslist=xNew<int>(numberofelements*elementswidth);
    3595         for(int i=0;i<numberofelements;i++){ //itapopo os elementos poderão sair do ExecuteRefinement nesse formato
    3596                 elementslist[elementswidth*i+0] = (int)id1[i]+1; //InterpMesh wants Matlab indexing
    3597                 elementslist[elementswidth*i+1] = (int)id2[i]+1; //InterpMesh wants Matlab indexing
    3598                 elementslist[elementswidth*i+2] = (int)id3[i]+1; //InterpMesh wants Matlab indexinf
    3599         }       
    3600 
     3582        int my_rank                                             = IssmComm::GetRank();
     3583        int numberofvertices                    = this->vertices->NumberOfVertices();
     3584        int numberofelements                    = this->elements->NumberOfElements();
     3585        IssmDouble *x                                   = NULL;
     3586        IssmDouble *y                                   = NULL;
     3587        IssmDouble *z                                   = NULL;
     3588        int        *elementslist        = NULL;
     3589
     3590        /*elementslist is in Matlab indexing*/
     3591        this->GetMesh(this,&x,&y,&z,&elementslist);
     3592       
    36013593        /*itapopo ATTENTION: JUST SPCVX AND SPCVY TO TEST!!!*/
    36023594        /*OTHERS CONSTRAINTS MUST BE IMPLEMENTED!!!*/
     
    36453637
    36463638        /*Serialize*/
    3647         spcvx=vspcvx->ToMPISerial();
    3648         spcvy=vspcvy->ToMPISerial();
    3649         spcvxflag=vspcvxflag->ToMPISerial();
    3650         spcvyflag=vspcvyflag->ToMPISerial();
    3651         /*Free the data*/
    3652         delete vspcvx;
    3653         delete vspcvy; 
    3654         delete vspcvxflag;
    3655         delete vspcvyflag;
    3656        
    3657         IssmDouble *newspcvx=NULL;
    3658         IssmDouble *newspcvy=NULL;
    3659         IssmDouble *newspcvxflag=NULL;
    3660         IssmDouble *newspcvyflag=NULL;
    3661         int nods_data=numberofvertices;
    3662         int nels_data=numberofelements;
    3663         int M_data=numberofvertices;
    3664         int N_data=1;
    3665         int N_interp=newnumberofvertices;
    3666         Options *options=new Options();
     3639        spcvx            = vspcvx->ToMPISerial();
     3640        spcvy            = vspcvy->ToMPISerial();
     3641        spcvxflag = vspcvxflag->ToMPISerial();
     3642        spcvyflag = vspcvyflag->ToMPISerial();
     3643       
     3644        IssmDouble *newspcvx             = NULL;
     3645        IssmDouble *newspcvy             = NULL;
     3646        IssmDouble *newspcvxflag = NULL;
     3647        IssmDouble *newspcvyflag = NULL;
     3648        int nods_data                            = numberofvertices;
     3649        int nels_data                            = numberofelements;
     3650        int M_data                                       = numberofvertices;
     3651        int N_data                                       = 1;
     3652        int N_interp                             = newnumberofvertices;
    36673653
    36683654  /*Interpolate spcvx and spcvy in the new mesh*/
    3669         InterpFromMeshToMesh2dx(&newspcvx,elementslist,x,y,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,options);
    3670         InterpFromMeshToMesh2dx(&newspcvy,elementslist,x,y,nods_data,nels_data,spcvy,M_data,N_data,newx,newy,N_interp,options);
    3671         InterpFromMeshToMesh2dx(&newspcvxflag,elementslist,x,y,nods_data,nels_data,spcvxflag,M_data,N_data,newx,newy,N_interp,options);
    3672         InterpFromMeshToMesh2dx(&newspcvyflag,elementslist,x,y,nods_data,nels_data,spcvyflag,M_data,N_data,newx,newy,N_interp,options);
     3655        InterpFromMeshToMesh2dx(&newspcvx,elementslist,x,y,nods_data,nels_data,spcvx,M_data,N_data,newx,newy,N_interp,NULL);
     3656        InterpFromMeshToMesh2dx(&newspcvy,elementslist,x,y,nods_data,nels_data,spcvy,M_data,N_data,newx,newy,N_interp,NULL);
     3657        InterpFromMeshToMesh2dx(&newspcvxflag,elementslist,x,y,nods_data,nels_data,spcvxflag,M_data,N_data,newx,newy,N_interp,NULL);
     3658        InterpFromMeshToMesh2dx(&newspcvyflag,elementslist,x,y,nods_data,nels_data,spcvyflag,M_data,N_data,newx,newy,N_interp,NULL);
    36733659       
    36743660        int nodecounter                 = 0; //itapopo deve começar pelo primeiro nó do StressbalanceAnalysis
     
    36963682                        count++;
    36973683                }
    3698 
    3699         }
     3684        }
     3685
     3686        /*Cleanup*/
     3687        xDelete<IssmDouble>(x);
     3688        xDelete<IssmDouble>(y);
     3689        xDelete<IssmDouble>(z);
     3690        xDelete<int>(elementslist);
     3691        xDelete<IssmDouble>(spcvx);
     3692        xDelete<IssmDouble>(spcvy);
     3693        xDelete<IssmDouble>(spcvxflag);
     3694        xDelete<IssmDouble>(spcvyflag);
     3695        xDelete<IssmDouble>(newspcvx);
     3696        xDelete<IssmDouble>(newspcvy);
     3697        xDelete<IssmDouble>(newspcvxflag);
     3698        xDelete<IssmDouble>(newspcvyflag);
     3699        delete vspcvx;
     3700        delete vspcvy; 
     3701        delete vspcvxflag;
     3702        delete vspcvyflag;
     3703
    37003704}
    37013705/*}}}*/
    37023706void FemModel::UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int nodecounter,int analysis_counter,Elements* newelements){/*{{{*/
     3707
     3708        /*newelementslist is in Matlab indexing*/
    37033709
    37043710        /*Update elements, set hnode.
     
    37123718                        int numnodes=3;
    37133719         int* tria_node_ids=xNew<int>(numnodes);
    3714          tria_node_ids[0]=nodecounter+newelementslist[3*iel+0]+1; //matlab indexing
    3715          tria_node_ids[1]=nodecounter+newelementslist[3*iel+1]+1; //matlab indexing
    3716          tria_node_ids[2]=nodecounter+newelementslist[3*iel+2]+1; //matlab indexing
     3720         tria_node_ids[0]=nodecounter+newelementslist[3*iel+0]; //matlab indexing
     3721         tria_node_ids[1]=nodecounter+newelementslist[3*iel+1]; //matlab indexing
     3722         tria_node_ids[2]=nodecounter+newelementslist[3*iel+2]; //matlab indexing
    37173723                        tria->SetHookNodes(tria_node_ids,numnodes,analysis_counter); tria->nodes=NULL;
    37183724                xDelete<int>(tria_node_ids);
     
    37253731void FemModel::ElementsAndVerticesPartitioning(int& newnumberofvertices,int& newnumberofelements,int& elementswidth,int* newelementslist,bool** pmy_elements,int** pmy_vertices){/*{{{*/
    37263732
    3727         int *epart=NULL; //element partitioning.
    3728         int *npart=NULL; //node partitioning.
    3729         int edgecut=1;
    3730         int numflag=0;
    3731         int etype=1;
    3732         int my_rank = IssmComm::GetRank();
    3733         int numprocs=IssmComm::GetSize();
    3734         bool *my_elements=NULL;
    3735         int *my_vertices=NULL;
     3733        /*newelementslist come in Matlab indexing*/
     3734
     3735        int *epart                      = NULL; //element partitioning.
     3736        int *npart                      = NULL; //node partitioning.
     3737        int *index                      = NULL; //elements in C indexing
     3738        int edgecut                     = 1;
     3739        int numflag                     = 0;
     3740        int etype                       = 1;
     3741        int my_rank                     = IssmComm::GetRank();
     3742        int numprocs            = IssmComm::GetSize();
     3743        bool *my_elements = NULL;
     3744        int *my_vertices  = NULL;
    37363745       
    37373746        _assert_(newnumberofvertices>0);
     
    37393748        epart=xNew<int>(newnumberofelements);
    37403749        npart=xNew<int>(newnumberofvertices);
     3750   index=xNew<int>(elementswidth*newnumberofelements);
     3751   
     3752        for (int i=0;i<newnumberofelements;i++){
     3753        for (int j=0;j<elementswidth;j++){
     3754        *(index+elementswidth*i+j)=(*(newelementslist+elementswidth*i+j))-1; //-1 for C indexing in Metis
     3755      }
     3756   }
    37413757
    37423758        /*Partition using Metis:*/
    37433759        if (numprocs>1){
    37443760#ifdef _HAVE_METIS_
    3745                 METIS_PartMeshNodalPatch(&newnumberofelements,&newnumberofvertices, newelementslist, &etype, &numflag, &numprocs, &edgecut, epart, npart);
     3761                METIS_PartMeshNodalPatch(&newnumberofelements,&newnumberofvertices, index, &etype, &numflag, &numprocs, &edgecut, epart, npart);
    37463762#else
    37473763                _error_("metis has not beed installed. Cannot run with more than 1 cpu");
     
    37703786                         will hold which vertices belong to this partition*/
    37713787                        for(int j=0;j<elementswidth;j++){
    3772                                 _assert_(newelementslist[elementswidth*i+j]<newnumberofvertices);
    3773                                 my_vertices[newelementslist[elementswidth*i+j]]=1;
     3788                                _assert_(newelementslist[elementswidth*i+j]-1<newnumberofvertices);//newelementslist is in Matlab indexing
     3789                                my_vertices[newelementslist[elementswidth*i+j]-1]=1;//newelementslist is in Matlab indexing
    37743790                        }
    37753791                }
    37763792        }
     3793
     3794        /*Assign output pointers:*/
     3795        *pmy_elements=my_elements;
     3796        *pmy_vertices=my_vertices;
    37773797
    37783798        /*Free ressources:*/
    37793799        xDelete<int>(epart);
    37803800        xDelete<int>(npart);       
    3781 
    3782         /*Assign output pointers:*/
    3783         *pmy_elements=my_elements;
    3784         *pmy_vertices=my_vertices;
     3801        xDelete<int>(index);
    37853802
    37863803}
  • issm/trunk-jpl/src/c/classes/FemModel.h

    r21524 r21528  
    150150                FemModel* ReMesh(void);
    151151                void GetMesh(FemModel* femmodel,IssmDouble** px, IssmDouble** py, IssmDouble** pz, int** pelementslist);
    152                 void ExecuteRefinement(int &newnumberofvertices,int &newnumberofelements,IssmDouble** newx,IssmDouble** newy,IssmDouble** newz,int** newelementslist);
     152                int GetElementsWidth(){return 3;};//just tria elements in this first version
     153                void ExecuteRefinement(int &numberofvertices,int &numberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist);
    153154                void GetMaskLevelSet(IssmDouble** pmasklevelset);
    154155                void CreateVertices(int newnumberofvertices,int newnumberofelements,int elementswidth,int* newelementslist,int* my_vertices,IssmDouble* newx,IssmDouble* newy,IssmDouble* newz,Vertices* vertices);
     
    156157                void CreateMaterials(int newnumberofelements,bool* my_elements,Materials* materials);
    157158                void CreateNodes(int newnumberofvertices,int* my_vertices,int nodecounter,int analysis_enum,Nodes* nodes);
    158                 void CreateConstraints(int newnumberofvertices,int newnumberofelements,int* newelementslist,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints);
     159                void CreateConstraints(int newnumberofvertices,int newnumberofelements,IssmDouble* newx,IssmDouble* newy,int* my_vertices,Constraints* constraints);
    159160                void InterpolateInputs(FemModel* femmodel);
    160161                void UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int nodecounter,int analysis_counter,Elements* newelements);
Note: See TracChangeset for help on using the changeset viewer.