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>
24#include <Sous_Domaine.h>
27#include <Constituant.h>
28#include <Modele_turbulence_scal_Schmidt.h>
29#include <Fluide_Diphasique.h>
30#include <Fluide_Incompressible.h>
57 Cerr <<
"Missing EQUATION_NU_T" << finl;
61 Cerr <<
"The kinematic model used is : modele_cinetique " <<
modele_cinetique_ << finl;
67 nom_fic +=
"_bilan.out";
70 snprintf(s, 1000,
"#%15s %16s %16s %16s %16s",
98 param.
ajouter_condition(
"(value_of_phase_eq_0)_or_(value_of_phase_eq_1)",
"phase must be set to 0 or 1");
105 if (mot==
"equation_interface")
109 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
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;
119 else if (mot==
"option")
123 if (motbis ==
"RAMASSE_MIETTES_SIMPLE")
125 else if (motbis ==
"RIEN")
129 Cerr <<
"Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
150 const DoubleTab& val = ch.
valeurs();
155 for (
int i = 0; i < sz; i++)
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;
165 Cerr <<
"Method integrale is not developped for " << ch.
que_suis_je() << finl;
178static void calculer_indicatrice_comme(
const Champ_base& src, DoubleTab& dest,
const Champ_base& champ_modele)
185 const int nb_faces = domaine_vf.
nb_faces();
187 const DoubleTab& indic = src.
valeurs();
188 assert_espace_virtuel_vect(indic);
189 for (
int i = 0; i < nb_faces; i++)
191 const int elem0 = face_voisins(i, 0);
192 const int elem1 = face_voisins(i, 1);
198 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
204 Cerr <<
"Error calculer_indicatrice_comme" << finl;
219 DoubleTab& inco = champ_inco.
valeurs();
222 calculer_indicatrice_comme(eq.
inconnue(), tmp, champ_inco);
225 const double masse_totale = integrale(champ_inco);
229 const int sz = inco.
size();
231 for (
int i = 0; i < sz; i++)
233 double facteur = tmp[i];
235 facteur = 1. - facteur;
236 assert(facteur > -1e-6 && facteur < 1.+1e-6);
241 const double masse_restante = integrale(champ_inco);
244 Journal() <<
"C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
245 <<
" masse_totale= " << masse_totale
246 <<
" masse_restante= " << masse_restante << finl;
249 if (masse_restante > 0.)
250 inco *= (masse_totale / masse_restante);
260 Cerr <<
"Error for method Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour_chimie()\n"
261 <<
"It implies two equations_source_chimie" << finl;
272 const int nb_faces = champ1.
dimension(0);
275 const DoubleTab *champ_nu_t = 0;
279 const RefObjU& modele_turbulence_hydr = eq.
get_modele(TURBULENCE);
285 const RefObjU& modele_turbulence_scal = eq_scal.
get_modele(TURBULENCE);
291 Cerr <<
"Reaction model dependent of the turbulent Schmidt number which is defined as " << sc_t << finl;
294 double coeff_diffusivite = tab_diffusivite(0,0);
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;
307 DoubleTab indic_faces;
308 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
311 for (
int face = 0; face < nb_faces; face++)
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;
322 double c1 = std::max(0., champ1(face));
323 double c2 = std::max(0., champ2(face));
324 double c3 = std::max(0., champ3(face));
330 double Rdt = std::min(omega * dt, c1);
331 Rdt = std::min(Rdt, c2);
334 champ1(face) = c1 - Rdt;
335 champ2(face) = c2 - Rdt;
336 champ3(face) = c3 + Rdt;
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);
347 double omega = std::min(c1,c2);
348 omega = omega/std::max(dt,tm);
349 double Rdt = omega * dt;
352 champ1(face) = c1 - Rdt;
353 champ2(face) = c2 - Rdt;
354 champ3(face) = c3 + Rdt;
361 const double indic = indic_faces[face];
362 const double nu = indic * delta_nu + nu_phase_0;
365 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
367 const double Ci = 0.07;
368 double schm = nu/coeff_diffusivite;
370 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
372 double omega = std::min(c1,c2);
373 omega = omega/std::max(dt,tm);
374 double Rdt = omega * dt;
377 champ1(face) = c1 - Rdt;
378 champ2(face) = c2 - Rdt;
379 champ3(face) = c3 + Rdt;
388 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
390 double tm = l_carac*l_carac/nu_t;
392 double omega = std::min(c1,c2);
393 omega = omega/std::max(dt,tm);
394 double Rdt = omega * dt;
397 champ1(face) = c1 - Rdt;
398 champ2(face) = c2 - Rdt;
399 champ3(face) = c3 + Rdt;
404 Cerr <<
"MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
422 const int nb_faces = domaine_vef.
nb_faces();
425 int modif = (facteur != 1.);
426 double integrale = 0.;
427 for (
int i = 0; i < nb_faces; i++)
429 if (marqueurs_faces[i])
431 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
432 double f = faces_doubles[i] ? 0.5 : 1.;
434 integrale += vol * f * x;
436 tab(i) = facteur * x;
439 integrale_avant =
mp_sum(integrale);
444 int sans_faces_non_std_volume_nul)
const
447 const IntTab& elem_faces = domaine_vef.
elem_faces();
450 const int nb_faces_elem = elem_faces.
dimension(1);
454 const int nb_elem_sous_domaine = sous_domaine.
nb_elem_tot();
457 for (i = 0; i < nb_elem_sous_domaine; i++)
459 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
461 if (volumes_cl[i] == 0.)
465 const int elem = sous_domaine[i];
466 for (
int j = 0; j < nb_faces_elem; j++)
468 const int face = elem_faces(elem,j);
479 Debog::verifier(
"Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour c1",
inconnue().valeurs());
490 Cerr <<
"Internal error for method Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour" << finl;
500 double integrale_sortie = 0.;
501 double integrale0 = 0.;
502 double integrale1 = 0.;
513 DoubleTab indic_faces;
514 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
519 const int nb_faces = domaine_vef.
nb_faces();
523 for (
int i = 0; i < nb_faces; i++)
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;
532 integrale0 =
mp_sum(integrale0);
533 integrale1 =
mp_sum(integrale1);
539 nom_fic +=
"_bilan.out";
540 SFichier f(nom_fic, ios::out | ios::app);
542 snprintf(s, 1000,
"%16.8f %16.8g %16.8g %16.8g %16.8g",
547 integrale_sortie / dt);
550 Debog::verifier(
"Convection_Diffusion_Concentration_Turbulent_FT_Disc::mettre_a_jour c2",
inconnue().valeurs());
ArrOfBit_32_64 & resize_array(int_t n)
Change la taille du tableau et copie les donnees existantes.
void setbit(int_t i) const
Met le bit e a 1.
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.
virtual const Domaine_dis_base & domaine_dis_base() const
const Champ_Don_base & diffusivite_constituant() const
Cette equation corrige le champ de concentration pour tenir compte de la presence d'une interface.
void ramasse_miette_simple(double temps)
void multiplier_valeurs_faces(const ArrOfBit marqueurs_faces, double facteur, double &integrale_avant, DoubleTab &tab)
void set_param(Param &titi) const override
Noms equations_source_chimie_
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_chimie()
double constante_cinetique_nu_t_
Convection_Diffusion_Concentration_Turbulent_FT_Disc()
double constante_cinetique_
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.
void set_param(Param &titi) const override
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)
const Sous_Domaine_t & ss_domaine(int i) const
int nb_faces_non_std() const
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
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
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
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
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.
double get_Scturb() const
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
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.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
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.
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.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.
int_t nb_elem_tot() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
const Champ_Inc_base & inconnue() const override