16#include <Champ_Generique_Reduction_0D.h>
17#include <Discretisation_base.h>
18#include <TRUSTTab_parts.h>
19#include <communications.h>
20#include <Probleme_base.h>
21#include <Synonyme_info.h>
23#include <Domaine_VF.h>
40 LIST(Motcle) mot_compris;
41 mot_compris.add(
"min");
42 mot_compris.add(
"max");
43 mot_compris.add(
"euclidian_norm");
44 mot_compris.add(
"normalized_euclidian_norm");
45 mot_compris.add(
"moyenne");
46 mot_compris.add(
"somme");
47 mot_compris.add(
"moyenne_ponderee");
48 mot_compris.add(
"somme_ponderee");
49 mot_compris.add(
"moyenne_ponderee_porosite");
50 mot_compris.add(
"somme_ponderee_porosite");
51 mot_compris.add(
"valeur_a_gauche");
52 mot_compris.add(
"L2_norm");
53 mot_compris.add(
"L1_norm");
54 mot_compris.add(
"average");
55 mot_compris.add(
"sum");
56 mot_compris.add(
"weighted_average");
57 mot_compris.add(
"weighted_sum");
58 mot_compris.add(
"weighted_average_porosity");
59 mot_compris.add(
"weighted_sum_porosity");
60 mot_compris.add(
"left_value");
65 Cerr <<
"Method " <<
methode_ <<
" is an unknown option for methode keyword in "<<
que_suis_je() <<
"." << finl;
66 Cerr <<
"Choose from " << mot_compris << finl;
96 if (directive==
"pression")
100 Cerr<<
"Problem with the "<<
que_suis_je()<<
" post processing field named "<<nom_champ[0]<<
"."<<finl;
101 Cerr<<
"The source field named "<<nom_source[0]<<
" of this last "<<
que_suis_je()<<
" field "<<finl;
102 Cerr<<
"must be previously interpolated at the elem or som location."<<finl;
103 Cerr<<
"Please use instead the syntax : "<<finl;
104 Cerr<<
"..."<<
que_suis_je()<<
" { source Interpolation { localisation ... } ... }"<<finl;
105 Cerr<<
"or contact TRUST support."<<finl;
122 double minp=mp_min_vect(coords);
126 const Domaine& domaine =zvf.
domaine();
128 double dmin=DMAXFLOAT;
131 for (
int ele=0; ele<nb_elem; ele++)
139 for (
int s=0; s<nb_som_elem; s++)
145 d+=(xp-minp)*(xp-minp);
153 double dming=
mp_min(dmin);
158 envoyer(elemin,0,97);
164 for (
int p=1; p<
nproc(); p++)
168 recevoir(dminloc,p,97);
169 recevoir(eleminloc,p,97);
179 if (!est_egal(dmin,dming))
181 Cerr<<
" iiiiiiiiiii "<<dmin<<
" "<<dming<<finl;
195 OWN_PTR(
Champ_base) source_espace_stockage_tmp;
201 espace_stockage = creer_espace_stockage(nature_source,
nb_comp,es_tmp);
202 return espace_stockage;
221 Process::exit(
"PolyMAC_HFV/PolyMAC_MPFA face field not supported yet for Reduction_0D");
224 if (!espace_stockage_)
225 creer_espace_stockage(nature_source,
nb_comp,espace_stockage_);
227 espace_stockage_->changer_temps(
get_time());
234 ConstDoubleTab_parts valeurs_source_parts(source.
valeurs());
235 const DoubleTab& valeurs_source = valeurs_source_parts[0];
236 DoubleTab& espace_valeurs = espace_stockage_->valeurs();
238 double val_extraite=-100.;
244 extraire(val_extraite,valeurs_source,basis_function,order);
245 espace_valeurs = val_extraite;
250 int size_vect = valeurs_source.
dimension(0);
251 DoubleTrav vect_source;
252 vect_source.
resize(size_vect);
253 for (
int comp=0; comp<
nb_comp; comp++)
256 ToDo_Kokkos(
"Code but check test!");
257 CDoubleTabView valeurs = valeurs_source.
view_ro();
258 DoubleArrView vect =
static_cast<ArrOfDouble&
>(vect_source).view_wo();
259 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_vect, KOKKOS_LAMBDA(
const int i)
261 vect(i) = valeurs(i,comp);
263 end_gpu_timer(__KERNEL_NAME__);
265 extraire(val_extraite,vect_source,basis_function,order);
267 DoubleTabView valeurs = espace_valeurs.
view_wo();
268 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_vect, KOKKOS_LAMBDA(
const int i)
270 valeurs(i,comp) = val_extraite;
272 end_gpu_timer(__KERNEL_NAME__);
279 extraire(val_extraite,valeurs_source,basis_function);
280 espace_valeurs = val_extraite;
284 for (
int comp=0; comp<
nb_comp; comp++)
286 int size_vect = valeurs_source.
dimension(0);
290 ToDo_Kokkos(
"critical, warning check you have a NR test case with .son !");
291 for (
int i=0; i<valeurs_source.
dimension(0); i++)
296 DoubleTrav vect_source;
304 if (loc==Entity::ELEMENT)
306 else if (loc==Entity::NODE)
308 else if (loc==Entity::FACE)
315 vect_source.
resize(size_vect);
320 CDoubleTabView valeurs = valeurs_source.
view_ro();
321 DoubleArrView vect =
static_cast<ArrOfDouble&
>(vect_source).view_wo();
322 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_vect, KOKKOS_LAMBDA(
const int i)
324 vect(i) = valeurs(i,comp);
326 end_gpu_timer(__KERNEL_NAME__);
330 ToDo_Kokkos(
"critical, warning check you have a NR test case with .son !");
332 for (
int i=0; i<valeurs_source.
dimension(0); i++)
336 vect_source(i) = valeurs_source(i);
339 vect_source(k) = valeurs_source(i);
345 extraire(val_extraite,vect_source,basis_function,(nb_dim==
nb_comp?-1:comp));
349 DoubleTabView valeurs = espace_valeurs.
view_wo();
350 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_vect, KOKKOS_LAMBDA(
const int i)
352 valeurs(i,comp) = val_extraite;
354 end_gpu_timer(__KERNEL_NAME__);
358 ToDo_Kokkos(
"critical, warning check you have a NR test case with .son !");
359 for (
int i=0; i<valeurs_source.
dimension(0); i++)
361 espace_valeurs(i) = val_extraite;
367 return espace_stockage_;
378 val_extraite = mp_min_vect(val_source);
382 val_extraite = mp_max_vect(val_source);
390 else if (
methode_==
"euclidian_norm")
392 val_extraite = mp_norme_vect(val_source);
394 else if (
methode_==
"normalized_euclidian_norm")
396 DoubleVect val_un(val_source);
398 val_extraite = mp_norme_vect(val_source)/mp_norme_vect(val_un);
409 const DoubleVect& volumes = zvf.
volumes();
413 Cerr <<
"The mesh volumes of the domain " << zvf.
domaine().
le_nom() <<
" are not available yet." << finl;
414 Cerr <<
"It is not implemented yet." << finl;
431 Cerr <<
"Error in Champ_Generique_Reduction_0D::extraire" << finl;
445 int nb_faces_par_elem = zvf.
elem_faces().dimension_tot(1);
447 ToDo_Kokkos(
"Code but check test!");
448 for (
int i=0; i<nb_elem; i++)
449 for (
int j=0; j<nb_faces_par_elem; j++)
455 if (composante_VDF>=0)
461 ToDo_Kokkos(
"Code but check test!");
462 for (
int i=0; i<nb_face; i++)
464 if (ori(i)==composante_VDF)
473 ToDo_Kokkos(
"Code but check test!");
474 for (
int i=0; i<nb_face; i++)
476 if (ori(i)==composante_VDF)
485 Cerr <<
"Error in Champ_Generique_Reduction_0D::extraire" << finl;
493 ToDo_Kokkos(
"Code but check test!");
494 for (
int i=0; i<nb_face; i++)
501 ToDo_Kokkos(
"Code but check test!");
502 for (
int i=0; i<nb_face; i++)
509 Cerr <<
"Error in Champ_Generique_Reduction_0D::extraire" << finl;
519 int nb_som = zvf.
nb_som();
526 ToDo_Kokkos(
"Code but check test!");
527 for (
int i=0; i<nb_elem; i++)
528 for (
int j=0; j<nb_som_par_elem; j++)
536 ToDo_Kokkos(
"Code but check test!");
537 for (
int i=0; i<nb_som; i++)
544 ToDo_Kokkos(
"Code but check test!");
545 for (
int i=0; i<nb_som; i++)
552 Cerr <<
"Error in Champ_Generique_Reduction_0D::extraire" << finl;
556 val_extraite =
mp_sum(sum);
559 val_extraite = sqrt(val_extraite);
577 Cerr <<
"The mesh volumes of the domain " << zvf.
domaine().
le_nom() <<
" are not available yet." << finl;
578 Cerr <<
"It is not implemented yet." << finl;
585 zvf.
compute_average(val_source, sum, volume, basis_function, composante_VDF);
597 int nb_faces_par_elem = zvf.
elem_faces().dimension_tot(1);
599 CIntTabView elem_faces = zvf.
elem_faces().view_ro();
600 CDoubleArrView volumes = zvf.
volumes().view_ro();
602 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {nb_elem, nb_faces_par_elem}), KOKKOS_LAMBDA(
const int i,
const int j)
604 int face = elem_faces(i,j);
605 Kokkos::atomic_add(&volume_controle(face), volumes(i)/nb_faces_par_elem);
607 end_gpu_timer(__KERNEL_NAME__);
609 if (composante_VDF>=0)
611 ToDo_Kokkos(
"Code but check test!");
614 for (
int i=0; i<nb_face; i++)
626 CDoubleArrView val = val_source.view_ro();
627 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), nb_face, KOKKOS_LAMBDA(
const int i,
double & sum_tmp,
double & volume_tmp)
629 double vc = volume_controle(i);
630 sum_tmp += val(i) * vc;
633 end_gpu_timer(__KERNEL_NAME__);
641 int nb_som = zvf.
nb_som();
646 const DoubleVect& volumes = zvf.
volumes();
649 ToDo_Kokkos(
"Code but check test!");
650 for (
int i=0; i<nb_elem; i++)
651 for (
int j=0; j<nb_som_par_elem; j++)
657 ToDo_Kokkos(
"Code but check test!");
658 for (
int i=0; i<nb_som; i++)
668 val_extraite /= volume;
670 else if (
methode_==
"moyenne_ponderee_porosite" ||
methode_==
"somme_ponderee_porosite" ||
methode_==
"weighted_average_porosity" ||
methode_==
"weighted_sum_porosity")
679 const DoubleVect& volumes = zvf.
volumes();
683 Cerr <<
"The mesh volumes of the domain " << zvf.
domaine().
le_nom() <<
" are not available yet." << finl;
684 Cerr <<
"It is not implemented yet." << finl;
689 Cerr<<
" you must define the porosity "<<finl;
705 const DoubleVect& poro= source2.
valeurs();
707 ToDo_Kokkos(
"Code but check test!");
712 Cerr<<
que_suis_je()<<
" not implemented for this localisation "<<finl;
720 if (
methode_==
"moyenne_ponderee_porosite" ||
methode_==
"weighted_average_porosity")
721 val_extraite /= volume;
728 if (!un_.get_md_vector())
731 if (loc == Entity::ELEMENT)
733 else if (loc == Entity::NODE)
735 else if (loc == Entity::FACE)
742 val_extraite = mp_prodscal(val_source,un_);
748 if (loc==Entity::FACE && composante_VDF>=0)
754 DoubleArrView un = un_.view_wo();
755 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_face, KOKKOS_LAMBDA(
const int i)
757 if (ori(i)!=composante_VDF)
760 end_gpu_timer(__KERNEL_NAME__);
762 val_extraite = mp_somme_vect(val_source) / mp_somme_vect(un_);
766 Cerr <<
"Error in Champ_Generique_Reduction_0D::extraire" << finl;
777 envoyer(val_extraite,
me(),-1,98);
784 Cerr <<
"Method " <<
methode_ <<
" is an unknown option for methode keyword." << finl;
793 motcles[0] =
"composantes";
794 int rang = motcles.
search(query);
801 int nb_comp = source_compos.size();
823 Nom nom_post_source, nom_champ_source;
825 nom_champ_source = nom[0];
826 nom_post_source =
"Reduction_0D_";
827 nom_post_source += nom_champ_source;
837 return "champ_fonc_quad_dg";
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe de base des champs generiques ayant comme source d'autres champs generiques L'utilisation des ...
Entity get_localisation(const int index=-1) const override
Renvoie le type des entites geometriques sur auxquelles les valeurs discretes sont attachees (NODE po...
LIST(OWN_PTR(Champ_Generique_base)) sources_
virtual int get_nb_sources() const
const Noms get_property(const Motcle &query) const override
Renvoie la propriete demandee.
void completer(const Postraitement_base &post) override
virtual const Champ_Generique_base & get_source(int i) const
void set_param(Param ¶m) const override
const Domaine_dis_base & get_ref_domaine_dis_base() const override
Renvoie une ref au domaine_discretisee du domaine sur lequel sera evalue l espace de stockage.
double get_time() const override
Renvoie le temps du Champ_Generique_base.
virtual const int nb_comp
class Champ_Generique_Reduction_0D
void extraire(double &val_extraites, const DoubleVect &val_source, const bool basis_function, const int composante_VDF=-1) const
const Noms get_property(const Motcle &query) const override
Renvoie la propriete demandee.
const Champ_base & get_champ(OWN_PTR(Champ_base)&espace_stockage) const override
Reduction_0D du champ source (au sens qu on le rend uniforme) en fonction de la methode (min,...
const Motcle get_directive_pour_discr() const override
Renvoie la directive (champ_elem, champ_sommets, champ_face ou pression) pour lancer la discretisatio...
void nommer_source() override
void completer(const Postraitement_base &post) override
DoubleVect volume_controle_
void set_param(Param ¶m) const override
const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const override
virtual const Noms get_property(const Motcle &query) const
Renvoie la propriete demandee.
virtual const Domaine_dis_base & get_ref_domaine_dis_base() const
Renvoie une ref au domaine_discretisee du domaine sur lequel sera evalue l espace de stockage.
virtual const Champ_base & get_champ(OWN_PTR(Champ_base) &espace_stockage) const =0
virtual const Nom & get_nom_post() const
virtual const Champ_base & get_champ_without_evaluation(OWN_PTR(Champ_base)&espace_stockage) const =0
void nommer(const Nom &nom) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
virtual const Motcle get_directive_pour_discr() const
Renvoie la directive (champ_elem, champ_sommets, champ_face ou pression) pour lancer la discretisatio...
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
DoubleTab_t & les_sommets()
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme element.
int nb_faces() const
renvoie le nombre global de faces.
virtual double compute_L1_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
virtual double compute_L2_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
double volumes(int i) const
virtual const IntVect & orientation() const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
virtual void compute_average_porosity(const DoubleVect &val_source, const DoubleVect &porosity, double &sum, double &volume, const bool basis_function, const int order) const
virtual void compute_average(const DoubleVect &val_source, double &sum, double &volume, const bool basis_function, const int order) const
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.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual int nb_vect_comp() const
virtual int nb_comp() const
bool is_quadrature() const
virtual Nature_du_champ nature_du_champ() const
bool is_basis_function() const
int order_field() const
Renvoie l'ordre des fonctions de base.
Une chaine de caractere (Nom) en majuscules.
int debute_par(const char *const n) const override
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
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.
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.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Classe de base pour l'ensemble des postraitements.
static double mp_min(double)
static void mp_sum_for_each(T &arg1, T &arg2)
C++14 compatible mp_sum_for_each: combine multiple mp_sum calls into one collective operation Usage: ...
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
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 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.
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")