diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp index 53bfff83778452ed2900f928d48b66fdc8433eb7..f26be98e21061e7fc1a4766232db91838338538e 100644 --- a/Mesh/meshGFaceRecombine.cpp +++ b/Mesh/meshGFaceRecombine.cpp @@ -10,7 +10,7 @@ #define REC2D_WAIT_TIME .01 #define REC2D_NUM_ACTIO 1000 - #define REC2D_SMOOTH +// #define REC2D_SMOOTH #define REC2D_DRAW #include "meshGFaceRecombine.h" @@ -41,7 +41,6 @@ int otherParity(int a) { /*******************/ Recombine2D::Recombine2D(GFace *gf) : _gf(gf) { - laplaceSmoothing(_gf,100); if (Recombine2D::_current != NULL) { Msg::Warning("[Recombine2D] An instance already in execution"); return; @@ -50,15 +49,10 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf) backgroundMesh::set(_gf); _bgm = backgroundMesh::current(); - _data = new Rec2DData(gf->triangles.size(), gf->quadrangles.size()); + _data = new Rec2DData(); Rec2DVertex::initStaticTable(); _numChange = 0; -#ifdef REC2D_DRAW - //_data->_tri = _gf->triangles; - //_data->_quad = _gf->quadrangles; -#endif - // Be able to compute geometrical angle at corners std::map<MVertex*, AngleData> mapCornerVert; { @@ -220,6 +214,8 @@ bool Recombine2D::recombine() std::vector<Rec2DVertex*> newPar; nextAction->apply(newPar); + // forall v in newPar : check obsoletes action; + #ifdef REC2D_DRAW _gf->triangles = _data->_tri; _gf->quadrangles = _data->_quad; @@ -312,8 +308,9 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) int p[4]; action->getAssumedParities(p); - if (!p[0] && !p[1] && !p[2] && !p[3]) { - Msg::Info("is isolated"); + if (p[0] && !p[1] && !p[2] && !p[3]) { + static int a = -1; + if (++a < 1) Msg::Warning("FIXME isoleted should be check ? Think not"); return true; } @@ -325,21 +322,12 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) } } - if (p[0] && !p[1] && !p[2] && !p[3]) { - Msg::Info("is isolated"); - static int a = -1; - if (++a < 1) Msg::Warning("FIXME isoleted should be check ? Think not"); - return true; - } - - //Msg::Info("Passsed through there, [%d %d %d %d] -> min %d", p[0], p[1], p[2], p[3], min); - std::set<Rec2DElement*> neighbours; std::vector<Rec2DVertex*> touched; for (int i = 0; i < 4; i += 2) { static int a = -1; - if (++a < 1) Msg::Info("FIXME depend de l'action"); + if (++a < 1) Msg::Warning("FIXME depend de l'action"); int par; if ((index/2) * 2 == i) par = min; @@ -356,34 +344,35 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) } } - for (unsigned int i = 0; i < touched.size(); ++i) { + for (unsigned int i = 0; i < touched.size(); ++i) touched[i]->getTriangles(neighbours); - } touched.clear(); - while (neighbours.size() > 0) { - //Msg::Info("num neigh %d", neighbours.size()); - - std::set<Rec2DElement*>::iterator itTri = neighbours.begin(); + return _remainAllQuad(neighbours); +} + +bool Recombine2D::_remainAllQuad(std::set<Rec2DElement*> &elem) +{ + std::vector<Rec2DVertex*> touched; + + while (elem.size() > 0) { + std::set<Rec2DElement*>::iterator itTri = elem.begin(); int p[3]; (*itTri)->getAssumedParities(p); - //Msg::Info("tri %d [%d %d %d]", (*itel)->getNum(), p[0], p[1], p[2]); bool hasIdentical = false; for (int i = 0; i < 3; ++i) { if (p[i] && p[i] == p[(i+1)%3]) hasIdentical = true; } if (!hasIdentical) { - neighbours.erase(itTri); + elem.erase(itTri); continue; } if (p[0] == p[1] && p[0] == p[2]) { - Msg::Info("3 identical par"); Rec2DData::revertAssumedParities(); return false; } - //Msg::Info("has identical"); bool hasAction = false; std::map<Rec2DVertex*, std::vector<int> > suggestions; @@ -392,11 +381,9 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) hasAction = true; } if (!hasAction) { - //Msg::Info("No action %d", (*itTri)->getNum()); Rec2DData::revertAssumedParities(); return false; } - //Msg::Info("suggest %d", suggestions.size()); std::map<Rec2DVertex*, std::vector<int> >::iterator itSug; itSug = suggestions.begin(); @@ -414,14 +401,11 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) Rec2DVertex *v = itSug->first; int oldPar = v->getAssumedParity(); - //Msg::Info("a %d, %d", par, oldPar); if (!oldPar) { - //Msg::Info("b"); v->setAssumedParity(par); - v->getTriangles(neighbours); + v->getTriangles(elem); } else if ((par/2)*2 != (oldPar/2)*2) { - //Msg::Info("c"); if (oldPar < par) { int a = oldPar; oldPar = par; @@ -429,28 +413,26 @@ bool Recombine2D::_remainAllQuad(Rec2DAction *action) } Rec2DData::associateAssumedParity(oldPar, par, touched); for (unsigned int i = 0; i < touched.size(); ++i) { - touched[i]->getTriangles(neighbours); + touched[i]->getTriangles(elem); } touched.clear(); } else if (par%2 != oldPar%2) { Msg::Error("SHOULD NOT HAPPEN"); - Msg::Info("not all quad"); Rec2DData::revertAssumedParities(); return false; } } } - neighbours.erase(itTri); + elem.erase(itTri); } - //Msg::Info("all quad"); return true; } /** Rec2DData **/ /*****************/ -Rec2DData::Rec2DData(int numTri, int numQuad) +Rec2DData::Rec2DData() { if (Rec2DData::_current != NULL) { Msg::Error("[Rec2DData] An instance in execution"); @@ -459,10 +441,6 @@ Rec2DData::Rec2DData(int numTri, int numQuad) Rec2DData::_current = this; _numEdge = _numVert = 0; _valEdge = _valVert = .0; - - //_elements.reserve((int) (numTri + numQuad) * 1.1); - //_edges.reserve((int) (numTri * 1.8 + numQuad * 2.4)); - //_vertices.reserve((int) (numTri * .6 + numQuad * 1.2)); } Rec2DData::~Rec2DData() @@ -543,7 +521,7 @@ void Rec2DData::remove(Rec2DElement *rel) return; } } - Msg::Info("[Rec2DData] Didn't erased mtriangle :("); + Msg::Warning("[Rec2DData] Didn't erased mtriangle :("); } MQuadrangle *q = rel->getMQuadrangle(); if (q) { @@ -554,7 +532,7 @@ void Rec2DData::remove(Rec2DElement *rel) return; } } - Msg::Info("[Rec2DData] Didn't erased mquadrangle :("); + Msg::Warning("[Rec2DData] Didn't erased mquadrangle :("); } #endif } @@ -671,7 +649,7 @@ void Rec2DData::associateParity(int pOld, int pNew) { it = _current->_parities.find(pOld); if (it == _current->_parities.end()) { - Msg::Warning("[Rec2DData] What ?"); + Msg::Error("[Rec2DData] What ?"); return; } vect = &it->second; @@ -763,7 +741,7 @@ void Rec2DData::associateAssumedParity(int pOld, int pNew, { it = _current->_parities.find(pOld); if (it == _current->_parities.end()) { - Msg::Warning("[Rec2DData] What ?"); + Msg::Error("[Rec2DData] What ?"); return; } vect = &it->second; @@ -824,7 +802,6 @@ bool lessRec2DAction::operator()(Rec2DAction *ra1, Rec2DAction *ra2) const return *ra1 < *ra2; } - bool Rec2DAction::operator<(Rec2DAction &other) { return getReward() < other.getReward(); @@ -952,7 +929,6 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar) delete _edges[4]; /*new Rec2DCollapse(*/new Rec2DElement(_edges)/*)*/; - } bool Rec2DTwoTri2Quad::isObsolete() @@ -1231,7 +1207,7 @@ Rec2DEdge* Rec2DVertex::getCommonEdge(Rec2DVertex *rv0, Rec2DVertex *rv1) if (rv1->has(rv0->_edges[i])) return rv0->_edges[i]; } - //Msg::Warning("[Rec2DVertex] didn't find edge, returning NULL"); + Msg::Warning("[Rec2DVertex] didn't find edge, returning NULL"); return NULL; } @@ -1443,7 +1419,7 @@ void Rec2DVertex::add(Rec2DEdge *re) { for (unsigned int i = 0; i < _edges.size(); ++i) { if (_edges[i] == re) { - Msg::Warning("[Rec2DVertex] Edge was already there"); + Msg::Error("[Rec2DVertex] Edge was already there"); return; } } @@ -1470,14 +1446,14 @@ void Rec2DVertex::remove(Rec2DEdge *re) } ++i; } - Msg::Warning("[Rec2DVertex] Didn't removed edge, didn't have it"); + Msg::Error("[Rec2DVertex] Didn't removed edge, didn't have it"); } void Rec2DVertex::add(Rec2DElement *rel) { for (unsigned int i = 0; i < _elements.size(); ++i) { if (_elements[i] == rel) { - Msg::Warning("[Rec2DVertex] Element was already there"); + Msg::Error("[Rec2DVertex] Element was already there"); return; } } @@ -1508,7 +1484,7 @@ void Rec2DVertex::remove(Rec2DElement *rel) } ++i; } - Msg::Warning("[Rec2DVertex] Didn't removed element, didn't have it"); + Msg::Error("[Rec2DVertex] Didn't removed element, didn't have it"); } @@ -1574,7 +1550,7 @@ void Rec2DElement::add(Rec2DEdge *re) int i; for (i = 0; i < _numEdge; ++i) { if (_edges[i] == re) { - Msg::Warning("[Rec2DElement] Edge was already there"); + Msg::Error("[Rec2DElement] Edge was already there"); return; } if (_edges[i] == NULL) { @@ -1604,7 +1580,7 @@ void Rec2DElement::add(Rec2DAction *ra) { for (unsigned int i = 0; i < _actions.size(); ++i) { if (_actions[i] == ra) { - Msg::Warning("[Rec2DElement] Action was already there"); + Msg::Error("[Rec2DElement] Action was already there"); return; } } @@ -1622,7 +1598,7 @@ void Rec2DElement::remove(Rec2DAction *ra) } ++i; } - Msg::Warning("[Rec2DElement] Didn't removed action, didn't have it"); + Msg::Error("[Rec2DElement] Didn't removed action, didn't have it"); } void Rec2DElement::addNeighbour(Rec2DEdge *re, Rec2DElement *rel) diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h index 241152687621068f1730e1bee0d6664a8d9fbe8a..847dd61a321ad2689c829a0b36481279f1de263f 100644 --- a/Mesh/meshGFaceRecombine.h +++ b/Mesh/meshGFaceRecombine.h @@ -50,13 +50,13 @@ class Recombine2D { static inline GFace* getGFace() {return _current->_gf;} static inline int getNumChange() {return _current->_numChange;} static inline backgroundMesh* bgm() {return _current->_bgm;} - //recombine : if _current==this ok ! private : double _geomAngle(MVertex*, std::vector<GEdge*>&, std::vector<MElement*>&); bool _remainAllQuad(Rec2DAction *action); + bool _remainAllQuad(std::set<Rec2DElement*>&); }; class Rec2DData { @@ -70,12 +70,13 @@ class Rec2DData { std::set<Rec2DElement*> _elements; std::list<Rec2DAction*> _actions; + std::map<int, std::vector<Rec2DVertex*> > _parities; std::map<int, std::vector<Rec2DVertex*> > _assumedParities; std::map<Rec2DVertex*, int> _oldParity; public : - Rec2DData(int numTri, int numQuad); + Rec2DData(); ~Rec2DData(); void printState(); @@ -87,6 +88,15 @@ class Rec2DData { static double getGlobalValue(); static double getGlobalValue(int numEdge, double valEdge, int numVert, double valVert ); + static inline void addVert(int num, double val) { + _current->_numVert += num; + _current->_valVert += val; + } + static inline void addValVert(double val) {_current->_valVert += val;} + static inline void addEdge(int num, double val) { + _current->_numEdge += num; + _current->_valEdge += val; + } static Rec2DAction* getBestAction(); @@ -128,16 +138,6 @@ class Rec2DData { std::vector<Rec2DVertex*>&); static inline void clearAssumedParities() {_current->_oldParity.clear();} static void revertAssumedParities(); - - static inline void addVert(int num, double val) { - _current->_numVert += num; - _current->_valVert += val; - } - static inline void addValVert(double val) {_current->_valVert += val;} - static inline void addEdge(int num, double val) { - _current->_numEdge += num; - _current->_valEdge += val; - } }; struct lessRec2DAction { @@ -248,10 +248,8 @@ class Rec2DVertex { Rec2DVertex(Rec2DVertex*, double angle); ~Rec2DVertex(); - static void initStaticTable(); - static Rec2DEdge* getCommonEdge(Rec2DVertex*, Rec2DVertex*); - static void getCommonElements(Rec2DVertex*, Rec2DVertex*, - std::vector<Rec2DElement*>&); + double getQual(int numEl = -1) const; + double getGain(int) const; inline void setOnBoundary(); inline bool getOnBoundary() const {return _onWhat < 1;} @@ -278,9 +276,6 @@ class Rec2DVertex { inline double u() const {return _param[0];} inline double v() const {return _param[1];} - double getQual(int numEl = -1) const; - double getGain(int) const; - void add(Rec2DEdge*); bool has(Rec2DEdge*) const; void remove(Rec2DEdge*); @@ -289,6 +284,11 @@ class Rec2DVertex { bool has(Rec2DElement*) const; void remove(Rec2DElement*); + static void initStaticTable(); + static Rec2DEdge* getCommonEdge(Rec2DVertex*, Rec2DVertex*); + static void getCommonElements(Rec2DVertex*, Rec2DVertex*, + std::vector<Rec2DElement*>&); + private : bool _recursiveBoundParity(Rec2DVertex *prev, int p0, int p1); }; @@ -309,12 +309,14 @@ class Rec2DElement { bool inline isTri() {return _numEdge == 3;} bool inline isQuad() {return _numEdge == 4;} + void add(Rec2DEdge*); bool has(Rec2DEdge*) const; void add(Rec2DAction*); void remove(Rec2DAction*); void addNeighbour(Rec2DEdge*, Rec2DElement*); void removeNeighbour(Rec2DEdge*, Rec2DElement*); + inline MElement* getMElement() const {return _mEl;} #ifdef REC2D_DRAW MTriangle* getMTriangle() { @@ -338,13 +340,12 @@ class Rec2DElement { inline int getNumActions() const {return _actions.size();} inline Rec2DAction* getAction(int i) const {return _actions[i];} + void getUniqueActions(std::vector<Rec2DAction*>&) const; void getAssumedParities(int*) const; void getMoreEdges(std::vector<Rec2DEdge*>&) const; void getVertices(std::vector<Rec2DVertex*>&) const; - void getUniqueActions(std::vector<Rec2DAction*>&) const; - static Rec2DEdge* getCommonEdge(Rec2DElement*, Rec2DElement*); - Rec2DVertex* getOtherVertex(Rec2DVertex*, Rec2DVertex*) const; + static Rec2DEdge* getCommonEdge(Rec2DElement*, Rec2DElement*); private : MQuadrangle* _createQuad() const;