3#ifndef DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
4#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
251#include <dune/common/fvector.hh>
261 namespace RefinementImp {
285 for(
int i = 1; i <= n; ++i)
296 lower = std::min( lower, upper - lower );
300 for(
int i = upper - lower; i < upper; ++i)
311 template<
int dimension>
315 for(
int i = 0; i < dimension; ++i)
316 index +=
binomial(dimension-i + point[i]-1, dimension-i);
327 FieldVector<int, n> perm;
328 for(
int i = 0; i < n; ++i)
332 for(
int i = 1; i <= n; ++i)
335 for(
int i = n; i > 0; --i) {
339 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t;
348 int getPermIndex(
const FieldVector<int, n>& test)
351 FieldVector<int, n> perm;
352 for(
int i = 0; i < n; ++i)
356 for(
int i = 1; i <= n; ++i)
359 for(
int i = n; i > 0; --i) {
362 for(d = 0; d < i; ++d)
363 if(test[i-1] == perm[i-1-d])
368 perm[i-1-d] = perm[i-1];
381 template<
int dimension,
class CoordType>
382 FieldVector<CoordType, dimension>
384 FieldVector<CoordType, dimension> point,
386 const FieldVector<int, dimension> &kuhn)
388 for(
int i = dimension - 1; i > 0; --i)
389 point[kuhn[i-1]] += point[kuhn[i]];
400 template<
int dimension,
class CoordType>
401 FieldVector<CoordType, dimension>
403 FieldVector<CoordType, dimension> point,
405 const FieldVector<int, dimension> &kuhn)
407 for(
int i = 0; i < dimension - 1; ++i)
408 point[kuhn[i]] -= point[kuhn[i+1]];
420 template<
int dimension_,
class CoordType>
427 template<
int codimension>
443 template<
int dimension,
class CoordType>
444 template<
int codimension>
447 class SubEntityIterator;
452 template<
int dimension,
class CoordType>
457 return binomial(dimension + (1 << level), dimension);
460 template<
int dimension,
class CoordType>
468 template<
int dimension,
class CoordType>
476 template<
int dimension,
class CoordType>
481 return 1 << (level * dimension);
484 template<
int dimension,
class CoordType>
492 template<
int dimension,
class CoordType>
505 template<
int dimension,
class CoordType,
int codimension>
510 template<
int dimension,
class CoordType>
522 bool equals(
const This &other)
const;
529 typedef FieldVector<int, dimension>
Vertex;
535 template<
int dimension,
class CoordType>
540 vertex[0] = (end) ? size + 1 : 0;
541 for(
int i = 1; i < dimension; ++ i)
545 template<
int dimension,
class CoordType>
550 assert(vertex[0] <= size);
551 for(
int i = dimension - 1; i >= 0; --i) {
553 if(i == 0 || vertex[i] <= vertex[i-1])
560 template<
int dimension,
class CoordType>
565 return size == other.
size && vertex == other.
vertex;
568 template<
int dimension,
class CoordType>
576 for(
int i = 0; i < dimension; ++i)
577 coords[i] = CoordType(ref[i]) / size;
581 template<
int dimension,
class CoordType>
585 std::vector<CoordVector> corners(1);
590 template<
int dimension,
class CoordType>
600 template<
int dimension,
class CoordType>
613 bool equals(
const This &other)
const;
625 typedef FieldVector<int, dimension>
Vertex;
626 enum { nKuhnSimplices = Factorial<dimension>::factorial };
634 template<
int dimension,
class CoordType>
637 : kuhnIndex(0), size(1<<level), index_(0)
639 for(
int i = 0; i < dimension; ++i)
642 index_ = Refinement::nElements(level);
647 template<
int dimension,
class CoordType>
652 assert(origin[0] < size);
658 if(kuhnIndex == nKuhnSimplices) {
661 for(
int i = dimension - 1; i >= 0; --i) {
663 if(i == 0 || origin[i] <= origin[i-1])
671 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
673 bool outside =
false;
674 for(
int i = 0; i < dimension; ++i) {
678 if(corner[perm[i]] > corner[perm[i]-1]) {
688 template<
int dimension,
class CoordType>
693 return size == other.
size && index_ == other.
index_;
696 template<
int dimension,
class CoordType>
702 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
705 for(
int i = 0; i < dimension; ++i) {
709 if (kuhnIndex%2 == 1)
710 for(
int i = 0; i < (dimension+1)/2; ++i) {
712 indices[i] = indices[dimension-i];
713 indices[dimension-i] = t;
718 template<
int dimension,
class CoordType>
726 template<
int dimension,
class CoordType>
732 ::simplex().position(0,0));
735 template<
int dimension,
class CoordType>
739 std::vector<CoordVector> corners(dimension+1);
743 for(
int i = 0; i <= dimension; ++i)
744 corners[i] = global(refelem.
position(i, dimension));
748 template<
int dimension,
class CoordType>
751 global(
const CoordVector &local)
const {
755 v /= (
typename CoordVector::value_type)size;
761 template<
int dimension,
class CoordType>
762 template<
int codimension>
764 :
public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
775 template<
int dimension,
class CoordType>
776 template<
int codimension>
789 namespace RefinementImp {
797 template<
unsigned topologyId,
class CoordType,
unsigned coerceToId,
800 topologyId, CoordType, coerceToId, dim,
801 typename std::enable_if<
802 ((GenericGeometry::SimplexTopology<dim>::type::id >> 1) ==
804 (GenericGeometry::SimplexTopology<dim>::type::id >> 1) ==
809 typedef Simplex::RefinementImp<dim, CoordType> Imp;
This file contains the parts independent of a particular Refinement implementation.
Definition affinegeometry.hh:19
int pointIndex(const FieldVector< int, dimension > &point)
calculate the index of a given gridpoint within a Kuhn0 simplex
Definition simplex.cc:312
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:325
int factorial(int n)
Calculate n!
Definition simplex.cc:282
int binomial(int upper, int lower)
calculate
Definition simplex.cc:294
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
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:402
This class provides access to geometric and topological properties of a reference element.
Definition referenceelements.hh:53
const FieldVector< ctype, dim > & position(int i, int c) const
position of the barycenter of entity (i,c)
Definition referenceelements.hh:148
const GeometryType & type(int i, int c) const
obtain the type of subentity (i,c)
Definition referenceelements.hh:130
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:455
static const ReferenceElement< ctype, dim > & simplex()
get simplex reference elements
Definition referenceelements.hh:466
Static tag representing a codimension.
Definition dimension.hh:22
Implement a MultiLinearGeometry with additional caching.
Definition multilineargeometry.hh:485
Definition simplex.cc:422
Codim< dimension >::SubEntityIterator VertexIterator
Definition simplex.cc:429
FieldVector< int, dimension+1 > IndexVector
Definition simplex.cc:432
CoordType ctype
Definition simplex.cc:425
static VertexIterator vEnd(int level)
Definition simplex.cc:471
static int nVertices(int level)
Definition simplex.cc:455
static int nElements(int level)
Definition simplex.cc:479
Codim< 0 >::SubEntityIterator ElementIterator
Definition simplex.cc:431
static ElementIterator eBegin(int level)
Definition simplex.cc:487
@ dimension
Definition simplex.cc:424
FieldVector< CoordType, dimension > CoordVector
Definition simplex.cc:430
static VertexIterator vBegin(int level)
Definition simplex.cc:463
static ElementIterator eEnd(int level)
Definition simplex.cc:495
Definition simplex.cc:446
Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition simplex.cc:449
Definition simplex.cc:506
Definition simplex.cc:512
Refinement::CoordVector CoordVector
Definition simplex.cc:515
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:514
Vertex vertex
Definition simplex.cc:532
Refinement::template Codim< dimension >::Geometry Geometry
Definition simplex.cc:516
RefinementIteratorSpecial< dimension, CoordType, dimension > This
Definition simplex.cc:517
FieldVector< int, dimension > Vertex
Definition simplex.cc:529
int size
Definition simplex.cc:531
Definition simplex.cc:602
int kuhnIndex
Definition simplex.cc:629
FieldVector< int, dimension > Vertex
Definition simplex.cc:625
Vertex origin
Definition simplex.cc:628
int index_
Definition simplex.cc:631
Refinement::template Codim< 0 >::Geometry Geometry
Definition simplex.cc:607
Refinement::IndexVector IndexVector
Definition simplex.cc:605
Refinement::CoordVector CoordVector
Definition simplex.cc:606
RefinementIteratorSpecial< dimension, CoordType, 0 > This
Definition simplex.cc:608
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:604
int size
Definition simplex.cc:630
SubEntityIterator(int level, bool end=false)
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:768
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:25