From f0bd17017e550f7564a5bc4acf3527cd2c94fa69 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Thu, 13 Sep 2007 21:02:20 +0000 Subject: [PATCH] start reintro high order rep --- Geo/MElement.cpp | 44 ++++++++++++---- Geo/MElement.h | 132 +++++++++++++++++++++++------------------------ 2 files changed, 98 insertions(+), 78 deletions(-) diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 06a4a0fded..e332c9d210 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -1,4 +1,4 @@ -// $Id: MElement.cpp,v 1.39 2007-09-12 20:14:34 geuzaine Exp $ +// $Id: MElement.cpp,v 1.40 2007-09-13 21:02:20 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -87,6 +87,21 @@ int MElement::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) return 2; } +int MElement::_getEdgeRep(const int edge[2], double *x, double *y, double *z, + SVector3 *n, int faceIndex) +{ + MEdge e(getVertex(edge[0]), getVertex(edge[1])); + SVector3 normal = (faceIndex >= 0) ? getFace(faceIndex).normal() : e.normal(); + for(int i = 0; i < 2; i++){ + MVertex *v = e.getVertex(i); + x[i] = v->x(); + y[i] = v->y(); + z[i] = v->z(); + n[i] = normal; + } + return 2; +} + int MElement::getNumFacesRep() { return getNumFaces(); @@ -106,6 +121,23 @@ int MElement::getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) return f.getNumVertices(); } +int MElement::_getFaceRep(const int face[3], double *x, double *y, double *z, + SVector3 *n) +{ + for(int i = 0; i < 3; i++){ + MVertex *v = getVertex(face[i]); + x[i] = v->x(); + y[i] = v->y(); + z[i] = v->z(); + } + SVector3 t1(x[1] - x[0], y[1] - y[0], z[1] - z[0]); + SVector3 t2(x[2] - x[0], y[2] - y[0], z[2] - z[0]); + SVector3 normal = crossprod(t1, t2); + normal.normalize(); + for(int i = 0; i < 3; i++) n[i] = normal; + return 3; +} + double MTetrahedron::gammaShapeMeasure() { double p0[3] = { _v[0]->x(), _v[0]->y(), _v[0]->z() }; @@ -517,16 +549,6 @@ void MTriangle::circumcenterXY(double *res) const circumcenterXY(p1, p2, p3, res); } -int MTriangleN::getNumFaceVertices(){ - if (_order == 3 && _vs.size() == 6) return 0; - if (_order == 3 && _vs.size() == 7) return 1; - if (_order == 4 && _vs.size() == 9) return 0; - if (_order == 4 && _vs.size() == 12) return 3; - if (_order == 5 && _vs.size() == 12) return 0; - if (_order == 5 && _vs.size() == 18) return 6; - throw; -} - int P1[3][2] = { {0,0}, {1,0}, diff --git a/Geo/MElement.h b/Geo/MElement.h index 509064e67b..c87b29a733 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -39,7 +39,11 @@ class MElement int _num; short _partition; char _visible; - + protected: + int _getEdgeRep(const int edge[2], double *x, double *y, double *z, + SVector3 *n, int faceIndex=-1); + int _getFaceRep(const int face[3], double *x, double *y, double *z, + SVector3 *n); public : MElement(int num=0, int part=0) : _visible(true) @@ -229,16 +233,14 @@ class MLine3 : public MLine { return getVertex(map[num]); } virtual int getNumEdgeVertices(){ return 1; } - /* virtual int getNumEdgesRep(){ return 2; } - virtual MEdge getEdgeRep(int num) + virtual int getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { static const int edges_lin3[2][2] = { {0, 2}, {2, 1} }; - return MEdge(getVertex(edges_lin3[num][0]), getVertex(edges_lin3[num][1])); + return _getEdgeRep(edges_lin3[num], x, y, z, n); } - */ virtual int getTypeForMSH(){ return MSH_LIN_3; } virtual int getTypeForUNV(){ return 24; } // parabolic beam virtual const char *getStringForPOS(){ return "SL2"; } @@ -267,27 +269,21 @@ class MLineN : public MLine { virtual int getPolynomialOrder(){ return _vs.size() + 1; } virtual int getNumVertices(){ return _vs.size() + 2; } virtual MVertex *getVertex(int num){ return num < 2 ? _v[num] : _vs[num - 2]; } - virtual MVertex *getVertexUNV(int num) - { - if(num == 0) return _v[0]; - if(num == (int)_vs.size() + 1) return _v[1]; - return _vs[num-1]; - } virtual int getNumEdgeVertices(){ return _vs.size(); } - /* virtual int getNumEdgesRep(){ return _vs.size() + 1; } - virtual MEdge getEdgeRep(int num) + virtual int getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { - return MEdge(getVertexUNV(num),getVertexUNV(num+1)); + const int edge[2] = {(num == 0) ? 0 : num + 1, + (num == getNumEdgesRep() - 1) ? 1 : num + 2}; + return _getEdgeRep(edge, x, y, z, n); } - */ virtual int getTypeForMSH(){ - if(_vs.size() == 2) return MSH_LIN_4; - if(_vs.size() == 3) return MSH_LIN_5; - if(_vs.size() == 4) return MSH_LIN_6; + if(_vs.size() == 2) return MSH_LIN_4; + if(_vs.size() == 3) return MSH_LIN_5; + if(_vs.size() == 4) return MSH_LIN_6; throw; } - virtual int getTypeForUNV(){ throw; } // not available + virtual int getTypeForUNV(){ return 0; } // not available virtual const char *getStringForPOS(){ return 0; } // not available virtual const char *getStringForBDF(){ return 0; } // not available }; @@ -295,7 +291,7 @@ class MLineN : public MLine { class MTriangle : public MElement { protected: MVertex *_v[3]; - virtual void jac ( int order, MVertex *v[], double u, double v , double jac[2][2]) ; + virtual void jac(int order, MVertex *v[], double u, double v, double jac[2][2]); public : MTriangle(MVertex *v0, MVertex *v1, MVertex *v2, int num=0, int part=0) : MElement(num, part) @@ -309,7 +305,7 @@ class MTriangle : public MElement { } ~MTriangle(){} virtual int getDim(){ return 2; } - virtual void getMat(double mat[2][2]) + virtual void getMat(double mat[2][2]) { mat[0][0] = _v[1]->x() - _v[0]->x(); mat[0][1] = _v[2]->x() - _v[0]->x(); @@ -326,10 +322,11 @@ class MTriangle : public MElement { bool invertmappingUV(GFace*,double *p, double *uv, double tol = 1.e-8); virtual int getNumVertices(){ return 3; } virtual MVertex *getVertex(int num){ return _v[num]; } - virtual MVertex *getOtherVertex(MVertex *v1, MVertex *v2){ - if( _v[0] != v1 && _v[0] != v2 ) return _v[0]; - if( _v[1] != v1 && _v[1] != v2 ) return _v[1]; - if( _v[2] != v1 && _v[2] != v2 ) return _v[2]; + virtual MVertex *getOtherVertex(MVertex *v1, MVertex *v2) + { + if(_v[0] != v1 && _v[0] != v2) return _v[0]; + if(_v[1] != v1 && _v[1] != v2) return _v[1]; + if(_v[2] != v1 && _v[2] != v2) return _v[2]; throw; } virtual int getNumEdges(){ return 3; } @@ -355,7 +352,7 @@ class MTriangle : public MElement { { MVertex *tmp = _v[1]; _v[1] = _v[2]; _v[2] = tmp; } - virtual void jac ( double u, double v , double j[2][2]) ; + virtual void jac(double u, double v, double j[2][2]); }; class MTriangle6 : public MTriangle { @@ -385,28 +382,24 @@ class MTriangle6 : public MTriangle { return getVertex(map[num]); } virtual int getNumEdgeVertices(){ return 3; } - /* virtual int getNumEdgesRep(){ return 6; } - virtual MEdge getEdgeRep(int num) + virtual int getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { static const int edges_tri6[6][2] = { {0, 3}, {3, 1}, {1, 4}, {4, 2}, {2, 5}, {5, 0} }; - return MEdge(getVertex(edges_tri6[num][0]), getVertex(edges_tri6[num][1])); + return _getEdgeRep(edges_tri6[num], x, y, z, n, 0); } virtual int getNumFacesRep(){ return 4; } - virtual MFace getFaceRep(int num) + virtual int getFaceRep(int num, double *x, double *y, double *z, SVector3 *n) { - static const int trifaces_tri2[4][3] = { + static const int faces_tri2[4][3] = { {0, 3, 5}, {1, 4, 3}, {2, 5, 4}, {3, 4, 5} }; - return MFace(getVertex(trifaces_tri2[num][0]), - getVertex(trifaces_tri2[num][1]), - getVertex(trifaces_tri2[num][2])); + return _getFaceRep(faces_tri2[num], x, y, z, n); } - */ virtual int getTypeForMSH(){ return MSH_TRI_6; } virtual int getTypeForUNV(){ return 92; } // thin shell parabolic triangle virtual const char *getStringForPOS(){ return "ST2"; } @@ -424,6 +417,15 @@ class MTriangleN : public MTriangle { protected: std::vector<MVertex *> _vs; const short _order; + int _orderedIndex(int num) + { + if(num == 0) return 0; + else if(num < _order) return num + 2; + else if(num == _order) return 1; + else if(num < 2 * _order) return num + 1; + else if(num == 2 * _order) return 2; + else return num; + } public: MTriangleN(MVertex *v0, MVertex *v1, MVertex *v2, std::vector<MVertex*> &v, int order, int num=0, int part=0) @@ -438,41 +440,39 @@ class MTriangleN : public MTriangle { for(unsigned int i = 0; i < _vs.size(); i++) _vs[i]->setPolynomialOrder(_order); } ~MTriangleN(){} - virtual int getPolynomialOrder(){ - return _order; - } + virtual int getPolynomialOrder(){ return _order; } virtual int getNumVertices(){ return 3 + _vs.size() ; } virtual MVertex *getVertex(int num){ return num < 3 ? _v[num] : _vs[num - 3]; } - virtual MVertex *getVertexUNV(int num) - { - if (num == 0) return _v[0]; - if (num < _order ) return _vs[num - 1]; - if (num == _order ) return _v[1]; - if (num < 2* _order ) return _vs[num - 2]; - if (num == 2*_order ) return _v[2]; - return _vs[num - 3]; + virtual int getNumFaceVertices() + { + if(_order == 3 && _vs.size() == 6) return 0; + if(_order == 3 && _vs.size() == 7) return 1; + if(_order == 4 && _vs.size() == 9) return 0; + if(_order == 4 && _vs.size() == 12) return 3; + if(_order == 5 && _vs.size() == 12) return 0; + if(_order == 5 && _vs.size() == 18) return 6; + throw; } - virtual int getNumFaceVertices(); virtual int getNumEdgeVertices(){ return _order - 1; } - /* - virtual int getNumEdgesRep(){ return 3 * _order ; } - virtual MEdge getEdgeRep(int num) + virtual int getNumEdgesRep(){ return 3 * _order; } + virtual int getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n) { - return MEdge(getVertexUNV(num), getVertexUNV((num+1)%(3*_order))); - } - virtual int getNumFacesRep(); - virtual MFace getFaceRep(int num); - */ - virtual int getTypeForMSH(){ - if (_order == 3 && _vs.size() == 6) return MSH_TRI_9; - if (_order == 3 && _vs.size() == 7) return MSH_TRI_10; - if (_order == 4 && _vs.size() == 9) return MSH_TRI_12; - if (_order == 4 && _vs.size() == 12) return MSH_TRI_15; - if (_order == 5 && _vs.size() == 12) return MSH_TRI_15I; - if (_order == 5 && _vs.size() == 18) return MSH_TRI_21; + const int edge[2] = {_orderedIndex(num), _orderedIndex((num + 1) % (3 * _order))}; + return _getEdgeRep(edge, x, y, z, n, 0); + } + //virtual int getNumFacesRep(){ TODO } + //virtual MFace getFaceRep(int num){ TODO } + virtual int getTypeForMSH() + { + if(_order == 3 && _vs.size() == 6) return MSH_TRI_9; + if(_order == 3 && _vs.size() == 7) return MSH_TRI_10; + if(_order == 4 && _vs.size() == 9) return MSH_TRI_12; + if(_order == 4 && _vs.size() == 12) return MSH_TRI_15; + if(_order == 5 && _vs.size() == 12) return MSH_TRI_15I; + if(_order == 5 && _vs.size() == 18) return MSH_TRI_21; throw; } - virtual int getTypeForUNV(){ throw; } // not available + virtual int getTypeForUNV(){ return 0; } // not available virtual const char *getStringForPOS(){ return 0; } virtual const char *getStringForBDF(){ return 0; } virtual void revert() @@ -480,14 +480,12 @@ class MTriangleN : public MTriangle { MVertex *tmp; tmp = _v[1]; _v[1] = _v[2]; _v[2] = tmp; std::vector<MVertex*> inv; - inv.insert (inv.begin(),_vs.rbegin(),_vs.rend()); + inv.insert(inv.begin(), _vs.rbegin(), _vs.rend()); _vs = inv; } - virtual void jac ( double u, double v , double jac[2][2]) ; + virtual void jac(double u, double v, double jac[2][2]); }; - - template <class T> void sort3(T *t[3]) { -- GitLab