Ci sono pacchetti FEM “leggeri” in giro?


9

Fondamentalmente, la FEM sembra essere un problema praticamente "risolto". Esistono numerosi potenti framework, come Trilinos, PETSc, FEniCS, Libmesh o MOOSE.

Una cosa che hanno in comune: sono estremamente "pesanti". Innanzitutto, l'installazione è normalmente molto dolorosa. In secondo luogo, la loro interfaccia / API è spessa e pesante: devi tradurre tutta la tua idea nel pensiero della rispettiva libreria. Ciò significa anche che l'interoperabilità e l'estensione dei requisiti speciali o del codice esistente sono difficili.

Altri progetti come (esempi casuali) Boost, LibIGL, Aztec (risolutore lineare), Eigen o CGAL dimostrano che è assolutamente possibile scrivere potenti librerie che si integrano perfettamente nel codice C ++ o Python, con un'interfaccia molto snella e pulita, senza necessità di installazione di un quadro super pesante.

Esiste un pacchetto davvero leggero per FEM? Non sto cercando il risolutore semplice e automagico: sto cercando una libreria che offra potenti funzioni pur mantenendo un'interfaccia snella, l'interoperabilità con le strutture di dati comuni (ad esempio C ++ STL) e un'installazione leggera (intestazione solo per esempio).


1
Stai chiedendo informazioni sulle librerie FEM o sulle applicazioni FEM?
Nicoguaro

2
"offre potenti funzioni pur mantenendo un'interfaccia snella", non è un po 'contraddittorio. Uso Fenics e deal.ii e non è difficile da installare o da utilizzare. Fenics viene fornito con file binari che è possibile installare facilmente. deal.II ha molte opzioni di installazione come via Linuxbrew, Homebrew, Candi, ecc. Consiglierei di sceglierne una e di impararla bene. Pagherà bene una volta attraversata la curva di apprendimento iniziale. Uso Fenics per piccoli problemi, testando rapidamente qualche idea e anche per insegnare. Per problemi più grandi, il calcolo parallelo, preferisco deal.II. Entrambi hanno una buona documentazione.
cfdlab,

1
@PraveenChandrashekar: potenti funzioni e interfaccia snella NON sono assolutamente contraddittorie. Dai un'occhiata a libigl, boost o Numpy per esempio. Sì, Fenics sembra facile da usare, ma sarebbe ingombrante integrarlo ad esempio in un'applicazione esistente. Immagina di avere un piccolo gioco in cui è necessario integrare un codice FEM in tempo reale (solo come esempio).
Michael,

2
Sono d'accordo con @PraveenChandrashekar ma oltre a ciò, credo che la domanda, come posta, sia senza risposta. Come minimo, è necessario fornire un esempio di un PDE che si desidera risolvere con FEM e quali funzionalità si desidera fornire una libreria "leggera" per aiutarti a farlo.
Bill Greene,

1
Uno semplice che mi viene in mente è SfePy , lo scarico e costa 7 MB. Ho anche controllato Hermes , ed è 10 MB, ma non l'ho provato (ma ho provato Agros 2D). Ci sono più opzioni qui: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Risposte:


10

Ho sviluppato una libreria di elementi finiti leggeri in Python 2.7 sfruttando la potenza degli array NumPy e delle matrici sparse di SciPy. L'idea generale è che, data una mesh e un elemento finito, si ha più o meno una corrispondenza uno a uno tra la forma bilineare e una matrice (sparsa). L'utente può quindi utilizzare la matrice risultante come ritiene opportuno.

Consentitemi di presentare un esempio canonico in cui risolviamo l'equazione di Poisson in un quadrato unitario con un carico unitario.

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

Altri commenti:

  • Il mio obiettivo è scrivere test di unità di convergenza rigorosi verificando, ad esempio, che si ottengano tassi di convergenza teorici nelle rispettive norme. I test vengono eseguiti automaticamente su ogni modifica.
  • L'implementazione di nuovi elementi è abbastanza semplice.

Puoi trovare il progetto in GitHub .

La versione di Python 3 del codice è disponibile qui .


4

Penso che tu abbia un po 'di confusione. PETSc non è nella stessa lega di Fenics, Libmesh, Moose ecc. In effetti, tutti questi pacchetti (pesanti) usano PETSc per l'algebra lineare.

IMHO PETSc è il più leggero possibile. Richiede solo compilatori C / Fortran e Python (utilizzato solo per la configurazione) e puoi creare la libreria in meno di 5 minuti sul tuo laptop. Inoltre, la parte più complicata di un codice FE è l'assemblaggio e la risoluzione paralleli e PETSc si occupa di entrambi. Il resto (ad es. Calcoli a livello di elemento) è piuttosto semplice.

Trillinos, OTOH è molto più di una struttura algebrica lineare, ad esempio Aztec (solutore lineare) di cui parli fa parte. In un certo senso, Azteco in Trillinos può essere paragonato a PETSc.


1
Cosa intendi esattamente con "montaggio parallelo" in quel caso? Solo la comunicazione degli elementi matrice / vettoriale o c'è di più? Ho letto il manuale semi-thorougly, ma non ho trovato molto sull'assemblaggio (oltre alla comunicazione nel solutore lineare) (Manuale: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael

4

Posso raccomandare nutils .

nutils soddisfa almeno alcuni dei requisiti "leggeri".

  • è puro Python e facile da installare poiché dipende solo dalle librerie Python standard numpy , scipy e matplotlib
  • e, quindi, è adatto per le interoperazioni. Almeno gli sviluppatori lo affermano

"Gli oggetti esposti sono di tipo Python nativo o consentono una facile conversione per sfruttare strumenti di terze parti."


Questo è un progetto molto interessante! Non ne ero a conoscenza e gli obiettivi sembrano essere abbastanza simili a quelli dei miei. Hanno sicuramente dei bei video dimostrativi ...
Knl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.