TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Face_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Dirichlet_entree_fluide_leaves.h>
17#include <Dirichlet_paroi_defilante.h>
18#include <Champ_Uniforme_Morceaux.h>
19#include <Dirichlet_paroi_fixe.h>
20#include <Modele_turbulence_hyd_base.h>
21#include <Champ_Uniforme.h>
22#include <Champ_Face_VDF.h>
23#include <Domaine_Cl_VDF.h>
24#include <distances_VDF.h>
25#include <Equation_base.h>
26#include <Champ_Don_lu.h>
27#include <Fluide_base.h>
28#include <Periodique.h>
29#include <Option_VDF.h>
30#include <Navier.h>
31
32// XXX : Elie Saikali : je garde Champ_Face aussi sinon faut changer typer et reprise dans bcp des endroits ...
33Implemente_instanciable(Champ_Face_VDF,"Champ_Face|Champ_Face_VDF",Champ_Face_base);
34
35Sortie& Champ_Face_VDF::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
36
38{
39 lire_donnees (s) ;
40 return s ;
41}
42
44{
45 assert(nb_noeuds == domaine_vdf().nb_faces());
47 // Probleme: nb_comp vaut 2 mais on ne veut qu'une dimension !!!
48 // HACK :
49 int old_nb_compo = nb_compo_;
52 nb_compo_ = old_nb_compo;
53 return nb_noeuds;
54}
55
57{
58 tau_diag_.resize(domaine_vdf().nb_elem(), dimension);
59 tau_croises_.resize(domaine_vdf().nb_aretes(), 2);
60}
61
63{
64 DoubleTab& val = valeurs();
65 const Domaine_VDF& domaine_VDF = domaine_vdf();
66 const IntVect& orientation = domaine_VDF.orientation();
67 const int N = val.dimension(1), unif = sub_type(Champ_Uniforme, ch), D = dimension;
68
69 if ((sub_type(Champ_Uniforme_Morceaux, ch)) || (sub_type(Champ_Don_lu, ch)))
70 {
71 const DoubleTab& v = ch.valeurs();
72 int ndeb_int = domaine_VDF.premiere_face_int();
73 const IntTab& f_e = domaine_VDF.face_voisins();
74
75 for (int f = 0; f < ndeb_int; f++)
76 {
77 const int ori = orientation(f);
78 const int e = f_e(f, f_e(f, 0) == -1);
79 for (int n = 0; n < N; n++)
80 val(f, n) = v(e, N * ori + n);
81 }
82
83 for (int f = ndeb_int; f < domaine_VDF.nb_faces(); f++)
84 {
85 const int ori = orientation(f);
86 for (int n = 0; n < N; n++)
87 val(f, n) = 0.5 * (v(f_e(f, 0), N * ori + n) + v(f_e(f, 1), N * ori + n));
88 }
89 }
90 else
91 {
92
93 DoubleTab eval;
94 if (unif) eval = ch.valeurs();
95 else eval.resize(val.dimension(0), N * D), ch.valeur_aux(domaine_VDF.xv(), eval);
96
97 for (int f = 0; f < domaine_VDF.nb_faces(); f++)
98 for (int n = 0; n < N; n++)
99 val(f, n) = eval(unif ? 0 : f, N * orientation(f) + n);
100 }
102 return *this;
103}
104
105const Champ_Proto& Champ_Face_VDF::affecter(const double x1, const double x2)
106{
107 const IntVect& orientation = domaine_vdf().orientation();
108 DoubleTab& val = valeurs();
109 for (int num_face = 0; num_face < val.size(); num_face++)
110 {
111 int ori = orientation(num_face);
112 switch(ori)
113 {
114 case 0:
115 val(num_face) = x1;
116 break;
117 case 1:
118 val(num_face) = x2;
119 break;
120 }
121 }
122 return *this;
123}
124
125const Champ_Proto& Champ_Face_VDF::affecter(const double x1, const double x2, const double x3)
126{
127 const IntVect& orientation = domaine_vdf().orientation();
128 DoubleTab& val = valeurs();
129 for (int num_face = 0; num_face < val.size(); num_face++)
130 {
131 int ori = orientation(num_face);
132 switch(ori)
133 {
134 case 0:
135 val(num_face) = x1;
136 break;
137 case 1:
138 val(num_face) = x2;
139 break;
140 case 2:
141 val(num_face) = x3;
142 break;
143 }
144 }
145 return *this;
146}
147
148const Champ_Proto& Champ_Face_VDF::affecter(const DoubleTab& v)
149{
150 const IntVect& orientation = domaine_vdf().orientation();
151 DoubleTab& val = valeurs();
152
153 if (v.nb_dim() == 2)
154 {
155 if (v.dimension(1) == dimension)
156 {
157 if (v.dimension(0) == val.size())
158 for (int num_face = 0; num_face < val.size(); num_face++)
159 val(num_face) = v(num_face, orientation(num_face));
160 else
161 {
162 Cerr << "Erreur TRUST dans Champ_Face_VDF::affecter(const DoubleTab& )" << finl;
163 Cerr << "Les dimensions du DoubleTab passe en parametre sont incompatibles avec celles du Champ_Face_VDF " << finl;
165 }
166 }
167 else
168 {
169 Cerr << "Erreur TRUST dans Champ_Face_VDF::affecter(const DoubleTab& )" << finl;
170 Cerr << "Les dimensions du DoubleTab passe en parametre sont incompatibles avec celles du Champ_Face_VDF " << finl;
172 }
173 }
174 return *this;
175}
176
177// Cas CL periodique : assure que les valeurs sur des faces periodiques en vis a vis sont identiques. Pour cela on prend la demi somme des deux valeurs.
179{
180 const Domaine_Cl_dis_base& zcl = domaine_Cl_dis();
181 int nb_cl = zcl.nb_cond_lim();
182 DoubleTab& ch_tab = valeurs();
183 int ndeb, nfin, num_face;
184
185 for (int i = 0; i < nb_cl; i++)
186 {
187 const Cond_lim_base& la_cl = zcl.les_conditions_limites(i).valeur();
188 if (sub_type(Periodique, la_cl))
189 {
190 const Periodique& la_cl_perio = ref_cast(Periodique, la_cl);
191 const Front_VF& le_bord = ref_cast(Front_VF, la_cl.frontiere_dis());
192 ndeb = le_bord.num_premiere_face();
193 nfin = ndeb + le_bord.nb_faces();
194 int voisine;
195 double moy;
196
197 for (num_face = ndeb; num_face < nfin; num_face++)
198 {
199 voisine = la_cl_perio.face_associee(num_face - ndeb) + ndeb;
200 if (ch_tab[num_face] != ch_tab[voisine])
201 {
202 moy = 0.5 * (ch_tab[num_face] + ch_tab[voisine]);
203 ch_tab[num_face] = moy;
204 ch_tab[voisine] = moy;
205 }
206 }
207 }
208 }
209 ch_tab.echange_espace_virtuel();
210}
211
212/*! @brief Renvoie la valeur que devrait avoir le champ sur une face de bord, si on en croit les conditions aux limites.
213 *
214 * Le numero est compte
215 * dans la liste des faces de bord reelles. Le temps considere est le
216 * present du Champ_Face
217 * L'implementation a change : ces valeurs ne sont plus stockees dans le champ.
218 *
219 */
220double Champ_Face_VDF::val_imp_face_bord_private(int face, int comp) const
221{
222 const Domaine_Cl_VDF& zclo = ref_cast(Domaine_Cl_VDF, equation().domaine_Cl_dis());
223 return Champ_Face_get_val_imp_face_bord_sym(valeurs(), temps(), face, comp, zclo);
224}
225
226// WEC : jamais appele !!
227double Champ_Face_VDF::val_imp_face_bord_private(int face, int comp1, int comp2) const
228{
229 Cerr << "Champ_Face_VDF::val_imp_face_bord(,,) exit" << finl;
231 return 0; // For compilers
232}
233
234// Cette fonction retourne :
235// 1 si le fluide est sortant sur la face num_face
236// 0 si la face correspond a une reentree de fluide
238{
239 int signe = 1;
240 double vit_norm;
241 // signe vaut -1 si face_voisins(num_face,0) est a l'exterieur
242 // signe vaut 1 si face_voisins(num_face,1) est a l'exterieur
243 if (domaine_vdf().face_voisins(num_face, 0) == -1)
244 signe = -1;
245 vit_norm = valeurs()(num_face) * signe;
246 return (vit_norm > 0);
247}
248
249DoubleTab& Champ_Face_VDF::trace(const Frontiere_dis_base& fr, DoubleTab& x, double tps, int distant) const
250{
251 return Champ_Face_VDF_implementation::trace(fr, valeurs(tps), x, distant);
252}
253
254void Champ_Face_VDF::mettre_a_jour(double un_temps)
255{
257}
258
260{
261 const DoubleTab& val = valeurs();
262 const Domaine_VDF& domaine_VDF = domaine_vdf();
263 int nb_elem = domaine_VDF.nb_elem();
264 const IntTab& face_voisins = domaine_VDF.face_voisins();
265 const IntTab& elem_faces = domaine_VDF.elem_faces();
266
267 if (dimension == 2)
268 calrotord2centelemdim2(rot, val, domaine_VDF, nb_elem, face_voisins, elem_faces);
269 else if (dimension == 3)
270 calrotord2centelemdim3(rot, val, domaine_VDF, nb_elem, face_voisins, elem_faces);
271}
272
273int Champ_Face_VDF::imprime(Sortie& os, int ncomp) const
274{
275 imprime_Face(os, ncomp);
276 return 1;
277}
278
279void Champ_Face_VDF::calcul_critere_Q(DoubleTab& Q, const Domaine_Cl_VDF& domaine_Cl_VDF)
280{
281 // Q=0.5*(\Omega_{ij}*\Omega_{ij}-S_{ij}*S_{ij})=-0.25*du_i/dx_j*du_j/dx_i
282
283 const Domaine_VDF& domaine_VDF = domaine_vdf();
284 Champ_Face_VDF& vit = *this;
285 const DoubleTab& vitesse = valeurs();
286 const int nb_elem = domaine_VDF.nb_elem();
287 const int nb_elem_tot = domaine_VDF.nb_elem_tot();
288 int num_elem, i, j, N = vitesse.line_size();
289 double crit, deriv1, deriv2;
290
291 if (N!=1) Process::exit(que_suis_je() + "::calcul_critere_Q : the velocity field must be single phase !!");
292
293 DoubleTab gradient_elem(nb_elem_tot, dimension, dimension, N);
294 gradient_elem = 0.;
295
296 vit.calcul_duidxj(vitesse, gradient_elem, domaine_Cl_VDF);
297
298 for (num_elem = 0; num_elem < nb_elem; num_elem++)
299 {
300 crit = 0.;
301 for (i = 0; i < dimension; i++)
302 for (j = 0; j < dimension; j++)
303 {
304 deriv1 = gradient_elem(num_elem, i, j, 0);
305 deriv2 = gradient_elem(num_elem, j, i, 0);
306
307 crit += -0.25 * deriv1 * deriv2;
308 }
309 Q[num_elem] = crit;
310 }
311}
312
313void Champ_Face_VDF::calcul_y_plus(DoubleTab& y_plus, const Domaine_Cl_VDF& domaine_Cl_VDF)
314{
315 // On initialise le champ y_plus avec une valeur negative,
316 // comme ca lorsqu'on veut visualiser le champ pres de la paroi,
317 // on n'a qu'a supprimer les valeurs negatives et n'apparaissent
318 // que les valeurs aux parois.
319
320 int ndeb, nfin, elem, ori, l_unif;
321 double norm_tau, u_etoile, norm_v = 0, dist, val0, val1, val2, d_visco = 0, visco = 1.;
322 y_plus = -1.;
323
324 const Champ_Face_VDF& vit = *this;
325 const Domaine_VDF& domaine_VDF = domaine_vdf();
326 const IntTab& face_voisins = domaine_VDF.face_voisins();
327 const IntVect& orientation = domaine_VDF.orientation();
328 const Equation_base& eqn_hydr = equation();
329 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
330 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
331 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
332 //DoubleTab& tab_visco = ch_visco_cin.valeurs();
333
334 if (sub_type(Champ_Uniforme, ch_visco_cin))
335 {
336 visco = tab_visco(0, 0);
337 l_unif = 1;
338 }
339 else
340 l_unif = 0;
341
342 // Changer uniquement les valeurs < DMINFLOAT (l'ancien code n'est pas parallele)
343 /* GF on a pas a change tab_visco ici !
344 if (!l_unif)
345 {
346 const int n = tab_visco.size_array();
347 ArrOfDouble& v = tab_visco;
348 for (int i = 0; i < n; i++)
349 if (v[i] < DMINFLOAT)
350 v[i] = DMINFLOAT;
351 }
352 */
353
354 DoubleTab yplus_faces(1, 1); // will contain yplus values if available
355 int yplus_already_computed = 0; // flag
356
357 const RefObjU& modele_turbulence = eqn_hydr.get_modele(TURBULENCE);
358 if (modele_turbulence && sub_type(Modele_turbulence_hyd_base, modele_turbulence.valeur()))
359 {
360 const Modele_turbulence_hyd_base& mod_turb = ref_cast(Modele_turbulence_hyd_base, modele_turbulence.valeur());
361 const Turbulence_paroi_base& loipar = mod_turb.loi_paroi();
362 if (loipar.use_shear())
363 {
364 yplus_faces.resize(domaine_vdf().nb_faces_tot());
365 yplus_faces.ref(loipar.tab_d_plus());
366 yplus_already_computed = 1;
367 }
368 }
369
370 for (int n_bord = 0; n_bord < domaine_VDF.nb_front_Cl(); n_bord++)
371 {
372 const Cond_lim& la_cl = domaine_Cl_VDF.les_conditions_limites(n_bord);
373
374 if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur()))
375 {
376 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
377 ndeb = le_bord.num_premiere_face();
378 nfin = ndeb + le_bord.nb_faces();
379
380 for (int num_face = ndeb; num_face < nfin; num_face++)
381 {
382
383 if (face_voisins(num_face, 0) != -1)
384 elem = face_voisins(num_face, 0);
385 else
386 elem = face_voisins(num_face, 1);
387
388 if (yplus_already_computed)
389 {
390 // y+ is only defined on faces so we take the face value to put in the element
391 y_plus(elem) = yplus_faces(num_face);
392 }
393 else
394 {
395 if (dimension == 2)
396 {
397 ori = orientation(num_face);
398 norm_v = norm_2D_vit(vit.valeurs(), elem, ori, domaine_VDF, val0);
399 }
400 else if (dimension == 3)
401 {
402 ori = orientation(num_face);
403 norm_v = norm_3D_vit(vit.valeurs(), elem, ori, domaine_VDF, val1, val2);
404 } // dim 3
405
406 if (axi)
407 dist = domaine_VDF.dist_norm_bord_axi(num_face);
408 else
409 dist = domaine_VDF.dist_norm_bord(num_face);
410 if (l_unif)
411 d_visco = visco;
412 else
413 d_visco = tab_visco[elem];
414
415 // PQ : 01/10/03 : corrections par rapport a la version premiere
416 norm_tau = d_visco * norm_v / dist;
417
418 u_etoile = sqrt(norm_tau);
419 y_plus(elem) = dist * u_etoile / d_visco;
420
421 } // else yplus already computed
422 } // loop on faces
423 } // Fin paroi fixe
424 } // Fin boucle sur les bords
425}
426
427/*! @brief Methode qui renvoie gij aux elements a partir de la vitesse aux faces (gij represente la derivee partielle dui/dxj)
428 *
429 * A partir de gij, on peut calculer Sij = 0.5(gij(i,j)+gij(j,i))
430 *
431 */
432DoubleTab& Champ_Face_VDF::calcul_duidxj(const DoubleTab& vitesse, DoubleTab& gij, const Domaine_Cl_VDF& domaine_Cl_VDF) const
433{
434 const Champ_Face_VDF& vit = ref_cast(Champ_Face_VDF, mon_equation->inconnue());
435 const Domaine_Cl_VDF& dclvdf = ref_cast(Domaine_Cl_VDF, vit.domaine_Cl_dis());
436 const Domaine_VDF& domaine_VDF = domaine_vdf();
437 const int nb_elem = domaine_VDF.domaine().nb_elem_tot(), N = vitesse.line_size();
438 const IntTab& face_voisins = domaine_VDF.face_voisins(), &elem_faces = domaine_VDF.elem_faces(), &Qdm = domaine_VDF.Qdm();
439 const IntVect& orientation = domaine_VDF.orientation();
440
441 const int prem_am = domaine_VDF.premiere_arete_mixte(), dern_am = prem_am + domaine_VDF.nb_aretes_mixtes();
442 const int prem_ai = domaine_VDF.premiere_arete_interne(), dern_ai = prem_ai + domaine_VDF.nb_aretes_internes();
443 IntVect element(4);
444 gij = 0.;
445
446 // On parcourt toutes les aretes qui permettent de calculer les termes croises du_i/dx_j
447 // (les termes non-croises sont calcules en bouclant sur les elements)
448
449
450 // On commence par les bords
451 int ndeb = domaine_VDF.premiere_arete_bord(), nfin = ndeb + domaine_VDF.nb_aretes_bord();
452 for (int num_arete = ndeb; num_arete < nfin; num_arete++)
453 for (int n=0; n<N; n++)
454 {
455 const int n_type = domaine_Cl_VDF.type_arete_bord(num_arete - ndeb);
456
457 if (n_type == 4) // arete de type periodicite
458 {
459 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
460 const int i = orientation(num0), j = orientation(num2);
461
462 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
463 const double temp2 = (vitesse(num3, n) - vitesse(num2, n)) / domaine_VDF.dist_face_period(num2, num3, i); // du_j / dx_i
464
465 element(0) = face_voisins(num0, 0);
466 element(1) = face_voisins(num0, 1);
467 element(2) = face_voisins(num1, 0);
468 element(3) = face_voisins(num1, 1);
469
470 for (int k = 0; k < 4; k++)
471 {
472 // 1) 0.5 : pour la periodicite, car on distribuera deux fois sur les elements qui "touchent" cette arete puisqu'elle existe en double.
473 // 2) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
474 gij(element(k), i, j, n) += temp1 * 0.5 * 0.25;
475 gij(element(k), j, i, n) += temp2 * 0.5 * 0.25;
476 }
477 }
478 else if (n_type == 3 && Option_VDF::traitement_gradients) /* NAVIER - NAVIER */
479 {
480 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
481 const int i = orientation(num0), j = orientation(num2);
482
483 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
484 const double coeff_frot = (Champ_Face_coeff_frottement_grad_face_bord(num0, n, dclvdf)+Champ_Face_coeff_frottement_grad_face_bord(num1, n, dclvdf))/2.;
485 const double temp2 = -signe * coeff_frot * vitesse(num2, n);
486
487 element(0) = face_voisins(num2, 0);
488 element(1) = face_voisins(num2, 1);
489
490 for (int k = 0; k < 2; k++)
491 {
492 // 1) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
493 gij(element(k), i, j, n) += temp1 * 0.25;
494 gij(element(k), j, i, n) += temp2 * 0.25;
495 }
496 }
497 else if (Option_VDF::traitement_gradients && (n_type == 5 || n_type == 6))
498 Process::exit("Issue in Champ_Face_VDF::calcul_duidxj ... This case is not yet considered. Contact the TRUST team.");
499 else /* les autres aretes bords ... */
500 {
501 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
502 const int i = orientation(num0), j = orientation(num2);
503
504 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
505 const double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, N*j+n) + vit.val_imp_face_bord_private(num1, N*j+n)); // vitesse tangentielle
506
507 //Dans cette partie, on conserve le codage de Hyd_SGE_Wale_VDF (num1 et non num2) pour calculer la distance entre le centre de la maille et le bord.
508 const double temp2 = -signe * (vitesse(num2, n) - vit_imp) / domaine_VDF.dist_norm_bord(num1);
509
510 element(0) = face_voisins(num2, 0);
511 element(1) = face_voisins(num2, 1);
512
513 for (int k = 0; k < 2; k++)
514 {
515 // 1) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
516 gij(element(k), i, j, n) += temp1 * 0.25;
517 gij(element(k), j, i, n) += temp2 * 0.25;
518 }
519 }
520 }
521
522 // On continue avec les coins
523 ndeb = domaine_VDF.premiere_arete_coin(), nfin = ndeb + domaine_VDF.nb_aretes_coin();
524
525 for (int num_arete = ndeb; num_arete < nfin; num_arete++)
526 for (int n=0; n<N; n++)
527 {
528 const int n_type = domaine_Cl_VDF.type_arete_coin(num_arete - ndeb);
529
530 if (n_type == 0) // arete de type perio-perio
531 {
532 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
533 const int i = orientation(num0), j = orientation(num2);
534
535 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
536 const double temp2 = (vitesse(num3, n) - vitesse(num2, n)) / domaine_VDF.dist_face_period(num2, num3, i); // du_j / dx_i
537
538 element(0) = face_voisins(num0, 0);
539 element(1) = face_voisins(num0, 1);
540 element(2) = face_voisins(num1, 0);
541 element(3) = face_voisins(num1, 1);
542
543 for (int k = 0; k < 4; k++)
544 {
545 // 1) 0.5 : pour la periodicite, car on distribuera deux fois sur les elements qui "touchent" cette arete puisqu'elle existe en double.
546 // 2) 0.5 : idem ci-dessus, car cette fois-ci on a un coin perio-perio.
547 // 3) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
548 gij(element(k), i, j, n) += temp1 * 0.5 * 0.5 * 0.25;
549 gij(element(k), j, i, n) += temp2 * 0.5 * 0.5 * 0.25;
550 }
551 }
552
553 if (n_type == 1) // arete de type perio-paroi
554 {
555 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
556 const int i = orientation(num1), j = orientation(num2);
557
558 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
559 const double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, N*j+n) + vit.val_imp_face_bord_private(num1, N*j+n)); // vitesse tangentielle
560
561 const double temp2 = -signe * (vitesse(num2, n) - vit_imp) / domaine_VDF.dist_norm_bord(num1);
562
563 element(0) = face_voisins(num2, 0);
564 element(1) = face_voisins(num2, 1);
565
566 for (int k = 0; k < 2; k++)
567 {
568 // 1) 0.5 : pour la periodicite, car on distribuera deux fois sur les elements qui "touchent" cette arete puisqu'elle existe en double.
569 // 2) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
570 gij(element(k), i, j, n) += temp1 * 0.5 * 0.25;
571 gij(element(k), j, i, n) += temp2 * 0.5 * 0.25;
572 }
573 }
574
575 // XXX : Elie Saikali : j'ajoute ca pour les coins juste si option_vdf active pour le moment ...
576
578 {
579 if (n_type == 14 || n_type == 15) // arete de type fluide-paroi ou paroi-fluide
580 {
581 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
582 const int i = orientation(num1), j = orientation(num2);
583
584 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
585 const double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, N*j+n) + vit.val_imp_face_bord_private(num1, N*j+n)); // vitesse tangentielle
586
587 const double temp2 = -signe * (vitesse(num2, n) - vit_imp) / domaine_VDF.dist_norm_bord(num1);
588
589 element(0) = face_voisins(num2, 0);
590 element(1) = face_voisins(num2, 1);
591
592 for (int k = 0; k < 2; k++)
593 if (element(k) != -1)
594 {
595 gij(element(k), i, j, n) += temp1 * 0.25;
596 gij(element(k), j, i, n) += temp2 * 0.25;
597 }
598 }
599 else if (n_type == 3 || n_type == 4 || n_type == 8) // arete de type fluide-navier
600 {
601 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
602 const int f1 = num0 > -1 ? num0 : num1, f2 = num2 > -1 ? num2 : num3;
603 const int i = orientation(f1), j = orientation(f2);
604
605 const double coeff_frot1 = Champ_Face_coeff_frottement_grad_face_bord(f1, n, dclvdf), coeff_frot2 = Champ_Face_coeff_frottement_grad_face_bord(f2, n, dclvdf);
606
607// int signe = f2 == num3 ? -1 : 1;
608// const double temp1 = coeff_frot2 * signe * vitesse(f1, n);
609// const double temp2 = coeff_frot1 * signe * vitesse(f2, n);
610 const double temp1 = coeff_frot2 * (face_voisins(f2, 0)==-1 ? 1:-1)* vitesse(f1, n);
611 const double temp2 = coeff_frot1 * (face_voisins(f1, 0)==-1 ? 1:-1)* vitesse(f2, n);
612
613
614 element(0) = face_voisins(f1, 0);
615 element(1) = face_voisins(f1, 1);
616
617 for (int k = 0; k < 2; k++)
618 if (element(k) != -1)
619 {
620 gij(element(k), i, j, n) += temp1 * 0.25;
621 gij(element(k), j, i, n) += temp2 * 0.25;
622 }
623 }
624 }
625 }
626
627 // On continue avec les aretes mixtes
628
629 for (int num_arete = prem_am; num_arete < dern_am; num_arete++)
630 for (int n=0; n<N; n++)
631 {
632 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
633 const int i = orientation(num0), j = orientation(num2);
634
635 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
636 const double temp2 = (vitesse(num3, n) - vitesse(num2, n)) / domaine_VDF.dist_face_period(num2, num3, i); // du_j / dx_i
637
638 element(0) = face_voisins(num0, 0);
639 element(1) = face_voisins(num0, 1);
640 element(2) = face_voisins(num1, 0);
641 element(3) = face_voisins(num1, 1);
642
643 for (int k = 0; k < 4; k++)
644 if (element(k) != -1)
645 {
646 // 1) 0.25 : on distribue le gradient de vitesse sur les 3 elements qui l'entourent.
647 // C'est pour cela que l'on regarde si element(k)!=-1, car dans ce cas la, c'est qu'il s'agit de "la case qui manque" !
648 gij(element(k), i, j, n) += temp1 * 0.25;
649 gij(element(k), j, i, n) += temp2 * 0.25;
650 }
651 }
652
653 // On continue avec les aretes internes
654
655 for (int num_arete = prem_ai; num_arete < dern_ai; num_arete++)
656 for (int n=0; n<N; n++)
657 {
658 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
659 const int i = orientation(num0), j = orientation(num2);
660
661 const double temp1 = (vitesse(num1, n) - vitesse(num0, n)) / domaine_VDF.dist_face_period(num0, num1, j); // du_i / dx_j
662 assert(est_egal(domaine_VDF.dist_face_period(num0, num1, j), domaine_VDF.dist_face(num0, num1, j)));
663
664 const double temp2 = (vitesse(num3, n) - vitesse(num2, n)) / domaine_VDF.dist_face_period(num2, num3, i); // du_j / dx_i
665 assert(est_egal(domaine_VDF.dist_face_period(num2, num3, j), domaine_VDF.dist_face(num2, num3, j)));
666
667 element(0) = face_voisins(num0, 0);
668 element(1) = face_voisins(num0, 1);
669 element(2) = face_voisins(num1, 0);
670 element(3) = face_voisins(num1, 1);
671
672 for (int k = 0; k < 4; k++)
673 {
674 // 1) 0.25 : on distribue le gradient de vitesse sur les 4 elements qui l'entourent.
675 gij(element(k), i, j, n) += temp1 * 0.25;
676 gij(element(k), j, i, n) += temp2 * 0.25;
677 }
678 }
679
680
681 // XXX : Elie Saikali : HACK pour coins fluides-fluides
682 // pour ce cas (j'avoue cas rare), attention soucis avec les valeurs de la vitesse sur les coins ... par exemple un champ_fonc_xyz x+y+z donne pas le bon truc sur les coins
683
684 // On continue avec les coins
685
686 ndeb = domaine_VDF.premiere_arete_coin(), nfin = ndeb + domaine_VDF.nb_aretes_coin();
687
688 for (int num_arete = ndeb; num_arete < nfin; num_arete++)
689 for (int n=0; n<N; n++)
690 {
691 const int n_type = domaine_Cl_VDF.type_arete_coin(num_arete - ndeb);
692
694 if (n_type == 16 ) // arete de type fluide-fluide
695 {
696 const int num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2);
697 const int i = orientation(num1), j = orientation(num2);
698
699 element(0) = face_voisins(num2, 0);
700 element(1) = face_voisins(num2, 1);
701
702 for (int k = 0; k < 2; k++)
703 if (element(k) != -1)
704 {
705 // XXX : 1/3 car on veut un truc comme ca : (a+b+c+d)/4 = (a+b+c)/3 => d = (a+b+c)/3
706 gij(element(k), i, j, n) += gij(element(k), i, j, n) / 3.;
707 gij(element(k), j, i, n) += gij(element(k), j, i, n) / 3.;
708 }
709 }
710 }
711
712 // 2eme partie : boucle sur les elements et remplissage de Sij pour les derivees non croisees (du_i / dx_i).
713 // En fait dans ces cas la, on calcul directement le gradient dans l'element et on ne redistribue pas.
714
715 for (int elem = 0; elem < nb_elem; elem++)
716 for (int n=0; n<N; n++)
717 for (int i = 0; i < dimension; i++)
718 {
719 double temp1 = (vitesse(elem_faces(elem, i), n) - vitesse(elem_faces(elem, i + dimension), n)) / domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, i)));
720 gij(elem, i, i, n) = -temp1;
721 }
722
723 return gij;
724}
725
726/*! @brief Methode qui renvoie gij aux elements a partir de la vitesse aux elements (gij represente la derivee partielle dui/dxj)
727 *
728 * A partir de gij, on peut calculer Sij = 0.5(gij(i,j)+gij(j,i))
729 *
730 */
731DoubleTab& Champ_Face_VDF::calcul_duidxj(const DoubleTab& in_vel, DoubleTab& gij) const
732{
733
734 const Domaine_VDF& domaine_VDF = domaine_vdf();
735 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot(), N = in_vel.line_size()/dimension;
736 const IntTab& face_voisins = domaine_VDF.face_voisins();
737 const IntTab& elem_faces = domaine_VDF.elem_faces();
738
739 int num0, num1, num2, num3, num4, num5;
740 int f0, f1, f2, f3, f4, f5;
741
742 //
743 // Calculate the Sij tensor
744 //
745 if (dimension == 2)
746 {
747 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
748 for (int n=0; n<N; n++)
749 {
750 f0 = elem_faces(element_number, 0);
751 num0 = face_voisins(f0, 0);
752 if (num0 == -1)
753 num0 = element_number;
754 f1 = elem_faces(element_number, 1);
755 num1 = face_voisins(f1, 0);
756 if (num1 == -1)
757 num1 = element_number;
758 f2 = elem_faces(element_number, 2);
759 num2 = face_voisins(f2, 1);
760 if (num2 == -1)
761 num2 = element_number;
762 f3 = elem_faces(element_number, 3);
763 num3 = face_voisins(f3, 1);
764 if (num3 == -1)
765 num3 = element_number;
766
767 gij(element_number, 0, 0, n) = 0.5 * ((in_vel(num2, N*0+n) - in_vel(num0, N*0+n)) / domaine_VDF.dim_elem(element_number, 0));
768 gij(element_number, 0, 1, n) = 0.5 * ((in_vel(num3, N*0+n) - in_vel(num1, N*0+n)) / domaine_VDF.dim_elem(element_number, 1));
769 gij(element_number, 1, 0, n) = 0.5 * ((in_vel(num2, N*1+n) - in_vel(num0, N*1+n)) / domaine_VDF.dim_elem(element_number, 0));
770 gij(element_number, 1, 1, n) = 0.5 * ((in_vel(num3, N*1+n) - in_vel(num1, N*1+n)) / domaine_VDF.dim_elem(element_number, 1));
771 }
772 }
773 else
774 {
775 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
776 for (int n=0; n<N; n++)
777 {
778 f0 = elem_faces(element_number, 0);
779 num0 = face_voisins(f0, 0);
780 if (num0 == -1)
781 num0 = element_number;
782 f1 = elem_faces(element_number, 1);
783 num1 = face_voisins(f1, 0);
784 if (num1 == -1)
785 num1 = element_number;
786 f2 = elem_faces(element_number, 2);
787 num2 = face_voisins(f2, 0);
788 if (num2 == -1)
789 num2 = element_number;
790 f3 = elem_faces(element_number, 3);
791 num3 = face_voisins(f3, 1);
792 if (num3 == -1)
793 num3 = element_number;
794 f4 = elem_faces(element_number, 4);
795 num4 = face_voisins(f4, 1);
796 if (num4 == -1)
797 num4 = element_number;
798 f5 = elem_faces(element_number, 5);
799 num5 = face_voisins(f5, 1);
800 if (num5 == -1)
801 num5 = element_number;
802
803 gij(element_number, 0, 0, n) = 0.5 * ((in_vel(num3, N*0+n) - in_vel(num0, N*0+n)) / domaine_VDF.dim_elem(element_number, 0));
804
805 gij(element_number, 0, 1, n) = 0.5 * ((in_vel(num4, N*0+n) - in_vel(num1, N*0+n)) / domaine_VDF.dim_elem(element_number, 1));
806 gij(element_number, 1, 0, n) = 0.5 * ((in_vel(num3, N*1+n) - in_vel(num0, N*1+n)) / domaine_VDF.dim_elem(element_number, 0));
807
808 gij(element_number, 0, 2, n) = 0.5 * ((in_vel(num5, N*0+n) - in_vel(num2, N*0+n)) / domaine_VDF.dim_elem(element_number, 2));
809
810 gij(element_number, 2, 0, n) = 0.5 * ((in_vel(num3, N*2+n) - in_vel(num0, N*2+n)) / domaine_VDF.dim_elem(element_number, 0));
811
812 gij(element_number, 1, 1, n) = 0.5 * ((in_vel(num4, N*1+n) - in_vel(num1, N*1+n)) / domaine_VDF.dim_elem(element_number, 1));
813
814 gij(element_number, 1, 2, n) = 0.5 * ((in_vel(num5, N*1+n) - in_vel(num2, N*1+n)) / domaine_VDF.dim_elem(element_number, 2));
815 gij(element_number, 2, 1, n) = 0.5 * ((in_vel(num4, N*2+n) - in_vel(num1, N*2+n)) / domaine_VDF.dim_elem(element_number, 1));
816
817 gij(element_number, 2, 2, n) = 0.5 * ((in_vel(num5, N*2+n) - in_vel(num2, N*2+n)) / domaine_VDF.dim_elem(element_number, 2));
818
819 }
820 }
821
822 return gij;
823
824}
825
826/*! @brief Methode qui renvoie SMA_barre aux elements a partir de la vitesse aux faces
827 *
828 * SMA_barre = Sij*Sij (sommation sur les indices i et j)
829 *
830 * On calcule directement S_barre(num_elem)!!!!!!!!!!
831 * Le parametre contribution_paroi (ici fixe a 0) permet de ne pas prendre en compte la contribution de la paroi au produit SMA_barre = Sij*Sij
832 *
833 */
834DoubleVect& Champ_Face_VDF::calcul_S_barre_sans_contrib_paroi(const DoubleTab& vitesse, DoubleVect& SMA_barre, const Domaine_Cl_VDF& domaine_Cl_VDF) const
835{
836 const int contribution_paroi = 0;
837
838 const Champ_Face_VDF& vit = ref_cast(Champ_Face_VDF, mon_equation->inconnue());
839 const Domaine_VDF& domaine_VDF = domaine_vdf();
840 const IntTab& face_voisins = domaine_VDF.face_voisins(), &elem_faces = domaine_VDF.elem_faces(), &Qdm = domaine_VDF.Qdm();
841 const IntVect& orientation = domaine_VDF.orientation();
842
843 const int nb_elem = domaine_VDF.domaine().nb_elem();
844 const int prem_am = domaine_VDF.premiere_arete_mixte(), dern_am = prem_am + domaine_VDF.nb_aretes_mixtes();
845 const int prem_ai = domaine_VDF.premiere_arete_interne(), dern_ai = prem_ai + domaine_VDF.nb_aretes_internes();
846
847 ArrOfInt element(4);
848
849 int ndeb = domaine_VDF.premiere_arete_bord(), nfin = ndeb + domaine_VDF.nb_aretes_bord();
850
851 for (int num_arete = ndeb; num_arete < nfin; num_arete++)
852 {
853 int n_type = domaine_Cl_VDF.type_arete_bord(num_arete - ndeb);
854
855 if (n_type == 4) // arete de type periodicite
856 {
857 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
858 const int i = orientation(num0), j = orientation(num2);
859
860 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
861 const double temp2 = (vitesse[num3] - vitesse[num2]) / domaine_VDF.dist_face_period(num2, num3, i); // du/dy
862
863 element[0] = face_voisins(num0, 0);
864 element[1] = face_voisins(num0, 1);
865 element[2] = face_voisins(num1, 0);
866 element[3] = face_voisins(num1, 1);
867
868 // on calcule la somme des termes croises : 2*( (0.5*Sij)^2+(0.5*Sji)^2)
869 // Comme on est sur les aretes et qu on distribue sur l'element il faut multiplier par 0.25, d ou : 0.25*(2*(2*0.5^2))=0.25*4*0.25=0.25!!!!!!
870 // le 0.5 devant vient du fait que nous parcourons les faces de periodicite comme les aretes periodiques sont les "memes", on ajoute deux fois ce qu il faut aux elements -> 0.5!!!
871 for (int k = 0; k < 4; k++)
872 SMA_barre[element[k]] += 0.5 * (temp1 + temp2) * (temp1 + temp2) * 0.25;
873 }
874 else
875 {
876 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
877 const int j = orientation(num2);
878
879 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
880 double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, j) + vit.val_imp_face_bord_private(num1, j)); // vitesse tangentielle
881
882 double temp2;
883
884 if (n_type == 0 && contribution_paroi == 0)
885 temp2 = 0;
886 else
887 temp2 = -signe * (vitesse[num2] - vit_imp) / domaine_VDF.dist_norm_bord(num1);
888
889 element[0] = face_voisins(num2, 0);
890 element[1] = face_voisins(num2, 1);
891
892 // on calcule la somme des termes croises : 2*( (0.5*Sij)^2+(0.5*Sji)^2)
893 // Comme on est sur les aretes et qu on distribue sur l'element il faut multiplier par 0.25 d ou : 0.25*(2*(2*0.5^2))=0.25*4*0.25=0.25!!!!!!
894 // Prise en compte des 2 termes symetriques : SijSij+SjiSji
895 for (int k = 0; k < 2; k++)
896 SMA_barre[element[k]] += (temp1 + temp2) * (temp1 + temp2) * 0.25;
897 }
898 }
899
900 ndeb = domaine_VDF.premiere_arete_coin(), nfin = ndeb + domaine_VDF.nb_aretes_coin();
901
902 for (int num_arete = ndeb; num_arete < nfin; num_arete++)
903 {
904 int n_type = domaine_Cl_VDF.type_arete_coin(num_arete - ndeb);
905
906 if (n_type == 0) // arete de type perio-perio
907 {
908 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
909 const int i = orientation(num0), j = orientation(num2);
910
911 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
912 const double temp2 = (vitesse[num3] - vitesse[num2]) / domaine_VDF.dist_face_period(num2, num3, i); // du/dy
913
914 element[0] = face_voisins(num0, 0);
915 element[1] = face_voisins(num0, 1);
916 element[2] = face_voisins(num1, 0);
917 element[3] = face_voisins(num1, 1);
918
919 // on calcule la somme des termes croises : 2*( (0.5*Sij)^2+(0.5*Sji)^2)
920 // Comme on est sur les aretes et qu on distribue sur l'element il faut multiplier par 0.25 d ou : 0.25*(2*(2*0.5^2))=0.25*4*0.25=0.25!!!!!!
921 // le 0.5 devant vient du fait que nous parcourons les faces de periodicite comme les aretes periodiques sont les "memes", on ajoute deux fois ce qu il faut aux elements -> 0.5!!!
922 // encore un *0.5 car ce sont des aretes perio perio donc que l on parcourt 4 fois!!!!
923 for (int k = 0; k < 4; k++)
924 SMA_barre[element[k]] += 0.5 * 0.5 * (temp1 + temp2) * (temp1 + temp2) * 0.25;
925 }
926
927 if (n_type == 1) // arete de type perio-paroi
928 {
929 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
930 const int j = orientation(num2);
931
932 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
933 const double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, j) + vit.val_imp_face_bord_private(num1, j)); // vitesse tangentielle
934
935 double temp2;
936
937 if (contribution_paroi == 0)
938 temp2 = 0;
939 else
940 temp2 = -signe * (vitesse[num2] - vit_imp) / domaine_VDF.dist_norm_bord(num1);
941
942 element[0] = face_voisins(num2, 0);
943 element[1] = face_voisins(num2, 1);
944
945 for (int k = 0; k < 2; k++)
946 SMA_barre[element[k]] += 0.5 * (temp1 + temp2) * (temp1 + temp2) * 0.25;
947 }
948
950 if (n_type == 14 || n_type == 15 || n_type == 16) // arete de type fluide-paroi ou paroi-fluide ou fluide-fluide
951 {
952 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), signe = Qdm(num_arete, 3);
953 const int j = orientation(num2);
954
955 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
956 const double vit_imp = 0.5 * (vit.val_imp_face_bord_private(num0, j) + vit.val_imp_face_bord_private(num1, j)); // vitesse tangentielle
957
958 double temp2;
959
960 if (n_type == 0 && contribution_paroi == 0)
961 temp2 = 0;
962 else
963 temp2 = -signe * (vitesse[num2] - vit_imp) / domaine_VDF.dist_norm_bord(num1);
964
965 element[0] = face_voisins(num2, 0);
966 element[1] = face_voisins(num2, 1);
967
968 for (int k = 0; k < 2; k++)
969 if (element[k] != -1)
970 SMA_barre[element[k]] += (temp1 + temp2) * (temp1 + temp2) * 0.25;
971 }
972 }
973
974 for (int num_arete = prem_am; num_arete < dern_am; num_arete++)
975 {
976 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
977 const int i = orientation(num0), j = orientation(num2);
978
979 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
980 const double temp2 = (vitesse[num3] - vitesse[num2]) / domaine_VDF.dist_face_period(num2, num3, i); // du/dy
981
982 element[0] = face_voisins(num0, 0);
983 element[1] = face_voisins(num0, 1);
984 element[2] = face_voisins(num1, 0);
985 element[3] = face_voisins(num1, 1);
986
987 for (int k = 0; k < 4; k++)
988 if (element[k] != -1)
989 SMA_barre[element[k]] += (temp1 + temp2) * (temp1 + temp2) * 0.25;
990 }
991
992 for (int num_arete = prem_ai; num_arete < dern_ai; num_arete++)
993 {
994 const int num0 = Qdm(num_arete, 0), num1 = Qdm(num_arete, 1), num2 = Qdm(num_arete, 2), num3 = Qdm(num_arete, 3);
995 const int i = orientation(num0), j = orientation(num2);
996
997 const double temp1 = (vitesse[num1] - vitesse[num0]) / domaine_VDF.dist_face_period(num0, num1, j); // dv/dx
998 const double temp2 = (vitesse[num3] - vitesse[num2]) / domaine_VDF.dist_face_period(num2, num3, i); // du/dy
999
1000 element[0] = face_voisins(num0, 0);
1001 element[1] = face_voisins(num0, 1);
1002 element[2] = face_voisins(num1, 0);
1003 element[3] = face_voisins(num1, 1);
1004
1005 for (int k = 0; k < 4; k++)
1006 SMA_barre[element[k]] += (temp1 + temp2) * (temp1 + temp2) * 0.25;
1007 }
1008
1009 // 2eme partie: boucle sur les elements et remplissage de Sij pour les derivees non croisees (du/dx et dv/dy)
1010
1011 for (int elem = 0; elem < nb_elem; elem++)
1012 {
1013 for (int i = 0; i < dimension; i++)
1014 {
1015 double temp1 = (vitesse[elem_faces(elem, i)] - vitesse[elem_faces(elem, i + dimension)]) / domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, i)));
1016 SMA_barre(elem) += 2.0 * temp1 * temp1;
1017 }
1018 }
1019
1020 // On prend la racine carre!!!!! ATTENTION SMA_barre=invariant au carre!!!
1021 // racine_carree(SMA_barre)
1022 return SMA_barre;
1023}
1024
1025DoubleVect& Champ_Face_VDF::calcul_S_barre(const DoubleTab& vitesse, DoubleVect& SMA_barre, const Domaine_Cl_VDF& domaine_Cl_VDF) const
1026{
1027 const Domaine_VDF& domaine_VDF = domaine_vdf();
1028 const int nb_elem_tot = domaine_VDF.nb_elem_tot();
1029 const int nb_elem = domaine_VDF.nb_elem(), N = vitesse.line_size();
1030
1031 int i, j;
1032 int elem;
1033 double Sij, temp;
1034
1035 DoubleTab duidxj(nb_elem_tot, dimension, dimension, N);
1036
1037 calcul_duidxj(vitesse, duidxj, domaine_Cl_VDF);
1038
1039 for (elem = 0; elem < nb_elem; elem++)
1040 for (int n=0; n<N; n++)
1041 {
1042 temp = 0.;
1043 for (i = 0; i < dimension; i++)
1044 for (j = 0; j < dimension; j++)
1045 {
1046 Sij = 0.5 * (duidxj(elem, i, j, n) + duidxj(elem, j, i, n));
1047 temp += Sij * Sij;
1048 }
1049 SMA_barre(elem) = 2. * temp;
1050 }
1051
1052 return SMA_barre;
1053
1054}
1055
1056DoubleTab& Champ_Face_VDF::calcul_S_barre_Multiphase(const DoubleTab& vitesse, DoubleTab& SMA_barre, const Domaine_Cl_VDF& domaine_Cl_VDF) const
1057{
1058 const Domaine_VDF& domaine_VDF = domaine_vdf();
1059 const int nb_elem_tot = domaine_VDF.nb_elem_tot();
1060 const int nb_elem = domaine_VDF.nb_elem();
1061 const int N = vitesse.line_size();
1062
1063 int i, j;
1064 int elem;
1065 double Sij, temp;
1066
1067 DoubleTab duidxj(nb_elem_tot, dimension, dimension, N);
1068
1069 calcul_duidxj(vitesse, duidxj, domaine_Cl_VDF);
1070
1071 for (elem = 0; elem < nb_elem; elem++)
1072 for (int n=0; n<N; n++)
1073 {
1074 temp = 0.;
1075 for (i = 0; i < dimension; i++)
1076 for (j = 0; j < dimension; j++)
1077 {
1078 Sij = 0.5 * (duidxj(elem, i, j, n) + duidxj(elem, j, i, n));
1079 temp += Sij * Sij;
1080 }
1081 SMA_barre(elem,n) = 2. * temp;
1082 }
1083
1084 return SMA_barre;
1085
1086}
1087
1088void Champ_Face_VDF::calcul_grad_u(const DoubleTab& vitesse, DoubleTab& grad_u, const Domaine_Cl_VDF& domaine_Cl_VDF)
1089{
1090 const Domaine_VDF& domaine_VDF = domaine_vdf();
1091 const int nb_elem = domaine_VDF.nb_elem();
1092 const int nb_elem_tot = domaine_VDF.nb_elem_tot(), N = vitesse.line_size();
1093
1094 DoubleTab gradient_elem(nb_elem_tot, dimension, dimension, N);
1095 gradient_elem = 0.;
1096
1097 calcul_duidxj(vitesse, gradient_elem, domaine_Cl_VDF);
1098
1099 for (int elem = 0; elem < nb_elem; elem++)
1100 for (int n=0; n<N; n++)
1101 for (int i = 0; i < dimension; i++)
1102 for (int j = 0; j < dimension; j++)
1103 grad_u(elem, N * ( dimension*i+j ) + n) = gradient_elem(elem, i, j, n);
1104}
1105
1107{
1108 const DoubleTab& val = valeurs();
1109 const Domaine_VDF& domaine_VDF = domaine_vdf();
1110 int nb_elem = domaine_VDF.nb_elem();
1111 const IntTab& face_voisins = domaine_VDF.face_voisins();
1112 const IntTab& elem_faces = domaine_VDF.elem_faces();
1113
1114 if (dimension == 2)
1115 caldscaldcentelemdim2(dscald, val, domaine_VDF, nb_elem, face_voisins, elem_faces);
1116 else if (dimension == 3)
1117 caldscaldcentelemdim3(dscald, val, domaine_VDF, nb_elem, face_voisins, elem_faces);
1118}
1119
1120// Fonctions de calcul des composantes du tenseur GradU (derivees covariantes de la vitesse)
1121// dans le repere des coordonnees cylindriques
1123{
1124 const Domaine_VDF& domaine_VDF = domaine_vdf();
1125 const DoubleTab& inco = valeurs();
1126 const IntVect& orientation = domaine_VDF.orientation();
1127 const IntTab& elem_faces = domaine_VDF.elem_faces();
1128 const IntTab& Qdm = domaine_VDF.Qdm();
1129 const DoubleTab& xv = domaine_VDF.xv();
1130 const DoubleTab& xp = domaine_VDF.xp();
1131 const IntVect& type_arete_bord = domaine_Cl_VDF.type_arete_bord();
1132
1133 double d_teta, R;
1134 double deux_pi = M_PI * 2.0;
1135
1136 // Remplissage de tau_diag_ : termes diagonaux du tenseur GradU
1137
1138 int fx0, fx1, fy0, fy1;
1139 int num_elem;
1140 for (num_elem = 0; num_elem < domaine_VDF.nb_elem(); num_elem++)
1141 {
1142 fx0 = elem_faces(num_elem, 0);
1143 fx1 = elem_faces(num_elem, dimension);
1144 fy0 = elem_faces(num_elem, 1);
1145 fy1 = elem_faces(num_elem, 1 + dimension);
1146
1147 // Calcul de tau11
1148 tau_diag_(num_elem, 0) = (inco[fx1] - inco[fx0]) / (xv(fx1, 0) - xv(fx0, 0));
1149
1150 // Calcul de tau22
1151 R = xp(num_elem, 0);
1152 d_teta = xv(fy1, 1) - xv(fy0, 1);
1153 if (d_teta < 0)
1154 d_teta += deux_pi;
1155 tau_diag_(num_elem, 1) = (inco[fy1] - inco[fy0]) / (R * d_teta) + 0.5 * (inco[fx0] + inco[fx1]) / R;
1156 }
1157
1158 if (dimension == 3)
1159 {
1160 int fz0, fz1;
1161 for (num_elem = 0; num_elem < domaine_VDF.nb_elem(); num_elem++)
1162 {
1163 fz0 = elem_faces(num_elem, 2);
1164 fz1 = elem_faces(num_elem, 2 + dimension);
1165
1166 // Calcul de tau33
1167 tau_diag_(num_elem, 2) = (inco[fz1] - inco[fz0]) / (xv(fz1, 2) - xv(fz0, 2));
1168
1169 }
1170 }
1171
1172 // Remplissage de tau_croises_ : termes extradiagonaux du tenseur GradU
1173 // Les derivees croisees de la vitesse (termes extradiagonaux du tenseur
1174 // GradU) sont calculees sur les aretes.
1175 // Il y a deux derivees par arete:
1176 // Pour une arete XY : tau12 et tau21
1177 // Pour une arete YZ : tau23 et tau32
1178 // Pour une arete XZ : tau13 et tau31
1179
1180 // Boucle sur les aretes bord
1181
1182 int n_arete;
1183 int ndeb = domaine_VDF.premiere_arete_bord();
1184 int nfin = ndeb + domaine_VDF.nb_aretes_bord();
1185 int ori1, ori3;
1186 int fac1, fac2, fac3, fac4, signe;
1187 double dist3;
1188
1189 int n_type;
1190
1191 for (n_arete = ndeb; n_arete < nfin; n_arete++)
1192 {
1193 n_type = type_arete_bord(n_arete - ndeb);
1194
1195 switch(n_type)
1196 {
1198 // paroi-paroi
1200 // fluide-fluide
1202 // paroi-fluide
1203 {
1204 fac1 = Qdm(n_arete, 0);
1205 fac2 = Qdm(n_arete, 1);
1206 fac3 = Qdm(n_arete, 2);
1207 signe = Qdm(n_arete, 3);
1208 ori1 = orientation(fac1);
1209 ori3 = orientation(fac3);
1210 int rang1 = fac1 - domaine_VDF.premiere_face_bord();
1211 int rang2 = fac2 - domaine_VDF.premiere_face_bord();
1212 double vit_imp;
1213
1214 if (n_type == TypeAreteBordVDF::PAROI_FLUIDE)
1215 // arete paroi_fluide :il faut determiner qui est la face fluide
1216 {
1217 if (est_egal(inco[fac1], 0))
1218 vit_imp = val_imp_face_bord_private(rang2, ori3);
1219 else
1220 vit_imp = val_imp_face_bord_private(rang1, ori3);
1221 }
1222 else
1223 vit_imp = 0.5 * (val_imp_face_bord_private(rang1, ori3) + val_imp_face_bord_private(rang2, ori3));
1224
1225 if (ori1 == 0) // bord d'equation R = cte
1226 {
1227 dist3 = xv(fac3, 0) - xv(fac1, 0);
1228 if (n_type != TypeAreteBordVDF::PAROI_PAROI)
1229 dist3 *= 2;
1230
1231 if (ori3 == 1)
1232 {
1233 // calcul de tau12
1234 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3;
1235
1236 // calcul de tau21
1237 R = xv(fac1, 0);
1238 d_teta = xv(fac2, 1) - xv(fac1, 1);
1239 if (d_teta < 0)
1240 d_teta += deux_pi;
1241 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (R * d_teta);
1242 }
1243 else if (ori3 == 2)
1244 {
1245 // calcul de tau13
1246 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3;
1247 // calcul de tau31
1248 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (xv(fac2, 2) - xv(fac1, 2));
1249 }
1250 }
1251 else if (ori1 == 1) // bord d'equation teta = cte
1252 {
1253 R = xv(fac3, 0);
1254 d_teta = xv(fac3, 1) - xv(fac1, 1);
1255 if (d_teta < 0)
1256 d_teta += deux_pi;
1257 dist3 = R * d_teta;
1258 if (n_type != TypeAreteBordVDF::PAROI_PAROI)
1259 dist3 *= 2;
1260
1261 if (ori3 == 0)
1262 {
1263 // calcul de tau21
1264 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3 - 0.5 * (inco[fac1] + inco[fac2]) / R;
1265 // calcul de tau12
1266 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (xv(fac2, 0) - xv(fac1, 0));
1267 }
1268 else if (ori3 == 2)
1269 {
1270 // calcul de tau23
1271 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3;
1272 // calcul de tau32
1273 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (xv(fac2, 2) - xv(fac1, 2));
1274 }
1275 }
1276 else // (ori1 == 2) bord d'equation Z = cte
1277 {
1278 dist3 = xv(fac3, 2) - xv(fac1, 2);
1279 if (n_type != TypeAreteBordVDF::PAROI_PAROI)
1280 dist3 *= 2;
1281
1283 {
1284 // calcul de tau31
1285 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3;
1286 // calcul de tau13
1287 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (xv(fac2, 0) - xv(fac1, 0));
1288 }
1289 else if (ori3 == 1)
1290 {
1291 // calcul de tau32
1292 tau_croises_(n_arete, 0) = signe * (vit_imp - inco[fac3]) / dist3;
1293
1294 // calcul de tau23
1295 R = xv(fac1, 0);
1296 d_teta = xv(fac2, 1) - xv(fac1, 1);
1297 if (d_teta < 0)
1298 d_teta += deux_pi;
1299 tau_croises_(n_arete, 1) = (inco[fac2] - inco[fac1]) / (R * d_teta);
1300 }
1301 }
1302 break;
1303 }
1304 case 3:
1305 {
1306 // symetrie-symetrie
1307 // pas de flux diffusif calcule
1308 break;
1309 }
1310 default:
1311 {
1312 Cerr << "On a rencontre un type d'arete non prevu\n";
1313 Cerr << "num arete : " << n_arete;
1314 Cerr << " type : " << n_type;
1315 exit();
1316 break;
1317 }
1318 }
1319 }
1320
1321 // Boucle sur les aretes mixtes et internes
1322 ndeb = domaine_VDF.premiere_arete_mixte();
1323 nfin = domaine_VDF.nb_aretes();
1324 for (n_arete = ndeb; n_arete < nfin; n_arete++)
1325 {
1326 fac1 = Qdm(n_arete, 0);
1327 fac2 = Qdm(n_arete, 1);
1328 fac3 = Qdm(n_arete, 2);
1329 fac4 = Qdm(n_arete, 3);
1330 ori1 = orientation(fac1);
1331 ori3 = orientation(fac3);
1332 if (ori1 == 1) // (seule possibilite : ori3 =0) Arete XY
1333 {
1334 // Calcul de tau21
1335 R = xv(fac3, 0);
1336 d_teta = xv(fac4, 1) - xv(fac3, 1);
1337 if (d_teta < 0)
1338 d_teta += deux_pi;
1339 tau_croises_(n_arete, 1) = (inco(fac4) - inco(fac3)) / (R * d_teta) - 0.5 * (inco[fac1] + inco[fac2]) / R;
1340 // Calcul de tau12
1341 tau_croises_(n_arete, 0) = (inco(fac2) - inco(fac1)) / (xv(fac2, 0) - xv(fac1, 0));
1342 }
1343 else if (ori3 == 1) // (seule possibilite ori1 = 2) arete YZ
1344 {
1345 // Calcul de tau32
1346 tau_croises_(n_arete, 1) = (inco(fac4) - inco(fac3)) / (xv(fac4, 2) - xv(fac3, 2));
1347 // Calcul de tau23
1348 R = xv(fac1, 0);
1349 d_teta = xv(fac2, 1) - xv(fac1, 1);
1350 if (d_teta < 0)
1351 d_teta += deux_pi;
1352 tau_croises_(n_arete, 0) = (inco(fac2) - inco(fac1)) / (R * d_teta);
1353 }
1354 else // seule possibilite ori1 = 2 et ori3 = 0: arete XZ
1355 {
1356 // Calcul de tau31
1357 tau_croises_(n_arete, 1) = (inco(fac4) - inco(fac3)) / (xv(fac4, 2) - xv(fac3, 2));
1358 // Calcul de tau13
1359 tau_croises_(n_arete, 0) = (inco(fac2) - inco(fac1)) / (xv(fac2, 0) - xv(fac1, 0));
1360 }
1361 }
1362}
1363
1364/* ***************************************************** */
1365/* METHODES UTILES MAIS HORS CLASSE */
1366/* ***************************************************** */
1367
1368double Champ_Face_get_val_imp_face_bord_sym(const DoubleTab& tab_valeurs, const double temp, int face, int comp, const Domaine_Cl_VDF& zclo)
1369{
1370 const Domaine_VDF& domaine_vdf = zclo.domaine_VDF();
1371 int face_locale = -123;
1372 const int face_globale = face + domaine_vdf.premiere_face_bord(); // Maintenant numero dans le tableau global des faces.
1373 const Domaine_Cl_dis_base& zcl = zclo; //equation().domaine_Cl_dis();
1374 // On recupere la CL associee a la face et le numero local de la face dans la frontiere.
1375 //assert(equation().domaine_Cl_dis()==zclo);
1376
1377 const Cond_lim_base& cl = (face < domaine_vdf.nb_faces()) ? zcl.condition_limite_de_la_face_reelle(face_globale, face_locale) :
1378 zcl.condition_limite_de_la_face_virtuelle(face_globale, face_locale);
1379
1380 const IntTab& face_voisins = domaine_vdf.face_voisins();
1381 const IntTab& elem_faces = domaine_vdf.elem_faces();
1382 const DoubleVect& porosite = zclo.equation().milieu().porosite_face();
1383 const int ori = domaine_vdf.orientation()(face_globale);
1384
1385 if (sub_type(Navier, cl))
1386 {
1387 const int N = tab_valeurs.line_size();
1388 const int n=comp%N, comploc = (comp-n)/N;
1389 if (comploc == ori)
1390 return 0;
1391 else
1392 {
1393 int elem = 0;
1394 if (face_voisins(face_globale, 0) != -1)
1395 elem = face_voisins(face_globale, 0);
1396 else
1397 elem = face_voisins(face_globale, 1);
1398 const int comp2 = comploc + Objet_U::dimension;
1399 return (tab_valeurs(elem_faces(elem, comploc), n) * porosite[elem_faces(elem, comploc)] + tab_valeurs(elem_faces(elem, comp2), n) * porosite[elem_faces(elem, comp2)])
1400 / (porosite[elem_faces(elem, comploc)] + porosite[elem_faces(elem, comp2)]);
1401 }
1402 }
1403
1404 if (!cl.champ_front().has_valeurs_au_temps(temp)) // si pas encore initialise !!
1405 return 0.;
1406
1407 const DoubleTab& vals = cl.champ_front().valeurs_au_temps(temp);
1408 const int face_de_vals = vals.dimension(0) == 1 ? 0 : face_locale;
1409
1410 if (sub_type(Dirichlet_entree_fluide, cl))
1411 return vals(face_de_vals, comp);
1412 else if (sub_type(Dirichlet_paroi_fixe, cl))
1413 return 0.;
1414 else if (sub_type(Dirichlet_paroi_defilante, cl))
1415 return vals(face_de_vals, comp);
1416
1417 return 0.; // All other cases
1418}
1419
1420double Champ_Face_get_val_imp_face_bord(const double temp, int face, int comp, const Domaine_Cl_VDF& zclo)
1421{
1422 const Domaine_VDF& domaine_vdf = zclo.domaine_VDF();
1423 int face_locale = -123;
1424 const int face_globale = face + domaine_vdf.premiere_face_bord(); // Maintenant numero dans le tableau global des faces.
1425 const Domaine_Cl_dis_base& zcl = zclo; //equation().domaine_Cl_dis();
1426 // On recupere la CL associee a la face et le numero local de la face dans la frontiere.
1427 //assert(equation().domaine_Cl_dis()==zclo);
1428
1429 const Cond_lim_base& cl = (face < domaine_vdf.nb_faces()) ? zcl.condition_limite_de_la_face_reelle(face_globale, face_locale) :
1430 zcl.condition_limite_de_la_face_virtuelle(face_globale, face_locale);
1431 const int ori = domaine_vdf.orientation()(face_globale);
1432
1433 if (sub_type(Navier, cl))
1434 {
1435 if (comp == ori)
1436 return 0.;
1437 else
1438 {
1439 Process::exit("You should call Champ_Face_get_val_imp_face_bord_sym and not Champ_Face_get_val_imp_face_bord\n");
1440 return 1.e9;
1441 }
1442 }
1443
1444 if (!cl.champ_front().has_valeurs_au_temps(temp)) // si pas encore initialise !!
1445 return 0.;
1446
1447 const DoubleTab& vals = cl.champ_front().valeurs_au_temps(temp);
1448 int face_de_vals = vals.dimension(0) == 1 ? 0 : face_locale;
1449
1450 if (sub_type(Dirichlet_entree_fluide, cl))
1451 return vals(face_de_vals, comp);
1452 else if (sub_type(Dirichlet_paroi_fixe, cl))
1453 return 0.;
1454 else if (sub_type(Dirichlet_paroi_defilante, cl))
1455 return vals(face_de_vals, comp);
1456
1457 return 0.; // All other cases
1458}
1459
1460double Champ_Face_get_val_imp_face_bord(const double temp, int face, int comp, int comp2, const Domaine_Cl_VDF& zclo)
1461{
1462 Process::exit("Champ_Face_VDF::val_imp_face_bord(,,) exit\n");
1463 return 0.; // For compilers
1464}
1465
1466double Champ_Face_coeff_frottement_face_bord(const int f, const int n, const Domaine_Cl_VDF& zclo)
1467{
1468 const Domaine_VDF& domaine_vdf = zclo.domaine_VDF();
1469 const Domaine_Cl_dis_base& zcl = zclo;
1470 const int face_globale = f + domaine_vdf.premiere_face_bord(); // Maintenant numero dans le tableau global des faces.
1471
1472 int face_locale = -123;
1473 const Cond_lim_base& cl = (f < domaine_vdf.nb_faces()) ? zcl.condition_limite_de_la_face_reelle(face_globale, face_locale) :
1474 zcl.condition_limite_de_la_face_virtuelle(face_globale, face_locale);
1475
1476 return sub_type(Navier, cl) ? ref_cast(Navier, cl).coefficient_frottement(face_locale,n) : 0.;
1477}
1478
1479double Champ_Face_coeff_frottement_grad_face_bord(const int f, const int n, const Domaine_Cl_VDF& zclo)
1480{
1481 const Domaine_VDF& domaine_vdf = zclo.domaine_VDF();
1482 const Domaine_Cl_dis_base& zcl = zclo;
1483 const int face_globale = f + domaine_vdf.premiere_face_bord(); // Maintenant numero dans le tableau global des faces.
1484
1485 int face_locale = -123;
1486 const Cond_lim_base& cl = (f < domaine_vdf.nb_faces()) ? zcl.condition_limite_de_la_face_reelle(face_globale, face_locale) :
1487 zcl.condition_limite_de_la_face_virtuelle(face_globale, face_locale);
1488
1489 return sub_type(Navier, cl) ? ref_cast(Navier, cl).coefficient_frottement_grad(face_locale,n) : 0.;
1490}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
: class Champ_Don_lu Cette classe represente un champ de donnees que l'on lit dans un fichier avec le...
DoubleTab & trace(const Frontiere_dis_base &fr, const DoubleTab &y, DoubleTab &x, int distant) const
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
DoubleVect & calcul_S_barre(const DoubleTab &, DoubleVect &, const Domaine_Cl_VDF &) const
int imprime(Sortie &, int) const override
int compo_normale_sortante(int) const
void calcul_critere_Q(DoubleTab &, const Domaine_Cl_VDF &)
DoubleVect & calcul_S_barre_sans_contrib_paroi(const DoubleTab &, DoubleVect &, const Domaine_Cl_VDF &) const
Methode qui renvoie SMA_barre aux elements a partir de la vitesse aux faces.
void calculer_dercov_axi(const Domaine_Cl_VDF &)
void mettre_a_jour(double temps) override
mettre_a_jour de la classe de base Champ_base :ne fait rien !
void calculer_dscald_centre_element(DoubleTab &) const
void calcul_y_plus(DoubleTab &, const Domaine_Cl_VDF &)
void verifie_valeurs_cl() override
void calcul_grad_u(const DoubleTab &, DoubleTab &, const Domaine_Cl_VDF &)
virtual const Champ_Proto & affecter(const double x1, const double x2)
const Domaine_VDF & domaine_vdf() const override
int fixer_nb_valeurs_nodales(int) override
DoubleTab & calcul_duidxj(const DoubleTab &, DoubleTab &) const
Methode qui renvoie gij aux elements a partir de la vitesse aux elements (gij represente la derivee p...
void calculer_rotationnel_ordre2_centre_element(DoubleTab &) const
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
Calcule la trace d'un champ sur une frontiere au temps tps.
Champ_base & affecter_(const Champ_base &) override
DoubleTab & calcul_S_barre_Multiphase(const DoubleTab &, DoubleTab &, const Domaine_Cl_VDF &) const
void dimensionner_tenseur_Grad()
virtual void creer_tableau_distribue(const MD_Vector &, RESIZE_OPTIONS=RESIZE_OPTIONS::COPY_INIT)
int lire_donnees(Entree &)
Lit les valeurs du champs a partir d'un flot d'entree.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_Proto Classe representant un prototype de Champ.
Definition Champ_Proto.h:37
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme_Morceaux Cette classe represente champ constant par morceaux dans l'espace
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
Champ_base()
Constructeur par defaut d'un Champ_base.
double temps() const
Renvoie le temps du champ.
virtual DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const
Provoque une erreur ! Doit etre surchargee par les classes derivees.
virtual DoubleTab & valeurs_au_temps(double temps)=0
virtual bool has_valeurs_au_temps(double temps) const
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
int_t nb_elem_tot() const
Definition Domaine.h:132
int_t nb_elem() const
Definition Domaine.h:131
class Domaine_Cl_VDF
int type_arete_bord(int num_arete) const
Domaine_VDF & domaine_VDF()
const int & type_arete_coin(int num_arete) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim_base & condition_limite_de_la_face_reelle(int face_globale, int &face_locale) const
Renvoie la condition limite associee a une face reelle donnee.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const Cond_lim_base & condition_limite_de_la_face_virtuelle(int face_globale, int &face_locale) const
Renvoie la condition limite associee a une face virtuelle donnee.
class Domaine_VDF
Definition Domaine_VDF.h:64
int nb_aretes_coin() const
double dist_norm_bord_axi(int num_face) const
double dist_face_period(int, int, int) const
int nb_aretes() const
double dim_elem(int, int) const
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int premiere_arete_bord() const
int premiere_arete_coin() const
int nb_aretes_internes() const
int premiere_arete_interne() const
int nb_aretes_bord() const
int nb_aretes_mixtes() const
double dist_face(int, int, int k) const
int premiere_arete_mixte() const
int Qdm(int num_arete, int) const
double dist_norm_bord(int num_face) const override
int premiere_face_bord() const
renvoie le numero de la premiere des faces sur lesquelles sont appliquees les conditions limites :
Definition Domaine_VF.h:523
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
const MD_Vector & md_vector_faces() const
Definition Domaine_VF.h:158
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
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
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
int nb_elem_tot() const
int nb_front_Cl() const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const RefObjU & get_modele(Type_modele type) const
const Nom & le_nom() const override
Renvoie le nom du champ.
int nb_compo_
Definition Field_base.h:95
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
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 Frontiere_dis_base Classe representant une frontiere discretisee.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
DoubleVect & porosite_face()
Definition Milieu_base.h:62
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Turbulence_paroi_base & loi_paroi() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Navier Condition aux limites sur la vitesse de type "Navier" :
Definition Navier.h:31
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
static int axi
Definition Objet_U.h:101
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int traitement_coins
Definition Option_VDF.h:30
static int traitement_gradients
Definition Option_VDF.h:30
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
int face_associee(int i) const
Definition Periodique.h:35
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
virtual void ref(const TRUSTTab &)
Definition TRUSTTab.tpp:308
int nb_dim() const
Definition TRUSTTab.h:199
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
Classe Turbulence_paroi_base Classe de base pour la hierarchie des classes representant les modeles.
const DoubleVect & tab_d_plus() const
virtual bool use_shear() const