TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
EF_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 <EF_discretisation.h>
17#include <Domaine_EF.h>
18#include <Champ_P1_EF.h>
19#include <Champ_Q1_EF.h>
20#include <Champ_Fonc_P0_EF.h>
21#include <Y_plus_Champ_Q1.h>
22#include <Rotationnel_Champ_P1_EF.h>
23#include <Rotationnel_Champ_Q1_EF.h>
24#include <Champ_Fonc_Tabule.h>
25#include <Champ_Fonc_Tabule_P0_EF.h>
26#include <Milieu_base.h>
27#include <Equation_base.h>
28#include <Tri_EF.h>
29#include <Tetra_EF.h>
30#include <Segment_EF.h>
31#include <Point_EF.h>
32#include <Quadri_EF.h>
33#include <Hexa_EF.h>
34#include <Champ_Uniforme.h>
35#include <Schema_Temps_base.h>
36#include <Motcle.h>
37#include <Domaine_Cl_EF.h>
38#include <Domaine_Cl_dis_base.h>
39
40Implemente_instanciable(EF_discretisation, "EF", Discret_Thyd);
41// XD ef discretisation_base ef INHERITS_BRACE Element Finite discretization.
42
44{
45 return Discret_Thyd::readOn(s);
46}
47
48Sortie& EF_discretisation::printOn(Sortie& s) const { return s; }
49
50/*! @brief Discretisation d'un champ pour le EF en fonction d'une directive de discretisation.
51 *
52 * La directive est un Motcle comme "vitesse", "pression",
53 * "temperature", "champ_elem" (cree un champ de type P0), ...
54 * Cette methode determine le type du champ a creer en fonction du type d'element
55 * et de la directive de discretisation. Elle determine ensuite le nombre de ddl
56 * et fixe l'ensemble des parametres du champ (type, nb_compo, nb_ddl, nb_pas_dt,
57 * nom(s), unite(s) et nature du champ) et associe le Domaine_dis au champ.
58 * Voir le code pour avoir la correspondance entre les directives et
59 * le type de champ cree.
60 *
61 */
62void EF_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,
63 OWN_PTR(Champ_Inc_base) &champ, const Nom& sous_type) const
64{
65 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
66
67 Motcles motcles(7);
68 motcles[0] = "vitesse"; // Choix standard pour la vitesse
69 motcles[1] = "pression"; // Choix standard pour la pression
70 motcles[2] = "temperature"; // Choix standard pour la temperature
71 motcles[3] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
72 motcles[4] = "gradient_pression"; // Le type de champ obtenu en calculant grad P
73 motcles[5] = "champ_elem"; // Creer un champ aux elements (de type P0)
74 motcles[6] = "champ_sommets"; // Creer un champ aux sommets (type P1)
75
76 // Le type de champ de vitesse depend du type d'element :
77 Nom type_champ_vitesse;
78 if (sub_type(Tri_EF, domaine_EF.type_elem()) || sub_type(Segment_EF, domaine_EF.type_elem()) || sub_type(Tetra_EF, domaine_EF.type_elem()))
79 type_champ_vitesse = "Champ_P1_EF";
80 else if (sub_type(Quadri_EF,domaine_EF.type_elem()) || sub_type(Hexa_EF, domaine_EF.type_elem()))
81 type_champ_vitesse = "Champ_Q1_EF";
82 else
83 {
84 Cerr << "EF_discretisation::discretiser_champ :\n L'element geometrique ";
85 Cerr << domaine_EF.type_elem().que_suis_je();
86 Cerr << " n'est pas supporte." << finl;
87 exit();
88 }
89
90 Nom type;
91 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
92 int rang = motcles.search(directive);
93 switch(rang)
94 {
95 case 0:
96 type = type_champ_vitesse;
97 default_nb_comp = dimension;
98 break;
99 case 1:
100 type = "Champ_P0_EF";
101 default_nb_comp = 1;
102 break;
103 case 2:
104 type = type_champ_vitesse;
105 default_nb_comp = 1;
106 break;
107 case 3:
108 type = "Champ_P0_EF";
109 default_nb_comp = 1;
110 break;
111 case 4:
112 type = type_champ_vitesse;
113 default_nb_comp = dimension;
114 break;
115 case 5:
116 type = "Champ_P0_EF";
117 default_nb_comp = 1;
118 break;
119 case 6:
120 type = "Champ_P1_EF";
121 default_nb_comp = 1;
122 break;
123 default:
124 assert(rang < 0);
125 break;
126 }
127
128 if (directive == DEMANDE_DESCRIPTION)
129 Cerr << "EF_discretisation : " << motcles;
130
131 // Si on n'a pas compris la directive (ou si c'est une demande_description)
132 // alors on appelle l'ancetre :
133 if (rang < 0)
134 {
135 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
136 return;
137 }
138
139 // Calcul du nombre de ddl
140 int nb_ddl = 0;
141 if (type == "Champ_P0_EF")
142 nb_ddl = z.nb_elem();
143 else if (type == type_champ_vitesse)
144 nb_ddl = domaine_EF.nb_som();
145 else if (type == "Champ_P1_EF")
146 nb_ddl = domaine_EF.nb_som();
147 else
148 assert(0);
149
150 // Si c'est un champ multiscalaire, uh !
151 /* if (nature == multi_scalaire) {
152 // Pas encore code
153 Cerr << "Champ multi_scalaire pas code" << finl;
154 assert(0); exit();
155 } else {*/
156 if (nb_comp < 0)
157 nb_comp = default_nb_comp;
158 assert(nb_comp > 0);
159 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive, que_suis_je());
160 if (nature == multi_scalaire)
161 {
162 champ->fixer_nature_du_champ(nature);
163 champ->fixer_unites(unites);
164 champ->fixer_noms_compo(noms);
165 }
166}
167
168/*! @brief Idem que EF_discretisation::discretiser_champ(.
169 *
170 * .. , Champ_Inc)
171 *
172 */
173void EF_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,
174 OWN_PTR(Champ_Fonc_base) &champ) const
175{
176 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
177}
178
179/*! @brief Idem que EF_discretisation::discretiser_champ(.
180 *
181 * .. , Champ_Inc)
182 *
183 */
184void EF_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,
185 OWN_PTR(Champ_Don_base)& champ) const
186{
187 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
188}
189
190/*! @brief Idem que EF_discretisation::discretiser_champ(.
191 *
192 * .. , Champ_Inc) Traitement commun aux champ_fonc et champ_don.
193 * Cette methode est privee (passage d'un Objet_U pas propre vu
194 * de l'exterieur ...)
195 *
196 */
197void EF_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,
198 Objet_U& champ) const
199{
200 // Deux pointeurs pour acceder facilement au champ_don ou au champ_fonc, suivant le type de l'objet champ.
201 OWN_PTR(Champ_Fonc_base) *champ_fonc = dynamic_cast<OWN_PTR(Champ_Fonc_base)*>(&champ);
202 OWN_PTR(Champ_Don_base) *champ_don = dynamic_cast<OWN_PTR(Champ_Don_base)*>(&champ);
203
204 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
205
206 Motcles motcles(7);
207 motcles[0] = "pression"; // Choix standard pour la pression
208 motcles[1] = "temperature"; // Choix standard pour la temperature
209 motcles[2] = "divergence_vitesse"; // Le type de champ obtenu en calculant div v
210 motcles[3] = "champ_elem"; // Creer un champ aux elements (de type P0)
211 motcles[6] = "champ_sommets"; // Creer un champ aux elements (de type P1)
212 motcles[4] = "vitesse"; // Choix standard pour la vitesse
213 motcles[5] = "gradient_pression"; // Le type de champ obtenu en calculant grad P
214
215 // Le type de champ de vitesse depend du type d'element :
216 Nom type_champ_vitesse;
217 {
218 const Elem_EF_base& elem_EF = domaine_EF.type_elem();
219 if (sub_type(Tri_EF, elem_EF) || sub_type(Segment_EF, elem_EF) || sub_type(Tetra_EF, elem_EF) || sub_type(Point_EF, elem_EF))
220 type_champ_vitesse = "Champ_Fonc_P1_EF";
221 else if (sub_type(Quadri_EF, elem_EF) || sub_type(Hexa_EF, elem_EF))
222 type_champ_vitesse = "Champ_Fonc_Q1_EF";
223 else
224 {
225 Cerr << "EF_discretisation::discretiser_champ :\n L'element geometrique ";
226 Cerr << elem_EF.que_suis_je();
227 Cerr << " n'est pas supporte." << finl;
228 exit();
229 }
230 }
231 Nom type;
232 int default_nb_comp = 0; // Valeur par defaut du nombre de composantes
233 int rang = motcles.search(directive);
234 switch(rang)
235 {
236 case 0:
237 type = "Champ_Fonc_P0_EF";
238 default_nb_comp = 1;
239 break;
240 case 1:
241 type = type_champ_vitesse;
242 default_nb_comp = 1;
243 break;
244 case 2:
245 type = "Champ_Fonc_P0_EF";
246 default_nb_comp = 1;
247 break;
248 case 3:
249 type = "Champ_Fonc_P0_EF";
250 default_nb_comp = 1;
251 break;
252 case 4:
253 type = type_champ_vitesse;
254 default_nb_comp = dimension;
255 break;
256 case 5:
257 type = type_champ_vitesse;
258 default_nb_comp = dimension;
259 break;
260 case 6:
261 type = type_champ_vitesse;
262 default_nb_comp = 1;
263 break;
264 default:
265 assert(rang < 0);
266 break;
267 }
268
269 if (directive == DEMANDE_DESCRIPTION)
270 Cerr << "EF_discretisation : " << motcles;
271
272 // Si on n'a pas compris la directive (ou si c'est une demande_description)
273 // alors on appelle l'ancetre :
274 if (rang < 0)
275 {
276 if (champ_fonc)
277 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
278 else
279 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
280 return;
281 }
282
283 // Calcul du nombre de ddl
284 int nb_ddl = 0;
285 if (type == "Champ_Fonc_P0_EF")
286 nb_ddl = z.nb_elem();
287 else if (type == type_champ_vitesse)
288 nb_ddl = domaine_EF.nb_som();
289 else
290 assert(0);
291
292 /* // Si c'est un champ multiscalaire, uh !
293 if (nature == multi_scalaire)
294 {
295 // Pas encore code
296 Cerr << "Champ multi_scalaire pas code" << finl;
297 assert(0);
298 exit();
299 }
300 else */
301 {
302 if (nb_comp < 0)
303 nb_comp = default_nb_comp;
304 assert(nb_comp > 0);
305 if (champ_fonc)
306 creer_champ(*champ_fonc, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
307 else
308 creer_champ(*champ_don, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
309 }
310
311 if ((nature == multi_scalaire) && (champ_fonc))
312 {
313 champ_fonc->valeur().fixer_nature_du_champ(nature);
314 champ_fonc->valeur().fixer_unites(unites);
315 champ_fonc->valeur().fixer_noms_compo(noms);
316 }
317 else if ((nature == multi_scalaire) && (champ_don))
318 {
319 Cerr << "There is no field of type OWN_PTR(Champ_Don_base) with a multi_scalaire nature." << finl;
320 exit();
321 }
322
323}
324
326{
327 Cerr << "Discretisation de la distance paroi" << finl;
328 Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
329 ch.typer("Champ_Fonc_P0_EF");
330 Champ_Fonc_P0_EF& ch_dist_paroi = ref_cast(Champ_Fonc_P0_EF, ch.valeur());
331 ch_dist_paroi.associer_domaine_dis_base(domaine_EF);
332 ch_dist_paroi.nommer("distance_paroi");
333 ch_dist_paroi.fixer_nb_comp(1);
334 ch_dist_paroi.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
335 ch_dist_paroi.fixer_unite("m");
336 ch_dist_paroi.changer_temps(sch.temps_courant());
337}
338
340{
341 Cerr << "Discretisation de la vorticite " << finl;
342 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
343
344 if (sub_type(Tri_EF,domaine_EF.type_elem()) || sub_type(Segment_EF, domaine_EF.type_elem()) || sub_type(Tetra_EF, domaine_EF.type_elem()))
345 {
346 ch.typer("Rotationnel_Champ_P1_EF");
347 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF, ch_vitesse);
348 Rotationnel_Champ_P1_EF& ch_W = ref_cast(Rotationnel_Champ_P1_EF, ch.valeur());
349 ch_W.associer_domaine_dis_base(domaine_EF);
350 ch_W.associer_champ(vit);
351 ch_W.nommer("vorticite");
352 if (dimension == 2)
353 ch_W.fixer_nb_comp(1);
354 else
355 {
357 ch_W.fixer_nom_compo(0, "vorticitex");
358 ch_W.fixer_nom_compo(1, "vorticitey");
359 ch_W.fixer_nom_compo(2, "vorticitez");
360 }
361 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
362 ch_W.fixer_unite("s-1");
363 ch_W.changer_temps(ch_vitesse.temps());
364 }
365 else if (sub_type(Quadri_EF,domaine_EF.type_elem()) || sub_type(Hexa_EF, domaine_EF.type_elem()))
366 {
367 ch.typer("Rotationnel_Champ_Q1_EF");
368 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
369 Rotationnel_Champ_Q1_EF& ch_W = ref_cast(Rotationnel_Champ_Q1_EF, ch.valeur());
370 ch_W.associer_domaine_dis_base(domaine_EF);
371 ch_W.associer_champ(vit);
372 ch_W.nommer("vorticite");
373 if (dimension == 2)
374 ch_W.fixer_nb_comp(1);
375 else
376 {
378 ch_W.fixer_nom_compo(0, "vorticitex");
379 ch_W.fixer_nom_compo(1, "vorticitey");
380 ch_W.fixer_nom_compo(2, "vorticitez");
381 }
382 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
383 ch_W.fixer_unite("s-1");
384 ch_W.changer_temps(ch_vitesse.temps());
385 }
386 else
387 {
388 Cerr << "Pb dans le typage des elements dans EF_discretisation::vorticite" << finl;
389 exit();
390 }
391}
392
394{
395 if (sub_type(Champ_P1_EF, ch_vitesse))
396 {
397 ch.typer("Rotationnel_Champ_P1_EF");
398 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF, ch_vitesse);
399 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, vit.domaine_dis_base());
400 Rotationnel_Champ_P1_EF& ch_W = ref_cast(Rotationnel_Champ_P1_EF, ch.valeur());
401 ch_W.associer_domaine_dis_base(domaine_EF);
402 ch_W.associer_champ(vit);
403 ch_W.nommer("vorticite");
404 if (dimension == 2)
405 ch_W.fixer_nb_comp(1);
406 else
407 {
409 ch_W.fixer_nom_compo(0, "vorticitex");
410 ch_W.fixer_nom_compo(1, "vorticitey");
411 ch_W.fixer_nom_compo(2, "vorticitez");
412 }
413 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
414 ch_W.fixer_unite("s-1");
415 ch_W.changer_temps(sch.temps_courant());
416 }
417 else if (sub_type(Champ_Q1_EF, ch_vitesse))
418 {
419 ch.typer("Rotationnel_Champ_Q1_EF");
420 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
421 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, vit.domaine_dis_base());
422 Rotationnel_Champ_Q1_EF& ch_W = ref_cast(Rotationnel_Champ_Q1_EF, ch.valeur());
423 ch_W.associer_domaine_dis_base(domaine_EF);
424 ch_W.associer_champ(vit);
425 ch_W.nommer("vorticite");
426 if (dimension == 2)
427 ch_W.fixer_nb_comp(1);
428 else
429 {
431 ch_W.fixer_nom_compo(0, "vorticitex");
432 ch_W.fixer_nom_compo(1, "vorticitey");
433 ch_W.fixer_nom_compo(2, "vorticitez");
434 }
435 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
436 ch_W.fixer_unite("s-1");
437 ch_W.changer_temps(sch.temps_courant());
438 }
439 else
440 {
441 Cerr << "Pb dans le typage des elements dans EF_discretisation::creer_champ_vorticite" << finl;
442 exit();
443 }
444}
445
446/*! @brief discretise en EF le fluide incompressible, donc K e N
447 *
448 * @param (Domaine_dis_base&) domaine a discretiser
449 * @param (Fluide_Ostwald&) fluide a discretiser
450 * @param (Champ_Inc_base&) ch_vitesse
451 * @param (Champ_Inc_base&) temperature
452 */
454{
455
456#ifdef dependance
457 Cerr << "Discretisation EF du fluide_Ostwald" << finl;
458 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
459 const Champ_Inc_base& ch_vitesse = eqn_hydr.inconnue();
460 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF,ch_vitesse);
461
462 Champ_Don_base& mu = le_fluide.viscosite_dynamique();
463 // mu est toujours un champ_Ostwald_EF , il faut toujours faire ce qui suit
464 Champ_Ostwald_EF& ch_mu = ref_cast(Champ_Ostwald_EF,mu);
465 Cerr<<"associe domainedisbase EF"<<finl;
466 ch_mu.associer_domaine_dis_base(domaine_EF);
467 ch_mu.associer_fluide(le_fluide);
468 ch_mu.associer_champ(vit);
469 ch_mu.associer_eqn(eqn_hydr);
470 Cerr<<"associations finies domaine dis base, fluide, champ EF"<<finl;
471 ch_mu.fixer_nb_comp(1);
472
473 Cerr<<"fait fixer_nb_valeurs_nodales"<<finl;
474 Cerr<<"nb_valeurs_nodales EF = "<<domaine_EF.nb_elem()<<finl;
475 ch_mu.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
476
477 Cerr<<"fait changer_temps"<<finl;
478 ch_mu.changer_temps(vit->temps());
479 Cerr<<"mu EF est discretise "<<finl;
480#endif
481}
482
483void EF_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
484{
485#ifdef dependance
486 // On passe la zcl, pour qu'il n y ait qu une methode qqsoit la dsicretisation
487 // mais on ne s'en sert pas!!!
488 Cerr << "Discretisation du critere Q " << finl;
489 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF,ch_vitesse);
490 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
491 ch.typer("Critere_Q_Champ_P1_EF");
492 Critere_Q_Champ_P1_EF& ch_cQ=ref_cast(Critere_Q_Champ_P1_EF,ch.valeur());
493 ch_cQ.associer_domaine_dis_base(domaine_EF);
494 ch_cQ.associer_champ(vit);
495 ch_cQ.nommer("Critere_Q");
496 ch_cQ.fixer_nb_comp(1);
497 ch_cQ.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
498 ch_cQ.fixer_unite("s-2");
499 ch_cQ.changer_temps(ch_vitesse.temps());
500#endif
501}
502
503void EF_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
504{
505 Cerr << "Discretisation de y_plus" << finl;
506 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
507 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
508 const Domaine_Cl_EF& domaine_cl_EF = ref_cast(Domaine_Cl_EF, zcl);
509 ch.typer("Y_plus_Champ_Q1");
510 Y_plus_Champ_Q1& ch_yp = ref_cast(Y_plus_Champ_Q1, ch.valeur());
511 ch_yp.associer_domaine_dis_base(domaine_EF);
512 ch_yp.associer_domaine_Cl_dis_base(domaine_cl_EF);
513 ch_yp.associer_champ(vit);
514 ch_yp.nommer("Y_plus");
515 ch_yp.fixer_nb_comp(1);
516 ch_yp.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
517 ch_yp.fixer_unite("adimensionnel");
518 ch_yp.changer_temps(ch_vitesse.temps());
519}
520
521void EF_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
522{
523#ifdef dependance
524 Cerr << "Discretisation de gradient_temperature" << finl;
525 const Champ_P1_EF& temp = ref_cast(Champ_P1_EF,ch_temperature.valeur());
526 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
527 const Domaine_Cl_EF& domaine_cl_EF=ref_cast(Domaine_Cl_EF, zcl);
528 ch.typer("gradient_temperature_Champ_P1_EF");
529 grad_T_Champ_P1_EF& ch_gt=ref_cast(grad_T_Champ_P1_EF,ch.valeur());
530 ch_gt.associer_domaine_dis_base(domaine_EF);
531 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_EF);
532 ch_gt.associer_champ(temp);
533 ch_gt.nommer("gradient_temperature");
534 ch_gt.fixer_nb_comp(dimension);
535 ch_gt.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
536 ch_gt.fixer_unite("K/m");
537 ch_gt.changer_temps(ch_temperature->temps());
538#endif
539}
540
541void EF_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
542{
543#ifdef dependance
544 Cerr << "Discretisation de h_conv" << finl;
545 const Champ_P1_EF& temp = ref_cast(Champ_P1_EF,ch_temperature.valeur());
546 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
547 const Domaine_Cl_EF& domaine_cl_EF=ref_cast(Domaine_Cl_EF, zcl);
548 ch.typer("h_conv_Champ_P1_EF");
549 h_conv_Champ_P1_EF& ch_gt=ref_cast(h_conv_Champ_P1_EF,ch.valeur());
550 ch_gt.associer_domaine_dis_base(domaine_EF);
551 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_EF);
552 ch_gt.associer_champ(temp);
553 ch_gt.temp_ref()=temp_ref;
554 ////ch_gt.nommer("h_conv");
555 ch_gt.nommer(nom);
556 ch_gt.fixer_nb_comp(1);
557 ch_gt.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
558 ch_gt.fixer_unite("W/m2.K");
559 ch_gt.changer_temps(ch_temperature->temps());
560#endif
561}
562void EF_discretisation::modifier_champ_tabule(const Domaine_dis_base& domaine_vdf, Champ_Fonc_Tabule& lambda_tab, const VECT(OBS_PTR(Champ_base)) &champs_param) const
563{
564 lambda_tab.typer_champ_tabule_discretise("Champ_Fonc_Tabule_P0_EF");
565 Champ_Fonc_base& lambda_tab_dis = lambda_tab.le_champ_tabule_discretise();
566 Champ_Fonc_Tabule_P0_EF& ch_tab_lambda_dis = ref_cast(Champ_Fonc_Tabule_P0_EF, lambda_tab_dis);
567 //ch_tab_lambda_dis.nommer(nom_champ);
568 ch_tab_lambda_dis.associer_domaine_dis_base(domaine_vdf);
569 ch_tab_lambda_dis.associer_param(champs_param, lambda_tab.table());
570 ch_tab_lambda_dis.fixer_nb_comp(lambda_tab.nb_comp());
571 ch_tab_lambda_dis.fixer_nb_valeurs_nodales(domaine_vdf.nb_elem());
572// ch_tab_lambda_dis.fixer_unite(unite);
573 ch_tab_lambda_dis.changer_temps(champs_param[0]->temps());
574}
575
576Nom EF_discretisation::get_name_of_type_for(const Nom& class_operateur, const Nom& type_operateur, const Equation_base& eqn, const OBS_PTR(Champ_base) &champ_sup) const
577{
578 Nom type;
579 if (class_operateur == "Source")
580 {
581 type = type_operateur;
582 type += "_EF";
583 return type;
584 }
585 else if (class_operateur == "Solveur_Masse")
586 type = "Masse_EF";
587 else if (class_operateur == "Operateur_Grad")
588 type = "Op_Grad_EF";
589 else if (class_operateur == "Operateur_Div")
590 type = "Op_Div_EF";
591 else if (class_operateur == "Operateur_Diff")
592 {
593 type = "Op_Diff";
594 if (type_operateur != "")
595 {
596 type += "_";
597 type += type_operateur;
598 }
599 type += "_EF";
600 }
601 else if (class_operateur == "Operateur_Conv")
602 {
603 type = "Op_Conv_";
604 type += type_operateur;
605 Nom tiret = "_";
606 type += tiret;
607 type += que_suis_je();
608 }
609 else
610 return Discret_Thyd::get_name_of_type_for(class_operateur, type_operateur, eqn);
611 return type;
612}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_P0_EF
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
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 Discret_Thyd Cette classe est la classe de base representant une discretisation
OBS_PTR(Domaine) le_domaine_
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.
virtual Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operteur, const Equation_base &eqn, const OBS_PTR(Champ_base)&champ_supp=OBS_PTR(Champ_base)()) const
remplit le Nom type en focntion de la classe de operateur, du type de l'operateur et de l'equation
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_EF
Definition Domaine_EF.h:59
const Elem_EF_base & type_elem() const
Definition Domaine_EF.h:67
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
void proprietes_physiques_fluide_Ostwald(const Domaine_dis_base &, Fluide_Ostwald &, const Navier_Stokes_std &, const Champ_Inc_base &) const override
discretise en EF le fluide incompressible, donc K e N
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 EF en fonction d'une directive de discretisation.
void distance_paroi(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
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 creer_champ_vorticite(const Schema_Temps_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operateur, const Equation_base &eqn, const OBS_PTR(Champ_base) &champ_sup) const override
void vorticite(Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
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 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
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes 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 int nb_comp() const
Definition Field_base.h:56
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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
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_P1_EF &)
void associer_champ(const Champ_Q1_EF &)
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
classe Y_plus_Champ_Q1
void associer_champ(const Champ_Q1_EF &)
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)