Skip to content
Snippets Groups Projects
Commit 6f44e092 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

pp

parent 36ccac01
No related branches found
No related tags found
No related merge requests found
...@@ -252,7 +252,8 @@ void gLevelset::getPrimitives(std::vector<gLevelset *> &gLsPrimitives) ...@@ -252,7 +252,8 @@ void gLevelset::getPrimitives(std::vector<gLevelset *> &gLsPrimitives)
} }
} }
// extrude a list of the primitive levelsets with a "post-order traversal sequence" // extrude a list of the primitive levelsets with a "post-order traversal
// sequence"
void gLevelset::getPrimitivesPO(std::vector<gLevelset *> &gLsPrimitives) void gLevelset::getPrimitivesPO(std::vector<gLevelset *> &gLsPrimitives)
{ {
std::stack<gLevelset *> S; std::stack<gLevelset *> S;
...@@ -372,6 +373,7 @@ gLevelsetPlane::gLevelsetPlane(const double * pt, const double *norm, int tag) ...@@ -372,6 +373,7 @@ gLevelsetPlane::gLevelsetPlane(const double * pt, const double *norm, int tag)
c = norm[2]; c = norm[2];
d = -a * pt[0] - b * pt[1] - c * pt[2]; d = -a * pt[0] - b * pt[1] - c * pt[2];
} }
gLevelsetPlane::gLevelsetPlane(const double * pt1, const double *pt2, gLevelsetPlane::gLevelsetPlane(const double * pt1, const double *pt2,
const double *pt3, int tag) const double *pt3, int tag)
: gLevelsetPrimitive(tag) : gLevelsetPrimitive(tag)
...@@ -391,7 +393,7 @@ gLevelsetPlane::gLevelsetPlane(const gLevelsetPlane &lv) ...@@ -391,7 +393,7 @@ gLevelsetPlane::gLevelsetPlane(const gLevelsetPlane &lv)
d = lv.d; d = lv.d;
} }
//level set defined by points (RBF interpolation) // level set defined by points (RBF interpolation)
fullMatrix<double> gLevelsetPoints::generateRbfMat(int p, int index, fullMatrix<double> gLevelsetPoints::generateRbfMat(int p, int index,
const fullMatrix<double> &nodes1, const fullMatrix<double> &nodes1,
const fullMatrix<double> &nodes2) const const fullMatrix<double> &nodes2) const
...@@ -420,15 +422,11 @@ void gLevelsetPoints::RbfOp(int p, int index, ...@@ -420,15 +422,11 @@ void gLevelsetPoints::RbfOp(int p, int index,
bool isLocal) const bool isLocal) const
{ {
fullMatrix<double> rbfMatB = generateRbfMat(p,index, cntrs,nodes); fullMatrix<double> rbfMatB = generateRbfMat(p,index, cntrs,nodes);
//printf("size=%d %d \n", rbfMatB.size1(), rbfMatB.size2());
//rbfMatB.print("MatB");
fullMatrix<double> rbfInvA; fullMatrix<double> rbfInvA;
if (isLocal){ if (isLocal){
rbfInvA = generateRbfMat(0,index, cntrs,cntrs); rbfInvA = generateRbfMat(0,index, cntrs,cntrs);
rbfInvA.invertInPlace(); rbfInvA.invertInPlace();
//printf("size=%d %d \n", rbfInvA.size1(), rbfInvA.size2());
//rbfInvA.print("invA");
} }
else { else {
rbfInvA = matAInv; rbfInvA = matAInv;
...@@ -436,7 +434,6 @@ void gLevelsetPoints::RbfOp(int p, int index, ...@@ -436,7 +434,6 @@ void gLevelsetPoints::RbfOp(int p, int index,
D.resize(nodes.size1(), cntrs.size1()); D.resize(nodes.size1(), cntrs.size1());
D.gemm(rbfMatB, rbfInvA, 1.0, 0.0); D.gemm(rbfMatB, rbfInvA, 1.0, 0.0);
} }
void gLevelsetPoints::evalRbfDer(int p, int index, void gLevelsetPoints::evalRbfDer(int p, int index,
...@@ -448,7 +445,6 @@ void gLevelsetPoints::evalRbfDer(int p, int index, ...@@ -448,7 +445,6 @@ void gLevelsetPoints::evalRbfDer(int p, int index,
fApprox.resize(nodes.size1(),fValues.size2()); fApprox.resize(nodes.size1(),fValues.size2());
fullMatrix<double> D; fullMatrix<double> D;
RbfOp(p,index, cntrs,nodes,D,isLocal); RbfOp(p,index, cntrs,nodes,D,isLocal);
//D.print("D");
fApprox.gemm(D,fValues, 1.0, 0.0); fApprox.gemm(D,fValues, 1.0, 0.0);
} }
...@@ -464,7 +460,7 @@ void gLevelsetPoints::setup_level_set(const fullMatrix<double> &cntrs, ...@@ -464,7 +460,7 @@ void gLevelsetPoints::setup_level_set(const fullMatrix<double> &cntrs,
fullMatrix<double> ONES(numNodes+1,1),sx(numNodes,1),sy(numNodes,1); fullMatrix<double> ONES(numNodes+1,1),sx(numNodes,1),sy(numNodes,1);
fullMatrix<double> sz(numNodes,1),norms(numNodes,3), cntrsPlus(numNodes+1,3); fullMatrix<double> sz(numNodes,1),norms(numNodes,3), cntrsPlus(numNodes+1,3);
//Computes the normal vectors to the surface at each node // Computes the normal vectors to the surface at each node
double dist_min = 1.e6; double dist_min = 1.e6;
double dist_max = 1.e-6; double dist_max = 1.e-6;
for (int i = 0; i < numNodes; ++i){ for (int i = 0; i < numNodes; ++i){
...@@ -517,13 +513,11 @@ gLevelsetPoints::gLevelsetPoints(fullMatrix<double> &centers, int tag) ...@@ -517,13 +513,11 @@ gLevelsetPoints::gLevelsetPoints(fullMatrix<double> &centers, int tag)
setup_level_set(centers, points, surf); setup_level_set(centers, points, surf);
printNodes(points, surf); printNodes(points, surf);
//build invA matrix for 3*n points // build invA matrix for 3*n points
int indexRBF = 1; int indexRBF = 1;
matAInv.resize(nbNodes, nbNodes); matAInv.resize(nbNodes, nbNodes);
matAInv = generateRbfMat(0, indexRBF, points,points); matAInv = generateRbfMat(0, indexRBF, points,points);
matAInv.invertInPlace(); matAInv.invertInPlace();
//printf("End init levelset points %d \n", points.size1());
} }
gLevelsetPoints::gLevelsetPoints(const gLevelsetPoints &lv) gLevelsetPoints::gLevelsetPoints(const gLevelsetPoints &lv)
...@@ -534,12 +528,12 @@ gLevelsetPoints::gLevelsetPoints(const gLevelsetPoints &lv) ...@@ -534,12 +528,12 @@ gLevelsetPoints::gLevelsetPoints(const gLevelsetPoints &lv)
double gLevelsetPoints::operator()(double x, double y, double z) const double gLevelsetPoints::operator()(double x, double y, double z) const
{ {
if(mapP.empty()) printf("Levelset Points : call computeLS() before calling operator()\n"); if(mapP.empty())
Msg::Info("Levelset Points: call computeLS() before calling operator()");
SPoint3 sp(x,y,z); SPoint3 sp(x,y,z);
std::map<SPoint3,double>::const_iterator it = mapP.find(sp); std::map<SPoint3,double>::const_iterator it = mapP.find(sp);
if(it != mapP.end()) if(it != mapP.end()) return it->second;
return it->second;
printf("Levelset Points : Point not found\n"); printf("Levelset Points : Point not found\n");
return 0; return 0;
...@@ -619,7 +613,8 @@ void gLevelsetQuadric::translate(const double transl[3]) ...@@ -619,7 +613,8 @@ void gLevelsetQuadric::translate(const double transl[3])
void gLevelsetQuadric::rotate(const double rotate[3][3]) void gLevelsetQuadric::rotate(const double rotate[3][3])
{ {
double a11 = 0., a12 = 0., a13 = 0., a22 = 0., a23 = 0., a33 = 0., b1 = 0., b2 = 0., b3 = 0.; double a11 = 0., a12 = 0., a13 = 0., a22 = 0., a23 = 0., a33 = 0.;
double b1 = 0., b2 = 0., b3 = 0.;
for(int i = 0; i < 3; i++){ for(int i = 0; i < 3; i++){
b1 += B[i] * rotate[i][0]; b1 += B[i] * rotate[i][0];
b2 += B[i] * rotate[i][1]; b2 += B[i] * rotate[i][1];
...@@ -709,13 +704,15 @@ void gLevelsetQuadric::init() ...@@ -709,13 +704,15 @@ void gLevelsetQuadric::init()
double gLevelsetQuadric::operator()(double x, double y, double z) const double gLevelsetQuadric::operator()(double x, double y, double z) const
{ {
return(A[0][0] * x * x + 2. * A[0][1] * x * y + 2. * A[0][2] * x * z + A[1][1] * y * y return(A[0][0] * x * x + 2. * A[0][1] * x * y + 2. * A[0][2] * x * z +
+ 2. * A[1][2] * y * z + A[2][2] * z * z + B[0] * x + B[1] * y + B[2] * z + C); A[1][1] * y * y + 2. * A[1][2] * y * z + A[2][2] * z * z +
B[0] * x + B[1] * y + B[2] * z + C);
} }
gLevelsetShamrock::gLevelsetShamrock(double _xmid, double _ymid, double _zmid, gLevelsetShamrock::gLevelsetShamrock(double _xmid, double _ymid, double _zmid,
double _a, double _b, int _c, int tag) double _a, double _b, int _c, int tag)
: gLevelsetPrimitive(tag), xmid(_xmid), ymid(_ymid), zmid(_zmid), a(_a), b(_b), c(_c) : gLevelsetPrimitive(tag), xmid(_xmid), ymid(_ymid), zmid(_zmid),
a(_a), b(_b), c(_c)
{ {
// creating the iso-zero // creating the iso-zero
double angle = 0.; double angle = 0.;
...@@ -829,7 +826,8 @@ double gLevelsetMathEval::operator() (double x, double y, double z) const ...@@ -829,7 +826,8 @@ double gLevelsetMathEval::operator() (double x, double y, double z) const
return 1.; return 1.;
} }
gLevelsetMathEvalAll::gLevelsetMathEvalAll(std::vector<std::string> expressions, int tag) gLevelsetMathEvalAll::gLevelsetMathEvalAll(std::vector<std::string> expressions,
int tag)
: gLevelsetPrimitive(tag) : gLevelsetPrimitive(tag)
{ {
_hasDerivatives = true; _hasDerivatives = true;
...@@ -849,6 +847,7 @@ double gLevelsetMathEvalAll::operator() (double x, double y, double z) const ...@@ -849,6 +847,7 @@ double gLevelsetMathEvalAll::operator() (double x, double y, double z) const
if(_expr->eval(values, res)) return res[0]; if(_expr->eval(values, res)) return res[0];
return 1.; return 1.;
} }
void gLevelsetMathEvalAll::gradient(double x, double y, double z, void gLevelsetMathEvalAll::gradient(double x, double y, double z,
double & dfdx, double & dfdy, double & dfdz) const double & dfdx, double & dfdy, double & dfdz) const
{ {
...@@ -886,7 +885,8 @@ void gLevelsetMathEvalAll::hessian(double x, double y, double z, ...@@ -886,7 +885,8 @@ void gLevelsetMathEvalAll::hessian(double x, double y, double z,
} }
#if defined(HAVE_ANN) #if defined(HAVE_ANN)
gLevelsetDistMesh::gLevelsetDistMesh(GModel *gm, std::string physical, int nbClose, int tag) gLevelsetDistMesh::gLevelsetDistMesh(GModel *gm, std::string physical, int nbClose,
int tag)
: gLevelsetPrimitive(tag), _gm(gm), _nbClose(nbClose) : gLevelsetPrimitive(tag), _gm(gm), _nbClose(nbClose)
{ {
std::map<int, std::vector<GEntity*> > groups [4]; std::map<int, std::vector<GEntity*> > groups [4];
...@@ -898,7 +898,8 @@ gLevelsetDistMesh::gLevelsetDistMesh(GModel *gm, std::string physical, int nbClo ...@@ -898,7 +898,8 @@ gLevelsetDistMesh::gLevelsetDistMesh(GModel *gm, std::string physical, int nbClo
} }
} }
if (_entities.size() == 0){ if (_entities.size() == 0){
Msg::Error("distanceToMesh: the physical name '%s' does not exist in the GModel", physical.c_str()); Msg::Error("distanceToMesh: the physical name '%s' does not exist in the GModel",
physical.c_str());
} }
//setup //setup
...@@ -1020,8 +1021,9 @@ gLevelsetGenCylinder::gLevelsetGenCylinder(const double *pt, const double *dir, ...@@ -1020,8 +1021,9 @@ gLevelsetGenCylinder::gLevelsetGenCylinder(const double *pt, const double *dir,
gLevelsetGenCylinder::gLevelsetGenCylinder (const gLevelsetGenCylinder& lv) gLevelsetGenCylinder::gLevelsetGenCylinder (const gLevelsetGenCylinder& lv)
: gLevelsetQuadric(lv){} : gLevelsetQuadric(lv){}
gLevelsetEllipsoid::gLevelsetEllipsoid(const double *pt, const double *dir, const double &a, gLevelsetEllipsoid::gLevelsetEllipsoid(const double *pt, const double *dir,
const double &b, const double &c, int tag) const double &a, const double &b,
const double &c, int tag)
: gLevelsetQuadric(tag) : gLevelsetQuadric(tag)
{ {
A[0][0] = 1. / (a * a); A[0][0] = 1. / (a * a);
...@@ -1037,8 +1039,9 @@ gLevelsetEllipsoid::gLevelsetEllipsoid(const double *pt, const double *dir, cons ...@@ -1037,8 +1039,9 @@ gLevelsetEllipsoid::gLevelsetEllipsoid(const double *pt, const double *dir, cons
gLevelsetEllipsoid::gLevelsetEllipsoid(const gLevelsetEllipsoid& lv) gLevelsetEllipsoid::gLevelsetEllipsoid(const gLevelsetEllipsoid& lv)
: gLevelsetQuadric(lv){} : gLevelsetQuadric(lv){}
gLevelsetCone::gLevelsetCone(const double *pt, const double *dir, const double &angle, gLevelsetCone::gLevelsetCone(const double *pt, const double *dir,
int tag) : gLevelsetQuadric(tag) const double &angle, int tag)
: gLevelsetQuadric(tag)
{ {
A[0][0] = 1.; A[0][0] = 1.;
A[1][1] = 1.; A[1][1] = 1.;
...@@ -1168,8 +1171,8 @@ gLevelsetCylinder::gLevelsetCylinder(const double *pt, const double *dir, ...@@ -1168,8 +1171,8 @@ gLevelsetCylinder::gLevelsetCylinder(const double *pt, const double *dir,
} }
gLevelsetCylinder::gLevelsetCylinder(const double * pt, const double *dir, gLevelsetCylinder::gLevelsetCylinder(const double * pt, const double *dir,
const double &R, const double &r, const double &H, const double &R, const double &r,
int tag) const double &H, int tag)
: gLevelsetImproved() : gLevelsetImproved()
{ {
double dir2[3] = {-dir[0], -dir[1], -dir[2]}; double dir2[3] = {-dir[0], -dir[1], -dir[2]};
...@@ -1232,8 +1235,8 @@ gLevelsetConrod::gLevelsetConrod(const double *pt, const double *dir1, ...@@ -1232,8 +1235,8 @@ gLevelsetConrod::gLevelsetConrod(const double *pt, const double *dir1,
gLevelsetConrod::gLevelsetConrod(const gLevelsetConrod &lv) gLevelsetConrod::gLevelsetConrod(const gLevelsetConrod &lv)
: gLevelsetImproved(lv){} : gLevelsetImproved(lv){}
// Level-set for NACA0012 airfoil, last coeff. modified for zero-thickness trailing edge // Level-set for NACA0012 airfoil, last coeff. modified for zero-thickness
// cf. http://en.wikipedia.org/wiki/NACA_airfoil // trailing edge cf. http://en.wikipedia.org/wiki/NACA_airfoil
gLevelsetNACA00::gLevelsetNACA00(double x0, double y0, double c, double t) gLevelsetNACA00::gLevelsetNACA00(double x0, double y0, double c, double t)
: _x0(x0), _y0(y0), _c(c), _t(t) : _x0(x0), _y0(y0), _c(c), _t(t)
{ {
...@@ -1241,23 +1244,27 @@ gLevelsetNACA00::gLevelsetNACA00(double x0, double y0, double c, double t) ...@@ -1241,23 +1244,27 @@ gLevelsetNACA00::gLevelsetNACA00(double x0, double y0, double c, double t)
} }
void gLevelsetNACA00::getClosestBndPoint(double x, double y, double z, void gLevelsetNACA00::getClosestBndPoint(double x, double y, double z,
double &xb, double &yb, double &curvRad, bool &in) const double &xb, double &yb, double &curvRad,
bool &in) const
{ {
static const int maxIter = 100; static const int maxIter = 100;
static const double tol = 1.e-8; static const double tol = 1.e-8;
const double tolr = tol/_c; // Tolerance (scaled bu chord) const double tolr = tol/_c; // Tolerance (scaled bu chord)
in = false; // Whether the point is inside the airfoil in = false; // Whether the point is inside the airfoil
const double xt = x-_x0, yt = fabs(y-_y0); // Point translated according to airfoil origin and symmetry // Point translated according to airfoil origin and symmetry
const double xt = x-_x0, yt = fabs(y-_y0);
if (xt-_c > 1.21125*_t*yt) { // Behind line normal to airfoil at trailing edge, closest if (xt-_c > 1.21125*_t*yt) {
xb = _x0+_c; // boundary point is trailing edge... // Behind line normal to airfoil at trailing edge, closest boundary point is
// trailing edge...
xb = _x0+_c;
yb = _y0; yb = _y0;
curvRad = 0.; curvRad = 0.;
} }
else { // ...otherwise Newton-Raphson to find closest boundary point else { // ...otherwise Newton-Raphson to find closest boundary point
const double fact = 5.*_t*_c; const double fact = 5.*_t*_c;
double xtb = std::max(xt,tolr), ytb; double xtb = std::max(xt,tolr), ytb;
double dyb, ddyb; double dyb, ddyb;
...@@ -1309,10 +1316,10 @@ void gLevelsetNACA00::gradient (double x, double y, double z, ...@@ -1309,10 +1316,10 @@ void gLevelsetNACA00::gradient (double x, double y, double z,
dfdz = 0.; dfdz = 0.;
} }
void gLevelsetNACA00::hessian (double x, double y, double z, void gLevelsetNACA00::hessian(double x, double y, double z,
double & dfdxx, double & dfdxy, double & dfdxz, double & dfdxx, double & dfdxy, double & dfdxz,
double & dfdyx, double & dfdyy, double & dfdyz, double & dfdyx, double & dfdyy, double & dfdyz,
double & dfdzx, double & dfdzy, double & dfdzz) const double & dfdzx, double & dfdzy, double & dfdzz) const
{ {
double xb, yb, curvRadb; double xb, yb, curvRadb;
bool in; bool in;
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment