TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Correction_Lubchenko_PolyMAC_MPFA.cpp
1/****************************************************************************
2* Copyright (c) 2021, 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 <Correction_Lubchenko_PolyMAC_MPFA.h>
17#include <Pb_Multiphase.h>
18#include <Portance_interfaciale_PolyMAC_MPFA.h>
19#include <Portance_interfaciale_base.h>
20#include <Op_Diff_Turbulent_PolyMAC_MPFA_Face.h>
21#include <Dispersion_bulles_PolyMAC_MPFA.h>
22#include <Dispersion_bulles_base.h>
23#include <Champ_Face_PolyMAC_MPFA.h>
24#include <Milieu_composite.h>
25#include <Navier_Stokes_std.h>
26#include <Viscosite_turbulente_base.h>
27#include <Viscosite_turbulente_multiple.h>
28#include <Matrix_tools.h>
29#include <Array_tools.h>
30#include <Sources_helpers_Multiphase.h>
31#include <math.h>
32#include <Dispersion_bulles_turbulente_Burns.h>
33#include <Domaine_PolyMAC_MPFA.h>
34#include <Probleme_base.h>
35#include <Champ_Elem_PolyMAC_MPFA.h>
36
37Implemente_instanciable(Correction_Lubchenko_PolyMAC_MPFA, "Correction_Lubchenko_Face_PolyMAC_MPFA", Source_base);
38// XD Correction_Lubchenko source_base Correction_Lubchenko BRACE not_set
39// XD attr beta_lift floattant beta_lift OPT not_set
40// XD attr beta_disp floattant beta_disp OPT not_set
41
43{
44 return os;
45}
46
48{
49 Param param(que_suis_je());
50 param.ajouter("beta_lift", &beta_lift_);
51 param.ajouter("beta_disp", &beta_disp_);
52 param.ajouter("portee_disp", &portee_disp_);
53 param.ajouter("portee_lift", &portee_lift_);
54 param.ajouter("use_bif", &use_bif_);
55 param.lire_avec_accolades_depuis(is);
56
57 //identification des phases
58 Pb_Multiphase *pbm = sub_type(Pb_Multiphase, equation().probleme()) ? &ref_cast(Pb_Multiphase, equation().probleme()) : nullptr;
59
60 if (!pbm || pbm->nb_phases() == 1)
61 Process::exit(que_suis_je() + " : not needed for single-phase flow!");
62
63 n_l = find_liquid_phase(*pbm, que_suis_je());
64
65 pbm->creer_champ("distance_paroi_globale"); // Besoin de distance a la paroi
66
67 return is;
68}
69
70void Correction_Lubchenko_PolyMAC_MPFA::completer() // We must wait for all readOn's to be sure that the bubble dispersion and lift correlations are created
71{
72 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
73
74 for (int i = 0 ; i < equation().sources().size() ; i++)
75 if sub_type(Portance_interfaciale_PolyMAC_MPFA, equation().sources()(i).valeur())
76 correlation_lift_ = ref_cast(Portance_interfaciale_PolyMAC_MPFA, equation().sources()(i).valeur()).correlation();
77
78 for (int i = 0 ; i < equation().sources().size() ; i++)
79 if sub_type(Dispersion_bulles_PolyMAC_MPFA, equation().sources()(i).valeur())
80 correlation_dispersion_ = ref_cast(Dispersion_bulles_PolyMAC_MPFA, equation().sources()(i).valeur()).correlation();
81
82 if ( (!correlation_lift_) || (!correlation_dispersion_) )
83 Process::exit("Correction_Lubchenko_PolyMAC_MPFA::completer() : a dispersion_bulles and a portance_interfaciale force must be defined !");
84
85 if sub_type(Op_Diff_Turbulent_PolyMAC_MPFA_Face, equation().operateur(0).l_op_base()) is_turb = true;
86
87 if (!pbm.has_champ("diametre_bulles"))
88 Process::exit("Correction_Lubchenko_PolyMAC_MPFA::completer() : a bubble diameter must be defined !");
89}
90
91
93 const tabs_t& semi_impl) const // The necessary dimensionner_bloc is taken care of in the dispersion_bulles_PolyMAC_MPFA and Portance_interfaciale_PolyMAC_MPFA functions
94{
95}
96
97void Correction_Lubchenko_PolyMAC_MPFA::ajouter_blocs(matrices_t matrices, DoubleTab& secmem,
98 const tabs_t& semi_impl) const
99{
100 ajouter_blocs_disp(matrices, secmem, semi_impl);
101 ajouter_blocs_lift(matrices, secmem, semi_impl);
102 // Le terme source_BIF peut entrainer une mauvaise prédiction des forces normales à la paroi : une correction est mise en place
103 if ((use_bif_) && (sub_type(Viscosite_turbulente_multiple, ref_cast(Op_Diff_Turbulent_PolyMAC_MPFA_Face, ref_cast(Navier_Stokes_std, equation().probleme().equation(0)).operateur(0).l_op_base()).correlation())))
104 ajouter_blocs_BIF(matrices, secmem, semi_impl);
105}
106
107void Correction_Lubchenko_PolyMAC_MPFA::ajouter_blocs_disp(matrices_t matrices, DoubleTab& secmem,
108 const tabs_t& semi_impl) const
109{
110 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
111 const Champ_Face_PolyMAC_MPFA& ch = ref_cast(Champ_Face_PolyMAC_MPFA, equation().inconnue());
112 const Domaine_PolyMAC_MPFA& domaine = ref_cast(Domaine_PolyMAC_MPFA, equation().domaine_dis());
113 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.fcl();
114 const DoubleVect& pe = equation().milieu().porosite_elem(), &pf = equation().milieu().porosite_face(), &ve = domaine.volumes(), &vf = domaine.volumes_entrelaces(), &fs = domaine.face_surfaces();
115 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &n_f = domaine.face_normales();
116 const DoubleTab& pvit = ch.passe(),
117 &alpha = pbm.equation_masse().inconnue().passe(),
118 &press = ref_cast(QDM_Multiphase, pbm.equation_qdm()).pression().passe(),
119 &temp = pbm.equation_energie().inconnue().passe(),
120 &rho = equation().milieu().masse_volumique().passe(),
121 &mu = ref_cast(Fluide_base, equation().milieu()).viscosite_dynamique().passe(),
122 &y_elem = domaine.y_elem(),
123 &y_faces = domaine.y_faces(),
124 &n_y_elem = domaine.normale_paroi_elem(),
125 &n_y_faces = domaine.normale_paroi_faces(),
126 &d_bulles = equation().probleme().get_champ("diametre_bulles").valeurs(),
127 *k_turb = (equation().probleme().has_champ("k")) ? &equation().probleme().get_champ("k").passe() : nullptr,
128 * k_WIT = (equation().probleme().has_champ("k_WIT")) ? &equation().probleme().get_champ("k_WIT").passe() : nullptr ;
129 const Milieu_composite& milc = ref_cast(Milieu_composite, equation().milieu());
130
131 const int N = pvit.line_size();
132 int Np = press.line_size();
133 int Nk = (k_turb) ? (*k_turb).dimension(1) : 1;
134 int D = dimension;
135 int nf_tot = domaine.nb_faces_tot();
136 const int nf = domaine.nb_faces();
137 int ne_tot = domaine.nb_elem_tot();
138 const int cR = (rho.dimension_tot(0) == 1);
139 const int cM = (mu.dimension_tot(0) == 1);
140
141 DoubleTrav nut(domaine.nb_elem_tot(), N); // turbulent viscosity
142 if (is_turb)
143 ref_cast(Viscosite_turbulente_base, ref_cast(Op_Diff_Turbulent_PolyMAC_MPFA_Face, equation().operateur(0).l_op_base()).correlation()).eddy_viscosity(nut); //remplissage par la correlation
144
145 // Input-output
146 const Dispersion_bulles_base& correlation_db = ref_cast(Dispersion_bulles_base, correlation_dispersion_.valeur());
149 in.alpha.resize(N);
150 in.T.resize(N);
151 in.p.resize(N);
152 in.rho.resize(N);
153 in.mu.resize(N);
154 in.sigma.resize(N*(N-1)/2);
155 in.k_turb.resize(N);
156 in.nut.resize(N);
157 in.d_bulles.resize(N);
158 in.nv.resize(N, N);
159 out.Ctd.resize(N, N);
160
161 // There is no need to calculate the gradient of alpha here
162
163 // Et pour les methodes span de la classe Interface pour choper la tension de surface
164 const int nb_max_sat = N*(N - 1)/2;
165 DoubleTrav Sigma_tab(ne_tot, nb_max_sat);
166
167 // TODO: make a function from this k-loop
168 // remplir les tabs ...
169 for (int k = 0; k < N; k++)
170 for (int l = k + 1; l < N; l++)
171 {
172 if (milc.has_saturation(k, l))
173 {
174 Saturation_base& z_sat = milc.get_saturation(k, l);
175 const int ind_trav = sigma_pair_index(k, l, N);
176 // recuperer sigma ...
177 const DoubleTab& sig = z_sat.get_sigma_tab();
178 // fill in the good case
179 for (int ii = 0; ii < ne_tot; ii++)
180 Sigma_tab(ii, ind_trav) = sig(ii);
181 }
182 else if (milc.has_interface(k, l))
183 {
184 Interface_base& sat = milc.get_interface(k, l);
185 const int ind_trav = sigma_pair_index(k, l, N);
186 for (int i = 0 ; i<ne_tot ; i++)
187 Sigma_tab(i,ind_trav) = sat.sigma(temp(i,k),press(i,k * (Np > 1))) ;
188 }
189 }
190
191 /* faces */
192 for (int f = 0; f < nf; f++)
193 if (fcl(f, 0) < 2)
194 {
195 in.alpha=0., in.T=0., in.p=0., in.rho=0., in.mu=0., in.sigma=0., in.k_turb=0., in.nut=0., in.d_bulles=0., in.nv=0.;
196 int e {0};
197 for (int c = 0; c < 2 && (e = f_e(f, c)) >= 0; c++)
198 {
199 for (int n = 0; n < N; n++)
200 {
201 in.alpha[n] += vf_dir(f, c)/vf(f) * alpha(e, n);
202 in.p[n] += vf_dir(f, c)/vf(f) * press(e, n * (Np > 1));
203 in.T[n] += vf_dir(f, c)/vf(f) * temp(e, n);
204 in.rho[n] += vf_dir(f, c)/vf(f) * rho(!cR * e, n);
205 in.mu[n] += vf_dir(f, c)/vf(f) * mu(!cM * e, n);
206 in.nut[n] += is_turb ? vf_dir(f, c)/vf(f) * nut(e,n) : 0;
207 in.d_bulles[n] += vf_dir(f, c)/vf(f) * d_bulles(e,n);
208 for (int k = n + 1; k < N; k++)
209 if (milc.has_interface(n, k))
210 {
211 const int ind_trav = sigma_pair_index(n, k, N);
212 in.sigma[ind_trav] += vf_dir(f, c) / vf(f) * Sigma_tab(e, ind_trav);
213 }
214 for (int k = 0; k < N; k++)
215 in.nv(k, n) += vf_dir(f, c)/vf(f) * ch.v_norm(pvit, pvit, e, f, k, n, nullptr, nullptr);
216 }
217 for (int n = 0; n <Nk; n++) in.k_turb[n] += (k_turb) ? vf_dir(f, c)/vf(f) * (*k_turb)(e,0) : 0;
218 in.k_WIT += (k_WIT) ? vf_dir(f, c)/vf(f) * (*k_WIT)(e,0) : 0.;
219 in.e = e;
220 }
221
222 correlation_db.coefficient(in, out);
223
224 double sum_alphag_wall = 0 ;
225 for (int k = 0; k<N ; k++)
226 if (k!=n_l) sum_alphag_wall += (y_faces(f)<portee_disp_*in.d_bulles[k]/2.) ? in.alpha[k] * (portee_disp_*in.d_bulles[k]-2*y_faces(f))/(portee_disp_*in.d_bulles[k]-y_faces(f)) :0 ;
227
228 for (int k = 0; k < N; k++)
229 if (k != n_l)
230 if (y_faces(f)<portee_disp_*in.d_bulles[k]/2.)
231 {
232 double fac = 0 ;
233 for (int d = 0 ; d<D ; d++) fac += n_y_faces(f, d) * n_f(f, d)/fs(f);
234
235 fac *= beta_disp_*pf(f) * vf(f) ;
236 secmem(f, k) += fac * out.Ctd(k, n_l) * 1/y_faces(f) * in.alpha[k] * (portee_disp_*in.d_bulles[k]-2*y_faces(f))/(portee_disp_*in.d_bulles[k]-y_faces(f));
237 secmem(f, k) += fac * out.Ctd(n_l, k) * 1/y_faces(f) * sum_alphag_wall;
238 secmem(f, n_l) -= fac * out.Ctd(k, n_l) * 1/y_faces(f) * in.alpha[k] * (portee_disp_*in.d_bulles[k]-2*y_faces(f))/(portee_disp_*in.d_bulles[k]-y_faces(f));
239 secmem(f, n_l) -= fac * out.Ctd(n_l, k) * 1/y_faces(f) * sum_alphag_wall;
240 }
241 }
242
243 /* elements */
244 for (int e = 0; e < ne_tot; e++)
245 {
246 /* arguments de coeff */
247 for (int n = 0; n < N; n++)
248 {
249 in.alpha[n] = alpha(e, n);
250 in.p[n] = press(e, n * (Np > 1));
251 in.T[n] = temp(e, n);
252 in.rho[n] = rho(!cR * e, n);
253 in.mu[n] = mu(!cM * e, n);
254 in.nut[n] = is_turb ? nut(e,n) : 0;
255 in.d_bulles[n] = d_bulles(e,n) ;
256 for (int k = n+1; k < N; k++)
257 if (milc.has_interface(n,k))
258 {
259 const int ind_trav = sigma_pair_index(n, k, N);
260 in.sigma[ind_trav] = Sigma_tab(e, ind_trav);
261 }
262 for (int k = 0; k < N; k++)
263 in.nv(k, n) = ch.v_norm(pvit, pvit, e, -1, k, n, nullptr, nullptr);
264 }
265 for (int n = 0; n <Nk; n++) in.k_turb[n] = (k_turb) ? (*k_turb)(e,0) : 0;
266 in.k_WIT = (k_WIT) ? (*k_WIT)(e,0) : 0;
267 in.e = e;
268
269 correlation_db.coefficient(in, out);
270
271 double sum_alphag_wall = 0 ;
272 for (int k = 0; k<N ; k++)
273 if (k!=n_l) sum_alphag_wall += (y_elem(e)<portee_disp_*d_bulles(e,k)/2.) ? alpha(e,k) *(portee_disp_*d_bulles(e,k)-2*y_elem(e))/(portee_disp_*d_bulles(e,k)-y_elem(e)) :0 ;
274 for (int d = 0, i = nf_tot + D * e; d < D; d++, i++)
275 for (int k = 0; k < N; k++)
276 if (k != n_l)
277 if (y_elem(e)<portee_disp_*d_bulles(e,k)/2)
278 {
279 double fac = beta_disp_*pe(e) * ve(e);
280
281 secmem(i, k) += fac * out.Ctd(k, n_l) * 1/y_elem(e) * alpha(e,k) * (portee_disp_*d_bulles(e,k)-2*y_elem(e))/(portee_disp_*d_bulles(e,k)-y_elem(e)) * n_y_elem(e, d);
282 secmem(i, k) += fac * out.Ctd(n_l, k) * 1/y_elem(e) * sum_alphag_wall * n_y_elem(e, d);
283 secmem(i, n_l) -= fac * out.Ctd(k, n_l) * 1/y_elem(e) * alpha(e,k) * (portee_disp_*d_bulles(e,k)-2*y_elem(e))/(portee_disp_*d_bulles(e,k)-y_elem(e)) * n_y_elem(e, d);
284 secmem(i, n_l) -= fac * out.Ctd(n_l, k) * 1/y_elem(e) * sum_alphag_wall * n_y_elem(e, d);
285 }
286 }
287}
288
289
290void Correction_Lubchenko_PolyMAC_MPFA::ajouter_blocs_lift(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl ) const
291{
292 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
293 const Champ_Face_PolyMAC_MPFA& ch = ref_cast(Champ_Face_PolyMAC_MPFA, equation().inconnue());
294 const Domaine_PolyMAC_MPFA& domaine = ref_cast(Domaine_PolyMAC_MPFA, equation().domaine_dis());
295 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.fcl(), &e_f = domaine.elem_faces();
296 const DoubleVect& pe = equation().milieu().porosite_elem(), &pf = equation().milieu().porosite_face(), &ve = domaine.volumes(), &vf = domaine.volumes_entrelaces(), &fs = domaine.face_surfaces();
297 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &n_f = domaine.face_normales();
298 const DoubleTab& pvit = ch.passe(),
299 &alpha = pbm.equation_masse().inconnue().passe(),
300 &press = ref_cast(QDM_Multiphase, pbm.equation_qdm()).pression().passe(),
301 &temp = pbm.equation_energie().inconnue().passe(),
302 &rho = equation().milieu().masse_volumique().passe(),
303 &mu = ref_cast(Fluide_base, equation().milieu()).viscosite_dynamique().passe(),
304 &vort = equation().probleme().get_champ("vorticite").valeurs(),
305 &y_elem = domaine.y_elem(),
306 &y_faces = domaine.y_faces(),
307 &d_bulles = equation().probleme().get_champ("diametre_bulles").valeurs(),
308 &grad_v = equation().probleme().get_champ("gradient_vitesse").valeurs(),
309 * k_turb = (equation().probleme().has_champ("k")) ? &equation().probleme().get_champ("k").passe() : nullptr ;
310
311 const Milieu_composite& milc = ref_cast(Milieu_composite, equation().milieu());
312
313 int N = pvit.line_size() , Np = press.line_size(), Nk = (k_turb) ? (*k_turb).dimension(1) : 1, D = dimension,
314 nf_tot = domaine.nb_faces_tot(), cR = (rho.dimension_tot(0) == 1), cM = (mu.dimension_tot(0) == 1);
315
316 DoubleTrav vr_l(N,D), scal_ur(N), scal_u(N), pvit_l(N, D), vort_l( D==2 ? 1 :D), grad_l(D,D), scal_grad(D); // Requis pour corrections vort et u_l-u-g
317
318 const Portance_interfaciale_base& correlation_pi = ref_cast(Portance_interfaciale_base, correlation_lift_.valeur());
319 double vl_norm ;
320
323 in.alpha.resize(N), in.T.resize(N), in.p.resize(N), in.rho.resize(N), in.mu.resize(N), in.sigma.resize(N*(N-1)/2), in.k_turb.resize(N), in.d_bulles.resize(N), in.nv.resize(N, N);
324 out.Cl.resize(N, N);
325
326 // Et pour les methodes span de la classe Interface pour choper la tension de surface
327 const int ne_tot = domaine.nb_elem_tot(), nb_max_sat = N * (N-1) /2; // oui !! suite arithmetique !!
328 DoubleTrav Sigma_tab(ne_tot,nb_max_sat);
329
330 // remplir les tabs ...
331 for (int k = 0; k < N; k++)
332 for (int l = k + 1; l < N; l++)
333 {
334 if (milc.has_saturation(k, l))
335 {
336 Saturation_base& z_sat = milc.get_saturation(k, l);
337 const int ind_trav = sigma_pair_index(k, l, N);
338 // XXX XXX XXX
339 // Attention c'est dangereux ! on suppose pour le moment que le champ de pression a 1 comp. Par contre la taille de res est nb_max_sat*nbelem !!
340 // Aussi, on passe le Span le nbelem pour le champ de pression et pas nbelem_tot ....
341 assert(press.line_size() == 1);
342 assert(temp.line_size() == N);
343 z_sat.get_sigma(temp.get_span_tot(), press.get_span_tot(), Sigma_tab.get_span_tot(), nb_max_sat, ind_trav);
344 }
345 else if (milc.has_interface(k, l))
346 {
347 Interface_base& sat = milc.get_interface(k,l);
348 const int ind_trav = sigma_pair_index(k, l, N);
349 for (int i = 0 ; i<ne_tot ; i++) Sigma_tab(i,ind_trav) = sat.sigma(temp(i,k),press(i,k * (Np > 1))) ;
350 }
351 }
352
353 /* elements */
354 int f;
355 for (int e = 0; e < ne_tot; e++)
356 {
357 /* arguments de coeff */
358 for (int n=0; n<N; n++)
359 {
360 in.alpha[n] = alpha(e, n);
361 in.p[n] = press(e, n * (Np > 1));
362 in.T[n] = temp(e, n);
363 in.rho[n] = rho(!cR * e, n);
364 in.mu[n] = mu(!cM * e, n);
365 in.d_bulles[n] = d_bulles(e,n) ;
366 for (int k = n+1; k < N; k++)
367 if (milc.has_interface(n,k))
368 {
369 const int ind_trav = sigma_pair_index(n, k, N);
370 in.sigma[ind_trav] = Sigma_tab(e, ind_trav);
371 }
372 for (int k = 0; k < N; k++)
373 in.nv(k, n) = ch.v_norm(pvit, pvit, e, -1, k, n, nullptr, nullptr);
374 }
375 for (int n = 0; n <Nk; n++) in.k_turb[n] = (k_turb) ? (*k_turb)(e,0) : 0;
376
377 correlation_pi.coefficient(in, out);
378
379 double fac_e = beta_lift_*pe(e) * ve(e);
380 int i = nf_tot + D * e;
381
382 // Experimentation sur la portance
383 vl_norm = 0;
384 scal_ur = 0 ;
385 for (int d = 0 ; d < D ; d++) vl_norm += pvit(i+d, n_l)*pvit(i+d, n_l);
386 vl_norm = std::sqrt(vl_norm);
387 if (vl_norm > 1.e-6)
388 {
389 for (int k = 0; k < N; k++)
390 for (int d = 0 ; d < D ; d++) scal_ur(k) += pvit(i+d, n_l)/vl_norm * (pvit(i+d, k) -pvit(i+d, n_l));
391 for (int k = 0; k < N; k++)
392 for (int d = 0 ; d < D ; d++) vr_l(k, d) = pvit(i+d, n_l)/vl_norm * scal_ur(k) ;
393 }
394 else for (int k=0 ; k<N ; k++)
395 for (int d=0 ; d<D ; d++) vr_l(k, d) = pvit(i+d, k) -pvit(i+d, n_l) ;
396
397 if (D==2)
398 {
399 for (int k = 0; k < N; k++)
400 if (k!= n_l) // gas phase
401 {
402 // Damping of the lift force close to the wall;
403 if (y_elem(e) < .5*d_bulles(e,k)*portee_lift_) fac_e *= -1 ; // suppresses lift
404 else if (y_elem(e) > d_bulles(e,k)*portee_lift_) fac_e *= 0 ; // no effect
405 else fac_e *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 3)) - 1; // partial damping
406
407 secmem(i, n_l) += fac_e * out.Cl(n_l, k) * vr_l(k, 1) * vort(e, 0) ;
408 secmem(i, k ) -= fac_e * out.Cl(n_l, k) * vr_l(k, 1) * vort(e, 0) ;
409 secmem(i+1,n_l)-= fac_e * out.Cl(n_l, k) * vr_l(k, 0) * vort(e, 0) ;
410 secmem(i+1, k )+= fac_e * out.Cl(n_l, k) * vr_l(k, 0) * vort(e, 0) ;
411 } // 100% explicit
412 for (int b = 0; b < e_f.dimension(1) && (f = e_f(e, b)) >= 0; b++)
413 if (f<domaine.nb_faces())
414 if (fcl(f, 0) < 2)
415 for (int k = 0; k < N; k++)
416 if (k!= n_l) // gas phase
417 {
418 int c = (e == f_e(f, 0)) ? 0 : 1 ;
419 double fac_f = beta_lift_*pf(f) * vf_dir(f, c); // Coherence with portance_interfaciale that calculates the correlation at the element
420
421 if (y_elem(e) < .5*d_bulles(e,k)*portee_lift_) fac_f *= -1 ; // suppresses lift
422 else if (y_elem(e) > d_bulles(e,k)*portee_lift_) fac_f *= 0 ; // no effect
423 else fac_f *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 3)) - 1; // partial damping
424
425 secmem(f, n_l) += fac_f * n_f(f, 0)/fs(f) * out.Cl(n_l, k) * vr_l(k, 1) * vort(e, 0) ;
426 secmem(f, k ) -= fac_f * n_f(f, 0)/fs(f) * out.Cl(n_l, k) * vr_l(k, 1) * vort(e, 0) ;
427 secmem(f, n_l) -= fac_f * n_f(f, 1)/fs(f) * out.Cl(n_l, k) * vr_l(k, 0) * vort(e, 0) ;
428 secmem(f, k ) += fac_f * n_f(f, 1)/fs(f) * out.Cl(n_l, k) * vr_l(k, 0) * vort(e, 0) ;
429 } // 100% explicit
430
431 }
432
433 if (D==3)
434 {
435 for (int k = 0; k < N; k++)
436 if (k!= n_l) // gas phase
437 {
438 // Damping of the lift force close to the wall;
439 if (y_elem(e) < .5*d_bulles(e,k)*portee_lift_) fac_e *= -1 ; // suppresses lift
440 else if (y_elem(e) > d_bulles(e,k)*portee_lift_) fac_e *= 0 ; // no effect
441 else fac_e *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*portee_lift_)-1, 3)) - 1; // partial damping
442
443 secmem(i, n_l) += fac_e * out.Cl(n_l, k) * (vr_l(k, 1) * vort(e, 2*N+n_l) - vr_l(k, 2) * vort(e, 1*N+n_l)) ;
444 secmem(i, k ) -= fac_e * out.Cl(n_l, k) * (vr_l(k, 1) * vort(e, 2*N+n_l) - vr_l(k, 2) * vort(e, 1*N+n_l)) ;
445 secmem(i+1,n_l)+= fac_e * out.Cl(n_l, k) * (vr_l(k, 2) * vort(e, 0*N+n_l) - vr_l(k, 0) * vort(e, 2*N+n_l)) ;
446 secmem(i+1, k )-= fac_e * out.Cl(n_l, k) * (vr_l(k, 2) * vort(e, 0*N+n_l) - vr_l(k, 0) * vort(e, 2*N+n_l)) ;
447 secmem(i+2,n_l)+= fac_e * out.Cl(n_l, k) * (vr_l(k, 0) * vort(e, 1*N+n_l) - vr_l(k, 1) * vort(e, 0*N+n_l)) ;
448 secmem(i+2, k )-= fac_e * out.Cl(n_l, k) * (vr_l(k, 0) * vort(e, 1*N+n_l) - vr_l(k, 1) * vort(e, 0*N+n_l)) ;
449 } // 100% explicit
450 }
451
452 }
453
454 int c, e, n, k, d, d2;
455 double fac_f ;
456
457 if (D==3)
458 for (f = 0 ; f<domaine.nb_faces() ; f++)
459 if (fcl(f, 0) < 2)
460 {
461 in.alpha=0., in.T=0., in.p=0., in.rho=0., in.mu=0., in.sigma=0., in.k_turb=0., in.d_bulles=0., in.nv=0.;
462 for ( c = 0; c < 2 && (e = f_e(f, c)) >= 0; c++)
463 {
464 for (n = 0; n < N; n++)
465 {
466 in.alpha[n] += vf_dir(f, c)/vf(f) * alpha(e, n);
467 in.p[n] += vf_dir(f, c)/vf(f) * press(e, n * (Np > 1));
468 in.T[n] += vf_dir(f, c)/vf(f) * temp(e, n);
469 in.rho[n] += vf_dir(f, c)/vf(f) * rho(!cR * e, n);
470 in.mu[n] += vf_dir(f, c)/vf(f) * mu(!cM * e, n);
471 in.d_bulles[n] += vf_dir(f, c)/vf(f) *d_bulles(e,n) ;
472 for (k = n+1; k < N; k++)
473 if (milc.has_interface(n,k))
474 {
475 const int ind_trav = sigma_pair_index(n, k, N);
476 in.sigma[ind_trav] += vf_dir(f, c) / vf(f) * Sigma_tab(e, ind_trav);
477 }
478 for (k = 0; k < N; k++)
479 in.nv(k, n) += vf_dir(f, c)/vf(f) * ch.v_norm(pvit, pvit, e, f, k, n, nullptr, nullptr);
480 }
481 for (n = 0; n <Nk; n++) in.k_turb[n] += (k_turb) ? vf_dir(f, c)/vf(f) * (*k_turb)(e,0) : 0;
482 }
483
484 correlation_pi.coefficient(in, out);
485
486 grad_l = 0; // we fill grad_l so that grad_l(d, d2) = du_d/dx_d2 by averaging between both elements
487 for (d = 0 ; d<D ; d++)
488 for (d2 = 0 ; d2<D ; d2++)
489 for (c=0 ; c<2 && (e = f_e(f, c)) >= 0; c++)
490 grad_l(d, d2) += vf_dir(f, c)/vf(f)*grad_v(nf_tot + D*e + d2 , n_l * D + d) ;
491 //We replace the n_l components by the one calculated without interpolation to elements
492 scal_grad = 0 ; // scal_grad(d) = grad(u_d).n_f
493 for (d = 0 ; d<D ; d++)
494 for (d2 = 0 ; d2<D ; d2++)
495 scal_grad(d) += grad_l(d, d2)*n_f(f, d2)/fs(f);
496 for (d = 0 ; d<D ; d++)
497 for (d2 = 0 ; d2<D ; d2++)
498 grad_l(d, d2) += (grad_v(f ,n_l*D+d) - scal_grad(d)) * n_f(f, d2)/fs(f);
499 // We calculate the local vorticity using this local gradient
500 vort_l(0) = grad_l(2, 1) - grad_l(1, 2); // dUz/dy - dUy/dz
501 vort_l(1) = grad_l(0, 2) - grad_l(2, 0); // dUx/dz - dUz/dx
502 vort_l(2) = grad_l(1, 0) - grad_l(0, 1); // dUy/dx - dUx/dy
503
504 // We also need to calculate relative velocity at the face
505 pvit_l = 0 ;
506 for (d = 0 ; d<D ; d++)
507 for (k = 0 ; k<N ; k++)
508 for (c=0 ; c<2 && (e = f_e(f, c)) >= 0; c++)
509 pvit_l(k, d) += vf_dir(f, c)/vf(f)*pvit(domaine.nb_faces_tot()+D*e+d, k) ;
510 scal_u = 0;
511 for (k = 0 ; k<N ; k++)
512 for (d = 0 ; d<D ; d++)
513 scal_u(k) += pvit_l(k, d)*n_f(f, d)/fs(f);
514 for (k = 0 ; k<N ; k++)
515 for (d = 0 ; d<D ; d++)
516 pvit_l(k, d) += (pvit(f, k) - scal_u(k)) * n_f(f, d)/fs(f) ; // Corect velocity at the face
517 vl_norm = 0;
518 scal_ur = 0;
519 for (d = 0 ; d < D ; d++) vl_norm += pvit_l(n_l, d)*pvit_l(n_l, d);
520 vl_norm = std::sqrt(vl_norm);
521 if (vl_norm > 1.e-6)
522 {
523 for (k = 0; k < N; k++)
524 for (d = 0 ; d < D ; d++) scal_ur(k) += pvit_l(n_l, d)/vl_norm * (pvit_l(k, d) -pvit_l(n_l, d));
525 for (k = 0; k < N; k++)
526 for (d = 0 ; d < D ; d++) vr_l(k, d) = pvit_l(n_l, d)/vl_norm * scal_ur(k) ;
527 }
528 else for (k=0 ; k<N ; k++)
529 for (d=0 ; d<D ; d++) vr_l(k, d) = pvit_l(k, d)-pvit_l(n_l, d) ;
530
531
532 // Use local vairables for the calculation of secmem
533
534 for (k = 0; k < N; k++)
535 if (k!= n_l) // gas phase
536 {
537 fac_f = beta_lift_*pf(f) * vf(f);
538
539 if (y_faces(f) < .5*in.d_bulles(k)*portee_lift_) fac_f *= -1 ; // suppresses lift
540 else if (y_faces(f) > in.d_bulles(k)*portee_lift_) fac_f *= 0 ; // no effect
541 else fac_f *= (3*std::pow(2*y_faces(f)/(in.d_bulles(k)*portee_lift_)-1, 2) - 2*std::pow(2*y_faces(f)/(in.d_bulles(k)*portee_lift_)-1, 3)) - 1; // partial damping
542
543 secmem(f, n_l) += fac_f * n_f(f, 0)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 1) * vort_l(2) - vr_l(k, 2) * vort_l(1)) ;
544 secmem(f, k ) -= fac_f * n_f(f, 0)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 1) * vort_l(2) - vr_l(k, 2) * vort_l(1)) ;
545 secmem(f, n_l) += fac_f * n_f(f, 1)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 2) * vort_l(0) - vr_l(k, 0) * vort_l(2)) ;
546 secmem(f, k ) -= fac_f * n_f(f, 1)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 2) * vort_l(0) - vr_l(k, 0) * vort_l(2)) ;
547 secmem(f, n_l) += fac_f * n_f(f, 2)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 0) * vort_l(1) - vr_l(k, 1) * vort_l(0)) ;
548 secmem(f, k ) -= fac_f * n_f(f, 2)/fs(f) * out.Cl(n_l, k) * (vr_l(k, 0) * vort_l(1) - vr_l(k, 1) * vort_l(0)) ;
549 } // 100% explicit
550 }
551
552
553}
554
555
556void Correction_Lubchenko_PolyMAC_MPFA::ajouter_blocs_BIF(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl ) const
557{
558 const Domaine_PolyMAC_MPFA& domaine = ref_cast(Domaine_PolyMAC_MPFA, equation().domaine_dis());
559 const Probleme_base& pb = ref_cast(Probleme_base, equation().probleme());
560 const Navier_Stokes_std& eq_qdm = ref_cast(Navier_Stokes_std, pb.equation(0));
562 const DoubleTab& tab_rho = equation().probleme().get_champ("masse_volumique").passe();
563 const DoubleTab& tab_alp = equation().probleme().get_champ("alpha").passe();
564 const DoubleTab& d_bulles = equation().probleme().get_champ("diametre_bulles").valeurs();
565 const DoubleTab& y_elem = domaine.y_elem(),
566 &y_faces = domaine.y_faces();
567
568 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &xp = domaine.xp(), &xv = domaine.xv();
569 const DoubleVect& pe = equation().milieu().porosite_elem(), &ve = domaine.volumes(), &fs = domaine.face_surfaces(), &vf = domaine.volumes_entrelaces();
570 const DoubleTab& normales_f = domaine.face_normales();
571 const IntTab& voisins_f = domaine.face_voisins(), &e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
572
573 const Viscosite_turbulente_multiple& visc_turb = ref_cast(Viscosite_turbulente_multiple, Op_diff.correlation());
574
575 int N = pb.get_champ("vitesse").valeurs().dimension(1), D = dimension, nf_tot = domaine.nb_faces_tot(), nf = domaine.nb_faces(), ne_tot = domaine.nb_elem_tot() ;
576
577 // On recupere les tensions de reynolds des termes de BIF
578 DoubleTrav Rij(0, N, D, D);
579 MD_Vector_tools::creer_tableau_distribue(eq_qdm.pression().valeurs().get_md_vector(), Rij); //Necessary to compare size in reynolds_stress()
580 visc_turb.reynolds_stress_BIF(Rij);
581
582 DoubleTrav grad_Rij(0, N, D, D);
583 MD_Vector_tools::creer_tableau_distribue(eq_qdm.vitesse().valeurs().get_md_vector(), grad_Rij); //Necessary to exchange virtual elements after calculation of the gradient at the faces()
584
585 const Champ_Elem_PolyMAC_MPFA& ch_alpha = ref_cast(Champ_Elem_PolyMAC_MPFA, equation().probleme().get_champ("alpha")); // Champ alpha qui servira à obtenir les coeffs du gradient ; normalement toujours des CAL de Neumann ; terme source qui n'apparait qu'en multiphase
586 ch_alpha.init_grad(0); // Initialisation des tables fgrad_d, fgrad_e, fgrad_w qui dependent de la discretisation et du type de conditions aux limites --> pas de mises a jour necessaires
587 IntTab& fg_d = ch_alpha.fgrad_d, fg_e = ch_alpha.fgrad_e; // Tables utilisees dans domaine_PolyMAC_MPFA::fgrad pour le calcul du gradient
588 DoubleTab fg_w = ch_alpha.fgrad_w;
589
590 // On calcule le gradient de Rij aux faces
591 for (int n = 0; n < N; n++)
592 for (int f = 0; f < nf_tot; f++)
593 for (int d_i = 0; d_i <D ; d_i++)
594 for (int d_j = 0; d_j <D ; d_j++)
595 {
596 grad_Rij(f, n, d_i, d_j) = 0;
597 // grad_Rij(face, phase, x-coord, y-coord) or
598 // grad_Rij(nb_face_tot + dimension*element*gradient_component, phase, x-coord, y-coord)
599 for (int j = fg_d(f); j < fg_d(f+1) ; j++)
600 {
601 int e = fg_e(j);
602 int f_bord;
603 if ( (f_bord = e - ne_tot) < 0) //contribution d'un element
604 grad_Rij(f, n, d_i, d_j) += fg_w(j) * Rij(e, n, d_i, d_j);
605 else if ( (ch_alpha.fcl()(f_bord, 0) == 1) || (ch_alpha.fcl()(f_bord, 0) == 2)
606 || (ch_alpha.fcl()(f_bord, 0) == 3) || (ch_alpha.fcl()(f_bord, 0) == 6))
607 {
608 Process::exit("You must have a neumann limit condition on alpha for RIJ_BIF to work !");
609 }
610 }
611 }
612
613 // On interpole le gradient de Rij aux elements
614 for (int n = 0; n < N; n++)
615 for (int e = 0; e < ne_tot; e++)
616 for (int d_d=0 ; d_d<D ; d_d++) // on derive / d_d
617 for (int d_i = 0; d_i <D ; d_i++)
618 for (int d_j = 0; d_j <D ; d_j++)
619 {
620 grad_Rij(nf_tot + D *e + d_d, n, d_i, d_j) = 0;
621 for (int j = 0, f; j < e_f.dimension(1) && (f = e_f(e, j)) >= 0; j++)
622 grad_Rij(nf_tot + D *e + d_d, n, d_i, d_j) += (e == f_e(f, 0) ? 1 : -1) * fs(f) * (xv(f, d_d) - xp(e, d_d)) / ve(e) * grad_Rij(f, n, d_i, d_j);
623 }
624
625 // On calcule le second membre aux elements
626
627 for(int e = 0 ; e < ne_tot ; e++)
628 for(int n = 0; n<N ; n++)
629 for (int d_i = 0; d_i < D; d_i++)
630 {
631 // Find max value of d_bulles
632 double d_b_elem = 0;
633 for(int k = 0; k<N ; k++)
634 {
635 if (k!=n_l && d_bulles(e,k)>d_b_elem) d_b_elem = d_bulles(e,k);
636 }
637 // BIF correction in the near wall region
638 if (y_elem(e) < 0.5 * d_b_elem)
639 {
640 double secmem_en = 0;
641 for (int d_j = 0; d_j < D; d_j++)
642 secmem_en -= grad_Rij(nf_tot + D *e + d_j, n, d_i, d_j) ; // On annule la contribution de BIF sur la qdm lorsque la distance à la paroi y<0.5*d_bulles
643 secmem_en *= (-1) * pe(e) * ve(e) * tab_alp(e, n) * tab_rho(e, n) ; // For us, Rij = < u_i u_j >, therefore *(-1)
644 secmem(nf_tot + e*D + d_i, n) += secmem_en;
645 }
646 }
647
648
649 // On calcule le second membre aux faces
650
651 int e;
652
653 for(int f = 0 ; f < nf ; f++)
654 for(int n = 0; n<N ; n++)
655 for (int i = 0; i < 2 && (e = voisins_f(f, i)) >= 0; i++)
656 {
657 // Find max value of d_bulles
658 double d_b_face = 0;
659 for(int k = 0; k<N ; k++)
660 {
661 if (k!=n_l && d_bulles(e,k)>d_b_face) d_b_face = d_bulles(e,k);
662 }
663 // BIF correction in the near wall region
664 double d_b = vf_dir(f, i)/vf(f) * d_b_face ;
665 if (y_faces(f) < 0.5 * d_b)
666 {
667 DoubleTrav secmem_en(3); // Contains the vector of the divergence of R_ij at the face
668 secmem_en = 0;
669 for (int d_i = 0; d_i < D; d_i++)
670 for (int d_j = 0; d_j < D; d_j++)
671 {
672 secmem_en(d_i) -= grad_Rij(nf_tot + D *e + d_j, n, d_i, d_j) ;
673 }
674
675 for (int d_i = 0; d_i < D; d_i++)
676 secmem_en(d_i) *= (-1) * pe(e) * vf_dir(f, i) * tab_alp(e, n) * tab_rho(e, n);// For us, Rij = < u_i u_j >, therefore *(-1)
677 double flux_face = domaine.dot(&normales_f(f, 0), &secmem_en(0));
678 secmem(f, n) += flux_face;
679 }
680
681 }
682
683}
: class Champ_Elem_PolyMAC_MPFA
void init_grad(int full_stencil) const
: class Champ_Face_PolyMAC_MPFA
double v_norm(const DoubleTab &val, const DoubleTab &val_f, int e, int f, int k, int l, double *v_ext, double *dnv) const
const IntTab & fcl() const
const IntTab & fcl() const
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
virtual DoubleTab & passe(int i=1)
Definition Champ_Proto.h:50
classe Correction_Lubchenko_PolyMAC_MPFA Correction de répulsion en paroi de Lubchenko dans un ecoule...
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
void completer() override
Met a jour les references internes a l'objet Source_base.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
void ajouter_blocs_BIF(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const
void ajouter_blocs_disp(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const
void ajouter_blocs_lift(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const
classe Dispersion_bulles_base utilitaire pour les operateurs de dispersion turbulente ou la force
virtual void coefficient(const input_t &input, output_t &output) const =0
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Milieu_base & milieu() const =0
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
DoubleTab & get_sigma_tab()
double sigma(const double T, const double P) const
static void creer_tableau_distribue(const MD_Vector &, Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
transforme v en un tableau parallele ayant la structure md.
DoubleVect & porosite_elem()
Definition Milieu_base.h:58
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
DoubleVect & porosite_face()
Definition Milieu_base.h:62
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
bool has_interface(int k, int l) const
bool has_saturation(int k, int l) const
Interface_base & get_interface(int k, int l) const
Saturation_base & get_saturation(int k, int l) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
virtual const Champ_Inc_base & vitesse() const
const Operateur & operateur(int) const override
Renvoie le i-eme operateur de l'equation: - le terme_diffusif si i = 0.
Champ_Inc_base & pression()
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
: class Op_Diff_Turbulent_PolyMAC_MPFA_Face
const Correlation_base & correlation() const
virtual Operateur_base & l_op_base()=0
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
virtual Equation_base & equation_qdm()
virtual Equation_base & equation_energie()
int nb_phases() const
virtual Equation_base & equation_masse()
classe Portance_interfaciale_base utilitaire pour les operateurs de frottement interfacial prenant la...
virtual void coefficient(const input_t &input, output_t &output) const =0
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void creer_champ(const Motcle &motlu) override
const Champ_base & get_champ(const Motcle &nom) const override
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
virtual void get_sigma(const SpanD T, const SpanD P, SpanD sig, int ncomp=1, int ind=0) const final
Classe de base des flux de sortie.
Definition Sortie.h:52
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Definition Source_base.h:42
const Champ_base & get_champ(const Motcle &nom) const override
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
int line_size() const
Definition TRUSTVect.tpp:67
virtual const MD_Vector & get_md_vector() const
Definition TRUSTVect.h:123
classe Viscosite_turbulente_base correlations de viscosite turbulente decrivant le tenseur de Reynold...
classe Viscosite_turbulente_multiple Classe qui peut contenir plusieurs viscosites turbulentes pour f...
void reynolds_stress_BIF(DoubleTab &R_ij) const