103 const typename GridView::IndexSet& indexSet =
grid.leafGridView().indexSet();
105 node_info = std::vector<NodeInfo>(indexSet.size(
dim));
110 for(
const auto& cell : elements(gv)) {
112 auto reference_element = referenceElement(cell.geometry());
115 const unsigned short level = cell.level();
118 const IndexType v_size = reference_element.size(
dim);
123 for(IndexType i=0; i<v_size; ++i){
124 const IndexType v_globalindex = indexSet.subIndex(cell,i,
dim);
125 NodeInfo& ni = node_info[v_globalindex];
130 std::cout <<
" cell-id=" <<
cell_mapper.index(cell);
131 std::cout <<
" level=" << level;
132 std::cout <<
" v_size=" << v_size;
133 std::cout <<
" v_globalindex = " << v_globalindex;
134 std::cout <<
" maximum_level = " << ni.maximum_level;
135 std::cout <<
" minimum_level = " << ni.minimum_level;
136 std::cout << std::endl;
144 typedef typename IntersectionIterator::Intersection Intersection;
147 unsigned int intersection_index = 0;
148 for(
const auto& intersection : intersections(gv,cell)) {
149 ++intersection_index;
151 auto reference_face_element = referenceElement(intersection.geometry());
153 const int eLocalIndex = intersection.indexInInside();
154 const int e_level = intersection.inside().level();
157 const int e_v_size = reference_element.size(eLocalIndex,1,
dim);
159 if(intersection.boundary()) {
162 for(
int i=0; i<e_v_size;++i){
163 const int e_v_index = reference_element.subEntity(eLocalIndex,1,i,
dim);
164 const IndexType v_globalindex = indexSet.subIndex(cell,e_v_index,
dim);
166 const FacePoint facelocal_position = reference_face_element.position(i,
dim-1);
178 NodeInfo& ni = node_info[v_globalindex];
180 ni.addTouchingLevel(e_level);
187 const int f_level = intersection.outside().level();
190 if(intersection.conforming())
194 assert(e_level != f_level);
198 if(e_level < f_level)
202 for(
int i=0; i<e_v_size;++i){
203 const int e_v_index = reference_element.subEntity(eLocalIndex,1,i,
dim);
204 const IndexType v_globalindex = indexSet.subIndex(cell,e_v_index,
dim);
206 node_info[v_globalindex].addTouchingLevel(f_level);
222 const typename GridView::IndexSet& indexSet =
grid.leafGridView().indexSet();
223 std::vector<NodeState> is_hanging;
225 auto reference_element = referenceElement(e.geometry());
228 const IndexType v_size = reference_element.size(
dim);
231 is_hanging.resize(v_size);
236 for(IndexType i=0; i<v_size; ++i){
237 const IndexType v_globalindex = indexSet.subIndex(e,i,
dim);
242 const NodeInfo & v_info = node_info[v_globalindex];
243 if(v_info.minimum_touching_level < v_info.minimum_level){
244 is_hanging[i].is_hanging =
true;
245 is_hanging[i].is_boundary = v_info.is_boundary;
248 const Point & local = reference_element.position(i,
dim);
249 const Point global = e.geometry().global(local);
251 std::cout <<
"Found hanging node with id " << v_globalindex <<
" at " << global << std::endl;
256 is_hanging[i].is_hanging =
false;
257 is_hanging[i].is_boundary = v_info.is_boundary;
267 std::cout <<
"Begin isolation of hanging nodes" << std::endl;
269 const typename GridView::IndexSet& indexSet =
grid.leafGridView().indexSet();
271 size_t iterations(0);
277 size_t refinements(0);
283 for(
const auto& cell : elements(gv)) {
285 auto reference_element = referenceElement(cell.geometry());
290 const unsigned short level = cell.level();
295 const IndexType v_size = reference_element.size(
dim);
300 for(IndexType i=0; i<v_size; ++i){
302 const IndexType v_globalindex = indexSet.subIndex(cell,i,
dim);
304 const NodeInfo & v_info = node_info[v_globalindex];
308 const unsigned short level_diff = v_info.maximum_level - level;
316 std::cout <<
" cell-id=" <<
cell_mapper.index(cell);
317 std::cout <<
" level=" << level;
318 std::cout <<
" v_size=" << v_size;
319 std::cout <<
" v_globalindex = " << v_globalindex;
320 std::cout << std::endl;
321 std::cout <<
"Refining element nr " <<
cell_mapper.index(cell)
322 <<
" to isolate hanging nodes. Level diff = "
323 << v_info.maximum_level <<
" - " << level<< std::endl;
330 if( cell.geometry().type().isSimplex() ){
341 unsigned int intersection_index = 0;
343 bool bJumpOut =
false;
346 for(
const auto& intersection : intersections(gv,cell)) {
347 ++intersection_index;
350 if(!intersection.boundary()) {
352 const int e_level = intersection.inside().level();
353 const int f_level = intersection.outside().level();
355 if( f_level > e_level ){
361 const int eLocalIndex = intersection.indexInInside();
368 int nEdgeCenters = 0;
385 std::vector<Dune::FieldVector<ctype,dim> >
386 edgecenter( nEdgeCenters, Dune::FieldVector<ctype,dim>(0) );
390 for(
int counter=0; counter<nEdgeCenters; ++counter){
392 int cornerIndex1 = counter %
dim;
393 int cornerIndex2 = (counter+1) %
dim;
395 const int e_v_index_1 =
396 reference_element.subEntity(eLocalIndex,1,cornerIndex1,
dim);
398 const int e_v_index_2 =
399 reference_element.subEntity(eLocalIndex,1,cornerIndex2,
dim);
401 auto vertex1 = cell.template subEntity<dim>(e_v_index_1);
403 auto vertex2 = cell.template subEntity<dim>(e_v_index_2);
405 edgecenter[counter] += vertex1.geometry().center();
406 edgecenter[counter] += vertex2.geometry().center();
407 edgecenter[counter] /=
ctype( 2 );
414 auto nb_reference_element = referenceElement(intersection.outside().geometry());
417 const IndexType nb_v_size = nb_reference_element.size(
dim);
420 for(IndexType i=0; i<nb_v_size; ++i){
422 auto nb_vertex = intersection.outside().template subEntity<dim>(i);
424 bool doExtraCheck =
false;
426 Dune::FieldVector<ctype,dim> center_diff ( edgecenter[counter] );
428 center_diff -= nb_vertex.geometry().center();
432 if( center_diff.two_norm2() < 5e-12 ){
442 const IndexType nb_v_globalindex = indexSet.index(nb_vertex);
444 const NodeInfo & nb_v_info = node_info[nb_v_globalindex];
446 const unsigned short level_diff = nb_v_info.maximum_level - level;
456 std::cout <<
" cell-id=" <<
cell_mapper.index(cell);
457 std::cout <<
" level=" << level;
458 std::cout <<
" v_size=" << v_size;
459 std::cout << std::endl;
460 std::cout <<
" Extra refining for element nr " <<
cell_mapper.index(cell)
461 <<
" to isolate hanging nodes. Level diff = "
462 << nb_v_info.maximum_level <<
" - " << level<< std::endl;
469 if( bJumpOut )
break;
471 if( bJumpOut )
break;
477 if( bJumpOut )
break;
489 std::cout <<
"Re-adapt for isolation of hanging nodes..." << std::endl;
498 std::cout <<
"In iteration " << iterations <<
" there were "
499 << refinements <<
" grid cells to be refined additionally to isolate hanging nodes." << std::endl;