Changeset 23065


Ignore:
Timestamp:
08/07/18 06:15:18 (7 years ago)
Author:
tsantos
Message:

CHG: only one MPI call after Remesh core

Location:
issm/trunk-jpl
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/externalpackages/neopz/install.sh

    r22704 r23065  
    2020#Configure neopz using cmake
    2121cd $PROJECT_SOURCE_DIR
    22 cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR
     22cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-g -O3"
    2323
    2424cd $PROJECT_SOURCE_DIR
  • issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp

    r22294 r23065  
    100100
    101101/*Mesh refinement methods*/
    102 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
     102void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int** pdatalist,double** pxylist,int** pelementslist){/*{{{*/
    103103       
    104104        /*IMPORTANT! pelementslist are in Matlab indexing*/
     
    123123   
    124124        /*Get new geometric mesh in ISSM data structure*/
    125         this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
     125        this->GetMesh(this->previousmesh,pdatalist,pxylist,pelementslist);
    126126
    127127        /*Verify the new geometry*/
    128         this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
     128        this->CheckMesh(pdatalist,pxylist,pelementslist);
    129129}
    130130/*}}}*/
     
    449449}
    450450/*}}}*/
    451 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py, int** pelements){/*{{{*/
     451void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int** pdata,double** pxy, int** pelements){/*{{{*/
    452452
    453453        /* IMPORTANT! pelements are in Matlab indexing
     
    462462        int ntotalvertices              = gmesh->NNodes();
    463463        int* newelements                        = NULL;
    464         double* newmeshX                        = NULL;
    465         double* newmeshY                        = NULL;
     464        int* newdata                            = NULL;
     465        double* newmeshXY                       = NULL;
    466466        TPZGeoEl* geoel                 = NULL;
    467467        long* vertex_index2sid  = xNew<long>(ntotalvertices);
     
    494494        }
    495495
     496        /* Create new mesh structure and fill it */
    496497        nconformelements        = (int)this->sid2index.size();
    497498        nconformvertices        = (int)sid;
    498499        newelements                     = xNew<int>(nconformelements*this->GetNumberOfNodes());
    499         newmeshX                                = xNew<double>(nconformvertices);
    500    newmeshY                             = xNew<double>(nconformvertices);
     500        newmeshXY                       = xNew<double>(nconformvertices*2);
     501        newdata                         = xNew<int>(2);
     502        newdata[0]                      = nconformvertices;
     503        newdata[1]                      = nconformelements;
    501504
    502505        for(int i=0;i<ntotalvertices;i++){//over the TPZNode index (fill in the ISSM vertices coords)
     
    505508                TPZVec<REAL> coords(3,0.);
    506509                gmesh->NodeVec()[i].GetCoordinates(coords);
    507                 newmeshX[sid] = coords[0];
    508                 newmeshY[sid] = coords[1];
     510                newmeshXY[2*sid]                = coords[0]; // X
     511                newmeshXY[2*sid+1]      = coords[1]; // Y
    509512        }
    510513               
     
    525528                c=newelements[i*this->GetNumberOfNodes()+2]-1;
    526529
    527                 xa=newmeshX[a]; ya=newmeshY[a];
    528                 xb=newmeshX[b]; yb=newmeshY[b];
    529                 xc=newmeshX[c]; yc=newmeshY[c];
     530                xa=newmeshXY[2*a]; ya=newmeshXY[2*a+1];
     531                xb=newmeshXY[2*b]; yb=newmeshXY[2*b+1];
     532                xc=newmeshXY[2*c]; yc=newmeshXY[2*c+1];
    530533
    531534                detJ=(xb-xa)*(yc-ya)-(xc-xa)*(yb-ya);
     
    539542
    540543        /*Setting outputs*/
    541         *nvertices      = nconformvertices;
    542         *nelements      = nconformelements;
    543         *px                     = newmeshX;
    544         *py                = newmeshY;
     544        *pdata          = newdata;
     545        *pxy               = newmeshXY;
    545546        *pelements      = newelements;
    546547   
     
    693694}
    694695/*}}}*/
    695 void AdaptiveMeshRefinement::CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements){/*{{{*/
     696void AdaptiveMeshRefinement::CheckMesh(int** pdata,double** pxy,int** pelements){/*{{{*/
    696697
    697698        /*Basic verification*/
    698         if(nvertices<=0) _error_("Impossible to continue: nvertices <=0!\n");
    699         if(nelements<=0) _error_("Impossible to continue: nelements <=0!\n");
    700         if(!px) _error_("Impossible to continue: px is NULL!\n");
    701         if(!py) _error_("Impossible to continue: py is NULL!\n");
     699        if(!pdata) _error_("Impossible to continue: pdata is NULL!\n");
     700        if(pdata[0]<=0) _error_("Impossible to continue: nvertices <=0!\n");
     701        if(pdata[1]<=0) _error_("Impossible to continue: nelements <=0!\n");
     702        if(!pxy) _error_("Impossible to continue: pxy is NULL!\n");
    702703        if(!pelements) _error_("Impossible to continue: pelements is NULL!\n");
    703 
    704         /*Verify if there are orphan nodes*/
    705         std::set<int> elemvertices;
    706         elemvertices.clear();
    707         for(int i=0;i<*nelements;i++){
    708                 for(int j=0;j<this->GetNumberOfNodes();j++) {
    709                         elemvertices.insert((*pelements)[i*this->GetNumberOfNodes()+j]);
    710                 }
    711         }
    712         if(elemvertices.size()!=*nvertices) _error_("Impossible to continue: elemvertices.size() != nvertices!\n");
    713        
    714         //Verify if there are inf or NaN in coords
    715         for(int i=0;i<*nvertices;i++){
    716                 if(std::isnan((*px)[i]) || std::isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");
    717                 if(std::isnan((*py)[i]) || std::isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");
    718         }
    719         for(int i=0;i<*nelements;i++){
    720                 for(int j=0;j<this->GetNumberOfNodes();j++){
    721                         if(std::isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n");
    722                         if(std::isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n");
    723                 }
    724         }
    725    
    726704}
    727705/*}}}*/
  • issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h

    r22704 r23065  
    6767        void CleanUp();
    6868        void Initialize();
    69         void ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
    70         void ExecuteRefinement(int numberofpoints,double* xylist,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
    71    void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
     69   void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int** pdatalist,double** pxy,int** pelementslist);
    7270        void CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements);
    73         void CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements);
     71        void CheckMesh(int** pdata,double** pxy,int** pelements);
    7472        /*}}}*/
    7573private:
     
    8684        void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh);
    8785        void DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh);
    88         void GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py,int** pelements);
     86        void GetMesh(TPZGeoMesh* gmesh,int** pdata,double** pxy,int** pelements);
    8987        TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh);
    9088   inline int GetElemMaterialID(){return 1;}
  • issm/trunk-jpl/src/c/classes/AmrBamg.cpp

    r22294 r23065  
    9898        delete Th;
    9999}/*}}}*/
    100 void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist){/*{{{*/
     100void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int** pdatalist,IssmDouble** pxylist,int** pelementslist){/*{{{*/
    101101
    102102        /*Intermediaries*/
     
    150150
    151151        /*Prepare output*/
    152         int nbv = meshout->VerticesSize[0];
    153         int nbt = meshout->TrianglesSize[0];
    154         IssmDouble *x = xNew<IssmDouble>(nbv);
    155         IssmDouble *y = xNew<IssmDouble>(nbv);
    156         IssmDouble *z = xNew<IssmDouble>(nbv);
     152        int nbv                         = meshout->VerticesSize[0];
     153        int nbt                         = meshout->TrianglesSize[0];
     154        int *datalist           = xNew<int>(2);
     155        IssmDouble *xylist= xNew<IssmDouble>(nbv*2);
     156        int* elementslist = xNew<int>(nbt*3);
     157       
     158        datalist[0] = nbv;
     159        datalist[1] = nbt;
     160       
    157161        for(int i=0;i<nbv;i++){
    158                 x[i] = meshout->Vertices[i*3+0];
    159                 y[i] = meshout->Vertices[i*3+1];
    160                 z[i] = 0.;
     162                xylist[2*i]             = meshout->Vertices[i*3+0];
     163                xylist[2*i+1]   = meshout->Vertices[i*3+1];
    161164        }
    162         int* elementslist= xNew<int>(nbt*3);
     165       
    163166        for(int i=0;i<nbt;i++){
    164167                elementslist[3*i+0] = reCast<int>(meshout->Triangles[4*i+0]);
     
    167170        }
    168171
     172        /*Assign pointers*/
     173        *pdatalist              = datalist;
     174        *pxylist                        = xylist;
     175        *pelementslist = elementslist;
     176       
    169177        /*Cleanup and return*/
    170178        delete geomout;
    171         *pnewnumberofvertices = nbv;
    172         *pnewnumberofelements = nbt;
    173         *px = x;
    174         *py = y;
    175         *pz = z;
    176         *pelementslist = elementslist;
    177179}/*}}}*/
    178180void AmrBamg::SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in){/*{{{*/
  • issm/trunk-jpl/src/c/classes/AmrBamg.h

    r22294 r23065  
    3535                /*General methods*/
    3636                void Initialize(int* elements,IssmDouble* x,IssmDouble* y,int numberofvertices,int numberofelements);
    37                 void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist);
     37                void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int** pdatalist,IssmDouble** pxylist,int** pelementslist);
    3838                void SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in);
    3939
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r23053 r23065  
    48774877        IssmDouble *newy                        = NULL;
    48784878        IssmDouble *newz                        = NULL;
     4879        IssmDouble *newxylist   = NULL;
    48794880        int *newelementslist            = NULL;
     4881        int* newdatalist        = NULL;
    48804882        int newnumberofvertices = -1;
    48814883        int newnumberofelements = -1;
     
    49114913
    49124914        if(my_rank==0){
    4913                 this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist);
    4914                 if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the refinement process.");
    4915         }
    4916 
    4917         /*Cleanup*/
    4918         xDelete<IssmDouble>(vector_serial);
    4919         xDelete<IssmDouble>(hmaxvertices_serial);
    4920         delete vector;
    4921 
    4922         /*Send new mesh to others CPU*/
    4923         ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm());
    4924         ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm());
    4925         if(my_rank){
    4926                 newx=xNew<IssmDouble>(newnumberofvertices);
    4927                 newy=xNew<IssmDouble>(newnumberofvertices);
    4928                 newz=xNew<IssmDouble>(newnumberofvertices);
    4929                 newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
    4930         }
    4931         ISSM_MPI_Bcast(newx,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    4932         ISSM_MPI_Bcast(newy,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    4933         ISSM_MPI_Bcast(newz,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    4934         ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
    4935 
    4936         /*Assign output pointers*/
    4937         *pnewnumberofvertices = newnumberofvertices;
    4938         *pnewnumberofelements = newnumberofelements;
    4939         *pnewx = newx;
    4940         *pnewy = newy;
    4941         *pnewz = newz;
    4942         *pnewelementslist = newelementslist;
     4915                this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newdatalist,&newxylist,&newelementslist);
     4916                if(newdatalist[0]<=0 || newdatalist[1]<=0) _error_("Error in the refinement process.");
     4917        }
     4918
     4919   /*Send new mesh to others CPU's*/
     4920   if(my_rank) newdatalist=xNew<int>(2);
     4921   ISSM_MPI_Bcast(newdatalist,2,ISSM_MPI_INT,0,IssmComm::GetComm());
     4922   newnumberofvertices=newdatalist[0];
     4923   newnumberofelements=newdatalist[1];
     4924   if(my_rank){
     4925      newxylist      =xNew<IssmDouble>(newnumberofvertices*2);
     4926      newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
     4927   }
     4928   ISSM_MPI_Bcast(newxylist,newnumberofvertices*2,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     4929   ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
     4930
     4931        /*Reorganize the data*/
     4932   newx=xNew<IssmDouble>(newnumberofvertices);
     4933   newy=xNew<IssmDouble>(newnumberofvertices);
     4934   newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
     4935   for(int i=0;i<newnumberofvertices;i++){
     4936      newx[i] = newxylist[2*i];
     4937      newy[i] = newxylist[2*i+1];
     4938   }
     4939
     4940   /*Assign output pointers*/
     4941   *pnewnumberofvertices = newnumberofvertices;
     4942   *pnewnumberofelements = newnumberofelements;
     4943   *pnewx = newx;
     4944   *pnewy = newy;
     4945   *pnewz = newz;
     4946   *pnewelementslist = newelementslist;
     4947
     4948   /*Cleanup*/
     4949   xDelete<int>(newdatalist);
     4950   xDelete<IssmDouble>(newxylist);
     4951   xDelete<IssmDouble>(vector_serial);
     4952   xDelete<IssmDouble>(hmaxvertices_serial);
     4953   delete vector;
    49434954}
    49444955/*}}}*/
     
    51905201        /*pnewelementslist keep vertices in Matlab indexing*/
    51915202   int my_rank                                          = IssmComm::GetRank();
    5192    int numberofelements                 = this->elements->NumberOfElements();
    51935203        IssmDouble* gl_distance         = NULL;
    51945204        IssmDouble* if_distance         = NULL;
     
    51985208   IssmDouble* newy                             = NULL;
    51995209   IssmDouble* newz                             = NULL;
     5210        IssmDouble* newxylist           = NULL;
    52005211   int* newelementslist                 = NULL;
    5201    int newnumberofvertices              = -1;
     5212        int* newdatalist                                = NULL;
     5213        int newnumberofvertices         = -1;
    52025214        int newnumberofelements         = -1;
    52035215
     
    52105222        if(my_rank==0){
    52115223                this->amr->ExecuteRefinement(gl_distance,if_distance,deviatoricerror,thicknesserror,
    5212                                                                                                 &newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist);
    5213                 newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
    5214                 if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz.");
    5215         }
    5216 
    5217         /*Send new mesh to others CPU*/
    5218         ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm());
    5219         ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm());
    5220         if(my_rank){
    5221                 newx=xNew<IssmDouble>(newnumberofvertices);
    5222                 newy=xNew<IssmDouble>(newnumberofvertices);
    5223                 newz=xNew<IssmDouble>(newnumberofvertices);
    5224                 newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
    5225         }
    5226         ISSM_MPI_Bcast(newx,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    5227         ISSM_MPI_Bcast(newy,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    5228         ISSM_MPI_Bcast(newz,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    5229         ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
    5230 
     5224                                                                                                &newdatalist,&newxylist,&newelementslist);
     5225                if(newdatalist[0]<=0 || newdatalist[1]<=0) _error_("Error in the ReMeshNeopz.");       
     5226        }
     5227
     5228        /*Send new mesh to others CPU's*/
     5229        if(my_rank) newdatalist=xNew<int>(2);
     5230   ISSM_MPI_Bcast(newdatalist,2,ISSM_MPI_INT,0,IssmComm::GetComm());
     5231   newnumberofvertices=newdatalist[0];
     5232   newnumberofelements=newdatalist[1];
     5233   if(my_rank){
     5234      newxylist      =xNew<IssmDouble>(newnumberofvertices*2);
     5235      newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
     5236   }
     5237   ISSM_MPI_Bcast(newxylist,newnumberofvertices*2,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     5238   ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
     5239
     5240   /*Reorganize the data*/
     5241   newx=xNew<IssmDouble>(newnumberofvertices);
     5242   newy=xNew<IssmDouble>(newnumberofvertices);
     5243   newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
     5244   for(int i=0;i<newnumberofvertices;i++){
     5245      newx[i] = newxylist[2*i];
     5246      newy[i] = newxylist[2*i+1];
     5247   }
     5248       
    52315249        /*Assign the pointers*/
    5232         (*pnewelementslist)     = newelementslist; //Matlab indexing
    5233         (*pnewx)                                        = newx;
    5234         (*pnewy)                                        = newy;
    5235         (*pnewz)                                        = newz;
    5236         *pnewnumberofvertices= newnumberofvertices;
    5237         *pnewnumberofelements= newnumberofelements;
     5250   (*pnewelementslist)  = newelementslist; //Matlab indexing
     5251   (*pnewx)             = newx;
     5252   (*pnewy)             = newy;
     5253   (*pnewz)             = newz;
     5254   *pnewnumberofvertices= newnumberofvertices;
     5255   *pnewnumberofelements= newnumberofelements;
    52385256
    52395257        /*Cleanup*/
    5240         xDelete<IssmDouble>(deviatoricerror);
    5241         xDelete<IssmDouble>(thicknesserror);
    5242         xDelete<IssmDouble>(gl_distance);
    5243         xDelete<IssmDouble>(if_distance);
     5258   xDelete<int>(newdatalist);
     5259   xDelete<IssmDouble>(newxylist);
     5260   xDelete<IssmDouble>(deviatoricerror);
     5261   xDelete<IssmDouble>(thicknesserror);
     5262   xDelete<IssmDouble>(gl_distance);
     5263   xDelete<IssmDouble>(if_distance);
    52445264}
    52455265/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.