TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Post_Operateur_Eqn.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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_Post_Operateur_Eqn.h>
17#include <Probleme_base.h>
18#include <Postraitement.h>
19#include <Domaine_VF.h>
20#include <Nom.h>
21#include <Champ_Generique_refChamp.h>
22#include <Discretisation_base.h>
23#include <Equation_base.h>
24#include <Operateur_base.h>
25#include <Param.h>
26#include <MD_Vector_composite.h>
27#include <Transport_K_Eps_base.h>
28#include <Transport_K_Omega_base.h>
29#include <Modele_turbulence_hyd_K_Eps.h>
30#include <Modele_turbulence_hyd_K_Eps_Realisable.h>
31#include <Modele_turbulence_hyd_RANS_K_Eps_base.h>
32#include <Modele_turbulence_hyd_K_Omega.h>
33#include <Modele_turbulence_hyd_RANS_K_Omega_base.h>
34
35Implemente_instanciable_sans_constructeur(Champ_Post_Operateur_Eqn,"Operateur_Eqn|Champ_Post_Operateur_Eqn",Champ_Generique_Operateur_base);
36// XD champ_post_operateur_eqn champ_post_de_champs_post operateur_eqn BRACE Post-process equation operators/sources
37
39{
40 return s << que_suis_je() << " " << le_nom();
41}
42Champ_Post_Operateur_Eqn::Champ_Post_Operateur_Eqn()
43{
44}
45
47{
49 param.ajouter("numero_source",&numero_source_); // XD_ADD_P entier
50 // XD_CONT the source to be post-processed (its number). If you have only one source term, numero_source will
51 // XD_CONT correspond to 0 if you want to post-process that unique source
52 param.ajouter("numero_op",&numero_op_); // XD_ADD_P entier
53 // XD_CONT numero_op will be 0 (diffusive operator) or 1 (convective operator) or 2 (gradient operator) or 3
54 // XD_CONT (divergence operator).
55 param.ajouter("numero_masse",&numero_masse_); // XD_ADD_P entier
56 // XD_CONT numero_masse will be 0 for the mass equation operator in Pb_multiphase.
57 param.ajouter_flag("sans_solveur_masse",&sans_solveur_masse_); // XD_ADD_P rien
58 // XD_CONT not_set
59 param.ajouter("compo",&compo_); // XD_ADD_P entier
60 // XD_CONT If you want to post-process only one component of a vector field, you can specify the number of the
61 // XD_CONT component after compo keyword. By default, it is set to -1 which means that all the components will be
62 // XD_CONT post-processed. This feature is not available in VDF disretization.
63}
64
66{
68
69 return s ;
70}
71
73{
74 // On applique compo a un vecteur
75 if ((!ref_eq_->inconnue().is_vectorial()) && (compo_ != -1 ))
76 {
77 Cerr<<"Error in Champ_Post_Operateur_Eqn::verification_cas_compo()"<<finl;
78 Cerr<<"It isn't possible to get a component from a non vectoriel field " <<finl;
80 }
81
82 // Verification de compo
83 const int nb_compo= ref_eq_->inconnue().nb_comp();
84 if ((compo_<-1)||(compo_>nb_compo-1))
85 {
86 Cerr<<"Error in Champ_Post_Operateur_Eqn::verification_cas_compo()"<<finl;
87 Cerr<<"compo="<<compo_<<" is not allowed."<<" You must give a value between 0 and "<< nb_compo-1<<finl;
89 }
90 // Verifier qu'on n'est pas en VDF
91 if (ref_eq_->discretisation().is_vdf() && (compo_ != -1 ))
92 {
93 Cerr<<"Error in Champ_Post_Operateur_Eqn::verification_cas_compo()"<<finl;
94 Cerr<<"The option compo is not available in case of VDF discretization"<<finl;
96 }
97}
98
100{
101
103
104 const Probleme_base& Pb = ref_cast(Postraitement,post).probleme();
105 int numero_eq_=-1;
106 bool iskeps = false;
107 bool iskomega = false;
108 if (sub_type(Champ_Generique_refChamp,get_source(0)))
109 {
110
111 OWN_PTR(Champ_base) espace_stockage;
112 const Champ_base& mon_champ = get_source(0).get_champ(espace_stockage);
113 if (sub_type(Champ_Inc_base,mon_champ))
114 {
115 const Champ_Inc_base& mon_champ_inc = ref_cast(Champ_Inc_base,mon_champ);
116
117 {
118
119 //On recupere l equation alors qu elle n est pas encore associee au Champ_Inc
120 //On parcours les equatiosn du probleme et on identifie celle qui correspond au champ inconnu
121
122 int nb_eq = Pb.nombre_d_equations();
123 int i=0;
124
125 while (i<nb_eq)
126 {
127 const Equation_base& eq_test = Pb.equation(i);
128 if ((eq_test.inconnue().le_nom() == mon_champ_inc.le_nom()))
129 {
130 numero_eq_=i;
131 break;
132 }
133 else if (mon_champ_inc.le_nom() == "K_Eps" || mon_champ_inc.le_nom() == "K_Omega")
134 {
135 const RefObjU& modele_turbulence = eq_test.get_modele(TURBULENCE);
136 if (sub_type(Modele_turbulence_hyd_K_Eps, modele_turbulence.valeur()) || sub_type(Modele_turbulence_hyd_K_Eps_Realisable, modele_turbulence.valeur()))
137 {
138 const Modele_turbulence_hyd_RANS_K_Eps_base& le_mod_RANS = ref_cast(Modele_turbulence_hyd_RANS_K_Eps_base, eq_test.get_modele(TURBULENCE).valeur());
139 const Transport_K_Eps_base& transportkeps = ref_cast(Transport_K_Eps_base, le_mod_RANS.get_eq_transport());
140 if ((transportkeps.inconnue().le_nom() == mon_champ_inc.le_nom()))
141 {
142 numero_eq_=i;
143 iskeps = true;
144 break;
145 }
146 }
147 else if (sub_type(Modele_turbulence_hyd_K_Omega, modele_turbulence.valeur()))
148 {
149 const Modele_turbulence_hyd_RANS_K_Omega_base& le_mod_RANS = ref_cast(Modele_turbulence_hyd_RANS_K_Omega_base, eq_test.get_modele(TURBULENCE).valeur());
150 const Transport_K_Omega_base& transportkomega = ref_cast(Transport_K_Omega_base, le_mod_RANS.get_eq_transport());
151 if ((transportkomega.inconnue().le_nom() == mon_champ_inc.le_nom()))
152 {
153 numero_eq_ = i;
154 iskomega = true;
155 break;
156 }
157 }
158 }
159 i++;
160 }
161 }
162 }
163 }
164 if (numero_eq_==-1)
165 {
166 Cerr<<"Champ_Post_Operateur_Eqn can be applied only to equation unknown."<<finl;
168 }
169
170 if (!iskeps && !iskomega)
171 ref_eq_=Pb.equation(numero_eq_);
172 else if (iskeps)
173 {
174 const Modele_turbulence_hyd_RANS_K_Eps_base& le_mod_RANS = ref_cast(Modele_turbulence_hyd_RANS_K_Eps_base, Pb.equation(numero_eq_).get_modele(TURBULENCE).valeur());
175 const Transport_K_Eps_base& eqn = ref_cast(Transport_K_Eps_base, le_mod_RANS.get_eq_transport());
176 ref_eq_ = ref_cast(Equation_base, eqn);
177 }
178 else if (iskomega)
179 {
180 const Modele_turbulence_hyd_RANS_K_Omega_base& le_mod_RANS = ref_cast(Modele_turbulence_hyd_RANS_K_Omega_base, Pb.equation(numero_eq_).get_modele(TURBULENCE).valeur());
181 const Transport_K_Omega_base& eqn = ref_cast(Transport_K_Omega_base, le_mod_RANS.get_eq_transport());
182 ref_eq_ = ref_cast(Equation_base, eqn);
183 }
184 else
185 {
186 Cerr<<"Error: unknown case !"<<finl;
188 }
189
190 int ok=0;
191 const Equation_base& eqn=ref_eq_.valeur();
192 const MD_Vector& mdf = eqn.inconnue().valeurs().get_md_vector(),
193 md = sub_type(MD_Vector_composite, mdf.valeur()) ? ref_cast(MD_Vector_composite, mdf.valeur()).get_desc_part(0) : mdf;
194 const Domaine_VF& zvf= ref_cast( Domaine_VF,ref_eq_->domaine_dis());
195 if (md== zvf.face_sommets().get_md_vector())
196 {
197 localisation_inco_=Entity::FACE;
198 ok=1;
199 }
200 if (md== zvf.domaine().les_elems().get_md_vector())
201 {
202 localisation_inco_=Entity::ELEMENT;
203 ok=1;
204 }
205 if (md == zvf.domaine().les_sommets().get_md_vector())
206 {
207 ok=1;
208 localisation_inco_=Entity::NODE;
209 }
210 if (ok==0)
211 {
212 Cerr<<"Error in "<<que_suis_je()<<" unknown localisation"<<finl;
214 }
216}
217
219{
220 espace_stockage = ref_eq_->inconnue();
221 return espace_stockage;
222}
223
225{
226
227 OWN_PTR(Champ_Fonc_base) espace_stockage_fonc;
228 //Champ source_espace_stockage;
229
230 double temps=0.;
231 Nom directive;
232
233 switch (localisation_inco_)
234 {
235 case Entity::ELEMENT:
236 directive="CHAMP_ELEM";
237 break;
238 case Entity::NODE:
239 directive="CHAMP_SOMMETS";
240 break;
241 case Entity::FACE:
242 directive="CHAMP_FACE";
243 break;
244 default:
245 Cerr<<"error in Champ_Post_Operateur_Eqn::get_champ"<<finl;
247
248 }
249 int nb_comp = 1;
250 ref_eq_->discretisation().discretiser_champ(directive,ref_eq_->domaine_dis(),"oooo","unit", nb_comp,temps,espace_stockage_fonc);
251 espace_stockage = espace_stockage_fonc;
252 espace_stockage->fixer_nature_du_champ(scalaire);
253
254 return espace_stockage;
255}
256
257const Champ_base& Champ_Post_Operateur_Eqn::get_champ(OWN_PTR(Champ_base)& espace_stockage) const
258{
259 // On commence par construire le champ vectoriel complet
260 OWN_PTR(Champ_base) espace_stockage_complet;
261 espace_stockage_complet = get_champ_without_evaluation(espace_stockage_complet);
262 DoubleTab& es = (espace_stockage_complet->valeurs());
263
264 //if (ref_eq_->schema_temps().temps_courant()!=0)
265 {
266 if (numero_op_!=-1)
267 {
268 // certains calculer sont faux !!!! il faudrait tous les recoder en res =0 ajouter();
269 es=0;
270 Operateur().ajouter(ref_eq_->operateur(numero_op_).mon_inconnue().valeurs(),es);
271 }
272 else if (numero_source_!=-1)
273 ref_eq_->sources()(numero_source_).calculer(es);
274 else if ((numero_masse_!=-1) && ref_eq_->has_interface_blocs())
275 es=0, ref_eq_->schema_temps().ajouter_blocs({},es,ref_eq_.valeur());
277 ref_eq_->solv_masse().appliquer_impl(es); //On divise par le volume
278 // Hack: car Masse_PolyMAC_CDO_Face::appliquer_impl ne divise pas par le volume (matrice de masse)....
279 if (ref_eq_->solv_masse().que_suis_je()=="Masse_PolyMAC_CDO_Face")
280 {
281 //Cerr << "Volumic source terms on faces with PolyMAC_CDO can't be post-processed yet." << finl;
282 Cerr << "Warning, source terms on faces with PolyMAC_CDO are post-processed as S*dV not as volumic source terms S." << finl;
283 Cerr << "Cause Masse_PolyMAC_CDO_Face::appliquer_impl do not divide per volume." << finl;
284 //Process::exit();
285 }
286 }
288 // apres je recupere juste la composante si elle est demandee
289 if (compo_>-1)
290 {
291 // on prepare l'espace de stockage pour une composante
292 OWN_PTR(Champ_base) espace_stockage_compo;
293 espace_stockage_compo = get_champ_compo_without_evaluation(espace_stockage_compo);
294 DoubleTab& es_compo = (espace_stockage_compo->valeurs());
295 int nb_pos = es.dimension(0);
296 for (int i=0; i<nb_pos; i++)
297 {
298 es_compo(i) = es(i,compo_);
299 }
300 espace_stockage = espace_stockage_compo;
301 }
302 else
303 espace_stockage = espace_stockage_complet;
304
305 return espace_stockage;
306}
307
308const Noms Champ_Post_Operateur_Eqn::get_property(const Motcle& query) const
309{
310//Creation des composantes serait a faire de maniere dynamique (Eqn_...)
311
312 Motcles motcles(2);
313 motcles[0] = "composantes";
314 motcles[1] = "unites";
315
316 int rang = motcles.search(query);
317
318 switch(rang)
319 {
320 case 0:
321 {
322 if (compo_==-1)
323 {
324 int nb_comp= ref_eq_->inconnue().nb_comp();
325 Noms compo(nb_comp);
326 for (int i=0; i<nb_comp; i++)
327 {
328 Nom nume(i);
329 compo[i] = nom_post_+nume;
330 }
331 return compo;
332 }
333 else
334 {
335 Noms compo(1);
336 compo[0] = nom_post_;
337 return compo;
338 }
339 }
340
341 case 1:
342 {
343 if (compo_==-1)
344 {
345 int nb_comp= ref_eq_->inconnue().nb_comp();
346 Noms unites(nb_comp);
347 //Noms source_unites = get_source(0).get_property("unites");
348 for (int i=0; i<nb_comp; i++)
349 {
350 unites[i] = "unit";
351 }
352 return unites;
353 }
354 else
355 {
356 // J'utilise un vecteur car la methode renvoie Noms
357 Noms unites(1);
358 unites[0] = "unit";
359 return unites;
360 }
361 }
362
363 }
365}
366
367Entity Champ_Post_Operateur_Eqn::get_localisation(const int index) const
368{
369
370 return localisation_inco_;
371
372}
373//Nomme le champ en tant que source par defaut
374//"Eqn_" + nom_champ_source
376{
377 if (nom_post_=="??")
378 {
379 Nom nom_post_source;
380 //const Noms nom = get_source(0).get_property("nom");
381 nom_post_source = "Eqn_s";
382 nom_post_source += Nom(numero_source_);
383 nom_post_source += "_o" ;
384 nom_post_source += Nom(numero_op_);
385 nom_post_source += "_m" ;
386 nom_post_source += Nom(numero_masse_);
387 if (compo_!=-1)
388 {
389 Nom nume(compo_);
390 nom_post_source += nume;
391 }
392 nommer(nom_post_source);
393 }
394
395}
397{
398 return ref_eq_->operateur(numero_op_).l_op_base();
399}
400
402{
403 return ref_eq_->operateur(numero_op_).l_op_base();
404}
405
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
void completer(const Postraitement_base &post) override
virtual const Champ_Generique_base & get_source(int i) const
void set_param(Param &param) const override
Classe Champ_Generique_Operateur_base Classe de base des classes de champs generiques dediees a l 'ap...
virtual const Champ_base & get_champ(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.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
class Champ_Post_Operateur_Eqn OWN_PTR(Champ_base) destine a post-traiter le gradient d un champ gene...
void completer(const Postraitement_base &post) override
void nommer_source() override
Entity localisation_inco_
const Noms get_property(const Motcle &query) const override
Renvoie la propriete demandee.
int numero_source_
const Champ_base & get_champ_compo_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const
const Champ_base & get_champ(OWN_PTR(Champ_base)&espace_stockage) const override
void set_param(Param &param) const override
int numero_masse_
int compo_
bool sans_solveur_masse_
void verification_cas_compo() const
int numero_op_
Entity get_localisation(const int index=-1) const override
Renvoie le type des entites geometriques sur auxquelles les valeurs discretes sont attachees (NODE po...
const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const override
const Operateur_base & Operateur() const override
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
DoubleTab_t & les_sommets()
Definition Domaine.h:113
IntTab_t & les_elems()
Definition Domaine.h:129
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
Definition Domaine_VF.h:583
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual Nature_du_champ fixer_nature_du_champ(Nature_du_champ nat)
Fixer la nature d'un champ: scalaire, multiscalaire, vectoriel.
const MD_Vector_base & valeur() const
Definition MD_Vector.h:77
virtual const Transport_2eq_base & get_eq_transport() const
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
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 Operateur_base Classe est la base de la hierarchie des objets representant un
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
Definition Param.cpp:474
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
Classe de base pour l'ensemble des postraitements.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
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
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
virtual const MD_Vector & get_md_vector() const
Definition TRUSTVect.h:123
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
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation.