Skip to content
Snippets Groups Projects
Commit 63d7ff18 authored by Emilie Marchandise's avatar Emilie Marchandise
Browse files

CreateTopology for volumes now!

parent 9917c50c
No related branches found
No related tags found
No related merge requests found
...@@ -68,6 +68,7 @@ class GFace : public GEntity ...@@ -68,6 +68,7 @@ class GFace : public GEntity
// add/delete regions that are bounded by the face // add/delete regions that are bounded by the face
void addRegion(GRegion *r){ r1 ? r2 = r : r1 = r; } void addRegion(GRegion *r){ r1 ? r2 = r : r1 = r; }
void delRegion(GRegion *r){ if(r1 == r) r1 = r2; r2 = 0; } void delRegion(GRegion *r){ if(r1 == r) r1 = r2; r2 = 0; }
GRegion* getRegion(int num) const{ if (num==0) return r1; else return r2; };
// get number of regions // get number of regions
int numRegions() const { int num=0; if(r1) num++; if(r2) num++; return num; } int numRegions() const { int num=0; if(r1) num++; if(r2) num++; return num; }
......
...@@ -934,9 +934,8 @@ static void _associateEntityWithElementVertices(GEntity *ge, std::vector<T*> &el ...@@ -934,9 +934,8 @@ static void _associateEntityWithElementVertices(GEntity *ge, std::vector<T*> &el
for(unsigned int i = 0; i < elements.size(); i++){ for(unsigned int i = 0; i < elements.size(); i++){
for(int j = 0; j < elements[i]->getNumVertices(); j++){ for(int j = 0; j < elements[i]->getNumVertices(); j++){
if (!elements[i]->getVertex(j)->onWhat() || if (!elements[i]->getVertex(j)->onWhat() ||
elements[i]->getVertex(j)->onWhat()->dim() > ge->dim()){ elements[i]->getVertex(j)->onWhat()->dim() > ge->dim())
elements[i]->getVertex(j)->setEntity(ge); elements[i]->getVertex(j)->setEntity(ge);
}
} }
} }
} }
...@@ -1162,11 +1161,13 @@ void GModel::createTopologyFromMesh() ...@@ -1162,11 +1161,13 @@ void GModel::createTopologyFromMesh()
if((*it)->geomType() == GEntity::DiscreteVolume) if((*it)->geomType() == GEntity::DiscreteVolume)
discRegions.push_back((discreteRegion*) *it); discRegions.push_back((discreteRegion*) *it);
//EMI-FIX in case of createTopology for Volumes //add mesh vertices
//all faces are set to each volume
for (std::vector<discreteRegion*>::iterator it = discRegions.begin(); for (std::vector<discreteRegion*>::iterator it = discRegions.begin();
it != discRegions.end(); it++) it != discRegions.end(); it++){
(*it)->setBoundFaces(); for( std::vector<MVertex*>::const_iterator itv = (*it)->mesh_vertices.begin();
itv != (*it)->mesh_vertices.end(); itv++)
(*itv)->setEntity(*it);
}
//for each discreteFace, createTopology //for each discreteFace, createTopology
std::vector<discreteFace*> discFaces; std::vector<discreteFace*> discFaces;
...@@ -1175,10 +1176,7 @@ void GModel::createTopologyFromMesh() ...@@ -1175,10 +1176,7 @@ void GModel::createTopologyFromMesh()
discFaces.push_back((discreteFace*) *it); discFaces.push_back((discreteFace*) *it);
//-------- //--------
//EMI TODO //for each discrete face, compute if it is made of connected faces
//check for closed faces
printf("discr faces size=%d \n", discFaces.size());
std::vector<discreteFace*> newDiscFaces; std::vector<discreteFace*> newDiscFaces;
for (std::vector<discreteFace*>::iterator itF = discFaces.begin(); for (std::vector<discreteFace*>::iterator itF = discFaces.begin();
itF != discFaces.end(); itF++){ itF != discFaces.end(); itF++){
...@@ -1203,26 +1201,42 @@ void GModel::createTopologyFromMesh() ...@@ -1203,26 +1201,42 @@ void GModel::createTopologyFromMesh()
//fill new face with mesh vertices //fill new face with mesh vertices
std::set<MVertex*> allV; std::set<MVertex*> allV;
for(unsigned int i = 0; i < myElements.size(); i++) { for(unsigned int i = 0; i < myElements.size(); i++) {
MVertex *v0 = myElements[i]->getVertex(0); MVertex *v0 = myElements[i]->getVertex(0);
MVertex *v1 = myElements[i]->getVertex(1); MVertex *v1 = myElements[i]->getVertex(1);
MVertex *v2 = myElements[i]->getVertex(2); MVertex *v2 = myElements[i]->getVertex(2);
f->triangles.push_back(new MTriangle( v0, v1, v2)); f->triangles.push_back(new MTriangle( v0, v1, v2));
allV.insert(v0); allV.insert(v1); allV.insert(v2); allV.insert(v0); allV.insert(v1); allV.insert(v2);
v0->setEntity(f); v1->setEntity(f); v2->setEntity(f); v0->setEntity(f); v1->setEntity(f); v2->setEntity(f);
} }
f->mesh_vertices.insert(f->mesh_vertices.begin(), allV.begin(),allV.end()); f->mesh_vertices.insert(f->mesh_vertices.begin(), allV.begin(),allV.end());
//delete new mesh vertices of face from adjacent regions
for (std::vector<discreteRegion*>::iterator itR = discRegions.begin();
itR != discRegions.end(); itR++){
for (std::set<MVertex*>::iterator itv = allV.begin();itv != allV.end(); itv++) {
std::vector<MVertex*>::iterator itve =
std::find((*itR)->mesh_vertices.begin(), (*itR)->mesh_vertices.end(), *itv);
if (itve != (*itR)->mesh_vertices.end()) (*itR)->mesh_vertices.erase(itve);
}
}
} }
} }
discFaces = newDiscFaces; discFaces = newDiscFaces;
//------ //------
//EMI-FIX in case of createTopology for Volumes
//all faces are set to each volume
for (std::vector<discreteRegion*>::iterator it = discRegions.begin(); it != discRegions.end(); it++)
(*it)->setBoundFaces();
createTopologyFromFaces(discFaces); createTopologyFromFaces(discFaces);
double t2 = Cpu(); double t2 = Cpu();
Msg::Info("Creating topology from mesh done (%g s)", t2-t1); Msg::Info("Creating topology from mesh done (%g s)", t2-t1);
//create old format (necessaray for boundary layers) //create old format (necessary for boundary layers)
exportDiscreteGEOInternals(); exportDiscreteGEOInternals();
} }
...@@ -1295,7 +1309,7 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1295,7 +1309,7 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
std::set<MEdge, Less_Edge >::iterator itset = myEdges.find(me); std::set<MEdge, Less_Edge >::iterator itset = myEdges.find(me);
myEdges.erase(itset); myEdges.erase(itset);
} }
for (std::vector<int>::iterator itFace = tagFaces.begin(); for (std::vector<int>::iterator itFace = tagFaces.begin();
itFace != tagFaces.end(); itFace++) { itFace != tagFaces.end(); itFace++) {
std::map<int, std::vector<int> >::iterator it = face2Edges.find(*itFace); std::map<int, std::vector<int> >::iterator it = face2Edges.find(*itFace);
...@@ -1305,7 +1319,22 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1305,7 +1319,22 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
allEdges.insert(allEdges.begin(), tagEdges.begin(), tagEdges.end()); allEdges.insert(allEdges.begin(), tagEdges.begin(), tagEdges.end());
it->second = allEdges; it->second = allEdges;
} }
//delete new mesh vertices of edge from adjacent faces
GFace *gf = getFaceByTag(*itFace);
for (std::vector<int>::iterator itEdge = tagEdges.begin();
itEdge != tagEdges.end(); itEdge++) {
int count = 0;
GEdge *ge = getEdgeByTag(*itEdge);
for( std::vector<MVertex*>::const_iterator itv = ge->mesh_vertices.begin();
itv != ge->mesh_vertices.end(); itv++){
std::vector<MVertex*>::iterator itve = std::find
(gf->mesh_vertices.begin(), gf->mesh_vertices.end(), *itv);
if (itve != gf->mesh_vertices.end()){ count++; gf->mesh_vertices.erase(itve);}
}
}
} }
} }
} }
...@@ -1322,13 +1351,13 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1322,13 +1351,13 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
discEdges.push_back(e); discEdges.push_back(e);
//fill new edge with mesh vertices //fill new edge with mesh vertices
std::vector<MVertex*> allV; std::set<MVertex*> allV;
for(unsigned int i = 0; i < myLines.size(); i++) { for(unsigned int i = 0; i < myLines.size(); i++) {
MVertex *v0 = myLines[i].getVertex(0); MVertex *v0 = myLines[i].getVertex(0);
MVertex *v1 = myLines[i].getVertex(1); MVertex *v1 = myLines[i].getVertex(1);
e->lines.push_back(new MLine( v0, v1)); e->lines.push_back(new MLine( v0, v1));
if (std::find(allV.begin(), allV.end(), v0) == allV.end()) allV.push_back(v0); allV.insert(v0);//before it was std::vector with find ??
if (std::find(allV.begin(), allV.end(), v1) == allV.end()) allV.push_back(v1); allV.insert(v1);
v0->setEntity(e); v0->setEntity(e);
v1->setEntity(e); v1->setEntity(e);
} }
...@@ -1339,7 +1368,7 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1339,7 +1368,7 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
//delete new mesh vertices of edge from adjacent faces //delete new mesh vertices of edge from adjacent faces
GFace *dFace = getFaceByTag(*itFace); GFace *dFace = getFaceByTag(*itFace);
for (std::vector<MVertex*>::iterator itv = allV.begin();itv != allV.end(); itv++) { for (std::set<MVertex*>::iterator itv = allV.begin();itv != allV.end(); itv++) {
std::vector<MVertex*>::iterator itve = std::vector<MVertex*>::iterator itve =
std::find(dFace->mesh_vertices.begin(), dFace->mesh_vertices.end(), *itv); std::find(dFace->mesh_vertices.begin(), dFace->mesh_vertices.end(), *itv);
if (itve != dFace->mesh_vertices.end()) dFace->mesh_vertices.erase(itve); if (itve != dFace->mesh_vertices.end()) dFace->mesh_vertices.erase(itve);
...@@ -1376,15 +1405,16 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1376,15 +1405,16 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
// for each discreteEdge, create Topology // for each discreteEdge, create Topology
std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > face2Vert; std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > face2Vert;
std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > region2Vert;
face2Vert.clear(); face2Vert.clear();
region2Vert.clear();
for (std::vector<discreteEdge*>::iterator it = discEdges.begin(); it != discEdges.end(); it++){ for (std::vector<discreteEdge*>::iterator it = discEdges.begin(); it != discEdges.end(); it++){
(*it)->createTopo(); (*it)->createTopo();
(*it)->parametrize(face2Vert);//region2Vert (*it)->parametrize(face2Vert, region2Vert);
} }
//we need to recreate lines, triangles and tets //we need to recreate lines, triangles and tets
//that contain those new MEdgeVertices //that contain those new MEdgeVertices
//for (std::list<GFace*>::iterator iFace = lFaces.begin(); iFace != lFaces.end(); iFace++){
for (std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator for (std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator
iFace= face2Vert.begin(); iFace != face2Vert.end(); iFace++){ iFace= face2Vert.begin(); iFace != face2Vert.end(); iFace++){
std::map<MVertex*, MVertex*, std::less<MVertex*> > old2new = iFace->second; std::map<MVertex*, MVertex*, std::less<MVertex*> > old2new = iFace->second;
...@@ -1415,40 +1445,43 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces) ...@@ -1415,40 +1445,43 @@ void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces)
gf->quadrangles = newQuadrangles; gf->quadrangles = newQuadrangles;
} }
// for(GModel::riter iRegion = firstRegion(); iRegion != lastRegion(); iRegion++){ for (std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator
// std::vector<MTetrahedron*> newTetrahedra; iRegion= region2Vert.begin(); iRegion != region2Vert.end(); iRegion++){
// std::vector<MHexahedron*> newHexahedra; std::map<MVertex*, MVertex*, std::less<MVertex*> > old2new = iRegion->second;
// std::vector<MPrism*> newPrisms; GRegion *gr = iRegion->first;
// std::vector<MPyramid*> newPyramids; std::vector<MTetrahedron*> newTetrahedra;
// for (unsigned int i = 0; i < (*iRegion)->getNumMeshElements(); ++i){ std::vector<MHexahedron*> newHexahedra;
// MElement *e = (*iRegion)->getMeshElement(i); std::vector<MPrism*> newPrisms;
// int N = e->getNumVertices(); std::vector<MPyramid*> newPyramids;
// std::vector<MVertex *> v(N); for (unsigned int i = 0; i < gr->getNumMeshElements(); ++i){
// for(int j = 0; j < N; j++) v[j] = e->getVertex(j); MElement *e = gr->getMeshElement(i);
// for (int j = 0; j < N; j++){ int N = e->getNumVertices();
// std::map<MVertex*, MVertex*, std::less<MVertex*> >::iterator itmap = old2new.find(v[j]); std::vector<MVertex *> v(N);
// MVertex *vNEW; for(int j = 0; j < N; j++) v[j] = e->getVertex(j);
// if (itmap != old2new.end()) { for (int j = 0; j < N; j++){
// vNEW = itmap->second; std::map<MVertex*, MVertex*, std::less<MVertex*> >::iterator itmap = old2new.find(v[j]);
// v[j]=vNEW; MVertex *vNEW;
// } if (itmap != old2new.end()) {
// } vNEW = itmap->second;
// if (N == 4) newTetrahedra.push_back(new MTetrahedron(v[0], v[1], v[2], v[3])); v[j]=vNEW;
// else if (N == 5) newPyramids.push_back(new MPyramid(v[0], v[1], v[2], v[3], v[4])); }
// else if (N == 6) newPrisms.push_back(new MPrism(v[0], v[1], v[2], v[3], v[4], v[5])); }
// else if (N == 8) newHexahedra.push_back(new MHexahedron(v[0], v[1], v[2], v[3], if (N == 4) newTetrahedra.push_back(new MTetrahedron(v[0], v[1], v[2], v[3]));
// v[4], v[5], v[6], v[7])); else if (N == 5) newPyramids.push_back(new MPyramid(v[0], v[1], v[2], v[3], v[4]));
// } else if (N == 6) newPrisms.push_back(new MPrism(v[0], v[1], v[2], v[3], v[4], v[5]));
// (*iRegion)->deleteVertexArrays(); else if (N == 8) newHexahedra.push_back(new MHexahedron(v[0], v[1], v[2], v[3],
// (*iRegion)->tetrahedra.clear(); v[4], v[5], v[6], v[7]));
// (*iRegion)->tetrahedra = newTetrahedra; }
// (*iRegion)->pyramids.clear(); gr->deleteVertexArrays();
// (*iRegion)->pyramids = newPyramids; gr->tetrahedra.clear();
// (*iRegion)->prisms.clear(); gr->tetrahedra = newTetrahedra;
// (*iRegion)->prisms = newPrisms; gr->pyramids.clear();
// (*iRegion)->hexahedra.clear(); gr->pyramids = newPyramids;
// (*iRegion)->hexahedra = newHexahedra; gr->prisms.clear();
// } gr->prisms = newPrisms;
gr->hexahedra.clear();
gr->hexahedra = newHexahedra;
}
} }
......
...@@ -242,7 +242,8 @@ void discreteEdge::setBoundVertices() ...@@ -242,7 +242,8 @@ void discreteEdge::setBoundVertices()
+---------------+--------------+----------- ... ----------+ +---------------+--------------+----------- ... ----------+
_pars[0]=0 _pars[1]=1 _pars[2]=2 _pars[N+1]=N+1 _pars[0]=0 _pars[1]=1 _pars[2]=2 _pars[N+1]=N+1
*/ */
void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &face2Vert) void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &face2Vert,
std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &region2Vert)
{ {
for (unsigned int i = 0; i < lines.size() + 1; i++){ for (unsigned int i = 0; i < lines.size() + 1; i++){
_pars.push_back(i); _pars.push_back(i);
...@@ -283,6 +284,8 @@ void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, s ...@@ -283,6 +284,8 @@ void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, s
// that contain those new MEdgeVertices // that contain those new MEdgeVertices
for(std::list<GFace*>::iterator iFace = l_faces.begin(); iFace != l_faces.end(); ++iFace){ for(std::list<GFace*>::iterator iFace = l_faces.begin(); iFace != l_faces.end(); ++iFace){
//for each face find correspondane face2Vertex
std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator itmap = face2Vert.find(*iFace); std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator itmap = face2Vert.find(*iFace);
if (itmap == face2Vert.end()) { if (itmap == face2Vert.end()) {
face2Vert.insert(std::make_pair(*iFace, old2new)); face2Vert.insert(std::make_pair(*iFace, old2new));
...@@ -293,6 +296,22 @@ void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, s ...@@ -293,6 +296,22 @@ void discreteEdge::parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, s
mapVert.insert(*it); mapVert.insert(*it);
itmap->second = mapVert; itmap->second = mapVert;
} }
//do the same for regions
for ( int j = 0; j < (*iFace)->numRegions(); j++){
GRegion *r = (*iFace)->getRegion(j);
std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator itmap = region2Vert.find(r);
if (itmap == region2Vert.end()) {
region2Vert.insert(std::make_pair(r, old2new));
}
else{
std::map<MVertex*, MVertex*, std::less<MVertex*> > mapVert = itmap->second;
for (std::map<MVertex*, MVertex*, std::less<MVertex*> >::iterator it = old2new.begin(); it != old2new.end(); it++)
mapVert.insert(*it);
itmap->second = mapVert;
}
}
} }
} }
......
...@@ -25,7 +25,8 @@ class discreteEdge : public GEdge { ...@@ -25,7 +25,8 @@ class discreteEdge : public GEdge {
virtual GPoint point(double p) const; virtual GPoint point(double p) const;
virtual SVector3 firstDer(double par) const; virtual SVector3 firstDer(double par) const;
virtual Range<double> parBounds(int) const; virtual Range<double> parBounds(int) const;
void parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &face2Verts); void parametrize( std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &face2Verts,
std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &region2Vert);
void orderMLines(); void orderMLines();
void setBoundVertices(); void setBoundVertices();
void createTopo(); void createTopo();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment