16#include <Modele_turbulence_hyd_base.h>
17#include <EcritureLectureSpecial.h>
18#include <Operateur_Diff_base.h>
19#include <Operateur_Conv_base.h>
20#include <Discretisation_base.h>
21#include <Schema_Temps_base.h>
22#include <communications.h>
23#include <LecFicDiffuse.h>
24#include <EcrFicPartage.h>
25#include <Postraitement.h>
26#include <Equation_base.h>
27#include <Probleme_base.h>
28#include <TRUST_2_PDI.h>
56 Cerr <<
"Reading of data for a " <<
que_suis_je() <<
" hydraulic turbulence model" << finl;
59 param.lire_avec_accolades_depuis(is);
62 if (dt_diff_sur_dt_conv_ != -1)
63 calcul_borne_locale_visco_turb_ =
true;
65 else if (calcul_borne_locale_visco_turb_)
66 dt_diff_sur_dt_conv_ = 1;
68 if (dt_diff_sur_dt_conv_ <= 0 && calcul_borne_locale_visco_turb_)
70 Cerr <<
"Parameter value Correction_visco_turb_pour_controle_pas_de_temps_parametre must be strictly positive." << finl;
81 param.
ajouter(
"nut_max", &XNUTM_);
83 param.
ajouter_flag(
"Correction_visco_turb_pour_controle_pas_de_temps", &calcul_borne_locale_visco_turb_);
84 param.
ajouter(
"Correction_visco_turb_pour_controle_pas_de_temps_parametre", &dt_diff_sur_dt_conv_);
92 if (mot ==
"turbulence_paroi")
95 is >> loipar_.valeur();
97 else if (mot ==
"dt_impr_ustar")
99 if (loipar_->que_suis_je().contient(
"negligeable"))
100 Process::exit(
"Please remove dt_impr_ustar option if the wall law is of Negligeable type.");
103 else if (mot ==
"dt_impr_ustar_mean_only")
105 if (loipar_->que_suis_je().contient(
"negligeable"))
106 Process::exit(
"Please remove dt_impr_ustar option if the wall law is of Negligeable type.");
110 Nom accolade_ouverte =
"{";
111 Nom accolade_fermee =
"}";
116 for (
int b = 0; b < nbfr; b++)
122 if (motlu != accolade_ouverte)
124 Cerr << motlu <<
" is not a keyword understood by " <<
que_suis_je() <<
" in lire_motcle_non_standard" << finl;
125 Cerr <<
"A specification of kind : dt_impr_ustar_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
129 if (motlu !=
"dt_impr")
131 Cerr <<
"We expected dt_impr..." << finl;
137 if (motlu != accolade_fermee)
139 if (motlu ==
"boundaries")
150 for (
int i = 0; i < nb_bords; i++)
153 boundaries_list_.add(
Nom(nom_bord_lu));
155 if (!nlistbord_dom.contient(boundaries_list_[i]))
157 Cerr <<
"Problem in the dt_impr_ustar_mean_only instruction:" << finl;
158 Cerr <<
"The boundary named '" << boundaries_list_[i] <<
"' is not a boundary of the domain " << dom.
le_nom() <<
"." << finl;
165 if (motlu != accolade_fermee)
167 Cerr <<
"Problem in the dt_impr_ustar_mean_only instruction:" << finl;
168 Cerr <<
"TRUST wants to read a '" << accolade_fermee <<
"' but find '" << motlu <<
"'!!" << finl;
174 Cerr << motlu <<
" is not a keyword understood by " <<
que_suis_je() <<
" in lire_motcle_non_standard" << finl;
175 Cerr <<
"A specification of kind : dt_impr_ustar_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
211 Cerr <<
" File " << nom_fic <<
" doesn't exist. To generate it, please, refer to html.doc (Distance_paroi) " << finl;
228 Cerr <<
"Turbulence hydraulic model discretization" << finl;
229 discretiser_visc_turb(mon_equation_->schema_temps(), mon_equation_->domaine_dis(), la_viscosite_turbulente_);
235 dis.
discretiser_champ(
"champ_elem", mon_equation_->domaine_dis(),
"distance_paroi",
"m", 1, mon_equation_->schema_temps().temps_courant(),
wall_length_);
243 Cerr <<
"Turbulent viscosity field discretization" << finl;
245 Cerr <<
"Turbulent dynamic viscosity field discretization" << finl;
246 Nom nom = (is_dilat == 1) ?
"viscosite_dynamique_turbulente" :
"viscosite_turbulente";
247 Nom unite = (is_dilat == 1) ?
"kg/(m.s)" :
"m2/s";
254 Cerr <<
"Turbulent viscosity correction field discretization" << finl;
261 Cerr <<
"Kinetic turbulent energy field discretisation" << finl;
277 res = loipar_->init_lois_paroi();
279 bool contient_distance_paroi =
false;
281 for (
auto &itr :
equation().probleme().postraitements())
282 if (!contient_distance_paroi)
286 for (
int i = 0; i < post.noms_champs_a_post().size(); i++)
289 const Nom& chmp = post.noms_champs_a_post()[i];
290 if (!chmp.
contient(
"DISTANCE_PAROI_GLOBALE") && chmp.
contient(
"DISTANCE_PAROI"))
293 contient_distance_paroi =
true;
312 loipar_->creer_champ(motlu);
322 if (loipar_->has_champ(nom, ref_champ))
334 if (loipar_->has_champ(nom))
348 if (loipar_->has_champ(nom, ref_champ))
351 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
356 if (opt == DESCRIPTION)
362 loipar_->get_noms_champs_postraitables(nom, opt);
375 loipar_->imprimer_ustar(os);
387 && !est_egal(dt_ustar, 1.e20)))
392 double i, j, epsilon = 1.e-8;
393 modf(temps_courant / dt_ustar + epsilon, &i);
394 modf(temps_prec / dt_ustar + epsilon, &j);
405 std::vector<YAML_data> data;
408 data = loipar_->data_a_sauvegarder();
425 loipar_->sauvegarder(os);
431 Nom type =
"negligeable_";
436 assert(
mp_sum(borne_visco_turb_.size()) != 0);
447 loipar_->reprendre(is);
464 mon_ident +=
Nom(temps,
"%e");
465 os << mon_ident << finl;
475 if (borne_visco_turb_.size() == 0)
476 borne_visco_turb_ = la_viscosite_turbulente_->valeurs();
477 borne_visco_turb_ = XNUTM_;
478 if (calcul_borne_locale_visco_turb_ && (
equation().schema_temps().nb_pas_dt() != 0 ||
equation().probleme().reprise_effectuee()))
487 assert(nb_elem == size);
489 Debog::verifier(
"Modele_turbulence_hyd_base::limiter_viscosite_turbulente la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
491 CDoubleArrView borne_visco_turb = borne_visco_turb_.view_ro();
492 DoubleArrView corr_visco_turb =
static_cast<DoubleVect&
>(corr_visco_turb_->valeurs()).view_wo();
493 DoubleArrView visco_turb =
static_cast<DoubleVect&
>(la_viscosite_turbulente_->valeurs()).view_rw();
495 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
496 Kokkos::RangePolicy<>(0, nb_elem), KOKKOS_LAMBDA(
497 const int elem,
int& compt_)
499 if (visco_turb(elem) > borne_visco_turb(elem))
502 corr_visco_turb(elem) = borne_visco_turb(elem) / visco_turb(elem);
503 visco_turb(elem) = borne_visco_turb(elem);
506 corr_visco_turb(elem) = 1.;
507 }, Kokkos::Sum<int>(compt));
508 end_gpu_timer(__KERNEL_NAME__);
509 corr_visco_turb_->changer_temps(mon_equation_->inconnue().temps());
510 la_viscosite_turbulente_->valeurs().echange_espace_virtuel();
511 Debog::verifier(
"Modele_turbulence_hyd_base::limiter_viscosite_turbulente la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
514 int imprimer_compt = 0;
515 if (mon_equation_->schema_temps().temps_impr() <= mon_equation_->schema_temps().pas_de_temps())
519 if (mon_equation_->schema_temps().nb_pas_dt() == 0)
524 double i, j, epsilon = 1.e-8;
525 modf(mon_equation_->schema_temps().temps_courant() / mon_equation_->schema_temps().temps_impr() + epsilon, &i);
526 modf((mon_equation_->schema_temps().temps_courant() - mon_equation_->schema_temps().pas_de_temps()) / mon_equation_->schema_temps().temps_impr() + epsilon, &j);
540 double pourcent = 100.0 * (double(tmp[0]) / double(tmp[1]));
542 Cout <<
"\nTurbulent viscosity has been limited on " << pourcent <<
" % of cells mesh." << finl;
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
classe Champ_base Cette classe est la base de la hierarchie des champs.
double temps() const
Renvoie le temps du champ.
bool has_champ(const Motcle &nom, OBS_PTR(FIELD_TYPE)&ref_champ) const
static void verifier(const char *const msg, double)
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
const Frontiere_t & frontiere(int i) const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
static void lecture_special(Champ_base &ch, Entree &fich)
simple appel a EcritureLectureSpecial::lecture_special (const Domaine_VF& zvf,Entree& fich,...
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....
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
void add(const Frontiere_32_64 &)
Ajoute les sommets (et faces) de la frontiere passee en parametre a l'objet (Frontiere_32_64).
Cette classe implemente les operateurs et les methodes virtuelles de la classe EFichier de la facon s...
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in) override
Ouverture du fichier.
void set_bin(bool bin) override
appelle get_entree_master().
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
OBS_PTR(Equation_base) mon_equation_
int limpr_ustar(double, double, double, double) const
double dt_impr_ustar_mean_only_
LIST(Nom) boundaries_list_
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
void associer_eqn(const Equation_base &)
Associe l'equation passe en parametre au modele de turbulence.
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.
OWN_PTR(Champ_Fonc_base) la_viscosite_turbulente_
virtual bool initTimeStep(double dt)
virtual int preparer_calcul()
Prepare le calcul.
void discretiser_visc_turb(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void set_param(Param ¶m) const override
void discretiser_K(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
int reprendre(Entree &) override
Reprend la loi de paroi.
void discretiser_corr_visc_turb(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
int sauvegarder(Sortie &) const override
Sauvegarde le modele de turbulence sur un flot de sortie.
Champs_compris champs_compris_
void limiter_viscosite_turbulente()
const Champ_Fonc_base & viscosite_turbulente() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void creer_champ(const Motcle &motlu) override
void lire_distance_paroi()
Lit le fichier dom_Wall_length.
Equation_base & equation()
Renvoie l'equation associee au modele de turbulence.
virtual void discretiser()
Discretise le modele de turbulence.
void a_faire(Sortie &) const
Effectue l'ecriture d'une identite si cela est necessaire.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void imprimer(Sortie &) const
Effectue l'impression si cela est necessaire.
const Champ_base & get_champ(const Motcle &nom) const override
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom substr_old(const int, const int) const
Retourne un nom selon la commande usuelle substr ATTENTION : deb = 1 => premier caractere de la chain...
bool contient(const Nom &nom) const
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
classe Objet_U Cette classe est la classe de base des 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.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
double dt_stab_conv() const
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
virtual void calculer_borne_locale(DoubleVect &, double, double) const
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
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 Postraitement La classe est dotee -d une liste de champs generiques champs_post_complet_ qui c...
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
bool is_dilatable() const
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
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),...
double temps_courant() const
Renvoie le temps courant.
int nb_pas_dt_max_atteint() const
Renvoie 1 si (le nombre de pas de temps >= nombre de pas de temps maximum).
int temps_final_atteint() const
Renvoie 1 si le temps final est atteint (ou depasse).
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
int stop_lu() const
Renvoie 1 si le fichier (d'extension) .
int stationnaire_atteint() const
int temps_cpu_max_atteint() const
double temps_precedent() const
Renvoie le temps courant.
Classe de base des flux de sortie.
static int is_PDI_checkpoint()
static void typer_lire_turbulence_paroi(OWN_PTR(Turbulence_paroi_base)&, const Modele_turbulence_hyd_base &, Entree &)
Lit les caracteristques de la loi de parois a partir d'un flot d'entree.