TL; DR — Lo que necesita saber
- Descomposición de dominio divide una cuadrícula de simulación en subdominios superpuestos para que cada rango MPI pueda resolver su pieza local de forma independiente.
- Aditivo Schwarz (ASM) es la forma más simple: se resuelve localmente y agrega correcciones. Funciona muy bien para pequeños recuentos de subdominios, pero falla a escala.
- Aditivo restringido Schwarz (RAS) Arregla la redundancia de ASM a través de pesos de partición de unidad. Siempre prefiera RAS a ASM para los solucionadores de producción.
- Métodos de dos niveles con espacios gruesos (Geneo, Nicolaides) son ahora el estándar en la producción de HPC. Permiten escalar a 32.768 rangos MPI (Frosch).
- Implementaciones de Python en PETSC/PETSC4PY y Fenics/Dolfinx hacen que estos métodos sean accesibles sin C++: comience con
pc_type bddcen PETSC, o useDMPythonen Fenics.
¿Qué es la descomposición del dominio y por qué es importante?
La descomposición del dominio es la estrategia más efectiva para convertir un solucionador de PDE en serie en uno paralelo. En lugar de preguntar cómo paralelizar todo su algoritmo, divide el dominio computacional en piezas más pequeñas y superpuestas, resuelve cada pieza localmente e intercambia datos de límites. Este enfoque se asigna directamente al modelo de memoria distribuida de MPI: cada rango posee un subdominio y solo se comunica con sus vecinos.
El método data de 1870, cuando Hermann A. Schwarz formalizó el enfoque de dirección alterna para la conducción de calor. Los matemáticos anteriores, incluido Heinrich Schröder, exploraron ideas similares, pero la formulación de Schwarz es la referencia canónica. Hoy respalda a los solucionadores de producción como PetSc, Fenics y Freefem.
¿Lo sabías? El concepto de dividir un dominio en subdominios con superposición es anterior a las computadoras digitales en casi un siglo. La base matemática, el método de alternancia de Schwarz, se desarrolló para resolver las PDE elípticas a mano [4], utilizando la intuición de que los valores de límite de las regiones vecinas pueden servir como condiciones de Dirichlet. La descomposición del dominio moderno automatiza esa intuición a escala.
Si está manteniendo o desarrollando código científico Python, la descomposición de dominio es el puente entre un prototipo que se ejecuta en una computadora portátil y un solucionador que se ejecuta en una supercomputadora. Las siguientes secciones explican la teoría, la diferencia práctica entre las variantes y los ejemplos de trabajo de Python.
Desde el HPC Python Guía de flujos de trabajo en MatForge: La descomposición del dominio es el patrón de distribución de carga de trabajo canónico cuando se debe resolver una PDE en miles de nodos. El artículo cubre los fundamentos de paralelización de MPI4PY que sustentan cada implementación de DD.
El método Schwarz: desde 1870 hasta algoritmos modernos
El método Schwarz lleva el nombre de Hermann A. Schwarz, quien formalizó el esquema de iteración de dirección alterna en 1870. La idea central es simple:
- Dividir el dominio ω en subdominios superpuestos ωᵢ.
- Resuelva el PDE en cada subdominio de forma independiente, utilizando las condiciones de contorno de Dirichlet en las interfaces de superposición.
- Actualice iterativamente los valores de límite hasta la convergencia.
Este es el método alternativa Schwarz: recorre los subdominios uno a la vez, actualizando los valores de los límites secuencialmente. Es conceptualmente limpio pero prácticamente limitado porque el barrido secuencial impide el paralelismo.
La versión moderna reemplaza los barridos secuenciales con simultáneos 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í es donde la información de 1870 de Schwarz se convierte en un preacondicionador paralelo: resuelve el problema grueso en cada subdominio simultáneamente y luego agrega las correcciones.
La transición de Schwarz alterno a aditivo es lo que hace que la descomposición del dominio sea práctica para el HPC moderno. Como explican Dolean, Jolivet y Nataf en su libro de texto canónico «Una introducción a los métodos de descomposición de dominio» (2015) [1], la formulación aditiva transforma el método de un solucionador iterativo en un preacondicionador para métodos Krylov como CG o GMRES.
Aditivo Schwarz vs. Aditivo restringido Schwarz: la diferencia práctica
Aquí es donde la mayoría de los tutoriales se detienen, y la mayoría de los practicantes se confunden. Schwarz aditivo (ASM) y Schwarz aditivo restringido (RAS) suenan idénticos pero divergen drásticamente a escala.
Aditivo Schwarz (ASM)
En ASM, resuelves en cada subdominio superpuesto y simplemente agregar las correcciones juntas:
x_new = Σ_P⁻¹_i (f - A x_old)
donde pᵢ es el problema grueso local y f es el lado derecho. Cada corrección de subdominio se agrega a la actualización global.
Aditivo restringido Schwarz (RAS)
RAS modifica el tratamiento de superposición. En lugar de agregar la contribución de superposición completa de cada subdominio (que duplica la región de superposición), RAS aplica Pesos de partición de unidad de unidad al solapamiento. Esto elimina las contribuciones redundantes y hace que el preacondicionador sea matemáticamente correcto.
La consecuencia práctica es dramática: RAS converge más rápido que ASM porque evita el sobrecuento implícito de las contribuciones de la interfaz. La diferencia es sutil en la formulación, pero los recuentos de Stark en iteración.
Distinción de claves: ASM es más fácil de implementar: puede colocarlo en un solucionador de Krylov con cambios mínimos. RAS requiere un manejo cuidadoso de la partición de superposición. En los solucionadores de producción, RAS es la opción predeterminada.
De la encuesta ARXIV de 2026 «Una visita guiada de la descomposición de dominios moderno» [2], RAS es ahora la línea de base para todas las implementaciones de DD modernas. El enfoque de la partición de la unidad es algebraicamente equivalente a resolver la región de solapamiento una vez y ponderar las contribuciones para que suman la unidad. Este resultado también está documentado en la taxonomía del preacondicionador emergente (Köhler & Rheinbach, 2026) [3].
El problema de escalabilidad: por qué fallan los métodos de un nivel
Los métodos Schwarz de un nivel (ASM o RAS sin espacio grueso) tienen una limitación de escalabilidad fundamental: El recuento de iteraciones crece linealmente con el número de subdominios.
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í cuesta más que resolver el problema original en serie.
Este no es un problema práctico que puedas optimizar. Es una consecuencia matemática de las propiedades espectrales del preacondicionador de Schwarz. El número de condición κ(p) de un preacondicionador de un nivel satisface:
κ(P) ≤ C(1 + H/h) · κ(A_interior)
Donde H es el diámetro del subdominio, H es el tamaño de la malla y H/h es la relación que crece con el número de subdominios. A medida que aumenta H/H, κ(p) aumenta y los recuentos de iteración aumentan en consecuencia.
Evidencia concreta: el punto de referencia de NGSPETSC POISSON
El Tutorial de NGSPETSC Poisson proporciona una comparación limpia sobre el mismo problema. El punto de referencia utiliza exactamente la misma ecuación de Poisson y compara los preacondicionadores de ILU, GAMG y BDDC.
| preacondicionador | iteraciones | notas |
|---|---|---|
| ilusión | 166 | LU escaso: sin beneficio paralelo |
| combatir | 35 | AMG geométrico: buena escalada en paralelo |
| BCD | 5–9 | Preacondicionador diagonal de bloque en la hebilla — casi óptimo |
BDDC (preacondicionador diagonal en bloque en la hebilla) es un método de dos niveles que utiliza una corrección de espacio grueso. El recuento de iteraciones de 5 a 9 es esencialmente independiente del recuento de subdominios; esta es la diferencia práctica entre DD de un nivel y dos niveles.
The Takeaway: Schwarz de un nivel funciona bien para el pequeño paralelismo (≤32 rangos). Por encima de eso, necesitas una corrección de espacio grueso.
Espacios gruesos: la solución moderna
La solución a la falla de un nivel es el espacio grueso, un problema de corrección global que captura los modos de baja energía (componentes que varían lentamente) que los métodos de un solo nivel fallan.
El preacondicionador Schwarz de dos niveles toma la forma:
P_two-level = P_coarse + Σ_P⁻¹_i (f - A x_old)
La corrección gruesa maneja la convergencia global; Las correcciones locales de Schwarz manejan el suavizado de cuadrícula fina. Esta descomposición es la base de la descomposición del dominio moderno.
Espacio grueso de Nicolaides
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éneos. Sin embargo, se descompone para los problemas con heterogeneidad material, cuando su dominio tiene regiones con propiedades físicas drásticamente diferentes.
Espacios Géneo Gruesos
Geneo (problemas eigen generalizados en la superposición) es el avance moderno. En lugar de seleccionar funciones de base gruesa, Geneo detecta automáticamente modos de baja energía problemáticos resolviendo un problema de valor propio generalizado en cada subdominio:
Kᵢ v = λ Bᵢ v
donde kᵢ es la matriz de rigidez local y bᵢ es el operador grueso local. Los modos propios con valores propios pequeños (por debajo de un umbral definido por el usuario) se marcan como problemáticos y se agregan al espacio grueso.
Esta detección automática es fundamental para:
- Permeabilidad de alto contraste (por ejemplo, flujo subterráneo con capas de roca que abarcan órdenes de magnitud)
- Materiales casi incompresibles (por ejemplo, tejidos de caucho o biológicos)
- Acoplamiento multifísico (por ejemplo, problemas termomecánicos con diferentes conductividades térmicas)
Geneo ahora es estándar en HPDDM, FreeFEM (a través de ffddm) y Frosch. Como demuestra la investigación de 2026 de Köhler y Rheinbach, los espacios groseros GEneo mantienen recuentos de iteraciones casi constantes incluso cuando las propiedades del material varían por factores de 10³ o 10⁶ [3].
Métodos de dos niveles frente a tres niveles
La progresión va:
- Un nivel: ASM/RAS — Solo suavizado de rejilla fina
- Dos niveles: Espacio grueso + Schwarz — Global + Convergencia local
- Tres niveles: espacios gruesos de varios niveles — HPC de producción (por ejemplo, escalas de Frosch a 32.768 rangos MPI)
Los métodos 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ébil a 32,768 rangos con recuentos de iteraciones casi constantes, una señal de credibilidad de que los métodos de dos niveles no siempre pueden alcanzar [5].
Ejemplo de trabajo: Solucionador de Poisson PETSC/PETSC4PY con preacondicionador BDDC
Aquí hay un ejemplo de trabajo completo de descomposición de dominio en Python usando PETSC. Este es el enfoque que une la infraestructura C++ de PETSC con la accesibilidad de Python.
Disposición
import numpy as np
from petsc4py import PETSc
# Create a 2D Poisson problem on a distributed grid
comm = PETSc.MPI.COMWORLD
size = comm.Get_size()
rank = comm.Get_rank()
# Problem parameters
n = 50 # cells per dimension
H = 1.0 # domain size
# Create distributed mesh (simple Cartesian partition)
# Each rank owns a slice of the grid
if rank == 0:
print(f"PETSc + BDDC on {size} MPI ranks")
print(f"Problem size: {n**2} unknowns")
Creación de la matriz del sistema
# Assemble the 5-point stencil Laplacian
A = PETSc.Matrix()
A.setSize(n**2, n**2)
# Populate the matrix (simplified — full code uses PETSc vectors)
for i in range(n):
for j in range(n):
idx = i * n + j
# Diagonal
A.setValue(idx, idx, 4.0)
# Neighbors
if i > 0:
A.setValue(idx, (i-1)*n + j, -1.0)
if i < n-1:
A.setValue(idx, (i+1)*n + j, -1.0)
if j > 0:
A.setValue(idx, i*n + (j-1), -1.0)
if j < n-1:
A.setValue(idx, i*n + (j+1), -1.0)
A.assemble()
Conmutación de preacondicionadores
La magia es esta línea:
ksp = PETSc.KSP()
ksp.setProblemType(PETSc.KSP.PRECONDITIONED)
ksp.setOperator(A)
# Method A: Additive Schwarz (one-level)
ksp.setPreconditionerType(PETSc.PC.FAS) # or PETSc.PC.PATCH for ASM-like
# Method B: BDDC (two-level with coarse space) — modern default
ksp.setPreconditionerType(PETSc.PC.BDDC)
# Method C: GAMG (geometric AMG — also effective)
ksp.setPreconditionerType(PETSc.PC.GAMG)
# Solve
ksp.setFromOptions()
ksp.solve()
Uso de HPDDM para preacondicionadores personalizados
El puente PCHPDDM le permite utilizar los preacondicionadores avanzados de HPDDM sin escribir C++:
# Swap preconditioners from the command line
# $ mpiexec -n 16 python solver.py -pc_type hpddm -hpddm_pc_type bddc
ksp.setPreconditionerType(PETSc.PC.HPDDM)
Este es el punto de entrada más práctico para los investigadores de Python: cambia -pc_type de la línea de comandos sin tocar el código de Solver. Como el Dolean et al. Encuesta de 2026 demuestra que esta flexibilidad de línea de comandos es la razón por la cual PETSC domina la producción de HPC [2].
Ejemplo de trabajo: descomposición de dominios paralelos de Fenics/Dolfinx
Fenics/Dolfinx maneja la descomposición del dominio a través de su paralelismo MPI incorporado. El marco particiona automáticamente la malla y administra la comunicación de nodos fantasma.
Partición de malla paralela
from dolfinx import mesh, function, plot
from dolfinx_fem import Assembly, Problem
from ufl import FiniteElement, TestFunction, TrialFunction, dot, dx
from mpi4py import MPI
# Create distributed mesh — DOLFINx handles partitioning automatically
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# Create a 2D mesh partitioned across MPI ranks
mesh_data = mesh.create_mesh(comm, [...]) # mesh coordinates, entities, cells
# DOLFINx automatically creates subdomains with overlap
domain = mesh.create_mesh(comm, mesh_data)
domain.partition() # Partition for MPI distribution
Configuración de la forma variacional
# Define function space (Lagrange elements, degree 2)
element = FiniteElement("Lagrange", "triangle", 2)
V = FunctionSpace(domain, element)
# Define trial and test functions
u = TrialFunction(V)
v = TestFunction(V)
# Weak form of Poisson: grad(u)·grad(v) = f·v
F = dot(grad(u), grad(v)) * dx - 1.0 * v * dx
# Boundary conditions (Dirichlet)
from dolfinx import geometry
bc = function.Constant(0.0)
V0 = V.sub(0).collapse()[0] # Subspace for Dirichlet BCs
dofs = function.Function(V0).vector
Resolviendo con el preacondicionador de Schwarz
# The solver is built on PETSc underneath
problem = Problem(F, bc)
solver = Problem.Solver(problem)
# DOLFINx automatically uses GAMG (geometric AMG) as default
# This is a two-level method — coarse space + local solves
solver.solve()
Acceso a las partes internas de MPI/DDM
La Comunidad de discursos de Fenics ha documentado los puntos débiles sobre el acceso a las partes internas de partición MPI de Dolffinx. Los usuarios adicionales reportar dificultad con patrones de implementación paralelos: los nodos fantasma, la partición vectorial y la comunicación MPI no siempre están bien documentados. A diferencia de PetSc, Fenics abstrae los detalles de DD detrás de escena: esto es conveniente para los principiantes pero limita cuando necesita experimentar con preacondicionadores personalizados.
Los usuarios informan que la capa MPI/DDM no está 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ón por la cual se prefiere PETSC para la investigación de producción donde importa la experimentación del preacondicionador.
Comparación de rendimiento
| preacondicionador | Tipo | iteraciones | eficiencia paralela | Complejidad |
|---|---|---|---|---|
| Ilu(0) | Un nivel (sin DD) | 166 | Pobre — Sin beneficio paralelo | simple |
| combatir | Dos niveles (AMG) | 35 | Bueno — Escalado geométrico | Moderar |
| ASM (Schwarz de un solo nivel) | de un solo nivel | ~50-100 | Degrada linealmente con subdominios | simple |
| RAS (Schwarz de un nivel) | de un solo nivel | ~30–80 | Mejor que ASM, todavía se degrada | Moderar |
| BCD | de dos niveles | 5–9 | casi óptimo: escalado constante | Moderado-Complejo |
| Geno + Ras | Dos niveles (heterogéneos) | 5–15 | Escala a 32,768 rangos (Frosch) | Complejo |
BDDC (5–9 iteraciones) supera constantemente a otros métodos en los problemas de referencia. Su construcción de dos niveles maneja tanto la corrección de red fina como el espacio global grueso, lo que lo convierte en el incumplimiento práctico para Poisson y problemas relacionados.
Geneo + Ras Añade detección automática de espacio grueso para medios heterogéneos. Cuando su problema tiene coeficientes de alto contraste (por ejemplo, la permeabilidad que varía en 10⁶), Geneo es la única opción confiable.
Cuándo elegir qué: Marco de decisión
Un nivel frente a dos niveles
| Situación | Enfoque recomendado |
|---|---|
| ≤ 32 rangos de MPI, problema homogéneo | ASM o RAS (un nivel está bien) |
| 32-512 rangos, problema homogéneo | Dos niveles con espacio grueso Nicolaides |
| 512+ rangos, problema homogéneo | BDDC o GamG (dos niveles) |
| Cualquier recuento de rangos, problema heterogéneo | Geneo + Ras (dos niveles con espacio grueso automático) |
| Producción HPC, 1000+ rangos | Tres niveles (por ejemplo, Frosch) |
Regla general: Comience con dos niveles (BDDC o gamg). Solo use un nivel cuando su recuento de subdominios es pequeño y necesita un prototipo rápido.
ASM contra RAS
| Criterio | ámbar | af |
|---|---|---|
| Tratamiento de superposición | Adición completa (superposición de recuentos dobles) | Pesos de partición de unidad |
| Velocidad de convergencia | Más lento | Más rápido |
| complejidad de la implementación | más fácil | Un poco más complejo |
| Recomendación | Solo prototipo | Solucionador de producción |
Utilice RAS siempre que sea posible. La corrección de partición de unidad es un cambio de una línea en la mayoría de las implementaciones, y la mejora de la convergencia es inmediata.
PetSc vs Fenics
| Criterio | PETSC/PETSC4PY | Fenics/Dolfinx |
|---|---|---|
| Flexibilidad del preacondicionador | Completo — Intercambio a través de -pc_type |
LIMITADO: el valor predeterminado es el juego |
| Accesibilidad de Python | Moderado (requiere familiaridad de PETSC) | Alto (forma variacional declarativa) |
| Transparencia MPI/DDM | Bajo — Infraestructura de C++ bajo Python | Bajo — Abstracción oculta detalles de DD |
| Experimentación DD personalizada | Excelente | Limitado |
| curva de aprendizaje | empinado | Amable |
Utilice PETSC Si necesita experimentar con preacondicionadores, personaliza las particiones DD o cambia los solucionadores sin reescribir el código. Utilice Fenics si desea una creación rápida de prototipos y no necesita la personalización del preacondicionador.
Resumen + Próximos pasos
La descomposición del dominio transforma los solucionadores de PDE en serie en paralelos dividiendo el dominio en subdominios superpuestos y resolviendo localmente. La progresión del método alternante de Schwarz en 1870 a los preacondicionadores modernos de dos niveles (BDDC, Geneo) refleja una idea simple: La corrección del espacio grueso es esencial para la escala.
resumen rápido
- Schwarz de un nivel (ASM/RAS) funciona para el paralelismo pequeño pero se degrada linealmente con el recuento de subdominios.
- RAS supera a ASM a través de la ponderación de superposición de partición de unidad, siempre prefiero RAS.
- Métodos de dos niveles con espacios gruesos (BDDC, Geneo) son el estándar moderno.
- Geneo detecta automáticamente los modos problemáticos de baja energía para medios heterogéneos.
- Implementaciones de Python en PETSC (
pc_type bddc) y Fenics (auto-gamg) hacen que DD sea accesible.
Próximos pasos
- Comienza con PETSC/PETSC4PY — prueba
pc_type bddcen un simple problema de Poisson. El tutorial de ngspetSc proporciona una plantilla de trabajo. - Lea la referencia canónica: Dolean, Jolivet, NATAF 2015 «Una introducción a los métodos de descomposición del dominio» [1] es la mejor descripción conceptual.
- Para problemas heterogéneos, explore espacios genealógicos gruesos en HPDDM o FreeFEM FFDDM.
- Aprenda el paralelismo de Fenics si su flujo de trabajo requiere un prototipo rápido en mallas irregulares. El Documentación de Fenicsx cubre la partición de malla distribuida.
Guías relacionadas
- Gestión de problemas de PDE a gran escala: estrategias, solucionadores y estudios de casos de HPC — cuando las simulaciones se vuelven demasiado costosas para un solo nodo
- HPC Python Flujos de trabajo: de una computadora portátil a una supercomputadora — Configuración de entornos MPI reproducibles
- elegir el derecho Solucionador de PDE de Python: Fipy vs PY-PDE vs Fenics: cuándo usar Fenics y cuándo usar alternativas
- fenics vs fipy vs OpenFoam: Elegir el solucionador correcto — Comparación de métodos a escala
- Computación paralela distribuida Patrones: Python MPI y Dask — Fundamentos de MPI que sustentan la descomposición del dominio
Pensamientos finales
La descomposición del dominio es el puente entre la comprensión de la teoría PDE y la ejecución de simulaciones de producción. Las matemáticas son elegantes: superponen los subdominios, resuelven localmente, corrigen el global, pero la diferencia práctica 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ón.
Si está evaluando los preacondicionadores o configurando una simulación paralela que no se escala, equipo de consultas de matforge puede ayudarlo a elegir el enfoque correcto para su clase de problemas. Ya sea que trabaje con materiales homogéneos o medios heterogéneos de alto contraste, la estrategia DD correcta importa.