TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Convection_Diffusion_Concentration_FT_Disc.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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#include <Convection_Diffusion_Concentration_FT_Disc.h>
16#include <Champ_P1NC.h>
17#include <Probleme_base.h>
18#include <Transport_Interfaces_FT_Disc.h>
19#include <Domaine_VEF.h>
20#include <Champ_Inc_P0_base.h>
21#include <Check_espace_virtuel.h>
22#include <Debog.h>
23#include <Domaine.h>
24#include <Sous_Domaine.h>
25#include <SFichier.h>
26#include <Param.h>
27#include <Constituant.h>
28#include <Fluide_Diphasique.h>
29#include <Fluide_Incompressible.h>
30
31Implemente_instanciable_sans_constructeur(Convection_Diffusion_Concentration_FT_Disc,"Convection_Diffusion_Concentration_FT_Disc",Convection_Diffusion_Concentration);
32
42
43/*! @brief cf Convection_Diffusion_Concentration::readOn(is)
44 *
45 */
47{
49 if (equations_source_chimie_.size() > 0)
50 {
51 Cerr << "Chemical reaction using these equations:" << equations_source_chimie_ << finl;
53 {
54 if (nom_equation_nu_t_ == "??")
55 {
56 Cerr << "Missing EQUATION_NU_T" << finl;
58 }
59 }
60 Cerr << "The kinematic model used is : modele_cinetique " << modele_cinetique_ << finl;
61 }
62
63 if (je_suis_maitre())
64 {
65 Nom nom_fic(le_nom());
66 nom_fic += "_bilan.out";
67 SFichier f(nom_fic);
68 char s[1000];
69 snprintf(s, 1000, "#%15s %16s %16s %16s %16s",
70 "temps",
71 "integrale0",
72 "integrale1",
73 "bilan_sortie",
74 "debit_sortie");
75 f << s << finl;
76 }
77
78 return is;
79}
80
82{
84 return os;
85}
86
88{
90 param.ajouter("constante_cinetique",&constante_cinetique_);
91 param.ajouter("equations_source_chimie",&equations_source_chimie_);
92 param.ajouter("modele_cinetique",&modele_cinetique_);
93 param.ajouter("constante_cinetique_nu_t",&constante_cinetique_nu_t_);
94 param.ajouter("equation_nu_t",&nom_equation_nu_t_);
95 param.ajouter("domaine_sortie",&nom_domaine_sortie_);
96 param.ajouter("phase",&phase_a_conserver_);
97 param.ajouter_condition("(value_of_phase_eq_0)_or_(value_of_phase_eq_1)","phase must be set to 0 or 1");
98 param.ajouter_non_std("equation_interface",(this),Param::REQUIRED);
99 param.ajouter_non_std("option",(this));
100}
101
103{
104 if (mot=="equation_interface")
105 {
106 Nom nom;
107 is >> nom;
108 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
109 if (!sub_type(Transport_Interfaces_FT_Disc,ref_eq_transport_.valeur()))
110 {
111 Cerr << " Error: the equation indicated for keyword equation_interface "<<finl;
112 Cerr << " is not of type (or sub type) of Transport_Interfaces_FT_Disc." << finl;
113 barrier();
115 }
116 return 1;
117 }
118 else if (mot=="option")
119 {
120 Motcle motbis;
121 is >> motbis;
122 if (motbis == "RAMASSE_MIETTES_SIMPLE")
124 else if (motbis == "RIEN")
125 option_ = RIEN;
126 else
127 {
128 Cerr << "Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
129 barrier();
131 }
132 return 1;
133 }
134 else
136}
137
138/*! @brief calcul de l'integrale du champ sur tout le domaine.
139 *
140 * A factoriser un jour quelque part...
141 *
142 */
143static double integrale(const Champ_base& ch)
144{
145 double somme = 0.;
146 if (sub_type(Champ_P1NC, ch))
147 {
148 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, ch.domaine_dis_base());
149 const DoubleTab& val = ch.valeurs();
150 assert(val.line_size() == 1);
151 const int sz = val.dimension(0);
152 const DoubleVect& volumes = domaine_vf.volumes_entrelaces();
153 const ArrOfInt& faces_doubles = domaine_vf.faces_doubles();
154 for (int i = 0; i < sz; i++)
155 {
156 const double v = volumes[i];
157 const double c = val(i);
158 const double fact = faces_doubles[i] ? 0.5 : 1.;
159 somme += v * c * fact;
160 }
161 }
162 else
163 {
164 Cerr << "Method integrale is not developped for " << ch.que_suis_je() << finl;
167 }
168 somme = Process::mp_sum(somme);
169 return somme;
170}
171
172/*! @brief calcul de l'indicatrice aux faces.
173 *
174 * .. A factoriser un jour...
175 *
176 */
177static void calculer_indicatrice_comme(const Champ_base& src, DoubleTab& dest, const Champ_base& champ_modele)
178{
179 assert(sub_type(Champ_Inc_P0_base, src));
180 if (sub_type(Champ_P1NC, champ_modele))
181 {
182 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, champ_modele.domaine_dis_base());
183 const IntTab& face_voisins = domaine_vf.face_voisins();
184 const int nb_faces = domaine_vf.nb_faces();
185 dest.resize(nb_faces);
186 const DoubleTab& indic = src.valeurs();
187 assert_espace_virtuel_vect(indic);
188 for (int i = 0; i < nb_faces; i++)
189 {
190 const int elem0 = face_voisins(i, 0);
191 const int elem1 = face_voisins(i, 1);
192 double s = 0.;
193 if (elem0 >= 0)
194 s += indic(elem0);
195 if (elem1 >= 0)
196 s += indic(elem1);
197 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
198 dest[i] = s;
199 }
200 }
201 else
202 {
203 Cerr << "Error calculer_indicatrice_comme" << finl;
205 }
206}
207
208// Application d'un traitement particulier pour conserver la masse du constituant
209// tout en l'empechant de "baver" d'une phase a l'autre.
210// Annule la concentration dans la phase qui n'est pas a conserver et
211// rescale celle de la phase a conserver pour que l'integrale soit conservee.
212// La concentration est discontinue a l'interface liquide-vapeur.
214{
215 const Transport_Interfaces_FT_Disc& eq = ref_cast(Transport_Interfaces_FT_Disc, ref_eq_transport_.valeur());
216 DoubleTab tmp;
217 Champ_base& champ_inco = inconnue();
218 DoubleTab& inco = champ_inco.valeurs();
219
220 // Calcule une indicatrice de phase localisee comme l'inconnue de l'equation
221 calculer_indicatrice_comme(eq.inconnue(), tmp, champ_inco);
222
223 // Calcul de l'integrale de la concentration dans tout le volume:
224 const double masse_totale = integrale(champ_inco);
225
226 // On met a zero la concentration dans la phase qui n'est pas a conserver
227 {
228 const int sz = inco.size();
229 assert(sz == tmp.dimension(0));
230 for (int i = 0; i < sz; i++)
231 {
232 double facteur = tmp[i];
233 if (phase_a_conserver_ == 0)
234 facteur = 1. - facteur;
235 assert(facteur > -1e-6 && facteur < 1.+1e-6);
236 inco[i] *= facteur;
237 }
238 }
239 // Que reste-t-il comme masse ?
240 const double masse_restante = integrale(champ_inco);
241 if (je_suis_maitre())
242 {
243 Journal() << "C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
244 << " masse_totale= " << masse_totale
245 << " masse_restante= " << masse_restante << finl;
246 }
247 // On multiplie la concentration par une constante pour obtenir la masse totale initiale
248 if (masse_restante > 0.)
249 inco *= (masse_totale / masse_restante);
250
252}
253
255{
256 // On va ecraser les inconnues des equations de chimie:
257 if (equations_source_chimie_.size() != 2)
258 {
259 Cerr << "Error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour_chimie()\n"
260 << "It implies two equations_source_chimie" << finl;
261 barrier();
263 }
264
265 Probleme_base& pb = mon_probleme.valeur();
268 DoubleTab& champ3 = inconnue().valeurs();
269
270 const double dt = pb.schema_temps().pas_de_temps();
271 const int nb_faces = champ1.dimension(0);
272
273 const IntTab& face_voisins = ref_cast(Domaine_VF, domaine_dis()).face_voisins();
274 const DoubleTab *champ_nu_t = 0;
275 if (nom_equation_nu_t_ != "??")
276 {
278 const RefObjU& modele_turbulence_hydr = eq.get_modele(TURBULENCE);
279 const Modele_turbulence_hyd_base& le_modele = ref_cast(Modele_turbulence_hyd_base,modele_turbulence_hydr.valeur());
280 champ_nu_t = &(le_modele.viscosite_turbulente().valeurs());
281 }
282
283 const DoubleTab& tab_diffusivite = constituant().diffusivite_constituant().valeurs();
284 double coeff_diffusivite = tab_diffusivite(0,0);
285 const DoubleVect& volumes_entrelaces = ref_cast(Domaine_VF, domaine_dis()).volumes_entrelaces();
286 const int dim = Objet_U::dimension;
287
288 const Fluide_Diphasique& fluide = ref_cast(Fluide_Diphasique, pb.milieu());
289 const Fluide_Incompressible& phase_0 = fluide.fluide_phase(0);
290 const Fluide_Incompressible& phase_1 = fluide.fluide_phase(1);
291 const DoubleTab& tab_nu_phase_0 = phase_0.viscosite_cinematique().valeurs();
292 const DoubleTab& tab_nu_phase_1 = phase_1.viscosite_cinematique().valeurs();
293 const double nu_phase_0 = tab_nu_phase_0(0,0);
294 const double nu_phase_1 = tab_nu_phase_1(0,0);
295 const double delta_nu = nu_phase_1 - nu_phase_0;
296
297 DoubleTab indic_faces;
298 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
299 indic_faces, inconnue());
300
301 for (int face = 0; face < nb_faces; face++)
302 {
303 double nu_t = 0.;
304 if (champ_nu_t)
305 {
306 int elem1 = face_voisins(face,0);
307 int elem2 = face_voisins(face,1);
308 if (elem1 < 0) elem1 = elem2;
309 if (elem2 < 0) elem2 = elem1;
310 nu_t = ((*champ_nu_t)(elem1) + (*champ_nu_t)(elem2)) * 0.5;
311 }
312 double c1 = std::max(0., champ1(face));
313 double c2 = std::max(0., champ2(face));
314 double c3 = std::max(0., champ3(face));
315
316 // ES243900
317 // Modele 1 classique
318 // Finite rate formulation.
319 if (modele_cinetique_ == 1)
320 {
321 double omega = constante_cinetique_ * (1. + constante_cinetique_nu_t_ * nu_t) * c1 * c2;
322 double Rdt = std::min(omega * dt, c1);
323 Rdt = std::min(Rdt, c2);
324
325 /* Modif des concentrations */
326 champ1(face) = c1 - Rdt;
327 champ2(face) = c2 - Rdt;
328 champ3(face) = c3 + Rdt;
329 }
330
331 // Modele 2 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
332 // traitement particulier pour n'avoir pas de c < 0
333 else if (modele_cinetique_ == 2)
334 {
335 // Besoin du modele LES !!!!
336 Cerr << "MODELE_CINETIQUE 2 requires a turbulent Concentration problem" << finl;
337 Cerr << "Replace Convection_Diffusion_Concentration_FT_Disc by Convection_Diffusion_Concentration_Turbulent_FT_Disc" << finl;
338 barrier();
340 }
341
342 // Modele 3 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
343 // traitement particulier pour n'avoir pas de c < 0
344 else if (modele_cinetique_ == 3)
345 {
346 const double indic = indic_faces[face];
347 const double nu = indic * delta_nu + nu_phase_0;
348
349 // On recalcule la longueur caracteristique de maille
350 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
351
352 const double Ci = 0.07; // from Yoshizawa's model
353 double schm = nu/coeff_diffusivite;
354
355 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
356
357 double omega = std::min(c1,c2);
358 omega = omega/std::max(dt,tm);
359 double Rdt = omega * dt;
360
361 /* Modif des concentrations */
362 champ1(face) = c1 - Rdt;
363 champ2(face) = c2 - Rdt;
364 champ3(face) = c3 + Rdt;
365 }
366
367 // Modele 4 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
368 // traitement particulier pour n'avoir pas de c < 0
369 // conclusion ==> formulation pour que modeles 2 et 3 soient equivalents
370 else if (modele_cinetique_ == 4)
371 {
372 // On recalcule la longueur caracteristique de maille
373 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
374 // merge de modele 2 et 3 ......
375 double tm = l_carac*l_carac/nu_t;
376
377 double omega = std::min(c1,c2);
378 omega = omega/std::max(dt,tm);
379 double Rdt = omega * dt;
380
381 /* Modif des concentrations */
382 champ1(face) = c1 - Rdt;
383 champ2(face) = c2 - Rdt;
384 champ3(face) = c3 + Rdt;
385 }
386
387 else
388 {
389 Cerr << "MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
390 barrier();
392 }
393
394 }
395 champ1.echange_espace_virtuel();
396 champ2.echange_espace_virtuel();
397 champ3.echange_espace_virtuel();
398}
399
400// Multiplie les valeurs des faces marquees par facteur
401// et calcule l'integrale des valeurs avant modifications
402void Convection_Diffusion_Concentration_FT_Disc::multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double& integrale_avant, DoubleTab& tab)
403{
404 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
405 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
406 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
407 const int nb_faces = domaine_vef.nb_faces();
408 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
409 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
410 int modif = (facteur != 1.);
411 double integrale = 0.;
412 for (int i = 0; i < nb_faces; i++)
413 {
414 if (marqueurs_faces[i])
415 {
416 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
417 double f = faces_doubles[i] ? 0.5 : 1.;
418 double x = tab(i);
419 integrale += vol * f * x;
420 if (modif)
421 tab(i) = facteur * x;
422 }
423 }
424 integrale_avant = mp_sum(integrale);
425}
426
428 ArrOfBit& marqueur,
429 int sans_faces_non_std_volume_nul) const
430{
431 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
432 const IntTab& elem_faces = domaine_vef.elem_faces();
433 const int nb_faces_tot = domaine_vef.nb_faces_tot();
434 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
435 const int nb_faces_elem = elem_faces.dimension(1);
436 marqueur.resize_array(nb_faces_tot);
437 marqueur = 0;
438 const Sous_Domaine& sous_domaine = domaine_dis().domaine().ss_domaine(nom_sous_domaine);
439 const int nb_elem_sous_domaine = sous_domaine.nb_elem_tot();
440 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
441 int i;
442 for (i = 0; i < nb_elem_sous_domaine; i++)
443 {
444 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
445 {
446 if (volumes_cl[i] == 0.)
447 // Ne pas marquer les faces non std de volume nul
448 continue;
449 }
450 const int elem = sous_domaine[i];
451 for (int j = 0; j < nb_faces_elem; j++)
452 {
453 const int face = elem_faces(elem,j);
454 marqueur.setbit(face);
455 }
456 }
457}
458
459/*! @brief appel a mettre_a_jour() de l'ancetre et application de l' "option_" choisie pour traiter la presence d'une interface.
460 *
461 */
463{
464 Debog::verifier("Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour c1", inconnue().valeurs());
466
467 switch(option_)
468 {
469 case RIEN:
470 break;
473 break;
474 default:
475 Cerr << "Internal error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour" << finl;
476 barrier();
478 }
479
480 if (equations_source_chimie_.size() > 0)
481 {
483 }
484
485 double integrale_sortie = 0.;
486 double integrale0 = 0.;
487 double integrale1 = 0.;
488
489 if (nom_domaine_sortie_ != "??")
490 {
491 ArrOfBit marqueur;
493 0 /* annuler les valeurs sur les faces non std */);
494 DoubleTab& tab = inconnue().valeurs();
495 multiplier_valeurs_faces(marqueur, 0., integrale_sortie, tab);
496 }
497 {
498 DoubleTab indic_faces;
499 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
500 indic_faces, inconnue());
501 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
502 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
503 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
504 const int nb_faces = domaine_vef.nb_faces();
505 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
506 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
507 const DoubleTab& inco = inconnue().valeurs();
508 for (int i = 0; i < nb_faces; i++)
509 {
510 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
511 double f = faces_doubles[i] ? 0.5 : 1.;
512 double indic = indic_faces(i);
513 double x = inco(i) * f * vol;
514 integrale0 += x * (1.-indic);
515 integrale1 += x * indic;
516 }
517 integrale0 = mp_sum(integrale0);
518 integrale1 = mp_sum(integrale1);
519 }
520 const double dt = probleme().schema_temps().pas_de_temps();
521 if (je_suis_maitre())
522 {
523 Nom nom_fic(le_nom());
524 nom_fic += "_bilan.out";
525 SFichier f(nom_fic, ios::out | ios::app);
526 char s[1000];
527 snprintf(s, 1000, "%16.8f %16.8g %16.8g %16.8g %16.8g",
528 temps,
529 integrale0,
530 integrale1,
531 integrale_sortie,
532 integrale_sortie / dt);
533 f << s << finl;
534 }
535 Debog::verifier("Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour c2", inconnue().valeurs());
536}
ArrOfBit_32_64 & resize_array(int_t n)
Change la taille du tableau et copie les donnees existantes.
Definition ArrOfBit.cpp:71
void setbit(int_t i) const
Met le bit e a 1.
Definition ArrOfBit.h:73
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
: class Champ_Inc_P0_base
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual const Domaine_dis_base & domaine_dis_base() const
const Champ_Don_base & diffusivite_constituant() const
Definition Constituant.h:36
Cette equation corrige le champ de concentration pour tenir compte de la presence d'une interface.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double &integrale_avant, DoubleTab &tab)
void marquer_faces_sous_domaine(const Nom &nom_sous_domaine, ArrOfBit &marqueur, int sans_faces_non_std_volume_nul) const
void mettre_a_jour(double temps) override
appel a mettre_a_jour() de l'ancetre et application de l' "option_" choisie pour traiter la presence ...
classe Convection_Diffusion_Concentration Cas particulier de Convection_Diffusion_std
const Constituant & constituant() const
Renvoie le constituant (si il a ete associe).
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation: la concentration.
void mettre_a_jour(double) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
class Domaine_VEF
Definition Domaine_VEF.h:54
int nb_faces_non_std() const
Definition Domaine_VEF.h:81
class Domaine_VF
Definition Domaine_VF.h:44
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
int nb_faces_tot() const
renvoie le nombre total de faces.
Definition Domaine_VF.h:481
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
Definition Domaine_VF.h:567
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Domaine & domaine() const
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....
const Nom & le_nom() const override
Renvoie le nom de l'equation.
virtual const RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Fluide_Incompressible & fluide_phase(int la_phase) const
classe Fluide_Incompressible Cette classe represente un d'un fluide incompressible ainsi que
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Champ_Fonc_base & viscosite_turbulente() const
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
Definition Param.cpp:496
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & get_equation_by_name(const Nom &) const
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
virtual Equation_base & getset_equation_by_name(const Nom &)
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
Definition Process.cpp:136
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
int_t nb_elem_tot() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
const Champ_Inc_base & inconnue() const override