TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_Jones_Launder_VEF.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 <Modele_Jones_Launder_VEF.h>
17#include <Domaine_VEF.h>
18#include <Domaine_Cl_VEF.h>
19#include <Champ_Uniforme.h>
20#include <Scatter.h>
21#include <Champ_P1NC.h>
22#include <Champ_P0_VEF.h>
23
24Implemente_instanciable(Modele_Jones_Launder_VEF,"Modele_Jones_Launder_VEF",Modele_Fonc_Bas_Reynolds_Base);
25
26// printOn et readOn
27
29{
30 return s;
31}
32
34{
35 Motcle motlu, accolade_fermee="}", accolade_ouverte="{";
36 is >> motlu;
37 if (motlu==accolade_ouverte)
38 {
39 is >> motlu;
40 if (motlu != accolade_fermee)
41 {
42 Cerr << "Erreur a la lecture du Modele fonc bas reynolds Jones et Launder" << finl;
43 Cerr << "On attendait } a la place de " << motlu << finl;
45 }
46 }
47 else
48 {
49 Cerr << "Erreur a la lecture du Modele fonc bas reynolds Jones et Launder" << finl;
50 Cerr << "On attendait { a la place de " << motlu << finl;
52 }
53 return is;
54}
55
57{
58 return is;
59}
60///////////////////////////////////////////////////////////////
61// Implementation des fonctions de la classe
62///////////////////////////////////////////////////////////////
63
65 const Domaine_Cl_dis_base& domaine_Cl_dis)
66{
67 // const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
68 // const Domaine_Cl_VEF& le_dom_Cl = ref_cast(Domaine_Cl_VEF,domaine_Cl_dis);
69}
70
71DoubleTab& Modele_Jones_Launder_VEF::Calcul_D(DoubleTab& D,const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,
72 const DoubleTab& vitesse,const DoubleTab& K_eps_Bas_Re, const Champ_Don_base& ch_visco ) const
73{
74 double visco=-1;
75 const DoubleTab& tab_visco=ch_visco.valeurs();
76 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
77 if (is_visco_const)
78 visco=tab_visco(0,0);
79 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
80 // const Domaine_Cl_VEF& le_dom_Cl = ref_cast(Domaine_Cl_VEF,domaine_Cl_dis);
81 const DoubleVect& volumes = le_dom.volumes();
82 // int nb_faces = le_dom.nb_faces();
83 int nb_faces_tot = le_dom.nb_faces();
84 // int nb_elem = le_dom.nb_elem();
85 int nb_elem_tot = le_dom.nb_elem_tot();
86 // int nb_elem_tot = le_dom.nb_elem_tot();
87 const Domaine& domaine=le_dom.domaine();
88 const IntTab& elem_faces = le_dom.elem_faces();
89 const int nb_faces_elem = domaine.nb_faces_elem();
90 const DoubleTab& face_normales = le_dom.face_normales();
91 const DoubleVect& vol_ent = le_dom.volumes_entrelaces();
92
93 D = 0;
94 //return D;
95 int num_elem,i,face_loc,face_glob,num_face;
96 double deriv,Vol;
97
98 // Algo :
99 // * Boucle sur les elements
100 // * boucle locale dans l'element sur les faces -> calcul du gradient de racine de k
101 // * distribution de la valeur de l'integrale sur les faces de l'element
102 // Cela doit etre OK!!!
103 // Rq : k et epsilon sont definis comme la vitesse P1NC.
104
105 // ET le // ????? nb_elem ou nb_elem_tot
106 // Pbls des C.L. en paroi???? non car on impose epsilon-D = 0!!
107 for (num_elem=0; num_elem<nb_elem_tot; num_elem++)
108 {
109 Vol = volumes(num_elem);
110 for(i=0; i<dimension; i++)
111 {
112 deriv = 0;
113 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
114 {
115 face_glob = elem_faces(num_elem,face_loc);
116 deriv += sqrt(K_eps_Bas_Re(face_glob,0))*face_normales(face_glob,i)*le_dom.oriente_normale(face_glob,num_elem);
117 }
118 deriv /= Vol;
119 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
120 {
121 face_glob = elem_faces(num_elem,face_loc);
122 /* Cerr<<"face_glob = "<<face_glob<<finl;
123 Cerr<<"K_eps_Bas_Re(face_glob,0) = "<<K_eps_Bas_Re(face_glob,0)<<finl;
124 Cerr<<"deriv = "<<deriv<<", Vol = "<<Vol<<", nb_faces_elem = "<<nb_faces_elem<<finl;*/
125 if (!is_visco_const)
126 visco=tab_visco(num_elem);
127 // on divise par nb_faces_elem pour dire que chaque elem
128 // contribue pour 1/3 de son volume en 2D.
129 D(face_glob) += visco*deriv*deriv*Vol/nb_faces_elem;
130 }
131 }
132 }
133 // on divise par vol_ent car en 2d c 2/3 du volume. Donc en tout en 2D
134 // chaque face recoit en tout 2 * (1/3) * vol / (vol * (2/3))=1 !
135 for (num_face=0; num_face<nb_faces_tot; num_face++)
136 D(num_face) *= 2./vol_ent(num_face);
137
138 // RQ : il faut diviser par le volume entrelace car ce que nous calculons c est l integrale en V
139 // Par contre dans les termes sources on multiplie par le volume entrelace daonc pour rester coherent avec le reste....
140 //D=0;
141 // D*=0.5;
142 return D;
143}
144
145
146// Fonction utile visc
147// Pour le calcul de la derivee seconde
148// 1/|v|*(Si,elem)ind_der*(Sj,elem)ind_der
149/* pas appele
150 static double viscA(const Domaine_VEF& le_dom,int num_face,int num2,int dimension,
151 int num_elem, int ind_der)
152 {
153 double pscal;
154
155 pscal = le_dom.face_normales(num_face,ind_der)*le_dom.face_normales(num2,ind_der);
156
157 if ( (le_dom.face_voisins(num_face,0) == le_dom.face_voisins(num2,0)) ||
158 (le_dom.face_voisins(num_face,1) == le_dom.face_voisins(num2,1)))
159 return -pscal/le_dom.volumes(num_elem);
160 else
161 return pscal/le_dom.volumes(num_elem);
162 }
163*/
164
165DoubleTab& Modele_Jones_Launder_VEF::Calcul_E(DoubleTab& E,const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis, const DoubleTab& transporte,const DoubleTab& K_eps_Bas_Re,const Champ_Don_base& ch_visco, const DoubleTab& visco_turb ) const
166{
167 double visco=-1;
168 const DoubleTab& tab_visco=ch_visco.valeurs();
169 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
170 if (is_visco_const)
171 visco=tab_visco(0,0);
172 //const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF,domaine_Cl_dis);
173 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF,domaine_dis);
174 E = 0;
175 //return E;
176 // const IntTab& elem_faces = domaine_VEF.elem_faces();
177 const IntTab& face_voisins = domaine_VEF.face_voisins();
178 const DoubleVect& volumes = domaine_VEF.volumes();
179 //const DoubleTab& face_normales = domaine_VEF.face_normales();
180 // const DoubleTab& facette_normales = domaine_VEF.facette_normales();
181 // const DoubleVect& volumes_entrelaces = domaine_VEF.volumes_entrelaces();
182 // const Domaine& domaine = domaine_VEF.domaine();
183 const int nb_faces = domaine_VEF.nb_faces();
184 // int nb_faces_tot = domaine_VEF.nb_faces_tot();
185 // const int nfa7 = domaine_VEF.type_elem().nb_facette();
186 const int nb_elem = domaine_VEF.nb_elem();
187 // const IntVect& rang_elem_non_std = domaine_VEF.rang_elem_non_std();
188 //int premiere_face_int = domaine_VEF.premiere_face_int();
189 int premiere_face_int = domaine_VEF.premiere_face_int();
190
191 int i,j;
192 int elem,elem0,elem2;
193 //int n_bord;//alpha,beta,elem0;
194 // int nb_faces_elem = domaine_VEF.domaine().nb_faces_elem();
195
196 // double val;
197
198 const int ncomp_ch_transporte = transporte.line_size();
199
200 DoubleTab gradient(0, ncomp_ch_transporte, dimension);
201 domaine_VEF.creer_tableau_faces(gradient);
202
203 DoubleTab deriv_seconde_de_gradient_elem(0, ncomp_ch_transporte, dimension, dimension);
204 domaine_VEF.domaine().creer_tableau_elements(deriv_seconde_de_gradient_elem);
205 deriv_seconde_de_gradient_elem=0.;
206
207 DoubleTab champ_face(0,dimension);
208 domaine_VEF.creer_tableau_faces(champ_face);
209
210 // Calcul de la derivee premiere de U
211 // stokage d'un gradient_elem par element.
212 DoubleTab gradient_elem(0, ncomp_ch_transporte, dimension);
213 domaine_VEF.domaine().creer_tableau_elements(gradient_elem);
214
215 DoubleTab champ_elem(0, ncomp_ch_transporte, dimension);
216 domaine_VEF.domaine().creer_tableau_elements(champ_elem);
217
218 DoubleTab deriv_seconde_de_gradient(0, ncomp_ch_transporte, dimension, dimension);
219 domaine_VEF.creer_tableau_faces(deriv_seconde_de_gradient);
220 deriv_seconde_de_gradient=0.;
221
222 int fac=-1,elem1,comp;
223 // Rque methode non const Pourquoi ?
224
225 const Champ_P1NC& vitesse = ref_cast(Champ_P1NC,eq_hydraulique->inconnue());
226 ref_cast_non_const(Champ_P1NC,vitesse).calcul_gradient(transporte,gradient_elem,ref_cast(Domaine_Cl_VEF,eq_hydraulique->domaine_Cl_dis()));
227
228 gradient_elem.echange_espace_virtuel();
229 // On a les gradient_elem par elements
230 // Boucle sur les faces
231 //
232 for (fac=0; fac< premiere_face_int; fac++)
233 for (comp=0; comp<ncomp_ch_transporte; comp++)
234 for (i=0; i<dimension; i++)
235 {
236 elem1=face_voisins(fac,0);
237 if (elem1 != -1)
238 gradient(fac, comp, i) = gradient_elem(elem1, comp, i);
239 else
240 {
241 elem1=face_voisins(fac,1);
242 gradient(fac, comp, i) = gradient_elem(elem1, comp, i);
243 }
244 }
245// fin du for faces
246
247 for (; fac<nb_faces; fac++)
248 {
249 elem1=face_voisins(fac,0);
250 elem2=face_voisins(fac,1);
251 double vol1=volumes(elem1);
252 double vol2=volumes(elem2);
253 double voltot=vol1+vol2;
254 for (comp=0; comp<ncomp_ch_transporte; comp++)
255 for (i=0; i<dimension; i++)
256 {
257 double grad1=gradient_elem(elem1, comp, i);
258 double grad2=gradient_elem(elem2, comp, i);
259 gradient(fac, comp, i) = (vol1*grad1 + vol2*grad2)/voltot;
260 }
261 } // fin du for faces
262
263 gradient.echange_espace_virtuel();
264//on a les gradients sur les faces.
265
266
267 // maintenant on calcul la derivee seconde
268 // stokage de la derivee seconde par element.
269 for (i=0; i<dimension; i++)
270 {
271 for (comp=0; comp<ncomp_ch_transporte; comp++)
272 for (fac=0; fac<nb_faces; fac++)
273 champ_face(fac,comp)=gradient(fac, comp, i);
274
275 ref_cast_non_const(Champ_P1NC,vitesse).calcul_gradient(champ_face,champ_elem,ref_cast(Domaine_Cl_VEF,eq_hydraulique->domaine_Cl_dis()));
276
277 for (comp=0; comp<ncomp_ch_transporte; comp++)
278 for ( elem=0; elem<nb_elem; elem++)
279 for (j=0; j<dimension; j++)
280 deriv_seconde_de_gradient_elem(elem,comp,i,j) = champ_elem(elem,comp,j);
281
282 }
283
284 deriv_seconde_de_gradient_elem.echange_espace_virtuel();
285 // On a les gradient_elem par elements
286
287 // Boucle sur les faces
288 //
289
290 for (fac=0; fac< premiere_face_int; fac++)
291 {
292 for (comp=0; comp<ncomp_ch_transporte; comp++)
293 for (j=0; j<dimension; j++)
294 for (i=0; i<dimension; i++)
295 {
296 elem1=face_voisins(fac,0);
297 if (elem1 != -1)
298 deriv_seconde_de_gradient(fac, comp, i, j) = deriv_seconde_de_gradient_elem(elem1, comp, i, j);
299 else
300 {
301 elem1=face_voisins(fac,1);
302 deriv_seconde_de_gradient(fac, comp, i, j) = deriv_seconde_de_gradient_elem(elem1, comp, i, j);
303 }
304 }
305
306 } // fin du for faces
307
308 for (; fac<nb_faces; fac++)
309 {
310 elem1=face_voisins(fac,0);
311 elem2=face_voisins(fac,1);
312 double vol1=volumes(elem1);
313 double vol2=volumes(elem2);
314 double voltot=vol1+vol2;
315 for (comp=0; comp<ncomp_ch_transporte; comp++)
316 for (j=0; j<dimension; j++)
317 for (i=0; i<dimension; i++)
318 {
319 double grad1=deriv_seconde_de_gradient_elem(elem1, comp, i, j);
320 double grad2=deriv_seconde_de_gradient_elem(elem2, comp, i, j);
321 deriv_seconde_de_gradient(fac, comp, i, j) = (vol1*grad1 + vol2*grad2)/voltot;
322 }
323 } // fin du for faces
324
325 // Calcul de E
326 double deriv,nuturb;
327 for (fac=0; fac<nb_faces; fac++)
328 {
329 deriv = 0;
330 if (dimension == 2)
331 {
332 double val2 = deriv_seconde_de_gradient(fac,0,1,1)*deriv_seconde_de_gradient(fac,0,1,1);
333 double val3 = deriv_seconde_de_gradient(fac,1,0,0)*deriv_seconde_de_gradient(fac,1,0,0);
334 deriv = val2 + val3;
335 //deriv = gradient(fac, 0, 1);
336 }
337 else
338 {
339 double val2 = deriv_seconde_de_gradient(fac,1,0,0)+deriv_seconde_de_gradient(fac,2,0,0); //d2v_dx2(fac)+d2w_dx2(fac);
340 val2 *= val2;
341 double val3 = deriv_seconde_de_gradient(fac,0,1,1)+deriv_seconde_de_gradient(fac,2,1,1); //d2u_dy2(fac)+d2w_dy2(fac);
342 val3 *= val3;
343 double val4 = deriv_seconde_de_gradient(fac,0,2,2)+deriv_seconde_de_gradient(fac,1,2,2); //d2u_dz2(fac)+d2v_dz2(fac);
344 val4 *= val4;
345 deriv = val2 + val3 + val4;
346
347 }
348 elem0 = face_voisins(fac,0);
349 elem1 = face_voisins(fac,1);
350
351 if (elem1!=-1)
352 {
353 nuturb = visco_turb(elem0)*volumes(elem0)+visco_turb(elem1)*volumes(elem1);
354 nuturb /= volumes(elem0) + volumes(elem1);
355 if (!is_visco_const)
356 visco=(tab_visco(elem0)+tab_visco(elem1))/2.;
357 }
358 else
359 {
360 nuturb = visco_turb(elem0);
361 if (!is_visco_const)
362 visco=(tab_visco(elem0));
363 }
364
365 E(fac) = 2.*visco*deriv*nuturb;
366
367 }
368 //E=0;
369// Cerr<<E.mp_min_vect()<<" EEEEEEEEEEEEEEEEEEEEEEEE "<<E.mp_max_vect()<<finl;
370
371 return E;
372}
373
374DoubleTab& Modele_Jones_Launder_VEF::Calcul_F1( DoubleTab& F1, const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis, const DoubleTab& P, const DoubleTab& K_eps_Bas_Re,const Champ_base& ch_visco) const
375{
376 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
377 int nb_faces = le_dom.nb_faces();
378 for (int num_face=0; num_face <nb_faces; num_face ++ )
379 F1[num_face] = 1.;
380 return F1;
381}
382
383DoubleTab& Modele_Jones_Launder_VEF::Calcul_F2( DoubleTab& F2, DoubleTab& Deb, const Domaine_dis_base& domaine_dis,const DoubleTab& K_eps_Bas_Re,const Champ_base& ch_visco ) const
384{
385 double visco=-1;
386 const DoubleTab& tab_visco=ch_visco.valeurs();
387 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
388 if (is_visco_const)
389 visco=tab_visco(0,0);
390 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
391 int nb_faces = le_dom.nb_faces();
392 int num_face;
393 double Re;
394
395 for (num_face=0; num_face<nb_faces ; num_face++)
396 {
397 if (K_eps_Bas_Re(num_face,1)>0)
398 {
399 if (!is_visco_const)
400 {
401 int elem0 = le_dom.face_voisins(num_face,0);
402 int elem1 = le_dom.face_voisins(num_face,1);
403 if (elem1!=-1)
404 {
405 visco = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
406 visco /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
407 }
408 else
409 visco = tab_visco(elem0);
410
411 }
412 if (visco>0)
413 {
414 Re = (K_eps_Bas_Re(num_face,0)*K_eps_Bas_Re(num_face,0))/(visco*K_eps_Bas_Re(num_face,1));
415 F2[num_face] = 1. - (0.3*exp(-Re*Re));
416 }
417 }
418 else
419 {
420 F2[num_face] = 1.;
421 }
422 }
423 //Cerr<<F2.mp_min_vect()<<" F2 "<<F2.mp_max_vect()<<finl;
424 return F2;
425}
426/*
427 DoubleTab& Modele_Jones_Launder_VEF::Calcul_F2( DoubleTab& F2, DoubleTab& D, const Domaine_dis_base& domaine_dis,const DoubleTab& K_eps_Bas_Re, const DoubleTab& tab_visco ) const
428 {
429 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
430 int nb_faces = le_dom.nb_faces();
431 int num_face,elem0,elem1;
432 double Re,nulam;
433
434 for (num_face=0; num_face<nb_faces ; num_face++)
435 {
436 elem0 = le_dom.face_voisins(num_face,0);
437 elem1 = le_dom.face_voisins(num_face,1);
438 if (elem1!=-1)
439 {
440 nulam = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
441 nulam /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
442 }
443 else
444 nulam = tab_visco(elem0);
445
446 if (K_eps_Bas_Re(num_face,1)>0)
447 {
448 Re = (K_eps_Bas_Re(num_face,0)*K_eps_Bas_Re(num_face,0))/(nulam*K_eps_Bas_Re(num_face,1));
449 F2[num_face] = 1. - (0.3*exp(-Re*Re));
450 }
451 else
452 {
453 F2[num_face] = 1.;
454 }
455 }
456 return F2;
457 }
458
459*/
460DoubleTab& Modele_Jones_Launder_VEF::Calcul_Fmu( DoubleTab& Fmu,const Domaine_dis_base& domaine_dis,const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& K_eps_Bas_Re,const Champ_Don_base& ch_visco ) const
461{
462 double visco=-1;
463 const DoubleTab& tab_visco=ch_visco.valeurs();
464 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
465 if (is_visco_const)
466 visco=tab_visco(0,0);
467 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
468 int nb_faces = le_dom.nb_faces();
469 int num_face;
470 double Re;
471 Fmu = 0;
472
473 for (num_face=0; num_face<nb_faces ; num_face++)
474 {
475 if (1) // if (K_eps_Bas_Re(num_face,1)>0)
476 {
477 if (!is_visco_const)
478 {
479 int elem0 = le_dom.face_voisins(num_face,0);
480 int elem1 = le_dom.face_voisins(num_face,1);
481 if (elem1!=-1)
482 {
483 visco = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
484 visco /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
485 }
486 else
487 visco = tab_visco(elem0);
488 }
489 Re = (K_eps_Bas_Re(num_face,0)*K_eps_Bas_Re(num_face,0))/(visco*(K_eps_Bas_Re(num_face,1)+DMINFLOAT));
490 Fmu[num_face] = exp(-2.5/(1.+Re/50));
491 }
492 else
493 {
494 Fmu[num_face] = 0.;
495 }
496 }
497
498 return Fmu;
499}
500
501/*
502 DoubleTab& Modele_Jones_Launder_VEF::Calcul_Fmu( DoubleTab& Fmu,const Domaine_dis_base& domaine_dis,const DoubleTab& K_eps_Bas_Re,const DoubleTab& tab_visco ) const
503 {
504 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
505 int nb_faces = le_dom.nb_faces();
506 int num_face,elem0,elem1;
507 double Re,nulam;
508 Fmu = 0;
509
510 for (num_face=0; num_face<nb_faces ; num_face++)
511 {
512 elem0 = le_dom.face_voisins(num_face,0);
513 elem1 = le_dom.face_voisins(num_face,1);
514 if (elem1!=-1)
515 {
516 nulam = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
517 nulam /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
518 }
519 else
520 nulam = tab_visco(elem0);
521
522 if (K_eps_Bas_Re(num_face,1)>0)
523 {
524 Re = (K_eps_Bas_Re(num_face,0)*K_eps_Bas_Re(num_face,0))/(nulam*K_eps_Bas_Re(num_face,1));
525 Fmu[num_face] = exp(-2.5/(1.+Re/50.));
526 }
527 else
528 {
529 Fmu[num_face] = 0.;
530 }
531 }
532
533 return Fmu;
534 }
535*/
537{
538 ;
539}
540
541DoubleTab& Modele_Jones_Launder_VEF::Calcul_Fmu_BiK( DoubleTab& Fmu,const Domaine_dis_base& domaine_dis,const Domaine_Cl_dis_base& domaine_Cl_dis,const DoubleTab& K_Bas_Re,const DoubleTab& eps_Bas_Re,const Champ_Don_base& ch_visco ) const
542{
543 double visco=-1;
544 const DoubleTab& tab_visco=ch_visco.valeurs();
545 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
546 if (is_visco_const)
547 visco=tab_visco(0,0);
548 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
549 int nb_faces = le_dom.nb_faces();
550 int num_face;
551 double Re;
552 Fmu = 0;
553
554 for (num_face=0; num_face<nb_faces ; num_face++)
555 {
556 if (1) // if (eps_Bas_Re(num_face)>0)
557 {
558 if (!is_visco_const)
559 {
560 int elem0 = le_dom.face_voisins(num_face,0);
561 int elem1 = le_dom.face_voisins(num_face,1);
562 if (elem1!=-1)
563 {
564 visco = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
565 visco /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
566 }
567 else
568 visco = tab_visco(elem0);
569 }
570 Re = (K_Bas_Re(num_face)*K_Bas_Re(num_face))/(visco*(eps_Bas_Re(num_face)+DMINFLOAT));
571 Fmu[num_face] = exp(-2.5/(1.+Re/50));
572 }
573 else
574 {
575 Fmu[num_face] = 0.;
576 }
577 }
578
579 return Fmu;
580}
581
582
583DoubleTab& Modele_Jones_Launder_VEF::Calcul_F2_BiK( DoubleTab& F2, DoubleTab& Deb, const Domaine_dis_base& domaine_dis,const DoubleTab& K_Bas_Re,const DoubleTab& eps_Bas_Re,const Champ_base& ch_visco ) const
584{
585 double visco=-1;
586 const DoubleTab& tab_visco=ch_visco.valeurs();
587 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
588 if (is_visco_const)
589 visco=tab_visco(0,0);
590 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
591 int nb_faces = le_dom.nb_faces();
592 int num_face;
593 double Re;
594
595 for (num_face=0; num_face<nb_faces ; num_face++)
596 {
597 if (eps_Bas_Re(num_face)>0)
598 {
599 if (!is_visco_const)
600 {
601 int elem0 = le_dom.face_voisins(num_face,0);
602 int elem1 = le_dom.face_voisins(num_face,1);
603 if (elem1!=-1)
604 {
605 visco = tab_visco(elem0)*le_dom.volumes(elem0)+tab_visco(elem1)*le_dom.volumes(elem1);
606 visco /= le_dom.volumes(elem0) + le_dom.volumes(elem1);
607 }
608 else
609 visco = tab_visco(elem0);
610
611 }
612 if (visco>0)
613 {
614 Re = (K_Bas_Re(num_face)*K_Bas_Re(num_face))/(visco*eps_Bas_Re(num_face));
615 F2[num_face] = 1. - (0.3*exp(-Re*Re));
616 }
617 }
618 else
619 {
620 F2[num_face] = 1.;
621 }
622 }
623 //Cerr<<F2.mp_min_vect()<<" F2 "<<F2.mp_max_vect()<<finl;
624 return F2;
625}
626
627DoubleTab& Modele_Jones_Launder_VEF::Calcul_F1_BiK( DoubleTab& F1, const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis, const DoubleTab& P, const DoubleTab& K_Bas_Re, const DoubleTab& eps_Bas_Re,const Champ_base& ch_visco) const
628{
629 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
630 int nb_faces = le_dom.nb_faces();
631 for (int num_face=0; num_face <nb_faces; num_face ++ )
632 F1[num_face] = 1.;
633 return F1;
634}
635
636
637DoubleTab& Modele_Jones_Launder_VEF::Calcul_E_BiK(DoubleTab& E,const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis, const DoubleTab& transporte,const DoubleTab& K_Bas_Re,const DoubleTab& eps_Bas_Re,const Champ_Don_base& ch_visco, const DoubleTab& visco_turb ) const
638{
639 return Calcul_E( E, domaine_dis, domaine_Cl_dis, transporte, K_Bas_Re, ch_visco, visco_turb );
640}
641
642DoubleTab& Modele_Jones_Launder_VEF::Calcul_D_BiK(DoubleTab& D,const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis,
643 const DoubleTab& vitesse,const DoubleTab& K_Bas_Re,const DoubleTab& eps_Bas_Re, const Champ_Don_base& ch_visco ) const
644{
645 double visco=-1;
646 const DoubleTab& tab_visco=ch_visco.valeurs();
647 int is_visco_const=sub_type(Champ_Uniforme,ch_visco);
648 if (is_visco_const)
649 visco=tab_visco(0,0);
650 const Domaine_VEF& le_dom = ref_cast(Domaine_VEF,domaine_dis);
651 // const Domaine_Cl_VEF& le_dom_Cl = ref_cast(Domaine_Cl_VEF,domaine_Cl_dis);
652 const DoubleVect& volumes = le_dom.volumes();
653 // int nb_faces = le_dom.nb_faces();
654 int nb_faces_tot = le_dom.nb_faces();
655 // int nb_elem = le_dom.nb_elem();
656 int nb_elem_tot = le_dom.nb_elem_tot();
657 // int nb_elem_tot = le_dom.nb_elem_tot();
658 const Domaine& domaine=le_dom.domaine();
659 const IntTab& elem_faces = le_dom.elem_faces();
660 const int nb_faces_elem = domaine.nb_faces_elem();
661 const DoubleTab& face_normales = le_dom.face_normales();
662 const DoubleVect& vol_ent = le_dom.volumes_entrelaces();
663
664 D = 0;
665 //return D;
666 int num_elem,i,face_loc,face_glob,num_face;
667 double deriv,Vol;
668
669 // Algo :
670 // * Boucle sur les elements
671 // * boucle locale dans l'element sur les faces -> calcul du gradient de racine de k
672 // * distribution de la valeur de l'integrale sur les faces de l'element
673 // Cela doit etre OK!!!
674 // Rq : k et epsilon sont definis comme la vitesse P1NC.
675
676 // ET le // ????? nb_elem ou nb_elem_tot
677 // Pbls des C.L. en paroi???? non car on impose epsilon-D = 0!!
678 for (num_elem=0; num_elem<nb_elem_tot; num_elem++)
679 {
680 Vol = volumes(num_elem);
681 for(i=0; i<dimension; i++)
682 {
683 deriv = 0;
684 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
685 {
686 face_glob = elem_faces(num_elem,face_loc);
687 deriv += sqrt(K_Bas_Re(face_glob))*face_normales(face_glob,i)*le_dom.oriente_normale(face_glob,num_elem);
688 }
689 deriv /= Vol;
690 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
691 {
692 face_glob = elem_faces(num_elem,face_loc);
693 /* Cerr<<"face_glob = "<<face_glob<<finl;
694 Cerr<<"K_eps_Bas_Re(face_glob,0) = "<<K_eps_Bas_Re(face_glob,0)<<finl;
695 Cerr<<"deriv = "<<deriv<<", Vol = "<<Vol<<", nb_faces_elem = "<<nb_faces_elem<<finl;*/
696 if (!is_visco_const)
697 visco=tab_visco(num_elem);
698 // on divise par nb_faces_elem pour dire que chaque elem
699 // contribue pour 1/3 de son volume en 2D.
700 D(face_glob) += visco*deriv*deriv*Vol/nb_faces_elem;
701 }
702 }
703 }
704 // on divise par vol_ent car en 2d c 2/3 du volume. Donc en tout en 2D
705 // chaque face recoit en tout 2 * (1/3) * vol / (vol * (2/3))=1 !
706 for (num_face=0; num_face<nb_faces_tot; num_face++)
707 D(num_face) *= 2./vol_ent(num_face);
708
709 // RQ : il faut diviser par le volume entrelace car ce que nous calculons c est l integrale en V
710 // Par contre dans les termes sources on multiplie par le volume entrelace daonc pour rester coherent avec le reste....
711 //D=0;
712 // D*=0.5;
713 return D;
714}
715
716
717
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
Definition Domaine.cpp:851
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions 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
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double volumes(int i) const
Definition Domaine_VF.h:113
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 oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_elem_tot() const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
DoubleTab & Calcul_F1_BiK(DoubleTab &F1, const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &P, const DoubleTab &K_Bas_Re, const DoubleTab &eps_Bas_Re, const Champ_base &ch_visco) const override
Entree & lire(const Motcle &, Entree &)
DoubleTab & Calcul_Fmu_BiK(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const DoubleTab &, const Champ_Don_base &) const override
DoubleTab & Calcul_D_BiK(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const Champ_Don_base &) const override
DoubleTab & Calcul_F2_BiK(DoubleTab &, DoubleTab &, const Domaine_dis_base &, const DoubleTab &, const DoubleTab &, const Champ_base &) const override
DoubleTab & Calcul_E(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const DoubleTab &, const Champ_Don_base &, const DoubleTab &) const override
DoubleTab & Calcul_E_BiK(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const Champ_Don_base &, const DoubleTab &) const override
DoubleTab & Calcul_F1(DoubleTab &F1, const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis, const DoubleTab &P, const DoubleTab &K_eps_Bas_Re, const Champ_base &ch_visco) const override
DoubleTab & Calcul_D(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const DoubleTab &, const Champ_Don_base &) const override
DoubleTab & Calcul_Fmu(DoubleTab &, const Domaine_dis_base &, const Domaine_Cl_dis_base &, const DoubleTab &, const Champ_Don_base &) const override
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
DoubleTab & Calcul_F2(DoubleTab &, DoubleTab &, const Domaine_dis_base &, const DoubleTab &, const Champ_base &) const override
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
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
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
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")