16#include <Navier_Stokes_Fluide_Dilatable_base.h>
17#include <Fluide_Dilatable_base.h>
18#include <Neumann_sortie_libre.h>
19#include <Loi_Etat_Multi_GP_QC.h>
20#include <Discretisation_base.h>
21#include <Champ_Fonc_Fonction.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <Domaine_VF.h>
43 Cerr<<
"Fluide_Dilatable_base::discretiser"<<finl;
44 if (!le_probleme_) le_probleme_ = pb;
51 dis.
discretiser_champ(
"temperature",domaine_dis,
"masse_volumique_p",
"neant",1,temps,ch_rho);
52 ch_rho_ = ch_rho.valeur();
56 Cerr<<
"Heat capacity Cp is discretized once more for space variable case."<<finl;
75 dis.
discretiser_champ(
"champ_elem",domaine_dis,
"pression_tot",
"Pa",1,temps,ch_pression_tot_);
105 loi_etat_.typer_lire(is,
"Loi_Etat_",
"Lecture et typage de la loi d'etat ...");
106 loi_etat_->associer_fluide(*
this);
109 else if (mot==
"Traitement_PTh")
115 les_options[0] =
"edo";
116 les_options[1] =
"conservation_masse";
117 les_options[2] =
"constant";
122 Cerr<< trait <<
" is not understood as an option of the keyword " << mot <<finl;
123 Cerr<<
"One of the following options was expected : " << les_options << finl;
131 ch_mu_->nommer(
"mu");
134 else if (mot==
"sutherland")
136 double mu0,T0,C=-1,Slambda=-1;
146 if (motlu==
"SLAMBDA")
154 ch_mu_.typer(
"Sutherland");
167 lambda_suth.
set_C(Slambda);
171 else if ((mot==
"beta_th") || (mot==
"beta_co"))
173 Cerr<<
"The keyword "<<mot<<
" has not to be read for a "<<
que_suis_je()<<
" type medium."<<finl;
174 Cerr<<
"Please remove it from your data set."<<finl;
194 int pression_imposee=0;
197 for (
int n=0; n<size; n++)
205 Cerr <<
"The Traitement_Pth option selected is not coherent with the boundaries conditions." << finl;
206 Cerr <<
"Traitement_Pth constant must be used for the case of free outlet." << finl;
212 Cerr <<
"The Traitement_Pth option selected is not coherent with the boundaries conditions." << finl;
213 Cerr <<
"Traitement_Pth conservation_masse must be used for the case without free outlet." << finl;
221 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
222 Cerr <<
"Error in call to Sutherland function :" << finl;
223 Cerr <<
"The syntax has changed in version 1.8.4." << finl;
224 Cerr << finl <<
" A specification of kind : sutherland problem_name mu0 1.85e-5 T0 300 [Slambda 10] C 10 was expected. "<<finl;
225 Cerr << finl <<
"Please update your dataset or contact TRUST support team." << finl;
239 msg +=
"The density rho has not been specified. \n";
246 if (ch_mu_->valeurs()(0,0) <= 0)
248 msg +=
"The dynamical viscosity mu is not striclty positive. \n";
255 msg +=
"The dynamical viscosity mu has not been specified. \n";
261 msg +=
"The conductivity lambda has not been specified. \n";
267 msg +=
"The heat capacity Cp has not been specified. \n";
280 ch_Cp_.typer(
"Champ_Uniforme");
283 DoubleTab& tab_Cp =
ch_Cp_->valeurs();
290 if (
equation_.size() && (*(
equation_.begin()->second)).inconnue().valeurs().isDataOnDevice())
293 mapToDevice(ch_rho_->valeurs());
294 mapToDevice(ch_rho_Cp_elem_->valeurs());
301 rho_cp = ch_rho_->valeurs()(0, 0);
306 tab_multiply_any_shape(rho_cp, ch_rho_->valeurs());
309 rho_cp *=
ch_Cp_->valeurs()(0, 0);
311 tab_multiply_any_shape(rho_cp,
ch_Cp_->valeurs());
327 return loi_etat_->ch_temperature();
332 return loi_etat_->ch_temperature();
340 loi_etat_->
mettre_a_jour(le_probleme_->schema_temps().temps_courant());
341 eos_tools_->mettre_a_jour(le_probleme_->schema_temps().temps_courant());
347 loi_etat()->abortTimeStep();
370 loi_etat_->calculer_lambda();
374 if (!est_egal(lold,lo))
376 Cerr <<
"Error : mu, lambda, Cp and Prandtl are all specified in your data set." << finl;
377 Cerr <<
"It is observed that your imput values leads to :" << finl;
379 Cerr <<
"mu/(lambda*Cp)=" << loi_etat_->Prandt()*(lo/lold) <<
" and Prandtl=" << loi_etat_->Prandt() << finl;
380 Cerr<<
"Please modify your data set by specifying for instance Prandtl = "<<loi_etat_->Prandt()*(lo/lold)<<finl;
393 Cerr <<
"A sutherland law cannot be requested for the conductivity "<<finl;
394 Cerr <<
"by indicating Slambda if the heat capacity (Cp) is not uniform."<<finl;
398 const double mu0 = mu_suth.
get_A();
400 double lambda0 = mu0/loi_etat_->Prandt()*
ch_Cp_->valeurs()(0,0);
401 lambda_suth.
set_A(lambda0);
413 Cerr <<
"Fluide_Dilatable_base::initialiser()" << finl;
417 ch_mu_->initialiser(temps);
419 ch_Cp_->initialiser(temps);
425 if (
equation_.size() && (*(
equation_.begin()->second)).inconnue().valeurs().isDataOnDevice())
428 mapToDevice(ch_rho_->valeurs());
429 mapToDevice(ch_rho_Cp_elem_->valeurs());
439 coeff_absorption_->initialiser(temps);
441 longueur_rayo_->initialiser(temps);
446 DoubleTab& l_rayo = longueur_rayo_->valeurs();
449 l_rayo[i] = 1/(3*K[i]);
458 DoubleTab& tab_Ptot = ch_pression_tot_->valeurs();
460 DoubleTrav tab_PHyd(n, 1);
466 const DoubleTab& centres_de_gravites=domaine.xp();
476 if(motlu ==
"source_masse_espece")
478 if (!ch_source_masse_esp_)
480 double temps = le_probleme_->schema_temps().temps_courant();
482 le_probleme_->discretisation().discretiser_champ(
"champ_elem", le_probleme_->equation(0).domaine_dis(),
"source_masse_espece",
"Kg/m3/s", 1, temps, ch_source_masse_esp_);
486 else if (motlu ==
"source_masse_projection")
490 double temps = le_probleme_->schema_temps().temps_courant();
492 le_probleme_->discretisation().discretiser_champ(
"pression", le_probleme_->equation(0).domaine_dis(),
"source_masse_projection",
"Kg/m3/s", 1, temps,
ch_source_masse_proj_);
505 if (loi_etat_->has_champ(nom, ref_champ))
516 if (loi_etat_->has_champ(nom))
529 if (loi_etat_->has_champ(nom, ref_champ))
532 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
538 loi_etat_->get_noms_champs_postraitables(nom,opt);
543 ch_rho_->mettre_a_jour(temps);
545 ch_rho_->changer_temps(temps);
547 ch_mu_->changer_temps(temps);
549 ch_Cp_->mettre_a_jour(temps);
559 Cerr <<
"Fluide_Dilatable_base::preparer_calcul()" << finl;
562 loi_etat_->preparer_calcul();
570 ch_pression_tot_->mettre_a_jour(temps);
579 if (!le_probleme_) le_probleme_ = pb;
585 if (typ ==
"VEFPreP1B")
588 eos_tools_.typer(
Nom(
"EOS_Tools_") + typ);
590 eos_tools_->associer_fluide(*
this);
591 loi_etat_->assoscier_probleme(pb);
594 loi_etat_->initialiser();
603 if (typ==
"VEFPreP1B") typ =
"VEF";
611 typ += loi_etat_->type_fluide();
613 typ =
Nom(
"EDO_Pression_th_") + typ;
614 Cerr <<
"Typage de l'EDO sur la pression : " << typ << finl;
617 EDO_Pth_->associer_fluide(*
this);
618 EDO_Pth_->mettre_a_jour_CL(
Pth_);
626 Cerr <<
"Warning! evol_glob file renamed " <<
output_file_ << finl;
634 eos_tools_->mettre_a_jour(le_probleme_->schema_temps().temps_courant());
642 fic <<
"# Time sum(T*dv)/sum(dv)[K] sum(rho*dv)/sum(dv)[kg/m3] Pth[Pa]" << finl;
648 const double Ch_m = eos_tools_->moyenne_vol(ch_inco_chaleur_->valeurs());
649 const double rhom = eos_tools_->moyenne_vol(ch_rho_->valeurs());
654 fic << temps <<
" " << Ch_m <<
" " << rhom <<
" " <<
Pth_ << finl;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
void mettre_a_jour(double temps) override
Mise a jour en temps.
void dimensionner(int, int)
Fixe le nombre de composantes et le nombre de valeurs nodales.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
int nb_valeurs_nodales() const override
Renvoie le nombre de degre de liberte par composante: le nombre de noeuds.
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
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.
virtual void creer_champ(const Motcle &motlu)=0
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const =0
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
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.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
const Champ_Don_base & ch_temperature() const
Renvoie le champ de le temperature.
const Champ_base & get_champ(const Motcle &nom) const override
void creer_champ(const Motcle &motlu) override
int initialiser(const double temps) override
Initialise les parametres du fluide.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
OBS_PTR(Champ_Inc_base) ch_inco_chaleur_
void warn_syntax_Sutherland()
const DoubleTab & temperature() const
Renvoie le tableau des valeurs de le temperature.
void abortTimeStep() override
void mettre_a_jour(double) override
Effectue une mise a jour en temps du milieu, et donc de ses parametres caracteristiques.
void creer_champs_non_lus() 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.
void initialiser_inco_ch()
virtual void calculer_pression_tot()
Calcule la pression totale : pression thermodynamique + pression hydrodynamique.
virtual void checkTraitementPth(const Domaine_Cl_dis_base &)
void completer_edo(const Probleme_base &)
virtual void remplir_champ_pression_tot(int n, const DoubleTab &PHydro, DoubleTab &PTot)=0
virtual void update_pressure_fields(double)
virtual void write_mean_edo(double)
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
void prepare_pressure_edo()
void preparer_calcul() override
Prepare le fluide au calcul.
void preparer_pas_temps()
Prepare le pas de temps.
const OWN_PTR(Loi_Etat_base) &loi_etat() const
void update_rho_cp(double temps) override
void initialiser_radiatives(const double temps)
void set_Cp(double)
Complete le fluide avec un Cp constant.
void verifier_coherence_champs(int &err, Nom &message) override
Verifie que les champs lus l'ont ete correctement.
void set_param(Param ¶m) const override
virtual void write_header_edo()
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void completer(const Probleme_base &)
Complete le fluide avec les champs inconnus associes au probleme.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
void set_param(Param ¶m) const override
Champ_Don_base & longueur_rayo()
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
classe Loi_Etat_GP_base Cette classe represente la loi d'etat base pour les gaz parfaits.
classe Loi_Etat_Multi_GP_QC Cette classe represente la loi d'etat pour un melange de gaz parfaits.
void ecrire(Sortie &) const
Ecrit un objet milieu sur un flot de sortie.
virtual void verifier_coherence_champs(int &err, Nom &message)
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.
Champs_compris champs_compris_
std::map< std::string, const Equation_base * > equation_
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual int debute_par(const char *const n) const
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
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.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
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_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.
void supprimer(const char *keyword)
Remove a previously-registered keyword from this Param.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & equation(int) const =0
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 temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
void set_A(const double A)
const double & get_A() const
void set_C(const double C)
void set_Tref(const double Tref)
void set_prob(const Nom &prob)
void set_val_params(const Nom &prob, const double A, const double C, const double Tref)
_SIZE_ dimension_tot(int) const override