TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_LES_VEF.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
17#include <Modele_turbulence_hyd_LES_VEF.h>
18#include <Schema_Temps_base.h>
19#include <Domaine_Cl_VEF.h>
20#include <Equation_base.h>
21#include <Domaine_VEF.h>
22#include <Periodique.h>
23#include <Debog.h>
24
25Implemente_instanciable(Modele_turbulence_hyd_LES_VEF, "Modele_turbulence_hyd_sous_maille_VEF", Modele_turbulence_hyd_LES_VEF_base);
26
27Sortie& Modele_turbulence_hyd_LES_VEF::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
28
30
32{
33 static const double Csm1 = CSM1;
34 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_VF_.valeur());
35 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF, le_dom_Cl_.valeur());
36 double temps = mon_equation_->inconnue().temps();
37 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
38 const int nb_face = domaine_VEF.nb_faces();
39 const int nb_face_tot = domaine_VEF.nb_faces_tot();
40 const int nb_elem = domaine_VEF.nb_elem();
41 const IntTab& face_voisins = domaine_VEF.face_voisins();
42 int elem1, elem2, fac = 0, i;
43 double temp;
44
45 F2_.resize(nb_face_tot);
46 r_.resize(nb_face_tot);
47
49
50 if (visco_turb.size() != nb_elem)
51 {
52 Cerr << "erreur dans la taille du DoubleTab valeurs de la viscosite" << finl;
54 }
55 visco_turb = 0.;
56
57 // Traitement des bords
58
59 const Conds_lim& les_cl = domaine_Cl_VEF.les_conditions_limites();
60
61 for (i = 0; i < les_cl.size(); i++)
62 {
63 const Cond_lim& la_cl = les_cl[i];
64 const Front_VF& la_front_dis = ref_cast(Front_VF, la_cl->frontiere_dis());
65 int ndeb = la_front_dis.num_premiere_face();
66 int nfin = ndeb + la_front_dis.nb_faces();
67
68 if (sub_type(Periodique, la_cl.valeur()))
69 for (fac = ndeb; fac < nfin; fac++)
70 {
71 elem1 = face_voisins(fac, 0);
72 elem2 = face_voisins(fac, 1);
73 temp = Csm1 * r_(fac) * sqrt(F2_(fac));
74 visco_turb(elem1) += 0.5 * temp;
75 visco_turb(elem2) += 0.5 * temp;
76 }
77 else
78 for (fac = ndeb; fac < nfin; fac++)
79 {
80 elem1 = face_voisins(fac, 0);
81 temp = Csm1 * r_(fac) * sqrt(F2_(fac));
82 visco_turb(elem1) += temp;
83 }
84 }
85
86 // Traitement des faces internes
87 for (; fac < nb_face; fac++)
88 {
89 elem1 = face_voisins(fac, 0);
90 elem2 = face_voisins(fac, 1);
91 temp = Csm1 * r_(fac) * sqrt(F2_(fac));
92 visco_turb(elem1) += temp;
93 visco_turb(elem2) += temp;
94 }
95
96 visco_turb /= (domaine_VEF.domaine().nb_faces_elem());
97
98 la_viscosite_turbulente_->changer_temps(temps);
99 return la_viscosite_turbulente_;
100}
101
103{
104 const DoubleTab& la_vitesse = mon_equation_->inconnue().valeurs();
105 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF, le_dom_Cl_.valeur());
106 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_VF_.valeur());
107
108 const int nb_face = domaine_VEF.nb_faces();
109 const IntTab& elem_faces = domaine_VEF.elem_faces();
110 const IntTab& face_voisins = domaine_VEF.face_voisins();
111 const DoubleTab& xv = domaine_VEF.xv();
112
113 DoubleVect d2(dimension + 1), dv(dimension);
114 DoubleTab dd2(dimension + 1, 2);
115
116 int fac = 0, i, j, z;
117 IntVect num(2);
118
119 // On calcule tout d'abord F2 pour les faces se trouvant sur
120 // les bords du domaine
121
122 const Conds_lim& les_cl = domaine_Cl_VEF.les_conditions_limites();
123
124 for (int num_cl = 0; num_cl < les_cl.size(); num_cl++)
125 {
126 const Cond_lim& la_cl = les_cl[num_cl];
127 const Front_VF& la_front_dis = ref_cast(Front_VF, la_cl->frontiere_dis());
128 int ndeb = la_front_dis.num_premiere_face();
129 int nfin = ndeb + la_front_dis.nb_faces();
130 IntVect faces_elem_loc(dimension + 1);
131 int face_appartient_elem = 0;
132
133 if (sub_type(Periodique, la_cl.valeur()))
134 {
135 const Periodique& la_cl_perio = ref_cast(Periodique, la_cl.valeur());
136
137 for (fac = ndeb; fac < nfin; fac++)
138 {
139
140 double m;
141 double petit = 1.e30;
142
143 for (j = 0; j < 2; j++)
144 {
145 num(j) = face_voisins(fac, j);
146
147 face_appartient_elem = 0;
148
149 for (i = 0; i < dimension + 1; i++)
150 {
151 faces_elem_loc[i] = elem_faces(num(j), i);
152 if (faces_elem_loc[i] == fac)
153 face_appartient_elem = 1;
154 }
155
156 if (face_appartient_elem == 1)
157
158 for (i = 0; i < dimension + 1; i++)
159 {
160
161 m = 0;
162 for (z = 0; z < dimension; z++)
163 {
164 m += carre(xv(faces_elem_loc[i], z) - xv(fac, z));
165 }
166 double temp = dd2(i, j) = sqrt(m);
167 if (temp > 1.e-24)
168 petit = std::min(petit, temp);
169 }
170
171 else
172
173 for (i = 0; i < dimension + 1; i++)
174 {
175
176 m = 0;
177 for (z = 0; z < dimension; z++)
178 {
179 if (z == la_cl_perio.direction_periodicite())
180 {
181 m += carre(std::fabs(xv(faces_elem_loc[i], z) - xv(fac, z)) - la_cl_perio.distance());
182 }
183 else
184 m += carre(xv(faces_elem_loc[i], z) - xv(fac, z));
185 }
186 double temp = dd2(i, j) = sqrt(m);
187 if (temp > 1.e-24)
188 petit = std::min(petit, temp);
189 }
190 }
191 r_(fac) = petit;
192
193 if (petit < 0.)
194 {
195 Cerr << "pb avec r(fac) negatif dans Modele_turbulence_hyd_LES_VEF" << finl;
197 }
198
199 // On calcule la vitesse aux 2*dimension points qui entourent le point 0
200 // puis la fonction de structure d'abord en chaque point de calcul, puis sur la
201 // face comportant le point 0 .
202
203 double F1 = 0;
204 double F1b = 0;
205
206 for (i = 0; i < 2; i++)
207 {
208 num(i) = face_voisins(fac, i);
209 for (z = 0; z < dimension + 1; z++)
210 {
211 if (dd2(z, i) > 1e-24)
212 {
213 for (j = 0; j < dimension; j++)
214 {
215 dv(j) = (la_vitesse(elem_faces(num(i), z), j) - la_vitesse(fac, j)) * r_(fac) / dd2(z, i);
216 F1 += dv(j) * dv(j);
217 }
218
219 F1b += F1;
220 F1 = 0;
221 }
222 else
223 {
224 F1b += F1;
225 F1 = 0;
226 }
227 }
228 }
229 F2_(fac) = F1b / (2 * dimension);
230 }
231 }
232 else
233 {
234 for (fac = ndeb; fac < nfin; fac++)
235 {
236 double m;
237 double petit = 1e30;
238 int num1;
239 num1 = face_voisins(fac, 0);
240 for (i = 0; i < dimension + 1; i++)
241 {
242 m = 0;
243 for (z = 0; z < dimension; z++)
244 {
245 m += carre(xv(elem_faces(num1, i), z) - xv(fac, z));
246 }
247 double temp = d2(i) = sqrt(m);
248 if (temp > 1.e-24)
249 petit = std::min(petit, temp);
250 }
251 r_(fac) = petit;
252 if (petit < 0.)
253 {
254 Cerr << "pb avec r(fac) negatif dans Modele_turbulence_hyd_LES_VEF" << finl;
256 }
257
258 double F1 = 0;
259 double F1b = 0;
260
261 for (z = 0; z < dimension + 1; z++)
262 {
263 if (d2(z) > 1.e-24)
264 {
265 for (j = 0; j < dimension; j++)
266 {
267 dv(j) = (la_vitesse(elem_faces(num1, z), j) - la_vitesse(fac, j)) * r_(fac) / d2(z);
268 F1 += dv(j) * dv(j);
269 }
270 F1b += F1;
271 F1 = 0;
272 }
273 else
274 {
275 F1b += F1;
276 F1 = 0;
277 }
278 }
279 F2_(fac) = F1b / (dimension);
280
281 }
282 }
283 } // fin traitement des bords
284
285 //
286 // On traite maintenant les faces restantes
287 //
288
289 for (; fac < nb_face; fac++)
290 {
291
292 // On commence par determiner la distance entre le point ou on calcule
293 // et les points qui l'entourent
294
295 double m;
296 double petit = 1.e30;
297
298 for (j = 0; j < 2; j++)
299 {
300 num(j) = face_voisins(fac, j);
301 for (i = 0; i < dimension + 1; i++)
302 {
303 m = 0;
304 for (z = 0; z < dimension; z++)
305 {
306 m += carre(xv(elem_faces(num(j), i), z) - xv(fac, z));
307 }
308 double temp = dd2(i, j) = sqrt(m);
309 if (temp > 1.e-24)
310 petit = std::min(petit, temp);
311 }
312 }
313
314 r_(fac) = petit;
315 if (petit < 0.)
316 {
317 Cerr << "pb avec r(fac) negatif dans Modele_turbulence_hyd_LES_VEF" << finl;
319 }
320
321 // On calcule la vitesse aux 2*dimension points qui entourent le point 0
322 // puis la fonction de structure d'abord en chaque point de calcul, puis sur la
323 // face comportant le point 0 .
324
325 double F1 = 0;
326 double F1b = 0;
327
328 for (i = 0; i < 2; i++)
329 {
330 num(i) = face_voisins(fac, i);
331 for (z = 0; z < dimension + 1; z++)
332 {
333 if (dd2(z, i) > 1e-24)
334 {
335 for (j = 0; j < dimension; j++)
336 {
337 dv(j) = (la_vitesse(elem_faces(num(i), z), j) - la_vitesse(fac, j)) * r_(fac) / dd2(z, i);
338 F1 += dv(j) * dv(j);
339 }
340 F1b += F1;
341 F1 = 0;
342 }
343 else
344 {
345 F1b += F1;
346 F1 = 0;
347 }
348 }
349
350 }
351 F2_(fac) = F1b / (2 * dimension);
352 }
353}
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VEF
Definition Domaine_VEF.h:54
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
int nb_faces_tot() const
renvoie le nombre total de faces.
Definition Domaine_VF.h:481
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
classe Modele_turbulence_hyd_LES_VEF_base Cette classe correspond a la mise en oeuvre des modeles sou...
classe Modele_turbulence_hyd_LES_VEF Cette classe correspond a la mise en oeuvre du modele sous
Champ_Fonc_base & calculer_viscosite_turbulente() override
static int dimension
Definition Objet_U.h:99
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
double distance() const
Definition Periodique.h:37
int direction_periodicite() const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45