dune-fem  2.4.1-rc
nonconformitylevel.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_NONCONFORMITYLEVEL_HH
2 #define DUNE_FEM_NONCONFORMITYLEVEL_HH
3 
4 #include <cassert>
5 #include <cstdlib>
6 #include <iostream>
7 
8 #include <dune/common/timer.hh>
9 
11 
12 namespace Dune
13 {
14 
15  namespace Fem
16  {
17 
24  template <class GridPartType>
25  static inline void
26  makeNonConformity(GridPartType& gridPart,
27  const int levelDifference,
28  const bool verbose = false)
29  {
30  // measure time
31  Dune::Timer timer;
32 
33  // type of our standard grid iterator
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;
38 
39  // end iterator
40  const IteratorType endit = gridPart.template end<0> ();
41 
42  // grid reference
43  GridType& grid = gridPart.grid();
44 
45  // get number of elements
46  const int gridsize = gridPart.indexSet().size(0);
47 
48  // allowed level difference
49  const int levelAllowed = levelDifference - 1;
50 
51  // make non-conformity only of levelDifferenc
52  bool finished = false;
53  int count = 0;
54  while ( ! finished )
55  {
56  finished = true;
57  for(IteratorType it = gridPart.template begin<0>();
58  it != endit; ++it)
59  {
60  // get entity
61  const EntityType & en = *it;
62  // get marker
63  const int enMarker = grid.getMark(en);
64 
65 #ifndef NDEBUG
66  {
67  // make sure we have only one level difference
68  IntersectionIteratorType endnit = gridPart.iend(en);
69  for(IntersectionIteratorType nit = gridPart.ibegin(en);
70  nit != endnit; ++nit)
71  {
72  const typename IntersectionIteratorType::Intersection &intersec = *nit;
73  // check level difference
74  if(intersec.neighbor())
75  {
76  int diff = std::abs(intersec.outside().level() - en.level());
77  assert( diff <= levelDifference );
78  if( diff > levelDifference )
79  {
80  std::cerr << "makeNonConformity: " << diff << " level difference to large! \n";
81  abort();
82  }
83  }
84  }
85  }
86 #endif
87 
88  // if entity will be refined, check nothing
89  if( enMarker > 0 ) continue;
90 
91  // make sure we have only one level difference
92  IntersectionIteratorType endnit = gridPart.iend(en);
93  for(IntersectionIteratorType nit = gridPart.ibegin(en);
94  nit != endnit; ++nit)
95  {
96  const typename IntersectionIteratorType::Intersection &intersec = *nit;
97  if(intersec.neighbor())
98  {
99  assert( enMarker <= 0 );
100  EntityType nb = make_entity( intersec.outside() );
101  const int nbMarker = grid.getMark(nb);
102  const int levelDiff = nb.level() - en.level();
103 
104  // if level difference and refine on neighbor also refine here
105  if(levelDiff > levelAllowed)
106  {
107  // get new marker
108  const int newMarker = std::max(enMarker,std::max(nbMarker,0));
109  // check whether we have to iterate once more
110  finished = (enMarker == newMarker) ? finished : false;
111  // mark entity with new marker
112  grid.mark(newMarker, en);
113 
114  // in case of refinement break
115  if( newMarker > 0 ) break;
116  }
117  else if( (levelDiff == 0) && (nbMarker > 0) )
118  {
119  // get new marker
120  const int newMarker = std::max(enMarker,0);
121  // check whether we have to iterate once more
122  finished = (enMarker == newMarker) ? finished : false;
123  // mark entity with new marker
124  grid.mark(newMarker, en);
125 
126  // in case of refinement break
127  if( newMarker > 0 ) break;
128  }
129  }
130 
131  } // end intersections
132  } // end element loop
133 
134  ++count;
135  if(count > gridsize)
136  {
137  std::cerr << "makeNonConformity: Break Adaptation loop because not terminating! \n";
138  break;
139  }
140  } // end while
141 
142  // output time if verbosity mode
143  if(verbose)
144  {
145  std::cout << "Making non-conformity level took ";
146  std::cout << timer.elapsed() << " seconds. \n";
147  }
148  } // makeNonConformity
149 
150  } // namespace Fem
151 
152 } // namespace Dune
153 
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