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