5#ifndef DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
6#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
253#include <dune/common/fvector.hh>
254#include <dune/common/math.hh>
264 namespace RefinementImp {
288 [[deprecated(
"Use factorial from dune-common's math.hh")]]
292 for(
int i = 1; i <= n; ++i)
304 [[deprecated(
"Use binomial from dune-common's math.hh")]]
307 lower = std::min( lower, upper - lower );
311 for(
int i = upper - lower; i < upper; ++i)
313 return prod / Dune::factorial(lower);
322 template<
int dimension>
326 for(
int i = 0; i < dimension; ++i)
327 index += Dune::binomial(dimension-i + point[i]-1, dimension-i);
338 FieldVector<int, n> perm;
339 for(
int i = 0; i < n; ++i)
343 for(
int i = 1; i <= n; ++i)
346 for(
int i = n; i > 0; --i) {
350 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t;
359 int getPermIndex(
const FieldVector<int, n>& test)
362 FieldVector<int, n> perm;
363 for(
int i = 0; i < n; ++i)
367 for(
int i = 1; i <= n; ++i)
370 for(
int i = n; i > 0; --i) {
373 for(d = 0; d < i; ++d)
374 if(test[i-1] == perm[i-1-d])
379 perm[i-1-d] = perm[i-1];
392 template<
int dimension,
class CoordType>
393 FieldVector<CoordType, dimension>
395 FieldVector<CoordType, dimension> point,
397 const FieldVector<int, dimension> &kuhn)
399 for(
int i = dimension - 1; i > 0; --i)
400 point[kuhn[i-1]] += point[kuhn[i]];
411 template<
int dimension,
class CoordType>
412 FieldVector<CoordType, dimension>
414 FieldVector<CoordType, dimension> point,
416 const FieldVector<int, dimension> &kuhn)
418 for(
int i = 0; i < dimension - 1; ++i)
419 point[kuhn[i]] -= point[kuhn[i+1]];
431 template<
int dimension_,
class CoordType>
438 template<
int codimension>
454 template<
int dimension,
class CoordType>
455 template<
int codimension>
458 class SubEntityIterator;
463 template<
int dimension,
class CoordType>
468 return Dune::binomial(dimension + nIntervals, (
int)dimension);
471 template<
int dimension,
class CoordType>
479 template<
int dimension,
class CoordType>
487 template<
int dimension,
class CoordType>
492 return Dune::power(nIntervals,
int(dimension));
495 template<
int dimension,
class CoordType>
503 template<
int dimension,
class CoordType>
516 template<
int dimension,
class CoordType,
int codimension>
521 template<
int dimension,
class CoordType>
533 bool equals(
const This &other)
const;
540 typedef FieldVector<int, dimension>
Vertex;
546 template<
int dimension,
class CoordType>
551 vertex[0] = (end) ? size + 1 : 0;
552 for(
int i = 1; i < dimension; ++ i)
556 template<
int dimension,
class CoordType>
561 assert(vertex[0] <= size);
562 for(
int i = dimension - 1; i >= 0; --i) {
564 if(i == 0 || vertex[i] <= vertex[i-1])
571 template<
int dimension,
class CoordType>
576 return size == other.
size && vertex == other.
vertex;
579 template<
int dimension,
class CoordType>
587 for(
int i = 0; i < dimension; ++i)
588 coords[i] = CoordType(ref[i]) / size;
592 template<
int dimension,
class CoordType>
596 std::vector<CoordVector> corners(1);
601 template<
int dimension,
class CoordType>
611 template<
int dimension,
class CoordType>
624 bool equals(
const This &other)
const;
636 typedef FieldVector<int, dimension>
Vertex;
637 constexpr static int nKuhnIntervals = Dune::factorial(dimension);
645 template<
int dimension,
class CoordType>
648 : kuhnIndex(0), size(nIntervals), index_(0)
650 for(
int i = 0; i < dimension; ++i)
653 index_ = Refinement::nElements(nIntervals);
658 template<
int dimension,
class CoordType>
663 assert(origin[0] < size);
669 if(kuhnIndex == nKuhnIntervals) {
672 for(
int i = dimension - 1; i >= 0; --i) {
674 if(i == 0 || origin[i] <= origin[i-1])
682 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
684 bool outside =
false;
685 for(
int i = 0; i < dimension; ++i) {
689 if(corner[perm[i]] > corner[perm[i]-1]) {
699 template<
int dimension,
class CoordType>
704 return size == other.
size && index_ == other.
index_;
707 template<
int dimension,
class CoordType>
713 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
716 for(
int i = 0; i < dimension; ++i) {
720 if (kuhnIndex%2 == 1)
721 for(
int i = 0; i < (dimension+1)/2; ++i) {
723 indices[i] = indices[dimension-i];
724 indices[dimension-i] = t;
729 template<
int dimension,
class CoordType>
737 template<
int dimension,
class CoordType>
743 ::simplex().position(0,0));
746 template<
int dimension,
class CoordType>
750 std::vector<CoordVector> corners(dimension+1);
752 for(
int i = 0; i <= dimension; ++i)
753 corners[i] = global(refelem.position(i, dimension));
754 return Geometry(refelem.type(), corners);
757 template<
int dimension,
class CoordType>
760 global(
const CoordVector &local)
const {
764 v /= (
typename CoordVector::value_type)size;
770 template<
int dimension,
class CoordType>
771 template<
int codimension>
773 :
public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
784 template<
int dimension,
class CoordType>
785 template<
int codimension>
798 namespace RefinementImp {
806 template<
unsigned topologyId,
class CoordType,
unsigned coerceToId,
809 topologyId, CoordType, coerceToId, dim,
810 typename std::enable_if<
811 ((GeometryTypes::simplex(dim).id() >> 1) ==
813 (GeometryTypes::simplex(dim).id() >> 1) ==
818 typedef Simplex::RefinementImp<dim, CoordType> Imp;
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
int pointIndex(const FieldVector< int, dimension > &point)
calculate the index of a given gridpoint within a Kuhn0 simplex
Definition simplex.cc:323
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:336
int factorial(int n)
Calculate n!
Definition simplex.cc:289
int binomial(int upper, int lower)
calculate
Definition simplex.cc:305
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
FieldVector< CoordType, dimension > kuhnToReference(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from some Kuhn simplex to the reference simplex.
Definition simplex.cc:413
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:170
static const ReferenceElement & simplex()
get simplex reference elements
Definition referenceelements.hh:204
Static tag representing a codimension.
Definition dimension.hh:24
Implement a MultiLinearGeometry with additional caching.
Definition multilineargeometry.hh:526
Definition simplex.cc:433
Codim< dimension >::SubEntityIterator VertexIterator
Definition simplex.cc:440
FieldVector< int, dimension+1 > IndexVector
Definition simplex.cc:443
CoordType ctype
Definition simplex.cc:436
static int nVertices(int nIntervals)
Definition simplex.cc:466
static int nElements(int nIntervals)
Definition simplex.cc:490
static ElementIterator eEnd(int nIntervals)
Definition simplex.cc:506
static VertexIterator vEnd(int nIntervals)
Definition simplex.cc:482
Codim< 0 >::SubEntityIterator ElementIterator
Definition simplex.cc:442
static VertexIterator vBegin(int nIntervals)
Definition simplex.cc:474
static ElementIterator eBegin(int nIntervals)
Definition simplex.cc:498
FieldVector< CoordType, dimension > CoordVector
Definition simplex.cc:441
static constexpr int dimension
Definition simplex.cc:435
Definition simplex.cc:457
Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition simplex.cc:460
Definition simplex.cc:517
Definition simplex.cc:523
Refinement::CoordVector CoordVector
Definition simplex.cc:526
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:525
Vertex vertex
Definition simplex.cc:543
Refinement::template Codim< dimension >::Geometry Geometry
Definition simplex.cc:527
RefinementIteratorSpecial< dimension, CoordType, dimension > This
Definition simplex.cc:528
FieldVector< int, dimension > Vertex
Definition simplex.cc:540
int size
Definition simplex.cc:542
Definition simplex.cc:613
int kuhnIndex
Definition simplex.cc:640
FieldVector< int, dimension > Vertex
Definition simplex.cc:636
Vertex origin
Definition simplex.cc:639
int index_
Definition simplex.cc:642
Refinement::template Codim< 0 >::Geometry Geometry
Definition simplex.cc:618
Refinement::IndexVector IndexVector
Definition simplex.cc:616
Refinement::CoordVector CoordVector
Definition simplex.cc:617
RefinementIteratorSpecial< dimension, CoordType, 0 > This
Definition simplex.cc:619
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:615
int size
Definition simplex.cc:641
SubEntityIterator(int nIntervals, bool end=false)
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:777