Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshPartitionerBase.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* MeshPartitionerBase.h (C) 2000-2024 */
9/* */
10/* Classe de base d'un partitionneur de maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESHPARTITIONERBASE_H
13#define ARCANE_MESHPARTITIONERBASE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <set>
18
19#include "arcane/core/IMeshPartitioner.h"
20#include "arcane/core/AbstractService.h"
21#include "arcane/core/ILoadBalanceMng.h"
22
23#include "arcane/utils/Array.h"
24#include "arcane/utils/HashTableMap.h"
25#include "arcane/utils/ScopedPtr.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36class ISubDomain;
37
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
45class ARCANE_STD_EXPORT MeshPartitionerBase
46: public AbstractService
47, public IMeshPartitioner
48{
49 public:
50
52 ~MeshPartitionerBase() override;
53
54 public:
55
56 ISubDomain* subDomain() const { return m_sub_domain; }
57 IMesh* mesh() const { return m_mesh; }
58
59 // DEPRECATED
60 void setMaximumComputationTime(Real v) override { m_maximum_computation_time = v; }
61 virtual Real maximumComputationTime() const { return m_maximum_computation_time; }
62
63 virtual void setImbalance(Real v){ m_imbalance = v; }
64 virtual Real imbalance() const { return m_imbalance; }
65
66 virtual void setMaxImbalance(Real v){ m_max_imbalance = v; }
67 virtual Real maxImbalance() const { return m_max_imbalance; }
68
69 virtual void setComputationTimes(RealConstArrayView v) { m_computation_times.copy(v); }
70 virtual RealConstArrayView computationTimes() const { return m_computation_times; }
71
72 virtual void setCellsWeight(ArrayView<float> weights,Integer nb_weight);
73 virtual ArrayView<float> cellsWeight() const;
74
75 // CORRECT
76 virtual Integer nbCellWeight() const;
77 virtual void setILoadBalanceMng(ILoadBalanceMng* mng) { m_lbMng = mng; }
78 virtual ILoadBalanceMng* loadBalanceMng() const { return m_lbMng; }
79
80
81 public:
82
83 virtual void notifyEndPartition() { loadBalanceMng()->notifyEndPartition(); }
84
85 public:
86
94 virtual void changeOwnersFromCells();
95
96 enum eMarkCellWithConstraint {eCellClassical, eCellReference, eCellGrouped, eCellGhost, eCellInAConstraint};
97
98 /* \brief Initialise les structures pour le cas avec des contraintes de découpage */
99 virtual void initConstraints(bool uidref=true);
100
101 /* \brief Libération des tableaux temporaires */
102 virtual void freeConstraints();
103
104 /* \brief Retourne le nombre de Cell après regroupement suivant les contraintes, internes */
105 virtual Int32 nbOwnCellsWithConstraints() const;
106
107 /* \brief Renseigne sur la liste des uniqueId des Cell voisines d'une cell en tenant compte des contraintes */
108 virtual Real getNeighbourCellsUidWithConstraints(Cell cell, Int64Array& neighbourcells, Array<float> *commWeights = NULL,
109 bool noCellContrib = false);
110
111 virtual Integer nbNeighbourCellsWithConstraints(Cell cell);
112
113 /* \brief Renseigne sur la liste des uniqueId des Nodes voisins, utile pour le modele HG */
114 virtual void getNeighbourNodesUidWithConstraints(Cell cell, Int64UniqueArray neighbournodes);
115
116 /* \brief Retourne le local id pour une Cell en tenant compte des contraintes et en compactant la numérotation
117 retourne -1 pour les mailles à ne pas utiliser */
118 virtual Int32 localIdWithConstraints(Cell cell);
119 virtual Int32 localIdWithConstraints(Int32 cell_lid);
120
121 /* \brief Renverse le fonctionnement de localIdWithConstraints */
122 virtual void invertArrayLid2LidCompacted();
123
124 /* \brief Retourne le[s] poids associés aux Cell en tenant compte des contraintes
125 max_nb_weight à 0 s'il n'y a pas de limites
126 */
127 virtual SharedArray<float> cellsWeightsWithConstraints(Int32 max_nb_weight=0, bool ask_lb_cells=false);
128
129 virtual SharedArray<float> cellsSizeWithConstraints();
130
131
132 /* \brief Retourne vrai si la maille est utilisée malgrès les contraintes
133 si c'est faux il est nécessaire de la passer lors d'un ENUMERATE_CELL */
134 virtual bool cellUsedWithConstraints(Cell cell);
135
136 virtual bool cellUsedWithWeakConstraints(std::pair<Int64,Int64>& paired_item);
137
138 /* \brief Affecte le nouveau numéro de proc à la mailles et autres du même groupe/contrainte s'il y a lieu */
139 virtual void changeCellOwner(Item cell, VariableItemInt32& cells_new_owner, Int32 new_owner);
140
141
142 /* \brief Retourne vrai s'il a des contraintes dans le maillage
143 Nécessite d'avoir fait initArrayCellsWithConstraints */
144 virtual bool haveConstraints() {return m_cells_with_constraints.size() > 0;}
145
146 virtual bool haveWeakConstraints() {return m_cells_with_weak_constraints.size() > 0;}
147
148 protected:
149
151 virtual void dumpObject(String filename="toto");
152
153 virtual void* getCommunicator() const;
154 virtual Parallel::Communicator communicator() const;
155
156
157 virtual bool cellComm() {return true; }
158
159protected:
160 virtual void _initArrayCellsWithConstraints();
161 virtual void _initFilterLidCells();
162 virtual void _initUidRef();
163 virtual void _initUidRef(VariableCellInteger& cell_renum_uid);
164 virtual void _initLid2LidCompacted();
165 virtual void _initNbCellsWithConstraints();
166 virtual void _clearCellWgt();
167
168 private:
169 Real _addNgb(const Cell& cell, const Face& face, Int64Array& neighbourcells, Array<bool>& contrib,
170 HashTableMapT<Int64,Int32>& map, Array<float> *ptrcommWeights, Int32 offset,
171 HashTableMapT<Int32,Int32>& lids, bool special=false);
172 bool _createConstraintsLists(Int64MultiArray2& tied_uid);
173
174 SharedArray<float> _cellsProjectWeights(VariableCellArrayReal& cellWgtIn, Int32 nbWgt) const;
175 SharedArray<float> _cellsProjectWeights(VariableCellReal& cellWgtIn) const;
176
177 private:
178
179 ISubDomain* m_sub_domain = nullptr;
180 IMesh* m_mesh = nullptr;
181 IParallelMng* m_pm_sub = nullptr; // sous communicateur pour les bibliotheques de partitionnement.
182
183 protected:
184
185 IItemFamily* m_cell_family = nullptr;
186
187 private:
188
189 ILoadBalanceMng* m_lbMng = nullptr;
190 ILoadBalanceMngInternal* m_lb_mng_internal = nullptr;
191
192 Real m_maximum_computation_time = 0.0;
193 Real m_imbalance = 0.0;
194 Real m_max_imbalance = 0.0;
195 RealUniqueArray m_computation_times;
196
197 // Utile en interne pour construire le graphe/hypergraphe
198 UniqueArray<SharedArray<Cell> > m_cells_with_constraints;
199 std::set<std::pair<Int64, Int64> > m_cells_with_weak_constraints;
200 Integer m_nb_cells_with_constraints = 0;
201 UniqueArray<eMarkCellWithConstraint> m_filter_lid_cells;
202 Int32UniqueArray m_local_id_2_local_id_compacted;
203 VariableCellInt64* m_unique_id_reference = nullptr;
204
205 void _checkCreateVar();
206 Int32UniqueArray m_check;
207};
208
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
213} // namespace Arcane
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218#endif
Classe de base d'un service.
Interface d'enregistrement des variables pour l'equilibrage de charge.
Interface d'un partitionneur de maillage.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe de base d'un service d'équilibrage de charge.
IMesh * mesh() const
Maillage associé au partitionneur.
virtual void setMaxImbalance(Real v)
Positionne le déséquilibre maximal autorisé
virtual void setILoadBalanceMng(ILoadBalanceMng *mng)
Change le ILoadBalanceMng à utiliser.
virtual Real imbalance() const
Déséquilibre de temps de calcul.
virtual void notifyEndPartition()
Notification lors de la fin d'un repartionnement (après échange des entités)
virtual void setComputationTimes(RealConstArrayView v)
Temps de calcul de se sous-domaine. Le premier élément indique le temps de calcul du sous-domaine cor...
void setMaximumComputationTime(Real v) override
Positionne la proportion du temps de calcul.
virtual Real maxImbalance() const
Déséquilibre maximal autorisé
virtual void setImbalance(Real v)
Positionne le déséquilibre de temps de calcul.
Structure contenant les informations pour créer un service.
Vue constante d'un tableau de type T.
MeshVariableScalarRefT< Cell, Int64 > VariableCellInt64
Grandeur au centre des mailles de type entier 64 bits.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:521
Int32 Integer
Type représentant un entier.