Skip to content
Snippets Groups Projects
Commit bd4adc7c authored by PA Beaufort's avatar PA Beaufort
Browse files

modifcations for the update of the topology, after splitting: it is done after...

modifcations for the update of the topology, after splitting: it is done after all disk-like parts have been identified.
parent 2bb56874
No related branches found
No related tags found
No related merge requests found
...@@ -126,14 +126,13 @@ void discreteFace::createGeometry() ...@@ -126,14 +126,13 @@ void discreteFace::createGeometry()
std::vector<MElement*> tem(triangles.begin(),triangles.end()); std::vector<MElement*> tem(triangles.begin(),triangles.end());
triangulation* init = new triangulation(tem,this); triangulation* init = new triangulation(tem,this);
init->my_GEdges = l_edges;
toSplit.push(init); toSplit.push(init);
//int mygen, compteur=1;//#debug //int mygen, compteur=1;//#debug
Msg::Info("First Genus Value:"); //Msg::Info("First Genus Value:");
//mygen=1; //#debug //mygen=1; //#debug
if((toSplit.top())->genus()!=0){// (mygen!=0){//#debug //if(mygen!=0){// #debug
if((toSplit.top())->genus()!=0){
while( !toSplit.empty()){ while( !toSplit.empty()){
std::vector<triangulation*> part; std::vector<triangulation*> part;
...@@ -146,7 +145,8 @@ void discreteFace::createGeometry() ...@@ -146,7 +145,8 @@ void discreteFace::createGeometry()
for(unsigned int i=0; i<part.size(); i++){ for(unsigned int i=0; i<part.size(); i++){
//Msg::Info("Partition %d Genus:",compteur);//#debug //Msg::Info("Partition %d Genus:",compteur);//#debug
//std::cin>>mygen;//#debug //std::cin>>mygen;//#debug
if(part[i]->genus()!=0)// (mygen!=0)//#debug //if (mygen!=0)//#debug
if(part[i]->genus()!=0)
toSplit.push(part[i]); toSplit.push(part[i]);
else{ else{
toParam.push_back(part[i]); toParam.push_back(part[i]);
...@@ -161,6 +161,8 @@ void discreteFace::createGeometry() ...@@ -161,6 +161,8 @@ void discreteFace::createGeometry()
toSplit.top()->idNum=id++; toSplit.top()->idNum=id++;
} }
updateTopology(toParam);
for(unsigned int i=0; i<toParam.size(); i++){ for(unsigned int i=0; i<toParam.size(); i++){
std::vector<MElement*> mytri = toParam[i]->tri; std::vector<MElement*> mytri = toParam[i]->tri;
discreteDiskFace *df = new discreteDiskFace (this,toParam[i], order,(_CAD.empty() ? NULL : &_CAD)); discreteDiskFace *df = new discreteDiskFace (this,toParam[i], order,(_CAD.empty() ? NULL : &_CAD));
...@@ -218,9 +220,9 @@ void discreteFace::mesh(bool verbose) ...@@ -218,9 +220,9 @@ void discreteFace::mesh(bool verbose)
{ {
#if defined(HAVE_ANN) && defined(HAVE_SOLVER) && defined(HAVE_MESH) #if defined(HAVE_ANN) && defined(HAVE_SOLVER) && defined(HAVE_MESH)
if (!CTX::instance()->meshDiscrete) return; if (!CTX::instance()->meshDiscrete) return;
for (unsigned int i=0;i<_atlas.size();i++){ for (unsigned int i=0;i<_atlas.size();i++)
_atlas[i]->mesh(verbose); _atlas[i]->mesh(verbose);
}
gatherMeshes(); gatherMeshes();
meshStatistics.status = GFace::DONE; meshStatistics.status = GFace::DONE;
#endif #endif
...@@ -334,8 +336,6 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne ...@@ -334,8 +336,6 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
newE[0] = new discreteEdge (de->model(),NEWLINE(),de->getBeginVertex(),gv); newE[0] = new discreteEdge (de->model(),NEWLINE(),de->getBeginVertex(),gv);
newE[1] = new discreteEdge (de->model(),NEWLINE(),gv, de->getEndVertex()); newE[1] = new discreteEdge (de->model(),NEWLINE(),gv, de->getEndVertex());
//de->model()->add(newE[0]);
//de->model()->add(newE[1]);
int current = 0; int current = 0;
std::vector<MLine*> mlines; std::vector<MLine*> mlines;
...@@ -349,7 +349,6 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne ...@@ -349,7 +349,6 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
current++; current++;
} }
} }
//for(int ie=0; ie<2; ie++) newE[ie]->createGeometry();
de->mesh_vertices.clear(); de->mesh_vertices.clear();
de->lines.clear(); de->lines.clear();
...@@ -373,7 +372,7 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne ...@@ -373,7 +372,7 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
df->l_edges.clear(); df->l_edges.clear();
df->setBoundEdges (df->model(), tagEdges); df->setBoundEdges (df->model(), tagEdges);
} }
else Msg::Fatal("discreteFace::splitDiscreteEdge \t This only applies to discrete geometries"); else Msg::Fatal("discreteFace::splitDiscreteEdge, This only applies to discrete geometries");
} }
} }
de->model()->remove(de); de->model()->remove(de);
...@@ -471,11 +470,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -471,11 +470,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
for(int i=0; i<nPartitions; i++)// new triangulation of the connected parts for(int i=0; i<nPartitions; i++)// new triangulation of the connected parts
partition.push_back(new triangulation(elem[i],this)); partition.push_back(new triangulation(elem[i],this));
#endif
}
void discreteFace::updateTopology(std::vector<triangulation*>&partition){
//------------------------------------------------------// //------------------------------------------------------//
//---- setting topology, i.e. GEdge's and GVertex's ----// //---- setting topology, i.e. GEdge's and GVertex's ----//
//------------------------------------------------------// //------------------------------------------------------//
int nPartitions = partition.size();
std::set<MVertex*> todelete; // vertices that do not belong to the GFace anymore std::set<MVertex*> todelete; // vertices that do not belong to the GFace anymore
std::set<GEdge*> gGEdges(trian->my_GEdges.begin(),trian->my_GEdges.end());// current GEdges of the initial (old) triangulation std::set<GEdge*> gGEdges(l_edges.begin(),l_edges.end());// initial GEdges of the GFace (to be updated)
for(int i=0; i<nPartitions; i++){// each part is going ot be compared with the other ones for(int i=0; i<nPartitions; i++){// each part is going ot be compared with the other ones
std::set<MEdge,Less_Edge> bordi = partition[i]->borderEdg;// edges defining the border(s) of the i-th new triangulation std::set<MEdge,Less_Edge> bordi = partition[i]->borderEdg;// edges defining the border(s) of the i-th new triangulation
for(int ii=i+1; ii<nPartitions; ii++){// compare to the ii-th partitions, with ii > i since ii < i have already been compared for(int ii=i+1; ii<nPartitions; ii++){// compare to the ii-th partitions, with ii > i since ii < i have already been compared
...@@ -513,11 +521,18 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -513,11 +521,18 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
mvt.resize(2); mvt.resize(2);
mvt[0] = *itf; mvt[0] = *itf;
mvt[1] = cv0; mvt[1] = cv0;
for(int imvt=0; imvt<2; imvt++){// creation of the GVertex, for new nonloop GEdge's
// creation of the GVertex, for new nonloop GEdge's
for(int imvt=0; imvt<2; imvt++){
std::set<GEdge*>::iterator oe=gGEdges.begin();// find the old GEdge that has the current new GVertex std::set<GEdge*>::iterator oe=gGEdges.begin();// find the old GEdge that has the current new GVertex
while(mvt[imvt]->onWhat() != *oe && mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && mvt[imvt]->onWhat() != (*oe)->getEndVertex() && oe !=gGEdges.end()) while(oe !=gGEdges.end() && mvt[imvt]->onWhat() != *oe && mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && mvt[imvt]->onWhat() != (*oe)->getEndVertex())
++oe; ++oe;
if (oe == gGEdges.end()) Msg::Error("discreteFace::split \t This Vertex %d is not on a GEdge !",mvt[imvt]->getNum());
if (oe == gGEdges.end()){// not on an existing GEdge: new internal GVertex
v[imvt] = new discreteVertex (this->model(),NEWPOINT());
setupDiscreteVertex(v[imvt],mvt[imvt],&todelete);
}
else{// on an existing GEdge
GEdge* onit = *oe;// the new GVertex can already exist; if it is the case, there is no need to create a new one GEdge* onit = *oe;// the new GVertex can already exist; if it is the case, there is no need to create a new one
if(mvt[imvt] == onit->getBeginVertex()->mesh_vertices[0]) if(mvt[imvt] == onit->getBeginVertex()->mesh_vertices[0])
v[imvt] = onit->getBeginVertex(); v[imvt] = onit->getBeginVertex();
...@@ -526,13 +541,12 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -526,13 +541,12 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
else{ else{
v[imvt] = new discreteVertex (this->model(),NEWPOINT()); v[imvt] = new discreteVertex (this->model(),NEWPOINT());
setupDiscreteVertex(v[imvt],mvt[imvt],NULL); setupDiscreteVertex(v[imvt],mvt[imvt],NULL);
printf("dv %d on GEdge (%d,%d)\n",v[imvt]->mesh_vertices[0]->getNum(),onit->getBeginVertex()->mesh_vertices[0]->getNum(),onit->getEndVertex()->mesh_vertices[0]->getNum());
discreteEdge* de[2]; discreteEdge* de[2];
gGEdges.erase(onit);// updating the GEdge's of the initial triangulation
splitDiscreteEdge(onit,v[imvt],de); splitDiscreteEdge(onit,v[imvt],de);
gGEdges.insert(de[0]); gGEdges.insert(de[0]);
gGEdges.insert(de[1]); gGEdges.insert(de[1]);
}// end else }// end if-elseif-else
}// end else oe==end()
}// end imvt }// end imvt
// the new GEdge can be created with its GVertex // the new GEdge can be created with its GVertex
discreteEdge* internalE = new discreteEdge (this->model(),NEWLINE(),v[0],v[1]); discreteEdge* internalE = new discreteEdge (this->model(),NEWLINE(),v[0],v[1]);
...@@ -542,15 +556,7 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -542,15 +556,7 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
first.erase(itf);// next first vertex of a nonloop GEdge first.erase(itf);// next first vertex of a nonloop GEdge
}//end while first.empty() }//end while first.empty()
// adding old-updated GEdge's to the corresponding partitions
for(std::set<GEdge*>::iterator le=gGEdges.begin(); le!=gGEdges.end(); ++le){
GEdge* ile = *le;
MEdge edTest = ile->lines.front()->getEdge(0);
if(bordi.find(edTest)!=bordi.end())
partition[i]->my_GEdges.push_back(ile);
else
partition[ii]->my_GEdges.push_back(ile);
}
// remaining MLines for 'loop'GEdge's // remaining MLines for 'loop'GEdge's
while(!v02edg.empty()){ while(!v02edg.empty()){
discreteVertex* v; discreteVertex* v;
...@@ -571,6 +577,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -571,6 +577,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
}//end for ii }//end for ii
}// end for i }// end for i
// adding old-updated bounding GEdge's to the corresponding partitions
for(std::set<GEdge*>::iterator le=gGEdges.begin(); le!=gGEdges.end(); ++le){
GEdge* ile = *le;
MEdge edTest = ile->lines.front()->getEdge(0);
for(int i=0; i<nPartitions; i++){
std::set<MEdge,Less_Edge> bordi = partition[i]->borderEdg;
if(bordi.find(edTest)!=bordi.end()){
partition[i]->my_GEdges.push_back(ile);
break;
}
}
}
// update GFace mesh_vertices // update GFace mesh_vertices
std::vector<MVertex*> newMV; std::vector<MVertex*> newMV;
for(unsigned int imv=0; imv<this->mesh_vertices.size(); imv++){ for(unsigned int imv=0; imv<this->mesh_vertices.size(); imv++){
...@@ -580,11 +600,8 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti ...@@ -580,11 +600,8 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
} }
this->mesh_vertices.clear(); this->mesh_vertices.clear();
this->mesh_vertices = newMV; this->mesh_vertices = newMV;
#endif
} }
// delete all discrete disk faces // delete all discrete disk faces
//void discreteFace::deleteAtlas() { //void discreteFace::deleteAtlas() {
//} //}
......
...@@ -34,6 +34,7 @@ class discreteFace : public GFace { ...@@ -34,6 +34,7 @@ class discreteFace : public GFace {
void setupDiscreteVertex(GVertex*,MVertex*,std::set<MVertex*>*); void setupDiscreteVertex(GVertex*,MVertex*,std::set<MVertex*>*);
void setupDiscreteEdge(discreteEdge*,std::vector<MLine*>,std::set<MVertex*>*); void setupDiscreteEdge(discreteEdge*,std::vector<MLine*>,std::set<MVertex*>*);
void splitDiscreteEdge(GEdge*,GVertex*,discreteEdge*[2]); void splitDiscreteEdge(GEdge*,GVertex*,discreteEdge*[2]);
void updateTopology(std::vector<triangulation*>&);
void split(triangulation*,std::vector<triangulation*>&,int); void split(triangulation*,std::vector<triangulation*>&,int);
GPoint point(double par1, double par2) const; GPoint point(double par1, double par2) const;
SPoint2 parFromPoint(const SPoint3 &p, bool onSurface=true) const; SPoint2 parFromPoint(const SPoint3 &p, bool onSurface=true) const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment