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>
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",
99 param.
ajouter_condition(
"(value_of_phase_eq_0)_or_(value_of_phase_eq_1)",
"phase must be set to 0 or 1");
111 if (mot==
"equation_interface")
115 ref_eq_transport_ = mon_probleme->get_equation_by_name(nom);
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;
125 else if (mot==
"option")
129 if (motbis ==
"RAMASSE_MIETTES_SIMPLE")
131 else if (motbis ==
"RIEN")
135 Cerr <<
"Error: expected RAMASSE_MIETTES_SIMPLE or RIEN after keyword OPTION" << finl;
156 const DoubleTab& val = ch.
valeurs();
161 for (
int i = 0; i < sz; i++)
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;
171 Cerr <<
"Method integrale is not developped for " << ch.
que_suis_je() << finl;
184static void calculer_indicatrice_comme(
const Champ_base& src, DoubleTab& dest,
const Champ_base& champ_modele)
191 const int nb_faces = domaine_vf.
nb_faces();
193 const DoubleTab& indic = src.
valeurs();
194 assert_espace_virtuel_vect(indic);
195 for (
int i = 0; i < nb_faces; i++)
197 const int elem0 = face_voisins(i, 0);
198 const int elem1 = face_voisins(i, 1);
204 s *= ((elem0>=0) && (elem1>=0)) ? 0.5 : 1.;
210 Cerr <<
"Error calculer_indicatrice_comme" << finl;
225 DoubleTab& inco = champ_inco.
valeurs();
228 calculer_indicatrice_comme(eq.
inconnue(), tmp, champ_inco);
231 const double masse_totale = integrale(champ_inco);
235 const int sz = inco.
size();
237 for (
int i = 0; i < sz; i++)
239 double facteur = tmp[i];
241 facteur = 1. - facteur;
242 assert(facteur > -1e-6 && facteur < 1.+1e-6);
247 const double masse_restante = integrale(champ_inco);
250 Journal() <<
"C_D_concentration_ft_disc::ramasse_miette_simple t= " << temps
251 <<
" masse_totale= " << masse_totale
252 <<
" masse_restante= " << masse_restante << finl;
255 if (masse_restante > 0.)
256 inco *= (masse_totale / masse_restante);
266 Cerr <<
"Error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour_chimie()\n"
267 <<
"It implies two equations_source_chimie" << finl;
278 const int nb_faces = champ1.
dimension(0);
281 const DoubleTab *champ_nu_t = 0;
285 const RefObjU& modele_turbulence_hydr = eq.
get_modele(TURBULENCE);
291 double coeff_diffusivite = tab_diffusivite(0,0);
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;
304 DoubleTab indic_faces;
305 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
308 for (
int face = 0; face < nb_faces; face++)
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;
319 double c1 = std::max(0., champ1(face));
320 double c2 = std::max(0., champ2(face));
321 double c3 = std::max(0., champ3(face));
329 double Rdt = std::min(omega * dt, c1);
330 Rdt = std::min(Rdt, c2);
333 champ1(face) = c1 - Rdt;
334 champ2(face) = c2 - Rdt;
335 champ3(face) = c3 + Rdt;
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;
353 const double indic = indic_faces[face];
354 const double nu = indic * delta_nu + nu_phase_0;
357 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
359 const double Ci = 0.07;
360 double schm = nu/coeff_diffusivite;
362 double tm = l_carac*l_carac*Ci*schm/(nu + nu_t);
364 double omega = std::min(c1,c2);
365 omega = omega/std::max(dt,tm);
366 double Rdt = omega * dt;
369 champ1(face) = c1 - Rdt;
370 champ2(face) = c2 - Rdt;
371 champ3(face) = c3 + Rdt;
380 double l_carac = 2.0*pow(6.*volumes_entrelaces(face),1./
double(dim)) ;
382 double tm = l_carac*l_carac/nu_t;
384 double omega = std::min(c1,c2);
385 omega = omega/std::max(dt,tm);
386 double Rdt = omega * dt;
389 champ1(face) = c1 - Rdt;
390 champ2(face) = c2 - Rdt;
391 champ3(face) = c3 + Rdt;
396 Cerr <<
"MODELE_CINETIQUE not implemented ==> Please specify model 1 -- 4" << finl;
414 const int nb_faces = domaine_vef.
nb_faces();
417 int modif = (facteur != 1.);
418 double integrale = 0.;
419 for (
int i = 0; i < nb_faces; i++)
421 if (marqueurs_faces[i])
423 double vol = (i < nb_faces_non_std) ? volumes_cl[i] : volumes[i];
424 double f = faces_doubles[i] ? 0.5 : 1.;
426 integrale += vol * f * x;
428 tab(i) = facteur * x;
431 integrale_avant =
mp_sum(integrale);
436 int sans_faces_non_std_volume_nul)
const
439 const IntTab& elem_faces = domaine_vef.
elem_faces();
442 const int nb_faces_elem = elem_faces.
dimension(1);
446 const int nb_elem_sous_domaine = sous_domaine.
nb_elem_tot();
449 for (i = 0; i < nb_elem_sous_domaine; i++)
451 if (sans_faces_non_std_volume_nul && i < nb_faces_non_std)
453 if (volumes_cl[i] == 0.)
457 const int elem = sous_domaine[i];
458 for (
int j = 0; j < nb_faces_elem; j++)
460 const int face = elem_faces(elem,j);
482 Cerr <<
"Internal error for method Convection_Diffusion_Concentration_FT_Disc::mettre_a_jour" << finl;
492 double integrale_sortie = 0.;
493 double integrale0 = 0.;
494 double integrale1 = 0.;
505 DoubleTab indic_faces;
506 calculer_indicatrice_comme(ref_eq_transport_->inconnue(),
511 const int nb_faces = domaine_vef.
nb_faces();
515 for (
int i = 0; i < nb_faces; i++)
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;
524 integrale0 =
mp_sum(integrale0);
525 integrale1 =
mp_sum(integrale1);
531 nom_fic +=
"_bilan.out";
532 SFichier f(nom_fic, ios::out | ios::app);
534 snprintf(s, 1000,
"%16.8f %16.8g %16.8g %16.8g %16.8g",
539 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