16#include <Loi_Etat_Multi_GP_QC.h>
17#include <Champ_Uniforme.h>
18#include <Probleme_base.h>
19#include <Champ_Inc_base.h>
21#include <Domaine_VF.h>
44 param.ajouter(
"Cp",&
Cp_);
52 param.lire_avec_accolades_depuis(is);
62 liste_especes.add(eq.
espece());
70 const int size = tab_masse_mol_mel.
size();
71 ArrOfDouble inv_M(size), numer_M(size);
73 for (
int i=0; i<liste_Y.size(); i++)
75 double M_i=liste_especes(i)->masse_molaire();
76 const DoubleTab& Y_i=liste_Y(i)->valeurs();
77 double min_Y_i=local_min_vect(Y_i);
78 double max_Y_i=local_max_vect(Y_i);
81 Cerr <<
"Warning : (min_Y_i<-" <<
dtol_fraction_ <<
")||(max_Y_i>1+" <<
dtol_fraction_ <<
") for the " << i <<
"th mass fraction:" << finl;
82 Cerr <<
" min_Y_i = " << min_Y_i << finl;
83 Cerr <<
" max_Y_i = " << max_Y_i << finl;
86 for (
int elem=0; elem<size; elem++)
88 numer_M[elem] += Y_i(elem,0);
89 inv_M[elem] += Y_i(elem,0)/M_i;
93 assert(liste_Y(0)->valeurs().size()==size);
95 for (
int elem=0; elem<size; elem++)
96 if (inv_M[elem]>1.e-8)
97 tab_masse_mol_mel(elem,0) = numer_M[elem] / inv_M[elem];
107 for (
int i=0; i<liste_Y.size(); i++)
109 const DoubleTab& Y_i=liste_Y(i)->valeurs();
110 const double cp_i=liste_especes(i)->capacite_calorifique().valeurs()(0,0);
112 for (
int elem=0; elem<Y_i.
size(); elem++) tab_Cp(elem,0) += Y_i(elem,0)*cp_i;
121 DoubleTab test( liste_Y(0)->valeurs()) ;
124 for (
int i=0; i<liste_Y.size(); i++)
126 DoubleTab& Y_i=liste_Y(i)->futur(futur);
127 double min_Y_i=local_min_vect(Y_i);
128 double max_Y_i=local_max_vect(Y_i);
129 Cerr <<
"Verification of the " << i <<
"th mass fraction:" << finl;
130 Cerr <<
" min_Y_i = " << min_Y_i << finl;
131 Cerr <<
" max_Y_i = " << max_Y_i << finl;
137 for (
int elem=0; elem<Y_i.
size(); elem++)
142 Cerr <<
" Y_i forced to " << Y_i(elem,0) <<
" on node " << elem << finl;
147 Cerr <<
" Y_i forced to " << Y_i(elem,0) <<
" on node " << elem << finl;
152 double min_s=mp_min_vect(test);
153 double max_s=mp_max_vect(test);
154 Cerr <<
"Verification of the sum of the mass fractions:" << finl;
155 Cerr <<
" Sum(min_Y_i) = " << min_s << finl;
156 Cerr <<
" Sum(max_Y_i) = " << max_s << finl;
157 for (
int i=0; i<liste_Y.size(); i++)
159 DoubleTab& Y_i=liste_Y(i)->futur(futur);
160 for (
int elem=0; elem<Y_i.
size(); elem++) Y_i(elem,0)/=(test(elem)+DMINFLOAT);
164 Cerr <<
" Warning: the sum of the mass fractions is not equal to 1." <<finl;
174 const DoubleTab& tab_ICh = le_fluide->inco_chaleur().valeurs();
175 DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
181 double Pth = le_fluide->pression_th();
182 int n = tab_rho.
size();
183 for (
int som=0 ; som<n ; som++)
189 const Champ_base& rho_m=le_fluide->get_champ(
"rho_gaz");
195 Debog::verifier(
"Loi_Etat_Multi_GP_QC::calculer_masse_volumique, tab_rho",tab_rho);
248 const int size = liste_Y(0)->valeurs().size(), list_size = liste_Y.size();
249 DoubleTrav phi(size), mu(size);
253 for (
int i = 0; i < list_size; i++)
256 const double M_i = liste_especes(i)->masse_molaire();
257 const double mu_i = liste_especes(i)->viscosite_dynamique().valeurs()(0, 0);
259 for (
int j = 0; j < list_size; j++)
262 const double M_j = liste_especes(j)->masse_molaire();
263 const double mu_j = liste_especes(j)->viscosite_dynamique().valeurs()(0, 0);
265 double a = 1. + sqrt(mu_i / mu_j) * pow(M_j / M_i, 0.25);
266 double b = sqrt(8. * (1. + (M_i / M_j)));
267 double phi_ij = ( M_i / M_j ) * a * a / b;
269 const DoubleVect& y_j = liste_Y(j)->valeurs();
271 for (
int node = 0; node < y_j.
size(); node++) phi(node) += y_j(node) * phi_ij;
274 const DoubleVect& y_i = liste_Y(i)->valeurs();
275 for (
int node = 0; node < y_i.
size(); node++) mu(node) += mu_i * y_i(node) / (y_i(node) + phi(node));
287 const DoubleTab& tab_mu = mu.
valeurs();
289 DoubleTab& tab_mu_sur_Sc = mu_sur_Sc.
valeurs();
293 const int n = tab_mu_sur_Sc.
size();
295 for (
int i=0 ; i<n ; i++) tab_mu_sur_Sc(i,0) = tab_mu(0,0) /
Sc_;
297 for (
int i=0 ; i<n ; i++) tab_mu_sur_Sc(i,0) = tab_mu(i,0)/
Sc_;
300 tab_mu_sur_Sc(0,0) = tab_mu(0,0) /
Sc_;
302 double temps_champ = mu.
temps();
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
double temps() const
Renvoie le temps du champ.
classe Convection_Diffusion_Espece_Multi_QC Cas particulier de Convection_Diffusion_Espece_Multi_base
const Espece & espece() const
static void verifier(const char *const msg, double)
Class defining operators and methods for all reading operation in an input flow (file,...
classe Loi_Etat_Multi_GP_QC Cette classe represente la loi d'etat pour un melange de gaz parfaits.
void calculer_masse_volumique() override
Recalcule la masse volumique.
void calculer_tab_Cp(DoubleTab &cp) const override
Calcule le Cp du melange Le Cp depend du Cp de chaque espece et de la composition du melange (Yi).
bool correction_fraction_
bool ignore_check_fraction_
void rabot(int futur=0)
Corrections explicites pour les fractions massiques pour forcer la somme a 1 et sans valeurs negative...
void calculer_mu_sur_Sc() override
Calcule la viscosite dynamique sur Schmidt.
void associer_espece(const Convection_Diffusion_Espece_Multi_QC &eq)
Associe les proprietes physiques d une espece a la loi d'etat.
classe Loi_Etat_Multi_GP_base Cette classe represente la loi d'etat pour un melange de gaz parfaits.
void calculer_masse_volumique() override=0
Recalcule la masse volumique.
virtual void calculer_mu_wilke()=0
void calculer_tab_mu(const DoubleTab &mu, int size)
void calculer_masse_molaire()
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.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")