Reading Time: 12 minutes

Fipy es un marco basado en Python para resolver ecuaciones diferenciales parciales con el método de volumen finito. Se utiliza comúnmente para la difusión, la transferencia de calor, el modelado de campo de fase, la electroquímica, el transporte relacionado con fluidos y otros problemas que pueden expresarse a través de ecuaciones de conservación.

Cada simulación Fipy comienza con una malla. La malla define el dominio físico, lo divide en volúmenes de control, identifica los límites entre esos volúmenes y determina dónde se almacenan las variables numéricas. Una malla cuidadosamente seleccionada puede hacer que un modelo sea preciso y eficiente. Una malla pobre puede crear cálculos inestables, gradientes poco realistas o costos computacionales innecesarios.

Fipy admite cuadrículas cartesianas simples, espaciado no uniforme, dominios periódicos, coordenadas cilíndricas y esféricas, estructuras triangulares y mallas creadas con GMSH. Comprender estas opciones ayuda a los usuarios a seleccionar la cuadrícula más simple que aún representa correctamente el problema físico.

¿Qué es una malla en Fipy?

Una malla es una representación discreta de una región física continua. En lugar de resolver una ecuación diferencial en cada punto posible, Fipy divide el dominio en un número finito de celdas y calcula valores aproximados dentro de ellas.

Cada celda actúa como un volumen de control. Las cantidades físicas, como la temperatura, la concentración, la presión o la fracción de fase, generalmente se asocian con centros celulares. El transporte entre celdas vecinas se calcula a través de las caras que las separan.

La malla proporciona geometría y topología. La geometría describe tamaños, coordenadas, áreas y volúmenes. La topología describe qué celdas comparten caras y cómo se conectan los elementos.

Esta información permite a Fipy transformar una ecuación diferencial en un sistema de ecuaciones algebraicas que puede procesar un solucionador numérico.

Células, caras y vértices

Las mallas fibrosas se construyen alrededor de tres componentes estructurales principales: celdas, caras y vértices.

Las celdas son los volúmenes de control utilizados por el método de volumen finito. Una celda unidimensional es un segmento de línea. Una celda bidimensional puede ser un rectángulo o triángulo. Una celda tridimensional puede ser una caja u otro volumen poliédrico.

Las caras forman los límites de las células. Una cara interior separa dos celdas vecinas. Una cara exterior se encuentra en el límite exterior del dominio completo.

Los vértices definen los puntos geométricos a partir de los cuales se construyen las caras y las celdas. La mayoría de los usuarios no manipulan los vértices directamente cuando trabajan con cuadrículas regulares, pero se vuelven importantes al importar o crear geometría irregular.

Las relaciones entre estos componentes determinan cómo se mueven los valores y los flujos a través de la simulación.

Por qué es importante la estructura de malla en el método de volumen finito

El método de volumen finito integra una ecuación de gobierno sobre cada celda. Luego calcula cuánto de una cantidad física entra o sale a través de las caras circundantes.

Para un problema de difusión, Fipy estima los gradientes entre los valores de las celdas vecinas y calcula el flujo difusivo en cada cara. Para un problema de convección, la dirección y la magnitud del transporte dependen de las velocidades centradas en la cara y los vectores normales.

El tamaño de la celda influye en la resolución. El área de la cara influye en la cantidad de flujo. El volumen celular afecta a la acumulación y los términos de origen. La distancia entre los centros celulares vecinos afecta las aproximaciones de gradiente.

Como resultado, la malla no es solo un contenedor visual. Su geometría entra directamente en las ecuaciones numéricas.

Mallas estructuradas y no estructuradas

Una malla estructurada organiza las celdas en un patrón predecible. Las cuadrículas rectangulares son el ejemplo más común. Las celdas forman filas, columnas y capas, y sus vecinos se pueden identificar sistemáticamente.

Las cuadrículas estructuradas son fáciles de crear y, por lo general, son eficientes de procesar. Son adecuados para dominios rectangulares, sistemas en capas, canales y problemas con límites simples.

Una malla no estructurada no sigue un arreglo regular de fila y columna. Puede contener triángulos, tetraedros o polígonos irregulares. Las mallas no estructuradas pueden adaptarse a límites curvos, agujeros, características estrechas y geometría de ingeniería compleja con mayor precisión.

La flexibilidad de una malla no estructurada tiene un costo adicional. La generación de mallas, el control de calidad, la selección de límites y el procesamiento numérico se vuelven más complicados.

Creación de una cuadrícula unidimensional

La malla fibrosa más simple es Grid1D. Divide una línea en un número específico de celdas.

from fipy import Grid1D

mesh = Grid1D(nx=100, dx=0.01)

El parámetro nx define el número de celdas. El parámetro dx define el ancho de cada celda. En este ejemplo, la longitud total del dominio es una unidad.

Las cuadrículas unidimensionales son útiles para la difusión en capas, la transferencia de calor a través de una pared, los cambios de concentración a lo largo de un canal y los sistemas con fuerte simetría. Un modelo 1D suele ser mucho más rápido que una simulación 2D o 3D y puede ser suficiente cuando se pueden ignorar las variaciones en otras direcciones.

Creación de una cuadrícula bidimensional

Se puede crear un dominio bidimensional rectangular con Grid2D.

from fipy import Grid2D

mesh = Grid2D(
    nx=50,
    ny=30,
    dx=0.02,
    dy=0.02
)

La malla contiene 50 celdas a lo largo del eje x y 30 celdas a lo largo del eje y. Cada celda tiene 0,02 unidades de ancho y 0,02 unidades de alto.

Esta estructura es adecuada para la transferencia de calor plana, microestructuras de materiales, difusión entre superficies, problemas electrostáticos y muchos ejemplos de campo de fase.

Una cuadrícula rectangular suele ser el mejor punto de partida cuando el dominio físico es simple. Es fácil de visualizar, refinar y probar la independencia de malla.

Creación de una cuadrícula tridimensional

Fipy proporciona Grid3D para los dominios volumétricos.

from fipy import Grid3D

mesh = Grid3D(
    nx=40,
    ny=30,
    nz=20,
    dx=0.01,
    dy=0.01,
    dz=0.01
)

Las simulaciones tridimensionales pueden representar geometría espacial completa, pero requieren mucha más memoria y tiempo de procesamiento. Duplicar el número de celdas en cada dirección puede aumentar el número total de células en un factor de ocho.

Antes de usar una cuadrícula 3D, es útil verificar si la simetría o la reducción dimensional pueden proporcionar un resultado adecuado. Un modelo radial cilíndrico o unidimensional a veces puede reemplazar una simulación 3D mucho más cara.

Espaciado uniforme y no uniforme

Una cuadrícula uniforme utiliza celdas de igual tamaño a lo largo de un eje dado. Esto es conveniente cuando la solución cambia gradualmente en todo el dominio.

Algunos problemas contienen gradientes nítidos cerca de un límite, interfaz o fuente. Usar una fina cuadrícula en todas partes puede ser un desperdicio. Fipy puede crear un espaciado no uniforme al recibir una secuencia de anchos de celda.

from fipy import Grid1D

mesh = Grid1D(
    dx=(0.01, 0.01, 0.02, 0.04, 0.08)
)

Las células se hacen progresivamente más amplias. Las células más pequeñas se pueden colocar cerca de un límite importante, mientras que las células más grandes cubren regiones donde la solución cambia lentamente.

Las cuadrículas no uniformes reducen el costo computacional, pero los cambios abruptos en el tamaño de la celda pueden reducir la calidad numérica. Las dimensiones de las celdas generalmente deben cambiar gradualmente en lugar de saltar entre valores extremadamente diferentes.

Acceso a los centros celulares

Fipy expone las coordenadas de celda a través de mesh.cellCenters. Estas coordenadas se utilizan a menudo para definir condiciones iniciales, fuentes, coeficientes espaciales y regiones de interés.

x, y = mesh.cellCenters

Un usuario puede crear una región inicial circular aplicando una condición lógica a las coordenadas:

initial_region = (
    (x - 0.5) ** 2 + (y - 0.5) ** 2
) < 0.1 ** 2

La máscara booleana resultante identifica las celdas cuyos centros caen dentro del círculo.

Las coordenadas del centro de la celda son especialmente útiles porque la mayoría de las variables de solución fipy se almacenan como objetos CellVariable.

Variables celulares y asociación de mallas

A CellVariable almacena un valor para cada celda de la malla.

from fipy import CellVariable

temperature = CellVariable(
    name="temperature",
    mesh=mesh,
    value=300.0
)

La variable recibe automáticamente el mismo número de valores que la malla tiene celdas. También obtiene acceso a operaciones basadas en mallas, como gradientes, interpolación de caras y restricciones.

Los valores solo se pueden cambiar en celdas seleccionadas:

temperature.setValue(
    500.0,
    where=initial_region
)

Esta relación entre las variables y las mallas permite a Fipy administrar operaciones dependientes de la geometría sin necesidad de que los usuarios ensamblen manualmente cada matriz.

Centros faciales y variables faciales

Las caras son importantes porque los flujos pasan a través de ellos. Sus coordenadas están disponibles a través de mesh.faceCenters.

x_face, y_face = mesh.faceCenters

Las coordenadas de la cara se pueden usar para identificar límites o aplicar una condición solo a parte de un borde.

Fipy también admite objetos FaceVariable. Estos son útiles para las cantidades que se encuentran naturalmente en las caras, como la velocidad de flujo o el flujo especificado externamente.

Una variable centrada en la célula a menudo se puede interpolar a las caras a través de propiedades como faceValue. Se puede acceder a su gradiente en las caras a través de faceGrad.

Elegir la ubicación correcta para una variable es importante. Las temperaturas y las concentraciones suelen estar centradas en las células, mientras que los flujos y las velocidades de transporte a menudo están centrados en la cara.

Volúmenes celulares, áreas de la cara y normales

Fipy calcula las propiedades geométricas automáticamente. Los volúmenes de celda están disponibles a través de mesh.cellVolumes. En 2D, estos valores representan áreas celulares bajo los supuestos dimensionales del modelo.

Las áreas faciales influyen en la cantidad total de material, calor o impulso que pasa a través de un límite. Las normales de la cara identifican la dirección perpendicular a cada cara.

La orientación de una normal importa al calcular los flujos hacia afuera y hacia adentro. Un flujo positivo en una dirección puede representar un flujo negativo en relación con una célula vecina.

Estas propiedades permiten a FIPY aplicar las leyes de conservación de manera consistente en diferentes formas de cuadrícula y sistemas de coordenadas.

Caras exteriores e interiores

Fipy separa las caras en grupos exteriores e interiores. Las caras exteriores forman el límite exterior del dominio. Las caras interiores conectan las celdas vecinas.

Las máscaras correspondientes están disponibles como:

mesh.exteriorFaces
mesh.interiorFaces

Las caras exteriores se utilizan comúnmente para las condiciones de contorno. Las caras interiores participan en el transporte ordinario entre las células.

Las cuadrículas cartesianas regulares también proporcionan máscaras direccionales convenientes como facesLeft, facesRight, facesTop y facesBottom.

temperature.constrain(
    350.0,
    where=mesh.facesLeft
)

temperature.constrain(
    300.0,
    where=mesh.facesRight
)

Esto aplica valores fijos a los límites izquierdo y derecho.

Creación de máscaras de límites personalizadas

Una condición física puede aplicarse solo a parte de un límite. Las máscaras personalizadas pueden combinar conjuntos de caras estándar con condiciones de coordenadas.

x_face, y_face = mesh.faceCenters

heated_section = (
    mesh.facesTop
    & (x_face > 0.4)
    & (x_face < 0.6)
)

temperature.constrain(
    400.0,
    where=heated_section
)

Este ejemplo restringe sólo la parte central del límite superior.

Las máscaras personalizadas también pueden seleccionar límites circulares, interfaces, entradas, salidas o caras cerca de una coordenada específica. Es importante crear máscaras a partir de coordenadas de la cara al aplicar condiciones de contorno basadas en la cara. Una máscara celular y una máscara facial tienen diferentes longitudes y propósitos.

Estructuras de cuadrícula periódica

Las mallas periódicas conectan lados opuestos de un dominio. Un valor que deja un lado efectivamente vuelve a entrar a través del otro.

Fipy proporciona clases de cuadrícula periódicas para una, dos y tres dimensiones. Algunas variantes aplican periodicidad sólo a lo largo de ejes seleccionados.

Las cuadrículas periódicas son útiles para microestructuras repetidas, patrones de cristal, volúmenes de materiales representativos, sistemas en forma de onda y simulaciones de campo de fase donde los límites exteriores artificiales distorsionarían la solución.

Los usuarios deben recordar que una dirección periódica no se comporta como un límite exterior ordinario. La aplicación de restricciones de límites en conflicto a las caras conectadas puede producir un modelo incorrecto.

Rejillas cilíndricas y esféricas

Las cuadrículas cartesianas no siempre son la opción más eficiente. Fipy proporciona clases de malla cilíndrica y esférica para sistemas con simetría radial.

Una rejilla cilíndrica puede representar la transferencia de calor a través de una pared de tubería, difusión radial o un reactor axisimétrico. Los volúmenes de celda y las áreas de cara cambian con el radio, y Fipy explica esta geometría automáticamente.

Una rejilla unidimensional esférica puede modelar la difusión en una partícula, transferencia de calor dentro de una esfera o transporte químico radial.

Estas mallas específicas de coordenadas pueden reemplazar costosos cálculos multidimensionales cuando la solución es simétrica. Sin embargo, no deben usarse cuando hay variaciones angulares importantes.

Mallas triangulares y sesgadas

Fipy incluye estructuras triangulares como Tri2D. Las células triangulares pueden proporcionar una discretización diferente de una región bidimensional y pueden ser útiles para probar el comportamiento numérico.

Las rejillas sesgadas alejan intencionalmente los vértices de una disposición ortogonal. Pueden demostrar cómo un solucionador responde a la geometría no ortogonal.

El fuerte sesgo puede reducir la precisión del gradiente y aumentar el error numérico. Una malla con muchas celdas de mala calidad puede funcionar peor que una rejilla más gruesa pero bien formada.

Por lo tanto, la calidad de la malla debe evaluarse por separado de la resolución de la malla. Agregar más celdas distorsionadas no necesariamente mejora la solución.

Modelado de geometría compleja con GMSH

Las cuadrículas regulares están limitadas cuando el dominio contiene curvas, agujeros, límites irregulares o características tridimensionales detalladas. Fipy puede usar GMSH para generar o importar mallas más complejas.

Se puede crear una malla bidimensional básica a partir de comandos GMSH:

from fipy import Gmsh2D

mesh = Gmsh2D("""
    cellSize = 0.05;

    Point(1) = {0, 0, 0, cellSize};
    Point(2) = {1, 0, 0, cellSize};
    Point(3) = {1, 1, 0, cellSize};
    Point(4) = {0, 1, 0, cellSize};

    Line(1) = {1, 2};
    Line(2) = {2, 3};
    Line(3) = {3, 4};
    Line(4) = {4, 1};

    Curve Loop(1) = {1, 2, 3, 4};
    Plane Surface(1) = {1};
""")

GMSH también puede cargar geometría desde un archivo .geo o importar un archivo .msh generado. Mantener la geometría compleja en un archivo separado a menudo hace que el modelo de Python sea más fácil de mantener.

Refinamiento local

Los problemas complejos a menudo necesitan celdas pequeñas solo en áreas seleccionadas. El refinamiento local puede mejorar la resolución cerca de interfaces, esquinas, límites, fuentes, canales estrechos o gradientes pronunciados.

GMSH proporciona controles flexibles para configurar los tamaños de elementos locales. Se puede colocar una región fina alrededor de una característica importante, mientras que el resto del dominio usa celdas más grandes.

Este enfoque suele ser más eficiente que refinar toda la red. Sin embargo, las transiciones entre regiones finas y gruesas deben ser graduales. Los cambios repentinos de tamaño pueden reducir la calidad numérica o crear celdas con malformaciones.

Pruebas de convergencia de malla

Un resultado de simulación no debe depender en gran medida de un tamaño de malla arbitraria. La prueba de convergencia de malla comprueba si la solución se vuelve estable a medida que se refina la red.

Una prueba práctica utiliza al menos dos o tres resoluciones. El usuario compara una cantidad importante, como la temperatura máxima, la concentración promedio, la posición de la interfaz o el flujo total.

Si el resultado cambia significativamente después del refinamiento, la malla original probablemente era demasiado gruesa. Si la diferencia se vuelve pequeña, es posible que el refinamiento adicional no justifique su costo computacional.

Se debe probar la convergencia para el resultado que importa al estudio. Una malla puede predecir con precisión un valor promedio sin dejar de capturar un máximo local.

Mallas en simulaciones paralelas

Las grandes simulaciones de Fipy pueden distribuir una malla en varios procesos. Cada proceso funciona con una parte del dominio e intercambia información con partes vecinas.

Las mallas paralelas pueden contener celdas locales, superponer celdas y valores identificados globalmente. Por lo tanto, el tamaño de una matriz numpy local puede diferir del número total de celdas en la malla completa.

Los usuarios deben tener cuidado al indexar directamente matrices o exportar valores durante la ejecución en paralelo. El código que asume que cada proceso posee la malla completa puede funcionar en modo serie pero falla en modo paralelo.

La ejecución en paralelo puede reducir el tiempo de ejecución para problemas grandes, pero la sobrecarga de comunicación puede limitar el beneficio para las mallas pequeñas.

Inspección y visualización de una malla

Se debe inspeccionar una malla antes de resolver una ecuación compleja. Los usuarios pueden verificar los recuentos de celdas, los rangos de coordenadas, los volúmenes, las máscaras exteriores y las selecciones de límites.

Los visores de Fipy pueden mostrar una variable en la malla:

from fipy import Viewer

viewer = Viewer(vars=temperature)
viewer.plot()

La visualización puede revelar dimensiones de dominio incorrectas, espaciado de celdas inesperado, regiones faltantes o máscaras de límite mal seleccionadas.

Para la geometría basada en GMSH, es útil inspeccionar la malla generada en una herramienta de visualización dedicada antes de comenzar una simulación larga.

errores comunes para principiantes

Un error común es confundir el recuento de células con el tamaño físico. Una cuadrícula con 100 celdas no tiene una longitud de 100 a menos que cada celda tenga una unidad de ancho.

Otro error es aplicar una restricción de límite con una máscara celular en lugar de una máscara facial. Las condiciones de contorno generalmente actúan sobre caras exteriores.

Los usuarios también pueden elegir una cuadrícula que sea demasiado gruesa para capturar un gradiente o innecesariamente bien para un problema simple.

Otros problemas comunes incluyen suposiciones de coordinación incorrectas, espaciado no uniforme abrupto, mala calidad del elemento GMSH, condiciones periódicas conflictivas y saltos de pruebas de convergencia.

Elegir la malla fibrosa correcta

Tipo de malla Mejor uso Limitación principal
Grid1D Transporte en capas y unidireccional no puede representar la variación lateral
Grid2D Dominios planos rectangulares Limitado a límites simples
Grid3D Modelos volumétricos completos Alto costo computacional
Rejilla no uniforme Gradientes e interfaces localizados Requiere transiciones espaciadas cuidadosas
Rejilla periódica Estructuras repetidas y células unitarias Los límites opuestos están vinculados
Rejilla cilíndrica o esférica Sistemas radialmente simétricos No es válido cuando la variación angular importa
Malla GMSH Geometría curva e irregular Generación más compleja y control de calidad

Un práctico flujo de trabajo de selección de mallas

Comience identificando la forma física del dominio y las dimensiones en las que puede variar la solución. Compruebe si la simetría puede reducir un problema 3D a 2D o 1D.

Elija la clase de malla más simple y adecuada. Estime dónde pueden aparecer gradientes o interfaces fuertes y ajuste el tamaño de la celda en consecuencia.

Inspeccione los centros de celdas, las dimensiones del dominio, los volúmenes y las máscaras de límite. Visualice la malla y aplique una variable de prueba simple antes de resolver la ecuación completa.

Ejecute la simulación en más de una resolución y compare los resultados principales. Mover a GMSH, refinamiento local o procesamiento paralelo solo cuando la cuadrícula básica no pueda cumplir con los requisitos geométricos o numéricos.

Conclusión

Las mallas Fipy definen la geometría, la conectividad, los volúmenes de celda, las caras y las coordenadas utilizadas por el método de volumen finito. Proporcionan la estructura en la que operan las variables, las ecuaciones, los flujos y las condiciones de contorno.

Las clases regulares como Grid1D, Grid2D y Grid3D cubren muchos problemas comunes. Las mallas no uniformes, periódicas, cilíndricas, esféricas, triangulares y basadas en GMSH soportan dominios más especializados.

La malla más detallada no es automáticamente la mejor. Una buena malla captura el comportamiento físico requerido mientras mantiene manejable el costo computacional. Las máscaras de contorno correctas, la calidad celular razonable, los sistemas de coordenadas apropiados y las pruebas de convergencia son esenciales.

Al elegir la cuadrícula suficiente más simple y refinar solo cuando sea necesario, los usuarios de Fipy pueden crear simulaciones que sean más fáciles de entender, más rápidas de resolver y más confiables.