TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Op_Diff_PolyMAC_CDO_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 <Modele_turbulence_hyd_base.h>
17#include <Op_Diff_PolyMAC_CDO_Face.h>
18#include <Domaine_Cl_PolyMAC_family.h>
19#include <Champ_Face_PolyMAC_CDO.h>
20#include <Domaine_PolyMAC_CDO.h>
21#include <TRUSTTab_parts.h>
22#include <Probleme_base.h>
23#include <Synonyme_info.h>
24#include <Matrix_tools.h>
25#include <Array_tools.h>
26#include <TRUSTLists.h>
27#include <Dirichlet.h>
28#include <EChaine.h>
29
30Implemente_instanciable_sans_constructeur( Op_Diff_PolyMAC_CDO_Face,"Op_Diff_PolyMAC_CDO_Face|Op_Dift_PolyMAC_CDO_Face_PolyMAC_CDO", Op_Diff_PolyMAC_CDO_base );
31Add_synonym(Op_Diff_PolyMAC_CDO_Face, "Op_Diff_PolyMAC_CDO_var_Face");
32Add_synonym(Op_Diff_PolyMAC_CDO_Face, "Op_Dift_PolyMAC_CDO_var_Face_PolyMAC_CDO");
33
35
37
42
44{
46 if (polymac_flica5)
47 {
48 bool flag = Process::nproc() == 1 && le_dom_poly_->nb_faces() < 10000;
49 // For small matrices, LU PETSc is faster than GMRES/ILU(0) or MUMPS
50 EChaine chl(flag ? "Petsc Cholesky_lapack { quiet }" : "Petsc gmres { precond block_jacobi_ilu { level 0 } quiet rtol 1.e-14 }");
51 lire_solveur(chl);
52 solveur.nommer("Op_Diff_PolyMAC_CDO_Face solver");
53 }
54
55 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
56 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
57
58 if (domaine.domaine().nb_joints() && domaine.domaine().joint(0).epaisseur() < 1)
59 Cerr << "Op_Diff_PolyMAC_CDO_Face : largeur de joint insuffisante (minimum 1)!" << finl, Process::exit();
60
61 ch.init_ra();
62 domaine.init_rf();
63 domaine.init_m1();
64 domaine.init_m2();
65
66 if (polymac_flica5)
67 porosite_e.ref(mon_equation->milieu().porosite_elem());
68
69 if (que_suis_je() == "Op_Diff_PolyMAC_CDO_Face") return;
70
71 const RefObjU& modele_turbulence = equation().get_modele(TURBULENCE);
72 const Modele_turbulence_hyd_base& mod_turb = ref_cast(Modele_turbulence_hyd_base, modele_turbulence.valeur());
73 const Champ_Fonc_base& alpha_t = mod_turb.viscosite_turbulente();
75}
76
78{
79 if (polymac_flica5)
80 {
81 dimensionner_bloc(mat, -1);
82 return;
83 }
84 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
85 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
86 const IntTab& e_f = domaine.elem_faces();
87 const int nf_tot = domaine.nb_faces_tot(), na_tot = dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot();
88
89 domaine.init_m2();
90
91 Stencil stencil(0, 2);
92
93 //velocity part: m2 Rf
94 for (int e = 0; e < domaine.nb_elem_tot(); e++)
95 {
96 int idx = 0;
97 for (int i = domaine.m2d(e); i < domaine.m2d(e + 1); i++, idx++)
98 {
99 const int f = e_f(e, idx);
100 for (int j = domaine.m2i(i); f < domaine.nb_faces() && ch.fcl()(f, 0) < 2 && j < domaine.m2i(i + 1); j++)
101 {
102 const int fb = e_f(e, domaine.m2j(j));
103 for (int k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
104 stencil.append_line(f, nf_tot + domaine.rfji(k));
105 }
106 }
107 }
108
109 //vorticity part: Ra m2 - m1 / nu
110 for (int a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
111 {
112 for (int i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
113 stencil.append_line(nf_tot + a, ch.raji(i));
114
115 for (int i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
116 stencil.append_line(nf_tot + a, nf_tot + domaine.m1ji(i, 0));
117 }
118
119 tableau_trier_retirer_doublons(stencil);
120 Matrix_tools::allocate_morse_matrix(nf_tot + na_tot, nf_tot + na_tot, stencil, mat);
121}
122
124{
125 /*
126 0 | 1
127 ---+---
128 2 | 3
129 */
130
131 if (p > 3 || p < -1)
132 Process::exit("Op_Diff_PolyMAC_CDO_Face::dimensionner_bloc : invalid bloc number! p must be in [-1, 3]");
133
134 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
135 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
136 const IntTab& e_f = domaine.elem_faces();
137 int i, j, k, a, e, f, fb, nf_tot = domaine.nb_faces_tot(), na_tot = dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot(), idx;
138
139 domaine.init_m2();
140
141 Stencil stencil(0, 2);
142 VECT(Stencil) sp(4);
143 for (int q = 0; q < 4; q++)
144 {
145 sp[q].resize(0, 2);
146 }
147
148 //velocity part: m2 Rf
149 for (e = 0; e < domaine.nb_elem_tot(); e++)
150 for (i = domaine.m2d(e), idx = 0; i < domaine.m2d(e + 1); i++, idx++)
151 for (f = e_f(e, idx), j = domaine.m2i(i); f < domaine.nb_faces() && ch.fcl()(f, 0) < 2 && j < domaine.m2i(i + 1); j++)
152 for (fb = e_f(e, domaine.m2j(j)), k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
153 {
154 stencil.append_line(f, nf_tot + domaine.rfji(k));
155 sp[1].append_line(f, nf_tot + domaine.rfji(k));
156 }
157
158 //vorticity part: Ra m2 - m1 / nu
159 for (a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
160 {
161 for (i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
162 {
163 stencil.append_line(nf_tot + a, ch.raji(i));
164 sp[2].append_line(a, ch.raji(i));
165 }
166 for (i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
167 {
168 stencil.append_line(nf_tot + a, nf_tot + domaine.m1ji(i, 0));
169 sp[3].append_line(a, domaine.m1ji(i, 0));
170 }
171 }
172
173 if (p == -1)
174 {
175 tableau_trier_retirer_doublons(stencil);
176 Matrix_tools::allocate_morse_matrix(nf_tot + na_tot, nf_tot + na_tot, stencil, mat);
177 }
178 else
179 {
180 tableau_trier_retirer_doublons(sp[p]);
181 const int nx = (p <= 1) ? nf_tot : na_tot;
182 const int ny = (p == 0 || p == 2) ? nf_tot : na_tot;
183 Matrix_tools::allocate_morse_matrix(nx, ny, sp[p], mat);
184 }
185}
186
191
192static Matrice_Morse AF, AA;
194{
195 if (!polymac_flica5) return;
196
197 if (AF.nb_lignes() == 0)
198 {
199 dimensionner_bloc(AF, 2);
200 dimensionner_bloc(AA, 3);
201 }
202 else
203 {
204 AF.clean();
205 AA.clean();
206 }
207
208 DoubleTab sm(inco);
209 sm = 0.;
210 DoubleTab_parts inco_parts(inco);
211 DoubleTab_parts sm_parts(sm);
212
213 contribuer_a_avec(inco, AF);
214 contribuer_a_avec(inco, AA);
215
216 AF *= -1.;
217 AF.ajouter_multvect(inco_parts[0], sm_parts[1]);
218 if (AA.is_diagonal())
219 {
220 const int n = AA.nb_lignes();
221 for (int i = 0; i < n; i++)
222 for (auto k = AA.get_tab1()(i) - 1; k < AA.get_tab1()(i + 1) - 1; k++)
223 inco_parts[1][i] = sm_parts[1][i] / AA.get_coeff()(k);
224 inco_parts[1].echange_espace_virtuel();
225 }
226 else
227 {
228 set_solveur()->reinit();
229 inco_parts[1] = 0.;
230 set_solveur().resoudre_systeme(AA, sm_parts[1], inco_parts[1]);
231 }
232}
233
234inline DoubleTab& Op_Diff_PolyMAC_CDO_Face::ajouter(const DoubleTab& inco, DoubleTab& resu) const
235{
236 if (polymac_flica5)
237 {
238 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
239 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
240 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
241 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
242 const DoubleVect& pe = porosite_e, &ve = domaine.volumes();
243 int i, j, k, e, f, fb, a, nf_tot = domaine.nb_faces_tot(), idx;
244
245 update_nu();
246 //velocity part: m2 Rf
247 for (e = 0; e < domaine.nb_elem_tot(); e++)
248 for (i = domaine.m2d(e), idx = 0; i < domaine.m2d(e + 1); i++, idx++)
249 for (f = e_f(e, idx), j = domaine.m2i(i); f < domaine.nb_faces() && j < domaine.m2i(i + 1); j++)
250 for (fb = e_f(e, domaine.m2j(j)), k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
251 resu(f) -= domaine.m2c(j) * ve(e) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * pe(e) * domaine.rfci(k) * inco(nf_tot + domaine.rfji(k));
252
253 //vorticity part: Ra m2 - m1 / nu
254 if (resu.dimension_tot(0) == nf_tot)
255 return resu; //resu contains only the "faces" part
256 for (a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
257 {
258 //curl: internal velocities
259 for (i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
260 resu(nf_tot + a) -= ch.raci(i) * inco(ch.raji(i));
261 //curl: boundary velocities
262 for (i = ch.radeb(a, 1); i < ch.radeb(a + 1, 1); i++)
263 for (k = 0; k < dimension; k++)
264 resu(nf_tot + a) -= ch.racf(i, k) * ref_cast(Dirichlet, cls[ch.fcl()(ch.rajf(i), 1)].valeur()).val_imp(ch.fcl()(ch.rajf(i), 2), k);
265 // -m1 / nu
266 for (i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
267 resu(nf_tot + a) += domaine.m1ci(i) / (pe(domaine.m1ji(i, 1)) * nu_(domaine.m1ji(i, 1), 0)) * inco(nf_tot + domaine.m1ji(i, 0));
268 }
269 return resu;
270 }
271
272 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
273 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
274 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
275 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
276 const DoubleVect& pe = equation().milieu().porosite_elem(), &ve = domaine.volumes();
277 const int nf_tot = domaine.nb_faces_tot();
278
279 update_nu();
280
281 //velocity part: m2 Rf
282 for (int e = 0; e < domaine.nb_elem_tot(); e++)
283 {
284 int idx = 0;
285 for (int i = domaine.m2d(e); i < domaine.m2d(e + 1); i++, idx++)
286 {
287 const int f = e_f(e, idx);
288
289 for (int j = domaine.m2i(i); j < domaine.m2i(i + 1); j++)
290 if (f < domaine.nb_faces() && ch.fcl()(f, 0) < 2)
291 {
292 const int fb = e_f(e, domaine.m2j(j));
293
294 for (int k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
295 resu(f) -= domaine.m2c(j) * ve(e) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * pe(e) * domaine.rfci(k) * inco(nf_tot + domaine.rfji(k));
296 }
297 }
298 }
299
300 //vorticity part: Ra m2 - m1 / nu
301 if (resu.dimension_tot(0) == nf_tot)
302 return resu; //resu contains only the faces part
303
304 /* loop over edges */
305 for (int a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
306 {
307 //curl: internal velocities
308 for (int i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
309 resu(nf_tot + a) -= ch.raci(i) * inco(ch.raji(i));
310
311 //curl: boundary velocities
312 for (int i = ch.radeb(a, 1); i < ch.radeb(a + 1, 1); i++)
313 for (int k = 0; k < dimension; k++)
314 resu(nf_tot + a) -= ch.racf(i, k) * ref_cast(Dirichlet, cls[ch.fcl()(ch.rajf(i), 1)].valeur()).val_imp(ch.fcl()(ch.rajf(i), 2), k);
315
316 // -m1 / nu
317 for (int i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
318 resu(nf_tot + a) += domaine.m1ci(i) / (pe(domaine.m1ji(i, 1)) * nu_(domaine.m1ji(i, 1), 0)) * inco(nf_tot + domaine.m1ji(i, 0));
319 }
320 return resu;
321}
322
323void Op_Diff_PolyMAC_CDO_Face::contribuer_a_avec(const DoubleTab& inco, Matrice_Morse& matrice) const
324{
325 if (polymac_flica5)
326 {
327 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
328 const int nf_tot = domaine.nb_faces_tot(), na_tot = dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot();
329
330 int i = -1;
331 if (matrice.nb_lignes() == nf_tot && matrice.nb_colonnes() == nf_tot)
332 i = 0;
333 if (matrice.nb_lignes() == nf_tot && matrice.nb_colonnes() == na_tot)
334 i = 1;
335 if (matrice.nb_lignes() == na_tot && matrice.nb_colonnes() == nf_tot)
336 i = 2;
337 if (matrice.nb_lignes() == na_tot && matrice.nb_colonnes() == na_tot)
338 i = 3;
339 contribuer_bloc(inco, matrice, i);
340 return;
341 }
342
343 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
344 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
345 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
346 const DoubleVect& pe = equation().milieu().porosite_elem(), &ve = domaine.volumes();
347 const int nf_tot = domaine.nb_faces_tot();
348
349 update_nu();
350
351 //velocity part: m2 Rf
352 for (int e = 0; e < domaine.nb_elem_tot(); e++)
353 {
354 int idx = 0;
355
356 for (int i = domaine.m2d(e); i < domaine.m2d(e + 1); i++, idx++)
357 {
358 const int f = e_f(e, idx);
359
360 for (int j = domaine.m2i(i); j < domaine.m2i(i + 1); j++)
361 if (f < domaine.nb_faces() && ch.fcl()(f, 0) < 2)
362 {
363 const int fb = e_f(e, domaine.m2j(j));
364
365 for (int k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
366 matrice(f, nf_tot + domaine.rfji(k)) += domaine.m2c(j) * ve(e) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * pe(e) * domaine.rfci(k);
367 }
368 }
369 }
370
371 //vorticity part: Ra m2 - m1 / nu
372 for (int a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
373 {
374 //curl: internal velocities
375 for (int i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
376 {
377 const int f = ch.raji(i);
378
379 if (ch.fcl()(f, 0) < 2)
380 matrice(nf_tot + a, f) += ch.raci(i);
381 }
382
383 // -m1 / nu
384 for (int i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
385 matrice(nf_tot + a, nf_tot + domaine.m1ji(i, 0)) -= domaine.m1ci(i) / (pe(domaine.m1ji(i, 1)) * nu_(domaine.m1ji(i, 1), 0));
386 }
387}
388
389void Op_Diff_PolyMAC_CDO_Face::contribuer_bloc(const DoubleTab& inco, Matrice_Morse& matrice, const int ip) const
390{
391 if (ip > 3 || ip < -1)
392 Process::exit("Op_Diff_PolyMAC_CDO_Elem::contribuer_bloc : invalid bloc number! p must be in [-1, 3]");
393
394 const Domaine_PolyMAC_CDO& domaine = le_dom_poly_.valeur();
395 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces();
396 const Champ_Face_PolyMAC_CDO& ch = ref_cast(Champ_Face_PolyMAC_CDO, equation().inconnue());
397 const DoubleVect& pe = porosite_e, &ve = domaine.volumes();
398 int i, j, k, e, f, fb, a, nf_tot = domaine.nb_faces_tot(), idx;
399
400 update_nu();
401 //velocity part: m2 Rf
402 for (e = 0; e < domaine.nb_elem_tot(); e++)
403 for (i = domaine.m2d(e), idx = 0; i < domaine.m2d(e + 1); i++, idx++)
404 for (f = e_f(e, idx), j = domaine.m2i(i); f < domaine.nb_faces() && ch.fcl()(f, 0) < 2 && j < domaine.m2i(i + 1); j++)
405 for (fb = e_f(e, domaine.m2j(j)), k = domaine.rfdeb(fb); k < domaine.rfdeb(fb + 1); k++)
406 {
407 if (ip == -1)
408 matrice(f, nf_tot + domaine.rfji(k)) += domaine.m2c(j) * ve(e) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * pe(e) * domaine.rfci(k);
409 else if (ip == 1)
410 matrice(f, domaine.rfji(k)) += domaine.m2c(j) * ve(e) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * pe(e) * domaine.rfci(k);
411 }
412
413 //vorticity part: Ra m2 - m1 / nu
414 for (a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
415 {
416 //curl: internal velocities
417 for (i = ch.radeb(a, 0); i < ch.radeb(a + 1, 0); i++)
418 if ((ch.fcl()(f = ch.raji(i), 0) < 2) || ip > -1)
419 {
420 if (ip == -1)
421 matrice(nf_tot + a, f) += ch.raci(i);
422 else if (ip == 2)
423 matrice(a, f) += ch.raci(i);
424 }
425 // -m1 / nu
426 for (i = domaine.m1deb(a); i < domaine.m1deb(a + 1); i++)
427 {
428 if (ip == -1)
429 matrice(nf_tot + a, nf_tot + domaine.m1ji(i, 0)) -= domaine.m1ci(i) / (pe(domaine.m1ji(i, 1)) * nu_(domaine.m1ji(i, 1), 0));
430 else if (ip == 3)
431 matrice(a, domaine.m1ji(i, 0)) -= domaine.m1ci(i) / (pe(domaine.m1ji(i, 1)) * nu_(domaine.m1ji(i, 1), 0));
432 }
433 }
434}
const IntTab & fcl() const
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
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
int nb_faces_tot() const
Returns the total number of faces.
Definition Domaine_VF.h:481
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
An input stream whose source is a character string.
Definition EChaine.h:31
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 RefObjU & get_modele(Type_modele type) const
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
int nb_lignes() const override
Return local number of lines (=size on the current proc).
static void allocate_morse_matrix(const int nb_lines, const int nb_columns, const Stencil &stencil, Matrice_Morse &matrix, const bool &attach_stencil_to_matrix=false)
DoubleVect & porosite_elem()
Definition Milieu_base.h:58
Base class for the turbulence model hierarchy for Navier-Stokes equations.
const Champ_Fonc_base & viscosite_turbulente() const
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
static int dimension
Definition Objet_U.h:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
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
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const override
DOES NOTHING - to override in derived classes.
void contribuer_bloc(const DoubleTab &, Matrice_Morse &, const int i) const
void dimensionner_bloc(Matrice_Morse &mat, const int p) const
void dimensionner(Matrice_Morse &mat) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter(const DoubleTab &inco, DoubleTab &resu) const override
void completer() override
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
void completer() override
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
void associer_diffusivite_turbulente(const Champ_Fonc_base &)
SolveurSys solveur
SolveurSys & set_solveur()
Entree & lire_solveur(Entree &)
static int nproc()
Returns the number of processors in the current group. See Comm_Group::nproc() and PE_Groups::current...
Definition Process.cpp:102
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Base class for output streams.
Definition Sortie.h:52
virtual void declare_support_masse_volumique(int ok)
The constructor of a derived class that uses the density field must call this function with the value...
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
void append_line(_TYPE_)
Definition TRUSTTab.tpp:213
const Objet_U & valeur() const
Definition TRUST_Ref.h:134