Changeset 22100


Ignore:
Timestamp:
09/18/17 08:36:42 (8 years ago)
Author:
tsantos
Message:

CHG: now, AMR with Bamg is the default; with NeoPZ is an option (amrneopz.m). CHG: updated (minor) test files 462, 463, 464 and 465. CHG: amr with NeoPZ merges fields (grounding line, ice front and error estimators)

Location:
issm/trunk-jpl
Files:
1 deleted
16 edited

Legend:

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

    r21919 r22100  
    2828        this->CleanUp();
    2929        /*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;
    3640        this->sid2index.clear();
    3741        this->sid2index.resize(cp.sid2index.size());
     
    5660        /*Verify and delete all data*/
    5761        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;
    6371        this->sid2index.clear();
    6472        this->index2sid.clear();
     
    6977
    7078        /*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;
    7989        this->sid2index.clear();
    8090        this->index2sid.clear();
     
    8494
    8595/*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*/
     96void AdaptiveMeshRefinement::ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
     97
     98        /*IMPORTANT! pelementslist are in Matlab indexing*/
    9599        /*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/*}}}*/
     117void 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);
    133128   
    134129        /*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);
    139131
    140132        /*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/*}}}*/
     136void AdaptiveMeshRefinement::RefinementProcess(bool &verbose,double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror){/*{{{*/
    146137   
    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");
    148139       
    149140        /*Intermediaries*/
    150141        TPZGeoMesh* nohangingnodesmesh=NULL;
    151 
    152         //itapopo
    153         this->step++;
    154142
    155143        double mean_mask                = 0;
     
    161149
    162150        /*Calculate mean values*/
     151        /*
    163152        for(int i=0;i<this->sid2index.size();i++){
    164153                mean_mask               += masklevelset[i];
     
    169158        mean_tauerror   /= this->sid2index.size();
    170159        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");
    173162        /*Deal with special elements*/
    174163        for(int i=0;i<this->specialelementsindex.size();i++){
    175164                if(this->specialelementsindex[i]==-1) continue;
    176165                /*Get special element and verify*/
    177                 TPZGeoEl* geoel=this->currentmesh->Element(this->specialelementsindex[i]);
     166                TPZGeoEl* geoel=this->previousmesh->Element(this->specialelementsindex[i]);
    178167                if(!geoel)_error_("special element (sid) "<<i<<" is null!\n");
    179168                if(geoel->HasSubElement())_error_("special element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n");
     
    213202                                /*Ok, the special element can be deleted*/
    214203                                siblings[j]->ResetSubElements();
    215                                 this->currentmesh->DeleteElement(siblings[j],siblings[j]->Index());
     204                                this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index());
    216205                        }
    217206                }
    218207               
    219208                /*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
    222210                        /*Father has uniform subelements now*/
    223211                        TPZVec<TPZGeoEl *> sons;
    224212                        father->Divide(sons);
    225                         this->smooth_frequency=this->step;
    226213                }else{
    227214                        specialfatherindex.push_back(father->Index());
     
    229216                if(this->specialelementsindex[i]!=-1) _error_("special element "<<i<<" was not deleted!\n");   
    230217        }
    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");
    234221        /*Deal with uniform elemnts*/
    235222        for(int i=0;i<this->sid2index.size();i++){
    236223                if(this->sid2index[i]==-1) continue;
    237224                /*Get element and verify*/
    238                 TPZGeoEl* geoel=this->currentmesh->Element(this->sid2index[i]);
     225                TPZGeoEl* geoel=this->previousmesh->Element(this->sid2index[i]);
    239226                if(geoel->HasSubElement()) _error_("element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n");
    240227                if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n");
     
    252239                        }
    253240                        TPZVec<TPZGeoEl *> sons;
    254                         if(geoel->Level()<this->levelmax && count==0) geoel->Divide(sons);
     241                        if(geoel->Level()<this->level_max && count==0) geoel->Divide(sons);
    255242                }
    256243                else if(geoel->Level()>0)
     
    274261                        if(group_Herror>0 && group_Herror<0*mean_Herror){ //itapopo
    275262                                /*Reset subelements in the father*/
    276                                 this->currentmesh->Element(geoel->Father()->Index())->ResetSubElements();
     263                                this->previousmesh->Element(geoel->Father()->Index())->ResetSubElements();
    277264                                /*Delete the elements and set their indexes in the index2sid and sid2index*/
    278265                                for (int j=0;j<siblings.size();j++){
     
    281268                                        this->index2sid[index]=-1;
    282269                                        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());
    284271                                }//for j
    285272                        }//if
    286273                }/*Unrefine process*/
    287274        }//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);
    292279       
    293280                //nohangingnodesmesh = this->CreateRefPatternMesh(newmesh); itapopo tentar otimizar
    294281
    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/*}}}*/
     285void 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/*}}}*/
     389void AdaptiveMeshRefinement::RefineMesh(TPZGeoMesh* gmesh,std::vector<int> &elements){/*{{{*/
    299390
    300391        /*Refine elements: uniform pattern refinement*/
     
    312403}
    313404/*}}}*/
    314 void AdaptiveMeshRefinement::RefineMeshToAvoidHangingNodes(TPZGeoMesh *gmesh){/*{{{*/
     405void AdaptiveMeshRefinement::RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh){/*{{{*/
    315406   
    316407        /*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/*}}}*/
     443void 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*/
    317458        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*/
    336460        gmesh->BuildConnectivity();
    337461}
    338462/*}}}*/
    339 void AdaptiveMeshRefinement::GetMesh(int &nvertices,int &nelements,double** px,double** py, int** pelements){/*{{{*/
     463void AdaptiveMeshRefinement::GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py, int** pelements){/*{{{*/
    340464
    341465        /* IMPORTANT! pelements are in Matlab indexing
     
    346470
    347471        /*Intermediaries */
    348         TPZGeoMesh* gmesh = this->currentmesh;//itapopo confirmar
    349        
    350472        long sid,nodeindex;
    351         int nconformelements,nconformvertices; 
     473        int nconformelements,nconformvertices;
     474        int ntotalvertices              = gmesh->NNodes();
    352475        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;
    355478        TPZGeoEl* geoel                 = NULL;
    356         long* vertex_index2sid  = xNew<long>(gmesh->NNodes());
     479        long* vertex_index2sid  = xNew<long>(ntotalvertices);
    357480        this->index2sid.clear(); this->index2sid.resize(gmesh->NElements());
    358481        this->sid2index.clear();
    359482       
    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 
    368483        /*Fill in the vertex_index2sid vector with non usual index value*/
    369484        for(int i=0;i<gmesh->NNodes();i++) vertex_index2sid[i]=-1;
     
    379494                if(geoel->HasSubElement()) continue;
    380495                if(geoel->MaterialId() != this->GetElemMaterialID()) continue;
    381                 this->sid2index.push_back(i);//keep the element index
    382                 this->index2sid[i]=this->sid2index.size()-1;//keep the element sid
    383                 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++){
    384499        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){
    386502                vertex_index2sid[nodeindex]=sid;
    387503                                sid++;
     
    392508        nconformelements        = (int)this->sid2index.size();
    393509        nconformvertices        = (int)sid;
    394         newelements                     = xNew<int>(nconformelements*this->elementswidth);
     510        newelements                     = xNew<int>(nconformelements*this->GetNumberOfNodes());
    395511        newmeshX                                = xNew<double>(nconformvertices);
    396512   newmeshY                             = xNew<double>(nconformvertices);
    397513
    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];
    406521        }
    407522               
    408523        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++) {
    410525                        geoel   = gmesh->ElementVec()[this->sid2index[i]];
    411526                        sid     = vertex_index2sid[geoel->NodeIndex(j)];
    412                         newelements[i*this->elementswidth+j]=(int)sid+1;//C to Matlab indexing
     527                        newelements[i*this->GetNumberOfNodes()+j]=(int)sid+1;//C to Matlab indexing
    413528                }
    414529                /*Verify the Jacobian determinant. If detJ<0, swap the 2 first postions:
     
    418533                int a,b,c;
    419534
    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;
    423538
    424539                xa=newmeshX[a]; ya=newmeshY[a];
     
    430545                /*verify and swap, if necessary*/
    431546                if(detJ<0) {
    432                         newelements[i*this->elementswidth+0]=b+1;//a->b
    433                         newelements[i*this->elementswidth+1]=a+1;//b->a
     547                        newelements[i*this->GetNumberOfNodes()+0]=b+1;//a->b
     548                        newelements[i*this->GetNumberOfNodes()+1]=a+1;//b->a
    434549                }
    435550        }
    436551
    437552        /*Setting outputs*/
    438         nvertices       = nconformvertices;
    439         nelements       = nconformelements;
     553        *nvertices      = nconformvertices;
     554        *nelements      = nconformelements;
    440555        *px                     = newmeshX;
    441556        *py                = newmeshY;
     
    446561}
    447562/*}}}*/
    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){/*{{{*/
     563void AdaptiveMeshRefinement::CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements){/*{{{*/
    498564
    499565        /* IMPORTANT! elements come in Matlab indexing
     
    502568        if(nvertices<=0) _error_("Impossible to create initial mesh: nvertices is <= 0!\n");
    503569   if(nelements<=0) _error_("Impossible to create initial mesh: nelements is <= 0!\n");
    504         this->SetElementWidth(width);
    505570
    506571    /*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!");
    508573   
    509574   this->fathermesh = new TPZGeoMesh();
     
    525590        long index;
    526591   const int mat = this->GetElemMaterialID();
    527    TPZManVector<long> elem(this->elementswidth,0);
     592   TPZManVector<long> elem(this->GetNumberOfNodes(),0);
    528593   this->sid2index.clear();
    529594
    530595        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 indexing
     596                for(int j=0;j<this->GetNumberOfNodes();j++) elem[j]=elements[i*this->GetNumberOfNodes()+j]-1;//Convert Matlab to C indexing
    532597      /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
    533598      const int reftype = 1;
    534       switch(this->elementswidth){
     599      switch(this->GetNumberOfNodes()){
    535600                        case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index,reftype);   break;
    536601         default:       _error_("mesh not supported yet");
     
    543608   /*Build element and node connectivities*/
    544609   this->fathermesh->BuildConnectivity();
    545         /*Set current mesh*/
    546         this->currentmesh=new TPZGeoMesh(*this->fathermesh);
     610        /*Set previous mesh*/
     611        this->previousmesh=new TPZGeoMesh(*this->fathermesh);
    547612}
    548613/*}}}*/
     
    629694}
    630695/*}}}*/
    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){/*{{{*/
     696void AdaptiveMeshRefinement::CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements){/*{{{*/
    646697
    647698        /*Basic verification*/
    648699        if(nvertices<=0) _error_("Impossible to continue: nvertices <=0!\n");
    649700        if(nelements<=0) _error_("Impossible to continue: nelements <=0!\n");
    650         if(width!=3) _error_("Impossible to continue: width !=3!\n");
    651701        if(!px) _error_("Impossible to continue: px is NULL!\n");
    652702        if(!py) _error_("Impossible to continue: py is NULL!\n");
     
    656706        std::set<int> elemvertices;
    657707        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");
    664714       
    665715        //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++){
    667717                if(isnan((*px)[i]) || isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");
    668718                if(isnan((*py)[i]) || isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");
    669719        }
    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");
    673724                }
    674725        }
     
    676727}
    677728/*}}}*/
     729void 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/*}}}*/
     814int 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  
    3737#include <pzgeotriangle.h>
    3838#include <tpzgeoelrefpattern.h>
     39#include <pzgraphmesh.h>
    3940#include <TPZVTKGeoMesh.h>
    4041
     
    4647
    4748public:
    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{{{*/
    5067        /* Constructor, destructor etc*/
    5168        AdaptiveMeshRefinement();                                                                                                                       
     
    5370        AdaptiveMeshRefinement & operator= (const AdaptiveMeshRefinement &cp); 
    5471        virtual ~AdaptiveMeshRefinement();                                                                                             
    55    
    5672        /*General methods*/
    5773        void CleanUp();
    5874        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        /*}}}*/
    6980private:
    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{{{*/
    7782        std::vector<int> sid2index;                                                                     // Vector that keeps index of PZGeoMesh elements used in the ISSM mesh (sid)
    7883        std::vector<int> index2sid;                                                                     // Vector that keeps sid of issm mesh elements used in the neopz mesh (index)
    7984        std::vector<int> specialelementsindex;                                          // Vector that keeps index of the special elements (created to avoid haning nodes)
    8085        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);
    8591        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        /*}}}*/
    91101};
    92102
  • issm/trunk-jpl/src/c/classes/AmrBamg.cpp

    r21930 r22100  
    137137       
    138138        /*verify if the metric will be reseted or not*/
    139         if(!this->keepmetric){
     139        if(this->keepmetric==0){
    140140                if(this->options->metric) xDelete<IssmDouble>(this->options->metric);
    141141                this->options->metricSize[0] = 0;
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r22004 r22100  
    35903590   xDelete<IssmDouble>(elementlevelset);
    35913591   delete vmasklevelset;
    3592 
    35933592}
    35943593/*}}}*/
     
    36323631   delete vxc;
    36333632   delete vyc;
     3633}
     3634/*}}}*/
     3635void 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;
    36343719}
    36353720/*}}}*/
     
    45864671       
    45874672        /*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_)
     4710void 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/*}}}*/
     4765void 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/*}}}*/
     4825void 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/*}}}*/
     4871void 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*/
    45884879        int elementswidth                       = this->GetElementsWidth();
    4589    int numberofvertices                 = this->vertices->NumberOfVertices();
    45904880   int numberofelements                 = this->elements->NumberOfElements();
    45914881        int* elem_vertices                                      = xNew<int>(elementswidth);
    45924882   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
    46084888        /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/
    46094889   for(int i=0;i<this->elements->Size();i++){
     
    46114891      element->GetInputListOnVertices(levelset,levelset_type);
    46124892                element->GetVerticesSidList(elem_vertices);
    4613                 sid                     = element->Sid();
    4614                 xcenter         = NAN;
    4615                 ycenter         = NAN; 
     4893                sid     = element->Sid();
     4894                label = NAN;   
    46164895        Tria* tria      = xDynamicCast<Tria*>(element);
    46174896                if(tria->IsIceInElement()){/*verify if there is ice in the element*/
    46184897                        if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 
    46194898                                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.;
    46224900                        }
    46234901                }
    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/*}}}*/
     4922void 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/*}}}*/
     4959void 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);
    46374986        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]);           
    46534991                }
    46544992        }       
    46554993
    46564994        /*Assign the pointer*/
    4657         (*pverticedistance)=verticedistance;
     4995        (*pelementdistance)=elementdistance;
    46584996
    46594997        /*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(&regionlevel1,AmrRegionLevel1Enum);
    4762         this->parameters->FindParam(&regionlevelmax,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);
    47805001}
    47815002/*}}}*/
  • issm/trunk-jpl/src/c/classes/FemModel.h

    r21919 r22100  
    178178                void MeanGroundedIceLevelSet(IssmDouble** pmasklevelset);
    179179                void GetElementCenterCoordinates(IssmDouble** pxc,IssmDouble** pyc);
     180                void GetZeroLevelSetPoints(IssmDouble** pzerolevelset_points,int &numberofpoints,int levelset_type);
    180181                #endif
    181182
     
    191192                void ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist);
    192193                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);
    193198                void SetRefPatterns(void);
    194199                #endif
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r22004 r22100  
    128128                        case AmrNeopzEnum:
    129129                                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));
    132137                                break;
    133138                        #endif
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22075 r22100  
    861861        AmrNeopzEnum,
    862862        AmrLevelMaxEnum,
    863         AmrRegionLevel1Enum,
    864         AmrRegionLevelMaxEnum,
     863        AmrLagEnum,
     864        AmrRadiusLevelMaxEnum,
    865865        AmrBamgEnum,
    866866        AmrHminEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22075 r22100  
    834834                case AmrNeopzEnum : return "AmrNeopz";
    835835                case AmrLevelMaxEnum : return "AmrLevelMax";
    836                 case AmrRegionLevel1Enum : return "AmrRegionLevel1";
    837                 case AmrRegionLevelMaxEnum : return "AmrRegionLevelMax";
     836                case AmrLagEnum : return "AmrLag";
     837                case AmrRadiusLevelMaxEnum : return "AmrRadiusLevelMax";
    838838                case AmrBamgEnum : return "AmrBamg";
    839839                case AmrHminEnum : return "AmrHmin";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22075 r22100  
    852852              else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum;
    853853              else if (strcmp(name,"AmrLevelMax")==0) return AmrLevelMaxEnum;
    854               else if (strcmp(name,"AmrRegionLevel1")==0) return AmrRegionLevel1Enum;
    855               else if (strcmp(name,"AmrRegionLevelMax")==0) return AmrRegionLevelMaxEnum;
     854              else if (strcmp(name,"AmrLag")==0) return AmrLagEnum;
     855              else if (strcmp(name,"AmrRadiusLevelMax")==0) return AmrRadiusLevelMaxEnum;
    856856              else if (strcmp(name,"AmrBamg")==0) return AmrBamgEnum;
    857857              else if (strcmp(name,"AmrHmin")==0) return AmrHminEnum;
  • issm/trunk-jpl/src/m/classes/amr.js

    r21674 r22100  
    77        //methods
    88        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;   
    1723        }// }}}
    1824        this.disp= function(){// {{{
    19 
    2025                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');
    2539        }// }}}
    2640        this.classname= function(){// {{{
     
    2943        }// }}}
    3044                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);
    3857                } // }}}
    3958                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');
    4574                }//}}}
    4675                this.fix=function() { //{{{
     
    4877        //properties
    4978        // {{{
    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.;
    5393
    5494        this.setdefaultparameters();
  • issm/trunk-jpl/src/m/classes/amr.m

    r21802 r22100  
    22%
    33%   Usage:
    4 %      amr=amr();
     4%      md.amr=amr();
    55
    66classdef amr
    77        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% }}}
    1155        end
    1256        methods
     
    2165                function self = setdefaultparameters(self) % {{{
    2266
    23                         %level_max: 2 to 4
    24                         self.level_max=2;
     67                        %hmin and hmax
     68                        self.hmin=100.;
     69                        self.hmax=100.e3;
    2570
    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.;
    3190
    3291                end % }}}
    3392                function md = checkconsistency(self,md,solution,analyses) % {{{
    3493
    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);
    41107                end % }}}
    42108                function disp(self) % {{{
    43109                        disp(sprintf('   amr parameters:'));
    44110
    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']);
    48124
    49125                end % }}}
    50126                function marshall(self,prefix,md,fid) % {{{
    51127
    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');
    62143
    63144                end % }}}
  • issm/trunk-jpl/src/m/classes/amr.py

    r21676 r22100  
    1212
    1313    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.
    1828        #set defaults
    1929        self.setdefaultparameters()
     
    2131    def __repr__(self): # {{{
    2232        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"))
    2646        return string
    2747    #}}}
    2848    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
    3963        return self
    40         #}}}
     64    #}}}
    4165    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);       
    4978        return md
    5079    # }}}
    5180    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');
    5596    # }}}
  • issm/trunk-jpl/test/NightlyRun/test462.m

    r21955 r22100  
    1111md.transient.isgroundingline=0;
    1212%amr bamg settings, just field
    13 md.amr=amrbamg();
    1413md.amr.hmin=10000;
    1514md.amr.hmax=100000;
  • issm/trunk-jpl/test/NightlyRun/test463.m

    r21956 r22100  
    1111md.transient.isgroundingline=0;
    1212%amr bamg settings, just grounding line
    13 md.amr=amrbamg();
    1413md.amr.hmin=10000;
    1514md.amr.hmax=100000;
  • issm/trunk-jpl/test/NightlyRun/test464.m

    r21955 r22100  
    1111md.transient.isgroundingline=0;
    1212%amr bamg settings, just ice front
    13 md.amr=amrbamg();
    1413md.amr.hmin=10000;
    1514md.amr.hmax=100000;
  • issm/trunk-jpl/test/NightlyRun/test465.m

    r21956 r22100  
    1111md.transient.isgroundingline=0;
    1212%amr bamg settings, field, grounding line and ice front
    13 md.amr=amrbamg();
    1413md.amr.hmin=20000;
    1514md.amr.hmax=100000;
Note: See TracChangeset for help on using the changeset viewer.