TrioCFD 1.9.9_beta
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}
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
class Conds_lim This class represents a vector of boundary conditions.
Definition Conds_lim.h:32
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_VEF
Definition Domaine_VEF.h:53
int nb_faces() const
Returns the total number of faces.
Definition Domaine_VF.h:471
int nb_faces_tot() const
Returns the total number of 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
Returns the index of the i-th face of element num_elem; the face numbering convention is.
Definition Domaine_VF.h:542
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in 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
Class Modele_turbulence_hyd_LES_VEF_base.
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:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
Definition Objet_U.cpp:317
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
class Periodique This class represents a periodic boundary condition.
Definition Periodique.h:31
double distance() const
Definition Periodique.h:37
int direction_periodicite() const
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
Base class for output streams.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45