16#include <Operateur_Diff_base.h>
17#include <Discretisation_base.h>
18#include <Schema_Temps_base.h>
19#include <Pb_Multiphase_HEM.h>
20#include <Champ_Composite.h>
21#include <TRUSTTab_parts.h>
22#include <QDM_Multiphase.h>
23#include <Discret_Thyd.h>
24#include <Fluide_base.h>
69 if (!sub_type(Fluide_base,le_fluide.valeur()))
71 Cerr<<
"ERROR : the QDM_Multiphase equation can be associated only to a fluid."<<finl;
74 divergence.set_description((Nom)
"Mass flow rate=Integral(rho*u*ndS) [kg.s-1]");
77 const Pb_Multiphase& pb = ref_cast(Pb_Multiphase,
probleme());
81 if (sub_type(Pb_Multiphase_HEM,
probleme()))
83 EChaine eva(
"{ homogene { alpha_res 1 alpha_res_min 0.5 } }");
88 EChaine eva(
"{ homogene { alpha_res 1e-6 } }");
151 for (n = 0; n < N; n++)
156 for (i = 0; i < std::min(psrc.size(), pdst.
size()); i++)
158 DoubleTab& src = psrc[i], &dst = pdst[i];
160 for (j = 0; j < src.
dimension_tot(0); j++) dst(j) = src(j, n);
163 for (d = 0; d < D; d++)
164 dst(j, d) = src(j, N * d + n);
170 if (la_vorticite) la_vorticite->mettre_a_jour(temps);
174 for (n = 0; n < N; n++)
180 for (i = 0; i < D; i++)
181 for (j = 0; j < D; j++)
187 for (i = 0; i < psrc.size(); i++)
188 for (j = 0; j < pdst.
size(); j++)
190 DoubleTab& src = psrc[i], &dst = pdst[j];
191 if (src.
line_size() == N * D * D && dst.line_size() == D * D)
194 for (
int dU = 0; dU < D; dU++)
195 for (
int dX = 0; dX < D; dX++)
196 dst(k, dX + D * dU) = src(k, dX, dU + n * D);
213 ConstDoubleTab_parts ppart(
pression().valeurs());
246 return le_fluide->viscosite_dynamique();
251 return le_fluide->viscosite_cinematique();
269 Cerr<<
" Navier_Stokes_std::completer_deb"<<finl;
271 Cerr<<
" Navier_Stokes_std::completer_fin"<<finl;
278 for (
auto mor : morceaux) mor->check_multiphase_compatibility();
292 if (opt==DESCRIPTION)
293 Cerr<<
" QDM_Multiphase : "<< noms_compris <<finl;
295 noms.add(noms_compris);
313 Noms noms(D * D), unites(D * D);
314 std::vector<Nom> composantsVitesse({
Nom(
"dU"),
Nom(
"dV"),
Nom(
"dW")});
315 std::vector<Nom> composantsDerivee({
Nom(
"dx"),
Nom(
"dy"),
Nom(
"dz")});
316 for (
int dU = 0 ; dU< D ; dU++)
317 for (
int dX = 0 ; dX < D ; dX++)
319 noms[ D * dU + dX]=
Nom(composantsVitesse[dU] + composantsDerivee[dX]);
320 unites[ D * dU + dX] =
Nom(
"m2/s");
323 Motcle typeChamp =
"champ_elem" ;
328 if (motlu ==
"gradient_pression")
342 Cerr <<
"Reading of initial conditions\n";
347 Cerr <<
que_suis_je() <<
": expected { instead of " << nom << finl;
350 int vit_lu = 0, press_lu = 0;
351 for (is >> nom; nom !=
"}"; is >> nom)
352 if (nom ==
"vitesse" || nom ==
"velocity")
357 if (src->que_suis_je() ==
"Champ_Composite")
360 if ( nb_dim != nb_phases)
362 Cerr <<
que_suis_je() <<
": velocity initial condition Champ_Composite should have "<< nb_phases <<
" fields and not " << nb_dim <<
" !" << finl;
368 la_vitesse->affecter(src), vit_lu = 1;
369 la_vitesse->passe() = la_vitesse->valeurs();
371 else if (nom ==
"pression" || nom ==
"pressure")
381 Cerr <<
que_suis_je() <<
": expected vitesse|velocity|pression|pressure instead of " << nom << finl;
387 Cerr <<
que_suis_je() <<
": velocity initial condition not found." << finl;
392 Cerr <<
que_suis_je() <<
": pressure initial condition not found." << finl;
418 if (!
evanescence_)
Process::exit(
"QDM_Multiphase::alpha_res : the evanescence operator should have been created already !" );
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
double changer_temps(const double temps) override
Fixe le temps du champ.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
double changer_temps_futur(double, int i=1)
Fixe le temps du ieme champ futur.
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void gradient_P(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
void vitesse(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
virtual bool is_vdf() 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
Class defining operators and methods for all reading operation in an input flow (file,...
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.
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual void abortTimeStep()
Reinitialiser ce qui doit l'etre.
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
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.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
Operateur_Diff terme_diffusif
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
Operateur_Conv terme_convectif
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
void creer_champ(const Motcle &motlu) override
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 completer() override
Complete l'equation base, associe la pression a l'equation,.
Champ_Inc_base & pression_pa()
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
int has_interface_blocs() const override
void set_param(Param &titi) const override
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
OWN_PTR(Assembleur_base) &assembleur_pression()
Champ_Inc_base & pression()
class Nom Une chaine de caractere pour nommer les objets de TRUST
Un tableau de chaine de caracteres (VECT(Nom)).
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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Evanescence Classe generique de la hierarchie des operateurs representant un terme
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...
const Nom & nom_phase(int i) const
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
void completer() override
Complete l'equation base, associe la pression a l'equation,.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Operateur_Evanescence evanescence_
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Champ_Don_base & diffusivite_pour_transport() const override
void creer_champ(const Motcle &motlu) override
Motcles noms_grad_vit_phases_
void discretiser_vitesse() override
std::vector< OWN_PTR(Champ_Inc_base)> vit_phases_
const Champ_base & vitesse_pour_transport() const override
void discretiser_grad_p() override
void abortTimeStep() override
Reinitialiser ce qui doit l'etre.
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) override
Entree & lire_cond_init(Entree &) override
Lecture des conditions initiales dans un flot d'entree.
void set_param(Param ¶m) const override
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
std::vector< OWN_PTR(Champ_Fonc_base)> grad_vit_phases_
int has_interface_blocs() const override
const Champ_base & diffusivite_pour_pas_de_temps() const override
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
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.
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
virtual int nb_valeurs_futures() const =0
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
Classe de base des flux de sortie.
_SIZE_ dimension_tot(int) const override