TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Probleme_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 <Discretisation_base.h>
17#include <Domaine_Cl_dis_base.h>
18#include <Loi_Fermeture_base.h>
19#include <Domaine_dis_base.h>
20#include <Probleme_base.h>
21#include <Synonyme_info.h>
22#include <Postraitement.h>
23#include <Perf_counters.h>
24#include <EChaine.h>
25#include <Perf_counters.h>
26#include <Debog.h>
27
28Implemente_base_sans_destructeur(Probleme_base,"Probleme_base",Probleme_U);
29
30// XD pb_gen_base objet_u pb_gen_base INHERITS_BRACE Basic class for problems.
31
32// XD Pb_base pb_gen_base Pb_base BRACE Resolution of equations on a domain. A problem is defined by creating an object
33// XD_CONT and assigning the problem type that the user wishes to resolve. To enter values for the problem objects
34// XD_CONT created, the Lire (Read) interpretor is used with a data block.
35// XD attr milieu milieu_base milieu OPT The medium associated with the problem.
36// XD attr constituant constituant constituant OPT Constituent.
37// XD attr postraitement|Post_processing corps_postraitement postraitement OPT One post-processing (without name).
38// XD attr postraitements|Post_processings postraitements postraitements OPT List of Postraitement objects (with name).
39// XD attr liste_de_postraitements liste_post_ok liste_de_postraitements OPT This
40// XD attr liste_postraitements liste_post liste_postraitements OPT This block defines the output files to be written
41// XD_CONT during the computation. The output format is lata in order to use OpenDX to draw the results. This block can
42// XD_CONT be divided in one or several sub-blocks that can be written at different frequencies and in different
43// XD_CONT directories. Attention. The directory lata used in this example should be created before running the
44// XD_CONT computation or the lata files will be lost.
45// XD attr sauvegarde format_file_base sauvegarde OPT Keyword used when calculation results are to be backed up. When a
46// XD_CONT coupling is performed, the backup-recovery file name must be well specified for each problem. In this case,
47// XD_CONT you must save to different files and correctly specify these files when resuming the calculation.
48// XD attr sauvegarde_simple format_file_base sauvegarde_simple OPT The same keyword than Sauvegarde except, the last
49// XD_CONT time step only is saved.
50// XD attr reprise format_file_base reprise OPT Keyword to resume a calculation based on the name_file file (see the
51// XD_CONT class format_file). If format_reprise is xyz, the name_file file should be the .xyz file created by the
52// XD_CONT previous calculation. With this file, it is possible to resume a parallel calculation on P processors,
53// XD_CONT whereas the previous calculation has been run on N (N<>P) processors. Should the calculation be resumed,
54// XD_CONT values for the tinit (see schema_temps_base) time fields are taken from the name_file file. If there is no
55// XD_CONT backup corresponding to this time in the name_file, TRUST exits in error.
56// XD attr resume_last_time format_file_base resume_last_time OPT Keyword to resume a calculation based on the name_file
57// XD_CONT file, resume the calculation at the last time found in the file (tinit is set to last time of saved files).
58// XD attr transparent_medium_radiation_model transparent_medium_radiation_model modele_rayonnement_milieu_transparent OPT Read a transparent medium radiation model associated to a fluid problem
59
60// XD ref domaine domaine
61// XD ref scheme schema_temps_base
62// XD ref loi1 loi_fermeture_base
63// XD ref loi2 loi_fermeture_base
64// XD ref loi3 loi_fermeture_base
65// XD ref loi4 loi_fermeture_base
66// XD ref loi5 loi_fermeture_base
67
68// XD problem_read_generic Pb_base problem_read_generic INHERITS_BRACE The probleme_read_generic differs rom the rest of
69// XD_CONT the TRUST code : The problem does not state the number of equations that are enclosed in the problem. As the
70// XD_CONT list of equations to be solved in the generic read problem is declared in the data file and not pre-defined
71// XD_CONT in the structure of the problem, each equation has to be distinctively associated with the problem with the
72// XD_CONT Associate keyword.
73// XD ref eqn1 eqn_base
74// XD ref eqn2 eqn_base
75// XD ref eqn3 eqn_base
76// XD ref eqn4 eqn_base
77// XD ref eqn5 eqn_base
78// XD ref eqn6 eqn_base
79// XD ref eqn7 eqn_base
80// XD ref eqn8 eqn_base
81// XD ref eqn9 eqn_base
82// XD ref eqn10 eqn_base
83
84
85// XD constituant milieu_base constituant INHERITS_BRACE Constituent.
86// XD attr coefficient_diffusion field_base coefficient_diffusion REQ Constituent diffusion coefficient value (m2.s-1).
87// XD_CONT If a multi-constituent problem is being processed, the diffusivite will be a vectorial and each components
88// XD_CONT will be the diffusion of the constituent.
89// XD attr is_multi_scalar rien is_multi_scalar_diffusion OPT Flag to activate the multi_scalar diffusion operator
90
91// XD format_file_base objet_lecture nul NO_BRACE Format of the file
92// XD attr checkpoint_fname chaine checkpoint_fname REQ Name of file.
93
94// XD binaire format_file_base binaire INHERITS_BRACE Format of the file - binary version
95// XD formatte format_file_base formatte INHERITS_BRACE Format of the file - formatte version
96// XD xyz format_file_base xyz INHERITS_BRACE Format of the file - xyz version
97// XD single_hdf format_file_base single_hdf INHERITS_BRACE Format of the file - single_hdf version
98// XD pdi format_file_base pdi INHERITS_BRACE Format of the file - pdi version
99
100// XD pdi_expert format_file_base pdi_expert BRACE Format of the file - PDI expert version
101// XD attr yaml_fname chaine yaml_fname REQ YAML file name
102
103// Variables globales pour initialiser est_le_premier_postraitement_pour_nom_fic
104// et est_le_dernier_postraitement_pour_nom_fic en une seule passe.
105LIST(Nom) glob_noms_fichiers;
106LIST(OBS_PTR(Postraitement)) glob_derniers_posts;
107
109{
110 for (int i = 0; i < nombre_d_equations(); i++)
111 os << equation(i).que_suis_je() << " " << equation(i) << finl;
113 os << le_domaine_dis_.valeur();
114 return os;
115}
116
117/*! @brief Lecture d'un probleme dans un flot d'entree, et ouverture du flot de sauvegarde.
118 *
119 * Format:
120 * {
121 * nom_milieu bloc de lecture d'un milieu
122 * nom_equation bloc de lecture d'une equation
123 * Postraitement bloc de lecture postraitement
124 * reprise | sauvegarde | sauvegarde_simple
125 * formatte | binaire | pdi
126 * nom_de_fichier
127 * }
128 * L'option sauvegarde_simple permet de sauver le probleme dans le fichier choisi
129 * en ecrasant a chaque fois les sauvegardes precedentes : cela permet d'economiser de la place disque.
130 *
131 * @param (Entree& is) flot d'entree
132 * @return (Entree&) le flot d'entre modifie
133 * @throws pas d'accolade ouvrante en debut de format
134 * @throws mot clef "Postraitement" n'est pas la
135 * @throws format de sauvegarde doit etre "binaire" ou "formatte"
136 * @throws pas d'accolade fermante en fin de jeu de donnee
137 */
139{
140 Cerr << "Reading of the problem " << le_nom() << finl;
141 Motcle motlu;
142 is >> motlu;
143 if (motlu != "{")
144 Process::exit("We expected { to start to read the problem !!! \n");
145
146 /* 1 : solved_equations + milieu : NEW SYNTAX */
149
150 /* 2 : On lit les equations */
151 lire_equations(is, motlu); //"motlu" contient le premier mot apres la lecture des equations
152
153 /* 3 : Les postraitements */
154 // Si le postraitement comprend le mot, on en lit un autre...
155 while (les_postraitements_.lire_postraitements(is, motlu, *this))
156 {
157 is >> motlu;
158 }
159
160 /* 4 : On complete ... */
161 completer();
162 Cerr << "Step verification of data being read in progress..." << finl;
163
164 /* 5 : On verifie ... */
165 verifier();
166 Cerr << "The read data are coherent" << finl;
167
168 /* 6 : gestion sauvegarde/reprise ... */
169 save_restart_.lire_sauvegarde_reprise(is, motlu);
170
171 return is ;
172}
173
175{
176 // NOTA BENE :
177 // Normalement on a un milieu par probleme, sauf si le problem contient une equation de concentration
178 // Dans ce cas, on a un milieu supplementaire : constituant (faut pas demander pourquoi 2 milieu ... car je sais pas !). a voir si on peut faire mieux ...
179 int nb_milieu = 1;
180
181 // On cherche si c'est un pb avec concentration => avec constituant
182 const std::string conc = "Concentration", scal_pass = "Scalaires_Passifs", nom_pb = que_suis_je().getString();
183 if (nom_pb.find(conc) != std::string::npos) nb_milieu = 2; // pb contient concentration !
184
185 le_milieu_.resize(nb_milieu);
186
187 for (int i = 0; i < nb_milieu; i++)
188 {
189 le_milieu_[i].typer_lire_simple(is, "Typing the medium ..."); // On commence par la lecture du milieu
190 associer_milieu_base(le_milieu_[i].valeur()); // On l'associe a chaque equations (methode virtuelle pour chaque pb ...)
191 }
192
193 // Milieu(x) lu(s) ... Lets go ! On discretise les equations
195
196 // remontee de l'inconnue vers le milieu
197 for (int i = 0; i < nombre_d_equations(); i++) equation(i).associer_milieu_equation();
198
199 const bool is_constituant = nb_milieu == 1 ? false : true, is_scal_pass = (nom_pb.find(scal_pass) != std::string::npos) ? true : false;
200 const int ns_ou_cond_eq = 0;
201 int conc_eq = 1; // pas const !
202
203 // On discretise le/les milieu/x ... Et l'eq de concentration !
204 if (is_constituant)
205 {
206 assert (nombre_d_equations() > 1);
207 if (nombre_d_equations() == 2)
208 for (int i = 0; i < nombre_d_equations(); i++) equation(i).milieu().discretiser((*this), la_discretisation_.valeur());
209 else if (nombre_d_equations() == 3)
210 {
211 // On a 2 Cas :
212 // - Pb_Thermohydraulique_Concentration (NS, Thermique, Conc)
213 // - Pb_Hydraulique_Concentration_Scalaires_Passifs (NS, Conc + Equations_Scalaires_Passifs (la lise) !)
214 conc_eq = is_scal_pass ? 1 /* conc_eq */ : 2;
215 equation(ns_ou_cond_eq).milieu().discretiser((*this), la_discretisation_.valeur()); // NS
216 equation(conc_eq).milieu().discretiser((*this), la_discretisation_.valeur()); // Conc
217 }
218 else
219 {
220 // Cas rare : Pb_Thermohydraulique_Concentration_Scalaires_Passifs
221 // Ici on a NS, Thermique, Conc + Equations_Scalaires_Passifs (la lise) !
222 assert (nombre_d_equations() == 4);
223 conc_eq = 2;
224 equation(ns_ou_cond_eq).milieu().discretiser((*this), la_discretisation_.valeur()); // NS
225 equation(conc_eq).milieu().discretiser((*this), la_discretisation_.valeur()); // Conc
226 }
227 }
228 else /* On discretise le milieu de l'eq 1 et c'est tout :-) :-) */
229 equation(ns_ou_cond_eq).milieu().discretiser((*this), la_discretisation_.valeur());
230}
231
232/*! @brief Lecture des equations du probleme.
233 *
234 */
236{
237 const int nb_eq = nombre_d_equations();
238 is >> mot;
239 if (nb_eq == 0)
240 return is;
241
242 bool already_read = true;
243
244 if (mot == "correlations")
245 {
246 Cerr << "Reading of the correlations ..." << finl;
248 already_read = false;
249 }
250
251 if (mot == "Modele_rayonnement_milieu_transparent" || mot == "Transparent_medium_radiation_model")
252 {
253 Cerr << "Reading of the radiation model ..." << finl;
254 lire_radiation_models(is, mot);
255 already_read = false;
256 }
257
258 Cerr << "Reading of the equations ..." << finl;
259
260 for (int i = 0; i < nb_eq; i++)
261 {
262 if (!already_read)
263 is >> mot;
264
265 is >> getset_equation_by_name(mot);
266 already_read = false;
267 }
268
270
271 return is;
272}
273
275{
276 Cerr << "The use of a transparent radiation model is not authorized for your problem " << que_suis_je() << " !!!" << finl;
277 Cerr << "This model should only be used with a fluid problem. Update your data file." << finl;
279 return is;
280}
281
282/*! @brief Associe le probleme a toutes ses equations.
283 *
284 */
286{
287 save_restart_.assoscier_pb_base(*this);
288
289 for (int i = 0; i < nombre_d_equations(); i++)
290 equation(i).associer_pb_base(*this);
291}
292
293/*! @brief surcharge Objet_U::associer_(Objet_U& ob) Associe differents objets au probleme en controlant
294 *
295 * le type de l'objet a associer a l'execution.
296 * On peut ainsi associer: un schema en temps, un domaine de calcul.
297 * Utilise les routine de la classe Type_Info (Utilitaires)
298 *
299 * @param (Objet_U& ob) l'objet a associer
300 * @return (int) 1 si association reussie 0 sinon 2 si le milieu est deja associe a un autre probleme
301 * @throws Objet_U de type inconnu (non prevu)
302 */
304{
305 if (sub_type(Schema_Temps_base, ob))
306 {
308 return 1;
309 }
310 if (sub_type(Domaine, ob))
311 {
312 associer_domaine(ref_cast(Domaine, ob));
313 return 1;
314 }
315 if (sub_type(Loi_Fermeture_base,ob))
316 {
317 Loi_Fermeture_base& loi=ref_cast(Loi_Fermeture_base,ob);
318 liste_loi_fermeture_.add(loi);
319 loi.associer_pb_base(*this);
320 return 1;
321 }
322 if (sub_type(Domaine_32_64<trustIdType>, ob))
323 {
324 Cerr << "ERROR: You are trying to associate a 64-bit Domain to a Problem!" << finl;
325 Cerr <<" -> Keyword 'Domain_64' can *not* be used for a sequential run!" << finl;
326 Cerr<< " -> Keyword 'Domain_64' can only be used for initial partitioning. It must be changed into 'Domain' in the PAR_xxx dataset when running the parallel computation itself!" << finl;
328 }
329 if (sub_type(Milieu_base, ob))
330 {
331 Cerr << "YOU ARE USING AN OLD SYNTAX IN YOUR DATA FILE AND THIS IS NO MORE SUPPORTED !" << finl;
332 Cerr << "STARTING FROM TRUST-v1.9.3 : THE MEDIUM SHOULD BE READ INSIDE THE PROBLEM AND NOT VIA ASSOSCIATION ... " << finl;
333 Cerr << "HAVE A LOOK TO ANY TRUST TEST CASE TO SEE HOW IT SHOULD BE DONE ($TRUST_ROOT/tests/) ... " << finl;
334 Cerr << "OR RUN -convert_data OPTION OF YOUR APPLICATION SCRIPT, FOR TRUST FOR EXAMPLE:" << finl;
335 Cerr << " trust -convert_data " << Objet_U::nom_du_cas() << ".data" << finl;
337 }
338 return 0;
339}
340
341/*! @brief Complete les equations associees au probleme.
342 *
343 * Remplissage des references, deleguee aux equations.
344 *
345 */
347{
348 // Cerr << "Probleme_base::completer()" << finl;
349 for (int i = 0; i < nombre_d_equations(); i++)
350 equation(i).completer();
351
352 for (auto& itr : liste_loi_fermeture_)
353 itr->completer();
354
355 les_postraitements_.completer();
356
357 for (auto &corr : correlations_)
358 corr.second->completer();
359}
360
361/*! @brief Verifie que l'objet est complet, coherent, .
362 *
363 * .. NON DEVELOPPE RENVOIE TOUJOURS 1
364 *
365 * @return (int) 1 si l'objet est correct
366 */
368{
369 return 1;
370}
371
372/*! @brief Associe un domaine au probleme.
373 *
374 * Prend un_domaine comme support.
375 * apelle Domaine_dis::associer_dom(const Domaine& )
376 *
377 * @param (Domaine& un_domaine) le domaine
378 */
379void Probleme_base::associer_domaine(const Domaine& un_domaine)
380{
381 le_domaine_ = un_domaine;
382 statistics().record_nb_elem(un_domaine.nb_elem());
383}
384
386{
387 Cerr << "Discretization of the equations of problem " << que_suis_je() << " ..." << finl;
388 for (int i = 0; i < nombre_d_equations(); i++)
389 {
392 }
393}
394
395/*! @brief Affecte une discretisation au probleme Discretise le Domaine associe au probleme avec la discretisation
396 *
397 * Associe le premier Domaine aux equations du probleme
398 * Discretise les equations associees au probleme
399 *
400 * @param (Discretisation_base& discretisation) une discretisation pour le probleme
401 */
403{
404 associer();
405 la_discretisation_ = une_discretisation;
406 Cerr << "Discretization of the domain associated with the problem " << le_nom() << finl;
407
408 if (!le_domaine_)
409 Process::exit("ERROR: Discretize - You're trying to discretize a problem without having associated a Domain to it!!! Fix your dataset.");
410
411 // Initialisation du tableau renum_som_perio
412 le_domaine_->init_renum_perio();
413
414 une_discretisation.associer_domaine(le_domaine_.valeur());
415 le_domaine_dis_ = une_discretisation.discretiser();
416 // Can not do this before, since the Domaine_dis is not typed yet:
417 le_domaine_dis_->associer_domaine(le_domaine_);
418
419 for (auto& itr : liste_loi_fermeture_)
420 itr->discretiser(une_discretisation);
421}
422
423/*! @brief Flag le premier et le dernier postraitement pour chaque fichier Et initialise les postraitements
424 *
425 */
427{
428 for (auto& itr : les_postraitements_) // Pour chaque postraitement
429 {
430 OWN_PTR(Postraitement_base) &der_post = itr;
431
432 // S'il est de type Postraitement, initialiser premier/dernier _pour_nom_fich
433 if (sub_type(Postraitement, der_post.valeur()))
434 {
435
436 Postraitement& post = ref_cast(Postraitement, der_post.valeur());
437
438 Nom nom_fichier = Sortie_Fichier_base::root;
439 nom_fichier+=post.nom_fich();
440 int rg = glob_noms_fichiers.rang(nom_fichier);
441 if (rg == -1) // C'est la premiere fois qu'on rencontre ce nom
442 {
443 glob_noms_fichiers.add(nom_fichier);
444 glob_derniers_posts.add(post);
446 }
447 else // On a deja vu ce nom
448 {
450 Postraitement& autre_post = glob_derniers_posts[rg];
452 glob_derniers_posts[rg] = post;
453
454 // On verifie au passage que les intervalles de postraitements
455 // sont bien les memes pour tout ce qui ecrit dans le meme
456 // fichier .
457 if (post.champs_demande() && autre_post.dt_post() != post.dt_post())
458 {
459 Cerr << "Error, the values of dt_post (" << autre_post.dt_post() << " and " << post.dt_post() << ") of two postprocessing blocks writing in the same file" << nom_fichier
460 << " are different!" << finl;
461 Cerr << "Specify the same dt_post, or use two different files for postprocessing." << finl;
462 Cerr << "INFO: For Probleme_couple, if you do not specify different filenames, postpros in subproblems must also have the same dt_post." << finl;
463 exit();
464 }
465 }
467 }
468 }
469 les_postraitements_.init();
470}
471
472int Probleme_base::expression_predefini(const Motcle& motlu, Nom& expression)
473{
474 expression = "";
475 return 0;
476}
477
478/*! @brief Ecriture du probleme sur fichier en vue d'une reprise.
479 *
480 * Ecrit le nom du probleme et sauvegarde les equations.
481 *
482 * @param (Sortie& os) flot de sortie pour sauvegarde
483 * @return (int) renvoie toujours 1
484 */
486{
489 Cerr << "Backup of problem " << le_nom() << finl;
490 int bytes=0;
491 for(int i=0; i<nombre_d_equations(); i++)
492 {
493 bytes += equation(i).sauvegarder(os);
494 assert(bytes % 4 == 0);
495 }
496 bytes += domaine().save_additional_state(os, *this); // save additional state (e.g. moving mesh data)
497 bytes += les_postraitements_.sauvegarder(os);
498 assert(bytes % 4 == 0); // To detect a sauvegarder() method which returns 1 instead of the number of bytes saved.
499 return bytes;
500}
501
502/*! @brief Lecture d'un flot d'entree (fichier) pour reprise apres une sauvegarde avec Probleme_base::sauvegarder(Sortie& os).
503 *
504 * @param (Entree& is) le flot d'entree sur lequel on lit la reprise
505 * @return (int) renvoie toujours 1
506 */
508{
509 statistics().begin_count(STD_COUNTERS::restart,statistics().get_last_opened_counter_level()+1);
512 Cerr << "Resuming the problem " << le_nom() << finl;
513 for(int i=0; i<nombre_d_equations(); i++)
514 equation(i).reprendre(is);
515 domaine().restore_additional_state(is, *this); //restore additional state (e.g. moving mesh data)
516 les_postraitements_.reprendre(is);
517 Cerr << "End of resuming the problem " << le_nom() << " after " << statistics().get_time_since_last_open(STD_COUNTERS::restart) << " s" << finl;
518 statistics().end_count(STD_COUNTERS::restart);
519 return 1;
520}
521
522/*! @brief Demande au schema en temps s'il faut faire une impression
523 *
524 * @return (int) 1 il faut faire une impression, 0 il ne faut pas.
525 */
527{
528 return schema_temps().limpr();
529}
530
531/*! @brief Demande au schema en temps s'il faut faire une sauvegarde
532 *
533 * @return (int) 1 il faut faire une sauvegarde, 0 il ne faut pas.
534 */
536{
537 return schema_temps().lsauv();
538}
539
540/*! @brief Imprime les equations associees au probleme si le schema en temps associe indique que c'est necessaire.
541 *
542 * @param (Sortie& os) le flot de sortie
543 */
545{
546 for(int i=0; i<nombre_d_equations(); i++)
547 equation(i).imprimer(os);
548}
549
550/*! @brief Associe un schema en temps au probleme.
551 *
552 * Associe ensuite le schema en temps a toutes
553 * les equations du probleme.
554 *
555 * @param (Schema_Temps_base& un_schema_en_temps) le schema en temps a associer
556 */
558{
559 if (le_schema_en_temps_)
560 {
561 Cerr << finl;
562 Cerr<<"Error: Problem "<<le_nom()<<" was already associated with the scheme "<< le_schema_en_temps_->le_nom()<<" and we try to associate it with "<<un_schema_en_temps.le_nom() << "." <<finl;
563 exit();
564 }
565 le_schema_en_temps_=un_schema_en_temps;
566 le_schema_en_temps_->associer_pb(*this);
567 for(int i=0; i<nombre_d_equations(); i++)
568 equation(i).associer_sch_tps_base(un_schema_en_temps);
569}
570
571/*! @brief Renvoie le schema en temps associe au probleme.
572 *
573 * (si il est non nul) (version const)
574 *
575 * @return (Schema_Temps_base&) le schema en temps associe au probleme
576 * @throws le schema en temps n'est pas associe au probleme, la reference est nulle
577 */
579{
580 if(!le_schema_en_temps_)
581 {
582 Cerr << le_nom() << " has not been associated to a time scheme !" << finl;
583 exit();
584 }
585 return le_schema_en_temps_.valeur();
586}
587
588
589/*! @brief Renvoie le schema en temps associe au probleme.
590 *
591 * (si il est non nul)
592 *
593 * @return (Schema_Temps_base&) le schema en temps associe au probleme
594 * @throws le schema en temps n'est pas associe au probleme, la reference est nulle
595 */
597{
598 if(!le_schema_en_temps_)
599 {
600 Cerr << le_nom() << " has not been associated to a time scheme !" << finl;
601 exit();
602 }
603 return le_schema_en_temps_.valeur();
604}
605
606
607/*! @brief Renvoie le domaine associe au probleme.
608 *
609 * (version const)
610 *
611 * @return (Domaine&) un domaine
612 */
613const Domaine& Probleme_base::domaine() const
614{
615 return le_domaine_.valeur();
616}
617
618/*! @brief Renvoie le domaine associe au probleme.
619 *
620 * @return (Domaine&) un domaine
621 */
623{
624 return le_domaine_.valeur();
625}
626
627/*! @brief Renvoie le domaine discretise associe au probleme.
628 *
629 * (version const)
630 *
631 * @return (Domaine_dis_base&) un domaine discretise
632 */
634{
635 return le_domaine_dis_.valeur();
636}
637
638/*! @brief Renvoie le domaine discretise associe au probleme.
639 *
640 * @return (Domaine_dis_base&) un domaine discretise
641 */
643{
644 return le_domaine_dis_.valeur();
645}
646
647/*! @brief Associe un milieu physique aux equations du probleme.
648 *
649 * Choix du milieu physique.
650 *
651 * @param (Milieu_base& mil) le milieu a associer (Solide, Fluide Incompressible ...)
652 */
654{
655 for(int i=0; i<nombre_d_equations(); i++)
657}
658
659/*! @brief Renvoie le milieu physique associe au probleme.
660 *
661 * (version const)
662 * On renvoie le milieu associe a la premiere equation.
663 *
664 * @return (Milieu_base&) un milieu physique
665 */
667{
668 return equation(0).milieu();
669}
670
671/*! @brief Renvoie le milieu physique associe au probleme.
672 *
673 * On renvoie le milieu associe a la premiere equation.
674 *
675 * @return (Milieu_base&) un milieu physique
676 */
678{
679 return equation(0).milieu();
680}
681
682/*! @brief Renvoie l'equation dont le nom est specifie.
683 *
684 * On indexe les equations avec leur nom associe.
685 * On cherche dans toutes les equations du probleme celle
686 * qui porte le nom specifie.
687 * (version const)
688 *
689 * @param (Nom& type) le nom de l'equation a renvoyer
690 * @return (Equation_base&) une equation
691 * @throws pas d'equation du nom specifie
692 */
694{
695 Motcle Type(type), Type_eqn;
696 for (int i = 0; i < nombre_d_equations(); i++)
697 {
698 Type_eqn = equation(i).que_suis_je();
699 if (Type_eqn == Type)
700 return equation(i);
701
702 // on teste si synonyme ...
704 if (syn_info != 0)
705 if (Motcle(syn_info->org_name_()) == Type_eqn)
706 return equation(i);
707 }
708 Cerr << que_suis_je() << " does not contain any equation/medium of type: " << type << finl;
709 Cerr << "Here is the list of possible equations for a " << que_suis_je() << " problem: " << finl;
710 for (int i = 0; i < nombre_d_equations(); i++)
711 Cerr << "\t- " << equation(i).que_suis_je() << finl;
713 // Pour les compilos;
714 return equation(0);
715}
716
717/*! @brief (B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations
718 * de meme type (Probleme_FT_Disc_gen). Dans ce cas, le nom de l'equation
719 * n'est pas son type...
720 *
721 */
723{
724 return equation(un_nom);
725}
726
727/*! @brief (B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations
728 * de meme type (Probleme_FT_Disc_gen). Dans ce cas, le nom de l'equation
729 * n'est pas son type...
730 * Version non const. Cette methode est notamment appelee a la lecture du probleme.
731 *
732 */
734{
735 return equation(un_nom);
736}
737
738/*! @brief Renvoie l'equation dont le nom est specifie.
739 *
740 * On indexe les equations avec leur nom associe.
741 * On cherche dans toutes les equations du probleme celle
742 * qui porte le nom specifie.
743 *
744 * @param (Nom& type) le nom de l'equation a renvoyer
745 * @return (Equation_base&) une equation
746 * @throws pas d'equation du nom specifie
747 */
749{
750 Motcle Type(type), Type_eqn;
751 for (int i = 0; i < nombre_d_equations(); i++)
752 {
753 Type_eqn = equation(i).que_suis_je();
754 if (Type_eqn == Type)
755 return equation(i);
756
757 // on teste si synonyme ...
759 if (syn_info != 0)
760 if (Motcle(syn_info->org_name_()) == Type_eqn)
761 return equation(i);
762 }
763 Cerr << que_suis_je() << " does not contain any equation/medium of type: " << type << finl;
764 Cerr << "Here is the list of possible equations for a " << que_suis_je() << " problem: " << finl;
765 for (int i = 0; i < nombre_d_equations(); i++)
766 Cerr << "\t- " << equation(i).que_suis_je() << finl;
768 // Pour les compilos;
769 return equation(0);
770}
771
773{
774 domaine().creer_champ(motlu, *this);
775 domaine_dis().creer_champ(motlu, *this);
776 milieu().creer_champ(motlu);
777
778 for (int i = 0; i < nombre_d_equations(); i++)
779 equation(i).creer_champ(motlu);
780
781 for (auto &itr : liste_loi_fermeture_)
782 itr->creer_champ(motlu);
783}
784
785bool Probleme_base::has_champ(const Motcle& un_nom, OBS_PTR(Champ_base) &ref_champ) const
786{
787 if (domaine().has_champ(un_nom, ref_champ))
788 return true;
789
790 if (domaine_dis().has_champ(un_nom, ref_champ))
791 return true;
792
793 for (int i = 0; i < nombre_d_equations(); i++)
794 {
795 if (equation(i).has_champ(un_nom, ref_champ))
796 return true;
797
798 if (equation(i).milieu().has_champ(un_nom, ref_champ))
799 return true;
800 }
801
802 for (const auto &corr : correlations_)
803 if (corr.second->has_champ(un_nom, ref_champ))
804 return true;
805
806 for (const auto &itr : liste_loi_fermeture_)
807 if (itr->has_champ(un_nom, ref_champ))
808 return true;
809
810 return false; /* rien trouve */
811}
812
813bool Probleme_base::has_champ(const Motcle& un_nom) const
814{
815 if (domaine().has_champ(un_nom))
816 return true;
817
818 if (domaine_dis().has_champ(un_nom))
819 return true;
820
821 for (int i = 0; i < nombre_d_equations(); i++)
822 {
823 if (equation(i).has_champ(un_nom))
824 return true;
825
826 if (equation(i).milieu().has_champ(un_nom))
827 return true;
828 }
829
830 for (const auto &corr : correlations_)
831 if (corr.second->has_champ(un_nom))
832 return true;
833
834 for (const auto &itr : liste_loi_fermeture_)
835 if (itr->has_champ(un_nom))
836 return true;
837
838 return false; /* rien trouve */
839}
840
841const Champ_base& Probleme_base::get_champ(const Motcle& un_nom) const
842{
843 OBS_PTR(Champ_base) ref_champ;
844
845 if (domaine().has_champ(un_nom, ref_champ))
846 return ref_champ;
847
848 if (domaine_dis().has_champ(un_nom, ref_champ))
849 return ref_champ;
850
851 for (int i = 0; i < nombre_d_equations(); i++)
852 {
853 if (equation(i).has_champ(un_nom, ref_champ))
854 return ref_champ;
855
856 if (equation(i).milieu().has_champ(un_nom, ref_champ))
857 return ref_champ;
858 }
859
860 for (const auto &corr : correlations_)
861 if (corr.second->has_champ(un_nom, ref_champ))
862 return ref_champ;
863
864 for (const auto &itr : liste_loi_fermeture_)
865 if (itr->has_champ(un_nom, ref_champ))
866 return ref_champ;
867
868 Cerr << "The field of name " << un_nom << " do not correspond to a field understood by the problem." << finl;
869 Cerr << "It may be a field dedicated only to post-process and defined in the Definition_champs set." << finl;
870 Cerr << "1) If you have request the post-processing of " << un_nom << " in the Champs set" << finl;
871 Cerr << "please remove the localisation elem or som that you may have specified." << finl;
872 Cerr << "2) If you have used " << un_nom << " in Definition_champs, please use 'sources_reference { " << un_nom << " }'" << finl;
873 Cerr << "instead of 'source refchamp { pb_champ " << le_nom() << " " << un_nom << " }'" << finl;
874 Cerr << "3) Check reference manual." << finl;
875 Cerr << "4) Contact TRUST support." << finl;
877
878 throw std::runtime_error(std::string("Field ") + un_nom.getString() + std::string(" not found !"));
879}
880
882{
886 int nb_eq = nombre_d_equations();
887 for (int i=0; i<nb_eq; i++)
889
890 for (const auto& itr : liste_loi_fermeture_)
891 {
892 const Loi_Fermeture_base& loi=itr.valeur();
893 loi.get_noms_champs_postraitables(noms,opt);
894 }
895}
896
898{
899 if (un_nom == "TEMPERATURE_PHYSIQUE") return 0;
900
901 for (const auto &itr : postraitements())
902 {
903 const Postraitement& post = ref_cast(Postraitement, itr.valeur());
904 if (post.comprend_champ_post(un_nom))
905 return 1;
906 }
907 return 0;
908}
909
910bool Probleme_base::has_champ_post(const Motcle& un_nom) const
911{
912 for (const auto &itr : postraitements())
913 if (sub_type(Postraitement, itr.valeur()))
914 {
915 const Postraitement& post = ref_cast(Postraitement, itr.valeur());
916 if (post.has_champ_post(un_nom))
917 return true;
918 }
919
920 return false; /* rien trouve */
921}
922
924{
925 for (const auto &itr : postraitements())
926 if (sub_type(Postraitement, itr.valeur()))
927 {
928 const Postraitement& post = ref_cast(Postraitement, itr.valeur());
929 if (post.has_champ_post(un_nom))
930 return post.get_champ_post(un_nom);
931 }
932
933 Cerr << "The field named " << un_nom << " do not correspond to a field understood by the problem." << finl;
934 Cerr << "Check the name of the field indicated into the postprocessing block of the data file " << finl;
935 Cerr << "or in the list of post-processed fields above (in the block 'Reading of fields to be postprocessed')." << finl;
937
938 throw std::runtime_error(std::string("Field ") + un_nom.getString() + std::string(" not found !"));
939}
940
941int Probleme_base::a_pour_IntVect(const Motcle&, OBS_PTR(IntVect)& ) const
942{
943 return 0;
944}
945
946/*! @brief Effectue une mise a jour en temps du probleme.
947 *
948 * Effectue la mise a jour sur toutes les equations du probleme.
949 *
950 * @param (double temps) le pas de temps de mise a jour
951 */
953{
954 // Update the name of the problem being debugged
956
957 // Update the equations:
958//statistics().begin_count(STD_COUNTERS::update_variables);
959 for(int i=0; i<nombre_d_equations(); i++)
960 equation(i).mettre_a_jour(temps);
961
962 // Update the media:
963 milieu().mettre_a_jour(temps);
964
965 // Update the conserved fields in the equations (must be done after the media):
966 for(int i=0; i<nombre_d_equations(); i++)
968
969 // Update the post-processing:
970 les_postraitements_.mettre_a_jour(temps);
971
972 // Set conditions to update the domain in ALE:
974
975
976 for (auto& itr : liste_loi_fermeture_)
977 {
978 Loi_Fermeture_base& loi=itr.valeur();
979 loi.mettre_a_jour(temps);
980 }
981 for (auto &corr : correlations_)
982 corr.second->mettre_a_jour(temps);
983 //statistics().end_count(STD_COUNTERS::update_variables);
984}
985
986/*! @brief Prepare le calcul: initialise les parametres du milieu et prepare le calcul de chacune des equations.
987 *
988 */
990{
991 const double temps = schema_temps().temps_courant();
992 // Modification du tableau Qdm porte par le domaine_dis() dans le cas
993 // ou il y a des conditions aux limites periodiques.
994 // Rq : Si l'une des equations porte la condition a la limite periodique
995 // alors les autres doivent forcement la porter.
996 equation(0).domaine_dis().modifier_pour_Cl(equation(0).domaine_Cl_dis().les_conditions_limites());
997 milieu().initialiser(temps);
998 for (int i = 0; i < nombre_d_equations(); i++)
1001 for (int i = 0; i < nombre_d_equations(); i++) /* on peut maintenant remplir les champs conserves */
1003
1004 save_restart_.preparer_calcul();
1005
1006 for (auto& itr : liste_loi_fermeture_)
1007 {
1008 Loi_Fermeture_base& loi = itr.valeur();
1009 loi.preparer_calcul();
1010 }
1011
1012 if (correlations_.size() > 0)
1013 mettre_a_jour(temps);
1014}
1015
1016
1017/*! @brief Calcul la valeur du prochain pas de temps du probleme.
1018 *
1019 * On calcule le minimum des pas de temps des equations associees
1020 * au probleme.
1021 *
1022 * @return (double) le pas de temps maximum autorise pour ce probleme
1023 */
1025{
1027 double dt=schema_temps().pas_temps_max();
1028 for(int i=0; i<nombre_d_equations(); i++)
1029 dt=std::min(dt,equation(i).calculer_pas_de_temps());
1030 return dt;
1031}
1032
1034{
1035 Cerr<<"The postprocessing of interfaces is only possible for"<<finl;
1036 Cerr<<"a problem type Pb_Front_Tracking, not a "<<que_suis_je()<<finl;
1037 exit();
1038
1039}
1040void Probleme_base::postraiter_interfaces(const Nom& nomfich, Sortie& s, const Nom& format, double temps)
1041{
1042 Cerr<<que_suis_je()<<" must overloaded :postraiter_interfaces"<<finl;
1043 // exit();
1044}
1045
1047{
1048 return milieu().is_dilatable();
1049}
1050
1051/*! @brief Verifie que la place necessaire existe sur le disque dur.
1052 *
1053 */
1055{
1056 save_restart_.allocation();
1057}
1058
1059/*! @brief Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
1060 *
1061 * Le postraitement est mis a jour et les traitements eventuels sur
1062 * les sondes, champs et statistiques sont effectues.
1063 * Si force=0, tient compte des frequences d'impression demandees.
1064 *
1065 */
1067{
1068 statistics().begin_count(STD_COUNTERS::postreatment,statistics().get_last_opened_counter_level()+1);
1071 if (sch.nb_pas_dt() != 0)
1072 imprimer(Cout);
1073 if (force)
1074 {
1075 if (Process::nproc()>=100) Cerr << "[Post] Probleme_base::postraiter... " << finl;
1076 //Les sources postraitables (Terme_Source_Acceleration) ne sont pas mis a jour
1077 //pour le temps final et ne font pas partie des champs_crees_ du postraitement
1078 //qui eux sont mis a jour par les_postraitements.mettre_a_jour.
1079 //On les met donc a jour ici
1080
1081 const int nb_pas_dt_max = sch.nb_pas_dt_max();
1082 bool& indice_nb_pas_dt = sch.set_indice_nb_pas_dt_max_atteint();
1083 bool& indice_tps_final = sch.set_indice_tps_final_atteint();
1084 const double t_init = sch.temps_init();
1085 const double t_max = sch.temps_max();
1086
1087 //Test pour eviter de repeter le postraitement a l instant initial
1088 //Cela evite un plantage dans le cas d un postraitement au format meshtv
1089
1090 if (!(indice_nb_pas_dt && nb_pas_dt_max == 0) && !(indice_tps_final && est_egal(t_init, t_max)))
1091 {
1092 for (int i = 0; i < nombre_d_equations(); i++)
1093 equation(i).sources().mettre_a_jour(schema_temps().temps_courant());
1094
1095 les_postraitements_.mettre_a_jour(schema_temps().temps_courant());
1096 les_postraitements_.postraiter();
1097 if (nb_pas_dt_max == 0)
1098 indice_nb_pas_dt = true;
1099 if (est_egal(t_init, t_max))
1100 indice_tps_final = true;
1101 }
1102 if (Process::nproc()>=100) Cerr << "[Post] Done in " << statistics().get_time_since_last_open(STD_COUNTERS::postreatment) << " s. If too slow consider using CGNS format." << finl;
1103 }
1104 else
1105 les_postraitements_.traiter_postraitement();
1106
1107 statistics().end_count(STD_COUNTERS::postreatment);
1108 //Start specific postraitements for mobile domain (like ALE)
1109 if(!save_restart_.is_restart_in_progress() && le_domaine_dis_)
1110 {
1111 //no projection during the iteration of resumption of computation
1112 double temps = le_schema_en_temps_->temps_courant();
1113 le_domaine_dis_->domaine().update_after_post(temps);
1114 }
1115
1116 save_restart_.set_restart_in_progress(false); //reset to false in order to make the following projections
1117 // end specific postraitements for mobile domain (like ALE)
1118
1119 return 1;
1120}
1121
1122/*! @brief Ecriture sur fichier en vue d'une reprise (sauvegarde)
1123 *
1124 */
1126{
1127 statistics().begin_count(STD_COUNTERS::backup_file,statistics().get_last_opened_counter_level()+1);
1128 int bytes = save_restart_.sauver();
1130 Cout << "[IO] " << statistics().get_time_since_last_open(STD_COUNTERS::backup_file) << " s to write save file." << finl;
1131 statistics().end_count(STD_COUNTERS::backup_file,1,bytes);
1132}
1133
1134/*! @brief Finit le postraitement et sauve le probleme dans un fichier.
1135 *
1136 * Fermeture du fichier associe au postraitement.(Postraitement::finir())
1137 *
1138 */
1140{
1142 schema_temps().finir(); // Fermeture du .dt_ev
1143 les_postraitements_.finir(); // Fermeture des fichiers de postraitements
1144 for (auto os : get_set_out_files())
1145 if (os->is_open())
1146 os->close(); // Fermeture des fichiers .out
1147 // Vide les variables globales suivantes (utile pour resetTime dans un meme repertoire)
1148 glob_noms_fichiers.vide();
1149 glob_derniers_posts.vide();
1150
1151 if (schema_temps().temps_sauv() > 0.0)
1152 sauver();
1153 save_restart_.finir();
1154}
1155
1157{
1158 static const std::string param_name = "SORTIE_ROOT_DIRECTORY";
1159 std::string new_root_dir = (str_params_.count(param_name) == 0) ? "" : getOutputStringValue(param_name);
1160
1161 resetTimeWithDir_impl(*this, time, new_root_dir);
1162}
1163
1164/*! @brief Recherche des champs parametriques, et pour chacun, passage au parametre suivant
1165 *
1166 */
1168{
1169 std::string dirname="";
1170 // Boucle sur les champs des conditions limites:
1171 for (int i = 0; i < nombre_d_equations(); i++)
1172 {
1173 const Equation_base& eq = equation(i);
1174 const Conds_lim& condsLim = eq.domaine_Cl_dis().les_conditions_limites();
1175 for (auto const &condLim : condsLim)
1176 {
1177 const Cond_lim_base& la_cl_base = condLim.valeur();
1178 if (sub_type(Champ_front_Parametrique, la_cl_base.champ_front()))
1179 {
1180 const Champ_front_Parametrique& champ_front = ref_cast(Champ_front_Parametrique, la_cl_base.champ_front());
1181 dirname = champ_front.newCompute();
1182 }
1183 }
1184 }
1185 // Boucles sur les champs des sources:
1187 {
1188 for (int i = 0; i < nombre_d_equations(); i++)
1189 {
1190 const Equation_base& eq = equation(i);
1191 const Sources& sources = eq.sources();
1192 for (auto &source: sources)
1193 {
1194 for (auto const &champ_don: source->champs_don())
1195 {
1196 if (sub_type(Champ_Parametrique, champ_don.valeur()))
1197 {
1198 const Champ_Parametrique& champ = ref_cast(Champ_Parametrique, champ_don.valeur());
1199 dirname = champ.newCompute();
1200 }
1201 }
1202 }
1203 }
1204 // Boucle sur les champs du Milieu:
1205 for (auto const &champ_don: milieu().champs_don())
1206 {
1207 if (sub_type(Champ_Parametrique, champ_don.valeur()))
1208 {
1209 const Champ_Parametrique& champ = ref_cast(Champ_Parametrique, champ_don.valeur());
1210 dirname = champ.newCompute();
1211 }
1212 }
1213 }
1214 return dirname;
1215}
1216
1218{
1219 /* lecture d'equations optionnelles */
1220 Noms noms_eq, noms_eq_maj; //noms de toutes les equations possibles!
1221 Type_info::les_sous_types(Nom("Equation_base"), noms_eq);
1222 for (auto& itr : noms_eq) noms_eq_maj.add(Motcle(itr)); //ha ha ha
1223 for (is >> mot; noms_eq_maj.rang(mot) >= 0; is >> mot)
1224 {
1225 eq_opt_.add(OWN_PTR(Equation_base)()); //une autre equation optionelle
1226 eq_opt_.dernier().typer(mot); //on lui donne le bon type
1227 Equation_base& eq = eq_opt_.dernier().valeur();
1228 //memes associations que pour les autres equations : probleme, milieu, schema en temps
1229 eq.associer_pb_base(*this);
1231 eq.associer_sch_tps_base(le_schema_en_temps_);
1233 eq.discretiser(); //a faire avant de lire l'equation
1234 is >> eq; //et c'est parti!
1235 eq.associer_milieu_equation(); //remontee vers le milieu
1236 }
1237 return is;
1238}
1239
1241{
1242 Motcle mot;
1243 is >> mot;
1244 if (mot != "{")
1245 {
1246 Cerr << "correlations : { expected instead of " << mot << finl;
1247 Process::exit();
1248 }
1249 for (is >> mot; mot != "}"; is >> mot)
1250 if (correlations_.count(mot.getString())) Process::exit(que_suis_je() + " : a correlation already exists for " + mot + " !");
1251 else
1253
1254 return is;
1255}
1256
1258 const std::vector<double>& x,
1259 const std::vector<double>& y,
1260 const std::vector<double>& z,
1261 std::vector<double>& vals, int compo)
1262{
1264 Process::exit("Probleme_base::getOutputPointValues not implemented in // !! \n");
1265
1266 assert (compo > -1);
1267
1268 const int size_x = static_cast<int>(x.size());
1269 const int size_y = static_cast<int>(y.size());
1270 const int size_z = static_cast<int>(z.size());
1271 const int size_vals = static_cast<int>(vals.size());
1272
1273 if (size_x != size_y)
1274 Process::exit("Error in Probleme_base::getOutputPointValues => vectors x and y must have same dimensions !!!");
1275
1276 if (Objet_U::dimension > 2 && (size_x != size_z))
1277 Process::exit("Error in Probleme_base::getOutputPointValues => vectors x, y and z must have same dimensions !!!");
1278
1279 if (size_vals == 0)
1280 vals.resize(size_x);
1281 else
1282 {
1283 if (size_vals != size_x)
1284 Process::exit("Error in Probleme_base::getOutputPointValues => vectors x, y/z and vals must have same dimensions !!!");
1285 }
1286
1287 DoubleTrav les_positions; // TODO FIXME : attribute ?
1288 les_positions.resize(size_x, Objet_U::dimension);
1289
1290 for (int i = 0; i < size_x; i++)
1291 {
1292 les_positions(i, 0) = x[i];
1293 les_positions(i, 1) = y[i];
1294 if (Objet_U::dimension > 2) les_positions(i, 2) = z[i];
1295 }
1296
1297 IntVect elem; // TODO FIXME : attribute ?
1298
1299 if(elem.size() != size_x)
1300 elem.resize(size_x);
1301
1302 le_domaine_->chercher_elements(les_positions, elem, 1);
1303
1304 // Check if some probes are outside the domain:
1305 ArrOfDouble tmp(size_x);
1306 for (int i = 0; i < size_x; i++)
1307 tmp[i] = elem[i];
1309 for (int i = 0; i < size_x; i++)
1310 if (tmp[i] == -1)
1311 {
1312 Cerr << "Error in Probleme_base::getOutputPointValues => The point number " << i + 1 << " is outside the computational domain !!! " << finl;
1313 Process::exit();
1314 }
1315
1316 DoubleTrav valeurs_locales;
1317 valeurs_locales.resize(size_x, 1);
1318
1319 // TODO FIXME : reste histoire de som/grav ... a factorizer avec Sonde::initialiser()
1320 if (has_champ(Motcle(name)))
1321 {
1322 OBS_PTR(Champ_base) champ_ref = get_champ(Motcle(name));
1323
1324 if (champ_ref->nb_comp() == 1)
1325 {
1326 assert(champ_ref->valeurs().line_size() == 1);
1327 champ_ref->valeur_aux_elems(les_positions, elem, valeurs_locales);
1328 }
1329 else
1330 {
1331 assert(compo < champ_ref->nb_comp());
1332 champ_ref->valeur_aux_elems_compo(les_positions, elem, valeurs_locales, compo);
1333 }
1334 }
1335 else /* from post like ICoCo*/
1336 {
1337 OBS_PTR(Champ_Generique_base) ref_ch = findOutputField(name);
1338
1339 if (!ref_ch)
1340 {
1341 Cerr << "Error in Probleme_base::getOutputPointValues => No output fields of name " << name << finl;
1342 Process::exit();
1343 }
1344
1345 OWN_PTR(Champ_base) espace_stockage;
1346 const Champ_base& ma_source = ref_ch->get_champ(espace_stockage);
1347
1348 if (ma_source.nb_comp() == 1)
1349 {
1350 assert(ma_source.valeurs().line_size() == 1);
1351 ma_source.valeur_aux_elems(les_positions, elem, valeurs_locales);
1352 }
1353 else
1354 {
1355 assert(compo < ma_source.nb_comp());
1356 ma_source.valeur_aux_elems_compo(les_positions, elem, valeurs_locales, compo);
1357 }
1358 }
1359
1360 for (int i = 0; i < size_x; i++)
1361 vals[i] = valeurs_locales(i, 0);
1362}
class Champ_Generique_base
: class Champ_Parametrique
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp) const
provoque une erreur ! doit etre surchargee par les classes derivees
virtual DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
provoque une erreur ! doit etre surchargee par les classes derivees
: class Champ_front_Parametrique
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
Champ_front_base & champ_front()
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
static void typer_lire_correlation(OWN_PTR(Correlation_base)&, const Probleme_base &, const Nom &, Entree &)
static void set_nom_pb_actuel(const Nom &nom)
Definition Debog.cpp:44
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
virtual Domaine_dis_base & discretiser() const
void associer_domaine(const Domaine &dom)
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
Definition Domaine.h:62
int_t nb_elem() const
Definition Domaine.h:131
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int restore_additional_state(Entree &, Probleme_base &)
virtual void setUpdateTheGrid(bool)
virtual int save_additional_state(Sortie &, const Probleme_base &) const
void creer_champ(const Motcle &motlu) override
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void creer_champ(const Motcle &motlu) override
void associer_domaine(const Domaine &)
Associe un Domaine a l'objet.
virtual void modifier_pour_Cl(const Conds_lim &)=0
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual void associer_milieu_equation()
virtual void associer_milieu_base(const Milieu_base &)=0
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
virtual const Milieu_base & milieu() const =0
virtual void associer_domaine_dis(const Domaine_dis_base &)
Associe le domaine discretise a l'equation.
virtual void imprimer(Sortie &os) const
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
virtual void associer_pb_base(const Probleme_base &)
S'associe au Probleme passe en parametre.
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
virtual void mettre_a_jour_champs_conserves(double temps, int reset=0)
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual void associer_sch_tps_base(const Schema_Temps_base &)
S'associe au schema_en_temps.
void creer_champ(const Motcle &motlu) override
virtual void discretiser()
Discretise l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
virtual int nb_comp() const
Definition Field_base.h:56
: Classe de base des lois de fermetures.
virtual void associer_pb_base(const Probleme_base &)
Cette methode est la premiere appelee par le probleme pour construire l'objet au moment ou on l'assoc...
virtual void preparer_calcul()
Cette methode est appelee par le probleme apres preparer_calcul() des equations et du milieu.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void mettre_a_jour(double temps)
Cette methode est appelee par le probleme apres mettre_a_jour() des equations et du milieu.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual int initialiser(const double temps)
virtual bool is_dilatable() const
virtual void mettre_a_jour(double temps)
virtual void preparer_calcul()
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void discretiser(const Probleme_base &pb, const Discretisation_base &dis)
void creer_champ(const Motcle &motlu) override
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
const std::string & getString() const
Definition Nom.h:92
const Nom & le_nom() const override
Renvoie *this;.
Definition Nom.cpp:563
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
int rang(const char *const ch) const
Definition Noms.cpp:65
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
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
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
Definition Objet_U.cpp:146
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 de base pour l'ensemble des postraitements.
classe Postraitement La classe est dotee -d une liste de champs generiques champs_post_complet_ qui c...
double dt_post() const
int comprend_champ_post(const Motcle &identifiant) const
Nom nom_fich() const
virtual const Champ_Generique_base & get_champ_post(const Motcle &nom) const
int & est_le_dernier_postraitement_pour_nom_fich()
virtual bool has_champ_post(const Motcle &nom) const
int & est_le_premier_postraitement_pour_nom_fich()
classe Probleme_U
Definition Probleme_U.h:46
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 std::string getOutputStringValue(const std::string &name)
std::map< std::string, std::string > str_params_
Definition Probleme_U.h:114
void resetTimeWithDir_impl(Probleme_base &pb, double time, std::string direname)
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
int sauvegarder(Sortie &) const override
Ecriture du probleme sur fichier en vue d'une reprise.
int limpr() const override
Demande au schema en temps s'il faut faire une impression.
virtual void associer_milieu_base(const Milieu_base &)
Associe un milieu physique aux equations du probleme.
virtual Entree & lire_equations(Entree &is, Motcle &dernier_mot)
Lecture des equations du probleme.
virtual void typer_lire_milieu(Entree &is)
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void getOutputPointValues(const Nom &name, const std::vector< double > &x, const std::vector< double > &y, const std::vector< double > &z, std::vector< double > &vals, int compo) override
virtual void discretiser(Discretisation_base &)
Affecte une discretisation au probleme Discretise le Domaine associe au probleme avec la discretisati...
std::string newCompute() override
Recherche des champs parametriques, et pour chacun, passage au parametre suivant.
virtual void lire_postraitement_interfaces(Entree &is)
virtual void associer_domaine(const Domaine &)
Associe un domaine au probleme.
virtual void discretiser_equations()
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
int postraiter(int force=1) override
Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
virtual void postraiter_interfaces(const Nom &nom_fich, Sortie &s, const Nom &format, double temps)
bool is_dilatable() const
void creer_champ(const Motcle &motlu) override
int associer_(Objet_U &) override
surcharge Objet_U::associer_(Objet_U& ob) Associe differents objets au probleme en controlant
virtual Entree & lire_correlations(Entree &is)
void sauver() const override
Ecriture sur fichier en vue d'une reprise (sauvegarde).
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
const Champ_base & get_champ(const Motcle &nom) const override
Entree & read_optional_equations(Entree &is, Motcle &mot)
virtual bool has_champ_post(const Motcle &nom) const
virtual void preparer_calcul()
Prepare le calcul: initialise les parametres du milieu et prepare le calcul de chacune des equations.
void init_postraitements()
Flag le premier et le dernier postraitement pour chaque fichier Et initialise les postraitements.
Postraitements & postraitements()
virtual double calculer_pas_de_temps() const
Calcul la valeur du prochain pas de temps du probleme.
Postraitements les_postraitements_
virtual int a_pour_IntVect(const Motcle &, OBS_PTR(IntVect)&) const
virtual int comprend_champ_post(const Motcle &nom) const
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps du probleme.
Save_Restart save_restart_
void resetTime(double time) override
Reset the current time of the Problem to a given value.
int lsauv() const override
Demande au schema en temps s'il faut faire une sauvegarde.
virtual void allocation() const final
Verifie que la place necessaire existe sur le disque dur.
virtual void associer_sch_tps_base(const Schema_Temps_base &)
Associe un schema en temps au probleme.
virtual void finir()
Finit le postraitement et sauve le probleme dans un fichier.
virtual const Champ_Generique_base & get_champ_post(const Motcle &nom) const
std::vector< OWN_PTR(Milieu_base)> le_milieu_
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
std::map< std::string, OWN_PTR(Correlation_base)> correlations_
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual int nombre_d_equations() const =0
OBS_PTR(Field_base) findInputField(const Nom &name) const override
virtual Entree & lire_radiation_models(Entree &is, Motcle &mot)
virtual const Equation_base & equation(int) const =0
virtual void imprimer(Sortie &os) const
Imprime les equations associees au probleme si le schema en temps associe indique que c'est necessair...
virtual int verifier()
Verifie que l'objet est complet, coherent, .
virtual void completer()
Complete les equations associees au probleme.
virtual int expression_predefini(const Motcle &motlu, Nom &expression)
virtual void lire_solved_equations(Entree &is)
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
virtual const Equation_base & get_equation_by_name(const Nom &) const
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
int reprendre(Entree &) override
Lecture d'un flot d'entree (fichier) pour reprise apres une sauvegarde avec Probleme_base::sauvegarde...
virtual void associer()
Associe le probleme a toutes ses equations.
virtual Equation_base & getset_equation_by_name(const Nom &)
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
static void mp_max_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:196
static bool is_parallel()
Definition Process.cpp:110
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
bool & set_indice_nb_pas_dt_max_atteint()
int limpr() const
Renvoie 1 s'il y a lieu d'effectuer une impression (cf dt_impr) Renvoie 0 sinon.
const Nom & le_nom() const override
surcharge Objet_U::le_nom() Renvoie le nom du shema en temps
double temps_courant() const
Renvoie le temps courant.
int sauvegarder(Sortie &) const override
Sauvegarde le temps courant et le nombre de pas de temps sur un flot de sortie.
double pas_temps_max() const
Renvoie le pas de temps maximum.
virtual void associer_pb(const Probleme_base &)
double temps_max() const
Renvoie une reference sur le temps maximum.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
int reprendre(Entree &) override
Reprise (lecture) du temps courant et du nombre de pas de temps effectues a partir d'un flot d'entree...
double temps_init() const
Renvoie le temps initial.
bool & set_indice_tps_final_atteint()
int nb_pas_dt_max() const
Renvoie une reference sur le nombre de pas maxi.
void finir() const
Fermeture du fichier .dt_ev.
static std::string root
Classe de base des flux de sortie.
Definition Sortie.h:52
class Sources Sources represente une liste de Source.
Definition Sources.h:31
void mettre_a_jour(double temps)
Mise a jour en temps, de toute les sources de la liste.
Definition Sources.cpp:109
modelise une information de synonyme pour les Objet_U
static const Synonyme_info * synonyme_info_from_name(const char *synonyme_name)
Methode statique qui renvoie un pointeur vers le Synonyme_info dont le nom est "synonyme_name".
const char * org_name_() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
static int les_sous_types(const Nom &, Noms &sous_types)
Donne les noms des sous-types, un type mere etant donne par son nom.