TrioCFD 1.9.9_beta
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 Discretises a field for EF based on a discretisation directive.
51 *
52 * @brief The directive is a Motcle such as "vitesse", "pression",
53 * "temperature", "champ_elem" (creates a P0-type field), etc.
54 * This method determines the type of field to create based on the element type
55 * and the discretisation directive. It then determines the number of DOFs
56 * and sets all field parameters (type, nb_compo, nb_ddl, nb_pas_dt,
57 * name(s), unit(s) and field nature) and associates the Domaine_dis to the field.
58 * See the code for the correspondence between directives and the created field type.
59 * @param directive Keyword specifying the type of field to create.
60 * @param z Discretised domain.
61 * @param nature Nature of the field.
62 * @param noms Field name(s).
63 * @param unites Field unit(s).
64 * @param nb_comp Number of components.
65 * @param nb_pas_dt Number of time steps.
66 * @param temps Current time.
67 * @param champ Output field (instationary).
68 * @param sous_type Optional subtype name.
69 */
70void 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,
71 OWN_PTR(Champ_Inc_base) &champ, const Nom& sous_type) const
72{
73 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
74
75 Motcles motcles(7);
76 motcles[0] = "vitesse"; // Standard choice for velocity
77 motcles[1] = "pression"; // Standard choice for pressure
78 motcles[2] = "temperature"; // Standard choice for temperature
79 motcles[3] = "divergence_vitesse"; // Field type obtained by computing div v
80 motcles[4] = "gradient_pression"; // Field type obtained by computing grad P
81 motcles[5] = "champ_elem"; // Create an element field (P0 type)
82 motcles[6] = "champ_sommets"; // Create a vertex field (P1 type)
83
84 // The velocity field type depends on the element type:
85 Nom type_champ_vitesse;
86 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()))
87 type_champ_vitesse = "Champ_P1_EF";
88 else if (sub_type(Quadri_EF,domaine_EF.type_elem()) || sub_type(Hexa_EF, domaine_EF.type_elem()))
89 type_champ_vitesse = "Champ_Q1_EF";
90 else
91 {
92 Cerr << "EF_discretisation::discretiser_champ :\n The geometric element ";
93 Cerr << domaine_EF.type_elem().que_suis_je();
94 Cerr << " is not supported." << finl;
95 exit();
96 }
97
98 Nom type;
99 int default_nb_comp = 0; // Default number of components
100 int rang = motcles.search(directive);
101 switch(rang)
102 {
103 case 0:
104 type = type_champ_vitesse;
105 default_nb_comp = dimension;
106 break;
107 case 1:
108 type = "Champ_P0_EF";
109 default_nb_comp = 1;
110 break;
111 case 2:
112 type = type_champ_vitesse;
113 default_nb_comp = 1;
114 break;
115 case 3:
116 type = "Champ_P0_EF";
117 default_nb_comp = 1;
118 break;
119 case 4:
120 type = type_champ_vitesse;
121 default_nb_comp = dimension;
122 break;
123 case 5:
124 type = "Champ_P0_EF";
125 default_nb_comp = 1;
126 break;
127 case 6:
128 type = "Champ_P1_EF";
129 default_nb_comp = 1;
130 break;
131 default:
132 assert(rang < 0);
133 break;
134 }
135
136 if (directive == DEMANDE_DESCRIPTION)
137 Cerr << "EF_discretisation : " << motcles;
138
139 // If the directive was not understood (or it is a description request),
140 // call the parent:
141 if (rang < 0)
142 {
143 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
144 return;
145 }
146
147 // Compute the number of DOFs
148 int nb_ddl = 0;
149 if (type == "Champ_P0_EF")
150 nb_ddl = z.nb_elem();
151 else if (type == type_champ_vitesse)
152 nb_ddl = domaine_EF.nb_som();
153 else if (type == "Champ_P1_EF")
154 nb_ddl = domaine_EF.nb_som();
155 else
156 assert(0);
157
158 // If it is a multi-scalar field:
159 /* if (nature == multi_scalaire) {
160 // Pas encore code
161 Cerr << "Champ multi_scalaire pas code" << finl;
162 assert(0); exit();
163 } else {*/
164 if (nb_comp < 0)
165 nb_comp = default_nb_comp;
166 assert(nb_comp > 0);
167 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive, que_suis_je());
168 if (nature == multi_scalaire)
169 {
170 champ->fixer_nature_du_champ(nature);
171 champ->fixer_unites(unites);
172 champ->fixer_noms_compo(noms);
173 }
174}
175
176/*! @brief Same as EF_discretisation::discretiser_champ(..., Champ_Inc).
177 *
178 * @param directive Keyword specifying the type of field to create.
179 * @param z Discretised domain.
180 * @param nature Nature of the field.
181 * @param noms Field name(s).
182 * @param unites Field unit(s).
183 * @param nb_comp Number of components.
184 * @param temps Current time.
185 * @param champ Output functional field.
186 */
187void 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,
188 OWN_PTR(Champ_Fonc_base) &champ) const
189{
190 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
191}
192
193/*! @brief Same as EF_discretisation::discretiser_champ(..., Champ_Inc).
194 *
195 * @param directive Keyword specifying the type of field to create.
196 * @param z Discretised domain.
197 * @param nature Nature of the field.
198 * @param noms Field name(s).
199 * @param unites Field unit(s).
200 * @param nb_comp Number of components.
201 * @param temps Current time.
202 * @param champ Output given field.
203 */
204void 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,
205 OWN_PTR(Champ_Don_base)& champ) const
206{
207 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
208}
209
210/*! @brief Same as EF_discretisation::discretiser_champ(..., Champ_Inc).
211 *
212 * Common handling for champ_fonc and champ_don.
213 * This method is private (passing an Objet_U is not clean from outside).
214 * @param directive Keyword specifying the type of field to create.
215 * @param z Discretised domain.
216 * @param nature Nature of the field.
217 * @param noms Field name(s).
218 * @param unites Field unit(s).
219 * @param nb_comp Number of components.
220 * @param temps Current time.
221 * @param champ Output field object (Champ_Fonc_base or Champ_Don_base).
222 */
223void 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,
224 Objet_U& champ) const
225{
226 // Two pointers to access champ_don or champ_fonc easily, depending on the type of the champ object.
227 OWN_PTR(Champ_Fonc_base) *champ_fonc = dynamic_cast<OWN_PTR(Champ_Fonc_base)*>(&champ);
228 OWN_PTR(Champ_Don_base) *champ_don = dynamic_cast<OWN_PTR(Champ_Don_base)*>(&champ);
229
230 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
231
232 Motcles motcles(7);
233 motcles[0] = "pression"; // Standard choice for pressure
234 motcles[1] = "temperature"; // Standard choice for temperature
235 motcles[2] = "divergence_vitesse"; // Field type obtained by computing div v
236 motcles[3] = "champ_elem"; // Create an element field (P0 type)
237 motcles[6] = "champ_sommets"; // Create a vertex field (P1 type)
238 motcles[4] = "vitesse"; // Standard choice for velocity
239 motcles[5] = "gradient_pression"; // Field type obtained by computing grad P
240
241 // The velocity field type depends on the element type:
242 Nom type_champ_vitesse;
243 {
244 const Elem_EF_base& elem_EF = domaine_EF.type_elem();
245 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))
246 type_champ_vitesse = "Champ_Fonc_P1_EF";
247 else if (sub_type(Quadri_EF, elem_EF) || sub_type(Hexa_EF, elem_EF))
248 type_champ_vitesse = "Champ_Fonc_Q1_EF";
249 else
250 {
251 Cerr << "EF_discretisation::discretiser_champ :\n The geometric element ";
252 Cerr << elem_EF.que_suis_je();
253 Cerr << " is not supported." << finl;
254 exit();
255 }
256 }
257 Nom type;
258 int default_nb_comp = 0; // Default number of components
259 int rang = motcles.search(directive);
260 switch(rang)
261 {
262 case 0:
263 type = "Champ_Fonc_P0_EF";
264 default_nb_comp = 1;
265 break;
266 case 1:
267 type = type_champ_vitesse;
268 default_nb_comp = 1;
269 break;
270 case 2:
271 type = "Champ_Fonc_P0_EF";
272 default_nb_comp = 1;
273 break;
274 case 3:
275 type = "Champ_Fonc_P0_EF";
276 default_nb_comp = 1;
277 break;
278 case 4:
279 type = type_champ_vitesse;
280 default_nb_comp = dimension;
281 break;
282 case 5:
283 type = type_champ_vitesse;
284 default_nb_comp = dimension;
285 break;
286 case 6:
287 type = type_champ_vitesse;
288 default_nb_comp = 1;
289 break;
290 default:
291 assert(rang < 0);
292 break;
293 }
294
295 if (directive == DEMANDE_DESCRIPTION)
296 Cerr << "EF_discretisation : " << motcles;
297
298 // If the directive was not understood (or it is a description request),
299 // call the parent:
300 if (rang < 0)
301 {
302 if (champ_fonc)
303 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
304 else
305 Discret_Thyd::discretiser_champ(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
306 return;
307 }
308
309 // Compute the number of DOFs
310 int nb_ddl = 0;
311 if (type == "Champ_Fonc_P0_EF")
312 nb_ddl = z.nb_elem();
313 else if (type == type_champ_vitesse)
314 nb_ddl = domaine_EF.nb_som();
315 else
316 assert(0);
317
318 /* // If it is a multi-scalar field, uh!
319 if (nature == multi_scalaire)
320 {
321 // Not yet implemented
322 Cerr << "Champ multi_scalaire pas code" << finl;
323 assert(0);
324 exit();
325 }
326 else */
327 {
328 if (nb_comp < 0)
329 nb_comp = default_nb_comp;
330 assert(nb_comp > 0);
331 if (champ_fonc)
332 creer_champ(*champ_fonc, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
333 else
334 creer_champ(*champ_don, z, type, noms[0], unites[0], nb_comp, nb_ddl, temps, directive, que_suis_je());
335 }
336
337 if ((nature == multi_scalaire) && (champ_fonc))
338 {
339 champ_fonc->valeur().fixer_nature_du_champ(nature);
340 champ_fonc->valeur().fixer_unites(unites);
341 champ_fonc->valeur().fixer_noms_compo(noms);
342 }
343 else if ((nature == multi_scalaire) && (champ_don))
344 {
345 Cerr << "There is no field of type OWN_PTR(Champ_Don_base) with a multi_scalaire nature." << finl;
346 exit();
347 }
348
349}
350
352{
353 Cerr << "Discretisation de la distance paroi" << finl;
354 Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
355 ch.typer("Champ_Fonc_P0_EF");
356 Champ_Fonc_P0_EF& ch_dist_paroi = ref_cast(Champ_Fonc_P0_EF, ch.valeur());
357 ch_dist_paroi.associer_domaine_dis_base(domaine_EF);
358 ch_dist_paroi.nommer("distance_paroi");
359 ch_dist_paroi.fixer_nb_comp(1);
360 ch_dist_paroi.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
361 ch_dist_paroi.fixer_unite("m");
362 ch_dist_paroi.changer_temps(sch.temps_courant());
363}
364
366{
367 Cerr << "Discretisation de la vorticite " << finl;
368 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
369
370 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()))
371 {
372 ch.typer("Rotationnel_Champ_P1_EF");
373 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF, ch_vitesse);
374 Rotationnel_Champ_P1_EF& ch_W = ref_cast(Rotationnel_Champ_P1_EF, ch.valeur());
375 ch_W.associer_domaine_dis_base(domaine_EF);
376 ch_W.associer_champ(vit);
377 ch_W.nommer("vorticite");
378 if (dimension == 2)
379 ch_W.fixer_nb_comp(1);
380 else
381 {
383 ch_W.fixer_nom_compo(0, "vorticitex");
384 ch_W.fixer_nom_compo(1, "vorticitey");
385 ch_W.fixer_nom_compo(2, "vorticitez");
386 }
387 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
388 ch_W.fixer_unite("s-1");
389 ch_W.changer_temps(ch_vitesse.temps());
390 }
391 else if (sub_type(Quadri_EF,domaine_EF.type_elem()) || sub_type(Hexa_EF, domaine_EF.type_elem()))
392 {
393 ch.typer("Rotationnel_Champ_Q1_EF");
394 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
395 Rotationnel_Champ_Q1_EF& ch_W = ref_cast(Rotationnel_Champ_Q1_EF, ch.valeur());
396 ch_W.associer_domaine_dis_base(domaine_EF);
397 ch_W.associer_champ(vit);
398 ch_W.nommer("vorticite");
399 if (dimension == 2)
400 ch_W.fixer_nb_comp(1);
401 else
402 {
404 ch_W.fixer_nom_compo(0, "vorticitex");
405 ch_W.fixer_nom_compo(1, "vorticitey");
406 ch_W.fixer_nom_compo(2, "vorticitez");
407 }
408 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
409 ch_W.fixer_unite("s-1");
410 ch_W.changer_temps(ch_vitesse.temps());
411 }
412 else
413 {
414 Cerr << "Pb dans le typage des elements dans EF_discretisation::vorticite" << finl;
415 exit();
416 }
417}
418
420{
421 if (sub_type(Champ_P1_EF, ch_vitesse))
422 {
423 ch.typer("Rotationnel_Champ_P1_EF");
424 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF, ch_vitesse);
425 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, vit.domaine_dis_base());
426 Rotationnel_Champ_P1_EF& ch_W = ref_cast(Rotationnel_Champ_P1_EF, ch.valeur());
427 ch_W.associer_domaine_dis_base(domaine_EF);
428 ch_W.associer_champ(vit);
429 ch_W.nommer("vorticite");
430 if (dimension == 2)
431 ch_W.fixer_nb_comp(1);
432 else
433 {
435 ch_W.fixer_nom_compo(0, "vorticitex");
436 ch_W.fixer_nom_compo(1, "vorticitey");
437 ch_W.fixer_nom_compo(2, "vorticitez");
438 }
439 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
440 ch_W.fixer_unite("s-1");
441 ch_W.changer_temps(sch.temps_courant());
442 }
443 else if (sub_type(Champ_Q1_EF, ch_vitesse))
444 {
445 ch.typer("Rotationnel_Champ_Q1_EF");
446 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
447 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, vit.domaine_dis_base());
448 Rotationnel_Champ_Q1_EF& ch_W = ref_cast(Rotationnel_Champ_Q1_EF, ch.valeur());
449 ch_W.associer_domaine_dis_base(domaine_EF);
450 ch_W.associer_champ(vit);
451 ch_W.nommer("vorticite");
452 if (dimension == 2)
453 ch_W.fixer_nb_comp(1);
454 else
455 {
457 ch_W.fixer_nom_compo(0, "vorticitex");
458 ch_W.fixer_nom_compo(1, "vorticitey");
459 ch_W.fixer_nom_compo(2, "vorticitez");
460 }
461 ch_W.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
462 ch_W.fixer_unite("s-1");
463 ch_W.changer_temps(sch.temps_courant());
464 }
465 else
466 {
467 Cerr << "Pb dans le typage des elements dans EF_discretisation::creer_champ_vorticite" << finl;
468 exit();
469 }
470}
471
472/*! @brief Discretises the incompressible Ostwald fluid in EF, i.e. K, N.
473 *
474 * @param z Domain to discretise.
475 * @param le_fluide Ostwald fluid to discretise.
476 * @param eqn_hydr Hydraulic equation.
477 * @param ch_temper Temperature field.
478 */
480{
481
482#ifdef dependance
483 Cerr << "Discretisation EF du fluide_Ostwald" << finl;
484 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
485 const Champ_Inc_base& ch_vitesse = eqn_hydr.inconnue();
486 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF,ch_vitesse);
487
488 Champ_Don_base& mu = le_fluide.viscosite_dynamique();
489 // mu is always a champ_Ostwald_EF, so the following must always be done
490 Champ_Ostwald_EF& ch_mu = ref_cast(Champ_Ostwald_EF,mu);
491 Cerr<<"associe domainedisbase EF"<<finl;
492 ch_mu.associer_domaine_dis_base(domaine_EF);
493 ch_mu.associer_fluide(le_fluide);
494 ch_mu.associer_champ(vit);
495 ch_mu.associer_eqn(eqn_hydr);
496 Cerr<<"associations finies domaine dis base, fluide, champ EF"<<finl;
497 ch_mu.fixer_nb_comp(1);
498
499 Cerr<<"fait fixer_nb_valeurs_nodales"<<finl;
500 Cerr<<"nb_valeurs_nodales EF = "<<domaine_EF.nb_elem()<<finl;
501 ch_mu.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
502
503 Cerr<<"fait changer_temps"<<finl;
504 ch_mu.changer_temps(vit->temps());
505 Cerr<<"mu EF est discretise "<<finl;
506#endif
507}
508
509void 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
510{
511#ifdef dependance
512 // We pass zcl so there is only one method regardless of the discretization,
513 // but we do not actually use it!!!
514 Cerr << "Discretisation du critere Q " << finl;
515 const Champ_P1_EF& vit = ref_cast(Champ_P1_EF,ch_vitesse);
516 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
517 ch.typer("Critere_Q_Champ_P1_EF");
518 Critere_Q_Champ_P1_EF& ch_cQ=ref_cast(Critere_Q_Champ_P1_EF,ch.valeur());
519 ch_cQ.associer_domaine_dis_base(domaine_EF);
520 ch_cQ.associer_champ(vit);
521 ch_cQ.nommer("Critere_Q");
522 ch_cQ.fixer_nb_comp(1);
523 ch_cQ.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
524 ch_cQ.fixer_unite("s-2");
525 ch_cQ.changer_temps(ch_vitesse.temps());
526#endif
527}
528
529void 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
530{
531 Cerr << "Discretisation de y_plus" << finl;
532 const Champ_Q1_EF& vit = ref_cast(Champ_Q1_EF, ch_vitesse);
533 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, z);
534 const Domaine_Cl_EF& domaine_cl_EF = ref_cast(Domaine_Cl_EF, zcl);
535 ch.typer("Y_plus_Champ_Q1");
536 Y_plus_Champ_Q1& ch_yp = ref_cast(Y_plus_Champ_Q1, ch.valeur());
537 ch_yp.associer_domaine_dis_base(domaine_EF);
538 ch_yp.associer_domaine_Cl_dis_base(domaine_cl_EF);
539 ch_yp.associer_champ(vit);
540 ch_yp.nommer("Y_plus");
541 ch_yp.fixer_nb_comp(1);
542 ch_yp.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
543 ch_yp.fixer_unite("adimensionnel");
544 ch_yp.changer_temps(ch_vitesse.temps());
545}
546
547void 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
548{
549#ifdef dependance
550 Cerr << "Discretisation de gradient_temperature" << finl;
551 const Champ_P1_EF& temp = ref_cast(Champ_P1_EF,ch_temperature.valeur());
552 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
553 const Domaine_Cl_EF& domaine_cl_EF=ref_cast(Domaine_Cl_EF, zcl);
554 ch.typer("gradient_temperature_Champ_P1_EF");
555 grad_T_Champ_P1_EF& ch_gt=ref_cast(grad_T_Champ_P1_EF,ch.valeur());
556 ch_gt.associer_domaine_dis_base(domaine_EF);
557 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_EF);
558 ch_gt.associer_champ(temp);
559 ch_gt.nommer("gradient_temperature");
560 ch_gt.fixer_nb_comp(dimension);
561 ch_gt.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
562 ch_gt.fixer_unite("K/m");
563 ch_gt.changer_temps(ch_temperature->temps());
564#endif
565}
566
567void 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
568{
569#ifdef dependance
570 Cerr << "Discretisation de h_conv" << finl;
571 const Champ_P1_EF& temp = ref_cast(Champ_P1_EF,ch_temperature.valeur());
572 const Domaine_EF& domaine_EF=ref_cast(Domaine_EF, z);
573 const Domaine_Cl_EF& domaine_cl_EF=ref_cast(Domaine_Cl_EF, zcl);
574 ch.typer("h_conv_Champ_P1_EF");
575 h_conv_Champ_P1_EF& ch_gt=ref_cast(h_conv_Champ_P1_EF,ch.valeur());
576 ch_gt.associer_domaine_dis_base(domaine_EF);
577 ch_gt.associer_domaine_Cl_dis_base(domaine_cl_EF);
578 ch_gt.associer_champ(temp);
579 ch_gt.temp_ref()=temp_ref;
580 ////ch_gt.nommer("h_conv");
581 ch_gt.nommer(nom);
582 ch_gt.fixer_nb_comp(1);
583 ch_gt.fixer_nb_valeurs_nodales(domaine_EF.nb_elem());
584 ch_gt.fixer_unite("W/m2.K");
585 ch_gt.changer_temps(ch_temperature->temps());
586#endif
587}
588void 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
589{
590 lambda_tab.typer_champ_tabule_discretise("Champ_Fonc_Tabule_P0_EF");
591 Champ_Fonc_base& lambda_tab_dis = lambda_tab.le_champ_tabule_discretise();
592 Champ_Fonc_Tabule_P0_EF& ch_tab_lambda_dis = ref_cast(Champ_Fonc_Tabule_P0_EF, lambda_tab_dis);
593 //ch_tab_lambda_dis.nommer(nom_champ);
594 ch_tab_lambda_dis.associer_domaine_dis_base(domaine_vdf);
595 ch_tab_lambda_dis.associer_param(champs_param, lambda_tab.table());
596 ch_tab_lambda_dis.fixer_nb_comp(lambda_tab.nb_comp());
597 ch_tab_lambda_dis.fixer_nb_valeurs_nodales(domaine_vdf.nb_elem());
598// ch_tab_lambda_dis.fixer_unite(unite);
599 ch_tab_lambda_dis.changer_temps(champs_param[0]->temps());
600}
601
602Nom 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
603{
604 Nom type;
605 if (class_operateur == "Source")
606 {
607 type = type_operateur;
608 type += "_EF";
609 return type;
610 }
611 else if (class_operateur == "Solveur_Masse")
612 type = "Masse_EF";
613 else if (class_operateur == "Operateur_Grad")
614 type = "Op_Grad_EF";
615 else if (class_operateur == "Operateur_Div")
616 type = "Op_Div_EF";
617 else if (class_operateur == "Operateur_Diff")
618 {
619 type = "Op_Diff";
620 if (type_operateur != "")
621 {
622 type += "_";
623 type += type_operateur;
624 }
625 type += "_EF";
626 }
627 else if (class_operateur == "Operateur_Conv")
628 {
629 type = "Op_Conv_";
630 type += type_operateur;
631 Nom tiret = "_";
632 type += tiret;
633 type += que_suis_je();
634 }
635 else
636 return Discret_Thyd::get_name_of_type_for(class_operateur, type_operateur, eqn);
637 return type;
638}
class Champ_Don_base base class of Given Fields (not calculated)
class Champ_Fonc_P0_EF
int fixer_nb_valeurs_nodales(int n) override
Sets the number of degrees of freedom per component.
void associer_param(const VECT(OBS_PTR(Champ_base))&, const Table &)
Class Champ_Fonc_Tabule Derived class of Champ_Fonc_base representing.
const Table & table() const
void typer_champ_tabule_discretise(const Nom &typ)
const Champ_Fonc_base & le_champ_tabule_discretise() const
Returns the computed tabulated field.
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
void associer_domaine_dis_base(const Domaine_dis_base &) override
Class Champ_Inc_base.
const Domaine_dis_base & domaine_dis_base() const override
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
virtual double changer_temps(const double t)
Sets the time at which the field is defined.
double temps() const
Returns the time of the field.
class Discret_Thyd This class is the base class representing a discretization
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)
Static method that creates an OWN_PTR(Champ_Inc_base) of the specified type.
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
Fills the Nom type depending on the class of operator, the type of operator and the 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
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_EF
Definition Domaine_EF.h:56
const Elem_EF_base & type_elem() const
Definition Domaine_EF.h:64
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
void proprietes_physiques_fluide_Ostwald(const Domaine_dis_base &, Fluide_Ostwald &, const Navier_Stokes_std &, const Champ_Inc_base &) const override
Discretises the incompressible Ostwald fluid in EF, i.e. K, 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
Discretises a field for EF based on a discretisation directive.
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
class Equation_base The role of an equation is the calculation of one or more fields....
virtual void fixer_nb_comp(int i)
Sets the number of components of the field.
void nommer(const Nom &) override
Gives a name to the field.
virtual const Nom & fixer_unite(const Nom &)
Specifies the unit of a scalar field or whose all components have the same unit.
virtual int nb_comp() const
Definition Field_base.h:56
virtual const Nom & fixer_nom_compo(int, const Nom &)
Sets the name of the i-th component of the field.
class Fluide_Ostwald
const Champ_Don_base & viscosite_dynamique() const
Definition Fluide_base.h:58
A character string (Nom) in uppercase.
Definition Motcle.h:26
An array of Motcle objects.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:319
Navier_Stokes_std This class carries the terms of the momentum equation.
const Champ_Inc_base & inconnue() const override
Returns the velocity (unknown field of the equation) (const version).
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
An array of character strings (VECT(Nom)).
Definition Noms.h:26
Base class for TRUST objects (Objet_U).
Definition Objet_U.h:68
static int dimension
Definition Objet_U.h:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
void associer_champ(const Champ_P1_EF &)
void associer_champ(const Champ_Q1_EF &)
class Schema_Temps_base
double temps_courant() const
Returns the current time.
Base class for output streams.
Definition Sortie.h:52
class 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)