TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Faces.cpp
1/****************************************************************************
2* Copyright (c) 2025, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Faces.h>
17#include <DomaineAxi1d.h>
18#include <communications.h>
19#include <Linear_algebra_tools_impl.h>
20#include <TRUSTLists.h>
21
22Implemente_instanciable_32_64(Faces_32_64,"Faces",Objet_U);
23
24/*! @brief Ecrit les faces sur un flots de sortie.
25 *
26 * On ecrit:
27 * - le type des faces
28 * - les sommets
29 * - les voisins
30 * On ecrit juste le type Type_Face::vide_0D, si le nombre de
31 * faces est nul.
32 *
33 * @param (Sortie& s) un flot de sortie
34 * @return (Sortie&) le flot de sortie modifie
35 */
36template <typename _SIZE_>
38{
39 if(nb_faces()==0)
40 s << "vide_0D" << finl;
41 else
42 {
43 s << (type(type_face_)) << finl;
44 s << sommets;
45 s << faces_voisins;
46 }
47 return s ;
48}
49
50/*! @brief Ecrit les faces sur un flots de sortie.
51 *
52 * On ecrit:
53 * - le type des faces
54 * - les sommets
55 * - les voisins
56 * On ecrit juste le type Type_Face::vide_0D, si le nombre de
57 * faces est nul.
58 *
59 * @param (Sortie& s) un flot de sortie
60 * @return (Sortie&) le flot de sortie modifie
61 */
62template <typename _SIZE_>
64{
65 if(nb_faces()==0)
66 s << "vide_0D" << finl;
67 else
68 {
69 s << (type(type_face_)) << finl;
70 sommets.ecrit(s);
71 faces_voisins.ecrit(s);
72 }
73 return s ;
74}
75
76/*! @brief Lit les specifications d'un objet face a partir d'un flot d'entree.
77 *
78 * On lit:
79 * - le type des faces
80 * - les sommets
81 * - les voisins
82 * Et on reordonne les sommets.
83 * Cree un objets Faces_32_64 avec 0 faces si le type est "vide_0D"
84 *
85 * @param (Entree& s) un flot d'entree
86 * @return (Entree&) le flot d'entree modifie
87 */
88template <typename _SIZE_>
90{
91 Motcle typ;
92 s >> typ;
93 typer(typ);
94 if (typ != "vide_0D")
95 {
96 // Les sommets et faces ne sont ecrits que si le type n'est pas vide:
97 s >> sommets;
98 s >> faces_voisins;
99 }
100 else
101 {
102 // pour ne pas planter betement la suite qui suppose nb_dim()==2 et line_size_ > 0
103 sommets.resize(0,1);
104 faces_voisins.resize(0,2);
105 }
106 return s;
107}
108
109
110/*! @brief Lit les specifications d'un objet face a partir d'un flot d'entree.
111 *
112 * On lit:
113 * - le type des faces
114 * - les sommets
115 * - les voisins
116 * Et on reordonne les sommets.
117 * Ne fait rien si le type lu est "vide_0D"
118 *
119 * @param (Entree& s) un flot d'entree
120 * @return (Entree&) le flot d'entree modifie
121 */
122template <typename _SIZE_>
124{
125 Motcle typ;
126 s >> typ;
127 if(typ!="vide_0D")
128 {
129 typer(typ);
130 sommets.lit(s);
131 faces_voisins.lit(s);
132 reordonner();
133 }
134 else
135 {
136 typer(typ);
137 sommets.resize(0,0);
138 faces_voisins.resize(0,2);
139 }
140 return s ;
141}
142
143
144/*! @brief Renvoie le numero du plus petit (au sens de la
145 * numerotation des sommets) sommet d'une face
146 *
147 * @param (Faces& faces) les faces
148 * @param (int face) la face dont on cherche le plus petit sommet
149 * @param (int nb_som) le nombre de sommet par face
150 * @return (int) le numero du plus petit sommet la face specifiee
151 */
152template <typename _SIZE_>
153typename Faces_32_64<_SIZE_>::int_t Faces_32_64<_SIZE_>::ppsf(int_t face, int nb_som) const
154{
155 int_t som = sommet(face,0);
156 for(int imin=1; imin < nb_som; imin++)
157 som=std::min(som,sommet(face,imin));
158 return som;
159}
160
161/*! @brief Compare 2 faces de 2 ensembles de faces f1 et f2
162 *
163 * et Renvoie 1 si elles sont egales, 0 Sinon.
164 *
165 * @param (int f1) l'indice de la face dans le premier ensemble de face represente par *this
166 * @param (Faces& faces2) le deuxieme ensemble de face
167 * @param (int f2) l'indice de la face dans le deuxieme ensemble de face
168 * @param (int nb_som) le nombre de sommet par face
169 * @return (int) 1 si les 2 faces sont les memes 0 sinon
170 */
171template <typename _SIZE_>
172bool Faces_32_64<_SIZE_>::same_face(int_t f1, const Faces_32_64& faces2, int_t f2, int nb_som) const
173{
174 // [ABN] ??? I don't understand this ugliness - should compare std::set<>?
175 bool ok=true;
176 for(int i=0; i<nb_som && ok ; i++)
177 {
178 bool nok=true;
179 for(int j=0; j<nb_som && nok ; j++)
180 {
181 if(sommet(f1, i) == faces2.sommet(f2, j))
182 nok=false; // memes sommets
183 }
184 if(nok) ok=false; // sommet pas trouve ==> pas meme face
185 }
186 return ok;
187}
188
189/*! @brief Renvoie un objet de Type_Face representant le type de nom specifie.
190 *
191 * Les noms de types reconnus sont:
192 * "vide_0D"
193 * "point_1D"
194 * "point_1D_axi"
195 * "segment_2D"
196 * "triangle_3D"
197 * "quadrangle_3D"
198 * "segment_2D_axi"
199 * "quadrangle_3D_axi"
200 * "quadrilatere_2D_axi"
201 *
202 * @param (Motcle& mot) le mot clef representant un type de face
203 * @return (Type_Face) le type de face correspondant au parametre mo
204 * @throws type de face non reconnu
205 */
206template <typename _SIZE_>
207Type_Face Faces_32_64<_SIZE_>::type(const Motcle& mot) const
208{
209 Motcles les_mots(10);
210 {
211 les_mots[0]="vide_0D";
212 les_mots[1]="point_1D";
213 les_mots[2]="point_1D_axi";
214 les_mots[3]="segment_2D";
215 les_mots[4]="triangle_3D";
216 les_mots[5]="quadrangle_3D";
217 les_mots[6]="segment_2D_axi";
218 les_mots[7]="quadrangle_3D_axi";
219 les_mots[8]="quadrilatere_2D_axi";
220 les_mots[9]="polygone_3d";
221 }
222 int rang=les_mots.search(mot);
223 switch(rang)
224 {
225 case 0 :
226 return Type_Face::vide_0D;
227 case 1 :
228 return Type_Face::point_1D;
229 case 2 :
230 return Type_Face::point_1D_axi;
231 case 3 :
232 return Type_Face::segment_2D;
233 case 4 :
234 return Type_Face::triangle_3D;
235 case 5 :
236 return Type_Face::quadrangle_3D;
237 case 6 :
238 return Type_Face::segment_2D_axi;
239 case 7 :
240 return Type_Face::quadrangle_3D_axi;
241 case 8 :
242 return Type_Face::quadrilatere_2D_axi;
243 case 9 :
244 return Type_Face::polygone_3D;
245 default :
246 {
247 Cerr << "In the area number " << Process::me() << " " << mot << " is not a type of face." << finl;
248 Cerr << "Check your splitting." << finl;
249 // Si mot est vide c'est que l'on tente de relire des Domaines creees avec une version anterieure a la 1.5.1
250 if (mot=="")
251 {
252 Cerr << "Your splitting seems to have been done with a TRUST version 1.5 or earlier. Since" << finl;
253 Cerr << "the 1.5.1, the files format of .Zones containing the splitting of your mesh has evolved." << finl;
254 Cerr << "You must therefore rebuild the splitting of your mesh with TRUST version 1.5.1 or newer." <<
255 finl;
256 }
257 exit();
258 }
259 }
260 // pour le compilo :
261 return Type_Face::point_1D;
262}
263
264/*! @brief Renvoie le nom associe a un type de face.
265 *
266 * (inverse de Type_Face Faces_32_64<_SIZE_>::type(const Motcle& ) const)
267 *
268 * @param (Type_Face& typ) un type de face
269 * @return (Motcle&) le nom correspondant au type speficie en parametre
270 * @throws type de face non reconnu
271 */
272template <typename _SIZE_>
273Motcle& Faces_32_64<_SIZE_>::type(const Type_Face& typ) const
274{
275 static Motcle mot;
276 switch(typ)
277 {
278 case Type_Face::vide_0D :
279 mot="vide_0D";
280 break;
281 case Type_Face::point_1D :
282 mot="point_1D";
283 break;
284 case Type_Face::point_1D_axi :
285 mot="point_1D_axi";
286 break;
287 case Type_Face::segment_2D :
288 mot="segment_2D";
289 break;
290 case Type_Face::segment_2D_axi :
291 mot="segment_2D_axi";
292 break;
293 case Type_Face::triangle_3D :
294 mot="triangle_3D";
295 break;
296 case Type_Face::quadrangle_3D :
297 mot="quadrangle_3D";
298 break;
299 case Type_Face::quadrangle_3D_axi :
300 mot="quadrangle_3D_axi";
301 break;
302 case Type_Face::quadrilatere_2D_axi :
303 mot="quadrilatere_2D_axi";
304 break;
305 case Type_Face::polygone_3D:
306 mot="polygone_3D";
307 break;
308 default :
309 {
310 Cerr << "Error TRUST in Motcle& Faces_32_64<_SIZE_>::type(const Type_Face& typ)" << finl;
311 exit();
312 }
313 }
314 return mot;
315}
316
317/*! @brief Ajoute des faces.
318 *
319 * Ajouter des faces revient a ajouter des sommets.
320 *
321 * @param (IntTab& sommet) le tableau des sommets a ajouter
322 * @throws les sommets specifies n'ont pas la bonne dimension (1D,2D,3D)
323 */
324template <typename _SIZE_>
326{
327 assert(sommets.dimension(1)==tab_sommet.dimension(1));
328 int_t oldsz=sommets.dimension(0);
329 int_t addsz=tab_sommet.dimension(0);
330 dimensionner(oldsz+addsz);
331 for(int_t i=0; i<addsz; i++)
332 for(int j=0; j<tab_sommet.dimension(1); j++)
333 sommets(oldsz+i,j)=tab_sommet(i,j);
334}
335
336/*! @brief (Re-)dimensionne les faces On redimensionne les voisins en consequence.
337 *
338 * Les sommets implicitement ajoutes sont initialises a -1.
339 *
340 * @param (int i) le nouveau nombre de face
341 * @return (int) le nouveau nombre de face
342 */
343template <typename _SIZE_>
345{
346 int_t oldsz=nb_faces();
347 int nombre_som_faces=nb_som_faces();
348 if (sommets.size()!=0) sommets.detach_vect(); // Fixed bug: To have the possibility of merging borders after discretization
349 sommets.resize(i,nombre_som_faces);
350 faces_voisins.resize(i, 2);
351 for(int_t j=oldsz; j<i; j++)
352 {
353 for(int k=0; k<nombre_som_faces; k++)
354 sommets(j,k)=-1;
355 faces_voisins(j,0)=faces_voisins(j,1)=-1;
356 }
357 return i;
358}
359
360/*! @brief Initialise les voisins des faces joints a -1
361 *
362 * @param (int nb_faces_joint) le nombre de faces representant des Joints
363 */
364template <typename _SIZE_>
366{
367 for(int_t i=0; i<nb_faces_joint; i++)
368 // faces_voisins(i,0)=faces_voisins(i,1)=-2;
369 faces_voisins(i,0)=faces_voisins(i,1)=-1;
370}
371
372/*! @brief Initialise les sommets des faces joints a -1
373 *
374 * @param (int nb_faces_joint) le nombre de faces representant des Joints
375 */
376template <typename _SIZE_>
378{
379 for(int_t i=0; i<nb_faces_joint; i++)
380 for(int k=0; k<nb_som_faces(); k++)
381 // sommets(i,k)=-2;
382 sommets(i,k)=-1;
383}
384
385/*! @brief Type les faces
386 *
387 * @param (Motcle& typ) le type a donner aux faces
388 */
389template <typename _SIZE_>
391{
392 typer(type(typ));
393}
394
395/*! @brief Type les faces
396 *
397 * @param (Type_Face& typ) le type a donner aux faces
398 * @throws type de face inconnu
399 */
400template <typename _SIZE_>
401void Faces_32_64<_SIZE_>::typer(const Type_Face& typ)
402{
403 type_face_ = typ;
404 // int axi_ = 0;
405 int max_dim = 3;
406 switch(typ)
407 {
408 case Type_Face::vide_0D :
409 nb_som_face=0;
410 break;
411 case Type_Face::point_1D :
412 case Type_Face::point_1D_axi :
413 nb_som_face=1;
414 break;
415 case Type_Face::segment_2D :
416 nb_som_face=2;
417 break;
418 case Type_Face::segment_2D_axi :
419 nb_som_face=2; //axi_=1;
420 break;
421 case Type_Face::triangle_3D :
422 nb_som_face=3;
423 break;
424 case Type_Face::quadrangle_3D :
425 nb_som_face=4;
426 break;
427 case Type_Face::quadrangle_3D_axi :
428 nb_som_face=4; //axi_=1;
429 break;
430 case Type_Face::quadrilatere_2D_axi :
431 nb_som_face=2; //axi_=1;
432 break;
433 case Type_Face::polygone_3D:
434 nb_som_face=-1; // sera fixe plus tard
435 break;
436 default :
437 {
438 Cerr << "Error TRUST in Faces_32_64<_SIZE_>::typer(const Motcle& typ)" << finl;
439 exit();
440 }
441 }
442 /* TroisDto2D marche pas
443 if (axi_==1 && bidim_axi!=1 && axi!=1)
444 {
445 Cerr << "The mesh contains faces that show that is a revolution mesh." << finl;
446 Cerr << "Add Bidim_axi or Axi in your data file." << finl;
447 exit();
448 } */
449 if (dimension<std::min(max_dim,nb_som_face))
450 {
451 Cerr << "You are in dimension " << dimension << finl;
452 Cerr << "and the mesh contains faces with " << nb_som_face << " nodes." << finl;
453 Cerr << "and this seems to be a mesh of dimension " << std::min(max_dim,nb_som_face) << " ..." << finl;
454 exit();
455 }
456}
457
458
459/*! @brief Complete la face specifie: met a jour ses voisins.
460 *
461 * @param (int face) l'indice de la face a completer
462 * @param (int num_elem) le numero de l'element voisin de la face
463 * @throws face deja complete
464 */
465template <typename _SIZE_>
467{
468 if ( voisin(face,0) == -1)
469 voisin(face, 0) = num_elem;
470 else if( voisin(face,1) == -1)
471 voisin(face, 1) = num_elem;
472 else
473 {
474 Cerr << finl;
475 Cerr << "Problem for the face number " << face << " and the cell " << num_elem << finl;
476 Cerr << "Indeed, the face already belongs to the cells " << voisin(face, 0) << " and " << voisin(face, 1) << finl;
477 Cerr << "The nodes of this face are:" << finl;
478 for (int i=0; i<nb_som_face; i++)
479 Cerr << "Node " << sommet(face,i) << finl;
480 Cerr << "Check your mesh. Perhaps some cells " << finl;
481 Cerr << "are defined 2 times." << finl;
482 exit();
483 }
484}
485
486/*! @brief Calcule la surface des faces
487 *
488 * @param (DoubleVect& surfaces) le vecteur contenant la surface de chacune des faces.
489 * @throws type de face non reconnu
490 * @throws calcul de la surface de ce type de face non code
491 * @throws calcul de surface errone (surface <= 0)
492 * @throws type de face ne correspondant pas a la dimension d'espace
493 */
494template <typename _SIZE_>
496{
497 surfaces.resize(nb_faces_tot());
498 const Domaine_t& dom=domaine();
499 // Verification qu'en coordonnees cylindriques, r est bien positif (avec tolérance numérique)
500 if (axi || bidim_axi)
501 {
502 const int_t nb_som = dom.les_sommets().dimension(0);
503 // Echelle de rayon pour fixer une tolérance robuste
504 double rmax = 0.;
505 for (int_t i = 0; i < nb_som; i++)
506 rmax = std::max(rmax, std::fabs(dom.coord(i,0)));
507 const double tol = std::max(Objet_U::precision_geom * std::max(1.0, rmax), 1e-300);
508 for (int_t i = 0; i < nb_som; i++)
509 {
510 const double r = dom.coord(i,0);
511 if (r < -tol)
512 {
513 Cerr << "In axisymmetric, the coordinates of the mesh according to radius" << finl;
514 Cerr << "ie along X, cannot be negative beyond tolerance." << finl;
515 Cerr << "The revolution axis must be at x=0." << finl;
516 Cerr << "we got x = " << r << " (tolerance = " << tol << ")" << finl;
517 exit();
518 }
519 }
520 }
521 switch(type_face_)
522 {
523 case Type_Face::segment_2D :
524 {
525 assert(dimension==2);
526 for (int_t face = 0; face < nb_faces_tot(); face++)
527 {
528 const double x0 = dom.coord(sommet(face,0), 0);
529 const double y0 = dom.coord(sommet(face,0), 1);
530 const double x1 = dom.coord(sommet(face,1), 0);
531 const double y1 = dom.coord(sommet(face,1), 1);
532 const double dx = x0 - x1;
533 const double dy = y0 - y1;
534 const double L = std::sqrt(dx*dx + dy*dy);
535
537 {
538 // pur 2D cartésien : surface = longueur
539 surfaces(face) = L;
540 if(surfaces(face) == 0.)
541 {
542 Cerr << "area("<<face<<")=0 ! Check your mesh." << finl;
543 exit();
544 }
545 }
546 else
547 {
548 // RZ (bidim_axi) : surface du tore engendré par le segment
549 // S = Δθ * r_bar * L, avec r_bar = (r0 + r1)/2 et r ≡ x
550 const double r0 = x0;
551 const double r1 = x1;
552 const double rbar = 0.5 * (r0 + r1);
553 surfaces(face) = 2.0 * M_PI * L * rbar;
554 }
555 }
556 break;
557 }
558 case Type_Face::quadrilatere_2D_axi :
559 {
560 assert(dimension==2);
561 for (int_t face = 0; face < nb_faces_tot(); face++)
562 {
563 const double r0 = dom.coord(sommet(face,0), 0);
564 const double z0 = dom.coord(sommet(face,0), 1);
565 const double r1 = dom.coord(sommet(face,1), 0);
566 const double z1 = dom.coord(sommet(face,1), 1);
567 const double dr = r1 - r0;
568 const double dz = z1 - z0;
569 const double L = std::sqrt(dr*dr + dz*dz); // longueur du segment
570 const double rbar = 0.5*(r0 + r1); // moyenne linéaire de r(s) sur un segment
571 surfaces(face) = 2.0 * M_PI * rbar * L; // S = Δθ ∫_Γ r ds = Δθ * r̄ * L
572 }
573 break;
574 }
575
576 case Type_Face::segment_2D_axi :
577 {
578 assert(dimension==2);
579 double r0,r1,teta0,teta1,d_teta;
580 for(int_t face=0; face <nb_faces_tot(); face++)
581 {
582 r0 = dom.coord(sommet(face ,0), 0);
583 r1 = dom.coord(sommet(face ,1), 0);
584 if ( est_egal(r0,r1) ) // surface = r0*abs(teta1-teta0)
585 {
586 teta0 = dom.coord(sommet(face ,0), 1);
587 teta1 = dom.coord(sommet(face ,1), 1);
588 d_teta = std::fabs(teta1-teta0);
589 if(d_teta > M_PI) d_teta=2.*M_PI-d_teta;
590 surfaces(face)=r0*d_teta;
591 }
592 else // surface = r1-r2
593 surfaces(face)=std::fabs(r1-r0);
594 }
595 break;
596 }
597 case Type_Face::triangle_3D :
598 {
599 assert(dimension==3);
600
601 double delta0, delta1, delta2;
602 double longueur0, longueur1;
603 double prod,sa;
604
605 for(int_t face=0; face <nb_faces_tot(); face++)
606 {
607 prod=0;
608 delta0=(dom.coord(sommet(face ,1), 0) - dom.coord(sommet(face ,0), 0));
609 delta1=(dom.coord(sommet(face ,1), 1) - dom.coord(sommet(face ,0), 1));
610 delta2=(dom.coord(sommet(face ,1), 2) - dom.coord(sommet(face ,0), 2));
611 longueur0=(delta0*delta0+delta1*delta1+delta2*delta2);
612 sa=delta0;
613 delta0=(dom.coord(sommet(face ,2), 0) - dom.coord(sommet(face ,0), 0));
614 prod=sa*delta0;
615 sa=delta1;
616 delta1=(dom.coord(sommet(face ,2), 1) - dom.coord(sommet(face ,0), 1));
617 prod+=sa*delta1;
618 sa=delta2;
619 delta2=(dom.coord(sommet(face ,2), 2) - dom.coord(sommet(face ,0), 2));
620 prod+=sa*delta2;
621 longueur1=(delta0*delta0+delta1*delta1+delta2*delta2);
622 surfaces(face)=0.5*(sqrt(longueur0*longueur1-prod*prod));
623 if(surfaces(face)==0.)
624 {
625 Cerr << "area("<<face<<")=0 ! Check your mesh." << finl;
626 exit();
627 }
628 }
629 break;
630 }
631 case Type_Face::quadrangle_3D :
632 {
633 // On se base sur Hexa_VEF::normale():
634 for(int_t face=0; face <nb_faces_tot(); face++)
635 {
636 int_t n0 = sommet(face, 0),
637 n1 = sommet(face, 1),
638 n2 = sommet(face, 2),
639 n3 = sommet(face, 3);
640 // NB: Dans un prisme, il y'a aussi des triangles comme faces... Donc:
641 if (n3<0) n3 = n2;
642
643 double x1 = dom.coord(n0, 0) - dom.coord(n1, 0);
644 double y1 = dom.coord(n0, 1) - dom.coord(n1, 1);
645 double z1 = dom.coord(n0, 2) - dom.coord(n1, 2);
646
647 double x2 = dom.coord(n3, 0) - dom.coord(n1, 0);
648 double y2 = dom.coord(n3, 1) - dom.coord(n1, 1);
649 double z2 = dom.coord(n3, 2) - dom.coord(n1, 2);
650
651 double nx = (y1*z2 - y2*z1)/2;
652 double ny = (-x1*z2 + x2*z1)/2;
653 double nz = (x1*y2 - x2*y1)/2;
654
655 x1 = dom.coord(n0,0) - dom.coord(n2,0);
656 y1 = dom.coord(n0,1) - dom.coord(n2,1);
657 z1 = dom.coord(n0,2) - dom.coord(n2,2);
658
659 x2 = dom.coord(n3,0) - dom.coord(n2,0);
660 y2 = dom.coord(n3,1) - dom.coord(n2,1);
661 z2 = dom.coord(n3,2) - dom.coord(n2,2);
662
663 nx -= (y1*z2 - y2*z1)/2;
664 ny -= (-x1*z2 + x2*z1)/2;
665 nz -= (x1*y2 - x2*y1)/2;
666
667 surfaces(face)=sqrt(nx*nx+ny*ny+nz*nz);
668 }
669 break;
670 }
671 case Type_Face::quadrangle_3D_axi :
672 {
673 assert(dimension==3);
674 double r0,r1,teta0,teta1,teta2,z0,z2,d_teta,delta_r;
675 for(int_t face=0; face <nb_faces_tot(); face++)
676 {
677 r0 = dom.coord(sommet(face ,0), 0);
678 r1 = dom.coord(sommet(face ,1), 0);
679 delta_r = std::fabs(r1 - r0);
680 if ( est_egal(r0,r1) )
681 {
682 teta0 = dom.coord(sommet(face ,0), 1);
683 teta1 = dom.coord(sommet(face ,1), 1);
684 z0 = dom.coord(sommet(face ,0), 2);
685 z2 = dom.coord(sommet(face ,2), 2);
686 d_teta = std::fabs(teta1-teta0);
687 if(d_teta > M_PI) d_teta=2.*M_PI-d_teta;
688 surfaces(face)=r0*d_teta*std::fabs(z2-z0);
689 }
690 else
691 {
692 teta0 = dom.coord(sommet(face ,0), 1);
693 teta2 = dom.coord(sommet(face ,2), 1);
694 if (teta0 == teta2)
695 {
696 z0 = dom.coord(sommet(face ,0), 2);
697 z2 = dom.coord(sommet(face ,2), 2);
698 surfaces(face) = delta_r*std::fabs(z2-z0);
699 }
700 else
701 {
702 d_teta=std::fabs(teta2-teta0);
703 if(d_teta > M_PI) d_teta=2.*M_PI-d_teta;
704 surfaces(face) = 0.5*(r0+r1)*d_teta*delta_r;
705 }
706 }
707 }
708 break;
709 }
710 case Type_Face::point_1D:
711 case Type_Face::vide_0D :
712 {
713 for(int_t face=0; face <nb_faces_tot(); face++)
714 surfaces(face) = 1.0;
715
716 break;
717 }
718 case Type_Face::point_1D_axi:
719 {
720 assert(dimension==3);
721
722 const DomaineAxi1d_t& domax = ref_cast(DomaineAxi1d_t,dom);
723
724 for(int_t face=0; face <nb_faces_tot(); face++)
725 {
726 int_t elem = voisin(face,0)==-1 ? voisin(face,1) : voisin(face,0);
727
728 double x0 = domax.origine_repere(elem,0);
729 double y0 = domax.origine_repere(elem,1);
730 double x = dom.coord(sommet(face ,0), 0);
731 double y = dom.coord(sommet(face ,0), 1);
732
733 double r = sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));
734 surfaces(face) = 2.*M_PI*r;
735 }
736 break;
737 }
738 case Type_Face::polygone_3D:
739 {
740 const DoubleTab_t& coord=dom.coord_sommets();
741 int nmax=les_sommets().dimension_int(1);
742 for(int_t face=0; face <nb_faces_tot(); face++)
743 {
744 double n0=0,n1=0,n2=0;
745 int n=nmax-1;
746 while (n >= 0 && sommet(face,n)==-1) n--;
747 for (int i0=0; i0<=n; i0++)
748 {
749
750 int ip1_0=0;
751 if (i0<n) ip1_0=i0+1;
752 int_t i=sommet(face,i0);
753 int_t ip1=sommet(face,ip1_0);
754 n0+=coord(i,1)*coord(ip1,2)-coord(i,2)*coord(ip1,1);
755 n1+=coord(i,2)*coord(ip1,0)-coord(i,0)*coord(ip1,2);
756 n2+=coord(i,0)*coord(ip1,1)-coord(i,1)*coord(ip1,0);
757 }
758 surfaces(face)=sqrt(n0*n0+n1*n1+n2*n2)/2.;
759 }
760 break;
761 }
762 default :
763 {
764 Cerr << "Error TRUST in type of Faces_32_64 not recognized " << finl;
765 exit();
766 }
767 }
768}
769
770
771/*! @brief Calcule les centres de gravite de chaque face.
772 *
773 * @param (DoubleTab& xv) tableau contenant les coordonnees des centres de gravite de chaque face. xv(i,j) contient la coordonnee j du centre de gravite de la i-ieme face. On resize le tableau xv et on lui affecte le descripteur parallele du tableau des sommets avant de le remplir.
774 */
775template <typename _SIZE_>
777{
778 // Le tableau xv est dimensionne dans ::calculer_centres_gravite
779 const Domaine_t& dom=domaine();
780 const DoubleTab_t& coord=dom.coord_sommets();
781 Faces_32_64::Calculer_centres_gravite(xv, type_face_, coord, sommets);
782}
783
784
785template <typename _SIZE_>
786void Faces_32_64<_SIZE_>::Calculer_centres_gravite(DoubleTab_t& xv, Type_Face type_face_, const DoubleTab_t& coord, const IntTab_t& sommet)
787{
788 int_t nb_faces_tot = sommet.dimension_tot(0);
789 int dim = coord.dimension_int(1);
790 xv.resize(nb_faces_tot, dim);
791 // Copie le descripteur parallele du tableau sommet:
792 xv.set_md_vector(sommet.get_md_vector());
793
794 if(nb_faces_tot!=0)
795 {
796 int nb_som_faces=sommet.dimension_int(1);
797 double inv=1./nb_som_faces;
798 xv = 0;
799 if(Objet_U::axi)
800 {
801 switch(type_face_)
802 {
803 case Type_Face::segment_2D_axi :
804 {
805 for (int_t face=0; face<nb_faces_tot; face++)
806 {
807 for(int som=0; som < nb_som_faces; som++)
808 xv(face, 0)+=coord(sommet(face ,som), 0);
809 double teta_0=coord(sommet(face ,0), 1);
810 double teta_1=coord(sommet(face ,1), 1);
811 double teta_min=std::min(teta_1, teta_0);
812 double teta_max=std::max(teta_1, teta_0);
813 double d_teta=teta_max-teta_min;
814 if( (teta_min==0.) && (d_teta>M_PI) )
815 {
816 teta_min+=2.*M_PI;
817 }
818 {
819 xv(face, 1)+=(teta_min+teta_max);
820 }
821 }
822 break;
823 }
824 case Type_Face::quadrangle_3D_axi :
825 {
826 for (int_t face=0; face<nb_faces_tot; face++)
827 {
828 for(int som=0; som < nb_som_faces; som++)
829 xv(face, 0)+=coord(sommet(face ,som), 0);
830 for(int som=0; som < nb_som_faces; som++)
831 xv(face, 2)+=coord(sommet(face ,som), 2);
832 double teta_0=coord(sommet(face ,0), 1);
833 double teta_1=coord(sommet(face ,1), 1);
834 double teta_2=coord(sommet(face ,2), 1);
835 double teta_3=coord(sommet(face ,3), 1);
836 double teta_min=std::min(teta_1, teta_0);
837 teta_min=std::min(teta_min, teta_2);
838 teta_min=std::min(teta_min, teta_3);
839 double teta_max=std::max(teta_1, teta_0);
840 teta_max=std::max(teta_min, teta_2);
841 teta_max=std::max(teta_min, teta_3);
842 double d_teta=teta_max-teta_min;
843 if( (teta_min==0.) && (d_teta>M_PI) )
844 {
845 if(teta_0==0.) teta_0+=2.*M_PI;
846 if(teta_1==0.) teta_1+=2.*M_PI;
847 if(teta_2==0.) teta_2+=2.*M_PI;
848 if(teta_3==0.) teta_3+=2.*M_PI;
849 }
850 {
851 xv(face, 1)+=(teta_0+teta_1+teta_2+teta_3) ;
852 }
853 }
854 break;
855 }
856 default:
857 {
858 Cerr << "Face type number " << (int)type_face_ << " not provided in Faces_32_64<_SIZE_>::calculer_centres_gravite" << finl;
859 break;
860 }
861 }
862 xv*=inv;
863 }
864 else
865 {
866 for (int_t face=0; face<nb_faces_tot; face++)
867 {
868 int nb_som=nb_som_faces;
869 while (sommet(face,nb_som-1)==-1) nb_som--;
870
871 inv=1./nb_som;
872 for(int k=0; k<dim; k++)
873 for(int som=0; som < nb_som; som++)
874 xv(face, k)+=coord(sommet(face ,som), k);
875 for(int k=0; k<dim; k++)
876 xv(face, k)*=inv;
877 }
878 }
879 }
880}
881
882/*! @brief Reordonne les faces.
883 *
884 * (on ne reordonne que les quadrangles)
885 *
886 * @throws type de face non reconnu
887 */
888template <typename _SIZE_>
890{
891 //Cerr << "Faces_32_64<_SIZE_>::reordonner()" << finl;
892 switch(type_face_)
893 {
894 case Type_Face::point_1D :
895 case Type_Face::point_1D_axi :
896 {
897 break;
898 }
899 case Type_Face::segment_2D :
900 {
901 // on peut avoir des bords de maillage triangulaire en 3D
902 assert(dimension>=2);
903 break;
904 }
905 case Type_Face::quadrilatere_2D_axi :
906 {
907 assert(dimension==2);
908 const Domaine_t& dom=domaine();
909 SmallArrOfTID_t S(2);
910 SmallArrOfTID_t NS(2);
911 int i;
912 const int_t nombre_faces=nb_faces();
913 for(int_t face=0; face < nombre_faces; face++)
914 {
915 NS=-1;
916 for(i=0; i<2; i++)
917 S[i] = sommet(face, i);
918 assert( S[0] >=0 );
919 assert( S[1] >=0 );
920 if (dom.coord(S[0], 0) > dom.coord(S[1], 0))
921 {
922 NS[0]=S[1];
923 NS[1]=S[0];
924 }
925 else
926 {
927 NS[0]=S[0];
928 NS[1]=S[1];
929 }
930
931 for(i=0; i<2; i++)
932 {
933 assert(NS[i]!=-1);
934 sommet(face, i)=NS[i];
935 }
936 }
937 break;
938 }
939 case Type_Face::segment_2D_axi :
940 {
941 assert(dimension==2);
942 break;
943 }
944 case Type_Face::triangle_3D :
945 {
946 assert(dimension==3);
947 break;
948 }
949 case Type_Face::quadrangle_3D :
950 {
951 assert(dimension==3);
952 const Domaine_t& dom=domaine();
953 SmallArrOfTID_t S(4);
954 SmallArrOfTID_t NS(4);
955 int i;
956 double xmin, ymin, zmin;
957 double xmax, ymax, zmax;
958 const int_t nombre_faces=nb_faces();
959 for(int_t face=0; face < nombre_faces; face++)
960 {
961 NS=-1;
962 for(i=0; i<4; i++)
963 {
964 S[i] = sommet(face, i);
965 assert( S[i] >=0 );
966 }
967 if (1)
968 {
969 // adaptation de Hexaedre_VEF::reordonne
970 const DoubleTab_t& coord=dom.les_sommets();
971 int_t s0=S[0], s1=S[1], s2=S[2], s3=S[3];
972 double x03=coord(s3,0)-coord(s0,0);
973 double y03=coord(s3,1)-coord(s0,1);
974 double z03=coord(s3,2)-coord(s0,2);
975 double x02=coord(s2,0)-coord(s0,0);
976 double y02=coord(s2,1)-coord(s0,1);
977 double z02=coord(s2,2)-coord(s0,2);
978
979 double x01=coord(s1,0)-coord(s0,0);
980 double y01=coord(s1,1)-coord(s0,1);
981 double z01=coord(s1,2)-coord(s0,2);
982
983 Vecteur3 OA(x01,y01,z01);
984 Vecteur3 OB(x03,y03,z03);
985 Vecteur3 OC(x02,y02,z02);
986
987 Vecteur3 nplan, nmedian;
988 // rectangle C B
989 // O A
990 // calcul de n= OA ^ OC
991 Vecteur3::produit_vectoriel(OA,OC,nplan);
992 // calcul de la normale nmedian du plan (OB,n)
993 Vecteur3::produit_vectoriel(OB,nplan,nmedian);
994
995 // on regarde si les points A et C sont bien de part et d'autre du plan
996 double psC=Vecteur3::produit_scalaire(nmedian,OA);
997 double psA=Vecteur3::produit_scalaire(nmedian,OC);
998
999 if (psA*psC>0)
1000 {
1001 // inversion des sommets 2 et 3
1002 sommet(face,2)=S[3];
1003 sommet(face,3)=S[2];
1004 Cerr << "Permutation of local nodes 2 and 3 on the face " <<face<<finl;
1005
1006 }
1007 }
1008 else
1009 {
1010
1011 xmin=std::min(dom.coord(S[0], 0), dom.coord(S[1], 0));
1012 xmin=std::min(xmin, dom.coord(S[2], 0));
1013 xmax=std::max(dom.coord(S[0], 0), dom.coord(S[1], 0));
1014 xmax=std::max(xmax, dom.coord(S[2], 0));
1015 ymin=std::min(dom.coord(S[0], 1), dom.coord(S[1], 1));
1016 ymin=std::min(ymin, dom.coord(S[2], 1));
1017 ymax=std::max(dom.coord(S[0], 1), dom.coord(S[1], 1));
1018 ymax=std::max(ymax, dom.coord(S[2], 1));
1019 zmin=std::min(dom.coord(S[0], 2), dom.coord(S[1], 2));
1020 zmin=std::min(zmin, dom.coord(S[2], 2));
1021 zmax=std::max(dom.coord(S[0], 2), dom.coord(S[1], 2));
1022 zmax=std::max(zmax, dom.coord(S[2], 2));
1023
1024 if(est_egal(zmin, zmax))
1025 {
1026 for(i=0; i<4; i++)
1027 if ( est_egal(dom.coord(S[i], 0),xmin) && est_egal(dom.coord(S[i], 1),ymin))
1028 NS[0]=S[i];
1029 for(i=0; i<4; i++)
1030 if ( !est_egal(dom.coord(S[i], 0),xmin) && est_egal(dom.coord(S[i], 1),ymin))
1031 NS[1]=S[i];
1032 for(i=0; i<4; i++)
1033 if ( est_egal(dom.coord(S[i], 0),xmin) && !est_egal(dom.coord(S[i], 1),ymin))
1034 NS[2]=S[i];
1035 for(i=0; i<4; i++)
1036 if ( !est_egal(dom.coord(S[i], 0),xmin) && !est_egal(dom.coord(S[i], 1),ymin))
1037 NS[3]=S[i];
1038 }
1039 if(est_egal(ymin, ymax))
1040 {
1041 for(i=0; i<4; i++)
1042 if ( est_egal(dom.coord(S[i], 0),xmin) && est_egal(dom.coord(S[i], 2),zmin))
1043 NS[0]=S[i];
1044 for(i=0; i<4; i++)
1045 if ( !est_egal(dom.coord(S[i], 0),xmin) && est_egal(dom.coord(S[i], 2),zmin))
1046 NS[1]=S[i];
1047 for(i=0; i<4; i++)
1048 if ( est_egal(dom.coord(S[i], 0),xmin) && !est_egal(dom.coord(S[i], 2),zmin))
1049 NS[2]=S[i];
1050 for(i=0; i<4; i++)
1051 if ( !est_egal(dom.coord(S[i], 0),xmin) && !est_egal(dom.coord(S[i], 2),zmin))
1052 NS[3]=S[i];
1053 }
1054 if(est_egal(xmin, xmax))
1055 {
1056 for(i=0; i<4; i++)
1057 if ( est_egal(dom.coord(S[i], 1),ymin) && est_egal(dom.coord(S[i], 2),zmin))
1058 NS[0]=S[i];
1059 for(i=0; i<4; i++)
1060 if ( !est_egal(dom.coord(S[i], 1),ymin) && est_egal(dom.coord(S[i], 2),zmin))
1061 NS[1]=S[i];
1062 for(i=0; i<4; i++)
1063 if ( est_egal(dom.coord(S[i], 1),ymin) && !est_egal(dom.coord(S[i], 2),zmin))
1064 NS[2]=S[i];
1065 for(i=0; i<4; i++)
1066 if ( !est_egal(dom.coord(S[i], 1),ymin) && !est_egal(dom.coord(S[i], 2),zmin))
1067 NS[3]=S[i];
1068 }
1069
1070 for(i=0; i<4; i++)
1071 {
1072 assert(NS[i]!=-1);
1073 sommet(face, i)=NS[i];
1074 }
1075 }
1076 }
1077 break;
1078 }
1079 case Type_Face::quadrangle_3D_axi :
1080 {
1081 assert(dimension==3);
1082 break;
1083 }
1084 case Type_Face::polygone_3D:
1085 assert(dimension==3);
1086 break;
1087 default :
1088 {
1089 Cerr << "Error TRUST in type of Faces_32_64 not recognized " << finl;
1090 exit();
1091 }
1092 }
1093}
1094
1095/*! @brief Compare l'objet Faces_32_64 passe en parametre avec l'objet Faces_32_64 lui-meme (this)
1096 *
1097 * @param (Faces_32_64& faces) les faces avec lesquel on compare l'objet
1098 * @param (IntVect& renum) le vecteur renumerotation - renum est de taille 1 et renum contient -1 si il n'y pas le meme nombre de face dans l'objet que dans le parametre faces. - renum autant d'elements que de nombre de face sinon. et renum(i) = le rang de la face i du parametre faces dans l'objet courant
1099 * @return (IntVect&)
1100 */
1101template <typename _SIZE_>
1103{
1104 const Domaine_t& domaine = this->domaine();
1105 const Domaine_t& son_domaine=faces.domaine();
1106 if ( (nb_faces() != faces.nb_faces()) || ( type_face_ != faces.type_face_) )
1107 {
1108 renum.resize(1);
1109 renum=-1;
1110 return renum;
1111 }
1112 if(domaine.le_nom() == son_domaine.le_nom())
1113 {
1114 // il suffit de comparer les numeros des sommets :
1115 TRUSTLists<_SIZE_> listes;
1116 int_t premier=0;
1117 int_t numerol, face;
1118 int numeroli;
1119 int ok;
1120 int_t rang;
1121 for(face=0; face<nb_faces(); face++)
1122 {
1123 numerol=this->ppsf(face, nb_som_face);
1124 assert(numerol < std::numeric_limits<int>::max());
1125 numeroli = (int)numerol;
1126 listes[numeroli].add(premier++);
1127 }
1128 for(face=0; face<nb_faces(); face++)
1129 {
1130 numerol=faces.ppsf(face, nb_som_face);
1131 assert(numerol < std::numeric_limits<int>::max());
1132 numeroli = (int)numerol;
1133 TRUSTList_Curseur<_SIZE_> curseur(listes[numeroli]);
1134 ok=1;
1135 while (curseur && ok)
1136 {
1137 rang=curseur.valeur();
1138 ok=!faces.same_face(face, *this, rang, nb_som_face);
1139 if(!ok)
1140 {
1141 // "face==rang"
1142 renum(face)=rang;
1143 }
1144 else
1145 ++curseur;
1146 }
1147 if(!curseur)
1148 {
1149 renum.resize(1);
1150 renum=-1;
1151 return renum;
1152 }
1153 }
1154 }
1155 else
1156 {
1157 // il faut comparer les coordonnees des sommets :
1158 }
1159 return renum;
1160}
1161
1162
1163template class Faces_32_64<int>;
1164#if INT_is_64_ == 2
1165template class Faces_32_64<trustIdType>;
1166#endif
const DoubleTab_t & origine_repere()
DoubleTab_t & les_sommets()
Definition Domaine.h:113
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
double coord(int_t i, int j) const
Definition Domaine.h:110
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Classe Faces Faces decrit un ensemble de faces par leur type (point ,segment, triangle ou quadrangle)...
Definition Faces.h:50
int_t nb_faces_tot() const
Renvoie le nombre total de Faces i (reelles et virt) sur le proc courant.
Definition Faces.h:68
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
Definition Faces.h:58
void typer(const Motcle &)
Type les faces.
Definition Faces.cpp:390
void initialiser_sommets_faces_joint(int_t nb_faces_joints)
Initialise les sommets des faces joints a -1.
Definition Faces.cpp:377
void calculer_surfaces(DoubleVect_t &surf) const
Calcule la surface des faces.
Definition Faces.cpp:495
DoubleVect_T< _SIZE_ > DoubleVect_t
Definition Faces.h:59
void reordonner()
Reordonne les faces.
Definition Faces.cpp:889
Type_Face type(const Motcle &) const
Renvoie un objet de Type_Face representant le type de nom specifie.
Definition Faces.cpp:207
const Domaine_t & domaine() const
Definition Faces.h:95
int_t nb_faces() const
Definition Faces.h:66
IntVect_t & compare(const Faces_32_64 &other_fac, IntVect_t &renum)
Compare l'objet Faces_32_64 passe en parametre avec l'objet Faces_32_64 lui-meme (this).
Definition Faces.cpp:1102
void completer(int_t face, int_t num_elem)
Complete la face specifie: met a jour ses voisins.
Definition Faces.cpp:466
Entree & lit(Entree &)
Lit les specifications d'un objet face a partir d'un flot d'entree.
Definition Faces.cpp:123
void calculer_centres_gravite(DoubleTab_t &xv) const
Calcule les centres de gravite de chaque face.
Definition Faces.cpp:776
int_t dimensionner(int_t)
(Re-)dimensionne les faces On redimensionne les voisins en consequence.
Definition Faces.cpp:344
_SIZE_ int_t
Definition Faces.h:55
Sortie & ecrit(Sortie &) const
Ecrit les faces sur un flots de sortie.
Definition Faces.cpp:63
IntTab_T< _SIZE_ > IntTab_t
Definition Faces.h:57
Domaine_32_64< _SIZE_ > Domaine_t
Definition Faces.h:61
int_t voisin(int_t, int) const
Renvoie le numero du i-ieme voisin de face.
Definition Faces.h:165
IntVect_T< _SIZE_ > IntVect_t
Definition Faces.h:56
void initialiser_faces_joint(int_t nb_faces_joints)
Initialise les voisins des faces joints a -1.
Definition Faces.cpp:365
DomaineAxi1d_32_64< _SIZE_ > DomaineAxi1d_t
Definition Faces.h:62
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
Definition Faces.h:74
void ajouter(const IntTab_t &)
Ajoute des faces.
Definition Faces.cpp:325
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
Definition Faces.h:130
DoubleTab_T< _SIZE_ > DoubleTab_t
Definition Faces.h:60
static void Calculer_centres_gravite(DoubleTab_t &xv, Type_Face type_face_, const DoubleTab_t &coord, const IntTab_t &sommet)
Definition Faces.cpp:786
int nb_som_faces() const
Renvoie le nombre de sommet par face.
Definition Faces.h:149
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
static double precision_geom
Definition Objet_U.h:86
static int bidim_axi
Definition Objet_U.h:102
static int axi
Definition Objet_U.h:101
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
: List_Curseur de reels int/double precision
Definition TRUSTList.h:103
_TYPE_ valeur() const
Definition TRUSTList.h:115
: Un tableau de listes de type IntList
Definition TRUSTLists.h:32
void set_md_vector(const MD_Vector &) override
Definition TRUSTTab.tpp:673
int dimension_int(int d) const
Definition TRUSTTab.tpp:152
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)
static void produit_vectoriel(const Vecteur3 &x, const Vecteur3 &y, Vecteur3 &resu)