2 // C++ : Tests unitaires
4 // Copyright (C) 2009-2011 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/
21 // or email : webmaster.salome@opencascade.com
23 #include "test_unit.hxx"
26 #include "HexDocument.hxx"
27 #include "HexElements.hxx"
28 #include "HexCrossElements.hxx"
30 #include "HexHexa.hxx"
31 #include "HexQuad.hxx"
32 #include "HexEdge.hxx"
33 #include "HexVertex.hxx"
35 #include "HexPropagation.hxx"
37 #include "HexMatrix.hxx"
38 #include "HexCramer.hxx"
39 #include "HexGroup.hxx"
44 static int nbr_vtk = 0;
45 static cpchar case_name = "hexa";
46 static Hex::Document* docu = NULL;
48 // ======================================================== print_propagations
49 void print_propagations (Hex::Document* doc)
51 int nb = doc->countPropagation ();
53 for (int nro=0 ; nro<nb ; nro++)
55 Hex::Propagation* prop = doc ->getPropagation (nro);
56 const Hex::Edges& table = prop->getEdges ();
57 printf (" ____________________________________ Prop nro %d\n", nro);
58 for (int ned=0 ; ned<(int)table.size() ; ned++)
60 bool way = table [ned]->getWay ();
61 Hex::Edge* edge = table [ned];
62 Hex::Vertex* v0 = edge->getVertex (0);
63 Hex::Vertex* v1 = edge->getVertex (1);
69 v1->printName (")\n");
74 v0->printName (")\n");
80 // ======================================================== save_vtk
86 docu->saveVtk (case_name, nbr_vtk);
88 // ======================================================== remove_hexa
89 void remove_hexa (Hex::Hexa* hexa)
99 docu->saveVtk (case_name, nbr_vtk);
101 // ======================================================== test_sphere
102 int test_sphere (int nbargs, cpchar tabargs[])
105 Hex::Document* doc = mon_ex.addDocument ();
106 Hex::Vertex* orig = doc->addVertex (0,0,0);
111 Hex::Elements* sphere = doc->makeSpherical (orig, rayon, ncouches, k);
115 for (int nc=0 ; nc <= ncouches ; nc++)
117 Hex::Hexa* cell = sphere->getStrate (nc, Hex::Q_A);
121 // sphere->getStrate (nc, Hex::Q_A)->remove ();
122 // sphere->getStrate (nc, Hex::Q_B)->remove ();
126 sphere->saveVtk ("sphere.vtk");
129 // ======================================================== test_cartesi1
132 const int size_x = 15;
133 const int size_y = 12;
134 const int size_z = 8;
137 Hex::Document* doc = mon_ex.addDocument ();
138 Hex::Vertex* orig = doc->addVertex (0,0,0);
140 Hex::Vector* dir = doc->addVector (1,1,1);
141 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
143 // print_propagations (doc);
145 for (int nz=0; nz<size_z ; nz++)
146 for (int ny=nz+1; ny<size_y-nz-1 ; ny++)
147 for (int nx=nz+1; nx<size_x-nz-1 ; nx++)
149 Hex::Hexa* cell = grid->getHexaIJK (nx, ny, nz);
154 print_propagations (doc);
155 grid->saveVtk ("grid_cart.vtk");
160 // ======================================================== afficher
161 #define Afficher(elt) afficher (#elt, elt)
162 int afficher (cpchar nom, Hex::EltBase* elt)
166 printf (" .... %s = 0x0\n", nom);
170 printf (" .... %s = 0x%08lx = %03d\n", nom, (unsigned long) elt, elt->getId());
173 // ======================================================== test_find
176 const int size_x = 2;
177 const int size_y = 2;
178 const int size_z = 2;
181 Hex::Document* doc = mon_ex.addDocument ();
183 Hex::Vertex* orig = doc->addVertex (0,0,0);
184 Hex::Vector* dir = doc->addVector (1,1,1);
185 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
187 grid->saveVtk ("mini1.vtk");
190 Hex::Vertex *v00, *v02, *v06, *v08, *v10, *v22, *v26;
192 Afficher ( v00 = doc->findVertex (0, 0, 0));
193 Afficher ( v02 = doc->findVertex (1, 1, 0));
194 Afficher ( v06 = doc->findVertex (1, 1, 1));
195 Afficher ( v08 = doc->findVertex (2, 1, 0));
196 Afficher ( v10 = doc->findVertex (2, 1, 1));
197 Afficher ( v22 = doc->findVertex (2, 1, 2));
198 Afficher ( v26 = doc->findVertex (2, 2, 2));
202 Afficher (doc->findEdge (v06, v10));
203 Afficher (doc->findEdge (v10, v06));
206 Afficher (doc->findQuad (v02, v10));
207 Afficher (doc->findQuad (v06, v08));
208 Afficher (doc->findQuad (v02, v06));
211 Afficher (doc->findHexa (v00, v06));
212 Afficher (doc->findHexa (v06, v26));
213 Afficher (doc->findHexa (v26, v06));
217 // ======================================================== test_joint
218 int test_joint (int nbargs, cpchar tabargs[])
225 Hex::Document* doc = mon_ex.addDocument ();
227 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
228 Hex::Vector* dir = doc->addVector (1,1,1);
230 Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz);
232 Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8);
233 Hex::Vector* vectj = doc->addVector (0,1,0);
234 Hex::Vector* vecti = doc->addVector (1,0,0);
235 Hex::Elements* grid2 = doc->makeCylindrical (orig2, vecti, vectj,
236 1, 180, 1, dimz,dimy,dimx, true);
240 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
241 Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my);
243 Hex::Vertex* v1 = prems->getVertex (0);
244 Hex::Vertex* v3 = prems->getVertex (1);
246 Hex::Vertex* v2 = cible->getVertex (1);
247 Hex::Vertex* v4 = cible->getVertex (2);
249 // v1->setScalar (3);
250 // v2->setScalar (3);
251 // v3->setScalar (6);
252 // v4->setScalar (6);
256 liste.push_back (prems);
257 for (int nx=0; nx<dimx; nx++)
259 liste.push_back (grid1->getQuadIJ (nx, my, dimz));
261 for (int ny=0; ny<dimy; ny++)
263 liste.push_back (grid1->getQuadIJ (mx, ny, dimz));
265 doc->saveVtk ("joint1.vtk");
266 const int hauteur = 5;
267 Hex::Elements* joint = doc->joinQuads(liste, cible, v1,v2,v3,v4, hauteur);
268 // for (int nh=0 ; nh<hauteur ; nh++) joint->getHexa(nh)->setScalar (5);
270 int nbr_joint_vertex = joint->countVertex ();
271 int nbr_surf_vertex = nbr_joint_vertex/(hauteur+1);
273 HexDisplay (nbr_joint_vertex);
274 HexDisplay (nbr_surf_vertex);
276 int indice0 = joint->findVertex (v1);
277 HexDisplay (indice0);
279 for (int nh=0 ; nh<nbr_surf_vertex ; nh++)
280 joint->getVertex(nh)->setScalar (5);
282 for (int nh=0 ; nh<=hauteur ; nh++)
283 joint->getVertex(nh*nbr_surf_vertex)->setScalar (3);
285 doc->saveVtk ("joint2.vtk");
288 // ======================================================== test_prism
289 int test_prism (int nbargs, cpchar tabargs[])
296 Hex::Document* doc = mon_ex.addDocument ();
298 Hex::Vertex* orig1 = doc->addVertex ( 0,0,0);
299 Hex::Vector* dir1 = doc->addVector ( 1,1,1);
300 Hex::Vector* dir2 = doc->addVector ( 1,1,-1);
302 Hex::Elements* grid1 = doc->makeCartesian (orig1, dir1, dimx,dimy,dimz);
306 Hex::Quads liste1, liste2;
308 liste1.push_back (grid1->getQuadIJ (mx, my, dimz));
309 liste2.push_back (grid1->getQuadIJ (mx, my, 0));
310 for (int nx=0; nx<dimx; nx++)
313 liste1.push_back (grid1->getQuadIJ (nx, my, dimz));
314 liste2.push_back (grid1->getQuadIJ (nx, my, 0));
317 for (int ny=0; ny<dimy; ny++)
320 liste1.push_back (grid1->getQuadIJ (mx, ny, dimz));
321 liste2.push_back (grid1->getQuadIJ (mx, ny, 0));
324 Hex::RealVector tlen;
326 for (int nro=0; nro<5; nro++)
332 const int nbiter = 5;
333 doc->saveVtk ("prisme1.vtk");
334 Hex::Elements* prisme2 = doc->prismQuads (liste2, dir2, nbiter);
335 doc->saveVtk ("prisme2.vtk");
337 Hex::Elements* prisme1 = doc->prismQuadsVec (liste1, dir1, tlen, 0);
339 PutData (liste1.size());
340 PutData (tlen.size());
341 PutData (prisme1->countHexa());
342 PutData (prisme1->countQuad());
343 PutData (prisme1->countEdge());
344 PutData (prisme1->countVertex());
346 for (int nro=0 ; nro <nbiter ; nro++)
348 Hex::Hexa* cell = prisme2-> getHexa (nbiter+nro);
352 doc->saveVtk ("prisme3.vtk");
355 // ======================================================== test_revolution9
356 int test_revolution9 (int nbargs, cpchar tabargs[])
363 Hex::Document* doc = mon_ex.addDocument ();
365 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
366 Hex::Vector* dir = doc->addVector (1,1,1);
368 Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz);
372 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
375 liste.push_back (prems);
376 prems -> setScalar (5);
377 for (int nx=0; nx<dimx; nx++)
380 Hex::Quad* cell = grid1->getQuadIJ (nx, my, dimz);
381 liste.push_back (cell);
382 cell -> setScalar (5);
385 for (int ny=0; ny<dimy; ny++)
388 Hex::Quad* cell = grid1->getQuadIJ (mx, ny, dimz);
389 liste.push_back (cell);
390 cell -> setScalar (5);
393 Hex::Vertex* center = doc->addVertex (0, -10, 0);
394 Hex::Vector* axis = doc->addVector (1, 0, 0);
395 Hex::RealVector angles;
397 Hex::Vector* dir1 = doc->addVector (10,0.3,0.3);
398 Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1);
399 Hex::Hexa* cell = grid2->getHexaIJK (0,0,0);
402 doc->saveVtk ("revolution1.vtk");
407 for (int na=0 ; na<niter ; na++)
409 angles.push_back (alpha);
412 for (int na=1 ; na<niter ; na++)
415 angles.push_back (alpha);
418 Hex::Elements* bloc = doc->revolutionQuads (liste, center, axis, angles);
420 doc->saveVtk ("revolution2.vtk");
424 // ======================================================== test_revolution
425 int test_revolution (int nbargs, cpchar tabargs[])
428 Hex::Document* doc = mon_ex.addDocument ();
430 Hex::Vertex* ori = doc->addVertex (0,0,0);
431 Hex::Vector* vx = doc->addVector (1,0,0);
432 Hex::Vector* vz = doc->addVector (0,0,1);
442 Hex::Elements* grid = doc->makeCylindrical (ori, vx,vz, dr,da,dl,
445 for (int nx=0; nx<nr; nx++)
446 for (int ny=0; ny<na; ny++)
448 Hex::Quad* cell = grid->getQuadIJ (nx, ny, nl);
449 liste.push_back (cell);
450 cell -> setScalar (5);
453 Hex::Vertex* center = doc->addVertex (0, -10, 0);
454 Hex::Vector* axis = doc->addVector (1, 0, 0);
455 Hex::RealVector angles;
457 Hex::Vector* dir1 = doc->addVector (10,0.3,0.3);
458 Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1);
459 Hex::Hexa* cell = grid2->getHexaIJK (0,0,0);
462 doc->saveVtk ("revolution1.vtk");
467 for (int na=0 ; na<niter ; na++)
469 angles.push_back (alpha);
472 for (int na=1 ; na<niter ; na++)
475 angles.push_back (alpha);
478 Hex::Elements* bloc = doc->revolutionQuads (liste, center, axis, angles);
480 doc->saveVtk ("revolution2.vtk");
484 // ======================================================== test_coude
485 int test_coude (int nbargs, cpchar tabargs[])
493 Hex::Document* doc = mon_ex.addDocument ();
495 Hex::Vertex* orig = doc->addVertex (0,0,0);
496 Hex::Vector* vx = doc->addVector (1,0,0);
497 Hex::Vector* vz = doc->addVector (0,0,1);
499 // grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz);
505 Hex::Elements* grid1 = doc->makeCylindrical (orig1, vx,vz,dr,360, dl,
509 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
512 liste.push_back (prems);
513 prems -> setScalar (5);
514 for (int nx=0; nx<dimx; nx++)
517 Hex::Quad* cell = grid1->getQuadIJ (nx, my, dimz);
518 liste.push_back (cell);
519 cell -> setScalar (5);
522 for (int ny=0; ny<dimy; ny++)
525 Hex::Quad* cell = grid1->getQuadIJ (mx, ny, dimz);
526 liste.push_back (cell);
527 cell -> setScalar (5);
531 Hex::Vertex* center = doc->addVertex (0, -10, 0);
532 Hex::Vector* axis = doc->addVector (1, 0, 0);
533 Hex::RealVector angles;
535 Hex::Vector* dir1 = doc->addVector (10,0.3,0.3);
536 Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1);
537 Hex::Hexa* cell = grid2->getHexaIJK (0,0,0);
540 doc->saveVtk ("revolution1.vtk");
545 for (int na=0 ; na<niter ; na++)
547 angles.push_back (alpha);
550 for (int na=1 ; na<niter ; na++)
553 angles.push_back (alpha);
556 Hex::Elements* bloc = doc->revolutionQuads (liste, center, axis, angles);
558 doc->saveVtk ("revolution2.vtk");
562 // ======================================================== test_count
563 int test_count (int nbargs, cpchar tabargs[])
566 Hex::Document* doc = mon_ex.addDocument ();
568 Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0);
569 Hex::Vector* vx = doc->addVector (1,0,0);
570 Hex::Vector* vz = doc->addVector (0,0,1);
577 // Hex::Elements* c1 =
578 doc->makeCylindrical (orig1, vx,vz,dr, 360, dl,nr, 10, nl, false);
580 HexDisplay (doc->countVertex ());
581 HexDisplay (doc->countUsedVertex ());
582 doc ->saveVtk ("hexa1.vtk");
586 // ======================================================== test_decoupage
587 int test_decoupage (int nbargs, cpchar tabargs[])
589 const int size_x = 2;
590 const int size_y = 1;
591 const int size_z = 1;
594 Hex::Document* doc = mon_ex.addDocument ();
596 Hex::Vertex* orig = doc->addVertex (0,0,0);
597 Hex::Vector* dir = doc->addVector (1,1,1);
599 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
600 Hex::Edge* arete = grid->getEdgeK (0, 0, 0);
604 doc ->saveVtk ("decoupe", nvtk);
605 /* Hex::Elements* grid2 = */ doc->cut (arete, 1);
608 doc ->saveVtk ("decoupe", nvtk);
612 // ======================================================== test_gen_xml
613 int test_gen_xml (int nbargs, cpchar tabargs[])
615 const int size_x = 2;
616 const int size_y = 2;
617 const int size_z = 2;
620 Hex::Document* doc = mon_ex.addDocument ();
622 Hex::Vertex* orig = doc->addVertex (0,0,0);
623 Hex::Vector* dir = doc->addVector (1,1,1);
624 // Hex::Elements* grid =
625 doc->makeCartesian (orig, dir, size_x,size_y,size_z);
627 // Hex::Hexa* cell = grid->getHexa (0);
628 // Hex::Quad* face = cell->getQuad (0);
629 // Hex::Edge* arete = cell->getEdge (0);
630 // Hex::Vertex* noeud = cell->getVertex (0);
632 // Hex::Shape* shape1 = new Hex::Shape("riri");
633 // Hex::Shape* shape2 = new Hex::Shape("fifi");
634 // Hex::Shape* shape3 = new Hex::Shape("loulou");
636 // noeud->setAssociation (shape1);
637 // arete->setAssociation (shape2);
638 // face ->setAssociation (shape3);
640 Hex::Law* law1 = doc->addLaw("loi1", 1);
641 Hex::Law* law2 = doc->addLaw("loi2", 2);
642 Hex::Law* law3 = doc->addLaw("loi3", 3);
644 law1->setKind (Hex::Uniform);
645 law2->setKind (Hex::Arithmetic);
646 law3->setKind (Hex::Geometric);
648 Hex::Propagation* prop1 = doc->getPropagation (0);
649 Hex::Propagation* prop2 = doc->getPropagation (1);
650 Hex::Propagation* prop3 = doc->getPropagation (2);
652 prop1->setLaw (law1);
653 prop2->setLaw (law2);
654 prop3->setLaw (law3);
656 prop1->setWay (true);
657 prop2->setWay (false);
658 prop3->setWay (true);
660 doc ->saveVtk ("mini.vtk");
661 doc ->save ("Essai");
665 // ======================================================== test_string_xml
666 int test_string_xml (int nbargs, cpchar tabargs[])
668 const int size_x = 2;
669 const int size_y = 2;
670 const int size_z = 2;
673 Hex::Document* doc = mon_ex.addDocument ();
675 Hex::Vertex* orig = doc->addVertex (0,0,0);
676 Hex::Vector* dir = doc->addVector (1,1,1);
677 // Hex::Elements* grid =
678 doc->makeCartesian (orig, dir, size_x,size_y,size_z);
680 // Hex::Hexa* cell = grid->getHexa (0);
681 // Hex::Quad* face = cell->getQuad (0);
682 // Hex::Edge* arete = cell->getEdge (0);
683 // Hex::Vertex* noeud = cell->getVertex (0);
685 // Hex::Shape* shape1 = new Hex::Shape("riri");
686 // Hex::Shape* shape2 = new Hex::Shape("fifi");
687 // Hex::Shape* shape3 = new Hex::Shape("loulou");
689 // noeud->setAssociation (shape1);
690 // arete->setAssociation (shape2);
691 // face ->setAssociation (shape3);
693 Hex::Law* law1 = doc->addLaw("loi1", 1);
694 Hex::Law* law2 = doc->addLaw("loi2", 2);
695 Hex::Law* law3 = doc->addLaw("loi3", 3);
697 law1->setKind (Hex::Uniform);
698 law2->setKind (Hex::Arithmetic);
699 law3->setKind (Hex::Geometric);
701 Hex::Propagation* prop1 = doc->getPropagation (0);
702 Hex::Propagation* prop2 = doc->getPropagation (1);
703 Hex::Propagation* prop3 = doc->getPropagation (2);
705 prop1->setLaw (law1);
706 prop2->setLaw (law2);
707 prop3->setLaw (law3);
709 prop1->setWay (true);
710 prop2->setWay (false);
711 prop3->setWay (true);
713 doc ->saveVtk ("mini.vtk");
714 doc ->save ("Essai");
716 cpchar flux = doc ->getXml ();
717 Hex::Document* docbis = mon_ex.addDocument ();
718 docbis->setXml (flux);
719 docbis->saveVtk ("clone.vtk");
723 // ======================================================== test_relecture
724 int test_relecture (int nbargs, cpchar tabargs[])
727 cpchar nomdoc = "Essai";
730 Hex::Document* doc = mon_ex.loadDocument (nomdoc);
732 /*********************
733 Hex::Vertex* v4 = doc->findVertex (80.0, 0.0, 0.0);
734 Hex::Vertex* v5 = doc->findVertex (80.0, 0.0, 40.0);
735 Hex::Edge* e4 = doc->findEdge (v4, v5);
742 ***********************/
745 doc ->saveVtk ("restore.vtk");
746 doc ->save ("restore");
748 // doc ->reorderFaces ();
751 // Hex::Elements* grid2 = doc->cut (e4, 2);
754 // ======================================================== test_clone
757 const int size_x = 2;
758 const int size_y = 2;
759 const int size_z = 2;
762 Hex::Document* doc = mon_ex.addDocument ();
764 Hex::Vertex* orig = doc->addVertex (0,0,0);
765 Hex::Vector* dir = doc->addVector (1,1,1);
766 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
768 Hex::Vector* bond = doc->addVector (0, 0, 7);
769 Hex::Elements* grid2 = doc->makeTranslation (grid, bond);
771 doc ->saveVtk ("clonage.vtk");
774 HexDump (grid2->getHexa (1));
775 HexDump (grid2->getHexaIJK (1,1,1));
776 HexDump (grid2->getVertexIJK (1,1,1));
780 // ======================================================== test_separ
783 const int size_x = 2;
784 const int size_y = 2;
785 const int size_z = 2;
788 Hex::Document* doc = mon_ex.addDocument ();
790 Hex::Vertex* orig = doc->addVertex (0,0,0);
791 Hex::Vector* dir = doc->addVector (1,1,1);
792 // Hex::Elements* grid =
793 doc->makeCartesian (orig, dir, size_x,size_y,size_z);
795 doc ->saveVtk ("separ.vtk");
800 // ======================================================== test_shperical
801 int test_spherical (int nbargs, const char* tabargs[])
804 Hex::Document* doc = mon_ex.addDocument ();
806 Hex::Vertex* orig = doc->addVertex (0,0,0);
810 Hex::Elements* grid = doc->makeSpherical (orig, rayon, nbr, 1);
812 int nbhexas = grid->countHexa ();
813 HexDisplay (nbhexas);
814 for (int nro=3 ; nro<nbhexas ; nro +=3)
815 grid->getHexa(nro)->remove();
816 HexDisplay (doc->countHexa ());
817 doc->saveVtk ("shperical.vtk");
822 // ================================================== test_grille_cyl
823 int test_grille_cyl (int nbargs, cpchar tabargs[])
826 Hex::Document* doc = mon_ex.addDocument ();
828 Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0);
829 Hex::Vertex* orig2 = doc->addVertex (10, 0,0);
831 Hex::Vertex* orig3 = doc->addVertex ( 0,10,0);
832 Hex::Vertex* orig4 = doc->addVertex (10,10,0);
834 Hex::Vertex* orig5 = doc->addVertex ( 0,20,0);
835 Hex::Vertex* orig6 = doc->addVertex (10,20,0);
837 Hex::Vector* vz = doc->addVector (0,0,1);
838 Hex::Vector* vx = doc->addVector (1,0,0);
845 doc->makeCylindrical (orig1, vx,vz,dr, 360, dl,nr, 4, nl, true);
847 doc->makeCylindrical (orig2, vx,vz,dr, 360, dl,nr, 8, nl, true);
848 doc->makeCylindrical (orig3, vx,vz,dr, 270, dl,nr, 8, nl, true);
849 doc->makeCylindrical (orig4, vx,vz,dr, 270, dl,nr, 7, nl, true);
850 doc->makeCylindrical (orig5, vx,vz,dr, 360, dl,nr, 5, nl, true);
851 doc->makeCylindrical (orig6, vx,vz,dr, 360, dl,nr, 6, nl, true);
854 c2->getHexa(base2 + 0)->setScalar (5);
855 c2->getHexa(base2 + 1)->setScalar (5);
856 c2->getHexa(base2 + 2)->setScalar (5);
858 doc->saveVtk ("cylindres.vtk");
863 // ===================================================== test_cylindrical
864 int test_cylindrical (int nbargs, cpchar tabargs[])
866 cpchar fic_vtk = "cylindre";
869 Hex::Document* doc = mon_ex.addDocument ();
871 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
872 Hex::Vector* vx = doc->addVector (1, 0, 0);
873 Hex::Vector* vz = doc->addVector (0, 0, 1);
885 na = atoi (tabargs[1]);
893 da = atof (tabargs[2]);
897 // Hex::Cylinder* cyl = doc->addCylinder (orig, vz, nr, nl);
898 // Hex::Elements* grid = doc->makeCylinder (cyl, vx, nr, na, nl);
899 doc->makeCylindrical (orig,vx, vz, dr,da,dl, nr,na, nl, true);
900 doc->saveVtk (fic_vtk, na);
903 // ===================================================== test_cylinder
904 int test_cylinder (int nbargs, cpchar tabargs[])
907 cpchar fic_vtk = "cylindre";
910 Hex::Document* doc = mon_ex.addDocument ();
912 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
913 Hex::Vector* vx = doc->addVector (1, 0, 0);
914 Hex::Vector* vz = doc->addVector (0, 0, 1);
923 Hex::Cylinder* cyl = doc->addCylinder (orig, vz, rayon, hauteur);
924 doc->makeCylinder (cyl, vx, nr, na, nl);
925 doc ->saveVtk (fic_vtk, nvtk);
928 // ===================================================== test_xml_cylinder
929 int test_xml_cylinder (int nbargs, cpchar tabargs[])
932 cpchar fic_vtk = "cylindre";
935 Hex::Document* doc = mon_ex.addDocument ();
937 Hex::Vertex* orig1 = doc->addVertex (0, 0,0);
938 Hex::Vertex* orig2 = doc->addVertex (50,0,0);
939 Hex::Vector* vz = doc->addVector (0,0,1);
940 Hex::Vector* vx = doc->addVector (1,0,0);
944 orig1->setName ("orig1");
945 orig2->setName ("orig2");
953 Hex::Cylinder* cyl = doc->addCylinder (orig1, vz, nr, nl);
954 Hex::Pipe* pipe = doc->addPipe (orig2, vz, nri, nre, nl);
956 Hex::Elements* grid = doc->makeCylinder (cyl, vx, nr, na, nl);
957 doc ->saveVtk (fic_vtk, nvtk);
959 Hex::Group* groupe = doc->addGroup ("GroupeAMA", Hex::HexaCell);
960 groupe->addElement (grid->getHexaIJK (0,0,0));
961 groupe->addElement (grid->getHexaIJK (1,0,0));
962 groupe->addElement (grid->getHexaIJK (0,1,0));
963 groupe->addElement (grid->getHexaIJK (1,1,0));
964 groupe->addElement (grid->getHexaIJK (2,1,0));
966 grid->getHexaIJK (0,0,0)->setName ("Hexa0");
967 grid->getQuadIJ (0,0,0)->setName ("QuadIJ0");
968 grid->getEdgeK (0,0,0)->setName ("EdgeK0");
970 doc->makePipe (pipe, vx, nr, na, nl);
971 doc ->saveVtk (fic_vtk, nvtk);
972 doc->save ("cylindre");
976 // ===================================================== test_pipe
977 int test_pipe (int nbargs, cpchar tabargs[])
980 cpchar fic_vtk = "cylindre";
983 Hex::Document* doc = mon_ex.addDocument ();
985 Hex::Vertex* orig1 = doc->addVertex (0, 0,0);
986 Hex::Vector* vx = doc->addVector (1,0,0);
987 Hex::Vector* vy = doc->addVector (0,1,0);
995 Hex::Pipe* pipe = doc->addPipe (orig1, vx, nri, nre, nl);
996 doc->makePipe (pipe, vy, nr, na, nl);
997 doc ->saveVtk (fic_vtk, nvtk);
1001 // ======================================================== del_hexa
1002 void del_hexa (Hex::CrossElements* gr, int cyl, int ni, int nj, int nk, int dr)
1004 Hex::Hexa* hexa = gr->getHexaIJK (cyl, ni, nj, nk);
1012 // ======================================================== del_tranche
1013 int del_tranche (Hex::CrossElements* grid, int cyl, int ni, int nk, int dr=1)
1015 for (int nj = 0 ; nj < 8 ; nj++)
1016 del_hexa (grid, cyl, ni, nj, nk, dr);
1020 printf ("del_tranche (g=%d, i=%d, k=%d) : fic = %d\n",
1021 cyl, ni, nk, nbr_vtk-1);
1024 // ======================================================== test_joint2
1025 int test_joint2 (int nbargs, cpchar tabargs[])
1028 docu = mon_ex.addDocument ();
1029 case_name = "pb_joint";
1031 Hex::Vector* vx = docu->addVector (1, 0, 0);
1032 Hex::Vector* vz = docu->addVector (0, 0, 1);
1033 Hex::Vertex* hori = docu->addVertex (0, 0, 0);
1043 Hex::Elements *bgrid=NULL, *hgrid=NULL;
1045 hgrid = docu->makeCylindrical (hori, vx,vz, dr,da,dl, nr,na,nl, fill);
1049 Hex::Vertex* bori = docu->addVertex (0, 0, -5);
1050 bgrid = docu->makeCylindrical (bori, vx,vz, dr,da,dl, nr,na,nl, fill);
1053 Hex::Quads qsource, qdest;
1054 printf (" Source = ");
1055 for (int ny=0 ; ny< na ; ny++)
1057 Hex::Quad* quad = hgrid->getQuadIJ (0, ny, 0);
1059 qsource.push_back (quad);
1062 for (int ny=0 ; ny<4 ; ny++)
1064 Hex::Quad* quad = hgrid->getKerHQuad (ny);
1066 qsource.push_back (quad);
1071 printf (" Cible = ");
1072 for (int ny=0 ; ny< na ; ny++)
1074 Hex::Quad* quad = bgrid->getQuadIJ (0, ny, 1);
1076 qdest.push_back (quad);
1079 for (int ny=0 ; ny<4 ; ny++)
1081 Hex::Quad* quad = bgrid->getKerHQuad (ny+4);
1083 qdest.push_back (quad);
1086 docu ->setLevel (1);
1087 Hex::Quad* cible = bgrid->getQuadIJ (0, 1, 1);
1088 Hex::Vertex* vc1 = bgrid->getVertexIJK (0, 1, 1);
1089 Hex::Vertex* vc2 = bgrid->getVertexIJK (1, 1, 1);
1091 Hex::Vertex* vs1 = hgrid->getVertexIJK (0, 0, 0);
1092 Hex::Vertex* vs2 = hgrid->getVertexIJK (1, 0, 0);
1094 docu->joinQuads (qsource, cible, vs1, vc1, vs2, vc2, 1);
1099 // ======================================================== test_croix
1100 int test_croix (int nbargs, cpchar tabargs[])
1103 case_name = "croix";
1104 docu = mon_ex.addDocument (case_name);
1106 Hex::Vertex* ori1 = docu->addVertex ( 0,0,0);
1107 Hex::Vertex* ori2 = docu->addVertex (-5,0,5);
1108 Hex::Vector* vz = docu->addVector ( 0,0,1);
1109 Hex::Vector* vx = docu->addVector ( 1,0,0);
1116 Hex::Cylinder* cyl1 = docu->addCylinder (ori1, vz, r1, l1);
1117 Hex::Cylinder* cyl2 = docu->addCylinder (ori2, vx, r2, l2);
1118 Hex::CrossElements* grid = docu->makeCylinders (cyl1, cyl2);
1121 PutData ((BadElement (grid)));
1124 Hex::Edge* pipo = docu->addEdge (ori1, ori1);
1125 PutData (pipo->isValid());
1126 PutData ((BadElement (pipo)));
1129 del_tranche (grid, 0, 1, 0);
1130 del_tranche (grid, 0, 1, 5);
1132 del_tranche (grid, 1, 1, 0);
1133 del_tranche (grid, 1, 1, 3);
1135 del_tranche (grid, 1, 0, 0);
1136 del_tranche (grid, 1, 0, 3);
1138 del_tranche (grid, 0, 0, 0);
1139 del_tranche (grid, 0, 0, 5);
1140 del_tranche (grid, 0, 0, 1);
1141 del_tranche (grid, 0, 0, 2);
1142 del_tranche (grid, 0, 0, 3);
1143 del_tranche (grid, 0, 0, 4);
1146 del_tranche (grid, 1, 1, 1, 2);
1148 del_tranche (grid, 0, 1, 1, 2);
1149 del_tranche (grid, 0, 1, 4, 2);
1150 del_tranche (grid, 0, 1, 3, 2);
1151 del_tranche (grid, 0, 1, 2, 2);
1153 del_tranche (grid, 1, 1, 2, 2);
1156 // ======================================================== test_croix2
1157 int test_croix2 (int nbargs, cpchar tabargs[])
1160 case_name = "croix";
1161 docu = mon_ex.addDocument (case_name);
1163 Hex::Vertex* pt1 = docu->addVertex ( 0,0,0);
1164 Hex::Vertex* pt2 = docu->addVertex (10,0,0);
1166 Hex::Vector* dx = docu->addVector ( 1,0,0);
1167 Hex::Vector* dy = docu->addVector ( 0,1,0);
1168 Hex::Vector* dz = docu->addVector ( 0,0,1);
1175 Hex::Cylinder* cyl1 = docu->addCylinder (pt1, dx, r1, l1);
1176 Hex::Cylinder* cyl2 = docu->addCylinder (pt2, dz, r2, l2);
1181 Hex::Elements* grid1 = docu->makeCylinder (cyl1, dy, nr, na, nl);
1182 grid1->saveVtk ("cyl_big.vtk");
1183 Hex::Elements* grid2 = docu->makeCylinder (cyl2, dy, nr, na, nl);
1184 grid2->saveVtk ("cyl_small.vtk");
1186 PutData ((BadElement (grid1)));
1187 PutData ((BadElement (grid2)));
1189 Hex::CrossElements* grid = docu->makeCylinders (cyl1, cyl2);
1191 grid->saveVtk ("cyl_all.vtk");
1194 // ======================================================== test_pipes
1195 int test_pipes (int nbargs, cpchar tabargs[])
1198 Hex::Document* doc = mon_ex.addDocument ();
1200 Hex::Vertex* ori1 = doc->addVertex ( 0,0,0);
1201 Hex::Vertex* ori2 = doc->addVertex (-5,0,5);
1202 Hex::Vector* vz = doc->addVector ( 0,0,1);
1203 Hex::Vector* vx = doc->addVector ( 1,0,0);
1205 // double h1 = 5, ri1 = 1, re1 = 2;
1206 double h1 = 10, ri1 = 1, re1 = 2;
1207 double h2 = 10, ri2 = 2, re2 = 3;
1209 Hex::Pipe* pipe1 = doc->addPipe (ori1, vz, ri1, re1, h1);
1210 Hex::Pipe* pipe2 = doc->addPipe (ori2, vx, ri2, re2, h2);
1211 Hex::CrossElements* grid = doc->makePipes (pipe1, pipe2);
1217 del_tranche (grid, 0, 1, 0);
1218 del_tranche (grid, 0, 1, 5);
1220 del_tranche (grid, 1, 1, 0);
1221 del_tranche (grid, 1, 1, 3);
1224 del_tranche (grid, 1, 1, 1, 2);
1226 del_tranche (grid, 0, 1, 1, 2);
1227 del_tranche (grid, 0, 1, 4, 2);
1228 del_tranche (grid, 0, 1, 3, 2);
1229 del_tranche (grid, 0, 1, 2, 2);
1231 del_tranche (grid, 1, 1, 2, 2);
1232 /* ***************************************************
1234 int nbz [2] = { 8, 4 };
1236 for (int cyl = 0 ; cyl < 2 ; cyl++)
1237 for (int nk = 0 ; nk < nbz[cyl] ; nk++)
1238 for (int nj = 0 ; nj < 4 ; nj++)
1241 if (cyl==0) jj = (jj+6) MODULO 8 ;
1242 Hex::Hexa* hexa = grid->getHexaIJK (cyl, ni, jj, nk);
1246 doc->saveVtk (case_name, nbr_vtk);
1249 *************************************************** */
1252 // ======================================================== test_lorraine
1253 int test_lorraine(int nbargs, cpchar tabargs[])
1256 Hex::Document* doc = mon_ex.addDocument ();
1258 Hex::Vertex* ori1 = doc->addVertex ( 0,0,0);
1259 Hex::Vertex* ori2 = doc->addVertex (-5,0,5);
1260 Hex::Vertex* ori3 = doc->addVertex ( 0,0,12);
1261 Hex::Vertex* ori4 = doc->addVertex (-5,0,17);
1263 Hex::Vector* vz = doc->addVector ( 0,0,1);
1264 Hex::Vector* vx = doc->addVector ( 1,0,0);
1273 Hex::Cylinder* cyl1 = doc->addCylinder (ori1, vz, rmoy, nl1);
1274 Hex::Cylinder* cyl2 = doc->addCylinder (ori2, vx, rsmall, nl2);
1276 Hex::Cylinder* cyl3 = doc->addCylinder (ori3, vz, rmoy, nl1);
1277 Hex::Cylinder* cyl4 = doc->addCylinder (ori4, vx, rbig, nl2);
1279 Hex::CrossElements* grid1 = doc->makeCylinders (cyl1, cyl2);
1280 Hex::CrossElements* grid2 = doc->makeCylinders (cyl4, cyl3);
1282 #define Imprimer(x) printf (#x " = ") ; if (x) x->dump() ; else printf ("NULL\n")
1283 const int nx_int = 0;
1284 const int nx_ext = 1;
1286 // vc2 = grid1->getVertexIJK (Hex::CylBig, 0,0,0);
1287 // vc3 = grid2->getVertexIJK (Hex::CylSmall, 0,0,0);
1289 Hex::Quad* qb = grid1-> getQuadIJ (Hex::CylBig, nx_ext, Hex::S_E, 4);
1290 Hex::Quad* qh = grid2-> getQuadIJ (Hex::CylSmall, nx_ext, Hex::S_N, 0);
1292 Hex::Vertex* vb0 = qb->getVertex (3);
1293 Hex::Vertex* vb1 = qb->getVertex (2);
1294 Hex::Vertex* vh0 = qh->getVertex (0);
1295 Hex::Vertex* vh1 = qh->getVertex (1);
1297 vb0 = grid1->getVertexIJK (Hex::CylBig, 2, Hex::S_E, 4); // cible
1298 vb1 = grid1->getVertexIJK (Hex::CylBig, 2, Hex::S_NE, 4);
1299 vh0 = grid2->getVertexIJK (Hex::CylSmall, 2, Hex::S_N, 0); // depart
1300 vh1 = grid2->getVertexIJK (Hex::CylSmall, 2, Hex::S_NW, 0);
1311 hliste.push_back (qh);
1312 for (int ny=1; ny<Hex::S_MAXI; ny++)
1314 int ns = (ny + Hex::S_N) MODULO Hex::S_MAXI;
1315 hliste.push_back (grid2->getQuadIJ (Hex::CylSmall, nx_ext, ns, 0));
1318 for (int ny=0; ny<4 ; ny++)
1319 hliste.push_back (grid2->getQuadIJ (Hex::CylSmall, nx_int, ny, 0));
1322 doc->joinQuads (hliste, qb, vh0, vb0, vh1, vb1, hauteur);
1323 doc->saveVtk ("lorraine.vtk");
1328 // ======================================================== test_disconnect2
1329 // === Disconnect Edge seul
1330 int test_disconnect2 (int nbargs, cpchar tabargs[])
1332 const int size_x = 2;
1333 const int size_y = 2;
1334 const int size_z = 1;
1337 Hex::Document* doc = mon_ex.addDocument ();
1338 Hex::Elements* grid2 = doc->makeCartesianTop (size_x,size_y,size_z);
1343 Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0);
1344 Hex::Edge* edge = grid2->getEdgeK (1,2,0);
1346 hexa2->setColor (2);
1349 doc->saveVtk ("test_disco", nvtk);
1353 Hex::Elements* disco_edges = doc->disconnectEdge (hexa2, edge);
1354 HexDisplay (disco_edges->countVertex());
1355 HexDisplay (disco_edges->countEdge());
1356 HexDisplay (disco_edges->countQuad());
1357 HexDisplay (disco_edges->countHexa());
1359 doc->saveVtk ("test_disco", nvtk);
1360 doc->save ("test_disco");
1362 // hexa2->dumpFull ();
1364 // doc->setLevel (4);
1367 // ======================================================== test_disconnect4
1368 // === Disconnect Edges
1369 int test_disconnect4 (int nbargs, cpchar tabargs[])
1371 const int size_x = 1;
1372 const int size_y = 2;
1373 const int size_z = 2;
1376 Hex::Document* doc = mon_ex.addDocument ();
1378 Hex::Vertex* orig2 = doc->addVertex (0,0,0);
1379 Hex::Vector* vx = doc->addVector (1,0,0);
1380 Hex::Vector* vy = doc->addVector (0,1,0);
1381 Hex::Vector* vz = doc->addVector (0,0,1);
1382 Hex::Elements* grid2 = doc->makeCartesian (orig2, vx,vy,vz, size_x,size_y,size_z);
1389 for (int nk=0 ; nk< size_z; nk++)
1391 Hex::Hexa* hexa2 = grid2->getHexaIJK (0,0,nk);
1392 Hex::Edge* edge = grid2->getEdgeK (0,1,nk);
1394 hexa2->setScalar (2);
1395 edge->setScalar (5);
1396 t_hexas.push_back (hexa2);
1397 t_edges.push_back (edge);
1403 doc->saveVtk ("test_disco", nvtk);
1404 /* Hex::Elements* disco_edges = */ doc->disconnectEdges (t_hexas, t_edges);
1405 doc->saveVtk ("test_disco", nvtk);
1407 // hexa2->dumpFull ();
1412 // ======================================================== test_disconnect1
1413 // ==== Disconnect Quad
1414 int test_disconnect1 (int nbargs, cpchar tabargs[])
1416 const int size_x = 2;
1417 const int size_y = 2;
1418 const int size_z = 1;
1421 Hex::Document* doc = mon_ex.addDocument ();
1423 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
1424 Hex::Vector* dir = doc->addVector (1,1,1);
1425 Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z);
1429 Hex::Matrix matrice;
1430 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
1431 matrice.defTranslation (ecart);
1433 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
1434 Hex::Quad* quad = grid1->getQuadJK (1,1,0);
1436 quad->setScalar (5);
1438 doc->saveVtk ("test_disco", nvtk);
1439 doc->disconnectQuad (hexa1, quad);
1440 // hexa1 ->transform (&matrice);
1441 doc->saveVtk ("test_disco", nvtk);
1443 // doc->dumpPropagation ();
1446 doc->save ("disco_all");
1449 // ======================================================== test_disconnect3
1450 // ==== disconnectVertex
1451 int test_disconnect3 (int nbargs, cpchar tabargs[])
1453 const int size_x = 2;
1454 const int size_y = 2;
1455 const int size_z = 1;
1458 Hex::Document* doc = mon_ex.addDocument ();
1460 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
1462 Hex::Vector* dir = doc->addVector (1,1,1);
1463 Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z);
1467 Hex::Matrix matrice;
1468 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
1469 matrice.defTranslation (ecart);
1471 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
1472 Hex::Vertex* vertex = grid1->getVertexIJK (1,1,1);
1474 vertex->setScalar (5);
1476 doc->saveVtk ("test_disco", nvtk);
1478 doc->disconnectVertex (hexa1, vertex);
1479 // hexa1->transform (&matrice);
1480 doc->saveVtk ("test_disco", nvtk);
1482 // doc->dumpPropagation ();
1485 doc->save ("disco_all");
1488 // ======================================================== contraction
1489 void contraction (Hex::Hexa* hexa, Hex::Elements* grid)
1492 Hex::Real3 cg = { 0, 0, 0 };
1494 for (int nro=0; nro<Hex::HV_MAXI ; nro++)
1496 cg [0] += hexa->getVertex(nro)->getX()/Hex::HV_MAXI;
1497 cg [1] += hexa->getVertex(nro)->getY()/Hex::HV_MAXI;
1498 cg [2] += hexa->getVertex(nro)->getZ()/Hex::HV_MAXI;
1501 int nbvertex = grid->countVertex();
1502 const double coeff = 0.5;
1503 for (int nro=0; nro<nbvertex ; nro++)
1505 Hex::Vertex* pv = grid->getVertex(nro);
1506 Hex::Real3 pold = { pv->getX(), pv->getY(), pv->getZ() };
1508 for (int dd=0; dd<3 ; dd++)
1509 pnew [dd] = cg[dd] + coeff * (pold[dd]-cg[dd]);
1516 // ======================================================== test_disconnect
1517 // ==== Les 3 disconnect
1518 int test_disconnect (int nbargs, cpchar tabargs[])
1520 const int size_x = 2;
1521 const int size_y = 2;
1522 const int size_z = 1;
1525 Hex::Document* doc = mon_ex.addDocument ();
1527 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
1528 Hex::Vertex* orig2 = doc->addVertex (4,0,0);
1529 Hex::Vertex* orig3 = doc->addVertex (8,0,0);
1531 Hex::Vector* vx = doc->addVector (1,0,0);
1532 Hex::Vector* vy = doc->addVector (0,1,0);
1533 Hex::Vector* vz = doc->addVector (0,0,1);
1534 double dx=1, dy=1, dz=1;
1536 Hex::Elements* grid1 = doc->makeCartesianUni (orig1, vx,vy,vz, dx,dy,dz,
1537 size_x,size_y,size_z);
1538 Hex::Elements* grid2 = doc->makeCartesianUni (orig2, vx,vy,vz, dx,dy,dz,
1539 size_x,size_y,size_z);
1540 Hex::Elements* grid3 = doc->makeCartesianUni (orig3, vx,vy,vz, dx,dy,dz,
1541 size_x,size_y,size_z);
1545 Hex::Matrix matrice;
1546 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
1547 matrice.defTranslation (ecart);
1549 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
1550 Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0);
1551 Hex::Hexa* hexa3 = grid3->getHexaIJK (1,1,0);
1553 Hex::Quad* quad = grid1->getQuadJK (1,1,0);
1554 Hex::Edge* edge = grid2->getEdgeK (1,2,0);
1555 Hex::Vertex* vertex = grid3->getVertexIJK (1,1,1);
1557 quad->setScalar (5);
1558 edge->setScalar (5);
1559 vertex->setScalar (5);
1561 doc->saveVtk ("test_disco", nvtk);
1562 doc->disconnectQuad (hexa1, quad);
1563 doc->saveVtk ("test_disco", nvtk);
1565 doc->disconnectEdge (hexa2, edge);
1566 doc->saveVtk ("test_disco", nvtk);
1568 doc->disconnectVertex (hexa3, vertex);
1569 doc->saveVtk ("test_disco", nvtk);
1571 // doc->dumpPropagation ();
1574 doc->save ("disco_all");
1577 // ======================================================== test_propagation
1578 int test_propagation ()
1580 const int size_x = 2;
1581 const int size_y = 1;
1582 const int size_z = 1;
1585 Hex::Document* doc = mon_ex.addDocument ();
1587 Hex::Vertex* orig = doc->addVertex (0,0,0);
1588 Hex::Vector* dir = doc->addVector (1,1,1);
1589 // Hex::Elements* grid =
1590 doc->makeCartesian (orig, dir, size_x,size_y,size_z);
1592 int nb = doc->countPropagation ();
1593 for (int nro=0 ; nro<nb ; nro++)
1595 Hex::Propagation* prop = doc ->getPropagation (nro);
1596 const Hex::Edges& table = prop->getEdges ();
1597 printf (" ____________________________________ Prop nro %d\n", nro);
1598 for (int ned=0 ; ned<(int)table.size() ; ned++)
1600 bool way = table [ned]->getWay ();
1605 table [ned]->getVertex (0)->printName (", ");
1606 table [ned]->getVertex (1)->printName (")\n");
1611 table [ned]->getVertex (1)->printName (", ");
1612 table [ned]->getVertex (0)->printName (")\n");
1618 doc->saveVtk ("test_propagation.vtk");
1619 doc->save ("test_propagation");
1623 // ======================================================== test_move
1626 const int size_x = 1;
1627 const int size_y = 1;
1628 const int size_z = 2;
1631 Hex::Document* doc = mon_ex.addDocument ();
1633 Hex::Vertex* orig = doc->addVertex (0,0,0);
1634 Hex::Vector* dir = doc->addVector (1,1,1);
1635 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
1637 Hex::Vector* enhaut = doc->addVector (0, 0, 5);
1638 Hex::Vector* devant = doc->addVector (5, 0, 0);
1639 // Hex::Vector* agauche = doc->addVector (0, 5, 0);
1641 Hex::Matrix matrice;
1642 matrice.defTranslation (enhaut);
1644 Hex::Hexa* cube = grid->getHexa (1);
1645 Hex::Quad* dessous = cube->getQuad (Hex::Q_A);
1648 Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
1649 /* Hex::Elements* grid3 = doc->makeTranslation (grid, agauche); */
1650 Hex::Hexa* cube2 = grid2->getHexa (1);
1652 doc ->saveVtk ("move0.vtk");
1654 cube ->disconnectQuad (dessous);
1655 cube ->transform (&matrice);
1656 cube2->transform (&matrice);
1658 doc ->saveVtk ("move1.vtk");
1663 // ======================================================== test_transfo2
1664 int test_transfo2 (int nbargs, cpchar tabargs[])
1666 const int size_x = 1;
1667 const int size_y = 1;
1668 const int size_z = 2;
1671 cpchar fic_vtk = "transfo";
1674 Hex::Document* doc = mon_ex.addDocument ();
1677 Hex::Vertex* orig = doc->addVertex (0,0,0);
1678 Hex::Vector* dir = doc->addVector (1,1,1);
1679 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x, size_y,
1686 doc ->saveVtk (fic_vtk, nvtk);
1688 Hex::Vector* devant = doc->addVector (5, 0, 0);
1690 Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
1693 doc ->saveVtk (fic_vtk, nvtk);
1695 Hex::Elements* grid3 = doc->makeScale (grid2, orig, 2);
1698 doc ->saveVtk (fic_vtk, nvtk);
1700 Hex::Elements* grid4 = doc->makeRotation (grid2, orig, dir, 45);
1703 doc ->saveVtk (fic_vtk, nvtk);
1705 Hex::Elements* grid5 = doc->makeSymmetryPoint (grid4, orig);
1709 doc ->saveVtk (fic_vtk, nvtk);
1711 Hex::Vector* dir1 = doc->addVector (1,0,0);
1712 Hex::Elements* grid6 = doc->makeSymmetryLine (grid4, orig, dir1);
1716 grid4->getHexa(0)->getVertex(0)->setScalar(3);
1717 grid6->getHexa(0)->getVertex(0)->setScalar(3);
1718 doc ->saveVtk (fic_vtk, nvtk);
1720 grid4->getHexa(0)->getVertex(0)->setScalar(0);
1721 grid6->getHexa(0)->getVertex(0)->setScalar(0);
1723 Hex::Elements* grid7 = doc->makeSymmetryLine (grid2, orig, dir1);
1727 grid2->getHexa(0)->getVertex(0)->setScalar(4);
1728 grid7->getHexa(0)->getVertex(0)->setScalar(4);
1729 doc ->saveVtk (fic_vtk, nvtk);
1731 grid2->getHexa(0)->getVertex(0)->setScalar(0);
1732 grid7->getHexa(0)->getVertex(0)->setScalar(0);
1734 Hex::Elements* grid8 = doc->makeSymmetryPlane (grid2, orig, dir1);
1738 grid2->getHexa(0)->getVertex(0)->setScalar(4);
1739 grid8->getHexa(0)->getVertex(0)->setScalar(4);
1740 doc ->saveVtk (fic_vtk, nvtk);
1741 grid2->getHexa(0)->getVertex(0)->setScalar(0);
1742 grid8->getHexa(0)->getVertex(0)->setScalar(0);
1744 Hex::Elements* grid9 = doc->makeSymmetryPlane (grid3, orig, dir);
1748 grid3->getHexa(0)->getVertex(0)->setScalar(4);
1749 grid9->getHexa(0)->getVertex(0)->setScalar(4);
1750 doc ->saveVtk (fic_vtk, nvtk);
1752 grid9->getHexa(0)->removeConnected ();
1753 doc ->saveVtk (fic_vtk, nvtk);
1757 // ======================================================== test_transfo
1758 int test_transfo (int nbargs, cpchar tabargs[])
1761 cpchar fic_vtk = "transfo";
1764 Hex::Document* doc = mon_ex.addDocument ();
1767 Hex::Vertex* orig = doc->addVertex (0,0,0);
1768 Hex::Vector* vx = doc->addVector (1,0,0);
1769 Hex::Vector* vz = doc->addVector (0,0,1);
1776 Hex::Elements* grid = doc->makeCylindrical (orig, vx,vz, dr, da, dl,
1781 doc ->saveVtk (fic_vtk, nvtk);
1782 Hex::Vector* devant = doc->addVector (10, 0, 0);
1784 Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
1787 doc ->saveVtk (fic_vtk, nvtk);
1791 // ======================================================== test_copy_document
1792 int test_copy_document (int nbargs, cpchar tabargs[])
1795 Hex::Document* doc = mon_ex.loadDocument ("Essai");
1796 doc ->saveVtk ("restore1.vtk");
1798 Hex::Document* clone = doc->copyDocument();
1799 clone->saveVtk ("restore2.vtk");
1803 // ======================================================== test_remove
1806 const int size_x = 2;
1807 const int size_y = 2;
1808 const int size_z = 2;
1811 Hex::Document* doc = mon_ex.addDocument ();
1813 Hex::Vertex* orig = doc->addVertex (0,0,0);
1814 Hex::Vertex* orig1 = doc->addVertex (6,0,0);
1815 Hex::Vector* dir = doc->addVector (1,1,1);
1816 Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
1817 doc->makeCartesian (orig1, dir, 1,1,1);
1818 doc->saveVtk ("removeConn1.vtk");
1820 Echo ("--------- Avant destruction");
1821 HexDisplay (doc->countVertex ());
1822 HexDisplay (doc->countEdge ());
1823 HexDisplay (doc->countQuad ());
1824 HexDisplay (doc->countHexa ());
1825 HexDisplay (doc->countUsedVertex ());
1826 HexDisplay (doc->countUsedEdge ());
1827 HexDisplay (doc->countUsedQuad ());
1828 HexDisplay (doc->countUsedHexa ());
1831 doc->removeConnectedHexa (grid->getHexaIJK (0,0,0));
1833 Echo ("--------- Apres destruction");
1834 HexDisplay (doc->countVertex ());
1835 HexDisplay (doc->countEdge ());
1836 HexDisplay (doc->countQuad ());
1837 HexDisplay (doc->countHexa ());
1839 HexDisplay (doc->countUsedVertex ());
1840 HexDisplay (doc->countUsedEdge ());
1841 HexDisplay (doc->countUsedQuad ());
1842 HexDisplay (doc->countUsedHexa ());
1843 doc->saveVtk ("removeConn2.vtk");
1847 // ================================================== init_vec
1848 void init_vec (Hex::RealVector& tab, double n0=0, double n1=0, double n2=0,
1849 double n3=0, double n4=0, double n5=0, double n6=0,
1850 double n7=0, double n8=0, double n9=0, double n10=0,
1851 double n11=0, double n12=0, double n13=0, double n14=0,
1852 double n15=0, double n16=0)
1854 if (n0>0.0) tab.push_back (n0);
1855 if (n1>0.0) tab.push_back (n1);
1856 if (n2>0.0) tab.push_back (n2);
1857 if (n3>0.0) tab.push_back (n3);
1858 if (n4>0.0) tab.push_back (n4);
1859 if (n5>0.0) tab.push_back (n5);
1860 if (n6>0.0) tab.push_back (n6);
1861 if (n7>0.0) tab.push_back (n7);
1862 if (n8>0.0) tab.push_back (n8);
1863 if (n9>0.0) tab.push_back (n9);
1865 if (n10>0.0) tab.push_back (n10);
1866 if (n11>0.0) tab.push_back (n11);
1867 if (n12>0.0) tab.push_back (n12);
1868 if (n13>0.0) tab.push_back (n13);
1869 if (n14>0.0) tab.push_back (n14);
1870 if (n15>0.0) tab.push_back (n15);
1871 if (n16>0.0) tab.push_back (n16);
1873 // ================================================== test_cylindricals
1874 int test_cylindricals (int nbargs, cpchar tabargs[])
1877 Hex::Document* doc = mon_ex.addDocument ();
1879 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
1880 Hex::Vector* vz = doc->addVector (0, 0, 1);
1881 Hex::Vector* vx = doc->addVector (1 ,0, 0);
1883 Hex::RealVector tdr, tda, tdl;
1886 init_vec (tdr, 2, 1, 0.5);
1887 init_vec (tda, 40, 35, 30, 25, 20, 15, 10, 5,
1888 5, 10, 15, 20, 25, 30, 35, 40);
1889 init_vec (tdl, 1, 2, 3 );
1891 init_vec (tdr, 1, 1, 1, 1);
1892 init_vec (tda, 45,45, 45,45, 45,45, 45,45 );
1893 init_vec (tdl, 1, 1, 1 );
1895 ****************** */
1898 init_vec (tdr, 1, 2, 1, 2);
1899 init_vec (tda, 20, 20, 20 );
1902 Hex::Elements* grid=doc->makeCylindricals (orig, vx,vz, tdr,tda,tdl, false);
1904 doc->saveVtk ("cylindricals.vtk");
1906 grid->clearAssociation();
1907 doc->clearAssociation();
1910 // ======================================================== test_edge
1911 int test_edge (int nbargs, cpchar tabargs[])
1914 Hex::Document* doc = mon_ex.addDocument ();
1916 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
1917 Hex::Vector* vx = doc->addVector (1 ,0, 0);
1918 doc->addEdgeVector (orig, vx);
1920 HexDisplay (doc->countVertex());
1921 HexDisplay (doc->countEdge());
1925 // ======================================================== test_hexa
1926 int test_hexa (int nbargs, cpchar tabargs[])
1930 Hex::Document* doc1 = mon_ex.loadDocument ("bielle_triang");
1931 Hex::Document* doc2 = mon_ex.loadDocument ("bielle_triang");
1932 PutData (doc1->getName ());
1933 PutData (doc2->getName ());
1938 ier = test_cylindricals (nbargs, tabargs);
1939 ier = test_transfo (nbargs, tabargs);