12#ifndef KASKADE_CUBE_HH
13#define KASKADE_CUBE_HH
20#include <dune/common/fvector.hh>
24 template <
class Real,
int dim_>
28 static constexpr int dim = dim_;
36 *
this = std::move(other);
43 vertices = std::move(other.vertices);
53 std::vector<Dune::FieldVector<Real,dim> >
vertices;
59 template <
class Real_=
double>
72 initVertices(x0[0],x0[1],dx[0],dx[1]);
77 initSymmetricVertices(x0[0],x0[1],dx[0],dx[1]);
78 initSymmetricTriangles();
89 v[0] = x; v[1] = y;
vertices.push_back(v);
90 v[0] = x+dx; v[1] = y;
vertices.push_back(v);
91 v[0] = x; v[1] = y+dy;
vertices.push_back(v);
92 v[0] = x+dx; v[1] = y+dy;
vertices.push_back(v);
98 v[0] = x; v[1] = y;
vertices.push_back(v);
99 v[0] = x+dx; v[1] = y;
vertices.push_back(v);
100 v[0] = x+dx; v[1] = y+dy;
vertices.push_back(v);
101 v[0] = x; v[1] = y+dy;
vertices.push_back(v);
102 v[0] = x+0.5*dx; v[1] = y+0.5*dx;
vertices.push_back(v);
107 std::vector<unsigned int> p(3,0);
109 p[0] = 0; p[1] = 1; p[2] = 3;
simplices.push_back(p);
110 p[0] = 0; p[1] = 3; p[2] = 2;
simplices.push_back(p);
113 void initSymmetricTriangles()
115 std::vector<unsigned int> p(3,0);
117 p[0] = 0; p[1] = 1; p[2] = 4;
simplices.push_back(p);
118 p[0] = 1; p[1] = 2; p[2] = 4;
simplices.push_back(p);
119 p[0] = 2; p[1] = 3; p[2] = 4;
simplices.push_back(p);
120 p[0] = 3; p[1] = 0; p[2] = 4;
simplices.push_back(p);
124 template <
class Real_=
double>
139 initVertices(x0[0],x0[1],x0[2],dx[0],dx[1],dx[2]);
144 initSymmetricVertices(x0[0],x0[1],x0[2],dx[0],dx[1],dx[2]);
145 initSymmetricTetrahedra();
157 v[0]=x; v[1]=y; v[2]=z;
vertices.push_back(v);
158 v[0]=x+dx; v[1]=y; v[2]=z;
vertices.push_back(v);
159 v[0]=x+dx; v[1]=y; v[2]=z+dz;
vertices.push_back(v);
160 v[0]=x; v[1]=y; v[2]=z+dz;
vertices.push_back(v);
163 v[0]=x; v[1]=y+dy; v[2]=z;
vertices.push_back(v);
164 v[0]=x+dx; v[1]=y+dy; v[2]=z;
vertices.push_back(v);
165 v[0]=x+dx; v[1]=y+dy; v[2]=z+dz;
vertices.push_back(v);
166 v[0]=x; v[1]=y+dy; v[2]=z+dz;
vertices.push_back(v);
169 v[0]=x+0.5*dx; v[1]=y+0.5*dy ;v[2]=z+0.5*dz;
vertices.push_back(v);
177 v[0]=x; v[1]=y; v[2]=z;
vertices.push_back(v);
178 v[0]=x+dx; v[1]=y; v[2]=z;
vertices.push_back(v);
179 v[0]=x+dx; v[1]=y; v[2]=z+dz;
vertices.push_back(v);
180 v[0]=x; v[1]=y; v[2]=z+dz;
vertices.push_back(v);
183 v[0]=x; v[1]=y+dy; v[2]=z;
vertices.push_back(v);
184 v[0]=x+dx; v[1]=y+dy; v[2]=z;
vertices.push_back(v);
185 v[0]=x+dx; v[1]=y+dy; v[2]=z+dz;
vertices.push_back(v);
186 v[0]=x; v[1]=y+dy; v[2]=z+dz;
vertices.push_back(v);
189 v[0]=x+0.5*dx; v[1]=y+0.5*dy; v[2]=z+0.5*dz;
vertices.push_back(v);
192 v[0]=x; v[1]=y+0.5*dy; v[2]=z+0.5*dz;
vertices.push_back(v);
193 v[0]=x+dx; v[1]=y+0.5*dy; v[2]=z+0.5*dz;
vertices.push_back(v);
194 v[0]=x+0.5*dx; v[1]=y; v[2]=z+0.5*dz;
vertices.push_back(v);
195 v[0]=x+0.5*dx; v[1]=y+dy; v[2]=z+0.5*dz;
vertices.push_back(v);
196 v[0]=x+0.5*dx; v[1]=y+0.5*dy; v[2]=z;
vertices.push_back(v);
197 v[0]=x+0.5*dx; v[1]=y+0.5*dy; v[2]=z+dz;
vertices.push_back(v);
200 void initSymmetricTetrahedra()
202 std::vector<unsigned int> p(4,0);
205 p[0]=13; p[1]=1; p[2]=5; p[3]=8;
simplices.push_back(p);
206 p[0]=13; p[1]=5; p[2]=4; p[3]=8;
simplices.push_back(p);
207 p[0]=13; p[1]=4; p[2]=0; p[3]=8;
simplices.push_back(p);
208 p[0]=13; p[1]=0; p[2]=1; p[3]=8;
simplices.push_back(p);
211 p[0]=14; p[1]=3; p[2]=2; p[3]=8;
simplices.push_back(p);
212 p[0]=14; p[1]=2; p[2]=6; p[3]=8;
simplices.push_back(p);
213 p[0]=14; p[1]=6; p[2]=7; p[3]=8;
simplices.push_back(p);
214 p[0]=14; p[1]=7; p[2]=3; p[3]=8;
simplices.push_back(p);
217 p[0]=10; p[1]=6; p[2]=5; p[3]=8;
simplices.push_back(p);
218 p[0]=10; p[1]=5; p[2]=1; p[3]=8;
simplices.push_back(p);
219 p[0]=10; p[1]=1; p[2]=2; p[3]=8;
simplices.push_back(p);
220 p[0]=10; p[1]=2; p[2]=6; p[3]=8;
simplices.push_back(p);
223 p[0]=9; p[1]=3; p[2]=0; p[3]=8;
simplices.push_back(p);
224 p[0]=9; p[1]=0; p[2]=4; p[3]=8;
simplices.push_back(p);
225 p[0]=9; p[1]=4; p[2]=7; p[3]=8;
simplices.push_back(p);
226 p[0]=9; p[1]=7; p[2]=3; p[3]=8;
simplices.push_back(p);
229 p[0]=11; p[1]=1; p[2]=0; p[3]=8;
simplices.push_back(p);
230 p[0]=11; p[1]=0; p[2]=3; p[3]=8;
simplices.push_back(p);
231 p[0]=11; p[1]=3; p[2]=2; p[3]=8;
simplices.push_back(p);
232 p[0]=11; p[1]=2; p[2]=1; p[3]=8;
simplices.push_back(p);
235 p[0]=12; p[1]=4; p[2]=5; p[3]=8;
simplices.push_back(p);
236 p[0]=12; p[1]=5; p[2]=6; p[3]=8;
simplices.push_back(p);
237 p[0]=12; p[1]=6; p[2]=7; p[3]=8;
simplices.push_back(p);
238 p[0]=12; p[1]=7; p[2]=4; p[3]=8;
simplices.push_back(p);
241 void initTetrahedra()
243 std::vector<unsigned int> p(4,0);
246 p[0]=0; p[1]=1; p[2]=2; p[3]=8;
simplices.push_back(p);
247 p[0]=2; p[1]=3; p[2]=0; p[3]=8;
simplices.push_back(p);
250 p[0]=6; p[1]=5; p[2]=4; p[3]=8;
simplices.push_back(p);
251 p[0]=4; p[1]=6; p[2]=7; p[3]=8;
simplices.push_back(p);
254 p[0]=6; p[1]=1; p[2]=5; p[3]=8;
simplices.push_back(p);
255 p[0]=2; p[1]=1; p[2]=6; p[3]=8;
simplices.push_back(p);
258 p[0]=0; p[1]=4; p[2]=7; p[3]=8;
simplices.push_back(p);
259 p[0]=0; p[1]=7; p[2]=3; p[3]=8;
simplices.push_back(p);
262 p[0]=0; p[1]=1; p[2]=5; p[3]=8;
simplices.push_back(p);
263 p[0]=0; p[1]=5; p[2]=4; p[3]=8;
simplices.push_back(p);
266 p[0]=3; p[1]=2; p[2]=6; p[3]=8;
simplices.push_back(p);
267 p[0]=3; p[1]=6; p[2]=7; p[3]=8;
simplices.push_back(p);
271 template <
class Real_=
double>
285 Real localAngle = (2*
pi)/nCorners;
286 Real ratio = 1./localAngle;
290 initVertices(center, radius, localAngle, nCorners, symmetric);
291 initSimplices(nCorners, localAngle);
295 initSymmetricVertices(center, radius, localAngle, nCorners, symmetric);
296 initSymmetricTetrahedra();
307 return std::log(val)/std::log(2);
312 size_t regFactor = (nCorners > 8) ? (
size_t)round(log2(1/localAngle)) : 1;
313 Real div = 1./regFactor;
314 if(div < 1 ) div=0.5;
319 size_t innerCorners = 8;
321 for(
size_t i=0; i<innerCorners; ++i)
323 v[0] = div * radius * sin(i*angle);
324 v[0] = div * radius * cos(i*angle);
365 void initSimplices(
size_t nCorners,
Real localAngle)
367 size_t regFactor = (nCorners > 8) ? (
size_t)round(log2(1/localAngle)) : 1;
368 Real div = 1./regFactor;
369 if(div < 1 ) div=0.5;
372 std::vector<unsigned int> p(3,0);
373 for(
size_t i=0; i<8; ++i)
376 if(i+2 > 8) p[2] = i+2-8;
399 void addSimplex(
unsigned int a,
unsigned int b,
unsigned int c)
401 std::vector<unsigned int> p = { a, b, c };
410 for(
size_t i=0; i<nCorners; ++i)
412 v[0] = radius * sin(i*localAngle);
413 v[1] = radius * cos(i*localAngle);
418 void initSymmetricTetrahedra()
BasicGridElement(BasicGridElement &&other)
std::vector< std::vector< unsigned int > > const & getSimplices() const
BasicGridElement & operator=(BasicGridElement const &other)=default
BasicGridElement(BasicGridElement const &other)=default
std::vector< std::vector< unsigned int > > simplices
std::vector< Dune::FieldVector< Real, dim > > const & getVertices() const
std::vector< Dune::FieldVector< Real, dim > > vertices
BasicGridElement & operator=(BasicGridElement &&other)
Circle(bool symmetric=false)
Circle(Dune::FieldVector< Real, 2 > const ¢er, Real radius, size_t nCorners, bool symmetric)
Cube(bool symmetric=false)
Cube(Dune::FieldVector< Real, 3 > const &x0, Dune::FieldVector< Real, 3 > const &dx, bool symmetric)
Square(Dune::FieldVector< Real, 2 > const &x0, Dune::FieldVector< Real, 2 > const &dx, bool symmetric=false)
Square(bool symmetric=false)