TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Probleme_Couple.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 <Schema_Euler_Implicite.h>
17#include <Probleme_Couple.h>
18#include <EcrFicCollecte.h>
19#include <Postraitement.h>
20#include <Equation_base.h>
21#include <Milieu_base.h>
22#include <TRUSTTabs.h>
23#include <Domaine_VF.h>
24#include <TRUST_2_PDI.h>
25#include <Ecrire_YAML.h>
26
27Implemente_instanciable(Probleme_Couple,"Probleme_Couple",Couplage_U);
28Implemente_instanciable(Probleme_Couple_Point_Fixe,"Probleme_Couple_Point_Fixe",Probleme_Couple);
29// XD coupled_problem pb_gen_base probleme_couple INHERITS_BRACE This instruction causes a probleme_couple type object
30// XD_CONT to be created. This type of object has an associated problem list, that is, the coupling of n problems among
31// XD_CONT them may be processed. Coupling between these problems is carried out explicitly via conditions at particular
32// XD_CONT contact limits. Each problem may be associated either with the Associate keyword or with the Read/groupes
33// XD_CONT keywords. The difference is that in the first case, the four problems exchange values then calculate their
34// XD_CONT timestep, rather in the second case, the same strategy is used for all the problems listed inside one group,
35// XD_CONT but the second group of problem exchange values with the first group of problems after the first group did
36// XD_CONT its timestep. So, the first case may then also be written like this: NL2 Probleme_Couple pbc NL2 Read pbc {
37// XD_CONT groupes { { pb1 , pb2 , pb3 , pb4 } } } NL2 There is a physical environment per problem (however, the same
38// XD_CONT physical environment could be common to several problems). NL2 Each problem is resolved in a domain. NL2
39// XD_CONT Warning : Presently, coupling requires coincident meshes. In case of non-coincident meshes, boundary
40// XD_CONT condition \'paroi_contact\' in VEF returns error message (see paroi_contact for correcting procedure).
41// XD attr groupes list_list_nom groupes OPT { groupes { { pb1 , pb2 } , { pb3 , pb4 } } }
42// XD ref domaine_2 domaine
43// XD ref pb_1 Pb_base
44// XD ref pb_2 Pb_base
45// XD ref pb_3 Pb_base
46// XD ref pb_4 Pb_base
47// XD ref scheme_2 schema_temps_base
48
49///////////////////////////////////////////////
50// //
51// Implementation de l'interface de Problem //
52// //
53///////////////////////////////////////////////
54
56{
57 /*
58 double& residu_max = schema_temps().residu();
59 double test=residu_max;
60 for (int i=1; i<nb_problemes(); i++)
61 residu_max = std::max(residu_max,sch_clones[i]->residu());
62 if (test!=residu_max) abort();
63 */
64 bool ok = Couplage_U::initTimeStep(dt);
65 return ok;
66}
67
68double Probleme_Couple::computeTimeStep(bool& stop) const
69{
70 double dt_=DMAXFLOAT;
71
72 // On prend le dt min.
73 // On stoppe si l'un des problemes veut stopper.
74 for (int i=0; i<nb_problemes(); i++)
75 {
76 double dt1=probleme(i).computeTimeStep(stop);
77 if (stop)
78 return 0;
79 if (dt1<dt_)
80 dt_=dt1;
81 }
82 return dt_;
83}
84
86{
87 // Trigger domain-specific time step logic at most once per distinct domain,
88 // even if several problems share it.
89 std::set<const Domaine*> processed_domains;
90 for (int i = 0; i < nb_problemes(); i++)
91 {
92 Probleme_base& pb = ref_cast(Probleme_base, probleme(i));
93 Domaine& dom = pb.domaine();
94 if (processed_domains.insert(&dom).second)
95 dom.mettre_a_jour(schema_temps().temps_courant(), pb.domaine_dis(), pb);
96 }
97
98 // WEC : A changer !!!!
99 if (sch_clones.size())
100 if (sub_type(Schema_Euler_Implicite,schema_temps()))
101 {
103 int ok = 1, cv;
104 cv = sch_eul_imp.faire_un_pas_de_temps_pb_couple(*this, ok);
105 if (!ok) return false;
106 // on propage un certain nombre de choses vers les clones
107 for (int i=1; i<sch_clones.size(); i++)
108 {
109 sch_clones[i]->facteur_securite_pas()=schema_temps().facteur_securite_pas();
110 sch_clones[i]->set_stationnaire_atteint()=schema_temps().stationnaire_atteint();
111 sch_clones[i]->residu()=schema_temps().residu();
112 }
113 return cv;
114 }
115
117 double& residu_max = schema_temps().residu();
118 for (int i=1; i<nb_problemes(); i++)
119 residu_max = std::max(residu_max,ref_cast(Probleme_base,probleme(i)).schema_temps().residu());
120 return ok;
121}
122
124{
125 std::vector<Schema_Euler_Implicite*> per_pb_schemas;
126 per_pb_schemas.reserve(nb_problemes());
127 for (int i = 0; i < nb_problemes(); i++)
128 {
129 Schema_Temps_base& sch_i = ref_cast(Probleme_base, probleme(i)).schema_temps();
130 if (!sub_type(Schema_Euler_Implicite, sch_i))
131 {
132 per_pb_schemas.clear();
133 break;
134 }
135 per_pb_schemas.push_back(&ref_cast(Schema_Euler_Implicite, sch_i));
136 }
137
138 if (int(per_pb_schemas.size()) != nb_problemes()) Process::exit("Probleme_Couple_Point_Fixe::solveTimeStep only works with problems using Schema_Euler_Implicite");
139
140 for (int i = 0; i < nb_problemes(); i++)
141 per_pb_schemas[i]->Initialiser_Champs(ref_cast(Probleme_base, probleme(i)));
142
143 const int max_fp_iter = 1000;
144 bool converged = false;
145 int compteur = 0;
146 int ok = 1;
147 int nb_iter_min = 0; // nombre minimum d'itérations avant de tester la convergence
148
149 while (compteur < nb_iter_min || (!converged && ok && compteur < max_fp_iter))
150 {
151 compteur++;
152 converged = true;
153
154 // 2. maillage
155 std::set<const Domaine*> processed_domains;
156 for (int i = 0; i < nb_problemes(); i++)
157 {
158 Probleme_base& pb = ref_cast(Probleme_base, probleme(i));
159 Domaine& dom = pb.domaine();
160 if (processed_domains.insert(&dom).second)
161 dom.mettre_a_jour(schema_temps().temps_courant(), pb.domaine_dis(), pb);
162 }
163
164 for (int i = 0; i < nb_problemes(); i++)
165 {
166 Probleme_base& pb = ref_cast(Probleme_base, probleme(i));
167 const double temps = per_pb_schemas[i]->temps_courant() + per_pb_schemas[i]->pas_de_temps();
168 for (int eq = 0; eq < pb.nombre_d_equations(); eq++)
170 }
171
172 // 1. problemes
173 for (int i = 0; ok && i < nb_problemes(); i++)
174 {
175 Probleme_base& pb = ref_cast(Probleme_base, probleme(i));
177 const int cv_pb = per_pb_schemas[i]->Iterer_Pb(pb, compteur, ok);
178 converged = converged && cv_pb;
179 }
180 }
181
182 if (!ok || !converged)
183 {
184 for (int i = 0; i < nb_problemes(); i++)
185 per_pb_schemas[i]->notify_failed_timestep();
186 if (limpr())
187 Cerr << le_nom() << " : Failure in Probleme_Couple_Point_Fixe::solveTimeStep after " << compteur << " iterations." << finl;
188 return false;
189 }
190
191 Cout << "Fixed-point convergence at t = " << schema_temps().temps_courant() << " in " << compteur << " iterations." << finl;
192 for (int i = 0; i < nb_problemes(); i++)
193 per_pb_schemas[i]->test_stationnaire(ref_cast(Probleme_base, probleme(i)));
194
195 double& residu_max = schema_temps().residu();
196 for (int i = 1; i < nb_problemes(); i++)
197 residu_max = std::max(residu_max, ref_cast(Probleme_base, probleme(i)).schema_temps().residu());
198
199 return ok;
200}
201
203{
204 bool ok=true;
205 converged=true;
206
207 int debut_gr=0;
208 int fin_gr=0;
209 int gr=0;
210 while(ok && fin_gr<nb_problemes())
211 {
212
213 if (gr<groupes.size_array())
214 fin_gr += groupes[gr++];
215 else
216 fin_gr=nb_problemes();
217
218 for(int i=debut_gr; ok && i<fin_gr; i++)
219 ok &= probleme(i).updateGivenFields();
220
221 for(int i=debut_gr; ok && i<fin_gr; i++)
222 {
223 bool cv;
224 ok &= probleme(i).iterateTimeStep(cv);
225 converged = converged && cv;
226 }
227
228 debut_gr=fin_gr;
229 }
230
231 return ok;
232}
233
234////////////////////////////////////////////////////////
235// //
236// Fin de l'implementation de l'interface de Problem //
237// //
238////////////////////////////////////////////////////////
239
241{
242
243 Cerr << "Reading of Probleme_Couple " << le_nom() << finl;
244
245 Motcle motlu;
246 is >> motlu;
247 if (motlu != Motcle("{"))
248 {
249 Cerr << "We expected { to start to read the Probleme_Couple" << finl;
250 exit();
251 }
252
253 is >> motlu;
254 while (motlu!=Motcle("}")) // fin du readOn
255 {
256
257 if (motlu != Motcle("groupes"))
258 {
259 Cerr << "The keyword " << motlu << " is not understood" << finl;
260 exit();
261 }
262
263 if (nb_problemes())
264 {
265 Cerr << "We can associate problems to Probleme_Couple" << finl;
266 Cerr << "* either by \"associer prob_couple pb\" (in which case they are all in the same group)" << finl;
267 Cerr << "* either by the keyword \"groupes\" while reading the object Probleme_Couple" << finl;
268 Cerr << "but not both!" << finl;
269 }
270 assert(nb_problemes()==0);
271
272 LIST(LIST(Nom)) les_noms;
273 is >> les_noms;
274
275 groupes.resize_array(les_noms.size());
276 for (int i=0; i<les_noms.size(); i++)
277 {
278 groupes[i]=les_noms[i].size();
279 for (int j=0; j<les_noms[i].size(); j++)
280 {
281 Nom nom_pb=les_noms[i][j];
282 Objet_U& ob=Interprete::objet(nom_pb);
283 Probleme_base& pb=ref_cast(Probleme_base,ob);
284 ajouter(pb);
285 }
286 }
287
288 is >> motlu;
289 }
290
291 return is;
292}
293
294/*! @brief Surcharge Objet_U::printOn(Sortie&) Imprime les problemes couples sur un flot de sortie.
295 *
296 * @param (Sortie& os) le flot de sortie sur lequel imprimer
297 * @return (Sortie&) le flot de sortie modifie
298 */
300{
301 for(int i=1; i< nb_problemes(); i++)
302 os << probleme(i) << finl;
303
304 return os;
305}
306
309
311{
312 // Pas de champs provenant de l'exterieur du couplage.
313 // Les echanges internes se font pendant iterateTimeStep.
314 return true;
315}
316
317/*! @brief Ajoute un probleme a la liste des problemes couples.
318 *
319 * Met en place la reference du probleme vers this.
320 * Verifie que l'ordre conduction, thHyd est respecte.
321 *
322 * @param (Probleme_base& pb) le probleme a ajouter au couplage
323 */
325{
326 addProblem(pb);
327 pb.associer_pb_couple(*this);
328
329 int nb_pb=nb_problemes();
330
331
332 Nom nom_pb=probleme(nb_pb-1).que_suis_je();
333 if (nb_pb!=1
334 && probleme(0).que_suis_je()=="Pb_Conduction"
335 && nom_pb.prefix("Turbulent") != probleme(nb_pb-1).que_suis_je())
336 {
337 Cerr << finl;
338 Cerr << "Warning !" << finl;
339 Cerr << "You define a conduction problem named "<<probleme(0).le_nom()<<" before your turbulent thermalhydraulic problem named "<<probleme(nb_pb-1).le_nom()<<"." << finl;
340 Cerr << "Please, define first your turbulent thermalhydraulic problem in your data file like:" << finl;
341 Cerr << finl;
342 Cerr << "Probleme_Couple "<<le_nom()<< finl;
343 for (int i=nb_pb-1; i>=0; i--)
344 Cerr << "Associer "<<le_nom()<<" "<<probleme(i).le_nom()<<finl;
345 Cerr << finl;
346 exit();
347 }
348}
350{
351 // On attribue la valeur 1 a schema_impr_ pour le schema du probleme 0 et 0 pour les autres. Un seul schema doit imprimer.
352 for (int i = 0; i < nb_problemes(); i++)
353 {
354 Probleme_base& pb = ref_cast(Probleme_base, probleme(i));
355 pb.schema_temps().schema_impr() = (i == 0);
356 }
357
359}
360
361/*! @brief Surcharge Objet_U::associer_(Objet_U&) Associe un objet au probleme couple, en verifiant le type
362 *
363 * dynamiquement. L'objet peut-etre:
364 * - un schema en temps (Schema_Temps_base), et on l'associe aux problemes
365 * - un probleme (Probleme_base), on l'ajoute a la liste
366 *
367 * @param (Objet_U& ob) l'objet a associer
368 * @return (int) 1 si l'association a reussie 0 sinon
369 * @throws l'objet n'est pas d'un type attendu
370 */
372{
373 if( sub_type(Schema_Temps_base, ob))
374 {
376 return 1;
377 }
378 else if( sub_type(Probleme_base, ob))
379 {
380 Probleme_base& pb = ref_cast(Probleme_base, ob);
381 ajouter(pb);
382 return 1;
383 }
384 else
385 return 0;
386}
387
388/*! @brief Associe une copie du schema en temps a chaque probleme du Probleme couple.
389 *
390 * @param (Schema_Temps_base& sch) le schema en temps a associer
391 */
393{
394 sch_clones.dimensionner(nb_problemes());
395 for (int i=0; i<nb_problemes(); i++)
396 {
397 sch_clones[i]=sch; // Clonage du schema
398 Probleme_base& pb=ref_cast(Probleme_base,probleme(i));
399 pb.associer_sch_tps_base(sch_clones[i].valeur()); // association
400 //On attribue la valeur 1 a schema_impr_ pour le schema du probleme 0
401 //et 0 pour les autres. Un seul schema doit imprimer.
402 if (i!=0) pb.schema_temps().schema_impr()=0;
403 }
404}
405/*! @brief Renvoie le schema en temps associe aux problemes couples.
406 *
407 * (version const)
408 *
409 * @return (Schema_Temps_base&) le schema en temps associe
410 */
412{
413 if (nb_problemes()==0)
414 {
415 Cerr << "You forgot to associate problems to the coupled problem named " << le_nom() << finl;
417 }
418 const Probleme_base& pb=ref_cast(Probleme_base,probleme(0));
419 return pb.schema_temps();
420}
421
422/*! @brief Renvoie le schema en temps associe aux problemes couples.
423 *
424 * @return (Schema_Temps_base&) le schema en temps associe
425 */
427{
428 if (nb_problemes()==0)
429 {
430 Cerr << "You forgot to associate problems to the coupled problem named " << le_nom() << finl;
432 }
433 Probleme_base& pb=ref_cast(Probleme_base,probleme(0));
434 return pb.schema_temps();
435}
436
437/*! @brief Associe une discretisation a tous les problemes du probleme couple.
438 *
439 * Appelle Probleme_Base::discretiser(const Discretisation_base&)
440 * sur chacun des problemes du probleme couple.
441 * voir Probleme_Base::discretiser(const Discretisation_base&)
442 *
443 * @param (Discretisation_base& dis) une discretisation pour tous les problemes
444 */
446{
447 // Loop to discretize each problem of the coupled problem:
448 for(int i=0; i< nb_problemes(); i++)
449 {
450 Cerr<<"The problem that we are starting to discretize is "<<probleme(i).le_nom()<<finl;
451 Probleme_base& pb=ref_cast(Probleme_base,probleme(i));
452 pb.discretiser(dis);
453 }
454}
455
457{
458 Ecrire_YAML yaml_file;
459 bool pdi_format = false;
460 Nom yaml_fname;
461 for (int i=0; i<nb_problemes(); i++)
462 {
463 const Probleme_base& pb=ref_cast(Probleme_base,probleme(i));
464 const Nom& format = pb.checkpoint_format();
465 if(Motcle(format) == "pdi")
466 {
467 if(i>0 && pb.yaml_filename() != yaml_fname)
468 {
469 Cerr << "Probleme_Couple::sauver() Error! You have provided different yaml files for each of your problems to initialize PDI. It has to be the same. " << finl;
471 }
472 yaml_fname = pb.yaml_filename();
473 const Nom& fname = pb.checkpoint_filename();
474 yaml_file.add_pb_base(pb, fname);
475 pdi_format = true;
476 }
477 }
478 // we need to initialize PDI with a yaml file that contains the information of all the problems with a PDI checkpoint format
479 // (allows to initialize PDI once for all checkpoints and not multiple times)
480 if(pdi_format && !TRUST_2_PDI::is_PDI_initialized())
481 {
482 if(yaml_fname == "??")
483 {
484 yaml_fname = Nom("save_") + le_nom() + Nom(".yml");
485 yaml_file.write_checkpoint_file(yaml_fname.getString());
486 }
487 TRUST_2_PDI::init(yaml_fname.getString());
488 }
489
490 for(int i=0; i<nb_problemes(); i++)
491 ref_cast(Probleme_base,probleme(i)).sauver();
492
493}
class Couplage_U
Definition Couplage_U.h:31
const Probleme_U & probleme(int i) const
Definition Couplage_U.h:127
void initialize() override
This method is called once at the beginning, before any other one of the interface Problem.
bool initTimeStep(double dt) override
This method allocates and initializes the unknown and given fields for the future time step.
int limpr() const override
Doit-on imprimer les statistiques d'execution maintenant ?
void addProblem(Probleme_U &)
Definition Couplage_U.h:112
int nb_problemes() const
Definition Couplage_U.h:117
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
virtual int calculer_coeffs_echange(double temps)
Calcul des coefficients d'echange pour les problemes couples thermiques.
virtual void mettre_a_jour(double temps, Domaine_dis_base &, Probleme_base &)
classe Ecrire_YAML Use this to generate a yaml file that will then be read by the PDI library (for ch...
Definition Ecrire_YAML.h:64
void write_checkpoint_file(const std::string &yaml_fname)
Generate the YAML file that will be read for checkpoint.
void add_pb_base(const Probleme_base &pb_base, const Nom &full_file_name)
Definition Ecrire_YAML.h:76
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
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
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Nom & prefix(const char *const)
Definition Nom.cpp:329
const std::string & getString() const
Definition Nom.h:92
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
bool solveTimeStep() override
pour recodage eventuel et appel unifie en python
classe Probleme_Couple C'est la classe historique de couplage de TRUST.
virtual void discretiser(Discretisation_base &)
Associe une discretisation a tous les problemes du probleme couple.
void sauver() const override
Sauvegarder l'etat du probleme sur disque.
bool initTimeStep(double dt) override
This method allocates and initializes the unknown and given fields for the future time step.
void initialize() override
This method is called once at the beginning, before any other one of the interface Problem.
double computeTimeStep(bool &stop) const override
Compute the value the Problem would like for the next time step.
virtual void associer_sch_tps_base(Schema_Temps_base &)
Associe une copie du schema en temps a chaque probleme du Probleme couple.
int associer_(Objet_U &) override
Surcharge Objet_U::associer_(Objet_U&) Associe un objet au probleme couple, en verifiant le type.
bool updateGivenFields() override
ATTENTION :
bool solveTimeStep() override
pour recodage eventuel et appel unifie en python
virtual const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe aux problemes couples.
void ajouter(Probleme_base &)
Ajoute un probleme a la liste des problemes couples.
bool iterateTimeStep(bool &converged) override
In the case solveTimeStep uses an iterative process, this method executes a single iteration.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
virtual bool iterateTimeStep(bool &converged)
In the case solveTimeStep uses an iterative process, this method executes a single iteration.
virtual bool solveTimeStep()
pour recodage eventuel et appel unifie en python
virtual bool updateGivenFields()
ATTENTION :
virtual double computeTimeStep(bool &stop) const
Compute the value the Problem would like for the next time step.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual void discretiser(Discretisation_base &)
Affecte une discretisation au probleme Discretise le Domaine associe au probleme avec la discretisati...
const Nom & checkpoint_filename() const
void associer_pb_couple(const Probleme_Couple &pbc)
const Nom & checkpoint_format() const
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
bool updateGivenFields() override
ATTENTION :
const Nom & yaml_filename() const
virtual void associer_sch_tps_base(const Schema_Temps_base &)
Associe un schema en temps au probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
virtual int faire_un_pas_de_temps_pb_couple(Probleme_Couple &, int &ok)
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
const double & residu() const
int stationnaire_atteint() const
double facteur_securite_pas() const
Renvoie le facteur de securite ou multiplicateur de delta_t.
Classe de base des flux de sortie.
Definition Sortie.h:52
static void init(std::string IO_config)
Definition TRUST_2_PDI.h:63
static int is_PDI_initialized()