Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshPartitionerTesterService.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/* MeshPartitionerTesterService.cc (C) 2000-2022 */
9/* */
10/* Testeur de partitionneur de maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/CheckedConvert.h"
16
17#include "arcane/IParallelMng.h"
18#include "arcane/ISubDomain.h"
19#include "arcane/CommonVariables.h"
20#include "arcane/IMesh.h"
21#include "arcane/IMeshSubMeshTransition.h"
22#include "arcane/IMeshUtilities.h"
23#include "arcane/FactoryService.h"
24#include "arcane/ServiceFactory.h"
25#include "arcane/Service.h"
26#include "arcane/ItemPrinter.h"
27#include "arcane/IMeshPartitioner.h"
28#include "arcane/BasicService.h"
29
30#include "arcane/IMeshPartitionConstraintMng.h"
31#include "arcane/impl/MeshPartitionerTesterService_axl.h"
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane
37{
38// TODO: a terme (mi 2022), supprimer l'implémentation de 'IMeshPartitioner' et ne
39// garder que celle de 'IMeshPartitionerBase'.
40// Cela permettra de supprimer toutes les méthodes avec des NotImplementedException.
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
54, public IMeshPartitioner
55{
56 public:
57
58 public:
59
61
62 public:
63
64 IMesh* mesh() const override { return BasicService::mesh(); }
65
66 void build() override {}
67 void partitionMesh(bool initial_partition) override;
68 void partitionMesh(bool initial_partition,Int32 nb_part) override
69 {
70 ARCANE_UNUSED(initial_partition);
71 ARCANE_UNUSED(nb_part);
72 throw NotImplementedException(A_FUNCINFO);
73 }
74
75 void notifyEndPartition() override {}
76
77 public:
78
79 void setMaximumComputationTime(Real v) override { m_max_computation_time = v; }
80 Real maximumComputationTime() const override { return m_max_computation_time; }
81 void setComputationTimes(RealConstArrayView v) override { m_computation_times.copy(v); }
82 RealConstArrayView computationTimes() const override { return m_computation_times; }
83 void setImbalance(Real v) override { m_imbalance = v; }
84 Real imbalance() const override { return m_imbalance; }
85 void setMaxImbalance(Real v) override { m_max_imbalance =v ; }
86 Real maxImbalance() const override { return m_max_imbalance; }
87
88 ArrayView<float> cellsWeight() const override { return m_cells_weight; }
89
91 {
92 m_cells_weight = weights;
93 m_nb_weight = nb_weight;
94 }
95
97 {
98 throw NotImplementedException(A_FUNCINFO);
99 }
100
101 ILoadBalanceMng* loadBalanceMng() const override
102 {
103 throw NotImplementedException(A_FUNCINFO);
104 }
105
106 private:
107
108 Real m_imbalance;
109 Real m_max_imbalance;
110 Real m_max_computation_time;
111 Integer m_nb_weight;
112 ArrayView<float> m_cells_weight;
113 RealUniqueArray m_computation_times;
114};
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
119MeshPartitionerTester::
120MeshPartitionerTester(const ServiceBuildInfo& sbi)
121: ArcaneMeshPartitionerTesterServiceObject(sbi)
122, m_imbalance(0.0)
123, m_max_imbalance(0.0)
124, m_max_computation_time(0.0)
125, m_nb_weight(0)
126{
127}
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131
134{
135 IPrimaryMesh* mesh = this->mesh()->toPrimaryMesh();
136
137 Int32 sub_rank_divider = 0;
138 if (options()){
139 sub_rank_divider = options()->subRankDivider();
140 }
141 info() << "Using MeshPartitionerTester sub_rank_divider=" << sub_rank_divider;
142
143 ISubDomain* sd = subDomain();
144 IParallelMng* pm = sd->parallelMng();
145 Int32 nb_rank = pm->commSize();
146 Int32 sid = pm->commRank();
147
148 if (nb_rank==1){
149 warning() << "Can't test the mesh repartionning with"
150 << "only one subdomain...";
151 return;
152 }
153
155
157 // Le but est d'avoir un partitionnement correct mais pas
158 // parfait, notamment dans le cas des pavés, car après
159 // un vrai partitionneur n'a rien à faire.
160 // Pour le partitionnement initial, considère que le maillage
161 // initial génère les mailles de localId() similaires topologiquement
162 // proches les unes des autres.
163 // Si on prend une suite consécutive de mailles, on a donc un
164 // bloc de maille pas trop mal foutu. Pour tester le partionneur,
165 // on génère 3x plus de blocs que de sous-domaines et on les
166 // réparti entre les sous-domaines.
167 Int64 nb_cell = mesh->ownCells().size();
168 Int64 nb_bloc = nb_rank * 3;
169 Int64 cell_index = 0;
171 Cell cell = *icell;
172 // Utilise des Int64 plutôt que des Int32 pour être sur de ne pas déborder.
173 Int64 new_owner = ((cell_index * nb_bloc) / nb_cell) % nb_rank;
175 ++cell_index;
176 }
177 }
178 else{
179 Integer current_iteration = sd->commonVariables().globalIteration();
180 Integer nb_cell = mesh->ownCells().size();
181
182 //Integer max_cell_index = (nb_rank+1)*5;
183 Integer max_cell_index = nb_cell / 2;
184
185 {
186 Integer cell_index = 0;
188 Cell cell = *i_cell;
189 Int32 new_owner = cell.owner();
190 if (cell_index<(max_cell_index+(sid*10))){
191 // Force la premiere maille à rester dans ce sous-domaine
192 // pour être sur qu'il en reste au moins une.
193 if (cell_index!=0){
194 Int32 xx = (new_owner*2 + current_iteration + cell_index/10 + 17) % nb_rank;
195 if (sub_rank_divider>0){
197 xx = (xx*sub_rank_divider + new_owner) % nb_rank;
198 }
199 new_owner = xx;
200 }
201 ++cell_index;
202 }
204 }
205 }
206 }
207
208 cells_new_owner.synchronize();
210 // Deal with Tied Cells
211 mesh->partitionConstraintMng()->computeAndApplyConstraints();
212 }
213 mesh->utilities()->changeOwnersFromCells();
214}
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
218
220 ServiceProperty("MeshPartitionerTester",ST_SubDomain|ST_CaseOption),
223 );
224
225/*---------------------------------------------------------------------------*/
226/*---------------------------------------------------------------------------*/
227
228} // End namespace Arcane
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
CaseOptionsMeshPartitionerTesterService * options() const
Options du jeu de données du service.
Maille d'un maillage.
Definition Item.h:1178
Interface d'enregistrement des variables pour l'equilibrage de charge.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
Interface d'un partitionneur de maillage.
Interface d'un partitionneur de maillage.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual IMeshPartitionConstraintMng * partitionConstraintMng()=0
Gestionnaire des contraintes de partitionnement associées à ce maillage.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:229
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe de test du repartionnement de maillage.
void setCellsWeight(ArrayView< float > weights, Integer nb_weight) override
Permet de définir les poids des objets à partitionner : on doit utiliser le ILoadBalanceMng maintenan...
void notifyEndPartition() override
Notification lors de la fin d'un repartionnement (après échange des entités)
Real maxImbalance() const override
Déséquilibre maximal autorisé
void setMaximumComputationTime(Real v) override
Positionne la proportion du temps de calcul.
void setILoadBalanceMng(ILoadBalanceMng *) override
Change le ILoadBalanceMng à utiliser.
void setComputationTimes(RealConstArrayView v) override
Temps de calcul de se sous-domaine. Le premier élément indique le temps de calcul du sous-domaine cor...
Real imbalance() const override
Déséquilibre de temps de calcul.
void setImbalance(Real v) override
Positionne le déséquilibre de temps de calcul.
IMesh * mesh() const override
Maillage associé au partitionneur.
void build() override
Construction de niveau build du service.
void partitionMesh(bool initial_partition) override
void setMaxImbalance(Real v) override
Positionne le déséquilibre maximal autorisé
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
Vue constante d'un tableau de type T.
Exception lorsqu'une fonction n'est pas implémentée.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:521
@ IK_Cell
Entité de maillage de genre maille.