TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Champ_Generique_base.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_base.h>
17#include <Champs_compris.h>
18#include <Probleme_base.h>
19#include <Interprete.h>
20#include <TRUST_Ref.h>
21#include <Param.h>
22
23Implemente_base(Champ_Generique_base,"Champ_Generique_base",Objet_U);
24// XD champ_generique_base objet_u champ_generique_base BRACE not_set
25// XD listchamp_generique listobj nul BRACE champ_generique_base COMMA XXX
26
27// XD definition_champ objet_lecture nul NO_BRACE Keyword to create new complex field for advanced postprocessing.
28// XD attr name chaine name REQ The name of the new created field.
29// XD attr champ_generique champ_generique_base champ_generique REQ not_set
30
31// XD definition_champs listobj nul BRACE definition_champ NO_COMMA List of definition champ
32
34{
35 return os;
36}
37
39{
40 Journal()<<"Reading data for a "<<que_suis_je()<<" field." <<finl;
41 Param param(que_suis_je());
42 set_param(param);
43 param.lire_avec_accolades_depuis(is);
44 return is;
45}
46
48{
49 return -1;
50}
51
52/*! @brief Renvoie la dimension de l'espace dans lequel le champ est defini.
53 *
54 * Il s'agit du nombre de composantes des coordonnees qu'il faut fournir dans get_xyz_values.
55 * (par exemple, un champ defini sur une surface peut etre de dimension 3 si les
56 * coordonnees des sommets sont 3D, ou de dimension 2 s'il s'agit de coordonnees curvilignes
57 * le long de la surface)
58 *
59 */
61{
62 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
63 // On n'arrive jamais ici
64}
65
66/*! @brief Renvoie le temps du Champ_Generique_base.
67 *
68 */
70{
71 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
72}
73
74/*! @brief Renvoie le probleme qui porte le champ cible
75 *
76 */
78{
79 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
80}
81
82/*! @brief Renvoie la discretisation associee au probleme
83 *
84 */
86{
87 const Objet_U& ob = interprete().objet(nom_pb_);
88 const Probleme_base& pb = ref_cast(Probleme_base,ob);
89 const Discretisation_base& discr = pb.discretisation();
90 return discr;
91}
92
93/*! @brief Renvoie la directive (champ_elem, champ_sommets, champ_face ou pression)
94 * pour lancer la discretisation de l espace de stockage rendu par get_champ()
95 *
96 */
98{
99 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
100}
101
103{
104 nom_post_ = nom;
105}
106
108{
109 return nom_post_;
110}
111
112/*! @brief Renvoie la liste des "query" possibles pour le champ.
113 *
114 */
116{
117 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
118}
119
120/*! @brief Renvoie la propriete demandee.
121 *
122 * Exemples: "DISCRETISATION" : type du champ discret (P0, P1, P1NC, etc...)
123 * "ELEMENT_TYPE" : type de l'element de plus grande dimension ({TRIANGLE}, {TETRAHEDRA}, {QUAD}, {HEXA}, etc)
124 * "DYNAMIC_MESH" : le maillage est-il dynamique ou pas ({STATIC}, {DYNAMIC})
125 * "NAME" : nom du champ
126 * "COMPONENT_NAMES" : nom des composantes du champ ({K,EPSILON} ou {VITESSE_X,VITESSE_Y,VITESSE_Z})
127 * "BOUNDARY_NAMES" : nom des bords
128 * "COORDINATES" : systeme de coordonnees des noeuds ({X}, {X,Y}, {X,Y,Z}, {R,THETA}, etc...)
129 * Exceptions:
130 * - GenericFieldError::INVALID : query non comprise
131 *
132 */
134{
135 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
136}
137
138
139/*! @brief Renvoie le type des entites geometriques sur auxquelles les valeurs discretes sont attachees (NODE pour un champ P1, FACE pour un champ P1NC, ELEMENT pour un
140 *
141 * champ P0, etc). Il est conseille d'utiliser la syntaxe get_localisation() sans
142 * parametre, sauf si on sait quoi faire pour les champs multi-supports.
143 * @sa get_nb_localisations()
144 * Parametre : index
145 * Signification : index de la localisation demandee (pour les champs multi-support).
146 * Si index = -1 : si le champ est multi-support on leve une exception, sinon on renvoie le support.
147 * Si index >= 0 : on renvoie le i-ieme support.
148 * Valeur par defaut : -1
149 * Exceptions:
150 * - GenericFieldError::INVALID : le champ n'est pas discretise sur ces entites geometriques
151 * (il peut s'agir d'un champ analytique ou d'un champ multi-localisation), ou le champ
152 * est multi-support alors qu'on a demande index = -1, ou le support "index" n'existe pas.
153 *
154 */
155Entity Champ_Generique_base::get_localisation(const int index) const
156{
157 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
158}
159
161{
162 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
163}
164
165/*! @brief Renvoie une reference au tableau de valeurs discretes s'il existe en memoire.
166 *
167 * La reference est valide au moins jusqu'au prochain appel a une methode non const.
168 * Le maillage sur lequel ces valeurs sont definies est accessible par les methodes
169 * get_node_coordinates(), get_connectivity(), get_field_type().
170 * Exceptions:
171 * - GenericFieldError::XYZ_ONLY : les valeurs ne sont accessibles que par get_xyz_values
172 * - GenericFieldError::NO_REF : les valeurs ne sont pas stockees en memoire,
173 * il faut utiliser get_copy_values();
174 * - GenericFieldError::MESH_ONLY : le champ ne porte pas de valeurs, il sert uniquement a decrire une geometrie
175 *
176 */
178{
179 // Implementation par defaut : exception NO_REF
180 throw Champ_Generique_erreur("NO_REF");
181}
182
183/*! @brief Remplit le tableau values avec les valeurs discretes du champ (cree une copie).
184 *
185 * Exceptions:
186 * - GenericFieldError::XYZ_ONLY : les valeurs ne sont accessibles que par get_xyz_values
187 * - GenericFieldError::MESH_ONLY : le champ ne porte pas de valeurs, il sert uniquement a decrire une geometrie
188 *
189 */
190void Champ_Generique_base::get_copy_values(DoubleTab& values) const
191{
192 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
193}
194
195/*! @brief Calcule la valeur ponctuelle du champ aux coordonnees donnees dans coords et les met dans values.
196 *
197 * validity_flag est rempli avec 1 si la valeur est valide
198 * (coordonnees a l'interieur du domaine), 0 sinon.
199 * Attention en parallele:
200 * Chaque processeur traite le tableau coords qui lui est fourni : on peut soit faire
201 * calculer le meme tableau a tout le monde: dans ce cas, validity_flag indique sur
202 * chaque processeur quelles valeurs chaque processeur a pu calculer, soit on sait par
203 * avance quelles coordonnees sont calculable par chaque processeur et on donne au processeur
204 * local uniquement des coordonnees qu'il possede. Si une meme coordonnee est demandee
205 * a plusieurs processeurs, on ne garantit pas que tous donnent le meme resultat. En general,
206 * un seul aura le validity_flag mis pour cette coordonnee.
207 * Exceptions:
208 * - GenericFieldError::NOT_IMPLEMENTED : le paresseux n'a pas code les methodes d'interpolation
209 * il faut se debrouiller avec le maillage et les valeurs discretes.
210 * - GenericFieldError::MESH_ONLY : le champ ne porte pas de valeurs, il sert uniquement a decrire une geometrie
211 *
212 */
213void Champ_Generique_base::get_xyz_values(const DoubleTab& coords, DoubleTab& values, ArrOfBit& validity_flag) const
214{
215 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
216}
217
218/*! @brief Renvoie une reference au tableau des coordonnees des sommets du maillage support du champ, s'il existe.
219 *
220 * Le tableau a toujours deux dimensions :
221 * dimension(0) = nombre de sommets reels
222 * dimension(1) = get_dimension() (dimension de l'espace dans lequel est defini le champ)
223 * En parallele, le tableau est un tableau distribue avec items communs.
224 * Exceptions:
225 * - GenericFieldError::INVALID : le tableau n'existe pas (champ analytique ...)
226 * - GenericFieldError::NO_REF : les valeurs ne sont pas stockees en memoire,
227 * il faut utiliser get_copy_coordinates();
228 *
229 */
231{
232 // Implementation par defaut : exception NO_REF
233 throw Champ_Generique_erreur("NO_REF");
234}
235
236
238{
239 throw Champ_Generique_erreur("NO_REF");
240}
241
242/*! @brief Renvoie le tableau de connectivite entre l'entite geometrique index1 et l'entite index2.
243 *
244 * Par exemple
245 * get_ref_connectivity(ELEM, NODE) = Domaine::mes_elems
246 * get_ref_connectivity(ELEM, FACE) = DomaineVF::elem_faces_
247 * get_ref_connectivity(FACE, ELEM) = DomaineVF::face_voisins_
248 * Le tableau a toujours deux dimensions :
249 * dimension(0) = nombre d'entites "index1" reelles
250 * dimension(1) = nombre d'entites "index2" connectees a chaque entite "index1"
251 * En parallele, le tableau est un tableau distribue avec items communs
252 * Exceptions:
253 * - GenericFieldError::INVALID : le tableau n'existe pas (champ analytique ...)
254 * - GenericFieldError::NO_REF : les valeurs ne sont pas stockees en memoire,
255 * il faut utiliser get_copy_connectivity();
256 *
257 */
258const IntTab& Champ_Generique_base::get_ref_connectivity(Entity index1, Entity index2) const
259{
260 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
261}
262
263void Champ_Generique_base::get_copy_connectivity(Entity index1, Entity index2, IntTab&) const
264{
265 throw Champ_Generique_erreur("NOT_IMPLEMENTED");
266}
267
268/*! @brief Renvoie une ref au domaine sur lequel sera evalue l espace de stockage.
269 *
270 * Par defaut le domaine associe au probleme.
271 *
272 */
274{
275 const Objet_U& ob = interprete().objet(nom_pb_);
276 const Probleme_base& pb = ref_cast(Probleme_base,ob);
277 const Domaine& dom = pb.domaine_dis().domaine();
278 return dom;
279}
280
281
282/*! @brief Cree une copie du domaine sur lequel sera evalue l espace de stockage.
283 *
284 * Par defaut le domaine associe au probleme.
285 *
286 */
287void Champ_Generique_base::get_copy_domain(Domaine& domain) const
288{
289 const Domaine& dom = get_ref_domain();
290 domain = dom;
291}
292
293
294/*! @brief Renvoie une ref au domaine_discretisee du domaine sur lequel sera evalue l espace de stockage.
295 *
296 * Par defaut le domaine associe au probleme.
297 *
298 */
300{
301 const Objet_U& ob = interprete().objet(nom_pb_);
302 const Probleme_base& pb = ref_cast(Probleme_base,ob);
303 const Domaine_dis_base& domaine_dis = pb.domaine_dis();
304 return domaine_dis;
305}
306
307/*! @brief Renvoie une ref au domaine_cl_discretisee de l equation portant le champ cible.
308 *
309 */
314
316{
317 Motcle nom_champ;
318
319 const Noms nom_champ_post = get_property("nom");
320 nom_champ = Motcle(nom_champ_post[0]);
321 if (nom_champ == nom)
322 return true;
323
324 const Noms syno = get_property("synonyms");
325 for (int i = 0; i < syno.size(); i++)
326 {
327 nom_champ = Motcle(syno[i]);
328 if (nom_champ == nom)
329 return true;
330 }
331
332 const Noms composantes = get_property("composantes");
333 for (const auto &itr : composantes)
334 {
335 nom_champ = Motcle(itr);
336 if (nom_champ == nom)
337 return true;
338 }
339
340 return false; /* rien trouve */
341}
342
344{
345 OBS_PTR(Champ_Generique_base) ref_champ;
346
347 Motcle nom_champ;
348 const Noms nom_champ_post = get_property("nom");
349 nom_champ = Motcle(nom_champ_post[0]);
350
351 if (nom_champ==nom)
352 {
353 ref_champ = *this;
354 ref_champ->fixer_identifiant_appel(nom);
355 return ref_champ;
356 }
357 const Noms syno = get_property("synonyms");
358 int nb_syno = syno.size();
359 for (int i=0; i<nb_syno; i++)
360 {
361 nom_champ = Motcle(syno[i]);
362 if (nom_champ==nom)
363 {
364 ref_champ = *this;
365 ref_champ->fixer_identifiant_appel(nom);
366 return ref_champ;
367 }
368 }
369
370 {
371 const Noms composantes = get_property("composantes");
372 for (const auto& itr : composantes)
373 {
374 nom_champ = Motcle(itr);
375 if (nom_champ==nom)
376 {
377 ref_champ = *this;
378 ref_champ->fixer_identifiant_appel(nom);
379 return ref_champ;
380 }
381 }
382 }
383
384 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
385}
386
388{
389 Motcle nom_champ;
390 const Noms nom_champ_post = get_property("nom");
391 nom_champ = Motcle(nom_champ_post[0]);
392
393 if (nom_champ==identifiant)
394 return 1;
395 else
396 {
397 const Noms composantes = get_property("composantes");
398 for (const auto& itr : composantes)
399 {
400 nom_champ = Motcle(itr);
401 if (nom_champ==identifiant)
402 return 1;
403 }
404 }
405 return 0;
406}
class Champ_Generique_base
virtual const Noms get_property(const Motcle &query) const
Renvoie la propriete demandee.
virtual const Domaine_dis_base & get_ref_domaine_dis_base() const
Renvoie une ref au domaine_discretisee du domaine sur lequel sera evalue l espace de stockage.
virtual bool has_champ_post(const Motcle &nom) const
virtual void get_property_names(Motcles &list) const
Renvoie la liste des "query" possibles pour le champ.
virtual const IntTab & get_ref_connectivity(Entity index1, Entity index2) const
Renvoie le tableau de connectivite entre l'entite geometrique index1 et l'entite index2.
virtual int comprend_champ_post(const Motcle &identifiant) const
virtual void get_copy_connectivity(Entity index1, Entity index2, IntTab &) const
virtual void set_param(Param &param) const override=0
virtual const Champ_Generique_base & get_champ_post(const Motcle &nom) const
virtual const Domaine_Cl_dis_base & get_ref_zcl_dis_base() const
Renvoie une ref au domaine_cl_discretisee de l equation portant le champ cible.
virtual double get_time() const
Renvoie le temps du Champ_Generique_base.
virtual int get_dimension() const
Renvoie la dimension de l'espace dans lequel le champ est defini.
virtual void get_copy_values(DoubleTab &) const
Remplit le tableau values avec les valeurs discretes du champ (cree une copie).
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 int get_nb_localisations() const
virtual void get_copy_domain(Domaine &) const
Cree une copie du domaine sur lequel sera evalue l espace de stockage.
virtual const DoubleTab & get_ref_coordinates() const
Renvoie une reference au tableau des coordonnees des sommets du maillage support du champ,...
virtual void get_xyz_values(const DoubleTab &coords, DoubleTab &values, ArrOfBit &validity_flag) const
Calcule la valeur ponctuelle du champ aux coordonnees donnees dans coords et les met dans values.
virtual const DoubleTab & get_ref_values() const
Renvoie une reference au tableau de valeurs discretes s'il existe en memoire.
virtual const Nom & get_nom_post() const
virtual const Probleme_base & get_ref_pb_base() const
Renvoie le probleme qui porte le champ cible.
virtual Entity get_localisation(const int index=-1) const
Renvoie le type des entites geometriques sur auxquelles les valeurs discretes sont attachees (NODE po...
virtual void get_copy_coordinates(DoubleTab &) const
void nommer(const Nom &nom) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
virtual const Domaine & get_ref_domain() const
Renvoie une ref au domaine sur lequel sera evalue l espace de stockage.
virtual const Motcle get_directive_pour_discr() const
Renvoie la directive (champ_elem, champ_sommets, champ_face ou pression) pour lancer la discretisatio...
virtual const Discretisation_base & get_discretisation() const
Renvoie la discretisation associee au probleme.
OBS_PTR(Probleme_base) ref_pb_
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
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
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
friend class Entree
Definition Objet_U.h:76
const Interprete & interprete() const
Definition Objet_U.cpp:212
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
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
Classe de base des flux de sortie.
Definition Sortie.h:52