diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp index 4e66328a3a3acb7e46956252253ea326186b52f4..c0615a89b52e2aea6f525da29f3bacd1563b0456 100644 --- a/Mesh/meshGFaceRecombine.cpp +++ b/Mesh/meshGFaceRecombine.cpp @@ -36,7 +36,6 @@ #include "Context.h" #include "OS.h" -It''s RElement that give Blossom Qual ! #define E(x) Msg::Error x #define F(x) Msg::Fatal x @@ -44,6 +43,7 @@ It''s RElement that give Blossom Qual ! #define W(x) Msg::Warning x #define DEBUG(x) {x} // TODO : regarder pour pointing +// It''s RElement that should give Blossom Qual ! Recombine2D *Recombine2D::_cur = NULL; @@ -2639,6 +2639,7 @@ void Rec2DTwoTri2Quad::_computeReward() return; case VertEdgeQuality : + { double valEdge = -Recombine2D::getWeightEdgeBase() * _edges[4]->getQual(); for (int i = 0; i < 4; ++i) valEdge += Recombine2D::getWeightEdgeQuad() * _edges[i]->getQual(); @@ -2653,8 +2654,10 @@ void Rec2DTwoTri2Quad::_computeReward() - Recombine2D::getWeightEdgeBase(); _reward = Rec2DData::getGlobalQuality(0, _valVert, w, valEdge) - Rec2DData::getGlobalQuality(); + _lastUpdate = Recombine2D::getNumChange(); return; + } default : Msg::Error("[Rec2DData] Unknown quality criterion"); @@ -2972,7 +2975,7 @@ void Rec2DCollapse::printReward() const valVert += _rec->_vertices[0]->getGainMerge(_rec->_vertices[1], &_rec->_edges[1], 2); - valVert += _rec->_vertices[2]->getGainTriLess(_rec->_edges[0]); normal ? + valVert += _rec->_vertices[2]->getGainTriLess(_rec->_edges[0]); //normal ? valVert += _rec->_vertices[3]->getGainTriLess(_rec->_edges[2]); for (int i = 0; i < 4; ++i) { @@ -3439,8 +3442,8 @@ double Rec2DEdge::_straightAlignment() const /*******************/ Rec2DVertex::Rec2DVertex(MVertex *v) : _v(v), _angle(4.*M_PI), _onWhat(1), _parity(0), - _lastUpdate(-1), _sumQualAngle(.0), _sumQualEdge(.0), - _sumAngle(0), _sumEdge(0), _pos(-1) + _lastUpdate(-1), _sumWQualAngle(.0), _sumWQualEdge(.0), + _sumWeightAngle(0), _sumWeightEdge(0), _pos(-1) { reparamMeshVertexOnFace(_v, Recombine2D::getGFace(), _param); reveal(); @@ -3454,8 +3457,8 @@ Rec2DVertex::Rec2DVertex(MVertex *v) Rec2DVertex::Rec2DVertex(Rec2DVertex *rv, double ang) : _v(rv->_v), _angle(ang), _onWhat(-1), _parity(rv->_parity), _lastUpdate(rv->_lastUpdate), - _sumQualAngle(rv->_sumQualAngle), _sumQualEdge(rv->_sumQualEdge), - _sumAngle(rv->_sumAngle), _sumEdge(rv->_sumEdge), _edges(rv->_edges), + _sumWQualAngle(rv->_sumWQualAngle), _sumWQualEdge(rv->_sumWQualEdge), + _sumWeightAngle(rv->_sumWeightAngle), _sumWeightEdge(rv->_sumWeightEdge), _edges(rv->_edges), _elements(rv->_elements), _param(rv->_param), _pos(-1) { rv->hide(false); @@ -3544,8 +3547,8 @@ void Rec2DVertex::add(const Rec2DEdge *re) double oldQual = getQual(VertQuality); _edges.push_back(const_cast<Rec2DEdge*>(re)); - _sumQualEdge += re->getWeightedQual(); - _sumEdge += re->getWeight(); + _sumWQualEdge += re->getWeightedQual(); + _sumWeightEdge += re->getWeight(); _lastUpdate = Recombine2D::getNumChange(); Rec2DData::updateVertQual(getQual(VertQuality)-oldQual, VertQuality); @@ -3569,9 +3572,9 @@ void Rec2DVertex::rmv(const Rec2DEdge *re) _edges[i] = _edges.back(); _edges.pop_back(); - _sumQualEdge -= re->getWeightedQual(); - _sumEdge -= re->getWeight(); - if (_sumEdge < 0 || _sumQualEdge < -1e12) + _sumWQualEdge -= re->getWeightedQual(); + _sumWeightEdge -= re->getWeight(); + if (_sumWeightEdge < 0 || _sumWQualEdge < -1e12) Msg::Error("[Rec2DVertex] Negative sum edge"); _lastUpdate = Recombine2D::getNumChange(); @@ -3596,8 +3599,8 @@ void Rec2DVertex::add(const Rec2DElement *rel) double oldQual2 = getQual(VertEdgeQuality); _elements.push_back(const_cast<Rec2DElement*>(rel)); - _sumAngle += rel->getAngleWeight(); - _sumQualAngle += rel->getWeightedAngleQual(this); + _sumWeightAngle += rel->getAngleWeight(); + _sumWQualAngle += rel->getWeightedAngleQual(this); _lastUpdate = Recombine2D::getNumChange(); Rec2DData::updateVertQual(getQual(VertQuality)-oldQual1, VertQuality); @@ -3624,8 +3627,8 @@ void Rec2DVertex::rmv(const Rec2DElement *rel) _elements[i] = _elements.back(); _elements.pop_back(); - _sumAngle -= _elements[i]->getAngleWeight(); - _sumQualAngle -= _elements[i]->getWeightedAngleQual(this); + _sumWeightAngle -= _elements[i]->getAngleWeight(); + _sumWQualAngle -= _elements[i]->getWeightedAngleQual(this); _lastUpdate = Recombine2D::getNumChange(); Rec2DData::updateVertQual(getQual(VertQuality)-oldQual1, VertQuality); @@ -3806,10 +3809,10 @@ double Rec2DVertex::getQual(Rec2DQualCrit crit) const switch (crit) { case VertQuality : - return _qualVert() * _WAQualEdges(); + return _vertQual() * _WAQualEdges(); case VertEdgeQuality : - return _qualVert(); + return _vertQual(); default : Msg::Error("[Rec2DData] Unknown quality criterion"); @@ -3818,8 +3821,8 @@ double Rec2DVertex::getQual(Rec2DQualCrit crit) const } #ifdef REC2D_VERT_ONLY -double Rec2DVertex::getQual(Rec2DQualCrit crit, double waQualAngles, - double waQualEdges, int numElem) const +double Rec2DVertex::getQual(double waQualAngles, double waQualEdges, + int numElem, Rec2DQualCrit crit) const { if (crit < 0) crit = Recombine2D::getQualCrit(); @@ -3840,7 +3843,7 @@ double Rec2DVertex::getQual(Rec2DQualCrit crit, double waQualAngles, return -1.; } -double Rec2DVertex::vertQual_getGainQuad(const Rec2DElement *rel, +double Rec2DVertex::/*vertQual_*/getGainQuad(const Rec2DElement *rel, const Rec2DEdge *re0, const Rec2DEdge *re1 ) const { @@ -3848,25 +3851,26 @@ double Rec2DVertex::vertQual_getGainQuad(const Rec2DElement *rel, - Recombine2D::getWeightAngleTri(); double wq = Recombine2D::getWeightEdgeQuad(); - double qualAngle = _sumQualAngle + wa * rel->getAngleQual(this) ; - int sumAngle = _sumAngle + wa; + double qualAngle = _sumWQualAngle + wa * rel->getAngleQual(this) ; + int sumAngle = _sumWeightAngle + wa; - double qualEdge = _sumQualEdge + wq * re0->getQual() + wq * re1->getQual(); - int sumEdge = _sumEdge + 2*wq; + double qualEdge = _sumWQualEdge + wq * re0->getQual() + wq * re1->getQual(); + int sumEdge = _sumWeightEdge + 2*wq; - return getQual(sumAngle, qualAngle, sumEdge, qualEdge, - (int)_elements.size() ) - getQual(); + return getQual(qualAngle/sumAngle, qualEdge/sumEdge, + (int)_elements.size() ) - getQual(); } -double Rec2DVertex::vertQual_getGainTriLess(const Rec2DEdge *re) const + +double Rec2DVertex::/*vertQual_*/getGainTriLess(const Rec2DEdge *re) const { - return getQual(_sumAngle - Recombine2D::getWeightAngleTri(), _sumQualAngle - quelquechose?, - _sumEdge - Recombine2D::getWeightEdgeBase(), - _sumQualEdge - re->getQual(), + return getQual(_sumWQualAngle /*!!!!*/ / (_sumWeightAngle - Recombine2D::getWeightAngleTri()), + (_sumWQualEdge - re->getQual()) + / (_sumWeightEdge - Recombine2D::getWeightEdgeBase()), (int)_elements.size() - 1) - getQual(); } -double Rec2DVertex::getGainRecomb(Rec2DQualCrit crit +double Rec2DVertex::getGainRecomb(/*Rec2DQualCrit crit,*/ const Rec2DElement *rel1, const Rec2DElement *rel2, const Rec2DEdge *re0, @@ -3878,10 +3882,10 @@ double Rec2DVertex::getGainRecomb(Rec2DQualCrit crit return -1.; } - if (crit == BlossomQuality) return .0; - if (crit < 0) { + //if (crit == BlossomQuality) return .0; + //if (crit < 0) { Msg::Warning("[Rec2DVertex] Give me another criterion please."); - } + //} double swQualAngle = _sumWQualAngle, swQualEdge = _sumWQualEdge; int swAngle = _sumWeightAngle, swEdge = _sumWeightEdge; @@ -3904,28 +3908,28 @@ double Rec2DVertex::getGainRecomb(Rec2DQualCrit crit swEdge += 2 * weq - web; } - return getQual(swAngle, swQualAngle, swEdge, swQualEdge, - static_cast<int>(_elements.size())-1, crit) - - getQual(crit); + return getQual(swQualAngle / swAngle, swQualEdge / swEdge, + static_cast<int>(_elements.size())-1/*, crit*/) + - getQual(/*crit*/); - v�rifier que c''est bien ce qui est demand� ! (renvoie bien ce que veux apply, compute reward, ...) + //FIX v�rifier que c''est bien ce qui est demand� ! (renvoie bien ce que veux apply, compute reward, ...) } -void Rec2DVertex::vertQual_addEdgeQual(double val, int num) +void Rec2DVertex::/*vertQual_*/addEdgeQual(double val, int num) { double oldQual = .0; if (_elements.size()) oldQual = getQual(); - _sumQualEdge += val; - _sumEdge += num; - if (_sumEdge < 0 || _sumQualEdge < -1e12) + _sumWQualEdge += val; + _sumWeightEdge += num; + if (_sumWeightEdge < 0 || _sumWQualEdge < -1e12) Msg::Error("[Rec2DVertex] Negative sum edge"); if (_elements.size()) Rec2DData::addSumVert(getQual()-oldQual); _lastUpdate = Recombine2D::getNumChange(); } -double Rec2DVertex::vertQual_getGainMerge(const Rec2DVertex *rv, +double Rec2DVertex::/*vertQual_*/getGainMerge(const Rec2DVertex *rv, const Rec2DEdge *const*edges, int nEdges) const { int sumAngle = 0; @@ -3969,19 +3973,19 @@ double Rec2DVertex::vertQual_getGainMerge(const Rec2DVertex *rv, sumQualEdge -= Recombine2D::getWeightEdgeBase() * edges[i]->getQual(); } - return Rec2DVertex::getQual(sumAngle, sumQualAngle, - sumEdge, sumQualEdge, numElem) + return Rec2DVertex::getQual(sumQualAngle/sumAngle, + sumQualEdge/sumEdge, numElem) - getQual() - rv->getQual() ; } //#else -double Rec2DVertex::vertEdgeQual_getGainOneElemLess() const -{here element size instead of weight - return getGainDegree(-1) + _sumQualAngle / (_elements.size()-1) - _qualAngle(); +double Rec2DVertex::/*vertEdgeQual_*/getGainOneElemLess() const +{//FIX here element size instead of weight + return getGainDegree(-1) + _sumWQualAngle / (_elements.size()-1) - _WAQualAngles(); } -double Rec2DVertex::vertEdgeQual_getGainMerge(const Rec2DVertex *rv) const +double Rec2DVertex::/*vertEdgeQual_*/getGainMerge(const Rec2DVertex *rv) const { - double ans = .0, sumQualAngle = .0 + double ans = .0, sumQualAngle = .0; int sumAngle = 0; ans -= getQual(); ans -= rv->getQual(); @@ -3989,14 +3993,14 @@ double Rec2DVertex::vertEdgeQual_getGainMerge(const Rec2DVertex *rv) const int *angleWeight = new int[_elements.size()]; for (unsigned int i = 0; i < _elements.size(); ++i) { qualAngle[i] = _elements[i]->getWeightedAngleQual(this); - angleWeight[i] = _elements[i]->getAngleWeight(this); + angleWeight[i] = _elements[i]->getAngleWeight(); } for (unsigned int i = 0; i < rv->_elements.size(); ++i) { unsigned int j = 0; while (j < _elements.size() && _elements[j] != rv->_elements[i]) ++j; if (j >= _elements.size()) { sumQualAngle += rv->_elements[i]->getWeightedAngleQual(rv); - sumAngle += rv->_elements[i]->getAngleWeight(rv); + sumAngle += rv->_elements[i]->getAngleWeight(); } else { qualAngle[j] = .0; @@ -4008,6 +4012,7 @@ double Rec2DVertex::vertEdgeQual_getGainMerge(const Rec2DVertex *rv) const sumAngle += angleWeight[i]; } + int numElem = _elements.size() + rv->_elements.size() - 4; ans += getQualDegree(numElem) + sumQualAngle / sumAngle; return ans; } @@ -4054,8 +4059,8 @@ void Rec2DVertex::printElem() const void Rec2DVertex::printQual() const { Msg::Info("d:%g, a:%g, e:%g (sa:%d, se:%d)", - getQualDegree(), _sumQualAngle/_sumAngle, _sumQualEdge / _sumEdge, - _sumAngle, _sumEdge); + getQualDegree(), _sumWQualAngle/_sumWeightAngle, _sumWQualEdge / _sumWeightEdge, + _sumWeightAngle, _sumWeightEdge); } bool Rec2DVertex::_recursiveBoundParity(const Rec2DVertex *prevRV, int p0, int p1) @@ -4089,11 +4094,11 @@ void Rec2DVertex::_updateQualAngle() double oldQual1 = getQual(VertQuality); double oldQual2 = getQual(VertEdgeQuality); - _sumQualAngle = .0; - _sumAngle = 0; + _sumWQualAngle = .0; + _sumWeightAngle = 0; for (unsigned int i = 0; i < _elements.size(); ++i) { - _sumAngle += _elements[i]->getAngleWeight(); - _sumQualAngle += _elements[i]->getWeightedAngleQual(this); + _sumWeightAngle += _elements[i]->getAngleWeight(); + _sumWQualAngle += _elements[i]->getWeightedAngleQual(this); } _lastUpdate = Recombine2D::getNumChange(); @@ -4472,37 +4477,6 @@ double Rec2DElement::getAngle(const Rec2DVertex *rv) const return ang; } -double Rec2DElement::getAngleQual(const Rec2DVertex *rv) const -{ - std::vector<Rec2DVertex*> vert; - getVertices(vert); - - int index = -1; - for (int i = 0; i < _numEdge; ++i) { - if (vert[i] == rv) { - index = i; - break; - } - } - if (index == -1) { - Msg::Error("[Rec2DElement] I don't have your vertex..."); - Msg::Info("im %d, this is %d", getNum(), rv->getNum()); - return -1.; - } - - int i1 = (index+_numEdge-1)%_numEdge; - int i0 = (index+1)%_numEdge; - double ang = atan2(vert[i0]->v() - rv->v(), vert[i0]->u() - rv->u()) - - atan2(vert[i1]->v() - rv->v(), vert[i1]->u() - rv->u()); - - static unsigned int a = 0; - if (++a < 2) Msg::Warning("FIXME use real angle instead of parametric angle"); - - if (ang < .0) - return ang + 2.*M_PI; - return ang; -} - bool Rec2DElement::hasIdenticalNeighbour() const { for (int i = 1; i < _numEdge; ++i) {