TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Conduction.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 <Frontiere_dis_base.h>
17#include <Discret_Thermique.h>
18#include <Probleme_base.h>
19#include <Conduction.h>
20#include <Solide.h>
21#include <Param.h>
22
23Implemente_instanciable(Conduction,"Conduction",Equation_base);
24// XD Conduction eqn_base Conduction INHERITS_BRACE Heat equation.
25
27{
28 return s << que_suis_je() << finl;
29}
30
32{
34 terme_diffusif.set_fichier("Diffusion_chaleur");
35 terme_diffusif.set_description((Nom)"Conduction heat transfer rate=Integral(lambda*grad(T)*ndS) [W] if SI units used");
36 return is;
37}
38
39void Conduction::set_param(Param& param) const
40{
42 param.ajouter_non_std("diffusion",(this));
43 param.ajouter_condition("is_read_diffusion","The diffusion operator must be read, select negligeable type if you want to neglect it.");
44 param.ajouter_non_std("Traitement_particulier",(this));
45}
46
47// Modification par rapport a Conduction::lire_motcle_non_standard()!
49{
50 //Motcle motlu;
51 if (mot=="diffusion")
52 {
53 Cerr << "Reading and typing of the diffusion operator : " << finl;
54
55 terme_diffusif.associer_diffusivite(diffusivite_pour_transport());
56 is >> terme_diffusif;
57 // le champ pour le dt_stab est le meme que celui de l'operateur. On prend toujours la diffusivite()
58 // comme dans le cas de Conduction
59 terme_diffusif.associer_diffusivite_pour_pas_de_temps(milieu().diffusivite());
60 solveur_masse->set_name_of_coefficient_temporel("rho_cp_comme_T");
61
62 return 1;
63 }
64 else if (mot=="Traitement_particulier")
65 {
66 Cerr << "Reading and typing of the Traitement_particulier object : " << finl;
67 Nom type="Traitement_particulier_";
68 Motcle motbidon;
69 is >> motbidon;
70 if (motbidon == "{")
71 {
72 Motcle le_cas;
73 is >> le_cas;
74 if (le_cas == "}")
75 le_cas ="";
76 else
77 {
78 type+= le_cas;
79 type+= "_";
80 }
82 if (discr == "VEFPreP1B")
83 discr = "VEF";
84 type+=discr;
85 Cerr << type << finl;
86 le_traitement_particulier.typer(type);
87 le_traitement_particulier->associer_eqn(*this);
88 le_traitement_particulier->lire(is);
89 le_traitement_particulier->preparer_calcul_particulier();
90 return 1;
91 }
92 else
93 {
94 Cerr << "Error while reading Traitement_particulier" << finl;
95 Cerr << "A { is expected." << finl;
96 exit();
97 return -1;
98 }
99 }
100 else
102}
103
104// retourne la *conductivite* et non la diffusivite comme dans Conduction
109
111{
112 return terme_diffusif.diffusivite();
113}
114
115/*! @brief Associe un milieu physique a l'equation, le milieu est en fait caste en Solide.
116 *
117 * @param (Milieu_base& un_milieu)
118 */
120{
121 associer_solide(ref_cast(Solide,le_milieu));
122}
123
124/*! @brief Associe le milieu solide a l'equation.
125 *
126 * @param (Solide& un_solide) le milieu solide a associer a l'equation
127 */
129{
130 le_solide = un_solide;
131}
132
133/*! @brief Renvoie le nombre d'operateurs de l'equation pour l'equation de conduction standart renvoie toujours 1.
134 *
135 * @return (int) le nombre d'operateurs de l'equation
136 */
138{
139 return 1;
140}
141
142/*! @brief Renvoie l'operateur d'index specifie de l'equation.
143 *
144 * Renvoie terme_diffusif si i=0
145 * exit si i>0
146 * (version const)
147 *
148 * @param (int i) index de l'operateur a renvoyer
149 * @return (Operateur&) l'operateur d'index specifie (uniquement terme_diffusif)
150 * @throws l'equation de conduction standard ne contient
151 * qu'un operateur
152 */
154{
155 if (i == 0)
156 return terme_diffusif;
157 else
158 {
159 Cerr << "Conduction::operateur("<<i<<") !! " << finl;
160 Cerr << "Equation Conduction has only one operator." << finl;
161 exit();
162 }
163 // Pour les compilos!!
164 return terme_diffusif;
165}
166
167/*! @brief Renvoie l'operateur d'index specifie de l'equation.
168 *
169 * Renvoie terme_diffusif si i=0
170 * exit si i>0
171 *
172 * @param (int i) index de l'operateur a renvoyer
173 * @return (Operateur&) l'operateur d'index specifie (uniquement terme_diffusif)
174 * @throws l'equation de conduction standard ne contient
175 * qu'un operateur
176 */
178{
179 if (i == 0)
180 return terme_diffusif;
181 else
182 {
183 Cerr << "Conduction::operateur("<<i<<") !! " << finl;
184 Cerr << "Equation Conduction has only one operator." << finl;
185 exit();
186 }
187 // Pour les compilos!!
188 return terme_diffusif;
189}
190
191/*! @brief Discretise l'equation
192 *
193 */
195{
196 const Discret_Thermique& dis=ref_cast(Discret_Thermique, discretisation());
197 Cerr << "Conduction equation discretization" << finl;
198 dis.temperature(schema_temps(), domaine_dis(), la_temperature);
199 champs_compris_.ajoute_champ(la_temperature);
201}
202
203
204/*! @brief Renvoie le milieu physique associe a l'equation.
205 *
206 * Ici Solide upcaste en Milieu_base.
207 * (version const)
208 *
209 * @return (Milieu_base&) le milieu physique associe a l'equation (Solide upcaste en Milieu_base)
210 */
212{
213 return solide();
214}
215
216/*! @brief Renvoie le milieu physique associe a l'equation.
217 *
218 * Ici Solide upcaste en Milieu_base.
219 *
220 * @return (Milieu_base&) le milieu physique associe a l'equation (Solide upcaste en Milieu_base)
221 */
223{
224 return solide();
225}
226
227/*! @brief Renvoie le milieu solide associe a l'equation.
228 *
229 * (version const)
230 *
231 * @return (Solide&) le milieu solide associe a l'equation
232 * @throws pas de milieu solide associe a l'equation
233 */
235{
236 if(!le_solide)
237 {
238 Cerr << "You forgot to associate the solid to the problem named " << probleme().le_nom() << finl;
240 }
241 return le_solide.valeur();
242}
243
245{
246 if (motlu == "temperature_paroi" || motlu == "wall_temperature")
247 {
248 if (!temperature_paroi_)
249 {
250 const Discret_Thermique& dis = ref_cast(Discret_Thermique, discretisation());
251 dis.t_paroi(domaine_dis(), domaine_Cl_dis(), la_temperature, temperature_paroi_);
252 champs_compris_.ajoute_champ(temperature_paroi_);
253 }
254 }
255
257}
258
259bool Conduction::has_champ(const Motcle& nom, OBS_PTR(Champ_base) &ref_champ) const
260{
261 if (nom == "temperature_paroi" || nom == "wall_temperature")
262 {
263 ref_champ = Conduction::get_champ(nom);
264 return true;
265 }
266
267 if (Equation_base::has_champ(nom, ref_champ))
268 return true;
269
270 if (le_traitement_particulier)
271 if (le_traitement_particulier->has_champ(nom, ref_champ))
272 return true;
273
274 return false; /* rien trouve */
275}
276
277bool Conduction::has_champ(const Motcle& nom) const
278{
279 if (nom == "temperature_paroi" || nom == "wall_temperature")
280 return true;
281
283 return true;
284
285 if (le_traitement_particulier)
286 if (le_traitement_particulier->has_champ(nom))
287 return true;
288
289 return false; /* rien trouve */
290}
291
293{
294 OBS_PTR(Champ_base) ref_champ;
295
296 if (nom == "temperature_paroi" || nom == "wall_temperature")
297 {
298 double temps_init = schema_temps().temps_init();
299 Champ_Fonc_base& ch_tp = ref_cast_non_const(Champ_Fonc_base, temperature_paroi_.valeur());
300 if (((ch_tp.temps() != la_temperature->temps()) || (ch_tp.temps() == temps_init)) && ((la_temperature->mon_equation_non_nul())))
301 ch_tp.mettre_a_jour(la_temperature->temps());
302 return champs_compris_.get_champ(nom);
303 }
304
305 if (Equation_base::has_champ(nom, ref_champ))
306 return ref_champ;
307
308 if (le_traitement_particulier)
309 if (le_traitement_particulier->has_champ(nom, ref_champ))
310 return ref_champ;
311
312 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
313}
314
316{
318
319 Noms noms_compris = champs_compris_.liste_noms_compris();
320 noms_compris.add("TEMPERATURE_PAROI");
321 noms_compris.add("WALL_TEMPERATURE");
322
323 if (opt == DESCRIPTION)
324 Cerr << "Conduction : " << noms_compris << finl;
325 else
326 nom.add(noms_compris);
327
328 if (le_traitement_particulier)
329 le_traitement_particulier->get_noms_champs_postraitables(nom, opt);
330}
331
332/*! @brief Renvoie le milieu solide associe a l'equation.
333 *
334 * @return (Solide&) le milieu solide associe a l'equation
335 * @throws pas de milieu solide associe a l'equation
336 */
338{
339 if(!le_solide)
340 {
341 Cerr << "A solide medium has not been associated to a Conduction equation"<<finl;
342 exit();
343 }
344 return le_solide.valeur();
345}
346
347/*! @brief Imprime le terme diffusif sur un flot de sortie.
348 *
349 * @param (Sortie& os) un flot de sortie
350 * @return (int) renvoie toujours 1
351 */
353{
354 return Equation_base::impr(os);
355}
356
357/*! @brief Renvoie le nom du domaine d'application de l'equation.
358 *
359 * Ici "Thermique".
360 *
361 * @return (Motcle&) le nom du domaine d'application de l'equation
362 */
364{
365 static Motcle domaine = "Thermique";
366 return domaine;
367}
368
370{
372
373 if (le_traitement_particulier)
374 le_traitement_particulier->post_traitement_particulier();
375}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
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 Conduction Cette classe represente l'equation d'evolution.
Definition Conduction.h:41
int nombre_d_operateurs() const override
Renvoie le nombre d'operateurs de l'equation pour l'equation de conduction standart renvoie toujours ...
void set_param(Param &) const override
void mettre_a_jour(double temps) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
void creer_champ(const Motcle &motlu) override
const Solide & solide() const
Renvoie le milieu solide associe a l'equation.
void associer_solide(const Solide &)
Associe le milieu solide 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.
virtual const Champ_Don_base & diffusivite_pour_transport() const
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void associer_milieu_base(const Milieu_base &) override
Associe un milieu physique a l'equation, le milieu est en fait caste en Solide.
int impr(Sortie &os) const override
Imprime le terme diffusif sur un flot de sortie.
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
const Champ_base & get_champ(const Motcle &nom) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application de l'equation.
const Operateur & operateur(int) const override
Renvoie l'operateur d'index specifie de l'equation.
void discretiser() override
Discretise l'equation.
const Milieu_base & milieu() const override
Renvoie le milieu physique associe a l'equation.
Class Discret_Thermique Cette classe est la classe de base representant une discretisation.
void temperature(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
virtual void t_paroi(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&ch) const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual void set_param(Param &titi) const override
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual int impr(Sortie &os) const
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
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.
void creer_champ(const Motcle &motlu) override
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.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
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
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
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 Operateur Classe generique de la hierarchie des operateurs.
Definition Operateur.h:39
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
Definition Param.cpp:496
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
double temps_init() const
Renvoie le temps initial.
Classe Solide Cette classe represente un milieu solide et ses proprietes.
Definition Solide.h:26
Classe de base des flux de sortie.
Definition Sortie.h:52