TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Quadri_EF.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Quadri_EF.h>
17#include <Domaine.h>
18
19Implemente_instanciable_sans_constructeur(Quadri_EF,"Quadri_EF",Elem_EF_base);
20
21// printOn et readOn
22
24{
25 return s << que_suis_je() << finl;
26}
27
29{
30 return s ;
31}
32
33/*! @brief KEL_(0,fa7),KEL_(1,fa7) sont les numeros locaux des 2 faces qui entourent la facette de numero local fa7
34 *
35 * le numero local de la fa7 est celui du sommet qui la porte
36 *
37 */
41
42/*! @brief remplit le tableau face_normales dans le Domaine_EF
43 *
44 */
45void Quadri_EF::normale(int num_Face,DoubleTab& Face_normales,
46 const IntTab& Face_sommets,
47 const IntTab& Face_voisins,
48 const IntTab& elem_faces,
49 const Domaine& domaine_geom) const
50{
51 const DoubleTab& les_coords = domaine_geom.coord_sommets();
52 double x1,y1;
53 double nx,ny;
54 double x1g=0,y1g=0;
55 double x2g=0,y2g=0;
56 double grx,gry,psc;
57 int sign=1,i;
58 int n0 = Face_sommets(num_Face,0);
59 int n1 = Face_sommets(num_Face,1);
60 x1 = les_coords(n0,0)-les_coords(n1,0);
61 y1 = les_coords(n0,1)-les_coords(n1,1);
62 nx = -y1;
63 ny = x1;
64 int elem1=Face_voisins(num_Face,0);
65 int elem2=Face_voisins(num_Face,1);
66
67 //Orientation de la normale vers le plus grand numero d'elem
68 //pour cela on teste d'abord si l'on est sur le bord
69 if (elem2!=-1)
70 {
71 //on oriente a partir du centre de gravite
72 //calcul du centre de gravite de chaque element
73 for(i=0; i<4; i++)
74 {
75 x1g+=les_coords(Face_sommets(elem_faces(elem1,i),0),0);
76 x1g+=les_coords(Face_sommets(elem_faces(elem1,i),1),0);
77 y1g+=les_coords(Face_sommets(elem_faces(elem1,i),0),1);
78 y1g+=les_coords(Face_sommets(elem_faces(elem1,i),1),1);
79 x2g+=les_coords(Face_sommets(elem_faces(elem2,i),0),0);
80 x2g+=les_coords(Face_sommets(elem_faces(elem2,i),1),0);
81 y2g+=les_coords(Face_sommets(elem_faces(elem2,i),0),1);
82 y2g+=les_coords(Face_sommets(elem_faces(elem2,i),1),1);
83 }
84
85 grx=(x2g-x1g)*0.125;
86 gry=(y2g-y1g)*0.125;
87
88 //on regarde le signe du produit scalaire
89 psc=grx*nx+gry*ny;
90 if(psc<0)
91 {
92 if(elem1<elem2)
93 sign=-1;
94 }
95 else if(elem2<elem1)
96 sign=-1;
97 }
98 else
99 {
100 //on oriente a partir du centre de gravite et du milieu de la
101 //face courante
102
103 for(i=0; i<4; i++)
104 {
105 x1g+=les_coords(Face_sommets(elem_faces(elem1,i),0),0);
106 x1g+=les_coords(Face_sommets(elem_faces(elem1,i),1),0);
107 y1g+=les_coords(Face_sommets(elem_faces(elem1,i),0),1);
108 y1g+=les_coords(Face_sommets(elem_faces(elem1,i),1),1);
109 }
110 // Cerr << "xg et yg de Face_normales: " << x1g << " " << y1g << finl;
111
112 x2g = les_coords(n0,0)+les_coords(n1,0);
113 y2g = les_coords(n0,1)+les_coords(n1,1);
114 grx=x2g*0.5-x1g*0.125;
115 gry=y2g*0.5-y1g*0.125;
116
117 // Cerr << "grx et gry : " << grx << " " << gry << finl;
118 //on regarde le signe du produit scalaire
119 psc=grx*nx+gry*ny;
120 if(psc<0)
121 sign=-1;
122 }
123 double scale = 1.0;
124 if (bidim_axi)
125 {
126 const double r0 = les_coords(n0, 0);
127 const double r1 = les_coords(n1, 0);
128 const double r_bar = 0.5 * (r0 + r1);
129 scale = 2.0 * M_PI * ((r_bar <=1e-10) ? x1g / 8.0 : r_bar);
130 }
131 Face_normales(num_Face, 0) = sign * nx * scale;
132 Face_normales(num_Face, 1) = sign * ny * scale;
133}
134
135/*! @brief
136 *
137 */
138void Quadri_EF::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
139 const ArrOfDouble& vs,const DoubleTab& vsom,
140 const Champ_Inc_base& vitesse,int type_cl) const
141{
142 //Cerr << " DANS Quadri_EF::calcul_vc , type_cl = " << type_cl << finl;
143 //Cerr << "vs " << vs << " et vsom " << vsom << " et vitesse " << vitesse << finl;
144
145// switch(type_cl) {
146// case 0: // pas de Face de Dirichlet
147// {
148 vc[0] = vs[0]*0.25;
149 vc[1] = vs[1]*0.25;
150// break;
151// }
152
153// case 1: // une Face de Dirichlet : Face 3
154// {
155// vc[0] = vitesse.valeurs()(Face[3],0);
156// vc[1] = vitesse.valeurs()(Face[3],1);
157// break;
158// }
159
160// case 3: // une Face de Dirichlet : Face 2
161// {
162// vc[0] = vitesse.valeurs()(Face[2],0);
163// vc[1] = vitesse.valeurs()(Face[2],1);
164// break;
165// }
166
167// case 9: // une Face de Dirichlet : Face 1
168// {
169// vc[0] = vitesse.valeurs()(Face[1],0);
170// vc[1] = vitesse.valeurs()(Face[1],1);
171// break;
172// }
173
174// case 27: // une Faces de Dirichlet :Face 0
175// {
176// vc[0] = vitesse.valeurs()(Face[0],0);
177// vc[1] = vitesse.valeurs()(Face[0],1);
178// break;
179// }
180
181// case 4: // deux Faces de Dirichlet : Faces 2,3
182// {
183// vc[0]= vsom(3,0);
184// vc[1]= vsom(3,1);
185// break;
186// }
187
188// case 28: // deux Faces de Dirichlet : Faces 0,3
189// {
190// vc[0]= vsom(2,0);
191// vc[1]= vsom(2,1);
192// break;
193// }
194
195// case 12: // deux Faces de Dirichlet : Faces 1,2
196// {
197// vc[0]= vsom(1,0);
198// vc[1]= vsom(1,1);
199// break;
200// }
201
202// case 36: // deux Faces de Dirichlet : Faces 0,1
203// {
204// vc[0]= vsom(0,0);
205// vc[1]= vsom(0,1);
206// break;
207// }
208
209
210// case 10: // deux Faces de Dirichlet : Faces 1,3
211// {
212// vc[0] = vs[0]*0.25;
213// vc[1] = vs[1]*0.25;
214// break;
215// }
216
217// case 30: // deux Faces de Dirichlet : Faces 0,2
218// {
219// vc[0] = vs[0]*0.25;
220// vc[1] = vs[1]*0.25;
221// break;
222// }
223
224// case 13: //trois Faces de Dirichlet : Faces 3,2,1
225// {
226// vc[0]= vitesse.valeurs()(Face[2],0);
227// vc[1]= vitesse.valeurs()(Face[2],1);
228// break;
229// }
230
231// case 31: //trois Faces de Dirichlet : Faces 0,3,2
232// {
233// vc[0]= vitesse.valeurs()(Face[3],0);
234// vc[1]= vitesse.valeurs()(Face[3],1);
235// break;
236// }
237
238// case 37: //trois Faces de Dirichlet : Faces 1,0,3
239// {
240// vc[0]= vitesse.valeurs()(Face[0],0);
241// vc[1]= vitesse.valeurs()(Face[0],1);
242// break;
243// }
244
245// case 39: //trois Faces de Dirichlet : Faces 2,1,0
246// {
247// vc[0]= vitesse.valeurs()(Face[1],0);
248// vc[1]= vitesse.valeurs()(Face[1],1);
249// break;
250// }
251
252// default :
253// {
254// Cerr << "\n type inconnu : " << type_cl ;
255// exit();
256// }
257
258// } // fin du switch
259
260}
261
262/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
263 *
264 * si idirichlet=2, n1 est le numero du sommet confondu avec G
265 *
266 */
267void Quadri_EF::calcul_xg(DoubleVect& xg, const DoubleTab& x,
268 const int type_elem_Cl,int& idirichlet,int& n1,int& ,int& ) const
269{
270 int j,dim=xg.size();
271// switch(type_elem_Cl) {
272
273// case 0: // pas de Face de dirichlet: il a 4 Facettes
274// // le point G est le barycentre des sommets du triangle
275// {
276 for (j=0; j<dim; j++)
277 xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
278 idirichlet=0;
279// break;
280// }
281
282// case 1: // une Face de Dirichlet : Face 3
283// // le point G est le centre de la face 3
284// {
285// for (j=0; j<dim; j++)
286// xg[j]=(x(2,j)+x(3,j))*0.5;
287// idirichlet=1;
288// break;
289// }
290
291// case 3: // une Face de Dirichlet : Face 2
292// // le point G est le centre de la face 2
293// {
294// for (j=0; j<dim; j++)
295// xg[j]=(x(1,j)+x(3,j))*0.5;
296// idirichlet=1;
297// break;
298// }
299
300// case 9: // une Face de Dirichlet : Face 1
301// // le point G est le centre de la face 1
302// {
303// for (j=0; j<dim; j++)
304// xg[j]=(x(0,j)+x(1,j))*0.5;
305// idirichlet=1;
306// break;
307// }
308
309// case 27: // une Faces de Dirichlet :Face 0
310// // le point G est le centre de la face 0
311// {
312// for (j=0; j<dim; j++)
313// xg[j]=(x(0,j)+x(2,j))*0.5;
314// idirichlet=1;
315// break;
316// }
317
318// case 4: // deux Faces de Dirichlet : Faces 2,3
319// //le point G est le sommet commun au deux faces de dirichlet
320// {
321// for (j=0; j<dim; j++)
322// xg[j]=x(3,j);
323// idirichlet=2;
324// break;
325// }
326
327// case 28: // deux Faces de Dirichlet : Faces 0,3
328// //le point G est le sommet commun au deux faces de dirichlet
329// {
330// for (j=0; j<dim; j++)
331// xg[j]=x(2,j);
332// idirichlet=2;
333// break;
334// }
335
336// case 12: // deux Faces de Dirichlet : Faces 1,2
337// //le point G est le sommet commun au deux faces de dirichlet
338// {
339// for (j=0; j<dim; j++)
340// xg[j]=x(1,j);
341// idirichlet=2;
342// break;
343// }
344
345// case 36: // deux Faces de Dirichlet : Faces 0,1
346// //le point G est le sommet commun au deux faces de dirichlet
347// {
348// for (j=0; j<dim; j++)
349// xg[j]=x(0,j);
350// idirichlet=2;
351// break;
352// }
353
354// case 10: // deux Faces de Dirichlet : Faces 1,3
355// // on garde les memes volumes de controles que pour des faces internes
356// {
357// for (j=0; j<dim; j++)
358// xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
359// idirichlet=0;
360// break;
361// }
362
363// case 30: // deux Faces de Dirichlet : Faces 0,2
364// // on garde les memes volumes de controles que pour des faces internes
365// {
366// for (j=0; j<dim; j++)
367// xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
368// idirichlet=0;
369// break;
370// }
371
372// case 13: //trois Faces de Dirichlet : Faces 3,2,1
373// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
374// {
375// for (j=0; j<dim; j++)
376// xg[j]=(x(1,j)+x(3,j))*0.5;
377// idirichlet=3;
378// break;
379// }
380
381// case 31: //trois Faces de Dirichlet : Faces 0,3,2
382// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
383// {
384// for (j=0; j<dim; j++)
385// xg[j]=(x(2,j)+x(3,j))*0.5;
386// idirichlet=3;
387// break;
388// }
389
390// case 37: //trois Faces de Dirichlet : Faces 1,0,3
391// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
392// {
393// for (j=0; j<dim; j++)
394// xg[j]=(x(0,j)+x(2,j))*0.5;
395// idirichlet=3;
396// break;
397// }
398
399// case 39: //trois Faces de Dirichlet : Faces 2,1,0
400// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
401// {
402// for (j=0; j<dim; j++)
403// xg[j]=(x(0,j)+x(1,j))*0.5;
404// idirichlet=3;
405// break;
406// }
407
408// } // fin du switch
409
410}
Classe Champ_Inc_base.
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
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
static int bidim_axi
Definition Objet_U.h:102
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
void normale(int, DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
remplit le tableau face_normales dans le Domaine_EF
Definition Quadri_EF.cpp: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...
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int) const override
Quadri_EF()
KEL_(0,fa7),KEL_(1,fa7) sont les numeros locaux des 2 faces qui entourent la facette de numero local ...
Definition Quadri_EF.cpp:38
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45