16#include <EcritureLectureSpecial.h>
17#include <Pb_Multiphase_HEM.h>
18#include <Masse_Multiphase.h>
19#include <Champ_Uniforme.h>
20#include <Matrice_Morse.h>
21#include <Discret_Thyd.h>
22#include <Fluide_base.h>
23#include <Domaine_VF.h>
44 terme_convectif.set_description((Nom)
"Mass flow rate=Integral(-alpha*rho*u*ndS) [kg/s] if SI units used");
50 if (sub_type(Pb_Multiphase_HEM,
probleme()))
52 bool check_source_FICC =
false;
54 for (
int ii = 0; ii <
sources().size(); ii++)
56 check_source_FICC =
true;
58 if (!check_source_FICC)
60 EChaine source_FI(
"{ flux_interfacial }");
73 param.
ajouter_condition(
"is_read_convection",
"The convection operator must be read, select negligeable type if you want to neglect it.");
87 Cerr <<
"Masse_Multiphase : wrong operator number " << i << finl;
97 Cerr <<
"Masse_Multiphase : wrong operator number " << i << finl;
154 Op_Grad_.l_op_base().associer_eqn(*
this);
157 Op_Grad_->associer(zdis, zcl, inco);
160 verifier_somme_alpha();
163void Masse_Multiphase::verifier_somme_alpha()
165 const DoubleTab& vals = l_inco_ch_->valeurs();
167 DoubleVect vals_somme(ne);
170 for (
int i = 0; i < ne; i++)
171 for (
int j = 0; j < nl; j++)
172 vals_somme(i) += vals(i, j);
174 const double min_a = mp_min_vect(vals_somme), max_a = mp_max_vect(vals_somme);
176 if (min_a < 1. - 1.e-12 || max_a > 1. + 1.e-12)
178 Cerr <<
"WHAT ?? The sum of the void fraction (per cell) is not 1 !!!! You should do something !" << finl;
191 Cerr <<
"Volume fraction discretization" << finl;
197 l_inco_ch_->fixer_nom_compo(i,
Nom(
"alpha_") + pb.
nom_phase(i));
201 Cerr <<
"Masse_Multiphase::discretiser() ok" << finl;
240 Cerr <<
"You forgot to associate the fluid to the problem named " <<
probleme().
le_nom() << finl;
243 return le_fluide_.valeur();
255 return le_fluide_.valeur();
266 static Motcle domaine =
"Fraction_volumique";
287 const DoubleTab& alpha = ch_alpha.
valeurs(),
295 for (
int i = 0; i < nl; i++)
296 for (
int n = 0; n < N; n++)
297 val(i, n) = alpha(i, n) * rho(!cR * i, n);
307 DoubleTab& d_a = deriv[
"alpha"];
310 for (
int i = 0; i < nl; i++)
311 for (
int n = 0; n < N; n++)
312 d_a(i, n) = rho(!cR * i, n);
315 for (
auto &&d_c : pch_rho->derivees())
317 DoubleTab& der = deriv[d_c.first];
320 for (
int i = 0; i < nl; i++)
321 for (
int n = 0; n < N; n++)
322 der(i, n) = d_c.second(i, n) * alpha(i, n);
332 const DoubleTab& alpha = ch_alpha.
valeurs(), &rho = ch_rho.
valeurs();
338 for (
int i = 0; i < nl; i++)
339 for (
int n = 0; n < N; n++)
352 for (
int i = 0; i < n2; i++)
353 for (
int n = 0; n < N; n++)
356 tab_multiply_any_shape(bval, calpha, VECT_ALL_ITEMS);
359 DoubleTab& d_a = deriv[
"alpha"];
362 for (
int i = 0; i < nl; i++)
363 for (
int n = 0; n < N; n++)
364 d_a(i, n) = rho(!cR * i, n);
367 for (
auto &&d_c : pch_rho->derivees())
369 DoubleTab& der = deriv[d_c.first];
372 for (
int i = 0; i < nl; i++)
373 for (
int n = 0; n < N; n++)
374 der(i, n) = d_c.second(i, n) * alpha(i, n);
390 champ_convecte_->associer_eqn(*
this);
392 champ_convecte_->nommer(nom_fonc.first);
393 champ_convecte_->init_champ_calcule(*
this, nom_fonc.second);
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
DoubleTab valeur_aux_bords() const override
renvoie la valeur du champ aux faces de bord
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual int a_un_domaine_dis_base() const
virtual DoubleTab valeur_aux_bords() const
renvoie la valeur du champ aux faces de bord
virtual DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const
Provoque une erreur ! Doit etre surchargee par les classes derivees.
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
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.
Operateur_Conv terme_convectif
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
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.
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
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 void set_param(Param &titi) const override
virtual const Milieu_base & milieu() const =0
virtual void dimensionner_matrice_sans_mem(Matrice_Morse &mat_morse)
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
virtual void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={})
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void discretiser()
Discretise l'equation.
virtual Entree & lire_sources(Entree &)
Lecture des termes sources dans un flot d'entree.
virtual int has_interface_blocs() const
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
classe Masse_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressible
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.
static void calculer_alpha_rho(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
const Operateur & operateur(int) const override
Renvoie l'operateur specifie par son index: renvoie terme_diffusif si i = 0.
void discretiser() override
Discretise l'equation.
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application de l'equation.
Operateur_Evanescence evanescence_
static void calculer_alpha_rho_conv(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue representant l'inconnue (T ou H) (version const).
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation.
void associer_milieu_base(const Milieu_base &) override
Associe un milieu physique a l'equation, le milieu est en fait caste en Fluide_base.
int has_interface_blocs() const override
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
void associer_fluide(const Fluide_base &)
Associe un fluide de type Fluide_base a l'equation.
void init_champ_convecte() const override
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) override
void completer() override
Associe l inconnue de l equation a la loi d etat,.
const Fluide_base & fluide() const
Renvoie le fluide incompressible associe a l'equation.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
std::pair< std::string, fonc_calc_t > get_fonc_champ_convecte() const
void set_param(Param ¶m) const override
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les 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.
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.
classe Operateur Classe generique de la hierarchie des operateurs.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
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 Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
double alpha_inf_phase(int i) const
const Nom & nom_phase(int i) const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
virtual int nb_valeurs_temporelles() const =0
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
_SIZE_ size_reelle_ok() const