TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Convection_Diffusion_Concentration_Turbulent_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_Turbulent_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 <Modele_turbulence_scal_Schmidt.h>
29#include <Fluide_Diphasique.h>
30#include <Fluide_Incompressible.h>
31
32Implemente_instanciable_sans_constructeur(Convection_Diffusion_Concentration_Turbulent_FT_Disc,"Convection_Diffusion_Concentration_Turbulent_FT_Disc",Convection_Diffusion_Concentration_Turbulent);
33
43
44/*! @brief cf Convection_Diffusion_Concentration::readOn(is)
45 *
46 */
48{
50 if (equations_source_chimie_.size() > 0)
51 {
52 Cerr << "Chemical reaction using these equations:" << equations_source_chimie_ << finl;
54 {
55 if (nom_equation_nu_t_ == "??")
56 {
57 Cerr << "Missing EQUATION_NU_T" << finl;
59 }
60 }
61 Cerr << "The kinematic model used is : modele_cinetique " << modele_cinetique_ << finl;
62 }
63
64 if (je_suis_maitre())
65 {
66 Nom nom_fic(le_nom());
67 nom_fic += "_bilan.out";
68 SFichier f(nom_fic);
69 char s[1000];
70 snprintf(s, 1000, "#%15s %16s %16s %16s %16s",
71 "temps",
72 "integrale0",
73 "integrale1",
74 "bilan_sortie",
75 "debit_sortie");
76 f << s << finl;
77 }
78
79 return is;
80}
81
83{
85 return os;
86}
87
89{
91 param.ajouter("constante_cinetique",&constante_cinetique_);
92 param.ajouter("equations_source_chimie",&equations_source_chimie_);
93 param.ajouter("modele_cinetique",&modele_cinetique_);
94 param.ajouter("constante_cinetique_nu_t",&constante_cinetique_nu_t_);
95 param.ajouter("equation_nu_t",&nom_equation_nu_t_);
96 param.ajouter("domaine_sortie",&nom_domaine_sortie_);
97 param.ajouter("phase",&phase_a_conserver_);
98 param.ajouter_condition("(value_of_phase_eq_0)_or_(value_of_phase_eq_1)","phase must be set to 0 or 1");
99 param.ajouter_non_std("equation_interface",(this),Param::REQUIRED);
100 param.ajouter_non_std("option",(this));
101}
102
104{
105 if (mot=="equation_interface")
106 {
107 Nom nom;
108 is >> nom;
109 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
110 if (!sub_type(Transport_Interfaces_FT_Disc,ref_eq_transport_.valeur()))
111 {
112 Cerr << " Error: the equation indicated for keyword equation_interface "<<finl;
113 Cerr << " is not of type (or sub type) of Transport_Interfaces_FT_Disc." << finl;
114 barrier();
116 }
117 return 1;
118 }
119 else if (mot=="option")
120 {
121 Motcle motbis;
122 is >> motbis;
123 if (motbis == "RAMASSE_MIETTES_SIMPLE")
125 else if (motbis == "RIEN")
126 option_ = RIEN;
127 else
128 {
129 Cerr << "Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
130 barrier();
132 }
133 return 1;
134 }
135 else
137}
138
139/*! @brief calcul de l'integrale du champ sur tout le domaine.
140 *
141 * A factoriser un jour quelque part...
142 *
143 */
144static double integrale(const Champ_base& ch)
145{
146 double somme = 0.;
147 if (sub_type(Champ_P1NC, ch))
148 {
149 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, ch.domaine_dis_base());
150 const DoubleTab& val = ch.valeurs();
151 assert(val.line_size() == 1);
152 const int sz = val.dimension(0);
153 const DoubleVect& volumes = domaine_vf.volumes_entrelaces();
154 const ArrOfInt& faces_doubles = domaine_vf.faces_doubles();
155 for (int i = 0; i < sz; i++)
156 {
157 const double v = volumes[i];
158 const double c = val(i);
159 const double fact = faces_doubles[i] ? 0.5 : 1.;
160 somme += v * c * fact;
161 }
162 }
163 else
164 {
165 Cerr << "Method integrale is not developped for " << ch.que_suis_je() << finl;
168 }
169 somme = Process::mp_sum(somme);
170 return somme;
171}
172
173/*! @brief calcul de l'indicatrice aux faces.
174 *
175 * .. A factoriser un jour...
176 *
177 */
178static void calculer_indicatrice_comme(const Champ_base& src, DoubleTab& dest, const Champ_base& champ_modele)
179{
180 assert(sub_type(Champ_Inc_P0_base, src));
181 if (sub_type(Champ_P1NC, champ_modele))
182 {
183 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, champ_modele.domaine_dis_base());
184 const IntTab& face_voisins = domaine_vf.face_voisins();
185 const int nb_faces = domaine_vf.nb_faces();
186 dest.resize(nb_faces);
187 const DoubleTab& indic = src.valeurs();
188 assert_espace_virtuel_vect(indic);
189 for (int i = 0; i < nb_faces; i++)
190 {
191 const int elem0 = face_voisins(i, 0);
192 const int elem1 = face_voisins(i, 1);
193 double s = 0.;
194 if (elem0 >= 0)
195 s += indic(elem0);
196 if (elem1 >= 0)
197 s += indic(elem1);
198 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
199 dest[i] = s;
200 }
201 }
202 else
203 {
204 Cerr << "Error calculer_indicatrice_comme" << finl;
206 }
207}
208
209// Application d'un traitement particulier pour conserver la masse du constituant
210// tout en l'empechant de "baver" d'une phase a l'autre.
211// Annule la concentration dans la phase qui n'est pas a conserver et
212// rescale celle de la phase a conserver pour que l'integrale soit conservee.
213// La concentration est discontinue a l'interface liquide-vapeur.
215{
216 const Transport_Interfaces_FT_Disc& eq = ref_cast(Transport_Interfaces_FT_Disc, ref_eq_transport_.valeur());
217 DoubleTab tmp;
218 Champ_base& champ_inco = inconnue();
219 DoubleTab& inco = champ_inco.valeurs();
220
221 // Calcule une indicatrice de phase localisee comme l'inconnue de l'equation
222 calculer_indicatrice_comme(eq.inconnue(), tmp, champ_inco);
223
224 // Calcul de l'integrale de la concentration dans tout le volume:
225 const double masse_totale = integrale(champ_inco);
226
227 // On met a zero la concentration dans la phase qui n'est pas a conserver
228 {
229 const int sz = inco.size();
230 assert(sz == tmp.dimension(0));
231 for (int i = 0; i < sz; i++)
232 {
233 double facteur = tmp[i];
234 if (phase_a_conserver_ == 0)
235 facteur = 1. - facteur;
236 assert(facteur > -1e-6 && facteur < 1.+1e-6);
237 inco[i] *= facteur;
238 }
239 }
240 // Que reste-t-il comme masse ?
241 const double masse_restante = integrale(champ_inco);
242 if (je_suis_maitre())
243 {
244 Journal() << "C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
245 << " masse_totale= " << masse_totale
246 << " masse_restante= " << masse_restante << finl;
247 }
248 // On multiplie la concentration par une constante pour obtenir la masse totale initiale
249 if (masse_restante > 0.)
250 inco *= (masse_totale / masse_restante);
251
253}
254
256{
257 // On va ecraser les inconnues des equations de chimie:
258 if (equations_source_chimie_.size() != 2)
259 {
260 Cerr << "Error for method Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour_chimie()\n"
261 << "It implies two equations_source_chimie" << finl;
262 barrier();
264 }
265
266 Probleme_base& pb = mon_probleme.valeur();
269 DoubleTab& champ3 = inconnue().valeurs();
270
271 const double dt = pb.schema_temps().pas_de_temps();
272 const int nb_faces = champ1.dimension(0);
273
274 const IntTab& face_voisins = ref_cast(Domaine_VF, domaine_dis()).face_voisins();
275 const DoubleTab *champ_nu_t = 0;
276 if (nom_equation_nu_t_ != "??")
277 {
279 const RefObjU& modele_turbulence_hydr = eq.get_modele(TURBULENCE);
280 const Modele_turbulence_hyd_base& le_modele = ref_cast(Modele_turbulence_hyd_base,modele_turbulence_hydr.valeur());
281 champ_nu_t = &(le_modele.viscosite_turbulente().valeurs());
282 }
283
285 const RefObjU& modele_turbulence_scal = eq_scal.get_modele(TURBULENCE);
286 const Modele_turbulence_scal_base& le_modele_scal = ref_cast(Modele_turbulence_scal_base,modele_turbulence_scal.valeur());
287 const Modele_turbulence_scal_Schmidt& le_modele_scal_sc = ref_cast(Modele_turbulence_scal_Schmidt,le_modele_scal);
288
289 double sc_t = le_modele_scal_sc.get_Scturb();
290 if (modele_cinetique_ == 2)
291 Cerr << "Reaction model dependent of the turbulent Schmidt number which is defined as " << sc_t << finl;
292
293 const DoubleTab& tab_diffusivite = constituant().diffusivite_constituant().valeurs();
294 double coeff_diffusivite = tab_diffusivite(0,0);
295 const DoubleVect& volumes_entrelaces = ref_cast(Domaine_VF, domaine_dis()).volumes_entrelaces();
296 const int dim = Objet_U::dimension;
297
298 const Fluide_Diphasique& fluide = ref_cast(Fluide_Diphasique, pb.milieu());
299 const Fluide_Incompressible& phase_0 = fluide.fluide_phase(0);
300 const Fluide_Incompressible& phase_1 = fluide.fluide_phase(1);
301 const DoubleTab& tab_nu_phase_0 = phase_0.viscosite_cinematique().valeurs();
302 const DoubleTab& tab_nu_phase_1 = phase_1.viscosite_cinematique().valeurs();
303 const double nu_phase_0 = tab_nu_phase_0(0,0);
304 const double nu_phase_1 = tab_nu_phase_1(0,0);
305 const double delta_nu = nu_phase_1 - nu_phase_0;
306
307 DoubleTab indic_faces;
308 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
309 indic_faces, inconnue());
310
311 for (int face = 0; face < nb_faces; face++)
312 {
313 double nu_t = 0.;
314 if (champ_nu_t)
315 {
316 int elem1 = face_voisins(face,0);
317 int elem2 = face_voisins(face,1);
318 if (elem1 < 0) elem1 = elem2;
319 if (elem2 < 0) elem2 = elem1;
320 nu_t = ((*champ_nu_t)(elem1) + (*champ_nu_t)(elem2)) * 0.5;
321 }
322 double c1 = std::max(0., champ1(face));
323 double c2 = std::max(0., champ2(face));
324 double c3 = std::max(0., champ3(face));
325
326 // Modele 1 classique rapport B. Zoppe
327 if (modele_cinetique_ == 1)
328 {
329 double omega = constante_cinetique_ * (1. + constante_cinetique_nu_t_ * nu_t) * c1 * c2;
330 double Rdt = std::min(omega * dt, c1);
331 Rdt = std::min(Rdt, c2);
332
333 /* Modif des concentrations */
334 champ1(face) = c1 - Rdt;
335 champ2(face) = c2 - Rdt;
336 champ3(face) = c3 + Rdt;
337 }
338
339 // Modele 2 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
340 // traitement particulier pour n'avoir pas de c < 0
341 else if (modele_cinetique_ == 2)
342 {
343 // On recalcule la longueur caracteristique de maille
344 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
345 double tm = l_carac*l_carac/(coeff_diffusivite + nu_t/sc_t);
346
347 double omega = std::min(c1,c2);
348 omega = omega/std::max(dt,tm);
349 double Rdt = omega * dt;
350
351 /* Modif des concentrations */
352 champ1(face) = c1 - Rdt;
353 champ2(face) = c2 - Rdt;
354 champ3(face) = c3 + Rdt;
355 }
356
357 // Modele 3 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
358 // traitement particulier pour n'avoir pas de c < 0
359 else if (modele_cinetique_ == 3)
360 {
361 const double indic = indic_faces[face];
362 const double nu = indic * delta_nu + nu_phase_0;
363
364 // On recalcule la longueur caracteristique de maille
365 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
366
367 const double Ci = 0.07; // from Yoshizawa's model
368 double schm = nu/coeff_diffusivite;
369
370 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
371
372 double omega = std::min(c1,c2);
373 omega = omega/std::max(dt,tm);
374 double Rdt = omega * dt;
375
376 /* Modif des concentrations */
377 champ1(face) = c1 - Rdt;
378 champ2(face) = c2 - Rdt;
379 champ3(face) = c3 + Rdt;
380 }
381
382 // Modele 4 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
383 // traitement particulier pour n'avoir pas de c < 0
384 // conclusion ==> formulation pour que modeles 2 et 3 soient equivalents
385 else if (modele_cinetique_ == 4)
386 {
387 // On recalcule la longueur caracteristique de maille
388 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
389 // merge de modele 2 et 3 ......
390 double tm = l_carac*l_carac/nu_t;
391
392 double omega = std::min(c1,c2);
393 omega = omega/std::max(dt,tm);
394 double Rdt = omega * dt;
395
396 /* Modif des concentrations */
397 champ1(face) = c1 - Rdt;
398 champ2(face) = c2 - Rdt;
399 champ3(face) = c3 + Rdt;
400 }
401
402 else
403 {
404 Cerr << "MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
405 barrier();
407 }
408
409 }
410 champ1.echange_espace_virtuel();
411 champ2.echange_espace_virtuel();
412 champ3.echange_espace_virtuel();
413}
414
415// Multiplie les valeurs des faces marquees par facteur
416// et calcule l'integrale des valeurs avant modifications
417void Convection_Diffusion_Concentration_Turbulent_FT_Disc::multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double& integrale_avant, DoubleTab& tab)
418{
419 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
420 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
421 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
422 const int nb_faces = domaine_vef.nb_faces();
423 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
424 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
425 int modif = (facteur != 1.);
426 double integrale = 0.;
427 for (int i = 0; i < nb_faces; i++)
428 {
429 if (marqueurs_faces[i])
430 {
431 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
432 double f = faces_doubles[i] ? 0.5 : 1.;
433 double x = tab(i);
434 integrale += vol * f * x;
435 if (modif)
436 tab(i) = facteur * x;
437 }
438 }
439 integrale_avant = mp_sum(integrale);
440}
441
443 ArrOfBit& marqueur,
444 int sans_faces_non_std_volume_nul) const
445{
446 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
447 const IntTab& elem_faces = domaine_vef.elem_faces();
448 const int nb_faces_tot = domaine_vef.nb_faces_tot();
449 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
450 const int nb_faces_elem = elem_faces.dimension(1);
451 marqueur.resize_array(nb_faces_tot);
452 marqueur = 0;
453 const Sous_Domaine& sous_domaine = domaine_dis().domaine().ss_domaine(nom_sous_domaine);
454 const int nb_elem_sous_domaine = sous_domaine.nb_elem_tot();
455 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
456 int i;
457 for (i = 0; i < nb_elem_sous_domaine; i++)
458 {
459 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
460 {
461 if (volumes_cl[i] == 0.)
462 // Ne pas marquer les faces non std de volume nul
463 continue;
464 }
465 const int elem = sous_domaine[i];
466 for (int j = 0; j < nb_faces_elem; j++)
467 {
468 const int face = elem_faces(elem,j);
469 marqueur.setbit(face);
470 }
471 }
472}
473
474/*! @brief appel a mettre_a_jour() de l'ancetre et application de l' "option_" choisie pour traiter la presence d'une interface.
475 *
476 */
478{
479 Debog::verifier("Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour c1", inconnue().valeurs());
481
482 switch(option_)
483 {
484 case RIEN:
485 break;
488 break;
489 default:
490 Cerr << "Internal error for method Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour" << finl;
491 barrier();
493 }
494
495 if (equations_source_chimie_.size() > 0)
496 {
498 }
499
500 double integrale_sortie = 0.;
501 double integrale0 = 0.;
502 double integrale1 = 0.;
503
504 if (nom_domaine_sortie_ != "??")
505 {
506 ArrOfBit marqueur;
508 0 /* annuler les valeurs sur les faces non std */);
509 DoubleTab& tab = inconnue().valeurs();
510 multiplier_valeurs_faces(marqueur, 0., integrale_sortie, tab);
511 }
512 {
513 DoubleTab indic_faces;
514 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
515 indic_faces, inconnue());
516 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
517 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
518 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
519 const int nb_faces = domaine_vef.nb_faces();
520 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
521 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
522 const DoubleTab& inco = inconnue().valeurs();
523 for (int i = 0; i < nb_faces; i++)
524 {
525 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
526 double f = faces_doubles[i] ? 0.5 : 1.;
527 double indic = indic_faces(i);
528 double x = inco(i) * f * vol;
529 integrale0 += x * (1.-indic);
530 integrale1 += x * indic;
531 }
532 integrale0 = mp_sum(integrale0);
533 integrale1 = mp_sum(integrale1);
534 }
535 const double dt = probleme().schema_temps().pas_de_temps();
536 if (je_suis_maitre())
537 {
538 Nom nom_fic(le_nom());
539 nom_fic += "_bilan.out";
540 SFichier f(nom_fic, ios::out | ios::app);
541 char s[1000];
542 snprintf(s, 1000, "%16.8f %16.8g %16.8g %16.8g %16.8g",
543 temps,
544 integrale0,
545 integrale1,
546 integrale_sortie,
547 integrale_sortie / dt);
548 f << s << finl;
549 }
550 Debog::verifier("Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour c2", inconnue().valeurs());
551}
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.
void multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double &integrale_avant, DoubleTab &tab)
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 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_Turbulent Cette classe represente le cas particulier de
void mettre_a_jour(double) override
Mise a jour en temps de l'equation, double appel a: Convection_Diffusion_Concentration::mettre_a_jour...
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 Constituant & constituant() const
Renvoie le constituant (si il a ete associe).
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation: la concentration.
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
Classe Modele_turbulence_scal_Schmidt Cette classe represente le modele de calcul suivant.
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
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