TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Pb_rayo_semi_transp.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 <Source_rayo_semi_transp_base.h>
17#include <Cond_lim_rayo_semi_transp.h>
18#include <Pb_rayo_semi_transp.h>
19#include <Discretisation_base.h>
20#include <Flux_radiatif_base.h>
21#include <Schema_Temps_base.h>
22#include <Champ_Uniforme.h>
23#include <Fluide_base.h>
24#include <Symetrie.h>
25#include <Domaine.h>
26
27Implemente_instanciable(Pb_rayo_semi_transp, "Pb_rayo_semi_transp", Probleme_base);
28
30
31Sortie& Pb_rayo_semi_transp::printOn(Sortie& os) const { return os; }
32
34{
35 return eq_rayo().initTimeStep(dt);
36}
37
39{
40 converged = true;
41 return eq_rayo().resoudre();
42}
43
45{
46 double temps = pb_fluide_->presentTime();
47 eq_rayo().mettre_a_jour(temps);
49 les_postraitements_.mettre_a_jour(temps);
50 statistics().begin_count(STD_COUNTERS::update_variables, statistics().get_last_opened_counter_level() + 1);
52 statistics().end_count(STD_COUNTERS::update_variables);
53}
54
56{
57 le_schema_en_temps_ = un_schema_en_temps;
58 le_schema_en_temps_->associer_pb(*this);
59}
60
62{
63 for (int i=0; i<nombre_d_equations(); i++)
65}
66
68{
69 // Association du fluide + diverses operations
70 if (sub_type(Fluide_base, pb_fluide_->milieu()))
71 {
72 Fluide_base& fluide = ref_cast(Fluide_base, pb_fluide_->milieu());
73 eq_rayo_.associer_fluide(fluide);
74
75 if (fluide.is_rayo_semi_transp())
76 {
77 Champ_Don_base& coeff_abs = fluide.kappa();
78
79 if (sub_type(Champ_Uniforme, coeff_abs))
80 {
81 // Typage du OWN_PTR(Champ_Don_base) longueur_rayo_ comme un champ_uniforme
82 fluide.typer_longeur_rayo("Champ_Uniforme");
83 Champ_Don_base& l_rayo = fluide.longueur_rayo();
84 Champ_Uniforme& ch_l_rayo = ref_cast(Champ_Uniforme, l_rayo);
85 ch_l_rayo.nommer("longueur_de_rayonnement");
86 ch_l_rayo.fixer_nb_comp(1);
87 // Le nombre de valeurs nodales est fixe a 1 ici car il s'agit d'un
88 // Champ_Uniforme, dans les autres cas, il faut le fixer egale au nombre d'elements ou de faces en fonctions de la localisation du champ
89 ch_l_rayo.fixer_nb_valeurs_nodales(1);
90 ch_l_rayo.fixer_unite("m");
91 ch_l_rayo.changer_temps(0);
92 }
93 else
94 {
95 Cerr << "Le coefficient d'absorption n'est pas un OWN_PTR(Champ_base) Uniforme mais un " << coeff_abs.que_suis_je() << ". modifier la methode " << finl;
96 Cerr << "Pb_Couple_rayo_semi_transp::discretiser pour pouvoir prendre en compte ce type de Champ_Don" << finl;
97 }
98 fluide.initialiser(pb_fluide_->schema_temps().temps_courant());
99 }
100 else
101 {
102 Cerr << "Erreur 0 dans Pb_Couple_rayo_semi_transp::discretiser vous n'avez probablement pas renseigne tous les" << finl;
103 Cerr << "parametres physique de votre fluide incompressible pour pouvoir traiter un probleme de rayonnement semi transparent" << finl;
105 }
106 }
107 else
108 {
109 Cerr << "Erreur dans Pb_rayo_semi_transp::readOn Le probleme de rayonnement semi transparent ne peut etre utilise" << finl;
110 Cerr << "qu'avec un Fluide_base et non " << pb_fluide_->milieu().que_suis_je() << finl;
112 }
113}
114
116{
117 int contient_source_rayo_semi_transp = 0;
118
119 for (int j = 0; j < pb_fluide_->nombre_d_equations(); j++)
120 {
121
122 // Associer le pb au CL rayonnantes.
123 Domaine_Cl_dis_base& la_zcl = pb_fluide_->equation(j).domaine_Cl_dis();
124 for (int num_cl = 0; num_cl < la_zcl.nb_cond_lim(); num_cl++)
125 {
126 Cond_lim_base& la_cl = la_zcl.les_conditions_limites(num_cl).valeur();
127 Cond_lim_rayo_semi_transp *la_cl_rayo_semi_transp;
128
129 if (la_cl.is_bc_rayo_semi_transp(la_cl_rayo_semi_transp))
130 {
131 la_cl_rayo_semi_transp->associer_pb_rayo_semi_transp(*this);
132 la_cl_rayo_semi_transp->recherche_emissivite_et_A();
133
134 // Dans le cas d'un echange contact, il faut aussi completer la CL opposee
135 la_cl_rayo_semi_transp->completer_Cl_opposee_si_contact();
136 }
137 }
138
139 // Associer le pb au terme source de rayonnement de l'equation de temperature
140 Sources& les_sources = pb_fluide_->equation(j).sources();
141 for (int num_source = 0; num_source < les_sources.size(); num_source++)
142 if ((sub_type(Source_rayo_semi_transp_base, les_sources[num_source].valeur())))
143 contient_source_rayo_semi_transp = 1;
144 }
145
146 if (contient_source_rayo_semi_transp == 0)
147 {
148 Cerr << "Attention, vous n'avez pas defini de terme source de rayonnement semi transparent" << finl;
149 Cerr << "pensez a ajourter le terme source Source_rayo_semi_transp dans la liste des termes " << finl;
150 Cerr << "sources de l'equation de l'energie" << finl;
152 }
153 eq_rayo().completer();
154}
155
157{
158 // On discretise juste les equations
160}
161
162// On met a jour le flux radiatif pour tous les bords du probleme
164{
166
167 for (int num_cl_rayo = 0; num_cl_rayo < les_cl_rayo.size(); num_cl_rayo++)
168 {
169 Cond_lim& la_cl_rayo = eq_rayo().domaine_Cl_dis().les_conditions_limites(num_cl_rayo);
170 if (sub_type(Flux_radiatif_base, la_cl_rayo.valeur()))
171 {
172 Flux_radiatif_base& la_cl_rayon = ref_cast(Flux_radiatif_base, la_cl_rayo.valeur());
173 Equation_base& eq_temp = pb_fluide_->equation(1);
174 la_cl_rayon.calculer_flux_radiatif(eq_temp);
175 }
176 else if (sub_type(Symetrie, la_cl_rayo.valeur()))
177 {
178 /* Do nothing */
179 }
180 else
181 {
182 Cerr << "Erreur : les conditions aux limites de l'equation de rayonnement" << finl;
183 Cerr << "doivent forcement etre du type rayonnantes" << finl;
185 }
186 }
187}
188
190{
191 // On fait une boucle sur les bords pour trouver celui dont le nom est nom_bord
192 const Conds_lim& les_cl_rayo = eq_rayo().domaine_Cl_dis().les_conditions_limites();
193
194 for (int num_cl_rayo = 0; num_cl_rayo < les_cl_rayo.size(); num_cl_rayo++)
195 {
196 const Cond_lim& la_cl_rayo = eq_rayo().domaine_Cl_dis().les_conditions_limites(num_cl_rayo);
197
198 if (la_cl_rayo->frontiere_dis().le_nom() == nom_bord)
199 {
200 if (sub_type(Flux_radiatif_base, la_cl_rayo.valeur()))
201 {
202 Flux_radiatif_base& la_cl_rayon = ref_cast_non_const(Flux_radiatif_base, la_cl_rayo.valeur());
203 return la_cl_rayon.flux_radiatif();
204 }
205 else
206 {
207 Cerr << "Erreur : les conditions aux limites de l'equation de rayonnement" << finl;
208 Cerr << "doivent forcement etre du type rayonnantes" << finl;
210
211 }
212 }
213 }
214 Cerr << "Erreur : Pb_rayo_semi_transp::flux_radiatif" << finl;
215 Cerr << "il n'y a pas de condition a la limite portant le nom " << nom_bord << finl;
217 //pour les compilos
218 const Cond_lim& la_cl_rayo = eq_rayo().domaine_Cl_dis().les_conditions_limites(0);
219 Flux_radiatif_base& la_cl_rayon = ref_cast_non_const(Flux_radiatif_base, la_cl_rayo.valeur());
220 return la_cl_rayon.flux_radiatif();
221}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
int fixer_nb_valeurs_nodales(int nb_noeuds) override
Fixe le nombre de degres de liberte par composante.
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual bool is_bc_rayo_semi_transp(Cond_lim_rayo_semi_transp *&la_cl_rayo)
classe Cond_lim_rayo_semi_transp
virtual void associer_pb_rayo_semi_transp(const Pb_rayo_semi_transp &)
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void completer() override
Complete la construction (initialisation) des objets associes a l'equation.
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
void nommer(const Nom &) override
Donne un nom au champ.
virtual const Nom & fixer_unite(const Nom &)
Specifie l'unite d'un champ scalaire ou dont toutes les composantes ont la meme unite.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
bool is_rayo_semi_transp() const override
Definition Fluide_base.h:83
void typer_longeur_rayo(const Nom &typ)
Definition Fluide_base.h:81
int initialiser(const double temps) override
Initialise les parametres du fluide.
Champ_Don_base & kappa()
Definition Fluide_base.h:70
Champ_Don_base & longueur_rayo()
Definition Fluide_base.h:79
Champ_front_base & flux_radiatif()
virtual void calculer_flux_radiatif(const Equation_base &eq_temp)=0
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
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
Le Pb_rayo_semi_transp est un Probleme_base qui a 4 particularites : * Son equation doit etre typee e...
void preparer_calcul() override
Prepare le calcul: initialise les parametres du milieu et prepare le calcul de chacune des equations.
const Champ_front_base & flux_radiatif(const Nom &nom_bord) const
bool iterateTimeStep(bool &converged) override
In the case solveTimeStep uses an iterative process, this method executes a single iteration.
void validateTimeStep() override
Validates the calculated unknown by moving the present time at the end of the time step.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void typer_lire_milieu(Entree &is) override
int nombre_d_equations() const override
Eq_rayo_semi_transp & eq_rayo()
void associer_sch_tps_base(const Schema_Temps_base &) override
Associe un schema en temps au probleme.
bool initTimeStep(double dt) override
This method allocates and initializes the unknown and given fields for the future time step.
const Equation_base & equation(int i) const override
Eq_rayo_semi_transp eq_rayo_
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual void discretiser_equations()
Postraitements les_postraitements_
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
virtual void associer_pb(const Probleme_base &)
virtual int mettre_a_jour()
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
Classe de base des flux de sortie.
Definition Sortie.h:52
classe Source_rayo_semi_transp_base Classe de base de la hierarchie des termes sources de l'eqution d...
class Sources Sources represente une liste de Source.
Definition Sources.h:31
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
Definition Symetrie.h:37