Changeset 23065
- Timestamp:
- 08/07/18 06:15:18 (7 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/externalpackages/neopz/install.sh
r22704 r23065 20 20 #Configure neopz using cmake 21 21 cd $PROJECT_SOURCE_DIR 22 cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR 22 cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-g -O3" 23 23 24 24 cd $PROJECT_SOURCE_DIR -
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
r22294 r23065 100 100 101 101 /*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){/*{{{*/102 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int** pdatalist,double** pxylist,int** pelementslist){/*{{{*/ 103 103 104 104 /*IMPORTANT! pelementslist are in Matlab indexing*/ … … 123 123 124 124 /*Get new geometric mesh in ISSM data structure*/ 125 this->GetMesh(this->previousmesh,p newnumberofvertices,pnewnumberofelements,px,py,pelementslist);125 this->GetMesh(this->previousmesh,pdatalist,pxylist,pelementslist); 126 126 127 127 /*Verify the new geometry*/ 128 this->CheckMesh(p newnumberofvertices,pnewnumberofelements,px,py,pelementslist);128 this->CheckMesh(pdatalist,pxylist,pelementslist); 129 129 } 130 130 /*}}}*/ … … 449 449 } 450 450 /*}}}*/ 451 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py, int** pelements){/*{{{*/451 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int** pdata,double** pxy, int** pelements){/*{{{*/ 452 452 453 453 /* IMPORTANT! pelements are in Matlab indexing … … 462 462 int ntotalvertices = gmesh->NNodes(); 463 463 int* newelements = NULL; 464 double* newmeshX= NULL;465 double* newmesh Y = NULL;464 int* newdata = NULL; 465 double* newmeshXY = NULL; 466 466 TPZGeoEl* geoel = NULL; 467 467 long* vertex_index2sid = xNew<long>(ntotalvertices); … … 494 494 } 495 495 496 /* Create new mesh structure and fill it */ 496 497 nconformelements = (int)this->sid2index.size(); 497 498 nconformvertices = (int)sid; 498 499 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; 501 504 502 505 for(int i=0;i<ntotalvertices;i++){//over the TPZNode index (fill in the ISSM vertices coords) … … 505 508 TPZVec<REAL> coords(3,0.); 506 509 gmesh->NodeVec()[i].GetCoordinates(coords); 507 newmeshX [sid] = coords[0];508 newmesh Y[sid] = coords[1];510 newmeshXY[2*sid] = coords[0]; // X 511 newmeshXY[2*sid+1] = coords[1]; // Y 509 512 } 510 513 … … 525 528 c=newelements[i*this->GetNumberOfNodes()+2]-1; 526 529 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]; 530 533 531 534 detJ=(xb-xa)*(yc-ya)-(xc-xa)*(yb-ya); … … 539 542 540 543 /*Setting outputs*/ 541 *nvertices = nconformvertices; 542 *nelements = nconformelements; 543 *px = newmeshX; 544 *py = newmeshY; 544 *pdata = newdata; 545 *pxy = newmeshXY; 545 546 *pelements = newelements; 546 547 … … 693 694 } 694 695 /*}}}*/ 695 void AdaptiveMeshRefinement::CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements){/*{{{*/696 void AdaptiveMeshRefinement::CheckMesh(int** pdata,double** pxy,int** pelements){/*{{{*/ 696 697 697 698 /*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(!p y) _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"); 702 703 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 coords715 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 726 704 } 727 705 /*}}}*/ -
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
r22704 r23065 67 67 void CleanUp(); 68 68 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); 72 70 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); 74 72 /*}}}*/ 75 73 private: … … 86 84 void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh); 87 85 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); 89 87 TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh); 90 88 inline int GetElemMaterialID(){return 1;} -
issm/trunk-jpl/src/c/classes/AmrBamg.cpp
r22294 r23065 98 98 delete Th; 99 99 }/*}}}*/ 100 void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist){/*{{{*/100 void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int** pdatalist,IssmDouble** pxylist,int** pelementslist){/*{{{*/ 101 101 102 102 /*Intermediaries*/ … … 150 150 151 151 /*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 157 161 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]; 161 164 } 162 int* elementslist= xNew<int>(nbt*3);165 163 166 for(int i=0;i<nbt;i++){ 164 167 elementslist[3*i+0] = reCast<int>(meshout->Triangles[4*i+0]); … … 167 170 } 168 171 172 /*Assign pointers*/ 173 *pdatalist = datalist; 174 *pxylist = xylist; 175 *pelementslist = elementslist; 176 169 177 /*Cleanup and return*/ 170 178 delete geomout; 171 *pnewnumberofvertices = nbv;172 *pnewnumberofelements = nbt;173 *px = x;174 *py = y;175 *pz = z;176 *pelementslist = elementslist;177 179 }/*}}}*/ 178 180 void AmrBamg::SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in){/*{{{*/ -
issm/trunk-jpl/src/c/classes/AmrBamg.h
r22294 r23065 35 35 /*General methods*/ 36 36 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); 38 38 void SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in); 39 39 -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r23053 r23065 4877 4877 IssmDouble *newy = NULL; 4878 4878 IssmDouble *newz = NULL; 4879 IssmDouble *newxylist = NULL; 4879 4880 int *newelementslist = NULL; 4881 int* newdatalist = NULL; 4880 4882 int newnumberofvertices = -1; 4881 4883 int newnumberofelements = -1; … … 4911 4913 4912 4914 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; 4943 4954 } 4944 4955 /*}}}*/ … … 5190 5201 /*pnewelementslist keep vertices in Matlab indexing*/ 5191 5202 int my_rank = IssmComm::GetRank(); 5192 int numberofelements = this->elements->NumberOfElements();5193 5203 IssmDouble* gl_distance = NULL; 5194 5204 IssmDouble* if_distance = NULL; … … 5198 5208 IssmDouble* newy = NULL; 5199 5209 IssmDouble* newz = NULL; 5210 IssmDouble* newxylist = NULL; 5200 5211 int* newelementslist = NULL; 5201 int newnumberofvertices = -1; 5212 int* newdatalist = NULL; 5213 int newnumberofvertices = -1; 5202 5214 int newnumberofelements = -1; 5203 5215 … … 5210 5222 if(my_rank==0){ 5211 5223 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 5231 5249 /*Assign the pointers*/ 5232 (*pnewelementslist)= newelementslist; //Matlab indexing5233 (*pnewx)= newx;5234 (*pnewy)= newy;5235 (*pnewz)= newz;5236 5237 5250 (*pnewelementslist) = newelementslist; //Matlab indexing 5251 (*pnewx) = newx; 5252 (*pnewy) = newy; 5253 (*pnewz) = newz; 5254 *pnewnumberofvertices= newnumberofvertices; 5255 *pnewnumberofelements= newnumberofelements; 5238 5256 5239 5257 /*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); 5244 5264 } 5245 5265 /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.