Existe-t-il des packages FEM «légers»?

9

Fondamentalement, FEM semble être un problème à peu près «résolu». Il existe de nombreux frameworks puissants, comme Trilinos, PETSc, FEniCS, Libmesh ou MOOSE.

Une chose qu'ils ont en commun: ils sont extrêmement "lourds". Tout d'abord, l'installation est normalement super douloureuse. Deuxièmement, leur interface / API est épaisse et lourde - vous devez traduire toute votre idée dans la réflexion de la bibliothèque respective. Cela signifie également que l'interopérabilité et l'extensibilité pour les exigences spéciales ou le code existant est difficile.

D'autres projets comme (exemples aléatoires) Boost, LibIGL, Aztec (solveur linéaire), Eigen ou CGAL démontrent qu'il est absolument possible d'écrire des bibliothèques puissantes qui s'intègrent de manière transparente dans du code C ++ ou Python, avec une interface très allégée et propre, sans avoir besoin d'installation d'un cadre super lourd.

Existe-t-il un package vraiment léger pour FEM? Je ne recherche pas le solveur simple et automagique - je recherche une bibliothèque qui offre des fonctions puissantes tout en maintenant une interface allégée, l'interopérabilité avec des infrastructures de données communes (C ++ STL par exemple) et une installation légère (en-tête uniquement par exemple).

Michael
la source
1
Vous posez des questions sur les bibliothèques FEM ou les applications FEM?
nicoguaro
2
"offre des fonctions puissantes tout en conservant une interface allégée", n'est-ce pas un peu contradictoire. J'utilise Fenics et deal.ii et ce n'est pas difficile à installer ou même à utiliser. Fenics est livré avec des fichiers binaires que vous pouvez facilement installer. deal.II a de nombreuses options d'installation comme via Linuxbrew, Homebrew, Candi, etc. Je recommanderais d'en choisir une et de bien l'apprendre. Cela rapportera bien une fois que vous aurez franchi la courbe d'apprentissage initiale. J'utilise Fenics pour les petits problèmes, en testant rapidement certaines idées et aussi pour certains enseignements. Pour les gros problèmes, le calcul parallèle, je préfère deal.II. Les deux ont une bonne documentation.
cfdlab
1
@PraveenChandrashekar: Les fonctions puissantes et l'interface allégée ne sont absolument PAS contradictoires. Jetez un œil à libigl, boost ou Numpy par exemple. Oui, Fenics semble facile à utiliser, mais il serait fastidieux de l'intégrer par exemple dans une application existante. Imaginez que vous ayez un petit jeu où vous devez intégrer un code FEM en temps réel (comme exemple).
Michael
2
Je suis d'accord avec @PraveenChandrashekar mais au-delà, je pense que la question, telle qu'elle est posée, est sans réponse. Au minimum, vous devez fournir un exemple d'un PDE que vous souhaitez résoudre avec FEM et quelles fonctionnalités vous souhaitez qu'une bibliothèque "légère" fournisse pour vous aider à le faire.
Bill Greene
1
Un simple qui me vient à l'esprit est SfePy , je le télécharge et il fait 7 Mo. J'ai également vérifié Hermes , et il fait 10 Mo, je ne l'ai pas essayé cependant (mais j'ai essayé Agros 2D). Il y a plus d'options ici: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Réponses:

10

J'ai développé une bibliothèque d'éléments finis légère en Python 2.7 exploitant la puissance des tableaux NumPy et des matrices clairsemées SciPy. L'idée générale est que, étant donné un maillage et un élément fini, vous avez plus ou moins une correspondance biunivoque entre la forme bilinéaire et une matrice (clairsemée). L'utilisateur peut ensuite utiliser la matrice résultante à sa guise.

Permettez-moi de présenter un exemple canonique où nous résolvons l'équation de Poisson dans un carré unitaire avec un chargement unitaire.

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

Autres commentaires:

  • Mon objectif est d'écrire des tests unitaires de convergence rigoureux vérifiant par exemple que les taux de convergence théoriques dans les normes respectives sont obtenus. Les tests sont exécutés automatiquement à chaque modification.
  • La mise en œuvre de nouveaux éléments est assez simple.

Vous pouvez trouver le projet dans GitHub .

La version Python 3 du code peut être trouvée ici .

knl
la source
4

Je pense que vous avez une certaine confusion. PETSc n'est pas dans la même ligue que Fenics, Libmesh, Moose, etc. En fait, tous ces packages (lourds) utilisent PETSc pour l'algèbre linéaire.

IMHO PETSc est aussi léger que possible. Il ne nécessite que des compilateurs C / Fortran et Python (utilisé uniquement pour la configuration) et vous pouvez créer la bibliothèque en moins de 5 minutes sur votre ordinateur portable. De plus, la partie la plus compliquée d'un code FE est l'assemblage et la résolution parallèles et PETSc s'occupe des deux. Le reste (par exemple, les calculs au niveau des éléments) est assez simple.

Trillinos, OTOH est bien plus qu'un cadre d'algèbre linéaire, par exemple Aztec (solveur linéaire) dont vous parlez en fait partie. À certains égards, Aztec à Trillinos peut être comparé à PETSc.

stali
la source
1
Qu'entendez-vous exactement par «assemblage parallèle» dans ce cas? Juste la communication des éléments matriciels / vectoriels, ou y a-t-il plus? J'ai lu le manuel à moitié, mais je n'ai pas trouvé grand-chose sur l'assemblage (à part la communication dans le solveur linéaire) (Manuel: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael
4

Je peux recommander des nutils .

nutils répond au moins à quelques-unes de vos exigences "légères".

  • il est en python pur et facile à installer car il ne dépend que des bibliothèques Python standard numpy , scipy et matplotlib
  • et, par conséquent, il est bien adapté aux interopérations. Au moins, les développeurs affirment que

"Les objets exposés sont de type Python natif ou permettent une conversion facile pour tirer parti des outils tiers."

Jan
la source
Ceci est un projet très intéressant! Je n'en étais pas conscient et les objectifs semblent être assez similaires à ceux des miens. Ils ont sûrement de belles vidéos de démonstration ...
knl