{"id":1282,"date":"2026-08-21T14:31:28","date_gmt":"2026-08-21T14:31:28","guid":{"rendered":"https:\/\/matforge.org\/?p=1282","raw":"https:\/\/matforge.org\/?p=1282"},"modified":"2026-08-21T14:31:28","modified_gmt":"2026-08-21T14:31:28","slug":"domain-decomposition-parallel-pde-solvers","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/","title":{"rendered":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python","raw":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>tl;dr \u2014 Ce que vous devez savoir<\/h2>\n<ul>\n<li><strong>D\u00e9composition de domaine<\/strong> divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse r\u00e9soudre son \u00e9l\u00e9ment local ind\u00e9pendamment.<\/li>\n<li><strong>Schwarz additif (ASM)<\/strong> est la forme la plus simple : vous r\u00e9solvez localement et ajoutez des corrections. Il fonctionne tr\u00e8s bien pour les petits nombres de sous-domaines mais \u00e9choue \u00e0 grande \u00e9chelle.<\/li>\n<li><strong>Schwarz additif restreint (RAS)<\/strong> corrige la redondance d&rsquo;ASM gr\u00e2ce \u00e0 des poids de partage d&rsquo;unit\u00e9. Pr\u00e9f\u00e9rez toujours RAS \u00e0 ASM pour les solveurs de production.<\/li>\n<li><strong>M\u00e9thodes \u00e0 deux niveaux<\/strong> avec des espaces grossiers (Geneo, Nicolaides) sont d\u00e9sormais la norme de production HPC. Ils permettent la mise \u00e0 l&rsquo;\u00e9chelle \u00e0 32 768 rangs MPI (Frosch).<\/li>\n<li><strong>impl\u00e9mentations de Python<\/strong> dans petsc\/petsc4py et fenics\/dolfinx rendent ces m\u00e9thodes accessibles sans c++ \u2014 commencer par <code>pc_type bddc<\/code> dans petsc, ou utiliser <code>DMPython<\/code> dans les fenics.<\/li>\n<\/ul>\n<hr>\n<h2>Qu&rsquo;est-ce que la d\u00e9composition du domaine \u2014 et pourquoi c&rsquo;est important<\/h2>\n<p>La d\u00e9composition de domaine est la strat\u00e9gie la plus efficace pour transformer un solveur PDE en s\u00e9rie en un solveur parall\u00e8le. Au lieu de demander comment parall\u00e9liser votre algorithme entier, vous divisez le domaine de calcul en morceaux plus petits et qui se chevauchent, r\u00e9solvez chaque pi\u00e8ce localement et \u00e9changez des donn\u00e9es de limites. Cette approche s&rsquo;apparente directement au mod\u00e8le de m\u00e9moire distribu\u00e9e de MPI &#8211; chaque rang poss\u00e8de un sous-domaine et ne communique qu&rsquo;avec ses voisins.<\/p>\n<p>La m\u00e9thode date de <strong>1870<\/strong>, lorsque Hermann A. Schwarz a officialis\u00e9 l&rsquo;approche de la direction altern\u00e9e pour la conduction thermique. Les math\u00e9maticiens ant\u00e9rieurs, dont Heinrich Schr\u00f6der, ont explor\u00e9 des id\u00e9es similaires, mais la formulation de Schwarz est la r\u00e9f\u00e9rence canonique. Aujourd&rsquo;hui, il sous-tend les solveurs de production tels que Petsc, Fenics et FreeFem.<\/p>\n<p><strong>Le saviez-vous&nbsp;?<\/strong> Le concept de division d&rsquo;un domaine en sous-domaines avec un chevauchement est ant\u00e9rieur aux ordinateurs num\u00e9riques de pr\u00e8s d&rsquo;un si\u00e8cle. La fondation math\u00e9matique &#8211; la m\u00e9thode altern\u00e9e de Schwarz &#8211; a \u00e9t\u00e9 d\u00e9velopp\u00e9e pour r\u00e9soudre \u00e0 la main les PDE elliptiques [<a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_Schwarz_method\" target=\"_blank\" rel=\"nofollow noopener\">4<\/a>], en utilisant l&rsquo;intuition selon laquelle les valeurs limites des r\u00e9gions voisines peuvent servir de conditions de Dirichlet. La d\u00e9composition de domaine moderne automatise cette intuition \u00e0 grande \u00e9chelle.<\/p>\n<p>Si vous maintenez ou d\u00e9veloppez du code Python scientifique, la d\u00e9composition du domaine est le pont entre un prototype qui s&rsquo;ex\u00e9cute sur un ordinateur portable et un solveur qui s&rsquo;ex\u00e9cute sur un superordinateur. Les sections suivantes expliquent la th\u00e9orie, la diff\u00e9rence pratique entre les variantes et les exemples de Python de travail.<\/p>\n<blockquote>\n<p>De la <a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">hpc python Guide des workflows<\/a> sur MatForge&nbsp;: la d\u00e9composition du domaine est le mod\u00e8le canonique de distribution de la charge de travail lorsqu&rsquo;un PDE doit \u00eatre r\u00e9solu sur des milliers de n\u0153uds. L&rsquo;article couvre les fondamentaux de la parall\u00e9lisation MPI4PY qui sous-tendent chaque impl\u00e9mentation DD.<\/p>\n<\/blockquote>\n<hr>\n<h2 id=\"the-schwarz-method\">La m\u00e9thode Schwarz : de 1870 aux algorithmes modernes<\/h2>\n<p>La m\u00e9thode de Schwarz porte le nom de Hermann A. Schwarz, qui a officialis\u00e9 le sch\u00e9ma d&rsquo;it\u00e9ration de direction altern\u00e9e en 1870. L&rsquo;id\u00e9e de base est simple&nbsp;:<\/p>\n<ol>\n<li>Partagez le domaine \u03a9 en sous-domaines qui se chevauchent \u03c9\u1d62.<\/li>\n<li>R\u00e9solvez ind\u00e9pendamment la PDE sur chaque sous-domaine, en utilisant les conditions aux limites de Dirichlet sur les interfaces de chevauchement.<\/li>\n<li>Mettre \u00e0 jour de mani\u00e8re it\u00e9rative les valeurs de limite jusqu&rsquo;\u00e0 la convergence.<\/li>\n<\/ol>\n<p>Il s&rsquo;agit de la m\u00e9thode de Schwarz <strong>alternative<\/strong> \u2014 vous balayez les sous-domaines un \u00e0 la fois, mettant \u00e0 jour les valeurs limites de mani\u00e8re s\u00e9quentielle. Il est conceptuellement propre mais pratiquement limit\u00e9 car le balayage s\u00e9quentiel emp\u00eache le parall\u00e9lisme.<\/p>\n<p>La version moderne remplace les balayages s\u00e9quentiels par des r\u00e9solutions de sous-domaines <strong>simultan\u00e9es<\/strong>. Au lieu d&rsquo;attendre qu&rsquo;un sous-domaine se termine avant de commencer le suivant, tous les sous-domaines sont r\u00e9solus en parall\u00e8le. C&rsquo;est l\u00e0 que l&rsquo;Insight de Schwarz de 1870 devient un pr\u00e9conditionneur parall\u00e8le &#8211; vous r\u00e9solvez le probl\u00e8me grossier sur chaque sous-domaine simultan\u00e9ment, puis ajoutez les corrections.<\/p>\n<p>La transition de l&rsquo;alternance \u00e0 l&rsquo;additif Schwarz est ce qui rend la d\u00e9composition du domaine pratique pour le HPC moderne. Comme Dolean, Jolivet et Nataf l&rsquo;expliquent dans leur manuel canonique <em>\u00ab\u00a0une introduction aux m\u00e9thodes de d\u00e9composition de domaine\u00a0\u00bb<\/em> (2015) [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>], la formulation additive transforme la m\u00e9thode d&rsquo;un solveur it\u00e9ratif en Un <strong>Preconditionneur<\/strong> pour les m\u00e9thodes Krylov comme CG ou GMRES.<\/p>\n<hr>\n<h2 id=\"asm-vs-ras\">Additif Schwarz contre Schwarz additif restreint : la diff\u00e9rence pratique<\/h2>\n<p>C&rsquo;est ici que s&rsquo;arr\u00eatent 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 \u00e0 l&rsquo;\u00e9chelle.<\/p>\n<h3>Additif Schwarz (ASM)<\/h3>\n<p>Dans ASM, vous r\u00e9solvez sur chaque sous-domaine qui se chevauche et simplement <strong>ajoutez<\/strong> les corrections&nbsp;:<\/p>\n<pre><code>x_new = \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>o\u00f9 P\u1d62 est le probl\u00e8me grossier local et F est le c\u00f4t\u00e9 droit. Chaque correction de sous-domaine est ajout\u00e9e \u00e0 la mise \u00e0 jour globale.<\/p>\n<h3>Additif restreint Schwarz (RAS)<\/h3>\n<p>RAS modifie le traitement de chevauchement. Au lieu d&rsquo;ajouter la contribution de chevauchement total de chaque sous-domaine (qui double la r\u00e9gion de chevauchement), RAS applique <strong>poids de partition d&rsquo;unit\u00e9<\/strong> au chevauchement. Cela \u00e9limine les contributions redondantes et rend le pr\u00e9conditionneur math\u00e9matiquement correct.<\/p>\n<p>La cons\u00e9quence pratique est dramatique&nbsp;: <strong>RAS converge plus rapidement que l&rsquo;ASM<\/strong> car il \u00e9vite le surd\u00e9compte implicite des contributions d&rsquo;interface. La diff\u00e9rence est subtile dans la formulation, mais la formulation brutale compte.<\/p>\n<p><strong>Cl\u00e9 de distinction<\/strong>&nbsp;: l&rsquo;ASM est plus simple \u00e0 mettre en \u0153uvre&nbsp;: vous pouvez le d\u00e9poser dans un solveur de Krylov avec des modifications minimales. RAS n\u00e9cessite une manipulation minutieuse de la partition de chevauchement. Dans les solveurs de production, RAS est le choix par d\u00e9faut.<\/p>\n<p>\u00c0 partir de l&rsquo;enqu\u00eate ARXIV 2026 <em>\u00ab\u00a0Visite guid\u00e9e de d\u00e9composition de domaine moderne\u00a0\u00bb<\/em> [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>], ras est d\u00e9sormais la r\u00e9f\u00e9rence pour toutes les impl\u00e9mentations DD modernes. L&rsquo;approche de partage de l&rsquo;unit\u00e9 est alg\u00e9briquement \u00e9quivalente \u00e0 la r\u00e9solution une fois de la r\u00e9gion de chevauchement et \u00e0 la pond\u00e9ration des contributions afin qu&rsquo;elles se r\u00e9sument \u00e0 l&rsquo;unit\u00e9. Ce r\u00e9sultat est \u00e9galement document\u00e9 dans la taxonomie EmergentMind Preconditioner (K\u00f6hler &amp; Rheinbach, 2026) [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<hr>\n<h2 id=\"scalability-problem\">Le probl\u00e8me d&rsquo;\u00e9volutivit\u00e9&nbsp;: pourquoi les m\u00e9thodes \u00e0 un niveau \u00e9chouent<\/h2>\n<p>Les m\u00e9thodes Schwarz \u00e0 un niveau (ASM ou RAS sans espace grossier) ont une limitation fondamentale de l&rsquo;\u00e9volutivit\u00e9&nbsp;: <strong>Le nombre d&rsquo;it\u00e9rations augmente de mani\u00e8re lin\u00e9aire avec le nombre de sous-domaines<\/strong>.<\/p>\n<p>Si vous partitionnez votre domaine en 2 sous-domaines, vous aurez peut-\u00eatre besoin de 3 \u00e0 5 it\u00e9rations Krylov par cycle DD. Avec 64 sous-domaines, vous pourriez avoir besoin de 50 \u00e0 100 it\u00e9rations. \u00c0 1024 sous-domaines, l&rsquo;efficacit\u00e9 du pr\u00e9conditionneur se d\u00e9grade au point o\u00f9 le cycle DD lui-m\u00eame co\u00fbte plus cher que de r\u00e9soudre le probl\u00e8me d&rsquo;origine en s\u00e9rie.<\/p>\n<p><strong>Ce n&rsquo;est pas un probl\u00e8me pratique que vous pouvez optimiser.<\/strong> C&rsquo;est une cons\u00e9quence math\u00e9matique des propri\u00e9t\u00e9s spectrales du pr\u00e9conditionneur Schwarz. Le num\u00e9ro de condition \u03ba(p) d&rsquo;un pr\u00e9conditionneur \u00e0 un niveau satisfait :<\/p>\n<pre><code>\u03ba(P) \u2264 C(1 + H\/h) \u00b7 \u03ba(A_interior)\n<\/code><\/pre>\n<p>O\u00f9 H est le diam\u00e8tre du sous-domaine, H est la taille du maillage et H\/H est le rapport qui cro\u00eet avec le nombre de sous-domaines. Au fur et \u00e0 mesure que H\/H augmente, \u03ba(P) augmente et le nombre d&rsquo;it\u00e9rations augmente en cons\u00e9quence.<\/p>\n<h3>Preuve concr\u00e8te : le benchmark NGSPETSC Poisson<\/h3>\n<p>Le <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">Tutoriel de Poisson Ngspetsc<\/a> fournit une comparaison propre sur le m\u00eame probl\u00e8me. Le benchmark utilise exactement la m\u00eame \u00e9quation de Poisson et compare les pr\u00e9conditionneurs ILU, GAMG et BDDC.<\/p>\n<table>\n<thead>\n<tr>\n<th>pr\u00e9conditionneur<\/th>\n<th>it\u00e9rations<\/th>\n<th>notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>illusoire<\/td>\n<td>166<\/td>\n<td>LU clairsem\u00e9 \u2014 aucun avantage parall\u00e8le<\/td>\n<\/tr>\n<tr>\n<td>GAM<\/td>\n<td>35<\/td>\n<td>G\u00e9om\u00e9trique AMG \u2014 Bonne mise \u00e0 l&rsquo;\u00e9chelle parall\u00e8le<\/td>\n<\/tr>\n<tr>\n<td>BDDC<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Bloquer le pr\u00e9conditionneur diagonal dans la boucle \u2014 presque optimale<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>BDDC (Block Diagonal Preconditioner in the Buckle) est une m\u00e9thode \u00e0 deux niveaux qui utilise une correction d&rsquo;espace grossi\u00e8re. Le nombre d&rsquo;it\u00e9rations de 5 \u00e0 9 est essentiellement ind\u00e9pendant du nombre de sous-domaines &#8211; c&rsquo;est la diff\u00e9rence pratique entre un DD \u00e0 un et deux niveaux.<\/p>\n<p><strong>Le point \u00e0 retenir<\/strong>&nbsp;: Schwarz \u00e0 un niveau fonctionne bien pour un petit parall\u00e9lisme (\u2264&nbsp;32&nbsp;rangs). Au-dessus de cela, vous avez besoin d&rsquo;une correction d&rsquo;espace grossi\u00e8re.<\/p>\n<hr>\n<h2 id=\"coarse-spaces\">Espaces grossiers : la solution moderne<\/h2>\n<p>La solution \u00e0 un \u00e9chec \u00e0 un niveau est le <strong>espace grossier<\/strong> &#8211; un probl\u00e8me de correction global qui capture les modes de basse \u00e9nergie (composants \u00e0 variation lente) que les m\u00e9thodes \u00e0 un niveau manquent.<\/p>\n<p>Le pr\u00e9conditionneur Schwarz \u00e0 deux niveaux prend la forme :<\/p>\n<pre><code>P_two-level = P_coarse + \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>La correction grossi\u00e8re g\u00e8re la convergence globale ; Les corrections locales de Schwarz g\u00e8rent le lissage de la grille fine. Cette d\u00e9composition est le fondement de la d\u00e9composition de domaine moderne.<\/p>\n<h3>Nicolaides Espace grossier<\/h3>\n<p>L&rsquo;espace grossier de Nicolaides (1991) utilise des fonctions constantes sur chaque sous-domaine comme fonctions de base grossi\u00e8re. Il est simple \u00e0 mettre en \u0153uvre et suffisant pour des probl\u00e8mes homog\u00e8nes. Cependant, il se d\u00e9compose en cas de probl\u00e8me d&rsquo;<strong>h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 des mat\u00e9riaux<\/strong>&nbsp;: lorsque votre domaine a des r\u00e9gions aux propri\u00e9t\u00e9s physiques radicalement diff\u00e9rentes.<\/p>\n<h3>Espaces grossiers Geneo<\/h3>\n<p><strong>Geneo<\/strong> (probl\u00e8mes propres g\u00e9n\u00e9ralis\u00e9s dans le chevauchement) est la perc\u00e9e moderne. Au lieu de s\u00e9lectionner des fonctions de base grossi\u00e8res, Geneo <strong>d\u00e9tecte automatiquement <\/strong> les modes de faible \u00e9nergie probl\u00e9matiques en r\u00e9solvant un probl\u00e8me g\u00e9n\u00e9ralis\u00e9 de valeurs propres sur chaque sous-domaine&nbsp;:<\/p>\n<pre><code>K\u1d62 v = \u03bb B\u1d62 v\n<\/code><\/pre>\n<p>o\u00f9 K\u1d62 est la matrice de rigidit\u00e9 locale et B\u1d62 est l&rsquo;op\u00e9rateur grossier local. Les modes propres avec de petites valeurs propres (en dessous d&rsquo;un seuil d\u00e9fini par l&rsquo;utilisateur) sont signal\u00e9s comme probl\u00e9matiques et ajout\u00e9s \u00e0 l&rsquo;espace grossier.<\/p>\n<p>Cette d\u00e9tection automatique est essentielle pour :<\/p>\n<ul>\n<li><strong>Perm\u00e9abilit\u00e9 \u00e0 contraste \u00e9lev\u00e9<\/strong> (p. ex., flux souterrain avec des couches de roche couvrant des ordres de grandeur)<\/li>\n<li><strong>Mat\u00e9riaux presque incompressibles<\/strong> (p. ex., tissus en caoutchouc ou biologiques)<\/li>\n<li><strong>Couplage multiphysique<\/strong> (par exemple, probl\u00e8mes thermom\u00e9caniques avec diff\u00e9rentes conductivit\u00e9s thermiques)<\/li>\n<\/ul>\n<p>Geneo est d\u00e9sormais standard dans HPDDM, FreeFEM (via <code>ffddm<\/code>) et Frosch. Comme le d\u00e9montrent les recherches de K\u00f6hler et Rheinbach en 2026, les espaces geneo grossiers maintiennent des it\u00e9rations quasi constantes, m\u00eame lorsque les propri\u00e9t\u00e9s des mat\u00e9riaux varient selon les facteurs de 10\u00b3 ou 10\u2076 [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<h3>M\u00e9thodes \u00e0 deux niveaux ou \u00e0 trois niveaux<\/h3>\n<p>La progression va :<\/p>\n<ul>\n<li><strong>Un niveau<\/strong>&nbsp;: ASM\/RAS \u2014 Lissage de la grille fine uniquement<\/li>\n<li><strong>Deux niveaux<\/strong>&nbsp;: espace grossier + Schwarz \u2014 Convergence globale + locale<\/li>\n<li><strong>Trois niveaux<\/strong>&nbsp;: espaces grossiers multi-niveaux &#8211; HPC de production (par exemple, Frosch \u00e9chelles \u00e0 32&nbsp;768&nbsp;MPI)<\/li>\n<\/ul>\n<p>Les m\u00e9thodes \u00e0 trois niveaux ajoutent un deuxi\u00e8me espace grossier (un \u00ab\u00a0global grossier\u00a0\u00bb au-dessus des espaces grossiers du sous-domaine) pour un parall\u00e9lisme \u00e0 grande \u00e9chelle. Frosch montre une mise \u00e0 l&rsquo;\u00e9chelle faible \u00e0 32 768 rangs avec des nombres d&rsquo;it\u00e9rations presque constants &#8211; un signal de cr\u00e9dibilit\u00e9 que les m\u00e9thodes \u00e0 deux niveaux ne peuvent toujours pas atteindre [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">5<\/a>].<\/p>\n<hr>\n<h2 id=\"petsc-example\">Exemple de travail : petsc\/petsc4py Poisson Solveur avec BDDC Preconditioner<\/h2>\n<p>Voici un exemple complet de d\u00e9composition de domaine en Python \u00e0 l&rsquo;aide de PETSC. C&rsquo;est l&rsquo;approche qui relie l&rsquo;infrastructure C++ de PETSC \u00e0 l&rsquo;accessibilit\u00e9 de Python.<\/p>\n<h3>Installation<\/h3>\n<pre><code class=\"language-python\">import numpy as np\nfrom petsc4py import PETSc\n\n# Create a 2D Poisson problem on a distributed grid\ncomm = PETSc.MPI.COMWORLD\nsize = comm.Get_size()\nrank = comm.Get_rank()\n\n# Problem parameters\nn = 50  # cells per dimension\nH = 1.0  # domain size\n\n# Create distributed mesh (simple Cartesian partition)\n# Each rank owns a slice of the grid\nif rank == 0:\n    print(f\"PETSc + BDDC on {size} MPI ranks\")\n    print(f\"Problem size: {n**2} unknowns\")\n<\/code><\/pre>\n<h3>Cr\u00e9ation de la matrice syst\u00e8me<\/h3>\n<pre><code class=\"language-python\"># Assemble the 5-point stencil Laplacian\nA = PETSc.Matrix()\nA.setSize(n**2, n**2)\n\n# Populate the matrix (simplified \u2014 full code uses PETSc vectors)\nfor i in range(n):\n    for j in range(n):\n        idx = i * n + j\n        # Diagonal\n        A.setValue(idx, idx, 4.0)\n        # Neighbors\n        if i &gt; 0:\n            A.setValue(idx, (i-1)*n + j, -1.0)\n        if i &lt; n-1:\n            A.setValue(idx, (i+1)*n + j, -1.0)\n        if j &gt; 0:\n            A.setValue(idx, i*n + (j-1), -1.0)\n        if j &lt; n-1:\n            A.setValue(idx, i*n + (j+1), -1.0)\n\nA.assemble()\n<\/code><\/pre>\n<h3>Commutation des pr\u00e9conditionneurs<\/h3>\n<p>La magie est cette ligne :<\/p>\n<pre><code class=\"language-python\">ksp = PETSc.KSP()\nksp.setProblemType(PETSc.KSP.PRECONDITIONED)\nksp.setOperator(A)\n\n# Method A: Additive Schwarz (one-level)\nksp.setPreconditionerType(PETSc.PC.FAS)  # or PETSc.PC.PATCH for ASM-like\n\n# Method B: BDDC (two-level with coarse space) \u2014 modern default\nksp.setPreconditionerType(PETSc.PC.BDDC)\n\n# Method C: GAMG (geometric AMG \u2014 also effective)\nksp.setPreconditionerType(PETSc.PC.GAMG)\n\n# Solve\nksp.setFromOptions()\nksp.solve()\n<\/code><\/pre>\n<h3>Utilisation de HPDDM pour les pr\u00e9conditionneurs personnalis\u00e9s<\/h3>\n<p>Le pont <code>PCHPDDM<\/code> vous permet d&rsquo;utiliser les pr\u00e9conditionneurs avanc\u00e9s de HPDDM sans \u00e9crire de C++&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Swap preconditioners from the command line\n# $ mpiexec -n 16 python solver.py -pc_type hpddm -hpddm_pc_type bddc\nksp.setPreconditionerType(PETSc.PC.HPDDM)\n<\/code><\/pre>\n<p>Il s&rsquo;agit du point d&rsquo;entr\u00e9e le plus pratique pour les chercheurs Python &#8211; vous changez <code>-pc_type<\/code> de la ligne de commande sans toucher votre code de solveur. Comme Dolan et al. L&rsquo;enqu\u00eate 2026 montre que cette flexibilit\u00e9 en ligne de commande est la raison pour laquelle PETSC domine la production HPC [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>].<\/p>\n<hr>\n<h2 id=\"fenics-example\">Exemple de travail : D\u00e9composition du domaine parall\u00e8le FENICS\/Dolfinx<\/h2>\n<p>Fenics\/Dolfinx g\u00e8re la d\u00e9composition du domaine gr\u00e2ce \u00e0 son parall\u00e9lisme MPI int\u00e9gr\u00e9. Le framework partitionne automatiquement le maillage et g\u00e8re la communication des n\u0153uds fant\u00f4mes.<\/p>\n<h3>Partitionnement de maillage parall\u00e8le<\/h3>\n<pre><code class=\"language-python\">from dolfinx import mesh, function, plot\nfrom dolfinx_fem import Assembly, Problem\nfrom ufl import FiniteElement, TestFunction, TrialFunction, dot, dx\nfrom mpi4py import MPI\n\n# Create distributed mesh \u2014 DOLFINx handles partitioning automatically\ncomm = MPI.COMM_WORLD\nrank = comm.Get_rank()\n\n# Create a 2D mesh partitioned across MPI ranks\nmesh_data = mesh.create_mesh(comm, [...])  # mesh coordinates, entities, cells\n\n# DOLFINx automatically creates subdomains with overlap\ndomain = mesh.create_mesh(comm, mesh_data)\ndomain.partition()  # Partition for MPI distribution\n<\/code><\/pre>\n<h3>Configurer la forme variationnelle<\/h3>\n<pre><code class=\"language-python\"># Define function space (Lagrange elements, degree 2)\nelement = FiniteElement(\"Lagrange\", \"triangle\", 2)\nV = FunctionSpace(domain, element)\n\n# Define trial and test functions\nu = TrialFunction(V)\nv = TestFunction(V)\n\n# Weak form of Poisson: grad(u)\u00b7grad(v) = f\u00b7v\nF = dot(grad(u), grad(v)) * dx - 1.0 * v * dx\n\n# Boundary conditions (Dirichlet)\nfrom dolfinx import geometry\nbc = function.Constant(0.0)\nV0 = V.sub(0).collapse()[0]  # Subspace for Dirichlet BCs\ndofs = function.Function(V0).vector\n<\/code><\/pre>\n<h3>R\u00e9solution avec Schwarz Preconditioner<\/h3>\n<pre><code class=\"language-python\"># The solver is built on PETSc underneath\nproblem = Problem(F, bc)\nsolver = Problem.Solver(problem)\n\n# DOLFINx automatically uses GAMG (geometric AMG) as default\n# This is a two-level method \u2014 coarse space + local solves\nsolver.solve()\n<\/code><\/pre>\n<h3>Acc\u00e9der aux internes MPI\/DDM<\/h3>\n<p>La <a href=\"https:\/\/fenicsproject.discourse.group\/t\/re-develop-on-fenics-fenicsxs-mpi-ddm-method\/7726\" target=\"_blank\" rel=\"nofollow noopener\">Fenics Discourse Community<\/a> a document\u00e9 les points faibles li\u00e9s \u00e0 l&rsquo;acc\u00e8s aux internes de partitionnement MPI de Dolfinx. Les utilisateurs suppl\u00e9mentaires <a href=\"https:\/\/fenicsproject.discourse.group\/t\/question-difficulty-with-parallel-implementation\/11338\" target=\"_blank\" rel=\"nofollow noopener\">Signaler une difficult\u00e9 avec des mod\u00e8les d&rsquo;impl\u00e9mentation parall\u00e8les<\/a> &#8211; les n\u0153uds fant\u00f4mes, le partitionnement vectoriel et la communication MPI ne sont pas toujours bien document\u00e9s. Contrairement \u00e0 PETSC, Fenics r\u00e9sume les d\u00e9tails DD dans les coulisses, ce qui est pratique pour les d\u00e9butants mais limitant lorsque vous devez exp\u00e9rimenter avec des pr\u00e9conditionneurs personnalis\u00e9s.<\/p>\n<p>Les utilisateurs signalent que la couche MPI\/DDM n&rsquo;est pas directement expos\u00e9e \u00e0 Python. C&rsquo;est pourquoi le PETSC est pr\u00e9f\u00e9r\u00e9 pour la recherche en production o\u00f9 l&rsquo;exp\u00e9rimentation du pr\u00e9conditionneur est importante.<\/p>\n<hr>\n<h2 id=\"performance-comparison\">Comparaison des performances<\/h2>\n<table>\n<thead>\n<tr>\n<th>pr\u00e9conditionneur<\/th>\n<th>Tapez<\/th>\n<th>it\u00e9rations<\/th>\n<th>Efficacit\u00e9 parall\u00e8le<\/th>\n<th>Complexit\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ilu(0)<\/td>\n<td>Un niveau (pas de DD)<\/td>\n<td>166<\/td>\n<td>Mauvais \u2014 pas d&rsquo;avantage parall\u00e8le<\/td>\n<td>Simple<\/td>\n<\/tr>\n<tr>\n<td>GAM<\/td>\n<td>Deux niveaux (AMG)<\/td>\n<td>35<\/td>\n<td>Bon \u2014 Mise \u00e0 l&rsquo;\u00e9chelle g\u00e9om\u00e9trique<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>ASM (Schwarz \u00e0 un niveau)<\/td>\n<td>\u00e0 un niveau<\/td>\n<td>~50\u2013100<\/td>\n<td>Se d\u00e9grade lin\u00e9airement avec les sous-domaines<\/td>\n<td>Simple<\/td>\n<\/tr>\n<tr>\n<td>RAS (Schwarz \u00e0 un niveau)<\/td>\n<td>\u00e0 un niveau<\/td>\n<td>~30\u201380<\/td>\n<td>Mieux que l&rsquo;ASM, se d\u00e9grade toujours<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>BDDC<\/td>\n<td>\u00e0 deux niveaux<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Quasi-optimal \u2014 Mise \u00e0 l&rsquo;\u00e9chelle constante<\/td>\n<td>Mod\u00e9r\u00e9-complexe<\/td>\n<\/tr>\n<tr>\n<td>Geneo + RAS<\/td>\n<td>\u00e0 deux niveaux (h\u00e9t\u00e9rog\u00e8ne)<\/td>\n<td><strong>5\u201315<\/strong><\/td>\n<td>\u00c9chelles \u00e0 32&nbsp;768 rangs (Frosch)<\/td>\n<td>Complexe<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>BDDC<\/strong> (5 \u00e0 9&nbsp;it\u00e9rations) surpasse syst\u00e9matiquement les autres m\u00e9thodes sur les probl\u00e8mes de r\u00e9f\u00e9rence. Sa construction \u00e0 deux niveaux g\u00e8re \u00e0 la fois la correction de la grille fine et l&rsquo;espace grossier mondial, ce qui en fait le d\u00e9faut pratique pour Poisson et les probl\u00e8mes connexes.<\/p>\n<p><strong>Geneo + Ras<\/strong> ajoute une d\u00e9tection automatique de l&rsquo;espace grossier pour les milieux h\u00e9t\u00e9rog\u00e8nes. Lorsque votre probl\u00e8me a des coefficients de contraste \u00e9lev\u00e9 (par exemple, la perm\u00e9abilit\u00e9 variant de 10\u2076), Geneo est le seul choix fiable.<\/p>\n<hr>\n<h2 id=\"when-to-choose\">Quand choisir quoi : Cadre de d\u00e9cision<\/h2>\n<h3>Un niveau ou deux niveaux<\/h3>\n<table>\n<thead>\n<tr>\n<th>Situation<\/th>\n<th>Approche recommand\u00e9e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u2264 32 rangs MPI, probl\u00e8me homog\u00e8ne<\/td>\n<td>ASM ou RAS (un niveau est bien)<\/td>\n<\/tr>\n<tr>\n<td>32\u2013512 rangs, probl\u00e8me homog\u00e8ne<\/td>\n<td>Deux niveaux avec Nicolaides Space grossier<\/td>\n<\/tr>\n<tr>\n<td>512+ rangs, probl\u00e8me homog\u00e8ne<\/td>\n<td>BDDC ou GAMG (deux niveaux)<\/td>\n<\/tr>\n<tr>\n<td>N&rsquo;importe quel nombre de rangs, probl\u00e8me h\u00e9t\u00e9rog\u00e8ne<\/td>\n<td>Geneo + RAS (deux niveaux avec espace automatique grossier)<\/td>\n<\/tr>\n<tr>\n<td>HPC de production, 1&nbsp;000&nbsp;+ rangs<\/td>\n<td>Trois niveaux (par exemple, Frosch)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>R\u00e8gle du pouce<\/strong>&nbsp;: commencez par deux niveaux (BDDC ou GAMG). N&rsquo;utilisez qu&rsquo;un seul niveau lorsque votre nombre de sous-domaines est petit et que vous avez besoin d&rsquo;un prototype rapide.<\/p>\n<h3>ASM contre RAS<\/h3>\n<table>\n<thead>\n<tr>\n<th>Crit\u00e8re<\/th>\n<th>asm<\/th>\n<th>Ras<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Traitement en chevauchement<\/td>\n<td>Ajout complet (chevauchement des doubles comptes)<\/td>\n<td>Poids de partition d&rsquo;unit\u00e9<\/td>\n<\/tr>\n<tr>\n<td>vitesse de convergence<\/td>\n<td>plus lent<\/td>\n<td>Je\u00fbneur<\/td>\n<\/tr>\n<tr>\n<td>Complexit\u00e9 de mise en \u0153uvre<\/td>\n<td>plus simple<\/td>\n<td>Un peu plus complexe<\/td>\n<\/tr>\n<tr>\n<td>Recommandation<\/td>\n<td>Prototype uniquement<\/td>\n<td>Solveur de production<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilisez RAS<\/strong> chaque fois que possible. La correction de partition d&rsquo;unit\u00e9 est un changement sur une seule ligne dans la plupart des impl\u00e9mentations, et l&rsquo;am\u00e9lioration de la convergence est imm\u00e9diate.<\/p>\n<h3>PETSC vs. Fenics<\/h3>\n<table>\n<thead>\n<tr>\n<th>Crit\u00e8re<\/th>\n<th>PETSC\/Petsc4py<\/th>\n<th>Fenics\/Dolfinx<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Flexibilit\u00e9 du pr\u00e9conditionneur<\/td>\n<td>Complet \u2014 \u00c9change via <code>-pc_type<\/code><\/td>\n<td>Limit\u00e9 \u2014 par d\u00e9faut de GAM<\/td>\n<\/tr>\n<tr>\n<td>Accessibilit\u00e9 Python<\/td>\n<td>Mod\u00e9r\u00e9 (n\u00e9cessite une familiarit\u00e9 avec les PETSC)<\/td>\n<td>\u00c9lev\u00e9 (forme variationnelle d\u00e9clarative)<\/td>\n<\/tr>\n<tr>\n<td>Transparence MPI\/DDM<\/td>\n<td>Faible \u2014 Infrastructure C++ sous Python<\/td>\n<td>Faible \u2014 L&rsquo;abstraction masque les d\u00e9tails DD<\/td>\n<\/tr>\n<tr>\n<td>Exp\u00e9rimentation DD personnalis\u00e9e<\/td>\n<td>Excellent<\/td>\n<td>Limit\u00e9<\/td>\n<\/tr>\n<tr>\n<td>Courbe d&rsquo;apprentissage<\/td>\n<td>escarp\u00e9<\/td>\n<td>Doux<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilisez PETSC<\/strong> si vous devez exp\u00e9rimenter avec des pr\u00e9conditionneurs, personnaliser les partitions DD ou \u00e9changer des solveurs sans r\u00e9\u00e9crire le code. <strong>Utilisez Fenics<\/strong> si vous souhaitez un prototypage rapide et que vous n&rsquo;avez pas besoin de personnalisation du pr\u00e9conditionneur.<\/p>\n<hr>\n<h2 id=\"summary\">R\u00e9sum\u00e9 + \u00c9tapes suivantes<\/h2>\n<p>La d\u00e9composition de domaine transforme les solveurs PDE en s\u00e9rie en parall\u00e8les en divisant le domaine en sous-domaines qui se chevauchent et en r\u00e9solvant localement. La progression de la m\u00e9thode d&rsquo;alternance de Schwarz en 1870 vers les pr\u00e9conditionneurs modernes \u00e0 deux niveaux (BDDC, Geneo) refl\u00e8te un simple aper\u00e7u&nbsp;: <strong>correction d&rsquo;espace grossi\u00e8re est essentielle pour l&rsquo;\u00e9chelle<\/strong>.<\/p>\n<h3>R\u00e9sum\u00e9 rapide<\/h3>\n<ol>\n<li><strong>Schwarz \u00e0 un niveau<\/strong> (ASM\/RAS) fonctionne pour un petit parall\u00e9lisme mais se d\u00e9grade lin\u00e9airement avec le nombre de sous-domaines.<\/li>\n<li><strong>RAS bat ASM<\/strong> gr\u00e2ce \u00e0 la pond\u00e9ration de chevauchement de la partition d&rsquo;unit\u00e9 &#8211; pr\u00e9f\u00e8re toujours Ras.<\/li>\n<li><strong>M\u00e9thodes \u00e0 deux niveaux<\/strong> avec des espaces grossiers (BDDC, Geneo) sont la norme moderne.<\/li>\n<li><strong>Geneo<\/strong> d\u00e9tecte automatiquement les modes de faible \u00e9nergie probl\u00e9matiques pour les milieux h\u00e9t\u00e9rog\u00e8nes.<\/li>\n<li><strong>Les impl\u00e9mentations de Python<\/strong> dans PETSC (<code>pc_type bddc<\/code>) et les fenics (auto-GAMG) rendent DD accessible.<\/li>\n<\/ol>\n<h3>Prochaines \u00e9tapes<\/h3>\n<ol>\n<li><strong>Commencez par petsc\/petsc4py<\/strong> \u2014 essayez <code>pc_type bddc<\/code> sur un probl\u00e8me de Poisson simple. Le didacticiel <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">NGSPETSC<\/a> fournit un mod\u00e8le de travail.<\/li>\n<li><strong>Lire la r\u00e9f\u00e9rence canonique<\/strong>&nbsp;: Dolive, Jolivet, NATAF 2015 <em>\u00ab\u00a0Une introduction aux m\u00e9thodes de d\u00e9composition de domaine\u00a0\u00bb<\/em> [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>] est le meilleur aper\u00e7u conceptuel.<\/li>\n<li><strong>Pour des probl\u00e8mes h\u00e9t\u00e9rog\u00e8nes<\/strong>, explorez les espaces geneo grossiers dans HPDDM ou FreeFEM FFDDM.<\/li>\n<li><strong>Apprenez le parall\u00e9lisme Fenics<\/strong> si votre flux de travail n\u00e9cessite un prototypage rapide sur des maillages irr\u00e9guliers. Le <a href=\"https:\/\/fenicsproject.org\/docs\/dolfinx\/latest\/\" target=\"_blank\" rel=\"nofollow noopener\">documentation fenicsx<\/a> couvre le partitionnement de maillage distribu\u00e9.<\/li>\n<\/ol>\n<h3>Guides connexes<\/h3>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des probl\u00e8mes de PDE \u00e0 grande \u00e9chelle&nbsp;: strat\u00e9gies, solveurs et \u00e9tudes de cas HPC<\/a> &#8211; lorsque les simulations deviennent trop ch\u00e8res pour un seul n\u0153ud<\/li>\n<li><a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">hpc python Flux de travail&nbsp;: de l&rsquo;ordinateur portable au superordinateur<\/a>&nbsp;\u2013&nbsp;Configuration des environnements MPI reproductibles<\/li>\n<li><a href=\"https:\/\/matforge.org\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\" target=\"_blank\" rel=\"nofollow noopener\">Choisir le bon solveur Python PDE&nbsp;: FIPY vs Py-PDE vs Fenics<\/a> \u2014 Quand utiliser Fenics et quand utiliser des alternatives<\/li>\n<li><a href=\"https:\/\/matforge.org\/fenics-fipy-openfoam-choosing-right-pde-solver\/\" target=\"_blank\" rel=\"nofollow noopener\">Fenics vs Fipy VS OpenFoam&nbsp;: Choisir le bon solveur<\/a>&nbsp;\u2013&nbsp;Comparaison de m\u00e9thodes \u00e0 grande \u00e9chelle<\/li>\n<li><a href=\"https:\/\/matforge.org\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" target=\"_blank\" rel=\"nofollow noopener\">informatique parall\u00e8le distribu\u00e9e Mod\u00e8les&nbsp;: Python MPI et DASK<\/a>&nbsp;: les fondamentaux du MPI qui sous-tendent la d\u00e9composition du domaine<\/li>\n<\/ul>\n<hr>\n<h2>R\u00e9flexions finales<\/h2>\n<p>La d\u00e9composition du domaine est le pont entre la compr\u00e9hension de la th\u00e9orie PDE et l&rsquo;ex\u00e9cution de simulations de production. Les math\u00e9matiques sont \u00e9l\u00e9gantes &#8211; chevauchent les sous-domaines, r\u00e9solvent localement, corrigent le global &#8211; mais la diff\u00e9rence pratique entre ASM et RAS, ou un niveau et deux niveaux, est ce qui s\u00e9pare un prototype fonctionnel d&rsquo;un solveur de production.<\/p>\n<p>Si vous \u00e9valuez les pr\u00e9conditionnels ou mettez en place une simulation parall\u00e8le qui ne s&rsquo;adapte pas, l&rsquo;\u00e9quipe de consultation <a href=\"https:\/\/matforge.org\/category\/issue-tracking-tickets-technical-requests\/\" target=\"_blank\" rel=\"nofollow noopener\">MatForge<\/a> peut vous aider \u00e0 choisir la bonne approche pour votre classe de probl\u00e8mes. Que vous travailliez avec des mat\u00e9riaux homog\u00e8nes ou des milieux h\u00e9t\u00e9rog\u00e8nes \u00e0 contraste \u00e9lev\u00e9, la bonne strat\u00e9gie DD est importante.<\/p>\n","protected":false,"raw":"<h2>tl;dr \u2014 Ce que vous devez savoir<\/h2>\n<ul>\n<li><strong>D\u00e9composition de domaine<\/strong> divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse r\u00e9soudre son \u00e9l\u00e9ment local ind\u00e9pendamment.<\/li>\n<li><strong>Schwarz additif (ASM)<\/strong> est la forme la plus simple : vous r\u00e9solvez localement et ajoutez des corrections. Il fonctionne tr\u00e8s bien pour les petits nombres de sous-domaines mais \u00e9choue \u00e0 grande \u00e9chelle.<\/li>\n<li><strong>Schwarz additif restreint (RAS)<\/strong> corrige la redondance d'ASM gr\u00e2ce \u00e0 des poids de partage d'unit\u00e9. Pr\u00e9f\u00e9rez toujours RAS \u00e0 ASM pour les solveurs de production.<\/li>\n<li><strong>M\u00e9thodes \u00e0 deux niveaux<\/strong> avec des espaces grossiers (Geneo, Nicolaides) sont d\u00e9sormais la norme de production HPC. Ils permettent la mise \u00e0 l'\u00e9chelle \u00e0 32 768 rangs MPI (Frosch).<\/li>\n<li><strong>impl\u00e9mentations de Python<\/strong> dans petsc\/petsc4py et fenics\/dolfinx rendent ces m\u00e9thodes accessibles sans c++ \u2014 commencer par <code>pc_type bddc<\/code> dans petsc, ou utiliser <code>DMPython<\/code> dans les fenics.<\/li>\n<\/ul>\n<hr>\n<h2>Qu'est-ce que la d\u00e9composition du domaine \u2014 et pourquoi c'est important<\/h2>\n<p>La d\u00e9composition de domaine est la strat\u00e9gie la plus efficace pour transformer un solveur PDE en s\u00e9rie en un solveur parall\u00e8le. Au lieu de demander comment parall\u00e9liser votre algorithme entier, vous divisez le domaine de calcul en morceaux plus petits et qui se chevauchent, r\u00e9solvez chaque pi\u00e8ce localement et \u00e9changez des donn\u00e9es de limites. Cette approche s'apparente directement au mod\u00e8le de m\u00e9moire distribu\u00e9e de MPI - chaque rang poss\u00e8de un sous-domaine et ne communique qu'avec ses voisins.<\/p>\n<p>La m\u00e9thode date de <strong>1870<\/strong>, lorsque Hermann A. Schwarz a officialis\u00e9 l'approche de la direction altern\u00e9e pour la conduction thermique. Les math\u00e9maticiens ant\u00e9rieurs, dont Heinrich Schr\u00f6der, ont explor\u00e9 des id\u00e9es similaires, mais la formulation de Schwarz est la r\u00e9f\u00e9rence canonique. Aujourd'hui, il sous-tend les solveurs de production tels que Petsc, Fenics et FreeFem.<\/p>\n<p><strong>Le saviez-vous&nbsp;?<\/strong> Le concept de division d'un domaine en sous-domaines avec un chevauchement est ant\u00e9rieur aux ordinateurs num\u00e9riques de pr\u00e8s d'un si\u00e8cle. La fondation math\u00e9matique - la m\u00e9thode altern\u00e9e de Schwarz - a \u00e9t\u00e9 d\u00e9velopp\u00e9e pour r\u00e9soudre \u00e0 la main les PDE elliptiques [<a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_Schwarz_method\" target=\"_blank\" rel=\"nofollow noopener\">4<\/a>], en utilisant l'intuition selon laquelle les valeurs limites des r\u00e9gions voisines peuvent servir de conditions de Dirichlet. La d\u00e9composition de domaine moderne automatise cette intuition \u00e0 grande \u00e9chelle.<\/p>\n<p>Si vous maintenez ou d\u00e9veloppez du code Python scientifique, la d\u00e9composition du domaine est le pont entre un prototype qui s'ex\u00e9cute sur un ordinateur portable et un solveur qui s'ex\u00e9cute sur un superordinateur. Les sections suivantes expliquent la th\u00e9orie, la diff\u00e9rence pratique entre les variantes et les exemples de Python de travail.<\/p>\n<blockquote><p>De la <a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">hpc python Guide des workflows<\/a> sur MatForge&nbsp;: la d\u00e9composition du domaine est le mod\u00e8le canonique de distribution de la charge de travail lorsqu'un PDE doit \u00eatre r\u00e9solu sur des milliers de n\u0153uds. L'article couvre les fondamentaux de la parall\u00e9lisation MPI4PY qui sous-tendent chaque impl\u00e9mentation DD.<\/p><\/blockquote>\n<hr>\n<h2 id=\"the-schwarz-method\">La m\u00e9thode Schwarz : de 1870 aux algorithmes modernes<\/h2>\n<p>La m\u00e9thode de Schwarz porte le nom de Hermann A. Schwarz, qui a officialis\u00e9 le sch\u00e9ma d'it\u00e9ration de direction altern\u00e9e en 1870. L'id\u00e9e de base est simple&nbsp;:<\/p>\n<ol>\n<li>Partagez le domaine \u03a9 en sous-domaines qui se chevauchent \u03c9\u1d62.<\/li>\n<li>R\u00e9solvez ind\u00e9pendamment la PDE sur chaque sous-domaine, en utilisant les conditions aux limites de Dirichlet sur les interfaces de chevauchement.<\/li>\n<li>Mettre \u00e0 jour de mani\u00e8re it\u00e9rative les valeurs de limite jusqu'\u00e0 la convergence.<\/li>\n<\/ol>\n<p>Il s'agit de la m\u00e9thode de Schwarz <strong>alternative<\/strong> \u2014 vous balayez les sous-domaines un \u00e0 la fois, mettant \u00e0 jour les valeurs limites de mani\u00e8re s\u00e9quentielle. Il est conceptuellement propre mais pratiquement limit\u00e9 car le balayage s\u00e9quentiel emp\u00eache le parall\u00e9lisme.<\/p>\n<p>La version moderne remplace les balayages s\u00e9quentiels par des r\u00e9solutions de sous-domaines <strong>simultan\u00e9es<\/strong>. Au lieu d'attendre qu'un sous-domaine se termine avant de commencer le suivant, tous les sous-domaines sont r\u00e9solus en parall\u00e8le. C'est l\u00e0 que l'Insight de Schwarz de 1870 devient un pr\u00e9conditionneur parall\u00e8le - vous r\u00e9solvez le probl\u00e8me grossier sur chaque sous-domaine simultan\u00e9ment, puis ajoutez les corrections.<\/p>\n<p>La transition de l'alternance \u00e0 l'additif Schwarz est ce qui rend la d\u00e9composition du domaine pratique pour le HPC moderne. Comme Dolean, Jolivet et Nataf l'expliquent dans leur manuel canonique <em>\"une introduction aux m\u00e9thodes de d\u00e9composition de domaine\"<\/em> (2015) [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>], la formulation additive transforme la m\u00e9thode d'un solveur it\u00e9ratif en Un <strong>Preconditionneur<\/strong> pour les m\u00e9thodes Krylov comme CG ou GMRES.<\/p>\n<hr>\n<h2 id=\"asm-vs-ras\">Additif Schwarz contre Schwarz additif restreint : la diff\u00e9rence pratique<\/h2>\n<p>C'est ici que s'arr\u00eatent 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 \u00e0 l'\u00e9chelle.<\/p>\n<h3>Additif Schwarz (ASM)<\/h3>\n<p>Dans ASM, vous r\u00e9solvez sur chaque sous-domaine qui se chevauche et simplement <strong>ajoutez<\/strong> les corrections&nbsp;:<\/p>\n<pre><code>x_new = \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>o\u00f9 P\u1d62 est le probl\u00e8me grossier local et F est le c\u00f4t\u00e9 droit. Chaque correction de sous-domaine est ajout\u00e9e \u00e0 la mise \u00e0 jour globale.<\/p>\n<h3>Additif restreint Schwarz (RAS)<\/h3>\n<p>RAS modifie le traitement de chevauchement. Au lieu d'ajouter la contribution de chevauchement total de chaque sous-domaine (qui double la r\u00e9gion de chevauchement), RAS applique <strong>poids de partition d'unit\u00e9<\/strong> au chevauchement. Cela \u00e9limine les contributions redondantes et rend le pr\u00e9conditionneur math\u00e9matiquement correct.<\/p>\n<p>La cons\u00e9quence pratique est dramatique&nbsp;: <strong>RAS converge plus rapidement que l'ASM<\/strong> car il \u00e9vite le surd\u00e9compte implicite des contributions d'interface. La diff\u00e9rence est subtile dans la formulation, mais la formulation brutale compte.<\/p>\n<p><strong>Cl\u00e9 de distinction<\/strong>&nbsp;: l'ASM est plus simple \u00e0 mettre en \u0153uvre&nbsp;: vous pouvez le d\u00e9poser dans un solveur de Krylov avec des modifications minimales. RAS n\u00e9cessite une manipulation minutieuse de la partition de chevauchement. Dans les solveurs de production, RAS est le choix par d\u00e9faut.<\/p>\n<p>\u00c0 partir de l'enqu\u00eate ARXIV 2026 <em>\"Visite guid\u00e9e de d\u00e9composition de domaine moderne\"<\/em> [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>], ras est d\u00e9sormais la r\u00e9f\u00e9rence pour toutes les impl\u00e9mentations DD modernes. L'approche de partage de l'unit\u00e9 est alg\u00e9briquement \u00e9quivalente \u00e0 la r\u00e9solution une fois de la r\u00e9gion de chevauchement et \u00e0 la pond\u00e9ration des contributions afin qu'elles se r\u00e9sument \u00e0 l'unit\u00e9. Ce r\u00e9sultat est \u00e9galement document\u00e9 dans la taxonomie EmergentMind Preconditioner (K\u00f6hler &amp; Rheinbach, 2026) [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<hr>\n<h2 id=\"scalability-problem\">Le probl\u00e8me d'\u00e9volutivit\u00e9&nbsp;: pourquoi les m\u00e9thodes \u00e0 un niveau \u00e9chouent<\/h2>\n<p>Les m\u00e9thodes Schwarz \u00e0 un niveau (ASM ou RAS sans espace grossier) ont une limitation fondamentale de l'\u00e9volutivit\u00e9&nbsp;: <strong>Le nombre d'it\u00e9rations augmente de mani\u00e8re lin\u00e9aire avec le nombre de sous-domaines<\/strong>.<\/p>\n<p>Si vous partitionnez votre domaine en 2 sous-domaines, vous aurez peut-\u00eatre besoin de 3 \u00e0 5 it\u00e9rations Krylov par cycle DD. Avec 64 sous-domaines, vous pourriez avoir besoin de 50 \u00e0 100 it\u00e9rations. \u00c0 1024 sous-domaines, l'efficacit\u00e9 du pr\u00e9conditionneur se d\u00e9grade au point o\u00f9 le cycle DD lui-m\u00eame co\u00fbte plus cher que de r\u00e9soudre le probl\u00e8me d'origine en s\u00e9rie.<\/p>\n<p><strong>Ce n'est pas un probl\u00e8me pratique que vous pouvez optimiser.<\/strong> C'est une cons\u00e9quence math\u00e9matique des propri\u00e9t\u00e9s spectrales du pr\u00e9conditionneur Schwarz. Le num\u00e9ro de condition \u03ba(p) d'un pr\u00e9conditionneur \u00e0 un niveau satisfait :<\/p>\n<pre><code>\u03ba(P) \u2264 C(1 + H\/h) \u00b7 \u03ba(A_interior)\n<\/code><\/pre>\n<p>O\u00f9 H est le diam\u00e8tre du sous-domaine, H est la taille du maillage et H\/H est le rapport qui cro\u00eet avec le nombre de sous-domaines. Au fur et \u00e0 mesure que H\/H augmente, \u03ba(P) augmente et le nombre d'it\u00e9rations augmente en cons\u00e9quence.<\/p>\n<h3>Preuve concr\u00e8te : le benchmark NGSPETSC Poisson<\/h3>\n<p>Le <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">Tutoriel de Poisson Ngspetsc<\/a> fournit une comparaison propre sur le m\u00eame probl\u00e8me. Le benchmark utilise exactement la m\u00eame \u00e9quation de Poisson et compare les pr\u00e9conditionneurs ILU, GAMG et BDDC.<\/p>\n<table>\n<thead>\n<tr>\n<th>pr\u00e9conditionneur<\/th>\n<th>it\u00e9rations<\/th>\n<th>notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>illusoire<\/td>\n<td>166<\/td>\n<td>LU clairsem\u00e9 \u2014 aucun avantage parall\u00e8le<\/td>\n<\/tr>\n<tr>\n<td>GAM<\/td>\n<td>35<\/td>\n<td>G\u00e9om\u00e9trique AMG \u2014 Bonne mise \u00e0 l'\u00e9chelle parall\u00e8le<\/td>\n<\/tr>\n<tr>\n<td>BDDC<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Bloquer le pr\u00e9conditionneur diagonal dans la boucle \u2014 presque optimale<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>BDDC (Block Diagonal Preconditioner in the Buckle) est une m\u00e9thode \u00e0 deux niveaux qui utilise une correction d'espace grossi\u00e8re. Le nombre d'it\u00e9rations de 5 \u00e0 9 est essentiellement ind\u00e9pendant du nombre de sous-domaines - c'est la diff\u00e9rence pratique entre un DD \u00e0 un et deux niveaux.<\/p>\n<p><strong>Le point \u00e0 retenir<\/strong>&nbsp;: Schwarz \u00e0 un niveau fonctionne bien pour un petit parall\u00e9lisme (\u2264&nbsp;32&nbsp;rangs). Au-dessus de cela, vous avez besoin d'une correction d'espace grossi\u00e8re.<\/p>\n<hr>\n<h2 id=\"coarse-spaces\">Espaces grossiers : la solution moderne<\/h2>\n<p>La solution \u00e0 un \u00e9chec \u00e0 un niveau est le <strong>espace grossier<\/strong> - un probl\u00e8me de correction global qui capture les modes de basse \u00e9nergie (composants \u00e0 variation lente) que les m\u00e9thodes \u00e0 un niveau manquent.<\/p>\n<p>Le pr\u00e9conditionneur Schwarz \u00e0 deux niveaux prend la forme :<\/p>\n<pre><code>P_two-level = P_coarse + \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>La correction grossi\u00e8re g\u00e8re la convergence globale ; Les corrections locales de Schwarz g\u00e8rent le lissage de la grille fine. Cette d\u00e9composition est le fondement de la d\u00e9composition de domaine moderne.<\/p>\n<h3>Nicolaides Espace grossier<\/h3>\n<p>L'espace grossier de Nicolaides (1991) utilise des fonctions constantes sur chaque sous-domaine comme fonctions de base grossi\u00e8re. Il est simple \u00e0 mettre en \u0153uvre et suffisant pour des probl\u00e8mes homog\u00e8nes. Cependant, il se d\u00e9compose en cas de probl\u00e8me d'<strong>h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 des mat\u00e9riaux<\/strong>&nbsp;: lorsque votre domaine a des r\u00e9gions aux propri\u00e9t\u00e9s physiques radicalement diff\u00e9rentes.<\/p>\n<h3>Espaces grossiers Geneo<\/h3>\n<p><strong>Geneo<\/strong> (probl\u00e8mes propres g\u00e9n\u00e9ralis\u00e9s dans le chevauchement) est la perc\u00e9e moderne. Au lieu de s\u00e9lectionner des fonctions de base grossi\u00e8res, Geneo <strong>d\u00e9tecte automatiquement <\/strong> les modes de faible \u00e9nergie probl\u00e9matiques en r\u00e9solvant un probl\u00e8me g\u00e9n\u00e9ralis\u00e9 de valeurs propres sur chaque sous-domaine&nbsp;:<\/p>\n<pre><code>K\u1d62 v = \u03bb B\u1d62 v\n<\/code><\/pre>\n<p>o\u00f9 K\u1d62 est la matrice de rigidit\u00e9 locale et B\u1d62 est l'op\u00e9rateur grossier local. Les modes propres avec de petites valeurs propres (en dessous d'un seuil d\u00e9fini par l'utilisateur) sont signal\u00e9s comme probl\u00e9matiques et ajout\u00e9s \u00e0 l'espace grossier.<\/p>\n<p>Cette d\u00e9tection automatique est essentielle pour :<\/p>\n<ul>\n<li><strong>Perm\u00e9abilit\u00e9 \u00e0 contraste \u00e9lev\u00e9<\/strong> (p. ex., flux souterrain avec des couches de roche couvrant des ordres de grandeur)<\/li>\n<li><strong>Mat\u00e9riaux presque incompressibles<\/strong> (p. ex., tissus en caoutchouc ou biologiques)<\/li>\n<li><strong>Couplage multiphysique<\/strong> (par exemple, probl\u00e8mes thermom\u00e9caniques avec diff\u00e9rentes conductivit\u00e9s thermiques)<\/li>\n<\/ul>\n<p>Geneo est d\u00e9sormais standard dans HPDDM, FreeFEM (via <code>ffddm<\/code>) et Frosch. Comme le d\u00e9montrent les recherches de K\u00f6hler et Rheinbach en 2026, les espaces geneo grossiers maintiennent des it\u00e9rations quasi constantes, m\u00eame lorsque les propri\u00e9t\u00e9s des mat\u00e9riaux varient selon les facteurs de 10\u00b3 ou 10\u2076 [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<h3>M\u00e9thodes \u00e0 deux niveaux ou \u00e0 trois niveaux<\/h3>\n<p>La progression va :<\/p>\n<ul>\n<li><strong>Un niveau<\/strong>&nbsp;: ASM\/RAS \u2014 Lissage de la grille fine uniquement<\/li>\n<li><strong>Deux niveaux<\/strong>&nbsp;: espace grossier + Schwarz \u2014 Convergence globale + locale<\/li>\n<li><strong>Trois niveaux<\/strong>&nbsp;: espaces grossiers multi-niveaux - HPC de production (par exemple, Frosch \u00e9chelles \u00e0 32&nbsp;768&nbsp;MPI)<\/li>\n<\/ul>\n<p>Les m\u00e9thodes \u00e0 trois niveaux ajoutent un deuxi\u00e8me espace grossier (un \"global grossier\" au-dessus des espaces grossiers du sous-domaine) pour un parall\u00e9lisme \u00e0 grande \u00e9chelle. Frosch montre une mise \u00e0 l'\u00e9chelle faible \u00e0 32 768 rangs avec des nombres d'it\u00e9rations presque constants - un signal de cr\u00e9dibilit\u00e9 que les m\u00e9thodes \u00e0 deux niveaux ne peuvent toujours pas atteindre [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">5<\/a>].<\/p>\n<hr>\n<h2 id=\"petsc-example\">Exemple de travail : petsc\/petsc4py Poisson Solveur avec BDDC Preconditioner<\/h2>\n<p>Voici un exemple complet de d\u00e9composition de domaine en Python \u00e0 l'aide de PETSC. C'est l'approche qui relie l'infrastructure C++ de PETSC \u00e0 l'accessibilit\u00e9 de Python.<\/p>\n<h3>Installation<\/h3>\n<pre><code class=\"language-python\">import numpy as np\nfrom petsc4py import PETSc\n\n# Create a 2D Poisson problem on a distributed grid\ncomm = PETSc.MPI.COMWORLD\nsize = comm.Get_size()\nrank = comm.Get_rank()\n\n# Problem parameters\nn = 50  # cells per dimension\nH = 1.0  # domain size\n\n# Create distributed mesh (simple Cartesian partition)\n# Each rank owns a slice of the grid\nif rank == 0:\n    print(f\"PETSc + BDDC on {size} MPI ranks\")\n    print(f\"Problem size: {n**2} unknowns\")\n<\/code><\/pre>\n<h3>Cr\u00e9ation de la matrice syst\u00e8me<\/h3>\n<pre><code class=\"language-python\"># Assemble the 5-point stencil Laplacian\nA = PETSc.Matrix()\nA.setSize(n**2, n**2)\n\n# Populate the matrix (simplified \u2014 full code uses PETSc vectors)\nfor i in range(n):\n    for j in range(n):\n        idx = i * n + j\n        # Diagonal\n        A.setValue(idx, idx, 4.0)\n        # Neighbors\n        if i &gt; 0:\n            A.setValue(idx, (i-1)*n + j, -1.0)\n        if i &lt; n-1:\n            A.setValue(idx, (i+1)*n + j, -1.0)\n        if j &gt; 0:\n            A.setValue(idx, i*n + (j-1), -1.0)\n        if j &lt; n-1:\n            A.setValue(idx, i*n + (j+1), -1.0)\n\nA.assemble()\n<\/code><\/pre>\n<h3>Commutation des pr\u00e9conditionneurs<\/h3>\n<p>La magie est cette ligne :<\/p>\n<pre><code class=\"language-python\">ksp = PETSc.KSP()\nksp.setProblemType(PETSc.KSP.PRECONDITIONED)\nksp.setOperator(A)\n\n# Method A: Additive Schwarz (one-level)\nksp.setPreconditionerType(PETSc.PC.FAS)  # or PETSc.PC.PATCH for ASM-like\n\n# Method B: BDDC (two-level with coarse space) \u2014 modern default\nksp.setPreconditionerType(PETSc.PC.BDDC)\n\n# Method C: GAMG (geometric AMG \u2014 also effective)\nksp.setPreconditionerType(PETSc.PC.GAMG)\n\n# Solve\nksp.setFromOptions()\nksp.solve()\n<\/code><\/pre>\n<h3>Utilisation de HPDDM pour les pr\u00e9conditionneurs personnalis\u00e9s<\/h3>\n<p>Le pont <code>PCHPDDM<\/code> vous permet d'utiliser les pr\u00e9conditionneurs avanc\u00e9s de HPDDM sans \u00e9crire de C++&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Swap preconditioners from the command line\n# $ mpiexec -n 16 python solver.py -pc_type hpddm -hpddm_pc_type bddc\nksp.setPreconditionerType(PETSc.PC.HPDDM)\n<\/code><\/pre>\n<p>Il s'agit du point d'entr\u00e9e le plus pratique pour les chercheurs Python - vous changez <code>-pc_type<\/code> de la ligne de commande sans toucher votre code de solveur. Comme Dolan et al. L'enqu\u00eate 2026 montre que cette flexibilit\u00e9 en ligne de commande est la raison pour laquelle PETSC domine la production HPC [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>].<\/p>\n<hr>\n<h2 id=\"fenics-example\">Exemple de travail : D\u00e9composition du domaine parall\u00e8le FENICS\/Dolfinx<\/h2>\n<p>Fenics\/Dolfinx g\u00e8re la d\u00e9composition du domaine gr\u00e2ce \u00e0 son parall\u00e9lisme MPI int\u00e9gr\u00e9. Le framework partitionne automatiquement le maillage et g\u00e8re la communication des n\u0153uds fant\u00f4mes.<\/p>\n<h3>Partitionnement de maillage parall\u00e8le<\/h3>\n<pre><code class=\"language-python\">from dolfinx import mesh, function, plot\nfrom dolfinx_fem import Assembly, Problem\nfrom ufl import FiniteElement, TestFunction, TrialFunction, dot, dx\nfrom mpi4py import MPI\n\n# Create distributed mesh \u2014 DOLFINx handles partitioning automatically\ncomm = MPI.COMM_WORLD\nrank = comm.Get_rank()\n\n# Create a 2D mesh partitioned across MPI ranks\nmesh_data = mesh.create_mesh(comm, [...])  # mesh coordinates, entities, cells\n\n# DOLFINx automatically creates subdomains with overlap\ndomain = mesh.create_mesh(comm, mesh_data)\ndomain.partition()  # Partition for MPI distribution\n<\/code><\/pre>\n<h3>Configurer la forme variationnelle<\/h3>\n<pre><code class=\"language-python\"># Define function space (Lagrange elements, degree 2)\nelement = FiniteElement(\"Lagrange\", \"triangle\", 2)\nV = FunctionSpace(domain, element)\n\n# Define trial and test functions\nu = TrialFunction(V)\nv = TestFunction(V)\n\n# Weak form of Poisson: grad(u)\u00b7grad(v) = f\u00b7v\nF = dot(grad(u), grad(v)) * dx - 1.0 * v * dx\n\n# Boundary conditions (Dirichlet)\nfrom dolfinx import geometry\nbc = function.Constant(0.0)\nV0 = V.sub(0).collapse()[0]  # Subspace for Dirichlet BCs\ndofs = function.Function(V0).vector\n<\/code><\/pre>\n<h3>R\u00e9solution avec Schwarz Preconditioner<\/h3>\n<pre><code class=\"language-python\"># The solver is built on PETSc underneath\nproblem = Problem(F, bc)\nsolver = Problem.Solver(problem)\n\n# DOLFINx automatically uses GAMG (geometric AMG) as default\n# This is a two-level method \u2014 coarse space + local solves\nsolver.solve()\n<\/code><\/pre>\n<h3>Acc\u00e9der aux internes MPI\/DDM<\/h3>\n<p>La <a href=\"https:\/\/fenicsproject.discourse.group\/t\/re-develop-on-fenics-fenicsxs-mpi-ddm-method\/7726\" target=\"_blank\" rel=\"nofollow noopener\">Fenics Discourse Community<\/a> a document\u00e9 les points faibles li\u00e9s \u00e0 l'acc\u00e8s aux internes de partitionnement MPI de Dolfinx. Les utilisateurs suppl\u00e9mentaires <a href=\"https:\/\/fenicsproject.discourse.group\/t\/question-difficulty-with-parallel-implementation\/11338\" target=\"_blank\" rel=\"nofollow noopener\">Signaler une difficult\u00e9 avec des mod\u00e8les d'impl\u00e9mentation parall\u00e8les<\/a> - les n\u0153uds fant\u00f4mes, le partitionnement vectoriel et la communication MPI ne sont pas toujours bien document\u00e9s. Contrairement \u00e0 PETSC, Fenics r\u00e9sume les d\u00e9tails DD dans les coulisses, ce qui est pratique pour les d\u00e9butants mais limitant lorsque vous devez exp\u00e9rimenter avec des pr\u00e9conditionneurs personnalis\u00e9s.<\/p>\n<p>Les utilisateurs signalent que la couche MPI\/DDM n'est pas directement expos\u00e9e \u00e0 Python. C'est pourquoi le PETSC est pr\u00e9f\u00e9r\u00e9 pour la recherche en production o\u00f9 l'exp\u00e9rimentation du pr\u00e9conditionneur est importante.<\/p>\n<hr>\n<h2 id=\"performance-comparison\">Comparaison des performances<\/h2>\n<table>\n<thead>\n<tr>\n<th>pr\u00e9conditionneur<\/th>\n<th>Tapez<\/th>\n<th>it\u00e9rations<\/th>\n<th>Efficacit\u00e9 parall\u00e8le<\/th>\n<th>Complexit\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ilu(0)<\/td>\n<td>Un niveau (pas de DD)<\/td>\n<td>166<\/td>\n<td>Mauvais \u2014 pas d'avantage parall\u00e8le<\/td>\n<td>Simple<\/td>\n<\/tr>\n<tr>\n<td>GAM<\/td>\n<td>Deux niveaux (AMG)<\/td>\n<td>35<\/td>\n<td>Bon \u2014 Mise \u00e0 l'\u00e9chelle g\u00e9om\u00e9trique<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>ASM (Schwarz \u00e0 un niveau)<\/td>\n<td>\u00e0 un niveau<\/td>\n<td>~50\u2013100<\/td>\n<td>Se d\u00e9grade lin\u00e9airement avec les sous-domaines<\/td>\n<td>Simple<\/td>\n<\/tr>\n<tr>\n<td>RAS (Schwarz \u00e0 un niveau)<\/td>\n<td>\u00e0 un niveau<\/td>\n<td>~30\u201380<\/td>\n<td>Mieux que l'ASM, se d\u00e9grade toujours<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>BDDC<\/td>\n<td>\u00e0 deux niveaux<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Quasi-optimal \u2014 Mise \u00e0 l'\u00e9chelle constante<\/td>\n<td>Mod\u00e9r\u00e9-complexe<\/td>\n<\/tr>\n<tr>\n<td>Geneo + RAS<\/td>\n<td>\u00e0 deux niveaux (h\u00e9t\u00e9rog\u00e8ne)<\/td>\n<td><strong>5\u201315<\/strong><\/td>\n<td>\u00c9chelles \u00e0 32&nbsp;768 rangs (Frosch)<\/td>\n<td>Complexe<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>BDDC<\/strong> (5 \u00e0 9&nbsp;it\u00e9rations) surpasse syst\u00e9matiquement les autres m\u00e9thodes sur les probl\u00e8mes de r\u00e9f\u00e9rence. Sa construction \u00e0 deux niveaux g\u00e8re \u00e0 la fois la correction de la grille fine et l'espace grossier mondial, ce qui en fait le d\u00e9faut pratique pour Poisson et les probl\u00e8mes connexes.<\/p>\n<p><strong>Geneo + Ras<\/strong> ajoute une d\u00e9tection automatique de l'espace grossier pour les milieux h\u00e9t\u00e9rog\u00e8nes. Lorsque votre probl\u00e8me a des coefficients de contraste \u00e9lev\u00e9 (par exemple, la perm\u00e9abilit\u00e9 variant de 10\u2076), Geneo est le seul choix fiable.<\/p>\n<hr>\n<h2 id=\"when-to-choose\">Quand choisir quoi : Cadre de d\u00e9cision<\/h2>\n<h3>Un niveau ou deux niveaux<\/h3>\n<table>\n<thead>\n<tr>\n<th>Situation<\/th>\n<th>Approche recommand\u00e9e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u2264 32 rangs MPI, probl\u00e8me homog\u00e8ne<\/td>\n<td>ASM ou RAS (un niveau est bien)<\/td>\n<\/tr>\n<tr>\n<td>32\u2013512 rangs, probl\u00e8me homog\u00e8ne<\/td>\n<td>Deux niveaux avec Nicolaides Space grossier<\/td>\n<\/tr>\n<tr>\n<td>512+ rangs, probl\u00e8me homog\u00e8ne<\/td>\n<td>BDDC ou GAMG (deux niveaux)<\/td>\n<\/tr>\n<tr>\n<td>N'importe quel nombre de rangs, probl\u00e8me h\u00e9t\u00e9rog\u00e8ne<\/td>\n<td>Geneo + RAS (deux niveaux avec espace automatique grossier)<\/td>\n<\/tr>\n<tr>\n<td>HPC de production, 1&nbsp;000&nbsp;+ rangs<\/td>\n<td>Trois niveaux (par exemple, Frosch)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>R\u00e8gle du pouce<\/strong>&nbsp;: 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.<\/p>\n<h3>ASM contre RAS<\/h3>\n<table>\n<thead>\n<tr>\n<th>Crit\u00e8re<\/th>\n<th>asm<\/th>\n<th>Ras<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Traitement en chevauchement<\/td>\n<td>Ajout complet (chevauchement des doubles comptes)<\/td>\n<td>Poids de partition d'unit\u00e9<\/td>\n<\/tr>\n<tr>\n<td>vitesse de convergence<\/td>\n<td>plus lent<\/td>\n<td>Je\u00fbneur<\/td>\n<\/tr>\n<tr>\n<td>Complexit\u00e9 de mise en \u0153uvre<\/td>\n<td>plus simple<\/td>\n<td>Un peu plus complexe<\/td>\n<\/tr>\n<tr>\n<td>Recommandation<\/td>\n<td>Prototype uniquement<\/td>\n<td>Solveur de production<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilisez RAS<\/strong> chaque fois que possible. La correction de partition d'unit\u00e9 est un changement sur une seule ligne dans la plupart des impl\u00e9mentations, et l'am\u00e9lioration de la convergence est imm\u00e9diate.<\/p>\n<h3>PETSC vs. Fenics<\/h3>\n<table>\n<thead>\n<tr>\n<th>Crit\u00e8re<\/th>\n<th>PETSC\/Petsc4py<\/th>\n<th>Fenics\/Dolfinx<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Flexibilit\u00e9 du pr\u00e9conditionneur<\/td>\n<td>Complet \u2014 \u00c9change via <code>-pc_type<\/code><\/td>\n<td>Limit\u00e9 \u2014 par d\u00e9faut de GAM<\/td>\n<\/tr>\n<tr>\n<td>Accessibilit\u00e9 Python<\/td>\n<td>Mod\u00e9r\u00e9 (n\u00e9cessite une familiarit\u00e9 avec les PETSC)<\/td>\n<td>\u00c9lev\u00e9 (forme variationnelle d\u00e9clarative)<\/td>\n<\/tr>\n<tr>\n<td>Transparence MPI\/DDM<\/td>\n<td>Faible \u2014 Infrastructure C++ sous Python<\/td>\n<td>Faible \u2014 L'abstraction masque les d\u00e9tails DD<\/td>\n<\/tr>\n<tr>\n<td>Exp\u00e9rimentation DD personnalis\u00e9e<\/td>\n<td>Excellent<\/td>\n<td>Limit\u00e9<\/td>\n<\/tr>\n<tr>\n<td>Courbe d'apprentissage<\/td>\n<td>escarp\u00e9<\/td>\n<td>Doux<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilisez PETSC<\/strong> si vous devez exp\u00e9rimenter avec des pr\u00e9conditionneurs, personnaliser les partitions DD ou \u00e9changer des solveurs sans r\u00e9\u00e9crire le code. <strong>Utilisez Fenics<\/strong> si vous souhaitez un prototypage rapide et que vous n'avez pas besoin de personnalisation du pr\u00e9conditionneur.<\/p>\n<hr>\n<h2 id=\"summary\">R\u00e9sum\u00e9 + \u00c9tapes suivantes<\/h2>\n<p>La d\u00e9composition de domaine transforme les solveurs PDE en s\u00e9rie en parall\u00e8les en divisant le domaine en sous-domaines qui se chevauchent et en r\u00e9solvant localement. La progression de la m\u00e9thode d'alternance de Schwarz en 1870 vers les pr\u00e9conditionneurs modernes \u00e0 deux niveaux (BDDC, Geneo) refl\u00e8te un simple aper\u00e7u&nbsp;: <strong>correction d'espace grossi\u00e8re est essentielle pour l'\u00e9chelle<\/strong>.<\/p>\n<h3>R\u00e9sum\u00e9 rapide<\/h3>\n<ol>\n<li><strong>Schwarz \u00e0 un niveau<\/strong> (ASM\/RAS) fonctionne pour un petit parall\u00e9lisme mais se d\u00e9grade lin\u00e9airement avec le nombre de sous-domaines.<\/li>\n<li><strong>RAS bat ASM<\/strong> gr\u00e2ce \u00e0 la pond\u00e9ration de chevauchement de la partition d'unit\u00e9 - pr\u00e9f\u00e8re toujours Ras.<\/li>\n<li><strong>M\u00e9thodes \u00e0 deux niveaux<\/strong> avec des espaces grossiers (BDDC, Geneo) sont la norme moderne.<\/li>\n<li><strong>Geneo<\/strong> d\u00e9tecte automatiquement les modes de faible \u00e9nergie probl\u00e9matiques pour les milieux h\u00e9t\u00e9rog\u00e8nes.<\/li>\n<li><strong>Les impl\u00e9mentations de Python<\/strong> dans PETSC (<code>pc_type bddc<\/code>) et les fenics (auto-GAMG) rendent DD accessible.<\/li>\n<\/ol>\n<h3>Prochaines \u00e9tapes<\/h3>\n<ol>\n<li><strong>Commencez par petsc\/petsc4py<\/strong> \u2014 essayez <code>pc_type bddc<\/code> sur un probl\u00e8me de Poisson simple. Le didacticiel <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">NGSPETSC<\/a> fournit un mod\u00e8le de travail.<\/li>\n<li><strong>Lire la r\u00e9f\u00e9rence canonique<\/strong>&nbsp;: Dolive, Jolivet, NATAF 2015 <em>\"Une introduction aux m\u00e9thodes de d\u00e9composition de domaine\"<\/em> [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>] est le meilleur aper\u00e7u conceptuel.<\/li>\n<li><strong>Pour des probl\u00e8mes h\u00e9t\u00e9rog\u00e8nes<\/strong>, explorez les espaces geneo grossiers dans HPDDM ou FreeFEM FFDDM.<\/li>\n<li><strong>Apprenez le parall\u00e9lisme Fenics<\/strong> si votre flux de travail n\u00e9cessite un prototypage rapide sur des maillages irr\u00e9guliers. Le <a href=\"https:\/\/fenicsproject.org\/docs\/dolfinx\/latest\/\" target=\"_blank\" rel=\"nofollow noopener\">documentation fenicsx<\/a> couvre le partitionnement de maillage distribu\u00e9.<\/li>\n<\/ol>\n<h3>Guides connexes<\/h3>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des probl\u00e8mes de PDE \u00e0 grande \u00e9chelle&nbsp;: strat\u00e9gies, solveurs et \u00e9tudes de cas HPC<\/a> - lorsque les simulations deviennent trop ch\u00e8res pour un seul n\u0153ud<\/li>\n<li><a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">hpc python Flux de travail&nbsp;: de l'ordinateur portable au superordinateur<\/a>&nbsp;\u2013&nbsp;Configuration des environnements MPI reproductibles<\/li>\n<li><a href=\"https:\/\/matforge.org\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\" target=\"_blank\" rel=\"nofollow noopener\">Choisir le bon solveur Python PDE&nbsp;: FIPY vs Py-PDE vs Fenics<\/a> \u2014 Quand utiliser Fenics et quand utiliser des alternatives<\/li>\n<li><a href=\"https:\/\/matforge.org\/fenics-fipy-openfoam-choosing-right-pde-solver\/\" target=\"_blank\" rel=\"nofollow noopener\">Fenics vs Fipy VS OpenFoam&nbsp;: Choisir le bon solveur<\/a>&nbsp;\u2013&nbsp;Comparaison de m\u00e9thodes \u00e0 grande \u00e9chelle<\/li>\n<li><a href=\"https:\/\/matforge.org\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" target=\"_blank\" rel=\"nofollow noopener\">informatique parall\u00e8le distribu\u00e9e Mod\u00e8les&nbsp;: Python MPI et DASK<\/a>&nbsp;: les fondamentaux du MPI qui sous-tendent la d\u00e9composition du domaine<\/li>\n<\/ul>\n<hr>\n<h2>R\u00e9flexions finales<\/h2>\n<p>La d\u00e9composition du domaine est le pont entre la compr\u00e9hension de la th\u00e9orie PDE et l'ex\u00e9cution de simulations de production. Les math\u00e9matiques sont \u00e9l\u00e9gantes - chevauchent les sous-domaines, r\u00e9solvent localement, corrigent le global - mais la diff\u00e9rence pratique entre ASM et RAS, ou un niveau et deux niveaux, est ce qui s\u00e9pare un prototype fonctionnel d'un solveur de production.<\/p>\n<p>Si vous \u00e9valuez les pr\u00e9conditionnels ou mettez en place une simulation parall\u00e8le qui ne s'adapte pas, l'\u00e9quipe de consultation <a href=\"https:\/\/matforge.org\/category\/issue-tracking-tickets-technical-requests\/\" target=\"_blank\" rel=\"nofollow noopener\">MatForge<\/a> peut vous aider \u00e0 choisir la bonne approche pour votre classe de probl\u00e8mes. Que vous travailliez avec des mat\u00e9riaux homog\u00e8nes ou des milieux h\u00e9t\u00e9rog\u00e8nes \u00e0 contraste \u00e9lev\u00e9, la bonne strat\u00e9gie DD est importante.<\/p>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>tl;dr \u2014 Ce que vous devez savoir D\u00e9composition de domaine divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse r\u00e9soudre son \u00e9l\u00e9ment local ind\u00e9pendamment. Schwarz additif (ASM) est la forme la plus simple : vous r\u00e9solvez localement et ajoutez des corrections. Il fonctionne tr\u00e8s bien pour les petits [&hellip;]<\/p>\n","protected":false,"raw":""},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=533","iawp_total_views":1,"footnotes":""},"categories":[2],"tags":[36,42,37,35,41,38,39,40],"class_list":["post-1282","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","tag-a-stability","tag-bayesian-inference","tag-explicit-euler","tag-l-stability","tag-model-calibration","tag-prothero-robinson-problem","tag-rock-method","tag-sdirk","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  11 minutestl;dr \u2014 Ce que vous devez savoir D\u00e9composition de domaine divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse r\u00e9soudre son \u00e9l\u00e9ment local ind\u00e9pendamment. Schwarz additif (ASM) est la forme la plus simple : vous r\u00e9solvez localement et ajoutez des corrections. Il fonctionne tr\u00e8s bien pour les petits [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:31:28+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python\",\"datePublished\":\"2026-08-21T14:31:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/\"},\"wordCount\":3263,\"commentCount\":0,\"keywords\":[\"A-stabilit\u00e9\",\"Inf\u00e9rence bay\u00e9sienne\",\"explicit Euler\",\"L-stability\",\"model calibration\",\"PROthero-Robinson problem\",\"ROCK method\",\"SDIRK\"],\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/\",\"name\":\"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:31:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/domain-decomposition-parallel-pde-solvers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/","og_locale":"fr_FR","og_type":"article","og_title":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org","og_description":"Reading Time:  11 minutestl;dr \u2014 Ce que vous devez savoir D\u00e9composition de domaine divise une grille de simulation en sous-domaines qui se chevauchent afin que chaque rang MPI puisse r\u00e9soudre son \u00e9l\u00e9ment local ind\u00e9pendamment. Schwarz additif (ASM) est la forme la plus simple : vous r\u00e9solvez localement et ajoutez des corrections. Il fonctionne tr\u00e8s bien pour les petits [&hellip;]","og_url":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:31:28+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Tomas Delgado","Dur\u00e9e de lecture estim\u00e9e":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python","datePublished":"2026-08-21T14:31:28+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/"},"wordCount":3263,"commentCount":0,"keywords":["A-stabilit\u00e9","Inf\u00e9rence bay\u00e9sienne","explicit Euler","L-stability","model calibration","PROthero-Robinson problem","ROCK method","SDIRK"],"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/","url":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/","name":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:31:28+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/domain-decomposition-parallel-pde-solvers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"D\u00e9composition de domaine pour les solveurs parall\u00e8les de PDE\u00a0: schwarz additif, m\u00e9thodes de chevauchement et impl\u00e9mentation de python"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1282"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1282\/revisions"}],"predecessor-version":[{"id":1408,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1282\/revisions\/1408"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}