2 // C++ : Table des noeuds
4 #include "HexElements.hxx"
6 #include "HexDocument.hxx"
7 #include "HexVector.hxx"
8 #include "HexVertex.hxx"
10 #include "HexEdge.hxx"
12 #include "HexGlobale.hxx"
20 // ====================================================== Constructeur
21 Elements::Elements (Document* doc) : EltBase (doc)
23 glob = Globale::getInstance ();
26 size_qx = size_ex = size_vx = size_hx = 0;
27 size_qy = size_ey = size_vy = size_hy = 0;
28 size_qz = size_ez = size_vz = size_hz = 0;
29 size_qplus = size_eplus = size_vplus = size_hplus = 0;
31 nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0;
35 cyl_dispo = CYL_NOFILL;
37 // ====================================================== Constructeur
38 Elements::Elements (Document* doc, int nx, int ny, int nz) : EltBase (doc)
40 glob = Globale::getInstance ();
43 size_qx = size_ex = size_vx = size_hx = 0;
44 size_qy = size_ey = size_vy = size_hy = 0;
45 size_qz = size_ez = size_vz = size_hz = 0;
46 size_qplus = size_eplus = size_vplus = size_hplus = 0;
48 nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0;
51 cyl_dispo = CYL_NOFILL;
53 resize (GR_CYLINDRIC, nx, ny, nz);
56 // ====================================================== Constructeur (clonage)
57 Elements::Elements (Elements* orig) : EltBase (orig->el_root)
59 glob = Globale::getInstance ();
61 grid_type = orig->grid_type;
62 cyl_closed = orig->cyl_closed;
63 cyl_fill = orig->cyl_fill;
64 cyl_dispo = orig->cyl_dispo;
66 size_qx = size_ex = size_vx = size_hx = 0;
67 size_qy = size_ey = size_vy = size_hy = 0;
68 size_qz = size_ez = size_vz = size_hz = 0;
69 size_qplus = size_eplus = size_vplus = size_hplus = 0;
70 nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0;
72 resize (orig->grid_type, orig->size_hx, orig->size_hy, orig->size_hz);
73 cyl_closed = orig->cyl_closed;
75 // ====================================================== resize
76 void Elements::resize (EnumGrid type, int nx, int ny, int nz)
85 size_hx = std::max (nx, 1);
86 size_hy = std::max (ny, 1);
87 size_hz = std::max (nz, 1);
89 size_qx = size_ex = size_vx = size_hx + 1;
90 size_qy = size_ey = size_vy = size_hy + 1;
91 size_qz = size_ez = size_vz = size_hz + 1;
93 nbr_hexas = size_hx * size_hy * size_hz;
94 nbr_quads = size_qx * size_qy * size_qz * DIM3;
95 nbr_edges = size_ex * size_ey * size_ez * DIM3;
96 nbr_vertex = size_vx * size_vy * size_vz;
100 size_qx = size_ex = size_vx = size_hx = 0;
101 size_qy = size_ey = size_vy = size_hy = 0;
102 size_qz = size_ez = size_vz = size_hz = 0;
103 nbr_quads = nbr_edges = nbr_vertex = 0;
104 gr_rayon = std::max (nx, 1);
106 nbr_hexas = 1 + gr_rayon*HQ_MAXI;
108 ker_vertex = nbr_vertex;
112 nbr_orig = std::max (nx, 1);
113 gr_hauteur = std::max (ny, 1);
116 size_hz = gr_hauteur;
118 nbr_hexas = nbr_orig * gr_hauteur;
119 nbr_vertex = nbr_hexas * QUAD4;
120 nbr_vertex = nbr_orig * (gr_hauteur+1)*QUAD4;
121 nbr_quads = nbr_vertex;
122 nbr_edges = 2*nbr_vertex;
131 size_qx = size_ex = size_vx = size_hx + 1;
132 size_qy = size_ey = size_vy = size_hy + 1;
133 size_qz = size_ez = size_vz = size_hz + 1;
135 nbr_hexas = size_hx * size_hy * size_hz;
136 nbr_quads = size_qx * size_qy * size_qz * DIM3;
137 nbr_edges = size_ex * size_ey * size_ez * DIM3;
138 nbr_vertex = size_vx * size_vy * size_vz;
142 tab_hexa .resize (nbr_hexas);
143 tab_quad .resize (nbr_quads);
144 tab_edge .resize (nbr_edges);
145 tab_vertex.resize (nbr_vertex);
147 ker_vertex = nbr_vertex;
149 for (int nc=0 ; nc< nbr_hexas ; nc++) tab_hexa [nc] = NULL;
150 for (int nc=0 ; nc< nbr_quads ; nc++) tab_quad [nc] = NULL;
151 for (int nc=0 ; nc< nbr_edges ; nc++) tab_edge [nc] = NULL;
152 for (int nc=0 ; nc< nbr_vertex ; nc++) tab_vertex [nc] = NULL;
155 // ====================================================== makeCartesianGrid
156 int Elements::makeCartesianGrid (Vertex* orig, Vector* v1, Vector* v2,
157 Vector* v3, int px, int py, int pz, int mx, int my, int mz)
159 resize (GR_CARTESIAN, px+mx, py+my, pz+mz);
161 makeCartesianNodes (orig, v1, v2, v3, px, py, pz, mx, my, mz);
166 // ====================================================== makeCylindricalGrid
167 int Elements::makeCylindricalGrid (Vertex* c, Vector* b, Vector* h,
168 double dr, double da, double dl, int nr, int na, int nl, bool fill)
170 resize (GR_CYLINDRIC, nr, na, nl);
171 cyl_closed = da >= 360.0;
172 makeCylindricalNodes (c, b, h, dr, da, dl, nr, na, nl, fill);
176 // ====================================================== makeSphericalGrid
177 int Elements::makeSphericalGrid (Vertex* c, Vector* dv, int nb, double k)
179 resize (GR_SPHERIC, nb);
183 else if (dv->getDx()<=ZEROR || dv->getDy()<=ZEROR || dv->getDz()<=ZEROR)
186 Vertex* i_node [HV_MAXI]; // Les noeuds de l'hexa englobant
187 Edge* i_edge [HE_MAXI]; // Les noeuds de l'hexa englobant
188 Quad* i_quad [HQ_MAXI]; // Les noeuds de l'hexa englobant
190 for (int nro=0 ; nro<HV_MAXI; nro++)
192 double dx = glob->CoordVertex (nro, dir_x) * dv->getDx();
193 double dy = glob->CoordVertex (nro, dir_y) * dv->getDy();
194 double dz = glob->CoordVertex (nro, dir_z) * dv->getDz();
196 i_node [nro] = el_root->addVertex (c->getX ()+dx, c->getY ()+dy,
200 for (int nro=0 ; nro<HE_MAXI; nro++)
201 i_edge[nro] = newEdge (i_node[glob->EdgeVertex (nro, V_AMONT)],
202 i_node[glob->EdgeVertex (nro, V_AVAL) ]);
204 for (int nro=0 ; nro<HQ_MAXI; nro++)
205 i_quad[nro] = newQuad (i_edge[glob->QuadEdge (nro, E_A)],
206 i_edge[glob->QuadEdge (nro, E_B)],
207 i_edge[glob->QuadEdge (nro, E_C)],
208 i_edge[glob->QuadEdge (nro, E_D)]);
210 tab_hexa.push_back (newHexa (i_quad[Q_A], i_quad[Q_B], i_quad[Q_C],
211 i_quad[Q_D], i_quad[Q_E], i_quad[Q_F]));
214 for (int niv=0; niv<gr_rayon ; niv++)
216 double lambda0 = lambda;
219 addStrate (i_quad, i_edge, i_node, c, lambda/lambda0);
224 // ====================================================== addStrate
225 int Elements::addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[],
226 Vertex* center, double lambda)
228 Vertex* e_node [HV_MAXI]; // Les noeuds de l'hexa englobant
229 Edge* e_edge [HE_MAXI]; // Les noeuds de l'hexa englobant
230 Quad* e_quad [HQ_MAXI]; // Les noeuds de l'hexa englobant
232 Edge* d_edge [HV_MAXI]; // Les aretes diagonales (1 par sommet)
233 Quad* d_quad [HE_MAXI]; // Les faces diagonales (1 par arete)
236 // + les aretes diagonales
237 for (int nv=0 ; nv<HV_MAXI ; nv++)
239 double px0 = center->getX ();
240 double py0 = center->getY ();
241 double pz0 = center->getZ ();
242 e_node[nv] = el_root->addVertex (px0+lambda*(i_node[nv]->getX()-px0),
243 py0+lambda*(i_node[nv]->getY()-py0),
244 pz0+lambda*(i_node[nv]->getZ()-pz0));
246 d_edge[nv] = newEdge (i_node[nv], e_node[nv]);
248 // Les aretes exterieures
249 // + les faces diagonales
250 for (int nro=0 ; nro<HE_MAXI ; nro++)
252 int nv0 = glob->EdgeVertex (nro, V_AMONT);
253 int nv1 = glob->EdgeVertex (nro, V_AVAL );
254 e_edge[nro] = newEdge (e_node [nv0], e_node [nv1]);
255 d_quad[nro] = newQuad (i_edge [nro], d_edge [nv0],
256 e_edge [nro], d_edge [nv1]);
258 // Les faces exterieures
261 for (int nro=0 ; nro<HQ_MAXI ; nro++)
263 int ne0 = glob->QuadEdge (nro, E_A);
264 int ne1 = glob->QuadEdge (nro, E_B);
265 int ne2 = glob->QuadEdge (nro, E_C);
266 int ne3 = glob->QuadEdge (nro, E_D);
268 e_quad[nro] = newQuad (e_edge[ne0], e_edge[ne1],
269 e_edge[ne2], e_edge[ne3]);
270 strate = newHexa (i_quad[nro], e_quad[nro], d_quad[ne0],
271 d_quad[ne2], d_quad[ne1], d_quad[ne3]);
272 tab_hexa.push_back (strate);
275 for (int nv=0 ; nv<HV_MAXI ; nv++) i_node [nv] = e_node [nv];
276 for (int ns=0 ; ns<HE_MAXI ; ns++) i_edge [ns] = e_edge [ns];
277 for (int nq=0 ; nq<HE_MAXI ; nq++) i_quad [nq] = e_quad [nq];
281 // ====================================================== saveVtk
282 int Elements::saveVtk (cpchar nomfic)
284 // -- 1) Raz numerotation precedente
285 for (int nro=0 ; nro<nbr_hexas ; nro++)
287 Hexa* cell = tab_hexa[nro];
288 if (cell!=NULL && cell->isHere())
295 for (int nro=0 ; nro<nbr_hexas ; nro++)
297 Hexa* cell = tab_hexa[nro];
298 if (cell!=NULL && cell->isHere())
301 nbnodes += cell->countNodes ();
305 pfile vtk = fopen (nomfic, "w");
306 fprintf (vtk, "# vtk DataFile Version 3.1\n");
307 fprintf (vtk, "%s \n", nomfic);
308 fprintf (vtk, "ASCII\n");
309 fprintf (vtk, "DATASET UNSTRUCTURED_GRID\n");
310 fprintf (vtk, "POINTS %d float\n", nbnodes);
314 for (int nro=0 ; nro<nbr_hexas ; nro++)
316 Hexa* cell = tab_hexa[nro];
317 if (cell!=NULL && cell->isHere())
318 cell->printNodes (vtk, nronode);
322 fprintf (vtk, "CELLS %d %d\n", nbcells, nbcells*(HV_MAXI+1));
324 for (int nro=0 ; nro<nbr_hexas ; nro++)
326 Hexa* cell = tab_hexa[nro];
327 if (cell!=NULL && cell->isHere())
328 cell->printHexa (vtk);
331 fprintf (vtk, "CELL_TYPES %d\n", nbcells);
332 for (int nro=0 ; nro<nbcells ; nro++)
333 fprintf (vtk, "%d\n", HE_MAXI);
338 // ============ = = = = = = = = = Vertices ..........
339 // ====================================================== newEdge
340 Edge* Elements::newEdge (Vertex* v1, Vertex* v2)
342 if (v1==NULL || v2==NULL)
345 Edge* elt = new Edge (v1, v2);
348 // ====================================================== newQuad
349 Quad* Elements::newQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4)
351 if (e1==NULL || e2==NULL || e3==NULL|| e4==NULL)
354 Quad* elt = new Quad (e1, e2, e3, e4);
357 // ====================================================== newHexa
358 Hexa* Elements::newHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd,
361 if (qa==NULL || qb==NULL || qc==NULL|| qd==NULL || qe==NULL|| qf==NULL)
364 Hexa* elt = new Hexa (qa, qb, qc, qd, qe, qf);
367 // ====================================================== joinQuads
368 int Elements::joinQuads (Quads& orig, int nb, Vertex* v1, Vertex* v2,
369 Vertex* v3, Vertex* v4, Quad* cible)
371 resize (GR_JOINT, orig.size(), nb);
373 el_root->markAll (IS_NONE);
376 nbr_orig = orig.size();
378 for (int nro=0 ; nro<nbr_orig ; nro++)
380 Quad* face = orig[nro];
384 printf (" *** joinQuads : donnees incorrectes\n");
385 printf (" *** le %deme quadrangle de depart est NULL\n", nro);
388 else if (face->getNbrParents()>1)
391 printf (" *** joinQuads : donnees incorrectes\n");
392 printf (" *** le %deme quadrangle de depart n'est pas une "
393 "face externe\n", nro);
397 orig [nro]->setMark (nro);
398 tab_orig.push_back (orig[nro]);
401 Edge* e_orig = tab_orig[0] -> findEdge (v1, v3);
402 Edge* e_dest = cible -> findEdge (v2, v4);
409 printf (" *** joinQuads : donnees incorrectes\n");
410 printf (" *** Les vertex v1 et v3 passes en argument ne definissent\n");
411 printf (" *** pas une arete du 1er quadrangle de depart\n");
421 printf (" *** joinQuads : donnees incorrectes\n");
422 printf (" *** Les vertex v2 et v4 passes en argument ne definissent\n");
423 printf (" *** pas une arete du quadrangle cible\n");
430 if (e_orig==NULL || e_dest==NULL)
433 StrOrient orient (v1, v3, v2, v4);
434 this ->coupler (0, cible, &orient);
435 orig[0]->coupler (cible, &orient, this);
438 // ======================================================== coupler
439 void Elements::coupler (int nquad, Quad* dest, StrOrient* orient)
441 Quad* orig = tab_orig [nquad];
443 setQuad (orig, dir_z, 0, 0, 0);
444 setQuad (dest, dir_z, nquad, 0, 0);
446 int n11 = orig->indexVertex (orient->v11);
447 int n12 = orig->indexVertex (orient->v12);
448 int n21 = dest->indexVertex (orient->v21);
449 int n22 = dest->indexVertex (orient->v22);
451 printf ("Quad nro %d : ", nquad);
452 orig->printName (" est couple avec ");
453 dest->printName (", ");
454 printf ("Orientation=(%d,%d) (%d,%d)\n", n11, n12, n21, n22);
455 // ---------------- Les 4 sommets initiaux
456 Vertex* vorig[QUAD4] = { orient->v11, orient->v12,
457 orig->getVertex((n11+2) MODULO QUAD4),
458 orig->getVertex((n12+2) MODULO QUAD4) };
460 Vertex* vdest[QUAD4] = { orient->v21, orient->v22,
461 dest->getVertex((n21+2) MODULO QUAD4),
462 dest->getVertex((n22+2) MODULO QUAD4) };
464 // ---------------- Les sommets + les aretes verticales
465 #define Put(e) if (e) { printf ( " ... " #e " = ") ; e->printName("\n"); } \
466 else printf ( " ... " #e " = 0x0\n")
467 #define Putn(e,n) { printf ( " ... " #e "[%d] = ",n) ; if(e[n]) e[n]->printName("\n"); \
468 else printf ( "0x0\n")
470 for (int ns=0 ; ns< QUAD4 ; ns++)
472 Vertex* nd1 = vorig[ns];
473 Vertex* nd2 = vdest[ns];
474 int nref0 = nd1->getMark();
475 tab_vertex [nroVertex (nquad,ns,0)] = nd1;
479 double px0 = nd1->getX();
480 double py0 = nd1->getY();
481 double pz0 = nd1->getZ();
483 double dx = (nd2->getX() - nd1->getX()) / gr_hauteur;
484 double dy = (nd2->getY() - nd1->getY()) / gr_hauteur;
485 double dz = (nd2->getZ() - nd1->getZ()) / gr_hauteur;
487 nd1->setMark (indVertex (nquad, ns, 0));
490 for (int nh=0 ; nh<gr_hauteur ; nh++)
494 if (nh == gr_hauteur-1)
497 nd = el_root->addVertex (px0 + nh1*dx, py0 + nh1*dy,
499 int nv = indVertex (nquad, ns, nh);
500 tab_vertex [nv] = nd;
501 tab_edge [nv] = el_root->addEdge (ndp, nd);
506 for (int nh=0 ; nh<gr_hauteur ; nh++)
508 int nv = indVertex (nquad, ns, nh);
509 int nv0 = indVertex (nref0, nh);
510 tab_vertex [nv] = tab_vertex [nv0];
511 tab_edge [nv] = tab_edge [nv0];
515 // ---------------- Les quads verticaux + aretes horiz
516 for (int ns=0 ; ns< QUAD4 ; ns++)
518 int next = (ns+1) MODULO QUAD4;
519 Edge* arete = orig->findEdge (vorig[ns], vorig[next]);
520 int nref0 = arete->getMark();
521 int nref = indVertex (nquad, ns, 0);
522 // Construction des faces & aretes H
525 arete->setMark (nref);
530 for (int nh=0 ; nh< gr_hauteur ; nh++)
532 nva = indVertex (nquad, ns, nh);
533 nvb = indVertex (nquad, next, nh);
534 nha = nroEdgeH (nva);
539 if (nh==gr_hauteur-1)
540 ea = dest->findEdge (vdest[ns], vdest[next]);
542 ea = el_root->addEdge (tab_vertex [nva], tab_vertex [nvb]);
544 tab_quad [nva] = newQuad (ea, eb, ec, ed);
548 // L'arete a deja ete traitee
551 for (int nh=0 ; nh<gr_hauteur ; nh++)
553 int nva = indVertex (nquad, ns, nh);
554 int nha = nroEdgeH (nva);
556 int nvb = indVertex (nref0, nh);
557 int nhb = nroEdgeH (nvb);
559 tab_quad [nva] = tab_quad [nvb];
560 tab_edge [nha] = tab_edge [nhb];
564 // -------------------------------- Les Hexas
566 Quad *fa, *fc, *fd, *fe, *ff;
567 for (int nh=0 ; nh< gr_hauteur ; nh++)
570 if (nh == gr_hauteur-1)
573 fb = newQuad (tab_edge [nroEdgeH (nquad, E_A, nh)],
574 tab_edge [nroEdgeH (nquad, E_B, nh)],
575 tab_edge [nroEdgeH (nquad, E_C, nh)],
576 tab_edge [nroEdgeH (nquad, E_D, nh)]);
578 fc = tab_quad [indVertex (nquad, E_A, nh)];
579 fd = tab_quad [indVertex (nquad, E_C, nh)];
580 fe = tab_quad [indVertex (nquad, E_B, nh)];
581 ff = tab_quad [indVertex (nquad, E_D, nh)];
583 tab_hexa [nroHexa(nquad,nh)] = newHexa (fa,fb,fc,fd,fe,ff);
586 // ====================================================== makeCartesianNodes
587 int Elements::makeCartesianNodes (Vertex* orig, Vector* v1, Vector* v2,
588 Vector* v3, int px, int py, int pz, int mx, int my, int mz)
590 double dx = v1->getDx() + v2->getDx() + v3->getDx();
591 double dy = v1->getDy() + v2->getDy() + v3->getDy();
592 double dz = v1->getDz() + v2->getDz() + v3->getDz();
594 double px0 = orig->getX () - mx * dx;
595 double py0 = orig->getY () - my * dy;
596 double pz0 = orig->getZ () - mz * dz;
600 for (int nz=0 ; nz<size_vz ; nz++)
601 for (int ny=0 ; ny<size_vy ; ny++)
602 for (int nx=0 ; nx<size_vx ; nx++)
605 if (nx!=mx || ny!=my || nz!=mz)
606 node = el_root->addVertex (px0 + nx*dx, py0 + ny*dy,
608 setVertex (node, nx, ny, nz);
613 // ====================================================== makeCylindricalNodes
614 int Elements::makeCylindricalNodes (Vertex* orig, Vector* base, Vector* haut,
615 double dr, double da, double dl, int nr, int na, int nl, bool fill)
617 int ier = makeBasicCylinder (dr, da, dl, nr, na, nl, fill);
621 Vector* iprim = new Vector (base);
622 Vector* jprim = new Vector (base);
623 Vector* kprim = new Vector (haut);
625 ier = kprim->renormer ();
629 jprim->vectoriel (kprim, base);
630 ier = jprim->renormer ();
634 iprim->vectoriel (jprim, kprim);
635 transfoVertices (orig, iprim, jprim, kprim);
638 // ====================================================== transfoVertices
639 void Elements::transfoVertices (Vertex* orig, Vector* iprim, Vector* jprim,
642 double matrice[DIM3][DIM3]={{iprim->getDx(),jprim->getDx(),kprim->getDx()},
643 {iprim->getDy(),jprim->getDy(),kprim->getDy()},
644 {iprim->getDz(),jprim->getDz(),kprim->getDz()}};
646 double matkx = orig->getX();
647 double matky = orig->getY();
648 double matkz = orig->getZ();
650 int nbre = tab_vertex.size ();
651 for (int nro=0 ; nro<nbre ; nro++)
653 if (tab_vertex[nro] != NULL)
654 tab_vertex[nro]->setMark (NO_USED);
657 for (int nro=0 ; nro<nbre ; nro++)
659 Vertex* node = tab_vertex[nro];
660 if (node != NULL && node->getMark() == NO_USED)
662 double point [DIM3] = {node->getX(), node->getY(), node->getZ()};
663 double result[DIM3] = {matkx, matky, matkz};
665 for (int ni=0 ; ni<DIM3; ni++)
666 for (int nj=0 ; nj<DIM3; nj++)
667 result [ni] += matrice[ni][nj] * point[nj];
669 node->setCoord (result[dir_x], result[dir_y], result[dir_z]);
670 node->setMark (IS_USED);
674 // ====================================================== transform
675 int Elements::transform (Matrix* matrice)
678 for (int nro=0 ; nro<nbr_hexas ; nro++)
680 Hexa* cell = tab_hexa[nro];
681 if (cell!=NULL && cell->isHere())
685 for (int nro=0 ; nro<nbr_hexas ; nro++)
687 Hexa* cell = tab_hexa[nro];
688 if (cell!=NULL && cell->isHere())
689 cell->moveNodes (matrice);
694 // ====================================================== cutHexas
695 int Elements::cutHexas (const Edges& t_edges, int nbcuts)
697 // 1) marquage des hexas
698 el_root->markAll (NO_USED);
700 vector <Quad*> q_amont;
701 vector <Quad*> q_aval;
703 int nbnodes = t_edges.size();
704 vector <Vertex*> v_amont (nbnodes);
705 vector <Vertex*> v_aval (nbnodes);
707 for (int nro=0; nro<nbnodes ; nro++)
709 Edge* arete = t_edges [nro];
710 v_amont [nro] = arete->getAmont ();
711 v_aval [nro] = arete->getAval ();
712 int nbcells = arete->getNbrParents ();
714 for (int nq=0 ; nq<nbcells ; nq++)
716 Quad* quad = arete->getParent (nq);
717 if (quad->getMark () != IS_USED)
719 quad->setMark (IS_USED);
720 int nbcubes = quad->getNbrParents ();
721 for (int nh=0 ; nh<nbcubes ; nh++)
723 Hexa* hexa = quad->getParent (nh);
724 if (hexa->getMark () != IS_USED)
726 hexa->setMark (IS_USED);
727 int namont = hexa->getBase (v_amont[nro], arete);
728 int naval = glob->getOpposedQuad (namont);
729 q_amont.push_back (hexa->getQuad (namont));
730 q_aval .push_back (hexa->getQuad (naval ));
735 hexa->printName (", ");
736 printf (" Faces = (");
737 hexa->getQuad (namont)->printName (", ");
738 hexa->getQuad (naval )->printName (")\n");
745 // ------------------- Dimensionnement
746 int nbcells = q_amont.size ();
747 nbr_vertex = nbnodes*(nbcuts+2);
748 int nbpiliers = nbnodes*(nbcuts+1); // aretes verticales
749 int nbpoutres = nbcells*(nbcuts+2)*QUAD4; // aretes horizontales
750 nbr_edges = nbpoutres;
751 nbr_quads = nbcells*(nbcuts+1)*QUAD4; // faces Verticales
752 nbr_hexas = nbcells*(nbcuts+1);
754 // ------------------- Les noeuds et les aretes verticales
755 tab_quad.resize (nbr_quads);
756 tab_edge.resize (nbr_edges);
757 tab_hexa.resize (nbr_hexas);
758 tab_vertex.resize (nbr_vertex);
759 vector <Edge*> tab_pilier (nbpiliers);
761 int nbinter = nbcuts + 1;
762 for (int ned=0; ned<nbnodes ; ned++)
764 t_edges [ned]->remove ();
765 Vertex* ndamont = v_amont [ned];
766 Vertex* ndaval = v_aval [ned];
768 double dx = (ndaval->getX() - ndamont->getX()) / nbinter;
769 double dy = (ndaval->getY() - ndamont->getY()) / nbinter;
770 double dz = (ndaval->getZ() - ndamont->getZ()) / nbinter;
772 Vertex* nd0 = tab_vertex [ned] = ndamont;
773 for (int nc=0; nc<nbcuts ; nc++)
776 Vertex* nd1 = el_root->addVertex (ndamont->getX() + nc1*dx,
777 ndamont->getY() + nc1*dy,
778 ndamont->getZ() + nc1*dz);
779 tab_vertex [nc1*nbnodes + ned] = nd1;
780 tab_pilier [nc *nbnodes + ned] = newEdge (nd0, nd1);
783 tab_vertex [nbinter*nbnodes + ned] = ndaval;
784 tab_pilier [nbcuts *nbnodes + ned] = newEdge (nd0, ndaval);
785 ndamont->setMark (ned);
787 // ------------------- Les aretes horizontales
788 // ------------------- Les faces verticales
789 int sizelig = nbcells*QUAD4;
790 for (int nro=0; nro<nbcells ; nro++)
792 Quad* sol = q_amont [nro];
793 Quad* toit = q_aval [nro];
795 for (int ns=0; ns<QUAD4 ; ns++)
798 Edge* plinthe = sol->getEdge (ns);
799 int nmur = nro*QUAD4 + ns;
800 int nmur0 = plinthe->getMark();
803 for (int nc=0 ; nc<nbinter ; nc++)
805 tab_edge [nc*sizelig + nmur] = tab_edge [nc*sizelig + nmur0];
806 tab_quad [nc*sizelig + nmur] = tab_quad [nc *sizelig + nmur0];
807 printf (" quad_vertical [%02d] = ", nc*sizelig + nmur);
808 printf (" quad_vertical [%02d]\n", nc*sizelig + nmur0);
811 tab_edge [nbinter*sizelig+nmur] = tab_edge[nbinter*sizelig+nmur0];
815 plinthe->setMark (nmur);
816 Vertex* v1 = sol->getVertex (ns);
817 Vertex* v2 = sol->getVertex ((ns+1) MODULO QUAD4);
818 int nd1 = v1->getMark ();
819 int nd2 = v2->getMark ();
820 Edge* ed0 = tab_edge [nmur] = plinthe;
821 Edge* edtoit = toit->getEdge (ns);
822 for (int nc=0 ; nc<nbinter ; nc++)
828 v1 = tab_vertex [nc1*nbnodes + nd1];
829 v2 = tab_vertex [nc1*nbnodes + nd2];
830 ed2 = newEdge (v1, v2);
832 tab_edge [nc1*sizelig + nmur] = ed2;
833 tab_quad [nc *sizelig + nmur] = newQuad (ed0,
834 tab_pilier [nc*nbnodes + nd1], ed2,
835 tab_pilier [nc*nbnodes + nd2]);
837 printf (" quad_vertical [%02d] = ", nc*sizelig + nmur);
838 PrintName (tab_quad [nc *sizelig + nmur]);
844 // ------------------- Les faces horizontales
845 // ------------------- Les hexas
846 // Rappel : sizelig = nbcells*QUAD4
847 for (int nro=0; nro<nbcells ; nro++)
849 Quad* qa = q_amont [nro];
850 for (int nc=0 ; nc<nbinter ; nc++)
852 int quadv = nc*nbcells*QUAD4 + nro*QUAD4;
853 Quad* qb = q_aval[nro];
856 int edh = (nc+1)*nbcells*QUAD4 + nro*QUAD4;
857 qb = newQuad (tab_edge[edh], tab_edge[edh+1],
858 tab_edge[edh+2], tab_edge[edh+3]);
860 Quad* qc = tab_quad [quadv];
861 Quad* qd = tab_quad [quadv + 2];
862 Quad* qe = tab_quad [quadv + 1];
863 Quad* qf = tab_quad [quadv + 3];
864 tab_hexa [nc*nbcells + nro] = newHexa (qa, qb, qc, qd, qe, qf);