TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Convection_Diffusion_Chaleur_Fluide_Dilatable_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 <Convection_Diffusion_Chaleur_Fluide_Dilatable_base.h>
17#include <EcritureLectureSpecial.h>
18#include <Fluide_Dilatable_base.h>
19#include <Neumann_sortie_libre.h>
20#include <Navier_Stokes_std.h>
21#include <Probleme_base.h>
22#include <Discret_Thyd.h>
23#include <TRUST_2_PDI.h>
24#include <Domaine.h>
25#include <Avanc.h>
26
27Implemente_base(Convection_Diffusion_Chaleur_Fluide_Dilatable_base,"Convection_Diffusion_Chaleur_Fluide_Dilatable_base",Convection_Diffusion_Fluide_Dilatable_base);
28
30{
32}
33
35{
37 terme_convectif.set_fichier("Convection_chaleur");
38 terme_convectif.set_description((Nom)"Convective heat transfer rate=Integral(-rho*cp*T*u*ndS) [W] if SI units used");
39 terme_diffusif.set_fichier("Diffusion_chaleur");
40 terme_diffusif.set_description((Nom)"Conduction heat transfer rate=Integral(lambda*grad(T)*ndS) [W] if SI units used");
41 //On modifie le nom ici pour que le champ puisse etre reconnu si une sonde d enthalpie est demandee
42 if (le_fluide->type_fluide()=="Gaz_Reel") l_inco_ch->nommer("enthalpie");
43 return is;
44}
45
50
52{
53 const Probleme_base& pb = probleme();
54 const Navier_Stokes_std& eqn_hydr = ref_cast(Navier_Stokes_std,pb.equation(0));
55 const Champ_Inc_base& vitessetransportante = eqn_hydr.rho_la_vitesse(); // rho * u
56 return vitessetransportante;
57}
58
60{
61 const Discret_Thyd& dis=ref_cast(Discret_Thyd, discretisation());
62 Cerr << "Energy equation discretization " << finl;
63 dis.temperature(schema_temps(), domaine_dis(), l_inco_ch);
64 if (le_fluide->type_fluide()=="Gaz_Reel") l_inco_ch->add_synonymous("enthalpie");
65 champs_compris_.ajoute_champ(l_inco_ch);
67 Cerr << "Convection_Diffusion_Chaleur_Fluide_Dilatable_base::discretiser() ok" << finl;
68}
69
71{
72 derivee=0;
73 return derivee_en_temps_inco_sans_solveur_masse_impl(*this,derivee,true /* explicit */);
74}
75
76void Convection_Diffusion_Chaleur_Fluide_Dilatable_base::assembler( Matrice_Morse& matrice,const DoubleTab& inco, DoubleTab& resu)
77{
79}
80
81void Convection_Diffusion_Chaleur_Fluide_Dilatable_base::assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl)
82{
83 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
84 Convection_Diffusion_Fluide_Dilatable_Proto::assembler_blocs(*this,matrices, secmem, semi_impl);
85 schema_temps().ajouter_blocs(matrices, secmem, *this);
86 if (!discretisation().is_poly_family())
87 {
88 const std::string& nom_inco = inconnue().le_nom().getString();
89 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) : nullptr;
90 modifier_pour_Cl(*mat,secmem);
91 }
92 statistics().end_count(STD_COUNTERS::ajouter_blocs);
93}
94
95/*! @brief for PDI IO: retrieve name and type and dimensions of the thermo pressure
96 *
97 */
99{
100 std::vector<YAML_data> data = Equation_base::data_a_sauvegarder();
101 Nom pth("pression_thermo");
102 pth += probleme().domaine().le_nom();
103 YAML_data d(pth.getString(), "double");
104 d.set_local(false /*same value for everyone*/);
105 data.push_back(d);
106 return data;
107}
108
110{
111 int bytes=0;
112 bytes += Equation_base::sauvegarder(os);
113 // en mode ecriture special seul le maitre ecrit
114 int a_faire,special;
116
117 Nom ident_Pth("pression_thermo");
118 ident_Pth += probleme().domaine().le_nom();
119 if (a_faire)
120 {
121 double temps = inconnue().temps();
122 ident_Pth += Nom(temps,"%e");
123 os << ident_Pth<<finl;
124 os << "constante"<<finl;
125 os << le_fluide->pression_th();
126 os << flush ;
127 Cerr << "Saving thermodynamic pressure at time : " << Nom(temps,"%e") << finl;
128 }
130 {
131 bytes += 8;
132 TRUST_2_PDI pdi_interface;
133 pdi_interface.TRUST_start_sharing(ident_Pth.getString(), &le_fluide->get_pression_th());
134 }
135 return bytes;
136}
137
138/*! @brief Effectue une reprise a partir d'un flot d'entree.
139 *
140 * Appelle Equation_base::reprendre()
141 * et reprend l'inconnue de la chaleur et la pression thermodynamique
142 *
143 * @param (Entree& is) un flot d'entree
144 * @return (int) renvoie toujours 1
145 * @throws la reprise a echoue, identificateur de la pression non trouve
146 */
148{
149 if (le_fluide->type_fluide() != "Gaz_Parfait") l_inco_ch->nommer("enthalpie");
151 Nom ident_Pth("pression_thermo");
152 ident_Pth += probleme().domaine().le_nom();
153 double pth;
155 {
156 TRUST_2_PDI pdi_interface;
157 pdi_interface.read(ident_Pth.getString(), &pth);
158 }
159 else
160 {
161 double temps = schema_temps().temps_courant();
162 ident_Pth += Nom(temps,probleme().reprise_format_temps());
163 if (probleme().discretisation().is_poly_family())
164 {
165 Nom field_tag_syno = create_polymacfamily_syno(ident_Pth);
166 avancer_fichier_with_syno(is,ident_Pth,field_tag_syno);
167 }
168 // end of the backward compatibility
169 else
170 avancer_fichier(is, ident_Pth);
171 is>>pth;
172 }
173 le_fluide->set_pression_th(pth);
174 return 1;
175}
176
182
183/*! @brief remplissage du domaine cl modifiee avec 1 partout au bord.
184 *
185 * ..
186 *
187 */
189{
190 zcl_modif_= domaine_Cl_dis();
191 Conds_lim& condlims=zcl_modif_->les_conditions_limites();
192 int nb=condlims.size();
193 // pour chaque condlim on recupere le champ_front et on met 1
194 // meme si la cond lim est un flux (dans ce cas la convection restera nullle.)
195 for (int i=0; i<nb; i++)
196 {
197 DoubleTab& T=condlims[i]->champ_front().valeurs();
198 T=1.;
199 if (sub_type(Neumann_sortie_libre,condlims[i].valeur()))
200 ref_cast(Neumann_sortie_libre,condlims[i].valeur()).tab_ext()=1;
201 }
202 zcl_modif_->les_conditions_limites().set_modifier_val_imp(0);
203 return 1;
204}
205
206/*! @brief Renvoie le nom du domaine d'application de l'equation.
207 *
208 * Ici "Thermique".
209 *
210 * @return (Motcle&) le nom du domaine d'application de l'equation
211 */
213{
214 static Motcle domaine = "Thermique_H";
215 if (le_fluide->type_fluide()=="Gaz_Parfait") domaine = "Thermique";
216 return domaine;
217}
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
double temps() const
Renvoie le temps du champ.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
void set_modifier_val_imp(int)
Positionnement du drapeau modifier_val_imp de toutes les conditions aux limites du vecteur.
Definition Conds_lim.h:107
classe Convection_Diffusion_Chaleur_Fluide_Dilatable_base Cas particulier de Convection_Diffusion_std...
int reprendre(Entree &) override
Effectue une reprise a partir d'un flot d'entree.
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &resu) override
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name and type and dimensions of the thermo pressure
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
int sauvegarder(Sortie &) const override
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application de l'equation.
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) override
int remplir_cl_modifiee()
remplissage du domaine cl modifiee avec 1 partout au bord.
DoubleTab & derivee_en_temps_inco_sans_solveur_masse_impl(Convection_Diffusion_Fluide_Dilatable_base &eqn, DoubleTab &derivee, const bool is_expl)
Renvoie la derivee en temps de l'inconnue de l'equation.
public_for_cuda void assembler_impl(Convection_Diffusion_Fluide_Dilatable_base &eqn, Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
void assembler_blocs(Convection_Diffusion_Fluide_Dilatable_base &eqn, matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl)
classe Convection_Diffusion_Fluide_Dilatable_base pour un fluide dilatable
void temperature(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the data to save/restore. This has to be overrode f...
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
Nom create_polymacfamily_syno(const Nom &field_tag) const
Create a synonym of a field name in order to ensure backward compatibility with old names of the Poly...
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
virtual void modifier_pour_Cl(Matrice_Morse &mat_morse, DoubleTab &secmem) const
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
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.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void discretiser()
Discretise l'equation.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
virtual const Champ_Don_base & diffusivite() const
Renvoie la diffusivite du milieu.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
virtual const Champ_Inc_base & rho_la_vitesse() const
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
virtual void nommer(const Nom &)
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
Definition Objet_U.cpp:329
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.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
virtual const Equation_base & equation(int) const =0
double temps_courant() const
Renvoie le temps courant.
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
classe TRUST_2_PDI Encapsulation of PDI methods (library used for IO operations). See the website pdi...
Definition TRUST_2_PDI.h:59
void read(const std::string &name, void *data)
static int is_PDI_checkpoint()
static int is_PDI_restart()
void TRUST_start_sharing(const std::string &name, const void *data)
classe YAML_data : collection of all needed information for data to save/restore in order to write th...
Definition YAML_data.h:26
void set_local(bool l)
Definition YAML_data.h:35