Arcane dispose d'un mécanisme d'équilibrage de la charge en redistribuant entre sous-domaines les mailles d'un maillage. Ce mécanisme gère l'échange des entités du maillage ainsi que les variables associées. Il est donc en grande partie transparent pour l'utilisateur.
La gestion de l'équilibrage se fait via deux interfaces :
La classe MeshCriteriaLoadBalanceMng implémentant l'interface ICriteriaLoadBalanceMng permet, lors de l'initialisation, de spécifier une ou plusieurs variables aux mailles qui contiendront le poids de chaque maille pour le calcul de la charge.
ISubDomain::loadBalance()
pour définir les critères est maintenant obsolète.Par exemple :
mesh_criteria
peut être détruit sans problème après utilisation. Les variables enregistrées le seront encore après sa destruction.Le calcul du poids est du ressort du code utilisateur. Le partitionneur va ensuite redistribuer le maillage en tentant d'équilibrer au mieux les poids sur l'ensemble des sous-domaines. Par exemple, si une méthode couteuse est appelée un nombre différent de fois pour chaque maille, il est possible de remplir cells_weight avec le nombre d'appels effectué.
En général après un repartitionnement ces variables qui servent de critères doivent être remises à zéro.
Le repartitionnement et l'équilibrage se font via le service d'interface IMeshPartitioner. Il est possible d'obtenir une instance de ce service en spécifiant la ligne suivante dans le fichier 'axl':
Dans ce cas, le partitionneur sera accessible via la méthode suivante :
Pour programmer un repartitionnement au cours du calcul, il faut appeler ITimeLoopMng::registerActionMeshPartition() en spécifiant le partitionneur souhaité. Le repartitionnement et sera effectué à la fin de l'itération courante. Dans un module, on peut donc faire comme cela :
Le repartionnement effectue le transfert de toutes les entités de maillage et les variables associées. Si le code utilisateur a besoin de faire d'autres opérations après un équilibrage, il est possible de spécifier un point d'entrée pour cela. Dans la boucle en temps, les points d'entrée avec l'attribut 'where="on-mesh-changed"' sont appelés après un équilibrage. Par exemple :
Arcane gérant le multi-maillage, il est aussi possible d'équilibrer la charge de plusieurs maillages.
L'équilibrage est indépendant pour chaque maillage (dans le futur, il sera possible de définir des critères pour équilibrer plusieurs maillages qui nécessitent un équilibrage "commun").
Prenons deux maillages :
Et reprenons l'exemple précédent mais avec deux maillages :
En ce qui concerne les instances du service de partitionneur, il est possible de spécifier un maillage dans l'axl via l'attribut mesh-name
:
Enfin, pour la programmation du repartitionnement au cours du calcul, il est possible de faire :