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>
24Implemente_instanciable(
Postraiter_domaine,
"Postraiter_domaine", Interprete_geometrique_base);
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)
35 const Domaine& dom = domaine;
39 int nb_elem_tot = domaine.nb_elem_tot();
45 DoubleTab ch_elem2(nb_elem, 1);
52 for (j = 0; j < nb_faces; j++)
53 for (k = 0; k < nb_som_faces; k++)
62 ch_som(som) = (ch_som(som) + num) / 2;
72 for (
int e = 0; e < nb_elem; e++)
74 for (j = 0; j < nb_faces; j++)
77 for (k = 0; k < nb_som_faces; k++)
80 for (
int kk = 0; kk < taille1; kk++)
82 if (les_elems(e, kk) == som)
92 if (m == nb_som_faces - 1)
99 const IntTab& faces_voisin = faces.
voisins();
100 if (faces_voisin.
dimension(0) > 0 && local_max_vect(faces_voisin) != -1)
103 for (j = 0; j < nb_faces; j++)
105 int el1 = faces_voisin(j, 0);
107 el1 = faces_voisin(j, 1);
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;
124 for (j = 0; j < nb_faces; j++)
127 position(0, dir) = xv(j, dir);
128 domaine.chercher_elements(position, res);
132 domaine.chercher_elements(position, res);
136 domaine.chercher_elements(position, res);
140 if (res[0] < nb_elem)
145 Cerr <<
"To properly view the joints, the splitting area must be complete " << finl;
148 Cerr <<
"Problem in Postraiter_domaine.cpp with the boundary " << nom_bord << finl;
154 ch_elem3[res[0]] = num;
159 if (nb_elem >= nb_elem_tot)
168 for (
int s = 0; s < nb_elem; s++)
169 ch_elem2(s, 0) = (ch_elem3[s]);
172 noms_post[0] = nom_bord;
176 post.
ecrire_champ(dom, unites, noms_post, -1, 0., nom_bord, nom_dom,
"ELEM",
"scalar", ch_elem2);
197 nom_pdb =
"NOM_DU_CAS";
198 param.
ajouter(
"fichier|file", &nom_pdb);
204 param.
ajouter(
"domaine|domain", &un_dom);
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.");
218 Cerr <<
"You must specify one or several domains" << finl;
221 if (nom_pdb ==
"NOM_DU_CAS")
236 if (motcle ==
"domaines")
242 Cerr <<
"we expected { and not " << mot << finl;
255 Cerr << motcle <<
" not understood by Postraiter_domaine::lire_motcle_non_standard" << finl;
265 int compteur0 = -123;
266 int compteur_reel = 0;
267 bool is_single_lata =
false;
271 is_single_lata =
true;
275 Nom type(
"Format_Post_");
278 post_typer.typer(type.
getChar());
288 format_post_bis =
"lata";
290 suffix += format_post_bis;
292 int est_le_premie_post = 0;
293 if (format_post_bis !=
"lata")
297 for (
int numero_domaine = 0; numero_domaine <
nb_domaine_; numero_domaine++)
299 if (numero_domaine == 0)
300 est_le_premie_post = 1;
302 est_le_premie_post = 0;
305 const Domaine& dom =
domaine(numero_domaine);
321 for (
int numero_domaine = 0; numero_domaine <
nb_domaine_; numero_domaine++)
323 if (numero_domaine == 0)
324 est_le_premie_post = 1;
326 est_le_premie_post = 0;
327 const Domaine& dom =
domaine(numero_domaine);
336 for (
int numero_domaine = 0; numero_domaine <
nb_domaine_; numero_domaine++)
338 Domaine& dom =
domaine(numero_domaine);
340 const IntTab& les_elems = dom.
les_elems();
341 IntVect ch_som(dom.
nb_som());
343 IntVect ch_elem2(nb_elem);
348 if (
format_post_ !=
"lata" || dom.domaines_frontieres().size() == 0)
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;
359 for (
int i = 0; i < nb_bords; i++)
366 envoyer(nom_fr, 0, -1, 11);
368 recevoir(nom_fr, 0,
me(), 11);
373 nom_bord = dom.
le_nom() +
"_" + nom_fr;
375 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi);
380 for (
int i = 0; i < nb_raccords; i++)
385 envoyer(nom_fr, 0, -1, 11);
387 recevoir(nom_fr, 0,
me(), 11);
390 nom_bord =
Nom(
"Raccord_") + nom_fr;
392 nom_bord = dom.
le_nom() +
Nom(
"_Raccord_") + nom_fr;
395 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi);
403 noms_post[0] =
"Bord";
405 noms_post[0] = dom.
le_nom() +
"_Bord";
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);
419 for (
int p = 0; p <
nproc(); p++)
422 envoyer_broadcast(nb_joint, p);
423 for (
int i = 0; i < nb_joint; i++)
429 nom_bord =
"Joint_Proc_";
431 nom_bord = dom.
le_nom() +
"Joint_Proc_";
434 nom_bord +=
"_avec_Proc_";
438 envoyer_broadcast(nom_bord, p);
440 Cerr <<
me() <<
" INFO " << p <<
" " << nom_bord << finl;
441 Faces& faces = (
me() == p ? dom.
joint(i).
faces() : toto);
443 traite_bord(dom, ch_som, ch_elem2, num, faces, nom_bord, fichier, les_elems, post, compteur, compteur0, compteur_reel, moi, 1);
454 for (
int i = 0; i < nb_ss_domaines; i++)
456 const Sous_Domaine& la_ss_domaine = dom.
ss_domaine(i);
458 IntVect ch_elemb2(nb_elem);
460 for (
int pol = 0; pol < nbpoly; pol++)
462 int elem = la_ss_domaine[pol];
465 ch_elemb2[elem] = (i + 1);
468 else if (elem >= nb_elem_tot)
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;
476 trustIdType subdomaine_cells =
mp_sum(cell);
477 Cerr <<
"We handle the subdomain #" << i <<
" which has " << subdomaine_cells <<
" cells." << finl;
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);
const Sous_Domaine_t & ss_domaine(int i) const
int_t nb_elem_tot() const
Raccord_t & raccord(int i)
int rang_frontiere(const Nom &) const
const Frontiere_t & frontiere(int i) const
int nb_ss_domaines() const
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
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,...
void associer_domaine(const Domaine_t &z)
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
void calculer_centres_gravite(DoubleTab_t &xv) const
Calcule les centres de gravite de chaque face.
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
int nb_som_faces() const
Renvoie le nombre de sommet par face.
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.
const Faces_t & faces() const
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const char * getChar() const
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.
virtual int debute_par(const char *const n) const
Nom & prefix(const char *const)
Un tableau de chaine de caracteres (VECT(Nom)).
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
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.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
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.
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
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...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.
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