TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
VEF_discretisation.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 <Taux_cisaillement_P0_VEF.h>
17#include <Champ_Fonc_Tabule_P0_VEF.h>
18#include <Correlation_Vec_Sca_VEF.h>
19#include <Rotationnel_Champ_P1NC.h>
20#include <Rotationnel_Champ_Q1NC.h>
21#include <Critere_Q_Champ_P1NC.h>
22#include <T_paroi_Champ_P1NC.h>
23#include <VEF_discretisation.h>
24#include <Y_plus_Champ_P1NC.h>
25#include <Navier_Stokes_std.h>
26#include <grad_T_Champ_P1NC.h>
27#include <grad_U_Champ_P1NC.h>
28#include <h_conv_Champ_P1NC.h>
29#include <Champ_Ostwald_VEF.h>
30#include <Champ_Fonc_Tabule.h>
31#include <Schema_Temps_base.h>
32#include <Champ_Fonc_Q1NC.h>
33#include <Fluide_Ostwald.h>
34#include <Champ_Uniforme.h>
35#include <Domaine_VEF.h>
36#include <Quadri_VEF.h>
37#include <Tetra_VEF.h>
38#include <Hexa_VEF.h>
39#include <Tri_VEF.h>
40
41Implemente_instanciable(VEF_discretisation, "VEFPreP1B|VEF", Discret_Thyd);
42// XD vef discretisation_base vefprep1b INHERITS_BRACE Finite element volume discretization (P1NC/P1-bubble element).
43// XD_CONT Since the 1.5.5 version, several new discretizations are available thanks to the optional keyword Read. By
44// XD_CONT default, the VEFPreP1B keyword is equivalent to the former VEFPreP1B formulation (v1.5.4 and sooner). P0P1
45// XD_CONT (if used with the strong formulation for imposed pressure boundary) is equivalent to VEFPreP1B but the
46// XD_CONT convergence is slower. VEFPreP1B dis is equivalent to VEFPreP1B dis Read dis { P0 P1
47// XD_CONT Changement_de_base_P1Bulle 1 Cl_pression_sommet_faible 0 }
48
49// By default, P0+P1 and changing basis to do P0+P1->P1Bulle
50// REMEMBER: we don't necessarily go through the readOn() piece of code if we just write
51// VEF dis
52// instead of
53// VEF dis
54// Read dis { ... }
55// !!!!
57{
58 alphaE_ = false;
59 alphaS_ = false;
60 P1Bulle_ = 0;
61 cl_pression_sommet_faible_ = 1;
62 return Discret_Thyd::readOn(is);
63}
64
66{
68
69 param.ajouter("changement_de_base_P1bulle", &P1Bulle_); // XD_ADD_P entier(into=[0,1])
70 // XD_CONT changement_de_base_p1bulle 1 This option may be used to have the P1NC/P0P1 formulation (value set to 0) or
71 // XD_CONT the P1NC/P1Bulle formulation (value set to 1, the default).
72 param.ajouter_flag("P0", &alphaE_); // XD_ADD_P rien
73 // XD_CONT Pressure nodes are added on element centres
74 param.ajouter_flag("P1", &alphaS_); // XD_ADD_P rien
75 // XD_CONT Pressure nodes are added on vertices
76 param.ajouter_flag("Pa", &alphaA_); // XD_ADD_P rien
77 // XD_CONT Only available in 3D, pressure nodes are added on bones
78 param.ajouter_flag("RT", &alphaRT_); // XD_ADD_P rien
79 // XD_CONT For P1NCP1B (in TrioCFD)
80 param.ajouter("modif_div_face_dirichlet", &modif_div_face_dirichlet_); // XD_ADD_P entier(into=[0,1])
81 // XD_CONT This option (by default 0) is used to extend control volumes for the momentum equation.
82 param.ajouter("CL_pression_sommet_faible", &cl_pression_sommet_faible_); // XD_ADD_P entier(into=[0,1])
83 // XD_CONT This option is used to specify a strong formulation (value set to 0, the default) or a weak formulation
84 // XD_CONT (value set to 1) for an imposed pressure boundary condition. The first formulation converges quicker and is
85 // XD_CONT stable in general cases. The second formulation should be used if there are several outlet boundaries with
86 // XD_CONT Neumann condition (see Ecoulement_Neumann test case for example).
87}
88
90{
91 // Quelques verifications
92 if (dimension != 3 && alphaA_)
93 Process::exit("Pa support is only available in 3D.");
94 if (!alphaE_ && !alphaS_ && !alphaA_)
95 {
96 // P0P1Bulle par defaut avec CL pression forte
97 alphaE_ = true;
98 alphaS_ = true;
99 P1Bulle_ = true;
100 cl_pression_sommet_faible_ = 0;
101 //Process::exit("You must choose at least one support among P0, P1, Pa.");
102 }
103 if (alphaA_ && !alphaE_)
104 Process::exit("Discretisations Pa or P1+Pa are not yet supported.");
105 if (P1Bulle_)
106 if (!((alphaE_) && (alphaS_) && (!alphaA_)))
107 Process::exit("Option 'changement_de_base_P1bulle' is available only in P0/P1");
108
109 if (alphaRT_)
110 {
111 if (!alphaE_ && !alphaS_ && !alphaA_)
112 Process::exit("Choose P0 discretization.");
113 Cerr << "Linke's scheme, OK for steady-state pb. The pressure computed is the Bernoulli pressure P =p+|u|^2" << finl;
114 }
115}
116
118{
119 s << "lire " << le_nom() << " { " << finl;
120 if (alphaE_) s << " P0";
121 if (alphaS_) s << " P1";
122 if (alphaA_) s << " Pa";
123 if (alphaRT_) s << " RT";
124 s << " changement_de_base_P1bulle " << P1Bulle_;
125 s << " modif_div_face_dirichlet " << modif_div_face_dirichlet_;
126 s << " cl_pression_sommet_faible " << cl_pression_sommet_faible_;
127 s << " } " << finl;
128 return s;
129}
130
131/*! @brief Discretisation d'un champ pour le VEFP1B en fonction d'une directive de discretisation.
132 *
133 * La directive est un Motcle comme "pression",
134 * "divergence_vitesse" (cree un champ de type P1_isoP1Bulle).
135 * Cette methode determine le type du champ a creer en fonction du type d'element
136 * et de la directive de discretisation. Elle determine ensuite le nombre de ddl
137 * et fixe l'ensemble des parametres du champ (type, nb_compo, nb_ddl, nb_pas_dt,
138 * nom(s), unite(s), nature du champ et attribue un temps) et associe le Domaine_dis au champ.
139 * Voir le code pour avoir la correspondance entre les directives et
140 * le type de champ cree.
141 *
142 */
143void VEF_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, int nb_pas_dt, double temps,
144 OWN_PTR(Champ_Inc_base)& champ, const Nom& sous_type) const
145{
146 Motcles motcles(2);
147 motcles[0] = "pression"; // Choix standard pour la pression
148 motcles[1] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
149
150 Nom type;
151 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
152 int rang = motcles.search(directive);
153 switch(rang)
154 {
155 case 0:
156 type = "Champ_P1_isoP1Bulle";
157 default_nb_comp = 1;
158 break;
159 case 1:
160 type = "Champ_P1_isoP1Bulle";
161 default_nb_comp = 1;
162 break;
163 default:
164 assert(rang < 0);
165 break;
166 }
167
168 if (directive == DEMANDE_DESCRIPTION)
169 Cerr << "VEF_discretisation : " << motcles;
170
171 // Si on n'a pas compris la directive (ou si c'est une demande_description)
172 // alors on appelle l'ancetre :
173 if (rang < 0)
174 {
175 VEF_discretisation::discretiser_champ_(directive, z, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
176 return;
177 }
178
179 const int nb_ddl = -1; // c'est le descripteur p1b qui donnera le chiffre
180 if (nb_comp < 0)
181 nb_comp = default_nb_comp;
182 assert(nb_comp > 0);
183 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive, que_suis_je());
184
185 if (nature == multi_scalaire)
186 {
187 Cerr << "There is no field of type OWN_PTR(Champ_Inc_base) with P1Bulle discretization" << finl;
188 Cerr << "and a multi_scalaire nature." << finl;
189 exit();
190 }
191}
192
193void VEF_discretisation::discretiser_champ_(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, int nb_pas_dt, double temps,
194 OWN_PTR(Champ_Inc_base)& champ, const Nom& sous_type) const
195{
196 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
197
198 Motcles motcles(7);
199 motcles[0] = "vitesse"; // Choix standard pour la vitesse
200 motcles[1] = "pression"; // Choix standard pour la pression
201 motcles[2] = "temperature"; // Choix standard pour la temperature
202 motcles[3] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
203 motcles[4] = "gradient_pression"; // Le type de champ obtenu en calculant grad P
204 motcles[5] = "champ_elem"; // Creer un champ aux elements (de type P0)
205 motcles[6] = "champ_sommets"; // Creer un champ aux sommets (type P1)
206
207 // Le type de champ de vitesse depend du type d'element :
208 Nom type_champ_vitesse;
209 if (sub_type(Tri_VEF, domaine_vef.type_elem()) || sub_type(Tetra_VEF, domaine_vef.type_elem()))
210 type_champ_vitesse = "Champ_P1NC";
211 else if (sub_type(Quadri_VEF,domaine_vef.type_elem()) || sub_type(Hexa_VEF, domaine_vef.type_elem()))
212 type_champ_vitesse = "Champ_Q1NC";
213 else
214 {
215 Cerr << "VEF_discretisation::discretiser_champ :\n L'element geometrique ";
216 Cerr << domaine_vef.type_elem().que_suis_je();
217 Cerr << " n'est pas supporte." << finl;
218 exit();
219 }
220
221 Nom type;
222 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
223 int rang = motcles.search(directive);
224 switch(rang)
225 {
226 case 0:
227 type = type_champ_vitesse;
228 default_nb_comp = dimension;
229 break;
230 case 1:
231 type = "Champ_P0_VEF";
232 default_nb_comp = 1;
233 break;
234 case 2:
235 type = type_champ_vitesse;
236 default_nb_comp = 1;
237 break;
238 case 3:
239 type = "Champ_P0_VEF";
240 default_nb_comp = 1;
241 break;
242 case 4:
243 type = type_champ_vitesse;
244 default_nb_comp = dimension;
245 break;
246 case 5:
247 type = "Champ_P0_VEF";
248 default_nb_comp = 1;
249 break;
250 case 6:
251 type = "Champ_P1_VEF";
252 default_nb_comp = 1;
253 break;
254 default:
255 assert(rang < 0);
256 break;
257 }
258
259 if (directive == DEMANDE_DESCRIPTION)
260 Cerr << "VEF_discretisation : " << motcles;
261
262 // Si on n'a pas compris la directive (ou si c'est une demande_description)
263 // alors on appelle l'ancetre :
264 if (rang < 0)
265 {
266 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
267 return;
268 }
269
270 // Calcul du nombre de ddl
271 int nb_ddl = 0;
272 if (type == "Champ_P0_VEF")
273 nb_ddl = z.nb_elem();
274 else if (type == type_champ_vitesse)
275 nb_ddl = domaine_vef.nb_faces();
276 else if (type == "Champ_P1_VEF")
277 nb_ddl = domaine_vef.nb_som();
278 else
279 assert(0);
280
281 if (nb_comp < 0)
282 nb_comp = default_nb_comp;
283 assert(nb_comp > 0);
284 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive, que_suis_je());
285 if (nature == multi_scalaire)
286 {
287 champ->fixer_nature_du_champ(nature);
288 champ->fixer_unites(unites);
289 champ->fixer_noms_compo(noms);
290 }
291
292}
293
294/*! @brief Idem que VEF_discretisation::discretiser_champ(.
295 *
296 * .. , Champ_Inc)
297 *
298 */
299void VEF_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
300 OWN_PTR(Champ_Fonc_base)& champ) const
301{
302 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
303}
304
305/*! @brief Idem que VEF_discretisation::discretiser_champ(.
306 *
307 * .. , Champ_Inc)
308 *
309 */
310void VEF_discretisation::discretiser_champ(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
311 OWN_PTR(Champ_Don_base)& champ) const
312{
313 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
314}
315
316/*! @brief Idem que VEF_discretisation::discretiser_champ(.
317 *
318 * .. , Champ_Inc) Traitement commun aux champ_fonc et champ_don.
319 * Cette methode est privee (passage d'un Objet_U pas propre vu
320 * de l'exterieur ...)
321 *
322 */
323void VEF_discretisation::discretiser_champ_fonc_don(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
324 Objet_U& champ) const
325{
326 // Deux pointeurs pour acceder facilement au champ_don ou au champ_fonc, suivant le type de l'objet champ.
327 OWN_PTR(Champ_Fonc_base) * champ_fonc = dynamic_cast<OWN_PTR(Champ_Fonc_base)*>(&champ);
328 OWN_PTR(Champ_Don_base) * champ_don = dynamic_cast<OWN_PTR(Champ_Don_base)*>(&champ);
329
330 Motcles motcles(2);
331 motcles[0] = "pression"; // Choix standard pour la pression
332 motcles[1] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
333
334 Nom type;
335 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
336 int rang = motcles.search(directive);
337 switch(rang)
338 {
339 case 0:
340 type = "Champ_Fonc_P1_isoP1Bulle";
341 default_nb_comp = 1;
342 break;
343 case 1:
344 type = "Champ_Fonc_P1_isoP1Bulle";
345 default_nb_comp = 1;
346 break;
347 default:
348 assert(rang < 0);
349 break;
350 }
351
352 if (directive == DEMANDE_DESCRIPTION)
353 Cerr << "VEF_discretisation : " << motcles;
354
355 // Si on n'a pas compris la directive (ou si c'est une demande_description)
356 // alors on appelle l'ancetre :
357 if (rang < 0)
358 {
359 if (champ_fonc)
360 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
361 else
362 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
363 return;
364 }
365
366 int nb_ddl = -1; // c'est le descripteur p1b qui donnera le chiffre
367
368 if (nb_comp < 0)
369 nb_comp = default_nb_comp;
370 assert(nb_comp > 0);
371 if (champ_fonc)
372 creer_champ(*champ_fonc, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
373 else
374 creer_champ(*champ_don, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
375
376 if (nature == multi_scalaire)
377 {
378 Cerr << "There is no field of type OWN_PTR(Champ_Fonc_base) or OWN_PTR(Champ_Don_base) with P1Bulle discretization" << finl;
379 Cerr << "and a multi_scalaire nature." <<finl;
380 exit();
381 }
382}
383
384void VEF_discretisation::discretiser_champ_fonc_don_(const Motcle& directive, const Domaine_dis_base& z, Nature_du_champ nature, const Noms& noms, const Noms& unites, int nb_comp, double temps,
385 Objet_U& champ) const
386{
387 // Deux pointeurs pour acceder facilement au champ_don ou au champ_fonc, suivant le type de l'objet champ.
388 OWN_PTR(Champ_Fonc_base) * champ_fonc = dynamic_cast<OWN_PTR(Champ_Fonc_base)*>(&champ);
389 OWN_PTR(Champ_Don_base) * champ_don = dynamic_cast<OWN_PTR(Champ_Don_base)*>(&champ);
390
391 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
392
393 Motcles motcles(8);
394 motcles[0] = "pression"; // Choix standard pour la pression
395 motcles[1] = "temperature"; // Choix standard pour la temperature
396 motcles[2] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
397 motcles[3] = "champ_elem"; // Creer un champ aux elements (de type P0)
398 motcles[4] = "vitesse"; // Choix standard pour la vitesse
399 motcles[5] = "gradient_pression"; // Le type de champ obtenu en calculant grad P
400 motcles[6] = "champ_sommets"; // Creer un champ aux sommets
401 motcles[7] = "champ_face"; // Creer un champ aux faces
402
403 // Le type de champ de vitesse depend du type d'element :
404 Nom type_champ_vitesse, type_champ_sommets;
405 Nom type_elem_domaine = domaine_vef.domaine().type_elem()->que_suis_je();
406 if (Motcle(type_elem_domaine) != "Segment")
407 {
408 const Elem_VEF_base& elem_vef = domaine_vef.type_elem();
409 if (sub_type(Tri_VEF, elem_vef) || sub_type(Tetra_VEF, elem_vef))
410 {
411 type_champ_vitesse = "Champ_Fonc_P1NC";
412 type_champ_sommets = "Champ_Fonc_P1_VEF";
413 }
414 else if (sub_type(Quadri_VEF, elem_vef) || sub_type(Hexa_VEF, elem_vef))
415 {
416 type_champ_vitesse = "Champ_Fonc_Q1NC";
417 type_champ_sommets = "Champ_Fonc_Q1_VEF";
418 }
419 else
420 {
421 Cerr << "VEF_discretisation::discretiser_champ :\n L'element geometrique ";
422 Cerr << elem_vef.que_suis_je();
423 Cerr << " n'est pas supporte." << finl;
424 exit();
425 }
426 }
427
428 Nom type;
429 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
430 int rang = motcles.search(directive);
431 switch(rang)
432 {
433 case 0:
434 type = "Champ_Fonc_P0_VEF";
435 default_nb_comp = 1;
436 break;
437 case 1:
438 type = type_champ_vitesse;
439 default_nb_comp = 1;
440 break;
441 case 2:
442 type = "Champ_Fonc_P0_VEF";
443 default_nb_comp = 1;
444 break;
445 case 3:
446 type = "Champ_Fonc_P0_VEF";
447 default_nb_comp = 1;
448 break;
449 case 4:
450 type = type_champ_vitesse;
451 default_nb_comp = dimension;
452 break;
453 case 5:
454 type = type_champ_vitesse;
455 default_nb_comp = dimension;
456 break;
457 case 6:
458 type = type_champ_sommets;
459 default_nb_comp = 1;
460 break;
461 case 7:
462 type = type_champ_vitesse;
463 default_nb_comp = 1;
464 break;
465
466 default:
467 assert(rang < 0);
468 break;
469 }
470
471 if (directive == DEMANDE_DESCRIPTION)
472 Cerr << "VEF_discretisation : " << motcles;
473
474 // Si on n'a pas compris la directive (ou si c'est une demande_description)
475 // alors on appelle l'ancetre :
476 if (rang < 0)
477 {
478 if (champ_fonc)
479 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
480 else
481 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
482 return;
483 }
484
485 // Calcul du nombre de ddl
486 int nb_ddl = 0;
487 if (type == "Champ_Fonc_P0_VEF")
488 nb_ddl = z.nb_elem();
489 else if (type == type_champ_vitesse)
490 nb_ddl = domaine_vef.nb_faces();
491 else if ((type == "Champ_Fonc_P1_VEF") || (type == "Champ_Fonc_Q1_VEF"))
492 nb_ddl = domaine_vef.nb_som();
493 else
494 assert(0);
495
496 if (nb_comp < 0)
497 nb_comp = default_nb_comp;
498 assert(nb_comp > 0);
499 if (champ_fonc)
500 creer_champ(*champ_fonc, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
501 else
502 creer_champ(*champ_don, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
503
504 if ((nature == multi_scalaire) && (champ_fonc))
505 {
506 champ_fonc->valeur().fixer_nature_du_champ(nature);
507 champ_fonc->valeur().fixer_unites(unites);
508 champ_fonc->valeur().fixer_noms_compo(noms);
509 }
510 else if ((nature == multi_scalaire) && (champ_don))
511 {
512 Cerr << "There is no field of type OWN_PTR(Champ_Don_base) with a multi_scalaire nature." << finl;
513 exit();
514 }
515}
516
518{
519 Cerr << "Discretisation de la distance paroi" << finl;
520 Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
521 ch.typer("Champ_Fonc_P0_VEF");
522 Champ_Fonc_P0_VEF& ch_dist_paroi = ref_cast(Champ_Fonc_P0_VEF, ch.valeur());
523 ch_dist_paroi.associer_domaine_dis_base(domaine_vef);
524 ch_dist_paroi.nommer("distance_paroi");
525 ch_dist_paroi.fixer_nb_comp(1);
526 ch_dist_paroi.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
527 ch_dist_paroi.fixer_unite("m");
528 ch_dist_paroi.changer_temps(sch.temps_courant());
529}
530
532{
533 Cerr << "Discretisation de distance paroi globale" << finl;
534 Noms noms(1), unites(1);
535 noms[0] = Nom("distance_paroi_globale");
536 unites[0] = Nom("m");
537 discretiser_champ(Motcle("champ_elem"), z, scalaire, noms , unites, 1, 0, ch);
538}
539
541{
542 Cerr << "Discretisation de la vorticite " << finl;
543 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, z);
544
545 if (sub_type(Tri_VEF,domaine_VEF.type_elem()) || sub_type(Tetra_VEF, domaine_VEF.type_elem()))
546 {
547 ch.typer("Rotationnel_Champ_P1NC");
548 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
549 Rotationnel_Champ_P1NC& ch_W = ref_cast(Rotationnel_Champ_P1NC, ch.valeur());
550 ch_W.associer_domaine_dis_base(domaine_VEF);
551 ch_W.associer_champ(vit);
552 ch_W.nommer("vorticite");
553 if (dimension == 2)
554 ch_W.fixer_nb_comp(1);
555 else
556 {
558 ch_W.fixer_nom_compo(0, "vorticitex");
559 ch_W.fixer_nom_compo(1, "vorticitey");
560 ch_W.fixer_nom_compo(2, "vorticitez");
561 }
562 ch_W.fixer_nb_valeurs_nodales(domaine_VEF.nb_elem());
563 ch_W.fixer_unite("s-1");
564 ch_W.changer_temps(ch_vitesse.temps());
565 }
566 else if (sub_type(Quadri_VEF,domaine_VEF.type_elem()) || sub_type(Hexa_VEF, domaine_VEF.type_elem()))
567 {
568 ch.typer("Rotationnel_Champ_Q1NC");
569 const Champ_Q1NC& vit = ref_cast(Champ_Q1NC, ch_vitesse);
570 Rotationnel_Champ_Q1NC& ch_W = ref_cast(Rotationnel_Champ_Q1NC, ch.valeur());
571 ch_W.associer_domaine_dis_base(domaine_VEF);
572 ch_W.associer_champ(vit);
573 ch_W.nommer("vorticite");
574 if (dimension == 2)
575 ch_W.fixer_nb_comp(1);
576 else
577 {
579 ch_W.fixer_nom_compo(0, "vorticitex");
580 ch_W.fixer_nom_compo(1, "vorticitey");
581 ch_W.fixer_nom_compo(2, "vorticitez");
582 }
583 ch_W.fixer_nb_valeurs_nodales(domaine_VEF.nb_elem());
584 ch_W.fixer_unite("s-1");
585 ch_W.changer_temps(ch_vitesse.temps());
586 }
587 else
588 {
589 Cerr << "Pb dans le typage des elements dans VEF_discretisation::vorticite" << finl;
590 exit();
591 }
592}
593
595{
596 if (sub_type(Champ_P1NC, ch_vitesse))
597 {
598 ch.typer("Rotationnel_Champ_P1NC");
599 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
600 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, vit.domaine_dis_base());
601 Rotationnel_Champ_P1NC& ch_W = ref_cast(Rotationnel_Champ_P1NC, ch.valeur());
602 ch_W.associer_domaine_dis_base(domaine_VEF);
603 ch_W.associer_champ(vit);
604 ch_W.nommer("vorticite");
605 if (dimension == 2)
606 ch_W.fixer_nb_comp(1);
607 else
608 {
610 ch_W.fixer_nom_compo(0, "vorticitex");
611 ch_W.fixer_nom_compo(1, "vorticitey");
612 ch_W.fixer_nom_compo(2, "vorticitez");
613 }
614 ch_W.fixer_nb_valeurs_nodales(domaine_VEF.nb_elem());
615 ch_W.fixer_unite("s-1");
616 ch_W.changer_temps(sch.temps_courant());
617 }
618 else if (sub_type(Champ_Q1NC, ch_vitesse))
619 {
620 ch.typer("Rotationnel_Champ_Q1NC");
621 const Champ_Q1NC& vit = ref_cast(Champ_Q1NC, ch_vitesse);
622 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, vit.domaine_dis_base());
623 Rotationnel_Champ_Q1NC& ch_W = ref_cast(Rotationnel_Champ_Q1NC, ch.valeur());
624 ch_W.associer_domaine_dis_base(domaine_VEF);
625 ch_W.associer_champ(vit);
626 ch_W.nommer("vorticite");
627 if (dimension == 2)
628 ch_W.fixer_nb_comp(1);
629 else
630 {
632 ch_W.fixer_nom_compo(0, "vorticitex");
633 ch_W.fixer_nom_compo(1, "vorticitey");
634 ch_W.fixer_nom_compo(2, "vorticitez");
635 }
636 ch_W.fixer_nb_valeurs_nodales(domaine_VEF.nb_elem());
637 ch_W.fixer_unite("s-1");
638 ch_W.changer_temps(sch.temps_courant());
639 }
640 else
641 {
642 Cerr << "Pb dans le typage des elements dans VEF_discretisation::creer_champ_vorticite" << finl;
643 exit();
644 }
645}
646
647/*! @brief discretise en VEF le fluide incompressible, donc K e N
648 *
649 * @param (Domaine_dis_base&) domaine a discretiser
650 * @param (Fluide_Ostwald&) fluide a discretiser
651 * @param (Champ_Inc_base&) vitesse
652 * @param (Champ_Inc_base&) temperature
653 */
655{
656 Cerr << "Discretisation VEF du fluide_Ostwald" << finl;
657 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
658 const Champ_Inc_base& ch_vitesse = eqn_hydr.inconnue();
659 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
660
661 Champ_Don_base& mu = le_fluide.viscosite_dynamique();
662 // mu est toujours un champ_Ostwald_VEF , il faut toujours faire ce qui suit
663 Champ_Ostwald_VEF& ch_mu = ref_cast(Champ_Ostwald_VEF, mu);
664 Cerr << "associe domainedisbase VEF" << finl;
665 ch_mu.associer_domaine_dis_base(domaine_vef);
666 ch_mu.associer_fluide(le_fluide);
667 ch_mu.associer_champ(vit);
668 ch_mu.associer_eqn(eqn_hydr);
669 Cerr << "associations finies domaine dis base, fluide, champ VEF" << finl;
670 ch_mu.fixer_nb_comp(1);
671
672 Cerr << "fait fixer_nb_valeurs_nodales" << finl;
673 Cerr << "nb_valeurs_nodales VEF = " << domaine_vef.nb_elem() << finl;
674 ch_mu.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
675
676 Cerr << "fait changer_temps" << finl;
677 ch_mu.changer_temps(vit.temps());
678 Cerr << "mu VEF est discretise " << finl;
679}
680
681void VEF_discretisation::critere_Q(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_vitesse, OWN_PTR(Champ_Fonc_base)& ch) const
682{
683 // On passe la zcl, pour qu'il n y ait qu une methode qqsoit la dsicretisation
684 // mais on ne s'en sert pas!!!
685 Cerr << "Discretisation du critere Q " << finl;
686 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
687 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
688 ch.typer("Critere_Q_Champ_P1NC");
689 Critere_Q_Champ_P1NC& ch_cQ = ref_cast(Critere_Q_Champ_P1NC, ch.valeur());
690 ch_cQ.associer_domaine_dis_base(domaine_vef);
691 ch_cQ.associer_champ(vit);
692 ch_cQ.nommer("Critere_Q");
693 ch_cQ.fixer_nb_comp(1);
694 ch_cQ.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
695 ch_cQ.fixer_unite("s-2");
696 ch_cQ.changer_temps(ch_vitesse.temps());
697}
698
699void VEF_discretisation::y_plus(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_vitesse, OWN_PTR(Champ_Fonc_base)& ch) const
700{
701 Cerr << "Discretisation de y_plus" << finl;
702 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
703 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
704 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
705 ch.typer("Y_plus_Champ_P1NC");
706 Y_plus_Champ_P1NC& ch_yp = ref_cast(Y_plus_Champ_P1NC, ch.valeur());
707 ch_yp.associer_domaine_dis_base(domaine_vef);
708 ch_yp.associer_domaine_Cl_dis_base(domaine_cl_vef);
709 ch_yp.associer_champ(vit);
710 ch_yp.nommer("Y_plus");
711 ch_yp.fixer_nb_comp(1);
712 ch_yp.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
713 ch_yp.fixer_unite("adimensionnel");
714 ch_yp.changer_temps(ch_vitesse.temps());
715}
716
717void VEF_discretisation::t_paroi(const Domaine_dis_base& z,const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_temp, OWN_PTR(Champ_Fonc_base)& ch) const
718{
719 Cerr << "Discretisation de temperature_paroi" << finl;
720 const Champ_P1NC& temp = ref_cast(Champ_P1NC, ch_temp);
721 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
722 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
723 ch.typer("T_paroi_Champ_P1NC");
724 T_paroi_Champ_P1NC& ch_tp = ref_cast(T_paroi_Champ_P1NC, ch.valeur());
725 ch_tp.associer_domaine_dis_base(domaine_vef);
726 ch_tp.associer_domaine_Cl_dis_base(domaine_cl_vef);
727 ch_tp.associer_champ(temp);
728 ch_tp.nommer("temperature_paroi");
729 ch_tp.add_synonymous("wall_temperature");
730 ch_tp.fixer_nb_comp(1);
731 ch_tp.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
732 ch_tp.fixer_unite("K-C");
733 ch_tp.changer_temps(ch_temp.temps());
734}
735
736void VEF_discretisation::grad_u(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_vitesse, OWN_PTR(Champ_Fonc_base)& ch) const
737{
738
739 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
740 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
741 const int nb_comp = dimension * dimension;
742 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
743 ch.typer("grad_u_Champ_P1NC");
744 grad_U_Champ_P1NC& ch_grad_u = ref_cast(grad_U_Champ_P1NC, ch.valeur());
745 ch_grad_u.fixer_nature_du_champ(vectoriel);
746 ch_grad_u.associer_domaine_dis_base(domaine_vef);
747 ch_grad_u.associer_domaine_Cl_dis_base(domaine_cl_vef);
748 ch_grad_u.associer_champ(vit);
749 ch_grad_u.nommer("gradient_vitesse");
750 ch_grad_u.fixer_nb_comp(nb_comp);
751 ch_grad_u.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
752 ch_grad_u.fixer_unite("s-1");
753 ch_grad_u.changer_temps(ch_vitesse.temps());
754
755 if (dimension == 2)
756 {
757 ch_grad_u.fixer_nom_compo(0, "dUdX"); // du/dx
758 ch_grad_u.fixer_nom_compo(1, "dUdY"); // du/dy
759 ch_grad_u.fixer_nom_compo(2, "dVdX"); // dv/dx
760 ch_grad_u.fixer_nom_compo(3, "dVdY"); // dv/dy
761 }
762 else
763 {
764 ch_grad_u.fixer_nom_compo(0, "dUdX"); // du/dx
765 ch_grad_u.fixer_nom_compo(1, "dUdY"); // du/dy
766 ch_grad_u.fixer_nom_compo(2, "dUdZ"); // du/dz
767 ch_grad_u.fixer_nom_compo(3, "dVdX"); // dv/dx
768 ch_grad_u.fixer_nom_compo(4, "dVdY"); // dv/dy
769 ch_grad_u.fixer_nom_compo(5, "dVdZ"); // dv/dz
770 ch_grad_u.fixer_nom_compo(6, "dWdX"); // dw/dx
771 ch_grad_u.fixer_nom_compo(7, "dWdY"); // dw/dy
772 ch_grad_u.fixer_nom_compo(8, "dWdZ"); // dw/dz
773 }
774
775}
776
777void VEF_discretisation::grad_T(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_temperature, OWN_PTR(Champ_Fonc_base)& ch) const
778{
779 Cerr << "Discretisation de gradient_temperature" << finl;
780
781 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
782 creer_champ(ch, domaine_vef, "gradient_temperature_Champ_P1NC", "gradient_temperature", "K/m", dimension, domaine_vef.nb_elem(), ch_temperature.temps());
783
784 grad_T_Champ_P1NC& ch_gt = ref_cast(grad_T_Champ_P1NC, ch.valeur());
785 const Champ_P1NC& temp = ref_cast(Champ_P1NC, ch_temperature);
786 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
787 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_vef);
788 ch_gt.associer_champ(temp);
789}
790
791void VEF_discretisation::h_conv(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_temperature, OWN_PTR(Champ_Fonc_base)& ch, Motcle& nom, int temp_ref) const
792{
793 Cerr << "Discretisation de h_conv" << finl;
794 const Champ_P1NC& temp = ref_cast(Champ_P1NC, ch_temperature);
795 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
796 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
797 ch.typer("h_conv_Champ_P1NC");
798 h_conv_Champ_P1NC& ch_gt = ref_cast(h_conv_Champ_P1NC, ch.valeur());
799 ch_gt.associer_domaine_dis_base(domaine_vef);
800 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_vef);
801 ch_gt.associer_champ(temp);
802 ch_gt.temp_ref() = temp_ref;
803 ch_gt.nommer(nom);
804 ch_gt.fixer_nb_comp(1);
805 ch_gt.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
806 ch_gt.fixer_unite("W/m2.K");
807 ch_gt.changer_temps(ch_temperature.temps());
808}
809
810void VEF_discretisation::taux_cisaillement(const Domaine_dis_base& z, const Domaine_Cl_dis_base& zcl, const Champ_Inc_base& ch_vitesse, OWN_PTR(Champ_Fonc_base)& champ) const
811{
812 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
813 const Domaine_Cl_VEF& domaine_cl_vef = ref_cast(Domaine_Cl_VEF, zcl);
814 champ.typer("Taux_cisaillement_P0_VEF");
815 Taux_cisaillement_P0_VEF& ch = ref_cast(Taux_cisaillement_P0_VEF, champ.valeur());
816 ch.associer_domaine_dis_base(domaine_vef);
817 const Champ_P1NC& vit = ref_cast(Champ_P1NC, ch_vitesse);
818 ch.associer_champ(vit, domaine_cl_vef);
819 ch.nommer("Taux_cisaillement");
820 ch.fixer_nb_comp(1);
821 ch.fixer_nb_valeurs_nodales(domaine_vef.nb_elem());
822 ch.fixer_unite("s-1");
823 ch.changer_temps(ch_vitesse.temps());
824}
825
826void VEF_discretisation::modifier_champ_tabule(const Domaine_dis_base& domaine_dis, Champ_Fonc_Tabule& le_champ_tabule, const VECT(OBS_PTR(Champ_base)) &ch_inc) const
827{
828 le_champ_tabule.typer_champ_tabule_discretise("Champ_Fonc_Tabule_P0_VEF");
829 Champ_Fonc_Tabule_P0_VEF& le_champ_tabule_dis = ref_cast(Champ_Fonc_Tabule_P0_VEF, le_champ_tabule.le_champ_tabule_discretise());
830 le_champ_tabule_dis.associer_domaine_dis_base(domaine_dis);
831 le_champ_tabule_dis.associer_param(ch_inc, le_champ_tabule.table());
832 le_champ_tabule_dis.nommer(le_champ_tabule.le_nom()); // We give a name to this field, help for debug
833 le_champ_tabule_dis.fixer_nb_comp(le_champ_tabule.nb_comp());
834 le_champ_tabule_dis.fixer_nb_valeurs_nodales(domaine_dis.nb_elem());
835 le_champ_tabule_dis.changer_temps(ch_inc[0]->temps());
836}
837
838void VEF_discretisation::residu(const Domaine_dis_base& z, const Champ_Inc_base& ch_inco, OWN_PTR(Champ_Fonc_base)& champ) const
839{
840 Nom ch_name(ch_inco.le_nom());
841 ch_name += "_residu";
842 Cerr << "Discretization of " << ch_name << finl;
843
844 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
845 int nb_comp = ch_inco.valeurs().line_size();
846 Discretisation_base::discretiser_champ("champ_face", domaine_vef, ch_name, "units_not_defined", nb_comp, ch_inco.temps(), champ);
847 Champ_Fonc_base& ch_fonc = ref_cast(Champ_Fonc_base, champ.valeur());
848 DoubleTab& tab = ch_fonc.valeurs();
849 tab = -10000.0;
850 Cerr << "[Information] Discretisation_base::residu : the residue is set to -10000.0 at initial time" << finl;
851}
852
854{
856 Domaine_VEF& zvef = ref_cast(Domaine_VEF, dom);
857 zvef.discretiser_suite(*this);
858 return zvef;
859}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_P0_VEF
int fixer_nb_valeurs_nodales(int n) override
Fixe le nombre de degres de liberte par composante.
void associer_param(const VECT(OBS_PTR(Champ_base))&, const Table &)
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
const Table & table() const
void typer_champ_tabule_discretise(const Nom &typ)
const Champ_Fonc_base & le_champ_tabule_discretise() const
Renvoie le champ tabule calcule.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void associer_domaine_dis_base(const Domaine_dis_base &) override
Classe Champ_Inc_base.
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_Ostwald_VEF Represente un champ en discretisation VEF qui varie en fonction
void associer_eqn(const Navier_Stokes_std &)
void associer_champ(const Champ_P1NC &un_champ)
void associer_fluide(const Fluide_Ostwald &le_fluide)
int fixer_nb_valeurs_nodales(int nb_noeuds) override
Fixe le nombre de degres de liberte par composante.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
double temps() const
Renvoie le temps du champ.
classe Critere_Q_Champ_P1NC
void associer_champ(const Champ_P1NC &)
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void set_param(Param &param) const override
virtual Domaine_dis_base & discretiser() const
static void creer_champ(OWN_PTR(Champ_Inc_base)&ch, const Domaine_dis_base &z, const Nom &type, const Nom &nom, const Nom &unite, int nb_comp, int nb_ddl, int nb_pas_dt, double temps, const Nom &directive=NOM_VIDE, const Nom &nom_discretisation=NOM_VIDE)
Methode statique qui cree un OWN_PTR(Champ_Inc_base) du type specifie.
static const Motcle DEMANDE_DESCRIPTION
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VEF
Definition Domaine_VEF.h:54
const Elem_VEF_base & type_elem() const
Definition Domaine_VEF.h:75
virtual void discretiser_suite(const VEF_discretisation &)
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
const Nom & le_nom() const override
Renvoie le nom du champ.
void nommer(const Nom &) override
Donne un nom au champ.
virtual const Nom & fixer_unite(const Nom &)
Specifie l'unite d'un champ scalaire ou dont toutes les composantes ont la meme unite.
virtual Nature_du_champ fixer_nature_du_champ(Nature_du_champ nat)
Fixer la nature d'un champ: scalaire, multiscalaire, vectoriel.
virtual int nb_comp() const
Definition Field_base.h:56
virtual void add_synonymous(const Nom &nom)
Definition Field_base.h:53
virtual const Nom & fixer_nom_compo(int, const Nom &)
Fixe le nom de la i-eme composante du champ.
class Fluide_Ostwald
const Champ_Don_base & viscosite_dynamique() const
Definition Fluide_base.h:60
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
Definition Param.cpp:474
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
void associer_champ(const Champ_P1NC &)
void associer_champ(const Champ_Q1NC &)
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
int line_size() const
Definition TRUSTVect.tpp:67
classe T_paroi_Champ_P1NC
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
classe Taux_cisaillement_P0_VEF
void associer_champ(const Champ_P1NC &, const Domaine_Cl_dis_base &)
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, Nature_du_champ nature, const Noms &nom, const Noms &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const override
Discretisation d'un champ pour le VEFP1B en fonction d'une directive de discretisation.
void check_param() override
void distance_paroi_globale(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const override
void vorticite(Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
void creer_champ_vorticite(const Schema_Temps_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void set_param(Param &param) const override
void grad_T(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch) const override
void critere_Q(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &vitesse, OWN_PTR(Champ_Fonc_base)&ch) const override
void h_conv(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch, Motcle &nom, int temp_ref) const override
void distance_paroi(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
void y_plus(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &vitesse, OWN_PTR(Champ_Fonc_base)&ch) const override
void taux_cisaillement(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void residu(const Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void grad_u(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch) const override
void t_paroi(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&ch) const override
void proprietes_physiques_fluide_Ostwald(const Domaine_dis_base &, Fluide_Ostwald &, const Navier_Stokes_std &, const Champ_Inc_base &) const override
discretise en VEF le fluide incompressible, donc K e N
classe Y_plus_Champ_P1NC
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
classe grad_T_Champ_P1NC
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
classe grad_U_Champ_P1NC
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
classe h_conv_Champ_P1NC
void associer_champ(const Champ_P1NC &)
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)