¿Hay algún paquete FEM "ligero"?

9

Básicamente, FEM parece ser un problema que está prácticamente "resuelto". Existen numerosos marcos potentes, como Trilinos, PETSc, FEniCS, Libmesh o MOOSE.

Una cosa que tienen en común: son extremadamente "pesados". Primero, la instalación normalmente es muy dolorosa. En segundo lugar, su interfaz / API es gruesa y pesada: debe traducir toda su idea al pensamiento de la biblioteca respectiva. Eso también significa que la interoperabilidad y la capacidad de ampliación para requisitos especiales o código existente es difícil.

Otros proyectos como (ejemplos aleatorios) Boost, LibIGL, Aztec (solucionador lineal), Eigen o CGAL demuestran que es absolutamente posible escribir bibliotecas potentes que se integran perfectamente en código C ++ o Python, con una interfaz muy sencilla y limpia, sin necesidad de instalación de un marco super pesado.

¿Existe un paquete realmente ligero para FEM? No estoy buscando el solucionador automático y fácil: estoy buscando una biblioteca que ofrezca funciones potentes al tiempo que mantiene una interfaz sencilla, interoperabilidad con estructuras de datos comunes (C ++ STL, por ejemplo) e instalación ligera (encabezado solo, por ejemplo).

Miguel
fuente
1
¿Pregunta acerca de las bibliotecas FEM o las aplicaciones FEM?
nicoguaro
2
"ofrece funciones potentes mientras mantiene una interfaz esbelta", no es un poco contradictorio. Yo uso Fenics y deal.ii y no es difícil de instalar o incluso de usar. Fenics viene con binarios que puedes instalar fácilmente. deal.II tiene muchas opciones de instalación como a través de Linuxbrew, Homebrew, Candi, etc. Recomendaría elegir una y aprenderla bien. Dará buenos resultados una vez que cruce la curva de aprendizaje inicial. Utilizo Fenics para pequeños problemas, probando rápidamente alguna idea y también para enseñar. Para problemas más grandes, computación paralela, prefiero trato. II. Ambos tienen buena documentación.
cfdlab
1
@PraveenChandrashekar: las potentes funciones y la interfaz ajustada NO son absolutamente contradictorias. Echa un vistazo a libigl, boost o Numpy, por ejemplo. Sí, Fenics parece fácil de usar, pero sería complicado integrarlo, por ejemplo, en una aplicación existente. Imagina que tienes un pequeño juego en el que necesitas integrar un código FEM en tiempo real (solo como ejemplo).
Michael
2
Estoy de acuerdo con @PraveenChandrashekar pero más allá de eso, creo que la pregunta, tal como se plantea, no tiene respuesta. Como mínimo, debe proporcionar un ejemplo de un PDE que desee resolver con FEM y qué funcionalidad desea que proporcione una biblioteca "ligera" para ayudarlo a hacerlo.
Bill Greene
1
Una simple que me viene a la mente es SfePy , la descargo y tiene 7 MB. También revisé Hermes , y son 10 MB, aunque no lo he probado (pero he probado Agros 2D). Aquí hay más opciones: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Respuestas:

10

He estado desarrollando una biblioteca ligera de elementos finitos en Python 2.7 aprovechando el poder de las matrices NumPy y las matrices dispersas SciPy. La idea general es que, dada una malla y un elemento finito, tiene una correspondencia más o menos uno a uno entre la forma bilineal y una matriz (escasa). El usuario puede usar la matriz resultante como lo considere conveniente.

Permítanme presentar un ejemplo canónico donde resolvemos la ecuación de Poisson en una unidad cuadrada con una unidad de carga.

from spfem.mesh import MeshTri
from spfem.asm import AssemblerElement
from spfem.element import ElementTriP1
from spfem.utils import direct

# Create a triangular mesh. By default, the unit square is meshed.
m=MeshTri()

# Refine the mesh six times by splitting each triangle into four
# subtriangles repeatedly.
m.refine(6)

# Combine the mesh and a type of finite element to create
# an assembler. By default, an affine mapping is used.
a=AssemblerElement(m,ElementTriP1())

# Assemble the bilinear and linear forms. The former outputs
# a SciPy csr_matrix and the latter outputs linear NumPy array.
A=a.iasm(lambda du,dv: du[0]*dv[0]+du[1]*dv[1])
b=a.iasm(lambda v: 1.0*v)

# Solve the linear system in interior nodes using
# a direct solution method provided by SciPy.
x=direct(A,b,I=m.interior_nodes())

# Visualize the solution using Matplotlib.
m.plot3(x)
m.show()

Otros comentarios:

  • Mi objetivo es escribir pruebas rigurosas de unidades de convergencia que verifiquen, por ejemplo, que se obtengan tasas de convergencia teórica en las normas respectivas. Las pruebas se ejecutan automáticamente en cada cambio.
  • Implementar nuevos elementos es bastante fácil.

Puedes encontrar el proyecto en GitHub .

La versión de Python 3 del código se puede encontrar aquí .

knl
fuente
4

Creo que tienes algo de confusión. PETSc no está en la misma liga que Fenics, Libmesh, Moose, etc. De hecho, todos estos paquetes (de peso pesado) usan PETSc para álgebra lineal.

En mi humilde opinión PETSc es lo más ligero que puedes conseguir. Solo requiere compiladores C / Fortran y Python (se usa solo para la configuración) y puede construir la biblioteca en menos de 5 minutos en su computadora portátil. Además, la parte más complicada de un código FE es el ensamblaje paralelo y la resolución, y PETSc se encarga de ambos. El resto (p. Ej., Cálculos a nivel de elemento) es bastante sencillo.

Trillinos, OTOH es mucho más que un marco de álgebra lineal, por ejemplo, Aztec (solucionador lineal) que usted menciona es parte de él. De alguna manera, Aztec en Trillinos se puede comparar con PETSc.

stali
fuente
1
¿Qué quiere decir exactamente con "montaje paralelo" en ese caso? Solo la comunicación de los elementos matriz / vector, ¿o hay más? Leí el manual a fondo, pero no encontré mucho sobre el ensamblaje (además de la comunicación en el solucionador lineal) (Manual: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael
4

Puedo recomendar nutils .

nutils cumple al menos algunos de sus requisitos de "peso ligero".

  • es Python puro y fácil de instalar, ya que solo depende de las bibliotecas estándar de Python numpy , scipy y matplotlib
  • y, por lo tanto, es muy adecuado para interoperaciones. Al menos los desarrolladores afirman que

"Los objetos expuestos son de tipo python nativo o permiten una fácil conversión para aprovechar las herramientas de terceros".

ene
fuente
Este es un proyecto muy interesante! No lo sabía y los objetivos parecen ser bastante similares a los míos. Seguramente tienen algunos buenos videos de demostración ...
knl