5#ifndef DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
6#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
8#include <dune/common/fvector.hh>
9#include <dune/common/typetraits.hh>
19 namespace RefinementImp
26 namespace PrismTriangulation
42 template<
int dimension,
class CoordType,
int codimension>
49 template<
int dimension,
class CoordType> FieldVector<CoordType, dimension>
52 FieldVector<CoordType, dimension> transform;
53 transform[0] = point[1];
54 transform[1] = 1 - point[0];
55 transform[2] = point[2];
65 template<
int dimension_,
class CoordType>
73 template<
int codimension>
95 template<
int dimension,
class CoordType>
96 template<
int codimension>
99 class SubEntityIterator;
103 template<
int dimension,
class CoordType>
108 return BackendRefinement::nVertices(nIntervals) * 3;
111 template<
int dimension,
class CoordType>
119 template<
int dimension,
class CoordType>
127 template<
int dimension,
class CoordType>
132 return BackendRefinement::nElements(nIntervals) * 3;
135 template<
int dimension,
class CoordType>
143 template<
int dimension,
class CoordType>
157 template<
int dimension,
class CoordType>
176 constexpr static int nKuhnSimplices = 3;
185 template<
int dimension,
class CoordType>
188 : nIntervals_(nIntervals), kuhnIndex(0),
193 kuhnIndex = nKuhnSimplices;
196 template<
int dimension,
class CoordType>
202 if (backend == backendEnd)
204 backend = BackendRefinement::vBegin(nIntervals_);
209 template<
int dimension,
class CoordType>
216 getPermutation<dimension>((kuhnIndex + 2) % 4)));
219 template<
int dimension,
class CoordType>
223 std::vector<CoordVector> corners(1);
225 getPermutation<dimension>((kuhnIndex + 2) % 4)));
229 template<
int dimension,
class CoordType>
234 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
238 template<
int dimension,
class CoordType>
263 constexpr static int nKuhnSimplices = 3;
272 template<
int dimension,
class CoordType>
275 : nIntervals_(nIntervals), kuhnIndex(0),
280 kuhnIndex = nKuhnSimplices;
283 template<
int dimension,
class CoordType>
289 if (backend == backendEnd)
291 backend = BackendRefinement::eBegin(nIntervals_);
296 template<
int dimension,
class CoordType>
303 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
309 template<
int dimension,
class CoordType>
314 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
317 template<
int dimension,
class CoordType>
322 return global(backend.coords());
325 template<
int dimension,
class CoordType>
329 const typename BackendIterator::Geometry &bgeo =
331 std::vector<CoordVector> corners(dimension+1);
332 for(
int i = 0; i <= dimension; ++i)
333 corners[i] = global(bgeo.corner(i));
335 return Geometry(bgeo.type(), corners);
338 template<
int dimension,
class CoordType>
341 global(
const CoordVector &local)
const
344 return transformCoordinate(referenceToKuhn(local, getPermutation<dimension>((kuhnIndex+2)%4)));
348 template<
int dimension,
class CoordType>
349 template<
int codimension>
351 :
public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
356 typedef SubEntityIterator
This;
367 template<
int dimension,
class CoordType>
368 template<
int codimension>
374 template<
int dimension,
class CoordType>
375 template<
int codimension>
378 equals(
const This &other)
const
380 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend));
387 namespace RefinementImp
395 template<
unsigned topologyId,
class CoordType,
unsigned coerceToId>
397 topologyId, CoordType, coerceToId, 3,
398 typename std::enable_if<
399 (GeometryTypes::prism.id() >> 1) ==
401 (GeometryTypes::simplex(3).id() >> 1) ==
405 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp;
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
This file contains the parts independent of a particular Refinement implementation.
A unique label for each type of element that can occur in a grid.
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition type.hh:507
Definition affinegeometry.hh:21
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition prismtriangulation.cc:50
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:336
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:394
Static tag representing a codimension.
Definition dimension.hh:24
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
Definition prismtriangulation.cc:43
Implementation of the refinement of a prism into simplices.
Definition prismtriangulation.cc:67
static constexpr int dimension
Definition prismtriangulation.cc:69
CoordType ctype
Definition prismtriangulation.cc:71
static VertexIterator vEnd(int nIntervals)
Definition prismtriangulation.cc:122
FieldVector< int, dimension+1 > IndexVector
Definition prismtriangulation.cc:78
static ElementIterator eEnd(int nIntervals)
Definition prismtriangulation.cc:146
static int nVertices(int nIntervals)
Definition prismtriangulation.cc:106
FieldVector< CoordType, dimension > CoordVector
Definition prismtriangulation.cc:76
static int nElements(int nIntervals)
Definition prismtriangulation.cc:130
Codim< 0 >::SubEntityIterator ElementIterator
Definition prismtriangulation.cc:77
Codim< dimension >::SubEntityIterator VertexIterator
Definition prismtriangulation.cc:75
static ElementIterator eBegin(int nIntervals)
Definition prismtriangulation.cc:138
static VertexIterator vBegin(int nIntervals)
Definition prismtriangulation.cc:114
Definition prismtriangulation.cc:98
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition prismtriangulation.cc:100
int nIntervals_
Definition prismtriangulation.cc:178
Refinement::template Codim< dimension >::Geometry Geometry
Definition prismtriangulation.cc:163
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:174
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:175
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:162
const BackendIterator backendEnd
Definition prismtriangulation.cc:182
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:161
BackendIterator backend
Definition prismtriangulation.cc:181
int kuhnIndex
Definition prismtriangulation.cc:180
int nIntervals_
Definition prismtriangulation.cc:265
Refinement::template Codim< 0 >::Geometry Geometry
Definition prismtriangulation.cc:245
BackendIterator backend
Definition prismtriangulation.cc:268
Refinement::IndexVector IndexVector
Definition prismtriangulation.cc:243
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:262
int kuhnIndex
Definition prismtriangulation.cc:267
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:244
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:242
const BackendIterator backendEnd
Definition prismtriangulation.cc:269
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:261
SubEntityIterator This
Definition prismtriangulation.cc:356
bool equals(const This &other) const
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:355
SubEntityIterator(int nIntervals, bool end=false)
Definition simplex.cc:433