TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Tetra_EF.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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_EF.h>
17#include <Domaine.h>
18#include <Domaine_EF.h>
19#include <Champ_P1_EF.h>
20#include <Equation_base.h>
21#include <Milieu_base.h>
22
23Implemente_instanciable_sans_constructeur(Tetra_EF,"Tetra_EF",Elem_EF_base);
24
25// printOn et readOn
26
27
29{
30 return s << que_suis_je() << finl;
31}
32
34{
35 return s ;
36}
37/*! @brief renvoie pour la facette fa7 : pour j=0,j=1 : les numeros locaux des 2 faces qui entourent fa7
38 *
39 * pour j=2,j=3 : les numeros locaux des sommets du tetraedre qui
40 * appartiennent a fa7
41 *
42 */
46
47void Tetra_EF::normale(int num_Face,DoubleTab& Face_normales,
48 const IntTab& Face_sommets,
49 const IntTab& Face_voisins,
50 const IntTab& elem_faces,
51 const Domaine& domaine_geom) const
52{
53
54 //Cerr << " num_Face " << num_Face << finl;
55 const DoubleTab& les_coords = domaine_geom.coord_sommets();
56
57 // Cerr << "les face sommet " << Face_sommets << finl;
58 double x1,y1,z1,x2,y2,z2;
59 double nx,ny,nz;
60 int f0,no4;
61
62 int n0 = Face_sommets(num_Face,0);
63 int n1 = Face_sommets(num_Face,1);
64 int n2 = Face_sommets(num_Face,2);
65
66
67 x1 = les_coords(n0,0) - les_coords(n1,0);
68 y1 = les_coords(n0,1) - les_coords(n1,1);
69 z1 = les_coords(n0,2) - les_coords(n1,2);
70
71 x2 = les_coords(n2,0) - les_coords(n1,0);
72 y2 = les_coords(n2,1) - les_coords(n1,1);
73 z2 = les_coords(n2,2) - les_coords(n1,2);
74
75 nx = (y1*z2 - y2*z1)/2;
76 ny = (-x1*z2 + x2*z1)/2;
77 nz = (x1*y2 - x2*y1)/2;
78 // Cerr << "nx " << nx << " ny " << ny << " nz " << nz << finl;
79
80 // Orientation de la normale de elem1 vers elem2
81 // pour cela recherche du sommet de elem1 qui n'est pas sur la Face
82 int elem1 = Face_voisins(num_Face,0);
83 if ( (f0 = elem_faces(elem1,0)) == num_Face )
84 f0 = elem_faces(elem1,1);
85
86 if ( (no4 = Face_sommets(f0,0)) != n0 && no4 != n1
87 && no4 != n2)
88 { /* Do nothing */}
89 else if ( (no4 = Face_sommets(f0,1)) != n0 && no4 != n1
90 && no4 != n2 )
91 { /* Do nothing */}
92 else
93 no4 = Face_sommets(f0,2);
94
95 x1 = les_coords(no4,0) - les_coords(n0,0);
96 y1 = les_coords(no4,1) - les_coords(n0,1);
97 z1 = les_coords(no4,2) - les_coords(n0,2);
98
99 if ( (nx*x1+ny*y1+nz*z1) > 0 )
100 {
101 Face_normales(num_Face,0) = - nx;
102 Face_normales(num_Face,1) = - ny;
103 Face_normales(num_Face,2) = - nz;
104 }
105 else
106 {
107 Face_normales(num_Face,0) = nx;
108 Face_normales(num_Face,1) = ny;
109 Face_normales(num_Face,2) = nz;
110 }
111
112 // Cerr << "Face_normales " << Face_normales << finl;
113
114}
115
116void Tetra_EF::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
117 const ArrOfDouble& vs,const DoubleTab& vsom,
118 const Champ_Inc_base& vitesse,int type_cl) const
119{
120 int comp;
121 const DoubleVect& porosite_face = vitesse.equation().milieu().porosite_face();
122 switch(type_cl)
123 {
124
125 case 0: // le tetraedre n'a pas de Face de Dirichlet
126 {
127 for (comp=0; comp<3; comp++)
128 vc[comp] = 0.25*vs[comp];
129 break;
130 }
131
132 case 1: // le tetraedre a une Face de Dirichlet : KEL3
133 {
134 for (comp=0; comp<3; comp++)
135 vc[comp] = vitesse.valeurs()(Face[3],comp)*porosite_face[Face[3]];
136 break;
137 }
138
139 case 2: // le tetraedre a une Face de Dirichlet : KEL2
140 {
141 for (comp=0; comp<3; comp++)
142 vc[comp] = vitesse.valeurs()(Face[2],comp)*porosite_face[Face[2]];
143 break;
144 }
145
146 case 4: // le tetraedre a une Face de Dirichlet : KEL1
147 {
148 for (comp=0; comp<3; comp++)
149 vc[comp] = vitesse.valeurs()(Face[1],comp)*porosite_face[Face[1]];
150 break;
151 }
152
153 case 8: // le tetraedre a une Face de Dirichlet : KEL0
154 {
155 for (comp=0; comp<3; comp++)
156 vc[comp] = vitesse.valeurs()(Face[0],comp)*porosite_face[Face[0]];
157 break;
158 }
159
160 case 3: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL2
161 {
162 for (comp=0; comp<3; comp++)
163 vc[comp] = 0.5* (vsom(0,comp) + vsom(1,comp));
164 break;
165 }
166
167 case 5: // le tetraedre a deux faces de Dirichlet : KEL3 et KEL1
168 {
169 for (comp=0; comp<3; comp++)
170 vc[comp] = 0.5* (vsom(0,comp) + vsom(2,comp));
171 break;
172 }
173
174 case 6: // le tetraedre a deux faces de Dirichlet : KEL1 et KEL2
175 {
176 for (comp=0; comp<3; comp++)
177 vc[comp] = 0.5* (vsom(0,comp) + vsom(3,comp));
178 break;
179 }
180
181 case 9: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL3
182 {
183 for (comp=0; comp<3; comp++)
184 vc[comp] = 0.5* (vsom(1,comp) + vsom(2,comp));
185 break;
186 }
187
188 case 10: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL2
189 {
190 for (comp=0; comp<3; comp++)
191 vc[comp] = 0.5* (vsom(1,comp) + vsom(3,comp));
192 break;
193 }
194
195 case 12: // le tetraedre a deux faces de Dirichlet : KEL0 et KEL1
196 {
197 for (comp=0; comp<3; comp++)
198 vc[comp] = 0.5*(vsom(2,comp) + vsom(3,comp));
199 break;
200 }
201
202 case 7: // le tetraedre a trois faces de Dirichlet : KEL1, KEL2 et KEL3
203 {
204 for (comp=0; comp<3; comp++)
205 vc[comp] = vsom(0,comp);
206 break;
207 }
208
209 case 11: // le tetraedre a trois faces de Dirichlet : KEL0,KEL2 et KEL3
210 {
211 for (comp=0; comp<3; comp++)
212 vc[comp] = vsom(1,comp);
213 break;
214 }
215
216 case 13: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL3
217 {
218 for (comp=0; comp<3; comp++)
219 vc[comp] = vsom(2,comp);
220 break;
221 }
222
223 case 14: // le tetraedre a trois faces de Dirichlet : KEL0, KEL1 et KEL2
224 {
225 for (comp=0; comp<3; comp++)
226 vc[comp] = vsom(3,comp);
227 break;
228 }
229
230 } // fin du switch
231}
232
233/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
234 *
235 */
236void Tetra_EF::calcul_xg(DoubleVect& xg,const DoubleTab& x, const int type_elem_Cl,
237 int& idirichlet,int& n1,int& n2,int& n3) const
238{
239 int j,dim=xg.size();
240
241 switch(type_elem_Cl)
242 {
243
244 case 0: // le tetraedre n'a pas de Face de Dirichlet. Il a 6 Facettes
245 {
246 for (j=0; j<dim; j++)
247 xg[j]=0.25*(x(0,j)+x(1,j)+x(2,j)+x(3,j));
248
249 idirichlet=0;
250 break;
251 }
252
253 case 1: // le tetraedre a une Face de Dirichlet. Le 'centre'
254 // du tetraedre est au milieu de la Face 3 qui a pour sommets
255 // 0, 1, 2
256 // Il a 3 Facettes reelles : 0 aux noeuds 2 3 xg
257 // 1 aux noeuds 1 3 xg
258 // 3 aux noeuds 3 0 xg
259 // les 3 autres Facettes sont sur la Face 3
260
261 {
262 for (j=0; j<dim; j++)
263 xg[j]=(x(0,j)+x(1,j)+x(2,j))/3.;
264
265 idirichlet=1;
266 break;
267
268 }
269
270 case 2: // le tetraedre a une Face de Dirichlet. Le 'centre'
271 // du tetraedre est au milieu de la Face 2 qui a pour sommets
272 // 0, 1, 3
273 // Il a 3 Facettes reelles : 0 aux noeuds 2 3 xg
274 // 2 aux noeuds 1 2 xg
275 // 4 aux noeuds 2 0 xg
276
277 {
278 for (j=0; j<dim; j++)
279 xg[j]=(x(0,j)+x(1,j)+x(3,j))/3.;
280
281 idirichlet=1;
282 break;
283 }
284
285 case 4: // le tetraedre a une Face de Dirichlet. Le 'centre'
286 // du tetraedre est au milieu de la Face 1 qui a pour sommets
287 // 0, 2, 3
288 // Il a 3 Facettes reelles : 1 aux noeuds 1 3 xg
289 // 2 aux noeuds 1 2 xg
290 // 5 aux noeuds 1 0 xg
291
292 {
293 for (j=0; j<dim; j++)
294 xg[j]=(x(0,j)+x(2,j)+x(3,j))/3.;
295
296 idirichlet=1;
297 break;
298 }
299
300 case 8: // le tetraedre a une Face de Dirichlet. Le 'centre'
301 // du tetraedre est au milieu de la Face 0 qui a pour sommets
302 // 1, 2, 3
303 // Il a 3 Facettes reelles : 3 aux noeuds 3 0 xg
304 // 4 aux noeuds 2 0 xg
305 // 5 aux noeuds 1 0 xg
306
307 {
308 for (j=0; j<dim; j++)
309 xg[j]=(x(1,j)+x(2,j)+x(3,j))/3.;
310
311 idirichlet=1;
312 break;
313 }
314
315 case 3: // le tetraedre a deux faces de Dirichlet 2 et 3. Le 'centre'
316 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 1.
317 // Il a 1 Facette nulle: 5
318
319 {
320 for (j=0; j<dim; j++)
321 xg[j]= 0.5*(x(0,j)+x(1,j));
322
323 n1=5;
324 idirichlet=2;
325 break;
326 }
327
328
329 case 5: // le tetraedre a deux faces de Dirichlet 3 et 1. Le 'centre'
330 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 2.
331 // Il a 1 Facette nulle : 4
332
333 {
334 for (j=0; j<dim; j++)
335 xg[j]= 0.5*(x(0,j)+x(2,j));
336
337 n1=4;
338 idirichlet=2;
339 break;
340 }
341
342 case 6: // le tetraedre a deux faces de Dirichlet 1 et 2. Le 'centre'
343 // du tetraedre est au milieu de l'arete qui a pour extremites 0, 3.
344 // Il a 1 Facette nulle: 3
345
346 {
347 for (j=0; j<dim; j++)
348 xg[j]= 0.5*(x(0,j)+x(3,j));
349
350 n1=3;
351 idirichlet=2;
352 break;
353 }
354
355 case 9: // le tetraedre a deux faces de Dirichlet 0 et 3. Le 'centre'
356 // du tetraedre est au milieu de l'arete qui a pour extremites 1, 2
357 // Il a 1 Facette nulle: 2
358
359 {
360 for (j=0; j<dim; j++)
361 xg[j]= 0.5*(x(1,j)+x(2,j));
362
363 n1=2;
364 idirichlet=2;
365 break;
366 }
367
368 case 10: // le tetraedre a deux faces de Dirichlet 0 et 2. Le 'centre'
369 // du tetraedre est au milieu de l'arete qui a pour extremites 1, 3.
370 // Il a 1 Facette nulle: 1
371
372 {
373 for (j=0; j<dim; j++)
374 xg[j]= 0.5*(x(1,j)+x(3,j));
375
376 n1=1;
377 idirichlet=2;
378 break;
379 }
380
381
382 case 12: // le tetraedre a deux faces de Dirichlet 0 et 1. Le 'centre'
383 // du tetraedre est au milieu de l'arete qui a pour sommets 2, 3.
384 // Il a 1 Facette nulle
385
386 {
387 for (j=0; j<dim; j++)
388 xg[j]= 0.5*(x(2,j)+x(3,j));
389
390 n1=0;
391 idirichlet=2;
392 break;
393 }
394
395 case 7: // trois faces de Dirichlet : 1,2,3. Le centre est au sommet 0
396 // il y 3 Facettes nulles: 3,4,5
397
398 {
399 for (j=0; j<dim; j++)
400 xg[j]= x(0,j);
401
402 n1=3;
403 n2=4;
404 n3=5;
405 idirichlet=3;
406 break;
407
408 }
409
410 case 11: // trois faces de Dirichlet : 0,2,3. Le centre est au sommet 1
411 // il y 3 Facettes nulles: 1, 2, 5
412
413 {
414 for (j=0; j<dim; j++)
415 xg[j]= x(1,j);
416
417 n1=1;
418 n2=2;
419 n3=5;
420 idirichlet=3;
421 break;
422
423 }
424
425 case 13: // trois faces de Dirichlet : 0,1,3. Le centre est au sommet 2
426 // il y 3 Facettes nulles: 0, 2, 4
427
428 {
429 for (j=0; j<dim; j++)
430 xg[j]= x(2,j);
431
432 n1=0;
433 n2=2;
434 n3=4;
435 idirichlet=3;
436 break;
437
438 }
439 case 14: // trois faces de Dirichlet : 0,1,2. Le centre est au sommet 3
440 // il y 3 Facettes nulles: 0, 1, 3
441
442 {
443 for (j=0; j<dim; j++)
444 xg[j]= x(3,j);
445
446 n1=0;
447 n2=1;
448 n3=3;
449 idirichlet=3;
450 break;
451
452 }
453 }
454}
455
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Milieu_base & milieu() const =0
DoubleVect & porosite_face()
Definition Milieu_base.h:62
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
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
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45
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...
Definition Tetra_EF.cpp:236
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int) const override
Definition Tetra_EF.cpp:116
void normale(int, DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
Definition Tetra_EF.cpp:47
Tetra_EF()
renvoie pour la facette fa7 : pour j=0,j=1 : les numeros locaux des 2 faces qui entourent fa7
Definition Tetra_EF.cpp:43