Gibt es „leichte“ FEM-Pakete?

9

Grundsätzlich scheint FEM ein Problem zu sein, das so ziemlich "gelöst" ist. Es gibt zahlreiche leistungsstarke Frameworks wie Trilinos, PETSc, FEniCS, Libmesh oder MOOSE.

Eines haben sie gemeinsam: Sie sind extrem "schwer". Erstens ist die Installation normalerweise sehr schmerzhaft. Zweitens ist ihre Schnittstelle / API dick und schwer - Sie müssen Ihre gesamte Idee in das Denken der jeweiligen Bibliothek übersetzen. Dies bedeutet auch, dass die Interoperabilität und Erweiterbarkeit für spezielle Anforderungen oder vorhandenen Code schwierig ist.

Andere Projekte wie (zufällige Beispiele) Boost, LibIGL, Aztec (linearer Löser), Eigen oder CGAL zeigen, dass es absolut möglich ist, leistungsstarke Bibliotheken zu schreiben, die sich nahtlos in C ++ - oder Python-Code integrieren lassen, mit einer sehr schlanken und sauberen Oberfläche, ohne dass eine Installation erforderlich ist eines super schweren Rahmens.

Gibt es ein wirklich leichtes Paket für FEM? Ich bin nicht auf der Suche nach einem einfachen, automatischen Löser. Ich suche nach einer Bibliothek, die leistungsstarke Funktionen bietet und gleichzeitig eine schlanke Schnittstelle, Interoperabilität mit gängigen Datenstrukturen (z. B. C ++ STL) und eine einfache Installation (nur Header) bietet.

Michael
quelle
1
Fragen Sie nach FEM-Bibliotheken oder FEM-Anwendungen?
Nicoguaro
2
"bietet leistungsstarke Funktionen bei gleichzeitiger Beibehaltung einer schlanken Benutzeroberfläche", ist das nicht widersprüchlich. Ich benutze Fenics und deal.ii und es ist nicht schwer zu installieren oder sogar zu benutzen. Fenics wird mit Binärdateien geliefert, die Sie einfach installieren können. deal.II hat viele Installationsoptionen wie über Linuxbrew, Homebrew, Candi usw. Ich würde empfehlen, eine auszuwählen und sie gut zu lernen. Es wird sich gut auszahlen, wenn Sie die anfängliche Lernkurve überqueren. Ich benutze Fenics für kleine Probleme, teste schnell eine Idee und auch für etwas Unterricht. Für größere Probleme, paralleles Rechnen, bevorzuge ich deal.II. Beide haben eine gute Dokumentation.
cfdlab
1
@PraveenChandrashekar: Leistungsstarke Funktionen und schlanke Oberfläche sind absolut NICHT widersprüchlich. Schauen Sie sich zum Beispiel libigl, boost oder Numpy an. Ja, Fenics scheint einfach zu bedienen zu sein, aber es wäre umständlich, es beispielsweise in eine vorhandene Anwendung zu integrieren. Stellen Sie sich vor, Sie haben ein kleines Spiel, in dem Sie einen Echtzeit-FEM-Code integrieren müssen (nur als Beispiel).
Michael
2
Ich stimme @PraveenChandrashekar zu, aber darüber hinaus glaube ich, dass die gestellte Frage nicht zu beantworten ist. Zumindest müssen Sie ein Beispiel für eine PDE angeben, die Sie mit FEM lösen möchten, und welche Funktionen eine "leichte" Bibliothek bereitstellen soll, um Ihnen dabei zu helfen.
Bill Greene
1
Ein einfaches, das mir in den Sinn kommt, ist SfePy . Ich lade es herunter und es ist 7 MB groß . Ich habe auch Hermes überprüft und es ist 10 MB, ich habe es zwar nicht ausprobiert (aber ich habe Agros 2D ausprobiert). Hier gibt es weitere Optionen: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Antworten:

10

Ich habe in Python 2.7 eine leichtgewichtige Finite-Elemente-Bibliothek entwickelt, die die Leistung von NumPy-Arrays und SciPy-Matrizen mit geringer Dichte nutzt. Die allgemeine Idee ist, dass bei einem Netz und einem finiten Element mehr oder weniger eine Eins-zu-Eins-Entsprechung zwischen der bilinearen Form und einer (spärlichen) Matrix besteht. Der Benutzer kann dann die resultierende Matrix verwenden, wie er es für richtig hält.

Lassen Sie mich ein kanonisches Beispiel vorstellen, in dem wir die Poisson-Gleichung in einem Einheitsquadrat mit einer Einheitsladung lösen.

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

Andere Kommentare:

  • Mein Ziel ist es, strenge Konvergenz-Unit-Tests zu schreiben, um beispielsweise zu überprüfen, ob theoretische Konvergenzraten in den jeweiligen Normen erhalten werden. Tests werden bei jeder Änderung automatisch ausgeführt.
  • Die Implementierung neuer Elemente ist recht einfach.

Sie finden das Projekt in GitHub .

Die Python 3-Version des Codes finden Sie hier .

knl
quelle
4

Ich denke, Sie haben einige Verwirrung. PETSc spielt nicht in der gleichen Liga wie Fenics, Libmesh, Moose usw. Tatsächlich verwenden alle diese (Schwergewichts-) Pakete PETSc für die lineare Algebra.

IMHO PETSc ist so leicht wie möglich. Es sind lediglich C / Fortran-Compiler und Python erforderlich (wird nur für die Konfiguration verwendet), und Sie können die Bibliothek in weniger als 5 Minuten auf Ihrem Laptop erstellen. Der komplizierteste Teil eines FE-Codes ist das parallele Zusammensetzen und Lösen, und PETSc kümmert sich um beides. Der Rest (z. B. Berechnungen auf Elementebene) ist ziemlich einfach.

Trillinos, OTOH ist viel mehr als ein lineares Algebra-Framework, z. B. Aztec (linearer Löser), von dem Sie erwähnen, dass es Teil davon ist. In gewisser Weise kann Aztec in Trillinos mit PETSc verglichen werden.

stali
quelle
1
Was genau meinen Sie in diesem Fall mit "Parallelmontage"? Nur die Kommunikation der Matrix / Vektor-Elemente, oder gibt es mehr? Ich habe das Handbuch halb gründlich gelesen, aber nicht viel über die Baugruppe gefunden (abgesehen von der Kommunikation im linearen Löser) (Handbuch: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael
4

Ich kann Nutils empfehlen .

nutils erfüllt mindestens einige Ihrer "leichten" Anforderungen.

  • Es ist reines Python und einfach zu installieren, da es nur von den Standard-Python-Bibliotheken numpy , scipy und matplotlib abhängt
  • und ist daher gut für Interoperationen geeignet. Zumindest behaupten die Entwickler das

"Exponierte Objekte sind vom nativen Python-Typ oder ermöglichen eine einfache Konvertierung, um Tools von Drittanbietern zu nutzen."

Jan.
quelle
Dies ist ein sehr interessantes Projekt! Ich war mir dessen nicht bewusst und die Ziele scheinen meinen ziemlich ähnlich zu sein. Sie haben sicherlich einige schöne Demo-Videos ...
Knl