Changeset 22100
- Timestamp:
- 09/18/17 08:36:42 (8 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 1 deleted
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.cpp
r21919 r22100 28 28 this->CleanUp(); 29 29 /*Copy all data*/ 30 this->fathermesh = new TPZGeoMesh(*cp.fathermesh); 31 this->currentmesh = new TPZGeoMesh(*cp.currentmesh); 32 this->levelmax = cp.levelmax; 33 this->elementswidth = cp.elementswidth; 34 this->regionlevel1 = cp.regionlevel1; 35 this->regionlevelmax = cp.regionlevelmax; 30 this->fathermesh = new TPZGeoMesh(*cp.fathermesh); 31 this->previousmesh = new TPZGeoMesh(*cp.previousmesh); 32 this->level_max = cp.level_max; 33 this->radius_level_max = cp.radius_level_max; 34 this->gradation = cp.gradation; 35 this->lag = cp.lag; 36 this->groundingline_distance = cp.groundingline_distance; 37 this->icefront_distance = cp.icefront_distance; 38 this->thicknesserror_threshold = cp.thicknesserror_threshold; 39 this->deviatoricerror_threshold = cp.deviatoricerror_threshold; 36 40 this->sid2index.clear(); 37 41 this->sid2index.resize(cp.sid2index.size()); … … 56 60 /*Verify and delete all data*/ 57 61 if(this->fathermesh) delete this->fathermesh; 58 if(this->currentmesh) delete this->currentmesh; 59 this->levelmax = -1; 60 this->elementswidth = -1; 61 this->regionlevel1 = -1; 62 this->regionlevelmax = -1; 62 if(this->previousmesh) delete this->previousmesh; 63 this->level_max = -1; 64 this->radius_level_max = -1; 65 this->gradation = -1; 66 this->lag = -1; 67 this->groundingline_distance = -1; 68 this->icefront_distance = -1; 69 this->thicknesserror_threshold = -1; 70 this->deviatoricerror_threshold = -1; 63 71 this->sid2index.clear(); 64 72 this->index2sid.clear(); … … 69 77 70 78 /*Set pointers to NULL*/ 71 this->fathermesh = NULL; 72 this->currentmesh = NULL; 73 this->levelmax = -1; 74 this->elementswidth = -1; 75 this->regionlevel1 = -1; 76 this->regionlevelmax = -1; 77 this->step = 0; 78 this->smooth_frequency = 1; 79 this->fathermesh = NULL; 80 this->previousmesh = NULL; 81 this->level_max = -1; 82 this->radius_level_max = -1; 83 this->gradation = -1; 84 this->lag = -1; 85 this->groundingline_distance = -1; 86 this->icefront_distance = -1; 87 this->thicknesserror_threshold = -1; 88 this->deviatoricerror_threshold = -1; 79 89 this->sid2index.clear(); 80 90 this->index2sid.clear(); … … 84 94 85 95 /*Mesh refinement methods*/ 86 void AdaptiveMeshRefinement::Execute(bool &amr_verbose, 87 int &numberofelements, 88 double* partiallyfloatedelements, 89 double *masklevelset, 90 double* deviatorictensorerror, 91 double* thicknesserror, 92 int &newnumberofvertices,int &newnumberofelements,double** x,double** y,int** elementslist){/*{{{*/ 93 94 /*IMPORTANT! newelements are in Matlab indexing*/ 96 void AdaptiveMeshRefinement::ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/ 97 98 /*IMPORTANT! pelementslist are in Matlab indexing*/ 95 99 /*NEOPZ works only in C indexing*/ 96 if(!this->fathermesh || !this->currentmesh) _error_("Impossible to execute refinement: fathermesh or currentmesh is NULL!\n"); 97 if(numberofelements!=this->sid2index.size()) _error_("Impossible to execute refinement: sid2index.size is not equal to numberofelements!\n"); 98 99 /*Combine the fields*/ 100 double mean_mask = 0; 101 double mean_tauerror = 0; 102 double mean_Herror = 0; 103 int* fmask = xNew<int>(numberofelements); 104 int* ftauerror = xNew<int>(numberofelements); 105 int* fHerror = xNew<int>(numberofelements); 106 int* phi = xNew<int>(numberofelements); 107 /*Calculate mean values*/ 108 for(int i=0;i<this->sid2index.size();i++){ 109 mean_mask += masklevelset[i]; 110 mean_tauerror += deviatorictensorerror[i]; 111 mean_Herror += thicknesserror[i]; 112 } 113 mean_mask /= this->sid2index.size(); 114 mean_tauerror /= this->sid2index.size(); 115 mean_Herror /= this->sid2index.size(); 116 /*Filter to thickness*/ 117 for(int i=0;i<this->sid2index.size();i++){ 118 fmask[i]=0; 119 if(thicknesserror[i]>mean_Herror) fmask[i]=1; 120 } 121 /*Filter to tau*/ 122 for(int i=0;i<this->sid2index.size();i++){ 123 ftauerror[i]=0; 124 if(deviatorictensorerror[i]>mean_tauerror) ftauerror[i]=1; 125 } 126 /*Sum*/ 127 for(int i=0;i<this->sid2index.size();i++){ 128 phi[i]=ftauerror[i]+fmask[i]; 129 } 130 131 /*Execute the refinement.*/ 132 this->RefinementProcess(amr_verbose,partiallyfloatedelements,masklevelset,deviatorictensorerror,thicknesserror); 100 if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n"); 101 102 /*Intermediaries*/ 103 bool verbose=VerboseSolution(); 104 105 /*Refine the mesh using level max*/ 106 this->RefineMesh(verbose,this->previousmesh,numberofpoints,xylist); 107 108 /*Get new geometric mesh in ISSM data structure*/ 109 this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist); 110 111 /*Verify the new geometry*/ 112 this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist); 113 114 if(verbose) _printf_("\trefinement process done!\n"); 115 } 116 /*}}}*/ 117 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/ 118 119 /*IMPORTANT! pelementslist are in Matlab indexing*/ 120 /*NEOPZ works only in C indexing*/ 121 if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n"); 122 123 /*Intermediaries*/ 124 bool verbose=true; 125 126 /*Execute refinement*/ 127 this->RefinementProcess(verbose,gl_elementdistance,if_elementdistance,deviatoricerror,thicknesserror); 133 128 134 129 /*Get new geometric mesh in ISSM data structure*/ 135 this->GetMesh(newnumberofvertices,newnumberofelements,x,y,elementslist); 136 137 std::ofstream file("/home/santos/mesh.vtk"); 138 TPZVTKGeoMesh::PrintGMeshVTK(this->currentmesh,file); 130 this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist); 139 131 140 132 /*Verify the new geometry*/ 141 this->CheckMesh(newnumberofvertices,newnumberofelements,this->elementswidth,x,y,elementslist); 142 143 } 144 /*}}}*/ 145 void AdaptiveMeshRefinement::RefinementProcess(bool &amr_verbose,double* partiallyfloatedelements,double* masklevelset,double* deviatorictensorerror,double* thicknesserror){/*{{{*/ 133 this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist); 134 } 135 /*}}}*/ 136 void AdaptiveMeshRefinement::RefinementProcess(bool &verbose,double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror){/*{{{*/ 146 137 147 if( amr_verbose) _printf_("\n\trefinement process started (level max = " << this->levelmax << ")\n");138 if(verbose) _printf_("\n\trefinement process started (level max = " << this->level_max << ")\n"); 148 139 149 140 /*Intermediaries*/ 150 141 TPZGeoMesh* nohangingnodesmesh=NULL; 151 152 //itapopo153 this->step++;154 142 155 143 double mean_mask = 0; … … 161 149 162 150 /*Calculate mean values*/ 151 /* 163 152 for(int i=0;i<this->sid2index.size();i++){ 164 153 mean_mask += masklevelset[i]; … … 169 158 mean_tauerror /= this->sid2index.size(); 170 159 mean_Herror /= this->sid2index.size(); 171 172 if( amr_verbose) _printf_("\t\tdeal with special elements...\n");160 */ 161 if(verbose) _printf_("\t\tdeal with special elements...\n"); 173 162 /*Deal with special elements*/ 174 163 for(int i=0;i<this->specialelementsindex.size();i++){ 175 164 if(this->specialelementsindex[i]==-1) continue; 176 165 /*Get special element and verify*/ 177 TPZGeoEl* geoel=this-> currentmesh->Element(this->specialelementsindex[i]);166 TPZGeoEl* geoel=this->previousmesh->Element(this->specialelementsindex[i]); 178 167 if(!geoel)_error_("special element (sid) "<<i<<" is null!\n"); 179 168 if(geoel->HasSubElement())_error_("special element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n"); … … 213 202 /*Ok, the special element can be deleted*/ 214 203 siblings[j]->ResetSubElements(); 215 this-> currentmesh->DeleteElement(siblings[j],siblings[j]->Index());204 this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index()); 216 205 } 217 206 } 218 207 219 208 /*Now, verify if the father should be refined with uniform pattern (smoother)*/ 220 this->smooth_frequency=10000000; 221 if(siblings.size()==3 || this->step%this->smooth_frequency==0){//it keeps the mesh with uniform elements 209 if(siblings.size()==3){//it keeps the mesh with uniform elements 222 210 /*Father has uniform subelements now*/ 223 211 TPZVec<TPZGeoEl *> sons; 224 212 father->Divide(sons); 225 this->smooth_frequency=this->step;226 213 }else{ 227 214 specialfatherindex.push_back(father->Index()); … … 229 216 if(this->specialelementsindex[i]!=-1) _error_("special element "<<i<<" was not deleted!\n"); 230 217 } 231 this-> currentmesh->BuildConnectivity();232 233 if( amr_verbose) _printf_("\t\tuniform refinement...\n");218 this->previousmesh->BuildConnectivity(); 219 220 if(verbose) _printf_("\t\tuniform refinement...\n"); 234 221 /*Deal with uniform elemnts*/ 235 222 for(int i=0;i<this->sid2index.size();i++){ 236 223 if(this->sid2index[i]==-1) continue; 237 224 /*Get element and verify*/ 238 TPZGeoEl* geoel=this-> currentmesh->Element(this->sid2index[i]);225 TPZGeoEl* geoel=this->previousmesh->Element(this->sid2index[i]); 239 226 if(geoel->HasSubElement()) _error_("element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n"); 240 227 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n"); … … 252 239 } 253 240 TPZVec<TPZGeoEl *> sons; 254 if(geoel->Level()<this->level max && count==0) geoel->Divide(sons);241 if(geoel->Level()<this->level_max && count==0) geoel->Divide(sons); 255 242 } 256 243 else if(geoel->Level()>0) … … 274 261 if(group_Herror>0 && group_Herror<0*mean_Herror){ //itapopo 275 262 /*Reset subelements in the father*/ 276 this-> currentmesh->Element(geoel->Father()->Index())->ResetSubElements();263 this->previousmesh->Element(geoel->Father()->Index())->ResetSubElements(); 277 264 /*Delete the elements and set their indexes in the index2sid and sid2index*/ 278 265 for (int j=0;j<siblings.size();j++){ … … 281 268 this->index2sid[index]=-1; 282 269 if(sid!=-1) this->sid2index[sid]=-1; 283 this-> currentmesh->DeleteElement(siblings[j],siblings[j]->Index());270 this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index()); 284 271 }//for j 285 272 }//if 286 273 }/*Unrefine process*/ 287 274 }//for i 288 this-> currentmesh->BuildConnectivity();289 290 if( amr_verbose) _printf_("\t\trefine to avoid hanging nodes...\n");291 this->RefineMeshToAvoidHangingNodes( this->currentmesh);275 this->previousmesh->BuildConnectivity(); 276 277 if(verbose) _printf_("\t\trefine to avoid hanging nodes...\n"); 278 this->RefineMeshToAvoidHangingNodes(verbose,this->previousmesh); 292 279 293 280 //nohangingnodesmesh = this->CreateRefPatternMesh(newmesh); itapopo tentar otimizar 294 281 295 if(amr_verbose) _printf_("\trefinement process done!\n"); 296 } 297 /*}}}*/ 298 void AdaptiveMeshRefinement::RefineMesh(TPZGeoMesh *gmesh,std::vector<int> &elements){/*{{{*/ 282 if(verbose) _printf_("\trefinement process done!\n"); 283 } 284 /*}}}*/ 285 void AdaptiveMeshRefinement::RefineMesh(bool &verbose,TPZGeoMesh* gmesh,int numberofpoints,double* xylist){/*{{{*/ 286 287 /*Verify if there are points*/ 288 if(numberofpoints==0) return; 289 290 /*Intermediaries*/ 291 int nelem =-1; 292 int side2D = 6; 293 double radius_h =-1; 294 double radius_hmax=std::max(this->radius_level_max,std::max(this->groundingline_distance,this->icefront_distance)); 295 int count =-1; 296 double mindistance=0.; 297 double distance =0.;; 298 TPZVec<REAL> qsi(2,0.),cp(3,0.); 299 TPZVec<TPZGeoEl*> sons; 300 301 /*First, delete the special elements*/ 302 this->DeleteSpecialElements(verbose,gmesh); 303 304 /*Refinement process: loop over level of refinements{{{*/ 305 if(verbose) _printf_("\trefinement process (level max = "<<this->level_max<<")\n"); 306 for(int h=1;h<=this->level_max;h++){ 307 if(verbose) _printf_("\tlevel "<<h<<" (total: "); 308 count=0; 309 310 /*Filter: set the region/radius for level h*/ 311 radius_h=radius_hmax*std::pow(this->gradation,this->level_max-h); 312 313 /*Find the minimal distance of the elements (center point) to the points */ 314 nelem=gmesh->NElements();//must keep here 315 for(int i=0;i<nelem;i++){//itapopo pode-se reduzir o espaço de busca aqui 316 if(!gmesh->Element(i)) continue; 317 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 318 if(gmesh->Element(i)->HasSubElement()) continue; 319 if(gmesh->Element(i)->Level()>=h) continue; 320 gmesh->Element(i)->CenterPoint(side2D,qsi); 321 gmesh->Element(i)->X(qsi,cp); 322 mindistance=radius_h; 323 for (int j=0;j<numberofpoints;j++){ 324 distance = std::sqrt( (xylist[2*j]-cp[0])*(xylist[2*j]-cp[0])+(xylist[2*j+1]-cp[1] )*(xylist[2*j+1]-cp[1]) ); 325 mindistance = std::min(mindistance,distance);//min distance to the point 326 } 327 /*If the element is inside the region, refine it*/ 328 if(mindistance<radius_h){ 329 gmesh->Element(i)->Divide(sons); 330 count++; 331 } 332 } 333 if(verbose) _printf_(""<<count<<")\n"); 334 } 335 /*Adjust the connectivities before continue*/ 336 gmesh->BuildConnectivity(); 337 /*}}}*/ 338 339 /*Unrefinement process: loop over level of refinements{{{*/ 340 if(verbose) _printf_("\tunrefinement process...\n"); 341 for(int h=this->level_max;h>=1;h--){ 342 if(verbose) _printf_("\tlevel "<<h<<" (total: "); 343 count=0; 344 345 /*Filter with lag: set the region/radius for level h*/ 346 radius_h=this->lag*radius_hmax*std::pow(this->gradation,this->level_max-h); 347 348 /*Find the minimal distance of the elements (center point) to the points */ 349 nelem=gmesh->NElements();//must keep here 350 for(int i=0;i<nelem;i++){//itapopo pode-se reduzir o espaço de busca aqui 351 if(!gmesh->Element(i)) continue; 352 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 353 if(gmesh->Element(i)->HasSubElement()) continue; 354 if(gmesh->Element(i)->Level()!=h) continue; 355 if(!gmesh->Element(i)->Father()) _error_("father is NULL!\n"); 356 /*Get the sons of the father (sibilings)*/ 357 sons.clear(); 358 gmesh->Element(i)->Father()->GetHigherSubElements(sons); 359 if(sons.size()!=4) continue;//delete just group of 4 elements. This avoids big holes in the mesh 360 /*Find the minimal distance of the group*/ 361 mindistance=INFINITY; 362 for(int s=0;s<sons.size();s++){ 363 sons[s]->CenterPoint(side2D,qsi); 364 sons[s]->X(qsi,cp); 365 for (int j=0;j<numberofpoints;j++){ 366 distance = std::sqrt( (xylist[2*j]-cp[0])*(xylist[2*j]-cp[0])+(xylist[2*j+1]-cp[1] )*(xylist[2*j+1]-cp[1]) ); 367 mindistance = std::min(mindistance,distance);//min distance to the point 368 } 369 } 370 /*If the group is outside the region, unrefine the group*/ 371 if(mindistance>radius_h){ 372 gmesh->Element(i)->Father()->ResetSubElements(); 373 count++; 374 for(int s=0;s<sons.size();s++){ 375 gmesh->DeleteElement(sons[s],sons[s]->Index()); 376 } 377 } 378 } 379 if(verbose) _printf_(""<<count<<")\n"); 380 } 381 /*Adjust the connectivities before continue*/ 382 gmesh->BuildConnectivity(); 383 /*}}}*/ 384 385 /*Now, insert special elements to avoid hanging nodes*/ 386 this->RefineMeshToAvoidHangingNodes(verbose,gmesh); 387 } 388 /*}}}*/ 389 void AdaptiveMeshRefinement::RefineMesh(TPZGeoMesh* gmesh,std::vector<int> &elements){/*{{{*/ 299 390 300 391 /*Refine elements: uniform pattern refinement*/ … … 312 403 } 313 404 /*}}}*/ 314 void AdaptiveMeshRefinement::RefineMeshToAvoidHangingNodes( TPZGeoMesh *gmesh){/*{{{*/405 void AdaptiveMeshRefinement::RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh){/*{{{*/ 315 406 316 407 /*Now, insert special elements to avoid hanging nodes*/ 408 if(verbose) _printf_("\trefining to avoid hanging nodes (total: "); 409 410 /*Intermediaries*/ 411 int nelem=-1; 412 int count= 1; 413 414 while(count>0){ 415 nelem=gmesh->NElements();//must keep here 416 count=0; 417 for(int i=0;i<nelem;i++){ 418 /*Get geometric element and verify if it has already been refined. Geoel may not have been previously refined*/ 419 TPZGeoEl * geoel=gmesh->Element(i); 420 if(!geoel) continue; 421 if(geoel->HasSubElement()) continue; 422 if(geoel->MaterialId() != this->GetElemMaterialID()) continue; 423 /*Get the refinement pattern for this element and refine it*/ 424 TPZAutoPointer<TPZRefPattern> refp=TPZRefPatternTools::PerfectMatchRefPattern(geoel); 425 if(refp){ 426 /*Non-uniform refinement*/ 427 TPZVec<TPZGeoEl *> sons; 428 geoel->SetRefPattern(refp); 429 geoel->Divide(sons); 430 count++; 431 /*Keep the index of the special elements*/ 432 for(int j=0;j<sons.size();j++) this->specialelementsindex.push_back(sons[j]->Index()); 433 } 434 } 435 if(verbose){ 436 if(count==0) _printf_(""<<count<<")\n"); 437 else _printf_(""<<count<<", "); 438 } 439 gmesh->BuildConnectivity(); 440 } 441 } 442 /*}}}*/ 443 void AdaptiveMeshRefinement::DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh){/*{{{*/ 444 445 /*Intermediaries*/ 446 int count=0; 447 448 if(verbose) _printf_("\tdelete "<<this->specialelementsindex.size()<<" special elements (total: "); 449 for(int i=0;i<this->specialelementsindex.size();i++){ 450 if(this->specialelementsindex[i]==-1) continue; 451 if(!gmesh->Element(this->specialelementsindex[i])) continue; 452 if(gmesh->Element(this->specialelementsindex[i])->Father()) gmesh->Element(this->specialelementsindex[i])->Father()->ResetSubElements(); 453 gmesh->DeleteElement(gmesh->Element(this->specialelementsindex[i]),this->specialelementsindex[i]); 454 count++; 455 } 456 if(verbose) _printf_(""<<count<<")\n"); 457 /*Cleanup*/ 317 458 this->specialelementsindex.clear(); 318 const int NElem = gmesh->NElements(); 319 for(int i=0;i<NElem;i++){ 320 /*Get geometric element and verify if it has already been refined. Geoel may not have been previously refined*/ 321 TPZGeoEl * geoel=gmesh->Element(i); 322 if(!geoel) continue; 323 if(geoel->HasSubElement()) continue; 324 if(geoel->MaterialId() != this->GetElemMaterialID()) continue; 325 /*Get the refinement pattern for this element and refine it*/ 326 TPZAutoPointer<TPZRefPattern> refp=TPZRefPatternTools::PerfectMatchRefPattern(geoel); 327 if(refp){ 328 /*Non-uniform refinement*/ 329 TPZVec<TPZGeoEl *> Sons; 330 geoel->SetRefPattern(refp); 331 geoel->Divide(Sons); 332 /*Keep the index of the special elements*/ 333 for(int j=0;j<Sons.size();j++) this->specialelementsindex.push_back(Sons[j]->Index()); 334 } 335 } 459 /*Adjust connectivities*/ 336 460 gmesh->BuildConnectivity(); 337 461 } 338 462 /*}}}*/ 339 void AdaptiveMeshRefinement::GetMesh( int &nvertices,int &nelements,double** px,double** py, int** pelements){/*{{{*/463 void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py, int** pelements){/*{{{*/ 340 464 341 465 /* IMPORTANT! pelements are in Matlab indexing … … 346 470 347 471 /*Intermediaries */ 348 TPZGeoMesh* gmesh = this->currentmesh;//itapopo confirmar349 350 472 long sid,nodeindex; 351 int nconformelements,nconformvertices; 473 int nconformelements,nconformvertices; 474 int ntotalvertices = gmesh->NNodes(); 352 475 int* newelements = NULL; 353 double* newmeshX = NULL; //xNew<double>(ntotalvertices);354 double* newmeshY = NULL; //xNew<double>(ntotalvertices);476 double* newmeshX = NULL; 477 double* newmeshY = NULL; 355 478 TPZGeoEl* geoel = NULL; 356 long* vertex_index2sid = xNew<long>( gmesh->NNodes());479 long* vertex_index2sid = xNew<long>(ntotalvertices); 357 480 this->index2sid.clear(); this->index2sid.resize(gmesh->NElements()); 358 481 this->sid2index.clear(); 359 482 360 /*Get mesh coords */361 //for(int i=0;i<ntotalvertices;i++ ){362 // TPZVec<REAL> coords(3,0.);363 // gmesh->NodeVec()[i].GetCoordinates(coords);364 // newmeshX[i] = coords[0];365 // newmeshY[i] = coords[1];366 //}367 368 483 /*Fill in the vertex_index2sid vector with non usual index value*/ 369 484 for(int i=0;i<gmesh->NNodes();i++) vertex_index2sid[i]=-1; … … 379 494 if(geoel->HasSubElement()) continue; 380 495 if(geoel->MaterialId() != this->GetElemMaterialID()) continue; 381 this->sid2index.push_back( i);//keep the element index382 this->index2sid[ i]=this->sid2index.size()-1;//keep the element sid383 for(int j=0;j<this-> elementswidth;j++){496 this->sid2index.push_back(geoel->Index());//keep the element index 497 this->index2sid[geoel->Index()]=this->sid2index.size()-1;//keep the element sid 498 for(int j=0;j<this->GetNumberOfNodes();j++){ 384 499 nodeindex=geoel->NodeIndex(j); 385 if(vertex_index2sid[nodeindex]==-1){ 500 if(nodeindex<0) _error_("nodeindex is <0\n"); 501 if(vertex_index2sid[nodeindex]==-1){ 386 502 vertex_index2sid[nodeindex]=sid; 387 503 sid++; … … 392 508 nconformelements = (int)this->sid2index.size(); 393 509 nconformvertices = (int)sid; 394 newelements = xNew<int>(nconformelements*this-> elementswidth);510 newelements = xNew<int>(nconformelements*this->GetNumberOfNodes()); 395 511 newmeshX = xNew<double>(nconformvertices); 396 512 newmeshY = xNew<double>(nconformvertices); 397 513 398 for(int i=0;i<nconformvertices;i++){//over the TPZNode index (fill in the ISSM vertices coords) 399 sid = vertex_index2sid[i]; 400 if(sid!=-1){ 401 TPZVec<REAL> coords(3,0.); 402 gmesh->NodeVec()[i].GetCoordinates(coords); 403 newmeshX[sid] = coords[0]; 404 newmeshY[sid] = coords[1]; 405 } 514 for(int i=0;i<ntotalvertices;i++){//over the TPZNode index (fill in the ISSM vertices coords) 515 sid=vertex_index2sid[i]; 516 if(sid==-1) continue;//skip this index (node no used) 517 TPZVec<REAL> coords(3,0.); 518 gmesh->NodeVec()[i].GetCoordinates(coords); 519 newmeshX[sid] = coords[0]; 520 newmeshY[sid] = coords[1]; 406 521 } 407 522 408 523 for(int i=0;i<this->sid2index.size();i++){//over the sid (fill the ISSM elements) 409 for(int j=0;j<this-> elementswidth;j++) {524 for(int j=0;j<this->GetNumberOfNodes();j++) { 410 525 geoel = gmesh->ElementVec()[this->sid2index[i]]; 411 526 sid = vertex_index2sid[geoel->NodeIndex(j)]; 412 newelements[i*this-> elementswidth+j]=(int)sid+1;//C to Matlab indexing527 newelements[i*this->GetNumberOfNodes()+j]=(int)sid+1;//C to Matlab indexing 413 528 } 414 529 /*Verify the Jacobian determinant. If detJ<0, swap the 2 first postions: … … 418 533 int a,b,c; 419 534 420 a=newelements[i*this-> elementswidth+0]-1;421 b=newelements[i*this-> elementswidth+1]-1;422 c=newelements[i*this-> elementswidth+2]-1;535 a=newelements[i*this->GetNumberOfNodes()+0]-1; 536 b=newelements[i*this->GetNumberOfNodes()+1]-1; 537 c=newelements[i*this->GetNumberOfNodes()+2]-1; 423 538 424 539 xa=newmeshX[a]; ya=newmeshY[a]; … … 430 545 /*verify and swap, if necessary*/ 431 546 if(detJ<0) { 432 newelements[i*this-> elementswidth+0]=b+1;//a->b433 newelements[i*this-> elementswidth+1]=a+1;//b->a547 newelements[i*this->GetNumberOfNodes()+0]=b+1;//a->b 548 newelements[i*this->GetNumberOfNodes()+1]=a+1;//b->a 434 549 } 435 550 } 436 551 437 552 /*Setting outputs*/ 438 nvertices = nconformvertices;439 nelements = nconformelements;553 *nvertices = nconformvertices; 554 *nelements = nconformelements; 440 555 *px = newmeshX; 441 556 *py = newmeshY; … … 446 561 } 447 562 /*}}}*/ 448 void AdaptiveMeshRefinement::FindElements(int &numberofpoints,double* xp,double* yp,TPZGeoMesh *gmesh,int &hlevel,std::vector<int> &elements){/*{{{*/ 449 450 if(!gmesh) _error_("Impossible to set elements: gmesh is NULL!\n"); 451 452 if(false){ 453 this->AllElements(gmesh,elements); //uniform, refine all elements! 454 return; 455 } 456 457 /*Intermediaries*/ 458 elements.clear(); 459 double D1 = this->regionlevel1; 460 double Dhmax = this->regionlevelmax; 461 int hmax = this->levelmax; 462 double alpha = (hmax==1) ? 0. : log(D1/Dhmax)/(hmax-1.); 463 double Di = D1/exp(alpha*(hlevel-1)); 464 int side2D = 6; 465 double distance,value; 466 467 /*Find elements near the points */ 468 for(int i=0;i<gmesh->NElements();i++){ 469 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 470 if(gmesh->Element(i)->HasSubElement()) continue; 471 if(gmesh->Element(i)->Level()>=hlevel) continue; 472 TPZVec<REAL> qsi(2,0.); 473 TPZVec<REAL> centerPoint(3,0.); 474 gmesh->Element(i)->CenterPoint(side2D, qsi); 475 gmesh->Element(i)->X(qsi, centerPoint); 476 distance = Di; 477 for (int j=0;j<numberofpoints;j++){ 478 value = std::sqrt( (xp[j]-centerPoint[0])*(xp[j]-centerPoint[0])+(yp[j]-centerPoint[1] )*(yp[j]-centerPoint[1]) );//sqrt( (x2-x1)^2 + (y2-y1)^2 ) 479 if(value<distance) distance=value; //min distance to the point 480 } 481 if(distance<Di) elements.push_back(i); 482 } 483 484 } 485 /*}}}*/ 486 void AdaptiveMeshRefinement::AllElements(TPZGeoMesh *gmesh,std::vector<int> &elements){/*{{{*/ 487 /* Uniform refinement. This refines the entire mesh */ 488 int nelements = gmesh->NElements(); 489 elements.clear(); 490 for(int i=0;i<nelements;i++){ 491 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue; 492 if(gmesh->Element(i)->HasSubElement()) continue; 493 elements.push_back(i); 494 } 495 } 496 /*}}}*/ 497 void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices,int &nelements,int &width,double* x,double* y,int* elements){/*{{{*/ 563 void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements){/*{{{*/ 498 564 499 565 /* IMPORTANT! elements come in Matlab indexing … … 502 568 if(nvertices<=0) _error_("Impossible to create initial mesh: nvertices is <= 0!\n"); 503 569 if(nelements<=0) _error_("Impossible to create initial mesh: nelements is <= 0!\n"); 504 this->SetElementWidth(width);505 570 506 571 /*Verify and creating initial mesh*/ 507 if(this->fathermesh || this-> currentmesh) _error_("Initial mesh already exists!");572 if(this->fathermesh || this->previousmesh) _error_("Initial mesh already exists!"); 508 573 509 574 this->fathermesh = new TPZGeoMesh(); … … 525 590 long index; 526 591 const int mat = this->GetElemMaterialID(); 527 TPZManVector<long> elem(this-> elementswidth,0);592 TPZManVector<long> elem(this->GetNumberOfNodes(),0); 528 593 this->sid2index.clear(); 529 594 530 595 for(int i=0;i<nelements;i++){ 531 for(int j=0;j<this-> elementswidth;j++) elem[j]=elements[i*this->elementswidth+j]-1;//Convert Matlab to C indexing596 for(int j=0;j<this->GetNumberOfNodes();j++) elem[j]=elements[i*this->GetNumberOfNodes()+j]-1;//Convert Matlab to C indexing 532 597 /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */ 533 598 const int reftype = 1; 534 switch(this-> elementswidth){599 switch(this->GetNumberOfNodes()){ 535 600 case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index,reftype); break; 536 601 default: _error_("mesh not supported yet"); … … 543 608 /*Build element and node connectivities*/ 544 609 this->fathermesh->BuildConnectivity(); 545 /*Set currentmesh*/546 this-> currentmesh=new TPZGeoMesh(*this->fathermesh);610 /*Set previous mesh*/ 611 this->previousmesh=new TPZGeoMesh(*this->fathermesh); 547 612 } 548 613 /*}}}*/ … … 629 694 } 630 695 /*}}}*/ 631 void AdaptiveMeshRefinement::SetLevelMax(int &h){/*{{{*/ 632 this->levelmax = h; 633 } 634 /*}}}*/ 635 void AdaptiveMeshRefinement::SetRegions(double &D1,double Dhmax){/*{{{*/ 636 this->regionlevel1 = D1; 637 this->regionlevelmax = Dhmax; 638 } 639 /*}}}*/ 640 void AdaptiveMeshRefinement::SetElementWidth(int &width){/*{{{*/ 641 if(width!=3) _error_("elementswidth not supported yet!"); 642 this->elementswidth = width; 643 } 644 /*}}}*/ 645 void AdaptiveMeshRefinement::CheckMesh(int &nvertices,int &nelements,int &width,double** px,double** py,int** pelements){/*{{{*/ 696 void AdaptiveMeshRefinement::CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements){/*{{{*/ 646 697 647 698 /*Basic verification*/ 648 699 if(nvertices<=0) _error_("Impossible to continue: nvertices <=0!\n"); 649 700 if(nelements<=0) _error_("Impossible to continue: nelements <=0!\n"); 650 if(width!=3) _error_("Impossible to continue: width !=3!\n");651 701 if(!px) _error_("Impossible to continue: px is NULL!\n"); 652 702 if(!py) _error_("Impossible to continue: py is NULL!\n"); … … 656 706 std::set<int> elemvertices; 657 707 elemvertices.clear(); 658 for(int i=0;i< nelements;i++){659 for(int j=0;j< width;j++) {660 elemvertices.insert((*pelements)[i* width+j]);661 } 662 } 663 if(elemvertices.size()!= nvertices) _error_("Impossible to continue: elemvertices.size() != nvertices!\n");708 for(int i=0;i<*nelements;i++){ 709 for(int j=0;j<this->GetNumberOfNodes();j++) { 710 elemvertices.insert((*pelements)[i*this->GetNumberOfNodes()+j]); 711 } 712 } 713 if(elemvertices.size()!=*nvertices) _error_("Impossible to continue: elemvertices.size() != nvertices!\n"); 664 714 665 715 //Verify if there are inf or NaN in coords 666 for(int i=0;i< nvertices;i++){716 for(int i=0;i<*nvertices;i++){ 667 717 if(isnan((*px)[i]) || isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n"); 668 718 if(isnan((*py)[i]) || isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n"); 669 719 } 670 for(int i=0;i<nelements;i++){ 671 for(int j=0;j<width;j++){ 672 if(isnan((*pelements)[i*width+j]) || isinf((*pelements)[i*width+j]) ) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n"); 720 for(int i=0;i<*nelements;i++){ 721 for(int j=0;j<this->GetNumberOfNodes();j++){ 722 if(isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n"); 723 if(isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n"); 673 724 } 674 725 } … … 676 727 } 677 728 /*}}}*/ 729 void AdaptiveMeshRefinement::PrintGMeshVTK(TPZGeoMesh* gmesh,std::ofstream &file,bool matColor){/*{{{*/ 730 731 file.clear(); 732 long nelements = gmesh->NElements(); 733 TPZGeoEl *gel; 734 std::stringstream node, connectivity, type, material; 735 736 //Header 737 file << "# vtk DataFile Version 3.0" << std::endl; 738 file << "TPZGeoMesh VTK Visualization" << std::endl; 739 file << "ASCII" << std::endl << std::endl; 740 file << "DATASET UNSTRUCTURED_GRID" << std::endl; 741 file << "POINTS "; 742 743 long actualNode = -1, size = 0, nVALIDelements = 0; 744 for(long el = 0; el < nelements; el++){ 745 gel = gmesh->ElementVec()[el]; 746 if(!gel )//|| (gel->Type() == EOned && !gel->IsLinearMapping()))//Exclude Arc3D and Ellipse3D 747 { 748 continue; 749 } 750 if(gel->HasSubElement()) 751 { 752 continue; 753 } 754 MElementType elt = gel->Type(); 755 int elNnodes = MElementType_NNodes(elt); 756 757 size += (1+elNnodes); 758 connectivity << elNnodes; 759 760 for(int t = 0; t < elNnodes; t++) 761 { 762 for(int c = 0; c < 3; c++) 763 { 764 double coord = gmesh->NodeVec()[gel->NodeIndex(t)].Coord(c); 765 node << coord << " "; 766 } 767 node << std::endl; 768 769 actualNode++; 770 connectivity << " " << actualNode; 771 } 772 connectivity << std::endl; 773 774 int elType = this->GetVTK_ElType(gel); 775 type << elType << std::endl; 776 777 if(matColor == true) 778 { 779 material << gel->MaterialId() << std::endl; 780 } 781 else 782 { 783 material << gel->Index() << std::endl; 784 } 785 786 nVALIDelements++; 787 } 788 node << std::endl; 789 actualNode++; 790 file << actualNode << " float" << std::endl << node.str(); 791 792 file << "CELLS " << nVALIDelements << " "; 793 794 file << size << std::endl; 795 file << connectivity.str() << std::endl; 796 797 file << "CELL_TYPES " << nVALIDelements << std::endl; 798 file << type.str() << std::endl; 799 800 file << "CELL_DATA" << " " << nVALIDelements << std::endl; 801 file << "FIELD FieldData 1" << std::endl; 802 if(matColor == true) 803 { 804 file << "material 1 " << nVALIDelements << " int" << std::endl; 805 } 806 else 807 { 808 file << "ElementIndex 1 " << nVALIDelements << " int" << std::endl; 809 } 810 file << material.str(); 811 file.close(); 812 } 813 /*}}}*/ 814 int AdaptiveMeshRefinement::GetVTK_ElType(TPZGeoEl * gel){/*{{{*/ 815 816 MElementType pzElType = gel->Type(); 817 818 int elType = -1; 819 switch (pzElType) 820 { 821 case(EPoint): 822 { 823 elType = 1; 824 break; 825 } 826 case(EOned): 827 { 828 elType = 3; 829 break; 830 } 831 case (ETriangle): 832 { 833 elType = 5; 834 break; 835 } 836 case (EQuadrilateral): 837 { 838 elType = 9; 839 break; 840 } 841 case (ETetraedro): 842 { 843 elType = 10; 844 break; 845 } 846 case (EPiramide): 847 { 848 elType = 14; 849 break; 850 } 851 case (EPrisma): 852 { 853 elType = 13; 854 break; 855 } 856 case (ECube): 857 { 858 elType = 12; 859 break; 860 } 861 default: 862 { 863 std::cout << "Element type not found on " << __PRETTY_FUNCTION__ << std::endl; 864 DebugStop(); 865 break; 866 } 867 } 868 if(elType == -1) 869 { 870 std::cout << "Element type not found on " << __PRETTY_FUNCTION__ << std::endl; 871 std::cout << "MIGHT BE CURVED ELEMENT (quadratic or quarter point)" << std::endl; 872 DebugStop(); 873 } 874 875 return elType; 876 } 877 /*}}}*/ 878 -
issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h
r21919 r22100 37 37 #include <pzgeotriangle.h> 38 38 #include <tpzgeoelrefpattern.h> 39 #include <pzgraphmesh.h> 39 40 #include <TPZVTKGeoMesh.h> 40 41 … … 46 47 47 48 public: 48 49 /*Public methods*/ 49 /*Public attributes{{{*/ 50 /* Filter (distance to the points) 51 * to refine: 52 * radius_h = initial_radius * gradation ^ (level_max-h) 53 * to unirefine 54 * radius_h = lag * initial_radius * gradation ^ (level_max-h) 55 */ 56 int level_max; //max level of refinement 57 double radius_level_max; //initial radius which in the elements will be refined with level max 58 double gradation; //geometric progression ratio to calculate radius of level h 59 double lag; //lag used in the unrefine process 60 /*Target and estimators*/ 61 double groundingline_distance; //if groundingline_distance>initial_radius, groundingline_distance will be used instead initial_radius 62 double icefront_distance; //if icefront_distance>initial_radius, icefront_distance will be used instead initial_radius 63 double thicknesserror_threshold; //if ==0, it will not be used 64 double deviatoricerror_threshold; //if ==0, it will not be used 65 /*}}}*/ 66 /*Public methods{{{*/ 50 67 /* Constructor, destructor etc*/ 51 68 AdaptiveMeshRefinement(); … … 53 70 AdaptiveMeshRefinement & operator= (const AdaptiveMeshRefinement &cp); 54 71 virtual ~AdaptiveMeshRefinement(); 55 56 72 /*General methods*/ 57 73 void CleanUp(); 58 74 void Initialize(); 59 void SetLevelMax(int &h); 60 void SetRegions(double &D1,double Dhmax); 61 void SetElementWidth(int &width); 62 void Execute(bool &amr_verbose,int &numberofelements, 63 double* partiallyfloatedelements,double *masklevelset,double* deviatorictensorerror,double* thicknesserror, 64 int &newnumberofvertices,int &newnumberofelements,double** x,double** y,int** elementslist); 65 void CreateInitialMesh(int &nvertices,int &nelements,int &width,double* x,double* y,int* elements); 66 TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh); 67 void CheckMesh(int &nvertices,int &nelements,int &width,double** px,double** py,int** pelements); 68 75 void ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 76 void ExecuteRefinement(double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist); 77 void CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements); 78 void CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements); 79 /*}}}*/ 69 80 private: 70 /*Private attributes*/ 71 int elementswidth; // Geometric nodes for element: 3 == Tria, 4 == Tetra, 6 == Penta 72 int levelmax; // Max level of refinement 73 double regionlevel1; // Region which will be refined with level 1 74 double regionlevelmax; // Region which will be refined with level max 75 int step; //itapopo testando 76 int smooth_frequency; //itapopo testando 81 /*Private attributes{{{*/ 77 82 std::vector<int> sid2index; // Vector that keeps index of PZGeoMesh elements used in the ISSM mesh (sid) 78 83 std::vector<int> index2sid; // Vector that keeps sid of issm mesh elements used in the neopz mesh (index) 79 84 std::vector<int> specialelementsindex; // Vector that keeps index of the special elements (created to avoid haning nodes) 80 85 TPZGeoMesh *fathermesh; // Father Mesh is the entire mesh without refinement 81 TPZGeoMesh *currentmesh; // Current Mesh is the refined mesh 82 83 /*Private methods*/ 84 void RefinementProcess(bool &amr_verbose,double* partiallyfloatedelements,double* masklevelset,double* deviatorictensorerror,double* thicknesserror); 86 TPZGeoMesh *previousmesh; // Previous Mesh is the refined mesh 87 /*}}}*/ 88 /*Private methods{{{*/ 89 void RefinementProcess(bool &verbose,double* partiallyfloatedelements,double* masklevelset,double* deviatorictensorerror,double* thicknesserror); 90 void RefineMesh(bool &verbose,TPZGeoMesh* gmesh,int numberofpoints,double* xylist); 85 91 void RefineMesh(TPZGeoMesh *gmesh,std::vector<int> &elements); 86 void RefineMeshToAvoidHangingNodes(TPZGeoMesh *gmesh); 87 void GetMesh(int &nvertices,int &nelements,double** px,double** py,int** pelements); 88 void FindElements(int &numberofpoints,double* xp,double* yp,TPZGeoMesh *gmesh,int &hlevel,std::vector<int> &elements); 89 void AllElements(TPZGeoMesh *gmesh,std::vector<int> &elements); 90 inline int GetElemMaterialID(){return 1;} 92 void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh); 93 void DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh); 94 void GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py,int** pelements); 95 TPZGeoMesh* CreateRefPatternMesh(TPZGeoMesh* gmesh); 96 inline int GetElemMaterialID(){return 1;} 97 inline int GetNumberOfNodes(){return 3;} 98 void PrintGMeshVTK(TPZGeoMesh *gmesh,std::ofstream &file,bool matColor=true); 99 int GetVTK_ElType(TPZGeoEl* gel); 100 /*}}}*/ 91 101 }; 92 102 -
issm/trunk-jpl/src/c/classes/AmrBamg.cpp
r21930 r22100 137 137 138 138 /*verify if the metric will be reseted or not*/ 139 if( !this->keepmetric){139 if(this->keepmetric==0){ 140 140 if(this->options->metric) xDelete<IssmDouble>(this->options->metric); 141 141 this->options->metricSize[0] = 0; -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r22004 r22100 3590 3590 xDelete<IssmDouble>(elementlevelset); 3591 3591 delete vmasklevelset; 3592 3593 3592 } 3594 3593 /*}}}*/ … … 3632 3631 delete vxc; 3633 3632 delete vyc; 3633 } 3634 /*}}}*/ 3635 void FemModel::GetZeroLevelSetPoints(IssmDouble** pzerolevelset_points,int &numberofpoints,int levelset_type){/*{{{*/ 3636 3637 /*Here, "zero level set" means grounding line or ice front, depending on the level set type*/ 3638 /*pzerolevelset_points are the element center points with zero level set. X and Y coords*/ 3639 if(levelset_type!=MaskGroundediceLevelsetEnum && levelset_type!=MaskIceLevelsetEnum){ 3640 _error_("level set type not implemented yet!"); 3641 } 3642 3643 /*Outputs*/ 3644 IssmDouble* zerolevelset_points = NULL; 3645 int npoints = 0; 3646 3647 /*Intermediaries*/ 3648 int elementswidth = this->GetElementsWidth(); 3649 int numberofelements = this->elements->NumberOfElements(); 3650 int* elem_vertices = xNew<int>(elementswidth); 3651 IssmDouble* levelset = xNew<IssmDouble>(elementswidth); 3652 IssmDouble* x = NULL; 3653 IssmDouble* y = NULL; 3654 IssmDouble* z = NULL; 3655 Vector<IssmDouble>* vx_zerolevelset = new Vector<IssmDouble>(numberofelements); 3656 Vector<IssmDouble>* vy_zerolevelset = new Vector<IssmDouble>(numberofelements); 3657 IssmDouble* x_zerolevelset = NULL; 3658 IssmDouble* y_zerolevelset = NULL; 3659 int count,sid; 3660 IssmDouble xcenter,ycenter; 3661 3662 /*Get vertices coordinates*/ 3663 VertexCoordinatesx(&x,&y,&z,this->vertices,false) ; 3664 3665 /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/ 3666 for(int i=0;i<this->elements->Size();i++){ 3667 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i)); 3668 element->GetInputListOnVertices(levelset,levelset_type); 3669 element->GetVerticesSidList(elem_vertices); 3670 sid = element->Sid(); 3671 xcenter = NAN; 3672 ycenter = NAN; 3673 Tria* tria = xDynamicCast<Tria*>(element); 3674 if(tria->IsIceInElement()){/*verify if there is ice in the element*/ 3675 if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 3676 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) { 3677 xcenter=(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.; 3678 ycenter=(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.; 3679 } 3680 } 3681 vx_zerolevelset->SetValue(sid,xcenter,INS_VAL); 3682 vy_zerolevelset->SetValue(sid,ycenter,INS_VAL); 3683 } 3684 /*Assemble and serialize*/ 3685 vx_zerolevelset->Assemble(); 3686 vy_zerolevelset->Assemble(); 3687 x_zerolevelset=vx_zerolevelset->ToMPISerial(); 3688 y_zerolevelset=vy_zerolevelset->ToMPISerial(); 3689 3690 /*Find the number of points*/ 3691 npoints=0; 3692 for(int i=0;i<numberofelements;i++) if(!xIsNan<IssmDouble>(x_zerolevelset[i])) npoints++; 3693 3694 /*Keep just the element center coordinates with zero level set (compact the structure)*/ 3695 zerolevelset_points=xNew<IssmDouble>(2*npoints);//x and y 3696 count=0; 3697 for(int i=0;i<numberofelements;i++){ 3698 if(!xIsNan<IssmDouble>(x_zerolevelset[i])){ 3699 zerolevelset_points[2*count] = x_zerolevelset[i]; 3700 zerolevelset_points[2*count+1] = y_zerolevelset[i]; 3701 count++; 3702 } 3703 } 3704 3705 /*Assign outputs*/ 3706 numberofpoints = npoints; 3707 (*pzerolevelset_points) = zerolevelset_points; 3708 3709 /*Cleanup*/ 3710 xDelete<int>(elem_vertices); 3711 xDelete<IssmDouble>(levelset); 3712 xDelete<IssmDouble>(x_zerolevelset); 3713 xDelete<IssmDouble>(y_zerolevelset); 3714 xDelete<IssmDouble>(x); 3715 xDelete<IssmDouble>(y); 3716 xDelete<IssmDouble>(z); 3717 delete vx_zerolevelset; 3718 delete vy_zerolevelset; 3634 3719 } 3635 3720 /*}}}*/ … … 4586 4671 4587 4672 /*Intermediaries*/ 4673 int numberofvertices = this->vertices->NumberOfVertices(); 4674 IssmDouble* levelset_points= NULL; 4675 IssmDouble* x = NULL; 4676 IssmDouble* y = NULL; 4677 IssmDouble* z = NULL; 4678 int numberofpoints; 4679 IssmDouble distance; 4680 4681 /*Get vertices coordinates*/ 4682 VertexCoordinatesx(&x,&y,&z,this->vertices,false) ; 4683 4684 /*Get points which level set is zero (center of elements with zero level set)*/ 4685 this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type); 4686 4687 /*Find the minimal vertice distance to the zero levelset (grounding line or ice front)*/ 4688 verticedistance=xNew<IssmDouble>(numberofvertices); 4689 for(int i=0;i<numberofvertices;i++){ 4690 verticedistance[i]=INFINITY; 4691 for(int j=0;j<numberofpoints;j++){ 4692 distance=sqrt((x[i]-levelset_points[2*j])*(x[i]-levelset_points[2*j])+(y[i]-levelset_points[2*j+1])*(y[i]-levelset_points[2*j+1])); 4693 verticedistance[i]=min(distance,verticedistance[i]); 4694 } 4695 } 4696 4697 /*Assign the pointer*/ 4698 (*pverticedistance)=verticedistance; 4699 4700 /*Cleanup*/ 4701 xDelete<IssmDouble>(levelset_points); 4702 xDelete<IssmDouble>(x); 4703 xDelete<IssmDouble>(y); 4704 xDelete<IssmDouble>(z); 4705 } 4706 /*}}}*/ 4707 #endif 4708 4709 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_ADOLC_) 4710 void FemModel::ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist){/*{{{*/ 4711 4712 /*pnewelementslist keep vertices in Matlab indexing*/ 4713 int my_rank = IssmComm::GetRank(); 4714 int numberofelements = this->elements->NumberOfElements(); 4715 IssmDouble* element_label = xNewZeroInit<IssmDouble>(numberofelements); 4716 int numberofpoints = -1; 4717 IssmDouble* xylist = NULL; 4718 IssmDouble* newx = NULL; 4719 IssmDouble* newy = NULL; 4720 IssmDouble* newz = NULL; 4721 int* newelementslist = NULL; 4722 int newnumberofvertices = -1; 4723 int newnumberofelements = -1; 4724 4725 /*Get element_label, if requested*/ 4726 if(this->amr->groundingline_distance>0) this->GetElementLabelFromZeroLevelSet(element_label,MaskGroundediceLevelsetEnum); 4727 if(this->amr->icefront_distance>0) this->GetElementLabelFromZeroLevelSet(element_label,MaskIceLevelsetEnum); 4728 if(this->amr->thicknesserror_threshold>0) this->GetElementLabelFromEstimators(element_label,ThicknessErrorEstimatorEnum); 4729 if(this->amr->deviatoricerror_threshold>0) this->GetElementLabelFromEstimators(element_label,DeviatoricStressErrorEstimatorEnum); 4730 this->GetPointsFromElementLabel(element_label,&numberofpoints,&xylist); 4731 4732 if(my_rank==0){ 4733 this->amr->ExecuteRefinement(numberofpoints,xylist,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist); 4734 newz=xNewZeroInit<IssmDouble>(newnumberofvertices); 4735 if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz."); 4736 } 4737 else{ 4738 newx=xNew<IssmDouble>(newnumberofvertices); 4739 newy=xNew<IssmDouble>(newnumberofvertices); 4740 newz=xNew<IssmDouble>(newnumberofvertices); 4741 newelementslist=xNew<int>(newnumberofelements*this->GetElementsWidth()); 4742 } 4743 4744 /*Send new mesh to others CPU*/ 4745 ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 4746 ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 4747 ISSM_MPI_Bcast(newx,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4748 ISSM_MPI_Bcast(newy,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4749 ISSM_MPI_Bcast(newz,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4750 ISSM_MPI_Bcast(newelementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm()); 4751 4752 /*Assign the pointers*/ 4753 (*pnewelementslist) = newelementslist; //Matlab indexing 4754 (*pnewx) = newx; 4755 (*pnewy) = newy; 4756 (*pnewz) = newz; 4757 *pnewnumberofvertices= newnumberofvertices; 4758 *pnewnumberofelements= newnumberofelements; 4759 4760 /*Cleanup*/ 4761 xDelete<IssmDouble>(element_label); 4762 xDelete<IssmDouble>(xylist); 4763 } 4764 /*}}}*/ 4765 void FemModel::InitializeAdaptiveRefinementNeopz(void){/*{{{*/ 4766 4767 /*Define variables*/ 4768 int my_rank = IssmComm::GetRank(); 4769 int numberofvertices = this->vertices->NumberOfVertices(); 4770 int numberofelements = this->elements->NumberOfElements(); 4771 IssmDouble* x = NULL; 4772 IssmDouble* y = NULL; 4773 IssmDouble* z = NULL; 4774 int* elements = NULL; 4775 int level_max = -1; 4776 IssmDouble radius_level_max = -1; 4777 IssmDouble gradation = -1; 4778 IssmDouble lag = -1; 4779 IssmDouble groundingline_distance = -1; 4780 IssmDouble icefront_distance = -1; 4781 IssmDouble thicknesserror_threshold = -1; 4782 IssmDouble deviatoricerror_threshold = -1; 4783 4784 /*Initialize field as NULL for now*/ 4785 this->amr = NULL; 4786 4787 /*Get vertices coordinates of the coarse mesh (father mesh)*/ 4788 /*elements comes in Matlab indexing*/ 4789 this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elements); 4790 4791 /*Get amr parameters*/ 4792 this->parameters->FindParam(&level_max,AmrLevelMaxEnum); 4793 this->parameters->FindParam(&radius_level_max,AmrRadiusLevelMaxEnum); 4794 this->parameters->FindParam(&gradation,AmrGradationEnum); 4795 this->parameters->FindParam(&lag,AmrLagEnum); 4796 this->parameters->FindParam(&groundingline_distance,AmrGroundingLineDistanceEnum); 4797 this->parameters->FindParam(&icefront_distance,AmrIceFrontDistanceEnum); 4798 this->parameters->FindParam(&thicknesserror_threshold,AmrThicknessErrorThresholdEnum); 4799 this->parameters->FindParam(&deviatoricerror_threshold,AmrDeviatoricErrorThresholdEnum); 4800 4801 /*Create initial mesh (coarse mesh) in neopz data structure*/ 4802 /*Just CPU #0 should keep AMR object*/ 4803 /*Initialize refinement pattern*/ 4804 this->SetRefPatterns(); 4805 this->amr = new AdaptiveMeshRefinement(); 4806 this->amr->level_max = level_max; 4807 this->amr->radius_level_max = radius_level_max; 4808 this->amr->gradation = gradation; 4809 this->amr->lag = lag; 4810 this->amr->groundingline_distance = groundingline_distance; 4811 this->amr->icefront_distance = icefront_distance; 4812 this->amr->thicknesserror_threshold = thicknesserror_threshold; 4813 this->amr->deviatoricerror_threshold = deviatoricerror_threshold; 4814 if(my_rank==0){ 4815 this->amr->CreateInitialMesh(numberofvertices,numberofelements,x,y,elements); 4816 } 4817 4818 /*Free the vectors*/ 4819 xDelete<IssmDouble>(x); 4820 xDelete<IssmDouble>(y); 4821 xDelete<IssmDouble>(z); 4822 xDelete<int>(elements); 4823 } 4824 /*}}}*/ 4825 void FemModel::GetPointsFromElementLabel(IssmDouble* element_label,int* pnumberofpoints,IssmDouble** pxylist){/*{{{*/ 4826 4827 if(!element_label) _error_("element_label is NULL!\n"); 4828 4829 /*Outputs*/ 4830 int numberofpoints = -1; 4831 IssmDouble* xylist = NULL; 4832 4833 /*Intermediaries*/ 4834 int numberofelements = this->elements->NumberOfElements(); 4835 int count = -1; 4836 IssmDouble* xc = NULL; 4837 IssmDouble* yc = NULL; 4838 4839 /*First, find the number of labeled elements (points)*/ 4840 count=0; 4841 for(int i=0;i<numberofelements;i++){ 4842 if(element_label[i]>DBL_EPSILON) count++; 4843 } 4844 4845 /*Set number of points*/ 4846 numberofpoints=count; 4847 if(count>0) xylist=xNew<IssmDouble>(2*numberofpoints); 4848 4849 /*Get element center coordinates*/ 4850 this->GetElementCenterCoordinates(&xc,&yc); 4851 4852 /*Now, fill xylist data*/ 4853 count=0; 4854 for(int i=0;i<numberofelements;i++){ 4855 if(element_label[i]>DBL_EPSILON){ 4856 xylist[2*count] = xc[i]; 4857 xylist[2*count+1] = yc[i]; 4858 count++; 4859 } 4860 } 4861 4862 /*Assign pointers*/ 4863 (*pxylist)=xylist; 4864 *pnumberofpoints=numberofpoints; 4865 4866 /*Cleanup*/ 4867 xDelete<IssmDouble>(xc); 4868 xDelete<IssmDouble>(yc); 4869 } 4870 /*}}}*/ 4871 void FemModel::GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type){/*{{{*/ 4872 4873 /*Here, "zero level set" means grounding line or ice front, depending on the level set type*/ 4874 /*element_label is 1 if the element zero level set, NAN otherwise*/ 4875 if(levelset_type!=MaskGroundediceLevelsetEnum && levelset_type!=MaskIceLevelsetEnum) _error_("level set type not implemented yet!"); 4876 if(!element_label) _error_("element_label is NULL!\n"); 4877 4878 /*Intermediaries*/ 4588 4879 int elementswidth = this->GetElementsWidth(); 4589 int numberofvertices = this->vertices->NumberOfVertices();4590 4880 int numberofelements = this->elements->NumberOfElements(); 4591 4881 int* elem_vertices = xNew<int>(elementswidth); 4592 4882 IssmDouble* levelset = xNew<IssmDouble>(elementswidth); 4593 IssmDouble* xp = NULL; 4594 IssmDouble* yp = NULL; 4595 IssmDouble* x = NULL; 4596 IssmDouble* y = NULL; 4597 IssmDouble* z = NULL; 4598 Vector<IssmDouble>* vx_zerolevelset = new Vector<IssmDouble>(numberofelements); 4599 Vector<IssmDouble>* vy_zerolevelset = new Vector<IssmDouble>(numberofelements); 4600 IssmDouble* x_zerolevelset = NULL; 4601 IssmDouble* y_zerolevelset = NULL; 4602 int count,sid,npoints; 4603 IssmDouble xcenter,ycenter,distance; 4604 4605 /*Get vertices coordinates*/ 4606 VertexCoordinatesx(&x,&y,&z,this->vertices,false) ; 4607 4883 Vector<IssmDouble>* velement_label = new Vector<IssmDouble>(numberofelements); 4884 IssmDouble* element_label_serial = NULL; 4885 int sid = -1; 4886 IssmDouble label = -1.; 4887 4608 4888 /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/ 4609 4889 for(int i=0;i<this->elements->Size();i++){ … … 4611 4891 element->GetInputListOnVertices(levelset,levelset_type); 4612 4892 element->GetVerticesSidList(elem_vertices); 4613 sid = element->Sid(); 4614 xcenter = NAN; 4615 ycenter = NAN; 4893 sid = element->Sid(); 4894 label = NAN; 4616 4895 Tria* tria = xDynamicCast<Tria*>(element); 4617 4896 if(tria->IsIceInElement()){/*verify if there is ice in the element*/ 4618 4897 if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 4619 4898 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) { 4620 xcenter=(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.; 4621 ycenter=(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.; 4899 label=1.; 4622 4900 } 4623 4901 } 4624 vx_zerolevelset->SetValue(sid,xcenter,INS_VAL); 4625 vy_zerolevelset->SetValue(sid,ycenter,INS_VAL); 4626 } 4627 /*Assemble and serialize*/ 4628 vx_zerolevelset->Assemble(); 4629 vy_zerolevelset->Assemble(); 4630 x_zerolevelset=vx_zerolevelset->ToMPISerial(); 4631 y_zerolevelset=vy_zerolevelset->ToMPISerial(); 4632 4633 /*keep just the element center coordinates with zero level set (compact the structure to save time in the next step)*/ 4634 count = 0; 4635 xp = xNewZeroInit<IssmDouble>(numberofelements); 4636 yp = xNewZeroInit<IssmDouble>(numberofelements); 4902 velement_label->SetValue(sid,label,INS_VAL); 4903 } 4904 4905 /*Assemble and serialize*/ 4906 velement_label->Assemble(); 4907 element_label_serial=velement_label->ToMPISerial(); 4908 4909 /*Merge with the output*/ 4910 for(int i=0;i<numberofelements;i++){ 4911 if(!xIsNan<IssmDouble>(element_label_serial[i])) element_label[i]=element_label_serial[i]; 4912 else; //do nothing 4913 } 4914 4915 /*Cleanup*/ 4916 xDelete<int>(elem_vertices); 4917 xDelete<IssmDouble>(levelset); 4918 xDelete<IssmDouble>(element_label_serial); 4919 delete velement_label; 4920 } 4921 /*}}}*/ 4922 void FemModel::GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type){/*{{{*/ 4923 4924 /*element_label is 1 if the element zero level set, NAN otherwise*/ 4925 if(!element_label) _error_("element_label is NULL!\n"); 4926 4927 /*Intermediaries*/ 4928 int numberofelements = this->elements->NumberOfElements(); 4929 IssmDouble* elementerror = NULL; 4930 IssmDouble threshold = -1.; 4931 IssmDouble maxerror = -1.; 4932 4933 switch(estimator_type){ 4934 case ThicknessErrorEstimatorEnum: 4935 threshold=this->amr->thicknesserror_threshold; 4936 this->ThicknessZZErrorEstimator(&elementerror); 4937 break; 4938 case DeviatoricStressErrorEstimatorEnum: 4939 threshold=this->amr->deviatoricerror_threshold; 4940 this->ZZErrorEstimator(&elementerror); 4941 break; 4942 default: _error_("not implemented yet"); 4943 } 4944 4945 /*Find the max of the estimators*/ 4946 maxerror=elementerror[0]; 4947 for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,elementerror[i]); 4948 4949 /*Merge with the output*/ 4950 for(int i=0;i<numberofelements;i++){ 4951 if(elementerror[i]>threshold*maxerror) element_label[i]=1.; 4952 else; //do nothing 4953 } 4954 4955 /*Cleanup*/ 4956 xDelete<IssmDouble>(elementerror); 4957 } 4958 /*}}}*/ 4959 void FemModel::GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type){/*{{{*/ 4960 4961 /*Here, "zero level set" means grounding line or ice front, depending on the level set type*/ 4962 /*pverticedistance is the minimal vertice distance to the grounding line or ice front*/ 4963 if(levelset_type!=MaskGroundediceLevelsetEnum && levelset_type!=MaskIceLevelsetEnum){ 4964 _error_("level set type not implemented yet!"); 4965 } 4966 4967 /*Output*/ 4968 IssmDouble* elementdistance; 4969 4970 /*Intermediaries*/ 4971 int numberofelements = this->elements->NumberOfElements(); 4972 IssmDouble* levelset_points= NULL; 4973 IssmDouble* xc = NULL; 4974 IssmDouble* yc = NULL; 4975 int numberofpoints; 4976 IssmDouble distance; 4977 4978 /*Get element center coordinates*/ 4979 this->GetElementCenterCoordinates(&xc,&yc); 4980 4981 /*Get points which level set is zero (center of elements with zero level set)*/ 4982 this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type); 4983 4984 /*Find the minimal element distance to the zero levelset (grounding line or ice front)*/ 4985 elementdistance=xNew<IssmDouble>(numberofelements); 4637 4986 for(int i=0;i<numberofelements;i++){ 4638 if(!xIsNan<IssmDouble>(x_zerolevelset[i])){ 4639 xp[count]=x_zerolevelset[i]; 4640 yp[count]=y_zerolevelset[i]; 4641 count++; 4642 } 4643 } 4644 npoints=count; 4645 4646 /*Find the minimal vertice distance to the zero levelset (grounding line or ice front)*/ 4647 verticedistance=xNew<IssmDouble>(numberofvertices); 4648 for(int i=0;i<numberofvertices;i++){ 4649 verticedistance[i]=INFINITY; 4650 for(int j=0;j<npoints;j++){ 4651 distance=sqrt((x[i]-xp[j])*(x[i]-xp[j])+(y[i]-yp[j])*(y[i]-yp[j])); 4652 verticedistance[i]=min(distance,verticedistance[i]); 4987 elementdistance[i]=INFINITY; 4988 for(int j=0;j<numberofpoints;j++){ 4989 distance=sqrt((xc[i]-levelset_points[2*j])*(xc[i]-levelset_points[2*j])+(yc[i]-levelset_points[2*j+1])*(yc[i]-levelset_points[2*j+1])); 4990 elementdistance[i]=min(distance,elementdistance[i]); 4653 4991 } 4654 4992 } 4655 4993 4656 4994 /*Assign the pointer*/ 4657 (*p verticedistance)=verticedistance;4995 (*pelementdistance)=elementdistance; 4658 4996 4659 4997 /*Cleanup*/ 4660 xDelete<int>(elem_vertices); 4661 xDelete<IssmDouble>(levelset); 4662 xDelete<IssmDouble>(x_zerolevelset); 4663 xDelete<IssmDouble>(y_zerolevelset); 4664 xDelete<IssmDouble>(xp); 4665 xDelete<IssmDouble>(yp); 4666 xDelete<IssmDouble>(x); 4667 xDelete<IssmDouble>(y); 4668 xDelete<IssmDouble>(z); 4669 delete vx_zerolevelset; 4670 delete vy_zerolevelset; 4671 } 4672 /*}}}*/ 4673 #endif 4674 4675 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_ADOLC_) 4676 void FemModel::ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist){/*{{{*/ 4677 4678 /*pnewelementslist keep vertices in Matlab indexing*/ 4679 int my_rank = IssmComm::GetRank(); 4680 bool amr_verbose = true; //itapopo 4681 IssmDouble* x = NULL; 4682 IssmDouble* y = NULL; 4683 IssmDouble* z = NULL; 4684 int* elementslist = NULL; 4685 int oldnumberofelements = this->elements->NumberOfElements(); 4686 int newnumberofvertices = -1; 4687 int newnumberofelements = -1; 4688 IssmDouble* partiallyfloatedelements= NULL;//itapopo verify if it will be used 4689 IssmDouble* masklevelset = NULL; 4690 IssmDouble* deviatorictensorerror = NULL; 4691 IssmDouble* thicknesserror = NULL; 4692 4693 /*Get the elements in which grounding line goes through*/ 4694 //itapopo verificar se irá usar esse this->GetPartiallyFloatedElements(&partiallyfloatedelements); 4695 /*Get mean mask level set over each element*/ 4696 this->MeanGroundedIceLevelSet(&masklevelset); 4697 /*Get the deviatoric error estimator*/ 4698 this->ZZErrorEstimator(&deviatorictensorerror); 4699 /*Get the thickness error estimator*/ 4700 this->ThicknessZZErrorEstimator(&thicknesserror); 4701 4702 if(my_rank==0){ 4703 this->amr->Execute(amr_verbose,oldnumberofelements,partiallyfloatedelements,masklevelset,deviatorictensorerror,thicknesserror, 4704 newnumberofvertices,newnumberofelements,&x,&y,&elementslist); 4705 z=xNewZeroInit<IssmDouble>(newnumberofvertices); 4706 if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz."); 4707 } 4708 else{ 4709 x=xNew<IssmDouble>(newnumberofvertices); 4710 y=xNew<IssmDouble>(newnumberofvertices); 4711 z=xNew<IssmDouble>(newnumberofvertices); 4712 elementslist=xNew<int>(newnumberofelements*this->GetElementsWidth()); 4713 } 4714 4715 /*Send new mesh to others CPU*/ 4716 ISSM_MPI_Bcast(&newnumberofvertices,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 4717 ISSM_MPI_Bcast(&newnumberofelements,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 4718 ISSM_MPI_Bcast(x,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4719 ISSM_MPI_Bcast(y,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4720 ISSM_MPI_Bcast(z,newnumberofvertices,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4721 ISSM_MPI_Bcast(elementslist,newnumberofelements*this->GetElementsWidth(),ISSM_MPI_INT,0,IssmComm::GetComm()); 4722 4723 /*Assign the pointers*/ 4724 (*pnewelementslist) = elementslist; //Matlab indexing 4725 (*pnewx) = x; 4726 (*pnewy) = y; 4727 (*pnewz) = z; 4728 *pnewnumberofvertices= newnumberofvertices; 4729 *pnewnumberofelements= newnumberofelements; 4730 4731 /*Cleanup*/ 4732 xDelete<IssmDouble>(masklevelset); 4733 xDelete<IssmDouble>(deviatorictensorerror); 4734 xDelete<IssmDouble>(thicknesserror); 4735 } 4736 /*}}}*/ 4737 void FemModel::InitializeAdaptiveRefinementNeopz(void){/*{{{*/ 4738 4739 /*Define variables*/ 4740 int my_rank = IssmComm::GetRank(); 4741 int numberofvertices = this->vertices->NumberOfVertices(); 4742 int numberofelements = this->elements->NumberOfElements(); 4743 IssmDouble* x = NULL; 4744 IssmDouble* y = NULL; 4745 IssmDouble* z = NULL; 4746 int* elements = NULL; 4747 int elementswidth = this->GetElementsWidth(); //just tria elements in this version. Itapopo: 4748 int levelmax = 0; 4749 IssmDouble regionlevel1 = 0.; 4750 IssmDouble regionlevelmax = 0.; 4751 4752 /*Initialize field as NULL for now*/ 4753 this->amr = NULL; 4754 4755 /*Get vertices coordinates of the coarse mesh (father mesh)*/ 4756 /*elements comes in Matlab indexing*/ 4757 this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elements); 4758 4759 /*Get amr parameters*/ 4760 this->parameters->FindParam(&levelmax,AmrLevelMaxEnum); 4761 this->parameters->FindParam(®ionlevel1,AmrRegionLevel1Enum); 4762 this->parameters->FindParam(®ionlevelmax,AmrRegionLevelMaxEnum); 4763 4764 /*Create initial mesh (coarse mesh) in neopz data structure*/ 4765 /*Just CPU #0 should keep AMR object*/ 4766 /*Initialize refinement pattern*/ 4767 this->SetRefPatterns(); 4768 if(my_rank==0){ 4769 this->amr = new AdaptiveMeshRefinement(); 4770 this->amr->CreateInitialMesh(numberofvertices,numberofelements,elementswidth,x,y,elements); 4771 this->amr->SetLevelMax(levelmax); //Set max level of refinement 4772 this->amr->SetRegions(regionlevel1,regionlevelmax); 4773 } 4774 4775 /*Free the vectors*/ 4776 xDelete<IssmDouble>(x); 4777 xDelete<IssmDouble>(y); 4778 xDelete<IssmDouble>(z); 4779 xDelete<int>(elements); 4998 xDelete<IssmDouble>(levelset_points); 4999 xDelete<IssmDouble>(xc); 5000 xDelete<IssmDouble>(yc); 4780 5001 } 4781 5002 /*}}}*/ -
issm/trunk-jpl/src/c/classes/FemModel.h
r21919 r22100 178 178 void MeanGroundedIceLevelSet(IssmDouble** pmasklevelset); 179 179 void GetElementCenterCoordinates(IssmDouble** pxc,IssmDouble** pyc); 180 void GetZeroLevelSetPoints(IssmDouble** pzerolevelset_points,int &numberofpoints,int levelset_type); 180 181 #endif 181 182 … … 191 192 void ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist); 192 193 void InitializeAdaptiveRefinementNeopz(void); 194 void GetPointsFromElementLabel(IssmDouble* element_label,int* numberofpoints,IssmDouble** xylist); 195 void GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type); 196 void GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type); 197 void GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type); 193 198 void SetRefPatterns(void); 194 199 #endif -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r22004 r22100 128 128 case AmrNeopzEnum: 129 129 parameters->AddObject(iomodel->CopyConstantObject("md.amr.level_max",AmrLevelMaxEnum)); 130 parameters->AddObject(iomodel->CopyConstantObject("md.amr.region_level_1",AmrRegionLevel1Enum)); 131 parameters->AddObject(iomodel->CopyConstantObject("md.amr.region_level_max",AmrRegionLevelMaxEnum)); 130 parameters->AddObject(iomodel->CopyConstantObject("md.amr.radius_level_max",AmrRadiusLevelMaxEnum)); 131 parameters->AddObject(iomodel->CopyConstantObject("md.amr.gradation",AmrGradationEnum)); 132 parameters->AddObject(iomodel->CopyConstantObject("md.amr.lag",AmrLagEnum)); 133 parameters->AddObject(iomodel->CopyConstantObject("md.amr.groundingline_distance",AmrGroundingLineDistanceEnum)); 134 parameters->AddObject(iomodel->CopyConstantObject("md.amr.icefront_distance",AmrIceFrontDistanceEnum)); 135 parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_threshold",AmrThicknessErrorThresholdEnum)); 136 parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_threshold",AmrDeviatoricErrorThresholdEnum)); 132 137 break; 133 138 #endif -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r22075 r22100 861 861 AmrNeopzEnum, 862 862 AmrLevelMaxEnum, 863 Amr RegionLevel1Enum,864 AmrR egionLevelMaxEnum,863 AmrLagEnum, 864 AmrRadiusLevelMaxEnum, 865 865 AmrBamgEnum, 866 866 AmrHminEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r22075 r22100 834 834 case AmrNeopzEnum : return "AmrNeopz"; 835 835 case AmrLevelMaxEnum : return "AmrLevelMax"; 836 case Amr RegionLevel1Enum : return "AmrRegionLevel1";837 case AmrR egionLevelMaxEnum : return "AmrRegionLevelMax";836 case AmrLagEnum : return "AmrLag"; 837 case AmrRadiusLevelMaxEnum : return "AmrRadiusLevelMax"; 838 838 case AmrBamgEnum : return "AmrBamg"; 839 839 case AmrHminEnum : return "AmrHmin"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r22075 r22100 852 852 else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum; 853 853 else if (strcmp(name,"AmrLevelMax")==0) return AmrLevelMaxEnum; 854 else if (strcmp(name,"Amr RegionLevel1")==0) return AmrRegionLevel1Enum;855 else if (strcmp(name,"AmrR egionLevelMax")==0) return AmrRegionLevelMaxEnum;854 else if (strcmp(name,"AmrLag")==0) return AmrLagEnum; 855 else if (strcmp(name,"AmrRadiusLevelMax")==0) return AmrRadiusLevelMaxEnum; 856 856 else if (strcmp(name,"AmrBamg")==0) return AmrBamgEnum; 857 857 else if (strcmp(name,"AmrHmin")==0) return AmrHminEnum; -
issm/trunk-jpl/src/m/classes/amr.js
r21674 r22100 7 7 //methods 8 8 this.setdefaultparameters = function(){// {{{ 9 //level_max: 2 to 4 10 this.level_max=2; 11 12 //region_level_1: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined once (h=1). 13 this.region_level_1=20000.; 14 15 //region_level_max: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined with max level of refinement (h=level_max). 16 this.region_level_max=15000.; 9 this.hmin = 100.; 10 this.hmax = 100.e3; 11 this.fieldname = "Vel"; 12 this.err = 3.; 13 this.keepmetric = 1; 14 this.gradation = 1.5; 15 this.groundingline_resolution = 500.; 16 this.groundingline_distance = 0; 17 this.icefront_resolution = 500; 18 this.icefront_distance = 0; 19 this.thicknesserror_resolution = 500; 20 this.thicknesserror_threshold = 0; 21 this.deviatoricerror_resolution = 500; 22 this.deviatoricerror_threshold = 0; 17 23 }// }}} 18 24 this.disp= function(){// {{{ 19 20 25 console.log(sprintf(' amr parameters:')); 21 fielddisplay(this,'level_max','maximum refinement level (1, 2, 3 or 4)'); 22 fielddisplay(this,'region_level_1','region which will be refined once (level 1) [ m ]'); 23 fielddisplay(this,'region_level_max','region which will be refined with level_max [ m ]'); 24 26 fielddisplay(this,'hmin','minimum element length'); 27 fielddisplay(this,'hmax','maximum element length'); 28 fielddisplay(this,'fieldname','name of input that will be used to compute the metric (should be an input of FemModel)'); 29 fielddisplay(this,'keepmetric','indicates whether the metric should be kept every remeshing time'); 30 fielddisplay(this,'gradation','maximum ratio between two adjacent edges'); 31 fielddisplay(this,'groundingline_resolution','element length near the grounding line'); 32 fielddisplay(this,'groundingline_distance','distance around the grounding line which elements will be refined'); 33 fielddisplay(this,'icefront_resolution','element length near the ice front'); 34 fielddisplay(this,'icefront_distance','distance around the ice front which elements will be refined'); 35 fielddisplay(this,'thicknesserror_resolution','element length when thickness error estimator is used'); 36 fielddisplay(this,'thicknesserror_threshold','maximum threshold thickness error permitted'); 37 fielddisplay(this,'deviatoricerror_resolution','element length when deviatoric stress error estimator is used'); 38 fielddisplay(this,'deviatoricerror_threshold','maximum threshold deviatoricstress error permitted'); 25 39 }// }}} 26 40 this.classname= function(){// {{{ … … 29 43 }// }}} 30 44 this.checkconsistency = function(md,solution,analyses) { //{{{ 31 32 checkfield(md,'fieldname','amr.level_max','numel',[1],'>=',0,'<=',4); 33 checkfield(md,'fieldname','amr.region_level_1','numel',[1],'>',0,'NaN',1,'Inf',1); 34 checkfield(md,'fieldname','amr.region_level_max','numel',[1],'>',0,'NaN',1,'Inf',1); 35 if (this.region_level_1-this.region_level_max<0.2*this.region_level_1){ 36 md.checkmessage('region_level_max should be lower than 80% of region_level_1'); 37 } 45 checkfield(md,'fieldname','amr.hmax','numel',[1],'>',0,'NaN',1); 46 checkfield(md,'fieldname','amr.hmin','numel',[1],'>',0,'<',this.hmax,'NaN',1); 47 checkfield(md,'fieldname','amr.keepmetric','numel',[1],'>=',0,'<=',1,'NaN',1); 48 checkfield(md,'fieldname','amr.gradation','numel',[1],'>=',1.1,'<=',5,'NaN',1); 49 checkfield(md,'fieldname','amr.groundingline_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 50 checkfield(md,'fieldname','amr.groundingline_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 51 checkfield(md,'fieldname','amr.icefront_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 52 checkfield(md,'fieldname','amr.icefront_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 53 checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 54 checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 55 checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1); 56 checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 38 57 } // }}} 39 58 this.marshall=function(md,prefix,fid) { //{{{ 40 41 WriteData(fid,prefix,'object',this,'fieldname','level_max','format','Integer'); 42 WriteData(fid,prefix,'object',this,'fieldname','region_level_1','format','Double'); 43 WriteData(fid,prefix,'object',this,'fieldname','region_level_max','format','Double'); 44 59 WriteData(fid,prefix,'name','md.amr.type','data',1,'format','Integer'); 60 WriteData(fid,prefix,'object',this,'fieldname','hmin','format','Double'); 61 WriteData(fid,prefix,'object',this,'fieldname','hmax','format','Double'); 62 WriteData(fid,prefix,'object',this,'fieldname','fieldname','format','String'); 63 WriteData(fid,prefix,'object',this,'fieldname','err','format','Double'); 64 WriteData(fid,prefix,'object',this,'fieldname','keepmetric','format','Integer'); 65 WriteData(fid,prefix,'object',this,'fieldname','gradation','format','Double'); 66 WriteData(fid,prefix,'object',this,'fieldname','groundingline_resolution','format','Double'); 67 WriteData(fid,prefix,'object',this,'fieldname','groundingline_distance','format','Double'); 68 WriteData(fid,prefix,'object',this,'fieldname','icefront_resolution','format','Double'); 69 WriteData(fid,prefix,'object',this,'fieldname','icefront_distance','format','Double'); 70 WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_resolution','format','Double'); 71 WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_threshold','format','Double'); 72 WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_resolution','format','Double'); 73 WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_threshold','format','Double'); 45 74 }//}}} 46 75 this.fix=function() { //{{{ … … 48 77 //properties 49 78 // {{{ 50 this.level_max = 0; 51 this.region_level_1 = 0.; 52 this.region_level_max = 0.; 79 this.hmin = 0.; 80 this.hmax = 0.; 81 this.fieldname = ""; 82 this.err = 0.; 83 this.keepmetric = 0; 84 this.gradation = 0.; 85 this.groundingline_resolution = 0.; 86 this.groundingline_distance = 0.; 87 this.icefront_resolution = 0.; 88 this.icefront_distance = 0.; 89 this.thicknesserror_resolution = 0.; 90 this.thicknesserror_threshold = 0.; 91 this.deviatoricerror_resolution = 0.; 92 this.deviatoricerror_threshold = 0.; 53 93 54 94 this.setdefaultparameters(); -
issm/trunk-jpl/src/m/classes/amr.m
r21802 r22100 2 2 % 3 3 % Usage: 4 % amr=amr();4 % md.amr=amr(); 5 5 6 6 classdef amr 7 7 properties (SetAccess=public) 8 level_max = 0; 9 region_level_1 = 0; 10 region_level_max = 0; 8 hmin = 0.; 9 hmax = 0.; 10 fieldname = ''; 11 err = 0.; 12 keepmetric = 0; 13 gradation = 0.; 14 groundingline_resolution = 0.; 15 groundingline_distance = 0.; 16 icefront_resolution = 0.; 17 icefront_distance = 0.; 18 thicknesserror_resolution = 0.; 19 thicknesserror_threshold = 0.; 20 deviatoricerror_resolution = 0.; 21 deviatoricerror_threshold = 0.; 22 end 23 methods (Static) 24 function self = loadobj(self) % {{{ 25 % This function is directly called by matlab when a model object is 26 % loaded. Update old properties here 27 28 if verLessThan('matlab','7.9'), 29 disp('Warning: your matlab version is old and there is a risk that load does not work correctly'); 30 disp(' if the model is not loaded correctly, rename temporarily loadobj so that matlab does not use it'); 31 32 % This is a Matlab bug: all the fields of md have their default value 33 % Example of error message: 34 % Warning: Error loading an object of class 'model': 35 % Undefined function or method 'exist' for input arguments of type 'cell' 36 % 37 % This has been fixed in MATLAB 7.9 (R2009b) and later versions 38 end 39 40 %2017 September 15th 41 if isstruct(self), 42 disp('WARNING: updating amr. Now the default is amr with bamg'); 43 disp(' some old fields were not converted'); 44 disp(' see the new fields typing md.amr and modify them properly'); 45 obj2 = self; 46 self = amr(); 47 %Converting region_level_max to groundingline_distance 48 if(obj2.region_level_max>0 && obj2.region_level_1>obj2.region_level_max) 49 self.groundingline_distance = obj2.region_level_max; 50 self.keepmetric = 0; 51 self.fieldname = 'None'; 52 end 53 end 54 end% }}} 11 55 end 12 56 methods … … 21 65 function self = setdefaultparameters(self) % {{{ 22 66 23 %level_max: 2 to 4 24 self.level_max=2; 67 %hmin and hmax 68 self.hmin=100.; 69 self.hmax=100.e3; 25 70 26 %region_level_1: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined once (h=1). 27 self.region_level_1=20000.; 28 29 %region_level_max: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined with max level of refinement (h=level_max). 30 self.region_level_max=15000.; 71 %fields 72 self.fieldname ='Vel'; 73 self.err=3.; 74 75 %keep metric? 76 self.keepmetric=1; 77 78 %control of element lengths 79 self.gradation=1.5; 80 81 %other criterias 82 self.groundingline_resolution=500.; 83 self.groundingline_distance=0.; 84 self.icefront_resolution=500.; 85 self.icefront_distance=0.; 86 self.thicknesserror_resolution=500.; 87 self.thicknesserror_threshold=0.; 88 self.deviatoricerror_resolution=500.; 89 self.deviatoricerror_threshold=0.; 31 90 32 91 end % }}} 33 92 function md = checkconsistency(self,md,solution,analyses) % {{{ 34 93 35 md = checkfield(md,'fieldname','amr.level_max','numel',[1],'>=',0,'<=',4); 36 md = checkfield(md,'fieldname','amr.region_level_1','numel',[1],'>',0,'NaN',1,'Inf',1); 37 md = checkfield(md,'fieldname','amr.region_level_max','numel',[1],'>',0,'NaN',1,'Inf',1); 38 if self.region_level_1-self.region_level_max<0.2*self.region_level_1, %it was adopted 20% of the region_level_1 39 md = checkmessage(md,'region_level_max should be lower than 80% of region_level_1'); 40 end 94 md = checkfield(md,'fieldname','amr.hmax','numel',[1],'>',0,'NaN',1); 95 md = checkfield(md,'fieldname','amr.hmin','numel',[1],'>',0,'<',self.hmax,'NaN',1); 96 %md = checkfield(md,'fieldname','amr.fieldname','string',[1]); 97 md = checkfield(md,'fieldname','amr.keepmetric','numel',[1],'>=',0,'<=',1,'NaN',1); 98 md = checkfield(md,'fieldname','amr.gradation','numel',[1],'>=',1.1,'<=',5,'NaN',1); 99 md = checkfield(md,'fieldname','amr.groundingline_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 100 md = checkfield(md,'fieldname','amr.groundingline_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 101 md = checkfield(md,'fieldname','amr.icefront_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 102 md = checkfield(md,'fieldname','amr.icefront_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 103 md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 104 md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 105 md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 106 md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 41 107 end % }}} 42 108 function disp(self) % {{{ 43 109 disp(sprintf(' amr parameters:')); 44 110 45 fielddisplay(self,'level_max',['maximum refinement level (1, 2, 3 or 4)']); 46 fielddisplay(self,'region_level_1',['region which will be refined once (level 1) [ m ]']); 47 fielddisplay(self,'region_level_max',['region which will be refined with level_max [ m ]']); 111 fielddisplay(self,'hmin',['minimum element length']); 112 fielddisplay(self,'hmax',['maximum element length']); 113 fielddisplay(self,'fieldname',['name of input that will be used to compute the metric (should be an input of FemModel)']); 114 fielddisplay(self,'keepmetric',['indicates whether the metric should be kept every remeshing time']); 115 fielddisplay(self,'gradation',['maximum ratio between two adjacent edges']); 116 fielddisplay(self,'groundingline_resolution',['element length near the grounding line']); 117 fielddisplay(self,'groundingline_distance',['distance around the grounding line which elements will be refined']); 118 fielddisplay(self,'icefront_resolution',['element length near the ice front']); 119 fielddisplay(self,'icefront_distance',['distance around the ice front which elements will be refined']); 120 fielddisplay(self,'thicknesserror_resolution',['element length when thickness error estimator is used']); 121 fielddisplay(self,'thicknesserror_threshold',['maximum threshold thickness error permitted']); 122 fielddisplay(self,'deviatoricerror_resolution',['element length when deviatoric stress error estimator is used']); 123 fielddisplay(self,'deviatoricerror_threshold',['maximum threshold deviatoricstress error permitted']); 48 124 49 125 end % }}} 50 126 function marshall(self,prefix,md,fid) % {{{ 51 127 52 WriteData(fid,prefix,'name','md.amr.type','data',2,'format','Integer'); 53 WriteData(fid,prefix,'object',self,'fieldname','level_max','format','Integer'); 54 WriteData(fid,prefix,'object',self,'fieldname','region_level_1','format','Double'); 55 WriteData(fid,prefix,'object',self,'fieldname','region_level_max','format','Double'); 56 end % }}} 57 function savemodeljs(self,fid,modelname) % {{{ 58 59 writejsdouble(fid,[modelname '.amr.level_max'],self.level_max); 60 writejsdouble(fid,[modelname '.amr.region_level_1'],self.region_level_1); 61 writejsdouble(fid,[modelname '.amr.region_level_max'],self.region_level_max); 128 WriteData(fid,prefix,'name','md.amr.type','data',1,'format','Integer'); 129 WriteData(fid,prefix,'object',self,'class','amr','fieldname','hmin','format','Double'); 130 WriteData(fid,prefix,'object',self,'class','amr','fieldname','hmax','format','Double'); 131 WriteData(fid,prefix,'object',self,'class','amr','fieldname','fieldname','format','String'); 132 WriteData(fid,prefix,'object',self,'class','amr','fieldname','err','format','Double'); 133 WriteData(fid,prefix,'object',self,'class','amr','fieldname','keepmetric','format','Integer'); 134 WriteData(fid,prefix,'object',self,'class','amr','fieldname','gradation','format','Double'); 135 WriteData(fid,prefix,'object',self,'class','amr','fieldname','groundingline_resolution','format','Double'); 136 WriteData(fid,prefix,'object',self,'class','amr','fieldname','groundingline_distance','format','Double'); 137 WriteData(fid,prefix,'object',self,'class','amr','fieldname','icefront_resolution','format','Double'); 138 WriteData(fid,prefix,'object',self,'class','amr','fieldname','icefront_distance','format','Double'); 139 WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_resolution','format','Double'); 140 WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_threshold','format','Double'); 141 WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_resolution','format','Double'); 142 WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_threshold','format','Double'); 62 143 63 144 end % }}} -
issm/trunk-jpl/src/m/classes/amr.py
r21676 r22100 12 12 13 13 def __init__(self): # {{{ 14 self.level_max = 0. 15 self.region_level_1 = 0. 16 self.region_level_max = 0. 17 14 self.hmin = 0. 15 self.hmax = 0. 16 self.fieldname ='' 17 self.err = 0. 18 self.keepmetric = 0. 19 self.gradation = 0. 20 self.groundingline_resolution = 0. 21 self.groundingline_distance = 0. 22 self.icefront_resolution = 0. 23 self.icefront_distance = 0. 24 self.thicknesserror_resolution = 0. 25 self.thicknesserror_threshold = 0. 26 self.deviatoricerror_resolution= 0. 27 self.deviatoricerror_threshold = 0. 18 28 #set defaults 19 29 self.setdefaultparameters() … … 21 31 def __repr__(self): # {{{ 22 32 string=" amr parameters:" 23 string="%s\n%s"%(string,fielddisplay(self,"level_max","maximum refinement level (1, 2, 3 or 4)")) 24 string="%s\n%s"%(string,fielddisplay(self,"region_level_1","region which will be refined once (level 1) [ m ]")) 25 string="%s\n%s"%(string,fielddisplay(self,"region_level_max","region which will be refined with level_max [ m ]")) 33 string="%s\n%s"%(string,fielddisplay(self,"hmin","minimum element length")) 34 string="%s\n%s"%(string,fielddisplay(self,"hmax","maximum element length")) 35 string="%s\n%s"%(string,fielddisplay(self,"fieldname","name of input that will be used to compute the metric (should be an input of FemModel)")) 36 string="%s\n%s"%(string,fielddisplay(self,"keepmetric","indicates whether the metric should be kept every remeshing time")) 37 string="%s\n%s"%(string,fielddisplay(self,"gradation","maximum ratio between two adjacent edges")) 38 string="%s\n%s"%(string,fielddisplay(self,"groundingline_resolution","element length near the grounding line")) 39 string="%s\n%s"%(string,fielddisplay(self,"groundingline_distance","distance around the grounding line which elements will be refined")) 40 string="%s\n%s"%(string,fielddisplay(self,"icefront_resolution","element length near the ice front")) 41 string="%s\n%s"%(string,fielddisplay(self,"icefront_distance","distance around the ice front which elements will be refined")) 42 string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_resolution","element length when thickness error estimator is used")) 43 string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_threshold","maximum threshold thickness error permitted")) 44 string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_resolution","element length when deviatoric stress error estimator is used")) 45 string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_threshold","maximum threshold deviatoricstress error permitted")) 26 46 return string 27 47 #}}} 28 48 def setdefaultparameters(self): # {{{ 29 30 #level_max: 2 to 4 31 self.level_max=2 32 33 #region_level_1: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined once (h=1). 34 self.region_level_1=20000. 35 36 #region_level_max: region around (m) the discontinuity (grounding line or ice front) where the mesh will be refined with max level of refinement (h=level_max). 37 self.region_level_max=15000. 38 49 self.hmin = 100. 50 self.hmax = 100.e3 51 self.fieldname = 'Vel' 52 self.err = 3. 53 self.keepmetric = 1 54 self.gradation = 1.5 55 self.groundingline_resolution = 500. 56 self.groundingline_distance = 0 57 self.icefront_resolution = 500. 58 self.icefront_distance = 0 59 self.thicknesserror_resolution = 500. 60 self.thicknesserror_threshold = 0 61 self.deviatoricerror_resolution= 500. 62 self.deviatoricerror_threshold = 0 39 63 return self 40 64 #}}} 41 65 def checkconsistency(self,md,solution,analyses): # {{{ 42 md = checkfield(md,'fieldname','amr.level_max','numel',[1],'>=',0,'<=',4) 43 md = checkfield(md,'fieldname','amr.region_level_1','numel',[1],'>',0,'NaN',1,'Inf',1) 44 md = checkfield(md,'fieldname','amr.region_level_max','numel',[1],'>',0,'NaN',1,'Inf',1) 45 #it was adopted 20% of the region_level_1 46 if self.region_level_1-self.region_level_max<0.2*self.region_level_1: 47 md.checkmessage("region_level_max should be lower than 80% of region_level_1") 48 66 md = checkfield(md,'fieldname','amr.hmax','numel',[1],'>',0,'NaN',1) 67 md = checkfield(md,'fieldname','amr.hmin','numel',[1],'>',0,'<',self.hmax,'NaN',1) 68 md = checkfield(md,'fieldname','amr.keepmetric','numel',[1],'>=',0,'<=',1,'NaN',1); 69 md = checkfield(md,'fieldname','amr.gradation','numel',[1],'>=',1.1,'<=',5,'NaN',1); 70 md = checkfield(md,'fieldname','amr.groundingline_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 71 md = checkfield(md,'fieldname','amr.groundingline_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 72 md = checkfield(md,'fieldname','amr.icefront_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 73 md = checkfield(md,'fieldname','amr.icefront_distance','numel',[1],'>=',0,'NaN',1,'Inf',1); 74 md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 75 md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 76 md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1); 77 md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1); 49 78 return md 50 79 # }}} 51 80 def marshall(self,prefix,md,fid): # {{{ 52 WriteData(fid,prefix,'object',self,'fieldname','level_max','format','Integer') 53 WriteData(fid,prefix,'object',self,'fieldname','region_level_1','format','Double') 54 WriteData(fid,prefix,'object',self,'fieldname','region_level_max','format','Double') 81 WriteData(fid,prefix,'name','md.amr.type','data',1,'format','Integer') 82 WriteData(fid,prefix,'object',self,'fieldname','hmin','format','Double'); 83 WriteData(fid,prefix,'object',self,'fieldname','hmax','format','Double'); 84 WriteData(fid,prefix,'object',self,'fieldname','fieldname','format','String'); 85 WriteData(fid,prefix,'object',self,'fieldname','err','format','Double'); 86 WriteData(fid,prefix,'object',self,'fieldname','keepmetric','format','Integer'); 87 WriteData(fid,prefix,'object',self,'fieldname','gradation','format','Double'); 88 WriteData(fid,prefix,'object',self,'fieldname','groundingline_resolution','format','Double'); 89 WriteData(fid,prefix,'object',self,'fieldname','groundingline_distance','format','Double'); 90 WriteData(fid,prefix,'object',self,'fieldname','icefront_resolution','format','Double'); 91 WriteData(fid,prefix,'object',self,'fieldname','icefront_distance','format','Double'); 92 WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_resolution','format','Double'); 93 WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_threshold','format','Double'); 94 WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_resolution','format','Double'); 95 WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_threshold','format','Double'); 55 96 # }}} -
issm/trunk-jpl/test/NightlyRun/test462.m
r21955 r22100 11 11 md.transient.isgroundingline=0; 12 12 %amr bamg settings, just field 13 md.amr=amrbamg();14 13 md.amr.hmin=10000; 15 14 md.amr.hmax=100000; -
issm/trunk-jpl/test/NightlyRun/test463.m
r21956 r22100 11 11 md.transient.isgroundingline=0; 12 12 %amr bamg settings, just grounding line 13 md.amr=amrbamg();14 13 md.amr.hmin=10000; 15 14 md.amr.hmax=100000; -
issm/trunk-jpl/test/NightlyRun/test464.m
r21955 r22100 11 11 md.transient.isgroundingline=0; 12 12 %amr bamg settings, just ice front 13 md.amr=amrbamg();14 13 md.amr.hmin=10000; 15 14 md.amr.hmax=100000; -
issm/trunk-jpl/test/NightlyRun/test465.m
r21956 r22100 11 11 md.transient.isgroundingline=0; 12 12 %amr bamg settings, field, grounding line and ice front 13 md.amr=amrbamg();14 13 md.amr.hmin=20000; 15 14 md.amr.hmax=100000;
Note:
See TracChangeset
for help on using the changeset viewer.