58 MHexahedron(
const std::vector<MVertex *> &v,
int num = 0,
int part = 0)
61 for(
int i = 0; i < 8; i++)
_v[i] = v[i];
64 virtual int getDim()
const {
return 3; }
71 static const int map[8] = {2, 3, 7, 6, 0, 1, 5, 4};
84 virtual void getEdgeRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
102 virtual void getFaceRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
131 virtual void getNode(
int num,
double &u,
double &v,
double &w)
const
182 virtual bool isInside(
double u,
double v,
double w)
const
185 if(u < -(1. + tol) || v < -(1. + tol) || w < -(1. + tol) ||
186 u > (1. + tol) || v > (1. + tol) || w > (1. + tol))
193 static const int e[12][2] = {{0, 1}, {0, 3}, {0, 4}, {1, 2},
194 {1, 5}, {2, 3}, {2, 6}, {3, 7},
195 {4, 5}, {4, 7}, {5, 6}, {6, 7}};
196 return e[edge][vert];
200 static const int f[6][4] = {{0, 3, 2, 1}, {0, 1, 5, 4}, {0, 4, 7, 3},
201 {1, 2, 6, 5}, {2, 3, 7, 6}, {4, 5, 6, 7}};
202 return f[face][vert];
208 static const int e[6][4] = {{2, -6, -4, -1}, {1, 5, -9, -3},
209 {3, 10, -8, -2}, {4, 7, -11, -5},
210 {6, 8, -12, -7}, {9, 11, 12, -10}};
211 return e[face][edge];
216 static const int eSolin[12][2] = {{0, 1}, {0, 3}, {0, 4}, {1, 2},
217 {1, 5}, {3, 2}, {2, 6}, {3, 7},
218 {4, 5}, {4, 7}, {5, 6}, {7, 6}};
219 return MEdge(
_v[eSolin[num][0]],
_v[eSolin[num][1]]);
223 static const int fSolin[6][4] = {{0, 1, 3, 2}, {0, 1, 4, 5}, {0, 3, 4, 7},
224 {1, 2, 5, 6}, {3, 2, 7, 6}, {4, 5, 7, 6}};
225 return MFace(
_v[fSolin[num][0]],
_v[fSolin[num][1]],
226 _v[fSolin[num][2]],
_v[fSolin[num][3]]);
230 static const int map[8] = {0, 1, 3, 2, 4, 5, 7, 6};
261 :
MHexahedron(v0, v1, v2, v3, v4, v5, v6, v7, num, part)
275 for(
int i = 0; i < 12; i++)
_vs[i]->setPolynomialOrder(2);
280 for(
int i = 0; i < 12; i++)
_vs[i] = v[8 + i];
281 for(
int i = 0; i < 12; i++)
_vs[i]->setPolynomialOrder(2);
288 return num < 8 ?
_v[num] :
_vs[num - 8];
292 return num < 8 ?
_v[num] :
_vs[num - 8];
303 static const int map[20] = {0, 8, 1, 11, 2, 13, 3, 9, 10, 12,
304 14, 15, 4, 16, 5, 18, 6, 19, 7, 17};
309 static const int map[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
310 13, 9, 10, 12, 14, 15, 16, 18, 19, 17};
315 static const int map[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
316 13, 9, 16, 18, 19, 17, 10, 12, 14, 15};
321 static const int map[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
322 13, 9, 16, 18, 19, 17, 10, 12, 14, 15};
327 static const int map[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
328 13, 9, 16, 18, 19, 17, 10, 12, 14, 15};
333 static const int map[20] = {2, 3, 7, 6, 0, 1, 5, 4, 9, 18,
334 12, 19, 14, 11, 15, 13, 8, 16, 17, 10};
339 static const int map[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
340 13, 9, 16, 18, 19, 17, 10, 12, 14, 15};
345 virtual void getEdgeRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
354 virtual void getFaceRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
360 static const int f[6][4] = {{1, 5, 3, 0}, {0, 4, 8, 2}, {2, 9, 7, 1},
361 {3, 6, 10, 4}, {5, 7, 11, 6}, {8, 10, 11, 9}};
362 v[4] =
_vs[
f[num][0]];
363 v[5] =
_vs[
f[num][1]];
364 v[6] =
_vs[
f[num][2]];
365 v[7] =
_vs[
f[num][3]];
385 for(
int i = 0; i < 12; i++) old[i] =
_vs[i];
397 virtual void getNode(
int num,
double &u,
double &v,
double &w)
const
431 MVertex *v26,
int num = 0,
int part = 0)
432 :
MHexahedron(v0, v1, v2, v3, v4, v5, v6, v7, num, part)
453 for(
int i = 0; i < 19; i++)
_vs[i]->setPolynomialOrder(2);
458 for(
int i = 0; i < 19; i++)
_vs[i] = v[8 + i];
459 for(
int i = 0; i < 19; i++)
_vs[i]->setPolynomialOrder(2);
466 return num < 8 ?
_v[num] :
_vs[num - 8];
470 return num < 8 ?
_v[num] :
_vs[num - 8];
481 static const int map[27] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
482 11, 13, 9, 16, 18, 19, 17, 10, 12,
483 14, 15, 26, 20, 25, 21, 23, 24, 22};
488 static const int map[27] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
489 11, 13, 9, 16, 18, 19, 17, 10, 12,
490 14, 15, 26, 20, 25, 21, 23, 24, 22};
495 static const int map[27] = {6, 8, 26, 24, 0, 2, 20, 18, 7,
496 15, 3, 17, 5, 25, 23, 21, 1, 9,
497 11, 19, 16, 4, 12, 14, 22, 10, 13};
502 static const int map[27] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
503 11, 13, 9, 16, 18, 19, 17, 10, 12,
504 14, 15, 22, 23, 21, 24, 20, 25, 26};
511 virtual void getEdgeRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
520 virtual void getFaceRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
526 static const int f[6][4] = {{1, 5, 3, 0}, {0, 4, 8, 2}, {2, 9, 7, 1},
527 {3, 6, 10, 4}, {5, 7, 11, 6}, {8, 10, 11, 9}};
528 v[4] =
_vs[
f[num][0]];
529 v[5] =
_vs[
f[num][1]];
530 v[6] =
_vs[
f[num][2]];
531 v[7] =
_vs[
f[num][3]];
532 v[8] =
_vs[12 + num];
552 for(
int i = 0; i < 19; i++) old[i] =
_vs[i];
570 virtual void getNode(
int num,
double &u,
double &v,
double &w)
const
617 std::vector<MVertex *>
_vs;
622 const std::vector<MVertex *> &v,
char order,
int num = 0,
624 :
MHexahedron(v0, v1, v2, v3, v4, v5, v6, v7, num, part),
_order(order),
627 for(std::size_t i = 0; i <
_vs.size(); i++)
632 :
MHexahedron(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], num, part),
635 for(std::size_t i = 8; i < v.size(); i++)
_vs.push_back(v[i]);
636 for(std::size_t i = 0; i <
_vs.size(); i++)
644 return num < 8 ?
_v[num] :
_vs[num - 8];
648 return num < 8 ?
_v[num] :
_vs[num - 8];
673 virtual void getEdgeRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
679 for(
int i = 0; i <
_order - 1; i++) v[2 + i] =
_vs[(
_order - 1) * num + i];
692 for(
int i = 0; i < 4; i++) {
695 for(
int j = 0; j < n; j++) v[++count] =
_vs[n * edge_num + j];
699 for(
int j = n - 1; j >= 0; j--) v[++count] =
_vs[n * edge_num + j];
703 if((
int)v.size() > count + 1) {
704 int start = 12 * n + num * n * n;
705 for(
int i = 0; i < n * n; i++) { v[++count] =
_vs[start + i]; }
735 virtual void getFaceRep(
bool curved,
int num,
double *x,
double *y,
double *
z,
738 virtual void getNode(
int num,
double &u,
double &v,
double &w)
const