2 // C++ : Tests unitaires
4 // Copyright (C) 2009-2014 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"
28 #include "HexBiCylinder.hxx"
30 #include "HexHexa.hxx"
31 // #include "HexQuad.hxx"
32 // #include "HexEdge.hxx"
33 // #include "HexVertex.hxx"
35 static Hex::Hex mon_ex;
36 static Hex::Document* docu = NULL;
37 static cpchar case_name = "hexa";
39 // ======================================================== get_document
40 Hex::Document* get_document ()
43 docu = mon_ex.addDocument ();
48 // ======================================================== save_file
51 static int nbr_files = 0;
55 sprintf (filename, "%s%02d.vtk", case_name, nbr_files);
56 docu->saveVtk (filename);
59 // ======================================================== nearest
60 Hex::Vertex* nearest (Hex::Elements* grid, Hex::Vertex* vertex)
62 int nbre = grid->countVertex();
64 Hex::Vertex* result = NULL;
65 double px = vertex->getX();
66 double py = vertex->getY();
67 double pz = vertex->getZ();
68 for (int nro=0 ; nro < nbre ; ++nro)
70 Hex::Vertex* v1 = grid->getVertex (nro);
71 double d2 = Hex::carre(px-v1->getX()) + Hex::carre(py-v1->getY())
72 + Hex::carre(pz-v1->getZ()) ;
80 cout << " nearest : " << vertex->getName()
81 << " -> " << result->getName()
82 << " ( " << px << ", " << py << ", " << pz << ") " << endl;
86 // ======================================================== eplucher
87 void eplucher (Hex::Document* doc, Hex::Elements* grid, string& radical)
90 int nbre = grid->countHexa();
91 for (int nro=nbre-1 ; nro >0 ; nro--)
95 sprintf (name, "%s%02d.vtk", radical.c_str(), nbfic);
97 doc->removeHexa (grid->getHexa(nro));
100 // ======================================================== test_cartesian6
101 int test_cartesian6 (int nbargs, cpchar tabargs[])
103 case_name = "cartesian_top";
104 Hex::Document* doc = get_document ();
106 /***********************
107 const int size_x = 3;
108 const int size_y = 4;
109 const int size_z = 5;
111 Hex::Elements* grid1 = doc->makeCartesianTop (size_x, size_y, size_z);
112 grid1->saveVtk ("makeCartesianTop.vtk");
113 PutData (grid1->isValid());
115 ***************************/
117 Hex::Vertex* orig2 = doc->addVertex (0, 0, 0);
118 Hex::Vector* vx = doc->addVector (1, 0, 0);
119 Hex::Vector* vy = doc->addVector (0, 1, 0);
120 Hex::Vector* vz = doc->addVector (0, 0, 1);
121 int nx = 2, ny=1, nz=2;
122 double dx =nx, dy=ny, dz=nz;
123 Hex::Elements* grid2 = doc->makeCartesianUni (orig2, vx, vy, vz, dx, dy, dz,
125 grid2->saveVtk ("makeCartesianUni.vtk");
126 PutData (grid2->isValid());
129 Hex::Vertex* orig3 = doc->addVertex (20, 0, 0);
130 Hex::RealVector tx, ty, tz;
131 for (int nro=1 ; nro<6 ; nro++)
139 Hex::Elements* grid3 = doc->makeCartesian (orig3, vx, vy, vz, tx, ty, tz);
140 grid3->saveVtk ("makeCartesian.vtk");
141 PutData (grid3->isValid());
146 // ======================================================== test_cylinder60
147 int test_cylinder60 (int nbargs, cpchar tabargs[])
149 case_name = "cylinders";
150 const int size_x = 1;
151 const int size_y = 4;
152 const int size_z = 1;
154 Hex::Document* doc = get_document ();
155 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
156 Hex::Vector* vx = doc->addVector (1, 0, 0);
157 Hex::Vector* vz = doc->addVector (0, 0, 1);
158 double rint =1, rext = 3, angle = 360, hauteur = 2;
159 Hex::Elements* grid3 = doc->makePipeUni (orig, vx, vz,
160 rint, rext, angle, hauteur,
161 size_x, size_y, size_z);
162 grid3->saveVtk ("makeCylinderUni.vtk");
163 PutData (grid3->isValid());
164 if (NOT (grid3->isValid()))
170 // ======================================================== test_cylinder_top
171 int test_cylinder_top (int nbargs, cpchar tabargs[])
173 case_name = "cylinders";
174 const int size_x = 1;
175 const int size_y = 3;
176 const int size_z = 1;
178 Hex::Document* doc = get_document ();
179 Hex::Elements* grid1 = doc->makeCylinderTop (size_x, size_y, size_z);
181 grid1->saveVtk ("makeCylinderTop.vtk");
182 PutData (grid1->isValid());
185 // ======================================================== test_cylinder6
186 int test_cylinder6 (int nbargs, cpchar tabargs[])
188 case_name = "cylinders";
189 Hex::Document* doc = get_document ();
191 /********************
192 const int size_x = 3;
193 const int size_y = 8;
194 const int size_z = 2;
196 Hex::Elements* grid1 = doc->makeCylinderTop (size_x, size_y, size_z);
197 grid1->saveVtk ("makeCylinderTop.vtk");
198 PutData (grid1->isValid());
201 Hex::Elements* grid2 = doc->makePipeTop (size_x, size_y, size_z);
202 grid2->saveVtk ("makePipeTop.vtk");
203 PutData (grid2->isValid());
204 ******************************/
206 Hex::Vertex* orig2 = doc->addVertex (0, 0, 5);
207 Hex::Vector* vx = doc->addVector (1, 0, 0);
208 Hex::Vector* vz = doc->addVector (0, 0, 1);
209 double rint =2, rext = 4, angle = 300, hauteur = 1;
210 Hex::Elements* grid3 = doc->makeCylinderUni (orig2, vx, vz,
211 rint, rext, angle, hauteur,
213 // size_x, size_y, size_z);
214 grid3->saveVtk ("makeCylinderUni1.vtk");
215 PutData (grid3->isValid());
216 if (NOT (grid3->isValid()))
221 Hex::Vertex* orig3 = doc->addVertex (20, 0, 0);
222 Hex::RealVector tx, ty, tz;
223 for (int nro=1 ; nro<6 ; nro++)
231 Hex::Elements* grid3 = doc->makeCartesian (orig3, vx, vy, vz, tx, ty, tz);
232 grid3->saveVtk ("makeCartesian.vtk");
233 PutData (grid3->isValid());
239 // ======================================================== test_spherical6
240 int test_spherical6 (int nbargs, cpchar tabargs[])
242 case_name = "spherical";
243 const int size_x = 3;
245 Hex::Document* doc = get_document ();
247 Hex::Elements* grid1 = doc->makeSphericalTop (size_x);
248 PutData (grid1->isValid());
250 int nbhexas = grid1->countHexa ();
252 for (int nro=3 ; nro<nbhexas ; nro +=3)
253 grid1->getHexa(nro)->remove();
255 grid1->saveVtk ("makeSphericalTop.vtk");
257 Hex::Vertex* orig2 = doc->addVertex (0, 0, 10);
258 Hex::Vector* vx = doc->addVector (1, 0, 0);
259 Hex::Vector* vz = doc->addVector (0, 1, 1);
261 Hex::Elements* grid2 = doc->makeSphericalUni (orig2, vx, vz, rayon, size_x);
262 if (NOT (grid1->isValid()))
265 PutData (grid2->isValid());
266 if (NOT (grid2->isValid()))
269 for (int nro=3 ; nro<nbhexas ; nro +=3)
270 grid2->getHexa(nro)->remove();
272 grid2->saveVtk ("makeSphericalUni.vtk");
275 // ======================================================== test_rind6
276 int test_rind6 (int nbargs, cpchar tabargs[])
279 const int size_r = 4;
280 const int size_a = 8;
281 const int size_h = 12;
283 Hex::Document* doc = get_document ();
285 Hex::Elements* grid1 = doc->makeSphereTop (size_r, size_a, size_h);
286 PutData (grid1->isValid());
287 if (NOT (grid1->isValid()))
290 grid1->saveVtk ("makeSphereTop.vtk");
292 Hex::Elements* grid2 = doc->makeRindTop (size_r, size_a, size_h);
293 PutData (grid2->isValid());
294 if (NOT (grid2->isValid()))
297 grid2->saveVtk ("makeRindTop.vtk");
299 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
300 Hex::Vertex* vplan = doc->addVertex (0, 0, -0.5);
301 Hex::Vector* vx = doc->addVector (1, 0, 0);
302 Hex::Vector* vz = doc->addVector (0, 0, 1);
308 Hex::Elements* grid3 = doc->makeSphereUni (orig, vx, vz,
309 rtrou, rext, angle, vplan,
310 size_r, size_a, size_h);
311 if (NOT (grid3->isValid()))
314 grid3->saveVtk ("makeSphereUni.vtk");
316 Hex::Elements* grid4 = doc->makeRindUni (orig, vx, vz,
317 rtrou, rint, rext, angle, vplan,
318 size_r, size_a, size_h);
319 if (NOT (grid4->isValid()))
322 grid4->saveVtk ("makeRindUni.vtk");
324 Hex::RealVector trad, tang, tphi;
325 double dr = (rext-rtrou)/size_r;
326 double dtheta = angle/size_a;
327 double dphi = 180.0/size_h;
328 for (int nro=0 ; nro<=size_r ; nro++) trad.push_back (rtrou + nro*dr);
329 for (int nro=0 ; nro<=size_a ; nro++) tang.push_back ( nro*dtheta);
330 for (int nro=0 ; nro<=size_h ; nro++) tphi.push_back (-90 + nro*dphi);
332 Hex::Elements* grid6 = doc->makeSphere (orig, vx, vz, trad, tang, tphi);
333 if (NOT (grid6->isValid()))
336 grid6->saveVtk ("makeSphereNew.vtk");
339 trad.push_back (rtrou);
340 for (int nro=0 ; nro<=size_r ; nro++) trad.push_back (rint + nro*dr);
341 Hex::Elements* grid7 = doc->makeRind (orig, vx, vz, trad, tang, tphi);
342 if (NOT (grid7->isValid()))
345 grid7->saveVtk ("makeRindNew.vtk");
348 // ======================================================== test_pipes6
349 int test_pipes6 (int nbargs, cpchar tabargs[])
353 bool t_right = false;
356 for (int narg=1 ; narg<nbargs ; narg++)
358 string arg = tabargs [narg];
359 if (arg=="-cyl") pipe = false;
360 else if (arg=="-pipe") pipe = true;
361 else if (arg=="-left") t_left = true;
362 else if (arg=="-right") t_right = true;
365 cout << " Syntax : " << endl;
366 cout << " $ " << tabargs[0] << " <args> " << endl;
367 cout << " avec args parmi :" << endl;
368 cout << " -cyl : croisement de 2 cylindres " << endl;
369 cout << " -pipe : croisement de 2 tuyaux " << endl;
370 cout << " -left : Forme en T, barre a gauche " << endl;
371 cout << " -right : Forme en T, barre a droite " << endl;
376 string radical = pipe ? "makePipes" : "makeCylinders";
378 double rext1 = 2*sqrt (2.0);
379 double rext2 = 3*sqrt (2.0);
380 double rint2 = rext1;
381 double rint1 = rext1/2;
398 Hex::Document* doc = get_document ();
400 Hex::Vertex* ori1 = doc->addVertex ( 0, 0, xl1);
401 Hex::Vertex* ori2 = doc->addVertex (-8, 0, 0);
402 Hex::Vector* vz1 = doc->addVector ( 0, 0, 1);
403 Hex::Vector* vz2 = doc->addVector ( 1, 0, 0);
405 Hex::BiCylinder* grid1 = NULL;
407 grid1 = doc->makePipes (ori1, vz1, rint1, rext1, h1, ori2, vz2, rint2,
410 grid1 = doc->makeCylinders (ori1, vz1, rext1, h1, ori2, vz2, rext2, h2);
412 PutData (grid1->isValid());
414 if (grid1->isValid())
415 eplucher (doc, grid1, radical);
419 // ======================================================== test_extrude6
420 int test_extrude6 (int nbargs, cpchar tabargs[])
426 Hex::Document* doc = get_document ();
428 Hex::Vertex* orig1 = doc->addVertex ( 0,0,0);
429 Hex::Vector* vx = doc->addVector ( 1,0,0);
430 Hex::Vector* vy = doc->addVector ( 0,1,0);
431 Hex::Vector* vz = doc->addVector ( 0,0,1);
432 Hex::Vector* dir1 = doc->addVector ( 1,1,1);
433 Hex::Vector* dir2 = doc->addVector ( 1,1,-1);
435 double dx =1, dy=1, dz=1;
436 Hex::Elements* grid1 = doc->makeCartesianUni (orig1, vx,vy,vz, dx,dy,dz,
441 Hex::Quads liste1, liste2;
443 liste1.push_back (grid1->getQuadIJ (mx, my, dimz));
444 liste2.push_back (grid1->getQuadIJ (mx, my, 0));
445 for (int nx=0; nx<dimx; nx++)
448 liste1.push_back (grid1->getQuadIJ (nx, my, dimz));
449 liste2.push_back (grid1->getQuadIJ (nx, my, 0));
452 for (int ny=0; ny<dimy; ny++)
455 liste1.push_back (grid1->getQuadIJ (mx, ny, dimz));
456 liste2.push_back (grid1->getQuadIJ (mx, ny, 0));
459 Hex::RealVector tlen;
463 for (int nro=0; nro<5; nro++)
470 const int nbiter = 5;
471 doc->saveVtk ("prisme1.vtk");
472 Hex::Elements* prisme2 = doc->extrudeQuadsUni (liste2, dir2, dh0, nbiter);
473 doc->saveVtk ("prisme2.vtk");
475 Hex::Elements* prisme1 = doc->extrudeQuads (liste1, dir1, tlen);
477 PutData (liste1.size());
478 PutData (tlen.size());
479 PutData (prisme1->countHexa());
480 PutData (prisme1->countQuad());
481 PutData (prisme1->countEdge());
482 PutData (prisme1->countVertex());
484 for (int nro=0 ; nro <nbiter ; nro++)
486 Hex::Hexa* cell = prisme2-> getHexa (nbiter+nro);
490 doc->saveVtk ("prisme3.vtk");
493 // ======================================================== test_extrude7
494 int test_extrude7 (int nbargs, cpchar tabargs[])
500 Hex::Document* doc = get_document ();
501 Hex::Elements* grid1 = doc->makeCylinderTop (nr, na, nh);
504 for (int k=0 ; k<nh ; k++)
506 Hex::Quad* quad = grid1->getQuadJK (nr, 0, k);
508 tquads.push_back (quad);
511 doc->saveVtk ("grid0.vtk");
512 Hex::Elements* grid2 = doc->extrudeQuadsTop (tquads, 4);
513 doc->saveVtk ("grid1.vtk");
516 // ======================================================== test_revolution6
517 int test_revolution6 (int nbargs, cpchar tabargs[])
519 Hex::Document* doc = get_document ();
521 Hex::Vertex* centre = doc->addVertex (0, 0, 0);
522 Hex::Vector* vz = doc->addVector (0, 0, 1);
524 Hex::Vertex* v1 = doc->addVertex (10, 0, 0);
525 Hex::Vertex* v2 = doc->addVertex (11, 0, 0);
526 Hex::Vertex* v3 = doc->addVertex (11, 0, 2);
527 Hex::Vertex* v4 = doc->addVertex (10, 0, 2);
528 Hex::Quad* quad = doc->addQuadVertices (v1, v2, v3, v4);
530 doc->revolutionQuadUni (quad, centre, vz, 180, 8);
531 doc->saveVtk ("revolution1.vtk");
538 Hex::Elements* grid = doc->makeCylinderTop (nr,na,nl);
541 for (int nx=0; nx<nr; nx++)
542 for (int ny=0; ny<na; ny++)
544 Hex::Quad* cell = grid->getQuadIJ (nx, ny, nl);
545 liste.push_back (cell);
546 cell -> setScalar (5);
549 Hex::Vertex* center = doc->addVertex (0, -10, 0);
550 center -> setScalar (6);
551 Hex::Vector* axis = doc->addVector (1, 0, 0);
553 doc->saveVtk ("revolution1.vtk");
555 Hex::Elements* grid1 = doc->revolutionQuadsUni (liste, center, axis, 180, 9);
557 if (grid1->isValid())
558 doc->saveVtk ("revolution2.vtk");
562 // ======================================================== test_joint6
563 int test_joint6 (int nbargs, cpchar tabargs[])
569 Hex::Document* doc = get_document ();
571 Hex::Elements* grid1 = doc->makeCartesianTop (dimx,dimy,dimz);
573 Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8);
574 Hex::Vector* vectj = doc->addVector (0,1,0);
575 Hex::Vector* vecti = doc->addVector (1,0,0);
576 Hex::Elements* grid2 = doc->makeCylinderUni (orig2, vecti, vectj,
577 1.0, 2.0, 180.0, 11.0, dimz,dimy,dimx);
581 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
582 Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my);
584 Hex::Vertex* va1 = prems->getVertex (0);
585 Hex::Vertex* va2 = prems->getVertex (1);
587 Hex::Vertex* vb1 = cible->getVertex (1);
588 Hex::Vertex* vb2 = cible->getVertex (2);
593 liste.push_back (prems);
594 for (int nx=0; nx<dimx; nx++)
596 liste.push_back (grid1->getQuadIJ (nx, my, dimz));
598 for (int ny=0; ny<dimy; ny++)
600 liste.push_back (grid1->getQuadIJ (mx, ny, dimz));
602 doc->saveVtk ("jointQuad1.vtk");
603 const int hauteur = 5;
604 Hex::Elements* joint = doc->joinQuadsUni (liste, cible, va1,vb1,va2,vb2,
606 // for (int nh=0 ; nh<hauteur ; nh++) joint->getHexa(nh)->setScalar (5);
609 if (NOT joint->isValid ())
612 doc->saveVtk ("jointQuad2.vtk");
613 int nbr_joint_vertex = joint->countVertex ();
614 int nbr_surf_vertex = nbr_joint_vertex/(hauteur+1);
616 HexDisplay (nbr_joint_vertex);
617 HexDisplay (nbr_surf_vertex);
619 int indice0 = joint->findVertex (va1);
620 HexDisplay (indice0);
622 for (int nh=0 ; nh<nbr_surf_vertex ; nh++)
623 joint->getVertex(nh)->setScalar (5);
625 for (int nh=0 ; nh<=hauteur ; nh++)
626 joint->getVertex(nh*nbr_surf_vertex)->setScalar (3);
628 doc->saveVtk ("jointQuad3.vtk");
631 // ======================================================== test_cut6
632 int test_cut6 (int nbargs, cpchar tabargs[])
634 const int size_x = 2;
635 const int size_y = 1;
636 const int size_z = 1;
638 Hex::Document* doc = get_document ();
640 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
641 Hex::Edge* arete = grid->getEdgeK (0, 0, 0);
645 doc ->saveVtk ("decoupe", nvtk);
646 Hex::Elements* grid2 = doc->cutUni (arete, 2);
648 if (NOT grid2->isValid ())
650 doc ->saveVtk ("decoupe", nvtk);
652 Hex::RealVector tablen;
655 for (int nl=0 ; nl < 5 ; nl++)
659 tablen.push_back (abscisse);
661 arete = grid2->getEdge (0);
662 Hex::Elements* grid3 = doc->cut (arete, tablen);
663 if (NOT grid3->isValid ())
666 doc ->saveVtk ("decoupe", nvtk);
669 // ======================================================== test_six
670 void test_six (Hex::Document* doc, int action)
672 cpchar tabargs[] = { "salome" };
678 case 101 : test_cartesian6 (nbargs, tabargs);
681 case 102 : test_cylinder6 (nbargs, tabargs);
684 case 103 : test_spherical6 (nbargs, tabargs);
687 case 104 : test_rind6 (nbargs, tabargs);
690 case 105 : test_pipes6 (nbargs, tabargs);
693 case 106 : test_extrude6 (nbargs, tabargs);
696 case 107 : test_joint6 (nbargs, tabargs);
699 case 108 : test_cut6 (nbargs, tabargs);
705 // ======================================================== test_monica
706 int test_monica (int nbargs, cpchar tabargs[])
708 case_name = "monica";
710 Hex::Document* doc = get_document ();
711 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
712 Hex::Vertex* orig2 = doc->addVertex (1.5, 1.5, -1);
714 Hex::Vector* vx = doc->addVector (1, 0, 0);
715 Hex::Vector* vy = doc->addVector (0, 1, 0);
716 Hex::Vector* vz = doc->addVector (0, 0, 1);
717 Hex::Vector* vxy = doc->addVector (1, 1, 0);
719 Hex::Elements* plaque = doc->makeCartesianUni (orig, vx,vy,vz, 1,1,1, 3,3,1);
722 Hex::Hexa* trou = plaque->getHexaIJK (1, 1, 0);
723 vector <Hex::Vertex*> tabv0, tabv1;
724 for (int nv=0 ; nv<8 ; nv++)
725 tabv1.push_back (trou->getVertex(nv));
728 doc->removeHexa (trou);
732 Hex::Elements* pipe = doc->makePipeUni (orig2, vxy, vz, 0.15, 0.5, 360, 3,
736 for (int nv=0 ; nv<8 ; nv++)
737 tabv0.push_back (nearest (pipe, tabv1[nv]));
740 for (int nv=0 ; nv<8 ; nv++)
742 int ier = doc->mergeVertices (tabv0[nv], tabv1[nv]);
743 cout << " nro = " << nv << ", ier = " << ier << endl;
751 // ======================================================== test_abu
752 int test_abu (int nbargs, cpchar tabargs[])
756 Hex::Document* doc = get_document ();
757 doc->makeCylinderTop (1,3,1);
759 PutData (doc->countVertex());
762 doc->save (case_name);