Есть ли какие-нибудь «легкие» пакеты FEM вокруг?

9

По сути, FEM кажется проблемой, которая в значительной степени «решена». Существует множество мощных сред, таких как Trilinos, PETSc, FEniCS, Libmesh или MOOSE.

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

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

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

Майкл
источник
1
Вы спрашиваете о библиотеках FEM или приложениях FEM?
Никогуаро
2
«предлагает мощные функции при сохранении скудного интерфейса», это не противоречит. Я использую Fenics и deal.ii, и его не сложно установить или даже использовать. Fenics поставляется с двоичными файлами, которые вы можете легко установить. В deal.II есть много вариантов установки, например, через Linuxbrew, Homebrew, Candi и т. д. Я бы порекомендовал выбрать один и хорошо его изучить. Он хорошо окупится, когда вы пересечете начальную кривую обучения. Я использую Fenics для небольших задач, быстро проверяя некоторые идеи, а также для обучения. Для больших задач, параллельных вычислений, я предпочитаю сделку. II. Оба имеют хорошую документацию.
cfdlab
1
@PraveenChandrashekar: Мощные функции и простой интерфейс абсолютно НЕ противоречивы. Посмотрите, например, на libigl, boost или Numpy. Да, Fenics кажется простым в использовании, но было бы неудобно интегрировать, например, в существующее приложение. Представьте, что у вас есть небольшая игра, в которой вам нужно интегрировать код FEM в реальном времени (просто в качестве примера).
Майкл
2
Я согласен с @PraveenChandrashekar, но, кроме того, я считаю, что поставленный вопрос не подлежит обсуждению. Как минимум, вам нужно предоставить пример PDE, который вы хотите решить с помощью FEM, и какую функциональность вы хотите, чтобы «легковесная» библиотека предоставила вам такую ​​возможность.
Билл Грин
1
Простым, который приходит мне в голову, является SfePy , я загружаю его, и это 7 МБ. Я также проверил Гермес , и это 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 можно найти здесь .

KNL
источник
4

Я думаю, у вас есть некоторая путаница. PETSc не относится к той же категории, что и Fenics, Libmesh, Moose и т. Д. Фактически, все эти (тяжеловесные) пакеты используют PETSc для линейной алгебры.

ИМХО PETSc настолько легок, насколько вы можете получить. Это просто требует компиляторов C / Fortran и Python (используется только для конфигурации), и вы можете собрать библиотеку менее чем за 5 минут на своем ноутбуке. Кроме того, наиболее сложной частью кода FE является параллельная сборка и решение, и PETSc заботится об обоих. Остальное (например, расчеты на уровне элементов) довольно просто.

Trillinos, OTOH - это гораздо больше, чем просто линейная алгебраическая структура, например, Aztec (линейный решатель), который вы упоминаете, является ее частью. В некотором смысле Aztec в Триллино можно сравнить с PETSc.

Stali
источник
1
Что именно вы подразумеваете под «параллельной сборкой» в этом случае? Просто связь элементов матрицы / вектора, или это еще не все? Я прочитал руководство почти полукругло, но я не нашел много информации о сборке (кроме связи в линейном солвере) (Руководство: mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Майкл
4

Я могу порекомендовать nutils .

Nutils отвечает как минимум нескольким вашим «легким» требованиям.

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

«Открытые объекты имеют собственный тип Python или позволяют легко конвертировать для использования сторонних инструментов».

январь
источник
Это очень интересный проект! Я не знал об этом, и цели, кажется, очень похожи на мои. У них наверняка есть несколько хороших демо-видео ...
knl