From 1c09b508cb1612d894e0e443eca6aa81552449e2 Mon Sep 17 00:00:00 2001 From: Bastien Gorissen <bastien.gorissen@cenaero.be> Date: Thu, 18 Apr 2013 14:09:16 +0000 Subject: [PATCH] Improvement to P2 hex visualisation --- Geo/MHexahedron.cpp | 59 ++++++++++++++++++++++++++++---- Geo/MHexahedron.h | 82 +++++---------------------------------------- 2 files changed, 61 insertions(+), 80 deletions(-) diff --git a/Geo/MHexahedron.cpp b/Geo/MHexahedron.cpp index c032b7b366..52d0a067f5 100644 --- a/Geo/MHexahedron.cpp +++ b/Geo/MHexahedron.cpp @@ -125,9 +125,10 @@ void MHexahedron::getFaceInfo(const MFace &face, int &ithFace, int &sign, int &r Msg::Error("Could not get face information for hexahedron %d", getNum()); } -void MHexahedronN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) -{ - const int numSubEdges = CTX::instance()->mesh.numSubEdges; +static void _myGetEdgeRep(MHexahedron *hex, int num, double *x, double *y, double *z, + SVector3 *n, int numSubEdges) { + + //const int numSubEdges = CTX::instance()->mesh.numSubEdges; static double pp[8][3] = { {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}, {-1,-1,1},{1,-1,1},{1,1,1},{-1,1,1} }; @@ -151,8 +152,8 @@ void MHexahedronN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 double w2 = pp[iVertex1][2] * (1.-t2) + pp[iVertex2][2] * t2; SPoint3 pnt1, pnt2; - pnt(u1, v1, w1, pnt1); - pnt(u2, v2, w2, pnt2); + hex->pnt(u1, v1, w1, pnt1); + hex->pnt(u2, v2, w2, pnt2); x[0] = pnt1.x(); x[1] = pnt2.x(); y[0] = pnt1.y(); y[1] = pnt2.y(); z[0] = pnt1.z(); z[1] = pnt2.z(); @@ -162,6 +163,28 @@ void MHexahedronN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 n[0] = n[1] = 1 ; } +void MHexahedron20::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { + _myGetEdgeRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); +} + +void MHexahedron27::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { + _myGetEdgeRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); +} + +void MHexahedronN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { + _myGetEdgeRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); +} + +int MHexahedron20::getNumEdgesRep() +{ + return 12 * CTX::instance()->mesh.numSubEdges; +} + +int MHexahedron27::getNumEdgesRep() +{ + return 12 * CTX::instance()->mesh.numSubEdges; +} + int MHexahedronN::getNumEdgesRep() { return 12 * CTX::instance()->mesh.numSubEdges; @@ -245,7 +268,9 @@ const JacobianBasis* MHexahedron::getJacobianFuncSpace(int o) const return 0; } -static void _myGetFaceRep(MHexahedron *hex, int num, double *x, double *y, double *z, + + +void _myGetFaceRep(MHexahedron *hex, int num, double *x, double *y, double *z, SVector3 *n, int numSubEdges) { static double pp[8][3] = { @@ -411,11 +436,33 @@ static void _myGetFaceRep(MHexahedron *hex, int num, double *x, double *y, doubl n[2] = n[0]; } + +void MHexahedron20::getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) +{ + _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); +} + +void MHexahedron27::getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) +{ + _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); +} + void MHexahedronN::getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) { _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges); } +int MHexahedron20::getNumFacesRep() +{ + return 6 * (CTX::instance()->mesh.numSubEdges * CTX::instance()->mesh.numSubEdges * 2); +} + + +int MHexahedron27::getNumFacesRep() +{ + return 6 * (CTX::instance()->mesh.numSubEdges * CTX::instance()->mesh.numSubEdges * 2); +} + int MHexahedronN::getNumFacesRep() { return 6 * (CTX::instance()->mesh.numSubEdges * CTX::instance()->mesh.numSubEdges * 2); diff --git a/Geo/MHexahedron.h b/Geo/MHexahedron.h index b4eaa7afe1..ccadb418bd 100644 --- a/Geo/MHexahedron.h +++ b/Geo/MHexahedron.h @@ -250,46 +250,16 @@ class MHexahedron20 : public MHexahedron { return getVertex(map[num]); } virtual int getNumEdgeVertices() const { return 12; } - virtual int getNumEdgesRep(){ return 24; } - virtual void getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) - { - static const int e[24][2] = { - {0, 8}, {8, 1}, - {0, 9}, {9, 3}, - {0, 10}, {10, 4}, - {1, 11}, {11, 2}, - {1, 12}, {12, 5}, - {2, 13}, {13, 3}, - {2, 14}, {14, 6}, - {3, 15}, {15, 7}, - {4, 16}, {16, 5}, - {4, 17}, {17, 7}, - {5, 18}, {18, 6}, - {6, 19}, {19, 7} - }; - static const int f[12] = {0, 0, 1, 0, 1, 0, 3, 2, 1, 2, 3, 4}; - _getEdgeRep(getVertex(e[num][0]), getVertex(e[num][1]), x, y, z, n, f[num / 2]); - } + virtual int getNumEdgesRep(); + virtual void getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n); virtual void getEdgeVertices(const int num, std::vector<MVertex*> &v) const { v.resize(3); MHexahedron::_getEdgeVertices(num, v); v[2] = _vs[num]; } - virtual int getNumFacesRep(){ return 36; } - virtual void getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) - { - static const int f[36][3] = { - {0, 9, 8}, {3, 13, 9}, {2, 11, 13}, {1, 8, 11}, {8, 9, 13}, {8, 13, 11}, - {0, 8, 10}, {1, 12, 8}, {5, 16, 12}, {4, 10, 16}, {8, 12, 16}, {8, 16, 10}, - {0, 10, 9}, {4, 17, 10}, {7, 15, 17}, {3, 9, 7}, {9, 10, 17}, {9, 17, 15}, - {1, 11, 12}, {2, 14, 11}, {6, 18, 14}, {5, 12, 18}, {11, 14, 18}, {11, 18, 12}, - {2, 13, 14}, {3, 15, 13}, {7, 19, 15}, {6, 14, 19}, {13, 15, 19}, {13, 19, 14}, - {4, 16, 17}, {5, 18, 16}, {6, 19, 18}, {7, 17, 19}, {16, 18, 19}, {16, 19, 17} - }; - _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), - x, y, z, n); - } + virtual int getNumFacesRep(); + virtual void getFaceRep(int num, double *x, double *y, double *z, SVector3 *n); virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const { v.resize(8); @@ -387,52 +357,16 @@ class MHexahedron27 : public MHexahedron { virtual int getNumEdgeVertices() const { return 12; } virtual int getNumFaceVertices() const { return 6; } virtual int getNumVolumeVertices() const { return 1; } - virtual int getNumEdgesRep(){ return 24; } - virtual void getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) - { - static const int e[24][2] = { - {0, 8}, {8, 1}, - {0, 9}, {9, 3}, - {0, 10}, {10, 4}, - {1, 11}, {11, 2}, - {1, 12}, {12, 5}, - {2, 13}, {13, 3}, - {2, 14}, {14, 6}, - {3, 15}, {15, 7}, - {4, 16}, {16, 5}, - {4, 17}, {17, 7}, - {5, 18}, {18, 6}, - {6, 19}, {19, 7} - }; - static const int f[12] = {0, 0, 1, 0, 1, 0, 3, 2, 1, 2, 3, 4}; - _getEdgeRep(getVertex(e[num][0]), getVertex(e[num][1]), x, y, z, n, f[num / 2]); - } + virtual int getNumEdgesRep(); + virtual void getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n); virtual void getEdgeVertices(const int num, std::vector<MVertex*> &v) const { v.resize(3); MHexahedron::_getEdgeVertices(num, v); v[2] = _vs[num]; } - virtual int getNumFacesRep(){ return 48; } - virtual void getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) - { - static const int f[48][3] = { - {0, 9, 20}, {0, 20, 8}, {3, 13, 20}, {3, 20, 9}, - {2, 11, 20}, {2, 20, 13}, {1, 8, 20}, {1, 20, 11}, - {0, 8, 21}, {0, 21, 10}, {1, 12, 21}, {1, 21, 8}, - {5, 16, 21}, {5, 21, 12}, {4, 10, 21}, {4, 21, 16}, - {0, 10, 22}, {0, 22, 9}, {4, 17, 22}, {4, 22, 10}, - {7, 15, 22}, {7, 22, 17}, {3, 9, 22}, {3, 22, 15}, - {1, 11, 23}, {1, 23, 12}, {2, 14, 23}, {2, 23, 11}, - {6, 18, 23}, {6, 23, 14}, {5, 12, 23}, {5, 23, 18}, - {2, 13, 24}, {2, 24, 14}, {3, 15, 24}, {3, 24, 13}, - {7, 19, 24}, {7, 24, 15}, {6, 14, 24}, {6, 24, 19}, - {4, 16, 25}, {4, 25, 17}, {5, 18, 25}, {5, 25, 16}, - {6, 19, 25}, {6, 25, 18}, {7, 17, 25}, {7, 25, 19} - }; - _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), - x, y, z, n); - } + virtual int getNumFacesRep(); + virtual void getFaceRep(int num, double *x, double *y, double *z, SVector3 *n); virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const { v.resize(9); -- GitLab