diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index b34fba5a0e215fdd10fa60d37f75ab7629053e49..a956ebf86d759d75023748331c544e9e61f159e6 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -144,7 +144,7 @@ static void GetQualityMeasure(std::vector<T*> &ele, if(s > (2*j-100) / 100. && s <= (2*j-98) / 100.) quality[0][j]++; if(g > j / 100. && g <= (j + 1) / 100.) quality[1][j]++; if(r > j / 100. && r <= (j + 1) / 100.) quality[2][j]++; - if(e > (2*j-100) / 100. && e <= (2*j-98) / 100.) quality[4][j]++; + if(e > (2*j-100) / 100. && e <= (2*j-98) / 100.) quality[3][j]++; } } } diff --git a/Mesh/qualityMeasuresJacobian.cpp b/Mesh/qualityMeasuresJacobian.cpp index fa960a6ed24c140208f4e2e5020e2b4bf8e5a7c1..6d82b43ba1df2d9a1e969071b40eaeae7dba8e82 100644 --- a/Mesh/qualityMeasuresJacobian.cpp +++ b/Mesh/qualityMeasuresJacobian.cpp @@ -20,9 +20,9 @@ static const double cTri = 2/std::sqrt(3); static const double cTet = std::sqrt(2); static const double cPyr = std::sqrt(2); -static void computeCoeffLengthVectors_(const fullMatrix<double> &mat, - fullMatrix<double> &coeff, - int type, int numCoeff = -1) +static inline void computeCoeffLengthVectors_(const fullMatrix<double> &mat, + fullMatrix<double> &coeff, + int type, int numCoeff = -1) { int sz1 = numCoeff > -1 ? numCoeff : mat.size1(); @@ -106,10 +106,10 @@ static void computeCoeffLengthVectors_(const fullMatrix<double> &mat, } } -static void computeIGE_(const fullVector<double> &det, - const fullMatrix<double> &v, - fullVector<double> &ige, - int type) +static inline void computeIGE_(const fullVector<double> &det, + const fullMatrix<double> &v, + fullVector<double> &ige, + int type) { int sz = std::min(det.size(), v.size1()); ige.resize(sz); @@ -124,18 +124,21 @@ static void computeIGE_(const fullVector<double> &det, for (int i = 0; i < sz; i++) { ige(i) = det(i)/v(i, 0)/v(i, 1)/v(i, 2); } + break; case TYPE_TRI: for (int i = 0; i < sz; i++) { ige(i) = cTri * det(i) * (1/v(i,0)/v(i,1) + 1/v(i,0)/v(i,2) + 1/v(i,1)/v(i,2)) / 3; } + break; case TYPE_PRI: for (int i = 0; i < sz; i++) { ige(i) = cTri * det(i) * (1/v(i,0)/v(i,1)/v(i,2) + 1/v(i,0)/v(i,3)/v(i,2) + 1/v(i,1)/v(i,3)/v(i,2)) / 3; } + break; case TYPE_TET: for (int i = 0; i < sz; i++) { ige(i) = cTet * det(i) * (1/v(i,0)/v(i,5)/v(i,1) + @@ -149,8 +152,9 @@ static void computeIGE_(const fullVector<double> &det, 1/v(i,2)/v(i,3)/v(i,0) + 1/v(i,2)/v(i,3)/v(i,1) + 1/v(i,2)/v(i,3)/v(i,4) + - 1/v(i,2)/v(i,3)/v(i,5)) / 12; + 1/v(i,2)/v(i,3)/v(i,5))/ 12; } + break; case TYPE_PYR: for (int i = 0; i < sz; i++) { ige(i) = cPyr * det(i) * (1/v(i,0)/v(i,1)/v(i,2) + @@ -162,7 +166,56 @@ static void computeIGE_(const fullVector<double> &det, 1/v(i,4)/v(i,5)/v(i,2) + 1/v(i,4)/v(i,5)/v(i,3) ) / 8; } + break; } +// for (int i = 0; i < sz; i++) { +// double sJ; +// switch (type) { +// case TYPE_QUA: +// ige(i) = det(i) / v(i, 0) / v(i, 1); +// break; +// case TYPE_HEX: +// ige(i) = det(i) / v(i, 0) / v(i, 1) / v(i, 2); +// break; +// case TYPE_TRI: +// ige(i) = cTri * det(i) * (1 / v(i, 0) / v(i, 1) + +// 1 / v(i, 0) / v(i, 2) + +// 1 / v(i, 1) / v(i, 2)) / 3; +// break; +// case TYPE_TET: +// ige(i) = cTet * det(i) * (1 / v(i, 0) / v(i, 5) / v(i, 1) + +// 1 / v(i, 0) / v(i, 5) / v(i, 2) + +// 1 / v(i, 0) / v(i, 5) / v(i, 3) + +// 1 / v(i, 0) / v(i, 5) / v(i, 4) + +// 1 / v(i, 1) / v(i, 4) / v(i, 0) + +// 1 / v(i, 1) / v(i, 4) / v(i, 2) + +// 1 / v(i, 1) / v(i, 4) / v(i, 3) + +// 1 / v(i, 1) / v(i, 4) / v(i, 5) + +// 1 / v(i, 2) / v(i, 3) / v(i, 0) + +// 1 / v(i, 2) / v(i, 3) / v(i, 1) + +// 1 / v(i, 2) / v(i, 3) / v(i, 4) + +// 1 / v(i, 2) / v(i, 3) / v(i, 5)) / 12; +// break; +// case TYPE_PRI: +// ige(i) = cTri * det(i) * (1 / v(i, 0) / v(i, 1) / v(i, 2) + +// 1 / v(i, 0) / v(i, 3) / v(i, 2) + +// 1 / v(i, 1) / v(i, 3) / v(i, 2)) / 3; +// break; +// case TYPE_PYR: +// ige(i) = cPyr * det(i) * (1 / v(i, 0) / v(i, 1) / v(i, 2) + +// 1 / v(i, 0) / v(i, 1) / v(i, 3) + +// 1 / v(i, 0) / v(i, 1) / v(i, 4) + +// 1 / v(i, 0) / v(i, 1) / v(i, 5) + +// 1 / v(i, 2) / v(i, 3) / v(i, 4) + +// 1 / v(i, 2) / v(i, 3) / v(i, 5) + +// 1 / v(i, 4) / v(i, 5) / v(i, 2) + +// 1 / v(i, 4) / v(i, 5) / v(i, 3)) / 8; +// break; +// default: +// Msg::Error("Unkown type for IGE computation"); +// return; +// } +// } } namespace jacobianBasedQuality { @@ -727,7 +780,7 @@ double _CoeffDataIGE::_computeLowerBound() const } fullMatrix<double> v; - _getCoeffLengthVectors(v, false); + computeCoeffLengthVectors_(_coeffsJacMat, v, _type); fullVector<double> prox[6]; for (int i = 0; i < v.size2(); ++i) { diff --git a/Mesh/qualityMeasuresJacobian.h b/Mesh/qualityMeasuresJacobian.h index 5466765b0b1bb0a2bad7ac0e84f553ab2c913501..6c3b62992a1df10b80eed5c812d02207a1c11103 100644 --- a/Mesh/qualityMeasuresJacobian.h +++ b/Mesh/qualityMeasuresJacobian.h @@ -32,7 +32,7 @@ class _CoeffData protected: double _minL, _maxL; //Extremum of Jac at corners double _minB, _maxB; //Extremum of bezier coefficients - int _depth; + const int _depth; public: _CoeffData(int depth) : _minL(0), _maxL(0), _minB(0), _maxB(0), @@ -78,7 +78,7 @@ private: const fullVector<double> _coeffsJacDet; const fullMatrix<double> _coeffsJacMat; const bezierBasis *_bfsDet, *_bfsMat; - int _type; + const int _type; public: _CoeffDataIGE(fullVector<double> &det,