TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Champ_Generique_Predefini.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_Predefini.h>
17#include <Param.h>
18#include <Entree_complete.h>
19
20Implemente_instanciable(Champ_Generique_Predefini,"Predefini",Champ_Gen_de_Champs_Gen);
21// XD predefini champ_generique_base predefini INHERITS_BRACE This keyword is used to post process predefined
22// XD_CONT postprocessing fields.
23// XD attr pb_champ deuxmots pb_champ REQ { Pb_champ nom_pb nom_champ } : nom_pb is the problem name and nom_champ is
24// XD_CONT the selected field name. The available keywords for the field name are: energie_cinetique_totale,
25// XD_CONT energie_cinetique_elem, viscosite_turbulente, viscous_force_x, viscous_force_y, viscous_force_z,
26// XD_CONT pressure_force_x, pressure_force_y, pressure_force_z, total_force_x, total_force_y, total_force_z,
27// XD_CONT viscous_force, pressure_force, total_force
28
30{
31 return s << que_suis_je() << " " << le_nom();
32}
33
34//-cf Champ_Gen_de_Champs_Gen::readOn
35//-Creation de l expression en fonction de type_champ_ qui a ete lu
36//-Lecture de champ_
38{
40 Nom expression;
41 expression = construit_expression();
42 Entree_complete s_complete(expression,s);
43 s_complete>>champ_;
44 return s ;
45}
46
47// methode : indique le nom du probleme a considerer
48// et le champ predefini a construire
49//
51{
52 param.ajouter_non_std("Pb_champ",(this),Param::REQUIRED);
53}
54
56{
57 if (mot=="Pb_champ")
58 {
59 // Lecture du nom du probleme et du champ a construire
60 is >> nom_pb_ >> type_champ_;
61 return 1;
62 }
63 else
65}
66
68{
69 champ_->completer(post);
70}
71
73{
74 return ref_cast(Champ_Gen_de_Champs_Gen,champ_.valeur()).get_source(i);
75}
76
78{
79 return champ_->get_champ_without_evaluation(espace_stockage);
80}
82{
83 return champ_->get_champ(espace_stockage);
84}
85
87{
88 Motcles motcles(1);
89 motcles[0] = "unites";
90 int rang = motcles.search(query);
91 switch(rang)
92 {
93 case 0:
94 {
95 Noms mots(1);
96 if (Motcle(type_champ_)=="ENERGIE_CINETIQUE_TOTALE")
97 mots[0] = "kg.m2/s2";
98 else if (Motcle(type_champ_)=="ENERGIE_CINETIQUE_ELEM")
99 mots[0] = "kg/(m.s2)";
100 else if (Motcle(type_champ_)=="VISCOSITE_TURBULENTE")
101 mots[0] = "m2/s";
102 else if (Motcle(type_champ_)=="VISCOUS_FORCE_X")
103 mots[0] = "kg.m2/s";
104 else if (Motcle(type_champ_)=="VISCOUS_FORCE_Y")
105 mots[0] = "kg.m2/s";
106 else if (Motcle(type_champ_)=="VISCOUS_FORCE_Z")
107 mots[0] = "kg.m2/s";
108 else if (Motcle(type_champ_)=="PRESSURE_FORCES_X")
109 mots[0] = "kg.m2/s";
110 else if (Motcle(type_champ_)=="PRESSURE_FORCES_Y")
111 mots[0] = "kg.m2/s";
112 else if (Motcle(type_champ_)=="PRESSURE_FORCES_Z")
113 mots[0] = "kg.m2/s";
114 else if (Motcle(type_champ_)=="TOTAL_FORCE_X")
115 mots[0] = "kg.m2/s";
116 else if (Motcle(type_champ_)=="TOTAL_FORCE_Y")
117 mots[0] = "kg.m2/s";
118 else if (Motcle(type_champ_)=="TOTAL_FORCE_Z")
119 mots[0] = "kg.m2/s";
120 else if (Motcle(type_champ_)=="VISCOUS_FORCE")
121 mots[0] = "kg.m2/s";
122 else if (Motcle(type_champ_)=="PRESSURE_FORCE")
123 mots[0] = "kg.m2/s";
124 else if (Motcle(type_champ_)=="TOTAL_FORCE")
125 mots[0] = "kg.m2/s";
126 return mots;
127 }
128 }
129 return champ_->get_property(query);
130}
131
133{
134 champ_->nommer(nom);
135}
136
138{
139 return champ_->get_nom_post();
140}
141
143{
144 ref_cast(Champ_Gen_de_Champs_Gen,champ_.valeur()).nommer_source();
145}
146
148{
149 Motcles les_mots(15);
150 {
151 les_mots[0] = "energie_cinetique_totale";
152 les_mots[1] = "energie_cinetique_elem";
153 les_mots[2] = "viscosite_turbulente";
154 les_mots[3] = "viscous_force_x";
155 les_mots[4] = "viscous_force_y";
156 les_mots[5] = "viscous_force_z";
157 les_mots[6] = "pressure_force_x";
158 les_mots[7] = "pressure_force_y";
159 les_mots[8] = "pressure_force_z";
160 les_mots[9] = "total_force_x";
161 les_mots[10] = "total_force_y";
162 les_mots[11] = "total_force_z";
163 les_mots[12] = "viscous_force";
164 les_mots[13] = "pressure_force";
165 les_mots[14] = "total_force";
166 }
167
168 Nom expression("");
169 // on recupere la dimension du problem
170 int dim=Objet_U::dimension;
171 int rang = les_mots.search(type_champ_);
172 switch(rang)
173 {
174 case 0:
175 {
176 expression = " Reduction_0D { methode somme_ponderee ";
177 expression += " source Transformation { methode formule expression 1 0.5*rho*norme_u*norme_u ";
178 expression += " sources { Transformation { methode norme localisation elem source RefChamp { Pb_champ ";
179 expression += nom_pb_;
180 expression += " vitesse } nom_source norme_u } , refChamp { Pb_champ ";
181 expression += nom_pb_;
182 expression += " masse_volumique nom_source rho } } } } ";
183 break;
184 }
185
186 case 1:
187 {
188 expression = " Transformation { methode formule expression 1 0.5*rho*norme_u*norme_u ";
189 expression += " sources { Transformation { methode norme localisation elem source RefChamp { Pb_champ ";
190 expression += nom_pb_;
191 expression += " vitesse } nom_source norme_u } , refChamp { Pb_champ ";
192 expression += nom_pb_;
193 expression += " masse_volumique nom_source rho } } } ";
194 break;
195 }
196
197 case 2:
198 {
199 expression = " modifier_pour_QC { division source refChamp { Pb_champ ";
200 expression += nom_pb_;
201 expression += " viscosite_dynamique_turbulente } } ";
202 break;
203 }
204
205 case 3:
206 {
207 expression = " Morceau_equation { type operateur numero 0 option flux_bords compo 0 ";
208 expression += " source refChamp { Pb_champ ";
209 expression += nom_pb_;
210 expression += " vitesse } }";
211 break;
212 }
213
214 case 4:
215 {
216 expression = " Morceau_equation { type operateur numero 0 option flux_bords compo 1 ";
217 expression += " source refChamp { Pb_champ ";
218 expression += nom_pb_;
219 expression += " vitesse } }";
220 break;
221 }
222
223 case 5:
224 {
225 expression = " Morceau_equation { type operateur numero 0 option flux_bords compo 2 ";
226 expression += " source refChamp { Pb_champ ";
227 expression += nom_pb_;
228 expression += " vitesse } }";
229 break;
230 }
231
232 case 6:
233 {
234 expression = " Morceau_equation { type operateur numero 2 option flux_bords compo 0 ";
235 expression += " source refChamp { Pb_champ ";
236 expression += nom_pb_;
237 expression += " vitesse } }";
238 break;
239 }
240
241 case 7:
242 {
243 expression = " Morceau_equation { type operateur numero 2 option flux_bords compo 1 ";
244 expression += " source refChamp { Pb_champ ";
245 expression += nom_pb_;
246 expression += " vitesse } }";
247 break;
248 }
249
250 case 8:
251 {
252 expression = " Morceau_equation { type operateur numero 2 option flux_bords compo 2 ";
253 expression += " source refChamp { Pb_champ ";
254 expression += nom_pb_;
255 expression += " vitesse } }";
256 break;
257 }
258
259 case 9:
260 {
261 expression = " Transformation { methode formule expression 1 viscousFX+pressureFX sources { ";
262 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 0 source refChamp { Pb_champ ";
263 expression += nom_pb_;
264 expression += " vitesse } nom_source viscousFX } , ";
265 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 0 source refChamp { Pb_champ ";
266 expression += nom_pb_;
267 expression += " vitesse } nom_source pressureFX } ";
268 expression += " } }";
269 break;
270 }
271
272 case 10:
273 {
274 expression = " Transformation { methode formule expression 1 viscousFY+pressureFY sources { ";
275 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 1 source refChamp { Pb_champ ";
276 expression += nom_pb_;
277 expression += " vitesse } nom_source viscousFY } , ";
278 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 1 source refChamp { Pb_champ ";
279 expression += nom_pb_;
280 expression += " vitesse } nom_source pressureFY } ";
281 expression += " } }";
282 break;
283 }
284
285 case 11:
286 {
287 expression = " Transformation { methode formule expression 1 viscousFZ+pressureFZ sources { ";
288 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 2 source refChamp { Pb_champ ";
289 expression += nom_pb_;
290 expression += " vitesse } nom_source viscousFZ } , ";
291 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 2 source refChamp { Pb_champ ";
292 expression += nom_pb_;
293 expression += " vitesse } nom_source pressureFZ } ";
294 expression += " } }";
295 break;
296 }
297
298 case 12:
299 {
300 if (dim==3)
301 {
302 expression = " Transformation { methode vecteur expression 3 viscousX viscousY viscousZ sources { ";
303 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 2 source refChamp { Pb_champ ";
304 expression += nom_pb_;
305 expression += " vitesse } nom_source viscousZ } , ";
306 }
307 else
308 expression = " Transformation { methode vecteur expression 2 viscousX viscousY sources { ";
309 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 0 source refChamp { Pb_champ ";
310 expression += nom_pb_;
311 expression += " vitesse } nom_source viscousX } , ";
312 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 1 source refChamp { Pb_champ ";
313 expression += nom_pb_;
314 expression += " vitesse } nom_source viscousY } ";
315 expression += " } }";
316 break;
317 }
318
319 case 13:
320 {
321 if (dim==3)
322 {
323 expression = " Transformation { methode vecteur expression 3 pressureX pressureY pressureZ sources { ";
324 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 2 source refChamp { Pb_champ ";
325 expression += nom_pb_;
326 expression += " vitesse } nom_source pressureZ } , ";
327 }
328 else
329 expression = " Transformation { methode vecteur expression 2 pressureX pressureY sources { ";
330 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 0 source refChamp { Pb_champ ";
331 expression += nom_pb_;
332 expression += " vitesse } nom_source pressureX } , ";
333 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 1 source refChamp { Pb_champ ";
334 expression += nom_pb_;
335 expression += " vitesse } nom_source pressureY } ";
336 expression += " } }";
337 break;
338 }
339
340 case 14:
341 {
342 if (dim==3)
343 {
344 expression = " Transformation { methode vecteur expression 3 viscousX+pressureX viscousY+pressureY viscousZ+pressureZ sources { ";
345 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 2 source refChamp { Pb_champ ";
346 expression += nom_pb_;
347 expression += " vitesse } nom_source viscousZ } , ";
348 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 2 source refChamp { Pb_champ ";
349 expression += nom_pb_;
350 expression += " vitesse } nom_source pressureZ } , ";
351 }
352 else
353 expression = " Transformation { methode vecteur expression 2 viscousX+pressureX viscousY+pressureY sources { ";
354 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 0 source refChamp { Pb_champ ";
355 expression += nom_pb_;
356 expression += " vitesse } nom_source viscousX } , ";
357 expression += " Morceau_equation { type operateur numero 0 option flux_bords compo 1 source refChamp { Pb_champ ";
358 expression += nom_pb_;
359 expression += " vitesse } nom_source viscousY } , ";
360 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 0 source refChamp { Pb_champ ";
361 expression += nom_pb_;
362 expression += " vitesse } nom_source pressureX } , ";
363 expression += " Morceau_equation { type operateur numero 2 option flux_bords compo 1 source refChamp { Pb_champ ";
364 expression += nom_pb_;
365 expression += " vitesse } nom_source pressureY } ";
366 expression += " } }";
367 break;
368 }
369
370
371 default :
372 {
373 Cerr<<"Only keywords among "<<les_mots<<" are allowed."<<finl;
374 exit();
375 }
376 }
377 return expression;
378}
Classe de base des champs generiques ayant comme source d'autres champs generiques L'utilisation des ...
class Champ_Generique_Predefini
const Champ_base & get_champ(OWN_PTR(Champ_base)&espace_stockage) const override
void nommer(const Nom &) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
OWN_PTR(Champ_Generique_base) champ_
const Nom & get_nom_post() const override
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.
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 completer(const Postraitement_base &post) override
const Champ_Generique_base & get_source(int i) const override
void set_param(Param &param) const override
class Champ_Generique_base
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.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
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
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
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
@ REQUIRED
Definition Param.h:115
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
Classe de base pour l'ensemble des postraitements.
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