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>
44class PartitionerMemoryInfo;
82 m_var = StoreIProxyItemVariable::proxyItemVariableFactory(
var,
pos);
86 if (m_var != src.
m_var)
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";
155 Int32 length = m_family_names.
size();
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;
209 return m_overall_memory[offset];
213 _computeMemCell(cell);
214 return m_buffer.overall_memory;
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];
267 contrib = _computeMemContrib<Node>(cell.nodes());
268 m_buffer.overall_memory += contrib * m_overall_memory[
IK_Node];
269 m_buffer.resident_memory += contrib * m_resident_memory[
IK_Node];
271 contrib = _computeMemContrib<Face>(cell.faces());
272 m_buffer.overall_memory += contrib * m_overall_memory[
IK_Face];
273 m_buffer.resident_memory += contrib * m_resident_memory[
IK_Face];
275 contrib = _computeMemContrib<Edge>(cell.edges());
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;
317 void init(
IMesh* mesh);
321 if (!m_is_edited_mass_criterion)
327 m_is_edited_mass_criterion =
true;
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();
342 Integer nbCriteria();
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())
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; }
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;
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;
429 Integer nbCriteria(
IMesh* mesh)
override;
431 void reset(
IMesh* mesh)
override;
432 void initAccess(
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;
API interne à Arcane de ILoadBalanceMng.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
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.
Interface d'une variable.
virtual String itemFamilyName() const =0
Nom de la famille associée (nul si aucune).
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.
@ 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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe de base d'un objet avec compteur de référence.
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é.
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.
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
-*- 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)
@ 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.
@ DT_String
Donnée de type chaîne de caractère UTF-8.
Int32 Integer
Type représentant un entier.
Système de cache pour l'accès aux mémoires relatives à une maille.