16#include <Convection_Diffusion_Espece_Multi_QC.h>
17#include <Navier_Stokes_Turbulent_QC.h>
18#include <Fluide_Quasi_Compressible.h>
19#include <Neumann_sortie_libre.h>
20#include <Loi_Etat_Multi_GP_QC.h>
21#include <Discretisation_base.h>
22#include <Navier_Stokes_QC.h>
23#include <Probleme_base.h>
28#include <Perf_counters.h>
55 Cerr <<
"Reading and typing of the diffusion operator : " << finl;
58 ref_cast_non_const(Champ_base,
terme_diffusif.diffusivite()).nommer(
"mu_sur_Schmidt");
64 else if (mot==
"convection")
66 const Probleme_base& pb =
probleme();
67 const Champ_Inc_base& vit_transportante = (pb.
que_suis_je() ==
"Pb_Thermohydraulique_Especes_Turbulent_QC") ? ref_cast(Navier_Stokes_Turbulent_QC,pb.
equation(0)).rho_la_vitesse() :
68 ref_cast(Navier_Stokes_QC,pb.
equation(0)).rho_la_vitesse();
82 return le_fluide->mu_sur_Schmidt();
91 Fluide_Quasi_Compressible& le_fluideQC = ref_cast(Fluide_Quasi_Compressible,
fluide());
92 Loi_Etat_Multi_GP_QC& loi_etat = ref_cast_non_const(Loi_Etat_Multi_GP_QC, le_fluideQC.loi_etat().valeur());
99 Conds_lim& condlims = zcl_modif_->les_conditions_limites();
100 int nb = condlims.size();
101 for (
int i = 0; i < nb; i++)
104 if (sub_type(Neumann_sortie_libre, condlims[i].valeur()))
106 ref_cast(Neumann_sortie_libre,condlims[i].valeur()).tab_ext() = 1;
108 if (sub_type(Dirichlet, condlims[i].valeur()))
110 const Frontiere_dis_base& frdis = condlims[i]->frontiere_dis();
111 EChaine toto(
" Champ_front_uniforme 1 1");
112 toto >> condlims[i].valeur();
113 condlims[i]->associer_fr_dis_base(frdis);
115 DoubleTab& T = condlims[i]->champ_front().valeurs();
133 solveur_masse->appliquer(derivee);
134 DoubleTrav derivee_bis(derivee);
142 for (
int i = 0; i < n; i++)
143 derivee_bis(i) = -derivee_bis(i) * frac_mass(i);
149 solveur_masse->set_name_of_coefficient_temporel(
"masse_volumique");
150 solveur_masse->appliquer(derivee_bis);
151 solveur_masse->set_name_of_coefficient_temporel(
"no_coeff");
152 derivee += derivee_bis;
159 const auto& tab1 = matrice.
get_tab1();
168 DoubleTrav divu1(inco);
175 for (
int i = 0; i < ndl; i++)
177 resu(i) -= divu1(i) * inco(i);
178 matrice(i, i) += divu1(i);
181 for (
int som = 0; som < ndl; som++)
183 double inv_rho = 1 / rho(som);
184 for (
auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
186 resu(som) *= inv_rho;
194 char *theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
195 if (theValue !=
nullptr)
201 DoubleTab test(resu);
202 DoubleTab test2(resu);
203 DoubleTrav resu2(resu);
205 solveur_masse->appliquer(test2);
207 Cerr <<
" here " << mp_max_abs_vect(resu2) << finl;
209 solveur_masse->appliquer(test);
210 const double max_test = mp_max_abs_vect(test);
211 Cerr <<
"iii " << max_test << finl;
216 for (
int i = 0; i < resu.
size(); i++)
217 if (std::fabs(test(i)) > 1e-5)
218 Cerr << i <<
" " << test(i) << finl;
227 statistics().
begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
230 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
242 for (
int som = 0; som < ndl; som++)
244 double inv_rho = 1 / rho(som);
245 for (
auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
247 secmem(som) *= inv_rho;
254 DoubleTrav divu1(inco);
257 for (
int i = 0; i < ndl; i++)
259 secmem(i) -= divu1(i) * inco(i);
261 (*mat)(i, i) += divu1(i);
263 statistics().
end_count(STD_COUNTERS::ajouter_blocs);
265 statistics().
begin_count(STD_COUNTERS::source_terms,statistics().get_last_opened_counter_level()+1);
266 for (
int i = 0; i <
sources().size(); i++)
267 sources()(i)->ajouter_blocs(matrices, secmem, semi_impl);
268 statistics().
end_count(STD_COUNTERS::source_terms);
270 statistics().
begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
279 statistics().
end_count(STD_COUNTERS::ajouter_blocs);
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Convection_Diffusion_Espece_Multi_QC Cas particulier de Convection_Diffusion_Espece_Multi_base
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
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Renvoie la derivee en temps de l'inconnue de l'equation.
void completer() override
Associe l inconnue de l equation a la loi d etat,.
const Champ_base & diffusivite_pour_pas_de_temps() const override
void set_param(Param &titi) const override
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
classe Convection_Diffusion_Espece_Multi_base Cas particulier de Convection_Diffusion_Espece_Fluide_D...
const Champ_base & get_champ(const Motcle &nom) const override
void set_param(Param &titi) const override
void calculer_div_rho_u_impl(DoubleTab &res, const Convection_Diffusion_Fluide_Dilatable_base &eqn) const
const Champ_Don_base & diffusivite_pour_transport() const override
const Fluide_Dilatable_base & fluide() const
const Champ_Inc_base & inconnue() const override
void associer_vitesse(const Champ_base &)
Associe la vitesse transportante a l'equation.
Operateur_Diff terme_diffusif
const Operateur & operateur(int) const override
Renvoie l'operateur specifie par son index: renvoie terme_diffusif si i = 0.
Operateur_Conv terme_convectif
Class defining operators and methods for all reading operation in an input flow (file,...
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
virtual void modifier_pour_Cl(Matrice_Morse &mat_morse, DoubleTab &secmem) const
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.
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.
const Nom & le_nom() const override
Renvoie le nom du champ.
void associer_espece(const Convection_Diffusion_Espece_Multi_QC &eq)
Associe les proprietes physiques d une espece a la loi d'etat.
virtual void associer_inconnue(const Champ_Inc_base &inconnue)
Associe l inconnue de chaque equation de fraction massique a la loi d'etat.
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab1() const
Une chaine de caractere (Nom) en majuscules.
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.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
virtual Operateur_base & l_op_base()=0
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const =0
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.
void begin_count(const STD_COUNTERS &std_cnt, int counter_lvl=-100000)
void end_count(const std::string &custom_count_name, int count_increment=1, long int quantity_increment=0)
End the count of a counter and update the counter values.
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const Equation_base &eqn, const tabs_t &semi_impl={}) const
Classe de base des flux de sortie.
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const