TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Loi_Etat_GP_base.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 <Fluide_Dilatable_base.h>
17#include <Champ_Fonc_Tabule.h>
18#include <Loi_Etat_GP_base.h>
19#include <Champ_Uniforme.h>
20#include <Domaine_VF.h>
21#include <Motcle.h>
22
23Implemente_base_sans_constructeur(Loi_Etat_GP_base,"Loi_Etat_Gaz_Parfait_base",Loi_Etat_base);
24// XD loi_etat_gaz_parfait_base loi_etat_base loi_etat_gaz_parfait_base INHERITS_BRACE Basic class for perfect gases
25// XD_CONT state laws used with a dilatable fluid.
26
28
30{
31 os <<que_suis_je()<< finl;
32 return os;
33}
34
36{
37 return is;
38}
39
40/*! @brief Renvoie le type de fluide associe.
41 *
42 * @param (Sortie& os) le flot de sortie pour l'impression
43 * @return (Sortie&) le flot de sortie modifie
44 */
46{
47 return "Gaz_Parfait";
48}
49
50/*! @brief Associe le fluide a la loi d'etat
51 *
52 * @param (Fluide_Dilatable_base& fl) le fluide associe
53 */
59
60/*! @brief Initialise la loi d'etat : calcul Pth
61 *
62 */
64{
65 const DoubleTab& tab_Temp = le_fluide->inco_chaleur().valeurs();
66 const DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
67 int ntot=tab_Temp.size_totale();
68 tab_rho_n=tab_Temp;
69 for (int i=0 ; i<ntot ; i++)
70 tab_rho_n(i) = tab_rho(i,0);
71 remplir_T();
72}
73
74/*! @brief Remplit le tableau de la temperature : T=temp+273.
75 *
76 * 15
77 *
78 */
80{
81 const DoubleTab& tab_Temp = le_fluide->inco_chaleur().valeurs();
82 temperature_->valeurs() = tab_Temp;
83}
84
85/*! @brief Calcule le Cp NE FAIT RIEN : le Cp est constant
86 *
87 */
89{
90 /* Do nothing */
91}
92
93/*! @brief Calcule la conductivite
94 *
95 */
97{
98 const Champ_Don_base& mu = le_fluide->viscosite_dynamique();
99 const DoubleTab& tab_mu = mu.valeurs();
100 Champ_Don_base& lambda = le_fluide->conductivite();
101 DoubleTab& tab_lambda =lambda.valeurs();
102 //La conductivite est soit un champ uniforme soit calculee a partir de la viscosite dynamique et du Pr
103 if (sub_type(Champ_Fonc_Tabule,lambda))
104 {
105 lambda.mettre_a_jour(temperature_->temps());
106 return;
107 }
108
109
110
111 if (!sub_type(Champ_Uniforme,lambda))
112 {
113 if (sub_type(Champ_Uniforme,mu))
114 {
115 double mu0 = tab_mu(0,0);
116 tab_lambda *= (mu0 * Cp_ / Pr_);
117 }
118 else
119 {
120 tab_lambda = tab_mu;
121 tab_lambda *= Cp_ / Pr_;
122 }
123 }
124 else
125 {
126 if (sub_type(Champ_Uniforme,mu))
127 {
128 tab_lambda(0,0) = mu.valeurs()(0,0) * Cp_ / Pr_;
129 }
130 else
131 {
132 Cerr << finl ;
133 Cerr << "If lambda is of type Champ_Uniform, mu must also be of type Champ_Uniforme !"<< finl;
134 Cerr << "If needed, you can use a Champ_Fonc_Fonction or a Champ_Fonc_Tabule with a constant for mu."<< finl ;
135 Cerr << finl ;
137 }
138 }
139 tab_lambda.echange_espace_virtuel();
140}
141
142/*! @brief Calcule la diffusivite
143 *
144 */
146{
147 const Champ_Don_base& champ_lambda = le_fluide->conductivite();
148 const DoubleTab& tab_lambda = champ_lambda.valeurs();
149 Champ_Don_base& champ_alpha = le_fluide->diffusivite();
150 DoubleTab& tab_alpha = le_fluide->diffusivite().valeurs();
151 const DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
152
153 int isVDF=0;
154 if (champ_alpha.que_suis_je()=="Champ_Fonc_P0_VDF") isVDF = 1;
155 int n=tab_alpha.size();
156 bool lambda_uniforme = sub_type(Champ_Uniforme,champ_lambda);
157 if (isVDF)
158 {
159 ToDo_Kokkos("critical");
160 for (int i=0 ; i<n ; i++)
161 tab_alpha(i,0) = (lambda_uniforme ? tab_lambda(0,0) : tab_lambda(i,0)) / (tab_rho(i,0) * Cp_);
162 }
163 else
164 {
165 const IntTab& tab_elem_faces = ref_cast(Domaine_VF,le_fluide->vitesse().domaine_dis_base()).elem_faces();
166 int nfe = tab_elem_faces.line_size();
167 double Cp = Cp_;
168 CIntTabView elem_faces = tab_elem_faces.view_ro();
169 CDoubleTabView lambda = tab_lambda.view_ro();
170 CDoubleTabView rho = tab_rho.view_ro();
171 DoubleTabView alpha = tab_alpha.view_wo();
172 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), n, KOKKOS_LAMBDA(
173 const int i)
174 {
175 double rhoelem=0;
176 for (int face=0; face<nfe; face++) rhoelem += rho(elem_faces(i,face),0);
177 rhoelem /= nfe;
178 alpha(i,0) = (lambda_uniforme ? lambda(0,0) : lambda(i,0))/ ( rhoelem * Cp );
179 });
180 end_gpu_timer(__KERNEL_NAME__);
181 }
182 tab_alpha.echange_espace_virtuel();
183}
184
185/*! @brief Calcule la pression avec la temperature et la masse volumique
186 *
187 */
188double Loi_Etat_GP_base::inverser_Pth(double T, double rho)
189{
190 return rho * R_ * T;
191}
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.
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_GP_base Cette classe represente la loi d'etat base pour les gaz parfaits.
void initialiser() override
Initialise la loi d'etat : calcul Pth.
const Nom type_fluide() const override
Renvoie le type de fluide associe.
void calculer_lambda() override
Calcule la conductivite.
void remplir_T() override
Remplit le tableau de la temperature : T=temp+273.
void calculer_Cp() override
Calcule le Cp NE FAIT RIEN : le Cp est constant.
void associer_fluide(const Fluide_Dilatable_base &) override
Associe le fluide a la loi d'etat.
double inverser_Pth(double, double) override
Calcule la pression avec la temperature et la masse volumique.
void calculer_alpha() override
Calcule la diffusivite.
classe Loi_Etat_base Cette classe est la base de la hierarchie des lois d'etat.
DoubleTab tab_rho_n
virtual void associer_fluide(const Fluide_Dilatable_base &)
Associe le fluide a la loi d'etat.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
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
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 >, View< _TYPE_, _SHAPE_ > > view_wo()
Definition TRUSTTab.h:276
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
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")