dune-grid  2.8.0
uggridfactory.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 
4 #ifndef DUNE_UGGRID_FACTORY_HH
5 #define DUNE_UGGRID_FACTORY_HH
6 
12 #include <array>
13 #include <memory>
14 #include <vector>
15 
16 #include <dune/common/fvector.hh>
17 
20 #include <dune/grid/uggrid.hh>
21 
22 namespace Dune {
23 
24 
160  template <int dimworld>
161  class GridFactory<UGGrid<dimworld> > : public GridFactoryInterface<UGGrid<dimworld> > {
162 
164  typedef typename UGGrid<dimworld>::ctype ctype;
165 
166  // UGGrid only in 2d and 3d
167  static_assert(dimworld==2 || dimworld == 3, "UGGrid only in 2d and 3d");
168 
169  public:
170 
173 
184 
187 
189  virtual void insertVertex(const FieldVector<ctype,dimworld>& pos);
190 
195  virtual void insertElement(const GeometryType& type,
196  const std::vector<unsigned int>& vertices);
197 
204  void insertBoundarySegment(const std::vector<unsigned int>& vertices);
205 
210  void insertBoundarySegment(const std::vector<unsigned int>& vertices,
211  const std::shared_ptr<BoundarySegment<dimworld> > &boundarySegment);
212 
213 
218  virtual std::unique_ptr<UGGrid<dimworld>> createGrid();
219 
221 
222  template< int codim >
223  struct Codim
224  {
226  };
227 
232  virtual unsigned int
233  insertionIndex ( const typename Codim< 0 >::Entity &entity ) const
234  {
235  return UG_NS<dimension>::levelIndex(entity.impl().target_);
236  }
237 
242  virtual unsigned int
243  insertionIndex ( const typename Codim< dimension >::Entity &entity ) const
244  {
245  return UG_NS<dimension>::levelIndex(entity.impl().target_);
246  }
247 
252  virtual unsigned int
253  insertionIndex ( const typename UGGrid<dimworld>::LeafIntersection &intersection ) const
254  {
255  return intersection.boundarySegmentIndex();
256  }
257 
259  virtual bool
260  wasInserted ( const typename UGGrid<dimworld>::LeafIntersection &intersection ) const
261  {
262  return (insertionIndex( intersection ) < boundarySegmentVertices_.size());
263  }
264 
266 
272  {
273  return grid_->comm();
274  }
275 
276  private:
277 
278  // Initialize the grid structure in UG
279  void createBegin();
280 
281  // Pointer to the grid being built
282  UGGrid<dimworld>* grid_;
283 
284  // True if the factory allocated the grid itself, false if the
285  // grid was handed over from the outside
286  bool factoryOwnsGrid_;
287 
289  std::vector<std::array<int, dimworld*2-2> > boundarySegmentVertices_;
290 
293  std::vector<unsigned char> elementTypes_;
294 
297  std::vector<unsigned int> elementVertices_;
298 
300  std::vector<FieldVector<double, dimworld> > vertexPositions_;
301 
302  };
303 
304 }
305 
306 #endif
Base class for grid boundary segments of arbitrary geometry.
The UGGrid class.
Include standard header files.
Definition: agrid.hh:58
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:130
Base class for classes implementing geometries of boundary segments.
Definition: boundarysegment.hh:92
Provide a generic factory class for unstructured grids.
Definition: common/gridfactory.hh:71
virtual unsigned int insertionIndex([[maybe_unused]] const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: common/gridfactory.hh:218
static const int dimension
dimension of the grid
Definition: common/gridfactory.hh:75
Provide a generic factory class for unstructured grids.
Definition: common/gridfactory.hh:312
Front-end for the grid manager of the finite element toolbox UG3.
Definition: uggrid.hh:205
virtual std::unique_ptr< UGGrid< dimworld > > createGrid()
Finalize grid creation and hand over the grid.
void insertBoundarySegment(const std::vector< unsigned int > &vertices, const std::shared_ptr< BoundarySegment< dimworld > > &boundarySegment)
Method to insert an arbitrarily shaped boundary segment into a coarse grid.
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)
Insert a vertex into the coarse grid.
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
Return the number of the element in the order of insertion into the factory.
Definition: uggridfactory.hh:233
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
Insert an element into the coarse grid.
virtual unsigned int insertionIndex(const typename Codim< dimension >::Entity &entity) const
Return the number of the vertex in the order of insertion into the factory.
Definition: uggridfactory.hh:243
typename UGGrid< dimworld >::CollectiveCommunication Communication
Definition: uggridfactory.hh:265
virtual bool wasInserted(const typename UGGrid< dimworld >::LeafIntersection &intersection) const
Return true if the intersection has been explictily insterted into the factory.
Definition: uggridfactory.hh:260
Communication comm() const
Return the Communication used by the grid factory.
Definition: uggridfactory.hh:271
GridFactory(UGGrid< dimworld > *grid)
Constructor for a given grid object.
virtual unsigned int insertionIndex(const typename UGGrid< dimworld >::LeafIntersection &intersection) const
Return the number of the intersection in the order of insertion into the factory.
Definition: uggridfactory.hh:253
void insertBoundarySegment(const std::vector< unsigned int > &vertices)
Method to insert a boundary segment into a coarse grid.
UGGrid< dimworld >::template Codim< codim >::Entity Entity
Definition: uggridfactory.hh:225
Provide a generic factory class for unstructured grids.