Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/hexablock.git] / src / TEST_CPP / ModelTest.cxx
1 // Copyright (C) 2009-2012  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include <cppunit/extensions/HelperMacros.h>
21
22
23 #include "hexa_base.hxx"
24 #include "Hex.hxx"
25 #include "HexDocument.hxx"
26 #include "HexElements.hxx"
27 #include "HexCrossElements.hxx"
28
29 #include "HexHexa.hxx"
30 #include "HexQuad.hxx"
31 #include "HexEdge.hxx"
32 #include "HexVertex.hxx"
33
34 #include "HexPropagation.hxx"
35 #include "HexShape.hxx"
36 #include "HexLaw.hxx"
37 #include "HexMatrix.hxx"
38
39 #include "ModelTest.hxx"
40
41 CPPUNIT_TEST_SUITE_REGISTRATION( ModelTest );
42
43
44 ModelTest::ModelTest(void)
45 {
46 //   _myHexEngine = new HEXA_NS::Hex();
47 //   _myDoc= _myHexEngine->addDocument();
48 }
49
50 ModelTest::~ModelTest(void)
51 {
52 //   delete _myDoc;
53 //   delete _myHexEngine; //CS_TODO : Crash
54 }
55
56
57 // ======================================================== print_propagations
58 void ModelTest::_print_propagations (Hex::Document* doc)
59 {
60    int nb = doc->countPropagation ();
61    HexDisplay (nb);
62    for (int nro=0 ; nro<nb ; nro++)
63        {
64        Hex::Propagation*  prop  = doc ->getPropagation (nro);
65        const Hex::Edges&  table = prop->getEdges ();
66        printf (" ____________________________________ Prop nro %d\n", nro);
67        for (int ned=0 ; ned<(int)table.size() ; ned++)
68            {
69            bool way = table [ned]->getWay ();
70            Hex::Edge*   edge = table [ned];
71            Hex::Vertex* v0   = edge->getVertex (0);
72            Hex::Vertex* v1   = edge->getVertex (1);
73
74            if (way)
75               {
76               printf ("     (");
77               v0->printName (", ");
78               v1->printName (")\n");
79               }
80           else
81               {
82               v1->printName (", ");
83               v0->printName (")\n");
84               printf ("     (");
85               }
86            }
87        }
88 }
89 // // ======================================================== Test_sphere
90 // void ModelTest::Test_sphere ()
91 // {
92 //    Hex::Hex mon_ex;
93 //    Hex::Document* doc = mon_ex.addDocument ();
94 //    Hex::Vertex*  orig = doc->addVertex (0,0,0);
95 // 
96 //    int    ncouches = 1;
97 //    double k = 0.8;
98 //    Hex::Vector*   decal  = doc->addVector (1,1,1);
99 //    Hex::Elements* sphere = doc->makeSpherical (orig, decal, ncouches, k);
100 // 
101 //    for (int nc=0 ; nc <= ncouches ; nc++)
102 //        {
103 //        Hex::Hexa* cell = sphere->getStrate (nc, Hex::Q_A);
104 //        cell->remove ();
105 //        // sphere->getStrate (nc, Hex::Q_A)->remove ();
106 //        // sphere->getStrate (nc, Hex::Q_B)->remove ();
107 //        }
108 // 
109 //    sphere->saveVtk ("sphere.vtk");
110 //    CPPUNIT_ASSERT( true );
111 // }
112 // ======================================================== Test_cartesi1
113 void ModelTest::Test_cartesi1 ()
114 {
115    
116    const int size_x = 15;
117    const int size_y = 12;
118    const int size_z = 8;
119
120    Hex::Hex mon_ex;
121    Hex::Document* doc = mon_ex.addDocument ("foo");
122    Hex::Vertex* orig = doc->addVertex (0,0,0);
123
124    Hex::Vector*   dir  = doc->addVector (1,1,1);
125    Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
126
127    //  print_propagations (doc);
128
129    for (int nz=0; nz<size_z ; nz++)
130        for (int ny=nz+1; ny<size_y-nz-1 ; ny++)
131            for (int nx=nz+1; nx<size_x-nz-1 ; nx++)
132                {
133                Hex::Hexa* cell = grid->getHexaIJK (nx, ny, nz);
134                cell->remove ();
135                }
136    
137    doc->setLevel (1);
138    _print_propagations (doc);
139    grid->saveVtk ("grid_cart.vtk");
140
141    // doc->dump ();
142    CPPUNIT_ASSERT( true );
143 }
144 // ======================================================== afficher
145 #define Afficher(elt) _afficher (#elt, elt)
146 int ModelTest::_afficher (cpchar nom, Hex::EltBase* elt)
147 {
148    if (elt==NULL)
149       {
150       printf (" .... %s = 0x0\n", nom);
151       return HOK;
152       }
153
154    printf (" .... %s = 0x%08lx = %03d\n", nom, (unsigned long) elt, elt->getId());
155    return HOK;
156 }
157 // ======================================================== Test_find
158 void ModelTest::Test_find ()
159 {
160    
161    const int size_x = 2;
162    const int size_y = 2;
163    const int size_z = 2;
164
165    Hex::Hex mon_ex;
166    Hex::Document* doc = mon_ex.addDocument ("foo");
167
168    Hex::Vertex* orig = doc->addVertex (0,0,0);
169    Hex::Vector* dir  = doc->addVector (1,1,1);
170    Hex::Elements*  grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
171
172    grid->saveVtk ("mini1.vtk");
173    doc->dump ();
174
175    Hex::Vertex *v00, *v02, *v06, *v08, *v10, *v22, *v26;
176
177    Afficher ( v00 = doc->findVertex (0, 0, 0));
178    Afficher ( v02 = doc->findVertex (1, 1, 0));
179    Afficher ( v06 = doc->findVertex (1, 1, 1));
180    Afficher ( v08 = doc->findVertex (2, 1, 0));
181    Afficher ( v10 = doc->findVertex (2, 1, 1));
182    Afficher ( v22 = doc->findVertex (2, 1, 2));
183    Afficher ( v26 = doc->findVertex (2, 2, 2));
184
185    printf ("\n");
186
187    Afficher (doc->findEdge (v06, v10));
188    Afficher (doc->findEdge (v10, v06));
189    printf ("\n");
190
191    Afficher (doc->findQuad (v02, v10));
192    Afficher (doc->findQuad (v06, v08));
193    Afficher (doc->findQuad (v02, v06));
194
195    printf ("\n");
196    Afficher (doc->findHexa (v00, v06));
197    Afficher (doc->findHexa (v06, v26));
198    Afficher (doc->findHexa (v26, v06));
199
200    CPPUNIT_ASSERT( true );
201 }
202 // ======================================================== Test_joint
203 void ModelTest::Test_joint ()
204 {
205    
206    const int dimx = 11;
207    const int dimy = 11;
208    const int dimz = 2;
209
210    Hex::Hex mon_ex;
211    Hex::Document* doc = mon_ex.addDocument ("foo");
212
213    Hex::Vertex* orig1 = doc->addVertex (0,0,0);
214    Hex::Vector* dir   = doc->addVector (1,1,1);
215
216    Hex::Elements* grid1 = doc->makeCartesian   (orig1, dir, dimx,dimy,dimz);
217
218    Hex::Vertex*   orig2 = doc->addVertex  (dimx/2.0,0,8);
219    Hex::Vector*   vectj = doc->addVector (0,1,0);
220    Hex::Vector*   vecti = doc->addVector (1,0,0);
221    Hex::Elements* grid2 = doc->makeCylindrical (orig2, vecti, vectj, 
222                    1, 180, 1,        dimz,dimy,dimx);
223
224    int mx = dimx/2;
225    int my = dimy/2;
226    Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); 
227    Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my); 
228
229
230    Hex::Vertex* v1 = prems->getVertex (0);
231    Hex::Vertex* v2 = cible->getVertex (0);
232    Hex::Vertex* v3 = prems->getVertex (1);
233    Hex::Vertex* v4 = cible->getVertex (3);
234
235    Hex::Quads liste;
236    Hex::Quads miroir;
237
238    liste.push_back (prems);
239    for (int nx=0; nx<dimx; nx++)
240        if (nx!=mx) 
241           liste.push_back (grid1->getQuadIJ (nx, my, dimz)); 
242
243    for (int ny=0; ny<dimy; ny++)
244        if (ny!=my) 
245           liste.push_back (grid1->getQuadIJ (mx, ny, dimz)); 
246
247    // Hex::Elements* joint = 
248    //
249    doc->joinQuads  (liste, cible, v1, v2, v3, v4, 5);
250    doc->saveVtk ("joint.vtk");
251
252    CPPUNIT_ASSERT( true );
253 }
254 // ======================================================== Test_prism
255 void ModelTest::Test_prism ()
256 {
257    
258    const int dimx = 11;
259    const int dimy = 11;
260    const int dimz = 2;
261
262    Hex::Hex mon_ex;
263    Hex::Document* doc = mon_ex.addDocument ("foo");
264
265    Hex::Vertex* orig1 = doc->addVertex (0,0,0);
266    Hex::Vector* dir   = doc->addVector (1,1,1);
267
268    Hex::Elements* grid1 = doc->makeCartesian   (orig1, dir, dimx,dimy,dimz);
269
270    int mx = dimx/2;
271    int my = dimy/2;
272    Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); 
273    Hex::Quads liste;
274
275    liste.push_back (prems);
276    for (int nx=0; nx<dimx; nx++)
277        if (nx!=mx) 
278           liste.push_back (grid1->getQuadIJ (nx, my, dimz)); 
279
280    for (int ny=0; ny<dimy; ny++)
281        if (ny!=my) 
282           liste.push_back (grid1->getQuadIJ (mx, ny, dimz)); 
283
284    doc->prismQuads  (liste, dir, 5);
285    doc->saveVtk ("prisme.vtk");
286
287    CPPUNIT_ASSERT( true );
288 }
289
290
291 // ======================================================== Test_prism2
292 void ModelTest::Test_prism2 ()
293 {
294     
295     const int dimx = 11;
296     const int dimy = 11;
297     const int dimz = 2;
298     
299     Hex::Hex mon_ex;
300     Hex::Document* doc = mon_ex.addDocument ("foo");
301     
302     Hex::Vertex* orig1 = doc->addVertex (0,0,0);
303     Hex::Vector* dir   = doc->addVector (1,1,1);
304     
305     Hex::Elements* grid1 = doc->makeCartesian   (orig1, dir, dimx,dimy,dimz);
306     
307     int mx = dimx/2;
308     int my = dimy/2;
309     Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); 
310     Hex::Elements*  prism = doc->prismQuad(prems, dir, 5);
311
312     int nbHexa = prism->countHexa();
313     std::cout << "nbHexa " << nbHexa << std::endl;
314     Hex::Hexa*     hp1 = prism->getHexa(1);
315     std::cout << "getHexa(1) " << hp1 << std::endl;
316     Hex::Vertex*   hp1_v0 = hp1->getVertex(0);
317     std::cout << "getVertex ->" << hp1_v0 << std::endl;
318     Hex::Shape* s = new Hex::Shape("la shape");
319     std::cout << "new Hex::Shape->" << s << std::endl;
320     hp1_v0->setAssociation(s);
321     std::cout <<  "setAssociation ->" << std::endl;
322     doc->saveVtk ("prisme2.vtk");
323
324     CPPUNIT_ASSERT( true );
325 }
326
327
328
329
330
331
332
333
334 // ======================================================== Test_hexa1
335 void ModelTest::Test_hexa1 ()
336 {
337    
338    const int size_x = 1;
339    const int size_y = 1;
340    const int size_z = 1;
341
342    Hex::Hex mon_ex;
343    Hex::Document* doc = mon_ex.addDocument ("foo");
344    Hex::Vertex* orig = doc->addVertex (0,0,0);
345    Hex::Vector* dir  = doc->addVector (1,1,1);
346    //  Hex::Elements*  grid = 
347    doc->makeCartesian (orig, dir, size_x,size_y,size_z);
348
349    doc ->dump ();
350
351    CPPUNIT_ASSERT( true );
352 }
353 // ======================================================== Test_decoupage
354 void ModelTest::Test_decoupage ()
355 {
356    
357    const int size_x = 2;
358    const int size_y = 1;
359    const int size_z = 1;
360
361    Hex::Hex mon_ex;
362    Hex::Document* doc = mon_ex.addDocument ("foo");
363
364    Hex::Vertex* orig = doc->addVertex (0,0,0);
365    Hex::Vector* dir  = doc->addVector (1,1,1);
366
367    Hex::Elements* grid  = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
368    Hex::Edge*     arete = grid->getEdgeK (0, 0, 0);
369
370    doc ->dump ();
371    doc ->saveVtk ("no_decoupe.vtk");
372 /* Hex::Elements* grid2 = */  doc->cut (arete, 1);
373
374    doc ->dump ();
375    doc ->saveVtk ("decoupe.vtk");
376    // doc ->saveFile ();
377
378    CPPUNIT_ASSERT( true );
379 }
380 // ======================================================== Test_gen_xml
381 void ModelTest::Test_gen_xml ()
382 {
383    
384    const int size_x = 2;
385    const int size_y = 2;
386    const int size_z = 2;
387
388    Hex::Hex mon_ex;
389    Hex::Document* doc = mon_ex.addDocument ("foo");
390
391    Hex::Vertex* orig = doc->addVertex (0,0,0);
392    Hex::Vector* dir  = doc->addVector (1,1,1);
393    Hex::Elements*  grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
394
395    Hex::Hexa*   cell    = grid->getHexa (0);
396    Hex::Quad*   face    = cell->getQuad (0);
397    Hex::Edge*   arete   = cell->getEdge (0);
398    Hex::Vertex* noeud   = cell->getVertex (0);
399
400    Hex::Shape* shape1 = new Hex::Shape("riri");
401    Hex::Shape* shape2 = new Hex::Shape("fifi");
402    Hex::Shape* shape3 = new Hex::Shape("loulou");
403
404    noeud->setAssociation (shape1);
405    arete->setAssociation (shape2);
406    face ->setAssociation (shape3);
407
408    Hex::Law* law1 = doc->addLaw("loi1", 1);
409    Hex::Law* law2 = doc->addLaw("loi2", 2);
410    Hex::Law* law3 = doc->addLaw("loi3", 3);
411
412    law1->setKind (Hex::Uniform);
413    law2->setKind (Hex::Arithmetic);
414    law3->setKind (Hex::Geometric);
415
416    Hex::Propagation* prop1 = doc->getPropagation (0);
417    Hex::Propagation* prop2 = doc->getPropagation (1);
418    Hex::Propagation* prop3 = doc->getPropagation (2);
419
420    prop1->setLaw (law1);
421    prop2->setLaw (law2);
422    prop3->setLaw (law3);
423
424    prop1->setWay (true);
425    prop2->setWay (false);
426    prop3->setWay (true);
427
428    doc ->saveVtk ("mini.vtk");
429    doc ->save ("Essai");
430
431    CPPUNIT_ASSERT( true );
432 }
433 // ======================================================== Test_relecture
434 void ModelTest::Test_relecture ()
435 {
436    
437    Hex::Hex mon_ex;
438    Hex::Document* doc = mon_ex.loadDocument ("Essai");
439
440    doc ->dump ();
441    doc ->saveVtk ("restore.vtk");
442
443    CPPUNIT_ASSERT( true );
444 }
445
446
447 // ======================================================== Test_clone
448 void ModelTest::Test_clone ()
449 {
450    
451    const int size_x = 2;
452    const int size_y = 2;
453    const int size_z = 2;
454
455    Hex::Hex mon_ex;
456    Hex::Document* doc = mon_ex.addDocument ("foo");
457
458    Hex::Vertex* orig = doc->addVertex (0,0,0);
459    Hex::Vector* dir  = doc->addVector (1,1,1);
460    Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
461
462    Hex::Vector*   bond  = doc->addVector (0, 0, 7);
463    Hex::Elements* grid2 = doc->makeTranslation (grid, bond);
464
465    doc ->saveVtk ("clonage.vtk");
466    doc ->dump();
467
468    HexDump (grid2->getHexa      (1));
469    HexDump (grid2->getHexaIJK   (1,1,1));
470    HexDump (grid2->getVertexIJK (1,1,1));
471
472    CPPUNIT_ASSERT( true );
473 }
474 // ======================================================== Test_separ
475 void ModelTest::Test_separ ()
476 {
477    
478    const int size_x = 2;
479    const int size_y = 2;
480    const int size_z = 2;
481
482    Hex::Hex mon_ex;
483    Hex::Document* doc = mon_ex.addDocument ("foo");
484
485    Hex::Vertex* orig = doc->addVertex (0,0,0);
486    Hex::Vector* dir  = doc->addVector (1,1,1);
487    //  Hex::Elements*  grid = 
488    doc->makeCartesian (orig, dir, size_x,size_y,size_z);
489
490    doc ->saveVtk ("separ.vtk");
491    doc ->dump();
492
493    CPPUNIT_ASSERT( true );
494 }
495 // // ======================================================== Test_cyl_karima
496 // void ModelTest::Test_cyl_karima ()
497 // {
498 //    
499 //    Hex::Hex mon_ex;
500 //    Hex::Document* doc = mon_ex.addDocument ("foo");
501 // 
502 //    Hex::Vertex* c2 = doc->addVertex (0,0,0);
503 //    Hex::Vector* dz = doc->addVector (0,0,1);
504 //    Hex::Vector* dx = doc->addVector (1,0,0);
505 // 
506 //    double dr = 4.12;
507 // 
508 //    double a2 = 180;
509 //    int    l2 = 70;
510 // 
511 //    int nr2 = 5;
512 //    int na2 = 5;
513 //    int nl2 = 1;
514 // 
515 // /* Hex::Elements* cyl2 = */ doc->makeCylindrical (c2, dx, dz, dr, a2, l2, 
516 //                                                   nr2, na2, nl2, false );
517 //    doc->saveVtk ("cyl_karima.vtk");
518 //    // doc->dump ();
519 // 
520 //    CPPUNIT_ASSERT( true );
521 // }
522 // ================================================== Test_grille_cyl
523 void ModelTest::Test_grille_cyl ()
524 {
525    
526    Hex::Hex mon_ex;
527    Hex::Document* doc = mon_ex.addDocument ("foo");
528
529    Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0);
530    Hex::Vertex* orig2 = doc->addVertex (10, 0,0);
531
532    Hex::Vertex* orig3 = doc->addVertex ( 0,10,0);
533    Hex::Vertex* orig4 = doc->addVertex (10,10,0);
534
535    Hex::Vertex* orig5 = doc->addVertex ( 0,20,0);
536    Hex::Vertex* orig6 = doc->addVertex (10,20,0);
537
538    Hex::Vector* vz = doc->addVector (0,0,1);
539    Hex::Vector* vx = doc->addVector (1,0,0);
540
541    double dr = 1;
542    double dl = 1;
543    int    nr = 2;
544    int    nl = 5;
545    nl = 1;
546
547    doc->makeCylindrical(orig1,vx,vz,dr, 360, dl,nr,4,nl, true);
548    doc->makeCylindrical(orig2,vx,vz,dr, 360, dl,nr,8,nl, true);
549    doc->makeCylindrical(orig3,vx,vz,dr, 270, dl,nr,8,nl, true);
550    doc->makeCylindrical(orig6,vx,vz,dr, 360, dl,nr,6,nl, true);
551    doc->makeCylindrical(orig4,vx,vz,dr, 270, dl,nr,7,nl, true);
552    doc->makeCylindrical(orig5,vx,vz,dr, 360, dl,nr,5,nl, true);
553    doc->saveVtk ("cylindres.vtk");
554    // doc->dump ();
555
556    CPPUNIT_ASSERT( true );
557 }
558 // ===================================================== Test_cylinder
559 void ModelTest::Test_cylinder ()
560 {
561    
562    int    nvtk    = 0;
563    cpchar fic_vtk = "cylindre";
564
565    Hex::Hex mon_ex;
566    Hex::Document* doc = mon_ex.addDocument ("foo");
567
568    Hex::Vertex* orig1 = doc->addVertex (0, 0,0);
569    Hex::Vertex* orig2 = doc->addVertex (50,0,0);
570    Hex::Vector* vz    = doc->addVector (0,0,1);
571    Hex::Vector* vx    = doc->addVector (1,0,0);
572
573    int nr  = 4;
574    int nri = 3;
575    int nre = nr;
576    int na = 9;
577    int nl = 5;
578
579    Hex::Cylinder* cyl  = doc->addCylinder   (orig1, vz, nr, nl);
580    Hex::Pipe*     pipe = doc->addPipe       (orig2, vz, nri, nre, nl);
581
582    doc->makeCylinder (cyl,  vx, nr, na, nl);
583    doc ->saveVtk (fic_vtk, nvtk);
584
585    doc->makePipe     (pipe, vx, nr, na, nl);
586    doc ->saveVtk (fic_vtk, nvtk);
587
588    CPPUNIT_ASSERT( true );
589 }
590
591
592
593 void ModelTest::myTest_croix ()
594 {
595   Hex::Hex mon_ex;
596   Hex::Document* doc = mon_ex.addDocument ("foo");
597
598
599 //   Hex::Vector* dx1 = doc->addVector( -1, 0, 0 );
600 //   Hex::Vector* dz1 = doc->addVector( 0, 0, 1 );
601 //   
602 //   Hex::Vertex* c_pte_1 = doc->addVertex ( 195., 0., 220. );
603 //   Hex::Vertex* c_grd_1 = doc->addVertex ( 300., 0., 400. );
604 //   Hex::Cylinder* cyl_pte_1 = doc->addCylinder( c_pte_1 , dz1 , 25 , 360 );
605 //   Hex::Cylinder* cyl_grd_1 = doc->addCylinder( c_grd_1 , dx1 , 50 , 140 );
606 //   Hex::CrossElements* cross1 = doc->makeCylinders( cyl_pte_1 , cyl_grd_1 );
607
608   Hex::Vector* dx2 = doc->addVector(-1, 0, 0 );
609   Hex::Vector* dz2 = doc->addVector( 0, 0, 1 );
610   
611   Hex::Vertex* c_pte_2 = doc->addVertex( 110., 0. , 400. );
612   Hex::Vertex* c_grd_2 = doc->addVertex( 0.  , 0. , 0. );
613
614   Hex::Cylinder* cyl_pte_2 = doc->addCylinder( c_pte_2 , dx2 , 50, 220 );
615   Hex::Cylinder* cyl_grd_2 = doc->addCylinder( c_grd_2 , dz2 , 100, 800 );
616   Hex::CrossElements* cross2    = doc->makeCylinders( cyl_pte_2, cyl_grd_2 );
617
618
619 /*
620   Hex::Vector* dx2 = doc->addVector( 1, 0, 0 );
621   Hex::Vector* dz2 = doc->addVector( 0, 0, 1 );
622
623   Hex::Vertex* c_pte_2 = doc->addVertex( -130. , 0. , 400. );
624   Hex::Vertex* c_grd_2 = doc->addVertex( 0. , 0. , 0. );
625
626   Hex::Cylinder* cyl_pte_2 = doc->addCylinder( c_pte_2 , dx2 , 50, 260 );
627   Hex::Cylinder* cyl_grd_2 = doc->addCylinder( c_grd_2 , dz2 , 100, 800 );
628
629   Hex::CrossElements* cross2 = doc->makeCylinders( cyl_pte_2, cyl_grd_2 );*/
630   doc->saveVtk ("/tmp/ffffffff.vtk");
631   doc->dump ();
632
633   CPPUNIT_ASSERT( true );
634 }
635
636
637
638
639 // ======================================================== Test_croix
640 void ModelTest::Test_croix ()
641 {
642    
643    Hex::Hex mon_ex;
644    Hex::Document* doc = mon_ex.addDocument ("foo");
645
646    Hex::Vertex* ori1 = doc->addVertex ( 0,0,0);
647    Hex::Vertex* ori2 = doc->addVertex (-5,0,5);
648    Hex::Vector* vz   = doc->addVector ( 0,0,1);
649    Hex::Vector* vx   = doc->addVector ( 1,0,0);
650
651    int nr1 = 2;
652    int nl1 = 10;
653    int nr2 = 1;
654    int nl2 = 10;
655
656    Hex::Cylinder* cyl1  = doc->addCylinder (ori1, vz, nr1, nl1);
657    Hex::Cylinder* cyl2  = doc->addCylinder (ori2, vx, nr2, nl2);
658    Hex::CrossElements* grid = doc->makeCylinders (cyl1, cyl2);
659
660    grid->dump();
661    grid->dumpVertex();
662
663 #if 0
664    for (int ny=0; ny<Hex::S_MAXI; ny++)
665        {
666        grid->getHexaIJK (Hex::Cyl1, 1, ny, 0)->remove ();
667        grid->getHexaIJK (Hex::Cyl1, 1, ny, 1)->remove ();
668        grid->getHexaIJK (Hex::Cyl1, 1, ny, 2)->remove ();
669        grid->getHexaIJK (Hex::Cyl1, 1, ny, 3)->remove ();
670        grid->getHexaIJK (Hex::Cyl1, 1, ny, 4)->remove ();
671        grid->getHexaIJK (Hex::Cyl1, 1, ny, 5)->remove ();
672
673        grid->getHexaIJK (Hex::Cyl2, 1, ny, 0)->remove ();
674        // grid->getHexaIJK (Hex::Cyl2, 1, ny, 1)->remove ();
675        // grid->getHexaIJK (Hex::Cyl2, 1, ny, 2)->remove ();
676        grid->getHexaIJK (Hex::Cyl2, 1, ny, 3)->remove ();
677        }
678
679    for (int ny=0; ny<4 ;  ny++)
680        {
681        grid->getHexaIJK (Hex::Cyl1, 0, ny, 0)->remove ();
682        grid->getHexaIJK (Hex::Cyl1, 0, ny, 1)->remove ();
683        grid->getHexaIJK (Hex::Cyl1, 0, ny, 2)->remove ();
684        grid->getHexaIJK (Hex::Cyl1, 0, ny, 3)->remove ();
685        grid->getHexaIJK (Hex::Cyl1, 0, ny, 4)->remove ();
686        grid->getHexaIJK (Hex::Cyl1, 0, ny, 5)->remove ();
687
688        // grid->getHexaIJK (Hex::Cyl2, 0, ny, 0)->remove ();
689        // grid->getHexaIJK (Hex::Cyl2, 0, ny, 1)->remove ();
690        // grid->getHexaIJK (Hex::Cyl2, 0, ny, 2)->remove ();
691        // grid->getHexaIJK (Hex::Cyl2, 0, ny, 3)->remove ();
692        }
693
694    /*********************************
695    grid->getHexaIJK (Hex::Cyl2, 0, 3, 1)->remove ();
696    grid->getHexaIJK (Hex::Cyl2, 1, Hex::S_SE, 2)->remove ();
697    grid->getHexaIJK (Hex::Cyl2, 1, Hex::S_SE, 1)->remove ();
698
699    grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 3)->remove ();
700    grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 2)->remove ();
701    grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 1)->remove ();
702     ********************************* */
703 #endif
704
705    doc->saveVtk ("croix.vtk");
706    doc->dump ();
707
708    CPPUNIT_ASSERT( true );
709 }
710 // ======================================================== Test_pipes
711 void ModelTest::Test_pipes ()
712 {
713    
714    Hex::Hex mon_ex;
715    Hex::Document* doc = mon_ex.addDocument ("foo");
716
717    Hex::Vertex* ori1 = doc->addVertex ( 0,0,0);
718    Hex::Vertex* ori2 = doc->addVertex (-5,0,5);
719    Hex::Vector* vz   = doc->addVector ( 0,0,1);
720    Hex::Vector* vx   = doc->addVector ( 1,0,0);
721
722    double h1  = 10, h2  = 10;
723    double ri1 = 1,  ri2 = 1.5;
724    double re1 = 2,  re2 = 3;
725
726    Hex::Pipe* pipe1  = doc->addPipe (ori1, vz, ri1, re1, h1);
727    Hex::Pipe* pipe2  = doc->addPipe (ori2, vx, ri2, re2, h2);
728    Hex::CrossElements* grid = doc->makePipes (pipe1, pipe2);
729
730    grid->dump();
731    grid->dumpVertex();
732
733    doc->saveVtk ("pipes.vtk");
734    doc->dump ();
735    CPPUNIT_ASSERT( true );
736 }
737 // ======================================================== Test_lorraine
738 void ModelTest::Test_lorraine()
739 {
740    
741    Hex::Hex mon_ex;
742    Hex::Document* doc = mon_ex.addDocument ("foo");
743
744    Hex::Vertex* ori1 = doc->addVertex ( 0,0,0);
745    Hex::Vertex* ori2 = doc->addVertex (-5,0,5);
746    Hex::Vertex* ori3 = doc->addVertex ( 0,0,12);
747    Hex::Vertex* ori4 = doc->addVertex (-5,0,17);
748
749    Hex::Vector* vz   = doc->addVector ( 0,0,1);
750    Hex::Vector* vx   = doc->addVector ( 1,0,0);
751
752    int nl1 = 10;
753    int nl2 = 10;
754
755    double rsmall = 1;
756    double rmoy   = 2;
757    double rbig   = 3;
758
759    Hex::Cylinder* cyl1  = doc->addCylinder (ori1, vz, rmoy,   nl1);
760    Hex::Cylinder* cyl2  = doc->addCylinder (ori2, vx, rsmall, nl2);
761
762    Hex::Cylinder* cyl3  = doc->addCylinder (ori3, vz, rmoy, nl1);
763    Hex::Cylinder* cyl4  = doc->addCylinder (ori4, vx, rbig, nl2);
764
765    Hex::CrossElements* grid1 = doc->makeCylinders (cyl1, cyl2);
766    Hex::CrossElements* grid2 = doc->makeCylinders (cyl4, cyl3);
767
768 #define Imprimer(x) printf (#x " = ") ; if (x) x->dump() ; else printf ("NULL\n")
769    const int nx_int = 0;
770    const int nx_ext = 1;
771
772    //           vc2 = grid1->getVertexIJK (Hex::Cyl2, 0,0,0);
773    //           vc3 = grid2->getVertexIJK (Hex::Cyl1, 0,0,0);
774                                      //    Cyl     i     j     k
775    Hex::Quad* qb = grid1-> getQuadIJ (Hex::Cyl2, nx_ext, Hex::S_E, 4);
776    Hex::Quad* qh = grid2-> getQuadIJ (Hex::Cyl1, nx_ext, Hex::S_N, 0); 
777
778    Hex::Vertex* vb0 = qb->getVertex (3);
779    Hex::Vertex* vb1 = qb->getVertex (2);
780    Hex::Vertex* vh0 = qh->getVertex (0);
781    Hex::Vertex* vh1 = qh->getVertex (1);
782
783    vb0 = grid1->getVertexIJK (Hex::Cyl2, 2, Hex::S_E,  4);  // cible
784    vb1 = grid1->getVertexIJK (Hex::Cyl2, 2, Hex::S_NE, 4);
785    vh0 = grid2->getVertexIJK (Hex::Cyl1, 2, Hex::S_N,  0);   // depart
786    vh1 = grid2->getVertexIJK (Hex::Cyl1, 2, Hex::S_NW, 0);
787
788    Imprimer (vh0);
789    Imprimer (vh1);
790    Imprimer (vb0);
791    Imprimer (vb1);
792
793    // qb->remove ();
794    // qh->remove ();
795    Hex::Quads hliste;
796
797    hliste.push_back (qh);
798    for (int ny=1; ny<Hex::S_MAXI; ny++)
799        {
800        int ns = (ny + Hex::S_N) MODULO Hex::S_MAXI;
801        hliste.push_back (grid2->getQuadIJ (Hex::Cyl1, nx_ext, ns, 0)); 
802        }
803
804    for (int ny=0; ny<4 ;  ny++)
805        hliste.push_back (grid2->getQuadIJ (Hex::Cyl1, nx_int, ny, 0)); 
806
807    doc->joinQuads  (hliste, qb, vh0, vb0, vh1, vb1, 5);
808    doc->saveVtk ("lorraine.vtk");
809    // doc->dump ();
810    CPPUNIT_ASSERT( true );
811 }
812 // ======================================================== Test_disconnect
813 void ModelTest::Test_disconnect ()
814 {
815    
816    const int size_x = 2;
817    const int size_y = 2;
818    const int size_z = 1;
819
820    Hex::Hex mon_ex;
821    Hex::Document* doc = mon_ex.addDocument ("foo");
822
823    Hex::Vertex*   orig1 = doc->addVertex (0,0,0);
824    Hex::Vertex*   orig2 = doc->addVertex (4,0,0);
825    Hex::Vertex*   orig3 = doc->addVertex (8,0,0);
826
827    Hex::Vector*   dir  = doc->addVector (1,1,1);
828    Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z);
829    Hex::Elements* grid2 = doc->makeCartesian (orig2, dir, size_x,size_y,size_z);
830    Hex::Elements* grid3 = doc->makeCartesian (orig3, dir, size_x,size_y,size_z);
831
832    int nvtk = 0;
833    doc->setLevel (1);
834    Hex::Matrix  matrice;
835    Hex::Vector* ecart  = doc->addVector (0.5,0.5,0);
836    matrice.defTranslation (ecart);
837
838    Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0);
839    Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0);
840    Hex::Hexa* hexa3 = grid3->getHexaIJK   (1,1,0);
841
842    Hex::Quad* quad  = grid1->getQuadJK  (1,1,0);
843    Hex::Edge* edge  = grid2->getEdgeK   (1,2,0);
844    Hex::Vertex* vertex = grid3->getVertexIJK (1,1,1);
845
846    quad->setScalar   (5);
847    edge->setScalar   (5);
848    vertex->setScalar (5);
849
850    doc->saveVtk ("Test_disco", nvtk);
851    doc->disconnectQuad (hexa1, quad);
852
853    hexa1 ->transform (&matrice);
854    doc->saveVtk ("Test_disco", nvtk);
855
856    doc->disconnectEdge (hexa2, edge);
857
858    hexa2->transform (&matrice);
859    doc->saveVtk ("Test_disco", nvtk);
860
861    doc->disconnectVertex (hexa3, vertex);
862
863    hexa3->transform (&matrice);
864    doc->saveVtk ("Test_disco", nvtk);
865
866    doc->dumpPropagation ();
867    // doc->dump  ();
868
869    CPPUNIT_ASSERT( true );
870 }
871 // ======================================================== Test_propagation
872 void ModelTest::Test_propagation ()
873 {
874    
875    const int size_x = 2;
876    const int size_y = 1;
877    const int size_z = 1;
878
879    Hex::Hex mon_ex;
880    Hex::Document* doc = mon_ex.addDocument ("foo");
881
882    Hex::Vertex*   orig = doc->addVertex (0,0,0);
883    Hex::Vector*   dir  = doc->addVector (1,1,1);
884    //  Hex::Elements* grid = 
885    doc->makeCartesian (orig, dir, size_x,size_y,size_z);
886
887    int nb = doc->countPropagation ();
888    for (int nro=0 ; nro<nb ; nro++)
889        {
890        Hex::Propagation*  prop  = doc ->getPropagation (nro);
891        const Hex::Edges&  table = prop->getEdges ();
892        printf (" ____________________________________ Prop nro %d\n", nro);
893        for (int ned=0 ; ned<(int)table.size() ; ned++)
894            {
895            bool way = table [ned]->getWay ();
896
897            if (way)
898               {
899               printf ("     (");
900               table [ned]->getVertex (0)->printName (", ");
901               table [ned]->getVertex (1)->printName (")\n");
902               }
903           else
904               {
905               printf ("     (");
906               table [ned]->getVertex (1)->printName (", ");
907               table [ned]->getVertex (0)->printName (")\n");
908               }
909            }
910        }
911
912    doc->dump  ();
913    doc->saveVtk ("Test_propagation.vtk");
914    doc->save    ("Test_propagation");
915
916    CPPUNIT_ASSERT( true );
917 }
918 // ======================================================== Test_move
919 void ModelTest::Test_move ()
920 {
921    
922    const int size_x = 1;
923    const int size_y = 1;
924    const int size_z = 2;
925
926    Hex::Hex mon_ex;
927    Hex::Document* doc = mon_ex.addDocument ("foo");
928
929    Hex::Vertex* orig = doc->addVertex (0,0,0);
930    Hex::Vector* dir  = doc->addVector (1,1,1);
931    Hex::Elements*  grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z);
932
933    Hex::Vector*   enhaut  = doc->addVector (0, 0, 5);
934    Hex::Vector*   devant  = doc->addVector (5, 0, 0);
935    // Hex::Vector*   agauche = doc->addVector (0, 5, 0);
936
937    Hex::Matrix matrice;
938    matrice.defTranslation (enhaut);
939
940    Hex::Hexa* cube    = grid->getHexa (1);
941    Hex::Quad* dessous = cube->getQuad (Hex::Q_A);
942    dessous->dump();
943    
944    Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
945    /* Hex::Elements* grid3 = doc->makeTranslation (grid, agauche); */
946    Hex::Hexa* cube2     = grid2->getHexa (1);
947
948    doc ->saveVtk ("move0.vtk");
949
950    cube ->disconnectQuad (dessous);
951    cube ->transform (&matrice);
952    cube2->transform (&matrice);
953
954    doc ->saveVtk ("move1.vtk");
955    doc ->dump();
956
957    CPPUNIT_ASSERT( true );
958 }
959 // ======================================================== Test_deux_cyl
960 void ModelTest::Test_deux_cyl ()
961 {
962    
963    Hex::Hex mon_ex;
964    Hex::Document* doc = mon_ex.addDocument ("foo");
965
966    Hex::Vertex* orig1 = doc->addVertex (0,0,-5);
967    Hex::Vertex* orig2 = doc->addVertex (-5,0,0);
968
969    Hex::Vector* vx = doc->addVector (1,0,0);
970    Hex::Vector* vy = doc->addVector (0,1,0);
971    Hex::Vector* vz = doc->addVector (0,0,1);
972
973    double dr = 1;
974    double da = 360; // degres
975    double dl = 1.0;
976    int    nr = 2;
977    int    na = 6;
978    int    nl = 10;
979
980    /* Hex::Elements* cyl1 = */ doc->makeCylindrical(orig1, vy,vz, dr, da, 
981                                        dl,nr,na,nl);
982
983    /* Hex::Elements* cyl2 = */ doc->makeCylindrical(orig2, vz,vx, dr/2, da, 
984                                        dl,nr,na,nl);
985    doc->saveVtk ("deux_cylindres.vtk");
986    CPPUNIT_ASSERT( true );
987 }
988 // ======================================================== Test_move2
989 void ModelTest::Test_transfo ()
990 {
991    
992    const int size_x = 1;
993    const int size_y = 1;
994    const int size_z = 2;
995
996    int    nvtk    = 0;
997    cpchar fic_vtk = "transfo";
998
999    Hex::Hex mon_ex;
1000    Hex::Document* doc = mon_ex.addDocument ("foo");
1001    doc ->setLevel (1);
1002
1003    Hex::Vertex* orig = doc->addVertex (0,0,0);
1004    Hex::Vector* dir  = doc->addVector (1,1,1);
1005    Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x, size_y,
1006                                                         size_z);
1007    if (grid==NULL)
1008       CPPUNIT_ASSERT( false );
1009
1010    orig->setScalar(2);
1011
1012    doc ->saveVtk (fic_vtk, nvtk);
1013
1014    Hex::Vector*   devant  = doc->addVector (5, 0, 0);
1015
1016    Hex::Elements* grid2 = doc->makeTranslation (grid, devant);
1017    if (grid2==NULL)
1018       CPPUNIT_ASSERT( false );
1019    doc ->saveVtk (fic_vtk, nvtk);
1020
1021    Hex::Elements* grid3  = doc->makeScale (grid2, orig, 2);
1022    if (grid3==NULL)
1023       CPPUNIT_ASSERT( false );
1024    doc ->saveVtk (fic_vtk, nvtk);
1025
1026    Hex::Elements* grid4 = doc->makeRotation (grid2, orig, dir, 45);
1027    if (grid4==NULL)
1028       CPPUNIT_ASSERT( false );
1029    doc ->saveVtk (fic_vtk, nvtk);
1030
1031    Hex::Elements* grid5 = doc->makeSymmetryPoint (grid4, orig);
1032    if (grid5==NULL)
1033       CPPUNIT_ASSERT( false );
1034
1035    doc ->saveVtk (fic_vtk, nvtk);
1036
1037    Hex::Vector* dir1  = doc->addVector (1,0,0);
1038    Hex::Elements* grid6 = doc->makeSymmetryLine (grid4, orig, dir1);
1039    if (grid6==NULL)
1040       CPPUNIT_ASSERT( false );
1041
1042    grid4->getHexa(0)->getVertex(0)->setScalar(3);
1043    grid6->getHexa(0)->getVertex(0)->setScalar(3);
1044    doc ->saveVtk (fic_vtk, nvtk);
1045
1046    grid4->getHexa(0)->getVertex(0)->setScalar(0);
1047    grid6->getHexa(0)->getVertex(0)->setScalar(0);
1048
1049    Hex::Elements* grid7 = doc->makeSymmetryLine (grid2, orig, dir1);
1050    if (grid7==NULL)
1051       CPPUNIT_ASSERT( false );
1052
1053    grid2->getHexa(0)->getVertex(0)->setScalar(4);
1054    grid7->getHexa(0)->getVertex(0)->setScalar(4);
1055    doc ->saveVtk (fic_vtk, nvtk);
1056
1057    grid2->getHexa(0)->getVertex(0)->setScalar(0);
1058    grid7->getHexa(0)->getVertex(0)->setScalar(0);
1059
1060    Hex::Elements* grid8 = doc->makeSymmetryPlane (grid2, orig, dir1);
1061    if (grid8==NULL)
1062       CPPUNIT_ASSERT( false );
1063
1064    grid2->getHexa(0)->getVertex(0)->setScalar(4);
1065    grid8->getHexa(0)->getVertex(0)->setScalar(4);
1066    doc ->saveVtk (fic_vtk, nvtk);
1067    grid2->getHexa(0)->getVertex(0)->setScalar(0);
1068    grid8->getHexa(0)->getVertex(0)->setScalar(0);
1069
1070    Hex::Elements* grid9 = doc->makeSymmetryPlane (grid3, orig, dir);
1071    if (grid9==NULL)
1072       CPPUNIT_ASSERT( false );
1073
1074    grid3->getHexa(0)->getVertex(0)->setScalar(4);
1075    grid9->getHexa(0)->getVertex(0)->setScalar(4);
1076    doc ->saveVtk (fic_vtk, nvtk);
1077
1078    grid9->getHexa(0)->removeConnected ();
1079    doc ->saveVtk (fic_vtk, nvtk);
1080
1081    CPPUNIT_ASSERT( true );
1082 }
1083
1084
1085
1086
1087