TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Objet_a_lire.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 <Entree_complete.h>
17#include <Objet_a_lire.h>
18#include <Param.h>
19#include <string>
20
21Implemente_instanciable_sans_constructeur(Objet_a_lire,"Objet_a_lire",Objet_U);
22
23Objet_a_lire::Objet_a_lire() : int_a_lire(nullptr), tid_a_lire(nullptr), double_a_lire(nullptr), obj_a_lire(nullptr), objet_lu(nullptr),
24 arrofint_a_lire(nullptr), arrofdouble_a_lire(nullptr), flag_a_lire(nullptr) { }
25
27{
28 return Objet_U::readOn(is);
29}
30
32{
33 return Objet_U::printOn(os);
34}
35
37{
38 type = INTEGER;
39 int_a_lire = quoi;
40}
41
42void Objet_a_lire::set_tid(trustIdType *quoi)
43{
44 type = TRUSTID;
45 tid_a_lire = quoi;
46}
47
48void Objet_a_lire::set_double(double *quoi)
49{
50 type = DOUBLE;
51 double_a_lire = quoi;
52}
53
54void Objet_a_lire::set_string(std::string *quoi)
55{
56 type = STRING;
57 string_a_lire = quoi;
58}
59
61{
62 obj_a_lire = quoi;
63 type = OBJECT;
64}
65
66void Objet_a_lire::set_arrofint(ArrOfInt *quoi)
67{
68 arrofint_a_lire = quoi;
70}
71
72void Objet_a_lire::set_arrofdouble(ArrOfDouble *quoi)
73{
74 arrofdouble_a_lire = quoi;
76}
77
78
79void Objet_a_lire::set_vec_int(std::vector<int>*quoi)
80{
81 type = VEC_INT;
82 vec_int_a_lire = quoi;
83}
84void Objet_a_lire::set_vec_dbl(std::vector<double>*quoi)
85{
87 vec_double_a_lire = quoi;
88}
89void Objet_a_lire::set_vec_str(std::vector<std::string>*quoi)
90{
92 vec_str_a_lire = quoi;
93}
94
100
101void Objet_a_lire::set_map_int(std::map<std::string, int>*quoi)
102{
103 type = MAP_INT;
104 map_int_a_lire = quoi;
105}
106void Objet_a_lire::set_map_dbl(std::map<std::string, double>*quoi)
107{
109 map_double_a_lire = quoi;
110}
111void Objet_a_lire::set_map_str(std::map<std::string, std::string>*quoi)
112{
114 map_str_a_lire = quoi;
115}
116
122
124{
125 flag_a_lire = quoi;
126 // initialisation du flag a false
127 *flag_a_lire = false;
128 type = FLAG;
129}
130
132{
133 objet_lu = quoi;
134 type = NON_STD;
135}
137{
138 type = PARAM;
139 param_interne.create(aname);
140 return param_interne.valeur();
141}
142
144{
145 return (nature == OPTIONAL);
146}
147
149{
150 const auto& list = n.get_stl_list();
151 auto itr = list.begin();
152 name = *itr;
153 ++itr;
154
155 for ( ; itr != list.end(); ++itr) names.add(*itr);
156}
157
159{
160 if (mot == name) return 1;
161 for (const auto& itr : names)
162 if (mot == itr)
163 {
164 mot = name;
165 return 1;
166 }
167 return 0;
168}
169
171{
172 Nom titi(name);
173 int size = names.size();
174 for (int i = size - 1; i >= 0; i--)
175 {
176 titi += Nom("|");
177 titi += names(i);
178 }
179 return titi;
180}
181
183{
184 return name;
185}
186
187ptrParam& Objet_a_lire::add_dict(const char *nom_option, int valeur, const char *aname)
188{
189 // Le dictionnaire ne fonctionne que pour des parametres de type int:
190 assert(int_a_lire != 0);
191 // L'option ne doit pas encore exister dans le dictionnaire:
192 assert(dictionnaire_noms.search(nom_option) < 0);
193
194 dictionnaire_noms.add(nom_option);
195
196 dictionnaire_valeurs.append_array(valeur);
197 dictionnaire_params.add(ptrParam());
198 ptrParam& ptr = dictionnaire_params[dictionnaire_params.size() - 1];
199 if (aname != 0)
200 {
201 ptr.create(aname);
202 }
203 return ptr;
204}
209
211{
212 return ((type == INTEGER) || (type == DOUBLE) || (type == FLAG));
213}
214
216{
217 switch(type)
218 {
219 case INTEGER:
220 return (*int_a_lire);
221 case DOUBLE:
222 return (*double_a_lire);
223 case FLAG:
224 return (*flag_a_lire);
225 default:
226 Cerr << "get_value not coded for this case" << finl;
228 break;
229 }
230 // pour les compilos
231 return 0.;
232}
233
234
235
236
237namespace
238{
239
240template<typename T>
241T convert(std::string val);
242
243template <> int convert<int>(std::string val)
244{
245 return std::stoi(val);
246}
247template <> double convert<double>(std::string val)
248{
249 return std::stod(val);
250}
251template <> std::string convert<std::string>(std::string val)
252{
253 return val;
254}
255
256void expect_word(Entree& is, std::string word)
257{
258 std::string read;
259 is>> read;
260 if (read != word)
261 {
262 Cerr << Nom("From expect_word in Objet_a_lire.cpp: Expected to read: ") + word << finl;
263 Cerr << Nom("Found: ") + read << finl;
265 }
266
267}
268
269template<typename T>
270std::vector<T> read_vec_impl(
271 Motcle const& motcle,
272 Entree& is,
273 std::function<T(Entree&, std::string /*first_token*/)> read_value,
274 int expected_size = -1)
275{
276 std::vector<T> vec;
277
278 std::string first;
279 is >> first;
280
281 if (first == "[")
282 {
283 // Bracket syntax: [ a, b, c ]
284 std::string token;
285 is >> token;
286
287 while (token != "]")
288 {
289 try
290 {
291 vec.push_back(read_value(is, token));
292 }
293 catch (std::exception& e)
294 {
295 Cerr << "In keyword " << motcle
296 << ", invalid value led to exception: " << e.what() << finl;
298
299 }
300 is >> token;
301
302 if (token == ",")
303 {
304 is >> token; // either next element or "]"
305 }
306 else if (token != "]")
307 {
308 Cerr << "In keyword " << motcle
309 << ", expected ',' or ']', found: " << token << finl;
311 }
312 }
313 }
314 else
315 {
316 // Size-prefixed syntax: N a b c ...
317 int size=-1; // for non init warning. this default value CANNOT be used
318 try
319 {
320 size = std::stoi(first);
321 }
322 catch (...)
323 {
324 Cerr << "In keyword " << motcle
325 << ", expected '[' or an integer size, found: " << first << finl;
327 }
328
329 if (expected_size >= 0 && size != expected_size)
330 {
331 Cerr << "In keyword " << motcle << ", declared size " << size
332 << " does not match expected size " << expected_size << finl;
334 }
335
336 vec.reserve(static_cast<size_t>(size));
337 for (int i = 0; i < size; i++)
338 {
339 std::string token;
340 is >> token;
341 try
342 {
343 vec.push_back(read_value(is, token));
344 }
345 catch (std::exception& e)
346 {
347 Cerr << "In keyword " << motcle
348 << ", invalid value led to exception: " << e.what() << finl;
350
351 }
352 }
353 }
354
355 // Check final size against expected_size (applies to bracket syntax too)
356 if (expected_size >= 0 && (int)vec.size() != expected_size)
357 {
358 Cerr << "In keyword " << motcle << ", read " << vec.size()
359 << " elements but expected " << expected_size << finl;
361 }
362
363 return vec;
364}
365
366template<typename T>
367std::vector<T> read_vec_any(Motcle const& motcle, Entree& is, int expected_size = -1)
368{
369 return read_vec_impl<T>(motcle, is,
370 [](Entree& /*is*/, std::string first_token) -> T
371 {
372 return convert<T>(first_token);
373 }, expected_size);
374}
375
376std::vector<DerObjU> read_vec_derObjU(Motcle const& motcle, Entree& is, int expected_size = -1)
377{
378 return read_vec_impl<DerObjU>(motcle, is,
379 [](Entree& is_in, std::string type_str) -> DerObjU
380 {
381 DerObjU obj;
382 obj.typer(type_str.c_str());
383 is_in >> obj.valeur();
384 return obj;
385 }, expected_size);
386}
387
388template<typename T>
389std::map<std::string, T> read_map_impl(
390 Motcle const& motcle,
391 Entree& is,
392 std::function<T(Entree&, std::string /*first_token*/)> read_value)
393{
394 std::map<std::string, T> map;
395
396 expect_word(is, "{");
397
398 std::string key;
399 is >> key;
400
401 // case of an empty map
402 if (key == "}") {return map;}
403
404 bool with_colon_and_comma = false;
405
406 std::string first_token;
407 is >> first_token;
408
409 bool has_colon = (first_token == ":");
410 if (has_colon)
411 {
412 with_colon_and_comma = true;
413 std::string actual_first;
414 is >> actual_first;
415 first_token = actual_first;
416 }
417
418 T val = read_value(is, first_token);
419
420 while (true)
421 {
422 if (map.find(key)!=map.end())
423 {
424 Cerr << "Duplicate key '" << key << "' found for param: " << motcle << finl;
426 }
427 map[key] = val;
428
429 if (with_colon_and_comma)
430 {
431 // At this point, the next word should be either a comma or a closing brace
432 std::string sep;
433 is >> sep;
434
435 // because comma is not needed at the end, we do that:
436 // if after a 'key : value' pair, there is a closing brace, stop
437 // if there is a comma, read next word into key
438 // if it was none of them, syntax is not valid
439 // then, if after this the key is a closing brace, stop reading
440 // this allows trailing comma at the end
441
442 if (sep == "}") break;
443 else if (sep == ",") is >> key;
444 else
445 {
446 Cerr << "In keyword " << motcle
447 << ", expected to read either a comma (,) or closing brace (}). Found "
448 << sep << finl;
450 }
451
452 if (key == "}") break;
453
454 // after a key, there must be a colon
455 expect_word(is, ":");
456
457 // then we can read a value and fill the map
458 std::string next_first;
459 is >> next_first;
460 try
461 {
462 val = read_value(is, next_first);
463 }
464 catch (std::exception& e)
465 {
466 Cerr << "In keyword " << motcle
467 << ", invalid value led to exception: " << e.what() << finl;
469
470 }
471 }
472 else
473 {
474 // this case is much simpler: less chars, no handling of trailing commas
475 is >> key;
476 if (key == "}") break;
477
478 std::string next_first;
479 is >> next_first;
480
481 try
482 {
483 val = read_value(is, next_first);
484 }
485 catch (std::exception& e)
486 {
487 Cerr << "In keyword " << motcle
488 << ", invalid value led to exception: " << e.what() << finl;
490
491 }
492 }
493 }
494
495 return map;
496}
497template<typename T>
498std::map<std::string, T> read_map_any(Motcle const& motcle, Entree& is)
499{
500 return read_map_impl<T>(motcle, is,
501 [](Entree& /*is*/, std::string first_token) -> T
502 {
503 return convert<T>(first_token);
504 });
505}
506
507std::map<std::string, DerObjU> read_map_derObjU(Motcle const& motcle, Entree& is)
508{
509 return read_map_impl<DerObjU>(motcle, is,
510 [](Entree& is_in, std::string type_str) -> DerObjU
511 {
512 DerObjU obj;
513 obj.typer(type_str.c_str());
514 is_in >> obj.valeur();
515 return obj;
516 });
517}
518
519}
520
521
522
523
524void Objet_a_lire::read(Motcle const& motcle, Entree& is)
525{
526 int ret = -1;
527 switch(type)
528 {
529 case INTEGER:
530 if (dictionnaire_noms.size() == 0)
531 {
532 is >> *int_a_lire;
533 }
534 else
535 {
536 Motcle motlu;
537 is >> motlu;
538 const int rang = dictionnaire_noms.search(motlu);
539 if (rang < 0)
540 {
541 Cerr << "Error while reading parameter " << name << "\n Found: " << motlu << "\n Expected one on these keywords: " << dictionnaire_noms << finl;
542 barrier();
543 exit();
544 }
546 ptrParam& ptr = dictionnaire_params[rang];
547 if (ptr)
548 {
550 }
551 }
552 break;
553 case TRUSTID:
554 is >> (*tid_a_lire);
555 break;
556 case DOUBLE:
557 is >> (*double_a_lire);
558 break;
559 case STRING:
560 is >> (*string_a_lire);
561 break;
562 case OBJECT:
563 is >> (*obj_a_lire);
564 break;
565 case FLAG:
566 (*flag_a_lire) = true;
567 break;
568 case NON_STD:
569 ret = (*objet_lu).lire_motcle_non_standard(motcle, is);
570 if (ret < 0)
571 {
572 Cerr << "Error while reading keyword: '" << motcle << "'. Not recognized!" << finl;
573 Process::exit(-1);
574 }
575 break;
576 case DERIV:
577 {
578 Motcle type_complet(prefixe_deriv);
579 Motcle the_type;
580 is >> the_type;
581 type_complet += the_type;
582 Entree_complete is2(type_complet, is);
583 is2 >> (*obj_a_lire);
584 break;
585 }
587 {
588 ArrOfInt& arr = *arrofint_a_lire;
589 int size = arr.size_array();
590 // on ne veut pas de taille nulle pour etre sur que l'utilisateur a bien fait dimensionner...
591 assert(size > 0);
592 for (int i = 0; i < size; i++)
593 is >> arr[i];
594 break;
595 }
597 {
598 ArrOfDouble& arr = *arrofdouble_a_lire;
599 int size = arr.size_array();
600 // on ne veut pas de taille nulle pour etre sur que l'utilisateur a bien fait dimensionner...
601 assert(size > 0);
602 for (int i = 0; i < size; i++)
603 is >> arr[i];
604 break;
605 }
606 case PARAM:
607 {
608 param_interne->lire_avec_accolades_depuis(is);
609 break;
610 }
611 case VEC_INT:
612 {
613 *vec_int_a_lire = read_vec_any<int>(motcle, is, expected_vec_size_);
614 break;
615 }
616 case VEC_DOUBLE:
617 {
618 *vec_double_a_lire = read_vec_any<double>(motcle, is, expected_vec_size_);
619 break;
620 }
621 case VEC_STRING:
622 {
623 *vec_str_a_lire = read_vec_any<std::string>(motcle, is, expected_vec_size_);
624 break;
625 }
626 case VEC_OBJET_U:
627 {
628 auto read = read_vec_derObjU(motcle, is, expected_vec_size_);
630 break;
631 }
632 case MAP_INT:
633 {
634 *map_int_a_lire = read_map_any<int>(motcle, is);
635 break;
636 }
637 case MAP_DOUBLE:
638 {
639 *map_double_a_lire = read_map_any<double>(motcle, is);
640 break;
641 }
642 case MAP_STRING:
643 {
644 *map_str_a_lire = read_map_any<std::string>(motcle, is);
645 break;
646 }
647 case MAP_OBJET_U:
648 {
649 auto read = read_map_derObjU(motcle, is);
651 break;
652 }
653 default:
654 Cerr << "Invalid parameter type" << finl;
656 break;
657 }
658}
659
Cette classe se comporte comme EChaine tant que l'on n'est pas a la fin de la chaine.
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
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Objet_U * typer(const char *nom_type)
Essaie de creer une instance du type "type".
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
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
void set_map_obj_initializer(map_obj_initializer_t)
void set_objet(Objet_U *)
bool is_optional() const
void set_map_int(std::map< std::string, int > *)
void set_tid(trustIdType *)
std::string * string_a_lire
std::function< void(std::map< std::string, DerObjU > &)> map_obj_initializer_t
void set_double(double *)
void read(const Motcle &keyword, Entree &is)
double * double_a_lire
void set_vec_int(std::vector< int > *)
void set_vec_dbl(std::vector< double > *)
void set_vec_obj_initializer(vec_obj_initializer_t)
Objet_a_lire::Type type
int comprend_name(Motcle &mot) const
void set_map_str(std::map< std::string, std::string > *)
void set_arrofint(ArrOfInt *)
void set_flag(bool *)
std::vector< int > * vec_int_a_lire
void set_nature(Objet_a_lire::Nature n)
ArrOfInt * arrofint_a_lire
double get_value() const
bool * flag_a_lire
Motcle prefixe_deriv
trustIdType * tid_a_lire
void set_map_dbl(std::map< std::string, double > *)
std::map< std::string, int > * map_int_a_lire
LIST(Nom) names
Motcles dictionnaire_noms
std::vector< double > * vec_double_a_lire
Objet_U * obj_a_lire
void set_arrofdouble(ArrOfDouble *)
ArrOfDouble * arrofdouble_a_lire
ArrOfInt dictionnaire_valeurs
void set_entier(int *)
std::vector< std::string > * vec_str_a_lire
std::function< void(std::vector< DerObjU > &)> vec_obj_initializer_t
ptrParam & add_dict(const char *, int, const char *=0)
Nom get_names_message() const
std::map< std::string, std::string > * map_str_a_lire
void set_non_std(Objet_U *)
void set_vec_str(std::vector< std::string > *)
std::map< std::string, double > * map_double_a_lire
bool is_type_simple() const
vec_obj_initializer_t vec_obj_initializer
ptrParam param_interne
map_obj_initializer_t map_obj_initializer
void set_name(const LIST(Nom)&n)
const Nom & get_name() const
Param & create_param(const char *)
void set_string(std::string *)
Objet_U * objet_lu
Objet_a_lire::Nature nature
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
Definition Param.cpp:32
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
Definition Process.cpp:136
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_ size_array() const
const Objet_U & valeur() const
class Objet_a_lire : contient un nom, et une reference vers un int,double,flag,un Objet_U a lire,...
Definition ptrParam.h:27
void create(const char *)
Definition ptrParam.cpp:32