TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Op_Evanescence_Homogene_PolyMAC_MPFA_Face.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 <Op_Evanescence_Homogene_PolyMAC_MPFA_Face.h>
17#include <Viscosite_turbulente_base.h>
18#include <Op_Grad_PolyMAC_MPFA_Face.h>
19#include <Champ_Face_PolyMAC_MPFA.h>
20#include <Champ_Elem_PolyMAC_MPFA.h>
21#include <Vitesse_relative_base.h>
22#include <Echange_impose_base.h>
23#include <Gravite_Multiphase.h>
24#include <Domaine_Cl_PolyMAC_family.h>
25#include <Domaine_PolyMAC_MPFA.h>
26#include <Milieu_composite.h>
27#include <Interface_base.h>
28#include <Neumann_paroi.h>
29#include <Pb_Multiphase.h>
30#include <Dirichlet.h>
31
32Implemente_instanciable(Op_Evanescence_Homogene_PolyMAC_MPFA_Face, "Op_Evanescence_HOMOGENE_PolyMAC_MPFA_Face", Op_Evanescence_Homogene_Face_base);
33
36
37void Op_Evanescence_Homogene_PolyMAC_MPFA_Face::dimensionner_blocs_aux(std::set<int>& idx, Stencil& sten, Matrice_Morse& mat ) const
38{
39 const Domaine_VF& domaine = ref_cast(Domaine_VF, equation().domaine_dis());
40 const Champ_Face_base& ch = ref_cast(Champ_Face_base, equation().inconnue());
41 const int nf_tot = domaine.nb_faces_tot(), D = dimension, N = ch.valeurs().line_size() ;
42 int i, l, e, d, n;
43 for (e = 0, l = nf_tot; e < domaine.nb_elem_tot(); e++)
44 for (d = 0; d < D; d++, l++, idx.clear())
45 {
46 for (i = N * l, n = 0; n < N; n++, i++)
47 for (auto j = mat.get_tab1()(i) - 1; j < mat.get_tab1()(i + 1) - 1; j++)
48 idx.insert(mat.get_tab2()(j) - 1);
49 for (i = N * l, n = 0; n < N; n++, i++)
50 for (auto &&c : idx)
51 sten.append_line(i, c);
52 }
53}
54
55void Op_Evanescence_Homogene_PolyMAC_MPFA_Face::ajouter_blocs_aux(IntTrav& maj, DoubleTrav coeff, matrices_t matrices, DoubleTab& secmem) const
56{
57 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
58 const bool res_en_T = pbm.resolution_en_T();
59 const Milieu_composite& milc = ref_cast(Milieu_composite, equation().milieu());
60 const Domaine_VF& domaine = ref_cast(Domaine_VF, equation().domaine_dis());
61 const Champ_Face_base& ch = ref_cast(Champ_Face_base, equation().inconnue());
62 const DoubleTab& inco = ch.valeurs(), &alpha = pbm.equation_masse().inconnue().passe(),
63 &rho = equation().milieu().masse_volumique().passe(),
64 &temp_ou_enth = pbm.equation_energie().inconnue().passe(),
65 &press = ref_cast(QDM_Multiphase, pbm.equation_qdm()).pression().passe(),
66 &mu = ref_cast(Milieu_composite, equation().milieu()).viscosite_dynamique().passe(),
67 *d_bulles = (equation().probleme().has_champ("diametre_bulles")) ? &equation().probleme().get_champ("diametre_bulles").valeurs() : nullptr,
68 *k_turb = (equation().probleme().has_champ("k")) ? &equation().probleme().get_champ("k").passe() : nullptr,
69 *gravity = (equation().probleme().has_champ("gravite")) ? &equation().probleme().get_champ("gravite").valeurs() : nullptr ;
70
71 const DoubleVect& dh_e = milc.diametre_hydraulique_elem();
72 int e, k, l, n, m, N = inco.line_size(), Nk = (k_turb) ? (*k_turb).line_size() : 0, D = dimension, nf_tot = domaine.nb_faces_tot(), cR = (rho.dimension_tot(0) == 1), cM = (mu.dimension_tot(0) == 1), Np = press.line_size();
73 double a_eps = alpha_res_, a_eps_min = alpha_res_min_, a_m, a_max; //threshold for triggering the evanescence treatment
74 Matrice_Morse& mat_diag = *matrices.at(ch.le_nom().getString());
75
76 if (N == 1) return; //no evanescence in single-phase flow!
77
78 DoubleTab dvr_elem(domaine.nb_elem_tot()*dimension, N, N, N); // Derivative of vr(n,k) at element e with respect to phase l along direction d; currently always along d2=d
79 // We carry this around because the loop over matrices was separated from the loop over secmem
80
81
82 /* computation of the drift velocity: we fetch the required intermediate quantities */
85 out.vr.resize(N, N, D), out.dvr.resize(N, N, D, N*D);
86 const Vitesse_relative_base* correlation_vd = pbm.has_correlation("vitesse_relative") ? &ref_cast(Vitesse_relative_base, pbm.get_correlation("vitesse_relative")) : nullptr;
87 DoubleTab gradAlpha, vort, nut;
88 const int is_turb = ref_cast(Operateur_Diff_base, ref_cast(QDM_Multiphase, pbm.equation_qdm()).operateur_diff().l_op_base()).is_turb();
89 if (correlation_vd)
90 {
91 in.alpha.resize(N), in.rho.resize(N), in.mu.resize(N), in.d_bulles.resize(N), in.k.resize(N), in.nut.resize(N), in.v.resize(D, N), in.sigma.resize(N*(N-1)/2), in.g.resize(D);
92 if (correlation_vd->needs_grad_alpha())
93 {
94 gradAlpha.resize(domaine.nb_elem_tot(), D, N);
95 calc_grad_alpha_elem(gradAlpha);
96 in.gradAlpha.resize(D, N);
97 }
98 if (correlation_vd->needs_vort())
99 {
100 vort.resize(domaine.nb_elem_tot(), D, N);
101 calc_vort_elem(vort);
102 in.vort.resize(D, N);
103 }
104 if (is_turb)
105 {
106 nut.resize(domaine.nb_elem_tot(), N);
107 ref_cast(Viscosite_turbulente_base, (*ref_cast(Operateur_Diff_base, equation().operateur(0).l_op_base()).correlation_viscosite_turbulente())).eddy_viscosity(nut); //filled by the correlation
108 }
109 }
110 for (e = 0; e < domaine.nb_elem_tot(); e++) /* elements: must be done D times per element */
111 {
112 /* majority phase: directly in the element */
113 for (a_max = 0, k = -1, n = 0; n < N; n++)
114 if ((a_m = alpha(e, n)) > a_max) k = n, a_max = a_m;
115 if (k >= 0)
116 for (int i = nf_tot + D * e, d = 0; d < D; d++, i++) maj(i) = k;
117 else abort();
118
119 /* computation of the drift velocity */
120 if (correlation_vd)
121 {
122 in.dh = dh_e(e) ;
123 for (n = 0; n < N; n++)
124 {
125 in.alpha(n) = alpha(e, n);
126 in.rho(n) = rho(!cR * e, n);
127 in.mu(n) = mu(!cM * e, n);
128 in.d_bulles(n) = (d_bulles) ? (*d_bulles)(e, n) : -1. ;
129 for (int d = 0; d < D; d++) in.v(d, n) = inco(nf_tot + D * e + d, n);
130 for (m = n+1; m < N; m++)
131 if (milc.has_interface(n, m))
132 {
133 const int ind_trav = (n*(N-1)-(n-1)*(n)/2) + (m-n-1); // yes !! upper triangular matrix !
134 Interface_base& sat = milc.get_interface(n, m);
135 in.sigma(ind_trav) = res_en_T ? sat.sigma(temp_ou_enth(e, n), press(e, n * (Np > 1))) : sat.sigma_h(temp_ou_enth(e, n), press(e, n * (Np > 1)));
136 }
137 }
138 for (n = 0; n < Nk; n++) in.k(n) = (k_turb) ? (*k_turb)(e, n) : -1., in.nut(n) = (is_turb) ? nut(e, n) : -1. ;
139 for (int d = 0; d < D; d++) in.g(d) = (*gravity)(e,d);
140 if (correlation_vd->needs_grad_alpha())
141 for (n = 0; n < N; n++)
142 for (int d = 0; d < D; d++) in.gradAlpha(d, n) = gradAlpha(e, d, n);
143 if (correlation_vd->needs_vort())
144 for (n = 0; n < N; n++)
145 for (int d = 0; d < D; d++) in.vort(d, n) = vort(e, d, n);
146
147 correlation_vd->vitesse_relative(in, out);
148 }
149
150 /* evanescence coefficient */
151 int i,d;
152 for (i = nf_tot + D * e, d = 0; d < D; d++, i++)
153 for (n = 0; n < N; n++)
154 if (n != k && (a_m = alpha(e, n)) < a_eps)
155 {
156 coeff(i, n, 1) = mat_diag(N * i + k, N * i + k) * (coeff(i, n, 0) = std::min(std::max((a_eps - a_m) / (a_eps - a_eps_min), 0.), 1.));
157 for (l=0 ; l<N ; l++) dvr_elem(D*e+d, n, k, l) = out.dvr(n, k, d, l*D+d) ;
158 double flux = coeff(i, n, 0) * secmem(i, n) + coeff(i, n, 1) * (inco(i, n) - inco(i, k) - out.vr(n, k, d));
159 secmem(i, k) += flux, secmem(i, n) -= flux;
160 }
161 }
162
163 /* matrix rows */
164 for (auto &&n_m: matrices)
165 if (n_m.second->nb_colonnes())
166 {
167 int diag = (n_m.first == ch.le_nom().getString()); //are we on the diagonal block?
168 Matrice_Morse& mat = *n_m.second;
169 auto type(mat.get_tab1()(0));
170 for (e = 0, l = nf_tot; e < domaine.nb_elem_tot(); e++) /* elements: l is the row index */
171 for (int d = 0; d < D; d++, l++)
172 for (n = 0; n < N; n++)
173 if (coeff(l, n, 0))
174 {
175 auto i(type);
176 auto j(type);
177 for (k = maj(l), i = mat.get_tab1()(N * l + n) - 1, j = mat.get_tab1()(N * l + k) - 1;
178 i < mat.get_tab1()(N * l + n + 1) - 1; i++, j++)
179 {
180 assert(mat.get_tab2()(i) == mat.get_tab2()(j));
181 int c = diag * mat.get_tab2()(i) -
182 1; //column index (shared by both rows thanks to dimensionner_blocs())
183 mat.get_set_coeff()(j) += coeff(l, n, 0) * mat.get_set_coeff()(i) -
184 coeff(l, n, 1) * ((c == N * l + n) - (c == N * l + k));
185 mat.get_set_coeff()(i) += -coeff(l, n, 0) * mat.get_set_coeff()(i) +
186 coeff(l, n, 1) * ((c == N * l + n) - (c == N * l + k));
187
188 mat.get_set_coeff()(j) += -coeff(l, n, 1) *
189 (-dvr_elem(D * e + d, n, k, n) * (c == N * l + n) -
190 dvr_elem(D * e + d, n, k, k) * (c == N * l + k));
191 mat.get_set_coeff()(i) += +coeff(l, n, 1) *
192 (-dvr_elem(D * e + d, n, k, n) * (c == N * l + n) -
193 dvr_elem(D * e + d, n, k, k) * (c == N * l + k));
194 }
195 }
196 }
197}
198
200{
201 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
202 const Domaine_VF& domaine = ref_cast(Domaine_VF, equation().domaine_dis());
203 const DoubleTab& alpha = pbm.equation_masse().inconnue().passe();
204 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
205 const DoubleVect& fs = domaine.face_surfaces(), &ve = domaine.volumes();
206 const DoubleTab& xp = domaine.xp(), &xv = domaine.xv();
207
208 int N = alpha.line_size(), D = dimension, nf_tot = domaine.nb_faces_tot(), ne_tot = domaine.nb_elem_tot();;
209
210 /* calculation of the gradient of alpha at the face */
212 DoubleTrav grad_f_a(nf_tot, N);
213 ch_a.init_grad(0);
214 const IntTab& fg_d = ch_a.fgrad_d, &fg_e = ch_a.fgrad_e; // Tables used in domaine_PolyMAC_MPFA::fgrad for gradient computation
215 const DoubleTab& fg_w = ch_a.fgrad_w;
216 const Conds_lim& cls_a = ch_a.domaine_Cl_dis().les_conditions_limites(); // boundary conditions of the alpha field
217 const IntTab& fcl_a = ch_a.fcl(); // utility arrays for BCs: fcl(f, .) = (BC type, BC index, index within BC)
218
219 for (int n = 0; n < N; n++)
220 for (int f = 0; f < nf_tot; f++)
221 {
222 grad_f_a(f, n) = 0;
223 for (int j = fg_d(f); j < fg_d(f+1) ; j++)
224 {
225 int e = fg_e(j);
226 int f_bord;
227 if ( (f_bord = e-ne_tot) < 0) //element contribution
228 grad_f_a(f, n) += fg_w(j) * alpha(e, n);
229 else if (fcl_a(f_bord, 0) == 1 || fcl_a(f_bord, 0) == 2) //Echange_impose_base
230 grad_f_a(f, n) += fg_w(j) ? fg_w(j) * ref_cast(Echange_impose_base, cls_a[fcl_a(f_bord, 1)].valeur()).T_ext(fcl_a(f_bord, 2), n) : 0;
231 else if (fcl_a(f_bord, 0) == 4) //non-homogeneous Neumann
232 grad_f_a(f, n) += fg_w(j) ? fg_w(j) * ref_cast(Neumann_paroi , cls_a[fcl_a(f_bord, 1)].valeur()).flux_impose(fcl_a(f_bord, 2), n) : 0;
233 else if (fcl_a(f_bord, 0) == 6) // Dirichlet
234 grad_f_a(f, n) += fg_w(j) * ref_cast(Dirichlet, cls_a[fcl_a(f_bord, 1)].valeur()).val_imp(fcl_a(f_bord, 2), n);
235 }
236 }
237
238 /* Compute the gradient at elements */
239 for (int n = 0; n < N; n++)
240 for (int e = 0; e < ne_tot; e++)
241 for (int d = 0; d < D; d++)
242 {
243 gradAlphaElem(e, d, n) = 0 ;
244 for (int j = 0, f; j < e_f.dimension(1) && (f = e_f(e, j)) >= 0; j++)
245 gradAlphaElem(e, d, n) += (e == f_e(f, 0) ? 1 : -1) * fs(f) * (xv(f, d) - xp(e, d)) / ve(e) * grad_f_a(f, n);
246 }
247}
248
250{
251 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, equation().probleme());
252 const Domaine_VF& domaine = ref_cast(Domaine_VF, equation().domaine_dis());
253 const DoubleTab& alpha = pbm.equation_masse().inconnue().passe();
254 const DoubleTab& n_f = domaine.face_normales(), &vf_dir = domaine.volumes_entrelaces_dir();
255 const DoubleVect& vf = domaine.volumes_entrelaces(), &fs = domaine.face_surfaces(), &ve = domaine.volumes();
256 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
257 const DoubleTab& xp = domaine.xp(), &xv = domaine.xv();
258
259 int N = alpha.line_size(), D = dimension, ne_tot = domaine.nb_elem_tot(), nf_tot = domaine.nb_faces_tot(), nf = domaine.nb_faces();
260
261 DoubleTrav gradAlphaElem(ne_tot, D, N);
262
263 /* calculation of the gradient of alpha at the face */
265 DoubleTrav grad_f_a(nf_tot, N);
266 ch_a.init_grad(0);
267 const IntTab& fg_d = ch_a.fgrad_d, &fg_e = ch_a.fgrad_e; // Tables used in domaine_PolyMAC_MPFA::fgrad for gradient computation
268 const DoubleTab& fg_w = ch_a.fgrad_w;
269 const Conds_lim& cls_a = ch_a.domaine_Cl_dis().les_conditions_limites(); // boundary conditions of the alpha field
270 const IntTab& fcl_a = ch_a.fcl(); // utility arrays for BCs: fcl(f, .) = (BC type, BC index, index within BC)
271
272 for (int n = 0; n < N; n++)
273 for (int f = 0; f < nf_tot; f++)
274 {
275 grad_f_a(f, n) = 0;
276 for (int j = fg_d(f); j < fg_d(f+1) ; j++)
277 {
278 int e = fg_e(j);
279 int f_bord;
280 if ( (f_bord = e-ne_tot) < 0) //element contribution
281 grad_f_a(f, n) += fg_w(j) * alpha(e, n);
282 else if (fcl_a(f_bord, 0) == 1 || fcl_a(f_bord, 0) == 2) //Echange_impose_base
283 grad_f_a(f, n) += fg_w(j) ? fg_w(j) * ref_cast(Echange_impose_base, cls_a[fcl_a(f_bord, 1)].valeur()).T_ext(fcl_a(f_bord, 2), n) : 0;
284 else if (fcl_a(f_bord, 0) == 4) //non-homogeneous Neumann
285 grad_f_a(f, n) += fg_w(j) ? fg_w(j) * ref_cast(Neumann_paroi , cls_a[fcl_a(f_bord, 1)].valeur()).flux_impose(fcl_a(f_bord, 2), n) : 0;
286 else if (fcl_a(f_bord, 0) == 6) // Dirichlet
287 grad_f_a(f, n) += fg_w(j) * ref_cast(Dirichlet, cls_a[fcl_a(f_bord, 1)].valeur()).val_imp(fcl_a(f_bord, 2), n);
288 }
289 }
290
291 /* Compute the gradient at elements */
292 for (int n = 0; n < N; n++)
293 for (int e = 0; e < ne_tot; e++)
294 for (int d = 0; d < D; d++)
295 for (int j = 0, f; j < e_f.dimension(1) && (f = e_f(e, j)) >= 0; j++)
296 gradAlphaElem(e, d, n) += (e == f_e(f, 0) ? 1 : -1) * fs(f) * (xv(f, d) - xp(e, d)) / ve(e) * grad_f_a(f, n);
297
298 /* Compute the vector gradient at faces */
299 double scalGradElem=0.;
300 int c, e;
301 for (int n = 0; n < N; n++)
302 for (int f = 0; f < nf; f++)
303 {
304 for (c=0 ; c<2 && (e = f_e(f, c)) >= 0; c++)
305 for (int d = 0; d < D; d++)
306 gradAlphaFaces(f, d, n) += vf_dir(f, c)/vf(f)*gradAlphaElem(e, d, n);
307 scalGradElem=0;
308 for (int d = 0; d < D; d++)
309 scalGradElem += gradAlphaFaces(f, d, n)*n_f(f,d)/fs(f);
310 for (int d = 0; d < D; d++)
311 gradAlphaFaces(f, d, n) += (grad_f_a(f, n) - scalGradElem)*n_f(f,d)/fs(f);
312 }
313}
314
316{
317 const DoubleTab& vorticite = equation().probleme().get_champ("vorticite").valeurs();
318 int D = dimension, N = vort.dimension_tot(2), ne_tot = vort.dimension_tot(0);
319 int e, n, d ;
320
321 if (D == 2)
322 {
323 for (e = 0; e < ne_tot; e++)
324 for (n = 0; n < N; n++)
325 for (d = 0; d < D; d++)
326 vort(e, d, n) = vorticite(e, n);
327 }
328 else
329 {
330 for (e = 0; e < ne_tot; e++)
331 for (n = 0; n < N; n++)
332 for (d = 0; d < D; d++)
333 vort(e, d, n) = vorticite(e, N * d + n);
334 }
335}
: class Champ_Elem_PolyMAC_MPFA
void init_grad(int full_stencil) const
const IntTab & fcl() const
DoubleTab & passe(int i=1) override
Returns field values at instant t-i.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
virtual DoubleTab & passe(int i=1)
Definition Champ_Proto.h:50
class Conds_lim This class represents a vector of boundary conditions.
Definition Conds_lim.h:32
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
Definition Dirichlet.h:31
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_VF
Definition Domaine_VF.h:44
Echange_impose_base: This boundary condition is used only for the energy equation.
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
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Returns the problem associated with the equation.
const Nom & le_nom() const override
Returns the name of the field.
double sigma_h(const double h, const double P) const
double sigma(const double T, const double P) const
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const auto & get_tab2() const
const auto & get_tab1() const
auto & get_set_coeff()
virtual const Champ_base & masse_volumique() const
Returns the mass density of the medium (const version).
DoubleTab & diametre_hydraulique_elem()
Definition Milieu_base.h:70
Composite medium representing a multiphase fluid and its properties:
bool has_interface(int k, int l) const
Interface_base & get_interface(int k, int l) const
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
Classe Neumann_paroi This boundary condition corresponds to an imposed flux for the.
const std::string & getString() const
Definition Nom.h:92
static int dimension
Definition Objet_U.h:94
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
Manages evanescence in a face-based equation (-> QDM).
void ajouter_blocs_aux(IntTrav &, DoubleTrav, matrices_t, DoubleTab &) const override
void dimensionner_blocs_aux(std::set< int > &, Stencil &, Matrice_Morse &) const override
Operateur_Diff_base This class is the base of the hierarchy of operators representing.
Multiphase thermohydraulics problem of type "3*N equations":
virtual bool resolution_en_T() const
virtual Equation_base & equation_qdm()
virtual Equation_base & equation_energie()
virtual Equation_base & equation_masse()
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
const Champ_base & get_champ(const Motcle &nom) const override
int has_correlation(std::string nom_correlation) const
const Correlation_base & get_correlation(std::string nom_correlation) const
static void abort()
Abort routine for TRUST on a fatal error.
Definition Process.cpp:573
Carries the terms of the momentum equation for multiphase flow without turbulence modelling.
Base class for output streams.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
void append_line(_TYPE_)
Definition TRUSTTab.tpp:213
int line_size() const
Definition TRUSTVect.tpp:67
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
Turbulent viscosity correlations describing the Reynolds stress tensor R_{ij} = - <u'_i u'_j>.
Relative velocity correlations of the form ur = (v_k - v_l).
virtual bool needs_grad_alpha() const
virtual bool needs_vort() const
virtual void vitesse_relative(const input_t &input, output_t &output) const =0