Чи існують якісь "легкі" пакети FEM?


9

В основному FEM, здається, є проблемою, яка в значній мірі "вирішена". Існує безліч потужних рамок, таких як Trilinos, PETSc, FEniCS, Libmesh або MOOSE.

У них є одне спільне: вони надзвичайно «важкі». По-перше, установка зазвичай дуже болісна. По-друге, їх інтерфейс / API товстий і важкий - вам потрібно перекласти всю свою ідею в мислення відповідної бібліотеки. Це також означає, що сумісність та розширюваність спеціальних вимог або існуючого коду є важкою.

Інші проекти, такі як (випадкові приклади) Boost, LibIGL, Aztec (лінійний вирішальник), Eigen або CGAL, демонструють, що абсолютно можливо писати потужні бібліотеки, які легко інтегруються в C ++ або Python-код, з дуже легким і чистим інтерфейсом, без необхідності встановлення надважкої структури.

Чи є дійсно легкий пакет для FEM? Я не шукаю простого, автоматичного рішення, я шукаю бібліотеку, яка пропонує потужні функції, зберігаючи нетривалий інтерфейс, сумісність із загальними структурами даних (наприклад, C ++ STL) та легку установку (заголовок лише для прикладу).


1
Ви питаєте про бібліотеки FEM або програми FEM?
nicoguaro

2
"пропонує потужні функції при збереженні бережливого інтерфейсу", це не суперечливо. Я використовую Fenics і deal.ii, і його не важко встановити або навіть використовувати. Fenics поставляється з бінарними файлами, які ви можете легко встановити. deal.II має безліч варіантів встановлення, наприклад, через Linuxbrew, Homebrew, Candi тощо. Я рекомендував би вибрати один і добре вивчити його. Це добре виграє, як тільки ви перетнете початкову криву навчання. Я використовую Fenics для невеликих проблем, швидко тестую якусь ідею, а також для викладання. Для більших проблем, паралельних обчислень, я віддаю перевагу deal.II. Обидва мають гарну документацію.
cfdlab

1
@PraveenChandrashekar: Потужні функції та слабкий інтерфейс абсолютно НЕ суперечливі. Огляньте, наприклад, libigl, boost або Numpy. Так, Fenics здається простим у використанні, але інтегрувати його, наприклад, у існуючий додаток було б громіздко. Уявіть, у вас є маленька гра, де вам потрібно інтегрувати FEM-код у реальному часі (лише як приклад).
Майкл

2
Я погоджуюся з @PraveenChandrashekar, але поза тим, я вважаю, що питання, як це ставиться, не відповідає. Як мінімум, вам потрібно навести приклад PDE, який ви хочете вирішити за допомогою FEM, і яку функціональність ви хочете надати "легкій" бібліотеці, яка допоможе вам це зробити.
Білл Грін

1
Простий, який мені спадає на думку, це SfePy , я завантажую його і він становить 7 Мб. Я також перевірив Hermes , і це 10 Мб, я не пробував, хоча (але я спробував Agros 2D). Тут є інші варіанти: en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Відповіді:


10

Я розробляв легку бібліотеку з кінцевими елементами в Python 2.7, використовуючи потужність масивів NumPy та розріджених матриць SciPy. Загальна думка полягає в тому, що, даючи сітчастий і кінцевий елемент, у вас є більш-менш однакова відповідність між білінеарною формою та (розрідженою) матрицею. Потім користувач може використовувати отриману матрицю так, як він вважає за потрібне.

Дозвольте представити канонічний приклад, коли ми розв'язуємо рівняння Пуассона в одиничному квадраті з одиничним навантаженням.

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

Інші коментарі:

  • Моя мета - написати суворі тести одиничної конвергенції, перевіряючи, наприклад, чи є теоретичні показники конвергенції у відповідних нормах. Тести запускаються автоматично при кожній зміні.
  • Реалізувати нові елементи досить просто.

Ви можете знайти проект у GitHub .

Версію коду Python 3 можна знайти тут .


4

Я думаю, у вас є певна плутанина. PETSc не в тій же лізі, що і Fenics, Libmesh, Moose тощо. Насправді всі ці (важкі) пакети використовують PETSc для лінійної алгебри.

IMHO PETSc настільки ж легкий, як ви можете отримати. Просто потрібні компілятори C / Fortran і Python (використовуються лише для конфігурації), і ви можете побудувати бібліотеку за 5 хвилин на своєму ноутбуці. Крім того, найскладнішою частиною коду FE є паралельна збірка та вирішення, і PETSc піклується про обох. Решта (наприклад, обчислення рівня елементів) є досить простою.

Триллінос, OTOH - це набагато більше, ніж лінійна рамка алгебри, наприклад, ацтек (лінійний сольвер), який ви згадуєте, є його частиною. Деяким чином ацтеків у Трилліносі можна порівняти з PETSc.


1
Що саме ви маєте на увазі під "паралельною збіркою" у цьому випадку? Просто зв’язок елементів матриці / вектора, чи є більше? Я прочитав керівництво напів-thorougly, але я не знайшов багато про збірку (крім зв'язку в лінійному вирішувач) (Керівництво: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael

4

Я можу порекомендувати нутіли .

nutils відповідає принаймні декільком вашим "легким" вимогам.

  • це чистий python і простий в установці, оскільки він залежить лише від стандартних бібліотек Python numpy , scipy та matplotlib
  • і, таким чином, він добре підходить для взаємодії. Принаймні, розробники цього стверджують

"Експоновані об'єкти мають нативний тип python або дозволяють легко перетворити на інструменти сторонніх інструментів."


Це дуже цікавий проект! Я про це не усвідомлював, і цілі, схоже, цілком схожі на мої. У них, безумовно, є кілька хороших демо-відео ...
knl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.