16#include <Convection_Diffusion_Espece_Multi_QC.h>
17#include <Fluide_Quasi_Compressible.h>
18#include <Neumann_sortie_libre.h>
19#include <Loi_Etat_Multi_GP_QC.h>
20#include <Discretisation_base.h>
21#include <Navier_Stokes_QC.h>
22#include <Probleme_base.h>
27#include <Perf_counters.h>
54 Cerr <<
"Reading and typing of the diffusion operator : " << finl;
63 else if (mot==
"convection")
80 return le_fluide->mu_sur_Schmidt();
97 Conds_lim& condlims = zcl_modif_->les_conditions_limites();
98 int nb = condlims.size();
99 for (
int i = 0; i < nb; i++)
106 if (sub_type(
Dirichlet, condlims[i].valeur()))
109 EChaine toto(
" Champ_front_uniforme 1 1");
110 toto >> condlims[i].valeur();
111 condlims[i]->associer_fr_dis_base(frdis);
113 DoubleTab& T = condlims[i]->champ_front().valeurs();
131 solveur_masse->appliquer(derivee);
132 DoubleTrav derivee_bis(derivee);
140 for (
int i = 0; i < n; i++)
141 derivee_bis(i) = -derivee_bis(i) * frac_mass(i);
147 solveur_masse->set_name_of_coefficient_temporel(
"masse_volumique");
148 solveur_masse->appliquer(derivee_bis);
149 solveur_masse->set_name_of_coefficient_temporel(
"no_coeff");
150 derivee += derivee_bis;
157 const auto& tab1 = matrice.
get_tab1();
166 DoubleTrav divu1(inco);
173 for (
int i = 0; i < ndl; i++)
175 resu(i) -= divu1(i) * inco(i);
176 matrice(i, i) += divu1(i);
179 for (
int som = 0; som < ndl; som++)
181 double inv_rho = 1 / rho(som);
182 for (
auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
184 resu(som) *= inv_rho;
192 char *theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
193 if (theValue !=
nullptr)
199 DoubleTab test(resu);
200 DoubleTab test2(resu);
201 DoubleTrav resu2(resu);
203 solveur_masse->appliquer(test2);
205 Cerr <<
" here " << mp_max_abs_vect(resu2) << finl;
207 solveur_masse->appliquer(test);
208 const double max_test = mp_max_abs_vect(test);
209 Cerr <<
"iii " << max_test << finl;
214 for (
int i = 0; i < resu.
size(); i++)
215 if (std::fabs(test(i)) > 1e-5)
216 Cerr << i <<
" " << test(i) << finl;
225 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
228 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
240 for (
int som = 0; som < ndl; som++)
242 double inv_rho = 1 / rho(som);
243 for (
auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
245 secmem(som) *= inv_rho;
252 DoubleTrav divu1(inco);
255 for (
int i = 0; i < ndl; i++)
257 secmem(i) -= divu1(i) * inco(i);
259 (*mat)(i, i) += divu1(i);
261 statistics().end_count(STD_COUNTERS::ajouter_blocs);
263 statistics().begin_count(STD_COUNTERS::source_terms,statistics().get_last_opened_counter_level()+1);
264 for (
int i = 0; i <
sources().size(); i++)
265 sources()(i)->ajouter_blocs(matrices, secmem, semi_impl);
266 statistics().end_count(STD_COUNTERS::source_terms);
268 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
277 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 Conds_lim Cette classe represente un vecteur de conditions aux limites.
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
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Une entree dont la source est une chaine de caracteres.
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.
classe Fluide_Quasi_Compressible Cette classe represente un d'un fluide quasi compressible
classe Frontiere_dis_base Classe representant une frontiere discretisee.
classe Loi_Etat_Multi_GP_QC Cette classe represente la loi d'etat pour un melange de gaz parfaits.
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.
classe Navier_Stokes_QC Cette classe porte les termes de l'equation de la dynamique
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
const std::string & getString() const
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.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
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