「軽量」のFEMパッケージはありますか?


9

基本的に、FEMはかなり「解決」された問題のようです。Trilinos、PETSc、FEniCS、Libmesh、MOOSEなど、数多くの強力なフレームワークが存在します。

彼らが共通していることの1つは、それらが非常に「重い」ことです。まず、インストールは通常非常に骨の折れる作業です。第二に、それらのインターフェース/ 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 2016年

1
@PraveenChandrashekar:強力な機能と無駄のないインターフェースは全く矛盾しません。たとえば、libigl、boost、またはNumpyを調べてください。はい、Fenicsは使いやすいように見えますが、たとえば既存のアプリケーションに統合するのは面倒です。(例として)リアルタイムFEMコードを統合する必要がある小さなゲームがあるとします。
マイケル

2
私は@PraveenChandrashekarに同意しますが、それを超えると、提起された質問には答えられないと思います。少なくとも、FEMで解決するPDEの例と、そのために「軽量」ライブラリに提供する機能を提供する必要があります。
Bill Greene

1
頭に浮かぶのはSfePyです。ダウンロードすると7 MBになります。私はHermesもチェックしました。それは10 MBですが、まだ試していません(ただし、Agros 2Dを試しました)。ここにはさらに多くのオプションがあります:en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

回答:


10

私はNumPy配列とSciPy疎行列の力を利用するPython 2.7で軽量の有限要素ライブラリを開発しています。一般的な考え方は、メッシュと有限要素が与えられた場合、双線形形式と(スパース)行列の間に1対1の対応があるということです。次に、ユーザーは結果として得られた行列を、自分が適切だと思うときに使用できます。

単位負荷のある単位正方形でポアソン方程式を解く標準的な例を紹介します。

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(線形ソルバー)をはるかに超えています。いくつかの点で、トリリノスのアステカはPETScと比較できます。


1
その場合、「並列アセンブリ」とはどういう意味ですか?行列/ベクトル要素の通信だけですか、それともそれ以上ですか?マニュアルを半熟読しましたが、アセンブリについてはあまりわかりませんでした(線形ソルバーでの通信以外)(マニュアル:mcs.anl.gov/petsc/petsc-current/docs/manual.pdf
Michael

4

私はnutilsを推薦できます。

nutilsは、少なくともいくつかの「軽量」要件を満たしています。

  • 純粋なpythonであり、標準のPythonライブラリnumpyscipy、およびmatplotlibにのみ依存しているため、簡単にインストールできます。
  • したがって、相互運用に適しています。少なくとも開発者はそれを主張します

「公開されたオブジェクトはネイティブのPythonタイプであるか、サードパーティのツールを活用するために簡単に変換できます。」


これは非常に興味深いプロジェクトです!私はそれを知らなかったし、目標は私のものと非常に似ているようです。彼らは確かにいくつかの素晴らしいデモビデオを持っています...
knl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.