From a9a2009622928c424936c95d6b9b433353ebd57c Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 27 Sep 2013 10:55:49 +0000 Subject: [PATCH] fix crash in distMaxStraight (thanks Wendy!) --- Numeric/polynomialBasis.cpp | 32 ++++++++++++-------- contrib/HighOrderMeshOptimizer/OptHomRun.cpp | 11 ++++--- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp index 01388992be..df717fb229 100644 --- a/Numeric/polynomialBasis.cpp +++ b/Numeric/polynomialBasis.cpp @@ -23,8 +23,8 @@ namespace { { if(monomial.size1() != point.size1() || monomial.size2() != point.size2()){ Msg::Fatal("Wrong sizes for Lagrange coefficients generation %d %d -- %d %d", - monomial.size1(),point.size1(), - monomial.size2(),point.size2() ); + monomial.size1(), point.size1(), + monomial.size2(), point.size2() ); return fullMatrix<double>(1, 1); } @@ -140,11 +140,13 @@ void polynomialBasis::f(const fullMatrix<double> &coord, fullMatrix<double> &sf) { double p[1256]; sf.resize (coord.size1(), coefficients.size1()); - for (int iPoint=0; iPoint< coord.size1(); iPoint++) { - evaluateMonomials(coord(iPoint,0), coord(iPoint,1), coord.size2() > 2 ? coord(iPoint,2) : 0, p); + for (int iPoint = 0; iPoint < coord.size1(); iPoint++) { + evaluateMonomials(coord(iPoint, 0), coord(iPoint, 1), + coord.size2() > 2 ? coord(iPoint, 2) : 0, p); for (int i = 0; i < coefficients.size1(); i++) { sf(iPoint,i) = 0.; - for (int j = 0; j < coefficients.size2(); j++) sf(iPoint,i) += coefficients(i, j) * p[j]; + for (int j = 0; j < coefficients.size2(); j++) + sf(iPoint,i) += coefficients(i, j) * p[j]; } } } @@ -155,7 +157,8 @@ void polynomialBasis::df(const fullMatrix<double> &coord, fullMatrix<double> &df dfm.resize (coefficients.size1(), coord.size1() * 3, false); int dimCoord = coord.size2(); for (int iPoint=0; iPoint< coord.size1(); iPoint++) { - df(coord(iPoint,0), dimCoord > 1 ? coord(iPoint, 1) : 0., dimCoord > 2 ? coord(iPoint, 2) : 0., dfv); + df(coord(iPoint, 0), dimCoord > 1 ? coord(iPoint, 1) : 0., + dimCoord > 2 ? coord(iPoint, 2) : 0., dfv); for (int i = 0; i < coefficients.size1(); i++) { dfm(i, iPoint * 3 + 0) = dfv[i][0]; dfm(i, iPoint * 3 + 1) = dfv[i][1]; @@ -332,7 +335,8 @@ void polynomialBasis::dddf(double u, double v, double w, double third[][3][3][3] for(int j = 0; j < coefficients.size2(); j++){ if (monomials(j, 0) > 2) // second derivative !=0 third[i][0][0][0] += coefficients(i, j) * - pow_int(u, (monomials(j, 0) - 3))*monomials(j, 0) * (monomials(j, 0) - 1) *(monomials(j, 0) - 2) * + pow_int(u, (monomials(j, 0) - 3))*monomials(j, 0) * + (monomials(j, 0) - 1) *(monomials(j, 0) - 2) * pow_int(v, monomials(j, 1)); if ((monomials(j, 0) > 1) && (monomials(j, 1) > 0)) third[i][0][0][1] += coefficients(i, j) * @@ -345,7 +349,8 @@ void polynomialBasis::dddf(double u, double v, double w, double third[][3][3][3] if (monomials(j, 1) > 2) third[i][1][1][1] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * - pow_int(v, monomials(j, 1) - 3) * monomials(j, 1) * (monomials(j, 1) - 1)*(monomials(j, 1) - 2); + pow_int(v, monomials(j, 1) - 3) * monomials(j, 1) * + (monomials(j, 1) - 1) * (monomials(j, 1) - 2); } third[i][0][1][0] = third[i][0][0][1]; third[i][1][0][0] = third[i][0][0][1]; @@ -362,7 +367,8 @@ void polynomialBasis::dddf(double u, double v, double w, double third[][3][3][3] for(int j = 0; j < coefficients.size2(); j++){ if (monomials(j, 0) > 2) // second derivative !=0 third[i][0][0][0] += coefficients(i, j) * - pow_int(u, (monomials(j, 0) - 3)) *monomials(j, 0) * (monomials(j, 0) - 1)*(monomials(j, 0) - 2) * + pow_int(u, (monomials(j, 0) - 3)) *monomials(j, 0) * + (monomials(j, 0) - 1) * (monomials(j, 0) - 2) * pow_int(v, monomials(j, 1))* pow_int(w, monomials(j, 2)); @@ -398,7 +404,8 @@ void polynomialBasis::dddf(double u, double v, double w, double third[][3][3][3] if ((monomials(j, 1) > 2)) third[i][1][1][1] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * - pow_int(v, monomials(j, 1)-3) * monomials(j, 1) * (monomials(j, 1) - 1)*(monomials(j, 1) - 2)* + pow_int(v, monomials(j, 1)-3) * monomials(j, 1) * + (monomials(j, 1) - 1) * (monomials(j, 1) - 2)* pow_int(w, monomials(j, 2)); if ((monomials(j, 1) > 1) && (monomials(j, 2) > 0)) @@ -417,9 +424,8 @@ void polynomialBasis::dddf(double u, double v, double w, double third[][3][3][3] third[i][2][2][2] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * pow_int(v, monomials(j, 1))* - pow_int(w, monomials(j, 2) - 3) * monomials(j, 2) * (monomials(j, 2) - 1)*(monomials(j, 2) - 2); - - + pow_int(w, monomials(j, 2) - 3) * monomials(j, 2) * + (monomials(j, 2) - 1) * (monomials(j, 2) - 2); } third[i][0][1][0] = third[i][0][0][1]; third[i][1][0][0] = third[i][0][0][1]; diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp index b9ca0aaae0..9edc393daf 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp @@ -59,8 +59,11 @@ double distMaxStraight(MElement *el) } for (int i = nV1; i < nV; ++i) { double f[256]; - lagrange1->f(lagrange->points(i, 0), lagrange->points(i, 1), - lagrange->points(i, 2), f); + double u = 0., v = 0., w = 0.; + if(lagrange->points.size2() > 0) u = lagrange->points(i, 0); + if(lagrange->points.size2() > 1) v = lagrange->points(i, 1); + if(lagrange->points.size2() > 2) w = lagrange->points(i, 2); + lagrange1->f(u, v, w, f); for (int j = 0; j < nV1; ++j) sxyz[i] += sxyz[j] * f[j]; } @@ -164,7 +167,7 @@ static std::set<MElement*> getSurroundingBlob { const SPoint3 p = el->barycenter_infty(); - const double limDist = distMaxStraight(el)*distFactor; + const double limDist = distMaxStraight(el) * distFactor; std::set<MElement*> blob; std::list<MElement*> currentLayer, lastLayer; @@ -378,7 +381,7 @@ static std::set<MElement*> getSurroundingBlob3D const std::map<MVertex*, std::vector<MElement*> > &vertex2elements, const double distFactor) { - const double limDist = distMaxStraight(el)*distFactor; + const double limDist = distMaxStraight(el) * distFactor; std::set<MElement*> blob; std::list<MElement*> currentLayer, lastLayer; -- GitLab