16#include <Taux_cisaillement_P0_VEF.h>
17#include <Champ_Fonc_Tabule_P0_VEF.h>
18#include <Correlation_Vec_Sca_VEF.h>
19#include <Rotationnel_Champ_P1NC.h>
20#include <Rotationnel_Champ_Q1NC.h>
21#include <Critere_Q_Champ_P1NC.h>
22#include <T_paroi_Champ_P1NC.h>
23#include <VEF_discretisation.h>
24#include <Y_plus_Champ_P1NC.h>
25#include <Navier_Stokes_std.h>
26#include <grad_T_Champ_P1NC.h>
27#include <grad_U_Champ_P1NC.h>
28#include <h_conv_Champ_P1NC.h>
29#include <Champ_Ostwald_VEF.h>
30#include <Champ_Fonc_Tabule.h>
31#include <Schema_Temps_base.h>
32#include <Champ_Fonc_Q1NC.h>
33#include <Fluide_Ostwald.h>
34#include <Champ_Uniforme.h>
35#include <Domaine_VEF.h>
36#include <Quadri_VEF.h>
61 cl_pression_sommet_faible_ = 1;
69 param.
ajouter(
"changement_de_base_P1bulle", &P1Bulle_);
80 param.
ajouter(
"modif_div_face_dirichlet", &modif_div_face_dirichlet_);
82 param.
ajouter(
"CL_pression_sommet_faible", &cl_pression_sommet_faible_);
94 if (!alphaE_ && !alphaS_ && !alphaA_)
100 cl_pression_sommet_faible_ = 0;
103 if (alphaA_ && !alphaE_)
104 Process::exit(
"Discretisations Pa or P1+Pa are not yet supported.");
106 if (!((alphaE_) && (alphaS_) && (!alphaA_)))
107 Process::exit(
"Option 'changement_de_base_P1bulle' is available only in P0/P1");
111 if (!alphaE_ && !alphaS_ && !alphaA_)
113 Cerr <<
"Linke's scheme, OK for steady-state pb. The pressure computed is the Bernoulli pressure P =p+|u|^2" << finl;
119 s <<
"lire " <<
le_nom() <<
" { " << finl;
120 if (alphaE_) s <<
" P0";
121 if (alphaS_) s <<
" P1";
122 if (alphaA_) s <<
" Pa";
123 if (alphaRT_) s <<
" RT";
124 s <<
" changement_de_base_P1bulle " << P1Bulle_;
125 s <<
" modif_div_face_dirichlet " << modif_div_face_dirichlet_;
126 s <<
" cl_pression_sommet_faible " << cl_pression_sommet_faible_;
147 motcles[0] =
"pression";
148 motcles[1] =
"divergence_vitesse";
151 int default_nb_comp = 0;
152 int rang = motcles.
search(directive);
156 type =
"Champ_P1_isoP1Bulle";
160 type =
"Champ_P1_isoP1Bulle";
169 Cerr <<
"VEF_discretisation : " << motcles;
175 VEF_discretisation::discretiser_champ_(directive, z, nature, noms, unites, nb_comp, nb_pas_dt, temps, champ);
179 const int nb_ddl = -1;
181 nb_comp = default_nb_comp;
183 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive,
que_suis_je());
185 if (nature == multi_scalaire)
187 Cerr <<
"There is no field of type OWN_PTR(Champ_Inc_base) with P1Bulle discretization" << finl;
188 Cerr <<
"and a multi_scalaire nature." << finl;
193void VEF_discretisation::discretiser_champ_(
const Motcle& directive,
const Domaine_dis_base& z, Nature_du_champ nature,
const Noms& noms,
const Noms& unites,
int nb_comp,
int nb_pas_dt,
double temps,
199 motcles[0] =
"vitesse";
200 motcles[1] =
"pression";
201 motcles[2] =
"temperature";
202 motcles[3] =
"divergence_vitesse";
203 motcles[4] =
"gradient_pression";
204 motcles[5] =
"champ_elem";
205 motcles[6] =
"champ_sommets";
208 Nom type_champ_vitesse;
210 type_champ_vitesse =
"Champ_P1NC";
212 type_champ_vitesse =
"Champ_Q1NC";
215 Cerr <<
"VEF_discretisation::discretiser_champ :\n L'element geometrique ";
217 Cerr <<
" n'est pas supporte." << finl;
222 int default_nb_comp = 0;
223 int rang = motcles.search(directive);
227 type = type_champ_vitesse;
231 type =
"Champ_P0_VEF";
235 type = type_champ_vitesse;
239 type =
"Champ_P0_VEF";
243 type = type_champ_vitesse;
247 type =
"Champ_P0_VEF";
251 type =
"Champ_P1_VEF";
260 Cerr <<
"VEF_discretisation : " << motcles;
272 if (type ==
"Champ_P0_VEF")
274 else if (type == type_champ_vitesse)
276 else if (type ==
"Champ_P1_VEF")
277 nb_ddl = domaine_vef.
nb_som();
282 nb_comp = default_nb_comp;
284 creer_champ(champ, z, type, noms[0], unites[0], nb_comp, nb_ddl, nb_pas_dt, temps, directive,
que_suis_je());
285 if (nature == multi_scalaire)
287 champ->fixer_nature_du_champ(nature);
288 champ->fixer_unites(unites);
289 champ->fixer_noms_compo(noms);
302 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
313 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
323void VEF_discretisation::discretiser_champ_fonc_don(
const Motcle& directive,
const Domaine_dis_base& z, Nature_du_champ nature,
const Noms& noms,
const Noms& unites,
int nb_comp,
double temps,
331 motcles[0] =
"pression";
332 motcles[1] =
"divergence_vitesse";
335 int default_nb_comp = 0;
336 int rang = motcles.search(directive);
340 type =
"Champ_Fonc_P1_isoP1Bulle";
344 type =
"Champ_Fonc_P1_isoP1Bulle";
353 Cerr <<
"VEF_discretisation : " << motcles;
360 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
362 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
369 nb_comp = default_nb_comp;
376 if (nature == multi_scalaire)
378 Cerr <<
"There is no field of type OWN_PTR(Champ_Fonc_base) or OWN_PTR(Champ_Don_base) with P1Bulle discretization" << finl;
379 Cerr <<
"and a multi_scalaire nature." <<finl;
384void VEF_discretisation::discretiser_champ_fonc_don_(
const Motcle& directive,
const Domaine_dis_base& z, Nature_du_champ nature,
const Noms& noms,
const Noms& unites,
int nb_comp,
double temps,
388 OWN_PTR(Champ_Fonc_base) * champ_fonc =
dynamic_cast<OWN_PTR(Champ_Fonc_base)*
>(&champ);
389 OWN_PTR(Champ_Don_base) * champ_don =
dynamic_cast<OWN_PTR(Champ_Don_base)*
>(&champ);
391 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
394 motcles[0] =
"pression";
395 motcles[1] =
"temperature";
396 motcles[2] =
"divergence_vitesse";
397 motcles[3] =
"champ_elem";
398 motcles[4] =
"vitesse";
399 motcles[5] =
"gradient_pression";
400 motcles[6] =
"champ_sommets";
401 motcles[7] =
"champ_face";
404 Nom type_champ_vitesse, type_champ_sommets;
406 if (Motcle(type_elem_domaine) !=
"Segment")
408 const Elem_VEF_base& elem_vef = domaine_vef.
type_elem();
409 if (sub_type(Tri_VEF, elem_vef) || sub_type(Tetra_VEF, elem_vef))
411 type_champ_vitesse =
"Champ_Fonc_P1NC";
412 type_champ_sommets =
"Champ_Fonc_P1_VEF";
414 else if (sub_type(Quadri_VEF, elem_vef) || sub_type(Hexa_VEF, elem_vef))
416 type_champ_vitesse =
"Champ_Fonc_Q1NC";
417 type_champ_sommets =
"Champ_Fonc_Q1_VEF";
421 Cerr <<
"VEF_discretisation::discretiser_champ :\n L'element geometrique ";
423 Cerr <<
" n'est pas supporte." << finl;
429 int default_nb_comp = 0;
430 int rang = motcles.search(directive);
434 type =
"Champ_Fonc_P0_VEF";
438 type = type_champ_vitesse;
442 type =
"Champ_Fonc_P0_VEF";
446 type =
"Champ_Fonc_P0_VEF";
450 type = type_champ_vitesse;
454 type = type_champ_vitesse;
458 type = type_champ_sommets;
462 type = type_champ_vitesse;
472 Cerr <<
"VEF_discretisation : " << motcles;
487 if (type ==
"Champ_Fonc_P0_VEF")
489 else if (type == type_champ_vitesse)
491 else if ((type ==
"Champ_Fonc_P1_VEF") || (type ==
"Champ_Fonc_Q1_VEF"))
492 nb_ddl = domaine_vef.
nb_som();
497 nb_comp = default_nb_comp;
504 if ((nature == multi_scalaire) && (champ_fonc))
506 champ_fonc->valeur().fixer_nature_du_champ(nature);
507 champ_fonc->valeur().fixer_unites(unites);
508 champ_fonc->valeur().fixer_noms_compo(noms);
510 else if ((nature == multi_scalaire) && (champ_don))
512 Cerr <<
"There is no field of type OWN_PTR(Champ_Don_base) with a multi_scalaire nature." << finl;
519 Cerr <<
"Discretisation de la distance paroi" << finl;
521 ch.typer(
"Champ_Fonc_P0_VEF");
524 ch_dist_paroi.
nommer(
"distance_paroi");
533 Cerr <<
"Discretisation de distance paroi globale" << finl;
534 Noms noms(1), unites(1);
535 noms[0] =
Nom(
"distance_paroi_globale");
536 unites[0] =
Nom(
"m");
542 Cerr <<
"Discretisation de la vorticite " << finl;
547 ch.typer(
"Rotationnel_Champ_P1NC");
568 ch.typer(
"Rotationnel_Champ_Q1NC");
589 Cerr <<
"Pb dans le typage des elements dans VEF_discretisation::vorticite" << finl;
598 ch.typer(
"Rotationnel_Champ_P1NC");
620 ch.typer(
"Rotationnel_Champ_Q1NC");
642 Cerr <<
"Pb dans le typage des elements dans VEF_discretisation::creer_champ_vorticite" << finl;
656 Cerr <<
"Discretisation VEF du fluide_Ostwald" << finl;
664 Cerr <<
"associe domainedisbase VEF" << finl;
669 Cerr <<
"associations finies domaine dis base, fluide, champ VEF" << finl;
672 Cerr <<
"fait fixer_nb_valeurs_nodales" << finl;
673 Cerr <<
"nb_valeurs_nodales VEF = " << domaine_vef.
nb_elem() << finl;
676 Cerr <<
"fait changer_temps" << finl;
678 Cerr <<
"mu VEF est discretise " << finl;
685 Cerr <<
"Discretisation du critere Q " << finl;
688 ch.typer(
"Critere_Q_Champ_P1NC");
692 ch_cQ.
nommer(
"Critere_Q");
701 Cerr <<
"Discretisation de y_plus" << finl;
705 ch.typer(
"Y_plus_Champ_P1NC");
719 Cerr <<
"Discretisation de temperature_paroi" << finl;
723 ch.typer(
"T_paroi_Champ_P1NC");
728 ch_tp.
nommer(
"temperature_paroi");
743 ch.typer(
"grad_u_Champ_P1NC");
749 ch_grad_u.
nommer(
"gradient_vitesse");
779 Cerr <<
"Discretisation de gradient_temperature" << finl;
793 Cerr <<
"Discretisation de h_conv" << finl;
797 ch.typer(
"h_conv_Champ_P1NC");
814 champ.typer(
"Taux_cisaillement_P0_VEF");
819 ch.
nommer(
"Taux_cisaillement");
841 ch_name +=
"_residu";
842 Cerr <<
"Discretization of " << ch_name << finl;
848 DoubleTab& tab = ch_fonc.
valeurs();
850 Cerr <<
"[Information] Discretisation_base::residu : the residue is set to -10000.0 at initial time" << finl;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
int fixer_nb_valeurs_nodales(int n) override
Fixe le nombre de degres de liberte par composante.
void associer_param(const VECT(OBS_PTR(Champ_base))&, const Table &)
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
const Table & table() const
void typer_champ_tabule_discretise(const Nom &typ)
const Champ_Fonc_base & le_champ_tabule_discretise() const
Renvoie le champ tabule calcule.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void associer_domaine_dis_base(const Domaine_dis_base &) override
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_Ostwald_VEF Represente un champ en discretisation VEF qui varie en fonction
void associer_eqn(const Navier_Stokes_std &)
void associer_champ(const Champ_P1NC &un_champ)
void associer_fluide(const Fluide_Ostwald &le_fluide)
int fixer_nb_valeurs_nodales(int nb_noeuds) override
Fixe le nombre de degres de liberte par composante.
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 Critere_Q_Champ_P1NC
void associer_champ(const Champ_P1NC &)
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void set_param(Param ¶m) const override
virtual Domaine_dis_base & discretiser() const
static void creer_champ(OWN_PTR(Champ_Inc_base)&ch, const Domaine_dis_base &z, const Nom &type, const Nom &nom, const Nom &unite, int nb_comp, int nb_ddl, int nb_pas_dt, double temps, const Nom &directive=NOM_VIDE, const Nom &nom_discretisation=NOM_VIDE)
Methode statique qui cree un OWN_PTR(Champ_Inc_base) du type specifie.
static const Motcle DEMANDE_DESCRIPTION
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 Elem_VEF_base & type_elem() const
virtual void discretiser_suite(const VEF_discretisation &)
int nb_faces() const
renvoie le nombre global de faces.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
const Nom & le_nom() const override
Renvoie le nom du champ.
void nommer(const Nom &) override
Donne un nom au champ.
virtual const Nom & fixer_unite(const Nom &)
Specifie l'unite d'un champ scalaire ou dont toutes les composantes ont la meme unite.
virtual Nature_du_champ fixer_nature_du_champ(Nature_du_champ nat)
Fixer la nature d'un champ: scalaire, multiscalaire, vectoriel.
virtual int nb_comp() const
virtual void add_synonymous(const Nom &nom)
virtual const Nom & fixer_nom_compo(int, const Nom &)
Fixe le nom de la i-eme composante du champ.
const Champ_Don_base & viscosite_dynamique() const
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
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
class Nom Une chaine de caractere pour nommer les objets de TRUST
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.
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.
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.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void associer_champ(const Champ_P1NC &)
void associer_champ(const Champ_Q1NC &)
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
classe T_paroi_Champ_P1NC
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
classe Taux_cisaillement_P0_VEF
void associer_champ(const Champ_P1NC &, const Domaine_Cl_dis_base &)
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, Nature_du_champ nature, const Noms &nom, const Noms &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const override
Discretisation d'un champ pour le VEFP1B en fonction d'une directive de discretisation.
void check_param() override
void distance_paroi_globale(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const override
void vorticite(Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
void creer_champ_vorticite(const Schema_Temps_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void set_param(Param ¶m) const override
void grad_T(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch) const override
void critere_Q(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &vitesse, OWN_PTR(Champ_Fonc_base)&ch) const override
void h_conv(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch, Motcle &nom, int temp_ref) const override
void distance_paroi(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
void y_plus(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &vitesse, OWN_PTR(Champ_Fonc_base)&ch) const override
void taux_cisaillement(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void residu(const Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const override
void grad_u(const Domaine_dis_base &z, const Domaine_Cl_dis_base &, const Champ_Inc_base &temperature, OWN_PTR(Champ_Fonc_base)&ch) const override
void t_paroi(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&ch) const override
void proprietes_physiques_fluide_Ostwald(const Domaine_dis_base &, Fluide_Ostwald &, const Navier_Stokes_std &, const Champ_Inc_base &) const override
discretise en VEF le fluide incompressible, donc K e N
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
void associer_champ(const Champ_P1NC &)
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)