dune-grid-glue 2.8.0
Loading...
Searching...
No Matches
extractor.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 * Filename: extractor.hh
5 * Version: 1.0
6 * Created on: Oct 05, 2009
7 * Author: Christian Engwer
8 * ---------------------------------
9 * Project: dune-grid-glue
10 * Description: base class for all grid extractors
11 *
12 */
18#ifndef DUNE_GRIDGLUE_EXTRACTORS_EXTRACTOR_HH
19#define DUNE_GRIDGLUE_EXTRACTORS_EXTRACTOR_HH
20
21#include <vector>
22#include <map>
23#include <algorithm>
24#include <dune/common/exceptions.hh>
25#include <dune/common/fvector.hh>
26#include <dune/common/version.hh>
27#include <dune/grid/common/geometry.hh>
28#include <dune/grid/common/grid.hh>
29#include <dune/grid/common/mcmgmapper.hh>
30#include <dune/geometry/multilineargeometry.hh>
31
32namespace Dune {
33
34 namespace GridGlue {
35
42template<typename GV, int cd>
44{
45
46public:
47
48 static constexpr auto dimworld = GV::dimensionworld;
49 static constexpr auto dim = GV::dimension;
50 static constexpr auto codim = cd;
51
52 static constexpr int cube_corners = 1 << (dim-codim);
53
54 typedef GV GridView;
55 typedef typename GridView::Grid Grid;
56
57 typedef typename GV::Grid::ctype ctype;
58 typedef Dune::FieldVector<ctype, dimworld> Coords;
59 typedef Dune::FieldVector<ctype, dim> LocalCoords;
60
61 typedef typename GV::Traits::template Codim<dim>::Entity Vertex;
62 typedef typename Vertex::EntitySeed VertexSeed;
63
64 typedef typename GV::Traits::template Codim<0>::Entity Element;
65 typedef typename Element::EntitySeed ElementSeed;
66
67 typedef std::vector<unsigned int> VertexVector;
68
69#if DUNE_VERSION_NEWER(DUNE_GRID, 2, 6)
70 using CellMapper = MultipleCodimMultipleGeomTypeMapper<GridView>;
71#else
72 using CellMapper = MultipleCodimMultipleGeomTypeMapper<GridView, MCMGElementLayout>;
73#endif
74 // typedef typename CellMapper::IndexType IndexType;
75 typedef int IndexType;
76public:
77
78 // transformations
79 typedef Dune::MultiLinearGeometry<ctype, dim-codim, dimworld> Geometry;
80 typedef Dune::MultiLinearGeometry<ctype, dim-codim, dim> LocalGeometry;
81
82protected:
83 /************************** PRIVATE SUBCLASSES **********************/
84
90 {
91 unsigned int idx : 28;
92 unsigned int num : 4;
93 };
94
96 {
98 {}
99
100 CoordinateInfo(unsigned int index_, IndexType vtxindex_)
101 : vtxindex(vtxindex_), index(index_)
102 {}
103
106
109
111 unsigned int index;
112 };
113
118 {
119 VertexInfo(unsigned int idx_, const Vertex& p_) : idx(idx_), p(p_.seed())
120 {}
121 unsigned int idx;
123 };
124
125
130 {
131 ElementInfo(unsigned int idx_, const Element& p_, unsigned int f_) : idx(idx_), faces(f_), p(p_.seed())
132 {}
133
135 unsigned int idx : 28;
136
138 unsigned int faces : 4;
139
142 };
143
144
149 {
151 /*
152 * TODO: move default value of `geometryType_` to member declaration
153 * when removing support for older dune-geometry
154 */
155#if DUNE_VERSION_NEWER(DUNE_GEOMETRY, 2, 6)
156 : geometryType_(GeometryTypes::simplex(dim-codim))
157 {}
158#else
159 {
160 geometryType_.makeSimplex(dim-codim);
161 }
162#endif
163
164 SubEntityInfo(IndexType parent_, unsigned int num_in_parent_,
165 const Dune::GeometryType& geometryType)
166 : parent(parent_), num_in_parent(num_in_parent_), geometryType_(geometryType)
167 {}
168
169 unsigned int nCorners() const
170 {
171 return Dune::ReferenceElements<ctype, dim-codim>::general(geometryType_).size(dim-codim);
172 }
173
176
178 unsigned int num_in_parent : 3;
179
181 Dune::GeometryType geometryType_;
182
189 CornerInfo corners[cube_corners]; // sim = numer of vertices in a simplex
190 };
191
192
193 typedef std::map<IndexType, ElementInfo> ElementInfoMap;
194 typedef std::map<IndexType, VertexInfo> VertexInfoMap;
195
196 /************************** MEMBER VARIABLES ************************/
197
200
201 /* Geometrical and Topological Information */
202
204 std::vector<CoordinateInfo> coords_;
205
207 std::vector<SubEntityInfo> subEntities_;
208
215
222
224
225public:
226
227 /* C O N S T R U C T O R S A N D D E S T R U C T O R S */
228
233 Extractor(const GV& gv)
234 : gv_(gv)
235#if DUNE_VERSION_NEWER(DUNE_GRID, 2, 6)
236 , cellMapper_(gv, mcmgElementLayout())
237#else
238 , cellMapper_(gv)
239#endif
240 {}
241
242 /* F U N C T I O N A L I T Y */
243
247 void clear()
248 {
249 // this is an inofficial way on how to free the memory allocated
250 // by a std::vector
251 {
252 std::vector<CoordinateInfo> dummy;
253 coords_.swap(dummy);
254 }
255 {
256 std::vector<SubEntityInfo> dummy;
257 subEntities_.swap(dummy);
258 }
259
260 // ...then clear the maps themselves, too
261 vtxInfo_.clear();
262 elmtInfo_.clear();
263 }
264
265
266 /* G E T T E R S */
267
273 void getCoords(std::vector<Dune::FieldVector<ctype, dimworld> >& coords) const
274 {
275 coords.resize(coords_.size());
276 for (unsigned int i = 0; i < coords_.size(); ++i)
277 coords[i] = coords_[i].coord;
278 }
279
280
285 unsigned int nCoords() const
286 {
287 return coords_.size();
288 }
289
291 void getGeometryTypes(std::vector<Dune::GeometryType>& geometryTypes) const
292 {
293 geometryTypes.resize(subEntities_.size());
294 for (size_t i=0; i<subEntities_.size(); i++)
295 geometryTypes[i] = subEntities_[i].geometryType_;
296 }
297
298
302 void getFaces(std::vector<VertexVector>& faces) const
303 {
304 faces.resize(subEntities_.size());
305 for (unsigned int i = 0; i < subEntities_.size(); ++i) {
306 faces[i].resize(subEntities_[i].nCorners());
307 for (unsigned int j = 0; j < subEntities_[i].nCorners(); ++j)
308 faces[i][j] = subEntities_[i].corners[j].idx;
309 }
310 }
311
312
321 bool faceIndices(const Element& e, int& first, int& count) const
322 {
323 typename ElementInfoMap::const_iterator it =
324 elmtInfo_.find(cellMapper_.map(e));
325 if (it == elmtInfo_.end())
326 {
327 first = -1;
328 count = 0;
329 return false;
330 }
331 // the iterator is valid, fill the out params
332 first = it->second.idx;
333 count = it->second.faces;
334 return true;
335 }
336
337
343 int indexInInside(unsigned int index) const
344 {
345 return index < subEntities_.size() ? subEntities_[index].num_in_parent : -1;
346 }
347
348 // /**
349 // * @brief tests that a given entry in the extraction set does have local couplings
350 // * @todo parallel interface
351 // */
352 // bool contains (unsigned int global, unsigned int & local) const
353 // {
354 // local = global;
355 // return true;
356 // }
357
361 const GridView & gridView() const
362 {
363 return gv_;
364 }
365
366 const Grid& grid() const
367 {
368 return gv_.grid();
369 }
370
377 Element
378 element(unsigned int index) const
379 {
380 if (index >= subEntities_.size())
381 DUNE_THROW(Dune::GridError, "invalid face index");
382 const ElementSeed seed = elmtInfo_.at(subEntities_[index].parent).p;
383 return grid().entity(seed);
384 }
385
386#if 1
393 Vertex
394 vertex(unsigned int index) const
395 {
396 if (index >= coords_.size())
397 DUNE_THROW(Dune::GridError, "invalid coordinate index");
398 const VertexSeed seed = vtxInfo_.at(coords_[index].vtxindex).p;
399 return grid().entity(seed);
400 }
401#endif
402
404 Geometry geometry(unsigned int index) const;
405
407 LocalGeometry geometryLocal(unsigned int index) const;
408
409};
410
411
413template<typename GV, int cd>
415{
416 std::vector<Coords> corners(subEntities_[index].nCorners());
417 for (unsigned int i = 0; i < subEntities_[index].nCorners(); ++i)
418 corners[i] = coords_[subEntities_[index].corners[i].idx].coord;
419
420 return Geometry(subEntities_[index].geometryType_, corners);
421}
422
423
425template<typename GV, int cd>
427{
428 std::vector<LocalCoords> corners(subEntities_[index].nCorners());
429
430 // get face info
431 const SubEntityInfo & face = subEntities_[index];
432 Dune::GeometryType facetype = subEntities_[index].geometryType_;
433
434 // get reference element
435 const auto elmtseed = elmtInfo_.at(face.parent).p;
436 const auto elmt = grid().entity(elmtseed);
437 const Dune::GeometryType celltype = elmt.type();
438 const auto& re = Dune::ReferenceElements<ctype, dim>::general(celltype);
439 for (unsigned int i = 0; i < subEntities_[index].nCorners(); ++i)
440 corners[i] = re.position(face.corners[i].num,dim);
441
442 return LocalGeometry(facetype, corners);
443}
444
445} // namespace GridGlue
446
447} // namespace Dune
448
449#endif // DUNE_GRIDGLUE_EXTRACTORS_EXTRACTOR_HH
Definition: gridglue.hh:35
Provides codimension-independent methods for grid extraction.
Definition: extractor.hh:44
GV::Traits::template Codim< dim >::Entity Vertex
Definition: extractor.hh:61
VertexInfoMap vtxInfo_
a map enabling faster access to vertices and coordinates
Definition: extractor.hh:214
const Grid & grid() const
Definition: extractor.hh:366
MultipleCodimMultipleGeomTypeMapper< GridView, MCMGElementLayout > CellMapper
Definition: extractor.hh:72
Element element(unsigned int index) const
gets the parent element for a given face index, throws an exception if index not valid
Definition: extractor.hh:378
int indexInInside(unsigned int index) const
gets the number face in the parent element
Definition: extractor.hh:343
Dune::FieldVector< ctype, dim > LocalCoords
Definition: extractor.hh:59
LocalGeometry geometryLocal(unsigned int index) const
Get geometry of the extracted face in element coordinates.
Definition: extractor.hh:426
static constexpr auto dimworld
Definition: extractor.hh:48
Dune::MultiLinearGeometry< ctype, dim-codim, dimworld > Geometry
Definition: extractor.hh:79
int IndexType
Definition: extractor.hh:75
std::vector< CoordinateInfo > coords_
all information about the corner vertices of the extracted
Definition: extractor.hh:204
GV::Traits::template Codim< 0 >::Entity Element
Definition: extractor.hh:64
const GridView & gridView() const
give access to the Dune::GridView where this Patch belongs to
Definition: extractor.hh:361
void getFaces(std::vector< VertexVector > &faces) const
Get the corners of the extracted subentities.
Definition: extractor.hh:302
std::vector< unsigned int > VertexVector
Definition: extractor.hh:67
const GridView gv_
the grid object to extract the surface from
Definition: extractor.hh:199
std::vector< SubEntityInfo > subEntities_
all information about the extracted subEntities
Definition: extractor.hh:207
static constexpr int cube_corners
Definition: extractor.hh:52
Vertex vertex(unsigned int index) const
gets the vertex for a given coordinate index throws an exception if index not valid
Definition: extractor.hh:394
static constexpr auto codim
Definition: extractor.hh:50
Dune::FieldVector< ctype, dimworld > Coords
Definition: extractor.hh:58
void getGeometryTypes(std::vector< Dune::GeometryType > &geometryTypes) const
Get the list of geometry types.
Definition: extractor.hh:291
std::map< IndexType, VertexInfo > VertexInfoMap
Definition: extractor.hh:194
GridView::Grid Grid
Definition: extractor.hh:55
bool faceIndices(const Element &e, int &first, int &count) const
gets index of first subentity as well as the total number of subentities that were extracted from thi...
Definition: extractor.hh:321
Geometry geometry(unsigned int index) const
Get world geometry of the extracted face.
Definition: extractor.hh:414
GV GridView
Definition: extractor.hh:54
unsigned int nCoords() const
getter for the count of coordinates
Definition: extractor.hh:285
GV::Grid::ctype ctype
Definition: extractor.hh:57
std::map< IndexType, ElementInfo > ElementInfoMap
Definition: extractor.hh:193
Extractor(const GV &gv)
Constructor.
Definition: extractor.hh:233
void getCoords(std::vector< Dune::FieldVector< ctype, dimworld > > &coords) const
getter for the coordinates array
Definition: extractor.hh:273
CellMapper cellMapper_
Definition: extractor.hh:223
Element::EntitySeed ElementSeed
Definition: extractor.hh:65
Vertex::EntitySeed VertexSeed
Definition: extractor.hh:62
ElementInfoMap elmtInfo_
a map enabling faster access to elements and faces
Definition: extractor.hh:221
void clear()
delete everything build up so far and free the memory
Definition: extractor.hh:247
static constexpr auto dim
Definition: extractor.hh:49
Dune::MultiLinearGeometry< ctype, dim-codim, dim > LocalGeometry
Definition: extractor.hh:80
Helpful struct holding one index for the coordinate (vertex) to which it is associated and the elemen...
Definition: extractor.hh:90
unsigned int idx
index of the vertex
Definition: extractor.hh:91
unsigned int num
element corner
Definition: extractor.hh:92
CoordinateInfo(unsigned int index_, IndexType vtxindex_)
Definition: extractor.hh:100
unsigned int index
the index of this coordinate (in internal storage scheme) // NEEDED??
Definition: extractor.hh:111
CoordinateInfo()
Definition: extractor.hh:97
Coords coord
the coordinate
Definition: extractor.hh:108
IndexType vtxindex
the index of the parent element (from index set)
Definition: extractor.hh:105
simple struct holding a vertex pointer and an index
Definition: extractor.hh:118
unsigned int idx
Definition: extractor.hh:121
VertexInfo(unsigned int idx_, const Vertex &p_)
Definition: extractor.hh:119
VertexSeed p
Definition: extractor.hh:122
simple struct holding an element seed and an index
Definition: extractor.hh:130
unsigned int idx
the index of this element's first face in the internal list of extracted faces
Definition: extractor.hh:135
unsigned int faces
the number of extracted faces for this element
Definition: extractor.hh:138
ElementInfo(unsigned int idx_, const Element &p_, unsigned int f_)
Definition: extractor.hh:131
ElementSeed p
the entity seed for the element
Definition: extractor.hh:141
Holds some information about an element's subentity involved in a coupling.
Definition: extractor.hh:149
unsigned int nCorners() const
Definition: extractor.hh:169
CornerInfo corners[cube_corners]
the corner indices plus the numbers of the vertices in the parent element
Definition: extractor.hh:189
IndexType parent
the index of the parent element (from index set)
Definition: extractor.hh:175
SubEntityInfo(IndexType parent_, unsigned int num_in_parent_, const Dune::GeometryType &geometryType)
Definition: extractor.hh:164
unsigned int num_in_parent
the number of the face in the parent element
Definition: extractor.hh:178
Dune::GeometryType geometryType_
The GeometryType of the subentity.
Definition: extractor.hh:181
SubEntityInfo()
Definition: extractor.hh:150