Existe algum pacote FEM "leve" por aí?

9

Basicamente, o FEM parece ser um problema praticamente "resolvido". Existem inúmeras estruturas poderosas, como Trilinos, PETSc, FEniCS, Libmesh ou MOOSE.

Uma coisa que eles têm em comum: são extremamente "pesados". Primeiro, a instalação normalmente é super dolorosa. Segundo, a interface / API deles é espessa e pesada - você precisa traduzir toda a sua ideia no pensamento da respectiva biblioteca. Isso também significa que é difícil interoperabilidade e extensibilidade para requisitos especiais ou código existente.

Outros projetos como (exemplos aleatórios) Boost, LibIGL, Aztec (resolvedor linear), Eigen ou CGAL demonstram que é absolutamente possível escrever bibliotecas poderosas que se integram perfeitamente ao código C ++ ou Python, com uma interface muito enxuta e limpa, sem necessidade de instalação de uma estrutura super pesada.

Existe um pacote realmente leve para o FEM? Não estou procurando o solucionador automático e fácil - estou procurando uma biblioteca que ofereça funções poderosas, mantendo uma interface enxuta, interoperabilidade com estruturas de dados comuns (C ++ STL, por exemplo) e instalação leve (somente cabeçalho, por exemplo).

Michael
fonte
11
Você está perguntando sobre bibliotecas do FEM ou aplicativos do FEM?
nicoguaro
2
"oferece funções poderosas enquanto mantém uma interface enxuta", não é um pouco contraditório. Eu uso Fenics e deal.ii e não é difícil de instalar ou até mesmo usar. O Fenics vem com binários que você pode instalar facilmente. deal.II tem muitas opções de instalação, como via Linuxbrew, Homebrew, Candi, etc. Eu recomendaria escolher uma e aprender bem. Será recompensado assim que você cruzar a curva de aprendizado inicial. Uso Fenics para pequenos problemas, testando rapidamente alguma idéia e também para ensinar. Para problemas maiores, computação paralela, prefiro lidar. Ambos têm boa documentação.
cfdlab
11
@PraveenChandrashekar: Funções poderosas e interface enxuta NÃO são absolutamente contraditórias. Dê uma olhada em libigl, boost ou Numpy, por exemplo. Sim, o Fenics parece fácil de usar, mas seria complicado integrar, por exemplo, um aplicativo existente. Imagine que você tem um joguinho onde você precisa integrar um código FEM em tempo real (apenas como exemplo).
Michael
2
Eu concordo com @PraveenChandrashekar, mas, além disso, acredito que a questão, como colocada, não pode ser respondida. No mínimo, você precisa fornecer um exemplo de PDE que deseja resolver com o FEM e que funcionalidade deseja que uma biblioteca "leve" forneça para ajudá-lo a fazer isso.
Bill Greene
11
Um simples que me vem à cabeça é o SfePy , faço o download e tem 7 MB. Também verifiquei o Hermes , e ele tem 10 MB, mas ainda não o testei (mas tentei o Agros 2D). Há mais opções aqui: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Respostas:

10

Desenvolvi uma biblioteca leve de elementos finitos no Python 2.7, aproveitando o poder das matrizes NumPy e matrizes esparsas SciPy. A idéia geral é que, dada uma malha e um elemento finito, você tem uma correspondência mais ou menos um para um entre a forma bilinear e a matriz (esparsa). O usuário pode então usar a matriz resultante como achar melhor.

Deixe-me apresentar um exemplo canônico em que resolvemos a equação de Poisson em um quadrado unitário com uma carga unitária.

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()

Outros comentários:

  • Meu objetivo é escrever testes rigorosos de unidade de convergência, verificando, por exemplo, que taxas de convergência teórica nas respectivas normas sejam obtidas. Os testes são executados automaticamente em cada alteração.
  • A implementação de novos elementos é bastante fácil.

Você pode encontrar o projeto no GitHub .

A versão Python 3 do código pode ser encontrada aqui .

knl
fonte
4

Eu acho que você tem alguma confusão. O PETSc não faz parte da mesma liga que Fenics, Libmesh, Moose etc. De fato, todos esses pacotes (pesados) usam o PETSc para álgebra linear.

O IMHO PETSc é o mais leve possível. Requer apenas compiladores C / Fortran e Python (usados ​​apenas para configuração) e você pode criar a biblioteca em menos de 5 minutos no seu laptop. Além disso, a parte mais complicada de um código FE é a montagem e solução paralelas e o PETSc cuida de ambos. O restante (por exemplo, cálculos no nível do elemento) é bastante direto.

Trillinos, OTOH é muito mais do que uma estrutura de álgebra linear, por exemplo, asteca (solucionador linear) que você menciona como parte dela. De certa forma, o asteca em Trillinos pode ser comparado ao PETSc.

stali
fonte
11
O que exatamente você quer dizer com "montagem paralela" nesse caso? Apenas a comunicação dos elementos da matriz / vetor, ou há mais? Li o manual semi-thorougly, mas não encontrei muito sobre a montagem (além da comunicação no solucionador linear) (Manual: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael
4

Eu posso recomendar nozes .

Os nutils atendem a pelo menos alguns dos seus requisitos "leves".

  • é python puro e fácil de instalar, pois depende apenas das bibliotecas padrão do Python numpy , scipy e matplotlib
  • e, portanto, é adequado para interoperações. Pelo menos os desenvolvedores afirmam que

"Os objetos expostos são do tipo python nativo ou permitem uma conversão fácil para alavancar ferramentas de terceiros".

Jan
fonte
Este é um projeto muito interessante! Eu não estava ciente disso e os objetivos parecem ser bastante semelhantes aos meus. Eles certamente têm alguns vídeos agradável de demonstração ...
KNL