Apakah ada paket FEM "ringan" di sekitar?

9

Pada dasarnya, FEM tampaknya menjadi masalah yang cukup banyak "diselesaikan". Ada banyak kerangka kerja yang kuat yang ada, seperti Trilinos, PETSc, FEniCS, Libmesh atau MOOSE.

Satu hal yang mereka miliki bersama: Mereka sangat "berat". Pertama, instalasi biasanya sangat menyakitkan. Kedua, antarmuka / API mereka tebal dan berat - Anda harus menerjemahkan seluruh ide Anda ke dalam pemikiran perpustakaan masing-masing. Itu juga berarti, interoperabilitas dan perpanjangan untuk persyaratan khusus atau kode yang ada sulit.

Proyek lain seperti (contoh acak) Boost, LibIGL, Aztec (linear solver), Eigen atau CGAL menunjukkan bahwa sangat mungkin untuk menulis perpustakaan yang kuat yang diintegrasikan secara mulus ke dalam kode C ++ atau Python, dengan antarmuka yang sangat ramping dan bersih, tanpa perlu instalasi dari kerangka kerja super berat.

Apakah ada paket yang sangat ringan untuk FEM? Saya tidak mencari solver automagic yang mudah - Saya mencari perpustakaan yang menawarkan fungsi-fungsi yang kuat sambil mempertahankan antarmuka yang ramping, interoperabilitas dengan struktur data umum (C ++ STL misalnya) dan instalasi ringan (contohnya header saja).

Michael
sumber
1
Apakah Anda bertanya tentang perpustakaan FEM atau aplikasi FEM?
nicoguaro
2
"Menawarkan fungsi yang kuat sambil mempertahankan antarmuka yang ramping", bukankah ini sedikit kontradiktif. Saya menggunakan Fenics dan deal.ii dan tidak sulit untuk menginstal atau bahkan untuk digunakan. Fenics hadir dengan binari yang dapat Anda instal dengan mudah. deal.II memiliki banyak opsi instalasi seperti melalui Linuxbrew, Homebrew, Candi, dll. Saya akan merekomendasikan memilih satu dan mempelajarinya dengan baik. Ini akan memberikan hasil dengan baik setelah Anda melewati kurva pembelajaran awal. Saya menggunakan Fenics untuk masalah kecil, dengan cepat menguji beberapa ide dan juga untuk beberapa pengajaran. Untuk masalah yang lebih besar, komputasi paralel, saya lebih suka deal.II. Keduanya memiliki dokumentasi yang baik.
cfdlab
1
@PraveenChandrashekar: Fungsi yang kuat dan antarmuka yang ramping benar-benar BUKAN bertentangan. Lihat saja libigl, boost atau Numpy misalnya. Ya, Fenics tampaknya mudah digunakan, tetapi akan sulit untuk mengintegrasikan misalnya dalam aplikasi yang sudah ada. Bayangkan Anda memiliki permainan kecil di mana Anda perlu mengintegrasikan kode FEM waktu nyata (hanya sebagai contoh).
Michael
2
Saya setuju dengan @PraveenChandrashekar tetapi lebih dari itu, saya yakin pertanyaannya, seperti yang diajukan, tidak dapat dijawab. Minimal, Anda perlu memberikan contoh PDE yang ingin Anda selesaikan dengan FEM dan fungsionalitas apa yang Anda inginkan dari pustaka "ringan" untuk membantu Anda melakukannya.
Bill Greene
1
Yang sederhana yang muncul di benak saya adalah SfePy , saya mengunduhnya dan 7 MB. Saya juga memeriksa Hermes , dan ini 10 MB, saya belum mencobanya (tapi saya sudah mencoba Agros 2D). Ada lebih banyak opsi di sini: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Jawaban:

10

Saya telah mengembangkan pustaka elemen hingga yang ringan di Python 2.7 memanfaatkan kekuatan array NumPy dan matriks jarang SciPy. Gagasan umum adalah bahwa dengan elemen mesh dan elemen hingga, Anda memiliki korespondensi satu-ke-satu antara atau bentuk bilinear dan matriks (jarang). Pengguna kemudian dapat menggunakan matriks yang dihasilkan sesuai keinginannya.

Izinkan saya menyajikan contoh kanonik di mana kita memecahkan persamaan Poisson dalam satuan kuadrat dengan pemuatan satuan.

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

Komentar lain:

  • Tujuan saya adalah untuk menulis pengujian unit konvergensi yang ketat misalnya, bahwa tingkat konvergensi teoritis dalam norma masing-masing diperoleh. Tes dijalankan secara otomatis pada setiap perubahan.
  • Menerapkan elemen baru cukup mudah.

Anda dapat menemukan proyek di GitHub .

Versi kode Python 3 dapat ditemukan di sini .

knl
sumber
4

Saya pikir Anda memiliki beberapa kebingungan. PETSc tidak dalam liga yang sama dengan Fenics, Libmesh, Moose dll. Faktanya, semua paket (kelas berat) ini menggunakan PETSc untuk aljabar linier.

IMHO PETSc sangat ringan yang bisa Anda dapatkan. Itu hanya membutuhkan kompiler C / Fortran dan Python (hanya digunakan untuk konfigurasi) dan Anda dapat membangun perpustakaan di bawah 5 menit pada laptop Anda. Juga, bagian yang paling rumit dari kode FE adalah perakitan paralel dan pecahkan serta PETSc menangani keduanya. Sisanya (misalnya, perhitungan tingkat elemen) agak mudah.

Trillinos, OTOH jauh lebih dari kerangka aljabar linier, misalnya, Aztec (pemecah linear) yang Anda sebutkan adalah bagian darinya. Dalam beberapa hal Aztec di Trillinos dapat dibandingkan dengan PETSc.

stali
sumber
1
Apa sebenarnya yang Anda maksud dengan "perakitan paralel" dalam kasus itu? Hanya komunikasi elemen matriks / vektor, atau ada lagi? Saya membaca manual semi-thorougly, tapi saya tidak menemukan banyak tentang perakitan (selain komunikasi dalam solver linier) (Manual: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael
4

Saya bisa merekomendasikan kacang .

nutils memenuhi setidaknya beberapa persyaratan "ringan" Anda.

  • itu adalah python murni dan mudah dipasang karena hanya bergantung pada pustaka Python standar numpy , scipy , dan matplotlib
  • dan, karenanya, sangat cocok untuk interoperasi. Setidaknya para pengembang mengklaim itu

"Objek yang terpapar adalah tipe python asli atau memungkinkan konversi mudah untuk memanfaatkan alat pihak ketiga."

Jan
sumber
Ini adalah proyek yang sangat menarik! Saya tidak menyadarinya dan tujuannya tampaknya sangat mirip dengan tujuan saya. Mereka pasti memiliki beberapa video demo yang bagus ...
knl