3#ifndef DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
4#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
6#include <dune/common/fvector.hh>
7#include <dune/common/typetraits.hh>
18 namespace RefinementImp
25 namespace PrismTriangulation
41 template<
int dimension,
class CoordType,
int codimension>
48 template<
int dimension,
class CoordType> FieldVector<CoordType, dimension>
51 FieldVector<CoordType, dimension> transform;
52 transform[0] = point[1];
53 transform[1] = 1 - point[0];
54 transform[2] = point[2];
64 template<
int dimension_,
class CoordType>
72 template<
int codimension>
94 template<
int dimension,
class CoordType>
95 template<
int codimension>
98 class SubEntityIterator;
102 template<
int dimension,
class CoordType>
107 return BackendRefinement::nVertices(level) * 3;
110 template<
int dimension,
class CoordType>
118 template<
int dimension,
class CoordType>
126 template<
int dimension,
class CoordType>
131 return BackendRefinement::nElements(level) * 3;
134 template<
int dimension,
class CoordType>
142 template<
int dimension,
class CoordType>
156 template<
int dimension,
class CoordType>
175 enum { nKuhnSimplices = 3 };
184 template<
int dimension,
class CoordType>
187 : level_(level), kuhnIndex(0),
192 kuhnIndex = nKuhnSimplices;
195 template<
int dimension,
class CoordType>
201 if (backend == backendEnd)
203 backend = BackendRefinement::vBegin(level_);
208 template<
int dimension,
class CoordType>
215 getPermutation<dimension>((kuhnIndex + 2) % 4)));
218 template<
int dimension,
class CoordType>
222 std::vector<CoordVector> corners(1);
224 getPermutation<dimension>((kuhnIndex + 2) % 4)));
228 template<
int dimension,
class CoordType>
233 return kuhnIndex*BackendRefinement::nVertices(level_) + backend.index();
237 template<
int dimension,
class CoordType>
262 enum { nKuhnSimplices = 3};
271 template<
int dimension,
class CoordType>
274 : level_(level), kuhnIndex(0),
279 kuhnIndex = nKuhnSimplices;
282 template<
int dimension,
class CoordType>
288 if (backend == backendEnd)
290 backend = BackendRefinement::eBegin(level_);
295 template<
int dimension,
class CoordType>
302 int base = kuhnIndex * BackendRefinement::nVertices(level_);
308 template<
int dimension,
class CoordType>
313 return kuhnIndex*BackendRefinement::nElements(level_) + backend.index();
316 template<
int dimension,
class CoordType>
321 return global(backend.coords());
324 template<
int dimension,
class CoordType>
328 const typename BackendIterator::Geometry &bgeo =
330 std::vector<CoordVector> corners(dimension+1);
331 for(
int i = 0; i <= dimension; ++i)
332 corners[i] = global(bgeo.corner(i));
334 return Geometry(bgeo.type(), corners);
337 template<
int dimension,
class CoordType>
340 global(
const CoordVector &local)
const
343 return transformCoordinate(referenceToKuhn(local, getPermutation<dimension>((kuhnIndex+2)%4)));
347 template<
int dimension,
class CoordType>
348 template<
int codimension>
350 :
public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
355 typedef SubEntityIterator
This;
366 template<
int dimension,
class CoordType>
367 template<
int codimension>
373 template<
int dimension,
class CoordType>
374 template<
int codimension>
377 equals(
const This &other)
const
379 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend));
386 namespace RefinementImp
394 template<
unsigned topologyId,
class CoordType,
unsigned coerceToId>
396 topologyId, CoordType, coerceToId, 3,
397 typename std::enable_if<
398 (GenericGeometry::PrismTopology<3>::type::id >> 1) ==
400 (GenericGeometry::SimplexTopology<3>::type::id >> 1) ==
404 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp;
This file contains the parts independent of a particular Refinement implementation.
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
Definition affinegeometry.hh:19
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition prismtriangulation.cc:49
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:325
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:383
Static tag representing a codimension.
Definition dimension.hh:22
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:191
Definition prismtriangulation.cc:42
Implementation of the refinement of a prism into simplices.
Definition prismtriangulation.cc:66
static ElementIterator eBegin(int level)
Definition prismtriangulation.cc:137
CoordType ctype
Definition prismtriangulation.cc:70
FieldVector< int, dimension+1 > IndexVector
Definition prismtriangulation.cc:77
FieldVector< CoordType, dimension > CoordVector
Definition prismtriangulation.cc:75
static ElementIterator eEnd(int level)
Definition prismtriangulation.cc:145
Codim< 0 >::SubEntityIterator ElementIterator
Definition prismtriangulation.cc:76
static VertexIterator vBegin(int level)
Definition prismtriangulation.cc:113
Codim< dimension >::SubEntityIterator VertexIterator
Definition prismtriangulation.cc:74
@ dimension
Definition prismtriangulation.cc:68
static int nElements(int level)
Definition prismtriangulation.cc:129
static int nVertices(int level)
Definition prismtriangulation.cc:105
static VertexIterator vEnd(int level)
Definition prismtriangulation.cc:121
Definition prismtriangulation.cc:97
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition prismtriangulation.cc:99
Refinement::template Codim< dimension >::Geometry Geometry
Definition prismtriangulation.cc:162
int level_
Definition prismtriangulation.cc:177
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:173
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:174
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:161
const BackendIterator backendEnd
Definition prismtriangulation.cc:181
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:160
BackendIterator backend
Definition prismtriangulation.cc:180
int kuhnIndex
Definition prismtriangulation.cc:179
Refinement::template Codim< 0 >::Geometry Geometry
Definition prismtriangulation.cc:244
BackendIterator backend
Definition prismtriangulation.cc:267
Refinement::IndexVector IndexVector
Definition prismtriangulation.cc:242
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:261
int kuhnIndex
Definition prismtriangulation.cc:266
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:243
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:241
const BackendIterator backendEnd
Definition prismtriangulation.cc:268
int level_
Definition prismtriangulation.cc:264
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:260
SubEntityIterator This
Definition prismtriangulation.cc:355
SubEntityIterator(int level, bool end=false)
bool equals(const This &other) const
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:354
Definition simplex.cc:422
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:25