TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Tetra_VEF.h
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#ifndef Tetra_VEF_included
17#define Tetra_VEF_included
18
19#include <Elem_VEF_base.h>
20
22{
23
24 Declare_instanciable_sans_constructeur(Tetra_VEF);
25
26public:
27 Tetra_VEF();
28 inline int nb_facette() const override
29 {
30 return 6;
31 };
32 void creer_facette_normales(const Domaine_VEF&, const IntVect& ) const override;
33 void creer_normales_facettes_Cl(DoubleTab&, int ,int ,
34 const DoubleTab& ,const DoubleVect& , const Domaine&) const override ;
35 void modif_volumes_entrelaces(int ,int ,const Domaine_VEF& ,DoubleVect& ,int ) const override ;
36 void modif_volumes_entrelaces_faces_joints(int ,int ,const Domaine_VEF& ,DoubleVect& ,int ) const override ;
37 void modif_normales_facettes_Cl(DoubleTab& ,int ,int ,int ,int, int ,int ) const override ;
38 void calcul_vc(const ArrOfInt& ,ArrOfDouble& ,const ArrOfDouble& ,
39 const DoubleTab& ,const Champ_Inc_base& ,int, const DoubleVect& ) const override ;
40 void calcul_xg(DoubleVect& ,const DoubleTab& ,const int ,int& ,
41 int& ,int& ,int& ) const override ;
42 void creer_face_normales(DoubleTab&, const IntTab& ,const IntTab&,
43 const IntTab& ,const Domaine& ) const override ;
44};
45
46KOKKOS_INLINE_FUNCTION void calcul_vc_tetra(const int* Face, double *vc, const double * vs, const double * vsom,
47 const double* vitesse,int type_cl, const double* poro)
48{
49 // Passage (justifie vue la taille) en int de type_cl et comp car bug nvc++ sinon
50 int comp;
51 switch(type_cl)
52 {
53
54 case 0: // le tetraedre n'a pas de Face de Dirichlet
55 {
56 for (comp=0; comp<3; comp++)
57 vc[comp] = 0.25*vs[comp];
58 break;
59 }
60
61 case 1: // le tetraedre a une Face de Dirichlet : KEL3
62 {
63 for (comp=0; comp<3; comp++)
64 vc[comp] = vitesse[9+comp] * poro[3];
65 break;
66 }
67
68 case 2: // le tetraedre a une Face de Dirichlet : KEL2
69 {
70 for (comp=0; comp<3; comp++)
71 vc[comp] = vitesse[6+comp] * poro[2];
72 break;
73 }
74
75 case 4: // le tetraedre a une Face de Dirichlet : KEL1
76 {
77 for (comp=0; comp<3; comp++)
78 vc[comp] = vitesse[3+comp] * poro[1];
79 break;
80 }
81
82 case 8: // le tetraedre a une Face de Dirichlet : KEL0
83 {
84 for (comp=0; comp<3; comp++)
85 vc[comp] = vitesse[comp] * poro[0];
86 break;
87 }
88
89 case 3: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL2
90 {
91 for (comp=0; comp<3; comp++)
92 vc[comp] = 0.5* (vsom[comp] + vsom[3+comp]);
93 break;
94 }
95
96 case 5: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL1
97 {
98 for (comp=0; comp<3; comp++)
99 vc[comp] = 0.5* (vsom[comp] + vsom[6+comp]);
100 break;
101 }
102
103 case 6: // le tetraedre a deux faces de Dirichlet : KEL1 et KEL2
104 {
105 for (comp=0; comp<3; comp++)
106 vc[comp] = 0.5* (vsom[comp] + vsom[9+comp]);
107 break;
108 }
109
110 case 9: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL3
111 {
112 for (comp=0; comp<3; comp++)
113 vc[comp] = 0.5* (vsom[3+comp] + vsom[6+comp]);
114 break;
115 }
116
117 case 10: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL2
118 {
119 for (comp=0; comp<3; comp++)
120 vc[comp] = 0.5* (vsom[3+comp] + vsom[9+comp]);
121 break;
122 }
123
124 case 12: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL1
125 {
126 for (comp=0; comp<3; comp++)
127 vc[comp] = 0.5*(vsom[6+comp] + vsom[9+comp]);
128 break;
129 }
130
131 case 7: // le tetraedre a trois faces de Dirichlet : KEL1, KEL2 et KEL3
132 {
133 for (comp=0; comp<3; comp++)
134 vc[comp] = vsom[comp];
135 break;
136 }
137
138 case 11: // le tetraedre a trois faces de Dirichlet : KEL0,KEL2 et KEL3
139 {
140 for (comp=0; comp<3; comp++)
141 vc[comp] = vsom[3+comp];
142 break;
143 }
144
145 case 13: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL3
146 {
147 for (comp=0; comp<3; comp++)
148 vc[comp] = vsom[6+comp];
149 break;
150 }
151
152 case 14: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL2
153 {
154 for (comp=0; comp<3; comp++)
155 vc[comp] = vsom[9+comp];
156 break;
157 }
158
159 } // fin du switch
160
161}
162
163KOKKOS_INLINE_FUNCTION void calcul_vc_tetra_views(const int* Face, double *vc, const double * vs, const double * vsom,
164 CDoubleTabView vitesse,int type_cl, CDoubleArrView porosite_face)
165{
166 // Passage (justifie vue la taille) en int de type_cl et comp car bug nvc++ sinon
167 int comp;
168 switch(type_cl)
169 {
170
171 case 0: // le tetraedre n'a pas de Face de Dirichlet
172 {
173 for (comp=0; comp<3; comp++)
174 vc[comp] = 0.25*vs[comp];
175 break;
176 }
177
178 case 1: // le tetraedre a une Face de Dirichlet : KEL3
179 {
180 for (comp=0; comp<3; comp++)
181 vc[comp] = vitesse(Face[3], comp) * porosite_face(Face[3]);
182 break;
183 }
184
185 case 2: // le tetraedre a une Face de Dirichlet : KEL2
186 {
187 for (comp=0; comp<3; comp++)
188 vc[comp] = vitesse(Face[2], comp) * porosite_face(Face[2]);
189 break;
190 }
191
192 case 4: // le tetraedre a une Face de Dirichlet : KEL1
193 {
194 for (comp=0; comp<3; comp++)
195 vc[comp] = vitesse(Face[1], comp) * porosite_face(Face[1]);
196 break;
197 }
198
199 case 8: // le tetraedre a une Face de Dirichlet : KEL0
200 {
201 for (comp=0; comp<3; comp++)
202 vc[comp] = vitesse(Face[0], comp) * porosite_face(Face[0]);
203 break;
204 }
205
206 case 3: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL2
207 {
208 for (comp=0; comp<3; comp++)
209 vc[comp] = 0.5* (vsom[comp] + vsom[3+comp]);
210 break;
211 }
212
213 case 5: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL1
214 {
215 for (comp=0; comp<3; comp++)
216 vc[comp] = 0.5* (vsom[comp] + vsom[6+comp]);
217 break;
218 }
219
220 case 6: // le tetraedre a deux faces de Dirichlet : KEL1 et KEL2
221 {
222 for (comp=0; comp<3; comp++)
223 vc[comp] = 0.5* (vsom[comp] + vsom[9+comp]);
224 break;
225 }
226
227 case 9: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL3
228 {
229 for (comp=0; comp<3; comp++)
230 vc[comp] = 0.5* (vsom[3+comp] + vsom[6+comp]);
231 break;
232 }
233
234 case 10: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL2
235 {
236 for (comp=0; comp<3; comp++)
237 vc[comp] = 0.5* (vsom[3+comp] + vsom[9+comp]);
238 break;
239 }
240
241 case 12: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL1
242 {
243 for (comp=0; comp<3; comp++)
244 vc[comp] = 0.5*(vsom[6+comp] + vsom[9+comp]);
245 break;
246 }
247
248 case 7: // le tetraedre a trois faces de Dirichlet : KEL1, KEL2 et KEL3
249 {
250 for (comp=0; comp<3; comp++)
251 vc[comp] = vsom[comp];
252 break;
253 }
254
255 case 11: // le tetraedre a trois faces de Dirichlet : KEL0,KEL2 et KEL3
256 {
257 for (comp=0; comp<3; comp++)
258 vc[comp] = vsom[3+comp];
259 break;
260 }
261
262 case 13: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL3
263 {
264 for (comp=0; comp<3; comp++)
265 vc[comp] = vsom[6+comp];
266 break;
267 }
268
269 case 14: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL2
270 {
271 for (comp=0; comp<3; comp++)
272 vc[comp] = vsom[9+comp];
273 break;
274 }
275
276 } // fin du switch
277
278}
279
280/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
281 *
282 */
283KOKKOS_INLINE_FUNCTION
284void calcul_xg_tetra(double * xg, const double *x, const int type_elem_Cl, int& idirichlet,int& n1,int& n2,int& n3)
285{
286 // Passage (justifie vue la taille) en int de type_elem_cl et comp car bug nvc++ sinon
287 int dim = 3;
288 switch(type_elem_Cl)
289 {
290 case 0: // le tetraedre n'a pas de Face de Dirichlet. Il a 6 Facettes
291 {
292 for (int j=0; j<dim; j++)
293 xg[j]=0.25*(x[j]+x[dim+j]+x[2*dim+j]+x[3*dim+j]);
294
295 idirichlet=0;
296 break;
297 }
298
299 case 1: // le tetraedre a une Face de Dirichlet. Le 'centre'
300 // du tetraedre est au milieu de la Face 3 qui a pour sommets
301 // 0, 1, 2
302 // Il a 3 Facettes reelles : 0 aux noeuds 2 3 xg
303 // 1 aux noeuds 1 3 xg
304 // 3 aux noeuds 3 0 xg
305 // les 3 autres Facettes sont sur la Face 3
306
307 {
308 for (int j=0; j<dim; j++)
309 xg[j]=(x[j]+x[dim+j]+x[2*dim+j])/3.;
310
311 idirichlet=1;
312 break;
313
314 }
315
316 case 2: // le tetraedre a une Face de Dirichlet. Le 'centre'
317 // du tetraedre est au milieu de la Face 2 qui a pour sommets
318 // 0, 1, 3
319 // Il a 3 Facettes reelles : 0 aux noeuds 2 3 xg
320 // 2 aux noeuds 1 2 xg
321 // 4 aux noeuds 2 0 xg
322
323 {
324 for (int j=0; j<dim; j++)
325 xg[j]=(x[j]+x[dim+j]+x[3*dim+j])/3.;
326
327 idirichlet=1;
328 break;
329 }
330
331 case 4: // le tetraedre a une Face de Dirichlet. Le 'centre'
332 // du tetraedre est au milieu de la Face 1 qui a pour sommets
333 // 0, 2, 3
334 // Il a 3 Facettes reelles : 1 aux noeuds 1 3 xg
335 // 2 aux noeuds 1 2 xg
336 // 5 aux noeuds 1 0 xg
337
338 {
339 for (int j=0; j<dim; j++)
340 xg[j]=(x[j]+x[2*dim+j]+x[3*dim+j])/3.;
341
342 idirichlet=1;
343 break;
344 }
345
346 case 8: // le tetraedre a une Face de Dirichlet. Le 'centre'
347 // du tetraedre est au milieu de la Face 0 qui a pour sommets
348 // 1, 2, 3
349 // Il a 3 Facettes reelles : 3 aux noeuds 3 0 xg
350 // 4 aux noeuds 2 0 xg
351 // 5 aux noeuds 1 0 xg
352
353 {
354 for (int j=0; j<dim; j++)
355 xg[j]=(x[dim+j]+x[2*dim+j]+x[3*dim+j])/3.;
356
357 idirichlet=1;
358 break;
359 }
360
361 case 3: // le tetraedre a deux faces de Dirichlet 2 et 3. Le 'centre'
362 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 1.
363 // Il a 1 Facette nulle: 5
364
365 {
366 for (int j=0; j<dim; j++)
367 xg[j]= 0.5*(x[j]+x[dim+j]);
368
369 n1=5;
370 idirichlet=2;
371 break;
372 }
373
374
375 case 5: // le tetraedre a deux faces de Dirichlet 3 et 1. Le 'centre'
376 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 2.
377 // Il a 1 Facette nulle : 4
378
379 {
380 for (int j=0; j<dim; j++)
381 xg[j]= 0.5*(x[j]+x[2*dim+j]);
382
383 n1=4;
384 idirichlet=2;
385 break;
386 }
387
388 case 6: // le tetraedre a deux faces de Dirichlet 1 et 2. Le 'centre'
389 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 3.
390 // Il a 1 Facette nulle: 3
391
392 {
393 for (int j=0; j<dim; j++)
394 xg[j]= 0.5*(x[j]+x[3*dim+j]);
395
396 n1=3;
397 idirichlet=2;
398 break;
399 }
400
401 case 9: // le tetraedre a deux faces de Dirichlet 0 et 3. Le 'centre'
402 // du tetraedre est au milieu de l'arete qui a pour extremites 1, 2
403 // Il a 1 Facette nulle: 2
404
405 {
406 for (int j=0; j<dim; j++)
407 xg[j]= 0.5*(x[dim+j]+x[2*dim+j]);
408
409 n1=2;
410 idirichlet=2;
411 break;
412 }
413
414 case 10: // le tetraedre a deux faces de Dirichlet 0 et 2. Le 'centre'
415 // du tetraedre est au milieu de l'arete qui a pour extremites 1, 3.
416 // Il a 1 Facette nulle: 1
417
418 {
419 for (int j=0; j<dim; j++)
420 xg[j]= 0.5*(x[dim+j]+x[3*dim+j]);
421
422 n1=1;
423 idirichlet=2;
424 break;
425 }
426
427
428 case 12: // le tetraedre a deux faces de Dirichlet 0 et 1. Le 'centre'
429 // du tetraedre est au milieu de l'arete qui a pour sommets 2, 3.
430 // Il a 1 Facette nulle
431
432 {
433 for (int j=0; j<dim; j++)
434 xg[j]= 0.5*(x[2*dim+j]+x[3*dim+j]);
435
436 n1=0;
437 idirichlet=2;
438 break;
439 }
440
441 case 7: // trois faces de Dirichlet : 1,2,3. Le centre est au sommet 0
442 // il y 3 Facettes nulles: 3,4,5
443
444 {
445 for (int j=0; j<dim; j++)
446 xg[j]= x[j];
447
448 n1=3;
449 n2=4;
450 n3=5;
451 idirichlet=3;
452 break;
453
454 }
455
456 case 11: // trois faces de Dirichlet : 0,2,3. Le centre est au sommet 1
457 // il y 3 Facettes nulles: 1, 2, 5
458
459 {
460 for (int j=0; j<dim; j++)
461 xg[j]= x[dim+j];
462
463 n1=1;
464 n2=2;
465 n3=5;
466 idirichlet=3;
467 break;
468
469 }
470
471 case 13: // trois faces de Dirichlet : 0,1,3. Le centre est au sommet 2
472 // il y 3 Facettes nulles: 0, 2, 4
473
474 {
475 for (int j=0; j<dim; j++)
476 xg[j]= x[2*dim+j];
477
478 n1=0;
479 n2=2;
480 n3=4;
481 idirichlet=3;
482 break;
483
484 }
485 case 14: // trois faces de Dirichlet : 0,1,2. Le centre est au sommet 3
486 // il y 3 Facettes nulles: 0, 1, 3
487
488 {
489 for (int j=0; j<dim; j++)
490 xg[j]= x[3*dim+j];
491
492 n1=0;
493 n2=1;
494 n3=3;
495 idirichlet=3;
496 break;
497
498 }
499 }
500}
501#endif
502
503
504
Classe Champ_Inc_base.
class Domaine_VEF
Definition Domaine_VEF.h:54
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
int nb_facette() const override
Definition Tetra_VEF.h:28
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