TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Tetra_VEF.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Tetra_VEF.h>
17#include <Domaine.h>
18#include <Domaine_VEF.h>
19#include <Champ_P1NC.h>
20
21Implemente_instanciable_sans_constructeur(Tetra_VEF,"Tetra_VEF",Elem_VEF_base);
22
23// printOn et readOn
24
25
27{
28 return s << que_suis_je() << finl;
29}
30
32{
33 return s ;
34}
35/*! @brief renvoie pour la facette fa7 : pour j=0,j=1 : les numeros locaux des 2 faces qui entourent fa7
36 *
37 * pour j=2,j=3 : les numeros locaux des sommets du tetraedre qui
38 * appartiennent a fa7
39 *
40 */
42{
43 int tmp[4][6]=
44 {
45 {0, 0, 0, 1, 1, 2},
46 {1, 2, 3, 2, 3, 3},
47 {2, 1, 1, 3, 2, 1},
48 {3, 3, 2, 0, 0, 0}
49 };
50 KEL_.resize(4,6);
51 for (int i=0; i<4; i++)
52 for (int j=0; j<6; j++)
53 KEL_(i,j)=tmp[i][j];
54}
55
56void Tetra_VEF::creer_face_normales(DoubleTab& tab_Face_normales,
57 const IntTab& tab_Face_sommets,
58 const IntTab& tab_Face_voisins,
59 const IntTab& tab_elem_faces,
60 const Domaine& domaine_geom) const
61{
62 int nb_face_tot = tab_Face_normales.dimension_tot(0);
63 CDoubleTabView les_coords = domaine_geom.coord_sommets().view_ro();
64 CIntTabView Face_sommets = tab_Face_sommets.view_ro();
65 CIntTabView Face_voisins = tab_Face_voisins.view_ro();
66 CIntTabView elem_faces = tab_elem_faces.view_ro();
67 DoubleTabView Face_normales = tab_Face_normales.view_rw();
68 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_face_tot), KOKKOS_LAMBDA(const int num_Face)
69 {
70 int n0 = Face_sommets(num_Face, 0);
71 int n1 = Face_sommets(num_Face, 1);
72 int n2 = Face_sommets(num_Face, 2);
73
74 double x1 = les_coords(n0, 0) - les_coords(n1, 0);
75 double y1 = les_coords(n0, 1) - les_coords(n1, 1);
76 double z1 = les_coords(n0, 2) - les_coords(n1, 2);
77
78 double x2 = les_coords(n2, 0) - les_coords(n1, 0);
79 double y2 = les_coords(n2, 1) - les_coords(n1, 1);
80 double z2 = les_coords(n2, 2) - les_coords(n1, 2);
81
82 double nx = (y1 * z2 - y2 * z1) / 2;
83 double ny = (-x1 * z2 + x2 * z1) / 2;
84 double nz = (x1 * y2 - x2 * y1) / 2;
85
86 // Orientation de la normale de elem1 vers elem2
87 // pour cela recherche du sommet de elem1 qui n'est pas sur la Face
88 int elem1 = Face_voisins(num_Face, 0);
89 int f0 = elem_faces(elem1, 0);
90 if (f0 == num_Face)
91 f0 = elem_faces(elem1, 1);
92
93 int no4 = Face_sommets(f0, 0);
94 if (no4 == n0 || no4 == n1 || no4 == n2)
95 {
96 no4 = Face_sommets(f0, 1);
97 if (no4 == n0 || no4 == n1 || no4 == n2)
98 no4 = Face_sommets(f0, 2);
99 }
100
101 x1 = les_coords(no4, 0) - les_coords(n0, 0);
102 y1 = les_coords(no4, 1) - les_coords(n0, 1);
103 z1 = les_coords(no4, 2) - les_coords(n0, 2);
104
105 double sign = ((nx * x1 + ny * y1 + nz * z1) > 0) ? -1. : 1.;
106 Face_normales(num_Face, 0) = sign * nx;
107 Face_normales(num_Face, 1) = sign * ny;
108 Face_normales(num_Face, 2) = sign * nz;
109 });
110 end_gpu_timer(__KERNEL_NAME__);
111}
112
113/*! @brief remplit le tableau face_normales dans le Domaine_VEF
114 *
115 */
117 const IntVect& tab_rang_elem_non_std) const
118{
119 const Domaine& domaine_geom = dom_VEF.domaine();
120 auto& facette_normales = const_cast<Domaine_VEF&>(dom_VEF).facette_normales();
121 int nb_elem_tot = domaine_geom.nb_elem_tot();
122
123 if (facette_normales.dimension(0) != nb_elem_tot)
124 facette_normales.resize(nb_elem_tot,6,3);
125
126 CDoubleTabView les_coords = domaine_geom.coord_sommets().view_ro();
127 CIntTabView les_Polys = domaine_geom.les_elems().view_ro();
128 CIntArrView rang_elem_non_std = tab_rang_elem_non_std.view_ro();
129 CIntTabView KEL = KEL_.view_ro();
130 DoubleTabView3 facette_normale = facette_normales.view_rw<3>();
131 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_elem_tot), KOKKOS_LAMBDA(const int i)
132 {
133 if (rang_elem_non_std(i) == -1)
134 {
135 int num_som[4];
136 double x[4][3];
137 num_som[0] = les_Polys(i, 0);
138 num_som[1] = les_Polys(i, 1);
139 num_som[2] = les_Polys(i, 2);
140 num_som[3] = les_Polys(i, 3);
141 for (int s = 0; s < 4; s++)
142 for (int d = 0; d < 3; d++)
143 x[s][d] = les_coords(num_som[s], d);
144 double xg[3];
145 xg[0] = 0.25*(x[0][0]+x[1][0]+x[2][0]+x[3][0]);
146 xg[1] = 0.25*(x[0][1]+x[1][1]+x[2][1]+x[3][1]);
147 xg[2] = 0.25*(x[0][2]+x[1][2]+x[2][2]+x[3][2]);
148 for (int fa7 = 0; fa7 < 6; fa7++)
149 {
150 // la fa7 a pour sommets kel(2,fa7), kel(3,fa7), "G"
151 double u[3], v[3], pv[3], xj0[3];
152 u[0] = x[KEL(2,fa7)][0]-xg[0];
153 u[1] = x[KEL(2,fa7)][1]-xg[1];
154 u[2] = x[KEL(2,fa7)][2]-xg[2];
155 v[0] = x[KEL(3,fa7)][0]-xg[0];
156 v[1] = x[KEL(3,fa7)][1]-xg[1];
157 v[2] = x[KEL(3,fa7)][2]-xg[2];
158 // inline prodvect (not KOKKOS_INLINE_FUNCTION)
159 pv[0] = u[1]*v[2]-u[2]*v[1];
160 pv[1] = u[2]*v[0]-u[0]*v[2];
161 pv[2] = u[0]*v[1]-u[1]*v[0];
162 // Orientation des normales :
163 xj0[0] = x[KEL(0,fa7)][0]-x[KEL(1,fa7)][0];
164 xj0[1] = x[KEL(0,fa7)][1]-x[KEL(1,fa7)][1];
165 xj0[2] = x[KEL(0,fa7)][2]-x[KEL(1,fa7)][2];
166 double psc = xj0[0]*pv[0]+xj0[1]*pv[1]+xj0[2]*pv[2];
167 double sign = (psc < 0) ? -0.5 : 0.5;
168 facette_normale(i,fa7,0) = sign*pv[0];
169 facette_normale(i,fa7,1) = sign*pv[1];
170 facette_normale(i,fa7,2) = sign*pv[2];
171 }
172 }
173 });
174 end_gpu_timer(__KERNEL_NAME__);
175}
176
177
178/*! @brief remplit le tableau normales_facettes_Cl dans le Domaine_Cl_VEF pour la facette fa7 de l'element num_elem
179 *
180 */
181void Tetra_VEF::creer_normales_facettes_Cl(DoubleTab& normales_facettes_Cl,
182 int fa7,
183 int num_elem,const DoubleTab& x,
184 const DoubleVect& xg, const Domaine& domaine_geom) const
185{
186 // x contient les coord des sommets du tetraedre
187 // xg contient les coord du "centre" du tetraedre
188 double u[3];
189 double v[3];
190 double xj0[3];
191 double psc;
192 // Cerr << "fa7 " << fa7 << " et le num_elem " << num_elem << finl;
193 int i0 = KEL_(0,fa7);
194 int i1 = KEL_(1,fa7);
195 int i2 = KEL_(2,fa7);
196 int i3 = KEL_(3,fa7);
197 // Cerr << "i0 " << i0 << " i1 " << i1 << " i2 " << i2 << " i3 " << i3 << finl;
198 u[0]=x(i2,0)-xg[0];
199 u[1]=x(i2,1)-xg[1];
200 u[2]=x(i2,2)-xg[2];
201 v[0]=x(i3,0)-xg[0];
202 v[1]=x(i3,1)-xg[1];
203 v[2]=x(i3,2)-xg[2];
204 double pv[3];
205 prodvect(u,v,pv);
206
207 // Orientation des normales :
208 xj0[0]= x(i0,0)-x(i1,0);
209 xj0[1]= x(i0,1)-x(i1,1);
210 xj0[2]= x(i0,2)-x(i1,2);
211
212 psc=xj0[0]*pv[0] + xj0[1]*pv[1] + xj0[2]*pv[2] ;
213
214 if (psc < 0)
215 {
216 normales_facettes_Cl(num_elem,fa7,0) = -pv[0]/2;
217 normales_facettes_Cl(num_elem,fa7,1) = -pv[1]/2;
218 normales_facettes_Cl(num_elem,fa7,2) = -pv[2]/2;
219 }
220 else
221 {
222 normales_facettes_Cl(num_elem,fa7,0) = pv[0]/2;
223 normales_facettes_Cl(num_elem,fa7,1) = pv[1]/2;
224 normales_facettes_Cl(num_elem,fa7,2) = pv[2]/2;
225 }
226}
227
228
230 const Domaine_VEF& le_dom_VEF,
231 DoubleVect& volumes_entrelaces_Cl,
232 int type_cl) const
233{
234 double vol_mod;
235 const DoubleVect& volumes_entrelaces = le_dom_VEF.volumes_entrelaces();
236 const IntTab& elem_faces = le_dom_VEF.elem_faces();
237
238 switch(type_cl)
239 {
240
241 // pas de Face de Dirichlet : impossible
242 case 0:
243 {
244 Cerr << "Tetra_VEF::modif_volumes_entrelaces() type 0 impossible!\n";
245 break;
246 }
247
248 case 1: // une Face de Dirichlet : Face 3
249 {
250 vol_mod = volumes_entrelaces[j]/3 ;
251 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
252 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
253 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
254 break;
255 }
256
257 case 2: // une Face de Dirichlet : Face 2
258 {
259 vol_mod = volumes_entrelaces[j]/3 ;
260 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
261 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
262 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
263 break;
264 }
265
266 case 4: // une Face de Dirichlet : Face 1
267 {
268 vol_mod = volumes_entrelaces[j]/3 ;
269 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
270 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
271 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
272 break;
273 }
274
275 case 8: // une Face de Dirichlet : Face 0
276 {
277 vol_mod = volumes_entrelaces[j]/3 ;
278 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
279 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
280 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
281 break;
282 }
283
284 case 3: // deux faces de Dirichlet : faces 2,3
285 {
286 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
287 + volumes_entrelaces[elem_faces(elem,3)])/2;
288 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
289 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
290 break;
291 }
292
293 case 5: // deux faces de Dirichlet : faces 1,3
294 {
295 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
296 + volumes_entrelaces[elem_faces(elem,3)])/2;
297 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
298 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
299 break;
300 }
301
302 case 6: // le tetraedre a deux faces de Dirichlet : faces 1,2
303 {
304 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
305 + volumes_entrelaces[elem_faces(elem,2)])/2;
306 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
307 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
308 break;
309 }
310
311 case 9: // deux faces de Dirichlet :faces 0,3
312 {
313 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
314 + volumes_entrelaces[elem_faces(elem,3)])/2;
315 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
316 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
317 break;
318 }
319
320 case 10: // deux faces de Dirichlet :faces 0,2
321 {
322 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
323 + volumes_entrelaces[elem_faces(elem,2)])/2;
324 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
325 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
326 break;
327 }
328
329 case 12: // deux faces de Dirichlet :faces 0,1
330 {
331 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
332 + volumes_entrelaces[elem_faces(elem,1)])/2;
333 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
334 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
335 break;
336 }
337
338
339
340 case 7: // trois faces de Dirichlet : faces 1,2,3
341 {
342 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
343 + volumes_entrelaces[elem_faces(elem,2)]
344 + volumes_entrelaces[elem_faces(elem,3)];
345 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
346 break;
347 }
348
349 case 11: // trois faces de Dirichlet : faces 0,2,3
350 {
351 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
352 + volumes_entrelaces[elem_faces(elem,2)]
353 + volumes_entrelaces[elem_faces(elem,3)];
354 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
355 break;
356 }
357
358 case 13: // trois faces de Dirichlet : faces 0,1,3
359 {
360
361 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
362 + volumes_entrelaces[elem_faces(elem,1)]
363 + volumes_entrelaces[elem_faces(elem,3)];
364 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
365 break;
366 }
367
368 case 14: // trois faces de Dirichlet : faces 0,1,2
369 {
370 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
371 + volumes_entrelaces[elem_faces(elem,1)]
372 + volumes_entrelaces[elem_faces(elem,2)];
373 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
374 break;
375 }
376 default :
377 {
378 Cerr << "\n type inconnu Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
379 exit();
380 }
381
382 } // fin du switch
383}
384
386 const Domaine_VEF& le_dom_VEF,
387 DoubleVect& volumes_entrelaces_Cl,
388 int type_cl) const
389{
390 double vol_mod;
391 const DoubleVect& volumes_entrelaces = le_dom_VEF.volumes_entrelaces();
392 const IntTab& elem_faces = le_dom_VEF.elem_faces();
393
394 int face;
395 int nb_faces_cl = volumes_entrelaces_Cl.size();
396 switch(type_cl)
397 {
398
399 // pas de Face de Dirichlet : impossible
400 case 0:
401 {
402 Cerr << "Tetra_VEF::modif_volumes_entrelaces() type 0 impossible!\n";
403 break;
404 }
405
406 case 1: // une Face de Dirichlet : Face 3
407 {
408 vol_mod = volumes_entrelaces[j]/3 ;
409 face=elem_faces(elem,0);
410 if(face<nb_faces_cl)
411 volumes_entrelaces_Cl[face] += vol_mod;
412 face=elem_faces(elem,1);
413 if(face<nb_faces_cl)
414 volumes_entrelaces_Cl[face] += vol_mod;
415 face=elem_faces(elem,2);
416 if(face<nb_faces_cl)
417 volumes_entrelaces_Cl[face] += vol_mod;
418 break;
419 }
420
421 case 2: // une Face de Dirichlet : Face 2
422 {
423 vol_mod = volumes_entrelaces[j]/3 ;
424 face=elem_faces(elem,0);
425 if(face<nb_faces_cl)
426 volumes_entrelaces_Cl[face] += vol_mod;
427 face=elem_faces(elem,1);
428 if(face<nb_faces_cl)
429 volumes_entrelaces_Cl[face] += vol_mod;
430 face=elem_faces(elem,3);
431 if(face<nb_faces_cl)
432 volumes_entrelaces_Cl[face] += vol_mod;
433 break;
434 }
435
436 case 4: // une Face de Dirichlet : Face 1
437 {
438 vol_mod = volumes_entrelaces[j]/3 ;
439 face=elem_faces(elem,0);
440 if(face<nb_faces_cl)
441 volumes_entrelaces_Cl[face] += vol_mod;
442 face=elem_faces(elem,2);
443 if(face<nb_faces_cl)
444 volumes_entrelaces_Cl[face] += vol_mod;
445 face=elem_faces(elem,3);
446 if(face<nb_faces_cl)
447 volumes_entrelaces_Cl[face] += vol_mod;
448 break;
449 }
450
451 case 8: // une Face de Dirichlet : Face 0
452 {
453 vol_mod = volumes_entrelaces[j]/3 ;
454 face=elem_faces(elem,1);
455 if(face<nb_faces_cl)
456 volumes_entrelaces_Cl[face] += vol_mod;
457 face=elem_faces(elem,2);
458 if(face<nb_faces_cl)
459 volumes_entrelaces_Cl[face] += vol_mod;
460 face=elem_faces(elem,3);
461 if(face<nb_faces_cl)
462 volumes_entrelaces_Cl[face] += vol_mod;
463 break;
464 }
465
466 case 3: // deux faces de Dirichlet : faces 2,3
467 {
468 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
469 + volumes_entrelaces[elem_faces(elem,3)])/2;
470 face=elem_faces(elem,0);
471 if(face<nb_faces_cl)
472 volumes_entrelaces_Cl[face] += vol_mod;
473 face=elem_faces(elem,1);
474 if(face<nb_faces_cl)
475 volumes_entrelaces_Cl[face] += vol_mod;
476 break;
477 }
478
479 case 5: // deux faces de Dirichlet : faces 1,3
480 {
481 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
482 + volumes_entrelaces[elem_faces(elem,3)])/2;
483 face=elem_faces(elem,0);
484 if(face<nb_faces_cl)
485 volumes_entrelaces_Cl[face] += vol_mod;
486 face=elem_faces(elem,2);
487 if(face<nb_faces_cl)
488 volumes_entrelaces_Cl[face] += vol_mod;
489 break;
490 }
491
492 case 6: // le tetraedre a deux faces de Dirichlet : faces 1,2
493 {
494 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
495 + volumes_entrelaces[elem_faces(elem,2)])/2;
496 face=elem_faces(elem,0);
497 if(face<nb_faces_cl)
498 volumes_entrelaces_Cl[face] += vol_mod;
499 face=elem_faces(elem,3);
500 if(face<nb_faces_cl)
501 volumes_entrelaces_Cl[face] += vol_mod;
502 break;
503 }
504
505 case 9: // deux faces de Dirichlet :faces 0,3
506 {
507 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
508 + volumes_entrelaces[elem_faces(elem,3)])/2;
509 face=elem_faces(elem,1);
510 if(face<nb_faces_cl)
511 volumes_entrelaces_Cl[face] += vol_mod;
512 face=elem_faces(elem,2);
513 if(face<nb_faces_cl)
514 volumes_entrelaces_Cl[face] += vol_mod;
515 break;
516 }
517
518 case 10: // deux faces de Dirichlet :faces 0,2
519 {
520 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
521 + volumes_entrelaces[elem_faces(elem,2)])/2;
522 face=elem_faces(elem,1);
523 if(face<nb_faces_cl)
524 volumes_entrelaces_Cl[face] += vol_mod;
525 face=elem_faces(elem,3);
526 if(face<nb_faces_cl)
527 volumes_entrelaces_Cl[face] += vol_mod;
528 break;
529 }
530
531 case 12: // deux faces de Dirichlet :faces 0,1
532 {
533 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
534 + volumes_entrelaces[elem_faces(elem,1)])/2;
535 face=elem_faces(elem,2);
536 if(face<nb_faces_cl)
537 volumes_entrelaces_Cl[face] += vol_mod;
538 face=elem_faces(elem,3);
539 if(face<nb_faces_cl)
540 volumes_entrelaces_Cl[face] += vol_mod;
541 break;
542 }
543
544
545
546 case 7: // trois faces de Dirichlet : faces 1,2,3
547 {
548 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
549 + volumes_entrelaces[elem_faces(elem,2)]
550 + volumes_entrelaces[elem_faces(elem,3)];
551 face=elem_faces(elem,0);
552 if(face<nb_faces_cl)
553 volumes_entrelaces_Cl[face] += vol_mod;
554 break;
555 }
556
557 case 11: // trois faces de Dirichlet : faces 0,2,3
558 {
559 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
560 + volumes_entrelaces[elem_faces(elem,2)]
561 + volumes_entrelaces[elem_faces(elem,3)];
562 face=elem_faces(elem,1);
563 if(face<nb_faces_cl)
564 volumes_entrelaces_Cl[face] += vol_mod;
565 break;
566 }
567
568 case 13: // trois faces de Dirichlet : faces 0,1,3
569 {
570
571 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
572 + volumes_entrelaces[elem_faces(elem,1)]
573 + volumes_entrelaces[elem_faces(elem,3)];
574 face=elem_faces(elem,2);
575 if(face<nb_faces_cl)
576 volumes_entrelaces_Cl[face] += vol_mod;
577 break;
578 }
579
580 case 14: // trois faces de Dirichlet : faces 0,1,2
581 {
582 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
583 + volumes_entrelaces[elem_faces(elem,1)]
584 + volumes_entrelaces[elem_faces(elem,2)];
585 face=elem_faces(elem,3);
586 if(face<nb_faces_cl)
587 volumes_entrelaces_Cl[face] += vol_mod;
588 break;
589 }
590 default :
591 {
592 Cerr << "\n type inconnu Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
593 exit();
594 }
595
596 } // fin du switch
597}
598
599void Tetra_VEF::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
600 const ArrOfDouble& vs,const DoubleTab& vsom,
601 const Champ_Inc_base& vitesse,int type_cl, const DoubleVect& porosite_face) const
602{
603 DoubleTab poro(4);
604 DoubleTab vfa(4,3);
605 for (int i=0; i<4; i++)
606 for (int j=0; j<3; j++)
607 {
608 vfa(i,j) = vitesse.valeurs()(Face[i],j);
609 }
610
611 for (int i=0; i<4; i++)
612 {
613 poro(i) = porosite_face(Face[i]);
614 }
615
616 calcul_vc_tetra(Face.addr(), vc.addr(), vs.addr(), vsom.addr(), vfa.addr(), (int)type_cl, poro.addr());
617}
618
619/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
620 *
621 */
622void Tetra_VEF::calcul_xg(DoubleVect& xg,const DoubleTab& x, const int type_elem_Cl,
623 int& idirichlet,int& n1,int& n2,int& n3) const
624{
625 calcul_xg_tetra(xg.addr(), x.addr(), (int)type_elem_Cl, idirichlet, n1, n2, n3);
626}
627
628void Tetra_VEF::modif_normales_facettes_Cl(DoubleTab& normales_facettes_Cl,
629 int fa7,int num_elem,int idirichlet,
630 int n1,int n2,int n3) const
631{
632 switch (idirichlet)
633 {
634
635 case 0:
636 break;
637
638 case 1:
639 break;
640
641 case 2: // une facette nulle n1
642 {
643 fa7=n1;
644 normales_facettes_Cl(num_elem,fa7,0) = 0;
645 normales_facettes_Cl(num_elem,fa7,1) = 0;
646 normales_facettes_Cl(num_elem,fa7,2) = 0;
647 break;
648 }
649
650 case 3:
651 {
652 fa7=n1;
653 normales_facettes_Cl(num_elem,fa7,0) = 0;
654 normales_facettes_Cl(num_elem,fa7,1) = 0;
655 normales_facettes_Cl(num_elem,fa7,2) = 0;
656 fa7=n2;
657 normales_facettes_Cl(num_elem,fa7,0) = 0;
658 normales_facettes_Cl(num_elem,fa7,1) = 0;
659 normales_facettes_Cl(num_elem,fa7,2) = 0;
660 fa7=n3;
661 normales_facettes_Cl(num_elem,fa7,0) = 0;
662 normales_facettes_Cl(num_elem,fa7,1) = 0;
663 normales_facettes_Cl(num_elem,fa7,2) = 0;
664 break;
665 }
666
667 } //fin du switch
668}
669
670
671
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
int_t nb_elem_tot() const
Definition Domaine.h:132
IntTab_t & les_elems()
Definition Domaine.h:129
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
class Domaine_VEF
Definition Domaine_VEF.h:54
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
const Domaine & domaine() const
const IntTab & KEL() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
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
_TYPE_ * addr()
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
Definition TRUSTTab.h:291
_SIZE_ size() const
Definition TRUSTVect.tpp:45
void modif_volumes_entrelaces_faces_joints(int, int, const Domaine_VEF &, DoubleVect &, int) const override
void modif_volumes_entrelaces(int, int, const Domaine_VEF &, DoubleVect &, int) const override
void creer_normales_facettes_Cl(DoubleTab &, int, int, const DoubleTab &, const DoubleVect &, const Domaine &) const override
remplit le tableau normales_facettes_Cl dans le Domaine_Cl_VEF pour la facette fa7 de l'element num_e...
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int, const DoubleVect &) const override
Tetra_VEF()
renvoie pour la facette fa7 : pour j=0,j=1 : les numeros locaux des 2 faces qui entourent fa7
Definition Tetra_VEF.cpp:41
void modif_normales_facettes_Cl(DoubleTab &, int, int, int, int, int, int) const override
void calcul_xg(DoubleVect &, const DoubleTab &, const int, int &, int &, int &, int &) const override
calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Diri...
void creer_facette_normales(const Domaine_VEF &, const IntVect &) const override
remplit le tableau face_normales dans le Domaine_VEF
void creer_face_normales(DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
Definition Tetra_VEF.cpp:56