From c0da83017c0218133d56ac7428bd3cb2de490cd9 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Mon, 8 Jul 2013 09:58:42 +0000 Subject: [PATCH] trying to fix Delaunay point insertion when the surface triangulation is anisotropic: instead of using the min edge length of tets in the initial mesh, we - use the max edge length of boundary triangles - and the min edge length of tets for the remaining vertices --- Mesh/meshGRegionDelaunayInsertion.cpp | 49 ++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/Mesh/meshGRegionDelaunayInsertion.cpp b/Mesh/meshGRegionDelaunayInsertion.cpp index 7038278d3a..d1455b602a 100644 --- a/Mesh/meshGRegionDelaunayInsertion.cpp +++ b/Mesh/meshGRegionDelaunayInsertion.cpp @@ -513,8 +513,28 @@ bool insertVertex(MVertex *v, } +static void setLcs(MTriangle *t, std::map<MVertex*, double> &vSizes, + std::set<MVertex*> &bndVertices) +{ + for(int i = 0; i < 3; i++){ + bndVertices.insert(t->getVertex(i)); + MEdge e = t->getEdge(i); + MVertex *vi = e.getVertex(0); + MVertex *vj = e.getVertex(1); + 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); + // use largest edge length + if (iti == vSizes.end() || iti->second < l) vSizes[vi] = l; + if (itj == vSizes.end() || itj->second < l) vSizes[vj] = l; + } +} -static void setLcs(MTetrahedron *t, std::map<MVertex*, double> &vSizes) +static void setLcs(MTetrahedron *t, std::map<MVertex*, double> &vSizes, + std::set<MVertex*> &bndVertices) { for (int i = 0; i < 4; i++){ for (int j = i + 1; j < 4; j++){ @@ -526,8 +546,13 @@ static void setLcs(MTetrahedron *t, std::map<MVertex*, double> &vSizes) 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); - if (iti == vSizes.end() || iti->second > l) vSizes[vi] = l; - if (itj == vSizes.end() || itj->second > l) vSizes[vj] = l; + std::set<MVertex*>::iterator itvi = bndVertices.find(vi); + std::set<MVertex*>::iterator itvj = bndVertices.find(vj); + // smallest tet edge + if (itvi == bndVertices.end() && + (iti == vSizes.end() || iti->second > l)) vSizes[vi] = l; + if (itvj == bndVertices.end() && + (itj == vSizes.end() || itj->second > l)) vSizes[vj] = l; } } } @@ -1130,8 +1155,15 @@ void insertVerticesInRegion (GRegion *gr) { // leave this in a block so the map gets deallocated directly std::map<MVertex*, double> vSizesMap; + std::set<MVertex*> bndVertices; + for(GModel::fiter it = gr->model()->firstFace(); it != gr->model()->lastFace(); ++it){ + GFace *gf = *it; + for(unsigned int i = 0; i < gf->triangles.size(); i++){ + setLcs(gf->triangles[i], vSizesMap, bndVertices); + } + } for(unsigned int i = 0; i < gr->tetrahedra.size(); i++) - setLcs(gr->tetrahedra[i], vSizesMap); + setLcs(gr->tetrahedra[i], vSizesMap, bndVertices); for(std::map<MVertex*, double>::iterator it = vSizesMap.begin(); it != vSizesMap.end(); ++it){ it->first->setIndex(NUM++); @@ -1402,8 +1434,15 @@ void bowyerWatsonFrontalLayers(GRegion *gr, bool hex) { // leave this in a block so the map gets deallocated directly std::map<MVertex*, double> vSizesMap; + std::set<MVertex*> bndVertices; + for(GModel::fiter it = gr->model()->firstFace(); it != gr->model()->lastFace(); ++it){ + GFace *gf = *it; + for(unsigned int i = 0; i < gf->triangles.size(); i++){ + setLcs(gf->triangles[i], vSizesMap, bndVertices); + } + } for(unsigned int i = 0; i < gr->tetrahedra.size(); i++) - setLcs(gr->tetrahedra[i], vSizesMap); + setLcs(gr->tetrahedra[i], vSizesMap, bndVertices); for(std::map<MVertex*, double>::iterator it = vSizesMap.begin(); it != vSizesMap.end(); ++it){ it->first->setIndex(NUM++); -- GitLab