TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Postraiter_domaine.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 <Postraiter_domaine.h>
17#include <Domaine_dis_cache.h>
18#include <Domaine_dis_base.h>
19#include <Format_Post_base.h>
20#include <communications.h>
21#include <Sous_Domaine.h>
22#include <Param.h>
23
24Implemente_instanciable(Postraiter_domaine, "Postraiter_domaine", Interprete_geometrique_base);
25// XD postraiter_domaine interprete postraiter_domaine BRACE To write one or more domains in a file with a specified
26// XD_CONT format (MED,LML,LATA,SINGLE_LATA,CGNS).
27
29
31
32void traite_bord(const Domaine& domaine, IntVect& ch_som, IntVect& ch_elem3, int num2, Faces& faces, Nom& nom_bord, Nom& fichier, const IntTab& les_elems, Format_Post_base& post, int& compteur,
33 int& compteur0, int& compteur_reel, int& moi, int isjoint = 0)
34{
35 const Domaine& dom = domaine;
36 Nom nom_dom = dom.le_nom();
37 int num = -num2;
38 int nb_elem = les_elems.dimension(0);
39 int nb_elem_tot = domaine.nb_elem_tot();
40
41 int nb_faces = faces.nb_faces();
42 int nb_som_faces = faces.nb_som_faces();
43 int j, k, som;
44
45 DoubleTab ch_elem2(nb_elem, 1);
46 ch_elem2 = moi;
47
48 if (isjoint != 2)
49 {
50 // on a pas encore calcule ch_elem3
51 ch_elem3 = moi;
52 for (j = 0; j < nb_faces; j++)
53 for (k = 0; k < nb_som_faces; k++)
54 {
55 som = faces.sommet(j, k);
56 // cas des polyedres
57 if (som == -1)
58 break;
59 if (ch_som(som) == 0)
60 ch_som(som) = num;
61 else
62 ch_som(som) = (ch_som(som) + num) / 2;
63 }
64
65 //num=-Process::nproc();
66 num = -1;
67 if (nb_faces != 0)
68 {
69 if (0)
70 {
71 int taille1 = les_elems.dimension(1);
72 for (int e = 0; e < nb_elem; e++)
73 {
74 for (j = 0; j < nb_faces; j++)
75 {
76 int m = -1;
77 for (k = 0; k < nb_som_faces; k++)
78 {
79 som = faces.sommet(j, k);
80 for (int kk = 0; kk < taille1; kk++)
81 {
82 if (les_elems(e, kk) == som)
83 {
84 m++;
85 ;
86 break;
87 }
88 }
89 if (m != k)
90 break;
91 }
92 if (m == nb_som_faces - 1)
93 ch_elem3[e] = num;
94 }
95 }
96 }
97 else
98 {
99 const IntTab& faces_voisin = faces.voisins();
100 if (faces_voisin.dimension(0) > 0 && local_max_vect(faces_voisin) != -1)
101 {
102 //Cerr<<" we use faces_voisins"<<finl;
103 for (j = 0; j < nb_faces; j++)
104 {
105 int el1 = faces_voisin(j, 0);
106 if (el1 == -1)
107 el1 = faces_voisin(j, 1);
108 if (el1 == -1)
109 {
110 Cerr << "Error, the face " << j << " of the domain " << dom.le_nom() << " has no neighbours !" << finl;
111 Cerr << "Check that the domain " << dom.le_nom() << " has been discretized." << finl;
113 }
114 ch_elem3[el1] = num;
115 }
116 }
117 else
118 {
119 DoubleTab position(1, Objet_U::dimension);
120 IntVect res;
121 DoubleTab xv;
122 faces.associer_domaine(domaine);
123 faces.calculer_centres_gravite(xv);
124 for (j = 0; j < nb_faces; j++)
125 {
126 for (int dir = 0; dir < Objet_U::dimension; dir++)
127 position(0, dir) = xv(j, dir);
128 domaine.chercher_elements(position, res);
129 if (res[0] < 0)
130 {
131 position += 1e-5;
132 domaine.chercher_elements(position, res);
133 if (res[0] < 0)
134 {
135 position -= 2e-5;
136 domaine.chercher_elements(position, res);
137 }
138 }
139
140 if (res[0] < nb_elem)
141 {
142 if (res[0] < 0)
143 {
144 if (isjoint == 1)
145 Cerr << "To properly view the joints, the splitting area must be complete " << finl;
146 else
147 {
148 Cerr << "Problem in Postraiter_domaine.cpp with the boundary " << nom_bord << finl;
149 // abort();
150 }
151 }
152 else
153 {
154 ch_elem3[res[0]] = num;
155 }
156 }
157 else
158 {
159 if (nb_elem >= nb_elem_tot)
160 abort();
161 }
162 }
163 }
164 }
165 }
166 }
167
168 for (int s = 0; s < nb_elem; s++)
169 ch_elem2(s, 0) = (ch_elem3[s]);
170 // on ajoute ce bord
171 Noms noms_post(1);
172 noms_post[0] = nom_bord;
173 Noms unites(1);
174 unites[0] = "1";
175 //Cerr<<Process::me() <<" ch_elem2 size"<<fichier<< " "<<nom_dom<<" " <<nom_bord<<" "<<ch_elem2.dimension(0)<<finl;
176 post.ecrire_champ(dom, unites, noms_post, -1, 0., nom_bord, nom_dom, "ELEM", "scalar", ch_elem2);
177}
178
180{
181 Nom nom_pdb;
182 Nom un_dom;
183 Param param(que_suis_je());
184 param.ajouter("format", &format_post_, Param::REQUIRED); // XD_ADD_P chaine(into=["lml","lata","single_lata","lata_v2","med","cgns"])
185 // XD_CONT File format.
186 format_binaire_ = 1;
187 param.ajouter("binaire", &format_binaire_); // XD_ADD_P entier(into=[0,1])
188 // XD_CONT Binary (binaire 1) or ASCII (binaire 0) may be used. By default, it is 0 for LATA and only ASCII is
189 // XD_CONT available for LML and only binary is available for MED.
191 param.ajouter("ecrire_frontiere", &ecrire_frontiere_); // XD_ADD_P entier(into=[0,1])
192 // XD_CONT This option will write (if set to 1, the default) or not (if set to 0) the boundaries as fields into the
193 // XD_CONT file (it is useful to not add the boundaries when writing a domain extracted from another domain)
194 param.ajouter("dual", &dual_); // XD_ADD_P entier(into=[0,1])
195 // XD_CONT This option indicates whether the original mesh (default) or the dual one (the one used for postprocessing
196 // XD_CONT of field faces) is to be written.
197 nom_pdb = "NOM_DU_CAS";
198 param.ajouter("fichier|file", &nom_pdb); // XD_ADD_P chaine
199 // XD_CONT The file name can be changed with the fichier option.
200 // desactive l'ecriture des joints pratique pour comparer parallele et sequentielle
202 param.ajouter("joints_non_postraites", &joint_non_ecrit_); // XD_ADD_P entier(into=[0,1])
203 // XD_CONT The joints_non_postraites (1 by default) will not write the boundaries between the partitioned mesh.
204 param.ajouter("domaine|domain", &un_dom); // XD_ADD_P ref_domaine
205 // XD_CONT Name of domain
206 param.ajouter_non_std("domaines", (this)); // XD_ADD_P bloc_lecture
207 // XD_CONT Names of domains : { name1 name2 }
208 param.ajouter_condition("is_read_domaine_or_is_read_domaines", "Vous devez preciser domaine ou domaines dans Postraiter_domaine");
209 param.ajouter_condition("is_read_domaine_or_is_read_domaines", "Interpreter Postraiter_domaine : one of the keywords domaine or domaines must be specified.");
211 if (un_dom != Nom())
212 {
213 associer_domaine(un_dom);
214 }
215 nb_domaine_ = domaines().size();
216 if (nb_domaine_ == 0)
217 {
218 Cerr << "You must specify one or several domains" << finl;
219 exit();
220 }
221 if (nom_pdb == "NOM_DU_CAS")
222 {
223 nom_pdb = nom_du_cas();
224 nom_pdb += ".";
225 nom_pdb += format_post_;
226 }
227 if (format_post_ == "lata_v2")
228 format_post_ = "lata";
229
230 ecrire(nom_pdb);
231 return is;
232}
233
235{
236 if (motcle == "domaines")
237 {
238 Nom mot;
239 is >> mot;
240 if (mot != "{")
241 {
242 Cerr << "we expected { and not " << mot << finl;
243 exit();
244 }
245 is >> mot;
246 while (mot != "}")
247 {
248 associer_domaine(mot);
249 is >> mot;
250 }
251 return 1;
252 }
253 else
254 {
255 Cerr << motcle << " not understood by Postraiter_domaine::lire_motcle_non_standard" << finl;
256 exit();
257 }
258 return -1;
259}
260
262{
263 Nom fichier = nom_pdb.nom_me(Process::me());
264 int compteur = -123;
265 int compteur0 = -123;
266 int compteur_reel = 0;
267 bool is_single_lata = false;
268
269 if (Motcle(format_post_) == "SINGLE_LATA")
270 {
271 is_single_lata = true;
272 format_post_ = "lata";
273 }
274
275 Nom type("Format_Post_");
276 type += format_post_;
277 OWN_PTR(Format_Post_base) post_typer;
278 post_typer.typer(type.getChar());
279 Format_Post_base& post = ref_cast(Format_Post_base, post_typer.valeur());
280
281 post.set_postraiter_domain(); // XXX utile pour CGNS ... sinon ca fait rien
282 if (is_single_lata)
283 post.set_single_lata_option(is_single_lata);
284
285 Nom nom_2(nom_pdb);
286 Nom format_post_bis(format_post_);
287 if (format_post_bis.debute_par("lata"))
288 format_post_bis = "lata";
289 Nom suffix(".");
290 suffix += format_post_bis;
291 nom_2.prefix(suffix);
292 int est_le_premie_post = 0;
293 if (format_post_bis != "lata")
294 post.initialize_by_default(nom_2);
295 else
296 post.initialize(nom_2, format_binaire_, "SIMPLE");
297 for (int numero_domaine = 0; numero_domaine < nb_domaine_; numero_domaine++)
298 {
299 if (numero_domaine == 0)
300 est_le_premie_post = 1;
301 else
302 est_le_premie_post = 0;
303 post.ecrire_entete(0., 0, est_le_premie_post);
304
305 const Domaine& dom = domaine(numero_domaine);
306 int reprise = 0;
307 double t_init = 0.;
308 post.preparer_post(dom.le_nom(), est_le_premie_post, reprise, t_init);
309 if(dual_)
310 {
311 const OBS_PTR(Domaine_dis_base) dom_dis = Domaine_dis_cache::Build_or_get("Domaine_VF_inst", dom);
312 post.ecrire_domaine_dis(dom, dom_dis, est_le_premie_post);
313 post.ecrire_domaine_dual(dom, est_le_premie_post);
314 }
315 else
316 post.ecrire_domaine(dom, est_le_premie_post);
317 }
318
319 post.ecrire_temps(0.);
320
321 for (int numero_domaine = 0; numero_domaine < nb_domaine_; numero_domaine++)
322 {
323 if (numero_domaine == 0)
324 est_le_premie_post = 1;
325 else
326 est_le_premie_post = 0;
327 const Domaine& dom = domaine(numero_domaine);
328
329 compteur = -1;
330 post.init_ecriture(0., -1., est_le_premie_post, dom);
331 }
332 int moi = Process::me();
334 moi = 0;
335
336 for (int numero_domaine = 0; numero_domaine < nb_domaine_; numero_domaine++)
337 {
338 Domaine& dom = domaine(numero_domaine);
339 Nom nom_dom(dom.le_nom());
340 const IntTab& les_elems = dom.les_elems();
341 IntVect ch_som(dom.nb_som());
342 int nb_elem = dom.nb_elem();
343 IntVect ch_elem2(nb_elem);
344 int num = 0;
345 // En format LATA V2, les frontieres et joints
346 // sont ecrits par defaut depuis la 1.6.6 lors
347 // de l'ecriture des domaines si le domaine a ete discretise <=> indice_domaines_frontieres>0
348 if (format_post_ != "lata" || dom.domaines_frontieres().size() == 0)
349 {
350 if (dom.domaines_frontieres().size() == 0)
351 Cerr << "Warning: it could be faster and nicer to discretize your domain before using Postraiter_domaine." << finl;
352 //////////////////////////
353 // Ecriture des frontieres
354 //////////////////////////
356 {
357 int nglob = 1;
358 int nb_bords = dom.nb_bords();
359 for (int i = 0; i < nb_bords; i++)
360 {
361 num = i + nglob;
362 Nom nom_fr = dom.bord(i).le_nom();
363 // le maitre envoit le nom de la frontiere
364 // afin que les processeurs traitent les bords dans le meme ordre
365 if (je_suis_maitre())
366 envoyer(nom_fr, 0, -1, 11);
367 else
368 recevoir(nom_fr, 0, me(), 11);
369 Nom nom_bord;
370 if (nb_domaine_ == 1)
371 nom_bord = nom_fr;
372 else
373 nom_bord = dom.le_nom() + "_" + nom_fr;
374 Faces& faces = dom.frontiere(dom.rang_frontiere(nom_fr)).faces();
375 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi);
376 }
377
378 nglob += dom.nb_bords();
379 int nb_raccords = dom.nb_raccords();
380 for (int i = 0; i < nb_raccords; i++)
381 {
382 num = i + nglob;
383 Nom nom_fr = dom.raccord(i)->le_nom();
384 if (je_suis_maitre())
385 envoyer(nom_fr, 0, -1, 11);
386 else
387 recevoir(nom_fr, 0, me(), 11);
388 Nom nom_bord;
389 if (nb_domaine_ == 1)
390 nom_bord = Nom("Raccord_") + nom_fr;
391 else
392 nom_bord = dom.le_nom() + Nom("_Raccord_") + nom_fr;
393
394 Faces& faces = dom.frontiere(dom.rang_frontiere(nom_fr)).faces();
395 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi);
396 }
397
398 nglob += dom.nb_raccords();
399
400 // On ecrit un champ global
401 Noms noms_post(1);
402 if (nb_domaine_ == 1)
403 noms_post[0] = "Bord";
404 else
405 noms_post[0] = dom.le_nom() + "_Bord";
406 Noms unites(1);
407 unites[0] = "1";
408 int nb_som = dom.nb_som();
409 DoubleTab ch_som2(nb_som, 1);
410 for (int j = 0; j < nb_som; j++)
411 ch_som2(j, 0) = (ch_som(j));
412 post.ecrire_champ(dom, unites, noms_post, -1, 0., noms_post[0], nom_dom, "SOM", "scalar", ch_som2);
413 }
414
415 //////////////////////
416 // Ecriture des joints
417 //////////////////////
418 if (!joint_non_ecrit_)
419 for (int p = 0; p < nproc(); p++)
420 {
421 int nb_joint = dom.nb_joints();
422 envoyer_broadcast(nb_joint, p);
423 for (int i = 0; i < nb_joint; i++)
424 {
425 Nom nom_bord;
426 if (me() == p)
427 {
428 if (nb_domaine_ == 1)
429 nom_bord = "Joint_Proc_";
430 else
431 nom_bord = dom.le_nom() + "Joint_Proc_";
432 Nom namep(p);
433 nom_bord += namep;
434 nom_bord += "_avec_Proc_";
435 nom_bord += Nom(dom.joint(i).PEvoisin());
436 }
437 // Le processeur p envoie nom_bord a tout le monde
438 envoyer_broadcast(nom_bord, p);
439 Faces toto;
440 Cerr << me() << " INFO " << p << " " << nom_bord << finl;
441 Faces& faces = (me() == p ? dom.joint(i).faces() : toto);
442 barrier();
443 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi, 1);
444 barrier();
445 }
446
447 }
448 }
449 //////////////////////////
450 // Ecriture des sous_domaines
451 //////////////////////////
452 int nb_ss_domaines = dom.nb_ss_domaines();
453 int nb_elem_tot = dom.nb_elem_tot();
454 for (int i = 0; i < nb_ss_domaines; i++)
455 {
456 const Sous_Domaine& la_ss_domaine = dom.ss_domaine(i);
457 int nbpoly = la_ss_domaine.nb_elem_tot();
458 IntVect ch_elemb2(nb_elem);
459 int cell = 0;
460 for (int pol = 0; pol < nbpoly; pol++)
461 {
462 int elem = la_ss_domaine[pol];
463 if (elem < nb_elem)
464 {
465 ch_elemb2[elem] = (i + 1);
466 cell++;
467 }
468 else if (elem >= nb_elem_tot)
469 {
470 Cerr << "This subdomaine is poorly defined." << finl;
471 Cerr << "It is composed of elements which do not belong" << finl;
472 Cerr << "to the domain!" << finl;
474 }
475 }
476 trustIdType subdomaine_cells = mp_sum(cell);
477 Cerr << "We handle the subdomain #" << i << " which has " << subdomaine_cells << " cells." << finl;
478 Faces bidon;
479 Nom nom_post;
480 nom_post = "Sous_Domaine_";
481 nom_post += la_ss_domaine.le_nom();
482 traite_bord(dom, ch_som, ch_elemb2, 1, bidon, nom_post, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi, 2);
483 }
484 }
485 int fin = 1;
486 post.finir(fin);
487}
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
int_t nb_elem_tot() const
Definition Domaine.h:132
Raccord_t & raccord(int i)
Definition Domaine.h:248
int rang_frontiere(const Nom &) const
Definition Domaine.cpp:1052
const Frontiere_t & frontiere(int i) const
Definition Domaine.h:539
int nb_ss_domaines() const
Definition Domaine.h:289
int nb_joints() const
Definition Domaine.h:259
IntTab_t & les_elems()
Definition Domaine.h:129
int_t nb_elem() const
Definition Domaine.h:131
Bord_t & bord(int i)
Definition Domaine.h:193
int nb_bords() const
Definition Domaine.h:192
Joint_t & joint(int i)
Definition Domaine.h:261
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
Definition Domaine.h:121
int nb_raccords() const
Definition Domaine.h:247
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
static Domaine_dis_base & Build_or_get(const Nom &type, const Domaine &dom, const Discretisation_base *disc=nullptr)
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void associer_domaine(const Domaine_t &z)
Definition Faces.h:94
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
Definition Faces.h:89
int_t nb_faces() const
Definition Faces.h:66
void calculer_centres_gravite(DoubleTab_t &xv) const
Calcule les centres de gravite de chaque face.
Definition Faces.cpp:776
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
Definition Faces.h:130
int nb_som_faces() const
Renvoie le nombre de sommet par face.
Definition Faces.h:149
Classe de base des formats de postraitements pour les champs (lata, med, cgns, lml,...
virtual void set_single_lata_option(const bool)
virtual int initialize(const Nom &file_basename, const int format, const Nom &option_para)
virtual int finir(const int est_le_dernier_post)
virtual void set_postraiter_domain()
virtual void ecrire_domaine_dual(const Domaine &domaine, const int est_le_premier_post)
virtual int init_ecriture(double temps_courant, double temps_post, int est_le_premier_postraitement_pour_nom_fich_, const Domaine &domaine)
virtual int ecrire_champ(const Domaine &domaine, const Noms &unite_, const Noms &noms_compo, int ncomp, double temps_, const Nom &id_du_champ, const Nom &id_du_domaine, const Nom &localisation, const Nom &nature, const DoubleTab &data)
Ecriture d'un champ dans le fichier de postraitement.
virtual int initialize_by_default(const Nom &file_basename)
Initialise le fichier avec des parametres appropries pour son format (exemple: format ascii,...
virtual int ecrire_temps(const double temps)
Commence l'ecriture d'un pas de temps.
virtual int ecrire_entete(const double temps_courant, const int reprise, const int est_le_premier_post)
virtual int ecrire_domaine_dis(const Domaine &domaine, const OBS_PTR(Domaine_dis_base)&domaine_dis_base, const int est_le_premier_post)
virtual int ecrire_domaine(const Domaine &domaine, const int est_le_premier_post)
Ecriture d'un maillage.
virtual int preparer_post(const Nom &id_du_domaine, const int est_le_premier_post, const int reprise, const double t_init)
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Frontiere.h:49
const Faces_t & faces() const
Definition Frontiere.h:54
int PEvoisin() const
Definition Joint.h:49
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 char * getChar() const
Definition Nom.h:91
Nom nom_me(int, const char *prefix=0, int without_padding=0) const
Insere _prefix000n (n=me() ou nproc()) dans un nom de fichier (par ex:toto.
Definition Nom.cpp:387
virtual int debute_par(const char *const n) const
Definition Nom.cpp:319
Nom & prefix(const char *const)
Definition Nom.cpp:329
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
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
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
Definition Param.cpp:496
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
Definition Param.cpp:32
Postraiter_domaine allows to write one or more domains in a file with a specified format (MED,...
Entree & interpreter_(Entree &) override
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
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 double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
Definition Process.cpp:136
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Classe de base des flux de sortie.
Definition Sortie.h:52
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
int_t nb_elem_tot() const
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133