diff --git a/Plugin/AnalyseCurvedMesh.cpp b/Plugin/AnalyseCurvedMesh.cpp index 3a49ddb3afd1954d9d541c94c68006cdbd2d75d2..c1c239bfb516e9d493f34ebb66e7dc3a8771e7b2 100644 --- a/Plugin/AnalyseCurvedMesh.cpp +++ b/Plugin/AnalyseCurvedMesh.cpp @@ -172,8 +172,12 @@ PView* GMSH_AnalyseCurvedMeshPlugin::execute(PView *v) std::map<int, std::vector<double> > dataPV; for (unsigned int i = 0; i < _data.size(); ++i) { MElement *const el = _data[i].element(); - if (el->getDim() == dim) - dataPV[el->getNum()].push_back(_data[i].minJ()/_data[i].maxJ()); + if (el->getDim() == dim) { + double q = 0; + if (_data[i].maxJ() > 0) q = _data[i].minJ() / _data[i].maxJ(); + else if (_data[i].maxJ() < 0) q = _data[i].maxJ() / _data[i].minJ(); + dataPV[el->getNum()].push_back(q); + } } if (dataPV.size()) { std::stringstream name; @@ -248,6 +252,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim) return; } + int cntInverted = 0; std::set<GEntity*, GEntityLessThan>::iterator it; for (it = entities.begin(); it != entities.end(); ++it) { GEntity *entity = *it; @@ -335,13 +340,14 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim) double min, max; jacobianBasedQuality::minMaxJacobianDeterminant(el, min, max, normals); _data.push_back(data_elementMinMax(el, min, max)); - if (min < 0 && max < 0) { - Msg::Warning("Element %d is completely inverted", el->getNum()); - } + if (min < 0 && max < 0) ++cntInverted; progress.next(); } delete normals; } + if (cntInverted) { + Msg::Warning("%d elements are completely inverted", cntInverted); + } _computedJac[dim-1] = true; } @@ -354,7 +360,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinIGE(int dim) for (unsigned int i = 0; i < _data.size(); ++i) { MElement *const el = _data[i].element(); if (el->getDim() != dim) continue; - if (_data[i].minJ() <= 0) { + if (_data[i].minJ() <= 0 && _data[i].maxJ() > 0) { _data[i].setMinS(0); } else { @@ -375,7 +381,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinICN(int dim) for (unsigned int i = 0; i < _data.size(); ++i) { MElement *const el = _data[i].element(); if (el->getDim() != dim) continue; - if (_data[i].minJ() <= 0) { + if (_data[i].minJ() <= 0 && _data[i].maxJ() > 0) { _data[i].setMinI(0); } else { @@ -438,19 +444,22 @@ void GMSH_AnalyseCurvedMeshPlugin::_printStatJacobian() avgminJ = avgratJ = avgratJc = 0; for (unsigned int i = 0; i < _data.size(); ++i) { - double q = 0; - if ( _data[i].minJ() > 0) q = _data[i].minJ() / _data[i].maxJ(); infminJ = std::min(infminJ, _data[i].minJ()); supminJ = std::max(supminJ, _data[i].minJ()); avgminJ += _data[i].minJ(); - infratJ = std::min(infratJ, _data[i].minJ()/_data[i].maxJ()); - supratJ = std::max(supratJ, _data[i].minJ()/_data[i].maxJ()); - avgratJ += _data[i].minJ()/_data[i].maxJ(); - ++count; + + double q = 0; + if (_data[i].maxJ() > 0) q = _data[i].minJ() / _data[i].maxJ(); + else if (_data[i].maxJ() < 0) q = _data[i].maxJ() / _data[i].minJ(); + infratJ = std::min(infratJ, q); + supratJ = std::max(supratJ, q); + avgratJ += q; if (q < 1-1e-5) { avgratJc += _data[i].minJ()/_data[i].maxJ(); ++countc; } + + ++count; } avgminJ /= count; avgratJ /= count;