TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Loi_Etat_base.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Fluide_Dilatable_base.h>
17#include <Schema_Temps_base.h>
18#include <Champ_Fonc_Tabule.h>
19#include <Champ_Uniforme.h>
20#include <Loi_Etat_base.h>
21#include <Probleme_base.h>
22#include <Domaine_VF.h>
23#include <Debog.h>
24#include <kokkos++.h>
25#include <TRUSTArray_kokkos.tpp>
26
27Implemente_base_sans_constructeur(Loi_Etat_base,"Loi_Etat_base",Objet_U);
28// XD loi_etat_base objet_u loi_etat_base INHERITS_BRACE Basic class for state laws used with a dilatable fluid.
29
31
33{
34 return os << que_suis_je() << finl;
35}
36
38{
39 return is;
40}
41
42/*! @brief Associe le fluide a la loi d'etat
43 *
44 * @param (Fluide_Dilatable_base& fl) le fluide associe
45 */
47{
48 le_fluide = fl;
49}
50
51/*! @brief Associe le probleme a la loi d'etat
52 *
53 * @param (Fluide_Dilatable_base& fl) le fluide associe
54 */
56{
57 le_prob_ = pb;
58}
60/*! @brief Renvoie le champ de le temperature
61 *
62 */
64{
65 return temperature_.valeur();
66}
67
69{
70 return temperature_.valeur();
71}
72
73/*! @brief Initialise l'inconnue de l'equation de chaleur : ne fai rien
74 *
75 */
77{
78 DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
79 tab_rho_n=tab_rho;
80 tab_rho_np1=tab_rho;
82 double t = le_prob_->schema_temps().temps_courant();
84 tab_rho.echange_espace_virtuel();
85 tab_rho_np1.echange_espace_virtuel();
86}
87
88/*! @brief Prepare le fluide au calcul.
89 *
90 */
92{
93 remplir_T();
95 double t = le_prob_->schema_temps().temps_courant();
97}
98
99/*! @brief Met a jour la loi d'etat et le champ rho
100 *
101 * @param (double temps) le temps de calcul
102 */
104{
105 //remplissage de rho avec rho(n+1)
106 DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
108 tab_rho = tab_rho_np1;
109 le_fluide->masse_volumique().mettre_a_jour(temps);
110}
111
112/*! @brief Calcule la viscosite
113 *
114 */
116{
117 Champ_Don_base& mu = le_fluide->viscosite_dynamique();
118 if (!sub_type(Champ_Uniforme,mu))
119 {
120 // E. Saikali : Pourquoi pas Champ_fonc_xyz pour mu ???
121 if (sub_type(Champ_Fonc_Tabule,mu) || sub_type(Champ_Don_base,mu))
122 mu.mettre_a_jour(temperature_->temps());
123 else
124 {
125 Cerr<<"The viscosity field mu of type "<<mu.que_suis_je()<<" is not recognized.";
127 }
128 }
129}
130
131/*! @brief Calcule la conductivite
132 *
133 */
135{
136 const Champ_Don_base& mu = le_fluide->viscosite_dynamique();
137 const DoubleTab& tab_Cp = le_fluide->capacite_calorifique().valeurs();
138 const DoubleTab& tab_mu = mu.valeurs();
139 Champ_Don_base& lambda = le_fluide->conductivite();
140 DoubleTab& tab_lambda = lambda.valeurs();
141 ToDo_Kokkos("critical");
142 int i, n = tab_lambda.size();
143 // La conductivite est soit un champ uniforme soit calculee a partir de la viscosite dynamique et du Pr
144 if (!sub_type(Champ_Uniforme,lambda))
145 {
146 if (sub_type(Champ_Uniforme,mu))
147 {
148 double mu0 = tab_mu(0,0);
149 for (i=0 ; i<n ; i++) tab_lambda(i,0) = mu0 * tab_Cp(i,0) / Pr_;
150 }
151 else
152 {
153 for (i=0 ; i<n ; i++) tab_lambda(i,0) = tab_mu(i,0) * tab_Cp(i,0) / Pr_;
154 }
155 }
156 tab_lambda.echange_espace_virtuel();
157}
158
159/*! @brief Calcule la viscosite cinematique
160 *
161 */
163{
164 const Champ_Don_base& viscosite_dynamique = le_fluide->viscosite_dynamique();
165 bool uniforme = sub_type(Champ_Uniforme,viscosite_dynamique);
166 const DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
167 const DoubleTab& tab_mu = viscosite_dynamique.valeurs();
168 Champ_Don_base& viscosite_cinematique = le_fluide->viscosite_cinematique();
169 DoubleTab& tab_nu = viscosite_cinematique.valeurs();
170 int n = tab_nu.size();
171
172 if (viscosite_cinematique.que_suis_je()=="Champ_Fonc_P0_VDF")
173 {
174 // VDF
175 for (int i=0 ; i<n ; i++)
176 tab_nu(i,0) = tab_mu(uniforme ? 0 : i,0) / tab_rho(i,0);
177 }
178 else // VEF
179 {
180 const IntTab& ef = ref_cast(Domaine_VF,le_fluide->vitesse().domaine_dis_base()).elem_faces();
181 int nfe = ef.line_size();
182 CIntTabView elem_faces = ef.view_ro();
183 CDoubleArrView rho = static_cast<const DoubleVect&>(tab_rho).view_ro();
184 CDoubleArrView mu = static_cast<const DoubleVect&>(tab_mu).view_ro();
185 DoubleArrView nu = static_cast<DoubleVect&>(tab_nu).view_rw();
186 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), n, KOKKOS_LAMBDA(const int i)
187 {
188 double rhoelem = 0;
189 for (int face = 0; face < nfe; face++)
190 rhoelem += rho(elem_faces(i, face));
191 rhoelem /= nfe;
192 nu(i) = mu(uniforme ? 0 : i) / rhoelem;
193 });
194 end_gpu_timer(__KERNEL_NAME__);
195 }
196 tab_nu.echange_espace_virtuel();
197 Debog::verifier("Loi_Etat_base::calculer_nu tab_nu",tab_nu);
198}
199
200/*! @brief Calcule la diffusivite
201 *
202 */
204{
205 DoubleTab& tab_alpha = le_fluide->diffusivite().valeurs();
206 const Champ_Don_base& conductivite = le_fluide->conductivite();
207 bool uniforme = sub_type(Champ_Uniforme,conductivite);
208 int n = tab_alpha.size();
209 CDoubleArrView lambda = static_cast<const DoubleVect&>(conductivite.valeurs()).view_ro();
210 CDoubleArrView Cp = static_cast<const DoubleVect&>(le_fluide->capacite_calorifique().valeurs()).view_ro();
211 CDoubleArrView rho = static_cast<const DoubleVect&>(le_fluide->masse_volumique().valeurs()).view_ro();
212 DoubleArrView alpha = static_cast<DoubleVect&>(tab_alpha).view_rw();
213 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), n, KOKKOS_LAMBDA(const int i)
214 {
215 alpha(i) = lambda(uniforme ? 0 : i) / (rho(i) * Cp(i));
216 });
217 end_gpu_timer(__KERNEL_NAME__);
218 tab_alpha.echange_espace_virtuel();
219 Debog::verifier("Loi_Etat_base::calculer_alpha alpha",tab_alpha);
220}
221
222
223/*! @brief Ne fait rien Surcharge dans Loi_Etat_Melange_GP
224 *
225 */
227{
228 /* Do nothing : overloaded later */
229}
230
231/*! @brief Ne fait rien Surcharge dans Loi_Etat_Melange_Binaire
232 *
233 */
235{
236 /* Do nothing : overloaded later */
237}
238
239/*! @brief Recalcule la masse volumique
240 *
241 */
243{
244 DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
245 compute_tab_rho(tab_rho); // May be overloaded for device
246 tab_rho.echange_espace_virtuel();
247 tab_rho_np1.echange_espace_virtuel();
248 le_fluide->calculer_rho_face(tab_rho_np1);
249}
250
251// Host version
252void Loi_Etat_base::compute_tab_rho(DoubleTab& tab_rho)
253{
254 int n=tab_rho.size();
255 double Pth = le_fluide->pression_th();
256 const DoubleTab& tab_ICh = le_fluide->inco_chaleur().valeurs();
257 ToDo_Kokkos("Implement a ::compute_tab_rho() on device");
258 for (int som = 0; som < n; som++)
259 {
260 tab_rho_np1(som) = calculer_masse_volumique(Pth, tab_ICh(som, 0));
261 tab_rho(som, 0) = 0.5 * (tab_rho_n(som) + tab_rho_np1(som));
262 }
263}
264/*! @brief Cas gaz parfait : ne fait rien Cas gaz Reel : doit recalculer l'enthalpie a partir de la pression et la temperature
265 *
266 */
267double Loi_Etat_base::calculer_H(double Pth_, double T_) const
268{
269 return T_;
270}
271
272double Loi_Etat_base::Drho_DP(double,double) const
273{
274 Cerr<<"Drho_DP doit etre code dans la classe fille "<<que_suis_je()<<" pour etre utilisee"<<finl;
275 abort();
276 return 0;
277}
278double Loi_Etat_base::Drho_DT(double,double) const
279{
280 Cerr<<"Drho_DT doit etre code dans la classe fille "<<que_suis_je()<<" pour etre utilisee"<<finl;
281 abort();
282 return 0;
283}
284double Loi_Etat_base::De_DP(double,double) const
285{
286 Cerr<<"De_DP doit etre code dans la classe fille "<<que_suis_je()<<" pour etre utilisee"<<finl;
287 abort();
288 return 0;
289}
290double Loi_Etat_base::De_DT(double,double) const
291{
292 Cerr<<"De_DT doit etre code dans la classe fille "<<que_suis_je()<<" pour etre utilisee"<<finl;
293 abort();
294 return 0;
295}
296
297bool Loi_Etat_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
298{
299 return champs_compris_.has_champ(nom, ref_champ);
300}
301bool Loi_Etat_base::has_champ(const Motcle& nom) const
302{
303 return champs_compris_.has_champ(nom);
304}
305
307{
308 return champs_compris_.get_champ(nom);
309}
310
312{
313 if (opt==DESCRIPTION)
314 Cerr<<"Loi_Etat_base : "<<champs_compris_.liste_noms_compris()<<finl;
315 else
316 nom.add(champs_compris_.liste_noms_compris());
317}
318
classe Champ_Don_base classe de base des Champs donnes (non calcules)
void mettre_a_jour(double temps) override
Mise a jour en temps.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
bool has_champ(const Motcle &nom, OBS_PTR(FIELD_TYPE)&ref_champ) const
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
class Domaine_VF
Definition Domaine_VF.h:44
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
classe Loi_Etat_base Cette classe est la base de la hierarchie des lois d'etat.
void assoscier_probleme(const Probleme_base &pb)
Associe le probleme a la loi d'etat.
virtual void initialiser_inco_ch()
Initialise l'inconnue de l'equation de chaleur : ne fai rien.
virtual double De_DP(double, double) const
DoubleTab tab_rho_np1
void mettre_a_jour(double)
Met a jour la loi d'etat et le champ rho.
const Champ_base & get_champ(const Motcle &nom) const override
virtual void abortTimeStep()
virtual double De_DT(double, double) const
DoubleTab tab_rho_n
Champ_Don_base & ch_temperature()
virtual void remplir_T()=0
virtual void compute_tab_rho(DoubleTab &)
virtual void associer_fluide(const Fluide_Dilatable_base &)
Associe le fluide a la loi d'etat.
virtual void calculer_masse_volumique()
Recalcule la masse volumique.
virtual double Drho_DT(double, double) const
virtual void preparer_calcul()
Prepare le fluide au calcul.
virtual void calculer_alpha()
Calcule la diffusivite.
virtual double calculer_H(double, double) const
Cas gaz parfait : ne fait rien Cas gaz Reel : doit recalculer l'enthalpie a partir de la pression et ...
virtual double Drho_DP(double, double) const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void calculer_lambda()
Calcule la conductivite.
virtual void calculer_mu()
Calcule la viscosite.
void calculer_nu()
Calcule la viscosite cinematique.
virtual void calculer_nu_sur_Sc()
Ne fait rien Surcharge dans Loi_Etat_Melange_Binaire.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void calculer_mu_sur_Sc()
Ne fait rien Surcharge dans Loi_Etat_Melange_GP.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
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
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")