197 int numberofcriteria =-1;
198 int nconformelements = this->
sid2index.size();
199 double gl_distance_h =-1;
201 double if_distance_h =-1;
203 double gl_groupdistance =-1;
204 double if_groupdistance =-1;
205 double d_maxerror =-1;
206 double t_maxerror =-1;
207 double deviatoric_grouperror =-1;
208 double thickness_grouperror =-1;
209 TPZGeoMesh* gmesh = NULL;
210 TPZVec<REAL> qsi(2,0.),cp(3,0.);
211 TPZVec<TPZGeoEl*> sons;
212 std::vector<int> index;
235 if(!gmesh->Element(this->specialelementsindex[i]))
_error_(
"element is null!\n");
236 if(!gmesh->Element(this->specialelementsindex[i])->Father())
_error_(
"father is null!\n");
237 if(gmesh->Element(this->specialelementsindex[i])->HasSubElement())
_error_(
"special element has sub elements!\n");
241 gl_distance_h = gl_distance_hmax*std::pow(this->
gradation,this->
level_max-gmesh->Element(this->specialelementsindex[i])->Level());
242 if_distance_h = if_distance_hmax*std::pow(this->
gradation,this->
level_max-gmesh->Element(this->specialelementsindex[i])->Level());
246 gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0;
247 for(
int s=0;s<sons.size();s++){
257 if(this->
icefront_distance>0 && if_groupdistance<if_distance_h+DBL_EPSILON) criteria++;
261 if(criteria) index.push_back(gmesh->Element(this->specialelementsindex[i])->FatherIndex());
278 if(verbose)
_printf_(
"\tunrefinement process...\n");
282 nelem=gmesh->NElements();
283 for(
int i=0;i<nelem;i++){
284 if(!gmesh->Element(i))
continue;
285 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID())
continue;
286 if(gmesh->Element(i)->HasSubElement())
continue;
287 if(gmesh->Element(i)->Level()==0)
continue;
288 if(!gmesh->Element(i)->Father())
_error_(
"father is NULL!\n");
290 gl_distance_h = this->
lag*gl_distance_hmax*std::pow(this->
gradation,this->
level_max-gmesh->Element(i)->Level());
291 if_distance_h = this->
lag*if_distance_hmax*std::pow(this->
gradation,this->
level_max-gmesh->Element(i)->Level());
296 gmesh->Element(i)->Father()->GetHigherSubElements(sons);
297 if(sons.size()!=4)
continue;
299 gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=0;thickness_grouperror=0;
300 for(
int s=0;s<sons.size();s++){
303 if(sid<0){gl_groupdistance=INFINITY;if_groupdistance=INFINITY;deviatoric_grouperror=INFINITY;thickness_grouperror=INFINITY;
continue;}
313 if(this->
icefront_distance>0 && if_groupdistance>if_distance_h-DBL_EPSILON) criteria++;
317 if(criteria==numberofcriteria){
318 gmesh->Element(i)->Father()->ResetSubElements(); count++;
319 for(
int s=0;s<sons.size();s++){this->
index2sid[sons[s]->Index()]=-1;gmesh->DeleteElement(sons[s],sons[s]->Index());}
322 if(verbose)
_printf_(
""<<count<<
"\n");
328 if(verbose)
_printf_(
"\trefinement process (level max = "<<this->
level_max<<
")\n");
331 nelem=gmesh->NElements();
332 for(
int i=0;i<nelem;i++){
333 if(!gmesh->Element(i))
continue;
334 if(gmesh->Element(i)->MaterialId()!=this->GetElemMaterialID())
continue;
335 if(gmesh->Element(i)->HasSubElement())
continue;
336 if(gmesh->Element(i)->Level()==this->level_max)
continue;
338 sid=this->
index2sid[gmesh->Element(i)->Index()];
341 gl_distance_h = gl_distance_hmax*std::pow(this->
gradation,this->
level_max-(gmesh->Element(i)->Level()+1));
342 if_distance_h = if_distance_hmax*std::pow(this->
gradation,this->
level_max-(gmesh->Element(i)->Level()+1));
348 if(this->
icefront_distance>0 && if_distance[sid]<if_distance_h+DBL_EPSILON) criteria++;
352 if(criteria)index.push_back(i);
355 for(
int i=0;i<index.size();i++){
356 if(!gmesh->Element(index[i])) DebugStop();
357 if(!gmesh->Element(index[i])->HasSubElement()){gmesh->Element(index[i])->Divide(sons);count++;}
359 if(verbose)
_printf_(
""<<count<<
"\n");