diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp index a055b7b345d1269371c1a7948aca363522a2b6dd..6a639cde7068a731d86ea33d4bf93a42cd0ca420 100644 --- a/Geo/discreteDiskFace.cpp +++ b/Geo/discreteDiskFace.cpp @@ -30,13 +30,11 @@ static void discreteDiskFaceBB(void *a, double*mmin, double*mmax) { // called once by buildOct() discreteDiskFaceTriangle *t = (discreteDiskFaceTriangle *)a; - mmin[0] = std::min(std::min(t->p[0].x(), t->p[1].x()), t->p[2].x()); mmin[1] = std::min(std::min(t->p[0].y(), t->p[1].y()), t->p[2].y()); mmax[0] = std::max(std::max(t->p[0].x(), t->p[1].x()), t->p[2].x()); mmax[1] = std::max(std::max(t->p[0].y(), t->p[1].y()), t->p[2].y()); - if (t->tri->getPolynomialOrder() == 2){ for (int i=3; i<6; i++){ @@ -84,12 +82,18 @@ static int discreteDiskFaceInEle(void *a, double*c)// # mark sys2x2(M, R, X); } else{ - - double uv[3] = {c[0],c[1],0.}; - double Xi[3]; - t->tri->xyz2uvw(uv,Xi); - X[0] = Xi[0]; - X[1] = Xi[1]; + + std::vector<MVertex*> vs; + for (int ivs=0; ivs<t->tri->getNumVertices(); ivs++){ + MVertex v (t->p[ivs].x(),t->p[ivs].y(),0); + vs.push_back(&v); + } + + MTriangle6 t6 (vs); + double xyz[3] = {c[0],c[1],0}; + + t6.xyz2uvw(xyz,X); + } if(X[0] > -eps && X[1] > -eps && 1. - X[0] - X[1] > -eps) @@ -230,7 +234,7 @@ void discreteDiskFace::getBoundingEdges() std::map<MElement*,std::vector<MElement*> > neighbors; for (unsigned int i=0; i<discrete_triangles.size(); ++i){ MElement* e = discrete_triangles[i]; - for(int j=0; j<e->getNumEdges(); j++){ // #fixme: efficiency could be improved by setting neighbors mutually + for(int j=0; j<e->getNumEdges(); j++){ // #improveme: efficiency could be improved by setting neighbors mutually std::vector<MElement*> my_mt = ed2tri[e->getEdge(j)]; if (my_mt.size() > 1){// my_mt.size() = {1;2} MElement* neighTri = my_mt[0] == e ? my_mt[1] : my_mt[0]; @@ -345,8 +349,6 @@ void discreteDiskFace::getBoundingEdges() for(unsigned int i=0; i<=myV.size()-1; i++){ MVertex* current = myV[i]; - - std::cout << "(" << current->x() << ";" << current->y() << ")" << std::endl; loop.push_back(current); @@ -382,9 +384,13 @@ void discreteDiskFace::buildOct() const for(unsigned int i = 0; i < discrete_triangles.size(); ++i){ MTriangle *t = discrete_triangles[i]; discreteDiskFaceTriangle* my_ddft = &_ddft[i]; - for(int io=0; io<_N; io++)my_ddft->p[io] = coordinates[t->getVertex(io)]; + + for(int io=0; io<_N; io++) + my_ddft->p[io] = coordinates[t->getVertex(io)]; + my_ddft->gf = _parent; my_ddft->tri = t; + Octree_Insert(my_ddft, oct); } Octree_Arrange(oct); @@ -404,9 +410,7 @@ bool discreteDiskFace::parametrize() const dofManager<double> myAssemblerU(lsys_u); // hashing dofManager<double> myAssemblerV(lsys_v); - - // FIXME problem here : boundary conditions are wrong for 2nd order nodes - + for(size_t i = 0; i < _U0.size(); i++){ MVertex *v = _U0[i]; const double theta = 2 * M_PI * _coords[i]; @@ -458,7 +462,7 @@ bool discreteDiskFace::parametrize() const p[1] = value_V; coordinates[v] = p; } - else{ // #useful ? + else{ itf->second[0]= value_U; itf->second[1]= value_V; } @@ -513,6 +517,7 @@ void discreteDiskFace::getTriangleUV(const double u,const double v, t.xyz2uvw(xyz,uv); _u = uv[0];// xi _v = uv[1];// eta + } } @@ -636,11 +641,12 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const double df[_N][3]; mynodalbasis->df(U,V,0.,df); - double dxdxi[3][2] = {{0,0},{0,0},{0,0}}; + double dxdxi[3][2] = {{0.,0.},{0.,0.},{0.,0.}}; - double dudxi[2][2] = {{0,0},{0,0}}; + double dudxi[2][2] = {{0.,0.},{0.,0.}}; for (int io=0; io<_N; io++){ + double X = tri->getVertex(io)->x(); double Y = tri->getVertex(io)->y(); double Z = tri->getVertex(io)->z(); @@ -662,8 +668,8 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const dudxi[1][0] += V*df[io][0]; dudxi[1][1] += V*df[io][1]; - } - + + } double dxidu[2][2]; inv2x2(dudxi,dxidu); @@ -672,7 +678,7 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const for (int i=0;i<3;i++){ for (int j=0;j<2;j++){ - dxdu[i][j]=0.0; + dxdu[i][j]=0.; for (int k=0;k<2;k++){ dxdu[i][j] += dxdxi[i][k]*dxidu[k][j]; } diff --git a/Geo/discreteDiskFace.h b/Geo/discreteDiskFace.h index 1954890663b5ff8745b0f5f83b1a0de943af230d..499dcf875c3b77360ab56a7d08bde15db771e8a0 100644 --- a/Geo/discreteDiskFace.h +++ b/Geo/discreteDiskFace.h @@ -30,8 +30,8 @@ class GRbf; class discreteDiskFaceTriangle { public: - SPoint3 p[6]; // vertices in (u;v) - SPoint2 gfp[6]; // CAD model + SPoint3 p[6]; // vertices in (u;v) #improveme std::vector instead + //SPoint2 gfp[6]; // CAD model GFace *gf; // GFace tag MTriangle *tri; // mesh triangle in (x;y;z) discreteDiskFaceTriangle() : gf(0), tri(0) {}