TRUST 1.9.8
HPC thermohydraulic platform
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 // Pour des petites matrices, LU PETSc plus rapide que GMRES/ILU(0) ou 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 //partie vitesses : 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 //partie vorticites : 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 //partie vitesses : 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 //partie vorticites : 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 //partie vitesses : 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 //partie vorticites : Ra m2 - m1 / nu
254 if (resu.dimension_tot(0) == nf_tot)
255 return resu; //resu ne contient que la partie "faces"
256 for (a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
257 {
258 //rotationnel : vitesses internes
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 //rotationnel : vitesses aux bords
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 //partie vitesses : 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 //partie vorticites : Ra m2 - m1 / nu
301 if (resu.dimension_tot(0) == nf_tot)
302 return resu; //resu ne contient que la partie "faces"
303
304 /* boucle aretes*/
305 for (int a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
306 {
307 //rotationnel : vitesses internes
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 //rotationnel : vitesses aux bords
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 //partie vitesses : 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 //partie vorticites : Ra m2 - m1 / nu
372 for (int a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
373 {
374 //rotationnel : vitesses internes
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 //partie vitesses : 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 //partie vorticites : Ra m2 - m1 / nu
414 for (a = 0; a < (dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
415 {
416 //rotationnel : vitesses internes
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
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
int nb_faces_tot() const
renvoie le nombre total de faces.
Definition Domaine_VF.h:481
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
Une entree dont la source est une chaine de caracteres.
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
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
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
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Champ_Fonc_base & viscosite_turbulente() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
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
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
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void associer_diffusivite_turbulente(const Champ_Fonc_base &)
SolveurSys solveur
SolveurSys & set_solveur()
Entree & lire_solveur(Entree &)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual void declare_support_masse_volumique(int ok)
Le constructeur d'une classe derivee qui se sert de la masse volumique doit appeler cette fonction av...
_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