FEniCSプロジェクト
理論:弱形式を書くだけで解ける仕組み
概要
FEniCSは、ほかの有限要素ソフトと使い方がどう違うのですか?
決まったメニューから解析の種類を選ぶのではなく、解きたい方程式の弱形式を自分で書く点だ。例えばポアソン方程式なら、試験関数 v を掛けて部分積分した式を、Pythonで「a = inner(grad(u), grad(v))*dx」「L = f*v*dx」とほぼ数式どおりに書く。FEniCSのフォームコンパイラがこれを要素ごとの計算コードに変換し、DOLFINxが全体の行列を組み立て、PETScで解く。新しい構成則や連成問題でも、弱形式さえ書ければすぐに試せるのが強みで、その分、境界条件の与え方や関数空間の選び方を間違えると、エラーにならずに誤った答えが出ることもある。だから既知解での確認が特に大切になる。
ポアソン方程式の弱形式
u は未知関数、v は試験関数、f は右辺(熱源など)、Ω は領域。右の2行がFEniCS(UFL)での書き方。
北欧の大学から生まれたプロジェクト
FEniCSは2003年ごろ、シカゴ大学とスウェーデンのチャルマース工科大学などの研究者が始め、後にノルウェーのシミュラ研究所などが中心になって発展した。名前の「Ni」は、フェニックス(不死鳥)を思わせる綴りにするために入れたとも言われる。2019年以降は新しい実装のDOLFINxに移行していて、古い版(レガシーDOLFIN)向けのチュートリアルのコードは、そのままでは動かないことがあるので注意が要る。
計算例
表はPython/SciPyで独立に組んだP1三角形FEMの参考計算で、DOLFINxの実行結果ではない。単位正方形を同じ対角線で分割し、3点積分を使用。節点の機械精度での一致はこの特殊な格子・問題に限り、一般の一次要素や領域内の解には保証されない。
例1:チュートリアルの解 u = 1 + x² + 2y²(1次要素、8×8分割)
右辺f = −6、境界に厳密解を与えた特別な一様三角形格子では、節点最大誤差は参考実装で約1.6×10⁻¹⁵。一次要素の内部補間は二次の厳密解と一致しないため、節点だけでなく領域全体の誤差も確認する。
例2:sin(πx)sin(πy) での収束(1次要素)
| 分割 | 未知数 | L2誤差 | 節点の最大誤差 | L2の次数 |
|---|---|---|---|---|
| 8×8 | 49 | 2.04×10⁻² | 1.27×10⁻² | — |
| 16×16 | 225 | 5.20×10⁻³ | 3.20×10⁻³ | 1.97 |
| 32×32 | 961 | 1.31×10⁻³ | 8.03×10⁻⁴ | 1.99 |
分割を2倍にするとL2誤差は約4分の1になり、1次要素の理論どおり2次で収束している。未知数は約4倍ずつ増える。
例1では誤差がほぼゼロなのに、例2では誤差が残ります。例1の確認だけでは足りないのですか?
不足。例1は特殊な格子で節点値がよく一致する問題だ。非多項式の解でも格子を細かくしてL2誤差と勾配誤差を測ろう。滑らかな解・適切な格子と積分・十分な収束のもとでは、一次要素でL2は約2次、勾配は約1次。角の特異性や解の滑らかさ不足では次数が低くても直ちに実装ミスとはいえない。DOLFINxではfem.assemble_scalarとMPI集約でノルムを求め、旧DOLFINのerrornorm APIと混同しない。
始め方の流れ
- condaやDockerでDOLFINxを導入し、公式チュートリアルのポアソン方程式を動かす。
- u = 1 + x² + 2y² で節点誤差が機械精度になることを確かめる。
- 非多項式の解で要素を細かくし、誤差の次数を測る。
- 自分の方程式の弱形式を書き、同じ方法で製造解を使って確かめる。
- 大きな問題はMPIで並列化し、PETScのソルバーと前処理を選ぶ。
「チュートリアルのコードが動かない」
FEniCSで最初につまずきやすいのは、ネット上のコード例の多くが旧版(レガシーDOLFIN、2019年まで)向けに書かれていることだ。DOLFINxではメッシュの作り方、境界条件の指定、関数空間の作り方、解の出力の方法が変わっていて、旧版のコードはそのままでは動かない。公式サイトのDOLFINx用チュートリアルと、使っているバージョンのデモを手本にするのが近道だ。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 旧版のコードをそのまま使う | エラーで動かない | DOLFINxの例を手本に |
| 境界条件の場所の指定ミス | 誤った答えがエラーなしで出る | 既知解で確認 |
| 厳密解を低次で補間 | 誤差を過小評価 | 高次の空間で補間 |
| 節点値だけで比較 | 要素の誤りを見逃す | ノルムで次数を見る |
| 大規模で直接法 | メモリ不足 | 反復法と前処理 |
関連する内容も知りたいです。
関連するページはMMS(製造解法)の概要と手順、MMS収束次数の算出方法、MOOSEフレームワーク、Elmerマルチフィジックスが参考になる。
よくある質問
FEniCSとは何ですか?
偏微分方程式を有限要素法で解くためのオープンソースのライブラリ群です。UFL(Unified Form Language)で弱形式を数式に近い形でPythonに書くと、コンパイラが要素の計算コードを自動生成し、DOLFINx(現行版)が組み立てと求解を行います。新しい方程式や連成問題の試作、研究や教育に広く使われています。
FEniCSで書いたコードが正しいかはどう確かめますか?
用解析解や製造解を使い、境界・領域内の誤差と格子細分化による収束次数を確認します。二次式の節点一致は特定格子の性質で、一般の一次要素で機械精度になる保証はありません。
2次要素にするとどれくらい良くなりますか?
理論上、関数値のL2誤差の次数が2から3に上がります。FEniCSでは関数空間の定義で次数を1から2に変えるだけで切り替えられます。1次要素の例では32×32分割(未知数961個)でL2誤差1.3×10⁻³でしたが、2次要素なら粗いメッシュでも同程度以上の精度が出やすく、同じ精度に必要な未知数を減らせることが多いです。
参考資料・検算の位置づけ
掲載値は本文の仮定に基づく教育用の参考計算。資料は理論・設定の参照先であり、本記事の数値を各ソフトで再現した証明ではない。設計・製造の判断には対象条件での検証が必要。
関連トピック
なった
詳しく
報告