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