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>
24#include <Sous_Domaine.h>
27#include <Constituant.h>
28#include <Fluide_Diphasique.h>
29#include <Fluide_Incompressible.h>
56 Cerr <<
"Missing EQUATION_NU_T" << finl;
60 Cerr <<
"The kinematic model used is : modele_cinetique " <<
modele_cinetique_ << finl;
66 nom_fic +=
"_bilan.out";
69 snprintf(s, 1000,
"#%15s %16s %16s %16s %16s",
97 param.
ajouter_condition(
"(value_of_phase_eq_0)_or_(value_of_phase_eq_1)",
"phase must be set to 0 or 1");
104 if (mot==
"equation_interface")
108 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
111 Cerr <<
" Error: the equation indicated for keyword equation_interface "<<finl;
112 Cerr <<
" is not of type (or sub type) of Transport_Interfaces_FT_Disc." << finl;
118 else if (mot==
"option")
122 if (motbis ==
"RAMASSE_MIETTES_SIMPLE")
124 else if (motbis ==
"RIEN")
128 Cerr <<
"Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
149 const DoubleTab& val = ch.
valeurs();
154 for (
int i = 0; i < sz; i++)
156 const double v = volumes[i];
157 const double c = val(i);
158 const double fact = faces_doubles[i] ? 0.5 : 1.;
159 somme += v * c * fact;
164 Cerr <<
"Method integrale is not developped for " << ch.
que_suis_je() << finl;
177static void calculer_indicatrice_comme(
const Champ_base& src, DoubleTab& dest,
const Champ_base& champ_modele)
184 const int nb_faces = domaine_vf.
nb_faces();
186 const DoubleTab& indic = src.
valeurs();
187 assert_espace_virtuel_vect(indic);
188 for (
int i = 0; i < nb_faces; i++)
190 const int elem0 = face_voisins(i, 0);
191 const int elem1 = face_voisins(i, 1);
197 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
203 Cerr <<
"Error calculer_indicatrice_comme" << finl;
218 DoubleTab& inco = champ_inco.
valeurs();
221 calculer_indicatrice_comme(eq.
inconnue(), tmp, champ_inco);
224 const double masse_totale = integrale(champ_inco);
228 const int sz = inco.
size();
230 for (
int i = 0; i < sz; i++)
232 double facteur = tmp[i];
234 facteur = 1. - facteur;
235 assert(facteur > -1e-6 && facteur < 1.+1e-6);
240 const double masse_restante = integrale(champ_inco);
243 Journal() <<
"C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
244 <<
" masse_totale= " << masse_totale
245 <<
" masse_restante= " << masse_restante << finl;
248 if (masse_restante > 0.)
249 inco *= (masse_totale / masse_restante);
259 Cerr <<
"Error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour_chimie()\n"
260 <<
"It implies two equations_source_chimie" << finl;
271 const int nb_faces = champ1.
dimension(0);
274 const DoubleTab *champ_nu_t = 0;
278 const RefObjU& modele_turbulence_hydr = eq.
get_modele(TURBULENCE);
284 double coeff_diffusivite = tab_diffusivite(0,0);
293 const double nu_phase_0 = tab_nu_phase_0(0,0);
294 const double nu_phase_1 = tab_nu_phase_1(0,0);
295 const double delta_nu = nu_phase_1 - nu_phase_0;
297 DoubleTab indic_faces;
298 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
301 for (
int face = 0; face < nb_faces; face++)
306 int elem1 = face_voisins(face,0);
307 int elem2 = face_voisins(face,1);
308 if (elem1 < 0) elem1 = elem2;
309 if (elem2 < 0) elem2 = elem1;
310 nu_t = ((*champ_nu_t)(elem1) + (*champ_nu_t)(elem2)) * 0.5;
312 double c1 = std::max(0., champ1(face));
313 double c2 = std::max(0., champ2(face));
314 double c3 = std::max(0., champ3(face));
322 double Rdt = std::min(omega * dt, c1);
323 Rdt = std::min(Rdt, c2);
326 champ1(face) = c1 - Rdt;
327 champ2(face) = c2 - Rdt;
328 champ3(face) = c3 + Rdt;
336 Cerr <<
"MODELE_CINETIQUE 2 requires a turbulent Concentration problem" << finl;
337 Cerr <<
"Replace Convection_Diffusion_Concentration_FT_Disc by Convection_Diffusion_Concentration_Turbulent_FT_Disc" << finl;
346 const double indic = indic_faces[face];
347 const double nu = indic * delta_nu + nu_phase_0;
350 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
352 const double Ci = 0.07;
353 double schm = nu/coeff_diffusivite;
355 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
357 double omega = std::min(c1,c2);
358 omega = omega/std::max(dt,tm);
359 double Rdt = omega * dt;
362 champ1(face) = c1 - Rdt;
363 champ2(face) = c2 - Rdt;
364 champ3(face) = c3 + Rdt;
373 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
375 double tm = l_carac*l_carac/nu_t;
377 double omega = std::min(c1,c2);
378 omega = omega/std::max(dt,tm);
379 double Rdt = omega * dt;
382 champ1(face) = c1 - Rdt;
383 champ2(face) = c2 - Rdt;
384 champ3(face) = c3 + Rdt;
389 Cerr <<
"MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
407 const int nb_faces = domaine_vef.
nb_faces();
410 int modif = (facteur != 1.);
411 double integrale = 0.;
412 for (
int i = 0; i < nb_faces; i++)
414 if (marqueurs_faces[i])
416 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
417 double f = faces_doubles[i] ? 0.5 : 1.;
419 integrale += vol * f * x;
421 tab(i) = facteur * x;
424 integrale_avant =
mp_sum(integrale);
429 int sans_faces_non_std_volume_nul)
const
432 const IntTab& elem_faces = domaine_vef.
elem_faces();
435 const int nb_faces_elem = elem_faces.
dimension(1);
439 const int nb_elem_sous_domaine = sous_domaine.
nb_elem_tot();
442 for (i = 0; i < nb_elem_sous_domaine; i++)
444 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
446 if (volumes_cl[i] == 0.)
450 const int elem = sous_domaine[i];
451 for (
int j = 0; j < nb_faces_elem; j++)
453 const int face = elem_faces(elem,j);
475 Cerr <<
"Internal error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour" << finl;
485 double integrale_sortie = 0.;
486 double integrale0 = 0.;
487 double integrale1 = 0.;
498 DoubleTab indic_faces;
499 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
504 const int nb_faces = domaine_vef.
nb_faces();
508 for (
int i = 0; i < nb_faces; i++)
510 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
511 double f = faces_doubles[i] ? 0.5 : 1.;
512 double indic = indic_faces(i);
513 double x = inco(i) * f * vol;
514 integrale0 += x * (1.-indic);
515 integrale1 += x * indic;
517 integrale0 =
mp_sum(integrale0);
518 integrale1 =
mp_sum(integrale1);
524 nom_fic +=
"_bilan.out";
525 SFichier f(nom_fic, ios::out | ios::app);
527 snprintf(s, 1000,
"%16.8f %16.8g %16.8g %16.8g %16.8g",
532 integrale_sortie / dt);
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.
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.
double constante_cinetique_nu_t_
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
double constante_cinetique_
Convection_Diffusion_Concentration_FT_Disc()
void mettre_a_jour_chimie()
void set_param(Param &titi) const override
void ramasse_miette_simple(double temps)
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).
void set_param(Param &titi) const override
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)
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
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