2 // C++ : Gestion des cylindres croises
4 // Copyright (C) 2009-2013 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "HexCrossElements.hxx"
25 #include "HexDocument.hxx"
26 #include "HexVector.hxx"
27 #include "HexVertex.hxx"
28 #include "HexHexa.hxx"
29 #include "HexEdge.hxx"
31 #include "HexGlobale.hxx"
32 #include "HexCylinder.hxx"
33 #include "HexOldShape.hxx"
34 #include "HexNewShape.hxx"
38 static bool db = false;
40 static const double UnSur2pi = DEMI/M_PI;
44 // ====================================================== Constructeur
45 CrossElements::CrossElements (Document* doc, EnumGrid type)
53 angle_intermed = angle_inter [CylSmall] = angle_inter [CylBig] = 0;
54 at_right = at_left = true;
58 // ====================================================== resize
59 void CrossElements::resize ()
63 size_hz [CylSmall] = size_h1z;
64 size_hz [CylBig] = size_h2z;
66 size_vx = size_hx + 1;
68 size_vz[CylSmall] = size_v1z;
69 size_vz[CylBig] = size_v2z;
71 nbr_vertex1 = size_vx*size_vy* size_v1z;
72 nbr_quads1 = nbr_vertex1*DIM3;
73 nbr_edges1 = nbr_quads1;
74 nbr_hexas1 = size_hx * size_hy * size_h1z;
76 nbr_vertex = nbr_vertex1 + size_vx * size_vy * size_v1z;
77 nbr_quads = nbr_vertex*DIM3;
78 nbr_edges = nbr_quads;
79 nbr_hexas = nbr_hexas1 + size_hx * size_hy * size_h2z;
81 tab_hexa .resize (nbr_hexas*2);
82 tab_quad .resize (nbr_quads*2);
83 tab_edge .resize (nbr_edges*2);
84 tab_vertex.resize (nbr_vertex*2);
86 for (int nc=0 ; nc< nbr_hexas ; nc++) tab_hexa [nc] = NULL;
87 for (int nc=0 ; nc< nbr_quads ; nc++) tab_quad [nc] = NULL;
88 for (int nc=0 ; nc< nbr_edges ; nc++) tab_edge [nc] = NULL;
89 for (int nc=0 ; nc< nbr_vertex ; nc++) tab_vertex [nc] = NULL;
91 // ====================================================== indHexa
92 int CrossElements::indHexa (int cyl, int nx, int ny, int nz)
96 if ( nx < 0 || nx >= size_hx || ny < 0 || ny >= size_hy
97 || nz < 0 || nz >= size_hz[cyl]) return NOTHING;
99 int nro = cyl*nbr_hexas1 + nx + size_hx*ny + size_hx*size_hy*nz;
102 // ====================================================== indQuad
103 int CrossElements::indQuad (int cyl, int dd, int nx, int ny, int nz)
105 if (cyl<0 || cyl>1 || dd <0 || dd >= DIM3)
107 if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy
108 || nz < 0 || nz >= size_vz[cyl]) return NOTHING;
110 int nro = cyl*nbr_quads1 + nx + size_vx*ny + size_vx*size_vy*nz
111 + size_vx*size_vy*size_vz[cyl]*dd;
114 // ====================================================== indEdge
115 int CrossElements::indEdge (int cyl, int dd, int nx, int ny, int nz)
117 return indQuad (cyl, dd, nx, ny, nz);
119 // ====================================================== indVertex
120 int CrossElements::indVertex (int cyl, int nx, int ny, int nz)
124 if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy
125 || nz < 0 || nz >= size_vz[cyl])
128 int nro = cyl*nbr_vertex1 + nx + size_vx*ny + size_vx*size_vy*nz;
131 // ------------------------------------------------------------------------
132 // ====================================================== getHexaIJK
133 Hexa* CrossElements::getHexaIJK (int cyl, int nx, int ny, int nz)
135 int nro = indHexa (cyl, nx, ny, nz);
137 if (nro >= 0 && tab_hexa[nro]!= NULL && tab_hexa[nro]->isHere ())
138 return tab_hexa [nro];
142 // ====================================================== getQuadIJ
143 Quad* CrossElements::getQuadIJ (int cyl, int nx, int ny, int nz)
145 int nro = indQuad (cyl, dir_z, nx, ny, nz);
149 return tab_quad [nro];
151 // ====================================================== getQuadJK
152 Quad* CrossElements::getQuadJK (int cyl, int nx, int ny, int nz)
154 int nro = indQuad (cyl, dir_x, nx, ny, nz);
157 return tab_quad [nro];
159 // ====================================================== getQuadIK
160 Quad* CrossElements::getQuadIK (int cyl, int nx, int ny, int nz)
162 int nro = indQuad (cyl, dir_y, nx, ny, nz);
165 return tab_quad [nro];
167 // ====================================================== getEdgeI
168 Edge* CrossElements::getEdgeI (int cyl, int nx, int ny, int nz)
170 int nro = indEdge (cyl, dir_x, nx, ny, nz);
173 return tab_edge [nro];
175 // ====================================================== getEdgeJ
176 Edge* CrossElements::getEdgeJ (int cyl, int nx, int ny, int nz)
178 int nro = indEdge (cyl, dir_y, nx, ny, nz);
181 return tab_edge [nro];
183 // ====================================================== getEdgeK
184 Edge* CrossElements::getEdgeK (int cyl, int nx, int ny, int nz)
186 int nro = indEdge (cyl, dir_z, nx, ny, nz);
189 return tab_edge [nro];
191 // ====================================================== getVertexIJK
192 Vertex* CrossElements::getVertexIJK (int cyl, int nx, int ny, int nz)
194 int nro = indVertex (cyl, nx, ny, nz);
197 return tab_vertex [nro];
199 // ------------------------------------------------------------------------
200 // ====================================================== setHexa
201 void CrossElements::setHexa (Hexa* elt, int cyl, int nx, int ny, int nz)
205 printf ("tab_hexa [%d, %d,%d,%d] = ", cyl, nx, ny, nz);
210 int nro = indHexa (cyl, nx, ny, nz);
213 tab_hexa [nro] = elt;
215 // ====================================================== setQuad
216 void CrossElements::setQuad (Quad* elt, int cyl, int dd, int nx, int ny, int nz)
220 printf ("tab_quad [%d,%d, %d,%d,%d] = ", cyl, dd, nx, ny, nz);
225 int nro = indQuad (cyl, dd, nx, ny, nz);
228 tab_quad [nro] = elt;
230 // ====================================================== setEdge
231 void CrossElements::setEdge (Edge* elt, int cyl, int dd, int nx, int ny, int nz)
235 printf ("tab_edge [%d,%d, %d,%d,%d] = ", cyl, dd, nx, ny, nz);
240 int nro = indEdge (cyl, dd, nx, ny, nz);
243 tab_edge [nro] = elt;
245 // ====================================================== setVertex
246 void CrossElements::setVertex (Vertex* elt, int cyl, int nx, int ny, int nz)
250 printf ("tab_vertex [%d, %d,%d,%d] = ", cyl, nx, ny, nz);
255 int nro = indVertex (cyl, nx, ny, nz);
258 tab_vertex [nro] = elt;
260 // ====================================================== setVertex (2)
261 inline bool isequals (double v1, double v2)
263 const double eps = 0.01;
264 bool equals = v1 <= v2 + eps && v1 >= v2 - eps;
267 // ====================================================== setVertex (2)
268 void CrossElements::setVertex (int cyl, int nx, int ny, int nz, double px,
269 double py, double pz)
271 if (isequals (px, 0) && isequals (py, -1.5) && isequals (pz, 5))
272 printf (" Vertex trouve : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n",
273 cyl, nx,ny,nz, px,py,pz);
275 int nro = indVertex (cyl, nx, ny, nz);
278 else if (tab_vertex[nro] != NULL)
280 Vertex* node = tab_vertex[nro];
281 if (node->definedBy (px, py, pz))
284 printf (" ************ ATTENTION ****************\n");
285 printf (" Creation d'un vertex : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n",
286 cyl, nx,ny,nz, px,py,pz);
287 printf (" Indice %d deja occupe par le vertex (%g,%g,%g)\n", nro,
288 node->getX(), node->getY(), node->getZ());
293 int trouve = findVertex (px, py, pz);
296 printf (" Creation d'un vertex : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n",
297 cyl, nx,ny,nz, px,py,pz);
298 printf (" Vertex %d present a l'indice %d\n", nro, trouve);
299 tab_vertex [nro] = tab_vertex [trouve];
302 Vertex* node = el_root->addVertex (px, py, pz);
303 setVertex (node, cyl, nx, ny, nz);
305 // ====================================================== copyEdge
306 void CrossElements::copyEdge (int d1, int i1, int j1, int k1, int d2, int i2,
312 case dir_x : edge = getEdgeI (CylSmall, i1, j1, k1);
314 case dir_y : edge = getEdgeJ (CylSmall, i1, j1, k1);
316 case dir_z : edge = getEdgeK (CylSmall, i1, j1, k1);
320 setEdge (edge, CylBig, d2, i2, j2, k2);
322 // ====================================================== copyQuad
323 void CrossElements::copyQuad (int d1, int i1, int j1, int k1, int d2, int i2,
329 case dir_x : quad = getQuadJK (CylSmall, i1, j1, k1);
331 case dir_y : quad = getQuadIK (CylSmall, i1, j1, k1);
333 case dir_z : quad = getQuadIJ (CylSmall, i1, j1, k1);
337 setQuad (quad, CylBig, d2, i2, j2, k2);
339 // ====================================================== addEdge
340 Edge* CrossElements::addEdge (Vertex* v1, Vertex* v2, int cyl, int dir,
341 int nx, int ny, int nz)
344 if (v1==NULL || v2==NULL)
347 else if (cyl==CylBig)
349 edge = findEdge1 (v1, v2);
350 /* ************************************************
353 printf (" Edge (%d, %d,%d,%d) trouve = ", dir, nx, ny, nz);
354 edge->printName ("\n");
356 ************************************************ */
360 edge = newEdge (v1, v2);
362 setEdge (edge, cyl, dir, nx, ny, nz);
365 // ====================================================== addHexa
366 Hexa* CrossElements::addHexa (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5,
367 Quad* q6, int cyl, int nx, int ny, int nz)
369 /* **************************
372 if (nx == 0) return NULL;
373 if (nz != 1) return NULL;
374 if (ny != 4) return NULL;
380 if (nz > 2) return NULL;
381 if (nz < 1) return NULL;
382 // if (nx == 0) return NULL;
383 // if (ny != 4) return NULL;
385 ************************** */
389 hexa = findHexa1 (q1, q2);
392 hexa = newHexa (q1, q2, q3, q4, q5, q6);
395 printf (" Hexa (%d,%d,%d) trouve = ", nx, ny, nz);
396 hexa->printName ("\n");
399 setHexa (hexa, cyl, nx, ny, nz);
402 // ====================================================== addQuad
403 Quad* CrossElements::addQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4, int cyl,
404 int dir, int nx, int ny, int nz)
408 quad = findQuad1 (e1, e3);
411 quad = newQuad (e1, e2, e3, e4);
414 printf (" Quad (%d, %d,%d,%d) trouve = ", dir, nx, ny, nz);
415 quad->printName ("\n");
418 setQuad (quad, cyl, dir, nx, ny, nz);
421 // ====================================================== findEdge1
422 Edge* CrossElements::findEdge1 (Vertex* v1, Vertex* v2)
424 for (int nc=0; nc < nbr_edges1 ; nc++)
425 if (tab_edge[nc] != NULL && tab_edge[nc]->definedBy (v1, v2))
430 // ====================================================== findHexa1
431 Hexa* CrossElements::findHexa1 (Quad* e1, Quad* e2)
433 for (int nc=0; nc < nbr_hexas1 ; nc++)
434 if (tab_hexa[nc] != NULL && tab_hexa[nc]->definedBy (e1, e2))
439 // ====================================================== findQuad1
440 Quad* CrossElements::findQuad1 (Edge* e1, Edge* e2)
442 for (int nc=0; nc < nbr_quads1 ; nc++)
443 if (tab_quad[nc] != NULL && tab_quad[nc]->definedBy (e1, e2))
448 // ====================================================== fillGrid
449 void CrossElements::fillGrid (int cyl, int deb, int fin)
451 int nz0 = deb >= 0 ? deb : 0;
452 int nzn = fin > 0 ? fin : size_vz [cyl];
454 fillCenter (cyl, nz0, nzn);
456 for (int nz=nz0 ; nz<nzn ; nz++)
458 for (int nx=1 ; nx<size_hx ; nx++)
460 // Edges horizontaux radiaux
461 // Edges horizontaux // cloisons ext
462 for (int ny=0 ; ny<size_vy ; ny++)
464 int ny1 = (ny + 1) MODULO size_vy;
465 Vertex* vc = getVertexIJK (cyl, nx, ny, nz);
466 Vertex* v1 = getVertexIJK (cyl, nx+1, ny, nz);
467 Vertex* v2 = getVertexIJK (cyl, nx+1, ny1,nz);
469 addEdge (vc, v1, cyl, dir_x, nx, ny, nz);
470 addEdge (v1, v2, cyl, dir_y, nx+1, ny, nz);
473 for (int ny=0 ; ny<size_vy ; ny++)
475 int ny1 = (ny + 1) MODULO size_vy;
476 Edge* e1 = getEdgeI (cyl, nx, ny, nz);
477 Edge* e2 = getEdgeJ (cyl, nx+1, ny, nz);
478 Edge* e3 = getEdgeI (cyl, nx, ny1, nz);
479 Edge* e4 = getEdgeJ (cyl, nx, ny, nz);
481 addQuad (e1, e2, e3, e4, cyl, dir_z, nx, ny, nz);
486 // Edges verticaux + cloisons interieures
487 for (int ny=0 ; ny<size_vy ; ny++)
489 Vertex* vp = getVertexIJK (cyl, nx+1, ny, nz-1);
490 Vertex* vv = getVertexIJK (cyl, nx+1, ny, nz);
492 Edge* edge = addEdge (vp, vv, cyl, dir_z, nx+1, ny, nz-1);
494 Edge* e0 = getEdgeI (cyl, nx, ny, nz-1);
495 Edge* e2 = getEdgeI (cyl, nx, ny, nz);
496 Edge* e3 = getEdgeK (cyl, nx, ny, nz-1);
498 addQuad (e0, edge, e2, e3, cyl, dir_y, nx, ny, nz-1);
500 // Cloisons exterieures ***
501 for (int ny=0 ; ny<size_vy ; ny++)
503 int ny1 = (ny + 1) MODULO size_vy;
504 Edge* e0 = getEdgeJ (cyl, nx+1, ny, nz-1);
505 Edge* e2 = getEdgeJ (cyl, nx+1, ny, nz);
507 Edge* e1 = getEdgeK (cyl, nx+1, ny, nz-1);
508 Edge* e3 = getEdgeK (cyl, nx+1, ny1, nz-1);
509 addQuad (e0, e1, e2, e3, cyl, dir_x, nx+1, ny, nz-1);
512 if (is_filled || cyl==CylBig || (nz!=3 && nz != 4))
514 for (int ny=0 ; ny<size_hy ; ny++)
516 int ny1 = (ny + 1) MODULO size_vy;
517 // printf (" ---------- Hexa : nz=%d, ny=%d\n", ny, nz);
518 Quad* qa = getQuadIJ (cyl, nx, ny, nz-1);
519 Quad* qb = getQuadIJ (cyl, nx, ny, nz);
521 Quad* qc = getQuadJK (cyl, nx+1, ny, nz-1);
522 Quad* qd = getQuadJK (cyl, nx, ny, nz-1);
524 Quad* qe = getQuadIK (cyl, nx, ny1, nz-1);
525 Quad* qf = getQuadIK (cyl, nx, ny, nz-1);
527 // Hexa* cell = newHexa (qa, qb, qc, qd, qe, qf);
528 // setHexa (cell, cyl, nx, ny, nz-1);
529 addHexa (qa, qb, qc, qd, qe, qf, cyl, nx, ny, nz-1);
536 // ====================================================== fillCenter
537 void CrossElements::fillCenter (int cyl, int nz0, int nzn)
541 for (int nz=nz0 ; nz<nzn ; nz++)
543 Vertex* center = getVertexIJK (cyl, 0, 0, nz);
544 // Edges horizontaux // cloisons ext
545 for (int ny=0 ; ny<size_vy ; ny++)
547 Vertex* v1 = getVertexIJK (cyl, 1, ny, nz);
548 Vertex* v2 = getVertexIJK (cyl, 1, (ny+1) MODULO size_vy, nz);
549 addEdge (v1, v2, cyl, dir_y, nx+1, ny, nz);
553 // Edges horizontaux radiaux
554 for (int nc=0 ; nc<NbrIntCotes ; nc++)
556 Vertex* vv = getVertexIJK (cyl, 1, 2*nc, nz);
557 addEdge (center, vv, cyl, dir_x, nx, nc, nz);
560 for (int nc=0; nc<NbrIntCotes ; nc++)
562 int nc1 = (nc + 1) MODULO NbrIntCotes;
563 Edge* e1 = getEdgeI (cyl, nx, nc, nz);
564 Edge* e2 = getEdgeJ (cyl, nx+1, 2*nc, nz);
565 Edge* e3 = getEdgeJ (cyl, nx+1, 2*nc+1, nz);
566 Edge* e4 = getEdgeI (cyl, nx, nc1, nz);
568 addQuad (e1, e2, e3, e4, cyl, dir_z, nx, nc, nz);
574 // Edges verticaux + cloisons interieures
575 Vertex* vhaut = getVertexIJK (cyl,nx,0, nz-1);
576 Edge* pilier = addEdge (center, vhaut, cyl, dir_z, nx, 0, nz-1);
578 for (int ny=0 ; ny<size_vy ; ny++)
580 Vertex* vp = getVertexIJK (cyl, 1, ny, nz-1);
581 Vertex* vv = getVertexIJK (cyl, 1, ny, nz);
582 Edge* edge = addEdge (vp, vv, cyl, dir_z, 1, ny, nz-1);
583 if (is_filled && (ny MODULO 2) == 0)
585 Edge* e0 = getEdgeI (cyl, nx, ny/2, nz-1);
586 Edge* e2 = getEdgeI (cyl, nx, ny/2, nz);
587 addQuad (e0,edge, e2,pilier, cyl, dir_y, nx, ny/2, nz-1);
590 // Cloisons exterieures
591 for (int ny=0 ; ny<size_vy ; ny++)
593 int ny1 = (ny + 1) MODULO size_vy;
594 Edge* e0 = getEdgeJ (cyl, 1, ny, nz-1);
595 Edge* e2 = getEdgeJ (cyl, 1, ny, nz);
596 Edge* e1 = getEdgeK (cyl, 1, ny, nz-1);
597 Edge* e3 = getEdgeK (cyl, 1, ny1, nz-1);
599 addQuad (e0, e1, e2, e3, cyl, dir_x, 1, ny, nz-1);
604 for (int nc=0 ; nc < NbrIntCotes ; nc++)
606 // printf (" --------------- Hexa : nz=%d, nc=%d\n", nc, nz);
607 int nc1 = (nc + 1) MODULO NbrIntCotes;
608 Quad* qa = getQuadIJ (cyl, 0, nc, nz-1);
609 Quad* qb = getQuadIJ (cyl, 0, nc, nz);
611 Quad* qc = getQuadJK (cyl, 1, 2*nc, nz-1);
612 Quad* qe = getQuadJK (cyl, 1, 2*nc+1, nz-1);
614 Quad* qd = getQuadIK (cyl, 0, nc1, nz-1);
615 Quad* qf = getQuadIK (cyl, 0, nc, nz-1);
617 // Hexa* cell = newHexa (qa, qb, qc, qd, qe, qf);
618 // setHexa (cell, cyl, 0, nc, nz-1);
619 addHexa (qa, qb, qc, qd, qe, qf, cyl, nx, nc, nz-1);
625 // ====================================================== dump
626 void CrossElements::dump ()
628 int sizey [2] = { 4, S_MAXI };
629 for (int cyl=CylSmall ; cyl<=CylBig ; cyl++)
631 printf (" +++++++++ \n");
632 printf (" +++++++++ Hexas du Cylindre nro %d\n", cyl);
633 printf (" +++++++++ \n");
634 for (int nz=0; nz<size_hz[cyl]; nz++)
636 for (int nx=0; nx<size_hx; nx++)
639 for (int ny=0; ny<sizey[nx]; ny++)
641 Hexa* cell = getHexaIJK (cyl,nx,ny,nz);
642 int nro = indHexa (cyl, nx, ny, nz);
643 printf ("tab_hexa[%03d] (%d, %d,%d,%d) = ",
645 if (cell!=NULL) cell->printName("\n");
646 else printf ("NULL\n");
652 // ====================================================== dumpVertex
653 void CrossElements::dumpVertex ()
655 int sizey [3] = { 1, S_MAXI, S_MAXI };
657 for (int cyl=CylSmall ; cyl<=CylBig ; cyl++)
659 printf (" +++++++++ \n");
660 printf (" +++++++++ Vertex du Cylindre nro %d\n", cyl);
661 printf (" +++++++++ \n");
662 for (int nz=0; nz<size_vz[cyl]; nz++)
664 for (int nx=0; nx<size_vx; nx++)
667 for (int ny=0; ny<sizey[nx]; ny++)
669 Vertex* node = getVertexIJK (cyl,nx,ny,nz);
670 int nro = indVertex (cyl, nx, ny, nz);
671 printf ("tab_vertex[%03d] (%d, %d,%d,%d) = ",
673 if (node!=NULL) node->printName("\n");
674 else printf ("NULL\n");
680 // ====================================================== dumpHexas
681 void CrossElements::dumpHexas ()
683 int sizey [3] = { 1, 4, S_MAXI };
685 for (int cyl=CylSmall ; cyl<=CylBig ; cyl++)
687 printf (" +++++++++ \n");
688 printf (" +++++++++ Hexaedres du Cylindre nro %d\n", cyl);
689 printf (" +++++++++ \n");
690 for (int nz=0; nz<size_hz[cyl]; nz++)
692 for (int nx=0; nx<size_hx; nx++)
695 for (int ny=0; ny<sizey[nx]; ny++)
697 Hexa* elt = getHexaIJK (cyl,nx,ny,nz);
700 int nro = indHexa (cyl, nx, ny, nz);
701 printf ("tab_hexa[%03d] (%d, %d,%d,%d) = ",
703 elt->printName("\n");
710 // ====================================================== calcul_centre
711 double calcul_centre (Vertex* orig, Vertex* inter)
713 double dx = inter->getX () - orig->getX ();
714 double dy = inter->getY () - orig->getY ();
715 double dz = inter->getZ () - orig->getZ ();
716 double dd = sqrt (dx*dx + dy*dy + dz*dz);
719 // ===================================================== assoSlice
720 void CrossElements::assoSlice (int cyl, double* base, double* normal, int nx,
723 Real3 center, pnt1, pnt2;
726 Vertex* v_n = getVertexIJK (cyl, nx, S_N , nzs);
727 Vertex* v_s = getVertexIJK (cyl, nx, S_S , nzs);
729 v_s->getPoint (pnt1);
730 v_n->getPoint (pnt2);
732 double rayon = calc_distance (pnt1, pnt2)/2;
733 for (int nro=0 ; nro<DIM3 ; nro++)
734 center[nro] = (pnt1[nro] + pnt2[nro])/2;
736 int subid = grid_geom->addCircle (center, rayon, normal, base);
738 for (int ny=0 ; ny<S_MAXI ; ny++)
740 assoArc (cyl, nx, ny, nzs, subid);
743 // ===================================================== assoArc
744 void CrossElements::assoArc (int cyl, int nx, int ny, int nz, int subid)
746 double angle1 = getAngle (cyl, ny, nz);
747 double angle2 = getAngle (cyl, ny+1, nz);
748 Edge* edge = getEdgeJ (cyl, nx, ny, nz);
752 grid_geom->addAssociation (edge, subid, angle1*UnSur2pi, angle2*UnSur2pi);
754 // Assurer avec les vertex
755 int ny2 = ny>=S_MAXI-1 ? 0 : ny+1;
756 Vertex* node1 = getVertexIJK (cyl, nx, ny, nz);
757 Vertex* node2 = getVertexIJK (cyl, nx, ny2, nz);
759 grid_geom->addAssociation (node1, subid, angle1*UnSur2pi);
760 grid_geom->addAssociation (node2, subid, angle2*UnSur2pi);
762 // ====================================================== getAngleInter
763 // ==== Angle intersection intermediaire
764 double CrossElements::getAngleInter (int cyl, int nz)
766 if (cyl==CylBig && (nz==1 || nz==3))
767 return angle_intermed;
769 return angle_inter[cyl];
771 // ====================================================== getAngle
772 double CrossElements::getAngle (int cyl, int nj, int nz)
777 case S_NE : return angle_inter[cyl];
778 case S_N : return M_PI/2;
779 case S_NW : return M_PI - angle_inter[cyl];
780 case S_W : return M_PI;
781 case S_SW : return M_PI + angle_inter[cyl];
782 case S_S : return 3*M_PI/2;
783 case S_SE : return 2*M_PI - angle_inter[cyl];
784 case S_MAXI : return 2*M_PI;
789 // ====================================================== addVertex
790 void CrossElements::addVertex (int cyl, int ni, int nj, int nk, double px,
794 rayon = cross_rayon [cyl][ni];
795 double theta = getAngle (cyl, nj);
798 setVertex (cyl, ni, nj, nk, px, rayon*cos(theta), rayon*sin(theta));
800 setVertex (cyl, ni, nj, nk, rayon*cos(theta), rayon*sin(theta), px);
802 // ====================================================== addSlice
803 void CrossElements::addSlice (int cyl, int ni, int nk, double px, double rayon)
805 for (int nj=0 ; nj < S_MAXI ; nj++)
806 addVertex (cyl, ni, nj, nk, px, rayon);