From bc6a7ec1db258174c3bb3ce9139412d521b3e0da Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Thu, 3 May 2012 15:02:11 +0000 Subject: [PATCH] fix build without mesh module --- Geo/MElement.cpp | 24 ++++++++ Geo/MTriangle.cpp | 3 +- Mesh/qualityMeasures.cpp | 117 +++++++++++++++------------------------ 3 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index f0af7c17b8..1c5d750800 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -106,6 +106,30 @@ double MElement::rhoShapeMeasure() return 0.; } +void MElement::scaledJacRange(double &jmin, double &jmax) +{ + jmin = jmax = 1.0; +#if defined(HAVE_MESH) + extern double mesh_functional_distorsion(MElement*,double,double); + if (getPolynomialOrder() == 1) return; + const bezierBasis *jac = getJacobianFuncSpace()->bezier; + fullVector<double>Ji(jac->points.size1()); + for (int i=0;i<jac->points.size1();i++){ + double u = jac->points(i,0); + double v = jac->points(i,1); + if (getType() == TYPE_QUA){ + u = -1 + 2*u; + v = -1 + 2*v; + } + Ji(i) = mesh_functional_distorsion(this,u,v); + } + fullVector<double> Bi( jac->matrixLag2Bez.size1() ); + jac->matrixLag2Bez.mult(Ji,Bi); + jmin = *std::min_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); + jmax = *std::max_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); +#endif +} + void MElement::getNode(int num, double &u, double &v, double &w) { // only for MElements that don't have a lookup table for this diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp index 98f977d4f1..dd73931ffb 100644 --- a/Geo/MTriangle.cpp +++ b/Geo/MTriangle.cpp @@ -39,7 +39,6 @@ double MTriangle::getVolume() double MTriangle::distoShapeMeasure() { #if defined(HAVE_MESH) - //return qmTriangleAngles(this); return qmDistorsionOfMapping(this); #else return 0.; @@ -115,7 +114,7 @@ double MTriangle::gammaShapeMeasure() { uvw[0] = (d[0] * d2[1] - d[1] * d2[0]) / Jxy; uvw[1] = (d[1] * d1[0] - d[0] * d1[1]) / Jxy; - } + } else if (fabs(Jxz) > fabs(Jyz)) { uvw[0] = (d[0] * d2[2] - d[2] * d2[0]) / Jxz; diff --git a/Mesh/qualityMeasures.cpp b/Mesh/qualityMeasures.cpp index d55777041c..4a16e477f1 100644 --- a/Mesh/qualityMeasures.cpp +++ b/Mesh/qualityMeasures.cpp @@ -15,7 +15,7 @@ #include <limits> #include <string.h> -double qmTriangle(const BDS_Point *p1, const BDS_Point *p2, const BDS_Point *p3, +double qmTriangle(const BDS_Point *p1, const BDS_Point *p2, const BDS_Point *p3, const qualityMeasure4Triangle &cr) { return qmTriangle(p1->X, p1->Y, p1->Z, p2->X, p2->Y, p2->Z, p3->X, p3->Y, p3->Z, cr); @@ -33,7 +33,7 @@ double qmTriangle(MTriangle*t, const qualityMeasure4Triangle &cr) return qmTriangle(t->getVertex(0), t->getVertex(1), t->getVertex(2), cr); } -double qmTriangle(const MVertex *v1, const MVertex *v2, const MVertex *v3, +double qmTriangle(const MVertex *v1, const MVertex *v2, const MVertex *v3, const qualityMeasure4Triangle &cr) { return qmTriangle(v1->x(), v1->y(), v1->z(), v2->x(), v2->y(), v2->z(), @@ -43,9 +43,9 @@ double qmTriangle(const MVertex *v1, const MVertex *v2, const MVertex *v3, // Triangle abc // quality is between 0 and 1 -double qmTriangle(const double &xa, const double &ya, const double &za, - const double &xb, const double &yb, const double &zb, - const double &xc, const double &yc, const double &zc, +double qmTriangle(const double &xa, const double &ya, const double &za, + const double &xb, const double &yb, const double &zb, + const double &xc, const double &yc, const double &zc, const qualityMeasure4Triangle &cr) { double quality; @@ -59,10 +59,10 @@ double qmTriangle(const double &xa, const double &ya, const double &za, norme(a); norme(b); norme(c); - double pva [3]; prodve(b, c, pva); const double sina = norm3(pva); + double pva [3]; prodve(b, c, pva); const double sina = norm3(pva); double pvb [3]; prodve(c, a, pvb); const double sinb = norm3(pvb); double pvc [3]; prodve(a, b, pvc); const double sinc = norm3(pvc); - + if (sina == 0.0 && sinb == 0.0 && sinc == 0.0) quality = 0.0; else quality = 2 * (2 * sina * sinb * sinc / (sina + sinb + sinc)); } @@ -84,7 +84,7 @@ double qmTriangle(const double &xa, const double &ya, const double &za, default: Msg::Error("Unknown quality measure"); return 0.; - } + } return quality; } @@ -98,14 +98,14 @@ double qmTet(MTetrahedron *t, const qualityMeasure4Tet &cr, double *volume) double qmTet(const MVertex *v1, const MVertex *v2, const MVertex *v3, const MVertex *v4, const qualityMeasure4Tet &cr, double *volume) { - return qmTet(v1->x(), v1->y(), v1->z(), v2->x(), v2->y(), v2->z(), + return qmTet(v1->x(), v1->y(), v1->z(), v2->x(), v2->y(), v2->z(), v3->x(), v3->y(), v3->z(), v4->x(), v4->y(), v4->z(), cr, volume); } -double qmTet(const double &x1, const double &y1, const double &z1, - const double &x2, const double &y2, const double &z2, - const double &x3, const double &y3, const double &z3, - const double &x4, const double &y4, const double &z4, +double qmTet(const double &x1, const double &y1, const double &z1, + const double &x2, const double &y2, const double &z2, + const double &x3, const double &y3, const double &z3, + const double &x4, const double &y4, const double &z4, const qualityMeasure4Tet &cr, double *volume) { switch(cr){ @@ -124,7 +124,7 @@ double qmTet(const double &x1, const double &y1, const double &z1, mat[2][1] = z3 - z1; mat[2][2] = z4 - z1; *volume = fabs(det3x3(mat)) / 6.; - double l = ((x2 - x1) * (x2 - x1) + + double l = ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)); l += ((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1) + (z3 - z1) * (z3 - z1)); @@ -157,19 +157,19 @@ double qmTet(const double &x1, const double &y1, const double &z1, double s4 = fabs(triangle_area(p1, p2, p3)); double rhoin = 3. * fabs(*volume) / (s1 + s2 + s3 + s4); double l = sqrt((x2 - x1) * (x2 - x1) + - (y2 - y1) * (y2 - y1) + + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)); - l = std::max(l, sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1) + + l = std::max(l, sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1) + (z3 - z1) * (z3 - z1))); - l = std::max(l, sqrt((x4 - x1) * (x4 - x1) + (y4 - y1) * (y4 - y1) + + l = std::max(l, sqrt((x4 - x1) * (x4 - x1) + (y4 - y1) * (y4 - y1) + (z4 - z1) * (z4 - z1))); - l = std::max(l, sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2) + + l = std::max(l, sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2) + (z3 - z2) * (z3 - z2))); l = std::max(l, sqrt((x4 - x2) * (x4 - x2) + (y4 - y2) * (y4 - y2) + (z4 - z2) * (z4 - z2))); l = std::max(l, sqrt((x3 - x4) * (x3 - x4) + (y3 - y4) * (y3 - y4) + (z3 - z4) * (z3 - z4))); - return 2. * sqrt(6.) * rhoin / l; + return 2. * sqrt(6.) * rhoin / l; } break; default: @@ -181,7 +181,7 @@ double qmTet(const double &x1, const double &y1, const double &z1, double mesh_functional_distorsion(MElement *t, double u, double v) { // compute uncurved element jacobian d_u x and d_v x - double mat[3][3]; + double mat[3][3]; t->getPrimaryJacobian(u, v, 0, mat); // t->getJacobian(u,v,0,mat); double v1[3] = {mat[0][0], mat[0][1], mat[0][2]}; @@ -189,27 +189,27 @@ double mesh_functional_distorsion(MElement *t, double u, double v) double normal1[3]; prodve(v1, v2, normal1); double nn = norm3(normal1); - + // compute uncurved element jacobian d_u x and d_v x - + t->getJacobian(u, v, 0, mat); double v1b[3] = {mat[0][0], mat[0][1], mat[0][2]}; double v2b[3] = {mat[1][0], mat[1][1], mat[1][2]}; double normal[3]; prodve(v1b, v2b, normal); - + // printf("%g %g %g -- %g %g %g - %g\n",mat[0][0], mat[0][1], mat[0][2],mat[1][0], mat[1][1], mat[1][2],nn); double sign = 1.0; prosca(normal1, normal, &sign); - // double det = (norm3(normal) / nn) * (sign > 0 ? 1. : -1.); + // double det = (norm3(normal) / nn) * (sign > 0 ? 1. : -1.); // printf("%g %g : %g : %g n1 (%g,%g,%g)\n",u,v,sign,det, normal1[0], normal1[1], normal1[2]); // for (int i=0;i<t->getNumVertices();i++){ // printf("COORD (%d) = %g %g %g\n",i,t->getVertex(i)->x(),t->getVertex(i)->y(),t->getVertex(i)->z()); // } // printf("n (%g,%g,%g)\n", normal1[0], normal1[1], normal1[2]); - + return sign/(nn*nn); } @@ -247,7 +247,7 @@ double mesh_functional_distorsion_p2_bezier_refined(MTriangle *t) J1,J6,J4,2*J16-0.5*(J1+J6),2*J14-0.5*(J1+J4),2*J46-0.5*(J6+J4), J3,J5,2*J36-0.5*(J3+J6),2*J35-0.5*(J3+J5),2*J56-0.5*(J5+J6), J2,2*J45-0.5*(J4+J5),2*J52-0.5*(J5+J2),2*J24-0.5*(J2+J4)}; - return *std::min_element(d,d+15); + return *std::min_element(d,d+15); } double mesh_functional_distorsion_p2_exact(MTriangle *t) @@ -283,7 +283,7 @@ double mesh_functional_distorsion_p2_exact(MTriangle *t) if (ximin> 0 && etamin > 0 && 1-ximin-etamin>0){ const double m4 = a+b*ximin+c*etamin+d*ximin*etamin+ - e*ximin*ximin + f*etamin*etamin; + e*ximin*ximin + f*etamin*etamin; /* if (m4 < min_interm && (m4 < .9 || m4 > 1.1)){ printf("m4 = %g xi = %g eta = %g min_interm = %g min_edges = %g %g %g\n",m4,ximin,etamin,min_interm, MINQ (e,b,a), MINQ (f,c,a), MINQ (-d+e+f,b-c+d-2*f,a+c+f)); @@ -317,39 +317,14 @@ double mesh_functional_distorsion_pN(MElement *t) v = -1 + 2*v; } - Ji(i) = mesh_functional_distorsion(t,u,v); + Ji(i) = mesh_functional_distorsion(t,u,v); } - - fullVector<double> Bi( jac->matrixLag2Bez.size1() ); - jac->matrixLag2Bez.mult(Ji,Bi); - return *std::min_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); -} - -void MElement::scaledJacRange(double &jmin, double &jmax) -{ - jmin = jmax = 1.0; - if (getPolynomialOrder() == 1) return; - const bezierBasis *jac = getJacobianFuncSpace()->bezier; - fullVector<double>Ji(jac->points.size1()); - for (int i=0;i<jac->points.size1();i++){ - double u = jac->points(i,0); - double v = jac->points(i,1); - if (getType() == TYPE_QUA){ - u = -1 + 2*u; - v = -1 + 2*v; - } - - Ji(i) = mesh_functional_distorsion(this,u,v); - } - fullVector<double> Bi( jac->matrixLag2Bez.size1() ); - jac->matrixLag2Bez.mult(Ji,Bi); - jmin = *std::min_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); - jmax = *std::max_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); + jac->matrixLag2Bez.mult(Ji,Bi); + return *std::min_element(Bi.getDataPtr(),Bi.getDataPtr()+Bi.size()); } - double qmDistorsionOfMapping (MTriangle *e) { // return 1.0; @@ -404,13 +379,13 @@ double qmDistorsionOfMapping (MQuadrangle *e) static double mesh_functional_distorsion(MTetrahedron *t, double u, double v, double w) { // compute uncurved element jacobian d_u x and d_v x - double mat[3][3]; - t->getPrimaryJacobian(u, v, w, mat); + double mat[3][3]; + t->getPrimaryJacobian(u, v, w, mat); const double det1 = det3x3(mat); t->getJacobian(u, v, w, mat); const double detN = det3x3(mat); if (det1 == 0 || detN == 0) return 0; - double dist = det1 / detN; + double dist = det1 / detN; return dist; } @@ -422,12 +397,12 @@ double qmDistorsionOfMapping(MTetrahedron *t) const double u = jac->points(i,0); const double v = jac->points(i,1); const double w = jac->points(i,2); - Ji(i) = mesh_functional_distorsion(t,u,v,w); + Ji(i) = mesh_functional_distorsion(t,u,v,w); } - + fullVector<double> Bi( jac->matrixLag2Bez.size1() ); jac->matrixLag2Bez.mult(Ji,Bi); - /* + /* jac->matrixLag2Bez.print("Lag2Bez"); jac->points.print("Points"); @@ -447,7 +422,7 @@ double qmTriangleAngles (MTriangle *e) { double den = atan(a*(M_PI/9)) + atan(a*(M_PI/9)); // This matrix is used to "rotate" the triangle to get each vertex - // as the "origin" of the mapping in turn + // as the "origin" of the mapping in turn double rot[3][3]; rot[0][0]=-1; rot[0][1]=1; rot[0][2]=0; rot[1][0]=-1; rot[1][1]=0; rot[1][2]=0; @@ -463,7 +438,7 @@ double qmTriangleAngles (MTriangle *e) { e->getPrimaryJacobian(u,v,w,mat2); for (int j = 0; j < i; j++) { matmat(rot,mat,tmp); - memcpy(mat, tmp, sizeof(mat)); + memcpy(mat, tmp, sizeof(mat)); } //get angle double v1[3] = {mat[0][0], mat[0][1], mat[0][2] }; @@ -477,7 +452,7 @@ double qmTriangleAngles (MTriangle *e) { double v12[3], v34[3]; prodve(v1,v2,v12); prodve(v3,v4,v34); - norme(v12); + norme(v12); norme(v34); double orientation; prosca(v12,v34,&orientation); @@ -492,15 +467,15 @@ double qmTriangleAngles (MTriangle *e) { double angle = (x+M_PI/3)/M_PI*180; double quality = (atan(a*(x+M_PI/9)) + atan(a*(M_PI/9-x)))/den; worst_quality = std::min(worst_quality, quality); - + // minAngle = std::min(angle, minAngle); // printf("Angle %g ", angle); // printf("Quality %g\n",quality); } // printf("MinAngle %g ", minAngle); // printf("\n"); - // return minAngle; - + // return minAngle; + return worst_quality; } @@ -513,13 +488,13 @@ double qmQuadrangleAngles (MQuadrangle *e) { double den = atan(a*(M_PI/4)) + atan(a*(2*M_PI/4 - (M_PI/4))); // This matrix is used to "rotate" the triangle to get each vertex - // as the "origin" of the mapping in turn + // as the "origin" of the mapping in turn double rot[3][3]; rot[0][0]=-1; rot[0][1]=1; rot[0][2]=0; rot[1][0]=-1; rot[1][1]=0; rot[1][2]=0; rot[2][0]= 0; rot[2][1]=0; rot[2][2]=1; //double tmp[3][3]; - + const double u[9] = {-1,-1, 1, 1, 0,0,1,-1,0}; const double v[9] = {-1, 1, 1,-1, -1,1,0,0,0}; @@ -529,7 +504,7 @@ double qmQuadrangleAngles (MQuadrangle *e) { e->getPrimaryJacobian(u[i],v[i],0,mat2); //for (int j = 0; j < i; j++) { // matmat(rot,mat,tmp); - // memcpy(mat, tmp, sizeof(mat)); + // memcpy(mat, tmp, sizeof(mat)); //} //get angle @@ -544,7 +519,7 @@ double qmQuadrangleAngles (MQuadrangle *e) { double v12[3], v34[3]; prodve(v1,v2,v12); prodve(v3,v4,v34); - norme(v12); + norme(v12); norme(v34); double orientation; prosca(v12,v34,&orientation); -- GitLab