Dune Core Modules (2.4.2)

onedgrid.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_ONE_D_GRID_HH
4 #define DUNE_ONE_D_GRID_HH
5 
6 #include <vector>
7 #include <list>
8 
11 #include <dune/common/tuples.hh>
12 
14 #include <dune/grid/common/grid.hh>
16 
17 #include <dune/geometry/genericgeometry/topologytypes.hh>
18 
23 #include "onedgrid/onedgridlist.hh"
24 #include "onedgrid/nulliteratorfactory.hh"
25 #include "onedgrid/onedgridentity.hh"
26 #include "onedgrid/onedgridentitypointer.hh"
27 #include "onedgrid/onedgridentityseed.hh"
28 #include "onedgrid/onedgridgeometry.hh"
29 #include "onedgrid/onedgridintersections.hh"
30 #include "onedgrid/onedgridintersectioniterators.hh"
31 #include "onedgrid/onedgridleveliterator.hh"
32 #include "onedgrid/onedgridleafiterator.hh"
33 #include "onedgrid/onedgridhieriterator.hh"
34 #include "onedgrid/onedgridindexsets.hh"
35 
36 namespace Dune {
37 
38  class OneDGrid;
39 
40  template<int dim, int dimw>
41  struct OneDGridFamily
42  {
43  typedef GridTraits<dim,dimw,Dune::OneDGrid,
44  OneDGridGeometry,
45  OneDGridEntity,
46  OneDGridEntityPointer,
47  OneDGridLevelIterator,
48  OneDGridLeafIntersection,
49  OneDGridLevelIntersection,
50  OneDGridLeafIntersectionIterator,
51  OneDGridLevelIntersectionIterator,
52  OneDGridHierarchicIterator,
53  OneDGridLeafIterator,
54  OneDGridLevelIndexSet<const OneDGrid>,
55  OneDGridLeafIndexSet<const OneDGrid>,
56  OneDGridIdSet<const OneDGrid>,
57  unsigned int,
58  OneDGridIdSet<const OneDGrid>,
59  unsigned int,
60  CollectiveCommunication<Dune::OneDGrid>,
61  DefaultLevelGridViewTraits,
62  DefaultLeafGridViewTraits,
63  OneDGridEntitySeed>
64  Traits;
65  };
66 
67  //**********************************************************************
68  //
69  // --OneDGrid
70  //
71  //**********************************************************************
72 
84  class OneDGrid : public GridDefaultImplementation <1, 1,double,OneDGridFamily<1,1> >
85  {
86  // Grid and world dimension are hardwired in this grid
87  enum {dim = 1};
88  enum {dimworld = 1};
89 
90  template <int, class >
91  friend class OneDGridEntityPointer;
92 
93  template <int , PartitionIteratorType, class >
94  friend class OneDGridLevelIterator;
95 
96  friend class OneDGridHierarchicIterator<const OneDGrid>;
97 
98  template <int codim_, int dim_, class GridImp_>
99  friend class OneDGridEntity;
100  friend class OneDGridHierarchicIterator<OneDGrid>;
101  friend class OneDGridLeafIntersection<const OneDGrid>;
102  friend class OneDGridLevelIntersection<const OneDGrid>;
103  friend class OneDGridLeafIntersectionIterator<const OneDGrid>;
104  friend class OneDGridLevelIntersectionIterator<const OneDGrid>;
105 
106  friend class OneDGridLevelIndexSet<const OneDGrid>;
107  friend class OneDGridLeafIndexSet<const OneDGrid>;
108  friend class OneDGridIdSet<const OneDGrid>;
109 
110  template <int codim_, PartitionIteratorType PiType_, class GridImp_>
111  friend class OneDGridLeafIterator;
112 
113  template <class GridType_>
114  friend class GridFactory;
115 
116  template<int codim_, int dim_, class GridImp_, template<int,int,class> class EntityImp_>
117  friend class Entity;
118 
120  OneDGrid();
121 
122  // **********************************************************
123  // The Interface Methods
124  // **********************************************************
125 
126  public:
127 
134  typedef double ctype;
135 
137  typedef OneDGridFamily<dim,dimworld> GridFamily;
138 
139  //Provides the standard grid types
141 
143  OneDGrid(const std::vector<ctype>& coords);
144 
146  OneDGrid(int numElements, const ctype& leftBoundary, const ctype& rightBoundary);
147 
150 
155  int maxLevel() const {return entityImps_.size()-1;}
156 
158  template<int codim>
159  typename Traits::template Codim<codim>::LevelIterator lbegin (int level) const;
160 
162  template<int codim>
163  typename Traits::template Codim<codim>::LevelIterator lend (int level) const;
164 
166  template<int codim, PartitionIteratorType PiType>
167  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lbegin (int level) const;
168 
170  template<int codim, PartitionIteratorType PiType>
171  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lend (int level) const;
172 
174  template<int codim>
175  typename Traits::template Codim<codim>::LeafIterator leafbegin () const;
176 
178  template<int codim>
179  typename Traits::template Codim<codim>::LeafIterator leafend () const;
180 
182  template<int codim, PartitionIteratorType PiType>
183  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafbegin() const;
184 
186  template<int codim, PartitionIteratorType PiType>
187  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafend() const;
188 
190  template <typename Seed>
191  static typename Traits::template Codim<Seed::codimension>::EntityPointer
192  entityPointer(const Seed& seed)
193  {
194  enum {codim = Seed::codimension};
195  return typename Traits::template Codim<codim>::EntityPointer(OneDGridEntityPointer<codim,const OneDGrid>(OneDGrid::getRealImplementation(seed).target()));
196  }
197 
199  template <typename Seed>
200  static typename Traits::template Codim<Seed::codimension>::Entity
201  entity(const Seed& seed)
202  {
203  const int codim = Seed::codimension;
204  return typename Traits::template Codim<codim>::Entity(OneDGridEntity<codim,dim,const OneDGrid>(OneDGrid::getRealImplementation(seed).target()));
205  }
206 
207 
210  int size (int level, int codim) const {
211  if (codim<0 || codim>1)
212  DUNE_THROW(GridError, "There are no codim " << codim << " entities in a OneDGrid!");
213 
214  if (codim==0)
215  return elements(level).size();
216 
217  return vertices(level).size();
218  }
219 
220 
221 
223  int size (int codim) const
224  {
225  return leafIndexSet().size(codim);
226  }
227 
229  int size (int level, GeometryType type) const
230  {
231  // There is only one type for each codim
232  return size(level,1-type.dim());
233  }
234 
236  int size (GeometryType type) const
237  {
238  return leafIndexSet().size(type);
239  }
240 
246  size_t numBoundarySegments() const
247  {
248  return 2;
249  }
250 
253  int overlapSize(int codim) const {
254  return 0;
255  }
256 
259  int ghostSize(int codim) const {
260  return 0;
261  }
262 
265  int overlapSize(int level, int codim) const {
266  return 0;
267  }
268 
271  int ghostSize(int level, int codim) const {
272  return 0;
273  }
274 
277  {
278  return idSet_;
279  }
280 
283  {
284  return idSet_;
285  }
286 
288  const Traits::LevelIndexSet& levelIndexSet(int level) const
289  {
290  if (! levelIndexSets_[level]) {
291  levelIndexSets_[level] =
292  new OneDGridLevelIndexSet<const OneDGrid>(*this, level);
293  levelIndexSets_[level]->update();
294  }
295 
296  return * levelIndexSets_[level];
297  }
298 
301  {
302  return leafIndexSet_;
303  }
304 
305 
313  bool mark(int refCount, const Traits::Codim<0>::Entity& e );
314 
321  int getMark(const Traits::Codim<0>::Entity& e ) const;
322 
324  bool preAdapt();
325 
327  bool adapt();
328 
330  void postAdapt();
331 
332  // **********************************************************
333  // End of Interface Methods
334  // **********************************************************
335 
341  COPY
342  };
343 
346  refinementType_ = type;
347  }
348 
354  void globalRefine(int refCount);
355 
356  // dummy parallel functions
357 
358  template<class DataHandle>
359  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir, int level) const
360  {}
361 
362  template<class DataHandle>
363  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const
364  {}
365 
366  const CollectiveCommunication &comm () const
367  {
368  return ccobj;
369  }
370 
371 
372  private:
373 
375  OneDGridList<OneDEntityImp<0> >& vertices(int level) {
376  return Dune::get<0>(entityImps_[level]);
377  }
378 
380  const OneDGridList<OneDEntityImp<0> >& vertices(int level) const {
381  return Dune::get<0>(entityImps_[level]);
382  }
383 
385  OneDGridList<OneDEntityImp<1> >& elements(int level) {
386  return Dune::get<1>(entityImps_[level]);
387  }
388 
390  const OneDGridList<OneDEntityImp<1> >& elements(int level) const {
391  return Dune::get<1>(entityImps_[level]);
392  }
393 
395 
397  void setIndices();
398 
399  unsigned int getNextFreeId(int codim) {
400  return (codim==0) ? freeElementIdCounter_++ : freeVertexIdCounter_++;
401  }
402 
404  RefinementType refinementType_;
405 
406  OneDGridList<OneDEntityImp<0> >::iterator getLeftUpperVertex(const OneDEntityImp<1>* eIt);
407 
408  OneDGridList<OneDEntityImp<0> >::iterator getRightUpperVertex(const OneDEntityImp<1>* eIt);
409 
413  OneDGridList<OneDEntityImp<1> >::iterator getLeftNeighborWithSon(OneDGridList<OneDEntityImp<1> >::iterator eIt);
414 
415  // The vertices and elements of the grid hierarchy
416  std::vector<tuple<OneDGridList<OneDEntityImp<0> >,
417  OneDGridList<OneDEntityImp<1> > > > entityImps_;
418 
419  // Our set of level indices
420  mutable std::vector<OneDGridLevelIndexSet<const OneDGrid>* > levelIndexSets_;
421 
422  OneDGridLeafIndexSet<const OneDGrid> leafIndexSet_;
423 
424  OneDGridIdSet<const OneDGrid> idSet_;
425 
426  unsigned int freeVertexIdCounter_;
427 
428  unsigned int freeElementIdCounter_;
429 
433  bool reversedBoundarySegmentNumbering_;
434 
435  }; // end Class OneDGrid
436 
437  namespace Capabilities
438  {
450  template< >
452  {
453  static const bool v = true;
454  static const unsigned int topologyId = GenericGeometry :: CubeTopology< 1 > :: type :: id ;
455  };
456 
457 
461  template<int cdim>
462  struct hasEntity< OneDGrid, cdim >
463  {
464  static const bool v = true;
465  };
466 
470  template<>
471  struct
472 #ifndef DUNE_AVOID_CAPABILITIES_IS_PARALLEL_DEPRECATION_WARNING
473  DUNE_DEPRECATED_MSG("Capabilities::isParallel will be removed after dune-grid-2.4.")
474 #endif
476  {
477  static const bool
478 #ifndef DUNE_AVOID_CAPABILITIES_IS_PARALLEL_DEPRECATION_WARNING
479  DUNE_DEPRECATED_MSG("Capabilities::isParallel will be removed after dune-grid-2.4.")
480 #endif
481  v = false;
482  };
483 
487  template<>
489  {
490  static const bool v = true;
491  };
492 
496  template<>
498  {
499  static const bool v = true;
500  };
501 
502  }
503 
504 } // namespace Dune
505 
506 // Include the GridFactory specialization for OneDGrid, so everybody
507 // who includes the grid also gets the factory. Since OneDGrid is
508 // not a template class, it needs to be a complete type before
509 // GridFactory<OneDGrid> can be defined. This is why the #include-
510 // directive is at _the end_ of this file.
511 #include <dune/grid/onedgrid/onedgridfactory.hh>
512 
513 
514 #endif
Wrapper class for entities.
Definition: entity.hh:62
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
unsigned int dim() const
Return dimension of the type.
Definition: type.hh:321
Definition: grid.hh:1030
static std::conditional< std::is_reference< InterfaceType >::value, typename std::add_lvalue_reference< typename ReturnImplementationType< typename std::remove_reference< InterfaceType >::type >::ImplementationType >::type, typename std::remove_const< typename ReturnImplementationType< typename std::remove_reference< InterfaceType >::type >::ImplementationType >::type >::type getRealImplementation(InterfaceType &&i)
return real implementation of interface class
Definition: grid.hh:1305
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:18
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:263
GridFamily::Traits::CollectiveCommunication CollectiveCommunication
A type that is a model of Dune::CollectiveCommunication. It provides a portable way for collective co...
Definition: grid.hh:545
Id Set Interface.
Definition: indexidset.hh:414
Index Set Interface base class.
Definition: indexidset.hh:76
One-dimensional adaptive grid.
Definition: onedgrid.hh:85
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
Traits::template Codim< codim >::LeafIterator leafbegin() const
Iterator to first entity of given codim on leaf level.
static Traits::template Codim< Seed::codimension >::EntityPointer entityPointer(const Seed &seed)
Create an EntityPointer from an EntitySeed.
Definition: onedgrid.hh:192
double ctype
The type used to store coordinates.
Definition: onedgrid.hh:134
bool preAdapt()
Does nothing except return true if some element has been marked for refinement.
Traits::template Codim< codim >::template Partition< PiType >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
int size(GeometryType type) const
number of leaf entities per geometry type in this process
Definition: onedgrid.hh:236
OneDGrid(const std::vector< ctype > &coords)
Constructor with an explicit set of coordinates.
Traits::template Codim< codim >::template Partition< PiType >::LeafIterator leafbegin() const
Iterator to first entity of given codim on level.
void postAdapt()
Adaptation post-processing: Reset all adaptation state flags.
bool adapt()
Triggers the grid refinement process.
RefinementType
The different forms of grid refinement supported by OneDGrid.
Definition: onedgrid.hh:337
@ COPY
New level consists of the refined elements and the unrefined ones, too.
Definition: onedgrid.hh:341
@ LOCAL
New level consists only of the refined elements.
Definition: onedgrid.hh:339
size_t numBoundarySegments() const
Return the number of coarse grid boundary segments.
Definition: onedgrid.hh:246
int ghostSize(int level, int codim) const
The processor ghost overlap for parallel computing. Always zero because this is a strictly sequential...
Definition: onedgrid.hh:271
~OneDGrid()
Destructor.
Traits::template Codim< codim >::LeafIterator leafend() const
one past the end on leaf level
const Traits::LevelIndexSet & levelIndexSet(int level) const
Get an index set for the given level.
Definition: onedgrid.hh:288
bool mark(int refCount, const Traits::Codim< 0 >::Entity &e)
Mark entity for refinement.
void setRefinementType(RefinementType type)
Sets the type of grid refinement.
Definition: onedgrid.hh:345
int size(int level, GeometryType type) const
number of entities per level and geometry type in this process
Definition: onedgrid.hh:229
static Traits::template Codim< Seed::codimension >::Entity entity(const Seed &seed)
Create an Entity from an EntitySeed.
Definition: onedgrid.hh:201
int size(int level, int codim) const
Number of grid entities per level and codim.
Definition: onedgrid.hh:210
OneDGrid(int numElements, const ctype &leftBoundary, const ctype &rightBoundary)
Constructor for a uniform grid.
Traits::template Codim< codim >::template Partition< PiType >::LevelIterator lend(int level) const
one past the end on this level
int ghostSize(int codim) const
The processor ghost overlap for parallel computing. Always zero because this is a strictly sequential...
Definition: onedgrid.hh:259
OneDGridFamily< dim, dimworld > GridFamily
GridFamily of OneDGrid.
Definition: onedgrid.hh:137
int size(int codim) const
number of leaf entities per codim in this process
Definition: onedgrid.hh:223
int overlapSize(int level, int codim) const
The processor overlap for parallel computing. Always zero because this is a strictly sequential grid.
Definition: onedgrid.hh:265
const Traits::LeafIndexSet & leafIndexSet() const
Get an index set for the leaf level.
Definition: onedgrid.hh:300
int maxLevel() const
Return maximum level defined in this grid.
Definition: onedgrid.hh:155
int getMark(const Traits::Codim< 0 >::Entity &e) const
return current adaptation marker of given entity
Traits::template Codim< codim >::LevelIterator lend(int level) const
one past the end on this level
const Traits::GlobalIdSet & globalIdSet() const
Get the set of global ids.
Definition: onedgrid.hh:276
const Traits::LocalIdSet & localIdSet() const
Get the set of local ids.
Definition: onedgrid.hh:282
int overlapSize(int codim) const
The processor overlap for parallel computing. Always zero because this is a strictly sequential grid.
Definition: onedgrid.hh:253
Traits::template Codim< codim >::template Partition< PiType >::LeafIterator leafend() const
one past the end on this level
void globalRefine(int refCount)
Does one uniform refinement step.
Implements an utility class that provides collective communication methods for sequential programs.
A set of traits classes to store static information about grid implementation.
Different resources needed by all grid implementations.
Provide a generic factory class for unstructured grids.
Definition of the DUNE_DEPRECATED macro for the case that config.h is not available.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:168
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
struct DUNE_DEPRECATED_MSG("Capabilities::isParallel will be removed after dune-grid-2.4.") isParallel< ALU3dGrid< elType
YaspGrid is parallel.
Dune namespace.
Definition: alignment.hh:10
Specialize with 'true' for all codims that a grid implements entities for. (default=false)
Definition: capabilities.hh:58
Specialize with 'true' for if the codimension 0 entity of the grid has only one possible geometry typ...
Definition: capabilities.hh:27
Specialize with 'true' if implementation guarantees a conforming leaf grid. (default=false)
Definition: capabilities.hh:108
Specialize with 'true' if implementation guarantees conforming level grids. (default=false)
Definition: capabilities.hh:99
OneDGrid is not parallel.
Definition: onedgrid.hh:476
Static tag representing a codimension.
Definition: dimension.hh:22
Traits associated with a specific codim.
Definition: grid.hh:1366
A traits struct that collects all associated types of one grid model.
Definition: grid.hh:1344
Fallback implementation of the std::tuple class.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 12, 22:29, 2024)