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