Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CommonItemGroupFilterer.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CommonItemGroupFilterer.cc (C) 2000-2021 */
9/* */
10/* Filtrage des groupes communs à toutes les parties d'un maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/CommonItemGroupFilterer.h"
15
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/FatalErrorException.h"
18
19#include "arcane/SerializeBuffer.h"
20#include "arcane/IParallelMng.h"
21#include "arcane/IItemFamily.h"
22
23#include <map>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane::mesh
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34CommonItemGroupFilterer::
35CommonItemGroupFilterer(IItemFamily* family)
36: m_family(family)
37{
38}
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43void CommonItemGroupFilterer::
44addGroupToFilter(const ItemGroup& group)
45{
46 m_input_groups.add(group);
47}
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52void CommonItemGroupFilterer::
53applyFiltering()
54{
55 UniqueArray<ItemGroup> groups_to_check;
56 for( List<ItemGroup>::Enumerator i(m_input_groups); ++i; )
57 groups_to_check.add(*i);
58 IParallelMng* pm = m_family->parallelMng();
59 ITraceMng* tm = m_family->traceMng();
60
61 Integer nb_group = groups_to_check.size();
62 tm->info(4) << "CHECK: nb_group_to_compare=" << nb_group;
63
64 // Créé un buffer pour sérialiser les noms des groupes
65 SerializeBuffer send_buf;
66 send_buf.setMode(ISerializer::ModeReserve);
67 send_buf.reserveInteger(1);
68 for( Integer i=0; i< nb_group; ++i ){
69 send_buf.reserve(groups_to_check[i].fullName());
70 }
71
72 send_buf.allocateBuffer();
74 send_buf.putInteger(nb_group);
75 for( Integer i=0; i< nb_group; ++i ){
76 send_buf.put(groups_to_check[i].fullName());
77 }
78
79 // Récupère les infos des autres PE.
80 SerializeBuffer recv_buf;
81 pm->allGather(&send_buf,&recv_buf);
82
83 std::map<String,Int32> group_occurences;
84
85 Int32 nb_rank = pm->commSize();
87 for( Integer i=0; i<nb_rank; ++i ){
88 Integer nb_group_rank = recv_buf.getInteger();
89 for( Integer z=0; z< nb_group_rank; ++z ){
90 String x;
91 recv_buf.get(x);
92 auto vo = group_occurences.find(x);
93 if (vo== group_occurences.end())
94 group_occurences.insert(std::make_pair(x,1));
95 else
96 vo->second = vo->second + 1;
97 }
98 }
99
100 // Parcours la liste des groupes et range dans \a common_groups
101 // ceux qui sont disponibles sur tous les rangs de \a pm.
102 // Cette liste sera triée par ordre alphabétique.
103 std::map<String,ItemGroup> common_groups;
104 UniqueArray<String> bad_groups;
105 {
106 auto end_var = group_occurences.end();
107 for( Integer i=0; i< nb_group; ++i ){
108 ItemGroup group = groups_to_check[i];
109 String group_name = group.fullName();
110 auto i_group = group_occurences.find(group_name);
111 if (i_group ==end_var)
112 // Ne devrait pas arriver
113 continue;
114 if (i_group->second!=nb_rank){
115 bad_groups.add(group_name);
116 continue;
117 }
118 common_groups.insert(std::make_pair(group_name, group));
119 }
120 }
121
122 if (!bad_groups.empty())
123 ARCANE_FATAL("The following ItemGroup are not on all mesh parts: {0}",bad_groups);
124
125 m_sorted_common_groups.clear();
126 for( const auto& x : common_groups )
127 m_sorted_common_groups.add(x.second);
128}
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132
133} // End namespace Arcane::mesh
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void put(Span< const Real > values) override
Ajoute le tableau values.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
Integer getInteger() override
Récupère une taille.
void get(ArrayView< Real > values) override
Récupère le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
void putInteger(Integer value) override
Ajoute l'entier value.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
@ ModePut
Le sérialiseur attend des reserve()
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & fullName() const
Nom du groupe.
Definition ItemGroup.h:82
ListEnumeratorT< T > Enumerator
Type d'un itérateur constant sur tout le tableau.
Definition List.h:243
Implémentation d'un tampon pour la sérialisation.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.