Lección 2 · Primer problema completo: Poisson
Nivel: inicial · Tiempo: 3 h · Prerrequisitos: lecciones 0–1.
Por qué Poisson aparece primero
Poisson reúne todas las piezas de una simulación sin introducir campos vectoriales, tiempo o no linealidad. Primero ejecutarás el ciclo completo; las lecciones 3–5 regresan a objetos, mallas y espacios para explicarlos con detalle. No necesitas memorizar cada llamada antes de comenzar.
Objetivos
Implementarás la cadena forma fuerte → forma débil → UFL → PETSc y medirás errores L2/H1 con tasas MPI-safe.
Modelo físico y unidades
En (Ω=(0,1)^2), se fabrica (u=\sin(\pi x)\sin(\pi y)), (f=2\pi^2u). Puede interpretarse como potencial o temperatura estacionaria adimensional.
Forma fuerte y condiciones
Dirichlet fija el espacio afín; Neumann aparecería como flujo natural y Robin añadiría términos de contorno en ambos lados.
Derivación débil
Multiplicar por (v\in H_0^1), integrar y aplicar Green:
Mapa matemático → UFL/DOLFINx
| Matemática | Implementación |
|---|---|
| (V_h\subset H^1) | fem.functionspace(domain, ("Lagrange", 1)) |
| (u_h,v_h) | TrialFunction, TestFunction |
| (a(u,v)) | inner(grad(u), grad(v))*dx |
| (L(v)) | inner(f, v)*dx |
| (u=0) | locate_dofs_topological + dirichletbc |
Ejemplo e inspección
Ejecuta python examples/01_poisson_manufactured.py --quick --output results.
Inspecciona celdas globales, DOF, facetas de frontera y el JSON de cada
refinamiento. Usa --write-fields solo después de que la validación numérica pase.
El pipeline de ocho pasos
| Paso | Pregunta | Dónde profundizar |
|---|---|---|
| 1 | ¿cuál es el dominio? | lección 4 |
| 2 | ¿qué espacio aproxima \(u\)? | lección 5 |
| 3 | ¿qué datos cambian? | lección 3 |
| 4 | ¿cuál es la forma débil? | lección 1 |
| 5 | ¿qué frontera fija valores? | lección 4 |
| 6 | ¿qué sistema resuelve PETSc? | herramientas transversales |
| 7 | ¿cómo se mide el error? | lección 5 |
| 8 | ¿qué se conserva como evidencia? | repertorio verificable |
Solver
LinearProblem recibe el prefijo no vacío mcandes_poisson_<n>_, LU y
ksp_error_if_not_converged. Además se exige getConvergedReason()>0.
Verificación cuantitativa
Para P1 suave se esperan (|e|{L^2}=O(h^2)) y (|e|=O(h)). Los umbrales 1.8/0.9 toleran mallas gruesas sin aceptar un orden equivocado.
Visualización
XDMF permite ParaView. Una forma sinusoidal plausible no prueba las tasas; el JSON es la evidencia primaria.
Errores frecuentes
- Signo incorrecto de (f) tras integración por partes.
- Localizar geometría pero aplicar BC a DOF equivocados.
- Ensamblar error por rango sin
Allreduce. - Omitir la razón KSP o usar tolerancia bit a bit.
Ejercicios graduados
- Añade condición Neumann en la arista superior.
- Implementa Robin y verifica con otra solución manufacturada.
- Compara P1/P2 separando error de discretización y costo.
Solución o guía
Neumann entra en (L(v)) como (\int_{\Gamma_N}gv\,ds); Robin (\partial_nu+\alpha u=r) añade (\alpha uv) a (a) y (rv) a (L). Conserva una porción Dirichlet o controla el nullspace constante.
Fuentes, licencia, versión y cambios
Demo oficial Poisson 0.11. La formulación manufacturada, estudio dual L2/H1 y salida JSON son del curso.
Anterior: matemática mínima y forma débil · Siguiente: objetos de DOLFINx y UFL