Arcane  v3.15.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{
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();
73 send_buf.setMode(ISerializer::ModePut);
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();
86 recv_buf.setMode(ISerializer::ModeGet);
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;
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();
111 if (i_group ==end_var)
112 // Ne devrait pas arriver
113 continue;
114 if (i_group->second!=nb_rank){
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.
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....
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & fullName() const
Nom du groupe.
Definition ItemGroup.h:82
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Implémentation d'un tampon pour la sérialisation.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
Integer getInteger() override
Récupère une taille.
void put(Span< const Real > values) override
Ajoute le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
void putInteger(Integer value) override
Ajoute l'entier value.
void get(RealArrayView values) override
Récupère le tableau values.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.