16#include <EcritureLectureSpecial.h>
17#include <Scalaire_impose_paroi.h>
18#include <Echange_global_impose.h>
19#include <Op_Conv_negligeable.h>
20#include <Energie_Multiphase.h>
21#include <Pb_Multiphase_HEM.h>
22#include <TRUSTTab_parts.h>
23#include <Champ_Uniforme.h>
24#include <Matrice_Morse.h>
25#include <Neumann_paroi.h>
26#include <Discret_Thyd.h>
27#include <Domaine_VF.h>
48 terme_convectif.set_description((Nom)
"Convective heat transfer rate=Integral(-h*u*ndS) [W] if SI units used");
51 terme_diffusif.set_description((Nom)
"Conduction heat transfer rate=Integral(lambda*grad(T)*ndS) [W] if SI units used");
55 if (sub_type(Pb_Multiphase_HEM,
probleme()))
57 bool check_source_FICC =
false;
59 for (
int ii = 0; ii <
sources().size(); ii++)
61 check_source_FICC =
true;
63 if (!check_source_FICC)
65 EChaine source_FI(
"{ flux_interfacial }");
92 Cerr <<
"Energy equation discretization " << finl;
97 l_inco_ch_->fixer_nom_compo(i,
Nom(
"temperature_") + pb.
nom_phase(i));
100 Cerr <<
"Energie_Multiphase::discretiser() ok" << finl;
125 if (
probleme().has_correlation(
"flux_parietal")
128 if (nb_comp == 1)
return;
129 Cerr <<
"Energie_Multiphase : when using a Flux_parietal correlation, only one wall temperature/heat flux "
130 <<
"can be specified at the boundary " << cl.
le_nom() <<
" . Please provide 1 component instead of " << nb_comp <<
"!" << finl;
144 static Motcle mot(
"Thermique");
183 const DoubleTab& alpha = ch_alpha.
valeurs(),
185 &en = ch_en.valeurs();
191 for (
int i = 0; i < Nl; i++)
192 for (
int n = 0; n < N; n++)
193 val(i, n) = (alpha(i, n) - pbm.
alpha_inf_phase(n)) * rho(!cR * i, n) * en(i, n);
196 DoubleTrav b_al, b_rho, b_en;
198 b_en = ch_en.valeur_aux_bords();
208 for (
int i = 0; i < Nb; i++)
209 for (
int n = 0; n < N; n++)
210 bval(i, n) = (b_al(i, n) - pbm.
alpha_inf_phase(n)) * b_rho(i, n) * b_en(i, n);
212 DoubleTab& d_a = deriv[
"alpha"];
215 for (
int i = 0; i < Nl; i++)
216 for (
int n = 0; n < N; n++)
217 d_a(i, n) = rho(!cR * i, n) * en(i, n);
220 const tabs_t d_vide = {},
221 &d_rho = pch_rho ? pch_rho->derivees() : d_vide,
222 &d_en = ch_en.derivees();
224 std::set<std::string> vars;
225 for (
auto &&d_c : d_rho)
226 vars.insert(d_c.first);
227 for (
auto &&d_c : d_en)
228 vars.insert(d_c.first);
230 for (
auto && var : vars)
232 const DoubleTab *dr = d_rho.count(var) ? &d_rho.at(var) :
nullptr,
233 *de = d_en.count(var) ? &d_en.at(var) :
nullptr;
235 DoubleTab& d_v = deriv[var];
238 for (
int i = 0; i < Nl; i++)
239 for (
int n = 0; n < N; n++)
240 d_v(i, n) = alpha(i, n) * ((dr ? (*dr)(i, n) * en(i, n) : 0) + (de ? rho(!cR * i, n) * (*de)(i, n) : 0));
252 const DoubleTab& alpha = ch_alpha.
valeurs(),
254 &en = ch_en.valeurs();
260 for (
int i = 0; i < Nl; i++)
261 for (
int n = 0; n < N; n++)
262 val(i, n) = alpha(i, n) * rho(!cR * i, n) * en(i, n);
265 DoubleTrav b_al, b_rho, b_en;
267 b_en = ch_en.valeur_aux_bords();
278 for (
int i = 0; i < Nb; i++)
279 for (
int n = 0; n < N; n++)
280 bval(i, n) = b_al(i, n) * b_rho(i, n) * b_en(i, n);
282 DoubleTab& d_a = deriv[
"alpha"];
285 for (
int i = 0; i < Nl; i++)
286 for (
int n = 0; n < N; n++)
287 d_a(i, n) = rho(!cR * i, n) * en(i, n);
290 const tabs_t d_vide = { },
291 &d_rho = pch_rho ? pch_rho->derivees() : d_vide,
292 &d_en = ch_en.derivees();
294 std::set < std::string > vars;
295 for (
auto &&d_c : d_rho)
296 vars.insert(d_c.first);
297 for (
auto &&d_c : d_en)
298 vars.insert(d_c.first);
300 for (
auto &&var : vars)
302 const DoubleTab *dr = d_rho.count(var) ? &d_rho.at(var) :
nullptr,
303 *de = d_en.count(var) ? &d_en.at(var) :
nullptr;
305 DoubleTab& d_v = deriv[var];
308 for (
int i = 0; i < Nl; i++)
309 for (
int n = 0; n < N; n++)
310 d_v(i, n) = alpha(i, n) * ((dr ? (*dr)(i, n) * en(i, n) : 0) + (de ? rho(!cR * i, n) * (*de)(i, n) : 0));
322 const DoubleTab& alpha = ch_alpha.
valeurs(),
331 for (
int i = 0; i < Nl; i++)
332 for (
int n = 0; n < N; n++)
333 val(i, n) = alpha(i, n) * rho(!cR * i, n) * h(i, n);
336 DoubleTrav b_al, b_rho, b_h ;
338 b_h = ch_h.valeur_aux_bords();
349 for (
int i = 0; i < Nb; i++)
350 for (
int n = 0; n < N; n++)
351 bval(i, n) = b_al(i, n) * b_rho(i, n) * b_h(i, n);
353 DoubleTab& d_a = deriv[
"alpha"];
356 for (
int i = 0; i < Nl; i++)
357 for (
int n = 0; n < N; n++)
358 d_a(i, n) = rho(!cR * i, n) * h(i, n);
361 const tabs_t d_vide = { },
362 &d_rho = pch_rho ? pch_rho->derivees() : d_vide,
363 &d_h = ch_h.derivees();
365 std::set < std::string > vars;
366 for (
auto &&d_c : d_rho)
367 vars.insert(d_c.first);
368 for (
auto &&d_c : d_h)
369 vars.insert(d_c.first);
371 for (
auto &&var : vars)
373 const DoubleTab *dr = d_rho.count(var) ? &d_rho.at(var) :
nullptr,
374 *dh = d_h.count(var) ? &d_h.at(var) :
nullptr;
376 DoubleTab& d_v = deriv[var];
379 for (
int i = 0; i < Nl; i++)
380 for (
int n = 0; n < N; n++)
381 d_v(i, n) = alpha(i, n) * ((dr ? (*dr)(i, n) * h(i, n) : 0) + (dh ? rho(!cR * i, n) * (*dh)(i, n) : 0));
397 champ_convecte_->associer_eqn(*
this);
399 champ_convecte_->nommer(nom_fonc.first);
400 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 Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
Operateur_Diff terme_diffusif
Operateur_Conv terme_convectif
void temperature(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
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.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
classe Energie_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressib...
void verifie_ch_init_nb_comp_cl(const Champ_Inc_base &ch_ref, const int nb_comp, const Cond_lim_base &cl) const override
Verification du nombre de composantes lues pour la specification d un champ.
int has_interface_blocs() const override
int impr(Sortie &os) const override
Impression des flux sur les bords sur un flot de sortie.
Operateur_Evanescence evanescence_
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application de l'equation.
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.
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) override
static void calculer_alpha_rho_e_conv(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
void init_champ_convecte() const override
static void calculer_alpha_rho_e(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).
void discretiser() override
Discretise l'equation.
static void calculer_alpha_rho_h(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
virtual std::pair< std::string, fonc_calc_t > get_fonc_champ_convecte() const
void set_param(Param ¶m) const override
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
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 void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual int impr(Sortie &os) const
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual void verifie_ch_init_nb_comp(const Champ_Inc_base &ch_ref, const int nb_comp) const
Verification du nombre de composantes lues pour la specification d un champ.
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.
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
const Champ_base & energie_interne() const
const Champ_base & enthalpie() const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
Une chaine de caractere (Nom) en majuscules.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
class Nom Une chaine de caractere pour nommer les objets de TRUST
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_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
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
classe Scalaire_impose_paroi Impose un scalaire a la paroi dans une equation de type Convection-Difus...
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