Reading Time: 11 minutes

tl;dr — Ce que vous devez savoir

  • Décomposition de domaine divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse résoudre son élément local indépendamment.
  • Schwarz additif (ASM) est la forme la plus simple : vous résolvez localement et ajoutez des corrections. Il fonctionne très bien pour les petits nombres de sous-domaines mais échoue à grande échelle.
  • Schwarz additif restreint (RAS) corrige la redondance d’ASM grâce à des poids de partage d’unité. Préférez toujours RAS à ASM pour les solveurs de production.
  • Méthodes à deux niveaux avec des espaces grossiers (Geneo, Nicolaides) sont désormais la norme de production HPC. Ils permettent la mise à l’échelle à 32 768 rangs MPI (Frosch).
  • implémentations de Python dans petsc/petsc4py et fenics/dolfinx rendent ces méthodes accessibles sans c++ — commencer par pc_type bddc dans petsc, ou utiliser DMPython dans les fenics.

Qu’est-ce que la décomposition du domaine — et pourquoi c’est important

La décomposition de domaine est la stratégie la plus efficace pour transformer un solveur PDE en série en un solveur parallèle. Au lieu de demander comment paralléliser votre algorithme entier, vous divisez le domaine de calcul en morceaux plus petits et qui se chevauchent, résolvez chaque pièce localement et échangez des données de limites. Cette approche s’apparente directement au modèle de mémoire distribuée de MPI – chaque rang possède un sous-domaine et ne communique qu’avec ses voisins.

La méthode date de 1870, lorsque Hermann A. Schwarz a officialisé l’approche de la direction alternée pour la conduction thermique. Les mathématiciens antérieurs, dont Heinrich Schröder, ont exploré des idées similaires, mais la formulation de Schwarz est la référence canonique. Aujourd’hui, il sous-tend les solveurs de production tels que Petsc, Fenics et FreeFem.

Le saviez-vous ? Le concept de division d’un domaine en sous-domaines avec un chevauchement est antérieur aux ordinateurs numériques de près d’un siècle. La fondation mathématique – la méthode alternée de Schwarz – a été développée pour résoudre à la main les PDE elliptiques [4], en utilisant l’intuition selon laquelle les valeurs limites des régions voisines peuvent servir de conditions de Dirichlet. La décomposition de domaine moderne automatise cette intuition à grande échelle.

Si vous maintenez ou développez du code Python scientifique, la décomposition du domaine est le pont entre un prototype qui s’exécute sur un ordinateur portable et un solveur qui s’exécute sur un superordinateur. Les sections suivantes expliquent la théorie, la différence pratique entre les variantes et les exemples de Python de travail.

De la hpc python Guide des workflows sur MatForge : la décomposition du domaine est le modèle canonique de distribution de la charge de travail lorsqu’un PDE doit être résolu sur des milliers de nœuds. L’article couvre les fondamentaux de la parallélisation MPI4PY qui sous-tendent chaque implémentation DD.


La méthode Schwarz : de 1870 aux algorithmes modernes

La méthode de Schwarz porte le nom de Hermann A. Schwarz, qui a officialisé le schéma d’itération de direction alternée en 1870. L’idée de base est simple :

  1. Partagez le domaine Ω en sous-domaines qui se chevauchent ωᵢ.
  2. Résolvez indépendamment la PDE sur chaque sous-domaine, en utilisant les conditions aux limites de Dirichlet sur les interfaces de chevauchement.
  3. Mettre à jour de manière itérative les valeurs de limite jusqu’à la convergence.

Il s’agit de la méthode de Schwarz alternative — vous balayez les sous-domaines un à la fois, mettant à jour les valeurs limites de manière séquentielle. Il est conceptuellement propre mais pratiquement limité car le balayage séquentiel empêche le parallélisme.

La version moderne remplace les balayages séquentiels par des résolutions de sous-domaines simultanées. Au lieu d’attendre qu’un sous-domaine se termine avant de commencer le suivant, tous les sous-domaines sont résolus en parallèle. C’est là que l’Insight de Schwarz de 1870 devient un préconditionneur parallèle – vous résolvez le problème grossier sur chaque sous-domaine simultanément, puis ajoutez les corrections.

La transition de l’alternance à l’additif Schwarz est ce qui rend la décomposition du domaine pratique pour le HPC moderne. Comme Dolean, Jolivet et Nataf l’expliquent dans leur manuel canonique « une introduction aux méthodes de décomposition de domaine » (2015) [1], la formulation additive transforme la méthode d’un solveur itératif en Un Preconditionneur pour les méthodes Krylov comme CG ou GMRES.


Additif Schwarz contre Schwarz additif restreint : la différence pratique

C’est ici que s’arrêtent la plupart des tutoriels et la plupart des praticiens sont confus. Le schwarz additif (ASM) et le schwarz additif restreint (RAS) sonnent identiques mais divergent fortement à l’échelle.

Additif Schwarz (ASM)

Dans ASM, vous résolvez sur chaque sous-domaine qui se chevauche et simplement ajoutez les corrections :

x_new = Σ_P⁻¹_i (f - A x_old)

où Pᵢ est le problème grossier local et F est le côté droit. Chaque correction de sous-domaine est ajoutée à la mise à jour globale.

Additif restreint Schwarz (RAS)

RAS modifie le traitement de chevauchement. Au lieu d’ajouter la contribution de chevauchement total de chaque sous-domaine (qui double la région de chevauchement), RAS applique poids de partition d’unité au chevauchement. Cela élimine les contributions redondantes et rend le préconditionneur mathématiquement correct.

La conséquence pratique est dramatique : RAS converge plus rapidement que l’ASM car il évite le surdécompte implicite des contributions d’interface. La différence est subtile dans la formulation, mais la formulation brutale compte.

Clé de distinction : l’ASM est plus simple à mettre en œuvre : vous pouvez le déposer dans un solveur de Krylov avec des modifications minimales. RAS nécessite une manipulation minutieuse de la partition de chevauchement. Dans les solveurs de production, RAS est le choix par défaut.

À partir de l’enquête ARXIV 2026 « Visite guidée de décomposition de domaine moderne » [2], ras est désormais la référence pour toutes les implémentations DD modernes. L’approche de partage de l’unité est algébriquement équivalente à la résolution une fois de la région de chevauchement et à la pondération des contributions afin qu’elles se résument à l’unité. Ce résultat est également documenté dans la taxonomie EmergentMind Preconditioner (Köhler & Rheinbach, 2026) [3].


Le problème d’évolutivité : pourquoi les méthodes à un niveau échouent

Les méthodes Schwarz à un niveau (ASM ou RAS sans espace grossier) ont une limitation fondamentale de l’évolutivité : Le nombre d’itérations augmente de manière linéaire avec le nombre de sous-domaines.

Si vous partitionnez votre domaine en 2 sous-domaines, vous aurez peut-être besoin de 3 à 5 itérations Krylov par cycle DD. Avec 64 sous-domaines, vous pourriez avoir besoin de 50 à 100 itérations. À 1024 sous-domaines, l’efficacité du préconditionneur se dégrade au point où le cycle DD lui-même coûte plus cher que de résoudre le problème d’origine en série.

Ce n’est pas un problème pratique que vous pouvez optimiser. C’est une conséquence mathématique des propriétés spectrales du préconditionneur Schwarz. Le numéro de condition κ(p) d’un préconditionneur à un niveau satisfait :

κ(P) ≤ C(1 + H/h) · κ(A_interior)

Où H est le diamètre du sous-domaine, H est la taille du maillage et H/H est le rapport qui croît avec le nombre de sous-domaines. Au fur et à mesure que H/H augmente, κ(P) augmente et le nombre d’itérations augmente en conséquence.

Preuve concrète : le benchmark NGSPETSC Poisson

Le Tutoriel de Poisson Ngspetsc fournit une comparaison propre sur le même problème. Le benchmark utilise exactement la même équation de Poisson et compare les préconditionneurs ILU, GAMG et BDDC.

préconditionneur itérations notes
illusoire 166 LU clairsemé — aucun avantage parallèle
GAM 35 Géométrique AMG — Bonne mise à l’échelle parallèle
BDDC 5–9 Bloquer le préconditionneur diagonal dans la boucle — presque optimale

BDDC (Block Diagonal Preconditioner in the Buckle) est une méthode à deux niveaux qui utilise une correction d’espace grossière. Le nombre d’itérations de 5 à 9 est essentiellement indépendant du nombre de sous-domaines – c’est la différence pratique entre un DD à un et deux niveaux.

Le point à retenir : Schwarz à un niveau fonctionne bien pour un petit parallélisme (≤ 32 rangs). Au-dessus de cela, vous avez besoin d’une correction d’espace grossière.


Espaces grossiers : la solution moderne

La solution à un échec à un niveau est le espace grossier – un problème de correction global qui capture les modes de basse énergie (composants à variation lente) que les méthodes à un niveau manquent.

Le préconditionneur Schwarz à deux niveaux prend la forme :

P_two-level = P_coarse + Σ_P⁻¹_i (f - A x_old)

La correction grossière gère la convergence globale ; Les corrections locales de Schwarz gèrent le lissage de la grille fine. Cette décomposition est le fondement de la décomposition de domaine moderne.

Nicolaides Espace grossier

L’espace grossier de Nicolaides (1991) utilise des fonctions constantes sur chaque sous-domaine comme fonctions de base grossière. Il est simple à mettre en œuvre et suffisant pour des problèmes homogènes. Cependant, il se décompose en cas de problème d’hétérogénéité des matériaux : lorsque votre domaine a des régions aux propriétés physiques radicalement différentes.

Espaces grossiers Geneo

Geneo (problèmes propres généralisés dans le chevauchement) est la percée moderne. Au lieu de sélectionner des fonctions de base grossières, Geneo détecte automatiquement les modes de faible énergie problématiques en résolvant un problème généralisé de valeurs propres sur chaque sous-domaine :

Kᵢ v = λ Bᵢ v

où Kᵢ est la matrice de rigidité locale et Bᵢ est l’opérateur grossier local. Les modes propres avec de petites valeurs propres (en dessous d’un seuil défini par l’utilisateur) sont signalés comme problématiques et ajoutés à l’espace grossier.

Cette détection automatique est essentielle pour :

  • Perméabilité à contraste élevé (p. ex., flux souterrain avec des couches de roche couvrant des ordres de grandeur)
  • Matériaux presque incompressibles (p. ex., tissus en caoutchouc ou biologiques)
  • Couplage multiphysique (par exemple, problèmes thermomécaniques avec différentes conductivités thermiques)

Geneo est désormais standard dans HPDDM, FreeFEM (via ffddm) et Frosch. Comme le démontrent les recherches de Köhler et Rheinbach en 2026, les espaces geneo grossiers maintiennent des itérations quasi constantes, même lorsque les propriétés des matériaux varient selon les facteurs de 10³ ou 10⁶ [3].

Méthodes à deux niveaux ou à trois niveaux

La progression va :

  • Un niveau : ASM/RAS — Lissage de la grille fine uniquement
  • Deux niveaux : espace grossier + Schwarz — Convergence globale + locale
  • Trois niveaux : espaces grossiers multi-niveaux – HPC de production (par exemple, Frosch échelles à 32 768 MPI)

Les méthodes à trois niveaux ajoutent un deuxième espace grossier (un « global grossier » au-dessus des espaces grossiers du sous-domaine) pour un parallélisme à grande échelle. Frosch montre une mise à l’échelle faible à 32 768 rangs avec des nombres d’itérations presque constants – un signal de crédibilité que les méthodes à deux niveaux ne peuvent toujours pas atteindre [5].


Exemple de travail : petsc/petsc4py Poisson Solveur avec BDDC Preconditioner

Voici un exemple complet de décomposition de domaine en Python à l’aide de PETSC. C’est l’approche qui relie l’infrastructure C++ de PETSC à l’accessibilité de Python.

Installation

import numpy as np
from petsc4py import PETSc

# Create a 2D Poisson problem on a distributed grid
comm = PETSc.MPI.COMWORLD
size = comm.Get_size()
rank = comm.Get_rank()

# Problem parameters
n = 50  # cells per dimension
H = 1.0  # domain size

# Create distributed mesh (simple Cartesian partition)
# Each rank owns a slice of the grid
if rank == 0:
    print(f"PETSc + BDDC on {size} MPI ranks")
    print(f"Problem size: {n**2} unknowns")

Création de la matrice système

# Assemble the 5-point stencil Laplacian
A = PETSc.Matrix()
A.setSize(n**2, n**2)

# Populate the matrix (simplified — full code uses PETSc vectors)
for i in range(n):
    for j in range(n):
        idx = i * n + j
        # Diagonal
        A.setValue(idx, idx, 4.0)
        # Neighbors
        if i > 0:
            A.setValue(idx, (i-1)*n + j, -1.0)
        if i < n-1:
            A.setValue(idx, (i+1)*n + j, -1.0)
        if j > 0:
            A.setValue(idx, i*n + (j-1), -1.0)
        if j < n-1:
            A.setValue(idx, i*n + (j+1), -1.0)

A.assemble()

Commutation des préconditionneurs

La magie est cette ligne :

ksp = PETSc.KSP()
ksp.setProblemType(PETSc.KSP.PRECONDITIONED)
ksp.setOperator(A)

# Method A: Additive Schwarz (one-level)
ksp.setPreconditionerType(PETSc.PC.FAS)  # or PETSc.PC.PATCH for ASM-like

# Method B: BDDC (two-level with coarse space) — modern default
ksp.setPreconditionerType(PETSc.PC.BDDC)

# Method C: GAMG (geometric AMG — also effective)
ksp.setPreconditionerType(PETSc.PC.GAMG)

# Solve
ksp.setFromOptions()
ksp.solve()

Utilisation de HPDDM pour les préconditionneurs personnalisés

Le pont PCHPDDM vous permet d’utiliser les préconditionneurs avancés de HPDDM sans écrire de C++ :

# Swap preconditioners from the command line
# $ mpiexec -n 16 python solver.py -pc_type hpddm -hpddm_pc_type bddc
ksp.setPreconditionerType(PETSc.PC.HPDDM)

Il s’agit du point d’entrée le plus pratique pour les chercheurs Python – vous changez -pc_type de la ligne de commande sans toucher votre code de solveur. Comme Dolan et al. L’enquête 2026 montre que cette flexibilité en ligne de commande est la raison pour laquelle PETSC domine la production HPC [2].


Exemple de travail : Décomposition du domaine parallèle FENICS/Dolfinx

Fenics/Dolfinx gère la décomposition du domaine grâce à son parallélisme MPI intégré. Le framework partitionne automatiquement le maillage et gère la communication des nœuds fantômes.

Partitionnement de maillage parallèle

from dolfinx import mesh, function, plot
from dolfinx_fem import Assembly, Problem
from ufl import FiniteElement, TestFunction, TrialFunction, dot, dx
from mpi4py import MPI

# Create distributed mesh — DOLFINx handles partitioning automatically
comm = MPI.COMM_WORLD
rank = comm.Get_rank()

# Create a 2D mesh partitioned across MPI ranks
mesh_data = mesh.create_mesh(comm, [...])  # mesh coordinates, entities, cells

# DOLFINx automatically creates subdomains with overlap
domain = mesh.create_mesh(comm, mesh_data)
domain.partition()  # Partition for MPI distribution

Configurer la forme variationnelle

# Define function space (Lagrange elements, degree 2)
element = FiniteElement("Lagrange", "triangle", 2)
V = FunctionSpace(domain, element)

# Define trial and test functions
u = TrialFunction(V)
v = TestFunction(V)

# Weak form of Poisson: grad(u)·grad(v) = f·v
F = dot(grad(u), grad(v)) * dx - 1.0 * v * dx

# Boundary conditions (Dirichlet)
from dolfinx import geometry
bc = function.Constant(0.0)
V0 = V.sub(0).collapse()[0]  # Subspace for Dirichlet BCs
dofs = function.Function(V0).vector

Résolution avec Schwarz Preconditioner

# The solver is built on PETSc underneath
problem = Problem(F, bc)
solver = Problem.Solver(problem)

# DOLFINx automatically uses GAMG (geometric AMG) as default
# This is a two-level method — coarse space + local solves
solver.solve()

Accéder aux internes MPI/DDM

La Fenics Discourse Community a documenté les points faibles liés à l’accès aux internes de partitionnement MPI de Dolfinx. Les utilisateurs supplémentaires Signaler une difficulté avec des modèles d’implémentation parallèles – les nœuds fantômes, le partitionnement vectoriel et la communication MPI ne sont pas toujours bien documentés. Contrairement à PETSC, Fenics résume les détails DD dans les coulisses, ce qui est pratique pour les débutants mais limitant lorsque vous devez expérimenter avec des préconditionneurs personnalisés.

Les utilisateurs signalent que la couche MPI/DDM n’est pas directement exposée à Python. C’est pourquoi le PETSC est préféré pour la recherche en production où l’expérimentation du préconditionneur est importante.


Comparaison des performances

préconditionneur Tapez itérations Efficacité parallèle Complexité
Ilu(0) Un niveau (pas de DD) 166 Mauvais — pas d’avantage parallèle Simple
GAM Deux niveaux (AMG) 35 Bon — Mise à l’échelle géométrique Modérer
ASM (Schwarz à un niveau) à un niveau ~50–100 Se dégrade linéairement avec les sous-domaines Simple
RAS (Schwarz à un niveau) à un niveau ~30–80 Mieux que l’ASM, se dégrade toujours Modérer
BDDC à deux niveaux 5–9 Quasi-optimal — Mise à l’échelle constante Modéré-complexe
Geneo + RAS à deux niveaux (hétérogène) 5–15 Échelles à 32 768 rangs (Frosch) Complexe

BDDC (5 à 9 itérations) surpasse systématiquement les autres méthodes sur les problèmes de référence. Sa construction à deux niveaux gère à la fois la correction de la grille fine et l’espace grossier mondial, ce qui en fait le défaut pratique pour Poisson et les problèmes connexes.

Geneo + Ras ajoute une détection automatique de l’espace grossier pour les milieux hétérogènes. Lorsque votre problème a des coefficients de contraste élevé (par exemple, la perméabilité variant de 10⁶), Geneo est le seul choix fiable.


Quand choisir quoi : Cadre de décision

Un niveau ou deux niveaux

Situation Approche recommandée
≤ 32 rangs MPI, problème homogène ASM ou RAS (un niveau est bien)
32–512 rangs, problème homogène Deux niveaux avec Nicolaides Space grossier
512+ rangs, problème homogène BDDC ou GAMG (deux niveaux)
N’importe quel nombre de rangs, problème hétérogène Geneo + RAS (deux niveaux avec espace automatique grossier)
HPC de production, 1 000 + rangs Trois niveaux (par exemple, Frosch)

Règle du pouce : commencez par deux niveaux (BDDC ou GAMG). N’utilisez qu’un seul niveau lorsque votre nombre de sous-domaines est petit et que vous avez besoin d’un prototype rapide.

ASM contre RAS

Critère asm Ras
Traitement en chevauchement Ajout complet (chevauchement des doubles comptes) Poids de partition d’unité
vitesse de convergence plus lent Jeûneur
Complexité de mise en œuvre plus simple Un peu plus complexe
Recommandation Prototype uniquement Solveur de production

Utilisez RAS chaque fois que possible. La correction de partition d’unité est un changement sur une seule ligne dans la plupart des implémentations, et l’amélioration de la convergence est immédiate.

PETSC vs. Fenics

Critère PETSC/Petsc4py Fenics/Dolfinx
Flexibilité du préconditionneur Complet — Échange via -pc_type Limité — par défaut de GAM
Accessibilité Python Modéré (nécessite une familiarité avec les PETSC) Élevé (forme variationnelle déclarative)
Transparence MPI/DDM Faible — Infrastructure C++ sous Python Faible — L’abstraction masque les détails DD
Expérimentation DD personnalisée Excellent Limité
Courbe d’apprentissage escarpé Doux

Utilisez PETSC si vous devez expérimenter avec des préconditionneurs, personnaliser les partitions DD ou échanger des solveurs sans réécrire le code. Utilisez Fenics si vous souhaitez un prototypage rapide et que vous n’avez pas besoin de personnalisation du préconditionneur.


Résumé + Étapes suivantes

La décomposition de domaine transforme les solveurs PDE en série en parallèles en divisant le domaine en sous-domaines qui se chevauchent et en résolvant localement. La progression de la méthode d’alternance de Schwarz en 1870 vers les préconditionneurs modernes à deux niveaux (BDDC, Geneo) reflète un simple aperçu : correction d’espace grossière est essentielle pour l’échelle.

Résumé rapide

  1. Schwarz à un niveau (ASM/RAS) fonctionne pour un petit parallélisme mais se dégrade linéairement avec le nombre de sous-domaines.
  2. RAS bat ASM grâce à la pondération de chevauchement de la partition d’unité – préfère toujours Ras.
  3. Méthodes à deux niveaux avec des espaces grossiers (BDDC, Geneo) sont la norme moderne.
  4. Geneo détecte automatiquement les modes de faible énergie problématiques pour les milieux hétérogènes.
  5. Les implémentations de Python dans PETSC (pc_type bddc) et les fenics (auto-GAMG) rendent DD accessible.

Prochaines étapes

  1. Commencez par petsc/petsc4py — essayez pc_type bddc sur un problème de Poisson simple. Le didacticiel NGSPETSC fournit un modèle de travail.
  2. Lire la référence canonique : Dolive, Jolivet, NATAF 2015 « Une introduction aux méthodes de décomposition de domaine » [1] est le meilleur aperçu conceptuel.
  3. Pour des problèmes hétérogènes, explorez les espaces geneo grossiers dans HPDDM ou FreeFEM FFDDM.
  4. Apprenez le parallélisme Fenics si votre flux de travail nécessite un prototypage rapide sur des maillages irréguliers. Le documentation fenicsx couvre le partitionnement de maillage distribué.

Guides connexes


Réflexions finales

La décomposition du domaine est le pont entre la compréhension de la théorie PDE et l’exécution de simulations de production. Les mathématiques sont élégantes – chevauchent les sous-domaines, résolvent localement, corrigent le global – mais la différence pratique entre ASM et RAS, ou un niveau et deux niveaux, est ce qui sépare un prototype fonctionnel d’un solveur de production.

Si vous évaluez les préconditionnels ou mettez en place une simulation parallèle qui ne s’adapte pas, l’équipe de consultation MatForge peut vous aider à choisir la bonne approche pour votre classe de problèmes. Que vous travailliez avec des matériaux homogènes ou des milieux hétérogènes à contraste élevé, la bonne stratégie DD est importante.