From 8c33ad3eedb6b987ea2a6d116d65ad67ed6c7a47 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Sat, 29 Aug 2009 11:04:08 +0000 Subject: [PATCH] never ever change the immutable vertex numbers: otherwise we cannot use our algorithms from outside with prescribed boundary meshes -> use MVertex::_index instead (renamed setNum to forceNum to make sure we don't use setNum by mistake) --- Geo/GModelIO_OCC.cpp | 9 +- Geo/MVertex.cpp | 2 +- Geo/MVertex.h | 18 +-- Geo/discreteEdge.cpp | 4 +- Mesh/BDS.cpp | 12 +- Mesh/Generator.cpp | 13 -- Mesh/meshGFaceDelaunayInsertion.cpp | 188 +++++++++++++------------- Mesh/meshGFaceOptimize.cpp | 159 +++++++++++----------- Mesh/meshGRegion.cpp | 67 ++++----- Mesh/meshGRegionDelaunayInsertion.cpp | 12 +- Mesh/meshGRegionDelaunayInsertion.h | 16 +-- Mesh/qualityMeasures.cpp | 36 ++--- 12 files changed, 258 insertions(+), 278 deletions(-) diff --git a/Geo/GModelIO_OCC.cpp b/Geo/GModelIO_OCC.cpp index 53793f621b..066171a1e1 100644 --- a/Geo/GModelIO_OCC.cpp +++ b/Geo/GModelIO_OCC.cpp @@ -1015,7 +1015,7 @@ static void _applyOCCMeshConstraintsOnVertices TopoDS_Shape *shape2 = (TopoDS_Shape*)gf->getNativePtr(); if(shape.IsSame(*shape2)){ Msg::Debug("... embedding vertex %d in face %d", nodeNum, gf->tag()); - gv->mesh_vertices[0]->setNum(nodeNum); + gv->mesh_vertices[0]->forceNum(nodeNum); gf->addEmbeddedVertex(gv); } } @@ -1057,8 +1057,8 @@ static void _applyOCCMeshConstraintsOnEdges int numbeg = nodeNum.Value(invert ? n : 1); int numend = nodeNum.Value(invert ? 1 : n); Msg::Debug("... beg=%d end=%d", numbeg, numend); - ge->getBeginVertex()->mesh_vertices[0]->setNum(numbeg); - ge->getEndVertex()->mesh_vertices[0]->setNum(numend); + ge->getBeginVertex()->mesh_vertices[0]->forceNum(numbeg); + ge->getEndVertex()->mesh_vertices[0]->forceNum(numend); // set the mesh on the edge for(int i = 2; i < n; i++){ int num = nodeNum.Value(invert ? n - i + 1 : i); @@ -1066,8 +1066,7 @@ static void _applyOCCMeshConstraintsOnEdges GPoint p = ge->point(u); Msg::Debug("... adding mesh vertex num=%d u=%g xyz=(%g,%g,%g)", num, u, p.x(), p.y(), p.z()); - MEdgeVertex *v = new MEdgeVertex(p.x(), p.y(), p.z(), ge, u); - v->setNum(num); + MEdgeVertex *v = new MEdgeVertex(p.x(), p.y(), p.z(), ge, u, -1., num); ge->mesh_vertices.push_back(v); } for(unsigned int i = 0; i < ge->mesh_vertices.size() + 1; i++){ diff --git a/Geo/MVertex.cpp b/Geo/MVertex.cpp index 7c7c5dab2e..3f9b6e9759 100644 --- a/Geo/MVertex.cpp +++ b/Geo/MVertex.cpp @@ -42,7 +42,7 @@ MVertex::MVertex(double x, double y, double z, GEntity *ge, int num) } } -void MVertex::setNum(int num) +void MVertex::forceNum(int num) { #pragma omp critical { diff --git a/Geo/MVertex.h b/Geo/MVertex.h index 1cf422768f..78cb939917 100644 --- a/Geo/MVertex.h +++ b/Geo/MVertex.h @@ -27,13 +27,13 @@ class MVertex{ protected: // the maximum vertex id number in the mesh static int _globalNum; - // the id number of the vertex (this number is unique and is - // guaranteed never to change once a mesh has been generated) + // the immutable id number of the vertex (this number is unique and + // is guaranteed never to change once a vertex has been created) int _num; - // a vertex index, used for example when saving a mesh (this index - // is not necessarily unique, can change after mesh renumbering, - // ...). By convention, vertices with negative indices are not - // saved + // a vertex index, used for example during mesh generation or when + // saving a mesh (this index is not necessarily unique, can change + // after mesh renumbering, etc.). By convention, vertices with + // negative indices are not saved int _index; // a visibility and polynomial order flags char _visible, _order; @@ -71,9 +71,11 @@ class MVertex{ inline GEntity* onWhat() const { return _ge; } inline void setEntity(GEntity *ge) { _ge = ge; } - // get/set the number + // get the immutable vertex number inline int getNum() const { return _num; } - void setNum(int num); + + // force the immutable number (this should normally never be used) + void forceNum(int num); // get/set the index inline int getIndex() const { return _index; } diff --git a/Geo/discreteEdge.cpp b/Geo/discreteEdge.cpp index c995316213..4caeca1900 100644 --- a/Geo/discreteEdge.cpp +++ b/Geo/discreteEdge.cpp @@ -218,10 +218,10 @@ void discreteEdge::parametrize() if (_orientation[i] == 1 ) vR = lines[i]->getVertex(1); else vR = lines[i]->getVertex(0); int param = i+1; - MVertex *vNEW = new MEdgeVertex(vR->x(),vR->y(),vR->z(), this, param); + MVertex *vNEW = new MEdgeVertex(vR->x(),vR->y(),vR->z(), this, param, + -1., vR->getNum()); old2new.insert(std::make_pair(vR,vNEW)); newVertices.push_back(vNEW); - vNEW->setNum(vR->getNum()); newLines.push_back(new MLine(vL, vNEW)); _orientation[i] = 1; vL = vNEW; diff --git a/Mesh/BDS.cpp b/Mesh/BDS.cpp index 0731fea655..a341dcd827 100644 --- a/Mesh/BDS.cpp +++ b/Mesh/BDS.cpp @@ -170,7 +170,7 @@ BDS_Point *BDS_Mesh::add_point(int num, double u, double v, GFace *gf) BDS_Point *BDS_Mesh::find_point(int p) { BDS_Point P(p); - std::set < BDS_Point *, PointLessThan >::iterator it = points.find(&P); + std::set<BDS_Point *, PointLessThan>::iterator it = points.find(&P); if(it != points.end()) return (BDS_Point*)(*it); else @@ -331,7 +331,7 @@ BDS_Edge *BDS_Mesh::recover_edge(int num1, int num2, std::set<EdgeToRecover> *e2 outputScalarField(triangles, "debugp.pos", 1); outputScalarField(triangles, "debugr.pos", 0); Msg::Debug("edge %d %d cannot be recovered at all, look at debugp.pos " - "and debugr.pos", num1, num2); + "and debugr.pos", num1, num2); return 0; } return eee; @@ -503,7 +503,7 @@ void BDS_Edge::oppositeof(BDS_Point *oface[2]) const BDS_GeomEntity *BDS_Mesh::get_geom(int p1, int p2) { BDS_GeomEntity ge(p1, p2); - std::set < BDS_GeomEntity *, GeomLessThan >::iterator it = geom.find(&ge); + std::set<BDS_GeomEntity *, GeomLessThan >::iterator it = geom.find(&ge); if(it == geom.end()) return 0; return (BDS_GeomEntity*)(*it); } @@ -528,7 +528,7 @@ void recur_tag(BDS_Face *t, BDS_GeomEntity *g) double PointLessThanLexicographic::t = 0; double BDS_Vector::t = 0; -template < class IT > void DESTROOOY(IT beg, IT end) +template <class IT> void DESTROOOY(IT beg, IT end) { while(beg != end) { delete *beg; @@ -1177,8 +1177,8 @@ bool BDS_Mesh::smooth_point_centroid(BDS_Point *p, GFace *gf, bool test_quality) std::list<BDS_Face*> ts; p->getTriangles(ts); - std::list < BDS_Edge * >::iterator ited = p->edges.begin(); - std::list < BDS_Edge * >::iterator itede = p->edges.end(); + std::list<BDS_Edge *>::iterator ited = p->edges.begin(); + std::list<BDS_Edge *>::iterator itede = p->edges.end(); double sTot = 0; while(ited != itede) { diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 67d4409472..1782257c86 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -409,20 +409,7 @@ static void Mesh2D(GModel *m) // and curve meshes) is global as it depends on a smooth normal // field generated from the surface mesh of the source surfaces if(!Mesh2DWithBoundaryLayers(m)){ - -#if 1 std::for_each(m->firstFace(), m->lastFace(), meshGFace()); -#else - // test openmp - std::vector<GFace*> faces; - faces.insert(faces.begin(), m->firstFace(), m->lastFace()); -#pragma omp parallel for schedule(dynamic) - for(unsigned int i = 0; i < faces.size(); i++){ - meshGFace mesher; - mesher(faces[i]); - } -#endif - int nIter = 0; while(1){ meshGFace mesher; diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp index 28ea0a71f0..6379ccd2dc 100644 --- a/Mesh/meshGFaceDelaunayInsertion.cpp +++ b/Mesh/meshGFaceDelaunayInsertion.cpp @@ -117,12 +117,12 @@ void circumCenterMetric(MTriangle *base, const double *metric, double *x, double &Radius2) { // d = (u2-u1) M (u2-u1) = u2 M u2 + u1 M u1 - 2 u2 M u1 - double pa[2] = {Us[base->getVertex(0)->getNum()], - Vs[base->getVertex(0)->getNum()]}; - double pb[2] = {Us[base->getVertex(1)->getNum()], - Vs[base->getVertex(1)->getNum()]}; - double pc[2] = {Us[base->getVertex(2)->getNum()], - Vs[base->getVertex(2)->getNum()]}; + double pa[2] = {Us[base->getVertex(0)->getIndex()], + Vs[base->getVertex(0)->getIndex()]}; + double pb[2] = {Us[base->getVertex(1)->getIndex()], + Vs[base->getVertex(1)->getIndex()]}; + double pc[2] = {Us[base->getVertex(2)->getIndex()], + Vs[base->getVertex(2)->getIndex()]}; circumCenterMetric(pa, pb, pc, metric, x, Radius2); } @@ -186,10 +186,12 @@ int inCircumCircleAniso(GFace *gf, MTriangle *base, const std::vector<double> &Vs) { double x[2], Radius2, metric[3]; - double pa[2] = {(Us[base->getVertex(0)->getNum()] + Us[base->getVertex(1)->getNum()] + - Us[base->getVertex(2)->getNum()]) / 3., - (Vs[base->getVertex(0)->getNum()] + Vs[base->getVertex(1)->getNum()] + - Vs[base->getVertex(2)->getNum()]) / 3.}; + double pa[2] = {(Us[base->getVertex(0)->getIndex()] + + Us[base->getVertex(1)->getIndex()] + + Us[base->getVertex(2)->getIndex()]) / 3., + (Vs[base->getVertex(0)->getIndex()] + + Vs[base->getVertex(1)->getIndex()] + + Vs[base->getVertex(2)->getIndex()]) / 3.}; buildMetric(gf, pa, metric); circumCenterMetric(base, metric, Us, Vs, x, Radius2); @@ -253,12 +255,12 @@ int inCircumCircle(MTriangle *base, const double *p, const double *param , std::vector<double> &Us, std::vector<double> &Vs) { - double pa[2] = {Us[base->getVertex(0)->getNum()], - Vs[base->getVertex(0)->getNum()]}; - double pb[2] = {Us[base->getVertex(1)->getNum()], - Vs[base->getVertex(1)->getNum()]}; - double pc[2] = {Us[base->getVertex(2)->getNum()], - Vs[base->getVertex(2)->getNum()]}; + double pa[2] = {Us[base->getVertex(0)->getIndex()], + Vs[base->getVertex(0)->getIndex()]}; + double pb[2] = {Us[base->getVertex(1)->getIndex()], + Vs[base->getVertex(1)->getIndex()]}; + double pc[2] = {Us[base->getVertex(2)->getIndex()], + Vs[base->getVertex(2)->getIndex()]}; double result = gmsh::incircle(pa, pb, pc, (double*)param) * gmsh::orient2d(pa, pb, pc); @@ -351,14 +353,14 @@ void recurFindCavityAniso(GFace *gf, bool circUV(MTriangle *t, std::vector<double> & Us, std::vector<double> &Vs, double *res, GFace *gf) { - double u1 [3] = {Us[t->getVertex(0)->getNum()], Vs[t->getVertex(0)->getNum()], 0}; - double u2 [3] = {Us[t->getVertex(1)->getNum()], Vs[t->getVertex(1)->getNum()], 0}; - double u3 [3] = {Us[t->getVertex(2)->getNum()], Vs[t->getVertex(2)->getNum()], 0}; + double u1[3] = {Us[t->getVertex(0)->getIndex()], Vs[t->getVertex(0)->getIndex()], 0}; + double u2[3] = {Us[t->getVertex(1)->getIndex()], Vs[t->getVertex(1)->getIndex()], 0}; + double u3[3] = {Us[t->getVertex(2)->getIndex()], Vs[t->getVertex(2)->getIndex()], 0}; circumCenterXY(u1, u2, u3, res); return true; - double p1 [3] = {t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z()}; - double p2 [3] = {t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z()}; - double p3 [3] = {t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z()}; + double p1[3] = {t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z()}; + double p2[3] = {t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z()}; + double p3[3] = {t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z()}; double resxy[3], uv[2]; circumCenterXYZ(p1, p2, p3, resxy,uv); return true; @@ -371,12 +373,12 @@ bool invMapUV(MTriangle *t, double *p, double mat[2][2]; double b[2]; - double u0 = Us[t->getVertex(0)->getNum()]; - double v0 = Vs[t->getVertex(0)->getNum()]; - double u1 = Us[t->getVertex(1)->getNum()]; - double v1 = Vs[t->getVertex(1)->getNum()]; - double u2 = Us[t->getVertex(2)->getNum()]; - double v2 = Vs[t->getVertex(2)->getNum()]; + double u0 = Us[t->getVertex(0)->getIndex()]; + double v0 = Vs[t->getVertex(0)->getIndex()]; + double u1 = Us[t->getVertex(1)->getIndex()]; + double v1 = Vs[t->getVertex(1)->getIndex()]; + double u2 = Us[t->getVertex(2)->getIndex()]; + double v2 = Vs[t->getVertex(2)->getIndex()]; mat[0][0] = u1 - u0; mat[0][1] = u2 - u0; @@ -399,14 +401,14 @@ bool invMapUV(MTriangle *t, double *p, double getSurfUV(MTriangle *t, std::vector<double> &Us, std::vector<double> &Vs) { - double u1 = Us[t->getVertex(0)->getNum()]; - double v1 = Vs[t->getVertex(0)->getNum()]; - double u2 = Us[t->getVertex(1)->getNum()]; - double v2 = Vs[t->getVertex(1)->getNum()]; - double u3 = Us[t->getVertex(2)->getNum()]; - double v3 = Vs[t->getVertex(2)->getNum()]; - const double vv1 [2] = {u2 - u1, v2 - v1}; - const double vv2 [2] = {u3 - u1, v3 - v1}; + double u1 = Us[t->getVertex(0)->getIndex()]; + double v1 = Vs[t->getVertex(0)->getIndex()]; + double u2 = Us[t->getVertex(1)->getIndex()]; + double v2 = Vs[t->getVertex(1)->getIndex()]; + double u3 = Us[t->getVertex(2)->getIndex()]; + double v3 = Vs[t->getVertex(2)->getIndex()]; + const double vv1[2] = {u2 - u1, v2 - v1}; + const double vv2[2] = {u3 - u1, v3 - v1}; double s = vv1[0] * vv2[1] - vv1[1] * vv2[0]; return s * 0.5; } @@ -452,20 +454,20 @@ bool insertVertex(GFace *gf, MVertex *v, double *param , MTri3 *t, while (it != shell.end()){ MTriangle *t = new MTriangle(it->v[0], it->v[1], v); const double ONE_THIRD = 1./3.; - double lc = ONE_THIRD * (vSizes[t->getVertex(0)->getNum()] + - vSizes[t->getVertex(1)->getNum()] + - vSizes[t->getVertex(2)->getNum()]); - double lcBGM = ONE_THIRD * (vSizesBGM[t->getVertex(0)->getNum()] + - vSizesBGM[t->getVertex(1)->getNum()] + - vSizesBGM[t->getVertex(2)->getNum()]); + double lc = ONE_THIRD * (vSizes[t->getVertex(0)->getIndex()] + + vSizes[t->getVertex(1)->getIndex()] + + vSizes[t->getVertex(2)->getIndex()]); + double lcBGM = ONE_THIRD * (vSizesBGM[t->getVertex(0)->getIndex()] + + vSizesBGM[t->getVertex(1)->getIndex()] + + vSizesBGM[t->getVertex(2)->getIndex()]); double LL = Extend1dMeshIn2dSurfaces() ? std::min(lc, lcBGM) : lcBGM; MTri3 *t4; if (_experimental_anisotropic_blues_band_){ - SMetric3 metrBGM = interpolation ( vMetricsBGM[t->getVertex(0)->getNum()], - vMetricsBGM[t->getVertex(1)->getNum()], - vMetricsBGM[t->getVertex(2)->getNum()], - ONE_THIRD,ONE_THIRD); + SMetric3 metrBGM = interpolation(vMetricsBGM[t->getVertex(0)->getIndex()], + vMetricsBGM[t->getVertex(1)->getIndex()], + vMetricsBGM[t->getVertex(2)->getIndex()], + ONE_THIRD, ONE_THIRD); t4 = new MTri3(t, LL,&metrBGM); } @@ -537,14 +539,14 @@ void _printTris(char *name, std::set<MTri3*, compareTri3Ptr> &AllTris, if (!worst->isDeleted()){ if (param) fprintf(ff,"ST(%g,%g,%g,%g,%g,%g,%g,%g,%g) {%g,%g,%g};\n", - Us [(worst)->tri()->getVertex(0)->getNum()], - Vs [(worst)->tri()->getVertex(0)->getNum()], + Us[(worst)->tri()->getVertex(0)->getIndex()], + Vs[(worst)->tri()->getVertex(0)->getIndex()], 0.0, - Us [(worst)->tri()->getVertex(1)->getNum()], - Vs [(worst)->tri()->getVertex(1)->getNum()], + Us[(worst)->tri()->getVertex(1)->getIndex()], + Vs[(worst)->tri()->getVertex(1)->getIndex()], 0.0, - Us [(worst)->tri()->getVertex(2)->getNum()], - Vs [(worst)->tri()->getVertex(2)->getNum()], + Us[(worst)->tri()->getVertex(2)->getIndex()], + Vs[(worst)->tri()->getVertex(2)->getIndex()], 0.0, (worst)->getRadius(), (worst)->getRadius(), @@ -616,10 +618,10 @@ static void insertAPoint(GFace *gf, GPoint p = gf->point(center[0], center[1]); // printf("the new point is %g %g\n",p.x(),p.y()); MVertex *v = new MFaceVertex(p.x(), p.y(), p.z(), gf, center[0], center[1]); - v->setNum(Us.size()); - double lc1 = ((1. - uv[0] - uv[1]) * vSizes[ptin->tri()->getVertex(0)->getNum()] + - uv[0] * vSizes [ptin->tri()->getVertex(1)->getNum()] + - uv[1] * vSizes [ptin->tri()->getVertex(2)->getNum()]); + v->setIndex(Us.size()); + double lc1 = ((1. - uv[0] - uv[1]) * vSizes[ptin->tri()->getVertex(0)->getIndex()] + + uv[0] * vSizes[ptin->tri()->getVertex(1)->getIndex()] + + uv[1] * vSizes[ptin->tri()->getVertex(2)->getIndex()]); double lc = BGM_MeshSize(gf,center[0],center[1],p.x(),p.y(),p.z()); //SMetric3 metr = BGM_MeshMetric(gf,center[0],center[1],p.x(),p.y(),p.z()); // vMetricsBGM.push_back(metr); @@ -642,14 +644,14 @@ static void insertAPoint(GFace *gf, } } else { - /* Msg::Debug("Point %g %g is outside (%g %g , %g %g , %g %g) (metric %g %g %g)", + /* Msg::Debug("Point %g %g is outside (%g %g , %g %g , %g %g) (metric %g %g %g)", center[0], center[1], - Us[base->getVertex(0)->getNum()], - Vs[base->getVertex(0)->getNum()], - Us[base->getVertex(1)->getNum()], - Vs[base->getVertex(1)->getNum()], - Us[base->getVertex(2)->getNum()], - Vs[base->getVertex(2)->getNum()], + Us[base->getVertex(0)->getIndex()], + Vs[base->getVertex(0)->getIndex()], + Us[base->getVertex(1)->getIndex()], + Vs[base->getVertex(1)->getIndex()], + Us[base->getVertex(2)->getIndex()], + Vs[base->getVertex(2)->getIndex()], metric[0], metric[1], metric[2]);*/ AllTris.erase(it); worst->forceRadius(0); @@ -682,21 +684,21 @@ void gmshBowyerWatson(GFace *gf) else{ if(ITER++ % 5000 == 0) Msg::Debug("%7d points created -- Worst tri radius is %8.3f", - vSizes.size(), worst->getRadius()); + vSizes.size(), worst->getRadius()); double center[2],metric[3],r2; if (worst->getRadius() < 0.5 * sqrt(2.0)) break; circUV(worst->tri(), Us, Vs, center, gf); MTriangle *base = worst->tri(); - double pa[2] = {(Us[base->getVertex(0)->getNum()] + - Us[base->getVertex(1)->getNum()] + - Us[base->getVertex(2)->getNum()]) / 3., - (Vs[base->getVertex(0)->getNum()] + - Vs[base->getVertex(1)->getNum()] + - Vs[base->getVertex(2)->getNum()]) / 3.}; + double pa[2] = {(Us[base->getVertex(0)->getIndex()] + + Us[base->getVertex(1)->getIndex()] + + Us[base->getVertex(2)->getIndex()]) / 3., + (Vs[base->getVertex(0)->getIndex()] + + Vs[base->getVertex(1)->getIndex()] + + Vs[base->getVertex(2)->getIndex()]) / 3.}; if (_experimental_anisotropic_blues_band_){ - SMetric3 m = interpolation (vMetricsBGM[base->getVertex(0)->getNum()], - vMetricsBGM[base->getVertex(1)->getNum()], - vMetricsBGM[base->getVertex(2)->getNum()], + SMetric3 m = interpolation (vMetricsBGM[base->getVertex(0)->getIndex()], + vMetricsBGM[base->getVertex(1)->getIndex()], + vMetricsBGM[base->getVertex(2)->getIndex()], pa[0],pa[1]); buildMetric(gf, pa, m, metric); } @@ -726,9 +728,9 @@ void gmshBowyerWatson(GFace *gf) static double lengthMetric(const double p[2], const double q[2], const double metric[3]) { - return sqrt ( (p[0]-q[0]) * metric [0] * (p[0]-q[0]) + - 2 * (p[0]-q[0]) * metric [1] * (p[1]-q[1]) + - (p[1]-q[1]) * metric [2] * (p[1]-q[1]) ); + return sqrt ( (p[0] - q[0]) * metric[0] * (p[0] - q[0]) + + 2 * (p[0] - q[0]) * metric[1] * (p[1] - q[1]) + + (p[1] - q[1]) * metric[2] * (p[1] - q[1]) ); } /* @@ -807,17 +809,17 @@ void gmshBowyerWatsonFrontal(GFace *gf) worst->getRadius() > LIMIT_){ if(ITER++ % 5000 == 0) Msg::Debug("%7d points created -- Worst tri radius is %8.3f", - vSizes.size(), worst->getRadius()); + vSizes.size(), worst->getRadius()); // compute circum center of that guy double center[2],metric[3],r2; MTriangle *base = worst->tri(); circUV(base, Us, Vs, center, gf); - double pa[2] = {(Us[base->getVertex(0)->getNum()] + - Us[base->getVertex(1)->getNum()] + - Us[base->getVertex(2)->getNum()]) / 3., - (Vs[base->getVertex(0)->getNum()] + - Vs[base->getVertex(1)->getNum()] + - Vs[base->getVertex(2)->getNum()]) / 3.}; + double pa[2] = {(Us[base->getVertex(0)->getIndex()] + + Us[base->getVertex(1)->getIndex()] + + Us[base->getVertex(2)->getIndex()]) / 3., + (Vs[base->getVertex(0)->getIndex()] + + Vs[base->getVertex(1)->getIndex()] + + Vs[base->getVertex(2)->getIndex()]) / 3.}; buildMetric(gf, pa, metric); circumCenterMetric(worst->tri(), metric, Us, Vs, center, r2); // compute the middle point of the edge @@ -826,10 +828,10 @@ void gmshBowyerWatsonFrontal(GFace *gf) // printf("the active edge is %d : %g %g -> %g %g\n", // active_edge,base->getVertex(ip1)->x(),base->getVertex(ip1)->y(), // base->getVertex(ip2)->x(),base->getVertex(ip2)->y()); - double P[2] = {Us[base->getVertex(ip1)->getNum()], - Vs[base->getVertex(ip1)->getNum()]}; - double Q[2] = {Us[base->getVertex(ip2)->getNum()], - Vs[base->getVertex(ip2)->getNum()]}; + double P[2] = {Us[base->getVertex(ip1)->getIndex()], + Vs[base->getVertex(ip1)->getIndex()]}; + double Q[2] = {Us[base->getVertex(ip2)->getIndex()], + Vs[base->getVertex(ip2)->getIndex()]}; double midpoint[2] = {0.5 * (P[0] + Q[0]), 0.5 * (P[1] + Q[1])}; // now we have the edge center and the center of the circumcircle, @@ -847,15 +849,15 @@ void gmshBowyerWatsonFrontal(GFace *gf) const double p = 0.5 * lengthMetric(P, Q, metric); // / RATIO; const double q = lengthMetric(center, midpoint, metric); const double rhoM1 = 0.5 * - (vSizes[base->getVertex(ip1)->getNum()] + - vSizes[base->getVertex(ip2)->getNum()] ) / sqrt(3.);// * RATIO; + (vSizes[base->getVertex(ip1)->getIndex()] + + vSizes[base->getVertex(ip2)->getIndex()] ) / sqrt(3.);// * RATIO; const double rhoM2 = 0.5 * - (vSizesBGM[base->getVertex(ip1)->getNum()] + - vSizesBGM[base->getVertex(ip2)->getNum()] ) / sqrt(3.);// * RATIO; + (vSizesBGM[base->getVertex(ip1)->getIndex()] + + vSizesBGM[base->getVertex(ip2)->getIndex()] ) / sqrt(3.);// * RATIO; const double rhoM = Extend1dMeshIn2dSurfaces() ? std::min(rhoM1, rhoM2) : rhoM2; // const double rhoM = 0.5 * - // (vSizes[base->getVertex(ip1)->getNum()] + - // vSizes[base->getVertex(ip2)->getNum()] ) / sqrt(3.);// * RATIO; + // (vSizes[base->getVertex(ip1)->getIndex()] + + // vSizes[base->getVertex(ip2)->getIndex()] ) / sqrt(3.);// * RATIO; const double rhoM_hat = std::min(std::max(rhoM, p), (p * p + q * q) / (2 * q)); const double d = (rhoM_hat + sqrt (rhoM_hat * rhoM_hat - p * p)) / RATIO; diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index 88ce8456c6..6cd2547914 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -34,9 +34,9 @@ static void setLcs(MTriangle *t, std::map<MVertex*, double> &vSizes) for (int j = i + 1; j < 3; j++){ MVertex *vi = t->getVertex(i); MVertex *vj = t->getVertex(j); - double dx = vi->x()-vj->x(); - double dy = vi->y()-vj->y(); - double dz = vi->z()-vj->z(); + double dx = vi->x() - vj->x(); + double dy = vi->y() - vj->y(); + double dz = vi->z() - vj->z(); double l = sqrt(dx * dx + dy * dy + dz * dz); std::map<MVertex*,double>::iterator iti = vSizes.find(vi); std::map<MVertex*,double>::iterator itj = vSizes.find(vj); @@ -77,7 +77,10 @@ void buildMeshGenerationDataStructures(GFace *gf, int NUM = 0; for (std::map<MVertex*, double>::iterator it = vSizesMap.begin(); it != vSizesMap.end(); ++it){ - it->first->setNum(NUM++); + // FIXME: this vertex-stored indexing makes the optimization + // routines not thread-safe (we cannot concurrently optimize two + // surfaces that share an edge) + it->first->setIndex(NUM++); vSizes.push_back(it->second); vSizesBGM.push_back(it->second); vMetricsBGM.push_back(SMetric3(it->second)); @@ -87,9 +90,9 @@ void buildMeshGenerationDataStructures(GFace *gf, Vs.push_back(param[1]); } for(unsigned int i = 0; i < gf->triangles.size(); i++){ - double lc = 0.3333333333 * (vSizes[gf->triangles[i]->getVertex(0)->getNum()] + - vSizes[gf->triangles[i]->getVertex(1)->getNum()] + - vSizes[gf->triangles[i]->getVertex(2)->getNum()]); + double lc = 0.3333333333 * (vSizes[gf->triangles[i]->getVertex(0)->getIndex()] + + vSizes[gf->triangles[i]->getVertex(1)->getIndex()] + + vSizes[gf->triangles[i]->getVertex(2)->getIndex()]); AllTris.insert(new MTri3(gf->triangles[i], lc)); } gf->triangles.clear(); @@ -118,15 +121,15 @@ void transferDataStructure(GFace *gf, std::set<MTri3*, compareTri3Ptr> &AllTris, double n1[3], n2[3]; MTriangle *t = gf->triangles[0]; MVertex *v0 = t->getVertex(0), *v1 = t->getVertex(1), *v2 = t->getVertex(2); - normal3points(Us[v0->getNum()], Vs[v0->getNum()], 0., - Us[v1->getNum()], Vs[v1->getNum()], 0., - Us[v2->getNum()], Vs[v2->getNum()], 0., n1); + normal3points(Us[v0->getIndex()], Vs[v0->getIndex()], 0., + Us[v1->getIndex()], Vs[v1->getIndex()], 0., + Us[v2->getIndex()], Vs[v2->getIndex()], 0., n1); for(unsigned int j = 1; j < gf->triangles.size(); j++){ t = gf->triangles[j]; v0 = t->getVertex(0); v1 = t->getVertex(1); v2 = t->getVertex(2); - normal3points(Us[v0->getNum()], Vs[v0->getNum()], 0., - Us[v1->getNum()], Vs[v1->getNum()], 0., - Us[v2->getNum()], Vs[v2->getNum()], 0., n2); + normal3points(Us[v0->getIndex()], Vs[v0->getIndex()], 0., + Us[v1->getIndex()], Vs[v1->getIndex()], 0., + Us[v2->getIndex()], Vs[v2->getIndex()], 0., n2); double pp; prosca(n1, n2, &pp); if(pp < 0) t->revert(); } @@ -253,10 +256,10 @@ double surfaceTriangleUV(MVertex *v1, MVertex *v2, MVertex *v3, const std::vector<double> &Us, const std::vector<double> &Vs) { - const double v12[2] = {Us[v2->getNum()] - Us[v1->getNum()], - Vs[v2->getNum()] - Vs[v1->getNum()]}; - const double v13[2] = {Us[v3->getNum()] - Us[v1->getNum()], - Vs[v3->getNum()] - Vs[v1->getNum()]}; + const double v12[2] = {Us[v2->getIndex()] - Us[v1->getIndex()], + Vs[v2->getIndex()] - Vs[v1->getIndex()]}; + const double v13[2] = {Us[v3->getIndex()] - Us[v1->getIndex()], + Vs[v3->getIndex()] - Vs[v1->getIndex()]}; return 0.5 * fabs (v12[0] * v13[1] - v12[1] * v13[0]); } @@ -312,11 +315,11 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE } case SWCR_DEL: { - double edgeCenter[2] ={(Us[v1->getNum()] + Us[v2->getNum()] + Us[v3->getNum()] + - Us[v4->getNum()]) * .25, - (Vs[v1->getNum()] + Vs[v2->getNum()] + Vs[v3->getNum()] + - Vs[v4->getNum()]) * .25}; - double uv4[2] ={Us[v4->getNum()], Vs[v4->getNum()]}; + double edgeCenter[2] ={(Us[v1->getIndex()] + Us[v2->getIndex()] + Us[v3->getIndex()] + + Us[v4->getIndex()]) * .25, + (Vs[v1->getIndex()] + Vs[v2->getIndex()] + Vs[v3->getIndex()] + + Vs[v4->getIndex()]) * .25}; + double uv4[2] ={Us[v4->getIndex()], Vs[v4->getIndex()]}; double metric[3]; buildMetric(gf, edgeCenter, metric); if (!inCircumCircleAniso(gf, t1->tri(), uv4, metric, Us, Vs)){ @@ -333,10 +336,10 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE double avg2[3] = {(v3->x() + v4->x()) *.5,(v3->y() + v4->y()) *.5, (v3->z() + v4->z()) *.5}; - GPoint gp1 = gf->point(SPoint2((Us[v1->getNum()] + Us[v2->getNum()]) * .5, - (Vs[v1->getNum()] + Vs[v2->getNum()]) * .5)); - GPoint gp2 = gf->point(SPoint2((Us[v3->getNum()] + Us[v4->getNum()]) * .5, - (Vs[v3->getNum()] + Vs[v4->getNum()]) * .5)); + GPoint gp1 = gf->point(SPoint2((Us[v1->getIndex()] + Us[v2->getIndex()]) * .5, + (Vs[v1->getIndex()] + Vs[v2->getIndex()]) * .5)); + GPoint gp2 = gf->point(SPoint2((Us[v3->getIndex()] + Us[v4->getIndex()]) * .5, + (Vs[v3->getIndex()] + Vs[v4->getIndex()]) * .5)); double d1 = (avg1[0] - gp1.x()) * (avg1[0] - gp1.x()) + (avg1[1] - gp1.y()) * (avg1[1]-gp1.y()) + (avg1[2] - gp1.z()) * (avg1[2] - gp1.z()); double d2 = (avg2[0] - gp2.x()) * (avg2[0] - gp2.x()) + (avg2[1] - gp2.y()) * @@ -372,18 +375,18 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE if (!found)cavity.push_back(t2->getNeigh(i)); } } - double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getNum()] + - vSizes[t1b->getVertex(1)->getNum()] + - vSizes[t1b->getVertex(2)->getNum()]); - double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getNum()] + - vSizesBGM[t1b->getVertex(1)->getNum()] + - vSizesBGM[t1b->getVertex(2)->getNum()]); - double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getNum()] + - vSizes[t2b->getVertex(1)->getNum()] + - vSizes[t2b->getVertex(2)->getNum()]); - double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getNum()] + - vSizesBGM[t2b->getVertex(1)->getNum()] + - vSizesBGM[t2b->getVertex(2)->getNum()]); + double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getIndex()] + + vSizes[t1b->getVertex(1)->getIndex()] + + vSizes[t1b->getVertex(2)->getIndex()]); + double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getIndex()] + + vSizesBGM[t1b->getVertex(1)->getIndex()] + + vSizesBGM[t1b->getVertex(2)->getIndex()]); + double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getIndex()] + + vSizes[t2b->getVertex(1)->getIndex()] + + vSizes[t2b->getVertex(2)->getIndex()]); + double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getIndex()] + + vSizesBGM[t2b->getVertex(1)->getIndex()] + + vSizesBGM[t2b->getVertex(2)->getIndex()]); MTri3 *t1b3 = new MTri3(t1b, Extend1dMeshIn2dSurfaces() ? std::min(lc1, lcBGM1) : lcBGM1); MTri3 *t2b3 = new MTri3(t2b, Extend1dMeshIn2dSurfaces() ? @@ -406,8 +409,8 @@ inline double computeEdgeAdimLength(MVertex *v1, MVertex *v2, GFace *f, const std::vector<double> &vSizes , const std::vector<double> &vSizesBGM) { - const double edgeCenter[2] ={(Us[v1->getNum()] + Us[v2->getNum()]) * .5, - (Vs[v1->getNum()] + Vs[v2->getNum()]) * .5}; + const double edgeCenter[2] ={(Us[v1->getIndex()] + Us[v2->getIndex()]) * .5, + (Vs[v1->getIndex()] + Vs[v2->getIndex()]) * .5}; GPoint GP = f->point (edgeCenter[0], edgeCenter[1]); const double dx1 = v1->x() - GP.x(); @@ -419,9 +422,9 @@ inline double computeEdgeAdimLength(MVertex *v1, MVertex *v2, GFace *f, const double dz2 = v2->z() - GP.z(); const double l2 = sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2); if (Extend1dMeshIn2dSurfaces()) - return 2 * (l1 + l2) / (std::min(vSizes[v1->getNum()], vSizesBGM[v1->getNum()]) + - std::min(vSizes[v2->getNum()], vSizesBGM[v2->getNum()])); - return 2 * (l1 + l2) / (vSizesBGM[v1->getNum()] + vSizesBGM[v2->getNum()]); + return 2 * (l1 + l2) / (std::min(vSizes[v1->getIndex()], vSizesBGM[v1->getIndex()]) + + std::min(vSizes[v2->getIndex()], vSizesBGM[v2->getIndex()])); + return 2 * (l1 + l2) / (vSizesBGM[v1->getIndex()] + vSizesBGM[v2->getIndex()]); } bool gmshEdgeSplit(const double lMax, MTri3 *t1, GFace *gf, int iLocalEdge, @@ -434,8 +437,8 @@ bool gmshEdgeSplit(const double lMax, MTri3 *t1, GFace *gf, int iLocalEdge, MVertex *v1 = t1->tri()->getVertex(iLocalEdge == 0 ? 2 : iLocalEdge - 1); MVertex *v2 = t1->tri()->getVertex(iLocalEdge % 3); - double edgeCenter[2] ={(Us[v1->getNum()] + Us[v2->getNum()]) * .5, - (Vs[v1->getNum()] + Vs[v2->getNum()]) * .5}; + double edgeCenter[2] ={(Us[v1->getIndex()] + Us[v2->getIndex()]) * .5, + (Vs[v1->getIndex()] + Vs[v2->getIndex()]) * .5}; double al = computeEdgeAdimLength(v1, v2, gf,Us, Vs, vSizes, vSizesBGM); if (al <= lMax) return false; @@ -483,8 +486,8 @@ bool gmshEdgeSplit(const double lMax, MTri3 *t1, GFace *gf, int iLocalEdge, } gf->mesh_vertices.push_back(vnew); - vnew->setNum(Us.size()); - double lcN = 0.5 * (vSizes [v1->getNum()] + vSizes [v2->getNum()] ); + vnew->setIndex(Us.size()); + double lcN = 0.5 * (vSizes[v1->getIndex()] + vSizes[v2->getIndex()] ); double lcBGM = BGM_MeshSize(gf, edgeCenter[0], edgeCenter[1], p.x(), p.y(), p.z()); vSizesBGM.push_back(lcBGM); @@ -511,30 +514,30 @@ bool gmshEdgeSplit(const double lMax, MTri3 *t1, GFace *gf, int iLocalEdge, if (!found) cavity.push_back(t2->getNeigh(i)); } } - double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getNum()] + - vSizes[t1b->getVertex(1)->getNum()] + - vSizes[t1b->getVertex(2)->getNum()]); - double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getNum()] + - vSizesBGM[t1b->getVertex(1)->getNum()] + - vSizesBGM[t1b->getVertex(2)->getNum()]); - double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getNum()] + - vSizes[t2b->getVertex(1)->getNum()] + - vSizes[t2b->getVertex(2)->getNum()]); - double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getNum()] + - vSizesBGM[t2b->getVertex(1)->getNum()] + - vSizesBGM[t2b->getVertex(2)->getNum()]); - double lc3 = 0.3333333333 * (vSizes[t3b->getVertex(0)->getNum()] + - vSizes[t3b->getVertex(1)->getNum()] + - vSizes[t3b->getVertex(2)->getNum()]); - double lcBGM3 = 0.3333333333 * (vSizesBGM[t3b->getVertex(0)->getNum()] + - vSizesBGM[t3b->getVertex(1)->getNum()] + - vSizesBGM[t3b->getVertex(2)->getNum()]); - double lc4 = 0.3333333333 * (vSizes[t4b->getVertex(0)->getNum()] + - vSizes[t4b->getVertex(1)->getNum()] + - vSizes[t4b->getVertex(2)->getNum()]); - double lcBGM4 = 0.3333333333 * (vSizesBGM[t4b->getVertex(0)->getNum()] + - vSizesBGM[t4b->getVertex(1)->getNum()] + - vSizesBGM[t4b->getVertex(2)->getNum()]); + double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getIndex()] + + vSizes[t1b->getVertex(1)->getIndex()] + + vSizes[t1b->getVertex(2)->getIndex()]); + double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getIndex()] + + vSizesBGM[t1b->getVertex(1)->getIndex()] + + vSizesBGM[t1b->getVertex(2)->getIndex()]); + double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getIndex()] + + vSizes[t2b->getVertex(1)->getIndex()] + + vSizes[t2b->getVertex(2)->getIndex()]); + double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getIndex()] + + vSizesBGM[t2b->getVertex(1)->getIndex()] + + vSizesBGM[t2b->getVertex(2)->getIndex()]); + double lc3 = 0.3333333333 * (vSizes[t3b->getVertex(0)->getIndex()] + + vSizes[t3b->getVertex(1)->getIndex()] + + vSizes[t3b->getVertex(2)->getIndex()]); + double lcBGM3 = 0.3333333333 * (vSizesBGM[t3b->getVertex(0)->getIndex()] + + vSizesBGM[t3b->getVertex(1)->getIndex()] + + vSizesBGM[t3b->getVertex(2)->getIndex()]); + double lc4 = 0.3333333333 * (vSizes[t4b->getVertex(0)->getIndex()] + + vSizes[t4b->getVertex(1)->getIndex()] + + vSizes[t4b->getVertex(2)->getIndex()]); + double lcBGM4 = 0.3333333333 * (vSizesBGM[t4b->getVertex(0)->getIndex()] + + vSizesBGM[t4b->getVertex(1)->getIndex()] + + vSizesBGM[t4b->getVertex(2)->getIndex()]); MTri3 *t1b3 = new MTri3(t1b, Extend1dMeshIn2dSurfaces() ? std::min(lc1, lcBGM1) : lcBGM1); MTri3 *t2b3 = new MTri3(t2b, Extend1dMeshIn2dSurfaces() ? std::min(lc2, lcBGM2) : lcBGM2); MTri3 *t3b3 = new MTri3(t3b, Extend1dMeshIn2dSurfaces() ? std::min(lc3, lcBGM3) : lcBGM3); @@ -678,14 +681,14 @@ bool gmshVertexCollapse(const double lMin, MTri3 *t1, GFace *gf, MVertex *v1 = ring[(iMin + 1 + i) % ring.size()]; MVertex *v2 = ring[(iMin + 1 + i + 1) % ring.size()]; MTriangle *t = new MTriangle(v1,v2,ring[iMin]); - double lc = 0.3333333333 * (vSizes[t->getVertex(0)->getNum()] + - vSizes[t->getVertex(1)->getNum()] + - vSizes[t->getVertex(2)->getNum()]); - double lcBGM = 0.3333333333 * (vSizesBGM[t->getVertex(0)->getNum()] + - vSizesBGM[t->getVertex(1)->getNum()] + - vSizesBGM[t->getVertex(2)->getNum()]); + double lc = 0.3333333333 * (vSizes[t->getVertex(0)->getIndex()] + + vSizes[t->getVertex(1)->getIndex()] + + vSizes[t->getVertex(2)->getIndex()]); + double lcBGM = 0.3333333333 * (vSizesBGM[t->getVertex(0)->getIndex()] + + vSizesBGM[t->getVertex(1)->getIndex()] + + vSizesBGM[t->getVertex(2)->getIndex()]); MTri3 *t3 = new MTri3(t, Extend1dMeshIn2dSurfaces() ? std::min(lc, lcBGM) : lcBGM); - // printf("Creation %p = %d %d %d\n",t3,v1->getNum(),v2->getNum(),ring[iMin]->getNum()); + // printf("Creation %p = %d %d %d\n",t3,v1->getIndex(),v2->getIndex(),ring[iMin]->getIndex()); outside.push_back(t3); newTris.push_back(t3); } diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp index 53b1a4fc0b..4e3b8fa0b6 100644 --- a/Mesh/meshGRegion.cpp +++ b/Mesh/meshGRegion.cpp @@ -60,7 +60,7 @@ void buildTetgenStructure(GRegion *gr, tetgenio &in, std::vector<MVertex*> &numb in.pointlist[(I-1)*3 + 0] = (*itv)->x(); in.pointlist[(I-1)*3 + 1] = (*itv)->y(); in.pointlist[(I-1)*3 + 2] = (*itv)->z(); - (*itv)->setNum(I++); + (*itv)->setIndex(I++); numberedV.push_back(*itv); ++itv; } @@ -93,9 +93,9 @@ void buildTetgenStructure(GRegion *gr, tetgenio &in, std::vector<MVertex*> &numb tetgenio::init(p); p->numberofvertices = 3; p->vertexlist = new int[p->numberofvertices]; - p->vertexlist[0] = t->getVertex(0)->getNum(); - p->vertexlist[1] = t->getVertex(1)->getNum(); - p->vertexlist[2] = t->getVertex(2)->getNum(); + p->vertexlist[0] = t->getVertex(0)->getIndex(); + p->vertexlist[1] = t->getVertex(1)->getIndex(); + p->vertexlist[2] = t->getVertex(2)->getIndex(); in.facetmarkerlist[I] = gf->tag(); ++I; } @@ -155,7 +155,7 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, v[2] = numberedV[out.trifacelist[i * 3 + 2] - 1]; GFace *gf = gr->model()->getFaceByTag(out.trifacemarkerlist[i]); - double guess[2] = {0,0}; + double guess[2] = {0, 0}; int Count = 0; for(int j = 0; j < 3; j++){ if(!v[j]->onWhat()){ @@ -163,8 +163,8 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, } else if(v[j]->onWhat()->dim() == 2){ double uu,vv; - v[j]->getParameter(0,uu); - v[j]->getParameter(1,vv); + v[j]->getParameter(0, uu); + v[j]->getParameter(1, vv); guess[0] += uu; guess[1] += vv; Count++; @@ -175,22 +175,22 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, v[j]->getParameter(0, UU); SPoint2 param; param = ge->reparamOnFace(gf, UU, 1); - guess[0]+=param.x(); - guess[1]+=param.y(); + guess[0] += param.x(); + guess[1] += param.y(); Count++; } else if (v[j]->onWhat()->dim() == 0){ SPoint2 param; GVertex *gv = (GVertex*)v[j]->onWhat(); param = gv->reparamOnFace(gf,1); - guess[0]+=param.x(); - guess[1]+=param.y(); + guess[0] += param.x(); + guess[1] += param.y(); Count++; } } if (Count != 0){ - guess[0]/=Count; - guess[1]/=Count; + guess[0] /= Count; + guess[1] /= Count; } for(int j = 0; j < 3; j++){ @@ -202,28 +202,21 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, MVertex *v1b; if (CTX::instance()->mesh.order > 1 && CTX::instance()->mesh.secondOrderExperimental){ - // PARAMETRIC COORDINATES SHOULD BE SET for the vertex !!!!!!!!!!!!! - // This is not 100 % safe yet, so we reserve that operation for high order - // meshes. - // Msg::Debug("A new point has been inserted in mesh face %d by the 3D mesher, guess %g %g",gf->tag(),guess[0],guess[1]); - GPoint gp = gf->closestPoint (SPoint3(v[j]->x(), v[j]->y(), v[j]->z()),guess); - - // To be safe, we should ensure that this mesh motion does not lead to an invalid mesh !!!! - //v1b = new MVertex(gp.x(),gp.y(),gp.z(),gf); - if (gp.g() ){ - //v1b = new MFaceVertex(v[j]->x(), v[j]->y(), v[j]->z(),gf,gp.u(),gp.v()); - v1b = new MFaceVertex(gp.x(),gp.y(),gp.z(),gf,gp.u(),gp.v()); - // Msg::Info("The point has been projected back to the surface (%g %g %g) -> (%g %g %g)", - // v[j]->x(), v[j]->y(), v[j]->z(),gp.x(),gp.y(),gp.z()); + // parametric coordinates should be set for the vertex ! + // (this is not 100 % safe yet, so we reserve that operation + // for high order meshes) + GPoint gp = gf->closestPoint(SPoint3(v[j]->x(), v[j]->y(), v[j]->z()),guess); + if (gp.g()){ + v1b = new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); } else{ - v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(),gf); + v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); Msg::Warning("The point was not projected back to the surface (%g %g %g)", v[j]->x(), v[j]->y(), v[j]->z()); } } else{ - v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(),gf); + v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); } gf->mesh_vertices.push_back(v1b); @@ -348,7 +341,7 @@ Ng_Mesh *buildNetgenStructure(GRegion *gr, bool importVolumeMesh, tmp[0] = (*itv)->x(); tmp[1] = (*itv)->y(); tmp[2] = (*itv)->z(); - (*itv)->setNum(I++); + (*itv)->setIndex(I++); numberedV.push_back(*itv); Ng_AddPoint(ngmesh, tmp); ++itv; @@ -360,7 +353,7 @@ Ng_Mesh *buildNetgenStructure(GRegion *gr, bool importVolumeMesh, tmp[0] = gr->mesh_vertices[i]->x(); tmp[1] = gr->mesh_vertices[i]->y(); tmp[2] = gr->mesh_vertices[i]->z(); - gr->mesh_vertices[i]->setNum(I++); + gr->mesh_vertices[i]->setIndex(I++); Ng_AddPoint(ngmesh, tmp); } } @@ -372,9 +365,9 @@ Ng_Mesh *buildNetgenStructure(GRegion *gr, bool importVolumeMesh, for(unsigned int i = 0; i< gf->triangles.size(); i++){ MTriangle *t = gf->triangles[i]; int tmp[3]; - tmp[0] = t->getVertex(0)->getNum(); - tmp[1] = t->getVertex(1)->getNum(); - tmp[2] = t->getVertex(2)->getNum(); + tmp[0] = t->getVertex(0)->getIndex(); + tmp[1] = t->getVertex(1)->getIndex(); + tmp[2] = t->getVertex(2)->getIndex(); Ng_AddSurfaceElement(ngmesh, NG_TRIG, tmp); } ++it; @@ -386,10 +379,10 @@ Ng_Mesh *buildNetgenStructure(GRegion *gr, bool importVolumeMesh, // netgen expects tet with negative volume if(t->getVolumeSign() > 0) t->revert(); int tmp[4]; - tmp[0] = t->getVertex(0)->getNum(); - tmp[1] = t->getVertex(1)->getNum(); - tmp[2] = t->getVertex(2)->getNum(); - tmp[3] = t->getVertex(3)->getNum(); + tmp[0] = t->getVertex(0)->getIndex(); + tmp[1] = t->getVertex(1)->getIndex(); + tmp[2] = t->getVertex(2)->getIndex(); + tmp[3] = t->getVertex(3)->getIndex(); Ng_AddVolumeElement(ngmesh, NG_TET, tmp); } } diff --git a/Mesh/meshGRegionDelaunayInsertion.cpp b/Mesh/meshGRegionDelaunayInsertion.cpp index 51bdb2843c..96fd06270a 100644 --- a/Mesh/meshGRegionDelaunayInsertion.cpp +++ b/Mesh/meshGRegionDelaunayInsertion.cpp @@ -722,7 +722,7 @@ void insertVerticesInRegion (GRegion *gr) setLcs(gr->tetrahedra[i], vSizesMap); for(std::map<MVertex*, double>::iterator it = vSizesMap.begin(); it != vSizesMap.end(); ++it){ - it->first->setNum(NUM++); + it->first->setIndex(NUM++); vSizes.push_back(it->second); vSizesBGM.push_back(it->second); } @@ -799,12 +799,12 @@ void insertVerticesInRegion (GRegion *gr) worst->tet()->xyz2uvw(center, uvw); if(worst->tet()->isInside(uvw[0], uvw[1], uvw[2])){ MVertex *v = new MVertex(center[0], center[1], center[2], worst->onWhat()); - v->setNum(NUM++); + v->setIndex(NUM++); double lc1 = - (1 - uvw[0] - uvw[1] - uvw[2]) * vSizes[worst->tet()->getVertex(0)->getNum()] + - uvw[0] * vSizes[worst->tet()->getVertex(1)->getNum()] + - uvw[1] * vSizes[worst->tet()->getVertex(2)->getNum()] + - uvw[2] * vSizes[worst->tet()->getVertex(3)->getNum()]; + (1 - uvw[0] - uvw[1] - uvw[2]) * vSizes[worst->tet()->getVertex(0)->getIndex()] + + uvw[0] * vSizes[worst->tet()->getVertex(1)->getIndex()] + + uvw[1] * vSizes[worst->tet()->getVertex(2)->getIndex()] + + uvw[2] * vSizes[worst->tet()->getVertex(3)->getIndex()]; double lc = BGM_MeshSize(gr, 0, 0, center[0], center[1], center[2]); // double lc = std::min(lc1, BGM_MeshSize(gr, 0, 0, center[0], center[1], center[2])); vSizes.push_back(lc1); diff --git a/Mesh/meshGRegionDelaunayInsertion.h b/Mesh/meshGRegionDelaunayInsertion.h index f65fdc3bff..9d3e4c10ac 100644 --- a/Mesh/meshGRegionDelaunayInsertion.h +++ b/Mesh/meshGRegionDelaunayInsertion.h @@ -114,14 +114,14 @@ class MTet4 const double dy = base->getVertex(0)->y() - center[1]; const double dz = base->getVertex(0)->z() - center[2]; circum_radius = sqrt(dx * dx + dy * dy + dz * dz); - double lc1 = 0.25*(sizes[base->getVertex(0)->getNum()]+ - sizes[base->getVertex(1)->getNum()]+ - sizes[base->getVertex(2)->getNum()]+ - sizes[base->getVertex(3)->getNum()]); - double lcBGM = 0.25*(sizesBGM[base->getVertex(0)->getNum()]+ - sizesBGM[base->getVertex(1)->getNum()]+ - sizesBGM[base->getVertex(2)->getNum()]+ - sizesBGM[base->getVertex(3)->getNum()]); + double lc1 = 0.25*(sizes[base->getVertex(0)->getIndex()]+ + sizes[base->getVertex(1)->getIndex()]+ + sizes[base->getVertex(2)->getIndex()]+ + sizes[base->getVertex(3)->getIndex()]); + double lcBGM = 0.25*(sizesBGM[base->getVertex(0)->getIndex()]+ + sizesBGM[base->getVertex(1)->getIndex()]+ + sizesBGM[base->getVertex(2)->getIndex()]+ + sizesBGM[base->getVertex(3)->getIndex()]); double lc = Extend2dMeshIn3dVolumes() ? std::min(lc1, lcBGM) : lcBGM; circum_radius /= lc; deleted = false; diff --git a/Mesh/qualityMeasures.cpp b/Mesh/qualityMeasures.cpp index 5cc0acef97..a7eb3c3297 100644 --- a/Mesh/qualityMeasures.cpp +++ b/Mesh/qualityMeasures.cpp @@ -175,7 +175,6 @@ double qmTet(const double &x1, const double &y1, const double &z1, } } - double mesh_functional_distorsion(MTriangle *t, double u, double v) { // compute uncurved element jacobian d_u x and d_v x @@ -208,7 +207,6 @@ double mesh_functional_distorsion(MTriangle *t, double u, double v) return det; } - double mesh_functional_distorsion_p2(MTriangle *t) { double d = mesh_functional_distorsion(t,0.,0.); @@ -220,8 +218,6 @@ double mesh_functional_distorsion_p2(MTriangle *t) return d; } - - double qmDistorsionOfMapping (MTriangle *e) { // return 1.0; @@ -253,49 +249,47 @@ static double mesh_functional_distorsion(MTetrahedron *t, double u, double v, do { // compute uncurved element jacobian d_u x and d_v x double mat[3][3]; - t->getPrimaryJacobian(u,v,w, mat); + t->getPrimaryJacobian(u, v, w, mat); const double det1 = det3x3(mat); //const double det1 = t->getJacobian(u,v,w,mat); // const double det1 = det3x3(mat); - t->getJacobian(u,v,w,mat); + t->getJacobian(u, v, w, mat); const double detN = det3x3(mat); // const double detN = det3x3(mat); // printf("%g %g %g = %g %g\n",u,v,w,det1,detN); if (det1 == 0 || detN == 0) return 0; - double dist = std::min(detN/det1, det1/detN); + double dist = std::min(detN / det1, det1 / detN); return dist; } - -double qmDistorsionOfMapping (MTetrahedron *e) +double qmDistorsionOfMapping(MTetrahedron *e) { - if (e->getPolynomialOrder() == 1)return 1.0; + if (e->getPolynomialOrder() == 1) return 1.0; IntPt *pts; int npts; - e->getIntegrationPoints(e->getPolynomialOrder(),&npts, &pts); + e->getIntegrationPoints(e->getPolynomialOrder(), &npts, &pts); double dmin; - for (int i=0;i<npts;i++){ + for (int i = 0; i < npts; i++){ const double u = pts[i].pt[0]; const double v = pts[i].pt[1]; const double w = pts[i].pt[2]; - const double di = mesh_functional_distorsion (e,u,v,w); - dmin = (i==0)? di : std::min(dmin,di); + const double di = mesh_functional_distorsion(e, u, v, w); + dmin = (i == 0) ? di : std::min(dmin, di); } const gmshMatrix<double>& points = e->getFunctionSpace()->points; - for (int i=0;i<e->getNumPrimaryVertices();i++) { - const double u = points(i,0); - const double v = points(i,1); - const double w = points(i,2); - const double di = mesh_functional_distorsion (e,u,v,w); - dmin = std::min(dmin,di); + for (int i = 0; i < e->getNumPrimaryVertices(); i++) { + const double u = points(i, 0); + const double v = points(i, 1); + const double w = points(i, 2); + const double di = mesh_functional_distorsion(e, u, v, w); + dmin = std::min(dmin, di); } - // printf("DMIN = %g\n\n",dmin); return dmin; } -- GitLab