Arcane  v3.15.0.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_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
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 private:
162
163 Real _addNgb(const Cell& cell, const Face& face, Int64Array& neighbourcells, Array<bool>& contrib,
164 HashTableMapT<Int64,Int32>& map, Array<float> *ptrcommWeights, Int32 offset,
165 HashTableMapT<Int32,Int32>& lids, bool special=false);
166 bool _createConstraintsLists(Int64MultiArray2& tied_uid);
167
168 SharedArray<float> _cellsProjectWeights(VariableCellArrayReal& cellWgtIn, Int32 nbWgt) const;
169 SharedArray<float> _cellsProjectWeights(VariableCellReal& cellWgtIn) const;
170
171 private:
172
173 ISubDomain* m_sub_domain = nullptr;
174 IMesh* m_mesh = nullptr;
175 IParallelMng* m_pm_sub = nullptr; // sous communicateur pour les bibliotheques de partitionnement.
176
177 protected:
178
179 IItemFamily* m_cell_family = nullptr;
180
181 private:
182
183 ILoadBalanceMng* m_lbMng = nullptr;
184 ILoadBalanceMngInternal* m_lb_mng_internal = nullptr;
185
186 Real m_maximum_computation_time = 0.0;
187 Real m_imbalance = 0.0;
188 Real m_max_imbalance = 0.0;
189 RealUniqueArray m_computation_times;
190
191 // Utile en interne pour construire le graphe/hypergraphe
192 UniqueArray<SharedArray<Cell> > m_cells_with_constraints;
193 std::set<std::pair<Int64, Int64> > m_cells_with_weak_constraints;
194 Integer m_nb_cells_with_constraints = 0;
195 UniqueArray<eMarkCellWithConstraint> m_filter_lid_cells;
196 Int32UniqueArray m_local_id_2_local_id_compacted;
197 VariableCellInt64* m_unique_id_reference = nullptr;
198
199 void _checkCreateVar();
200 Int32UniqueArray m_check;
201};
202
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207} // namespace Arcane
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
212#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:149
Classe de base d'un service d'équilibrage de charge.
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.
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:552
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:560
Int32 Integer
Type représentant un entier.