2 // C++ : Tests unitaires
4 // Copyright (C) 2009-2019 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, or (at your option) any later version.
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 "test_unit.hxx"
26 #include "HexDocument.hxx"
27 #include "HexElements.hxx"
29 #include "HexHexa.hxx"
30 #include "HexQuad.hxx"
31 #include "HexEdge.hxx"
32 #include "HexVertex.hxx"
34 #include "HexPropagation.hxx"
36 #include "HexMatrix.hxx"
37 #include "HexCramer.hxx"
38 #include "HexGroup.hxx"
43 static int nbr_vtk = 0;
44 static cpchar case_name = "hexa";
45 static Hex::Document* docu = NULL;
47 // ======================================================== print_propagations
48 void print_propagations (Hex::Document* doc)
50 int nb = doc->countPropagation ();
52 for (int nro=0 ; nro<nb ; nro++)
54 Hex::Propagation* prop = doc ->getPropagation (nro);
55 const Hex::Edges& table = prop->getEdges ();
56 printf (" ____________________________________ Prop nro %d\n", nro);
57 for (int ned=0 ; ned<(int)table.size() ; ned++)
59 bool way = table [ned]->getWay ();
60 Hex::Edge* edge = table [ned];
61 Hex::Vertex* v0 = edge->getVertex (0);
62 Hex::Vertex* v1 = edge->getVertex (1);
68 v1->printName (")\n");
73 v0->printName (")\n");
79 // ======================================================== save_vtk
85 docu->saveVtk (case_name, nbr_vtk);
87 // ======================================================== remove_hexa
88 void remove_hexa (Hex::Hexa* hexa)
98 docu->saveVtk (case_name, nbr_vtk);
100 // ======================================================== test_sphere
101 int test_sphere (int nbargs, cpchar tabargs[])
104 Hex::Document* doc = mon_ex.addDocument ();
108 Hex::Elements* sphere = doc->makeSphericalTop (ncouches, k);
112 for (int nc=0 ; nc <= ncouches ; nc++)
114 Hex::Hexa* cell = sphere->getStrate (nc, Hex::Q_A);
118 // sphere->getStrate (nc, Hex::Q_A)->remove ();
119 // sphere->getStrate (nc, Hex::Q_B)->remove ();
123 sphere->saveVtk ("sphere.vtk");
126 // ======================================================== test_cartesi1
129 const int size_x = 15;
130 const int size_y = 12;
131 const int size_z = 8;
134 Hex::Document* doc = mon_ex.addDocument ();
136 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
138 // print_propagations (doc);
140 for (int nz=0; nz<size_z ; nz++)
141 for (int ny=nz+1; ny<size_y-nz-1 ; ny++)
142 for (int nx=nz+1; nx<size_x-nz-1 ; nx++)
144 Hex::Hexa* cell = grid->getHexaIJK (nx, ny, nz);
149 print_propagations (doc);
150 grid->saveVtk ("grid_cart.vtk");
155 // ======================================================== afficher
156 #define Afficher(elt) afficher (#elt, elt)
157 int afficher (cpchar nom, Hex::EltBase* elt)
161 printf (" .... %s = 0x0\n", nom);
165 printf (" .... %s = 0x%08lx = %03d\n", nom, (unsigned long) elt, elt->getId());
168 // ======================================================== test_find
171 const int size_x = 2;
172 const int size_y = 2;
173 const int size_z = 2;
176 Hex::Document* doc = mon_ex.addDocument ();
178 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
180 grid->saveVtk ("mini1.vtk");
183 Hex::Vertex *v00, *v02, *v06, *v08, *v10, *v22, *v26;
185 Afficher ( v00 = doc->findVertex (0, 0, 0));
186 Afficher ( v02 = doc->findVertex (1, 1, 0));
187 Afficher ( v06 = doc->findVertex (1, 1, 1));
188 Afficher ( v08 = doc->findVertex (2, 1, 0));
189 Afficher ( v10 = doc->findVertex (2, 1, 1));
190 Afficher ( v22 = doc->findVertex (2, 1, 2));
191 Afficher ( v26 = doc->findVertex (2, 2, 2));
195 Afficher (doc->findEdge (v06, v10));
196 Afficher (doc->findEdge (v10, v06));
199 Afficher (doc->findQuad (v02, v10));
200 Afficher (doc->findQuad (v06, v08));
201 Afficher (doc->findQuad (v02, v06));
204 Afficher (doc->findHexa (v00, v06));
205 Afficher (doc->findHexa (v06, v26));
206 Afficher (doc->findHexa (v26, v06));
210 // ======================================================== test_joint
211 int test_joint (int nbargs, cpchar tabargs[])
218 Hex::Document* doc = mon_ex.addDocument ();
220 Hex::Elements* grid1 = doc->makeCartesianTop (dimx,dimy,dimz);
222 Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8);
223 Hex::Vector* vectj = doc->addVector (0,1,0);
224 Hex::Vector* vecti = doc->addVector (1,0,0);
225 Hex::Elements* grid2 = doc->makeCylinderUni (orig2, vecti, vectj,
226 1, 180, 1, dimz,dimy,dimx, true);
230 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
231 Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my);
233 Hex::Vertex* v1 = prems->getVertex (0);
234 Hex::Vertex* v3 = prems->getVertex (1);
236 Hex::Vertex* v2 = cible->getVertex (1);
237 Hex::Vertex* v4 = cible->getVertex (2);
239 // v1->setScalar (3);
240 // v2->setScalar (3);
241 // v3->setScalar (6);
242 // v4->setScalar (6);
246 liste.push_back (prems);
247 for (int nx=0; nx<dimx; nx++)
249 liste.push_back (grid1->getQuadIJ (nx, my, dimz));
251 for (int ny=0; ny<dimy; ny++)
253 liste.push_back (grid1->getQuadIJ (mx, ny, dimz));
255 doc->saveVtk ("joint1.vtk");
256 const int hauteur = 5;
257 Hex::Elements* joint = doc->joinQuadsUni(liste,cible, v1,v2,v3,v4, hauteur);
258 // for (int nh=0 ; nh<hauteur ; nh++) joint->getHexa(nh)->setScalar (5);
260 int nbr_joint_vertex = joint->countVertex ();
261 int nbr_surf_vertex = nbr_joint_vertex/(hauteur+1);
263 HexDisplay (nbr_joint_vertex);
264 HexDisplay (nbr_surf_vertex);
266 int indice0 = joint->findVertex (v1);
267 HexDisplay (indice0);
269 for (int nh=0 ; nh<nbr_surf_vertex ; nh++)
270 joint->getVertex(nh)->setScalar (5);
272 for (int nh=0 ; nh<=hauteur ; nh++)
273 joint->getVertex(nh*nbr_surf_vertex)->setScalar (3);
275 doc->saveVtk ("joint2.vtk");
278 // ======================================================== test_count
279 int test_count (int nbargs, cpchar tabargs[])
282 Hex::Document* doc = mon_ex.addDocument ();
287 // Hex::Elements* c1 =
288 doc->makeCylinderTop (nr, 10, nl);
290 HexDisplay (doc->countVertex ());
291 HexDisplay (doc->countUsedVertex ());
292 doc ->saveVtk ("hexa1.vtk");
296 // ======================================================== test_decoupage
297 int test_decoupage (int nbargs, cpchar tabargs[])
299 const int size_x = 2;
300 const int size_y = 1;
301 const int size_z = 1;
304 Hex::Document* doc = mon_ex.addDocument ();
306 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
307 Hex::Edge* arete = grid->getEdgeK (0, 0, 0);
311 doc ->saveVtk ("decoupe", nvtk);
312 /* Hex::Elements* grid2 = */ doc->cutUni (arete, 1);
315 doc ->saveVtk ("decoupe", nvtk);
319 // ======================================================== test_gen_xml
320 int test_gen_xml (int nbargs, cpchar tabargs[])
322 const int size_x = 2;
323 const int size_y = 2;
324 const int size_z = 2;
327 Hex::Document* doc = mon_ex.addDocument ();
329 // Hex::Elements* grid =
330 doc->makeCartesianTop (size_x,size_y,size_z);
332 // Hex::Hexa* cell = grid->getHexa (0);
333 // Hex::Quad* face = cell->getQuad (0);
334 // Hex::Edge* arete = cell->getEdge (0);
335 // Hex::Vertex* noeud = cell->getVertex (0);
337 // Hex::Shape* shape1 = new Hex::Shape("riri");
338 // Hex::Shape* shape2 = new Hex::Shape("fifi");
339 // Hex::Shape* shape3 = new Hex::Shape("loulou");
341 // noeud->setAssociation (shape1);
342 // arete->setAssociation (shape2);
343 // face ->setAssociation (shape3);
345 Hex::Law* law1 = doc->addLaw("loi1", 1);
346 Hex::Law* law2 = doc->addLaw("loi2", 2);
347 Hex::Law* law3 = doc->addLaw("loi3", 3);
349 law1->setKind (Hex::Uniform);
350 law2->setKind (Hex::Arithmetic);
351 law3->setKind (Hex::Geometric);
353 Hex::Propagation* prop1 = doc->getPropagation (0);
354 Hex::Propagation* prop2 = doc->getPropagation (1);
355 Hex::Propagation* prop3 = doc->getPropagation (2);
357 prop1->setLaw (law1);
358 prop2->setLaw (law2);
359 prop3->setLaw (law3);
361 prop1->setWay (true);
362 prop2->setWay (false);
363 prop3->setWay (true);
365 doc ->saveVtk ("mini.vtk");
366 doc ->save ("Essai");
370 // ======================================================== test_string_xml
371 int test_string_xml (int nbargs, cpchar tabargs[])
373 const int size_x = 2;
374 const int size_y = 2;
375 const int size_z = 2;
378 Hex::Document* doc = mon_ex.addDocument ();
380 // Hex::Elements* grid =
381 doc->makeCartesianTop (size_x,size_y,size_z);
383 Hex::Law* law1 = doc->addLaw("loi1", 1);
384 Hex::Law* law2 = doc->addLaw("loi2", 2);
385 Hex::Law* law3 = doc->addLaw("loi3", 3);
387 law1->setKind (Hex::Uniform);
388 law2->setKind (Hex::Arithmetic);
389 law3->setKind (Hex::Geometric);
391 Hex::Propagation* prop1 = doc->getPropagation (0);
392 Hex::Propagation* prop2 = doc->getPropagation (1);
393 Hex::Propagation* prop3 = doc->getPropagation (2);
395 prop1->setLaw (law1);
396 prop2->setLaw (law2);
397 prop3->setLaw (law3);
399 prop1->setWay (true);
400 prop2->setWay (false);
401 prop3->setWay (true);
403 doc ->saveVtk ("mini.vtk");
404 doc ->save ("Essai");
406 cpchar flux = doc ->getXml ();
407 Hex::Document* docbis = mon_ex.addDocument ();
408 docbis->setXml (flux);
409 docbis->saveVtk ("clone.vtk");
413 // ======================================================== test_relecture
414 int test_relecture (int nbargs, cpchar tabargs[])
417 cpchar nomdoc = "Essai";
420 Hex::Document* doc = mon_ex.loadDocument (nomdoc);
422 /*********************
423 Hex::Vertex* v4 = doc->findVertex (80.0, 0.0, 0.0);
424 Hex::Vertex* v5 = doc->findVertex (80.0, 0.0, 40.0);
425 Hex::Edge* e4 = doc->findEdge (v4, v5);
432 ***********************/
435 doc ->saveVtk ("restore.vtk");
436 doc ->save ("restore");
438 // doc ->reorderFaces ();
441 // Hex::Elements* grid2 = doc->cut (e4, 2);
444 // ======================================================== test_clone
447 const int size_x = 2;
448 const int size_y = 2;
449 const int size_z = 2;
452 Hex::Document* doc = mon_ex.addDocument ();
454 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
455 Hex::Vector* bond = doc->addVector (0, 0, 7);
456 Hex::Elements* grid2 = doc->makeTranslation (grid, bond);
458 doc ->saveVtk ("clonage.vtk");
461 HexDump (grid2->getHexa (1));
462 HexDump (grid2->getHexaIJK (1,1,1));
463 HexDump (grid2->getVertexIJK (1,1,1));
467 // ======================================================== test_separ
470 const int size_x = 2;
471 const int size_y = 2;
472 const int size_z = 2;
475 Hex::Document* doc = mon_ex.addDocument ();
477 doc->makeCartesianTop (size_x,size_y,size_z);
479 doc ->saveVtk ("separ.vtk");
484 // ======================================================== test_shperical
485 int test_spherical (int nbargs, const char* tabargs[])
488 Hex::Document* doc = mon_ex.addDocument ();
492 Hex::Elements* grid = doc->makeSphericalTop (nbr, 1);
494 int nbhexas = grid->countHexa ();
495 HexDisplay (nbhexas);
496 for (int nro=3 ; nro<nbhexas ; nro +=3)
497 grid->getHexa(nro)->remove();
498 HexDisplay (doc->countHexa ());
499 doc->saveVtk ("shperical.vtk");
504 // ================================================== test_grille_cyl
505 int test_grille_cyl (int nbargs, cpchar tabargs[])
508 Hex::Document* doc = mon_ex.addDocument ();
510 Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0);
511 Hex::Vertex* orig2 = doc->addVertex (10, 0,0);
513 Hex::Vertex* orig3 = doc->addVertex ( 0,10,0);
514 Hex::Vertex* orig4 = doc->addVertex (10,10,0);
516 Hex::Vertex* orig5 = doc->addVertex ( 0,20,0);
517 Hex::Vertex* orig6 = doc->addVertex (10,20,0);
519 Hex::Vector* vz = doc->addVector (0,0,1);
520 Hex::Vector* vx = doc->addVector (1,0,0);
528 doc->makeCylinderUni (orig1, vx,vz, rint,rext, 360,dl,nr, 4, nl);
530 doc->makeCylinderUni (orig2, vx,vz, rint,rext, 360,dl,nr, 8, nl);
531 doc->makeCylinderUni (orig3, vx,vz, rint,rext, 270,dl,nr, 8, nl);
532 doc->makeCylinderUni (orig4, vx,vz, rint,rext, 270,dl,nr, 7, nl);
533 doc->makeCylinderUni (orig5, vx,vz, rint,rext, 360,dl,nr, 5, nl);
534 doc->makeCylinderUni (orig6, vx,vz, rint,rext, 360,dl,nr, 6, nl);
537 c2->getHexa(base2 + 0)->setScalar (5);
538 c2->getHexa(base2 + 1)->setScalar (5);
539 c2->getHexa(base2 + 2)->setScalar (5);
541 doc->saveVtk ("cylindres.vtk");
546 // ===================================================== test_cylindrical
547 int test_cylindrical (int nbargs, cpchar tabargs[])
549 cpchar fic_vtk = "cylindre";
552 Hex::Document* doc = mon_ex.addDocument ();
554 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
555 Hex::Vector* vx = doc->addVector (1, 0, 0);
556 Hex::Vector* vz = doc->addVector (0, 0, 1);
567 na = atoi (tabargs[1]);
575 da = atof (tabargs[2]);
579 doc->makeCylinderUni (orig,vx, vz, 5.0,1.0,da,dl, nr,na, nl);
580 doc->saveVtk (fic_vtk, na);
583 // ======================================================== test_joint2
584 int test_joint2 (int nbargs, cpchar tabargs[])
587 docu = mon_ex.addDocument ();
588 case_name = "pb_joint";
590 Hex::Vector* vx = docu->addVector (1, 0, 0);
591 Hex::Vector* vz = docu->addVector (0, 0, 1);
592 Hex::Vertex* hori = docu->addVertex (0, 0, 0);
600 Hex::Elements *bgrid=NULL, *hgrid=NULL;
602 hgrid = docu->makeCylinderUni (hori, vx,vz, 5.0,1.0,da,dl, nr,na,nl);
606 Hex::Vertex* bori = docu->addVertex (0, 0, -5);
607 bgrid = docu->makeCylinderUni (bori, vx,vz, 5.0,1.0,da,dl, nr,na,nl);
610 Hex::Quads qsource, qdest;
611 printf (" Source = ");
612 for (int ny=0 ; ny< na ; ny++)
614 Hex::Quad* quad = hgrid->getQuadIJ (0, ny, 0);
616 qsource.push_back (quad);
619 for (int ny=0 ; ny<4 ; ny++)
621 Hex::Quad* quad = hgrid->getKerHQuad (ny);
623 qsource.push_back (quad);
628 printf (" Cible = ");
629 for (int ny=0 ; ny< na ; ny++)
631 Hex::Quad* quad = bgrid->getQuadIJ (0, ny, 1);
633 qdest.push_back (quad);
636 for (int ny=0 ; ny<4 ; ny++)
638 Hex::Quad* quad = bgrid->getKerHQuad (ny+4);
640 qdest.push_back (quad);
644 Hex::Quad* cible = bgrid->getQuadIJ (0, 1, 1);
645 Hex::Vertex* vc1 = bgrid->getVertexIJK (0, 1, 1);
646 Hex::Vertex* vc2 = bgrid->getVertexIJK (1, 1, 1);
648 Hex::Vertex* vs1 = hgrid->getVertexIJK (0, 0, 0);
649 Hex::Vertex* vs2 = hgrid->getVertexIJK (1, 0, 0);
651 docu->joinQuadsUni (qsource, cible, vs1, vc1, vs2, vc2, 1);
656 // ======================================================== test_disconnect2
657 // === Disconnect Edge seul
658 int test_disconnect2 (int nbargs, cpchar tabargs[])
660 const int size_x = 2;
661 const int size_y = 2;
662 const int size_z = 1;
665 Hex::Document* doc = mon_ex.addDocument ();
666 Hex::Elements* grid2 = doc->makeCartesianTop (size_x,size_y,size_z);
671 Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0);
672 Hex::Edge* edge = grid2->getEdgeK (1,2,0);
677 doc->saveVtk ("test_disco", nvtk);
681 Hex::Elements* disco_edges = doc->disconnectEdge (hexa2, edge);
682 HexDisplay (disco_edges->countVertex());
683 HexDisplay (disco_edges->countEdge());
684 HexDisplay (disco_edges->countQuad());
685 HexDisplay (disco_edges->countHexa());
687 doc->saveVtk ("test_disco", nvtk);
688 doc->save ("test_disco");
690 // hexa2->dumpFull ();
692 // doc->setLevel (4);
695 // ======================================================== test_disconnect4
696 // === Disconnect Edges
697 int test_disconnect4 (int nbargs, cpchar tabargs[])
699 const int size_x = 1;
700 const int size_y = 2;
701 const int size_z = 2;
704 Hex::Document* doc = mon_ex.addDocument ();
706 Hex::Elements* grid2 = doc->makeCartesianTop (size_x,size_y,size_z);
713 for (int nk=0 ; nk< size_z; nk++)
715 Hex::Hexa* hexa2 = grid2->getHexaIJK (0,0,nk);
716 Hex::Edge* edge = grid2->getEdgeK (0,1,nk);
718 hexa2->setScalar (2);
720 t_hexas.push_back (hexa2);
721 t_edges.push_back (edge);
727 doc->saveVtk ("test_disco", nvtk);
728 /* Hex::Elements* disco_edges = */ doc->disconnectEdges (t_hexas, t_edges);
729 doc->saveVtk ("test_disco", nvtk);
731 // hexa2->dumpFull ();
736 // ======================================================== test_disconnect1
737 // ==== Disconnect Quad
738 int test_disconnect1 (int nbargs, cpchar tabargs[])
740 const int size_x = 2;
741 const int size_y = 2;
742 const int size_z = 1;
745 Hex::Document* doc = mon_ex.addDocument ();
747 Hex::Elements* grid1 = doc->makeCartesianTop (size_x,size_y,size_z);
752 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
753 matrice.defTranslation (ecart);
755 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
756 Hex::Quad* quad = grid1->getQuadJK (1,1,0);
760 doc->saveVtk ("test_disco", nvtk);
761 doc->disconnectQuad (hexa1, quad);
762 // hexa1 ->transform (&matrice);
763 doc->saveVtk ("test_disco", nvtk);
765 // doc->dumpPropagation ();
768 doc->save ("disco_all");
771 // ======================================================== test_disconnect3
772 // ==== disconnectVertex
773 int test_disconnect3 (int nbargs, cpchar tabargs[])
775 const int size_x = 2;
776 const int size_y = 2;
777 const int size_z = 1;
780 Hex::Document* doc = mon_ex.addDocument ();
782 Hex::Elements* grid1 = doc->makeCartesianTop (size_x,size_y,size_z);
787 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
788 matrice.defTranslation (ecart);
790 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
791 Hex::Vertex* vertex = grid1->getVertexIJK (1,1,1);
793 vertex->setScalar (5);
795 doc->saveVtk ("test_disco", nvtk);
797 doc->disconnectVertex (hexa1, vertex);
798 // hexa1->transform (&matrice);
799 doc->saveVtk ("test_disco", nvtk);
801 // doc->dumpPropagation ();
804 doc->save ("disco_all");
807 // ======================================================== contraction
808 void contraction (Hex::Hexa* hexa, Hex::Elements* grid)
811 Hex::Real3 cg = { 0, 0, 0 };
813 for (int nro=0; nro<Hex::HV_MAXI ; nro++)
815 cg [0] += hexa->getVertex(nro)->getX()/Hex::HV_MAXI;
816 cg [1] += hexa->getVertex(nro)->getY()/Hex::HV_MAXI;
817 cg [2] += hexa->getVertex(nro)->getZ()/Hex::HV_MAXI;
820 int nbvertex = grid->countVertex();
821 const double coeff = 0.5;
822 for (int nro=0; nro<nbvertex ; nro++)
824 Hex::Vertex* pv = grid->getVertex(nro);
825 Hex::Real3 pold = { pv->getX(), pv->getY(), pv->getZ() };
827 for (int dd=0; dd<3 ; dd++)
828 pnew [dd] = cg[dd] + coeff * (pold[dd]-cg[dd]);
835 // ======================================================== test_disconnect
836 // ==== Les 3 disconnect
837 int test_disconnect (int nbargs, cpchar tabargs[])
839 const int size_x = 2;
840 const int size_y = 2;
841 const int size_z = 1;
844 Hex::Document* doc = mon_ex.addDocument ();
846 Hex::Vertex* orig1 = doc->addVertex (0,0,0);
847 Hex::Vertex* orig2 = doc->addVertex (4,0,0);
848 Hex::Vertex* orig3 = doc->addVertex (8,0,0);
850 Hex::Vector* vx = doc->addVector (1,0,0);
851 Hex::Vector* vy = doc->addVector (0,1,0);
852 Hex::Vector* vz = doc->addVector (0,0,1);
853 double dx=1, dy=1, dz=1;
855 Hex::Elements* grid1 = doc->makeCartesianUni (orig1, vx,vy,vz, dx,dy,dz,
856 size_x,size_y,size_z);
857 Hex::Elements* grid2 = doc->makeCartesianUni (orig2, vx,vy,vz, dx,dy,dz,
858 size_x,size_y,size_z);
859 Hex::Elements* grid3 = doc->makeCartesianUni (orig3, vx,vy,vz, dx,dy,dz,
860 size_x,size_y,size_z);
865 Hex::Vector* ecart = doc->addVector (0.5,0.5,0);
866 matrice.defTranslation (ecart);
868 Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
869 Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0);
870 Hex::Hexa* hexa3 = grid3->getHexaIJK (1,1,0);
872 Hex::Quad* quad = grid1->getQuadJK (1,1,0);
873 Hex::Edge* edge = grid2->getEdgeK (1,2,0);
874 Hex::Vertex* vertex = grid3->getVertexIJK (1,1,1);
878 vertex->setScalar (5);
880 doc->saveVtk ("test_disco", nvtk);
881 doc->disconnectQuad (hexa1, quad);
882 doc->saveVtk ("test_disco", nvtk);
884 doc->disconnectEdge (hexa2, edge);
885 doc->saveVtk ("test_disco", nvtk);
887 doc->disconnectVertex (hexa3, vertex);
888 doc->saveVtk ("test_disco", nvtk);
890 // doc->dumpPropagation ();
893 doc->save ("disco_all");
896 // ======================================================== test_propagation
897 int test_propagation ()
899 const int size_x = 2;
900 const int size_y = 1;
901 const int size_z = 1;
904 Hex::Document* doc = mon_ex.addDocument ();
906 doc->makeCartesianTop (size_x,size_y,size_z);
908 int nb = doc->countPropagation ();
909 for (int nro=0 ; nro<nb ; nro++)
911 Hex::Propagation* prop = doc ->getPropagation (nro);
912 const Hex::Edges& table = prop->getEdges ();
913 printf (" ____________________________________ Prop nro %d\n", nro);
914 for (int ned=0 ; ned<(int)table.size() ; ned++)
916 bool way = table [ned]->getWay ();
921 table [ned]->getVertex (0)->printName (", ");
922 table [ned]->getVertex (1)->printName (")\n");
927 table [ned]->getVertex (1)->printName (", ");
928 table [ned]->getVertex (0)->printName (")\n");
934 doc->saveVtk ("test_propagation.vtk");
935 doc->save ("test_propagation");
939 // ======================================================== test_move
942 const int size_x = 1;
943 const int size_y = 1;
944 const int size_z = 2;
947 Hex::Document* doc = mon_ex.addDocument ();
949 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
951 Hex::Vector* enhaut = doc->addVector (0, 0, 5);
952 Hex::Vector* devant = doc->addVector (5, 0, 0);
953 // Hex::Vector* agauche = doc->addVector (0, 5, 0);
956 matrice.defTranslation (enhaut);
958 Hex::Hexa* cube = grid->getHexa (1);
959 Hex::Quad* dessous = cube->getQuad (Hex::Q_A);
962 Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
963 /* Hex::Elements* grid3 = doc->makeTranslation (grid, agauche); */
964 Hex::Hexa* cube2 = grid2->getHexa (1);
966 doc ->saveVtk ("move0.vtk");
968 cube ->disconnectQuad (dessous);
969 cube ->transform (&matrice);
970 cube2->transform (&matrice);
972 doc ->saveVtk ("move1.vtk");
977 // ======================================================== test_transfo2
978 int test_transfo2 (int nbargs, cpchar tabargs[])
980 const int size_x = 1;
981 const int size_y = 1;
982 const int size_z = 2;
985 cpchar fic_vtk = "transfo";
988 Hex::Document* doc = mon_ex.addDocument ();
991 Hex::Vertex* orig = doc->addVertex (0,0,0);
992 Hex::Vector* dir = doc->addVector (1,1,1);
993 Hex::Elements* grid = doc->makeCartesianTop (size_x, size_y, size_z);
999 doc ->saveVtk (fic_vtk, nvtk);
1001 Hex::Vector* devant = doc->addVector (5, 0, 0);
1003 Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
1006 doc ->saveVtk (fic_vtk, nvtk);
1008 Hex::Elements* grid3 = doc->makeScale (grid2, orig, 2);
1011 doc ->saveVtk (fic_vtk, nvtk);
1013 Hex::Elements* grid4 = doc->makeRotation (grid2, orig, dir, 45);
1016 doc ->saveVtk (fic_vtk, nvtk);
1018 Hex::Elements* grid5 = doc->makeSymmetryPoint (grid4, orig);
1022 doc ->saveVtk (fic_vtk, nvtk);
1024 Hex::Vector* dir1 = doc->addVector (1,0,0);
1025 Hex::Elements* grid6 = doc->makeSymmetryLine (grid4, orig, dir1);
1029 grid4->getHexa(0)->getVertex(0)->setScalar(3);
1030 grid6->getHexa(0)->getVertex(0)->setScalar(3);
1031 doc ->saveVtk (fic_vtk, nvtk);
1033 grid4->getHexa(0)->getVertex(0)->setScalar(0);
1034 grid6->getHexa(0)->getVertex(0)->setScalar(0);
1036 Hex::Elements* grid7 = doc->makeSymmetryLine (grid2, orig, dir1);
1040 grid2->getHexa(0)->getVertex(0)->setScalar(4);
1041 grid7->getHexa(0)->getVertex(0)->setScalar(4);
1042 doc ->saveVtk (fic_vtk, nvtk);
1044 grid2->getHexa(0)->getVertex(0)->setScalar(0);
1045 grid7->getHexa(0)->getVertex(0)->setScalar(0);
1047 Hex::Elements* grid8 = doc->makeSymmetryPlane (grid2, orig, dir1);
1051 grid2->getHexa(0)->getVertex(0)->setScalar(4);
1052 grid8->getHexa(0)->getVertex(0)->setScalar(4);
1053 doc ->saveVtk (fic_vtk, nvtk);
1054 grid2->getHexa(0)->getVertex(0)->setScalar(0);
1055 grid8->getHexa(0)->getVertex(0)->setScalar(0);
1057 Hex::Elements* grid9 = doc->makeSymmetryPlane (grid3, orig, dir);
1061 grid3->getHexa(0)->getVertex(0)->setScalar(4);
1062 grid9->getHexa(0)->getVertex(0)->setScalar(4);
1063 doc ->saveVtk (fic_vtk, nvtk);
1065 grid9->getHexa(0)->removeConnected ();
1066 doc ->saveVtk (fic_vtk, nvtk);
1070 // ======================================================== test_copy_document
1071 int test_copy_document (int nbargs, cpchar tabargs[])
1074 Hex::Document* doc = mon_ex.loadDocument ("Essai");
1075 doc ->saveVtk ("restore1.vtk");
1077 Hex::Document* clone = doc->copyDocument();
1078 clone->saveVtk ("restore2.vtk");
1082 // ======================================================== test_remove
1085 const int size_x = 2;
1086 const int size_y = 2;
1087 const int size_z = 2;
1090 Hex::Document* doc = mon_ex.addDocument ();
1092 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
1093 doc->saveVtk ("removeConn1.vtk");
1095 Echo ("--------- Avant destruction");
1096 HexDisplay (doc->countVertex ());
1097 HexDisplay (doc->countEdge ());
1098 HexDisplay (doc->countQuad ());
1099 HexDisplay (doc->countHexa ());
1100 HexDisplay (doc->countUsedVertex ());
1101 HexDisplay (doc->countUsedEdge ());
1102 HexDisplay (doc->countUsedQuad ());
1103 HexDisplay (doc->countUsedHexa ());
1106 doc->removeConnectedHexa (grid->getHexaIJK (0,0,0));
1108 Echo ("--------- Apres destruction");
1109 HexDisplay (doc->countVertex ());
1110 HexDisplay (doc->countEdge ());
1111 HexDisplay (doc->countQuad ());
1112 HexDisplay (doc->countHexa ());
1114 HexDisplay (doc->countUsedVertex ());
1115 HexDisplay (doc->countUsedEdge ());
1116 HexDisplay (doc->countUsedQuad ());
1117 HexDisplay (doc->countUsedHexa ());
1118 doc->saveVtk ("removeConn2.vtk");
1122 // ================================================== init_vec
1123 void init_vec (Hex::RealVector& tab, double n0=0, double n1=0, double n2=0,
1124 double n3=0, double n4=0, double n5=0, double n6=0,
1125 double n7=0, double n8=0, double n9=0, double n10=0,
1126 double n11=0, double n12=0, double n13=0, double n14=0,
1127 double n15=0, double n16=0)
1129 if (n0>0.0) tab.push_back (n0);
1130 if (n1>0.0) tab.push_back (n1);
1131 if (n2>0.0) tab.push_back (n2);
1132 if (n3>0.0) tab.push_back (n3);
1133 if (n4>0.0) tab.push_back (n4);
1134 if (n5>0.0) tab.push_back (n5);
1135 if (n6>0.0) tab.push_back (n6);
1136 if (n7>0.0) tab.push_back (n7);
1137 if (n8>0.0) tab.push_back (n8);
1138 if (n9>0.0) tab.push_back (n9);
1140 if (n10>0.0) tab.push_back (n10);
1141 if (n11>0.0) tab.push_back (n11);
1142 if (n12>0.0) tab.push_back (n12);
1143 if (n13>0.0) tab.push_back (n13);
1144 if (n14>0.0) tab.push_back (n14);
1145 if (n15>0.0) tab.push_back (n15);
1146 if (n16>0.0) tab.push_back (n16);
1148 // ======================================================== test_edge
1149 int test_edge (int nbargs, cpchar tabargs[])
1152 Hex::Document* doc = mon_ex.addDocument ();
1154 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
1155 Hex::Vector* vx = doc->addVector (1 ,0, 0);
1156 doc->addEdgeVector (orig, vx);
1158 HexDisplay (doc->countVertex());
1159 HexDisplay (doc->countEdge());
1163 // ======================================================== test_hexa
1164 int test_hexa (int nbargs, cpchar tabargs[])
1168 Hex::Document* doc1 = mon_ex.loadDocument ("bielle_triang");
1169 Hex::Document* doc2 = mon_ex.loadDocument ("bielle_triang");
1170 PutData (doc1->getName ());
1171 PutData (doc2->getName ());