Arcane  v4.1.2.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.
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.