27 static std::array<unsigned int,d> multiindex (
unsigned int i)
29 std::array<unsigned int,d> alpha;
30 for (
int j=0; j<d; j++)
39 void setup1d(std::vector<unsigned int>& subEntity)
55 subEntity[lastIndex++] = 0;
56 for (
unsigned i = 0; i < k - 1; ++i)
57 subEntity[lastIndex++] = 0;
59 subEntity[lastIndex++] = 1;
61 assert((StaticPower<k+1,d>::power==lastIndex));
64 void setup2d(std::vector<unsigned int>& subEntity)
87 subEntity[lastIndex++] = 0;
88 for (
unsigned i = 0; i < k - 1; ++i)
89 subEntity[lastIndex++] = 2;
91 subEntity[lastIndex++] = 1;
94 for (
unsigned e = 0; e < k - 1; ++e) {
95 subEntity[lastIndex++] = 0;
96 for (
unsigned i = 0; i < k - 1; ++i)
97 subEntity[lastIndex++] = 0;
98 subEntity[lastIndex++] = 1;
102 subEntity[lastIndex++] = 2;
103 for (
unsigned i = 0; i < k - 1; ++i)
104 subEntity[lastIndex++] = 3;
106 subEntity[lastIndex++] = 3;
108 assert((StaticPower<k+1,d>::power==lastIndex));
113 void setup3d(std::vector<unsigned int>& subEntity)
122 unsigned lastIndex=0;
124 const unsigned numIndices = StaticPower<k+1,d>::power;
125 const unsigned numFaceIndices = StaticPower<k+1,d-1>::power;
127 const unsigned numInnerEdgeDofs = k-1;
148 subEntity[lastIndex++] = 0;
149 for (
unsigned i = 0; i < numInnerEdgeDofs; ++i)
150 subEntity[lastIndex++] = 6;
152 subEntity[lastIndex++] = 1;
155 for (
unsigned e = 0; e < numInnerEdgeDofs; ++e) {
156 subEntity[lastIndex++] = 4;
157 for (
unsigned i = 0; i < numInnerEdgeDofs; ++i)
158 subEntity[lastIndex++] = 4;
159 subEntity[lastIndex++] = 5;
163 subEntity[lastIndex++] = 2;
164 for (
unsigned i = 0; i < k - 1; ++i)
165 subEntity[lastIndex++] = 7;
166 subEntity[lastIndex++] = 3;
168 assert(numFaceIndices==lastIndex);
172 for(
unsigned f = 0; f < numInnerEdgeDofs; ++f) {
175 subEntity[lastIndex++] = 0;
176 for (
unsigned i = 0; i < numInnerEdgeDofs; ++i)
177 subEntity[lastIndex++] = 2;
178 subEntity[lastIndex++] = 1;
181 for (
unsigned e = 0; e < numInnerEdgeDofs; ++e) {
182 subEntity[lastIndex++] = 0;
183 for (
unsigned i = 0; i < numInnerEdgeDofs; ++i)
184 subEntity[lastIndex++] = 0;
185 subEntity[lastIndex++] = 1;
189 subEntity[lastIndex++] = 2;
190 for (
unsigned i = 0; i < numInnerEdgeDofs; ++i)
191 subEntity[lastIndex++] = 3;
192 subEntity[lastIndex++] = 3;
194 assert(lastIndex==(f+1+1)*numFaceIndices);
199 subEntity[lastIndex++] = 4;
200 for (
unsigned i = 0; i < k - 1; ++i)
201 subEntity[lastIndex++] = 10;
202 subEntity[lastIndex++] = 5;
205 for (
unsigned e = 0; e < k - 1; ++e) {
206 subEntity[lastIndex++] = 8;
207 for (
unsigned i = 0; i < k - 1; ++i)
208 subEntity[lastIndex++] = 5;
209 subEntity[lastIndex++] = 9;
213 subEntity[lastIndex++] = 6;
214 for (
unsigned i = 0; i < k - 1; ++i)
215 subEntity[lastIndex++] = 11;
216 subEntity[lastIndex++] = 7;
218 assert(numIndices==lastIndex);
226 std::vector<unsigned int> codim(li.size());
228 for (std::size_t i=0; i<codim.size(); i++) {
234 std::array<unsigned int,d> mIdx = multiindex(i);
235 for (
int j=0; j<d; j++)
236 if (mIdx[j]==0 or mIdx[j]==k)
245 std::vector<unsigned int> index(
size());
247 for (std::size_t i=0; i<
size(); i++) {
251 std::array<unsigned int,d> mIdx = multiindex(i);
253 for (
int j=d-1; j>=0; j--)
254 if (mIdx[j]>0 and mIdx[j]<k)
255 index[i] = (k-1)*index[i] + (mIdx[j]-1);
260 std::vector<unsigned int> subEntity(li.size());
264 for (std::size_t i=0; i<
size(); i++)
280 DUNE_THROW(Dune::NotImplemented,
"QkLocalCoefficients for k==" << k <<
" and d==" << d);
282 for (
size_t i=0; i<li.size(); i++)
283 li[i] =
LocalKey(subEntity[i], codim[i], index[i]);
289 return StaticPower<k+1,d>::power;
299 std::vector<LocalKey> li;