16#include <Fluide_Incompressible.h>
17#include <Discretisation_base.h>
18#include <Schema_Temps_base.h>
19#include <Milieu_composite.h>
20#include <Champ_Uniforme.h>
21#include <Equation_base.h>
22#include <Probleme_base.h>
23#include <Pb_Multiphase.h>
24#include <Interprete.h>
25#include <Domaine_VF.h>
36 std::vector<std::pair<std::string, int>> especes;
37 Cerr <<
"Reading Milieu_composite..." << finl;
42 Cerr <<
"Milieu_composite : { expected instead of " << mot << finl;
46 for (is >> mot; mot !=
"}"; is >> mot)
50 else if (Motcle(mot) ==
"POROSITES")
52 Cerr <<
"You should use porosites_champ and not porosites ! Call the 911 !" << finl;
55 else if (Motcle(mot) ==
"GRAVITE")
57 Cerr <<
que_suis_je() <<
" : gravity should not be defined in Pb_Multiphase ! Use source_qdm if you want gravity in QDM equation !" << finl;
63 Cerr <<
"Milieu_composite: add phase " << mot <<
" ... " << finl;
65 fluide.typer_lire_simple(is,
"Typing the fluid medium ...");
67 if (fluide->has_porosites())
69 Cerr <<
que_suis_je() +
" : porosity should be defined only once in the milieu_composite block, not in " + fluide->
que_suis_je() << finl;
72 if (fluide->a_gravite())
74 Cerr <<
que_suis_je() +
" : gravity should be defined only once in the milieu_composite block, not in " + fluide->
que_suis_je() << finl;
77 if (fluide->has_hydr_diam())
79 Cerr <<
que_suis_je() +
" : diametre_hyd_champ should be defined only once in the milieu_composite block, not in " + fluide->
que_suis_je() << finl;
82 if (!sub_type(Fluide_base,fluide.valeur()))
84 Cerr <<
que_suis_je() +
" : only real fluids should be read and not a fluid of type " + fluide->
que_suis_je() << finl;
88 fluide->set_id_composite(i++);
96 Cerr <<
"Milieu_composite: add saturation " << mot <<
" ... " << finl;
97 sat_lu_.typer_lire_simple(is,
"Typing the saturation ...");
102 Cerr <<
"Milieu_composite: add interface " << mot <<
" ... " << finl;
103 inter_lu_.typer_lire_simple(is,
"Typing the interface ...");
109 Cerr <<
"You define both interface and saturation in Milieu_composite ???" << finl;
115 for (
int n = 0; n < N; n++)
117 std::vector<Interface_base *> inter;
118 for (
int m = 0; m < N; m++)
120 const std::string espn = especes[n].first, espm = especes[m].first;
121 const int pn = especes[n].second, pm = especes[m].second;
125 Cerr <<
"Interface between fluid " << n <<
" : " <<
fluides_[n]->le_nom() <<
" and " << m <<
" : " <<
fluides_[m]->le_nom() << finl;
127 const Saturation_base *sat = sub_type(Saturation_base, *inter.back()) ? &ref_cast(Saturation_base, *inter.back()) : nullptr;
136 else inter.push_back(
nullptr);
150 std::string suffix1 =
"_group1";
151 std::string suffix2 =
"_group2";
152 if (nomjdd.size() >= suffix1.size() && nomjdd.compare(nomjdd.size() - suffix1.size(), suffix1.size(), suffix1) == 0)
154 nomjdd.erase(nomjdd.size() - suffix1.size(), suffix1.size());
156 else if (nomjdd.size() >= suffix2.size() && nomjdd.compare(nomjdd.size() - suffix2.size(), suffix2.size(), suffix2) == 0)
158 nomjdd.erase(nomjdd.size() - suffix2.size(), suffix2.size());
161 return std::make_pair(nomjdd, phase);
188 assert(i >= 0 && i < (
int )
fluides_.size());
194 assert(i >= 0 && i < (
int )
fluides_.size());
200 for (
auto &itr :
fluides_) itr->initialiser(temps);
202 const bool res_en_T =
equation_.count(
"temperature") ? true :
false;
212 ch_e.associer_eqn(eqn);
215 ch_h_ou_T.associer_eqn(eqn);
221 ch_rho_->changer_temps(temps);
222 ch_e_int_->changer_temps(temps);
236 Cerr <<
"Composite medium discretization." << finl;
244 for (
auto& itr :
fluides_) itr->discretiser(pb, dis);
248 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"masse_volumique",
"kg/m^3", N, nc, temps, rho_inc);
249 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"energie_interne",
"J/m^3", N, nc, temps, ei_inc);
251 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"enthalpie",
"J/m^3", N, nc, temps, h_ou_T_inc);
253 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"temperature",
"C", N, nc, temps, h_ou_T_inc);
255 ch_rho_ = rho_inc, ch_e_int_ = ei_inc,
ch_h_ou_T_ = h_ou_T_inc;
258 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"viscosite_dynamique",
"kg/m/s", N, temps, ch_mu_);
264 dis.
discretiser_champ(
"champ_elem", domaine_dis,
"masse_volumique_melange",
"kg/m^3", 1, temps, rho_m_);
277 Cerr <<
"Milieu_composite::" << __func__ <<
" ==> Surface tension discretization ..." << finl;
278 if (
has_saturation_) Cerr <<
"Milieu_composite::" << __func__ <<
" ==> Saturation temperature discretization ..." << finl;
280 for (
int k = 0; k < N; k++)
281 for (
int l = k + 1; l < N; l++)
283 int phase =
fluides_[k]->le_nom().debute_par(
"gaz");
284 Nom espece = phase ?
fluides_[k]->le_nom().getSuffix(
"gaz_") :
fluides_[k]->le_nom().getSuffix(
"liquide_");
289 Nom sig_nom =
Nom(
"surface_tension_") + espece;
297 Nom Tsat_nom =
Nom(
"Tsat_") + espece;
311 for (
auto& itr :
fluides_) itr->mettre_a_jour(temps);
313 ch_rho_->mettre_a_jour(temps);
314 ch_e_int_->mettre_a_jour(temps);
318 for (
auto && f: fields) (*f)->mettre_a_jour(temps);
325 const int N = (int)
fluides_.size();
326 for (
int k = 0; k < N; k++)
327 for (
int l = k + 1; l < N; l++)
341 DoubleTab& tab = ch_mu_->valeurs();
342 const int Nl = ch_mu_->valeurs().dimension_tot(0);
343 for (
int n = 0; n < N; n++)
347 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
353 DoubleTab& tab =
ch_nu_->valeurs();
354 const int Nl =
ch_nu_->valeurs().dimension_tot(0);
355 for (
int n = 0; n < N; n++)
359 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
366 const int Nl =
ch_alpha_->valeurs().dimension_tot(0);
367 for (
int n = 0; n < N; n++)
371 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
379 for (
int n = 0; n < N; n++)
383 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
390 const int Nl =
ch_lambda_->valeurs().dimension_tot(0);
391 for (
int n = 0; n < N; n++)
395 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
401 DoubleTab& tab =
ch_Cp_->valeurs();
402 const int Nl =
ch_Cp_->valeurs().dimension_tot(0);
403 for (
int n = 0; n < N; n++)
407 for (
int i = 0; i < Nl; i++) tab(i, n) = ch_n.
valeurs()(!cch * i, 0);
412 DoubleTab& trm = rho_m_->valeurs(), &thm =
h_m_->valeurs();
421 for (
int n = 0; n < N; n++)
422 for (
int i = 0; i < Nl; i++) trm(i) += a(i, n) * r(i, n);
425 for (
int n = 0; n < N; n++)
426 for (
int i = 0; i < Nl; i++) thm(i) += a(i, n) * r(i, n) * ent(i, n);
427 for (
int i = 0; i < Nl; i++) thm(i) /= trm(i);
434 for (
const auto& itr :
fluides_) itr->associer_equation(eqn);
449 std::vector<const DoubleTab *> split(N);
450 for (n = 0; n < N; n++) split[n] = &mil.
fluides_[n]->masse_volumique().valeurs();
451 for (i = 0; i < Ni; i++)
452 for (n = 0; n < N; n++) val(i, n) = (*split[n])(i * (split[n]->
dimension(0) > 1), 0);
454 std::vector<DoubleTab> bsplit(N);
455 for (n = 0; n < N; n++)
456 if (mil.
fluides_[n]->masse_volumique().a_un_domaine_dis_base())
457 bsplit[n] = mil.
fluides_[n]->masse_volumique().valeur_aux_bords();
459 for (i = 0; i < Nb; i++)
460 for (n = 0; n < N; n++) bval(i, n) = bsplit[n](i * (split[n]->dimension(0) > 1), 0);
463 std::vector<const tabs_t *> split_der(N);
465 std::set<std::string> noms_der;
466 for (n = 0; n < N; n++)
468 for (
auto &&n_d : *split_der[n]) noms_der.insert(n_d.first);
469 for (
auto &&nom : noms_der)
471 for (n = 0; n < N; n++) split[n] = split_der[n] && split_der[n]->count(nom) ? &split_der[n]->at(nom) :
nullptr;
472 DoubleTab& der = deriv[nom];
473 for (der.
resize(Ni, N), i = 0; i < Ni; i++)
474 for (n = 0; n < N; n++) der(i, n) = split[n] ? (*split[n])(i * (split[n]->
dimension(0) > 1)) : 0;
482 std::vector<const DoubleTab *> split(N);
483 for (n = 0; n < N; n++) split[n] = &mil.
fluides_[n]->energie_interne().valeurs();
484 for (i = 0; i < Ni; i++)
485 for (n = 0; n < N; n++) val(i, n) = (*split[n])(i * (split[n]->
dimension(0) > 1), 0);
487 std::vector<DoubleTab> bsplit(N);
488 for (n = 0; n < N; n++) bsplit[n] = mil.
fluides_[n]->energie_interne().valeur_aux_bords();
489 for (i = 0; i < Nb; i++)
490 for (n = 0; n < N; n++) bval(i, n) = bsplit[n](i * (split[n]->dimension(0) > 1), 0);
493 std::vector<const tabs_t *> split_der(N);
495 std::set<std::string> noms_der;
496 for (n = 0; n < N; n++)
498 for (
auto &&n_d : *split_der[n]) noms_der.insert(n_d.first);
499 for (
auto &&nom : noms_der)
501 for (n = 0; n < N; n++) split[n] = split_der[n] && split_der[n]->count(nom) ? &split_der[n]->at(nom) :
nullptr;
502 DoubleTab& der = deriv[nom];
503 for (der.
resize(Ni, N), i = 0; i < Ni; i++)
504 for (n = 0; n < N; n++) der(i, n) = split[n] ? (*split[n])(i * (split[n]->
dimension(0) > 1)) : 0;
512 std::vector<const DoubleTab *> split(N);
513 for (n = 0; n < N; n++) split[n] = &mil.
fluides_[n]->enthalpie().valeurs();
514 for (i = 0; i < Ni; i++)
515 for (n = 0; n < N; n++) val(i, n) = (*split[n])(i * (split[n]->
dimension(0) > 1), 0);
517 std::vector<DoubleTab> bsplit(N);
518 for (n = 0; n < N; n++) bsplit[n] = mil.
fluides_[n]->enthalpie().valeur_aux_bords();
519 for (i = 0; i < Nb; i++)
520 for (n = 0; n < N; n++) bval(i, n) = bsplit[n](i * (split[n]->dimension(0) > 1), 0);
523 std::vector<const tabs_t *> split_der(N);
525 std::set<std::string> noms_der;
526 for (n = 0; n < N; n++)
528 for (
auto &&n_d : *split_der[n]) noms_der.insert(n_d.first);
529 for (
auto &&nom : noms_der)
531 for (n = 0; n < N; n++) split[n] = split_der[n] && split_der[n]->count(nom) ? &split_der[n]->at(nom) :
nullptr;
532 DoubleTab& der = deriv[nom];
533 for (der.
resize(Ni, N), i = 0; i < Ni; i++)
534 for (n = 0; n < N; n++) der(i, n) = split[n] ? (*split[n])(i * (split[n]->
dimension(0) > 1)) : 0;
542 std::vector<const DoubleTab *> split(N);
543 for (n = 0; n < N; n++) split[n] = &mil.
fluides_[n]->temperature_multiphase().valeurs();
544 for (i = 0; i < Ni; i++)
545 for (n = 0; n < N; n++) val(i, n) = (*split[n])(i * (split[n]->
dimension(0) > 1), 0);
547 std::vector<DoubleTab> bsplit(N);
548 for (n = 0; n < N; n++) bsplit[n] = mil.
fluides_[n]->temperature_multiphase().valeur_aux_bords();
549 for (i = 0; i < Nb; i++)
550 for (n = 0; n < N; n++) bval(i, n) = bsplit[n](i * (split[n]->dimension(0) > 1), 0);
553 std::vector<const tabs_t *> split_der(N);
555 std::set<std::string> noms_der;
556 for (n = 0; n < N; n++)
558 for (
auto &&n_d : *split_der[n]) noms_der.insert(n_d.first);
559 for (
auto &&nom : noms_der)
561 for (n = 0; n < N; n++) split[n] = split_der[n] && split_der[n]->count(nom) ? &split_der[n]->at(nom) :
nullptr;
562 DoubleTab& der = deriv[nom];
563 for (der.
resize(Ni, N), i = 0; i < Ni; i++)
564 for (n = 0; n < N; n++) der(i, n) = split[n] ? (*split[n])(i * (split[n]->
dimension(0) > 1)) : 0;
571 if (ch_e_int_) ch_e_int_->abortTimeStep();
577 for (
auto& itr :
fluides_) itr->initTimeStep(dt);
583 std::vector<Champ_Inc_base *> vch;
591 for (
auto &pch : vch)
595 pch->futur(i) = pch->valeurs();
classe Champ_Don_base classe de base des Champs donnes (non calcules)
void init_champ_calcule(const Objet_U &obj, fonc_calc_t fonc)
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.
virtual void associer_eqn(const Equation_base &)
Associe le champ a l'equation dont il represente une inconnue.
virtual DoubleTab & valeurs()=0
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 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 DoubleTab & xv_bord() const
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
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
void calculer_temperature_multiphase() const
void discretiser_sigma(const Nom &sig_nom, double temps)
Champ_Don_base & get_sigma_champ()
void assoscier_pb(const Probleme_base &pb)
virtual void mettre_a_jour(double)
virtual void associer_equation(const Equation_base *eqn) const
void discretiser_porosite(const Probleme_base &pb, const Discretisation_base &dis)
virtual const Equation_base & equation(const std::string &nom_inc) const
virtual void abortTimeStep()
int initialiser_porosite(const double temps)
void discretiser_diametre_hydro(const Probleme_base &pb, const Discretisation_base &dis)
Champs_compris champs_compris_
void mettre_a_jour_porosite(double temps)
std::map< std::string, const Equation_base * > equation_
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
void associer_equation(const Equation_base *eqn) const override
OWN_PTR(Champ_Don_base) rho_m_
std::vector< OWN_PTR(Fluide_base)> fluides_
static void calculer_enthalpie(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
static void calculer_temperature_multiphase(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
void preparer_calcul() override
static void calculer_masse_volumique(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
void abortTimeStep() override
std::vector< std::vector< Interface_base * > > tab_interface_
bool has_interface() const
virtual void mettre_a_jour_tabs()
bool has_saturation() const
Interface_base & get_interface(int k, int l) const
bool fluid_properties_initialised_
bool initTimeStep(double dt) override
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
Saturation_base & get_saturation(int k, int l) const
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du milieu, et donc de ses parametres caracteristiques.
static void calculer_energie_interne(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
int check_unknown_range() const override
std::pair< std::string, int > check_fluid_name(const Nom &name)
int initialiser(const double temps) override
Initialise les parametres du fluide.
const Fluide_base & get_fluid(const int i) const
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom getSuffix(const char *const) const
virtual int debute_par(const char *const n) const
const std::string & getString() const
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 Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
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.
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void discretiser_Tsat(const Nom &Tsat_nom, double temps)
void Tsat(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
void Hls(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
Champ_Don_base & get_Tsat_champ()
void Hvs(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
virtual int nb_valeurs_futures() 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