Arcane  v3.14.10.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:120
Implémentation d'un tampon pour la sérialisation.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
void reserve(eDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
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.
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.