From c9ce5938e42f1720f3ae0602846a241255c53e69 Mon Sep 17 00:00:00 2001 From: Amaury Johnan <amjohnen@gmail.com> Date: Tue, 28 Jun 2016 14:58:02 +0000 Subject: [PATCH] allow reversed element to be of non-zero quality if needed. --- Geo/MElement.cpp | 27 ++++++++++++++++++--------- Geo/MElement.h | 3 ++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 9c7e895000..12b8bbd453 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -235,10 +235,19 @@ double MElement::maxDistToStraight() const return maxdx; } -double MElement::minAnisotropyMeasure(bool knownValid) +double MElement::minAnisotropyMeasure(bool knownValid, bool reversedOK) { #if defined(HAVE_MESH) - return jacobianBasedQuality::minAnisotropyMeasure(this, knownValid); + return jacobianBasedQuality::minAnisotropyMeasure(this, knownValid, reversedOK); +#else + return 0.; +#endif +} + +double MElement::minScaledJacobian(bool knownValid, bool reversedOK) +{ +#if defined(HAVE_MESH) + return jacobianBasedQuality::minScaledJacobian(this, knownValid, reversedOK); #else return 0.; #endif @@ -249,10 +258,10 @@ double MElement::specialQuality() #if defined(HAVE_MESH) double minJ, maxJ; jacobianBasedQuality::minMaxJacobianDeterminant(this, minJ, maxJ); - if (minJ == 0.) return 0; - if (minJ < 0 && maxJ >= 0) return minJ/maxJ; // accept -inf as an answer - if (minJ < 0 && maxJ < 0) return -std::numeric_limits<double>::infinity(); - return jacobianBasedQuality::minAnisotropyMeasure(this, true); + if (minJ <= 0.) return minJ; +// if (minJ < 0 && maxJ >= 0) return minJ/maxJ; // accept -inf as an answer +// if (minJ < 0 && maxJ < 0) return -std::numeric_limits<double>::infinity(); + return jacobianBasedQuality::minIsotropyMeasure(this, true); #else return 0; #endif @@ -263,9 +272,9 @@ double MElement::specialQuality2() #if defined(HAVE_MESH) double minJ, maxJ; jacobianBasedQuality::minMaxJacobianDeterminant(this, minJ, maxJ); - if (minJ == 0.) return 0; - if (minJ < 0 && maxJ >= 0) return minJ/maxJ; // accept -inf as an answer - if (minJ < 0 && maxJ < 0) return -std::numeric_limits<double>::infinity(); + if (minJ <= 0.) return minJ; +// if (minJ < 0 && maxJ >= 0) return minJ/maxJ; // accept -inf as an answer +// if (minJ < 0 && maxJ < 0) return -std::numeric_limits<double>::infinity(); return jacobianBasedQuality::minScaledJacobian(this, true); #else return 0; diff --git a/Geo/MElement.h b/Geo/MElement.h index 6ce208d477..cdf005092a 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -216,7 +216,8 @@ class MElement signedInvCondNumRange(sICNMin, sICNMax); return sICNMin; } - double minAnisotropyMeasure(bool knownValid = false); + double minAnisotropyMeasure(bool knownValid = false, bool reversedOk = false); + double minScaledJacobian(bool knownValid = false, bool reversedOk = false); double specialQuality(); double specialQuality2(); virtual double angleShapeMeasure() { return 1.0; } -- GitLab