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 "HexBiCylinder.hxx"
29 // #include "HexCrossElements.hxx"
31 #include "HexHexa.hxx"
32 // #include "HexQuad.hxx"
33 // #include "HexEdge.hxx"
34 // #include "HexVertex.hxx"
36 static Hex::Hex mon_ex;
37 static Hex::Document* docu = NULL;
38 static cpchar case_name = "hexa";
40 // ======================================================== get_document
41 Hex::Document* get_document ()
44 docu = mon_ex.addDocument ();
49 // ======================================================== save_file
52 static int nbr_files = 0;
56 sprintf (filename, "%s%02d.vtk", case_name, nbr_files);
57 docu->saveVtk (filename);
60 // ======================================================== nearest
61 Hex::Vertex* nearest (Hex::Elements* grid, Hex::Vertex* vertex)
63 int nbre = grid->countVertex();
65 Hex::Vertex* result = NULL;
66 double px = vertex->getX();
67 double py = vertex->getY();
68 double pz = vertex->getZ();
69 for (int nro=0 ; nro < nbre ; ++nro)
71 Hex::Vertex* v1 = grid->getVertex (nro);
72 double d2 = Hex::carre(px-v1->getX()) + Hex::carre(py-v1->getY())
73 + Hex::carre(pz-v1->getZ()) ;
81 cout << " nearest : " << vertex->getName()
82 << " -> " << result->getName()
83 << " ( " << px << ", " << py << ", " << pz << ") " << endl;
87 // ======================================================== eplucher
88 void eplucher (Hex::Document* doc, Hex::Elements* grid, string& radical)
91 int nbre = grid->countHexa();
92 for (int nro=nbre-1 ; nro >0 ; nro--)
96 sprintf (name, "%s%02d.vtk", radical.c_str(), nbfic);
98 doc->removeHexa (grid->getHexa(nro));
101 // ======================================================== test_cartesian6
102 int test_cartesian6 (int nbargs, cpchar tabargs[])
104 case_name = "cartesian_top";
105 const int size_x = 3;
106 const int size_y = 4;
107 const int size_z = 5;
109 Hex::Document* doc = get_document ();
111 Hex::Elements* grid1 = doc->makeCartesianTop (size_x, size_y, size_z);
112 grid1->saveVtk ("makeCartesianTop.vtk");
113 PutData (grid1->isValid());
116 Hex::Vertex* orig2 = doc->addVertex (10, 0, 0);
117 Hex::Vector* vx = doc->addVector (1, 0, 0);
118 Hex::Vector* vy = doc->addVector (0, 1, 0);
119 Hex::Vector* vz = doc->addVector (0, 0, 1);
120 double dx =1, dy=1, dz=1;
121 Hex::Elements* grid2 = doc->makeCartesianUni (orig2, vx, vy, vz, dx, dy, dz,
122 size_x, size_y, size_z);
123 grid2->saveVtk ("makeCartesianUni.vtk");
124 PutData (grid2->isValid());
126 Hex::Vertex* orig3 = doc->addVertex (20, 0, 0);
127 Hex::RealVector tx, ty, tz;
128 for (int nro=1 ; nro<6 ; nro++)
136 Hex::Elements* grid3 = doc->makeCartesian (orig3, vx, vy, vz, tx, ty, tz);
137 grid3->saveVtk ("makeCartesian.vtk");
138 PutData (grid3->isValid());
143 // ======================================================== test_cylinder60
144 int test_cylinder60 (int nbargs, cpchar tabargs[])
146 case_name = "cylinders";
147 const int size_x = 1;
148 const int size_y = 4;
149 const int size_z = 1;
151 Hex::Document* doc = get_document ();
152 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
153 Hex::Vector* vx = doc->addVector (1, 0, 0);
154 Hex::Vector* vz = doc->addVector (0, 0, 1);
155 double rint =1, rext = 3, angle = 360, hauteur = 2;
156 Hex::Elements* grid3 = doc->makePipeUni (orig, vx, vz,
157 rint, rext, angle, hauteur,
158 size_x, size_y, size_z);
159 grid3->saveVtk ("makeCylinderUni.vtk");
160 PutData (grid3->isValid());
161 if (NOT (grid3->isValid()))
167 // ======================================================== test_cylinder_top
168 int test_cylinder_top (int nbargs, cpchar tabargs[])
170 case_name = "cylinders";
171 const int size_x = 1;
172 const int size_y = 3;
173 const int size_z = 1;
175 Hex::Document* doc = get_document ();
176 Hex::Elements* grid1 = doc->makeCylinderTop (size_x, size_y, size_z);
178 grid1->saveVtk ("makeCylinderTop.vtk");
179 PutData (grid1->isValid());
182 // ======================================================== test_cylinder6
183 int test_cylinder6 (int nbargs, cpchar tabargs[])
185 case_name = "cylinders";
186 const int size_x = 3;
187 const int size_y = 8;
188 const int size_z = 2;
190 Hex::Document* doc = get_document ();
192 /********************
193 Hex::Elements* grid1 = doc->makeCylinderTop (size_x, size_y, size_z);
194 grid1->saveVtk ("makeCylinderTop.vtk");
195 PutData (grid1->isValid());
198 Hex::Elements* grid2 = doc->makePipeTop (size_x, size_y, size_z);
199 grid2->saveVtk ("makePipeTop.vtk");
200 PutData (grid2->isValid());
201 ******************************/
203 Hex::Vertex* orig2 = doc->addVertex (0, 0, 5);
204 Hex::Vector* vx = doc->addVector (1, 0, 0);
205 Hex::Vector* vz = doc->addVector (0, 0, 1);
206 double rint =2, rext = 4, angle = 300, hauteur = 1;
207 Hex::Elements* grid3 = doc->makeCylinderUni (orig2, vx, vz,
208 rint, rext, angle, hauteur,
210 // size_x, size_y, size_z);
211 grid3->saveVtk ("makeCylinderUni1.vtk");
212 PutData (grid3->isValid());
213 if (NOT (grid3->isValid()))
218 Hex::Vertex* orig3 = doc->addVertex (20, 0, 0);
219 Hex::RealVector tx, ty, tz;
220 for (int nro=1 ; nro<6 ; nro++)
228 Hex::Elements* grid3 = doc->makeCartesian (orig3, vx, vy, vz, tx, ty, tz);
229 grid3->saveVtk ("makeCartesian.vtk");
230 PutData (grid3->isValid());
236 // ======================================================== test_spherical6
237 int test_spherical6 (int nbargs, cpchar tabargs[])
239 case_name = "spherical";
240 const int size_x = 3;
242 Hex::Document* doc = get_document ();
244 Hex::Elements* grid1 = doc->makeSphericalTop (size_x);
245 PutData (grid1->isValid());
247 int nbhexas = grid1->countHexa ();
249 for (int nro=3 ; nro<nbhexas ; nro +=3)
250 grid1->getHexa(nro)->remove();
252 grid1->saveVtk ("makeSphericalTop.vtk");
254 Hex::Vertex* orig2 = doc->addVertex (0, 0, 10);
255 Hex::Vector* vx = doc->addVector (1, 0, 0);
256 Hex::Vector* vz = doc->addVector (0, 1, 1);
258 Hex::Elements* grid2 = doc->makeSphericalUni (orig2, vx, vz, rayon, size_x);
259 if (NOT (grid1->isValid()))
262 PutData (grid2->isValid());
263 if (NOT (grid2->isValid()))
266 for (int nro=3 ; nro<nbhexas ; nro +=3)
267 grid2->getHexa(nro)->remove();
269 grid2->saveVtk ("makeSphericalUni.vtk");
272 // ======================================================== test_rind6
273 int test_rind6 (int nbargs, cpchar tabargs[])
276 const int size_r = 4;
277 const int size_a = 8;
278 const int size_h = 12;
280 Hex::Document* doc = get_document ();
282 Hex::Elements* grid1 = doc->makeSphereTop (size_r, size_a, size_h);
283 PutData (grid1->isValid());
284 if (NOT (grid1->isValid()))
287 grid1->saveVtk ("makeSphereTop.vtk");
289 Hex::Elements* grid2 = doc->makeRindTop (size_r, size_a, size_h);
290 PutData (grid2->isValid());
291 if (NOT (grid2->isValid()))
294 grid2->saveVtk ("makeRindTop.vtk");
296 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
297 Hex::Vertex* vplan = doc->addVertex (0, 0, -0.5);
298 Hex::Vector* vx = doc->addVector (1, 0, 0);
299 Hex::Vector* vz = doc->addVector (0, 0, 1);
305 Hex::Elements* grid3 = doc->makeSphereUni (orig, vx, vz,
306 rtrou, rext, angle, vplan,
307 size_r, size_a, size_h);
308 if (NOT (grid3->isValid()))
311 grid3->saveVtk ("makeSphereUni.vtk");
313 Hex::Elements* grid4 = doc->makeRindUni (orig, vx, vz,
314 rtrou, rint, rext, angle, vplan,
315 size_r, size_a, size_h);
316 if (NOT (grid4->isValid()))
319 grid4->saveVtk ("makeRindUni.vtk");
321 Hex::RealVector trad, tang, tphi;
322 double dr = (rext-rtrou)/size_r;
323 double dtheta = angle/size_a;
324 double dphi = 180.0/size_h;
325 for (int nro=0 ; nro<=size_r ; nro++) trad.push_back (rtrou + nro*dr);
326 for (int nro=0 ; nro<=size_a ; nro++) tang.push_back ( nro*dtheta);
327 for (int nro=0 ; nro<=size_h ; nro++) tphi.push_back (-90 + nro*dphi);
329 Hex::Elements* grid6 = doc->makeSphere (orig, vx, vz, trad, tang, tphi);
330 if (NOT (grid6->isValid()))
333 grid6->saveVtk ("makeSphereNew.vtk");
336 trad.push_back (rtrou);
337 for (int nro=0 ; nro<=size_r ; nro++) trad.push_back (rint + nro*dr);
338 Hex::Elements* grid7 = doc->makeRind (orig, vx, vz, trad, tang, tphi);
339 if (NOT (grid7->isValid()))
342 grid7->saveVtk ("makeRindNew.vtk");
345 // ======================================================== test_pipes6
346 int test_pipes6 (int nbargs, cpchar tabargs[])
350 bool t_right = false;
353 for (int narg=1 ; narg<nbargs ; narg++)
355 string arg = tabargs [narg];
356 if (arg=="-cyl") pipe = false;
357 else if (arg=="-pipe") pipe = true;
358 else if (arg=="-left") t_left = true;
359 else if (arg=="-right") t_right = true;
362 cout << " Syntax : " << endl;
363 cout << " $ " << tabargs[0] << " <args> " << endl;
364 cout << " avec args parmi :" << endl;
365 cout << " -cyl : croisement de 2 cylindres " << endl;
366 cout << " -pipe : croisement de 2 tuyaux " << endl;
367 cout << " -left : Forme en T, barre a gauche " << endl;
368 cout << " -right : Forme en T, barre a droite " << endl;
373 string radical = pipe ? "makePipes" : "makeCylinders";
375 double rext1 = 2*sqrt (2.0);
376 double rext2 = 3*sqrt (2.0);
377 double rint2 = rext1;
378 double rint1 = rext1/2;
395 Hex::Document* doc = get_document ();
397 Hex::Vertex* ori1 = doc->addVertex ( 0, 0, xl1);
398 Hex::Vertex* ori2 = doc->addVertex (-8, 0, 0);
399 Hex::Vector* vz1 = doc->addVector ( 0, 0, 1);
400 Hex::Vector* vz2 = doc->addVector ( 1, 0, 0);
402 Hex::BiCylinder* grid1 = NULL;
404 grid1 = doc->makePipes (ori1, vz1, rint1, rext1, h1, ori2, vz2, rint2,
407 grid1 = doc->makeCylinders (ori1, vz1, rext1, h1, ori2, vz2, rext2, h2);
409 PutData (grid1->isValid());
411 if (grid1->isValid())
412 eplucher (doc, grid1, radical);
416 // ======================================================== test_extrude6
417 int test_extrude6 (int nbargs, cpchar tabargs[])
423 Hex::Document* doc = get_document ();
425 Hex::Vertex* orig1 = doc->addVertex ( 0,0,0);
426 Hex::Vector* vx = doc->addVector ( 1,0,0);
427 Hex::Vector* vy = doc->addVector ( 0,1,0);
428 Hex::Vector* vz = doc->addVector ( 0,0,1);
429 Hex::Vector* dir1 = doc->addVector ( 1,1,1);
430 Hex::Vector* dir2 = doc->addVector ( 1,1,-1);
432 double dx =1, dy=1, dz=1;
433 Hex::Elements* grid1 = doc->makeCartesianUni (orig1, vx,vy,vz, dx,dy,dz,
438 Hex::Quads liste1, liste2;
440 liste1.push_back (grid1->getQuadIJ (mx, my, dimz));
441 liste2.push_back (grid1->getQuadIJ (mx, my, 0));
442 for (int nx=0; nx<dimx; nx++)
445 liste1.push_back (grid1->getQuadIJ (nx, my, dimz));
446 liste2.push_back (grid1->getQuadIJ (nx, my, 0));
449 for (int ny=0; ny<dimy; ny++)
452 liste1.push_back (grid1->getQuadIJ (mx, ny, dimz));
453 liste2.push_back (grid1->getQuadIJ (mx, ny, 0));
456 Hex::RealVector tlen;
460 for (int nro=0; nro<5; nro++)
467 const int nbiter = 5;
468 doc->saveVtk ("prisme1.vtk");
469 Hex::Elements* prisme2 = doc->extrudeQuadsUni (liste2, dir2, dh0, nbiter);
470 doc->saveVtk ("prisme2.vtk");
472 Hex::Elements* prisme1 = doc->extrudeQuads (liste1, dir1, tlen);
474 PutData (liste1.size());
475 PutData (tlen.size());
476 PutData (prisme1->countHexa());
477 PutData (prisme1->countQuad());
478 PutData (prisme1->countEdge());
479 PutData (prisme1->countVertex());
481 for (int nro=0 ; nro <nbiter ; nro++)
483 Hex::Hexa* cell = prisme2-> getHexa (nbiter+nro);
487 doc->saveVtk ("prisme3.vtk");
490 // ======================================================== test_revolution6
491 int test_revolution6 (int nbargs, cpchar tabargs[])
493 Hex::Document* doc = get_document ();
495 Hex::Vertex* centre = doc->addVertex (0, 0, 0);
496 Hex::Vector* vz = doc->addVector (0, 0, 1);
498 Hex::Vertex* v1 = doc->addVertex (10, 0, 0);
499 Hex::Vertex* v2 = doc->addVertex (11, 0, 0);
500 Hex::Vertex* v3 = doc->addVertex (11, 0, 2);
501 Hex::Vertex* v4 = doc->addVertex (10, 0, 2);
502 Hex::Quad* quad = doc->addQuadVertices (v1, v2, v3, v4);
504 Hex::Elements* grid0 = doc->revolutionQuadUni (quad, centre, vz, 180, 8);
505 doc->saveVtk ("revolution1.vtk");
512 Hex::Elements* grid = doc->makeCylinderTop (nr,na,nl);
515 for (int nx=0; nx<nr; nx++)
516 for (int ny=0; ny<na; ny++)
518 Hex::Quad* cell = grid->getQuadIJ (nx, ny, nl);
519 liste.push_back (cell);
520 cell -> setScalar (5);
523 Hex::Vertex* center = doc->addVertex (0, -10, 0);
524 center -> setScalar (6);
525 Hex::Vector* axis = doc->addVector (1, 0, 0);
527 doc->saveVtk ("revolution1.vtk");
529 Hex::Elements* grid1 = doc->revolutionQuadsUni (liste, center, axis, 180, 9);
531 if (grid1->isValid())
532 doc->saveVtk ("revolution2.vtk");
536 // ======================================================== test_joint6
537 int test_joint6 (int nbargs, cpchar tabargs[])
543 Hex::Document* doc = get_document ();
545 Hex::Elements* grid1 = doc->makeCartesianTop (dimx,dimy,dimz);
547 Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8);
548 Hex::Vector* vectj = doc->addVector (0,1,0);
549 Hex::Vector* vecti = doc->addVector (1,0,0);
550 Hex::Elements* grid2 = doc->makeCylinderUni (orig2, vecti, vectj,
551 1.0, 2.0, 180.0, 11.0, dimz,dimy,dimx);
555 Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz);
556 Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my);
558 Hex::Vertex* va1 = prems->getVertex (0);
559 Hex::Vertex* va2 = prems->getVertex (1);
561 Hex::Vertex* vb1 = cible->getVertex (1);
562 Hex::Vertex* vb2 = cible->getVertex (2);
567 liste.push_back (prems);
568 for (int nx=0; nx<dimx; nx++)
570 liste.push_back (grid1->getQuadIJ (nx, my, dimz));
572 for (int ny=0; ny<dimy; ny++)
574 liste.push_back (grid1->getQuadIJ (mx, ny, dimz));
576 doc->saveVtk ("jointQuad1.vtk");
577 const int hauteur = 5;
578 Hex::Elements* joint = doc->joinQuadsUni (liste, cible, va1,vb1,va2,vb2,
580 // for (int nh=0 ; nh<hauteur ; nh++) joint->getHexa(nh)->setScalar (5);
583 if (NOT joint->isValid ())
586 doc->saveVtk ("jointQuad2.vtk");
587 int nbr_joint_vertex = joint->countVertex ();
588 int nbr_surf_vertex = nbr_joint_vertex/(hauteur+1);
590 HexDisplay (nbr_joint_vertex);
591 HexDisplay (nbr_surf_vertex);
593 int indice0 = joint->findVertex (va1);
594 HexDisplay (indice0);
596 for (int nh=0 ; nh<nbr_surf_vertex ; nh++)
597 joint->getVertex(nh)->setScalar (5);
599 for (int nh=0 ; nh<=hauteur ; nh++)
600 joint->getVertex(nh*nbr_surf_vertex)->setScalar (3);
602 doc->saveVtk ("jointQuad3.vtk");
605 // ======================================================== test_cut6
606 int test_cut6 (int nbargs, cpchar tabargs[])
608 const int size_x = 2;
609 const int size_y = 1;
610 const int size_z = 1;
612 Hex::Document* doc = get_document ();
614 Hex::Elements* grid = doc->makeCartesianTop (size_x,size_y,size_z);
615 Hex::Edge* arete = grid->getEdgeK (0, 0, 0);
619 doc ->saveVtk ("decoupe", nvtk);
620 Hex::Elements* grid2 = doc->cutUni (arete, 2);
622 if (NOT grid2->isValid ())
624 doc ->saveVtk ("decoupe", nvtk);
626 Hex::RealVector tablen;
629 for (int nl=0 ; nl < 5 ; nl++)
633 tablen.push_back (abscisse);
635 arete = grid2->getEdge (0);
636 Hex::Elements* grid3 = doc->cut (arete, tablen);
637 if (NOT grid3->isValid ())
640 doc ->saveVtk ("decoupe", nvtk);
643 // ======================================================== test_six
644 void test_six (Hex::Document* doc, int action)
646 cpchar tabargs[] = { "salome" };
652 case 101 : test_cartesian6 (nbargs, tabargs);
655 case 102 : test_cylinder6 (nbargs, tabargs);
658 case 103 : test_spherical6 (nbargs, tabargs);
661 case 104 : test_rind6 (nbargs, tabargs);
664 case 105 : test_pipes6 (nbargs, tabargs);
667 case 106 : test_extrude6 (nbargs, tabargs);
670 case 107 : test_joint6 (nbargs, tabargs);
673 case 108 : test_cut6 (nbargs, tabargs);
679 // ======================================================== test_monica
680 int test_monica (int nbargs, cpchar tabargs[])
682 case_name = "monica";
684 Hex::Document* doc = get_document ();
685 Hex::Vertex* orig = doc->addVertex (0, 0, 0);
686 Hex::Vertex* orig2 = doc->addVertex (1.5, 1.5, -1);
688 Hex::Vector* vx = doc->addVector (1, 0, 0);
689 Hex::Vector* vy = doc->addVector (0, 1, 0);
690 Hex::Vector* vz = doc->addVector (0, 0, 1);
691 Hex::Vector* vxy = doc->addVector (1, 1, 0);
693 Hex::Elements* plaque = doc->makeCartesianUni (orig, vx,vy,vz, 1,1,1, 3,3,1);
696 Hex::Hexa* trou = plaque->getHexaIJK (1, 1, 0);
697 vector <Hex::Vertex*> tabv0, tabv1;
698 for (int nv=0 ; nv<8 ; nv++)
699 tabv1.push_back (trou->getVertex(nv));
702 doc->removeHexa (trou);
706 Hex::Elements* pipe = doc->makePipeUni (orig2, vxy, vz, 0.15, 0.5, 360, 3,
710 for (int nv=0 ; nv<8 ; nv++)
711 tabv0.push_back (nearest (pipe, tabv1[nv]));
714 for (int nv=0 ; nv<8 ; nv++)
716 int ier = doc->mergeVertices (tabv0[nv], tabv1[nv]);
717 cout << " nro = " << nv << ", ier = " << ier << endl;
725 // ======================================================== test_abu
726 int test_abu (int nbargs, cpchar tabargs[])
730 Hex::Document* doc = get_document ();
731 doc->makeCylinderTop (1,3,1);
733 PutData (doc->countVertex());
736 doc->save (case_name);