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