13#ifndef GRIDCOMBINATORICS_HH
14#define GRIDCOMBINATORICS_HH
21#include "dune/geometry/type.hh"
22#include "dune/geometry/referenceelements.hh"
40 template <
class Map,
class IndexSet,
class LocalDofs>
46 for (
int codim=0; codim<=dim; ++codim) {
47 for (
size_t i=0; i<is.geomTypes(codim).size(); i++) {
48 Dune::GeometryType gt = is.geomTypes(codim)[i];
51 n += is.size(gt) * localDof(gt);
61 namespace GridCombinatoricsDetail {
74 template <
int d,
class Idx>
75 void vIds(
int c,
int k, Idx idx)
79 auto const& s = Dune::ReferenceElements<double,d>::simplex();
80 assert(0<=k && k<s.size(c));
81 assert(s.size(k,c,d)==d-c+1);
82 for (
int i=0; i<s.size(k,c,d); ++i, ++idx)
83 *idx = s.subEntity(k,c,i,d);
89 inline int localVertexNumber(
int dim,
int coord)
91 return (coord+1) % (dim+1);
99 inline int barycentricDirection(
int dim,
int vertexNumber)
101 return (vertexNumber+dim) % (dim+1);
124 GridCombinatoricsDetail::vIds<1>(c,k,idx);
127 GridCombinatoricsDetail::vIds<2>(c,k,idx);
130 GridCombinatoricsDetail::vIds<3>(c,k,idx);
133 assert(
"Not implemented for d>3!"==0);
145 template <
int dimension>
149 template <
class IndexSet,
class Cell>
152 for (
int i=0; i<=dimension; ++i)
153 gvid[i] = is.subIndex(cell,i,dimension);
168 using namespace GridCombinatoricsDetail;
170 std::array<int,dimension+1-codim> vs;
171 vIds<dimension>(codim,e,begin(vs));
173 std::array<std::pair<size_t,int>,dimension+1-codim> vids;
174 for (
int i=0; i<dimension+1-codim; ++i)
175 vids[i] = std::make_pair(gvid[vs[i]],
176 barycentricDirection(dimension,vs[i]));
177 std::sort(begin(vids),end(vids),
FirstLess());
179 std::array<int,dimension+1-codim> pi;
180 std::iota(begin(pi),end(pi),0);
181 for (
int i=0; i<dimension+1-codim; ++i)
182 pi[i] = vids[i].second;
193 template <
class OutIter>
198 case 0: {
auto pi0 = barycentricSubsetPermutation<0>(e); std::copy(begin(pi0),end(pi0),out);
break; }
199 case 1: {
auto pi1 = barycentricSubsetPermutation<1>(e); std::copy(begin(pi1),end(pi1),out);
break; }
200 case 2: {
auto pi2 = barycentricSubsetPermutation<2>(e); std::copy(begin(pi2),end(pi2),out);
break; }
203 default: assert(
"Not implemented for codim>3!"==0); abort();
208 std::array<int,dimension+1> gvid;
A class for computing permutations of local vertex numbers of simplex subentities to a globally uniqu...
std::array< int, dimension+1-codim > barycentricSubsetPermutation(int e) const
Computes a permutation of barycentric coordinates to globally unique ordering.
GlobalBarycentricPermutation(IndexSet const &is, Cell const &cell)
void barycentricSubsetPermutation(int e, int codim, OutIter out) const
A dynamic interface to barycentricSubsetPermutation.
size_t computeDofStartIndices(int dim, Map &map, IndexSet const &is, LocalDofs &localDof)
For each codimension (i.e., type of subentity) computes the number of global ansatz functions as well...
typename GridView::template Codim< 0 >::Entity Cell
The type of cells (entities of codimension 0) in the grid view.
void vertexids(int d, int c, int k, int *idx)
Computes the d-c+1 local vertex indices of the vertices incident to the k-th subentity of codimension...
A comparator functor that supports sorting std::pair by their first component.