16#include <Moyenne_volumique.h>
17#include <communications.h>
18#include <Equation_base.h>
19#include <Postraitement.h>
20#include <Octree_Double.h>
21#include <Domaine_VF.h>
51 param.dictionnaire(
"BOITE",
BOITE);
52 param.dictionnaire(
"CHAPEAU",
CHAPEAU);
54 param.dictionnaire(
"QUADRA",
QUADRA);
55 param.dictionnaire(
"PARSER",
PARSER);
57 param.ajouter(
"omega", &
l_);
59 param.lire_avec_accolades_depuis(is);
74 Cerr <<
"Error : OMEGA must be set to >= 0" << finl;
83 Cerr <<
"Error : EXPRESSION must be specified for the parser." << finl;
89 std::transform(s.begin(), s.end(), s.begin(), ::toupper);
102 Cerr <<
"l_ = " <<
l_ <<
"box_size_ = " <<
box_size_ << finl;
111inline double fonction_quadra(
double x,
double l_)
113 assert(std::fabs(x) <= l_);
114 double ax = 1. - std::fabs(x) / l_;
116 if (std::fabs(x) < (l_/3.))
118 double bx = -3. / l_ * std::fabs(x) + 1.;
121 return ax * (27. / (16. * l_));
136 for (
int i = 0; i < n; i++)
138 for (
int j = 0; j < dim; j++)
139 parser_.setVar(j, coords(i,j));
148 facteur = 1. / (
l_ *
l_ * 4.);
150 facteur = 1. / (
l_ *
l_ *
l_ * 8.);
152 for (
int i = 0; i < n; i++)
154 const double x = coords(i,0);
155 const double y = coords(i,1);
156 const double z = (dim==3) ? coords(i,2) : 0.;
158 if (x >
l_ || x < -
l_
160 || z >
l_ || z < -
l_)
169 const double L3D = L2D*
l_*
l_;
174 facteur = 1. / (L2D *
l_);
176 for (
int i = 0; i < nbis; i++)
178 const double x = coords(i, 0);
179 const double y = coords(i, 1);
180 const double z = (dim == 3) ? coords(i, 2) : 0.;
182 const double ax = std::fabs(x);
183 const double ay = std::fabs(y);
184 const double az = std::fabs(z);
185 if (ax <=
l_ && ay <=
l_ && az <=
l_)
186 resu = (
l_-ax) * (
l_-ay) * (
l_-az) * facteur;
193 double facteur1 = - 0.5 / (
l_ *
l_);
194 double facteur2 = 1. / (
l_ * sqrt(2 * M_PI));
196 facteur2 = facteur2 * facteur2;
198 facteur2 = facteur2 * facteur2 * facteur2;
199 for (
int i = 0; i < n; i++)
201 const double x = coords(i, 0);
202 const double y = coords(i, 1);
203 const double z = (dim == 3) ? coords(i, 2) : 0.;
204 const double k = (x*x + y*y + z*z) * facteur1;
205 result[i] = exp(k) * facteur2;
211 for (
int i = 0; i < n; i++)
213 const double x = coords(i, 0);
214 const double y = coords(i, 1);
215 const double z = (dim == 3) ? coords(i, 2) : 0.;
217 if (std::fabs(x) <
l_ && std::fabs(y) <
l_ && std::fabs(z) <
l_)
219 resu = fonction_quadra(x,
l_) * fonction_quadra(y,
l_);
221 resu *= fonction_quadra(z,
l_);
229 Cerr <<
"Error in Moyenne_volumique::eval() : filter function is not initialized." << finl;
241 const Nom& nom_champ,
247 Motcle mc_nom_champ(nom_champ);
248 for (
int i_post = 0; i_post < nb_post; i_post++)
254 const int nstat = stats.size();
255 for (
int i_stat = 0; i_stat < nstat; i_stat++)
259 if (tmp == mc_nom_champ)
282 const Nom& nom_pb,
const Nom& nom_dom,
283 const DoubleTab& coords,
286 const Motcle& localisation)
288 const Domaine& dom_post = ref_cast(Domaine,
objet(nom_dom));
289 const int nb_champs = noms_champs.size();
298 int nb_compo_tot = 0;
299 for (i_champ = 0; i_champ < nb_champs; i_champ++)
301 get_champ(nom_pb, noms_champs[i_champ], ref_champ);
306 ref_domaine_vf = zvf;
310 if (& (ref_domaine_vf.valeur()) != & zvf)
312 Cerr <<
"Error in Moyenne_volumique::traiter_champs all the fields must be discretized on the same Domaine." << finl;
317 const int nb_compo = champ.nb_comp();
318 nb_compo_tot += nb_compo;
321 const Domaine_VF& domaine_source = ref_domaine_vf.valeur();
325 DoubleTab valeurs_src;
326 const int nb_lignes = domaine_source.
nb_elem();
327 valeurs_src.
resize(nb_lignes, nb_compo_tot + 1);
331 IntVect liste_elems(nb_lignes);
332 for (
int i = 0; i < nb_lignes; i++)
334 const DoubleTab& xp = domaine_source.
xp();
335 for (i_champ = 0; i_champ < nb_champs; i_champ++)
337 get_champ(nom_pb, noms_champs[i_champ], ref_champ);
339 const int nb_compo = champ.
nb_comp();
341 tmp_val.
resize(nb_lignes, nb_compo);
342 champ.valeur_aux_elems(xp, liste_elems, tmp_val);
344 for (
int i = 0; i < nb_lignes; i++)
345 for (
int j = 0; j < nb_compo; j++)
346 valeurs_src(i, count+j) = tmp_val(i, j);
349 Cout <<
"Field name = " << ref_champ->le_nom()
350 <<
" Field type = " << ref_champ->que_suis_je() << finl;
354 for (
int i = 0; i < nb_lignes; i++)
355 valeurs_src(i, count) = 1.;
358 const int nb_coords = coords.
dimension(0);
359 DoubleTab resu(nb_coords, nb_compo_tot + 1);
373 for (i_champ = 0; i_champ < nb_champs; i_champ++)
375 get_champ(nom_pb, noms_champs[i_champ], ref_champ);
377 const int nb_compo = champ.
nb_comp();
378 DoubleTab extrait(nb_coords, nb_compo);
379 for (
int i = 0; i < nb_coords; i++)
380 for (
int j = 0; j < nb_compo; j++)
381 extrait(i, j) = resu(i, count + j);
383 Cout <<
"Post writting " << champ.le_nom() << finl;
384 Nom nature(
"scalar");
385 if (champ.nature_du_champ()==vectoriel) nature=
"vector";
390 noms_champs[i_champ], nom_dom, localisation,nature, extrait);
395 const int nb_compo = 1;
396 DoubleTab extrait(nb_coords, nb_compo);
397 for (
int i = 0; i < nb_coords; i++)
398 for (
int j = 0; j < nb_compo; j++)
399 extrait(i, j) = resu(i, count + j);
405 noms_compo.add(
"porosite");
406 nom_moyenne =
"porosite";
407 Cout <<
"Porosity post writing" << finl;
411 nom_moyenne, nom_dom, localisation,
"scalar",extrait);
431 Cerr <<
"Starting of Moyenne_volumique::interpreter" << finl;
435 const int id_elem = 0;
436 const int id_som = 1;
437 int localisation = id_elem;
438 Motcle format_post(
"lata_v1");
439 Nom nom_fichier_post;
450 param.
ajouter(
"fichier_post", & fichier_post);
451 param.
ajouter(
"format_post", & format_post);
453 param.
ajouter(
"nom_fichier_post", & nom_fichier_post);
473 param.
ajouter(
"localisation", & localisation);
481 const Domaine& dom = ref_cast(Domaine,
objet(nom_dom));
482 if (noms_champs.size() == 0)
484 Cerr <<
"Moyenne_volumique : no field to treat" << finl;
487 Cerr <<
"Writing of the post-processing domain : " << nom_dom << finl;
489 get_champ(nom_pb, noms_champs[0], ref_champ);
490 const double temps = ref_champ->temps();
493 if (nom_fichier_post ==
"??")
495 Cerr <<
"Error in Moyenne_volumique::interpreter:\n"
496 <<
" missing NOM_FICHIER_POST or FICHIER_POST keyword" << finl;
500 if (format_post ==
"lata_v2")
501 format_post =
"lata";
504 if (nom_fichier_post ==
"NOM_DU_CAS")
506 Cerr <<
"Post filename = NOM_DU_CAS => using " <<
nom_du_cas() <<
" instead" << finl;
509 fichier_post.typer(
Motcle(
"FORMAT_POST_") + format_post);
510 fichier_post->initialize(nom_fichier_post, 1 ,
"SIMPLE");
514 if (nom_fichier_post !=
"??")
516 Cerr <<
"Error in Moyenne_volumique::interpreter:\n"
517 <<
" you cannot give NOM_FICHIER_POST and FICHIER_POST. Choose one" << finl;
529 if (localisation == id_elem)
541 if (localisation == id_som)
563 const DoubleTab& champ_source);
564 void calculer(
double x,
double y,
double z, ArrOfDouble& resu);
585 const DoubleTab& champ_source) :
595 DoubleTab coords = domaine_source.
xp();
601 Cerr <<
"Error in Calcul_integrale_locale::Calcul_integrale_locale() :\n"
602 <<
" The source field is not discretized at the elements" << finl;
606 octree_.build_nodes(coords, 0 );
620 const double box_size =
filter_.box_size();
621 octree_.search_elements_box(x - box_size, y - box_size, z - box_size,
622 x + box_size, y + box_size, z + box_size,
630 for (
int i = 0; i < nb_items; i++)
645 for (
int i = 0; i < nb_items; i++)
649 const double volume = volumes(item);
650 const double facteur = valeur_filtre * volume;
651 for (
int j = 0; j < nb_comp; j++)
656 resu[j] += valeur_champ * facteur;
668 const DoubleTab& champ_source,
669 const DoubleTab& coords_to_compute,
670 DoubleTab& resu)
const
675 const int nb_coords_to_compute = coords_to_compute.
dimension(0);
676 const int nb_coords_max =
mp_max(nb_coords_to_compute);
682 DoubleTab coords(nbproc, 3);
683 ArrOfInt flag(nbproc);
684 ArrOfDouble resu_partiel(nb_comp);
685 DoubleTab resu_partiels(nbproc, nb_comp);
697 for (
int i_coord = 0; i_coord < nb_coords_max; i_coord++)
700 if (i_coord < nb_coords_to_compute)
702 for (j = 0; j < dim; j++)
704 double x = coords_to_compute(i_coord, j);
705 for (i = 0; i < nbproc; i++)
714 envoyer_all_to_all(coords, coords);
715 envoyer_all_to_all(flag, flag);
724 for (i = 0; i < nbproc; i++)
728 integrale_locale.
calculer(coords(i, 0), coords(i, 1), coords(i, 2), resu_partiel);
729 for (j = 0; j < nb_comp; j++)
730 resu_partiels(i, j) = resu_partiel[j];
735 envoyer_all_to_all(resu_partiels, resu_partiels);
737 if (i_coord < nb_coords_to_compute)
739 for (j = 0; j < nb_comp; j++)
742 for (i = 0; i < nbproc; i++)
743 x += resu_partiels(i, j);
744 resu(i_coord, j) = x;
759 const DoubleTab& champ_source,
760 const DoubleTab& coords_to_compute,
761 DoubleTab& resu)
const
765 coords_to_compute, resu);
778 const DoubleTab& champ_source,
779 const DoubleTab& coords_to_compute,
780 DoubleTab& resu)
const
782 Cerr <<
" Moyenne_volumique::calculer_convolution_champ_face is not coded" << finl;
: classe outil utilisee en interne dans calculer_convolution()
const DoubleTab & champ_source_
void calculer(double x, double y, double z, ArrOfDouble &resu)
evalue le produit de convolution "filter_ * champ_source_" au point x,y,z et stocke le resultat dans ...
const Moyenne_volumique & filter_
ArrOfDouble filter_results_
Calcul_integrale_locale(const Domaine_VF &domaine_source, const Moyenne_volumique &filter, const DoubleTab &champ_source)
constructeur de la classe outil.
const Domaine_VF & domaine_source_
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_base Cette classe est la base de la hierarchie des champs.
void calculer_centres_gravite(DoubleTab_t &xp) const
Calcule les centres de gravites des elements du domaine.
DoubleTab_t & les_sommets()
double xp(int num_elem, int k) const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual int nb_comp() const
Classe de base des formats de postraitements pour les champs (lata, med, cgns, lml,...
virtual int finir(const int est_le_dernier_post)
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 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(const Domaine &domaine, const int est_le_premier_post)
Ecriture d'un maillage.
const Champ_Fonc_base & le_champ_calcule() const
Classe de base des objets "interprete".
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
: cet interprete permet, a la fin du calcul (apres "resoudre"), de calculer et de stocker dans un fic...
virtual void calculer_convolution_champ_elem(const Domaine_VF &domaine_source, const DoubleTab &champ_source, const DoubleTab &coords_to_compute, DoubleTab &resu) const
Calcule le produit de convolution entre la fonction filtre et le champ "champ_source" qui doit etre d...
virtual void calculer_convolution_champ_face(const Domaine_VF &domaine_source, const DoubleTab &champ_source, const DoubleTab &coords_to_compute, DoubleTab &resu) const
Idem que calculer_convolution_champ_elem pour un champ VDF aux faces.
int get_champ(const Nom &nom_pb, const Nom &nom_champ, OBS_PTR(Champ_base) &ref_champ)
Cherche le champ de nom "nom_champ" dans le probleme de nom "nom_pb" dans les objers de l'interprete.
virtual void calculer_convolution(const Domaine_VF &domaine_source, const DoubleTab &champ_source, const DoubleTab &coords_to_compute, DoubleTab &resu) const
methode generale pour calculer une convolution a partir d'un champ aux elements ou aux faces.
void traiter_champs(const Motcles &noms_champs, const Nom &nom_pb, const Nom &nom_dom, const DoubleTab &coords, Format_Post_base &post, double temps, const Motcle &localisation)
fonction outil permettant de faire les calculs et d'ecrire le resultat dans un fichier lata pour tous...
Entree & interpreter(Entree &) override
Lecture des parametres dans le jeu de donnees.
virtual void eval_filtre(const DoubleTab &coords, ArrOfDouble &result) const
Evalue la fonction filtre en chaque coordonnee coord Methode appelee dans la classe Calcul_integrale_...
class Nom Une chaine de caractere pour nommer les objets de TRUST
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 double precision_geom
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Statistique_tps_base Represente des operations statistiques sur les champs.
virtual const Integrale_tps_Champ & integrale() const =0
virtual DoubleTab calculer_valeurs() const =0
classe Operateurs_Statistique_tps Cette classe represente une liste d'operateurs statistiques en temp...
Helper class to factorize the readOn method of Objet_U classes.
void dictionnaire(const char *option_name, int value)
Add an (option name, integer value) entry to the dictionary attached to a previously registered integ...
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
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...
Operateurs_Statistique_tps & les_statistiques()
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Champ_base & get_champ(const Motcle &nom) const override
Postraitements & postraitements()
static double mp_max(double)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const