16#include <Champ_Input_P0_Composite.h>
17#include <Discretisation_tools.h>
18#include <Discretisation_base.h>
19#include <Champ_Fonc_Tabule.h>
20#include <Schema_Temps_base.h>
21#include <Champ_Uniforme.h>
22#include <Champ_Fonc_MED.h>
23#include <Probleme_base.h>
24#include <Equation_base.h>
25#include <Milieu_base.h>
55 os <<
"rho " << ch_rho_<< finl;
57 os <<
"Cp " <<
ch_Cp_ << finl;
77 Cerr <<
"Reading of data for a " <<
que_suis_je() <<
" medium" << finl;
80 param.lire_avec_accolades_depuis(is);
83 if (ch_g_) champs_don_.add(ch_g_.valeur());
114 param.
ajouter(
"porosites", &porosites_);
117 param.
ajouter(
"gravite", &ch_g_);
128 Cerr <<
"Medium discretization." << finl;
137 int lambda_nb_comp = 0;
146 Cerr<<
"Convert Champ_fonc_MED lambda in Champ_Don..."<<finl;
148 dis.
discretiser_champ(
"champ_elem",domaine_dis,
"neant",
"neant",lambda_nb_comp,temps,ch_lambda_prov);
149 ch_lambda_prov->affecter(
ch_lambda_.valeur());
153 ch_lambda_->valeurs()=ch_lambda_prov->valeurs();
156 if(lambda_nb_comp >1)
157 ch_lambda_->fixer_nature_du_champ(multi_scalaire);
201 assert (ch_rho_->nb_comp() ==
ch_Cp_->nb_comp());
210 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"rho_cp_elem",
"J/m^3/K", 1 , temps, ch_rho_Cp_elem_);
225 Nom fld_name =
"porosite_volumique", fld_unit =
"rien";
238 assert (!is_user_porosites());
239 if (porosites_.is_read())
241 Cerr <<
"WHAT ?? You can not define in your medium both porosites_champ & porosites ! Remove one of them !" << finl;
245 is_field_porosites_ =
true;
249 Cerr <<
"To control the porosity field from ICoCo, please use Champ_Input_P0_Composite and not Champ_input_P0 !" << finl;
257 Cerr <<
"To control the porosity field from ICoCo, please define the initial field in your Champ_Input_P0_Composite !" << finl;
266 Cerr<<
"Convert Champ_fonc_MED " << fld_name <<
" to a OWN_PTR(Champ_Don_base) ..."<<finl;
268 dis.
discretiser_champ(
"champ_elem",zdb_.valeur(),
"neant",fld_unit,1,temps,tmp_fld);
284 else if (porosites_.is_read())
286 assert (!is_field_porosites());
289 Cerr <<
"WHAT ?? You can not define in your medium both porosites_champ & porosites ! Remove one of them !" << finl;
293 is_user_porosites_ =
true;
316 verifie_champ_porosites();
325 Nom fld_name =
"diametre_hydraulique", fld_unit =
"m";
338 has_hydr_diam_ =
true;
341 Cerr <<
"Convert Champ_fonc_MED " << fld_name <<
" to a OWN_PTR(Champ_Don_base) ..." << finl;
343 dis.
discretiser_champ(
"champ_elem", zdb_.valeur(),
"neant", fld_unit, 1, temps, tmp_fld);
372 assert(has_hydr_diam_);
378 for (
int f = 0; f < nb_face_tot; f++)
381 for (
int i = 0; i < 2; i++)
382 if ((e = f_e(f, i)) > -1)
392void Milieu_base::verifie_champ_porosites()
401 if (min_por >= 0.0 && max_por <= 1.0) { }
402 else if (min_por >= -1.e-12 && max_por <= 1. + 1.e-12 ) nettoie_champ_porosites();
405 Cerr <<
"WHAT ?? Your porosity field contains values < 0 or > 1 !!!! You should do something !" << finl;
410void Milieu_base::nettoie_champ_porosites()
412 Cerr <<
"************************************************************************" << finl;
413 Cerr <<
" We detected some element-porosity values which are slighly < 0 or > 1 !" << finl;
415 printf(
"Overflow : 1 - MAX = %.9g\n", 1.0 - mp_max_vect(
ch_porosites_->valeurs()));
416 printf(
"Overflow : MIN - 0 = %.9g\n", mp_min_vect(
ch_porosites_->valeurs()) - 0.);
418 Cerr <<
" We will clean the field to prevent overflows and numerical issues ... " << finl;
419 Cerr <<
"************************************************************************" << finl;
421 for (
int i = 0; i <
ch_porosites_->valeurs().dimension_tot(0); i++)
434 Cerr<<
"Error while reading the physical properties of a "<<
que_suis_je()<<
" medium."<<finl;
440 Cerr<<
"Warning while reading the physical properties of a "<<
que_suis_je()<<
" medium."<<finl;
444 Cerr<<
"The physical properties of a "<<
que_suis_je()<<
" medium have been successfully checked."<<finl;
457 Cerr <<
"The dimension is " <<
Objet_U::dimension <<
" and you create a gravity vector with " << ch_g_->nb_comp() <<
" components." << finl;
468void Milieu_base::warn_old_syntax()
472 Cerr <<
"YOU ARE USING AN OLD SYNTAX IN YOUR DATA FILE AND THIS IS NO MORE SUPPORTED !" << finl;
473 Cerr <<
"STARTING FROM TRUST-v1.9.3 : GRAVITY SHOULD BE READ INSIDE THE MEDIUM AND NOT VIA ASSOSCIATION ... " << finl;
474 Cerr <<
"HAVE A LOOK TO ANY TRUST TEST CASE TO SEE HOW IT SHOULD BE DONE ($TRUST_ROOT/tests/) ... " << finl;
475 Cerr <<
"OR RUN -convert_data OPTION OF YOUR APPLICATION SCRIPT, FOR TRUST FOR EXAMPLE:" << finl;
494 via_associer_ =
true;
501 via_associer_ =
true;
517 Cerr <<
"The dimension is " <<
Objet_U::dimension <<
" and you create a gravity vector with " << la_gravite.
nb_comp() <<
" components." << finl;
520 g_via_associer_ = la_gravite;
522 if (via_associer_ && ch_g_)
524 assert (g_via_associer_);
525 Cerr <<
"WHAT ?? Remove the associer gravity line from your jdd because it is already in the medium !!!" << finl;
550 tabalpha /= ch_rho_->valeurs()(0,0);
552 tab_divide_any_shape(tabalpha,ch_rho_->valeurs());
556 tabalpha /=
ch_Cp_->valeurs()(0,0);
557 tab_lambda_sur_cp /=
ch_Cp_->valeurs()(0,0);
561 tab_divide_any_shape(tabalpha,
ch_Cp_->valeurs());
562 tab_divide_any_shape(tab_lambda_sur_cp,
ch_Cp_->valeurs());
566 Cerr <<
"alpha calculation is not possible since lambda is not known." << finl;
571 assert(is_field_porosites());
579 for (
int face = 0; face < nb_face_tot; face++)
581 const int elem1 = face_voisins(face, 1), elem2 = face_voisins(face, 0);
582 if ((elem1 != -1) && (elem2 != -1))
584 else if (elem1 != -1)
595 if (ch_rho_) ch_rho_->mettre_a_jour(temps);
597 if (ch_g_) ch_g_->mettre_a_jour(temps);
599 if (g_via_associer_) g_via_associer_->mettre_a_jour(temps);
623 if (is_field_porosites())
626 Cerr <<
"Updating porosity values since Champ_input_P0 !! We update also the face_porosity & section_passage fields ..." << finl;
627 verifie_champ_porosites();
642 if (
equation_.size() && (*(
equation_.begin()->second)).inconnue().valeurs().isDataOnDevice())
644 mapToDevice(ch_rho_Cp_elem_->valeurs());
647 ch_rho_Cp_elem_->changer_temps(temps);
648 ch_rho_Cp_elem_->changer_temps(temps);
649 DoubleTab& rho_cp=ch_rho_Cp_elem_->valeurs();
651 rho_cp=ch_rho_->valeurs()(0,0);
656 tab_multiply_any_shape(rho_cp, ch_rho_->valeurs());
659 rho_cp*=
ch_Cp_->valeurs()(0,0);
661 tab_multiply_any_shape(rho_cp,
ch_Cp_->valeurs());
664 const MD_Vector& md_som = ch_rho_Cp_elem_->domaine_dis_base().domaine().md_vector_sommets(),
665 &md_faces = ref_cast(
Domaine_VF,ch_rho_Cp_elem_->domaine_dis_base()).md_vector_faces();
666 if (
ch_rho_Cp_comme_T_->valeurs().get_md_vector() == ch_rho_Cp_elem_->valeurs().get_md_vector())
681 if (ch_rho_) ch_rho_->abortTimeStep();
689 ch_rho_->mettre_a_jour(time);
691 ch_rho_->resetTime(time);
699 Cerr <<
"Milieu_base::creer_alpha (champ non lu)" << finl;
718 if (!ch_g_ && !g_via_associer_)
720 Cerr <<
"The gravity has not been associated with the medium" << finl;
724 return ch_g_ ? ch_g_.valeur() : g_via_associer_.valeur();
733 if (!ch_g_ && !g_via_associer_)
735 Cerr <<
"The gravity has not been associated with the medium" << finl;
739 return ch_g_ ? ch_g_.valeur() : g_via_associer_.valeur();
744 Cerr <<
que_suis_je() <<
" Milieu_base:::initialiser" << finl;
747 if (ch_g_) ch_g_->initialiser(temps);
749 if (g_via_associer_) g_via_associer_->initialiser(temps);
799 return ch_rho_.valeur();
808 return ch_rho_.valeur();
907 return (ch_g_ || g_via_associer_) ? 1 : 0;
927 if (opt == DESCRIPTION)
939 if (deja_associe_==1)
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_MED Load a field from a MED file for a given time.
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.
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void nommer_completer_champ_physique(const Domaine_dis_base &domaine_vdf, const Nom &nom_champ, const Nom &unite, Champ_base &champ, const Probleme_base &pbi) const
virtual bool is_dg() const
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
virtual const DoubleVect & face_surfaces() const
int nb_faces_tot() const
renvoie le nombre total de faces.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
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,...
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.
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
virtual void add_synonymous(const Nom &nom)
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
void ecrire(Sortie &) const
Ecrit un objet milieu sur un flot de sortie.
virtual int est_deja_associe()
Renvoie 0 si le milieu est deja associe a un probleme, 1 sinon.
virtual void associer_equation(const Equation_base *eqn) const
DoubleVect diametre_hydraulique_face_
virtual int initialiser(const double temps)
void nommer(const Nom &) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
virtual void creer_champs_non_lus()
void discretiser_porosite(const Probleme_base &pb, const Discretisation_base &dis)
virtual const Equation_base & equation(const std::string &nom_inc) const
virtual void mettre_a_jour(double temps)
virtual void resetTime(double time)
virtual void preparer_calcul()
virtual void calculate_face_porosity()
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual void abortTimeStep()
virtual void update_rho_cp(double temps)
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
int initialiser_porosite(const double temps)
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
OBS_PTR(Domaine_dis_base) zdb_
virtual void discretiser(const Probleme_base &pb, const Discretisation_base &dis)
OWN_PTR(Champ_base) ch_rho_
virtual void calculate_face_hydr_diam()
const Champ_base & get_champ(const Motcle &nom) const override
virtual const Champ_Don_base & diffusivite_fois_rho() const
virtual const Champ_Don_base & beta_t() const
Renvoie beta_t du milieu.
DoubleVect porosite_face_
void set_id_composite(const int i)
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
void discretiser_diametre_hydro(const Probleme_base &pb, const Discretisation_base &dis)
virtual void associer_gravite(const Champ_Don_base &)
Associe (affecte) un champ de gravite au milieu.
virtual void verifier_coherence_champs(int &err, Nom &message)
virtual const Champ_Don_base & diffusivite() const
Renvoie la diffusivite du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
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.
virtual void set_additional_params(Param ¶m) const
Champs_compris champs_compris_
int associer_(Objet_U &) override
Associe la gravite en controlant dynamiquement le type de l'objet a associer.
void check_gravity_vector() const
virtual void set_param(Param ¶m) const override
virtual void calculer_alpha()
Calcul de alpha=lambda/(rho*Cp).
void mettre_a_jour_porosite(double temps)
std::map< std::string, const Equation_base * > equation_
DoubleVect section_passage_face_
virtual int a_gravite() const
Renvoie 1 si la gravite a ete initialisee.
void fill_section_passage_face()
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
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.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
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(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
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.
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
_SIZE_ size_array() const