dune-grid  3.0-git
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 
9 #include <dune/common/parallel/collectivecommunication.hh>
10 #include <dune/common/tuples.hh>
11 
13 #include <dune/grid/common/grid.hh>
15 
16 #include <dune/geometry/genericgeometry/topologytypes.hh>
17 #include <dune/geometry/axisalignedcubegeometry.hh>
18 
23 #include "onedgrid/onedgridlist.hh"
24 #include "onedgrid/nulliteratorfactory.hh"
25 #include "onedgrid/onedgridentity.hh"
26 #include "onedgrid/onedgridentityseed.hh"
27 #include "onedgrid/onedgridintersections.hh"
28 #include "onedgrid/onedgridintersectioniterators.hh"
29 #include "onedgrid/onedgridleveliterator.hh"
30 #include "onedgrid/onedgridleafiterator.hh"
31 #include "onedgrid/onedgridhieriterator.hh"
32 #include "onedgrid/onedgridindexsets.hh"
33 
34 namespace Dune {
35 
36  class OneDGrid;
37 
43  template <int mydim, int coorddim, class GridImp>
44  using OneDGridGeometry = AxisAlignedCubeGeometry<double, mydim, coorddim>;
45 
47  {
48  typedef GridTraits<1, // Grid dimension
49  1, // Dimension of the physical space
52  OneDGridEntity,
53  OneDGridLevelIterator,
54  OneDGridLeafIntersection,
55  OneDGridLevelIntersection,
56  OneDGridLeafIntersectionIterator,
57  OneDGridLevelIntersectionIterator,
58  OneDGridHierarchicIterator,
59  OneDGridLeafIterator,
60  OneDGridLevelIndexSet<const OneDGrid>,
61  OneDGridLeafIndexSet<const OneDGrid>,
62  OneDGridIdSet<const OneDGrid>,
63  unsigned int,
64  OneDGridIdSet<const OneDGrid>,
65  unsigned int,
66  CollectiveCommunication<Dune::OneDGrid>,
69  OneDGridEntitySeed>
71  };
72 
73  //**********************************************************************
74  //
75  // --OneDGrid
76  //
77  //**********************************************************************
78 
90  class OneDGrid : public GridDefaultImplementation <1, 1,typename OneDGridGeometry<0,1,OneDGrid>::ctype, OneDGridFamily>
91  {
92  // Grid and world dimension are hardwired in this grid
93  enum {dim = 1};
94  enum {dimworld = 1};
95 
96  template <int , PartitionIteratorType, class >
97  friend class OneDGridLevelIterator;
98 
99  friend class OneDGridHierarchicIterator<const OneDGrid>;
100 
101  template <int codim_, int dim_, class GridImp_>
102  friend class OneDGridEntity;
103  friend class OneDGridHierarchicIterator<OneDGrid>;
104  friend class OneDGridLeafIntersection<const OneDGrid>;
105  friend class OneDGridLevelIntersection<const OneDGrid>;
106  friend class OneDGridLeafIntersectionIterator<const OneDGrid>;
107  friend class OneDGridLevelIntersectionIterator<const OneDGrid>;
108 
109  friend class OneDGridLevelIndexSet<const OneDGrid>;
110  friend class OneDGridLeafIndexSet<const OneDGrid>;
111  friend class OneDGridIdSet<const OneDGrid>;
112 
113  template <int codim_, PartitionIteratorType PiType_, class GridImp_>
114  friend class OneDGridLeafIterator;
115 
116  template <class GridType_>
117  friend class GridFactory;
118 
119  template<int codim_, int dim_, class GridImp_, template<int,int,class> class EntityImp_>
120  friend class Entity;
121 
123  OneDGrid();
124 
125  // **********************************************************
126  // The Interface Methods
127  // **********************************************************
128 
129  public:
130 
134 
137 
138  //Provides the standard grid types
140 
142  OneDGrid(const std::vector<ctype>& coords);
143 
145  OneDGrid(int numElements, const ctype& leftBoundary, const ctype& rightBoundary);
146 
148  ~OneDGrid();
149 
154  int maxLevel() const {return entityImps_.size()-1;}
155 
157  template<int codim>
158  typename Traits::template Codim<codim>::LevelIterator lbegin (int level) const;
159 
161  template<int codim>
162  typename Traits::template Codim<codim>::LevelIterator lend (int level) const;
163 
165  template<int codim, PartitionIteratorType PiType>
166  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lbegin (int level) const;
167 
169  template<int codim, PartitionIteratorType PiType>
170  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lend (int level) const;
171 
173  template<int codim>
174  typename Traits::template Codim<codim>::LeafIterator leafbegin () const;
175 
177  template<int codim>
178  typename Traits::template Codim<codim>::LeafIterator leafend () const;
179 
181  template<int codim, PartitionIteratorType PiType>
182  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafbegin() const;
183 
185  template<int codim, PartitionIteratorType PiType>
186  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafend() const;
187 
189  template <typename Seed>
190  static typename Traits::template Codim<Seed::codimension>::Entity
191  entity(const Seed& seed)
192  {
193  const int codim = Seed::codimension;
194  return typename Traits::template Codim<codim>::Entity(OneDGridEntity<codim,dim,const OneDGrid>(OneDGrid::getRealImplementation(seed).target()));
195  }
196 
197 
200  int size (int level, int codim) const {
201  if (codim<0 || codim>1)
202  DUNE_THROW(GridError, "There are no codim " << codim << " entities in a OneDGrid!");
203 
204  if (codim==0)
205  return elements(level).size();
206 
207  return vertices(level).size();
208  }
209 
210 
211 
213  int size (int codim) const
214  {
215  return leafIndexSet().size(codim);
216  }
217 
219  int size (int level, GeometryType type) const
220  {
221  // There is only one type for each codim
222  return size(level,1-type.dim());
223  }
224 
226  int size (GeometryType type) const
227  {
228  return leafIndexSet().size(type);
229  }
230 
236  size_t numBoundarySegments() const
237  {
238  return 2;
239  }
240 
243  int overlapSize(int codim) const {
244  return 0;
245  }
246 
249  int ghostSize(int codim) const {
250  return 0;
251  }
252 
255  int overlapSize(int level, int codim) const {
256  return 0;
257  }
258 
261  int ghostSize(int level, int codim) const {
262  return 0;
263  }
264 
267  {
268  return idSet_;
269  }
270 
273  {
274  return idSet_;
275  }
276 
278  const Traits::LevelIndexSet& levelIndexSet(int level) const
279  {
280  if (! levelIndexSets_[level]) {
281  levelIndexSets_[level] =
282  new OneDGridLevelIndexSet<const OneDGrid>(*this, level);
283  levelIndexSets_[level]->update();
284  }
285 
286  return * levelIndexSets_[level];
287  }
288 
291  {
292  return leafIndexSet_;
293  }
294 
295 
303  bool mark(int refCount, const Traits::Codim<0>::Entity& e );
304 
311  int getMark(const Traits::Codim<0>::Entity& e ) const;
312 
314  bool preAdapt();
315 
317  bool adapt();
318 
320  void postAdapt();
321 
322  // **********************************************************
323  // End of Interface Methods
324  // **********************************************************
325 
332  };
333 
336  refinementType_ = type;
337  }
338 
344  void globalRefine(int refCount);
345 
346  // dummy parallel functions
347 
348  template<class DataHandle>
349  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir, int level) const
350  {}
351 
352  template<class DataHandle>
353  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const
354  {}
355 
357  {
358  return ccobj;
359  }
360 
361 
362  private:
363 
365  OneDGridList<OneDEntityImp<0> >& vertices(int level) {
366  return std::get<0>(entityImps_[level]);
367  }
368 
370  const OneDGridList<OneDEntityImp<0> >& vertices(int level) const {
371  return std::get<0>(entityImps_[level]);
372  }
373 
375  OneDGridList<OneDEntityImp<1> >& elements(int level) {
376  return std::get<1>(entityImps_[level]);
377  }
378 
380  const OneDGridList<OneDEntityImp<1> >& elements(int level) const {
381  return std::get<1>(entityImps_[level]);
382  }
383 
385 
387  void setIndices();
388 
389  unsigned int getNextFreeId(int codim) {
390  return (codim==0) ? freeElementIdCounter_++ : freeVertexIdCounter_++;
391  }
392 
394  RefinementType refinementType_;
395 
396  OneDGridList<OneDEntityImp<0> >::iterator getLeftUpperVertex(const OneDEntityImp<1>* eIt);
397 
398  OneDGridList<OneDEntityImp<0> >::iterator getRightUpperVertex(const OneDEntityImp<1>* eIt);
399 
403  OneDGridList<OneDEntityImp<1> >::iterator getLeftNeighborWithSon(OneDGridList<OneDEntityImp<1> >::iterator eIt);
404 
405  // The vertices and elements of the grid hierarchy
406  std::vector<tuple<OneDGridList<OneDEntityImp<0> >,
407  OneDGridList<OneDEntityImp<1> > > > entityImps_;
408 
409  // Our set of level indices
410  mutable std::vector<OneDGridLevelIndexSet<const OneDGrid>* > levelIndexSets_;
411 
413 
415 
416  unsigned int freeVertexIdCounter_;
417 
418  unsigned int freeElementIdCounter_;
419 
423  bool reversedBoundarySegmentNumbering_;
424 
425  }; // end Class OneDGrid
426 
427  namespace Capabilities
428  {
440  template< >
442  {
443  static const bool v = true;
444  static const unsigned int topologyId = GenericGeometry :: CubeTopology< 1 > :: type :: id ;
445  };
446 
447 
451  template<int cdim>
452  struct hasEntity< OneDGrid, cdim >
453  {
454  static const bool v = true;
455  };
456 
460  template<>
462  {
463  static const bool v = true;
464  };
465 
469  template<>
471  {
472  static const bool v = true;
473  };
474 
475  }
476 
477 } // namespace Dune
478 
479 // Include the GridFactory specialization for OneDGrid, so everybody
480 // who includes the grid also gets the factory. Since OneDGrid is
481 // not a template class, it needs to be a complete type before
482 // GridFactory<OneDGrid> can be defined. This is why the #include-
483 // directive is at _the end_ of this file.
484 #include <dune/grid/onedgrid/onedgridfactory.hh>
485 
486 
487 #endif
Dune::Capabilities::hasSingleGeometryType::topologyId
static const unsigned int topologyId
Definition: common/capabilities.hh:29
grid.hh
Different resources needed by all grid implementations.
gridfactory.hh
Provide a generic factory class for unstructured grids.
Dune::GridFactory
Provide a generic factory class for unstructured grids.
Definition: common/gridfactory.hh:263
Dune::OneDGrid::OneDGridLeafIndexSet< const OneDGrid >
friend class OneDGridLeafIndexSet< const OneDGrid >
Definition: onedgrid.hh:110
Dune::OneDGrid::setRefinementType
void setRefinementType(RefinementType type)
Sets the type of grid refinement.
Definition: onedgrid.hh:335
Dune
Include standard header files.
Definition: agrid.hh:59
Dune::OneDGrid::lbegin
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
Dune::OneDGrid::comm
const CollectiveCommunication & comm() const
Definition: onedgrid.hh:356
Dune::OneDGrid::globalRefine
void globalRefine(int refCount)
Does one uniform refinement step.
Dune::Grid::CollectiveCommunication
GridFamily::Traits::CollectiveCommunication CollectiveCommunication
A type that is a model of Dune::CollectiveCommunication. It provides a portable way for collective co...
Definition: common/grid.hh:519
Dune::OneDGrid::OneDGridIdSet< const OneDGrid >
friend class OneDGridIdSet< const OneDGrid >
Definition: onedgrid.hh:111
Dune::OneDGrid::ctype
OneDGridGeometry< 0, 1, OneDGrid >::ctype ctype
The type used to store coordinates.
Definition: onedgrid.hh:133
Dune::OneDGrid::size
int size(int codim) const
number of leaf entities per codim in this process
Definition: onedgrid.hh:213
Dune::OneDGrid::ghostSize
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:261
Dune::OneDGrid::postAdapt
void postAdapt()
Adaptation post-processing: Reset all adaptation state flags.
Dune::OneDGrid::Traits
OneDGridFamily::Traits Traits
Definition: onedgrid.hh:139
Dune::OneDGrid::LOCAL
New level consists only of the refined elements.
Definition: onedgrid.hh:329
Dune::OneDGrid::size
int size(int level, GeometryType type) const
number of entities per level and geometry type in this process
Definition: onedgrid.hh:219
Dune::Grid::Codim::LeafIterator
GridFamily::Traits::template Codim< cd >::LeafIterator LeafIterator
A type that is a model of Dune::LeafIterator with partition type All_Partition.
Definition: common/grid.hh:454
Dune::OneDGrid::preAdapt
bool preAdapt()
Does nothing except return true if some element has been marked for refinement.
Dune::VTK::GeometryType
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
Dune::OneDGrid::size
int size(int level, int codim) const
Number of grid entities per level and codim.
Definition: onedgrid.hh:200
Dune::Entity
Wrapper class for entities.
Definition: common/entity.hh:61
Dune::Capabilities::isLeafwiseConforming
Specialize with 'true' if implementation guarantees a conforming leaf grid. (default=false)
Definition: common/capabilities.hh:86
Dune::OneDGrid::globalIdSet
const Traits::GlobalIdSet & globalIdSet() const
Get the set of global ids.
Definition: onedgrid.hh:266
Dune::Capabilities::hasEntity
Specialize with 'true' for all codims that a grid implements entities for. (default=false)
Definition: common/capabilities.hh:55
Dune::OneDGridFamily
Definition: onedgrid.hh:46
Dune::OneDGrid::communicate
void communicate(DataHandle &data, InterfaceType iftype, CommunicationDirection dir) const
Definition: onedgrid.hh:353
Dune::OneDGrid::ghostSize
int ghostSize(int codim) const
The processor ghost overlap for parallel computing. Always zero because this is a strictly sequential...
Definition: onedgrid.hh:249
Dune::Grid::ctype
ct ctype
Define type used for coordinates in grid module.
Definition: common/grid.hh:522
Dune::OneDGrid::GridFamily
OneDGridFamily GridFamily
GridFamily of OneDGrid.
Definition: onedgrid.hh:136
Dune::GridTraits
A traits struct that collects all associated types of one grid model.
Definition: common/grid.hh:1156
Dune::OneDGrid::OneDGridEntity
friend class OneDGridEntity
Definition: onedgrid.hh:102
Dune::InterfaceType
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
Dune::Capabilities::isLeafwiseConforming::v
static const bool v
Definition: common/capabilities.hh:88
Dune::OneDGrid::OneDGridLevelIterator
friend class OneDGridLevelIterator
Definition: onedgrid.hh:97
Dune::OneDGrid::maxLevel
int maxLevel() const
Return maximum level defined in this grid.
Definition: onedgrid.hh:154
Dune::OneDGrid
One-dimensional adaptive grid.
Definition: onedgrid.hh:90
Dune::IdSet
Id Set Interface.
Definition: common/grid.hh:347
Dune::OneDGrid::size
int size(GeometryType type) const
number of leaf entities per geometry type in this process
Definition: onedgrid.hh:226
Dune::Capabilities::hasSingleGeometryType
Specialize with 'true' for if the codimension 0 entity of the grid has only one possible geometry typ...
Definition: common/capabilities.hh:24
Dune::OneDGrid::adapt
bool adapt()
Triggers the grid refinement process.
Dune::Capabilities::isLevelwiseConforming
Specialize with 'true' if implementation guarantees conforming level grids. (default=false)
Definition: common/capabilities.hh:77
Dune::Capabilities::hasSingleGeometryType::v
static const bool v
Definition: common/capabilities.hh:26
Dune::DefaultLeafGridViewTraits
Definition: defaultgridview.hh:221
Dune::Grid::Codim::LevelIterator
GridFamily::Traits::template Codim< cd >::LevelIterator LevelIterator
A type that is a model of Dune::LevelIterator with partition type All_Partition.
Definition: common/grid.hh:450
Dune::IndexSet::size
IndexType size(GeometryType type) const
Return total number of entities of given geometry type in entity set .
Definition: indexidset.hh:215
capabilities.hh
A set of traits classes to store static information about grid implementation.
Dune::OneDGrid::OneDGridLeafIterator
friend class OneDGridLeafIterator
Definition: onedgrid.hh:114
Dune::OneDGrid::leafIndexSet
const Traits::LeafIndexSet & leafIndexSet() const
Get an index set for the leaf level.
Definition: onedgrid.hh:290
Dune::OneDGrid::numBoundarySegments
size_t numBoundarySegments() const
Return the number of coarse grid boundary segments.
Definition: onedgrid.hh:236
Dune::GridDefaultImplementation
Definition: common/geometry.hh:24
Dune::IndexSet
Index Set Interface base class.
Definition: common/grid.hh:346
Dune::OneDGrid::leafbegin
Traits::template Codim< codim >::LeafIterator leafbegin() const
Iterator to first entity of given codim on leaf level.
Dune::OneDGrid::COPY
New level consists of the refined elements and the unrefined ones, too.
Definition: onedgrid.hh:331
Dune::GridDefaultImplementation< 1, 1, OneDGridGeometry< 0, 1, OneDGrid >::ctype, OneDGridFamily >::getRealImplementation
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: common/grid.hh:1119
Dune::Capabilities::hasEntity::v
static const bool v
Definition: common/capabilities.hh:57
Dune::OneDGrid::lend
Traits::template Codim< codim >::LevelIterator lend(int level) const
one past the end on this level
Dune::Grid::Codim::Entity
GridFamily::Traits::template Codim< cd >::Entity Entity
A type that is a model of a Dune::Entity<cd,dim,...>.
Definition: common/grid.hh:423
Dune::OneDGrid::RefinementType
RefinementType
The different forms of grid refinement supported by OneDGrid.
Definition: onedgrid.hh:327
Dune::OneDGrid::mark
bool mark(int refCount, const Traits::Codim< 0 >::Entity &e)
Mark entity for refinement.
Dune::Capabilities::isLevelwiseConforming::v
static const bool v
Definition: common/capabilities.hh:79
Dune::OneDGrid::OneDGridLevelIndexSet< const OneDGrid >
friend class OneDGridLevelIndexSet< const OneDGrid >
Definition: onedgrid.hh:109
Dune::DefaultLevelGridViewTraits
Definition: defaultgridview.hh:23
Dune::OneDGridGeometry
AxisAlignedCubeGeometry< double, mydim, coorddim > OneDGridGeometry
The type used to for OneDGrid geometries.
Definition: onedgrid.hh:44
Dune::GridTraits::Codim::Entity
Dune::Entity< cd, dim, const GridImp, EntityImp > Entity
The type of the entity.
Definition: common/grid.hh:1190
Dune::OneDGrid::~OneDGrid
~OneDGrid()
Destructor.
Dune::OneDGridFamily::Traits
GridTraits< 1, 1, Dune::OneDGrid, OneDGridGeometry, OneDGridEntity, OneDGridLevelIterator, OneDGridLeafIntersection, OneDGridLevelIntersection, OneDGridLeafIntersectionIterator, OneDGridLevelIntersectionIterator, OneDGridHierarchicIterator, OneDGridLeafIterator, OneDGridLevelIndexSet< const OneDGrid >, OneDGridLeafIndexSet< const OneDGrid >, OneDGridIdSet< const OneDGrid >, unsigned int, OneDGridIdSet< const OneDGrid >, unsigned int, CollectiveCommunication< Dune::OneDGrid >, DefaultLevelGridViewTraits, DefaultLeafGridViewTraits, OneDGridEntitySeed > Traits
Definition: onedgrid.hh:70
Dune::OneDGrid::getMark
int getMark(const Traits::Codim< 0 >::Entity &e) const
return current adaptation marker of given entity
Dune::OneDGrid::leafend
Traits::template Codim< codim >::LeafIterator leafend() const
one past the end on leaf level
Dune::OneDGrid::levelIndexSet
const Traits::LevelIndexSet & levelIndexSet(int level) const
Get an index set for the given level.
Definition: onedgrid.hh:278
Dune::GridError
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:16
Dune::OneDGrid::overlapSize
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:255
Dune::OneDGrid::communicate
void communicate(DataHandle &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition: onedgrid.hh:349
Dune::OneDGrid::entity
static Traits::template Codim< Seed::codimension >::Entity entity(const Seed &seed)
Create an Entity from an EntitySeed.
Definition: onedgrid.hh:191
Dune::CommunicationDirection
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:168
Dune::OneDGrid::overlapSize
int overlapSize(int codim) const
The processor overlap for parallel computing. Always zero because this is a strictly sequential grid.
Definition: onedgrid.hh:243
Dune::OneDGrid::localIdSet
const Traits::LocalIdSet & localIdSet() const
Get the set of local ids.
Definition: onedgrid.hh:272