From ac5c6a10c56bcce6eeb52843592eb64af9dce67c Mon Sep 17 00:00:00 2001 From: Gaetan Bricteux <gaetan.bricteux@uclouvain.be> Date: Tue, 13 Sep 2011 15:39:46 +0000 Subject: [PATCH] create new elementary for non connected border lines --- Geo/MElementCut.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp index c589eecc39..dcb86464ef 100644 --- a/Geo/MElementCut.cpp +++ b/Geo/MElementCut.cpp @@ -1150,9 +1150,8 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, MVertex *vi = gmEntities[i]->getMeshVertex(j); if(cutElem){ int k = 0; - for(; k < primS; k++){ + for(; k < primS; k++) verticesLs(k, vi->getIndex()) = (*primitives[k])(vi->x(), vi->y(), vi->z()); - } if(primS > 1) verticesLs(k, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z()); } @@ -1199,6 +1198,10 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, std::vector<const gLevelset *> RPN; ls->getRPN(RPN); for(unsigned int i = 0; i < gmEntities.size(); i++) { + std::vector<int> oldLineRegs; + for (std::map<int, std::vector<MElement*> >::iterator it = elements[1].begin(); + it != elements[1].end(); it++) + oldLineRegs.push_back(it->first); for(unsigned int j = 0; j < gmEntities[i]->getNumMeshElements(); j++) { MElement *e = gmEntities[i]->getMeshElement(j); e->setVolumePositive(); @@ -1207,6 +1210,58 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, borderElemTags, borderPhysTags, cp, lines, triangles, quads, tetras, hexas); cutGM->getMeshPartitions().insert(e->getPartition()); } + + // Create elementary and physical for non connected border lines + if(triangles.size() && lines.size()){ + std::vector<int> newLineRegs; + int k = 0; + for (std::map<int, std::vector<MElement*> >::iterator it = elements[1].begin(); + it != elements[1].end(); it++){ + if(oldLineRegs.size() && it->first == oldLineRegs[k]) + k++; + else + newLineRegs.push_back(it->first); + } + for(unsigned int j = 0; j < newLineRegs.size(); j++){ + int nLR = newLineRegs[j]; + while(1){ + std::vector<MElement*> conLines; + conLines.push_back(elements[1][nLR][0]); + elements[1][nLR].erase(elements[1][nLR].begin()); + MVertex *v1 = conLines[0]->getVertex(0); + MVertex *v2 = conLines[0]->getVertex(1); + for(int k = 0; k < elements[1][nLR].size(); ){ + MVertex *va = elements[1][nLR][k]->getVertex(0); + MVertex *vb = elements[1][nLR][k]->getVertex(1); + if(va == v1 || vb == v1 || va == v2 || vb == v2){ + conLines.push_back(elements[1][nLR][k]); + elements[1][nLR].erase(elements[1][nLR].begin() + k); + if(v1 == va) v1 = vb; + else if(v1 == vb) v1 = va; + else if(v2 == va) v2 = vb; + else if(v2 == vb) v2 = va; + k = 0; + } + else + k++; + } + if(!elements[1][nLR].empty()){ + int newReg = ++newElemTags[1][0]; + int newPhys = ++newPhysTags[1][0]; + std::vector<int> phys; phys.push_back(newPhys); + assignPhysicals(gm, phys, newReg, 1, physicals); + for(int k = 0; k < conLines.size(); k++) + elements[1][newReg].push_back(conLines[k]); + } + else { + for(int k = 0; k < conLines.size(); k++) + elements[1][nLR].push_back(conLines[k]); + break; + } + } + } + } + for(DI_Point::Container::iterator it = cp.begin(); it != cp.end(); it++) delete *it; for(unsigned int k = 0; k < lines.size(); k++) delete lines[k]; for(unsigned int k = 0; k < triangles.size(); k++) delete triangles[k]; -- GitLab