Changeset 22241


Ignore:
Timestamp:
11/08/17 05:07:49 (7 years ago)
Author:
tsantos
Message:

CHG: Updated AMR methods for NeoPZ and Bamg, insert option to restart a simulation using error estimators and Bamg, deleted some non-used methods.

Location:
issm/trunk-jpl/src
Files:
17 edited

Legend:

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

    r22100 r22241  
    3030        this->fathermesh                                                = new TPZGeoMesh(*cp.fathermesh);
    3131        this->previousmesh                                      = new TPZGeoMesh(*cp.previousmesh);
     32        this->refinement_type                           = cp.refinement_type;
    3233        this->level_max                                         = cp.level_max;
    3334        this->radius_level_max                          = cp.radius_level_max;
     
    3839        this->thicknesserror_threshold  = cp.thicknesserror_threshold;
    3940        this->deviatoricerror_threshold = cp.deviatoricerror_threshold;
     41        this->max_deviatoricerror                       = cp.max_deviatoricerror;
     42        this->max_thicknesserror                        = cp.max_thicknesserror;
    4043        this->sid2index.clear();
    4144        this->sid2index.resize(cp.sid2index.size());
     
    6164        if(this->fathermesh)    delete this->fathermesh;
    6265        if(this->previousmesh)  delete this->previousmesh;
     66        this->refinement_type                           = -1;
    6367        this->level_max                                         = -1;
    6468        this->radius_level_max                          = -1;
     
    6973        this->thicknesserror_threshold  = -1;
    7074        this->deviatoricerror_threshold = -1;
     75        this->max_deviatoricerror                       = -1;
     76        this->max_thicknesserror                        = -1;
    7177        this->sid2index.clear();
    7278        this->index2sid.clear();
     
    7985        this->fathermesh                                                = NULL;
    8086        this->previousmesh                                      = NULL;
     87        this->refinement_type                           = -1;
    8188        this->level_max                                         = -1;
    8289        this->radius_level_max                          = -1;
     
    8794        this->thicknesserror_threshold  = -1;
    8895        this->deviatoricerror_threshold = -1;
     96        this->max_deviatoricerror                       = -1;
     97        this->max_thicknesserror                        = -1;
    8998        this->sid2index.clear();
    9099        this->index2sid.clear();
     
    94103
    95104/*Mesh refinement methods*/
    96 void AdaptiveMeshRefinement::ExecuteRefinement(int numberofpoints,double* xylist,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
    97 
     105void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
     106       
    98107        /*IMPORTANT! pelementslist are in Matlab indexing*/
    99108        /*NEOPZ works only in C indexing*/
    100109        if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n");
     110        if(this->refinement_type!=0 && this->refinement_type!=1) _error_("Impossible to execute refinement: refinement type is not defined!\n");
     111
     112        /*Input verifications*/
     113        if(this->deviatoricerror_threshold>0    && !deviatoricerror) _error_("deviatoricerror is NULL!\n");
     114        if(this->thicknesserror_threshold>0             && !thicknesserror)     _error_("thicknesserror is NULL!\n");
     115        if(this->groundingline_distance>0               && !gl_distance)                _error_("gl_distance is NULL!\n");
     116        if(this->icefront_distance>0                            && !if_distance)                _error_("if_distance is NULL!\n");
    101117
    102118        /*Intermediaries*/
    103119        bool verbose=VerboseSolution();
    104 
    105         /*Refine the mesh using level max*/
    106         this->RefineMesh(verbose,this->previousmesh,numberofpoints,xylist);
    107        
    108         /*Get new geometric mesh in ISSM data structure*/
    109         this->GetMesh(this->previousmesh,pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
    110 
    111         /*Verify the new geometry*/
    112         this->CheckMesh(pnewnumberofvertices,pnewnumberofelements,px,py,pelementslist);
    113        
    114         if(verbose) _printf_("\trefinement process done!\n");
    115 }
    116 /*}}}*/
    117 void AdaptiveMeshRefinement::ExecuteRefinement(double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist){/*{{{*/
    118 
    119         /*IMPORTANT! pelementslist are in Matlab indexing*/
    120         /*NEOPZ works only in C indexing*/
    121         if(!this->fathermesh || !this->previousmesh) _error_("Impossible to execute refinement: fathermesh or previousmesh is NULL!\n");
    122 
    123         /*Intermediaries*/
    124         bool verbose=true;
    125120       
    126121        /*Execute refinement*/
    127         this->RefinementProcess(verbose,gl_elementdistance,if_elementdistance,deviatoricerror,thicknesserror);
     122        this->RefineMeshOneLevel(verbose,gl_distance,if_distance,deviatoricerror,thicknesserror);
    128123   
    129124        /*Get new geometric mesh in ISSM data structure*/
     
    134129}
    135130/*}}}*/
    136 void AdaptiveMeshRefinement::RefinementProcess(bool &verbose,double* gl_elementdistance,double* if_elementdistance,double* deviatoricerror,double* thicknesserror){/*{{{*/
    137    
    138         if(verbose) _printf_("\n\trefinement process started (level max = " << this->level_max << ")\n");
     131void AdaptiveMeshRefinement::RefineMeshOneLevel(bool &verbose,double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror){/*{{{*/
    139132       
    140133        /*Intermediaries*/
    141         TPZGeoMesh* nohangingnodesmesh=NULL;
    142 
    143         double mean_mask                = 0;
    144         double mean_tauerror = 0;
    145         double mean_Herror      = 0;
    146         double group_Herror     = 0;
    147         int index,sid;
    148         std::vector<int> specialfatherindex; specialfatherindex.clear();
    149 
    150         /*Calculate mean values*/
    151         /*
    152         for(int i=0;i<this->sid2index.size();i++){
    153                 mean_mask               += masklevelset[i];
    154                 mean_tauerror   += deviatorictensorerror[i];
    155                 mean_Herror             += thicknesserror[i];
    156         }
    157         mean_mask               /= this->sid2index.size();
    158         mean_tauerror   /= this->sid2index.size();
    159         mean_Herror             /= this->sid2index.size();
    160         */
    161         if(verbose) _printf_("\t\tdeal with special elements...\n");
    162         /*Deal with special elements*/
    163         for(int i=0;i<this->specialelementsindex.size();i++){
    164                 if(this->specialelementsindex[i]==-1) continue;
    165                 /*Get special element and verify*/
    166                 TPZGeoEl* geoel=this->previousmesh->Element(this->specialelementsindex[i]);
    167                 if(!geoel)_error_("special element (sid) "<<i<<" is null!\n");
    168                 if(geoel->HasSubElement())_error_("special element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n");
    169                 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n");
    170                 if(!geoel->Father())_error_("father of special element (sid) "<<i<<" is null!\n");
    171                
    172                 /*Get element's siblings and verify*/
    173                 TPZGeoEl* father=geoel->Father();
    174                 TPZVec<TPZGeoEl *> siblings;
    175                 father->GetHigherSubElements(siblings);
    176                 std::vector<int> sidvec; sidvec.resize(siblings.size());
    177                 for (int j=0;j<siblings.size();j++){
    178                         if(!siblings[j]) _error_("special element (sid) "<<i<<" has a null siblings null!\n");
    179                         sidvec[j]=this->index2sid[siblings[j]->Index()];
    180                 }
    181                
    182                 /*Now, reset the data strucure and verify if the siblings should be deleted*/   
    183                 if(siblings.size()<4){
    184                         /*Reset subelements in the father*/
    185                         father->ResetSubElements();
    186                 }else{
    187                         if(siblings.size()!=4) _error_("element (index) "<<father->Index()<<" has "<<father->NSubElements()<<" subelements!\n");
    188                 }
    189                 for (int j=0;j<siblings.size();j++){
    190                         for(int k=0;k<this->specialelementsindex.size();k++){
    191                                 if(this->specialelementsindex[k]==siblings[j]->Index()){
    192                                         index                                                                   = siblings[j]->Index();
    193                                         if(index<0) _error_("index is null!\n");
    194                                         sid                                                                     = this->index2sid[index];
    195                                         if(sid<0) _error_("sid is null!\n");
    196                                         this->specialelementsindex[k]   = -1;
    197                                         this->index2sid[index]                  = -1;
    198                                         this->sid2index[sid]                            = -1;
    199                                 }
    200                         }
    201                         if(siblings.size()<4){
    202                                 /*Ok, the special element can be deleted*/
    203                                 siblings[j]->ResetSubElements();
    204                                 this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index());
    205                         }
    206                 }
    207                
    208                 /*Now, verify if the father should be refined with uniform pattern (smoother)*/
    209                 if(siblings.size()==3){//it keeps the mesh with uniform elements
    210                         /*Father has uniform subelements now*/
    211                         TPZVec<TPZGeoEl *> sons;
    212                         father->Divide(sons);
    213                 }else{
    214                         specialfatherindex.push_back(father->Index());
    215                 }
    216                 if(this->specialelementsindex[i]!=-1) _error_("special element "<<i<<" was not deleted!\n");   
    217         }
    218         this->previousmesh->BuildConnectivity();
    219        
    220         if(verbose) _printf_("\t\tuniform refinement...\n");
    221         /*Deal with uniform elemnts*/
    222         for(int i=0;i<this->sid2index.size();i++){
    223                 if(this->sid2index[i]==-1) continue;
    224                 /*Get element and verify*/
    225                 TPZGeoEl* geoel=this->previousmesh->Element(this->sid2index[i]);
    226                 if(geoel->HasSubElement()) _error_("element (sid) "<<i<<" has "<<geoel->NSubElements()<<" subelements!\n");
    227                 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("geoel->MaterialId is not GetElemMaterialID!\n");
    228 
    229                 /*Refine process*/
    230                 if(thicknesserror[i]>mean_Herror)
    231                 {       
    232                         int count=0;
    233                         TPZGeoEl* father=geoel->Father();
    234                         if(father){
    235                                 for(int j=3;j<6;j++){
    236                                         index=father->Neighbour(j).Element()->Index();
    237                                         for(int k=0;k<specialfatherindex.size();k++) if(specialfatherindex[k]==index) count++;
    238                                 }
    239                         }
    240                         TPZVec<TPZGeoEl *> sons;
    241                         if(geoel->Level()<this->level_max && count==0) geoel->Divide(sons);
    242                 }
    243                 else if(geoel->Level()>0)
    244                 {/*Unrefine process*/
    245                        
    246                         /*Get siblings and verify*/
    247                         TPZVec<TPZGeoEl *> siblings;
    248                         geoel->Father()->GetHigherSubElements(siblings);
    249                         //if(siblings.size()<4) _error_("Impossible to refine: geoel (index) "<<this->sid2index[i]<<" has less than 3 siblings!\n");   
    250                         if(siblings.size()>4) continue;//Father has more then 4 sons, this group should not be unrefined.
    251                        
    252                         /*Compute the error of the group*/
    253                         group_Herror=0;
    254                         for(int j=0;j<siblings.size();j++){
    255                                 index           = siblings[j]->Index();
    256                                 sid             = this->index2sid[index];
    257                                 if(sid==-1) continue;
    258                                 group_Herror+=thicknesserror[sid];
    259                         }
    260                         /*Verify if this group should be unrefined*/
    261                         if(group_Herror>0 && group_Herror<0*mean_Herror){ //itapopo
    262                                 /*Reset subelements in the father*/
    263                                 this->previousmesh->Element(geoel->Father()->Index())->ResetSubElements();
    264                                 /*Delete the elements and set their indexes in the index2sid and sid2index*/
    265                                 for (int j=0;j<siblings.size();j++){
    266                                         index   = siblings[j]->Index();
    267                                         sid     = this->index2sid[index];
    268                                         this->index2sid[index]=-1;
    269                                         if(sid!=-1) this->sid2index[sid]=-1;
    270                                         this->previousmesh->DeleteElement(siblings[j],siblings[j]->Index());
    271                                 }//for j
    272                         }//if
    273                 }/*Unrefine process*/
    274         }//for i
    275         this->previousmesh->BuildConnectivity();
    276        
    277         if(verbose) _printf_("\t\trefine to avoid hanging nodes...\n");
    278         this->RefineMeshToAvoidHangingNodes(verbose,this->previousmesh);
    279        
    280                 //nohangingnodesmesh = this->CreateRefPatternMesh(newmesh); itapopo tentar otimizar
    281 
    282         if(verbose) _printf_("\trefinement process done!\n");
    283 }
    284 /*}}}*/
    285 void AdaptiveMeshRefinement::RefineMesh(bool &verbose,TPZGeoMesh* gmesh,int numberofpoints,double* xylist){/*{{{*/
    286        
    287         /*Verify if there are points*/
    288         if(numberofpoints==0) return;   
    289 
    290         /*Intermediaries*/
    291         int nelem                       =-1;
    292         int side2D                      = 6;
    293         double radius_h =-1;
    294         double radius_hmax=std::max(this->radius_level_max,std::max(this->groundingline_distance,this->icefront_distance));
    295         int count                       =-1;
    296         double mindistance=0.;
    297         double distance =0.;;
     134        int nelem                                                       =-1;
     135        int side2D                                                      = 6;
     136        int sid                                                         =-1;
     137        int count                                                       =-1;
     138        int criteria                                            =-1;
     139        int numberofcriteria                            =-1;
     140        int nconformelements                            = this->sid2index.size();
     141        double gl_radius_h                              =-1;
     142        double gl_radius_hmax                   = std::max(this->radius_level_max,this->groundingline_distance);
     143        double if_radius_h                              =-1;
     144        double if_radius_hmax                   = std::max(this->radius_level_max,this->icefront_distance);
     145        double gl_groupdistance                 =-1;
     146        double if_groupdistance                 =-1;
     147        double d_maxerror                                       =-1;
     148        double t_maxerror                                       =-1;
     149        double deviatoric_grouperror    =-1;
     150        double thickness_grouperror     =-1;
     151        TPZGeoMesh* gmesh                                       = NULL;
    298152        TPZVec<REAL> qsi(2,0.),cp(3,0.);
    299153        TPZVec<TPZGeoEl*> sons;
    300  
    301         /*First, delete the special elements*/
    302         this->DeleteSpecialElements(verbose,gmesh);
     154        std::vector<int> index;
     155
     156        /*Calculate the number of criteria{{{*/
     157        numberofcriteria=0;
     158        if(this->deviatoricerror_threshold>0)   numberofcriteria++;
     159        if(this->thicknesserror_threshold>0)    numberofcriteria++;
     160        if(this->groundingline_distance>0)              numberofcriteria++;
     161        if(this->icefront_distance>0)                           numberofcriteria++;
     162        /*}}}*/
     163
     164        /*Calculate the maximum of the estimators, if requested{{{*/
     165        if(this->deviatoricerror_threshold>0 && this->max_deviatoricerror<0){
     166                for(int i=0;i<nconformelements;i++) this->max_deviatoricerror=max(this->max_deviatoricerror,deviatoricerror[i]);
     167        }
     168        if(this->thicknesserror_threshold>0 && this->max_thicknesserror<0){
     169                for(int i=0;i<nconformelements;i++) this->max_thicknesserror=max(this->max_thicknesserror,thicknesserror[i]);
     170        }
     171        /*}}}*/
     172
     173        /*First, verify if special elements have min distance or high errors{{{*/
     174        gmesh=this->previousmesh;
     175        for(int i=0;i<this->specialelementsindex.size();i++){
     176                if(this->specialelementsindex[i]==-1) _error_("index is -1!\n");
     177                if(!gmesh->Element(this->specialelementsindex[i])) _error_("element is null!\n");
     178                if(!gmesh->Element(this->specialelementsindex[i])->Father()) _error_("father is null!\n");
     179                if(gmesh->Element(this->specialelementsindex[i])->HasSubElement()) _error_("special element has sub elements!\n");
     180                sons.clear();
     181                gmesh->Element(this->specialelementsindex[i])->Father()->GetHigherSubElements(sons);
     182                /*Limits*/
     183                gl_radius_h = gl_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(this->specialelementsindex[i])->Level());
     184                if_radius_h = if_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(this->specialelementsindex[i])->Level());
     185                d_maxerror      = this->deviatoricerror_threshold*this->max_deviatoricerror;
     186                t_maxerror      = this->thicknesserror_threshold*this->max_thicknesserror;
     187                /*Calculate the distance and error of the group (sons)*/
     188                gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0;
     189                for(int s=0;s<sons.size();s++){
     190                        sid=this->index2sid[sons[s]->Index()];
     191                        if(sid<0) continue;
     192                        if(this->groundingline_distance>0)              gl_groupdistance=std::min(gl_groupdistance,gl_distance[sid]);
     193                        if(this->icefront_distance>0)                           if_groupdistance=std::min(if_groupdistance,if_distance[sid]);
     194                        if(this->deviatoricerror_threshold>0)   deviatoric_grouperror+=deviatoricerror[sid];
     195                        if(this->thicknesserror_threshold>0)    thickness_grouperror+=thicknesserror[sid];
     196                }       
     197                criteria=0;
     198                if(this->groundingline_distance>0               && gl_groupdistance<gl_radius_h)                        criteria++;
     199                if(this->icefront_distance>0                            && if_groupdistance<if_radius_h)                        criteria++;
     200                if(this->deviatoricerror_threshold>0    && deviatoric_grouperror>d_maxerror)    criteria++;
     201                if(this->thicknesserror_threshold>0             && thickness_grouperror>t_maxerror)             criteria++;
     202                /*Finally, it keeps the father index if it must be refine*/
     203                if(criteria) index.push_back(gmesh->Element(this->specialelementsindex[i])->FatherIndex());
     204        }
     205        /*}}}*/
     206       
     207        /*Now, detele the special elements{{{*/
     208        if(this->refinement_type==1) this->DeleteSpecialElements(verbose,gmesh);
     209        else this->specialelementsindex.clear();
     210        /*}}}*/
     211
     212        /*Set the mesh and delete previousmesh if refinement type is 0{{{*/
     213        if(this->refinement_type==0){
     214                delete this->previousmesh;     
     215                gmesh=this->fathermesh;
     216        }
     217        /*}}}*/
     218       
     219        /*Unrefinement process: loop over level of refinements{{{*/
     220        if(verbose) _printf_("\tunrefinement process...\n");
     221        if(verbose) _printf_("\ttotal: ");
     222        count=0;
     223         
     224        nelem=gmesh->NElements();//must keep here
     225        for(int i=0;i<nelem;i++){
     226                if(!gmesh->Element(i)) continue;
     227                if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue;
     228                if(gmesh->Element(i)->HasSubElement()) continue;
     229                if(gmesh->Element(i)->Level()==0) continue;
     230                if(!gmesh->Element(i)->Father()) _error_("father is NULL!\n");
     231                /*Limits with lag*/
     232                gl_radius_h = this->lag*gl_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(i)->Level());
     233                if_radius_h = this->lag*if_radius_hmax*std::pow(this->gradation,this->level_max-gmesh->Element(i)->Level());
     234                d_maxerror      = 0.05*this->max_deviatoricerror;//itapopo definir melhor
     235                t_maxerror      = 0.05*this->max_thicknesserror;//itapopo definir melhor
     236                /*Get the sons of the father (sibilings)*/     
     237                sons.clear();
     238                gmesh->Element(i)->Father()->GetHigherSubElements(sons);
     239                if(sons.size()!=4) continue;//delete just group of 4 elements. This avoids big holes in the mesh
     240                /*Find the minimal distance and the error of the group*/       
     241                gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0;
     242                for(int s=0;s<sons.size();s++){
     243                        sid=this->index2sid[sons[s]->Index()];
     244                        /*Verify if this group have solutions*/
     245                        if(sid<0){gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=INFINITY;thickness_grouperror=INFINITY;continue;}
     246                        /*Distance and error of the group*/
     247                        if(this->groundingline_distance>0)              gl_groupdistance=std::min(gl_groupdistance,gl_distance[sid]);
     248                        if(this->icefront_distance>0)                           if_groupdistance=std::min(if_groupdistance,if_distance[sid]);
     249                        if(this->deviatoricerror_threshold>0)   deviatoric_grouperror+=deviatoricerror[sid];
     250                        if(this->thicknesserror_threshold>0)    thickness_grouperror+=thicknesserror[sid];
     251                }
     252                /*Verify the criteria*/
     253                criteria=0;
     254                if(this->groundingline_distance>0               && gl_groupdistance>gl_radius_h)                        criteria++;
     255                if(this->icefront_distance>0                            && if_groupdistance>if_radius_h)                        criteria++;
     256                if(this->deviatoricerror_threshold>0    && deviatoric_grouperror<d_maxerror)    criteria++;
     257                if(this->thicknesserror_threshold>0             && thickness_grouperror<t_maxerror)             criteria++;
     258                /*Now, if the group attends the criteria, unrefine it*/
     259                if(criteria==numberofcriteria){
     260                        gmesh->Element(i)->Father()->ResetSubElements(); count++;
     261                        for(int s=0;s<sons.size();s++){this->index2sid[sons[s]->Index()]=-1;gmesh->DeleteElement(sons[s],sons[s]->Index());}
     262                }
     263        }
     264        if(verbose) _printf_(""<<count<<"\n");
     265        /*Adjust the connectivities before continue*/
     266        gmesh->BuildConnectivity();
     267        /*}}}*/
    303268       
    304269        /*Refinement process: loop over level of refinements{{{*/
    305270        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: ");
     271        if(verbose) _printf_("\ttotal: ");
     272        count=0;
     273        nelem=gmesh->NElements();//must keep here
     274        for(int i=0;i<nelem;i++){
     275                if(!gmesh->Element(i)) continue;
     276                if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue;
     277                if(gmesh->Element(i)->HasSubElement()) continue;
     278                if(gmesh->Element(i)->Level()==this->level_max) continue;
     279                /*Verify if this element has solutions*/
     280                sid=this->index2sid[gmesh->Element(i)->Index()];
     281                if(sid<0) continue;
     282                /*Filter: set the region/radius for level h*/
     283                gl_radius_h     = gl_radius_hmax*std::pow(this->gradation,this->level_max-(gmesh->Element(i)->Level()+1));//+1, current element level is <level_max
     284                if_radius_h     = if_radius_hmax*std::pow(this->gradation,this->level_max-(gmesh->Element(i)->Level()+1));//+1, current element level is <level_max
     285                d_maxerror      = this->deviatoricerror_threshold*this->max_deviatoricerror;
     286                t_maxerror      = this->thicknesserror_threshold*this->max_thicknesserror;
     287                /*Verify distance and error of the element, if requested*/
     288                criteria=0;
     289                if(this->groundingline_distance>0               && gl_distance[sid]<gl_radius_h)                criteria++;
     290                if(this->icefront_distance>0                            && if_distance[sid]<if_radius_h)                criteria++;
     291                if(this->deviatoricerror_threshold>0    && deviatoricerror[sid]>d_maxerror)     criteria++;
     292                if(this->thicknesserror_threshold>0             && thicknesserror[sid]>t_maxerror)      criteria++;
     293                /*Now, if it attends any criterion, keep the element index to refine in next step*/
     294                if(criteria)index.push_back(i);
     295        }
     296        /*Now, refine the elements*/
     297        for(int i=0;i<index.size();i++){
     298                if(!gmesh->Element(index[i])) DebugStop();
     299                if(!gmesh->Element(index[i])->HasSubElement()){gmesh->Element(index[i])->Divide(sons);count++;}
     300        }
     301        if(verbose) _printf_(""<<count<<"\n");
     302        /*Adjust the connectivities before continue*/
     303        gmesh->BuildConnectivity();
     304        /*}}}*/
     305
     306        /*Now, apply smoothing and insert special elements to avoid hanging nodes{{{*/
     307        this->RefineMeshWithSmoothing(verbose,gmesh);
     308        if(this->refinement_type==0) this->previousmesh=this->CreateRefPatternMesh(gmesh);//in this case, gmesh==this->fathermesh
     309        gmesh=this->previousmesh;//previous mesh is always refined to avoid hanging nodes
     310        this->RefineMeshToAvoidHangingNodes(verbose,gmesh);
     311        /*}}}*/
     312}
     313/*}}}*/
     314int AdaptiveMeshRefinement::VerifyRefinementType(TPZGeoEl* geoel){/*{{{*/
     315
     316        /*
     317         * 0 : no refinement
     318         * 1 : special refinement (to avoid hanging nodes)
     319         * 2 : uniform refinment
     320         * */
     321        if(!geoel) _error_("geoel is NULL!\n");
     322       
     323        /*Output*/
     324        int type=0;
     325        int count=0;
     326       
     327        /*Intermediaries*/
     328        TPZVec<TPZGeoEl*> sons;
     329       
     330        /*Loop over neighboors (sides 3, 4 and 5)*/
     331        for(int j=3;j<6;j++){
     332                sons.clear();
     333                geoel->Neighbour(j).Element()->GetHigherSubElements(sons);
     334                if(sons.size()) count++; //if neighbour was refined
     335                if(sons.size()>4) count++; //if neighbour's level is > element level+1
     336        }
     337       
     338        /*Verify and return*/
     339        if(count>1) type=2;
     340        else type=count;
     341       
     342        return type;
     343}
     344/*}}}*/
     345void AdaptiveMeshRefinement::RefineMeshWithSmoothing(bool &verbose,TPZGeoMesh* gmesh){/*{{{*/
     346
     347        /*Intermediaries*/
     348        int nelem               =-1;
     349        int count               =-1;
     350        int type                        =-1;
     351        int typecount   =-1;
     352
     353        TPZVec<TPZGeoEl*> sons;
     354
     355        /*Refinement process: loop over level of refinements*/
     356        if(verbose) _printf_("\tsmoothing process (level max = "<<this->level_max<<")\n");
     357        if(verbose) _printf_("\ttotal: ");
     358
     359        count=1;
     360        while(count>0){
    308361                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 */
    314362                nelem=gmesh->NElements();//must keep here
    315                 for(int i=0;i<nelem;i++){//itapopo pode-se reduzir o espaço de busca aqui
     363                for(int i=0;i<nelem;i++){
    316364                        if(!gmesh->Element(i)) continue;
    317365                        if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue;
    318366                        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
     367                        if(gmesh->Element(i)->Level()==this->level_max) continue;
     368                        /*loop over neighboors (sides 3, 4 and 5). Important: neighbours has the same dimension of the element*/
     369                        type=this->VerifyRefinementType(gmesh->Element(i));
     370                        if(type<2){
     371                                typecount=0;
     372                                for(int j=3;j<6;j++){
     373                                        if(gmesh->Element(i)->Neighbour(j).Element()->HasSubElement()) continue;
     374                                        if(gmesh->Element(i)->Neighbour(j).Element()->Index()==i) typecount++;//neighbour==this element, element at the border
     375                                        if(this->VerifyRefinementType(gmesh->Element(i)->Neighbour(j).Element())==1) typecount++;
     376                                }
     377                                if(typecount>1 && type==1) type=2;
     378                                else if(typecount>2 && type==0) type=2;
    326379                        }
    327                         /*If the element is inside the region, refine it*/
    328                         if(mindistance<radius_h){
    329                                 gmesh->Element(i)->Divide(sons);
    330                                 count++;
    331                         }
    332                 }
    333                 if(verbose) _printf_(""<<count<<")\n");
    334         }
    335         /*Adjust the connectivities before continue*/
    336         gmesh->BuildConnectivity();
    337         /*}}}*/
    338        
    339         /*Unrefinement process: loop over level of refinements{{{*/
    340         if(verbose) _printf_("\tunrefinement process...\n");
    341         for(int h=this->level_max;h>=1;h--){
    342                 if(verbose) _printf_("\tlevel "<<h<<" (total: ");
    343                 count=0;
    344                
    345                 /*Filter with lag: set the region/radius for level h*/
    346                 radius_h=this->lag*radius_hmax*std::pow(this->gradation,this->level_max-h);
    347                
    348                 /*Find the minimal distance of the elements (center point) to the points */
    349                 nelem=gmesh->NElements();//must keep here
    350                 for(int i=0;i<nelem;i++){//itapopo pode-se reduzir o espaço de busca aqui
    351                         if(!gmesh->Element(i)) continue;
    352                         if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID()) continue;
    353                         if(gmesh->Element(i)->HasSubElement()) continue;
    354                         if(gmesh->Element(i)->Level()!=h) continue;
    355                         if(!gmesh->Element(i)->Father()) _error_("father is NULL!\n");
    356                         /*Get the sons of the father (sibilings)*/     
    357                         sons.clear();
    358                         gmesh->Element(i)->Father()->GetHigherSubElements(sons);
    359                         if(sons.size()!=4) continue;//delete just group of 4 elements. This avoids big holes in the mesh
    360                         /*Find the minimal distance of the group*/     
    361                         mindistance=INFINITY;
    362                         for(int s=0;s<sons.size();s++){
    363                                 sons[s]->CenterPoint(side2D,qsi);
    364                                 sons[s]->X(qsi,cp);
    365                                 for (int j=0;j<numberofpoints;j++){
    366                                         distance                = std::sqrt( (xylist[2*j]-cp[0])*(xylist[2*j]-cp[0])+(xylist[2*j+1]-cp[1] )*(xylist[2*j+1]-cp[1]) );
    367                                         mindistance = std::min(mindistance,distance);//min distance to the point
    368                                 }
    369                         }
    370                         /*If the group is outside the region, unrefine the group*/
    371                         if(mindistance>radius_h){
    372                                 gmesh->Element(i)->Father()->ResetSubElements();
    373                                 count++;
    374                                 for(int s=0;s<sons.size();s++){
    375                                         gmesh->DeleteElement(sons[s],sons[s]->Index());
    376                                 }
    377                         }
    378                 }
    379                 if(verbose) _printf_(""<<count<<")\n");
    380         }
    381         /*Adjust the connectivities before continue*/
    382         gmesh->BuildConnectivity();
    383         /*}}}*/
    384        
    385         /*Now, insert special elements to avoid hanging nodes*/
    386         this->RefineMeshToAvoidHangingNodes(verbose,gmesh);
    387 }
    388 /*}}}*/
    389 void AdaptiveMeshRefinement::RefineMesh(TPZGeoMesh* gmesh,std::vector<int> &elements){/*{{{*/
    390 
    391         /*Refine elements: uniform pattern refinement*/
    392         for(int i=0;i<elements.size();i++){
    393                 /*Get geometric element and verify if it has already been refined*/
    394                 int index = elements[i];
    395                 TPZGeoEl * geoel = gmesh->Element(index);
    396                 if(geoel->HasSubElement()) _error_("Impossible to refine: geoel (index) " << index << " has subelements!\n");
    397                 if(geoel->MaterialId()!=this->GetElemMaterialID()) _error_("Impossible to refine: geoel->MaterialId is not GetElemMaterialID!\n");
    398                 /*Divide geoel*/
    399                 TPZVec<TPZGeoEl *> Sons;
    400                 geoel->Divide(Sons);
    401         }
    402         gmesh->BuildConnectivity();
     380                        /*refine the element if requested*/
     381                        if(type==2){gmesh->Element(i)->Divide(sons);    count++;}
     382                }
     383                if(verbose){
     384                        if(count==0) _printf_(""<<count<<"\n");
     385                        else _printf_(""<<count<<", ");
     386                }
     387                /*Adjust the connectivities before continue*/
     388                gmesh->BuildConnectivity();
     389        }
    403390}
    404391/*}}}*/
     
    452439                if(gmesh->Element(this->specialelementsindex[i])->Father()) gmesh->Element(this->specialelementsindex[i])->Father()->ResetSubElements();
    453440                gmesh->DeleteElement(gmesh->Element(this->specialelementsindex[i]),this->specialelementsindex[i]);
     441      this->index2sid[this->specialelementsindex[i]]=-1;
    454442                count++;
    455443        }
     
    568556        if(nvertices<=0) _error_("Impossible to create initial mesh: nvertices is <= 0!\n");
    569557   if(nelements<=0) _error_("Impossible to create initial mesh: nelements is <= 0!\n");
     558        if(this->refinement_type!=0 && this->refinement_type!=1) _error_("Impossible to create initial mesh: refinement type is not defined!\n");
    570559
    571560    /*Verify and creating initial mesh*/
     
    591580   const int mat = this->GetElemMaterialID();
    592581   TPZManVector<long> elem(this->GetNumberOfNodes(),0);
     582        this->index2sid.clear(); this->index2sid.resize(nelements);
    593583   this->sid2index.clear();
    594584
    595585        for(int i=0;i<nelements;i++){
    596586                for(int j=0;j<this->GetNumberOfNodes();j++) elem[j]=elements[i*this->GetNumberOfNodes()+j]-1;//Convert Matlab to C indexing
    597       /*reftype = 0: uniform, fast / reftype = 1: uniform and non-uniform (avoid hanging nodes), it is not too fast */
    598       const int reftype = 1;
    599587      switch(this->GetNumberOfNodes()){
    600                         case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index,reftype);   break;
     588                        case 3: this->fathermesh->CreateGeoElement(ETriangle,elem,mat,index,this->refinement_type);     break;
    601589         default:       _error_("mesh not supported yet");
    602590                }
    603591      /*Define the element ID*/       
    604592      this->fathermesh->ElementVec()[index]->SetId(i);
    605                 /*Initialize sid2index*/
     593                /*Initialize sid2index and index2sid*/
    606594                this->sid2index.push_back((int)index);
     595                this->index2sid[(int)index]=this->sid2index.size()-1;//keep the element sid
    607596        }
    608597   /*Build element and node connectivities*/
    609598   this->fathermesh->BuildConnectivity();
    610599        /*Set previous mesh*/
    611         this->previousmesh=new TPZGeoMesh(*this->fathermesh);
     600        if(this->refinement_type==1) this->previousmesh=new TPZGeoMesh(*this->fathermesh);
     601        else this->previousmesh=this->CreateRefPatternMesh(this->fathermesh);
    612602}
    613603/*}}}*/
     
    622612   int reftype = 1;
    623613   long index;
    624    
     614
    625615        //nodes
    626616        newgmesh->NodeVec().Resize(nnodes);
     
    630620   for(int i=0;i<nelem;i++){
    631621        TPZGeoEl * geoel = gmesh->Element(i);
    632       TPZManVector<long> elem(3,0);
     622               
     623                if(!geoel){
     624                        index=newgmesh->ElementVec().AllocateNewElement();
     625                        newgmesh->ElementVec()[index] = NULL;
     626                        continue;
     627                }
     628     
     629                TPZManVector<long> elem(3,0);
    633630      for(int j=0;j<3;j++) elem[j] = geoel->NodeIndex(j);
    634631     
    635632      newgmesh->CreateGeoElement(ETriangle,elem,mat,index,reftype);
    636       newgmesh->ElementVec()[index]->SetId(geoel->Id());
     633                newgmesh->ElementVec()[index]->SetId(geoel->Id());
    637634       
    638635      TPZGeoElRefPattern<TPZGeoTriangle>* newgeoel = dynamic_cast<TPZGeoElRefPattern<TPZGeoTriangle>*>(newgmesh->ElementVec()[index]);
     
    689686      }
    690687   }
     688
     689        /*Now, build connectivities*/
    691690        newgmesh->BuildConnectivity();
    692691   
     
    715714        //Verify if there are inf or NaN in coords
    716715        for(int i=0;i<*nvertices;i++){
    717                 if(isnan((*px)[i]) || isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");
    718                 if(isnan((*py)[i]) || isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");
     716                if(std::isnan((*px)[i]) || std::isinf((*px)[i])) _error_("Impossible to continue: px i=" << i <<" is NaN or Inf!\n");
     717                if(std::isnan((*py)[i]) || std::isinf((*py)[i])) _error_("Impossible to continue: py i=" << i <<" is NaN or Inf!\n");
    719718        }
    720719        for(int i=0;i<*nelements;i++){
    721720                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");
     721                        if(std::isnan((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is NaN!\n");
     722                        if(std::isinf((*pelements)[i*GetNumberOfNodes()+j])) _error_("Impossible to continue: px i=" << i <<" is Inf!\n");
    724723                }
    725724        }
  • issm/trunk-jpl/src/c/classes/AdaptiveMeshRefinement.h

    r22100 r22241  
    5454         * radius_h = lag * initial_radius * gradation ^ (level_max-h)
    5555         */
     56        int refinement_type;                                            //0 uniform (faster); 1 refpattern 
    5657        int level_max;                                                          //max level of refinement
    5758        double radius_level_max;                                //initial radius which in the elements will be refined with level max
     
    6364        double thicknesserror_threshold;                //if ==0, it will not be used
    6465        double deviatoricerror_threshold;       //if ==0, it will not be used
     66        double max_deviatoricerror;                     // Max value of the error estimator; in general, it is defined in the first time step. Attention with restart
     67        double max_thicknesserror;                              // Max value of the error estimator; in general, it is defined in the first time step. Attention with restart
    6568        /*}}}*/
    6669        /*Public methods{{{*/
     
    7477        void Initialize();
    7578        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);
     79        void ExecuteRefinement(int numberofpoints,double* xylist,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
     80   void ExecuteRefinement(double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror,int* pnewnumberofvertices,int* pnewnumberofelements,double** px,double** py,int** pelementslist);
    7781        void CreateInitialMesh(int &nvertices,int &nelements,double* x,double* y,int* elements);
    7882        void CheckMesh(int* nvertices,int* nelements,double** px,double** py,int** pelements);
     
    8084private:
    8185        /*Private attributes{{{*/
    82         std::vector<int> sid2index;                                                                     // Vector that keeps index of PZGeoMesh elements used in the ISSM mesh (sid)
    83         std::vector<int> index2sid;                                                                     // Vector that keeps sid of issm mesh elements used in the neopz mesh (index)
    84         std::vector<int> specialelementsindex;                                          // Vector that keeps index of the special elements (created to avoid haning nodes)
    85         TPZGeoMesh *fathermesh;                                                                                 // Father Mesh is the entire mesh without refinement
    86         TPZGeoMesh *previousmesh;                                                                               // Previous Mesh is the refined mesh
     86        std::vector<int> sid2index;                                     // Vector that keeps index of PZGeoMesh elements used in the ISSM mesh (sid)
     87        std::vector<int> index2sid;                                     // Vector that keeps sid of issm mesh elements used in the neopz mesh (index)
     88        std::vector<int> specialelementsindex;          // Vector that keeps index of the special elements (created to avoid haning nodes)
     89        TPZGeoMesh *fathermesh;                                                 // Entire mesh without refinement if refinement_type==1; refined with hanging nodes if efinement_type==0
     90        TPZGeoMesh *previousmesh;                                               // Refined mesh without hanging nodes (it is always refpattern type), used to generate ISSM mesh
    8791        /*}}}*/
    8892        /*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);
    91         void RefineMesh(TPZGeoMesh *gmesh,std::vector<int> &elements);
    92    void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh);
     93   void RefineMeshOneLevel(bool &verbose,double* gl_distance,double* if_distance,double* deviatoricerror,double* thicknesserror);
     94        void RefineMeshWithSmoothing(bool &verbose,TPZGeoMesh* gmesh);
     95        void RefineMeshToAvoidHangingNodes(bool &verbose,TPZGeoMesh* gmesh);
    9396        void DeleteSpecialElements(bool &verbose,TPZGeoMesh* gmesh);
    9497        void GetMesh(TPZGeoMesh* gmesh,int* nvertices,int* nelements,double** px,double** py,int** pelements);
     
    98101        void PrintGMeshVTK(TPZGeoMesh *gmesh,std::ofstream &file,bool matColor=true);
    99102        int GetVTK_ElType(TPZGeoEl* gel);
     103        int VerifyRefinementType(TPZGeoEl* geoel);
    100104        /*}}}*/
    101105};
  • issm/trunk-jpl/src/c/classes/AmrBamg.cpp

    r22100 r22241  
    1717
    1818/*Constructor, copy, clean up and destructor*/
    19 AmrBamg::AmrBamg(IssmDouble hmin,IssmDouble hmax,int fieldenum_in,IssmDouble err_in,int keepmetric_in,IssmDouble gradation_in,
    20                                                 IssmDouble groundingline_resolution_in,IssmDouble groundingline_distance_in,
    21                                                 IssmDouble icefront_resolution_in,IssmDouble icefront_distance_in,
    22                                                 IssmDouble thicknesserror_resolution_in,IssmDouble thicknesserror_threshold_in,
    23                                                 IssmDouble deviatoricerror_resolution_in,IssmDouble deviatoricerror_threshold_in){/*{{{*/
     19AmrBamg::AmrBamg(){/*{{{*/
    2420
    25         this->fieldenum                                         = fieldenum_in;
    26         this->keepmetric                                        = keepmetric_in;
    27         this->groundingline_resolution  = groundingline_resolution_in;
    28         this->groundingline_distance            = groundingline_distance_in;
    29         this->icefront_resolution                       = icefront_resolution_in;
    30         this->icefront_distance                         = icefront_distance_in;
    31         this->thicknesserror_resolution         = thicknesserror_resolution_in;
    32         this->thicknesserror_threshold  = thicknesserror_threshold_in;
    33         this->deviatoricerror_resolution = deviatoricerror_resolution_in;
    34         this->deviatoricerror_threshold  = deviatoricerror_threshold_in;
     21        /*These attributes MUST be setup by FemModel*/
     22        this->fieldenum                                         = -1;//fieldenum_in;
     23        this->keepmetric                                        = -1;//keepmetric_in;
     24        this->groundingline_resolution  = -1;//groundingline_resolution_in;
     25        this->groundingline_distance            = -1;//groundingline_distance_in;
     26        this->icefront_resolution                       = -1;//icefront_resolution_in;
     27        this->icefront_distance                         = -1;//icefront_distance_in;
     28        this->thicknesserror_resolution         = -1;//thicknesserror_resolution_in;
     29        this->thicknesserror_threshold  = -1;//thicknesserror_threshold_in;
     30        this->thicknesserror_maximum            = -1;
     31        this->deviatoricerror_resolution = -1;//deviatoricerror_resolution_in;
     32        this->deviatoricerror_threshold  = -1;//deviatoricerror_threshold_in;
     33        this->deviatoricerror_maximum           = -1;
     34       
     35        /*Geometry and mesh as NULL*/
    3536        this->geometry                                          = NULL;
    3637        this->fathermesh                                        = NULL;
     
    4344        this->options->coeff             = 1;
    4445        this->options->errg              = 0.1;
    45         this->options->gradation         = gradation_in;
     46        this->options->gradation         = -1; //MUST be setup by the FemModel
    4647        this->options->Hessiantype       = 0;
    4748        this->options->maxnbv            = 1e6;
     
    5455        this->options->verbose           = 0;
    5556        this->options->Crack             = 0;
    56         this->options->KeepVertices      = 1; /*!!!!! VERY IMPORTANT !!!!!*/
     57        this->options->KeepVertices      = 1; /*!!!!! VERY IMPORTANT !!!!! This avoid numerical errors when remeshing*/
    5758        this->options->splitcorners      = 1;
    58         this->options->hmin              = hmin;
    59         this->options->hmax              = hmax;
    60 
    61         this->options->err=xNew<IssmDouble>(1);
    62         this->options->errSize[0]=1;
    63         this->options->errSize[1]=1;
    64         this->options->err[0] = err_in;
     59        this->options->hmin              = -1;/*MUST be setup by the FemModel*/
     60        this->options->hmax              = -1;/*MUST be setup by the FemModel*/
     61        this->options->err                                      = xNew<IssmDouble>(1);
     62        this->options->err[0]                           = -1;/*MUST be setup by the FemModel*/
     63        this->options->errSize[0]                       = 1;
     64        this->options->errSize[1]                       = 1;
    6565}
    6666/*}}}*/
     
    174174        *pelementslist = elementslist;
    175175}/*}}}*/
     176void AmrBamg::SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in){/*{{{*/
     177
     178        if(!this->options) _error_("AmrBamg->options is NULL!");
     179       
     180        this->options->hmin     = hmin_in;
     181        this->options->hmax     = hmax_in;
     182        this->options->err[0]   = err_in;
     183        this->options->gradation= gradation_in;
     184}/*}}}*/
  • issm/trunk-jpl/src/c/classes/AmrBamg.h

    r21930 r22241  
    2121                IssmDouble thicknesserror_resolution;
    2222                IssmDouble thicknesserror_threshold;
     23                IssmDouble thicknesserror_maximum;
    2324                IssmDouble deviatoricerror_resolution;
    2425                IssmDouble deviatoricerror_threshold;
     26                IssmDouble deviatoricerror_maximum;
    2527
    2628                /* Constructor, destructor etc*/
    27                 AmrBamg(IssmDouble hmin,IssmDouble hmax,int fieldenum_in,IssmDouble err_in,int keepmetric_in,IssmDouble gradation_in,
    28                         IssmDouble groundingline_resolution_in,IssmDouble groundingline_distance_in,
    29                   IssmDouble icefront_resolution_in,IssmDouble icefront_distance_in,
    30                   IssmDouble thicknesserror_resolution_in,IssmDouble thicknesserror_threshold_in,
    31                   IssmDouble deviatoricerror_resolution_in,IssmDouble deviatoricerror_threshold_in);
     29                AmrBamg();
     30               
    3231                ~AmrBamg();
    3332
     
    3534                void Initialize(int* elements,IssmDouble* x,IssmDouble* y,int numberofvertices,int numberofelements);
    3635                void ExecuteRefinementBamg(IssmDouble* field,IssmDouble* hmaxVertices,int* pnewnumberofvertices,int *pnewnumberofelements,IssmDouble** px,IssmDouble** py,IssmDouble** pz,int** pelementslist);
     36                void SetBamgOpts(IssmDouble hmin_in,IssmDouble hmax_in,IssmDouble err_in,IssmDouble gradation_in);
    3737
    3838        private:
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r22192 r22241  
    26482648                        YC_new[i]+=Ynew[vid];
    26492649                }
    2650                 XC_new[i]=XC_new[i]/3;
    2651                 YC_new[i]=YC_new[i]/3;
     2650                XC_new[i]=XC_new[i]/3.;
     2651                YC_new[i]=YC_new[i]/3.;
    26522652        }
    26532653
     
    30293029                elementslist[elementswidth*i+0] = reCast<int>(id1[i])+1; //InterpMesh wants Matlab indexing
    30303030                elementslist[elementswidth*i+1] = reCast<int>(id2[i])+1; //InterpMesh wants Matlab indexing
    3031                 elementslist[elementswidth*i+2] = reCast<int>(id3[i])+1; //InterpMesh wants Matlab indexinf
     3031                elementslist[elementswidth*i+2] = reCast<int>(id3[i])+1; //InterpMesh wants Matlab indexing
    30323032        }
    30333033       
     
    36083608   Vector<IssmDouble>* vxc              = new Vector<IssmDouble>(numberofelements);
    36093609   Vector<IssmDouble>* vyc              = new Vector<IssmDouble>(numberofelements);
    3610         IssmDouble *x                                   = NULL;
    3611         IssmDouble *y                                   = NULL;
    3612         IssmDouble *z                                   = NULL;
    3613 
    3614         /*Get vertices coordinates*/
    3615         VertexCoordinatesx(&x,&y,&z,this->vertices,false) ;
     3610        IssmDouble* x                                   = NULL;
     3611        IssmDouble* y                                   = NULL;
     3612        IssmDouble* z                                   = NULL;
     3613        IssmDouble* xyz_list                    = NULL;
     3614        IssmDouble x1,y1,x2,y2,x3,y3;
    36163615
    36173616        /*Insert the element center coordinates*/
    36183617   for(int i=0;i<this->elements->Size();i++){
    36193618      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
    3620       element->GetVerticesSidList(elem_vertices);
     3619      //element->GetVerticesSidList(elem_vertices);
    36213620      int sid = element->Sid();
    3622       vxc->SetValue(sid,(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.,INS_VAL);
    3623       vyc->SetValue(sid,(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.,INS_VAL);
     3621                element->GetVerticesCoordinates(&xyz_list);
     3622                x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
     3623                x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
     3624                x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
     3625                vxc->SetValue(sid,(x1+x2+x3)/3.,INS_VAL);
     3626      vyc->SetValue(sid,(y1+y2+y3)/3.,INS_VAL);
    36243627   }
    36253628
     
    36363639        xDelete<IssmDouble>(y);
    36373640        xDelete<IssmDouble>(z);
     3641        xDelete<IssmDouble>(xyz_list);
    36383642   xDelete<int>(elem_vertices);
    36393643   delete vxc;
     
    36583662        int* elem_vertices                                      = xNew<int>(elementswidth);
    36593663   IssmDouble* levelset                                         = xNew<IssmDouble>(elementswidth);
    3660    IssmDouble* x                                                                        = NULL;
    3661    IssmDouble* y                                                                        = NULL;
    3662    IssmDouble* z                                                                        = NULL;
     3664   IssmDouble* xyz_list                                                 = NULL;
    36633665        Vector<IssmDouble>* vx_zerolevelset             = new Vector<IssmDouble>(numberofelements);
    36643666        Vector<IssmDouble>* vy_zerolevelset             = new Vector<IssmDouble>(numberofelements);
     
    36663668        IssmDouble* y_zerolevelset                                      = NULL;
    36673669        int count,sid;
    3668         IssmDouble xcenter,ycenter;
    3669        
    3670         /*Get vertices coordinates*/
    3671         VertexCoordinatesx(&x,&y,&z,this->vertices,false) ;
     3670        IssmDouble xc,yc,x1,y1,x2,y2,x3,y3;
    36723671       
    36733672        /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/
     
    36763675      element->GetInputListOnVertices(levelset,levelset_type);
    36773676                element->GetVerticesSidList(elem_vertices);
    3678                 sid                     = element->Sid();
    3679                 xcenter         = NAN;
    3680                 ycenter         = NAN; 
     3677                sid= element->Sid();
     3678                element->GetVerticesCoordinates(&xyz_list);
     3679                x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
     3680                x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
     3681                x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
     3682                xc      = NAN;
     3683                yc      = NAN; 
    36813684        Tria* tria      = xDynamicCast<Tria*>(element);
    36823685                if(tria->IsIceInElement()){/*verify if there is ice in the element*/
    36833686                        if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 
    36843687                                abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) {
    3685                                 xcenter=(x[elem_vertices[0]]+x[elem_vertices[1]]+x[elem_vertices[2]])/3.;
    3686                                 ycenter=(y[elem_vertices[0]]+y[elem_vertices[1]]+y[elem_vertices[2]])/3.;
     3688                                xc=(x1+x2+x3)/3.;
     3689                                yc=(y1+y2+y3)/3.;
    36873690                        }
    36883691                }
    3689                 vx_zerolevelset->SetValue(sid,xcenter,INS_VAL);
    3690                 vy_zerolevelset->SetValue(sid,ycenter,INS_VAL);
     3692                vx_zerolevelset->SetValue(sid,xc,INS_VAL);
     3693                vy_zerolevelset->SetValue(sid,yc,INS_VAL);
     3694                xDelete<IssmDouble>(xyz_list);
    36913695        }
    36923696   /*Assemble and serialize*/
     
    37203724        xDelete<IssmDouble>(x_zerolevelset);
    37213725        xDelete<IssmDouble>(y_zerolevelset);
    3722    xDelete<IssmDouble>(x);
    3723    xDelete<IssmDouble>(y);
    3724    xDelete<IssmDouble>(z);
     3726   xDelete<IssmDouble>(xyz_list);
    37253727        delete vx_zerolevelset;
    37263728        delete vy_zerolevelset;
     
    44744476                if(this->amrbamg->deviatoricerror_threshold>0)  this->GethmaxVerticesFromEstimators(hmaxvertices_serial,DeviatoricStressErrorEstimatorEnum);
    44754477        }
    4476 
     4478       
    44774479        if(my_rank==0){
    44784480                this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist);
     
    45184520        int* elements             = NULL;
    45194521        IssmDouble hmin,hmax,err,gradation;
    4520         IssmDouble groundingline_resolution,groundingline_distance,icefront_resolution,icefront_distance;
    4521         IssmDouble thicknesserror_resolution,thicknesserror_threshold,deviatoricerror_resolution,deviatoricerror_threshold;
    4522         int        fieldenum,keepmetric;
    45234522
    45244523   /*Get rank*/
     
    45314530        this->GetMesh(this->vertices,this->elements,&x,&y,&z,&elements);
    45324531
     4532        /*Create bamg data structures for bamg*/
     4533        this->amrbamg = new AmrBamg();
     4534       
    45334535        /*Get amr parameters*/
    45344536        this->parameters->FindParam(&hmin,AmrHminEnum);
    45354537        this->parameters->FindParam(&hmax,AmrHmaxEnum);
    4536         this->parameters->FindParam(&fieldenum,AmrFieldEnum);
    45374538        this->parameters->FindParam(&err,AmrErrEnum);
    4538         this->parameters->FindParam(&keepmetric,AmrKeepMetricEnum);
    45394539        this->parameters->FindParam(&gradation,AmrGradationEnum);
    4540         this->parameters->FindParam(&groundingline_resolution,AmrGroundingLineResolutionEnum);
    4541         this->parameters->FindParam(&groundingline_distance,AmrGroundingLineDistanceEnum);
    4542         this->parameters->FindParam(&icefront_resolution,AmrIceFrontResolutionEnum);
    4543         this->parameters->FindParam(&icefront_distance,AmrIceFrontDistanceEnum);
    4544         this->parameters->FindParam(&thicknesserror_resolution,AmrThicknessErrorResolutionEnum);
    4545         this->parameters->FindParam(&thicknesserror_threshold,AmrThicknessErrorThresholdEnum);
    4546         this->parameters->FindParam(&deviatoricerror_resolution,AmrDeviatoricErrorResolutionEnum);
    4547         this->parameters->FindParam(&deviatoricerror_threshold,AmrDeviatoricErrorThresholdEnum);
    4548 
    4549         /*Create bamg data structures for bamg*/
    4550         this->amrbamg = new AmrBamg(hmin,hmax,fieldenum,err,keepmetric,gradation,
    4551                                                                                  groundingline_resolution,groundingline_distance,
    4552                                                                                  icefront_resolution,icefront_distance,
    4553                                                                                  thicknesserror_resolution,thicknesserror_threshold,
    4554                                                                                  deviatoricerror_resolution,deviatoricerror_threshold);
     4540        this->parameters->FindParam(&this->amrbamg->fieldenum,AmrFieldEnum);
     4541        this->parameters->FindParam(&this->amrbamg->keepmetric,AmrKeepMetricEnum);
     4542        this->parameters->FindParam(&this->amrbamg->groundingline_resolution,AmrGroundingLineResolutionEnum);
     4543        this->parameters->FindParam(&this->amrbamg->groundingline_distance,AmrGroundingLineDistanceEnum);
     4544        this->parameters->FindParam(&this->amrbamg->icefront_resolution,AmrIceFrontResolutionEnum);
     4545        this->parameters->FindParam(&this->amrbamg->icefront_distance,AmrIceFrontDistanceEnum);
     4546        this->parameters->FindParam(&this->amrbamg->thicknesserror_resolution,AmrThicknessErrorResolutionEnum);
     4547        this->parameters->FindParam(&this->amrbamg->thicknesserror_threshold,AmrThicknessErrorThresholdEnum);
     4548        this->parameters->FindParam(&this->amrbamg->thicknesserror_maximum,AmrThicknessErrorMaximumEnum);
     4549        this->parameters->FindParam(&this->amrbamg->deviatoricerror_resolution,AmrDeviatoricErrorResolutionEnum);
     4550        this->parameters->FindParam(&this->amrbamg->deviatoricerror_threshold,AmrDeviatoricErrorThresholdEnum);
     4551        this->parameters->FindParam(&this->amrbamg->deviatoricerror_maximum,AmrDeviatoricErrorMaximumEnum);
     4552        /*Set BamgOpts*/
     4553        this->amrbamg->SetBamgOpts(hmin,hmax,err,gradation);
    45554554
    45564555        /*Re-create original mesh and put it in bamg structure (only cpu 0)*/
     
    46084607
    46094608        /*Intermediaries*/
    4610         int numberofelements                            = this->elements->NumberOfElements();
    4611         IssmDouble* error_elements              = NULL;
    4612         IssmDouble *x                                           = NULL;
    4613         IssmDouble *y                                           = NULL;
    4614         IssmDouble *z                                           = NULL;
    4615         int *index                                                      = NULL;
    4616         IssmDouble maxerror,threshold,resolution;
    4617         int vid;
    4618        
     4609        int elementswidth                                                       = this->GetElementsWidth();
     4610        int numberofelements                                            = this->elements->NumberOfElements();
     4611        int numberofvertices                                            = this->vertices->NumberOfVertices();
     4612        IssmDouble* maxlength                                   = xNew<IssmDouble>(numberofelements);
     4613        IssmDouble* error_vertices                              = xNewZeroInit<IssmDouble>(numberofvertices);   
     4614        IssmDouble* error_elements                              = NULL;
     4615        IssmDouble* x                                                           = NULL;
     4616        IssmDouble* y                                                           = NULL;
     4617        IssmDouble* z                                                           = NULL;
     4618        int* index                                                                      = NULL;
     4619        IssmDouble maxerror,threshold,resolution,length;
     4620        IssmDouble L1,L2,L3;
     4621        int vid,v1,v2,v3;
     4622        bool refine;
     4623
     4624        /*Fill variables*/
    46194625        switch(errorestimator_type){
    46204626                case ThicknessErrorEstimatorEnum:
    46214627                        threshold       = this->amrbamg->thicknesserror_threshold;
    46224628                        resolution      = this->amrbamg->thicknesserror_resolution;
    4623                         this->ThicknessZZErrorEstimator(&error_elements);
     4629                        maxerror                = this->amrbamg->thicknesserror_maximum;
     4630                        this->ThicknessZZErrorEstimator(&error_elements);//error is serial, but the calculation is parallel
    46244631                        break;
    46254632                case DeviatoricStressErrorEstimatorEnum:
    46264633                        threshold       = this->amrbamg->deviatoricerror_threshold;
    46274634                        resolution      = this->amrbamg->deviatoricerror_resolution;
    4628                         this->ZZErrorEstimator(&error_elements);
     4635                        maxerror                = this->amrbamg->deviatoricerror_maximum;
     4636                        this->ZZErrorEstimator(&error_elements);//error is serial, but the calculation is parallel
    46294637                        break;
    46304638                default: _error_("not implemented yet");
    46314639        }
    4632 
    46334640        if(!error_elements) _error_("error_elements is NULL!\n");
     4641
     4642        /*Find the max of the estimators if it was not provided*/
     4643        if(maxerror<DBL_EPSILON){
     4644                for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,error_elements[i]);
     4645                switch(errorestimator_type){
     4646        case ThicknessErrorEstimatorEnum:                       this->amrbamg->thicknesserror_maximum   = maxerror;break;
     4647        case DeviatoricStressErrorEstimatorEnum:        this->amrbamg->deviatoricerror_maximum = maxerror;break;
     4648        }       
     4649        }
    46344650
    46354651        /*Get mesh*/
    46364652        this->GetMesh(this->vertices,this->elements,&x,&y,&z,&index);
    4637 
    4638         /*Find the max of the estimators (use error_elements)*/
    4639         maxerror=error_elements[0];
    4640         for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,error_elements[i]);
    4641        
    4642         /*Fill hmaxvertices*/
     4653       
     4654        /*Fill error_vertices (this is the sum of all elements connected to the vertex)*/
    46434655        for(int i=0;i<numberofelements;i++){
    4644                 if(error_elements[i]>threshold*maxerror){
    4645                         /*ok, fill the hmaxvertices using the element vertices*/
    4646                         for(int j=0;j<this->GetElementsWidth();j++){
    4647                                 vid=index[i*this->GetElementsWidth()+j]-1;//Matlab to C indexing
     4656                v1=index[i*elementswidth+0]-1;//Matlab to C indexing
     4657                v2=index[i*elementswidth+1]-1;//Matlab to C indexing
     4658                v3=index[i*elementswidth+2]-1;//Matlab to C indexing
     4659                L1=sqrt(pow(x[v2]-x[v1],2)+pow(y[v2]-y[v1],2));
     4660                L2=sqrt(pow(x[v3]-x[v2],2)+pow(y[v3]-y[v2],2));
     4661                L3=sqrt(pow(x[v1]-x[v3],2)+pow(y[v1]-y[v3],2));
     4662                /*Fill the vectors*/
     4663                maxlength[i]            =max(L1,max(L2,L3));
     4664                error_vertices[v1]+=error_elements[i];
     4665                error_vertices[v2]+=error_elements[i];
     4666                error_vertices[v3]+=error_elements[i];
     4667        }       
     4668
     4669        /*Fill hmaxvertices with the criteria*/
     4670        for(int i=0;i<numberofelements;i++){
     4671                refine=false;
     4672                /*Refine any element if its error > phi*maxerror*/
     4673                if(error_elements[i]>threshold*maxerror) refine=true;
     4674                /*If the element size is closer to the resolution, verify the sum of error in the vertices*/
     4675                if(resolution/maxlength[i]>0.85){
     4676                        for(int j=0;j<elementswidth;j++){
     4677                                vid=index[i*elementswidth+j]-1;//Matlab to C indexing
     4678                                if(error_vertices[vid]>0.005*maxerror) refine=true;//itapopo must be better defined
     4679                        }
     4680                }
     4681                /*Now, fill the hmaxvertices if requested*/       
     4682                if(refine){
     4683                        for(int j=0;j<elementswidth;j++){
     4684                                vid=index[i*elementswidth+j]-1;//Matlab to C indexing
    46484685                                if(xIsNan<IssmDouble>(hmaxvertices[vid])) hmaxvertices[vid]=resolution;
    46494686                                else hmaxvertices[vid]=min(resolution,hmaxvertices[vid]);
     
    46584695        xDelete<int>(index);
    46594696   xDelete<IssmDouble>(error_elements);
     4697   xDelete<IssmDouble>(error_vertices);
     4698   xDelete<IssmDouble>(maxlength);
    46604699}
    46614700/*}}}*/
     
    47144753   int my_rank                                          = IssmComm::GetRank();
    47154754   int numberofelements                 = this->elements->NumberOfElements();
    4716         IssmDouble* element_label       = xNewZeroInit<IssmDouble>(numberofelements);
    4717         int numberofpoints                      = -1;
    4718         IssmDouble* xylist                      = NULL;
     4755        IssmDouble* gl_distance         = NULL;
     4756        IssmDouble* if_distance         = NULL;
     4757        IssmDouble* deviatoricerror= NULL;
     4758        IssmDouble* thicknesserror      = NULL;
    47194759        IssmDouble* newx                                = NULL;
    47204760   IssmDouble* newy                             = NULL;
     
    47244764        int newnumberofelements         = -1;
    47254765
    4726         /*Get element_label, if requested*/
    4727         if(this->amr->groundingline_distance>0)         this->GetElementLabelFromZeroLevelSet(element_label,MaskGroundediceLevelsetEnum);
    4728    if(this->amr->icefront_distance>0)                           this->GetElementLabelFromZeroLevelSet(element_label,MaskIceLevelsetEnum);
    4729    if(this->amr->thicknesserror_threshold>0)            this->GetElementLabelFromEstimators(element_label,ThicknessErrorEstimatorEnum);
    4730    if(this->amr->deviatoricerror_threshold>0)   this->GetElementLabelFromEstimators(element_label,DeviatoricStressErrorEstimatorEnum);
    4731         this->GetPointsFromElementLabel(element_label,&numberofpoints,&xylist);
    4732 
     4766        /*Get fields, if requested*/
     4767        if(this->amr->groundingline_distance>0)         this->GetElementDistanceToZeroLevelSet(&gl_distance,MaskGroundediceLevelsetEnum);
     4768   if(this->amr->icefront_distance>0)                           this->GetElementDistanceToZeroLevelSet(&if_distance,MaskIceLevelsetEnum);
     4769   if(this->amr->thicknesserror_threshold>0)            this->ThicknessZZErrorEstimator(&thicknesserror);       
     4770        if(this->amr->deviatoricerror_threshold>0)      this->ZZErrorEstimator(&deviatoricerror);       
     4771       
    47334772        if(my_rank==0){
    4734                 this->amr->ExecuteRefinement(numberofpoints,xylist,&newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist);
    4735       newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
     4773                this->amr->ExecuteRefinement(gl_distance,if_distance,deviatoricerror,thicknesserror,
     4774                                                                                                &newnumberofvertices,&newnumberofelements,&newx,&newy,&newelementslist);
     4775                newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
    47364776                if(newnumberofvertices<=0 || newnumberofelements<=0) _error_("Error in the ReMeshNeopz.");
    47374777        }
     
    47604800
    47614801        /*Cleanup*/
    4762         xDelete<IssmDouble>(element_label);
    4763         xDelete<IssmDouble>(xylist);
     4802        xDelete<IssmDouble>(deviatoricerror);
     4803        xDelete<IssmDouble>(thicknesserror);
     4804        xDelete<IssmDouble>(gl_distance);
     4805        xDelete<IssmDouble>(if_distance);
    47644806}
    47654807/*}}}*/
     
    48054847        this->SetRefPatterns();
    48064848        this->amr = new AdaptiveMeshRefinement();
     4849        this->amr->refinement_type                                      = 1;//1 is refpattern; 0 is uniform (faster)
    48074850        this->amr->level_max                                                    = level_max;
    48084851        this->amr->radius_level_max                             = radius_level_max;
     
    48244867}
    48254868/*}}}*/
    4826 void FemModel::GetPointsFromElementLabel(IssmDouble* element_label,int* pnumberofpoints,IssmDouble** pxylist){/*{{{*/
    4827 
    4828         if(!element_label) _error_("element_label is NULL!\n");
    4829 
    4830         /*Outputs*/
    4831         int numberofpoints      = -1;
    4832         IssmDouble* xylist      = NULL;
    4833 
    4834         /*Intermediaries*/
    4835    int numberofelements = this->elements->NumberOfElements();
    4836         int count                               = -1;
    4837    IssmDouble* xc                       = NULL;
    4838    IssmDouble* yc                       = NULL;
    4839 
    4840         /*First, find the number of labeled elements (points)*/
    4841         count=0;
    4842         for(int i=0;i<numberofelements;i++){
    4843                 if(element_label[i]>DBL_EPSILON) count++;
    4844         }
    4845          
    4846         /*Set number of points*/
    4847         numberofpoints=count;
    4848         if(count>0) xylist=xNew<IssmDouble>(2*numberofpoints);
    4849        
    4850         /*Get element center coordinates*/
    4851         this->GetElementCenterCoordinates(&xc,&yc);
    4852 
    4853         /*Now, fill xylist data*/
    4854         count=0;
    4855         for(int i=0;i<numberofelements;i++){
    4856                 if(element_label[i]>DBL_EPSILON){
    4857                         xylist[2*count] = xc[i];                       
    4858                         xylist[2*count+1]       = yc[i];
    4859                         count++;
    4860                 }
    4861         }
    4862 
    4863         /*Assign pointers*/
    4864         (*pxylist)=xylist;
    4865         *pnumberofpoints=numberofpoints;
    4866 
    4867         /*Cleanup*/
    4868         xDelete<IssmDouble>(xc);
    4869         xDelete<IssmDouble>(yc);
    4870 }
    4871 /*}}}*/
    4872 void FemModel::GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type){/*{{{*/
    4873 
    4874         /*Here, "zero level set" means grounding line or ice front, depending on the level set type*/
    4875         /*element_label is 1 if the element zero level set, NAN otherwise*/
    4876         if(levelset_type!=MaskGroundediceLevelsetEnum && levelset_type!=MaskIceLevelsetEnum) _error_("level set type not implemented yet!");
    4877         if(!element_label) _error_("element_label is NULL!\n");
    4878        
    4879         /*Intermediaries*/
    4880         int elementswidth                       = this->GetElementsWidth();
    4881    int numberofelements                 = this->elements->NumberOfElements();
    4882         int* elem_vertices                                      = xNew<int>(elementswidth);
    4883    IssmDouble* levelset                                         = xNew<IssmDouble>(elementswidth);
    4884         Vector<IssmDouble>* velement_label              = new Vector<IssmDouble>(numberofelements);
    4885         IssmDouble* element_label_serial                        = NULL;
    4886         int sid                                                                                 = -1;
    4887         IssmDouble label                                                                = -1.;
    4888 
    4889         /*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/
    4890    for(int i=0;i<this->elements->Size();i++){
    4891       Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
    4892       element->GetInputListOnVertices(levelset,levelset_type);
    4893                 element->GetVerticesSidList(elem_vertices);
    4894                 sid     = element->Sid();
    4895                 label = NAN;   
    4896         Tria* tria      = xDynamicCast<Tria*>(element);
    4897                 if(tria->IsIceInElement()){/*verify if there is ice in the element*/
    4898                         if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. || 
    4899                                 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) {
    4900                                 label=1.;
    4901                         }
    4902                 }
    4903                 velement_label->SetValue(sid,label,INS_VAL);
    4904         }
    4905    
    4906         /*Assemble and serialize*/
    4907    velement_label->Assemble();
    4908    element_label_serial=velement_label->ToMPISerial();
    4909 
    4910         /*Merge with the output*/
    4911    for(int i=0;i<numberofelements;i++){
    4912                 if(!xIsNan<IssmDouble>(element_label_serial[i])) element_label[i]=element_label_serial[i];
    4913                 else; //do nothing
    4914         }
    4915 
    4916         /*Cleanup*/
    4917         xDelete<int>(elem_vertices);
    4918    xDelete<IssmDouble>(levelset);
    4919    xDelete<IssmDouble>(element_label_serial);
    4920         delete velement_label;
    4921 }
    4922 /*}}}*/
    4923 void FemModel::GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type){/*{{{*/
    4924 
    4925         /*element_label is 1 if the element zero level set, NAN otherwise*/
    4926         if(!element_label) _error_("element_label is NULL!\n");
    4927        
    4928         /*Intermediaries*/
    4929    int numberofelements                 = this->elements->NumberOfElements();
    4930    IssmDouble* elementerror     = NULL;
    4931         IssmDouble threshold                    = -1.;
    4932         IssmDouble maxerror                     = -1.;
    4933 
    4934         switch(estimator_type){
    4935                 case ThicknessErrorEstimatorEnum:
    4936                         threshold=this->amr->thicknesserror_threshold;
    4937                         this->ThicknessZZErrorEstimator(&elementerror);
    4938                         break;
    4939                 case DeviatoricStressErrorEstimatorEnum:
    4940                         threshold=this->amr->deviatoricerror_threshold;
    4941                         this->ZZErrorEstimator(&elementerror);
    4942                         break;
    4943                 default: _error_("not implemented yet");
    4944         }
    4945 
    4946         /*Find the max of the estimators*/
    4947         maxerror=elementerror[0];
    4948         for(int i=0;i<numberofelements;i++) maxerror=max(maxerror,elementerror[i]);
    4949        
    4950         /*Merge with the output*/
    4951    for(int i=0;i<numberofelements;i++){
    4952                 if(elementerror[i]>threshold*maxerror) element_label[i]=1.;
    4953                 else; //do nothing
    4954         }
    4955 
    4956         /*Cleanup*/
    4957         xDelete<IssmDouble>(elementerror);
    4958 }
    4959 /*}}}*/
    49604869void FemModel::GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type){/*{{{*/
    49614870
     
    49704879       
    49714880        /*Intermediaries*/
    4972    int numberofelements       = this->elements->NumberOfElements();
    4973    IssmDouble* levelset_points= NULL;
    4974    IssmDouble* xc                                       = NULL;
    4975    IssmDouble* yc                                       = NULL;
     4881   int numberofelements                                                 = this->elements->NumberOfElements();
     4882   Vector<IssmDouble>* velementdistance = new Vector<IssmDouble>(numberofelements);
     4883   IssmDouble* levelset_points                          = NULL;
     4884        IssmDouble* xyz_list                                                    = NULL;
     4885        IssmDouble mindistance,distance;
     4886        IssmDouble xc,yc,x1,y1,x2,y2,x3,y3;
    49764887        int numberofpoints;
    4977         IssmDouble distance;
    4978 
    4979         /*Get element center coordinates*/
    4980         this->GetElementCenterCoordinates(&xc,&yc);
    4981        
    4982         /*Get points which level set is zero (center of elements with zero level set)*/
     4888       
     4889        /*Get points which level set is zero (center of elements with zero level set, levelset_points is serial)*/     
    49834890        this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type);
    49844891
    4985         /*Find the minimal element distance to the zero levelset (grounding line or ice front)*/
    4986         elementdistance=xNew<IssmDouble>(numberofelements);
    4987         for(int i=0;i<numberofelements;i++){
    4988                 elementdistance[i]=INFINITY;
     4892        for(int i=0;i<this->elements->Size();i++){//parallel
     4893      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
     4894      int sid = element->Sid();
     4895                element->GetVerticesCoordinates(&xyz_list);
     4896                x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
     4897                x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
     4898                x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
     4899                xc = (x1+x2+x3)/3.;
     4900                yc = (y1+y2+y3)/3.;
     4901                mindistance=INFINITY;
     4902                /*Loop over each point (where level set is zero)*/
    49894903                for(int j=0;j<numberofpoints;j++){
    4990                         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]));
    4991                         elementdistance[i]=min(distance,elementdistance[i]);           
    4992                 }
     4904                        distance =sqrt((xc-levelset_points[2*j])*(xc-levelset_points[2*j])+(yc-levelset_points[2*j+1])*(yc-levelset_points[2*j+1]));
     4905                        mindistance=min(distance,mindistance);         
     4906                }
     4907                velementdistance->SetValue(sid,mindistance,INS_VAL);
     4908                xDelete<IssmDouble>(xyz_list);
    49934909        }       
    49944910
     4911   /*Assemble*/
     4912   velementdistance->Assemble();
     4913
    49954914        /*Assign the pointer*/
    4996         (*pelementdistance)=elementdistance;
     4915        (*pelementdistance)=velementdistance->ToMPISerial();
    49974916
    49984917        /*Cleanup*/
    49994918   xDelete<IssmDouble>(levelset_points);
    5000    xDelete<IssmDouble>(xc);
    5001    xDelete<IssmDouble>(yc);
     4919   xDelete<IssmDouble>(xyz_list);
     4920        delete velementdistance;
    50024921}
    50034922/*}}}*/
  • issm/trunk-jpl/src/c/classes/FemModel.h

    r22192 r22241  
    193193                void ReMeshNeopz(int* pnewnumberofvertices,int* pnewnumberofelements,IssmDouble** pnewx,IssmDouble** pnewy,IssmDouble** pnewz,int** pnewelementslist);
    194194                void InitializeAdaptiveRefinementNeopz(void);
    195                 void GetPointsFromElementLabel(IssmDouble* element_label,int* numberofpoints,IssmDouble** xylist);
    196                 void GetElementLabelFromZeroLevelSet(IssmDouble* element_label,int levelset_type);
    197                 void GetElementLabelFromEstimators(IssmDouble* element_label,int estimator_type);       
    198195                void GetElementDistanceToZeroLevelSet(IssmDouble** pelementdistance,int levelset_type);
    199196                void SetRefPatterns(void);
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r21978 r22241  
    2626        int        output_frequency;
    2727        int        recording_frequency;
    28         int        domaintype,groundingline_migration,smb_model,amr_frequency;
     28        int        domaintype,groundingline_migration,smb_model,amr_frequency,amr_restart;
    2929        int        numoutputs;
    3030        Analysis  *analysis          = NULL;
     
    6565        if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
    6666
    67         #ifdef _HAVE_NEOPZ_
    68         bool ismismip = false;//itapopo testing restart
    69         if(ismismip) femmodel->ReMesh();
     67        #ifdef _HAVE_BAMG_ //#ifdef _HAVE_NEOPZ_ itapopo
     68        if(amr_frequency){
     69                femmodel->parameters->FindParam(&amr_restart,AmrRestartEnum);
     70                if(amr_restart) femmodel->ReMesh();
     71        }
    7072        #endif
    7173
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r22136 r22241  
    136136                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.icefront_distance",AmrIceFrontDistanceEnum));
    137137                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_threshold",AmrThicknessErrorThresholdEnum));
     138                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_maximum",AmrThicknessErrorMaximumEnum));
    138139                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_threshold",AmrDeviatoricErrorThresholdEnum));
     140                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_maximum",AmrDeviatoricErrorMaximumEnum));
     141                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.restart",AmrRestartEnum));
    139142                                break;
    140143                        #endif
     
    153156                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_resolution",AmrThicknessErrorResolutionEnum));
    154157                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_threshold",AmrThicknessErrorThresholdEnum));
     158                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.thicknesserror_maximum",AmrThicknessErrorMaximumEnum));
    155159                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_resolution",AmrDeviatoricErrorResolutionEnum));
    156160                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_threshold",AmrDeviatoricErrorThresholdEnum));
     161                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.deviatoricerror_maximum",AmrDeviatoricErrorMaximumEnum));
     162                                parameters->AddObject(iomodel->CopyConstantObject("md.amr.restart",AmrRestartEnum));
    157163                                /*Convert fieldname to enum and put it in params*/
    158164                                iomodel->FindConstant(&fieldname,"md.amr.fieldname");
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22200 r22241  
    870870        TransientAmrFrequencyEnum,
    871871        AmrTypeEnum,
     872        AmrRestartEnum,
    872873        AmrNeopzEnum,
    873874        AmrLevelMaxEnum,
     
    887888        AmrThicknessErrorResolutionEnum,
    888889        AmrThicknessErrorThresholdEnum,
     890        AmrThicknessErrorMaximumEnum,
    889891        AmrDeviatoricErrorResolutionEnum,
    890892        AmrDeviatoricErrorThresholdEnum,
     893        AmrDeviatoricErrorMaximumEnum,
    891894        DeviatoricStressErrorEstimatorEnum,
    892895        ThicknessErrorEstimatorEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22200 r22241  
    843843                case TransientAmrFrequencyEnum : return "TransientAmrFrequency";
    844844                case AmrTypeEnum : return "AmrType";
     845                case AmrRestartEnum : return "AmrRestart";
    845846                case AmrNeopzEnum : return "AmrNeopz";
    846847                case AmrLevelMaxEnum : return "AmrLevelMax";
     
    860861                case AmrThicknessErrorResolutionEnum : return "AmrThicknessErrorResolution";
    861862                case AmrThicknessErrorThresholdEnum : return "AmrThicknessErrorThreshold";
     863                case AmrThicknessErrorMaximumEnum : return "AmrThicknessErrorMaximum";
    862864                case AmrDeviatoricErrorResolutionEnum : return "AmrDeviatoricErrorResolution";
    863865                case AmrDeviatoricErrorThresholdEnum : return "AmrDeviatoricErrorThreshold";
     866                case AmrDeviatoricErrorMaximumEnum : return "AmrDeviatoricErrorMaximum";
    864867                case DeviatoricStressErrorEstimatorEnum : return "DeviatoricStressErrorEstimator";
    865868                case ThicknessErrorEstimatorEnum : return "ThicknessErrorEstimator";
  • issm/trunk-jpl/src/m/classes/amr.js

    r22100 r22241  
    1919      this.thicknesserror_resolution    = 500;
    2020      this.thicknesserror_threshold     = 0;
     21      this.thicknesserror_maximum               = 0;
    2122      this.deviatoricerror_resolution   = 500; 
    2223      this.deviatoricerror_threshold    = 0;   
     24      this.deviatoricerror_maximum              = 0;   
    2325        }// }}}
    2426        this.disp= function(){// {{{
     
    3537                fielddisplay(this,'thicknesserror_resolution','element length when thickness error estimator is used');
    3638                fielddisplay(this,'thicknesserror_threshold','maximum threshold thickness error permitted');
     39                fielddisplay(this,'thicknesserror_maximum','maximum thickness error permitted');
    3740                fielddisplay(this,'deviatoricerror_resolution','element length when deviatoric stress error estimator is used');
    3841                fielddisplay(this,'deviatoricerror_threshold','maximum threshold deviatoricstress error permitted');
     42                fielddisplay(this,'deviatoricerror_maximum','maximum deviatoricstress error permitted');
    3943        }// }}}
    4044        this.classname= function(){// {{{
     
    5357         checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1);
    5458         checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);
     59         checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
    5560         checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',this.hmax,'NaN',1);
    5661         checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);
     62         checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
    5763                } // }}}
    5864                this.marshall=function(md,prefix,fid) { //{{{
     
    7076         WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_resolution','format','Double');
    7177         WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_threshold','format','Double');
     78         WriteData(fid,prefix,'object',this,'fieldname','thicknesserror_maximum','format','Double');
    7279         WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_resolution','format','Double');
    7380         WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_threshold','format','Double');
     81         WriteData(fid,prefix,'object',this,'fieldname','deviatoricerror_maximum','format','Double');
    7482                }//}}}
    7583                this.fix=function() { //{{{
     
    8997        this.thicknesserror_resolution  = 0.;
    9098        this.thicknesserror_threshold           = 0.;
     99        this.thicknesserror_maximum             = 0.;
    91100        this.deviatoricerror_resolution = 0.;
    92101        this.deviatoricerror_threshold  = 0.;
     102        this.deviatoricerror_maximum            = 0.;
    93103
    94104        this.setdefaultparameters();
  • issm/trunk-jpl/src/m/classes/amr.m

    r22100 r22241  
    1818                thicknesserror_resolution = 0.;
    1919                thicknesserror_threshold = 0.;
     20                thicknesserror_maximum = 0.;
    2021                deviatoricerror_resolution = 0.;
    2122                deviatoricerror_threshold = 0.;
     23                deviatoricerror_maximum = 0.;
     24                restart=0.;
    2225        end
    2326        methods (Static)
     
    8689                        self.thicknesserror_resolution=500.;
    8790                        self.thicknesserror_threshold=0.;
     91                        self.thicknesserror_maximum=0.;
    8892                        self.deviatoricerror_resolution=500.;
    8993                        self.deviatoricerror_threshold=0.;
     94                        self.deviatoricerror_maximum=0.;
     95                       
     96                        %is restart? This calls femmodel->ReMesh() before first time step.
     97                        self.restart=0;
    9098
    9199                end % }}}
     
    103111                        md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1);
    104112                        md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);
     113                        md = checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
    105114                        md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1);
    106115                        md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);
     116                        md = checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
     117                        md = checkfield(md,'fieldname','amr.restart','numel',[1],'>=',0,'<=',1,'NaN',1);
    107118                end % }}}
    108119                function disp(self) % {{{
     
    120131                        fielddisplay(self,'thicknesserror_resolution',['element length when thickness error estimator is used']);
    121132                        fielddisplay(self,'thicknesserror_threshold',['maximum threshold thickness error permitted']);
     133                        fielddisplay(self,'thicknesserror_maximum',['maximum thickness error permitted']);
    122134                        fielddisplay(self,'deviatoricerror_resolution',['element length when deviatoric stress error estimator is used']);
    123135                        fielddisplay(self,'deviatoricerror_threshold',['maximum threshold deviatoricstress error permitted']);
    124 
     136                        fielddisplay(self,'deviatoricerror_maximum',['maximum deviatoricstress error permitted']);
     137                        fielddisplay(self,'restart',['indicates if ReMesh() will call before first time step']);
    125138                end % }}}
    126139                function marshall(self,prefix,md,fid) % {{{
     
    139152                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_resolution','format','Double');
    140153                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_threshold','format','Double');
     154                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','thicknesserror_maximum','format','Double');
    141155                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_resolution','format','Double');
    142156                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_threshold','format','Double');
     157                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','deviatoricerror_maximum','format','Double');
     158                        WriteData(fid,prefix,'object',self,'class','amr','fieldname','restart','format','Integer');
    143159
    144160                end % }}}
  • issm/trunk-jpl/src/m/classes/amr.py

    r22100 r22241  
    2424        self.thicknesserror_resolution = 0.
    2525        self.thicknesserror_threshold   = 0.
     26        self.thicknesserror_maximum     = 0.
    2627        self.deviatoricerror_resolution= 0.
    2728        self.deviatoricerror_threshold = 0.
     29        self.deviatoricerror_maximum    = 0.
    2830        #set defaults
    2931        self.setdefaultparameters()
     
    4244        string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_resolution","element length when thickness error estimator is used"))
    4345        string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_threshold","maximum threshold thickness error permitted"))
     46        string="%s\n%s"%(string,fielddisplay(self,"thicknesserror_maximum","maximum thickness error permitted"))
    4447        string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_resolution","element length when deviatoric stress error estimator is used"))
    4548        string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_threshold","maximum threshold deviatoricstress error permitted"))
     49        string="%s\n%s"%(string,fielddisplay(self,"deviatoricerror_maximum","maximum deviatoricstress error permitted"))
    4650        return string
    4751    #}}}
     
    5963        self.thicknesserror_resolution = 500.
    6064        self.thicknesserror_threshold   = 0
     65        self.thicknesserror_maximum     = 0
    6166        self.deviatoricerror_resolution= 500.
    6267        self.deviatoricerror_threshold = 0
     68        self.deviatoricerror_maximum    = 0
    6369        return self
    6470    #}}}
     
    7480        md = checkfield(md,'fieldname','amr.thicknesserror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1);
    7581        md = checkfield(md,'fieldname','amr.thicknesserror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);
     82        md = checkfield(md,'fieldname','amr.thicknesserror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
    7683        md = checkfield(md,'fieldname','amr.deviatoricerror_resolution','numel',[1],'>',0,'<',self.hmax,'NaN',1);
    7784        md = checkfield(md,'fieldname','amr.deviatoricerror_threshold','numel',[1],'>=',0,'<=',1,'NaN',1);       
     85        md = checkfield(md,'fieldname','amr.deviatoricerror_maximum','numel',[1],'>=',0,'NaN',1,'Inf',1);
    7886        return md
    7987    # }}}
     
    92100        WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_resolution','format','Double');
    93101        WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_threshold','format','Double');
     102        WriteData(fid,prefix,'object',self,'fieldname','thicknesserror_maximum','format','Double');
    94103        WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_resolution','format','Double');
    95104        WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_threshold','format','Double');
     105        WriteData(fid,prefix,'object',self,'fieldname','deviatoricerror_maximum','format','Double');
    96106    # }}}
  • issm/trunk-jpl/src/m/contrib/tsantos/AMRexportVTK.m

    r21806 r22241  
    6060       
    6161        timestep=step;
    62 
    63         points=[model.results.TransientSolution(step).MeshX model.results.TransientSolution(step).MeshY zeros(size(model.results.TransientSolution(step).MeshX))];
     62        if(isfield(model.results.TransientSolution,'MeshElements'))
     63        index = model.results.TransientSolution(step).MeshElements;
     64        x     = model.results.TransientSolution(step).MeshX;
     65        y     = model.results.TransientSolution(step).MeshY;
     66   else
     67        index = model.mesh.elements;
     68        x     = model.mesh.x;
     69        y     = model.mesh.y;
     70   end
     71       
     72        points=[x y zeros(size(x))];
    6473        [num_of_points,dim]=size(points);
    65         [num_of_elt]=size(model.results.TransientSolution(step).MeshElements,1);
     74        [num_of_elt]=size(index,1);
    6675
    6776        fid = fopen(strcat(path,filesep,name,filesep,'timestep.vtk',int2str(timestep),'.vtk'),'w+');
     
    8695  end
    8796        s=cell2mat(horzcat(s,{'\n'}));
    88                 fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1)       model.results.TransientSolution(step).MeshElements-1]');
     97                fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1) index-1]');
    8998       
    9099        fprintf(fid,'CELL_TYPES %d\n',num_of_elt);
  • issm/trunk-jpl/src/m/contrib/tsantos/mismip/gl_position.m

    r21707 r22241  
    33                %initialization of some variables
    44                data                                    = md.results.TransientSolution(step).MaskGroundediceLevelset;
    5                 index                                   = md.results.TransientSolution(step).MeshElements;
    6                 x                                               = md.results.TransientSolution(step).MeshX;
    7                 y                                               = md.results.TransientSolution(step).MeshY;
     5                if(isfield(md.results.TransientSolution,'MeshElements'))
     6                        index                                   = md.results.TransientSolution(step).MeshElements;
     7                        x                                               = md.results.TransientSolution(step).MeshX;
     8                        y                                               = md.results.TransientSolution(step).MeshY;
     9                else
     10                        index                                   = md.mesh.elements;
     11                        x                                               = md.mesh.x;
     12                        y                                               = md.mesh.y;
     13                end
    814                numberofelements        = size(index,1);
    915                elementslist            = 1:numberofelements;
  • issm/trunk-jpl/src/m/contrib/tsantos/mismip/ice_evolution.m

    r21707 r22241  
    22%iv: ice volume
    33%ivaf: ice volume above floatation
    4 %GLy40 : grounding line position @ y=40km
     4%GL_y : grounding line position @ y (y comes in m)
    55%nelem : number of elements
     6% usage:
     7%
     8% Default: y=40km, i0=1
     9% [ga iv ivaf GL_y nelem t] = ice_evolution(md);
     10%
     11% Default: y=40km
     12% [ga iv ivaf GL_y nelem t] = ice_evolution(md,i0);
     13%
     14% Use this for y the borders (y=0 or y=ymax)
     15% [ga iv ivaf GL_y nelem t] = ice_evolution(md,i0,y);
     16%
     17%
    618
    7 function [ga iv ivaf GLy40 nelem t] = ice_evolution(md),
     19function [ga iv ivaf GL_y nelem t] = ice_evolution(varargin),
    820
    921        ga                      = [];
    1022        iv                      = [];
    1123        ivaf            = [];
    12         GLy40           = [];
     24        GL_y            = [];
    1325        nelem           = [];
    1426        t                       = [];
     27
     28        if(nargin==0)
     29                error('it is necessary the model!')
     30        elseif(nargin==1)
     31                % Defoult is y=40km
     32                i0      = 1;
     33                y0      = 35000;
     34                y1 = 45000;
     35                dy = 100;
     36                y  = 40000;
     37        elseif(nargin==2)
     38                i0=varargin{2};
     39                % Defoult is y=40km
     40                y0      = 35000;
     41                y1 = 45000;
     42                dy = 100;
     43                y  = 40000;
     44        elseif(nargin==3)
     45                i0 = varargin{2};
     46                y  = varargin{3};
     47                dy = 10;
     48                y0      = y-dy;
     49                y1 = y+dy;
     50        else
     51                error('number of inputs is more than 3');
     52        end
     53        %set the model
     54        md                      =varargin{1};
    1555        nsteps  = length(md.results.TransientSolution);
    1656
    17         for i=1:nsteps,
     57
     58        for i=i0:nsteps,
    1859                ga(i)                   = md.results.TransientSolution(i).GroundedArea;
    1960                iv(i)                   = md.results.TransientSolution(i).IceVolume;
    2061                ivaf(i)         = md.results.TransientSolution(i).IceVolumeAboveFloatation;
    21                 nelem(i)                = size(md.results.TransientSolution(i).MeshElements,1);
     62                if(isfield(md.results.TransientSolution,'MeshElements'))
     63                        nelem(i)                = size(md.results.TransientSolution(i).MeshElements,1);
     64                else
     65                        nelem(i)                = md.mesh.numberofelements;
     66                end
    2267                t(i)                    = md.results.TransientSolution(i).time;
    23                 %find GL position at y=40km
     68                %find GL position between y0 and y1
    2469                [glx gly]       = gl_position(md,i,0);
    25                 pos=find(gly<45000 & gly > 35000);
    26                 x=gly(pos);
    27                 v=glx(pos);
    28                 xq=[38000:100:42000];
    29                 vq = interp1(x,v,xq,'linear');
    30                 pos=find(xq==40000);
    31                 GLy40(i)=vq(pos);
     70                pos                     = find(gly<y1 & gly>y0);
     71                x                               = gly(pos);
     72                v                               = glx(pos);
     73                if(length(pos)==0)
     74                        error('pos is null')
     75                elseif(length(pos)==1)
     76                        %this should be used for y=0 or y=ymax
     77                        GL_y(i) = v;
     78                else
     79                        %this should be used when y is inside the domain; so, use linear interpolation
     80                        xq                      = [y0:dy:y1];
     81                        vq                      = interp1(x,v,xq,'linear');
     82                        pos             = find(xq==y);
     83                        if(pos)
     84                                GL_y(i) = vq(pos);
     85                        else
     86                                error('pos is null')
     87                        end
     88                end
     89
    3290        end
    3391
  • issm/trunk-jpl/src/m/contrib/tsantos/remesh.m

    r21678 r22241  
    5858NewModel.geometry.surface                               = md.results.TransientSolution(end).Surface;
    5959NewModel.geometry.base                                  = md.results.TransientSolution(end).Base;
    60 %NewModel.geometry.bed                                  = md.geometry.bed; %use from parameterize
     60NewModel.geometry.bed                                   = md.results.TransientSolution(end).Bed;%md.geometry.bed; %use from parameterize
    6161NewModel.geometry.thickness                     = md.results.TransientSolution(end).Thickness;
    6262NewModel.mask.groundedice_levelset  = md.results.TransientSolution(end).MaskGroundediceLevelset;
     
    7272NewModel.cluster                = md.cluster;
    7373NewModel.transient              = md.transient;
     74NewModel.amr                    = md.amr;
    7475
    7576mdOut = NewModel;
Note: See TracChangeset for help on using the changeset viewer.