TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Champ_Generique_Tparoi_VEF.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 <Champ_Generique_Tparoi_VEF.h>
17#include <Probleme_base.h>
18#include <Nom.h>
19#include <TRUSTTabs.h>
20#include <Domaine_VEF.h>
21#include <Domaine_Cl_VEF.h>
22#include <Equation_base.h>
23#include <Modele_turbulence_scal_base.h>
24#include <Neumann_paroi.h>
25#include <Neumann_homogene.h>
26#include <Discretisation_base.h>
27#include <Synonyme_info.h>
28
29Implemente_instanciable(Champ_Generique_Tparoi_VEF,"Tparoi_VEF",Champ_Gen_de_Champs_Gen);
30// XD tparoi_vef champ_post_de_champs_post tparoi_vef INHERITS_BRACE This keyword is used to post process (only for VEF
31// XD_CONT discretization) the temperature field with a slight difference on boundaries with Neumann condition where law
32// XD_CONT of the wall is applied on the temperature field. nom_pb is the problem name and field_name is the selected
33// XD_CONT field name. A keyword (temperature_physique) is available to post process this field without using
34// XD_CONT Definition_champs.
35
36Add_synonym(Champ_Generique_Tparoi_VEF,"Champ_Post_Tparoi_VEF");
37
39{
40 return s << que_suis_je() << " " << le_nom();
41}
42
43//cf Champ_Gen_de_Champs_Gen::readOn
45{
47 return s ;
48}
49
51{
52
53 OWN_PTR(Champ_base) source_espace_stockage;
54 const Champ_base& source = get_source(0).get_champ_without_evaluation(source_espace_stockage);
55
56 const Domaine_dis_base& domaine_dis = get_ref_domaine_dis_base();
57 Nature_du_champ nature_source = source.nature_du_champ();
58 Noms noms;
59 Noms unites;
60 noms.add("bidon");
61 unites.add("K");
62 int nb_comp = 1;
63 double temps;
64 temps=0.;
65
66 OWN_PTR(Champ_Fonc_base) espace_stockage_fonc;
68 Motcle directive = get_directive_pour_discr();
69 discr.discretiser_champ(directive,domaine_dis,nature_source,noms,unites,nb_comp,temps,espace_stockage_fonc);
70 espace_stockage = espace_stockage_fonc;
71
72
73 return espace_stockage;
74}
76{
77
78 OWN_PTR(Champ_base) source_espace_stockage;
79 const Champ_base& source = get_source(0).get_champ(source_espace_stockage);
80
81 const Domaine_dis_base& domaine_dis = get_ref_domaine_dis_base();
82 Nature_du_champ nature_source = source.nature_du_champ();
83 Noms noms;
84 Noms unites;
85 noms.add("bidon");
86 unites.add("K");
87 int nb_comp = 1;
88 double temps;
89 temps=0.;
90
91 OWN_PTR(Champ_Fonc_base) espace_stockage_fonc;
93 Motcle directive = get_directive_pour_discr();
94 discr.discretiser_champ(directive,domaine_dis,nature_source,noms,unites,nb_comp,temps,espace_stockage_fonc);
95 espace_stockage = espace_stockage_fonc;
96
97 DoubleTab& valeurs_espace = espace_stockage->valeurs();
98 const DoubleTab& source_so_val = source.valeurs();
99 const DoubleTab& inconnue = source_so_val;
100 valeurs_espace = source_so_val;
101
102 // Sur toutes les faces ou le flux est impose si le flux turbulent pas calcule on recalcule la temperature
103 // on recuprere l'eqn de temp
104 const Equation_base& my_eqn=ref_cast(Champ_Inc_base,source).equation();
105 const RefObjU& modele_turbulence = my_eqn.get_modele(TURBULENCE);
106 if ( modele_turbulence && sub_type(Modele_turbulence_scal_base,modele_turbulence.valeur()))
107 {
108 const Modele_turbulence_scal_base& mod_turb_scal = ref_cast(Modele_turbulence_scal_base,modele_turbulence.valeur());
109 const Turbulence_paroi_scal_base& loiparth = mod_turb_scal.loi_paroi();
110
111 if( loiparth.use_equivalent_distance() )
112 {
113 // const Paroi_scal_hyd_base_VEF& paroi_scal_vef = ref_cast(Paroi_scal_hyd_base_VEF,loiparth.valeur());
114
115 const Domaine_VEF& domaine_VEF=ref_cast(Domaine_VEF,my_eqn.domaine_dis());
116 const IntTab& elem_faces = domaine_VEF.elem_faces();
117 const DoubleVect& vol = domaine_VEF.volumes();
118 const IntTab& face_voisins = domaine_VEF.face_voisins();
119 const DoubleTab& face_normale = domaine_VEF.face_normales();
120 const Domaine_Cl_VEF& domaine_Cl_VEF=ref_cast(Domaine_Cl_VEF,my_eqn.domaine_Cl_dis());
121 int nb_dim_pb=Objet_U::dimension;
122 DoubleVect le_mauvais_gradient(nb_dim_pb);
123 int nb_front=domaine_VEF.nb_front_Cl();
124 for (int n_bord=0; n_bord<nb_front; n_bord++)
125 {
126 const Cond_lim& la_cl = domaine_Cl_VEF.les_conditions_limites(n_bord);
127 const Cond_lim_base& cl_base=la_cl.valeur();
128 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
129
130 // Les lois de parois ne s'appliquent qu'aux cas ou la CL
131 // est de type temperature imposee, car dans les autres cas
132 // (flux impose et adiabatique) le flux a la paroi est connu et fixe.
133 int ldp_appli=0;
134 if ((sub_type(Neumann_paroi,cl_base))||(sub_type(Neumann_homogene,cl_base)))
135 {
136 ldp_appli=1;
137 // if (paroi_scal_vef.get_flag_calcul_ldp_en_flux_impose() )
139 ldp_appli=0;
140 }
141
142 if (ldp_appli)
143 {
144 // const DoubleVect& d_equiv = paroi_scal_vef.equivalent_distance(n_bord);
145 const DoubleVect& d_equiv = loiparth.equivalent_distance(n_bord);
146 // d_equiv contient la distance equivalente pour le bord
147 // Dans d_equiv, pour les faces qui ne sont pas paroi_fixe (eg periodique, symetrie, etc...)
148 // il y a la distance geometrique grace a l'initialisation du tableau dans la loi de paroi.
149
150 int num1 = 0;
151 int num2 = le_bord.nb_faces_tot();
152 ToDo_Kokkos("boundary");
153 for (int ind_face=num1; ind_face<num2; ind_face++)
154 {
155 // Tf est la temperature fluide moyenne dans le premier element
156 // sans tenir compte de la temperature de paroi.
157 double Tf=0.;
158 // double bon_gradient=0.; // c'est la norme du gradient de temperature normal a la paroi calculee a l'aide de la loi de paroi.
159 le_mauvais_gradient=0.;
160 int num_face = le_bord.num_face(ind_face);
161 int elem1 = face_voisins(num_face,0);
162 if (elem1==-1) elem1 = face_voisins(num_face,1);
163 double surface_face = domaine_VEF.face_surfaces(num_face);
164
165 int nb_faces_elem = domaine_VEF.domaine().nb_faces_elem();
166 for (int i=0; i<nb_faces_elem; i++)
167 {
168 int j = elem_faces(elem1,i);
169 if ( j != num_face )
170 {
171 double surface_pond = 0.;
172 for (int kk=0; kk<nb_dim_pb; kk++)
173 surface_pond -= (face_normale(j,kk)*domaine_VEF.oriente_normale(j,elem1)*face_normale(num_face,kk)*
174 domaine_VEF.oriente_normale(num_face,elem1))/(surface_face*surface_face);
175 Tf+=inconnue(j)*surface_pond;
176 }
177
178 for(int kk=0; kk<nb_dim_pb; kk++)
179 le_mauvais_gradient(kk)+=inconnue(j)*face_normale(j,kk)*domaine_VEF.oriente_normale(j,elem1);
180 }
181 le_mauvais_gradient/=vol(elem1);
182 // mauvais_gradient = le_mauvais_gradient.n
183 double mauvais_gradient=0;
184 for(int kk=0; kk<nb_dim_pb; kk++)
185 mauvais_gradient+=le_mauvais_gradient(kk)*face_normale(num_face,kk)/surface_face;
186
187 // valeurs_espace(num_face) est la temperature de paroi : Tw.
188 // On se fiche du signe de bon gradient car c'est la norme du gradient
189 // de temperature dans l'element.
190 // Ensuite ce sera multiplie par le vecteur normal a la face de paroi
191 // qui lui a les bons signes.
192 //bon_gradient=(Tf-inconnue(num_face))/d_equiv(ind_face)*(-domaine_VEF.oriente_normale(num_face,elem1));
193 // on doit faire bon=mauvais...
194 // on fait le calcul de facon a avoir bon_grad =mauva
195 valeurs_espace(num_face)=Tf-mauvais_gradient*d_equiv(ind_face)*(-domaine_VEF.oriente_normale(num_face,elem1));
196 }
197 }
198 }
199 }
200 }
201 DoubleTab& espace_valeurs = espace_stockage->valeurs();
202 espace_valeurs.echange_espace_virtuel();
203
204 return espace_stockage;
205}
206
208{
209
210 Motcles motcles(1);
211 motcles[0] = "composantes";
212 int rang = motcles.search(query);
213 switch(rang)
214 {
215
216 case 0:
217 {
218 Noms source_compos = get_source(0).get_property("composantes");
219 int nb_comp = source_compos.size();
220 Noms compo(nb_comp);
221
222 for (int i=0; i<nb_comp; i++)
223 {
224 Nom nume(i);
225 compo[i] = nom_post_+nume;
226 }
227
228 return compo;
229 }
230
231 }
233}
234
235//Nomme le champ en tant que source par defaut
236//"Combinaison_"+nom_champ_source
238{
239 if (nom_post_=="??")
240 {
241 Nom nom_post_source, nom_champ_source;
242 const Noms nom = get_source(0).get_property("nom");
243 nom_champ_source = nom[0];
244 nom_post_source = "Tparoi_";
245 nom_post_source += nom_champ_source;
246 nommer(nom_post_source);
247 }
248}
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe de base des champs generiques ayant comme source d'autres champs generiques L'utilisation des ...
const Noms get_property(const Motcle &query) const override
Renvoie la propriete demandee.
virtual OWN_PTR(Champ_Fonc_base) &creer_espace_stockage(const Nature_du_champ &nature
virtual const Champ_Generique_base & get_source(int i) const
const Motcle get_directive_pour_discr() const override
Renvoie la directive (champ_elem, champ_sommets, champ_face ou pression) pour lancer la discretisatio...
const Discretisation_base & get_discretisation() const override
Renvoie la discretisation associee au probleme.
const Domaine_dis_base & get_ref_domaine_dis_base() const override
Renvoie une ref au domaine_discretisee du domaine sur lequel sera evalue l espace de stockage.
class Champ_Generique_Tparoi_VEF
const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const override
const Noms get_property(const Motcle &query) const override
Renvoie la propriete demandee.
const Champ_base & get_champ(OWN_PTR(Champ_base)&espace_stockage) const override
virtual const Noms get_property(const Motcle &query) const
Renvoie la propriete demandee.
virtual const Champ_base & get_champ(OWN_PTR(Champ_base) &espace_stockage) const =0
virtual const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const =0
void nommer(const Nom &nom) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
Classe Champ_Inc_base.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
Definition Domaine.h:484
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VEF
Definition Domaine_VEF.h:54
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double volumes(int i) const
Definition Domaine_VF.h:113
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_front_Cl() const
const Domaine & domaine() 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 const RefObjU & get_modele(Type_modele type) const
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
virtual Nature_du_champ nature_du_champ() const
Definition Field_base.h:77
class Front_VF
Definition Front_VF.h:36
int nb_faces_tot() const
Definition Front_VF.h:58
int num_face(const int) const
Definition Front_VF.h:68
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
const Turbulence_paroi_scal_base & loi_paroi() const
Renvoie la loi de turbulence sur la paroi (version const).
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
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
static int dimension
Definition Objet_U.h:99
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual bool use_equivalent_distance() const
Give a boolean indicating if we need to use equivant distance by default we consider that we use the ...
const DoubleVects & equivalent_distance() const
const int & get_flag_calcul_ldp_en_flux_impose() const