TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Quadri_poly.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_poly.h>
17#include <Domaine.h>
18
19Implemente_instanciable_sans_constructeur(Quadri_poly,"Quadri_poly",Elem_poly_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_poly
43 *
44 */
45void Quadri_poly::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 // In 2D Cartesian, |n| = edge length L. In axisym (RZ), |n| must equal the surface of revolution:
124 // S_f = Δθ * r_bar * L, with r_bar = (r0+r1)/2 and L = |edge|.
125 double scale = 1.0;
127 {
128 const double r0 = les_coords(n0,0);
129 const double r1 = les_coords(n1,0);
130 const double r_bar = 0.5*(r0 + r1);
131 scale = 2.0 * M_PI * r_bar; // multiply edge-length normal by Δθ * r̄
132 }
133 Face_normales(num_Face,0) = sign * nx * scale;
134 Face_normales(num_Face,1) = sign * ny * scale;
135}
136
137/*! @brief
138 *
139 */
140void Quadri_poly::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
141 const ArrOfDouble& vs,const DoubleTab& vsom,
142 const Champ_Inc_base& vitesse,int type_cl) const
143{
144 //Cerr << " DANS Quadri_poly::calcul_vc , type_cl = " << type_cl << finl;
145 //Cerr << "vs " << vs << " et vsom " << vsom << " et vitesse " << vitesse << finl;
146
147// switch(type_cl) {
148// case 0: // pas de Face de Dirichlet
149// {
150 vc[0] = vs[0]*0.25;
151 vc[1] = vs[1]*0.25;
152// break;
153// }
154
155// case 1: // une Face de Dirichlet : Face 3
156// {
157// vc[0] = vitesse.valeurs()(Face[3],0);
158// vc[1] = vitesse.valeurs()(Face[3],1);
159// break;
160// }
161
162// case 3: // une Face de Dirichlet : Face 2
163// {
164// vc[0] = vitesse.valeurs()(Face[2],0);
165// vc[1] = vitesse.valeurs()(Face[2],1);
166// break;
167// }
168
169// case 9: // une Face de Dirichlet : Face 1
170// {
171// vc[0] = vitesse.valeurs()(Face[1],0);
172// vc[1] = vitesse.valeurs()(Face[1],1);
173// break;
174// }
175
176// case 27: // une Faces de Dirichlet :Face 0
177// {
178// vc[0] = vitesse.valeurs()(Face[0],0);
179// vc[1] = vitesse.valeurs()(Face[0],1);
180// break;
181// }
182
183// case 4: // deux Faces de Dirichlet : Faces 2,3
184// {
185// vc[0]= vsom(3,0);
186// vc[1]= vsom(3,1);
187// break;
188// }
189
190// case 28: // deux Faces de Dirichlet : Faces 0,3
191// {
192// vc[0]= vsom(2,0);
193// vc[1]= vsom(2,1);
194// break;
195// }
196
197// case 12: // deux Faces de Dirichlet : Faces 1,2
198// {
199// vc[0]= vsom(1,0);
200// vc[1]= vsom(1,1);
201// break;
202// }
203
204// case 36: // deux Faces de Dirichlet : Faces 0,1
205// {
206// vc[0]= vsom(0,0);
207// vc[1]= vsom(0,1);
208// break;
209// }
210
211
212// case 10: // deux Faces de Dirichlet : Faces 1,3
213// {
214// vc[0] = vs[0]*0.25;
215// vc[1] = vs[1]*0.25;
216// break;
217// }
218
219// case 30: // deux Faces de Dirichlet : Faces 0,2
220// {
221// vc[0] = vs[0]*0.25;
222// vc[1] = vs[1]*0.25;
223// break;
224// }
225
226// case 13: //trois Faces de Dirichlet : Faces 3,2,1
227// {
228// vc[0]= vitesse.valeurs()(Face[2],0);
229// vc[1]= vitesse.valeurs()(Face[2],1);
230// break;
231// }
232
233// case 31: //trois Faces de Dirichlet : Faces 0,3,2
234// {
235// vc[0]= vitesse.valeurs()(Face[3],0);
236// vc[1]= vitesse.valeurs()(Face[3],1);
237// break;
238// }
239
240// case 37: //trois Faces de Dirichlet : Faces 1,0,3
241// {
242// vc[0]= vitesse.valeurs()(Face[0],0);
243// vc[1]= vitesse.valeurs()(Face[0],1);
244// break;
245// }
246
247// case 39: //trois Faces de Dirichlet : Faces 2,1,0
248// {
249// vc[0]= vitesse.valeurs()(Face[1],0);
250// vc[1]= vitesse.valeurs()(Face[1],1);
251// break;
252// }
253
254// default :
255// {
256// Cerr << "\n type inconnu : " << type_cl ;
257// exit();
258// }
259
260// } // fin du switch
261
262}
263
264/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
265 *
266 * si idirichlet=2, n1 est le numero du sommet confondu avec G
267 *
268 */
269void Quadri_poly::calcul_xg(DoubleVect& xg, const DoubleTab& x,
270 const int type_elem_Cl,int& idirichlet,int& n1,int& ,int& ) const
271{
272 int j,dim=xg.size();
273// switch(type_elem_Cl) {
274
275// case 0: // pas de Face de dirichlet: il a 4 Facettes
276// // le point G est le barycentre des sommets du triangle
277// {
278 for (j=0; j<dim; j++)
279 xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
280 idirichlet=0;
281// break;
282// }
283
284// case 1: // une Face de Dirichlet : Face 3
285// // le point G est le centre de la face 3
286// {
287// for (j=0; j<dim; j++)
288// xg[j]=(x(2,j)+x(3,j))*0.5;
289// idirichlet=1;
290// break;
291// }
292
293// case 3: // une Face de Dirichlet : Face 2
294// // le point G est le centre de la face 2
295// {
296// for (j=0; j<dim; j++)
297// xg[j]=(x(1,j)+x(3,j))*0.5;
298// idirichlet=1;
299// break;
300// }
301
302// case 9: // une Face de Dirichlet : Face 1
303// // le point G est le centre de la face 1
304// {
305// for (j=0; j<dim; j++)
306// xg[j]=(x(0,j)+x(1,j))*0.5;
307// idirichlet=1;
308// break;
309// }
310
311// case 27: // une Faces de Dirichlet :Face 0
312// // le point G est le centre de la face 0
313// {
314// for (j=0; j<dim; j++)
315// xg[j]=(x(0,j)+x(2,j))*0.5;
316// idirichlet=1;
317// break;
318// }
319
320// case 4: // deux Faces de Dirichlet : Faces 2,3
321// //le point G est le sommet commun au deux faces de dirichlet
322// {
323// for (j=0; j<dim; j++)
324// xg[j]=x(3,j);
325// idirichlet=2;
326// break;
327// }
328
329// case 28: // deux Faces de Dirichlet : Faces 0,3
330// //le point G est le sommet commun au deux faces de dirichlet
331// {
332// for (j=0; j<dim; j++)
333// xg[j]=x(2,j);
334// idirichlet=2;
335// break;
336// }
337
338// case 12: // deux Faces de Dirichlet : Faces 1,2
339// //le point G est le sommet commun au deux faces de dirichlet
340// {
341// for (j=0; j<dim; j++)
342// xg[j]=x(1,j);
343// idirichlet=2;
344// break;
345// }
346
347// case 36: // deux Faces de Dirichlet : Faces 0,1
348// //le point G est le sommet commun au deux faces de dirichlet
349// {
350// for (j=0; j<dim; j++)
351// xg[j]=x(0,j);
352// idirichlet=2;
353// break;
354// }
355
356// case 10: // deux Faces de Dirichlet : Faces 1,3
357// // on garde les memes volumes de controles que pour des faces internes
358// {
359// for (j=0; j<dim; j++)
360// xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
361// idirichlet=0;
362// break;
363// }
364
365// case 30: // deux Faces de Dirichlet : Faces 0,2
366// // on garde les memes volumes de controles que pour des faces internes
367// {
368// for (j=0; j<dim; j++)
369// xg[j]=(x(0,j)+x(1,j)+x(2,j)+x(3,j))*0.25;
370// idirichlet=0;
371// break;
372// }
373
374// case 13: //trois Faces de Dirichlet : Faces 3,2,1
375// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
376// {
377// for (j=0; j<dim; j++)
378// xg[j]=(x(1,j)+x(3,j))*0.5;
379// idirichlet=3;
380// break;
381// }
382
383// case 31: //trois Faces de Dirichlet : Faces 0,3,2
384// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
385// {
386// for (j=0; j<dim; j++)
387// xg[j]=(x(2,j)+x(3,j))*0.5;
388// idirichlet=3;
389// break;
390// }
391
392// case 37: //trois Faces de Dirichlet : Faces 1,0,3
393// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
394// {
395// for (j=0; j<dim; j++)
396// xg[j]=(x(0,j)+x(2,j))*0.5;
397// idirichlet=3;
398// break;
399// }
400
401// case 39: //trois Faces de Dirichlet : Faces 2,1,0
402// // le point G est le centre de la face de dirichlet opposee a la face non-dirichlet
403// {
404// for (j=0; j<dim; j++)
405// xg[j]=(x(0,j)+x(1,j))*0.5;
406// idirichlet=3;
407// break;
408// }
409
410// } // fin du switch
411
412}
413
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 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...
Quadri_poly()
KEL_(0,fa7),KEL_(1,fa7) sont les numeros locaux des 2 faces qui entourent la facette de numero local ...
void normale(int, DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
remplit le tableau face_normales dans le Domaine_poly
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int) const
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45