TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Intersection_Interface_ijk.cpp
1/****************************************************************************
2* Copyright (c) 2019, 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 <Intersection_Interface_ijk.h>
17#include <IJK_Navier_Stokes_tools.h>
18#include <IJK_Interfaces.h>
19
20/*
21 * Intersection_Interface_ijk
22 */
23
24Implemente_base(Intersection_Interface_ijk, "Intersection_Interface_ijk", Objet_U);
25
27{
28 return os;
29}
30
32{
33 return is;
34}
35
37 const Vecteur3& normale,
38 const Vecteur3& bary,
39 const Vecteur3& bary_vap,
40 Vecteur3& posit_proj)
41{
42 // On a : xp = x - n (n . (x-x0))
43 posit_proj = normale;
44 posit_proj *= -Vecteur3::produit_scalaire(normale, bary_vap - bary);
45 posit_proj += bary_vap;
46}
47
49 const Vecteur3& point_1,
50 const Vecteur3& point_2,
51 double& distance)
52{
53 // On a : xp = x - n (n . (x-x0))
54 distance = Vecteur3::produit_scalaire(point_2 - point_1, point_2 - point_1);
55 distance = std::sqrt(distance);
56}
57
59 const Vecteur3& point_1,
60 const Vecteur3& point_2,
61 const Vecteur3& normal_interf,
62 double& distance)
63{
64 // On a : xp = x - n (n . (x-x0))
65 distance_point_point(point_1, point_2, distance);
66 Vecteur3 interface_to_point = point_2 - point_1;
67 const int sign = signbit(Vecteur3::produit_scalaire(normal_interf, interface_to_point));
68 if (sign)
69 distance *= -1;
70}
71
73 const Vecteur3& position_on_interf, const Vecteur3& normal_on_interf,
74 const double dist)
75{
76 double norm_normale = 0.;
77 for (int c = 0; c < 3; c++)
78 {
79 norm_normale += std::pow(normal_on_interf[c], 2.);
80 }
81 norm_normale = std::pow(norm_normale, 0.5);
82
83 Vecteur3 positions;
84 for (int c = 0; c < 3; c++)
85 {
86 positions[c] = position_on_interf[c] + dist * normal_on_interf[c] / norm_normale;
87 }
88 return positions;
89}
90
92 const DoubleTab& position_on_interf, const DoubleTab& normal_on_interf,
93 const double dist, DoubleTab& positions)
94{
95 const int n_size = position_on_interf.dimension(0);
96 positions.resize(n_size, 3);
97 // positions = 0.;
98 for (int i_diph = 0; i_diph < n_size; i_diph++)
99 {
100 double norm_normale = 0.;
101 for (int c = 0; c < 3; c++)
102 norm_normale += std::pow(normal_on_interf(i_diph, c), 2.);
103 norm_normale = std::pow(norm_normale, 0.5);
104 for (int c = 0; c < 3; c++)
105 {
106 // Cerr << "Position on interf : " << position_on_interf(i_diph, c) << ",
107 // dist : " << dist << ", normal_on_interf : " << normal_on_interf(i_diph,
108 // c) << ", norm_normale : " << norm_normale << finl;
109 positions(i_diph, c) = position_on_interf(i_diph, c) +
110 dist * normal_on_interf(i_diph, c) / norm_normale;
111 }
112 }
113}
114
116 const int elem, Vecteur3& normale, Vecteur3& bary) const
117{
118 Int3 ijk = splitting_->convert_packed_to_ijk_cell(elem);
119 bool no_pb = false;
120 normale = interfaces_->nI(ijk[0], ijk[1], ijk[2]);
121 bary = interfaces_->xI(ijk[0], ijk[1], ijk[2]);
122 for (int c=0; c < 3; c++)
123 {
124 if (std::abs(normale[c]) > EPS_)
125 no_pb = true;
126 }
127 if (!no_pb)
128 Cerr << "Attention, il y a un decalage entre l'indicatrice et les valeurs moyennes calculee dans la cellule" << finl;
129 assert(no_pb);
130}
131
132/*
133 * Intersection_Interface_ijk_face
134 */
135
136Implemente_instanciable_sans_constructeur(Intersection_Interface_ijk_face, "Intersection_Interface_ijk_face", Intersection_Interface_ijk);
137
139{
140 return os;
141}
142
144{
145 return is;
146}
147
149{
150 // TODO: est-ce que les pointeurs restent bien toujours les meme ?
151 // Si oui je peux ne les initialiser qu'une fois, sinon il faudra
152 // les mettre à jour.
153 interfaces_ = &interfaces;
154 splitting_ = &splitting;
155 allocate_velocity(idiph_ijk_, splitting, 2);
156// idiph_ijk_[0].allocate(splitting, Domaine_IJK::FACES_I, 2);
157// idiph_ijk_[1].allocate(splitting, Domaine_IJK::FACES_J, 2);
158// idiph_ijk_[2].allocate(splitting, Domaine_IJK::FACES_K, 2);
159 return 1;
160}
161
163 const int i, const int j, const int k, const int dir,
164 Vecteur3& normale, Vecteur3& bary) const
165{
166 Vecteur3 bary_facettes_dans_elem0;
167 Vecteur3 normale0;
168 const int elem0 = splitting_->convert_ijk_cell_to_packed(i, j, k);
169 get_mean_interface_cell(elem0, normale0, bary_facettes_dans_elem0);
170
171 // elem1 est l'element avant elem0 dans la direction dir
172 int elem1;
173 assert((dir >= 0) && (dir < 3));
174 if (dir == 0)
175 elem1 = splitting_->convert_ijk_cell_to_packed(i - 1, j, k);
176 else if (dir == 1)
177 elem1 = splitting_->convert_ijk_cell_to_packed(i, j - 1, k);
178 else
179 elem1 = splitting_->convert_ijk_cell_to_packed(i, j, k - 1);
180
181 Vecteur3 bary_facettes_dans_elem1;
182 Vecteur3 normale1;
183 get_mean_interface_cell(elem1, normale1, bary_facettes_dans_elem1);
184
185 // Ici on fait une moyenne centree, mais on pourait pondérer par la distance
186 // du barycentre a la face par exemple.
187 normale = normale0;
188 normale += normale1;
189 normale *= .5;
190 bary = bary_facettes_dans_elem0;
191 bary += bary_facettes_dans_elem1;
192 bary *= .5;
193}
194
196 DoubleTab& positions,
197 IntTab& indices,
198 DoubleTab& normales_de_la_proj,
199 DoubleTab& distance_barys_interface
200)
201{
202 const auto& surfaces = interfaces_->get_surface_vapeur_par_face();
203 const auto& barys = interfaces_->get_barycentre_vapeur_par_face();
204 const int ni = surfaces[0].ni();
205 const int nj = surfaces[0].nj();
206 const int nk = surfaces[0].nk();
207 const double eps = 1.e-6;
208 double surf_vap;
209 double surf_liqu;
210 int i_diph = 0;
211 n_diph_ = interfaces_->get_nb_face_mouillees();
212 positions.resize(2 * n_diph_, 3);
213 indices.resize(2 * n_diph_, 5);
214 normales_de_la_proj.resize(2 * n_diph_, 3);
215 distance_barys_interface.resize(2*n_diph_,1);
216
217 for (int dir = 0; dir < 3; dir++)
218 {
219 double surf_cell = 1.;
220 for (int c = 0; c < 3; c++)
221 {
222 if (c != dir)
223 {
224 surf_cell *= splitting_->get_constant_delta(c);
225 }
226 }
227 for (int i = 0; i < ni; i++)
228 for (int j = 0; j < nj; j++)
229 for (int k = 0; k < nk; k++)
230 {
231 // S'il y a une face traversée par l'interface
232 // Attention, je ne trouve visiblement aucune interface...
233 surf_vap = surfaces[dir](i, j, k);
234 if ((surf_vap/surf_cell > 0.) and (surf_vap/surf_cell < 1.))
235 Cerr << "frac surf vap " << surf_vap / surf_cell << finl;
236 if ((surf_vap > eps * surf_cell) and (surf_vap < (1. - eps) * surf_cell))
237 {
238 // On renseigne le numéro de cette face dans le tableau des faces
239 // diphasiques
240 idiph_ijk_[dir](i, j, k) = i_diph;
241
242 surf_liqu = surf_cell - surf_vap;
243 // FIXME: l'assert ne passe pas, il faut trouver pourquoi ma surface
244 // est trop grande. On a dans un test surf_vap = dx et surf_cell =
245 // dx^2.
246 assert(surf_liqu > 0.);
247 // Je calcule l'équation de l'interface moyenne entre les
248 // deux cellules (de chaque coté de la face).
249 Vecteur3 bary {0., 0., .0};
250 Vecteur3 normale {0., 0., .0};
251 compute_mean_interface_face(i, j, k, dir, normale, bary);
252 // on copie normale dans le tableau final, c'etait peut etre pas
253 // absolument necessaire d'avoir recours a une copie mais tant pis.
254 // Le tableau aurait pu être 2 fois plus petit, mais dans le cas ou
255 // on utilise pas la mm normale pour les deux phases (pas
256 // implementé) cette taille est la bonne.
257 for (int c = 0; c < 3; c++)
258 {
259 normales_de_la_proj(i_diph, c) = normale[c];
260 normales_de_la_proj(i_diph + 1, c) = normale[c];
261 }
262
263 // On remplit le tableau des indices pour le reparcourir plus tard.
264 // Ca aurait ete pratique de créer un objet interface field
265 // avec les indices des cellules diphasiques, des faces coupées par
266 // l'interfaces etc, mais ce sera pour une autre fois.
267 for (int phase = 1; phase > 0; phase--)
268 {
269 indices(i_diph, 0) = i;
270 indices(i_diph, 1) = j;
271 indices(i_diph, 2) = k;
272 indices(i_diph, 3) = dir;
273 indices(i_diph, 4) = phase;
274 }
275
276 // Je calcule la projection du bary vapeur sur l'interface.
277 const Vecteur3 bary_vap
278 {
279 barys[0][dir](i, j, k), barys[1][dir](i, j, k),
280 barys[2][dir](i, j, k)
281 };
282 Vecteur3 bary_face;
283 if (dir == 0)
284 bary_face = splitting_->get_coords_of_dof(i,j,k, Domaine_IJK::FACES_I);
285 else if (dir == 1)
286 bary_face = splitting_->get_coords_of_dof(i,j,k, Domaine_IJK::FACES_J);
287 else if (dir == 2)
288 bary_face = splitting_->get_coords_of_dof(i,j,k, Domaine_IJK::FACES_K);
289 else
291 Vecteur3 bary_liqu = bary_face - bary_vap;
292 bary_liqu *= (surf_vap / surf_liqu);
293 bary_liqu += bary_face;
294 Vecteur3 position;
295 projete_interface(normale, bary, bary_vap, position);
296 for (int c = 0; c < 3; c++)
297 positions(i_diph, c) = position[c];
298 distance_point_point(position, bary_vap, distance_barys_interface(i_diph, 0));
299 projete_interface(normale, bary, bary_liqu, position);
300 for (int c = 0; c < 3; c++)
301 positions(i_diph + 1, c) = position[c];
302 distance_point_point(position, bary_liqu, distance_barys_interface(i_diph+1, 0));
303 i_diph += 2;
304 }
305 else
306 idiph_ijk_[dir](i, j, k) = -1;
307 }
308 }
309 if (i_diph <2)
310 Cerr << "Aucune face coupee rencontree" << finl;
311}
312
325/*
326 * Intersection_Interface_ijk_cell
327 */
328
329Implemente_instanciable_sans_constructeur(Intersection_Interface_ijk_cell, "Intersection_Interface_ijk_cell", Intersection_Interface_ijk);
330
332{
333 return os;
334}
335
337{
338 return is;
339}
340
342 const Domaine_IJK& splitting, const IJK_Interfaces& interfaces)
343{
344 // TODO: est-ce que les pointeurs restent bien toujours les meme ?
345 // Si oui je peux ne les initialiser qu'une fois, sinon il faudra
346 // les mettre à jour.
347 interfaces_ = &interfaces;
348 splitting_ = &splitting;
350 // TODO: attention, tant qu on ne passe pas dans la boucle
351 // calcul_projection_centre_...
352 // n_diph_ n est pas initialise
353 n_diph_ = 1;
354 idiph_ijk_.allocate(splitting, Domaine_IJK::ELEM, 2);
355 return 1;
356}
357
359 const IJK_Field_double& indicatrice,
360 DoubleTab& positions,
361 IntTab& indices,
362 DoubleTab& normales_de_la_proj,
363 DoubleTab& distance_centre_interface)
364{
365 // TODO: peut être verifier que la methode d'acces est judicieuse
366 // const auto& barys = interfaces_->get_barycentre_vapeur_par_face();
367 const int ni = indicatrice.ni();
368 const int nj = indicatrice.nj();
369 const int nk = indicatrice.nk();
370 // ArrOfInt liste_composantes_connexes_dans_element;
371 // const auto &mesh = interfaces_->maillage_ft_ijk();
372 Vecteur3 centre {0., 0., .0};
373 Vecteur3 bary_interf {0., 0., .0};
374 Vecteur3 normale_interf {0., 0., .0};
375 Vecteur3 position {0., 0., .0};
376 //Vecteur3 distance {0., 0., .0};
377 int i_diph = 0;
378 // TODO: attention il faut recuperer le nombre de cellule diphasique ici.
379 n_diph_ = 0;
380 for (int i = 0; i < ni; i++)
381 for (int j = 0; j < nj; j++)
382 for (int k = 0; k < nk; k++)
383 {
384 if (fabs(indicatrice(i, j, k)) > VAPOUR_INDICATOR_TEST && fabs(indicatrice(i, j, k)) < LIQUID_INDICATOR_TEST)
385 n_diph_++;
386 }
387 positions.resize(n_diph_, 3);
388 indices.resize(n_diph_, 3);
389 normales_de_la_proj.resize(n_diph_, 3);
390 distance_centre_interface.resize(n_diph_,1);
391
392 for (int i = 0; i < ni; i++)
393 for (int j = 0; j < nj; j++)
394 for (int k = 0; k < nk; k++)
395 {
396 // S'il y a une cellule traversée par l'interface
397 if (fabs(indicatrice(i, j, k)) > VAPOUR_INDICATOR_TEST && fabs(indicatrice(i, j, k)) < LIQUID_INDICATOR_TEST)
398 {
399 // On renseigne le numéro de cette cellule dans le tableau des
400 // cellules diphasiques
401 idiph_ijk_(i, j, k) = i_diph;
402
403 const int elem = splitting_->convert_ijk_cell_to_packed(i, j, k);
404 get_mean_interface_cell(elem, normale_interf, bary_interf);
405 // on copie normale dans le tableau final, c'etait peut etre pas
406 // absolument necessaire d'avoir recours a une copie mais tant pis.
407 for (int c = 0; c < 3; c++)
408 normales_de_la_proj(i_diph, c) = normale_interf[c];
409
410 // On remplit le tableau des indices pour le reparcourir plus tard.
411 // Ca aurait ete pratique de créer un objet interface field
412 // avec les indices des cellules diphasiques, des faces coupées par
413 // l'interfaces etc, mais ce sera pour une autre fois.
414 indices(i_diph, 0) = i;
415 indices(i_diph, 1) = j;
416 indices(i_diph, 2) = k;
417
418 // Je calcule la projection du centre sur l'interface.
419 centre = splitting_->get_coords_of_dof(i, j, k, Domaine_IJK::ELEM);
420 projete_interface(normale_interf, bary_interf, centre, position);
421 // distance_point_point(position, centre, distance_centre_interface(i_diph, 0));
422 distance_point_point_signe(position, centre, normale_interf, distance_centre_interface(i_diph, 0));
423 for (int c = 0; c < 3; c++)
424 positions(i_diph, c) = position[c];
425 i_diph++;
426 }
427 else
428 idiph_ijk_(i, j, k) = -1;
429 }
430 assert(i_diph == n_diph_);
431}
432
434 const IntTab& indices,
435 const DoubleTab& normales_interf,
436 DoubleTab& positions,
437 IntTab& indices_voisins,
438 FixedVector<DoubleVect, 3>& indices_faces_corrections,
439 DoubleTab& distance_centre_faces_interface) const
440{
441 Vecteur3 bary_interf {0., 0., .0};
442 Vecteur3 normale_interf {0., 0., .0};
443 Vecteur3 bary_face {0., 0., .0};
444 Vecteur3 position {0., 0., .0};
445 const int nb_diph = n_diph_; // ijk_interfaces_.size();
446 positions.resize(nb_diph, 3, 6);
447 indices_voisins.resize(nb_diph, 6);
448 distance_centre_faces_interface.resize(nb_diph, 6);
449
450 int nb_faces_to_correct = 0.;
451 for (int i_diph=0; i_diph<nb_diph ; i_diph++)
452 {
453 const int i = indices(i_diph, 0);
454 const int j = indices(i_diph, 1);
455 const int k = indices(i_diph, 2);
456 /*
457 * Get back the mean interface parameters
458 * FIXME: get_mean_interface_cell(elem, normale_interf, bary_interf);
459 * Avoid this calculation again
460 */
461 const int elem = splitting_->convert_ijk_cell_to_packed(i, j, k);
462 get_mean_interface_cell(elem, normale_interf, bary_interf);
463 for (int l=0; l<6; l++)
464 {
465 const int ii = NEIGHBOURS_I[l];
466 const int jj = NEIGHBOURS_J[l];
467 const int kk = NEIGHBOURS_K[l];
468 const int ii_f = NEIGHBOURS_FACES_I[l];
469 const int jj_f = NEIGHBOURS_FACES_J[l];
470 const int kk_f = NEIGHBOURS_FACES_K[l];
471 indices_voisins(i_diph, l) = 0;
472 /*
473 * Check if the neighbours is a pure liquid cell !
474 */
475 if (fabs(indicatrice(i+ii, j+jj, k+kk)) > LIQUID_INDICATOR_TEST)
476 {
477 indices_voisins(i_diph, l) = l+1;
478 nb_faces_to_correct++;
479 if (ii)
480 bary_face = splitting_->get_coords_of_dof(i+ii_f, j+jj_f, k+kk_f, Domaine_IJK::FACES_I);
481 if (jj)
482 bary_face = splitting_->get_coords_of_dof(i+ii_f, j+jj_f, k+kk_f, Domaine_IJK::FACES_J);
483 if (kk)
484 bary_face = splitting_->get_coords_of_dof(i+ii_f, j+jj_f, k+kk_f, Domaine_IJK::FACES_K);
485 const double nx = normales_interf(i_diph, 0);
486 const double ny = normales_interf(i_diph, 1);
487 const double nz = normales_interf(i_diph, 2);
488 normale_interf = {nx, ny, nz};
489 projete_interface(normale_interf, bary_interf, bary_face, position);
490 for (int c = 0; c < 3; c++)
491 positions(i_diph, c, l) = position[c];
492 distance_point_point_signe(position, bary_face, normale_interf, distance_centre_faces_interface(i_diph, l));
493 }
494 }
495 }
496 for (int dir=0; dir<3; dir++)
497 indices_faces_corrections[dir].resize(nb_faces_to_correct);
498}
499
501{
502 /*
503 * FIXME: Can we use an append_array of something ?
504 */
505 const int nb_diph = n_diph_;
506 int nb_faces_to_correct = 0.;
507 for (int i_diph=0; i_diph<nb_diph ; i_diph++)
508 {
509 const int i = ijk_interfaces_(i_diph, 0);
510 const int j = ijk_interfaces_(i_diph, 1);
511 const int k = ijk_interfaces_(i_diph, 2);
512 for (int l=0; l<6; l++)
513 {
514 const int ii_f = NEIGHBOURS_FACES_I[l];
515 const int jj_f = NEIGHBOURS_FACES_J[l];
516 const int kk_f = NEIGHBOURS_FACES_K[l];
517 if (ijk_pure_face_neighbours_(i_diph, l))
518 {
519 DoubleVect& i_pure_face_to_correct = ijk_pure_face_to_correct_[0];
520 DoubleVect& j_pure_face_to_correct = ijk_pure_face_to_correct_[1];
521 DoubleVect& k_pure_face_to_correct = ijk_pure_face_to_correct_[2];
522 i_pure_face_to_correct[nb_faces_to_correct] = (i + ii_f);
523 j_pure_face_to_correct[nb_faces_to_correct] = (j + jj_f);
524 k_pure_face_to_correct[nb_faces_to_correct] = (k + kk_f);
525 nb_faces_to_correct++;
526 // i_pure_face_to_correct.append_array(i + ii_f);
527 // j_pure_face_to_correct.append_array(j + jj_f);
528 // k_pure_face_to_correct.append_array(k + kk_f);
529 }
530 }
531 }
532}
533
546
562
567
572
577
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
: class IJK_Interfaces
FixedVector< DoubleVect, 3 > ijk_pure_face_to_correct_
void calcul_projection_centre_faces_sur_interface_moy(const IJK_Field_double &indicatrice, const IntTab &indices, const DoubleTab &normale_interf, DoubleTab &positions, IntTab &indices_voisins, FixedVector< DoubleVect, 3 > &indices_faces_corrections, DoubleTab &distance_centre_faces_interface) const
void calcul_projection_centre_sur_interface_moy(const IJK_Field_double &indicatrice, DoubleTab &positions, IntTab &indices, DoubleTab &normales_de_la_proj, DoubleTab &distance_centre_interface)
int initialize(const Domaine_IJK &splitting, const IJK_Interfaces &interfaces) override
void compute_mean_interface_face(const int i, const int j, const int k, const int dir, Vecteur3 &normale, Vecteur3 &bary) const
void calcul_projection_bary_face_mouillee_interface_moy(DoubleTab &positions, IntTab &indices, DoubleTab &normales_de_la_proj, DoubleTab &distance_barys_interface)
int initialize(const Domaine_IJK &splitting, const IJK_Interfaces &interfaces) override
void get_mean_interface_cell(const int elem, Vecteur3 &normale, Vecteur3 &bary) const
static void distance_point_point_signe(const Vecteur3 &point_1, const Vecteur3 &point_2, const Vecteur3 &normal_interf, double &distance)
static Vecteur3 get_position_interpolation_normal_interf(const Vecteur3 &position_on_interf, const Vecteur3 &normal_on_interf, const double dist)
static void projete_interface(const Vecteur3 &normale, const Vecteur3 &point_plan, const Vecteur3 &coo, Vecteur3 &posit_proj)
static void distance_point_point(const Vecteur3 &point_1, const Vecteur3 &point_2, double &distance)
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
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
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)