12#ifndef ARCANE_IMPL_INTERNAL_LOADBALANCEMNGINTERNAL_H
13#define ARCANE_IMPL_INTERNAL_LOADBALANCEMNGINTERNAL_H
17#include "arcane/core/internal/ILoadBalanceMngInternal.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/IVariable.h"
21#include "arcane/core/VariableBuildInfo.h"
23#include "arcane/core/IVariableMng.h"
24#include "arcane/core/VariableTypes.h"
25#include "arcane/core/CommonVariables.h"
26#include "arcane/core/VariableCollection.h"
27#include "arcane/core/IItemFamily.h"
28#include "arcane/core/IParallelMng.h"
30#include "arcane/utils/ObjectImpl.h"
31#include "arcane/utils/AutoRef.h"
32#include "arcane/utils/ScopedPtr.h"
33#include "arcane/utils/FatalErrorException.h"
34#include "arcane/utils/ArgumentException.h"
36#include <unordered_map>
76class ARCANE_IMPL_EXPORT StoreIProxyItemVariable
85 StoreIProxyItemVariable(
const StoreIProxyItemVariable& src) {
101 Integer getPos()
const {
102 return m_var->getPos();
107 static IProxyItemVariable* proxyItemVariableFactory(IVariable* var, Integer pos=0);
130 : m_family_names(
IK_Unknown + 1,
"__special__")
132 m_family_names[
IK_Cell] =
"Cell";
133 m_family_names[
IK_Face] =
"Face";
134 m_family_names[
IK_Edge] =
"Edge";
135 m_family_names[
IK_Node] =
"Node";
143 pos = _findEntity(entity);
145 pos = m_family_names.size();
146 m_family_names.add(entity);
156 m_overall_memory.
resize(length);
157 m_resident_memory.
resize(length);
159 m_overall_memory.
fill(0);
160 m_resident_memory.
fill(0);
170 catch (
const ArgumentException&) {
174 Int32 family_index = -1;
178 if (family_index >= 0) {
179 m_overall_memory[family_index] += memory;
182 m_overall_memory[kind] += memory;
191 m_resident_memory[kind] += memory;
192 if (family_index >= 0) {
193 m_resident_memory[family_index] += memory;
201 Integer pos = _findEntity(entity);
209 return m_overall_memory[offset];
213 _computeMemCell(cell);
214 return m_buffer.overall_memory;
220 Integer pos = _findEntity(entity);
228 return m_resident_memory[offset];
232 _computeMemCell(cell);
233 return m_buffer.resident_memory;
239 return _findEntity(entity);
243 return m_family_names[i];
248 Integer _findEntity(
const String& entity)
const
250 for (
int i = 0; i < m_family_names.
size(); ++i) {
251 if (m_family_names[i] == entity)
258 void _computeMemCell(Cell cell)
261 if (cell.localId() == m_buffer.id)
263 m_buffer.id = cell.localId();
264 m_buffer.overall_memory = m_overall_memory[
IK_Cell];
265 m_buffer.resident_memory = m_resident_memory[
IK_Cell];
268 m_buffer.overall_memory += contrib * m_overall_memory[
IK_Node];
269 m_buffer.resident_memory += contrib * m_resident_memory[
IK_Node];
272 m_buffer.overall_memory += contrib * m_overall_memory[
IK_Face];
273 m_buffer.resident_memory += contrib * m_resident_memory[
IK_Face];
276 m_buffer.overall_memory += contrib * m_overall_memory[
IK_Edge];
277 m_buffer.resident_memory += contrib * m_resident_memory[
IK_Edge];
281 template <
typename ItemKind>
286 for (
const auto& item : list) {
287 contrib += 1.0 / (
Real)(item.nbCell());
300 Real overall_memory = 0;
301 Real resident_memory = 0;
313 CriteriaMng(
bool use_legacy_init);
319 void defaultMassCriterion(
bool mass_criterion)
321 if (!m_is_edited_mass_criterion)
322 m_use_mass_as_criterion = mass_criterion;
325 void setMassCriterion(
bool mass_criterion)
327 m_is_edited_mass_criterion =
true;
328 m_use_mass_as_criterion = mass_criterion;
331 bool useMassAsCriterion()
const {
return m_use_mass_as_criterion; }
332 bool useNbCellsAsCriterion()
const {
return m_nb_cells_as_criterion; }
334 void resetCriteria();
335 void clearVariables();
339 m_event_vars.add(criterion);
347 return *m_event_weights;
351 const VariableCellReal& massResWeight()
const {
return *m_mass_res_weight; }
354 void fillCellNewOwner()
356 if (!m_cell_new_owner.isNull())
357 m_cell_new_owner->fill(m_mesh->parallelMng()->commRank(), m_mesh->ownCells());
362 void setComputeComm(
bool active) { m_need_compute_comm = active; }
363 bool cellCommContrib()
const {
return m_cell_comm; }
364 void setCellCommContrib(
bool active) { m_cell_comm = active; }
365 void setNbCellsAsCriterion(
bool active) { m_nb_cells_as_criterion = active; }
367 bool needComputeComm()
const {
return m_need_compute_comm; }
368 bool isInit()
const {
return m_is_init; }
369 Integer addEntity(
const String& entity) {
return m_criteria->addEntity(entity); }
370 void computeCriteria();
374 void _computeOverallMass();
376 void _computeResidentMass();
377 void _computeEvents();
385 bool m_use_mass_as_criterion =
false;
386 bool m_nb_cells_as_criterion =
true;
387 bool m_cell_comm =
false;
388 bool m_need_compute_comm =
false;
389 bool m_is_edited_mass_criterion =
false;
390 bool m_is_init =
false;
398 IMesh* m_mesh =
nullptr;
405class ARCANE_IMPL_EXPORT LoadBalanceMngInternal
410 explicit LoadBalanceMngInternal(
bool mass_as_criterion,
bool is_legacy_init);
419 void setMassAsCriterion(
IMesh*
mesh,
bool active)
override;
420 void setNbCellsAsCriterion(
IMesh*
mesh,
bool active)
override;
421 void setCellCommContrib(
IMesh*
mesh,
bool active)
override;
422 void setComputeComm(
IMesh*
mesh,
bool active)
override;
428 bool cellCommContrib(
IMesh*
mesh)
override;
433 void endAccess()
override;
434 void notifyEndPartition()
override;
439 bool m_default_mass_criterion =
false;
440 bool m_is_legacy_init =
false;
441 std::unordered_map<IMesh*, Ref<CriteriaMng>> m_mesh_criterion;
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
void fill(const DataType &data)
Remplissage du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Encapsulation d'un pointeur avec compteur de référence.
API interne à Arcane de ILoadBalanceMng.
Interface proxy pour accéder aux variables définissant les poids.
virtual Real operator[](ItemEnumerator i) const =0
Accès à la valeur associée à une entité du maillage, sous forme d'un Real.
virtual Integer getPos() const =0
Accès au numéro de la famille associée.
Interface du gestionnaire de variables.
virtual VariableCollection usedVariables()=0
Liste des variables utilisées.
Interface d'une variable.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
virtual String itemFamilyName() const =0
Nom de la famille associée (nul si aucune).
@ PNoExchange
Indique que la variable ne doit pas être échangée.
@ PTemporary
Indique que la variable est temporaire.
@ PSubDomainPrivate
Indique que la variable est privée au sous-domaine.
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
virtual int property() const =0
Retourne les propriétés de la variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
Classe de gestion des critèes de partitionnement.
Integer operator[](const String &entity) const
Gestion des entités et de leur nom.
PartitionerMemoryInfo()
Construction en fonction du IVariableMng.
Real _computeMemContrib(ItemConnectedListViewTypeT< ItemKind > list)
Calcule de la contribution d'un entité sur les mailles adjacentes.
Integer addEntity(const String &entity)
Ajoute une entité et lui attribue un numéro. Un même nom n'est pas dupliqué.
Real getResidentMemory(const String &entity) const
Retourne la mémoire "résidente" (à transférer) associée à une entité.
Real getOverallMemory(const String &entity) const
Retourne la mémoire totale associée à une entité.
Encapsulation d'un pointeur qui se détruit automatiquement.
Classe pour accéder au proxy sans déférencement dans le code.
AutoRefT< IProxyItemVariable > m_var
Pointeur vers la variable.
Real operator[](ItemEnumerator i) const
Accès à la valeur associée à une entité du maillage, sous forme d'un Real.
static IProxyItemVariable * proxyItemVariableFactory(IVariable *var, Integer pos=0)
Factory pour la constructions selon le type de variable initiale.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
MeshVariableScalarRefT< Face, Int32 > VariableFaceInt32
Grandeur aux faces de type entier 32 bits.
MeshVariableScalarRefT< Face, Real > VariableFaceReal
Grandeur aux faces de type réel.
MeshVariableScalarRefT< Cell, Int32 > VariableCellInt32
Grandeur au centre des mailles de type entier 32 bits.
MeshVariableArrayRefT< Cell, Real > VariableCellArrayReal
Grandeur au centre des mailles de type tableau de réel.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCANE_DATATYPE_EXPORT Integer dataTypeSize(eDataType type)
Taille du type de donnée type (qui doit être différent de DT_String)
Int32 Integer
Type représentant un entier.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.
ItemConnectedListViewT< ItemType > ItemConnectedListViewTypeT
Liste générique d'entités connectées.
@ DT_String
Donnée de type chaîne de caractère UTF-8.
std::int32_t Int32
Type entier signé sur 32 bits.
Système de cache pour l'accès aux mémoires relatives à une maille.