“가벼운”FEM 패키지가 있습니까?


9

기본적으로 FEM은 거의 "해결 된"문제인 것 같습니다. Trilinos, PETSc, FEniCS, Libmesh 또는 MOOSE와 같은 수많은 강력한 프레임 워크가 존재합니다.

그들이 공통적으로 가지고있는 것 : 그들은 매우 "무거운"것입니다. 첫째, 설치는 일반적으로 매우 고통 스럽습니다. 둘째, 인터페이스 / API가 두껍고 무겁습니다. 전체 아이디어를 해당 라이브러리의 사고로 변환해야합니다. 또한 특별한 요구 사항이나 기존 코드에 대한 상호 운용성 및 확장 성이 어렵다는 것을 의미합니다.

Boost, LibIGL, Aztec (선형 솔버), Eigen 또는 CGAL과 같은 다른 프로젝트는 설치가 필요없이 매우 가볍고 깔끔한 인터페이스로 C ++ 또는 Python 코드에 완벽하게 통합되는 강력한 라이브러리를 작성할 수 있음을 보여줍니다. 초강력 프레임 워크

FEM을위한 정말 가벼운 패키지가 있습니까? 쉽고 자동적 인 솔버를 찾고 있지 않습니다. 린 인터페이스를 유지하면서 일반적인 데이터 구조 (예 : C ++ STL)와의 상호 운용성 및 경량 설치 (예 : 헤더 만)를 유지하면서 강력한 기능을 제공하는 라이브러리를 찾고 있습니다.


1
FEM 라이브러리 또는 FEM 응용 프로그램에 대해 질문하고 있습니까?
nicoguaro

2
"린 (lean) 인터페이스를 유지하면서 강력한 기능을 제공합니다"라는 것이 모순이 아닙니다. 나는 Fenics와 deal.ii를 사용하고 설치하거나 사용하기도 어렵지 않습니다. Fenics는 쉽게 설치할 수있는 바이너리를 제공합니다. deal.II에는 Linuxbrew, Homebrew, Candi 등을 통해 많은 설치 옵션이 있습니다. 하나를 선택하고 잘 배우는 것이 좋습니다. 초기 학습 곡선을 통과하면 잘 보상됩니다. 나는 작은 문제에 대해 Fenics를 사용하고, 몇 가지 아이디어를 빠르게 테스트하고, 일부 교육에도 사용합니다. 더 큰 문제, 병렬 컴퓨팅의 경우 거래를 선호합니다 .II. 둘 다 좋은 문서가 있습니다.
cfdlab

1
@PraveenChandrashekar : 강력한 기능과 린 (lean) 인터페이스는 절대적으로 모순되지 않습니다. 예를 들어 libigl, boost 또는 Numpy를 살펴보십시오. 예, Fenics는 사용하기 쉽지만 기존 애플리케이션에 통합하는 것은 번거로울 것입니다. 실시간 FEM 코드를 통합해야하는 작은 게임이 있다고 상상해보십시오 (예를 들어).
Michael

2
나는 @PraveenChandrashekar에 동의하지만 그 너머에는 그 질문에 답할 수 없다고 생각합니다. 최소한 FEM으로 해결하려는 PDE의 예와이를 수행하기 위해 "경량"라이브러리를 제공하려는 기능을 제공해야합니다.
Bill Greene

1
내 마음에 오는 간단한 것은 SfePy 이며 다운로드하여 7MB입니다. 나는 또한 헤르메스 를 확인 했으며 10MB이지만 시도하지는 않았습니다 (그러나 Agros 2D를 시도했습니다). 여기에 더 많은 옵션이 있습니다 : en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

답변:


10

NumPy 배열과 SciPy 희소 행렬의 힘을 활용하여 Python 2.7의 경량 유한 요소 라이브러리를 개발했습니다. 일반적인 아이디어는 메쉬와 유한 요소가 주어지면 이중선 형태와 (스파 스) 행렬간에 일대일 대응 관계가 있다는 것입니다. 그런 다음 사용자는 적합하다고 생각되는 결과 행렬을 사용할 수 있습니다.

Poisson 방정식을 단위 하중과 함께 단위 사각형으로 푸는 정규 예를 제시하겠습니다.

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는 두 가지를 모두 처리합니다. 나머지 (예 : 요소 레벨 계산)는 다소 간단합니다.

Trillinos, OTOH는 선형 대수 프레임 워크 그 이상입니다. 예를 들어 언급 한 Aztec (선형 솔버)은 그 일부입니다. 어떤 방식으로 Trillinos의 Aztec을 PETSc와 비교할 수 있습니다.


1
이 경우 "병렬 조립"이란 정확히 무엇을 의미합니까? 행렬 / 벡터 요소의 통신일까요? 아니면 더 있습니까? 나는 매뉴얼을 반쯤 읽었지만, 선형 솔버에서 의사 소통을 제외하고는 어셈블리에 대해 많이 찾지 못했다 (Manual : mcs.anl.gov/petsc/petsc-current/docs/manual.pdf )
Michael

4

나는 nutils 를 추천 할 수있다 .

nutils 는 최소한 "경량"요구 사항을 충족합니다.

  • 순수 파이썬이며 표준 파이썬 라이브러리 numpy , scipymatplotlib 에만 의존하기 때문에 설치가 쉽습니다.
  • 따라서 상호 운용에 적합합니다. 적어도 개발자들은

"노출 된 객체는 기본 파이썬 유형이거나 타사 도구를 활용하기 위해 쉽게 변환 할 수 있습니다."


이것은 매우 흥미로운 프로젝트입니다! 나는 그것을 알지 못했고 목표는 내 목표와 매우 비슷해 보입니다. 그들은 분명히 멋진 데모 비디오를 가지고 있습니다 ...
knl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.