TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Convection_Diffusion_Espece_Multi_QC.cpp
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
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>
23#include <Dirichlet.h>
24#include <TRUSTTrav.h>
25#include <EChaine.h>
26#include <Param.h>
27#include <Perf_counters.h>
28
29Implemente_instanciable(Convection_Diffusion_Espece_Multi_QC,"Convection_Diffusion_Espece_Multi_QC",Convection_Diffusion_Espece_Multi_base);
30// XD convection_diffusion_espece_multi_QC eqn_base convection_diffusion_espece_multi_QC INHERITS_BRACE Species
31// XD_CONT conservation equation for a multi-species quasi-compressible fluid.
32
34{
36}
37
39{
41}
42
44{
46 param.ajouter("espece",&mon_espece_); // XD_ADD_P espece
47 // XD_CONT Assosciate a species (with its properties) to the equation
48}
49
51{
52 if (mot=="diffusion")
53 {
54 Cerr << "Reading and typing of the diffusion operator : " << finl;
55 //associe mu_sur_Sc dans la diffusivite
56 terme_diffusif.associer_diffusivite(diffusivite_pour_transport());
57 ref_cast_non_const(Champ_base,terme_diffusif.diffusivite()).nommer("mu_sur_Schmidt");
58 is >> terme_diffusif;
59 // Il faut appeler associer_diffusivite_pour_pas_de_temps
60 terme_diffusif.associer_diffusivite_pour_pas_de_temps(diffusivite_pour_pas_de_temps());
61 return 1;
62 }
63 else if (mot=="convection")
64 {
65 const Probleme_base& pb = probleme();
66 const Champ_Inc_base& vit_transportante = ref_cast(Navier_Stokes_QC,pb.equation(0)).rho_la_vitesse();
67 associer_vitesse(vit_transportante);
68 terme_convectif.associer_vitesse(vit_transportante);
69 is >> terme_convectif;
70 terme_convectif.associer_vitesse(vit_transportante);
71 return 1;
72 }
73 else
75}
76
78{
79 // TODO : FIXME : on passe actuellement en parametre mu_sur_Schmidt qu il faut remplacer par nu_sur_Schmidt
80 return le_fluide->mu_sur_Schmidt();
81}
82
83/*! @brief Associe l inconnue de l equation a la loi d etat,
84 *
85 */
87{
90 Loi_Etat_Multi_GP_QC& loi_etat = ref_cast_non_const(Loi_Etat_Multi_GP_QC, le_fluideQC.loi_etat().valeur());
91 loi_etat.associer_inconnue(l_inco_ch.valeur());
92 loi_etat.associer_espece(*this);
93
94 // remplissage du domaine cl modifiee avec 1 partout au bord...
95 zcl_modif_ = domaine_Cl_dis();
96
97 Conds_lim& condlims = zcl_modif_->les_conditions_limites();
98 int nb = condlims.size();
99 for (int i = 0; i < nb; i++)
100 {
101 // pour chaque condlim on recupere le champ_front et on met 1 meme si la cond lim est un flux (dans ce cas la convection restera nulle.)
102 if (sub_type(Neumann_sortie_libre, condlims[i].valeur()))
103 {
104 ref_cast(Neumann_sortie_libre,condlims[i].valeur()).tab_ext() = 1;
105 }
106 if (sub_type(Dirichlet, condlims[i].valeur()))
107 {
108 const Frontiere_dis_base& frdis = condlims[i]->frontiere_dis();
109 EChaine toto(" Champ_front_uniforme 1 1");
110 toto >> condlims[i].valeur();
111 condlims[i]->associer_fr_dis_base(frdis);
112 }
113 DoubleTab& T = condlims[i]->champ_front().valeurs();
114 T = 1.;
115 }
116}
117
118/*! @brief Renvoie la derivee en temps de l'inconnue de l'equation.
119 *
120 * Le calcul est le suivant:
121 * d(inconnue)/dt = M^{-1} * (sources - somme(Op_{i}(inconnue))) / rho
122 *
123 * @param (DoubleTab& derivee) le tableau des valeurs de la derivee en temps du champ inconnu
124 * @return (DoubleTab&) le tableau des valeurs de la derivee en temps du champ inconnu
125 */
127{
128 derivee = 0;
129
130 les_sources.ajouter(derivee);
131 solveur_masse->appliquer(derivee);
132 DoubleTrav derivee_bis(derivee);
133
134 // on commence par retirer phi*div(1 U)
135 const DoubleTab& frac_mass = inconnue().valeurs();
136
138
139 int n = frac_mass.dimension_tot(0);
140 for (int i = 0; i < n; i++)
141 derivee_bis(i) = -derivee_bis(i) * frac_mass(i);
142
143 // suite + standard
144 operateur(1).ajouter(derivee_bis);
145 operateur(0).ajouter(derivee_bis);
146
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;
151 return derivee;
152}
153
154void Convection_Diffusion_Espece_Multi_QC::assembler(Matrice_Morse& matrice, const DoubleTab& inco, DoubleTab& resu)
155{
156 resu = 0;
157 const auto& tab1 = matrice.get_tab1();
158 auto& coeff = matrice.get_set_coeff();
159
160 const DoubleTab& rho = get_champ("masse_volumique").valeurs();
161 operateur(0).l_op_base().contribuer_a_avec(inco, matrice);
162 operateur(0).ajouter(resu);
163 int ndl = rho.dimension(0);
164
165 // on retire Divu1 *inco
166 DoubleTrav divu1(inco);
168
169 // ajout de la convection
170 operateur(1).l_op_base().contribuer_a_avec(inco, matrice);
171 operateur(1).ajouter(resu);
172
173 for (int i = 0; i < ndl; i++)
174 {
175 resu(i) -= divu1(i) * inco(i);
176 matrice(i, i) += divu1(i);
177 }
178 // on divise par rho chaque ligne
179 for (int som = 0; som < ndl; som++)
180 {
181 double inv_rho = 1 / rho(som);
182 for (auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
183 coeff(k) *= inv_rho;
184 resu(som) *= inv_rho;
185 }
186
187 les_sources.contribuer_a_avec(inco, matrice);
188 les_sources.ajouter(resu);
189
190 int test_op = 0;
191 {
192 char *theValue = getenv("TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
193 if (theValue != nullptr)
194 test_op = 1;
195 }
196
197 if (test_op)
198 {
199 DoubleTab test(resu);
200 DoubleTab test2(resu);
201 DoubleTrav resu2(resu);
203 solveur_masse->appliquer(test2);
204 resu2 -= test2;
205 Cerr << " here " << mp_max_abs_vect(resu2) << finl;
206 matrice.ajouter_multvect(inco, test);
207 solveur_masse->appliquer(test);
208 const double max_test = mp_max_abs_vect(test);
209 Cerr << "iii " << max_test << finl;
210
211 if (max_test > 0)
212 {
213
214 for (int i = 0; i < resu.size(); i++)
215 if (std::fabs(test(i)) > 1e-5)
216 Cerr << i << " " << test(i) << finl;
218 }
219 }
220 matrice.ajouter_multvect(inco, resu);
221}
222
223void Convection_Diffusion_Espece_Multi_QC::assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl)
224{
225 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
226 const std::string& nom_inco = inconnue().le_nom().getString();
227 const DoubleTab& inco = inconnue().valeurs();
228 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) : nullptr;
229
230 secmem = 0;
231 const auto& tab1 = mat->get_tab1();
232
233 auto& coeff = mat->get_set_coeff();
234
235 const DoubleTab& rho = get_champ("masse_volumique").valeurs();
236 operateur(0).l_op_base().ajouter_blocs(matrices, secmem, semi_impl);
237
238 int ndl = rho.dimension(0);
239 // on divise par rho chaque ligne
240 for (int som = 0; som < ndl; som++)
241 {
242 double inv_rho = 1 / rho(som);
243 for (auto k = tab1(som) - 1; k < tab1(som + 1) - 1; k++)
244 coeff(k) *= inv_rho;
245 secmem(som) *= inv_rho;
246 }
247
248 // ajout de la convection
249 operateur(1).l_op_base().ajouter_blocs(matrices, secmem, semi_impl);
250
251 // on retire Divu1 *inco
252 DoubleTrav divu1(inco);
254
255 for (int i = 0; i < ndl; i++)
256 {
257 secmem(i) -= divu1(i) * inco(i);
258 if (mat)
259 (*mat)(i, i) += divu1(i);
260 }
261 statistics().end_count(STD_COUNTERS::ajouter_blocs);
262
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);
267
268 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
269 if (mat)
270 mat->ajouter_multvect(inco, secmem);
271
272 schema_temps().ajouter_blocs(matrices, secmem, *this);
273
274 if (!discretisation().is_poly_family())
275 modifier_pour_Cl(*mat, secmem);
276
277 statistics().end_count(STD_COUNTERS::ajouter_blocs);
278}
Classe Champ_Inc_base.
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.
Definition Champ_base.h:43
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
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 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 calculer_div_rho_u_impl(DoubleTab &res, const Convection_Diffusion_Fluide_Dilatable_base &eqn) const
void associer_vitesse(const Champ_base &)
Associe la vitesse transportante a l'equation.
const Operateur & operateur(int) const override
Renvoie l'operateur specifie par son index: renvoie terme_diffusif si i = 0.
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
Une entree dont la source est une chaine de caracteres.
Definition EChaine.h:31
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
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.
Sources les_sources
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
auto & get_set_coeff()
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
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
Definition Nom.h:92
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
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.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
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.
Definition Process.cpp:455
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.
Definition Sortie.h:52
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45