{"id":779,"date":"2026-07-30T12:21:42","date_gmt":"2026-07-30T12:21:42","guid":{"rendered":"https:\/\/matforge.org\/?p=779","raw":"https:\/\/matforge.org\/?p=779"},"modified":"2026-07-30T12:21:42","modified_gmt":"2026-07-30T12:21:42","slug":"domain-decomposition-parallel-pde-solvers","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/","title":{"rendered":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python","raw":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n 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 Lo que necesita saber<\/h2>\n<ul>\n<li><strong>Descomposici\u00f3n de dominio<\/strong> divide una cuadr\u00edcula de simulaci\u00f3n en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente.<\/li>\n<li><strong>Aditivo Schwarz (ASM)<\/strong> es la forma m\u00e1s simple: se resuelve localmente y agrega correcciones. Funciona muy bien para peque\u00f1os recuentos de subdominios, pero falla a escala.<\/li>\n<li><strong>Aditivo restringido Schwarz (RAS)<\/strong> Arregla la redundancia de ASM a trav\u00e9s de pesos de partici\u00f3n de unidad. Siempre prefiera RAS a ASM para los solucionadores de producci\u00f3n.<\/li>\n<li><strong>M\u00e9todos de dos niveles<\/strong> con espacios gruesos (Geneo, Nicolaides) son ahora el est\u00e1ndar en la producci\u00f3n de HPC. Permiten escalar a 32.768 rangos MPI (Frosch).<\/li>\n<li><strong>Implementaciones de Python<\/strong> en PETSC\/PETSC4PY y Fenics\/Dolfinx hacen que estos m\u00e9todos sean accesibles sin C++: comience con <code>pc_type bddc<\/code> en PETSC, o use <code>DMPython<\/code> en Fenics.<\/li>\n<\/ul>\n<hr>\n<h2>\u00bfQu\u00e9 es la descomposici\u00f3n del dominio y por qu\u00e9 es importante?<\/h2>\n<p>La descomposici\u00f3n del dominio es la estrategia m\u00e1s efectiva para convertir un solucionador de PDE en serie en uno paralelo. En lugar de preguntar c\u00f3mo paralelizar todo su algoritmo, divide el dominio computacional en piezas m\u00e1s peque\u00f1as y superpuestas, resuelve cada pieza localmente e intercambia datos de l\u00edmites. Este enfoque se asigna directamente al modelo de memoria distribuida de MPI: cada rango posee un subdominio y solo se comunica con sus vecinos.<\/p>\n<p>El m\u00e9todo data de <strong>1870<\/strong>, cuando Hermann A. Schwarz formaliz\u00f3 el enfoque de direcci\u00f3n alterna para la conducci\u00f3n de calor. Los matem\u00e1ticos anteriores, incluido Heinrich Schr\u00f6der, exploraron ideas similares, pero la formulaci\u00f3n de Schwarz es la referencia can\u00f3nica. Hoy respalda a los solucionadores de producci\u00f3n como PetSc, Fenics y Freefem.<\/p>\n<p><strong>\u00bfLo sab\u00edas?<\/strong> El concepto de dividir un dominio en subdominios con superposici\u00f3n es anterior a las computadoras digitales en casi un siglo. La base matem\u00e1tica, el m\u00e9todo de alternancia de Schwarz, se desarroll\u00f3 para resolver las PDE el\u00edpticas a mano [<a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_Schwarz_method\" target=\"_blank\" rel=\"nofollow noopener\">4<\/a>], utilizando la intuici\u00f3n de que los valores de l\u00edmite de las regiones vecinas pueden servir como condiciones de Dirichlet. La descomposici\u00f3n del dominio moderno automatiza esa intuici\u00f3n a escala.<\/p>\n<p>Si est\u00e1 manteniendo o desarrollando c\u00f3digo cient\u00edfico Python, la descomposici\u00f3n de dominio es el puente entre un prototipo que se ejecuta en una computadora port\u00e1til y un solucionador que se ejecuta en una supercomputadora. Las siguientes secciones explican la teor\u00eda, la diferencia pr\u00e1ctica entre las variantes y los ejemplos de trabajo de Python.<\/p>\n<blockquote>\n<p>Desde el <a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">HPC Python Gu\u00eda de flujos de trabajo<\/a> en MatForge: La descomposici\u00f3n del dominio es el patr\u00f3n de distribuci\u00f3n de carga de trabajo can\u00f3nico cuando se debe resolver una PDE en miles de nodos. El art\u00edculo cubre los fundamentos de paralelizaci\u00f3n de MPI4PY que sustentan cada implementaci\u00f3n de DD.<\/p>\n<\/blockquote>\n<hr>\n<h2 id=\"the-schwarz-method\">El m\u00e9todo Schwarz: desde 1870 hasta algoritmos modernos<\/h2>\n<p>El m\u00e9todo Schwarz lleva el nombre de Hermann A. Schwarz, quien formaliz\u00f3 el esquema de iteraci\u00f3n de direcci\u00f3n alterna en 1870. La idea central es simple:<\/p>\n<ol>\n<li>Dividir el dominio \u03c9 en subdominios superpuestos \u03c9\u1d62.<\/li>\n<li>Resuelva el PDE en cada subdominio de forma independiente, utilizando las condiciones de contorno de Dirichlet en las interfaces de superposici\u00f3n.<\/li>\n<li>Actualice iterativamente los valores de l\u00edmite hasta la convergencia.<\/li>\n<\/ol>\n<p>Este es el m\u00e9todo <strong>alternativa<\/strong> Schwarz: recorre los subdominios uno a la vez, actualizando los valores de los l\u00edmites secuencialmente. Es conceptualmente limpio pero pr\u00e1cticamente limitado porque el barrido secuencial impide el paralelismo.<\/p>\n<p>La versi\u00f3n moderna reemplaza los barridos secuenciales con <strong>simult\u00e1neos<\/strong> resuelve el subdominio. En lugar de esperar a que termine un subdominio antes de comenzar el siguiente, todos los subdominios se resuelven en paralelo. Aqu\u00ed es donde la informaci\u00f3n de 1870 de Schwarz se convierte en un preacondicionador paralelo: resuelve el problema grueso en cada subdominio simult\u00e1neamente y luego agrega las correcciones.<\/p>\n<p>La transici\u00f3n de Schwarz alterno a aditivo es lo que hace que la descomposici\u00f3n del dominio sea pr\u00e1ctica para el HPC moderno. Como explican Dolean, Jolivet y Nataf en su libro de texto can\u00f3nico <em>\u00abUna introducci\u00f3n a los m\u00e9todos de descomposici\u00f3n de dominio\u00bb<\/em> (2015) [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>], la formulaci\u00f3n aditiva transforma el m\u00e9todo de un solucionador iterativo en un <strong>preacondicionador<\/strong> para m\u00e9todos Krylov como CG o GMRES.<\/p>\n<hr>\n<h2 id=\"asm-vs-ras\">Aditivo Schwarz vs. Aditivo restringido Schwarz: la diferencia pr\u00e1ctica<\/h2>\n<p>Aqu\u00ed es donde la mayor\u00eda de los tutoriales se detienen, y la mayor\u00eda de los practicantes se confunden. Schwarz aditivo (ASM) y Schwarz aditivo restringido (RAS) suenan id\u00e9nticos pero divergen dr\u00e1sticamente a escala.<\/p>\n<h3>Aditivo Schwarz (ASM)<\/h3>\n<p>En ASM, resuelves en cada subdominio superpuesto y simplemente <strong>agregar<\/strong> las correcciones juntas:<\/p>\n<pre><code>x_new = \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>donde p\u1d62 es el problema grueso local y f es el lado derecho. Cada correcci\u00f3n de subdominio se agrega a la actualizaci\u00f3n global.<\/p>\n<h3>Aditivo restringido Schwarz (RAS)<\/h3>\n<p>RAS modifica el tratamiento de superposici\u00f3n. En lugar de agregar la contribuci\u00f3n de superposici\u00f3n completa de cada subdominio (que duplica la regi\u00f3n de superposici\u00f3n), RAS aplica <strong>Pesos de partici\u00f3n de unidad de unidad<\/strong> al solapamiento. Esto elimina las contribuciones redundantes y hace que el preacondicionador sea matem\u00e1ticamente correcto.<\/p>\n<p>La consecuencia pr\u00e1ctica es dram\u00e1tica: <strong>RAS converge m\u00e1s r\u00e1pido que ASM<\/strong> porque evita el sobrecuento impl\u00edcito de las contribuciones de la interfaz. La diferencia es sutil en la formulaci\u00f3n, pero los recuentos de Stark en iteraci\u00f3n.<\/p>\n<p><strong>Distinci\u00f3n de claves<\/strong>: ASM es m\u00e1s f\u00e1cil de implementar: puede colocarlo en un solucionador de Krylov con cambios m\u00ednimos. RAS requiere un manejo cuidadoso de la partici\u00f3n de superposici\u00f3n. En los solucionadores de producci\u00f3n, RAS es la opci\u00f3n predeterminada.<\/p>\n<p>De la encuesta ARXIV de 2026 <em>\u00abUna visita guiada de la descomposici\u00f3n de dominios moderno\u00bb<\/em> [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>], RAS es ahora la l\u00ednea de base para todas las implementaciones de DD modernas. El enfoque de la partici\u00f3n de la unidad es algebraicamente equivalente a resolver la regi\u00f3n de solapamiento una vez y ponderar las contribuciones para que suman la unidad. Este resultado tambi\u00e9n est\u00e1 documentado en la taxonom\u00eda del preacondicionador emergente (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\">El problema de escalabilidad: por qu\u00e9 fallan los m\u00e9todos de un nivel<\/h2>\n<p>Los m\u00e9todos Schwarz de un nivel (ASM o RAS sin espacio grueso) tienen una limitaci\u00f3n de escalabilidad fundamental: <strong>El recuento de iteraciones crece linealmente con el n\u00famero de subdominios<\/strong>.<\/p>\n<p>Si divide su dominio en 2 subdominios, es posible que necesite de 3 a 5 iteraciones de krylov por ciclo DD. Con 64 subdominios, es posible que necesite 50 a 100 iteraciones. A 1024 subdominios, la efectividad del preacondicionador se degrada hasta el punto en que el ciclo DD en s\u00ed cuesta m\u00e1s que resolver el problema original en serie.<\/p>\n<p><strong>Este no es un problema pr\u00e1ctico que puedas optimizar.<\/strong> Es una consecuencia matem\u00e1tica de las propiedades espectrales del preacondicionador de Schwarz. El n\u00famero de condici\u00f3n \u03ba(p) de un preacondicionador de un nivel satisface:<\/p>\n<pre><code>\u03ba(P) \u2264 C(1 + H\/h) \u00b7 \u03ba(A_interior)\n<\/code><\/pre>\n<p>Donde H es el di\u00e1metro del subdominio, H es el tama\u00f1o de la malla y H\/h es la relaci\u00f3n que crece con el n\u00famero de subdominios. A medida que aumenta H\/H, \u03ba(p) aumenta y los recuentos de iteraci\u00f3n aumentan en consecuencia.<\/p>\n<h3>Evidencia concreta: el punto de referencia de NGSPETSC POISSON<\/h3>\n<p>El <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">Tutorial de NGSPETSC Poisson<\/a> proporciona una comparaci\u00f3n limpia sobre el mismo problema. El punto de referencia utiliza exactamente la misma ecuaci\u00f3n de Poisson y compara los preacondicionadores de ILU, GAMG y BDDC.<\/p>\n<table>\n<thead>\n<tr>\n<th>preacondicionador<\/th>\n<th>iteraciones<\/th>\n<th>notas<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ilusi\u00f3n<\/td>\n<td>166<\/td>\n<td>LU escaso: sin beneficio paralelo<\/td>\n<\/tr>\n<tr>\n<td>combatir<\/td>\n<td>35<\/td>\n<td>AMG geom\u00e9trico: buena escalada en paralelo<\/td>\n<\/tr>\n<tr>\n<td>BCD<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Preacondicionador diagonal de bloque en la hebilla \u2014 casi \u00f3ptimo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>BDDC (preacondicionador diagonal en bloque en la hebilla) es un m\u00e9todo de dos niveles que utiliza una correcci\u00f3n de espacio grueso. El recuento de iteraciones de 5 a 9 es esencialmente independiente del recuento de subdominios; esta es la diferencia pr\u00e1ctica entre DD de un nivel y dos niveles.<\/p>\n<p><strong>The Takeaway<\/strong>: Schwarz de un nivel funciona bien para el peque\u00f1o paralelismo (\u226432 rangos). Por encima de eso, necesitas una correcci\u00f3n de espacio grueso.<\/p>\n<hr>\n<h2 id=\"coarse-spaces\">Espacios gruesos: la soluci\u00f3n moderna<\/h2>\n<p>La soluci\u00f3n a la falla de un nivel es el <strong>espacio grueso<\/strong>, un problema de correcci\u00f3n global que captura los modos de baja energ\u00eda (componentes que var\u00edan lentamente) que los m\u00e9todos de un solo nivel fallan.<\/p>\n<p>El preacondicionador Schwarz de dos niveles toma la forma:<\/p>\n<pre><code>P_two-level = P_coarse + \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>La correcci\u00f3n gruesa maneja la convergencia global; Las correcciones locales de Schwarz manejan el suavizado de cuadr\u00edcula fina. Esta descomposici\u00f3n es la base de la descomposici\u00f3n del dominio moderno.<\/p>\n<h3>Espacio grueso de Nicolaides<\/h3>\n<p>El espacio grueso de Nicolaides (1991) utiliza funciones constantes en cada subdominio como funciones de base gruesa. Es simple de implementar y suficiente para problemas homog\u00e9neos. Sin embargo, se descompone para los problemas con <strong>heterogeneidad material<\/strong>, cuando su dominio tiene regiones con propiedades f\u00edsicas dr\u00e1sticamente diferentes.<\/p>\n<h3>Espacios G\u00e9neo Gruesos<\/h3>\n<p><strong>Geneo<\/strong> (problemas eigen generalizados en la superposici\u00f3n) es el avance moderno. En lugar de seleccionar funciones de base gruesa, Geneo <strong>detecta autom\u00e1ticamente<\/strong> modos de baja energ\u00eda problem\u00e1ticos resolviendo un problema de valor propio generalizado en cada subdominio:<\/p>\n<pre><code>K\u1d62 v = \u03bb B\u1d62 v\n<\/code><\/pre>\n<p>donde k\u1d62 es la matriz de rigidez local y b\u1d62 es el operador grueso local. Los modos propios con valores propios peque\u00f1os (por debajo de un umbral definido por el usuario) se marcan como problem\u00e1ticos y se agregan al espacio grueso.<\/p>\n<p>Esta detecci\u00f3n autom\u00e1tica es fundamental para:<\/p>\n<ul>\n<li><strong>Permeabilidad de alto contraste<\/strong> (por ejemplo, flujo subterr\u00e1neo con capas de roca que abarcan \u00f3rdenes de magnitud)<\/li>\n<li><strong>Materiales casi incompresibles<\/strong> (por ejemplo, tejidos de caucho o biol\u00f3gicos)<\/li>\n<li><strong>Acoplamiento multif\u00edsico<\/strong> (por ejemplo, problemas termomec\u00e1nicos con diferentes conductividades t\u00e9rmicas)<\/li>\n<\/ul>\n<p>Geneo ahora es est\u00e1ndar en HPDDM, FreeFEM (a trav\u00e9s de <code>ffddm<\/code>) y Frosch. Como demuestra la investigaci\u00f3n de 2026 de K\u00f6hler y Rheinbach, los espacios groseros GEneo mantienen recuentos de iteraciones casi constantes incluso cuando las propiedades del material var\u00edan por factores de 10\u00b3 o 10\u2076 [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<h3>M\u00e9todos de dos niveles frente a tres niveles<\/h3>\n<p>La progresi\u00f3n va:<\/p>\n<ul>\n<li><strong>Un nivel<\/strong>: ASM\/RAS \u2014 Solo suavizado de rejilla fina<\/li>\n<li><strong>Dos niveles<\/strong>: Espacio grueso + Schwarz \u2014 Global + Convergencia local<\/li>\n<li><strong>Tres niveles<\/strong>: espacios gruesos de varios niveles \u2014 HPC de producci\u00f3n (por ejemplo, escalas de Frosch a 32.768 rangos MPI)<\/li>\n<\/ul>\n<p>Los m\u00e9todos de tres niveles agregan un segundo espacio grueso (un \u00abgrosor global\u00bb en la parte superior de los espacios gruesos del subdominio) para el paralelismo de escala extrema. Frosch demuestra un escalamiento d\u00e9bil a 32,768 rangos con recuentos de iteraciones casi constantes, una se\u00f1al de credibilidad de que los m\u00e9todos de dos niveles no siempre pueden alcanzar [<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\">Ejemplo de trabajo: Solucionador de Poisson PETSC\/PETSC4PY con preacondicionador BDDC<\/h2>\n<p>Aqu\u00ed hay un ejemplo de trabajo completo de descomposici\u00f3n de dominio en Python usando PETSC. Este es el enfoque que une la infraestructura C++ de PETSC con la accesibilidad de Python.<\/p>\n<h3>Disposici\u00f3n<\/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>Creaci\u00f3n de la matriz del sistema<\/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>Conmutaci\u00f3n de preacondicionadores<\/h3>\n<p>La magia es esta l\u00ednea:<\/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>Uso de HPDDM para preacondicionadores personalizados<\/h3>\n<p>El puente <code>PCHPDDM<\/code> le permite utilizar los preacondicionadores avanzados de HPDDM sin escribir C++:<\/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>Este es el punto de entrada m\u00e1s pr\u00e1ctico para los investigadores de Python: cambia <code>-pc_type<\/code> de la l\u00ednea de comandos sin tocar el c\u00f3digo de Solver. Como el Dolean et al. Encuesta de 2026 demuestra que esta flexibilidad de l\u00ednea de comandos es la raz\u00f3n por la cual PETSC domina la producci\u00f3n de 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\">Ejemplo de trabajo: descomposici\u00f3n de dominios paralelos de Fenics\/Dolfinx<\/h2>\n<p>Fenics\/Dolfinx maneja la descomposici\u00f3n del dominio a trav\u00e9s de su paralelismo MPI incorporado. El marco particiona autom\u00e1ticamente la malla y administra la comunicaci\u00f3n de nodos fantasma.<\/p>\n<h3>Partici\u00f3n de malla paralela<\/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>Configuraci\u00f3n de la forma variacional<\/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>Resolviendo con el preacondicionador de Schwarz<\/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>Acceso a las partes internas de 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\">Comunidad de discursos de Fenics<\/a> ha documentado los puntos d\u00e9biles sobre el acceso a las partes internas de partici\u00f3n MPI de Dolffinx. Los usuarios adicionales <a href=\"https:\/\/fenicsproject.discourse.group\/t\/question-difficulty-with-parallel-implementation\/11338\" target=\"_blank\" rel=\"nofollow noopener\">reportar dificultad con patrones de implementaci\u00f3n paralelos<\/a>: los nodos fantasma, la partici\u00f3n vectorial y la comunicaci\u00f3n MPI no siempre est\u00e1n bien documentados. A diferencia de PetSc, Fenics abstrae los detalles de DD detr\u00e1s de escena: esto es conveniente para los principiantes pero limita cuando necesita experimentar con preacondicionadores personalizados.<\/p>\n<p>Los usuarios informan que la capa MPI\/DDM no est\u00e1 expuesta directamente a Python, lo que significa que no puede intercambiar tipos de preacondicionador de la misma manera que lo permite PETSC. Esta es la raz\u00f3n por la cual se prefiere PETSC para la investigaci\u00f3n de producci\u00f3n donde importa la experimentaci\u00f3n del preacondicionador.<\/p>\n<hr>\n<h2 id=\"performance-comparison\">Comparaci\u00f3n de rendimiento<\/h2>\n<table>\n<thead>\n<tr>\n<th>preacondicionador<\/th>\n<th>Tipo<\/th>\n<th>iteraciones<\/th>\n<th>eficiencia paralela<\/th>\n<th>Complejidad<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ilu(0)<\/td>\n<td>Un nivel (sin DD)<\/td>\n<td>166<\/td>\n<td>Pobre \u2014 Sin beneficio paralelo<\/td>\n<td>simple<\/td>\n<\/tr>\n<tr>\n<td>combatir<\/td>\n<td>Dos niveles (AMG)<\/td>\n<td>35<\/td>\n<td>Bueno \u2014 Escalado geom\u00e9trico<\/td>\n<td>Moderar<\/td>\n<\/tr>\n<tr>\n<td>ASM (Schwarz de un solo nivel)<\/td>\n<td>de un solo nivel<\/td>\n<td>~50-100<\/td>\n<td>Degrada linealmente con subdominios<\/td>\n<td>simple<\/td>\n<\/tr>\n<tr>\n<td>RAS (Schwarz de un nivel)<\/td>\n<td>de un solo nivel<\/td>\n<td>~30\u201380<\/td>\n<td>Mejor que ASM, todav\u00eda se degrada<\/td>\n<td>Moderar<\/td>\n<\/tr>\n<tr>\n<td>BCD<\/td>\n<td>de dos niveles<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>casi \u00f3ptimo: escalado constante<\/td>\n<td>Moderado-Complejo<\/td>\n<\/tr>\n<tr>\n<td>Geno + Ras<\/td>\n<td>Dos niveles (heterog\u00e9neos)<\/td>\n<td><strong>5\u201315<\/strong><\/td>\n<td>Escala a 32,768 rangos (Frosch)<\/td>\n<td>Complejo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>BDDC<\/strong> (5\u20139 iteraciones) supera constantemente a otros m\u00e9todos en los problemas de referencia. Su construcci\u00f3n de dos niveles maneja tanto la correcci\u00f3n de red fina como el espacio global grueso, lo que lo convierte en el incumplimiento pr\u00e1ctico para Poisson y problemas relacionados.<\/p>\n<p><strong>Geneo + Ras<\/strong> A\u00f1ade detecci\u00f3n autom\u00e1tica de espacio grueso para medios heterog\u00e9neos. Cuando su problema tiene coeficientes de alto contraste (por ejemplo, la permeabilidad que var\u00eda en 10\u2076), Geneo es la \u00fanica opci\u00f3n confiable.<\/p>\n<hr>\n<h2 id=\"when-to-choose\">Cu\u00e1ndo elegir qu\u00e9: Marco de decisi\u00f3n<\/h2>\n<h3>Un nivel frente a dos niveles<\/h3>\n<table>\n<thead>\n<tr>\n<th>Situaci\u00f3n<\/th>\n<th>Enfoque recomendado<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u2264 32 rangos de MPI, problema homog\u00e9neo<\/td>\n<td>ASM o RAS (un nivel est\u00e1 bien)<\/td>\n<\/tr>\n<tr>\n<td>32-512 rangos, problema homog\u00e9neo<\/td>\n<td>Dos niveles con espacio grueso Nicolaides<\/td>\n<\/tr>\n<tr>\n<td>512+ rangos, problema homog\u00e9neo<\/td>\n<td>BDDC o GamG (dos niveles)<\/td>\n<\/tr>\n<tr>\n<td>Cualquier recuento de rangos, problema heterog\u00e9neo<\/td>\n<td>Geneo + Ras (dos niveles con espacio grueso autom\u00e1tico)<\/td>\n<\/tr>\n<tr>\n<td>Producci\u00f3n HPC, 1000+ rangos<\/td>\n<td>Tres niveles (por ejemplo, Frosch)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Regla general<\/strong>: Comience con dos niveles (BDDC o gamg). Solo use un nivel cuando su recuento de subdominios es peque\u00f1o y necesita un prototipo r\u00e1pido.<\/p>\n<h3>ASM contra RAS<\/h3>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>\u00e1mbar<\/th>\n<th>af<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tratamiento de superposici\u00f3n<\/td>\n<td>Adici\u00f3n completa (superposici\u00f3n de recuentos dobles)<\/td>\n<td>Pesos de partici\u00f3n de unidad<\/td>\n<\/tr>\n<tr>\n<td>Velocidad de convergencia<\/td>\n<td>M\u00e1s lento<\/td>\n<td>M\u00e1s r\u00e1pido<\/td>\n<\/tr>\n<tr>\n<td>complejidad de la implementaci\u00f3n<\/td>\n<td>m\u00e1s f\u00e1cil<\/td>\n<td>Un poco m\u00e1s complejo<\/td>\n<\/tr>\n<tr>\n<td>Recomendaci\u00f3n<\/td>\n<td>Solo prototipo<\/td>\n<td>Solucionador de producci\u00f3n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilice RAS<\/strong> siempre que sea posible. La correcci\u00f3n de partici\u00f3n de unidad es un cambio de una l\u00ednea en la mayor\u00eda de las implementaciones, y la mejora de la convergencia es inmediata.<\/p>\n<h3>PetSc vs Fenics<\/h3>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>PETSC\/PETSC4PY<\/th>\n<th>Fenics\/Dolfinx<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Flexibilidad del preacondicionador<\/td>\n<td>Completo \u2014 Intercambio a trav\u00e9s de <code>-pc_type<\/code><\/td>\n<td>LIMITADO: el valor predeterminado es el juego<\/td>\n<\/tr>\n<tr>\n<td>Accesibilidad de Python<\/td>\n<td>Moderado (requiere familiaridad de PETSC)<\/td>\n<td>Alto (forma variacional declarativa)<\/td>\n<\/tr>\n<tr>\n<td>Transparencia MPI\/DDM<\/td>\n<td>Bajo \u2014 Infraestructura de C++ bajo Python<\/td>\n<td>Bajo \u2014 Abstracci\u00f3n oculta detalles de DD<\/td>\n<\/tr>\n<tr>\n<td>Experimentaci\u00f3n DD personalizada<\/td>\n<td>Excelente<\/td>\n<td>Limitado<\/td>\n<\/tr>\n<tr>\n<td>curva de aprendizaje<\/td>\n<td>empinado<\/td>\n<td>Amable<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilice PETSC<\/strong> Si necesita experimentar con preacondicionadores, personaliza las particiones DD o cambia los solucionadores sin reescribir el c\u00f3digo. <strong>Utilice Fenics<\/strong> si desea una creaci\u00f3n r\u00e1pida de prototipos y no necesita la personalizaci\u00f3n del preacondicionador.<\/p>\n<hr>\n<h2 id=\"summary\">Resumen + Pr\u00f3ximos pasos<\/h2>\n<p>La descomposici\u00f3n del dominio transforma los solucionadores de PDE en serie en paralelos dividiendo el dominio en subdominios superpuestos y resolviendo localmente. La progresi\u00f3n del m\u00e9todo alternante de Schwarz en 1870 a los preacondicionadores modernos de dos niveles (BDDC, Geneo) refleja una idea simple: <strong>La correcci\u00f3n del espacio grueso es esencial para la escala<\/strong>.<\/p>\n<h3>resumen r\u00e1pido<\/h3>\n<ol>\n<li><strong>Schwarz de un nivel<\/strong> (ASM\/RAS) funciona para el paralelismo peque\u00f1o pero se degrada linealmente con el recuento de subdominios.<\/li>\n<li><strong>RAS supera a ASM<\/strong> a trav\u00e9s de la ponderaci\u00f3n de superposici\u00f3n de partici\u00f3n de unidad, siempre prefiero RAS.<\/li>\n<li><strong>M\u00e9todos de dos niveles<\/strong> con espacios gruesos (BDDC, Geneo) son el est\u00e1ndar moderno.<\/li>\n<li><strong>Geneo<\/strong> detecta autom\u00e1ticamente los modos problem\u00e1ticos de baja energ\u00eda para medios heterog\u00e9neos.<\/li>\n<li><strong>Implementaciones de Python<\/strong> en PETSC (<code>pc_type bddc<\/code>) y Fenics (auto-gamg) hacen que DD sea accesible.<\/li>\n<\/ol>\n<h3>Pr\u00f3ximos pasos<\/h3>\n<ol>\n<li><strong>Comienza con PETSC\/PETSC4PY<\/strong> \u2014 prueba <code>pc_type bddc<\/code> en un simple problema de Poisson. El tutorial de <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">ngspetSc<\/a> proporciona una plantilla de trabajo.<\/li>\n<li><strong>Lea la referencia can\u00f3nica<\/strong>: Dolean, Jolivet, NATAF 2015 <em>\u00abUna introducci\u00f3n a los m\u00e9todos de descomposici\u00f3n del dominio\u00bb<\/em> [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>] es la mejor descripci\u00f3n conceptual.<\/li>\n<li><strong>Para problemas heterog\u00e9neos<\/strong>, explore espacios geneal\u00f3gicos gruesos en HPDDM o FreeFEM FFDDM.<\/li>\n<li><strong>Aprenda el paralelismo de Fenics<\/strong> si su flujo de trabajo requiere un prototipo r\u00e1pido en mallas irregulares. El <a href=\"https:\/\/fenicsproject.org\/docs\/dolfinx\/latest\/\" target=\"_blank\" rel=\"nofollow noopener\">Documentaci\u00f3n de Fenicsx<\/a> cubre la partici\u00f3n de malla distribuida.<\/li>\n<\/ol>\n<h3>Gu\u00edas relacionadas<\/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\">Gesti\u00f3n de problemas de PDE a gran escala: estrategias, solucionadores y estudios de casos de HPC<\/a> \u2014 cuando las simulaciones se vuelven demasiado costosas para un solo nodo<\/li>\n<li><a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">HPC Python Flujos de trabajo: de una computadora port\u00e1til a una supercomputadora<\/a> \u2014 Configuraci\u00f3n de entornos MPI reproducibles<\/li>\n<li><a href=\"https:\/\/matforge.org\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\" target=\"_blank\" rel=\"nofollow noopener\">elegir el derecho Solucionador de PDE de Python: Fipy vs PY-PDE vs Fenics<\/a>: cu\u00e1ndo usar Fenics y cu\u00e1ndo usar alternativas<\/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: Elegir el solucionador correcto<\/a> \u2014 Comparaci\u00f3n de m\u00e9todos a escala<\/li>\n<li><a href=\"https:\/\/matforge.org\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" target=\"_blank\" rel=\"nofollow noopener\">Computaci\u00f3n paralela distribuida Patrones: Python MPI y Dask<\/a> \u2014 Fundamentos de MPI que sustentan la descomposici\u00f3n del dominio<\/li>\n<\/ul>\n<hr>\n<h2>Pensamientos finales<\/h2>\n<p>La descomposici\u00f3n del dominio es el puente entre la comprensi\u00f3n de la teor\u00eda PDE y la ejecuci\u00f3n de simulaciones de producci\u00f3n. Las matem\u00e1ticas son elegantes: superponen los subdominios, resuelven localmente, corrigen el global, pero la diferencia pr\u00e1ctica entre ASM y RAS, o de un nivel y dos niveles, es lo que separa a un prototipo de trabajo de un solucionador de producci\u00f3n.<\/p>\n<p>Si est\u00e1 evaluando los preacondicionadores o configurando una simulaci\u00f3n paralela que no se escala, <a href=\"https:\/\/matforge.org\/category\/issue-tracking-tickets-technical-requests\/\" target=\"_blank\" rel=\"nofollow noopener\">equipo de consultas de matforge<\/a> puede ayudarlo a elegir el enfoque correcto para su clase de problemas. Ya sea que trabaje con materiales homog\u00e9neos o medios heterog\u00e9neos de alto contraste, la estrategia DD correcta importa.<\/p>\n","protected":false,"raw":"<h2>TL; DR \u2014 Lo que necesita saber<\/h2>\n<ul>\n<li><strong>Descomposici\u00f3n de dominio<\/strong> divide una cuadr\u00edcula de simulaci\u00f3n en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente.<\/li>\n<li><strong>Aditivo Schwarz (ASM)<\/strong> es la forma m\u00e1s simple: se resuelve localmente y agrega correcciones. Funciona muy bien para peque\u00f1os recuentos de subdominios, pero falla a escala.<\/li>\n<li><strong>Aditivo restringido Schwarz (RAS)<\/strong> Arregla la redundancia de ASM a trav\u00e9s de pesos de partici\u00f3n de unidad. Siempre prefiera RAS a ASM para los solucionadores de producci\u00f3n.<\/li>\n<li><strong>M\u00e9todos de dos niveles<\/strong> con espacios gruesos (Geneo, Nicolaides) son ahora el est\u00e1ndar en la producci\u00f3n de HPC. Permiten escalar a 32.768 rangos MPI (Frosch).<\/li>\n<li><strong>Implementaciones de Python<\/strong> en PETSC\/PETSC4PY y Fenics\/Dolfinx hacen que estos m\u00e9todos sean accesibles sin C++: comience con <code>pc_type bddc<\/code> en PETSC, o use <code>DMPython<\/code> en Fenics.<\/li>\n<\/ul>\n<hr>\n<h2>\u00bfQu\u00e9 es la descomposici\u00f3n del dominio y por qu\u00e9 es importante?<\/h2>\n<p>La descomposici\u00f3n del dominio es la estrategia m\u00e1s efectiva para convertir un solucionador de PDE en serie en uno paralelo. En lugar de preguntar c\u00f3mo paralelizar todo su algoritmo, divide el dominio computacional en piezas m\u00e1s peque\u00f1as y superpuestas, resuelve cada pieza localmente e intercambia datos de l\u00edmites. Este enfoque se asigna directamente al modelo de memoria distribuida de MPI: cada rango posee un subdominio y solo se comunica con sus vecinos.<\/p>\n<p>El m\u00e9todo data de <strong>1870<\/strong>, cuando Hermann A. Schwarz formaliz\u00f3 el enfoque de direcci\u00f3n alterna para la conducci\u00f3n de calor. Los matem\u00e1ticos anteriores, incluido Heinrich Schr\u00f6der, exploraron ideas similares, pero la formulaci\u00f3n de Schwarz es la referencia can\u00f3nica. Hoy respalda a los solucionadores de producci\u00f3n como PetSc, Fenics y Freefem.<\/p>\n<p><strong>\u00bfLo sab\u00edas?<\/strong> El concepto de dividir un dominio en subdominios con superposici\u00f3n es anterior a las computadoras digitales en casi un siglo. La base matem\u00e1tica, el m\u00e9todo de alternancia de Schwarz, se desarroll\u00f3 para resolver las PDE el\u00edpticas a mano [<a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_Schwarz_method\" target=\"_blank\" rel=\"nofollow noopener\">4<\/a>], utilizando la intuici\u00f3n de que los valores de l\u00edmite de las regiones vecinas pueden servir como condiciones de Dirichlet. La descomposici\u00f3n del dominio moderno automatiza esa intuici\u00f3n a escala.<\/p>\n<p>Si est\u00e1 manteniendo o desarrollando c\u00f3digo cient\u00edfico Python, la descomposici\u00f3n de dominio es el puente entre un prototipo que se ejecuta en una computadora port\u00e1til y un solucionador que se ejecuta en una supercomputadora. Las siguientes secciones explican la teor\u00eda, la diferencia pr\u00e1ctica entre las variantes y los ejemplos de trabajo de Python.<\/p>\n<blockquote><p>Desde el <a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">HPC Python Gu\u00eda de flujos de trabajo<\/a> en MatForge: La descomposici\u00f3n del dominio es el patr\u00f3n de distribuci\u00f3n de carga de trabajo can\u00f3nico cuando se debe resolver una PDE en miles de nodos. El art\u00edculo cubre los fundamentos de paralelizaci\u00f3n de MPI4PY que sustentan cada implementaci\u00f3n de DD.<\/p><\/blockquote>\n<hr>\n<h2 id=\"the-schwarz-method\">El m\u00e9todo Schwarz: desde 1870 hasta algoritmos modernos<\/h2>\n<p>El m\u00e9todo Schwarz lleva el nombre de Hermann A. Schwarz, quien formaliz\u00f3 el esquema de iteraci\u00f3n de direcci\u00f3n alterna en 1870. La idea central es simple:<\/p>\n<ol>\n<li>Dividir el dominio \u03c9 en subdominios superpuestos \u03c9\u1d62.<\/li>\n<li>Resuelva el PDE en cada subdominio de forma independiente, utilizando las condiciones de contorno de Dirichlet en las interfaces de superposici\u00f3n.<\/li>\n<li>Actualice iterativamente los valores de l\u00edmite hasta la convergencia.<\/li>\n<\/ol>\n<p>Este es el m\u00e9todo <strong>alternativa<\/strong> Schwarz: recorre los subdominios uno a la vez, actualizando los valores de los l\u00edmites secuencialmente. Es conceptualmente limpio pero pr\u00e1cticamente limitado porque el barrido secuencial impide el paralelismo.<\/p>\n<p>La versi\u00f3n moderna reemplaza los barridos secuenciales con <strong>simult\u00e1neos<\/strong> resuelve el subdominio. En lugar de esperar a que termine un subdominio antes de comenzar el siguiente, todos los subdominios se resuelven en paralelo. Aqu\u00ed es donde la informaci\u00f3n de 1870 de Schwarz se convierte en un preacondicionador paralelo: resuelve el problema grueso en cada subdominio simult\u00e1neamente y luego agrega las correcciones.<\/p>\n<p>La transici\u00f3n de Schwarz alterno a aditivo es lo que hace que la descomposici\u00f3n del dominio sea pr\u00e1ctica para el HPC moderno. Como explican Dolean, Jolivet y Nataf en su libro de texto can\u00f3nico <em>\"Una introducci\u00f3n a los m\u00e9todos de descomposici\u00f3n de dominio\"<\/em> (2015) [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>], la formulaci\u00f3n aditiva transforma el m\u00e9todo de un solucionador iterativo en un <strong>preacondicionador<\/strong> para m\u00e9todos Krylov como CG o GMRES.<\/p>\n<hr>\n<h2 id=\"asm-vs-ras\">Aditivo Schwarz vs. Aditivo restringido Schwarz: la diferencia pr\u00e1ctica<\/h2>\n<p>Aqu\u00ed es donde la mayor\u00eda de los tutoriales se detienen, y la mayor\u00eda de los practicantes se confunden. Schwarz aditivo (ASM) y Schwarz aditivo restringido (RAS) suenan id\u00e9nticos pero divergen dr\u00e1sticamente a escala.<\/p>\n<h3>Aditivo Schwarz (ASM)<\/h3>\n<p>En ASM, resuelves en cada subdominio superpuesto y simplemente <strong>agregar<\/strong> las correcciones juntas:<\/p>\n<pre><code>x_new = \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>donde p\u1d62 es el problema grueso local y f es el lado derecho. Cada correcci\u00f3n de subdominio se agrega a la actualizaci\u00f3n global.<\/p>\n<h3>Aditivo restringido Schwarz (RAS)<\/h3>\n<p>RAS modifica el tratamiento de superposici\u00f3n. En lugar de agregar la contribuci\u00f3n de superposici\u00f3n completa de cada subdominio (que duplica la regi\u00f3n de superposici\u00f3n), RAS aplica <strong>Pesos de partici\u00f3n de unidad de unidad<\/strong> al solapamiento. Esto elimina las contribuciones redundantes y hace que el preacondicionador sea matem\u00e1ticamente correcto.<\/p>\n<p>La consecuencia pr\u00e1ctica es dram\u00e1tica: <strong>RAS converge m\u00e1s r\u00e1pido que ASM<\/strong> porque evita el sobrecuento impl\u00edcito de las contribuciones de la interfaz. La diferencia es sutil en la formulaci\u00f3n, pero los recuentos de Stark en iteraci\u00f3n.<\/p>\n<p><strong>Distinci\u00f3n de claves<\/strong>: ASM es m\u00e1s f\u00e1cil de implementar: puede colocarlo en un solucionador de Krylov con cambios m\u00ednimos. RAS requiere un manejo cuidadoso de la partici\u00f3n de superposici\u00f3n. En los solucionadores de producci\u00f3n, RAS es la opci\u00f3n predeterminada.<\/p>\n<p>De la encuesta ARXIV de 2026 <em>\"Una visita guiada de la descomposici\u00f3n de dominios moderno\"<\/em> [<a href=\"https:\/\/www.arxiv.org\/html\/2605.24982v1\" target=\"_blank\" rel=\"nofollow noopener\">2<\/a>], RAS es ahora la l\u00ednea de base para todas las implementaciones de DD modernas. El enfoque de la partici\u00f3n de la unidad es algebraicamente equivalente a resolver la regi\u00f3n de solapamiento una vez y ponderar las contribuciones para que suman la unidad. Este resultado tambi\u00e9n est\u00e1 documentado en la taxonom\u00eda del preacondicionador emergente (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\">El problema de escalabilidad: por qu\u00e9 fallan los m\u00e9todos de un nivel<\/h2>\n<p>Los m\u00e9todos Schwarz de un nivel (ASM o RAS sin espacio grueso) tienen una limitaci\u00f3n de escalabilidad fundamental: <strong>El recuento de iteraciones crece linealmente con el n\u00famero de subdominios<\/strong>.<\/p>\n<p>Si divide su dominio en 2 subdominios, es posible que necesite de 3 a 5 iteraciones de krylov por ciclo DD. Con 64 subdominios, es posible que necesite 50 a 100 iteraciones. A 1024 subdominios, la efectividad del preacondicionador se degrada hasta el punto en que el ciclo DD en s\u00ed cuesta m\u00e1s que resolver el problema original en serie.<\/p>\n<p><strong>Este no es un problema pr\u00e1ctico que puedas optimizar.<\/strong> Es una consecuencia matem\u00e1tica de las propiedades espectrales del preacondicionador de Schwarz. El n\u00famero de condici\u00f3n \u03ba(p) de un preacondicionador de un nivel satisface:<\/p>\n<pre><code>\u03ba(P) \u2264 C(1 + H\/h) \u00b7 \u03ba(A_interior)\n<\/code><\/pre>\n<p>Donde H es el di\u00e1metro del subdominio, H es el tama\u00f1o de la malla y H\/h es la relaci\u00f3n que crece con el n\u00famero de subdominios. A medida que aumenta H\/H, \u03ba(p) aumenta y los recuentos de iteraci\u00f3n aumentan en consecuencia.<\/p>\n<h3>Evidencia concreta: el punto de referencia de NGSPETSC POISSON<\/h3>\n<p>El <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">Tutorial de NGSPETSC Poisson<\/a> proporciona una comparaci\u00f3n limpia sobre el mismo problema. El punto de referencia utiliza exactamente la misma ecuaci\u00f3n de Poisson y compara los preacondicionadores de ILU, GAMG y BDDC.<\/p>\n<table>\n<thead>\n<tr>\n<th>preacondicionador<\/th>\n<th>iteraciones<\/th>\n<th>notas<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ilusi\u00f3n<\/td>\n<td>166<\/td>\n<td>LU escaso: sin beneficio paralelo<\/td>\n<\/tr>\n<tr>\n<td>combatir<\/td>\n<td>35<\/td>\n<td>AMG geom\u00e9trico: buena escalada en paralelo<\/td>\n<\/tr>\n<tr>\n<td>BCD<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>Preacondicionador diagonal de bloque en la hebilla \u2014 casi \u00f3ptimo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>BDDC (preacondicionador diagonal en bloque en la hebilla) es un m\u00e9todo de dos niveles que utiliza una correcci\u00f3n de espacio grueso. El recuento de iteraciones de 5 a 9 es esencialmente independiente del recuento de subdominios; esta es la diferencia pr\u00e1ctica entre DD de un nivel y dos niveles.<\/p>\n<p><strong>The Takeaway<\/strong>: Schwarz de un nivel funciona bien para el peque\u00f1o paralelismo (\u226432 rangos). Por encima de eso, necesitas una correcci\u00f3n de espacio grueso.<\/p>\n<hr>\n<h2 id=\"coarse-spaces\">Espacios gruesos: la soluci\u00f3n moderna<\/h2>\n<p>La soluci\u00f3n a la falla de un nivel es el <strong>espacio grueso<\/strong>, un problema de correcci\u00f3n global que captura los modos de baja energ\u00eda (componentes que var\u00edan lentamente) que los m\u00e9todos de un solo nivel fallan.<\/p>\n<p>El preacondicionador Schwarz de dos niveles toma la forma:<\/p>\n<pre><code>P_two-level = P_coarse + \u03a3_P\u207b\u00b9_i (f - A x_old)\n<\/code><\/pre>\n<p>La correcci\u00f3n gruesa maneja la convergencia global; Las correcciones locales de Schwarz manejan el suavizado de cuadr\u00edcula fina. Esta descomposici\u00f3n es la base de la descomposici\u00f3n del dominio moderno.<\/p>\n<h3>Espacio grueso de Nicolaides<\/h3>\n<p>El espacio grueso de Nicolaides (1991) utiliza funciones constantes en cada subdominio como funciones de base gruesa. Es simple de implementar y suficiente para problemas homog\u00e9neos. Sin embargo, se descompone para los problemas con <strong>heterogeneidad material<\/strong>, cuando su dominio tiene regiones con propiedades f\u00edsicas dr\u00e1sticamente diferentes.<\/p>\n<h3>Espacios G\u00e9neo Gruesos<\/h3>\n<p><strong>Geneo<\/strong> (problemas eigen generalizados en la superposici\u00f3n) es el avance moderno. En lugar de seleccionar funciones de base gruesa, Geneo <strong>detecta autom\u00e1ticamente<\/strong> modos de baja energ\u00eda problem\u00e1ticos resolviendo un problema de valor propio generalizado en cada subdominio:<\/p>\n<pre><code>K\u1d62 v = \u03bb B\u1d62 v\n<\/code><\/pre>\n<p>donde k\u1d62 es la matriz de rigidez local y b\u1d62 es el operador grueso local. Los modos propios con valores propios peque\u00f1os (por debajo de un umbral definido por el usuario) se marcan como problem\u00e1ticos y se agregan al espacio grueso.<\/p>\n<p>Esta detecci\u00f3n autom\u00e1tica es fundamental para:<\/p>\n<ul>\n<li><strong>Permeabilidad de alto contraste<\/strong> (por ejemplo, flujo subterr\u00e1neo con capas de roca que abarcan \u00f3rdenes de magnitud)<\/li>\n<li><strong>Materiales casi incompresibles<\/strong> (por ejemplo, tejidos de caucho o biol\u00f3gicos)<\/li>\n<li><strong>Acoplamiento multif\u00edsico<\/strong> (por ejemplo, problemas termomec\u00e1nicos con diferentes conductividades t\u00e9rmicas)<\/li>\n<\/ul>\n<p>Geneo ahora es est\u00e1ndar en HPDDM, FreeFEM (a trav\u00e9s de <code>ffddm<\/code>) y Frosch. Como demuestra la investigaci\u00f3n de 2026 de K\u00f6hler y Rheinbach, los espacios groseros GEneo mantienen recuentos de iteraciones casi constantes incluso cuando las propiedades del material var\u00edan por factores de 10\u00b3 o 10\u2076 [<a href=\"https:\/\/www.emergentmind.com\/topics\/additive-schwarz-type-preconditioners\" target=\"_blank\" rel=\"nofollow noopener\">3<\/a>].<\/p>\n<h3>M\u00e9todos de dos niveles frente a tres niveles<\/h3>\n<p>La progresi\u00f3n va:<\/p>\n<ul>\n<li><strong>Un nivel<\/strong>: ASM\/RAS \u2014 Solo suavizado de rejilla fina<\/li>\n<li><strong>Dos niveles<\/strong>: Espacio grueso + Schwarz \u2014 Global + Convergencia local<\/li>\n<li><strong>Tres niveles<\/strong>: espacios gruesos de varios niveles \u2014 HPC de producci\u00f3n (por ejemplo, escalas de Frosch a 32.768 rangos MPI)<\/li>\n<\/ul>\n<p>Los m\u00e9todos de tres niveles agregan un segundo espacio grueso (un \"grosor global\" en la parte superior de los espacios gruesos del subdominio) para el paralelismo de escala extrema. Frosch demuestra un escalamiento d\u00e9bil a 32,768 rangos con recuentos de iteraciones casi constantes, una se\u00f1al de credibilidad de que los m\u00e9todos de dos niveles no siempre pueden alcanzar [<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\">Ejemplo de trabajo: Solucionador de Poisson PETSC\/PETSC4PY con preacondicionador BDDC<\/h2>\n<p>Aqu\u00ed hay un ejemplo de trabajo completo de descomposici\u00f3n de dominio en Python usando PETSC. Este es el enfoque que une la infraestructura C++ de PETSC con la accesibilidad de Python.<\/p>\n<h3>Disposici\u00f3n<\/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>Creaci\u00f3n de la matriz del sistema<\/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>Conmutaci\u00f3n de preacondicionadores<\/h3>\n<p>La magia es esta l\u00ednea:<\/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>Uso de HPDDM para preacondicionadores personalizados<\/h3>\n<p>El puente <code>PCHPDDM<\/code> le permite utilizar los preacondicionadores avanzados de HPDDM sin escribir C++:<\/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>Este es el punto de entrada m\u00e1s pr\u00e1ctico para los investigadores de Python: cambia <code>-pc_type<\/code> de la l\u00ednea de comandos sin tocar el c\u00f3digo de Solver. Como el Dolean et al. Encuesta de 2026 demuestra que esta flexibilidad de l\u00ednea de comandos es la raz\u00f3n por la cual PETSC domina la producci\u00f3n de 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\">Ejemplo de trabajo: descomposici\u00f3n de dominios paralelos de Fenics\/Dolfinx<\/h2>\n<p>Fenics\/Dolfinx maneja la descomposici\u00f3n del dominio a trav\u00e9s de su paralelismo MPI incorporado. El marco particiona autom\u00e1ticamente la malla y administra la comunicaci\u00f3n de nodos fantasma.<\/p>\n<h3>Partici\u00f3n de malla paralela<\/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>Configuraci\u00f3n de la forma variacional<\/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>Resolviendo con el preacondicionador de Schwarz<\/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>Acceso a las partes internas de 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\">Comunidad de discursos de Fenics<\/a> ha documentado los puntos d\u00e9biles sobre el acceso a las partes internas de partici\u00f3n MPI de Dolffinx. Los usuarios adicionales <a href=\"https:\/\/fenicsproject.discourse.group\/t\/question-difficulty-with-parallel-implementation\/11338\" target=\"_blank\" rel=\"nofollow noopener\">reportar dificultad con patrones de implementaci\u00f3n paralelos<\/a>: los nodos fantasma, la partici\u00f3n vectorial y la comunicaci\u00f3n MPI no siempre est\u00e1n bien documentados. A diferencia de PetSc, Fenics abstrae los detalles de DD detr\u00e1s de escena: esto es conveniente para los principiantes pero limita cuando necesita experimentar con preacondicionadores personalizados.<\/p>\n<p>Los usuarios informan que la capa MPI\/DDM no est\u00e1 expuesta directamente a Python, lo que significa que no puede intercambiar tipos de preacondicionador de la misma manera que lo permite PETSC. Esta es la raz\u00f3n por la cual se prefiere PETSC para la investigaci\u00f3n de producci\u00f3n donde importa la experimentaci\u00f3n del preacondicionador.<\/p>\n<hr>\n<h2 id=\"performance-comparison\">Comparaci\u00f3n de rendimiento<\/h2>\n<table>\n<thead>\n<tr>\n<th>preacondicionador<\/th>\n<th>Tipo<\/th>\n<th>iteraciones<\/th>\n<th>eficiencia paralela<\/th>\n<th>Complejidad<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ilu(0)<\/td>\n<td>Un nivel (sin DD)<\/td>\n<td>166<\/td>\n<td>Pobre \u2014 Sin beneficio paralelo<\/td>\n<td>simple<\/td>\n<\/tr>\n<tr>\n<td>combatir<\/td>\n<td>Dos niveles (AMG)<\/td>\n<td>35<\/td>\n<td>Bueno \u2014 Escalado geom\u00e9trico<\/td>\n<td>Moderar<\/td>\n<\/tr>\n<tr>\n<td>ASM (Schwarz de un solo nivel)<\/td>\n<td>de un solo nivel<\/td>\n<td>~50-100<\/td>\n<td>Degrada linealmente con subdominios<\/td>\n<td>simple<\/td>\n<\/tr>\n<tr>\n<td>RAS (Schwarz de un nivel)<\/td>\n<td>de un solo nivel<\/td>\n<td>~30\u201380<\/td>\n<td>Mejor que ASM, todav\u00eda se degrada<\/td>\n<td>Moderar<\/td>\n<\/tr>\n<tr>\n<td>BCD<\/td>\n<td>de dos niveles<\/td>\n<td><strong>5\u20139<\/strong><\/td>\n<td>casi \u00f3ptimo: escalado constante<\/td>\n<td>Moderado-Complejo<\/td>\n<\/tr>\n<tr>\n<td>Geno + Ras<\/td>\n<td>Dos niveles (heterog\u00e9neos)<\/td>\n<td><strong>5\u201315<\/strong><\/td>\n<td>Escala a 32,768 rangos (Frosch)<\/td>\n<td>Complejo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>BDDC<\/strong> (5\u20139 iteraciones) supera constantemente a otros m\u00e9todos en los problemas de referencia. Su construcci\u00f3n de dos niveles maneja tanto la correcci\u00f3n de red fina como el espacio global grueso, lo que lo convierte en el incumplimiento pr\u00e1ctico para Poisson y problemas relacionados.<\/p>\n<p><strong>Geneo + Ras<\/strong> A\u00f1ade detecci\u00f3n autom\u00e1tica de espacio grueso para medios heterog\u00e9neos. Cuando su problema tiene coeficientes de alto contraste (por ejemplo, la permeabilidad que var\u00eda en 10\u2076), Geneo es la \u00fanica opci\u00f3n confiable.<\/p>\n<hr>\n<h2 id=\"when-to-choose\">Cu\u00e1ndo elegir qu\u00e9: Marco de decisi\u00f3n<\/h2>\n<h3>Un nivel frente a dos niveles<\/h3>\n<table>\n<thead>\n<tr>\n<th>Situaci\u00f3n<\/th>\n<th>Enfoque recomendado<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u2264 32 rangos de MPI, problema homog\u00e9neo<\/td>\n<td>ASM o RAS (un nivel est\u00e1 bien)<\/td>\n<\/tr>\n<tr>\n<td>32-512 rangos, problema homog\u00e9neo<\/td>\n<td>Dos niveles con espacio grueso Nicolaides<\/td>\n<\/tr>\n<tr>\n<td>512+ rangos, problema homog\u00e9neo<\/td>\n<td>BDDC o GamG (dos niveles)<\/td>\n<\/tr>\n<tr>\n<td>Cualquier recuento de rangos, problema heterog\u00e9neo<\/td>\n<td>Geneo + Ras (dos niveles con espacio grueso autom\u00e1tico)<\/td>\n<\/tr>\n<tr>\n<td>Producci\u00f3n HPC, 1000+ rangos<\/td>\n<td>Tres niveles (por ejemplo, Frosch)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Regla general<\/strong>: Comience con dos niveles (BDDC o gamg). Solo use un nivel cuando su recuento de subdominios es peque\u00f1o y necesita un prototipo r\u00e1pido.<\/p>\n<h3>ASM contra RAS<\/h3>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>\u00e1mbar<\/th>\n<th>af<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tratamiento de superposici\u00f3n<\/td>\n<td>Adici\u00f3n completa (superposici\u00f3n de recuentos dobles)<\/td>\n<td>Pesos de partici\u00f3n de unidad<\/td>\n<\/tr>\n<tr>\n<td>Velocidad de convergencia<\/td>\n<td>M\u00e1s lento<\/td>\n<td>M\u00e1s r\u00e1pido<\/td>\n<\/tr>\n<tr>\n<td>complejidad de la implementaci\u00f3n<\/td>\n<td>m\u00e1s f\u00e1cil<\/td>\n<td>Un poco m\u00e1s complejo<\/td>\n<\/tr>\n<tr>\n<td>Recomendaci\u00f3n<\/td>\n<td>Solo prototipo<\/td>\n<td>Solucionador de producci\u00f3n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilice RAS<\/strong> siempre que sea posible. La correcci\u00f3n de partici\u00f3n de unidad es un cambio de una l\u00ednea en la mayor\u00eda de las implementaciones, y la mejora de la convergencia es inmediata.<\/p>\n<h3>PetSc vs Fenics<\/h3>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>PETSC\/PETSC4PY<\/th>\n<th>Fenics\/Dolfinx<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Flexibilidad del preacondicionador<\/td>\n<td>Completo \u2014 Intercambio a trav\u00e9s de <code>-pc_type<\/code><\/td>\n<td>LIMITADO: el valor predeterminado es el juego<\/td>\n<\/tr>\n<tr>\n<td>Accesibilidad de Python<\/td>\n<td>Moderado (requiere familiaridad de PETSC)<\/td>\n<td>Alto (forma variacional declarativa)<\/td>\n<\/tr>\n<tr>\n<td>Transparencia MPI\/DDM<\/td>\n<td>Bajo \u2014 Infraestructura de C++ bajo Python<\/td>\n<td>Bajo \u2014 Abstracci\u00f3n oculta detalles de DD<\/td>\n<\/tr>\n<tr>\n<td>Experimentaci\u00f3n DD personalizada<\/td>\n<td>Excelente<\/td>\n<td>Limitado<\/td>\n<\/tr>\n<tr>\n<td>curva de aprendizaje<\/td>\n<td>empinado<\/td>\n<td>Amable<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Utilice PETSC<\/strong> Si necesita experimentar con preacondicionadores, personaliza las particiones DD o cambia los solucionadores sin reescribir el c\u00f3digo. <strong>Utilice Fenics<\/strong> si desea una creaci\u00f3n r\u00e1pida de prototipos y no necesita la personalizaci\u00f3n del preacondicionador.<\/p>\n<hr>\n<h2 id=\"summary\">Resumen + Pr\u00f3ximos pasos<\/h2>\n<p>La descomposici\u00f3n del dominio transforma los solucionadores de PDE en serie en paralelos dividiendo el dominio en subdominios superpuestos y resolviendo localmente. La progresi\u00f3n del m\u00e9todo alternante de Schwarz en 1870 a los preacondicionadores modernos de dos niveles (BDDC, Geneo) refleja una idea simple: <strong>La correcci\u00f3n del espacio grueso es esencial para la escala<\/strong>.<\/p>\n<h3>resumen r\u00e1pido<\/h3>\n<ol>\n<li><strong>Schwarz de un nivel<\/strong> (ASM\/RAS) funciona para el paralelismo peque\u00f1o pero se degrada linealmente con el recuento de subdominios.<\/li>\n<li><strong>RAS supera a ASM<\/strong> a trav\u00e9s de la ponderaci\u00f3n de superposici\u00f3n de partici\u00f3n de unidad, siempre prefiero RAS.<\/li>\n<li><strong>M\u00e9todos de dos niveles<\/strong> con espacios gruesos (BDDC, Geneo) son el est\u00e1ndar moderno.<\/li>\n<li><strong>Geneo<\/strong> detecta autom\u00e1ticamente los modos problem\u00e1ticos de baja energ\u00eda para medios heterog\u00e9neos.<\/li>\n<li><strong>Implementaciones de Python<\/strong> en PETSC (<code>pc_type bddc<\/code>) y Fenics (auto-gamg) hacen que DD sea accesible.<\/li>\n<\/ol>\n<h3>Pr\u00f3ximos pasos<\/h3>\n<ol>\n<li><strong>Comienza con PETSC\/PETSC4PY<\/strong> \u2014 prueba <code>pc_type bddc<\/code> en un simple problema de Poisson. El tutorial de <a href=\"https:\/\/ngspetsc.readthedocs.io\/en\/latest\/PETScKSP\/poisson.py.html\" target=\"_blank\" rel=\"nofollow noopener\">ngspetSc<\/a> proporciona una plantilla de trabajo.<\/li>\n<li><strong>Lea la referencia can\u00f3nica<\/strong>: Dolean, Jolivet, NATAF 2015 <em>\"Una introducci\u00f3n a los m\u00e9todos de descomposici\u00f3n del dominio\"<\/em> [<a href=\"https:\/\/hal.science\/cel-01100932\/document\" target=\"_blank\" rel=\"nofollow noopener\">1<\/a>] es la mejor descripci\u00f3n conceptual.<\/li>\n<li><strong>Para problemas heterog\u00e9neos<\/strong>, explore espacios geneal\u00f3gicos gruesos en HPDDM o FreeFEM FFDDM.<\/li>\n<li><strong>Aprenda el paralelismo de Fenics<\/strong> si su flujo de trabajo requiere un prototipo r\u00e1pido en mallas irregulares. El <a href=\"https:\/\/fenicsproject.org\/docs\/dolfinx\/latest\/\" target=\"_blank\" rel=\"nofollow noopener\">Documentaci\u00f3n de Fenicsx<\/a> cubre la partici\u00f3n de malla distribuida.<\/li>\n<\/ol>\n<h3>Gu\u00edas relacionadas<\/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\">Gesti\u00f3n de problemas de PDE a gran escala: estrategias, solucionadores y estudios de casos de HPC<\/a> \u2014 cuando las simulaciones se vuelven demasiado costosas para un solo nodo<\/li>\n<li><a href=\"https:\/\/matforge.org\/hpc-python-workflows-from-laptop-to-supercomputer\/\" target=\"_blank\" rel=\"nofollow noopener\">HPC Python Flujos de trabajo: de una computadora port\u00e1til a una supercomputadora<\/a> \u2014 Configuraci\u00f3n de entornos MPI reproducibles<\/li>\n<li><a href=\"https:\/\/matforge.org\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\" target=\"_blank\" rel=\"nofollow noopener\">elegir el derecho Solucionador de PDE de Python: Fipy vs PY-PDE vs Fenics<\/a>: cu\u00e1ndo usar Fenics y cu\u00e1ndo usar alternativas<\/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: Elegir el solucionador correcto<\/a> \u2014 Comparaci\u00f3n de m\u00e9todos a escala<\/li>\n<li><a href=\"https:\/\/matforge.org\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" target=\"_blank\" rel=\"nofollow noopener\">Computaci\u00f3n paralela distribuida Patrones: Python MPI y Dask<\/a> \u2014 Fundamentos de MPI que sustentan la descomposici\u00f3n del dominio<\/li>\n<\/ul>\n<hr>\n<h2>Pensamientos finales<\/h2>\n<p>La descomposici\u00f3n del dominio es el puente entre la comprensi\u00f3n de la teor\u00eda PDE y la ejecuci\u00f3n de simulaciones de producci\u00f3n. Las matem\u00e1ticas son elegantes: superponen los subdominios, resuelven localmente, corrigen el global, pero la diferencia pr\u00e1ctica entre ASM y RAS, o de un nivel y dos niveles, es lo que separa a un prototipo de trabajo de un solucionador de producci\u00f3n.<\/p>\n<p>Si est\u00e1 evaluando los preacondicionadores o configurando una simulaci\u00f3n paralela que no se escala, <a href=\"https:\/\/matforge.org\/category\/issue-tracking-tickets-technical-requests\/\" target=\"_blank\" rel=\"nofollow noopener\">equipo de consultas de matforge<\/a> puede ayudarlo a elegir el enfoque correcto para su clase de problemas. Ya sea que trabaje con materiales homog\u00e9neos o medios heterog\u00e9neos de alto contraste, la estrategia DD correcta importa.<\/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 Lo que necesita saber Descomposici\u00f3n de dominio divide una cuadr\u00edcula de simulaci\u00f3n en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente. Aditivo Schwarz (ASM) es la forma m\u00e1s simple: se resuelve localmente y agrega correcciones. Funciona muy bien para peque\u00f1os recuentos de subdominios, pero falla [&hellip;]<\/p>\n","protected":false,"raw":""},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=533","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[36,42,37,35,41,38,39,40],"class_list":["post-779","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","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n 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\/es\/domain-decomposition-parallel-pde-solvers\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  11 minutesTL; DR \u2014 Lo que necesita saber Descomposici\u00f3n de dominio divide una cuadr\u00edcula de simulaci\u00f3n en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente. Aditivo Schwarz (ASM) es la forma m\u00e1s simple: se resuelve localmente y agrega correcciones. Funciona muy bien para peque\u00f1os recuentos de subdominios, pero falla [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T12:21:42+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python\",\"datePublished\":\"2026-07-30T12:21:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/\"},\"wordCount\":3122,\"commentCount\":0,\"keywords\":[\"A-estabilidad\",\"Inferencia bayesiana\",\"Euler expl\u00edcito\",\"L-stability\",\"model calibration\",\"PROthero-Robinson problem\",\"ROCK method\",\"SDIRK\"],\"articleSection\":[\"Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/\",\"name\":\"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-30T12:21:42+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/domain-decomposition-parallel-pde-solvers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n 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\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n 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\/es\/domain-decomposition-parallel-pde-solvers\/","og_locale":"es_ES","og_type":"article","og_title":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python - matforge.org","og_description":"Reading Time:  11 minutesTL; DR \u2014 Lo que necesita saber Descomposici\u00f3n de dominio divide una cuadr\u00edcula de simulaci\u00f3n en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente. Aditivo Schwarz (ASM) es la forma m\u00e1s simple: se resuelve localmente y agrega correcciones. Funciona muy bien para peque\u00f1os recuentos de subdominios, pero falla [&hellip;]","og_url":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/","og_site_name":"matforge.org","article_published_time":"2026-07-30T12:21:42+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Tomas Delgado","Tiempo de lectura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python","datePublished":"2026-07-30T12:21:42+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/"},"wordCount":3122,"commentCount":0,"keywords":["A-estabilidad","Inferencia bayesiana","Euler expl\u00edcito","L-stability","model calibration","PROthero-Robinson problem","ROCK method","SDIRK"],"articleSection":["Fipy: Documentaci\u00f3n, ejemplos &amp; Desarrollo"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/","url":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/","name":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n de Python - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-30T12:21:42+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"breadcrumb":{"@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/domain-decomposition-parallel-pde-solvers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Descomposici\u00f3n de dominio para solucionadores de PDE paralelos: Schwarz aditivo, m\u00e9todos superpuestos e implementaci\u00f3n 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":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"es","@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\/779","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=779"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/779\/revisions"}],"predecessor-version":[{"id":945,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/779\/revisions\/945"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}