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
31// XD convection_diffusion_concentration_ft_disc convection_diffusion_concentration convection_diffusion_concentration_ft_disc INHERITS_BRACE not_set
32Implemente_instanciable_sans_constructeur(Convection_Diffusion_Concentration_FT_Disc,"Convection_Diffusion_Concentration_FT_Disc",Convection_Diffusion_Concentration);
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_); // XD_ADD_P floattant Constant kinetic rate of the reaction (laminar model 1 only).
92 param.ajouter("equations_source_chimie",&equations_source_chimie_); // XD_ADD_P listchaine Names of the reagent concentration equations.
93 param.ajouter("modele_cinetique",&modele_cinetique_); // XD_ADD_P entier Reaction kinetic model index (1 to 4).
94 param.ajouter("constante_cinetique_nu_t",&constante_cinetique_nu_t_); // XD_ADD_P floattant Kinetic constant scaling with the turbulent viscosity.
95 param.ajouter("equation_nu_t",&nom_equation_nu_t_); // XD_ADD_P chaine Name of the hydraulic equation defining the turbulent viscosity.
96 param.ajouter("domaine_sortie",&nom_domaine_sortie_); // XD_ADD_P chaine Name of the outlet sub-domain for the balance output.
97 param.ajouter("phase",&phase_a_conserver_); // XD_ADD_P entier(into=[0,1])
98 // XD_CONT tells whether the scalar must be confined in phase 0 or in phase 1
99 param.ajouter_condition("(value_of_phase_eq_0)_or_(value_of_phase_eq_1)","phase must be set to 0 or 1");
100 param.ajouter_non_std("equation_interface",(this),Param::REQUIRED); // XD_ADD_P chaine
101 // XD_CONT his is the name of the interface tracking equation to watch. The scalar will not diffuse through the
102 // XD_CONT interface of this equation.
103 param.ajouter_non_std("option",(this)); // XD_ADD_P chaine
104 // XD_CONT Experimental features used to prevent the concentration to leak through the interface between phases due to
105 // XD_CONT numerical diffusion. NL2 RIEN: do nothing NL2 RAMASSE_MIETTES_SIMPLE: at each timestep, this algorithm
106 // XD_CONT takes all the mass located in the opposite phase and spreads it uniformly in the given phase.
107}
108
110{
111 if (mot=="equation_interface")
112 {
113 Nom nom;
114 is >> nom;
115 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
116 if (!sub_type(Transport_Interfaces_FT_Disc,ref_eq_transport_.valeur()))
117 {
118 Cerr << " Error: the equation indicated for keyword equation_interface "<<finl;
119 Cerr << " is not of type (or sub type) of Transport_Interfaces_FT_Disc." << finl;
120 barrier();
122 }
123 return 1;
124 }
125 else if (mot=="option")
126 {
127 Motcle motbis;
128 is >> motbis;
129 if (motbis == "RAMASSE_MIETTES_SIMPLE")
131 else if (motbis == "RIEN")
132 option_ = RIEN;
133 else
134 {
135 Cerr << "Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
136 barrier();
138 }
139 return 1;
140 }
141 else
143}
144
145/*! @brief calcul de l'integrale du champ sur tout le domaine.
146 *
147 * A factoriser un jour quelque part...
148 *
149 */
150static double integrale(const Champ_base& ch)
151{
152 double somme = 0.;
153 if (sub_type(Champ_P1NC, ch))
154 {
155 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, ch.domaine_dis_base());
156 const DoubleTab& val = ch.valeurs();
157 assert(val.line_size() == 1);
158 const int sz = val.dimension(0);
159 const DoubleVect& volumes = domaine_vf.volumes_entrelaces();
160 const ArrOfInt& faces_doubles = domaine_vf.faces_doubles();
161 for (int i = 0; i < sz; i++)
162 {
163 const double v = volumes[i];
164 const double c = val(i);
165 const double fact = faces_doubles[i] ? 0.5 : 1.;
166 somme += v * c * fact;
167 }
168 }
169 else
170 {
171 Cerr << "Method integrale is not developped for " << ch.que_suis_je() << finl;
174 }
175 somme = Process::mp_sum(somme);
176 return somme;
177}
178
179/*! @brief calcul de l'indicatrice aux faces.
180 *
181 * .. A factoriser un jour...
182 *
183 */
184static void calculer_indicatrice_comme(const Champ_base& src, DoubleTab& dest, const Champ_base& champ_modele)
185{
186 assert(sub_type(Champ_Inc_P0_base, src));
187 if (sub_type(Champ_P1NC, champ_modele))
188 {
189 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF, champ_modele.domaine_dis_base());
190 const IntTab& face_voisins = domaine_vf.face_voisins();
191 const int nb_faces = domaine_vf.nb_faces();
192 dest.resize(nb_faces);
193 const DoubleTab& indic = src.valeurs();
194 assert_espace_virtuel_vect(indic);
195 for (int i = 0; i < nb_faces; i++)
196 {
197 const int elem0 = face_voisins(i, 0);
198 const int elem1 = face_voisins(i, 1);
199 double s = 0.;
200 if (elem0 >= 0)
201 s += indic(elem0);
202 if (elem1 >= 0)
203 s += indic(elem1);
204 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
205 dest[i] = s;
206 }
207 }
208 else
209 {
210 Cerr << "Error calculer_indicatrice_comme" << finl;
212 }
213}
214
215// Application d'un traitement particulier pour conserver la masse du constituant
216// tout en l'empechant de "baver" d'une phase a l'autre.
217// Annule la concentration dans la phase qui n'est pas a conserver et
218// rescale celle de la phase a conserver pour que l'integrale soit conservee.
219// La concentration est discontinue a l'interface liquide-vapeur.
221{
222 const Transport_Interfaces_FT_Disc& eq = ref_cast(Transport_Interfaces_FT_Disc, ref_eq_transport_.valeur());
223 DoubleTab tmp;
224 Champ_base& champ_inco = inconnue();
225 DoubleTab& inco = champ_inco.valeurs();
226
227 // Calcule une indicatrice de phase localisee comme l'inconnue de l'equation
228 calculer_indicatrice_comme(eq.inconnue(), tmp, champ_inco);
229
230 // Calcul de l'integrale de la concentration dans tout le volume:
231 const double masse_totale = integrale(champ_inco);
232
233 // On met a zero la concentration dans la phase qui n'est pas a conserver
234 {
235 const int sz = inco.size();
236 assert(sz == tmp.dimension(0));
237 for (int i = 0; i < sz; i++)
238 {
239 double facteur = tmp[i];
240 if (phase_a_conserver_ == 0)
241 facteur = 1. - facteur;
242 assert(facteur > -1e-6 && facteur < 1.+1e-6);
243 inco[i] *= facteur;
244 }
245 }
246 // Que reste-t-il comme masse ?
247 const double masse_restante = integrale(champ_inco);
248 if (je_suis_maitre())
249 {
250 Journal() << "C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
251 << " masse_totale= " << masse_totale
252 << " masse_restante= " << masse_restante << finl;
253 }
254 // On multiplie la concentration par une constante pour obtenir la masse totale initiale
255 if (masse_restante > 0.)
256 inco *= (masse_totale / masse_restante);
257
259}
260
262{
263 // On va ecraser les inconnues des equations de chimie:
264 if (equations_source_chimie_.size() != 2)
265 {
266 Cerr << "Error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour_chimie()\n"
267 << "It implies two equations_source_chimie" << finl;
268 barrier();
270 }
271
272 Probleme_base& pb = mon_probleme.valeur();
275 DoubleTab& champ3 = inconnue().valeurs();
276
277 const double dt = pb.schema_temps().pas_de_temps();
278 const int nb_faces = champ1.dimension(0);
279
280 const IntTab& face_voisins = ref_cast(Domaine_VF, domaine_dis()).face_voisins();
281 const DoubleTab *champ_nu_t = 0;
282 if (nom_equation_nu_t_ != "??")
283 {
285 const RefObjU& modele_turbulence_hydr = eq.get_modele(TURBULENCE);
286 const Modele_turbulence_hyd_base& le_modele = ref_cast(Modele_turbulence_hyd_base,modele_turbulence_hydr.valeur());
287 champ_nu_t = &(le_modele.viscosite_turbulente().valeurs());
288 }
289
290 const DoubleTab& tab_diffusivite = constituant().diffusivite_constituant().valeurs();
291 double coeff_diffusivite = tab_diffusivite(0,0);
292 const DoubleVect& volumes_entrelaces = ref_cast(Domaine_VF, domaine_dis()).volumes_entrelaces();
293 const int dim = Objet_U::dimension;
294
295 const Fluide_Diphasique& fluide = ref_cast(Fluide_Diphasique, pb.milieu());
296 const Fluide_Incompressible& phase_0 = fluide.fluide_phase(0);
297 const Fluide_Incompressible& phase_1 = fluide.fluide_phase(1);
298 const DoubleTab& tab_nu_phase_0 = phase_0.viscosite_cinematique().valeurs();
299 const DoubleTab& tab_nu_phase_1 = phase_1.viscosite_cinematique().valeurs();
300 const double nu_phase_0 = tab_nu_phase_0(0,0);
301 const double nu_phase_1 = tab_nu_phase_1(0,0);
302 const double delta_nu = nu_phase_1 - nu_phase_0;
303
304 DoubleTab indic_faces;
305 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
306 indic_faces, inconnue());
307
308 for (int face = 0; face < nb_faces; face++)
309 {
310 double nu_t = 0.;
311 if (champ_nu_t)
312 {
313 int elem1 = face_voisins(face,0);
314 int elem2 = face_voisins(face,1);
315 if (elem1 < 0) elem1 = elem2;
316 if (elem2 < 0) elem2 = elem1;
317 nu_t = ((*champ_nu_t)(elem1) + (*champ_nu_t)(elem2)) * 0.5;
318 }
319 double c1 = std::max(0., champ1(face));
320 double c2 = std::max(0., champ2(face));
321 double c3 = std::max(0., champ3(face));
322
323 // ES243900
324 // Modele 1 classique
325 // Finite rate formulation.
326 if (modele_cinetique_ == 1)
327 {
328 double omega = constante_cinetique_ * (1. + constante_cinetique_nu_t_ * nu_t) * c1 * c2;
329 double Rdt = std::min(omega * dt, c1);
330 Rdt = std::min(Rdt, c2);
331
332 /* Modif des concentrations */
333 champ1(face) = c1 - Rdt;
334 champ2(face) = c2 - Rdt;
335 champ3(face) = c3 + Rdt;
336 }
337
338 // Modele 2 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
339 // traitement particulier pour n'avoir pas de c < 0
340 else if (modele_cinetique_ == 2)
341 {
342 // Besoin du modele LES !!!!
343 Cerr << "MODELE_CINETIQUE 2 requires a turbulent Concentration problem" << finl;
344 Cerr << "Replace Convection_Diffusion_Concentration_FT_Disc by Convection_Diffusion_Concentration_Turbulent_FT_Disc" << finl;
345 barrier();
347 }
348
349 // Modele 3 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
350 // traitement particulier pour n'avoir pas de c < 0
351 else if (modele_cinetique_ == 3)
352 {
353 const double indic = indic_faces[face];
354 const double nu = indic * delta_nu + nu_phase_0;
355
356 // On recalcule la longueur caracteristique de maille
357 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
358
359 const double Ci = 0.07; // from Yoshizawa's model
360 double schm = nu/coeff_diffusivite;
361
362 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
363
364 double omega = std::min(c1,c2);
365 omega = omega/std::max(dt,tm);
366 double Rdt = omega * dt;
367
368 /* Modif des concentrations */
369 champ1(face) = c1 - Rdt;
370 champ2(face) = c2 - Rdt;
371 champ3(face) = c3 + Rdt;
372 }
373
374 // Modele 4 : eddy disspertion concept (EDC) Bertrand et al. 2016 Chemical Engineering Journal
375 // traitement particulier pour n'avoir pas de c < 0
376 // conclusion ==> formulation pour que modeles 2 et 3 soient equivalents
377 else if (modele_cinetique_ == 4)
378 {
379 // On recalcule la longueur caracteristique de maille
380 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./double(dim)) ;
381 // merge de modele 2 et 3 ......
382 double tm = l_carac*l_carac/nu_t;
383
384 double omega = std::min(c1,c2);
385 omega = omega/std::max(dt,tm);
386 double Rdt = omega * dt;
387
388 /* Modif des concentrations */
389 champ1(face) = c1 - Rdt;
390 champ2(face) = c2 - Rdt;
391 champ3(face) = c3 + Rdt;
392 }
393
394 else
395 {
396 Cerr << "MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
397 barrier();
399 }
400
401 }
402 champ1.echange_espace_virtuel();
403 champ2.echange_espace_virtuel();
404 champ3.echange_espace_virtuel();
405}
406
407// Multiplie les valeurs des faces marquees par facteur
408// et calcule l'integrale des valeurs avant modifications
409void Convection_Diffusion_Concentration_FT_Disc::multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double& integrale_avant, DoubleTab& tab)
410{
411 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
412 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
413 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
414 const int nb_faces = domaine_vef.nb_faces();
415 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
416 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
417 int modif = (facteur != 1.);
418 double integrale = 0.;
419 for (int i = 0; i < nb_faces; i++)
420 {
421 if (marqueurs_faces[i])
422 {
423 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
424 double f = faces_doubles[i] ? 0.5 : 1.;
425 double x = tab(i);
426 integrale += vol * f * x;
427 if (modif)
428 tab(i) = facteur * x;
429 }
430 }
431 integrale_avant = mp_sum(integrale);
432}
433
435 ArrOfBit& marqueur,
436 int sans_faces_non_std_volume_nul) const
437{
438 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
439 const IntTab& elem_faces = domaine_vef.elem_faces();
440 const int nb_faces_tot = domaine_vef.nb_faces_tot();
441 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
442 const int nb_faces_elem = elem_faces.dimension(1);
443 marqueur.resize_array(nb_faces_tot);
444 marqueur = 0;
445 const Sous_Domaine& sous_domaine = domaine_dis().domaine().ss_domaine(nom_sous_domaine);
446 const int nb_elem_sous_domaine = sous_domaine.nb_elem_tot();
447 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
448 int i;
449 for (i = 0; i < nb_elem_sous_domaine; i++)
450 {
451 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
452 {
453 if (volumes_cl[i] == 0.)
454 // Ne pas marquer les faces non std de volume nul
455 continue;
456 }
457 const int elem = sous_domaine[i];
458 for (int j = 0; j < nb_faces_elem; j++)
459 {
460 const int face = elem_faces(elem,j);
461 marqueur.setbit(face);
462 }
463 }
464}
465
466/*! @brief appel a mettre_a_jour() de l'ancetre et application de l' "option_" choisie pour traiter la presence d'une interface.
467 *
468 */
470{
471 Debog::verifier("Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour c1", inconnue().valeurs());
473
474 switch(option_)
475 {
476 case RIEN:
477 break;
480 break;
481 default:
482 Cerr << "Internal error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour" << finl;
483 barrier();
485 }
486
487 if (equations_source_chimie_.size() > 0)
488 {
490 }
491
492 double integrale_sortie = 0.;
493 double integrale0 = 0.;
494 double integrale1 = 0.;
495
496 if (nom_domaine_sortie_ != "??")
497 {
498 ArrOfBit marqueur;
500 0 /* annuler les valeurs sur les faces non std */);
501 DoubleTab& tab = inconnue().valeurs();
502 multiplier_valeurs_faces(marqueur, 0., integrale_sortie, tab);
503 }
504 {
505 DoubleTab indic_faces;
506 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
507 indic_faces, inconnue());
508 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, domaine_dis());
509 const DoubleVect& volumes = domaine_vef.volumes_entrelaces();
510 const DoubleVect& volumes_cl = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis()).volumes_entrelaces_Cl();
511 const int nb_faces = domaine_vef.nb_faces();
512 const int nb_faces_non_std = domaine_vef.nb_faces_non_std();
513 const ArrOfInt& faces_doubles = domaine_vef.faces_doubles();
514 const DoubleTab& inco = inconnue().valeurs();
515 for (int i = 0; i < nb_faces; i++)
516 {
517 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
518 double f = faces_doubles[i] ? 0.5 : 1.;
519 double indic = indic_faces(i);
520 double x = inco(i) * f * vol;
521 integrale0 += x * (1.-indic);
522 integrale1 += x * indic;
523 }
524 integrale0 = mp_sum(integrale0);
525 integrale1 = mp_sum(integrale1);
526 }
527 const double dt = probleme().schema_temps().pas_de_temps();
528 if (je_suis_maitre())
529 {
530 Nom nom_fic(le_nom());
531 nom_fic += "_bilan.out";
532 SFichier f(nom_fic, ios::out | ios::app);
533 char s[1000];
534 snprintf(s, 1000, "%16.8f %16.8g %16.8g %16.8g %16.8g",
535 temps,
536 integrale0,
537 integrale1,
538 integrale_sortie,
539 integrale_sortie / dt);
540 f << s << finl;
541 }
542 Debog::verifier("Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour c2", inconnue().valeurs());
543}
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