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 The geometric element ";
217 Cerr <<
" is not supported." << 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);
300 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
309 discretiser_champ_fonc_don(directive, z, nature, noms, unites, nb_comp, temps, champ);
316void 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,
324 motcles[0] =
"pression";
325 motcles[1] =
"divergence_vitesse";
328 int default_nb_comp = 0;
329 int rang = motcles.search(directive);
333 type =
"Champ_Fonc_P1_isoP1Bulle";
337 type =
"Champ_Fonc_P1_isoP1Bulle";
346 Cerr <<
"VEF_discretisation : " << motcles;
353 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_fonc);
355 VEF_discretisation::discretiser_champ_fonc_don_(directive, z, nature, noms, unites, nb_comp, temps, *champ_don);
362 nb_comp = default_nb_comp;
369 if (nature == multi_scalaire)
371 Cerr <<
"There is no field of type OWN_PTR(Champ_Fonc_base) or OWN_PTR(Champ_Don_base) with P1Bulle discretization" << finl;
372 Cerr <<
"and a multi_scalaire nature." <<finl;
377void 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,
381 OWN_PTR(Champ_Fonc_base) * champ_fonc =
dynamic_cast<OWN_PTR(Champ_Fonc_base)*
>(&champ);
382 OWN_PTR(Champ_Don_base) * champ_don =
dynamic_cast<OWN_PTR(Champ_Don_base)*
>(&champ);
384 const Domaine_VEF& domaine_vef = ref_cast(Domaine_VEF, z);
387 motcles[0] =
"pression";
388 motcles[1] =
"temperature";
389 motcles[2] =
"divergence_vitesse";
390 motcles[3] =
"champ_elem";
391 motcles[4] =
"vitesse";
392 motcles[5] =
"gradient_pression";
393 motcles[6] =
"champ_sommets";
394 motcles[7] =
"champ_face";
397 Nom type_champ_vitesse, type_champ_sommets;
399 if (Motcle(type_elem_domaine) !=
"Segment")
401 const Elem_VEF_base& elem_vef = domaine_vef.
type_elem();
402 if (sub_type(Tri_VEF, elem_vef) || sub_type(Tetra_VEF, elem_vef))
404 type_champ_vitesse =
"Champ_Fonc_P1NC";
405 type_champ_sommets =
"Champ_Fonc_P1_VEF";
407 else if (sub_type(Quadri_VEF, elem_vef) || sub_type(Hexa_VEF, elem_vef))
409 type_champ_vitesse =
"Champ_Fonc_Q1NC";
410 type_champ_sommets =
"Champ_Fonc_Q1_VEF";
414 Cerr <<
"VEF_discretisation::discretiser_champ :\n The geometric element ";
416 Cerr <<
" is not supported." << finl;
422 int default_nb_comp = 0;
423 int rang = motcles.search(directive);
427 type =
"Champ_Fonc_P0_VEF";
431 type = type_champ_vitesse;
435 type =
"Champ_Fonc_P0_VEF";
439 type =
"Champ_Fonc_P0_VEF";
443 type = type_champ_vitesse;
447 type = type_champ_vitesse;
451 type = type_champ_sommets;
455 type = type_champ_vitesse;
465 Cerr <<
"VEF_discretisation : " << motcles;
480 if (type ==
"Champ_Fonc_P0_VEF")
482 else if (type == type_champ_vitesse)
484 else if ((type ==
"Champ_Fonc_P1_VEF") || (type ==
"Champ_Fonc_Q1_VEF"))
485 nb_ddl = domaine_vef.
nb_som();
490 nb_comp = default_nb_comp;
497 if ((nature == multi_scalaire) && (champ_fonc))
499 champ_fonc->valeur().fixer_nature_du_champ(nature);
500 champ_fonc->valeur().fixer_unites(unites);
501 champ_fonc->valeur().fixer_noms_compo(noms);
503 else if ((nature == multi_scalaire) && (champ_don))
505 Cerr <<
"There is no field of type OWN_PTR(Champ_Don_base) with a multi_scalaire nature." << finl;
512 Cerr <<
"Discretization of the wall distance" << finl;
514 ch.typer(
"Champ_Fonc_P0_VEF");
517 ch_dist_paroi.
nommer(
"distance_paroi");
526 Cerr <<
"Discretization of global wall distance" << finl;
527 Noms noms(1), unites(1);
528 noms[0] =
Nom(
"distance_paroi_globale");
529 unites[0] =
Nom(
"m");
535 Cerr <<
"Discretization of vorticity " << finl;
540 ch.typer(
"Rotationnel_Champ_P1NC");
561 ch.typer(
"Rotationnel_Champ_Q1NC");
582 Cerr <<
"Problem in element typing in VEF_discretisation::vorticite" << finl;
591 ch.typer(
"Rotationnel_Champ_P1NC");
613 ch.typer(
"Rotationnel_Champ_Q1NC");
635 Cerr <<
"Problem in element typing in VEF_discretisation::creer_champ_vorticite" << finl;
649 Cerr <<
"VEF discretization of the Ostwald fluid" << finl;
657 Cerr <<
"associate domainedisbase VEF" << finl;
662 Cerr <<
"associations completed: domain dis base, fluid, field VEF" << finl;
665 Cerr <<
"done fixer_nb_valeurs_nodales" << finl;
666 Cerr <<
"nb_valeurs_nodales VEF = " << domaine_vef.
nb_elem() << finl;
669 Cerr <<
"done changer_temps" << finl;
671 Cerr <<
"mu VEF is discretized " << finl;
678 Cerr <<
"Discretization of Q criterion " << finl;
681 ch.typer(
"Critere_Q_Champ_P1NC");
685 ch_cQ.
nommer(
"Critere_Q");
694 Cerr <<
"Discretization of y_plus" << finl;
698 ch.typer(
"Y_plus_Champ_P1NC");
712 Cerr <<
"Discretization of temperature_paroi" << finl;
716 ch.typer(
"T_paroi_Champ_P1NC");
721 ch_tp.
nommer(
"temperature_paroi");
736 ch.typer(
"grad_u_Champ_P1NC");
742 ch_grad_u.
nommer(
"gradient_vitesse");
772 Cerr <<
"Discretization of gradient_temperature" << finl;
786 Cerr <<
"Discretization of h_conv" << finl;
790 ch.typer(
"h_conv_Champ_P1NC");
807 champ.typer(
"Taux_cisaillement_P0_VEF");
812 ch.
nommer(
"Taux_cisaillement");
834 ch_name +=
"_residu";
835 Cerr <<
"Discretization of " << ch_name << finl;
841 DoubleTab& tab = ch_fonc.
valeurs();
843 Cerr <<
"[Information] Discretisation_base::residu : the residue is set to -10000.0 at initial time" << finl;
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
int fixer_nb_valeurs_nodales(int n) override
Sets the number of degrees of freedom per component.
void associer_param(const VECT(OBS_PTR(Champ_base))&, const Table &)
Class Champ_Fonc_Tabule Derived class of Champ_Fonc_base representing.
const Table & table() const
void typer_champ_tabule_discretise(const Nom &typ)
const Champ_Fonc_base & le_champ_tabule_discretise() const
Returns the computed tabulated field.
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
void associer_domaine_dis_base(const Domaine_dis_base &) override
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Returns the array of field values at the current time.
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
Sets the number of degrees of freedom per component.
class Champ_base This class is the base of the fields hierarchy.
virtual double changer_temps(const double t)
Sets the time at which the field is defined.
double temps() const
Returns the time of the field.
class Critere_Q_Champ_P1NC
void associer_champ(const Champ_P1NC &)
class Discret_Thyd This class is the base class representing a discretization
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)
Static method that creates an OWN_PTR(Champ_Inc_base) of the specified type.
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
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
const Elem_VEF_base & type_elem() const
virtual void discretiser_suite(const VEF_discretisation &)
int nb_faces() const
Returns the total number of faces.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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)
Sets the number of components of the field.
const Nom & le_nom() const override
Returns the name of the field.
void nommer(const Nom &) override
Gives a name to the field.
virtual const Nom & fixer_unite(const Nom &)
Specifies the unit of a scalar field or whose all components have the same unit.
virtual Nature_du_champ fixer_nature_du_champ(Nature_du_champ nat)
Sets the nature of a field: scalar, multiscalar, vectorial.
virtual int nb_comp() const
virtual void add_synonymous(const Nom &nom)
virtual const Nom & fixer_nom_compo(int, const Nom &)
Sets the name of the i-th component of the field.
const Champ_Don_base & viscosite_dynamique() const
A character string (Nom) in uppercase.
An array of Motcle objects.
int search(const Motcle &t) const
Navier_Stokes_std This class carries the terms of the momentum equation.
const Champ_Inc_base & inconnue() const override
Returns the velocity (unknown field of the equation) (const version).
class Nom: a character string for naming TRUST objects.
An array of character strings (VECT(Nom)).
Base class for TRUST objects (Objet_U).
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
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)
Exit routine for TRUST within a Kokkos region.
void associer_champ(const Champ_P1NC &)
void associer_champ(const Champ_Q1NC &)
double temps_courant() const
Returns the current time.
Base class for output streams.
void associer_domaine_Cl_dis_base(const Domaine_Cl_dis_base &le_dom_Cl_dis_base)
void associer_champ(const Champ_P1NC &)
class 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
Discretizes a field for VEFP1B according to a discretization directive.
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
Discretizes the incompressible fluid in VEF, specifically K and 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)