From 80ccb35e03b16554b2b18b3070b9f6fb58964242 Mon Sep 17 00:00:00 2001 From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be> Date: Tue, 1 Dec 2009 10:25:56 +0000 Subject: [PATCH] --- Geo/MElementCut.cpp | 82 +++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 51 deletions(-) diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp index cd129fa797..ac50ddb52e 100644 --- a/Geo/MElementCut.cpp +++ b/Geo/MElementCut.cpp @@ -493,10 +493,12 @@ static int getBorderTag(int lsTag, int count, int &maxTag, std::map<int, int> &b return lsTag; } +typedef std::set<MVertex*,MVertexLessThanLexicographic> newVerticesContainer ; + static void elementCutMesh(MElement *e, gLevelset *ls, std::map<int, std::map<int, double> > &verticesLs, GEntity *ge, GModel *GM, int &numEle, std::map<int, MVertex*> &vertexMap, - std::vector<MVertex*> &newVertices, + newVerticesContainer &newVertices, std::map<int, std::vector<MElement*> > elements[10], std::map<int, std::map<int, std::string> > physicals[4], std::map<int, int> newElemTags[4], @@ -662,18 +664,13 @@ static void elementCutMesh(MElement *e, gLevelset *ls, MVertex *mv[4] = {NULL, NULL, NULL, NULL}; for(int j = 0; j < 4; j++){ int numV = getElementVertexNum(tetras[i].pt(j), e); - if(numV == -1) { - unsigned int k; - for(k = 0; k < newVertices.size(); k++) - if(equalV(newVertices[k], tetras[i].pt(j))) break; - if(k == newVertices.size()) { - mv[j] = new MVertex(tetras[i].x(j), tetras[i].y(j), - tetras[i].z(j), 0); - newVertices.push_back(mv[j]); - } - else mv[j] = newVertices[k]; - } - else { + if (numV == -1){ + MVertex *newv = new MVertex(tetras[i].x(j), tetras[i].y(j), tetras[i].z(j), 0); + std::pair<newVerticesContainer::iterator, bool> it = newVertices.insert(newv); + mv[j] = *(it.first); + if (!it.second) delete newv; + } + else { std::map<int, MVertex*>::iterator it = vertexMap.find(numV); if(it == vertexMap.end()) { mv[j] = new MVertex(tetras[i].x(j), tetras[i].y(j), @@ -725,15 +722,10 @@ static void elementCutMesh(MElement *e, gLevelset *ls, for(int j = 0; j < 3; j++){ int numV = getElementVertexNum(triangles[i].pt(j), e); if(numV == -1) { - unsigned int k; - for(k = 0; k < newVertices.size(); k++) - if(equalV(newVertices[k], triangles[i].pt(j))) break; - if(k == newVertices.size()) { - mv[j] = new MVertex(triangles[i].x(j), triangles[i].y(j), - triangles[i].z(j), 0); - newVertices.push_back(mv[j]); - } - else mv[j] = newVertices[k]; + MVertex *newv = new MVertex(triangles[i].x(j), triangles[i].y(j), triangles[i].z(j), 0); + std::pair<newVerticesContainer::iterator, bool> it = newVertices.insert(newv); + mv[j] = *(it.first); + if (!it.second) delete newv; } else { std::map<int, MVertex*>::iterator it = vertexMap.find(numV); @@ -805,15 +797,10 @@ static void elementCutMesh(MElement *e, gLevelset *ls, for(int j = 0; j < 3; j++){ int numV = getElementVertexNum(triangles[i].pt(j), e); if(numV == -1) { - unsigned int k; - for(k = 0; k < newVertices.size(); k++) - if(equalV(newVertices[k], triangles[i].pt(j))) break; - if(k == newVertices.size()) { - mv[j] = new MVertex(triangles[i].x(j), triangles[i].y(j), - triangles[i].z(j), 0); - newVertices.push_back(mv[j]); - } - else mv[j] = newVertices[k]; + MVertex *newv = new MVertex(triangles[i].x(j), triangles[i].y(j), triangles[i].z(j), 0); + std::pair<newVerticesContainer::iterator, bool> it = newVertices.insert(newv); + mv[j] = *(it.first); + if (!it.second) delete newv; } else { std::map<int, MVertex*>::iterator it = vertexMap.find(numV); @@ -863,15 +850,10 @@ static void elementCutMesh(MElement *e, gLevelset *ls, for(int j = 0; j < 2; j++){ int numV = getElementVertexNum(lines[i].pt(j), e); if(numV == -1) { - unsigned int k; - for(k = 0; k < newVertices.size(); k++) - if(equalV(newVertices[k], lines[i].pt(j))) break; - if(k == newVertices.size()) { - mv[j] = new MVertex(lines[i].x(j), lines[i].y(j), - lines[i].z(j), 0); - newVertices.push_back(mv[j]); - } - else mv[j] = newVertices[k]; + MVertex *newv = new MVertex(lines[i].x(j), lines[i].y(j), lines[i].z(j), 0); + std::pair<newVerticesContainer::iterator, bool> it = newVertices.insert(newv); + mv[j] = *(it.first); + if (!it.second) delete newv; } else { std::map<int, MVertex*>::iterator it = vertexMap.find(numV); @@ -911,14 +893,10 @@ static void elementCutMesh(MElement *e, gLevelset *ls, for(int j = 0; j < 2; j++){ int numV = getElementVertexNum(lines[i].pt(j), e); if(numV == -1) { - unsigned int k; - for(k = 0; k < newVertices.size(); k++) - if(equalV(newVertices[k], lines[i].pt(j))) break; - if(k == newVertices.size()) { - mv[j] = new MVertex(lines[i].x(j), lines[i].y(j), lines[i].z(j), 0); - newVertices.push_back(mv[j]); - } - else mv[j] = newVertices[k]; + MVertex *newv = new MVertex(lines[i].x(j), lines[i].y(j), lines[i].z(j), 0); + std::pair<newVerticesContainer::iterator, bool> it = newVertices.insert(newv); + mv[j] = *(it.first); + if (!it.second) delete newv; } else { std::map<int, MVertex*>::iterator it = vertexMap.find(numV); @@ -974,7 +952,9 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, GModel *cutGM = new GModel(gm->getName() + "_cut"); cutGM->setFileName(cutGM->getName()); - std::vector<MVertex*> newVertices; + newVerticesContainer newVertices; + // std::set<MVertex*, MVertexLessThanLexicographic> newVertices; + std::vector<GEntity*> gmEntities; gm->getEntities(gmEntities); @@ -1019,8 +999,8 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, cp.clear(); lines.clear(); triangles.clear(); quads.clear(); tetras.clear(); hexas.clear(); } - for(unsigned int i = 0; i < newVertices.size(); i++) { - vertexMap[newVertices[i]->getNum()] = newVertices[i]; + for(newVerticesContainer::iterator it = newVertices.begin() ; it != newVertices.end(); ++it) { + vertexMap[(*it)->getNum()] = *it; } return cutGM; -- GitLab