1 #ifndef DUNE_FEM_NONCONFORMITYLEVEL_HH 2 #define DUNE_FEM_NONCONFORMITYLEVEL_HH 8 #include <dune/common/timer.hh> 24 template <
class Gr
idPartType>
27 const int levelDifference,
28 const bool verbose =
false)
34 typedef typename GridPartType :: GridType GridType;
35 typedef typename GridPartType :: template Codim<0>::IteratorType IteratorType;
36 typedef typename GridPartType :: GridType :: template Codim<0>:: Entity EntityType;
37 typedef typename GridPartType :: IntersectionIteratorType IntersectionIteratorType;
40 const IteratorType endit = gridPart.template end<0> ();
43 GridType& grid = gridPart.grid();
46 const int gridsize = gridPart.indexSet().size(0);
49 const int levelAllowed = levelDifference - 1;
52 bool finished =
false;
57 for(IteratorType it = gridPart.template begin<0>();
61 const EntityType & en = *it;
63 const int enMarker = grid.getMark(en);
68 IntersectionIteratorType endnit = gridPart.iend(en);
69 for(IntersectionIteratorType nit = gridPart.ibegin(en);
72 const typename IntersectionIteratorType::Intersection &intersec = *nit;
74 if(intersec.neighbor())
76 int diff =
std::abs(intersec.outside().level() - en.level());
77 assert( diff <= levelDifference );
78 if( diff > levelDifference )
80 std::cerr <<
"makeNonConformity: " << diff <<
" level difference to large! \n";
89 if( enMarker > 0 )
continue;
92 IntersectionIteratorType endnit = gridPart.iend(en);
93 for(IntersectionIteratorType nit = gridPart.ibegin(en);
96 const typename IntersectionIteratorType::Intersection &intersec = *nit;
97 if(intersec.neighbor())
99 assert( enMarker <= 0 );
101 const int nbMarker = grid.getMark(nb);
102 const int levelDiff = nb.level() - en.level();
105 if(levelDiff > levelAllowed)
110 finished = (enMarker == newMarker) ? finished :
false;
112 grid.mark(newMarker, en);
115 if( newMarker > 0 )
break;
117 else if( (levelDiff == 0) && (nbMarker > 0) )
120 const int newMarker =
std::max(enMarker,0);
122 finished = (enMarker == newMarker) ? finished :
false;
124 grid.mark(newMarker, en);
127 if( newMarker > 0 )
break;
137 std::cerr <<
"makeNonConformity: Break Adaptation loop because not terminating! \n";
145 std::cout <<
"Making non-conformity level took ";
146 std::cout << timer.elapsed() <<
" seconds. \n";
154 #endif // #ifndef DUNE_FEM_NONCONFORMITYLEVEL_HH
static constexpr T max(T a)
Definition: utility.hh:65
Double abs(const Double &a)
Definition: double.hh:860
Dune::EntityPointer< Grid, Implementation >::Entity make_entity(const Dune::EntityPointer< Grid, Implementation > &entityPointer)
Definition: compatibility.hh:23
static void makeNonConformity(GridPartType &gridPart, const int levelDifference, const bool verbose=false)
mark entities such that non-conformity is a given number
Definition: nonconformitylevel.hh:26
Definition: coordinate.hh:4