diff --git a/Numeric/CondNumBasis.cpp b/Numeric/CondNumBasis.cpp index ce48ccef9902f8062aedd6edcca2274cf337fa9d..ff0b36f828ebb5c437b546ded7dac2694b215021 100644 --- a/Numeric/CondNumBasis.cpp +++ b/Numeric/CondNumBasis.cpp @@ -110,8 +110,6 @@ inline void calcGradInvCondNum2D(double dxdX, double dxdY, const fullMatrix<double> &gSMatY, fullMatrix<double> &IDI) { - static const double Eps = 1e-10; - bool posJac = true; if (sign) { const double lnx = dydX*dzdY - dzdX*dydY, lny = dzdX*dxdY - dxdX*dzdY, // Local normal from mapping gradients @@ -138,7 +136,7 @@ inline void calcGradInvCondNum2D(double dxdX, double dxdY, const double S12 = Dx*Dy; const double S13 = Dx*Dx; const double S = 2.*(S2+S5+S12)+ 4.*(S7-S8+S9-S10) + 8.*(S3+S6) + S1+S4+S11+S13; - if (S < Eps) { // S == 0. -> Ideal element + if (S == 0.) { // S == 0. -> Ideal element for (int j = 0; j<3*numMapNodes; j++) IDI(i, j) = 0.; IDI(i, 3*numMapNodes) = posJac ? 1. : -1.; return; diff --git a/contrib/MeshOptimizer/MeshOptPatch.cpp b/contrib/MeshOptimizer/MeshOptPatch.cpp index f36799e280577ac86dca922fb28cc2711909dfe5..6b4e866c696187b1e1671c11bdc2c90613576b01 100644 --- a/contrib/MeshOptimizer/MeshOptPatch.cpp +++ b/contrib/MeshOptimizer/MeshOptPatch.cpp @@ -626,14 +626,13 @@ void Patch::initInvCondNum() } } -// // Set normals to 2D elements (with magnitude of inverse Jacobian) or initial -// // Jacobians of 3D elements -// if ((_dim == 2) && _condNormEl.empty()) { -// _condNormEl.resize(nEl()); -//// for (int iEl = 0; iEl < nEl(); iEl++) calcScaledNormalEl2D(element2entity,iEl); -// for (int iEl = 0; iEl < nEl(); iEl++) -// calcNormalEl2D(iEl, NS_SQRTNORM, _condNormEl[iEl], true); -// } + // Set normals to 2D elements + if ((_dim == 2) && _condNormEl.empty()) { + _condNormEl.resize(nEl()); +// for (int iEl = 0; iEl < nEl(); iEl++) calcScaledNormalEl2D(element2entity,iEl); + for (int iEl = 0; iEl < nEl(); iEl++) + calcNormalEl2D(iEl, NS_UNIT, _condNormEl[iEl], true); + } } @@ -655,12 +654,7 @@ void Patch::invCondNumAndGradients(int iEl, std::vector<double> &condNum, } // Calculate ICN and gradients - // TODO: Use signed measure for 2D as well - if (_dim == 3) { - cnBasis->getSignedInvCondNumAndGradients(nodesXYZ, normals, IDI); - } - else - cnBasis->getInvCondNumAndGradients(nodesXYZ, IDI); + cnBasis->getSignedInvCondNumAndGradients(nodesXYZ, _condNormEl[iEl], IDI); // Inverse condition number for (int l = 0; l < numICN; l++) condNum[l] = IDI(l, 3*numMapNodes); diff --git a/contrib/MeshOptimizer/MeshOptPatch.h b/contrib/MeshOptimizer/MeshOptPatch.h index cc5d2bd327b27d2f75c22c77b3f7341826e9132b..7e18e8409ba209a420ed5f8c3ae118e48a56165e 100644 --- a/contrib/MeshOptimizer/MeshOptPatch.h +++ b/contrib/MeshOptimizer/MeshOptPatch.h @@ -157,8 +157,8 @@ private: std::vector<int> _nIJacEl; // Number of NCJ values for an el std::vector<fullMatrix<double> > _IJacNormEl; // Normals to 2D elements for Jacobian regularization and scaling std::vector<double> _invIJac; // Initial Jacobians for 3D elements - std::vector<int> _nICNEl; // Number of inv. cond. number values for an el. -// std::vector<fullMatrix<double> > _condNormEl; // Normals to 2D elements for inverse conditioning computation + std::vector<int> _nICNEl; // Number of inv. cond. number values for an el. + std::vector<fullMatrix<double> > _condNormEl; // Normals to 2D elements for inverse conditioning computation }; diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp index 8c47078ea457c9e38562c2c7fe11d029f5f483d1..deaf84865a43ccc5570c7fdce56c6366fa621b50 100644 --- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp +++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.cpp @@ -25,7 +25,7 @@ struct QualPatchDefParameters : public MeshOptPatchDef virtual int inPatch(const SPoint3 &badBary, double limDist, MElement *el) const; private: - bool _excludeHex, _excludePrism; + bool _excludeQuad, _excludeHex, _excludePrism; double _idealJacMin, _invCondNumMin; double _distanceFactor; }; @@ -33,6 +33,7 @@ private: QualPatchDefParameters::QualPatchDefParameters(const MeshQualOptParameters &p) { + _excludeQuad = p.excludeQuad; _excludeHex = p.excludeHex; _excludePrism = p.excludePrism; _idealJacMin = p.minTargetIdealJac; @@ -55,6 +56,7 @@ QualPatchDefParameters::QualPatchDefParameters(const MeshQualOptParameters &p) double QualPatchDefParameters::elBadness(MElement *el) const { const int typ = el->getType(); + if (_excludeQuad && (typ == TYPE_QUA)) return 1.; if (_excludeHex && (typ == TYPE_HEX)) return 1.; if (_excludePrism && (typ == TYPE_PRI)) return 1.; // double jMin, jMax; @@ -76,7 +78,9 @@ int QualPatchDefParameters::inPatch(const SPoint3 &badBary, double limDist, MElement *el) const { const int typ = el->getType(); - if ((typ == TYPE_HEX) || (typ == TYPE_PRI)) return -1; + if (_excludeQuad && (typ == TYPE_QUA)) return -1; + if (_excludeHex && (typ == TYPE_HEX)) return -1; + if (_excludePrism && (typ == TYPE_PRI)) return -1; return testElInDist(badBary, limDist, el) ? 1 : 0; } diff --git a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h index 052addc17207b99cd4b77e0d30e0be39453c36c9..97ec9a596ef9b8c7bba19f31ba3a4c5722d93178 100644 --- a/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h +++ b/contrib/MeshQualityOptimizer/MeshQualityOptimizer.h @@ -33,7 +33,7 @@ class GModel; struct MeshQualOptParameters { - bool excludeHex, excludePrism; + bool excludeQuad, excludeHex, excludePrism; double minTargetIdealJac; double minTargetInvCondNum; double weightFixed; // weight of the energy for fixed nodes @@ -58,8 +58,8 @@ struct MeshQualOptParameters { double CPU; // Time for optimization MeshQualOptParameters () - : excludeHex(false), excludePrism(false), minTargetIdealJac(0.1), - minTargetInvCondNum(0.1), weightFixed(1000.), + : excludeQuad(false), excludeHex(false), excludePrism(false), + minTargetIdealJac(0.1), minTargetInvCondNum(0.1), weightFixed(1000.), weightFree (1.), nbLayers (6) , dim(3) , itMax(300), optPassMax(50), onlyVisible(true), distanceFactor(12), fixBndNodes(false), strategy(0), maxAdaptBlob(3), adaptBlobLayerFact(2.), adaptBlobDistFact(2.), CPU(0.),