From 2df4856e77973b25372a24f78fb7704212804ed3 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 5 Dec 2008 18:37:24 +0000 Subject: [PATCH] fix recombine with embedded edges --- Mesh/meshGFaceOptimize.cpp | 53 ++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index 334934ecf2..2902e03a2d 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -65,7 +65,7 @@ void buidMeshGenerationDataStructures(GFace *gf, std::set<MTri3*, compareTri3Ptr std::list<GVertex*>::iterator itvx = emb_vertx.begin(); while(itvx != emb_vertx.end()){ MVertex *v = *((*itvx)->mesh_vertices.begin()); - vSizesMap[v] = std::min(vSizesMap[v],(*itvx)->prescribedMeshSizeAtVertex()); + vSizesMap[v] = std::min(vSizesMap[v], (*itvx)->prescribedMeshSizeAtVertex()); ++itvx; } } @@ -132,10 +132,10 @@ void buildVertexToTriangle(std::vector<MTriangle*> &eles, v2t_cont &adj) } template <class T> -void buildEdgeToElement(std::vector<T*> &triangles, e2t_cont &adj) +void buildEdgeToElement(std::vector<T*> &elements, e2t_cont &adj) { - for (unsigned int i = 0; i < triangles.size(); i++){ - T *t = triangles[i]; + for (unsigned int i = 0; i < elements.size(); i++){ + T *t = elements[i]; for (int j = 0; j < t->getNumEdges(); j++){ MEdge e = t->getEdge(j); e2t_cont::iterator it = adj.find(e); @@ -143,10 +143,9 @@ void buildEdgeToElement(std::vector<T*> &triangles, e2t_cont &adj) std::pair<MElement*, MElement*> one = std::make_pair(t, (MElement*)0); adj[e] = one; } - else - { - it->second.second = t; - } + else{ + it->second.second = t; + } } } } @@ -807,19 +806,39 @@ struct recombine_triangle static void _gmshRecombineIntoQuads(GFace *gf) { + std::set<MVertex*> emb_edgeverts; + { + std::list<GEdge*> emb_edges = gf->embeddedEdges(); + std::list<GEdge*>::iterator ite = emb_edges.begin(); + while(ite != emb_edges.end()){ + if(!(*ite)->isMeshDegenerated()){ + emb_edgeverts.insert((*ite)->mesh_vertices.begin(), + (*ite)->mesh_vertices.end() ); + emb_edgeverts.insert((*ite)->getBeginVertex()->mesh_vertices.begin(), + (*ite)->getBeginVertex()->mesh_vertices.end()); + emb_edgeverts.insert((*ite)->getEndVertex()->mesh_vertices.begin(), + (*ite)->getEndVertex()->mesh_vertices.end()); + } + ++ite; + } + } + e2t_cont adj; - std::set<MElement*> touched; - std::set<recombine_triangle> pairs; buildEdgeToElement(gf->triangles, adj); - e2t_cont::iterator it = adj.begin(); - for ( ; it!= adj.end(); ++it){ - if (it->second.second && it->second.first->getNumVertices() == 3 && - it->second.second->getNumVertices() == 3) + + std::set<recombine_triangle> pairs; + for (e2t_cont::iterator it = adj.begin(); it!= adj.end(); ++it){ + if (it->second.second && + it->second.first->getNumVertices() == 3 && + it->second.second->getNumVertices() == 3 && + (emb_edgeverts.find(it->first.getVertex(0)) == emb_edgeverts.end() || + emb_edgeverts.find(it->first.getVertex(1)) == emb_edgeverts.end())) pairs.insert(recombine_triangle(it->first, it->second.first, it->second.second)); } + std::set<MElement*> touched; std::set<recombine_triangle>::iterator itp = pairs.begin(); while(itp != pairs.end()){ // recombine if difference between max quad angle and right @@ -868,9 +887,9 @@ static void _gmshRecombineIntoQuads(GFace *gf) void gmshRecombineIntoQuads(GFace *gf) { _gmshRecombineIntoQuads(gf); - laplaceSmoothing(gf); + laplaceSmoothing(gf); _gmshRecombineIntoQuads(gf); - laplaceSmoothing(gf); + laplaceSmoothing(gf); _gmshRecombineIntoQuads(gf); - laplaceSmoothing(gf); + laplaceSmoothing(gf); } -- GitLab