[23186] | 1 | Index: ../trunk-jpl/externalpackages/neopz/install.sh
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/externalpackages/neopz/install.sh (revision 23064)
|
---|
| 4 | +++ ../trunk-jpl/externalpackages/neopz/install.sh (revision 23065)
|
---|
| 5 | @@ -19,7 +19,7 @@
|
---|
| 6 |
|
---|
| 7 | #Configure neopz using cmake
|
---|
| 8 | cd $PROJECT_SOURCE_DIR
|
---|
| 9 | -cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR
|
---|
| 10 | +cmake -DCMAKE_INSTALL_PREFIX:PATH=$PROJECT_BINARY_DIR -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-g -O3"
|
---|
| 11 |
|
---|
| 12 | cd $PROJECT_SOURCE_DIR
|
---|
| 13 | make
|
---|
| 14 | Index: ../trunk-jpl/src/c/classes/AmrBamg.h
|
---|
| 15 | ===================================================================
|
---|
| 16 | --- ../trunk-jpl/src/c/classes/AmrBamg.h (revision 23064)
|
---|
| 17 | +++ ../trunk-jpl/src/c/classes/AmrBamg.h (revision 23065)
|
---|
| 18 | @@ -34,7 +34,7 @@
|
---|
| 19 |
|
---|
| 20 | /*General methods*/
|
---|
| 21 | void Initialize(int* elements,IssmDouble* x,IssmDouble* y,int numberofvertices,int numberofelements);
|
---|
| 22 | - void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist);
|
---|
| 23 | + void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int** pdatalist,IssmDouble** pxylist,int** pelementslist);
|
---|
| 24 | void SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in);
|
---|
| 25 |
|
---|
| 26 | private:
|
---|
| 27 | Index: ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
|
---|
| 28 | ===================================================================
|
---|
| 29 | --- ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h (revision 23064)
|
---|
| 30 | +++ ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h (revision 23065)
|
---|
| 31 | @@ -66,11 +66,9 @@
|
---|
| 32 | /*General methods*/
|
---|
| 33 | void CleanUp();
|
---|
| 34 | void Initialize();
|
---|
| 35 | - void ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
|
---|
| 36 | - void ExecuteRefinement(int numberofpoints,double* xylist,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
|
---|
| 37 | - void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
|
---|
| 38 | + void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int** pdatalist,double** pxy,int** pelementslist);
|
---|
| 39 | void CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements);
|
---|
| 40 | - void CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements);
|
---|
| 41 | + void CheckMesh(int** pdata,double** pxy,int** pelements);
|
---|
| 42 | /*}}}*/
|
---|
| 43 | private:
|
---|
| 44 | /*Private attributes{{{*/
|
---|
| 45 | @@ -85,7 +83,7 @@
|
---|
| 46 | void RefineMeshWithSmoothing(bool &verbose,TPZGeoMesh* gmesh);
|
---|
| 47 | void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh);
|
---|
| 48 | void DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh);
|
---|
| 49 | - void GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py,int** pelements);
|
---|
| 50 | + void GetMesh(TPZGeoMesh* gmesh,int** pdata,double** pxy,int** pelements);
|
---|
| 51 | TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh);
|
---|
| 52 | inline int GetElemMaterialID(){return 1;}
|
---|
| 53 | inline int GetNumberOfNodes(){return 3;}
|
---|
| 54 | Index: ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
|
---|
| 55 | ===================================================================
|
---|
| 56 | --- ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp (revision 23064)
|
---|
| 57 | +++ ../trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp (revision 23065)
|
---|
| 58 | @@ -99,7 +99,7 @@
|
---|
| 59 | /*}}}*/
|
---|
| 60 |
|
---|
| 61 | /*Mesh refinement methods*/
|
---|
| 62 | -void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
|
---|
| 63 | +void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int** pdatalist,double** pxylist,int** pelementslist){/*{{{*/
|
---|
| 64 |
|
---|
| 65 | /*IMPORTANT! pelementslist are in Matlab indexing*/
|
---|
| 66 | /*NEOPZ works only in C indexing*/
|
---|
| 67 | @@ -122,10 +122,10 @@
|
---|
| 68 | this->RefineMeshOneLevel(verbose,gl_distance,if_distance,deviatoricerror,thicknesserror);
|
---|
| 69 |
|
---|
| 70 | /*Get new geometric mesh in ISSM data structure*/
|
---|
| 71 | - this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
|
---|
| 72 | + this->GetMesh(this->previousmesh,pdatalist,pxylist,pelementslist);
|
---|
| 73 |
|
---|
| 74 | /*Verify the new geometry*/
|
---|
| 75 | - this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
|
---|
| 76 | + this->CheckMesh(pdatalist,pxylist,pelementslist);
|
---|
| 77 | }
|
---|
| 78 | /*}}}*/
|
---|
| 79 | void AdaptiveMeshRefinement::RefineMeshOneLevel(bool &verbose,double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror){/*{{{*/
|
---|
| 80 | @@ -448,7 +448,7 @@
|
---|
| 81 | gmesh->BuildConnectivity();
|
---|
| 82 | }
|
---|
| 83 | /*}}}*/
|
---|
| 84 | -void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py, int** pelements){/*{{{*/
|
---|
| 85 | +void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int** pdata,double** pxy, int** pelements){/*{{{*/
|
---|
| 86 |
|
---|
| 87 | /* IMPORTANT! pelements are in Matlab indexing
|
---|
| 88 | NEOPZ works only in C indexing.
|
---|
| 89 | @@ -461,8 +461,8 @@
|
---|
| 90 | int nconformelements,nconformvertices;
|
---|
| 91 | int ntotalvertices = gmesh->NNodes();
|
---|
| 92 | int* newelements = NULL;
|
---|
| 93 | - double* newmeshX = NULL;
|
---|
| 94 | - double* newmeshY = NULL;
|
---|
| 95 | + int* newdata = NULL;
|
---|
| 96 | + double* newmeshXY = NULL;
|
---|
| 97 | TPZGeoEl* geoel = NULL;
|
---|
| 98 | long* vertex_index2sid = xNew<long>(ntotalvertices);
|
---|
| 99 | this->index2sid.clear(); this->index2sid.resize(gmesh->NElements());
|
---|
| 100 | @@ -493,11 +493,14 @@
|
---|
| 101 | }
|
---|
| 102 | }
|
---|
| 103 |
|
---|
| 104 | + /* Create new mesh structure and fill it */
|
---|
| 105 | nconformelements = (int)this->sid2index.size();
|
---|
| 106 | nconformvertices = (int)sid;
|
---|
| 107 | newelements = xNew<int>(nconformelements*this->GetNumberOfNodes());
|
---|
| 108 | - newmeshX = xNew<double>(nconformvertices);
|
---|
| 109 | - newmeshY = xNew<double>(nconformvertices);
|
---|
| 110 | + newmeshXY = xNew<double>(nconformvertices*2);
|
---|
| 111 | + newdata = xNew<int>(2);
|
---|
| 112 | + newdata[0] = nconformvertices;
|
---|
| 113 | + newdata[1] = nconformelements;
|
---|
| 114 |
|
---|
| 115 | for(int i=0;i<ntotalvertices;i++){//over the TPZNode index (fill in the ISSM vertices coords)
|
---|
| 116 | sid=vertex_index2sid[i];
|
---|
| 117 | @@ -504,8 +507,8 @@
|
---|
| 118 | if(sid==-1) continue;//skip this index (node no used)
|
---|
| 119 | TPZVec<REAL> coords(3,0.);
|
---|
| 120 | gmesh->NodeVec()[i].GetCoordinates(coords);
|
---|
| 121 | - newmeshX[sid] = coords[0];
|
---|
| 122 | - newmeshY[sid] = coords[1];
|
---|
| 123 | + newmeshXY[2*sid] = coords[0]; // X
|
---|
| 124 | + newmeshXY[2*sid+1] = coords[1]; // Y
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | for(int i=0;i<this->sid2index.size();i++){//over the sid (fill the ISSM elements)
|
---|
| 128 | @@ -524,9 +527,9 @@
|
---|
| 129 | b=newelements[i*this->GetNumberOfNodes()+1]-1;
|
---|
| 130 | c=newelements[i*this->GetNumberOfNodes()+2]-1;
|
---|
| 131 |
|
---|
| 132 | - xa=newmeshX[a]; ya=newmeshY[a];
|
---|
| 133 | - xb=newmeshX[b]; yb=newmeshY[b];
|
---|
| 134 | - xc=newmeshX[c]; yc=newmeshY[c];
|
---|
| 135 | + xa=newmeshXY[2*a]; ya=newmeshXY[2*a+1];
|
---|
| 136 | + xb=newmeshXY[2*b]; yb=newmeshXY[2*b+1];
|
---|
| 137 | + xc=newmeshXY[2*c]; yc=newmeshXY[2*c+1];
|
---|
| 138 |
|
---|
| 139 | detJ=(xb-xa)*(yc-ya)-(xc-xa)*(yb-ya);
|
---|
| 140 |
|
---|
| 141 | @@ -538,10 +541,8 @@
|
---|
| 142 | }
|
---|
| 143 |
|
---|
| 144 | /*Setting outputs*/
|
---|
| 145 | - *nvertices = nconformvertices;
|
---|
| 146 | - *nelements = nconformelements;
|
---|
| 147 | - *px = newmeshX;
|
---|
| 148 | - *py = newmeshY;
|
---|
| 149 | + *pdata = newdata;
|
---|
| 150 | + *pxy = newmeshXY;
|
---|
| 151 | *pelements = newelements;
|
---|
| 152 |
|
---|
| 153 | /*Cleanup*/
|
---|
| 154 | @@ -692,37 +693,14 @@
|
---|
| 155 | return newgmesh;
|
---|
| 156 | }
|
---|
| 157 | /*}}}*/
|
---|
| 158 | -void AdaptiveMeshRefinement::CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements){/*{{{*/
|
---|
| 159 | +void AdaptiveMeshRefinement::CheckMesh(int** pdata,double** pxy,int** pelements){/*{{{*/
|
---|
| 160 |
|
---|
| 161 | /*Basic verification*/
|
---|
| 162 | - if(nvertices<=0) _error_("Impossible to continue: nvertices <=0!\n");
|
---|
| 163 | - if(nelements<=0) _error_("Impossible to continue: nelements <=0!\n");
|
---|
| 164 | - if(!px) _error_("Impossible to continue: px is NULL!\n");
|
---|
| 165 | - if(!py) _error_("Impossible to continue: py is NULL!\n");
|
---|
| 166 | + if(!pdata) _error_("Impossible to continue: pdata is NULL!\n");
|
---|
| 167 | + if(pdata[0]<=0) _error_("Impossible to continue: nvertices <=0!\n");
|
---|
| 168 | + if(pdata[1]<=0) _error_("Impossible to continue: nelements <=0!\n");
|
---|
| 169 | + if(!pxy) _error_("Impossible to continue: pxy is NULL!\n");
|
---|
| 170 | if(!pelements) _error_("Impossible to continue: pelements is NULL!\n");
|
---|
| 171 | -
|
---|
| 172 | - /*Verify if there are orphan nodes*/
|
---|
| 173 | - std::set<int> elemvertices;
|
---|
| 174 | - elemvertices.clear();
|
---|
| 175 | - for(int i=0;i<*nelements;i++){
|
---|
| 176 | - for(int j=0;j<this->GetNumberOfNodes();j++) {
|
---|
| 177 | - elemvertices.insert((*pelements)[i*this->GetNumberOfNodes()+j]);
|
---|
| 178 | - }
|
---|
| 179 | - }
|
---|
| 180 | - if(elemvertices.size()!=*nvertices) _error_("Impossible to continue: elemvertices.size() != nvertices!\n");
|
---|
| 181 | -
|
---|
| 182 | - //Verify if there are inf or NaN in coords
|
---|
| 183 | - for(int i=0;i<*nvertices;i++){
|
---|
| 184 | - if(std::isnan((*px)[i]) || std::isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");
|
---|
| 185 | - if(std::isnan((*py)[i]) || std::isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");
|
---|
| 186 | - }
|
---|
| 187 | - for(int i=0;i<*nelements;i++){
|
---|
| 188 | - for(int j=0;j<this->GetNumberOfNodes();j++){
|
---|
| 189 | - if(std::isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n");
|
---|
| 190 | - if(std::isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n");
|
---|
| 191 | - }
|
---|
| 192 | - }
|
---|
| 193 | -
|
---|
| 194 | }
|
---|
| 195 | /*}}}*/
|
---|
| 196 | void AdaptiveMeshRefinement::PrintGMeshVTK(TPZGeoMesh* gmesh,std::ofstream &file,bool matColor){/*{{{*/
|
---|
| 197 | Index: ../trunk-jpl/src/c/classes/FemModel.cpp
|
---|
| 198 | ===================================================================
|
---|
| 199 | --- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 23064)
|
---|
| 200 | +++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 23065)
|
---|
| 201 | @@ -4876,7 +4876,9 @@
|
---|
| 202 | IssmDouble *newx = NULL;
|
---|
| 203 | IssmDouble *newy = NULL;
|
---|
| 204 | IssmDouble *newz = NULL;
|
---|
| 205 | + IssmDouble *newxylist = NULL;
|
---|
| 206 | int *newelementslist = NULL;
|
---|
| 207 | + int* newdatalist = NULL;
|
---|
| 208 | int newnumberofvertices = -1;
|
---|
| 209 | int newnumberofelements = -1;
|
---|
| 210 |
|
---|
| 211 | @@ -4910,36 +4912,45 @@
|
---|
| 212 | }
|
---|
| 213 |
|
---|
| 214 | if(my_rank==0){
|
---|
| 215 | - this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist);
|
---|
| 216 | - if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the refinement process.");
|
---|
| 217 | + this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newdatalist,&newxylist,&newelementslist);
|
---|
| 218 | + if(newdatalist[0]<=0 || newdatalist[1]<=0) _error_("Error in the refinement process.");
|
---|
| 219 | }
|
---|
| 220 |
|
---|
| 221 | - /*Cleanup*/
|
---|
| 222 | - xDelete<IssmDouble>(vector_serial);
|
---|
| 223 | - xDelete<IssmDouble>(hmaxvertices_serial);
|
---|
| 224 | - delete vector;
|
---|
| 225 | + /*Send new mesh to others CPU's*/
|
---|
| 226 | + if(my_rank) newdatalist=xNew<int>(2);
|
---|
| 227 | + ISSM_MPI_Bcast(newdatalist,2,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 228 | + newnumberofvertices=newdatalist[0];
|
---|
| 229 | + newnumberofelements=newdatalist[1];
|
---|
| 230 | + if(my_rank){
|
---|
| 231 | + newxylist =xNew<IssmDouble>(newnumberofvertices*2);
|
---|
| 232 | + newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
|
---|
| 233 | + }
|
---|
| 234 | + ISSM_MPI_Bcast(newxylist,newnumberofvertices*2,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 235 | + ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 236 |
|
---|
| 237 | - /*Send new mesh to others CPU*/
|
---|
| 238 | - ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 239 | - ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 240 | - if(my_rank){
|
---|
| 241 | - newx=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 242 | - newy=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 243 | - newz=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 244 | - newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
|
---|
| 245 | - }
|
---|
| 246 | - ISSM_MPI_Bcast(newx,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 247 | - ISSM_MPI_Bcast(newy,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 248 | - ISSM_MPI_Bcast(newz,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 249 | - ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 250 | + /*Reorganize the data*/
|
---|
| 251 | + newx=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 252 | + newy=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 253 | + newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
|
---|
| 254 | + for(int i=0;i<newnumberofvertices;i++){
|
---|
| 255 | + newx[i] = newxylist[2*i];
|
---|
| 256 | + newy[i] = newxylist[2*i+1];
|
---|
| 257 | + }
|
---|
| 258 |
|
---|
| 259 | - /*Assign output pointers*/
|
---|
| 260 | - *pnewnumberofvertices = newnumberofvertices;
|
---|
| 261 | - *pnewnumberofelements = newnumberofelements;
|
---|
| 262 | - *pnewx = newx;
|
---|
| 263 | - *pnewy = newy;
|
---|
| 264 | - *pnewz = newz;
|
---|
| 265 | - *pnewelementslist = newelementslist;
|
---|
| 266 | + /*Assign output pointers*/
|
---|
| 267 | + *pnewnumberofvertices = newnumberofvertices;
|
---|
| 268 | + *pnewnumberofelements = newnumberofelements;
|
---|
| 269 | + *pnewx = newx;
|
---|
| 270 | + *pnewy = newy;
|
---|
| 271 | + *pnewz = newz;
|
---|
| 272 | + *pnewelementslist = newelementslist;
|
---|
| 273 | +
|
---|
| 274 | + /*Cleanup*/
|
---|
| 275 | + xDelete<int>(newdatalist);
|
---|
| 276 | + xDelete<IssmDouble>(newxylist);
|
---|
| 277 | + xDelete<IssmDouble>(vector_serial);
|
---|
| 278 | + xDelete<IssmDouble>(hmaxvertices_serial);
|
---|
| 279 | + delete vector;
|
---|
| 280 | }
|
---|
| 281 | /*}}}*/
|
---|
| 282 | void FemModel::InitializeAdaptiveRefinementBamg(void){/*{{{*/
|
---|
| 283 | @@ -5189,7 +5200,6 @@
|
---|
| 284 |
|
---|
| 285 | /*pnewelementslist keep vertices in Matlab indexing*/
|
---|
| 286 | int my_rank = IssmComm::GetRank();
|
---|
| 287 | - int numberofelements = this->elements->NumberOfElements();
|
---|
| 288 | IssmDouble* gl_distance = NULL;
|
---|
| 289 | IssmDouble* if_distance = NULL;
|
---|
| 290 | IssmDouble* deviatoricerror= NULL;
|
---|
| 291 | @@ -5197,8 +5207,10 @@
|
---|
| 292 | IssmDouble* newx = NULL;
|
---|
| 293 | IssmDouble* newy = NULL;
|
---|
| 294 | IssmDouble* newz = NULL;
|
---|
| 295 | + IssmDouble* newxylist = NULL;
|
---|
| 296 | int* newelementslist = NULL;
|
---|
| 297 | - int newnumberofvertices = -1;
|
---|
| 298 | + int* newdatalist = NULL;
|
---|
| 299 | + int newnumberofvertices = -1;
|
---|
| 300 | int newnumberofelements = -1;
|
---|
| 301 |
|
---|
| 302 | /*Get fields, if requested*/
|
---|
| 303 | @@ -5209,38 +5221,46 @@
|
---|
| 304 |
|
---|
| 305 | if(my_rank==0){
|
---|
| 306 | this->amr->ExecuteRefinement(gl_distance,if_distance,deviatoricerror,thicknesserror,
|
---|
| 307 | - &newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist);
|
---|
| 308 | - newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
|
---|
| 309 | - if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz.");
|
---|
| 310 | + &newdatalist,&newxylist,&newelementslist);
|
---|
| 311 | + if(newdatalist[0]<=0 || newdatalist[1]<=0) _error_("Error in the ReMeshNeopz.");
|
---|
| 312 | }
|
---|
| 313 |
|
---|
| 314 | - /*Send new mesh to others CPU*/
|
---|
| 315 | - ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 316 | - ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 317 | - if(my_rank){
|
---|
| 318 | - newx=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 319 | - newy=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 320 | - newz=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 321 | - newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
|
---|
| 322 | - }
|
---|
| 323 | - ISSM_MPI_Bcast(newx,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 324 | - ISSM_MPI_Bcast(newy,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 325 | - ISSM_MPI_Bcast(newz,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 326 | - ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 327 | + /*Send new mesh to others CPU's*/
|
---|
| 328 | + if(my_rank) newdatalist=xNew<int>(2);
|
---|
| 329 | + ISSM_MPI_Bcast(newdatalist,2,ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 330 | + newnumberofvertices=newdatalist[0];
|
---|
| 331 | + newnumberofelements=newdatalist[1];
|
---|
| 332 | + if(my_rank){
|
---|
| 333 | + newxylist =xNew<IssmDouble>(newnumberofvertices*2);
|
---|
| 334 | + newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth());
|
---|
| 335 | + }
|
---|
| 336 | + ISSM_MPI_Bcast(newxylist,newnumberofvertices*2,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 337 | + ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm());
|
---|
| 338 |
|
---|
| 339 | + /*Reorganize the data*/
|
---|
| 340 | + newx=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 341 | + newy=xNew<IssmDouble>(newnumberofvertices);
|
---|
| 342 | + newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
|
---|
| 343 | + for(int i=0;i<newnumberofvertices;i++){
|
---|
| 344 | + newx[i] = newxylist[2*i];
|
---|
| 345 | + newy[i] = newxylist[2*i+1];
|
---|
| 346 | + }
|
---|
| 347 | +
|
---|
| 348 | /*Assign the pointers*/
|
---|
| 349 | - (*pnewelementslist) = newelementslist; //Matlab indexing
|
---|
| 350 | - (*pnewx) = newx;
|
---|
| 351 | - (*pnewy) = newy;
|
---|
| 352 | - (*pnewz) = newz;
|
---|
| 353 | - *pnewnumberofvertices= newnumberofvertices;
|
---|
| 354 | - *pnewnumberofelements= newnumberofelements;
|
---|
| 355 | + (*pnewelementslist) = newelementslist; //Matlab indexing
|
---|
| 356 | + (*pnewx) = newx;
|
---|
| 357 | + (*pnewy) = newy;
|
---|
| 358 | + (*pnewz) = newz;
|
---|
| 359 | + *pnewnumberofvertices= newnumberofvertices;
|
---|
| 360 | + *pnewnumberofelements= newnumberofelements;
|
---|
| 361 |
|
---|
| 362 | /*Cleanup*/
|
---|
| 363 | - xDelete<IssmDouble>(deviatoricerror);
|
---|
| 364 | - xDelete<IssmDouble>(thicknesserror);
|
---|
| 365 | - xDelete<IssmDouble>(gl_distance);
|
---|
| 366 | - xDelete<IssmDouble>(if_distance);
|
---|
| 367 | + xDelete<int>(newdatalist);
|
---|
| 368 | + xDelete<IssmDouble>(newxylist);
|
---|
| 369 | + xDelete<IssmDouble>(deviatoricerror);
|
---|
| 370 | + xDelete<IssmDouble>(thicknesserror);
|
---|
| 371 | + xDelete<IssmDouble>(gl_distance);
|
---|
| 372 | + xDelete<IssmDouble>(if_distance);
|
---|
| 373 | }
|
---|
| 374 | /*}}}*/
|
---|
| 375 | void FemModel::InitializeAdaptiveRefinementNeopz(void){/*{{{*/
|
---|
| 376 | Index: ../trunk-jpl/src/c/classes/AmrBamg.cpp
|
---|
| 377 | ===================================================================
|
---|
| 378 | --- ../trunk-jpl/src/c/classes/AmrBamg.cpp (revision 23064)
|
---|
| 379 | +++ ../trunk-jpl/src/c/classes/AmrBamg.cpp (revision 23065)
|
---|
| 380 | @@ -97,7 +97,7 @@
|
---|
| 381 | /*Cleanup and return*/
|
---|
| 382 | delete Th;
|
---|
| 383 | }/*}}}*/
|
---|
| 384 | -void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist){/*{{{*/
|
---|
| 385 | +void AmrBamg::ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int** pdatalist,IssmDouble** pxylist,int** pelementslist){/*{{{*/
|
---|
| 386 |
|
---|
| 387 | /*Intermediaries*/
|
---|
| 388 | BamgGeom* geomout=new BamgGeom();
|
---|
| 389 | @@ -149,17 +149,20 @@
|
---|
| 390 | this->previousmesh = meshout;
|
---|
| 391 |
|
---|
| 392 | /*Prepare output*/
|
---|
| 393 | - int nbv = meshout->VerticesSize[0];
|
---|
| 394 | - int nbt = meshout->TrianglesSize[0];
|
---|
| 395 | - IssmDouble *x = xNew<IssmDouble>(nbv);
|
---|
| 396 | - IssmDouble *y = xNew<IssmDouble>(nbv);
|
---|
| 397 | - IssmDouble *z = xNew<IssmDouble>(nbv);
|
---|
| 398 | + int nbv = meshout->VerticesSize[0];
|
---|
| 399 | + int nbt = meshout->TrianglesSize[0];
|
---|
| 400 | + int *datalist = xNew<int>(2);
|
---|
| 401 | + IssmDouble *xylist= xNew<IssmDouble>(nbv*2);
|
---|
| 402 | + int* elementslist = xNew<int>(nbt*3);
|
---|
| 403 | +
|
---|
| 404 | + datalist[0] = nbv;
|
---|
| 405 | + datalist[1] = nbt;
|
---|
| 406 | +
|
---|
| 407 | for(int i=0;i<nbv;i++){
|
---|
| 408 | - x[i] = meshout->Vertices[i*3+0];
|
---|
| 409 | - y[i] = meshout->Vertices[i*3+1];
|
---|
| 410 | - z[i] = 0.;
|
---|
| 411 | + xylist[2*i] = meshout->Vertices[i*3+0];
|
---|
| 412 | + xylist[2*i+1] = meshout->Vertices[i*3+1];
|
---|
| 413 | }
|
---|
| 414 | - int* elementslist= xNew<int>(nbt*3);
|
---|
| 415 | +
|
---|
| 416 | for(int i=0;i<nbt;i++){
|
---|
| 417 | elementslist[3*i+0] = reCast<int>(meshout->Triangles[4*i+0]);
|
---|
| 418 | elementslist[3*i+1] = reCast<int>(meshout->Triangles[4*i+1]);
|
---|
| 419 | @@ -166,14 +169,13 @@
|
---|
| 420 | elementslist[3*i+2] = reCast<int>(meshout->Triangles[4*i+2]);
|
---|
| 421 | }
|
---|
| 422 |
|
---|
| 423 | + /*Assign pointers*/
|
---|
| 424 | + *pdatalist = datalist;
|
---|
| 425 | + *pxylist = xylist;
|
---|
| 426 | + *pelementslist = elementslist;
|
---|
| 427 | +
|
---|
| 428 | /*Cleanup and return*/
|
---|
| 429 | delete geomout;
|
---|
| 430 | - *pnewnumberofvertices = nbv;
|
---|
| 431 | - *pnewnumberofelements = nbt;
|
---|
| 432 | - *px = x;
|
---|
| 433 | - *py = y;
|
---|
| 434 | - *pz = z;
|
---|
| 435 | - *pelementslist = elementslist;
|
---|
| 436 | }/*}}}*/
|
---|
| 437 | void AmrBamg::SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in){/*{{{*/
|
---|
| 438 |
|
---|