DUNE PDELab (git)

gridfactory.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file LICENSE.md in module root
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4// vi: set et ts=4 sw=2 sts=2:
5#ifndef DUNE_GRID_COMMON_GRIDFACTORY_HH
6#define DUNE_GRID_COMMON_GRIDFACTORY_HH
7
12#include <memory>
13#include <vector>
14
17
18#include <dune/geometry/type.hh>
19
22
23namespace Dune
24{
25
68 template <class GridType>
70 {
71
72 protected:
74 static const int dimension = GridType::dimension;
75
77 constexpr static int dimworld = GridType::dimensionworld;
78
80 typedef typename GridType::ctype ctype;
81
82 public:
83 template< int codim >
84 struct Codim
85 {
86 typedef typename GridType::template Codim< codim >::Entity Entity;
87 };
88
91 {}
92
95 {}
96
98 virtual void insertVertex(const FieldVector<ctype,dimworld>& pos) = 0;
99
107 virtual void insertElement(const GeometryType& type,
108 const std::vector<unsigned int>& vertices) = 0;
109
121 virtual void
123 const std::vector<unsigned int>& vertices,
124 std::function<FieldVector<ctype,dimworld>
126 elementParametrization)
127 {
128 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
129 }
130
144 virtual void insertBoundarySegment(const std::vector<unsigned int>& vertices) = 0;
145
153 virtual void insertBoundarySegment([[maybe_unused]] const std::vector<unsigned int>& vertices,
154 [[maybe_unused]] const std::shared_ptr<BoundarySegment<dimension,dimworld> >& boundarySegment)
155 {
156 DUNE_THROW(GridError, "This grid does not support parametrized boundary segments!");
157 }
158
163 virtual std::unique_ptr<GridType> createGrid() = 0;
164
180 virtual unsigned int
181 insertionIndex ( [[maybe_unused]] const typename Codim< 0 >::Entity &entity ) const
182 {
183 DUNE_THROW( NotImplemented, "insertion indices have not yet been implemented." );
184 }
185
201 virtual unsigned int
202 insertionIndex ( [[maybe_unused]] const typename Codim< dimension >::Entity &entity ) const
203 {
204 DUNE_THROW( NotImplemented, "insertion indices have not yet been implemented." );
205 }
206
226 virtual unsigned int
227 insertionIndex ( [[maybe_unused]] const typename GridType::LeafIntersection &intersection ) const
228 {
229 DUNE_THROW( NotImplemented, "insertion indices have not yet been implemented." );
230 }
231
232
246 virtual bool
247 wasInserted ( [[maybe_unused]] const typename GridType::LeafIntersection &intersection ) const
248 {
249 DUNE_THROW( NotImplemented, "insertion indices have not yet been implemented." );
250 }
251
253
259 {
261 }
262 };
263
264
274 template <class GridType>
275 class GridFactory : public GridFactoryInterface<GridType> {
276
278
280 constexpr static int dimworld = GridType::dimensionworld;
281
283 typedef typename GridType::ctype ctype;
284
285 public:
286
287 // use default implementation from base class
289
292 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
293 }
294
296 virtual void insertVertex([[maybe_unused]] const FieldVector<ctype,dimworld>& pos) {
297 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
298 }
299
307 virtual void insertElement([[maybe_unused]] const GeometryType& type,
308 [[maybe_unused]] const std::vector<unsigned int>& vertices) {
309 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
310 }
311
325 virtual void insertBoundarySegment([[maybe_unused]] const std::vector<unsigned int>& vertices) {
326 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
327 }
328
333 virtual std::unique_ptr<GridType> createGrid() {
334 DUNE_THROW(GridError, "There is no grid factory for this grid type!");
335 }
336
337 };
338
339}
340
341#endif
Base class for grid boundary segments of arbitrary geometry.
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
Wrapper class for entities.
Definition: entity.hh:66
vector space out of a tensor product of fields.
Definition: fvector.hh:91
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:20
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:70
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices, const std::shared_ptr< BoundarySegment< dimension, dimworld > > &boundarySegment)
insert an arbitrarily shaped boundary segment
Definition: gridfactory.hh:153
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:181
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)=0
Insert an element into the coarse grid.
virtual std::unique_ptr< GridType > createGrid()=0
Finalize grid creation and hand over the grid.
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices, std::function< FieldVector< ctype, dimworld >(FieldVector< ctype, dimension >)> elementParametrization)
Insert a parametrized element into the coarse grid.
Definition: gridfactory.hh:122
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices)=0
insert a boundary segment
virtual ~GridFactoryInterface()
virtual destructor
Definition: gridfactory.hh:94
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)=0
Insert a vertex into the coarse grid.
static constexpr int dimworld
The grid world dimension.
Definition: gridfactory.hh:77
static const int dimension
dimension of the grid
Definition: gridfactory.hh:74
virtual unsigned int insertionIndex(const typename GridType::LeafIntersection &intersection) const
obtain a boundary's insertion index
Definition: gridfactory.hh:227
GridType::ctype ctype
Type used by the grid for coordinates.
Definition: gridfactory.hh:80
GridFactoryInterface()
Default constructor.
Definition: gridfactory.hh:90
Communication comm() const
Return the Communication used by the grid factory.
Definition: gridfactory.hh:258
virtual unsigned int insertionIndex(const typename Codim< dimension >::Entity &entity) const
obtain a vertex' insertion index
Definition: gridfactory.hh:202
virtual bool wasInserted(const typename GridType::LeafIntersection &intersection) const
determine whether an intersection was inserted
Definition: gridfactory.hh:247
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:275
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
Insert an element into the coarse grid.
Definition: gridfactory.hh:307
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)
Insert a vertex into the coarse grid.
Definition: gridfactory.hh:296
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices)
insert a boundary segment
Definition: gridfactory.hh:325
GridFactory()
Default constructor.
Definition: gridfactory.hh:291
virtual std::unique_ptr< GridType > createGrid()
Finalize grid creation and hand over the grid.
Definition: gridfactory.hh:333
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:211
Default exception for dummy implementations.
Definition: exceptions.hh:263
Different resources needed by all grid implementations.
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Helpers for dealing with MPI.
Dune namespace.
Definition: alignedallocator.hh:13
Base class for classes implementing geometries of boundary segments.
Definition: boundarysegment.hh:94
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 23, 23:29, 2024)