MMS: 2次元弾性体
理論:答えを先に決めてコードを試す
概要
自分で書いた有限要素法のコードが正しいか、どう確かめればいいですか?厳密解のある問題は少ないですよね。
そこで製造解法(MMS)を使う。答えになる変位を先に好きに決めて、それが成り立つように体積力を逆算する。するとどんな形でも厳密解のある問題が作れる。あとはメッシュを細かくしたとき、誤差が理論どおりの速さで減るかを見る。速さ(収束次数)まで一致すれば、式の組み立てから数値積分、境界条件まで、コードのほとんどが正しいと言える。実際に自作のコードで確かめ、わざとバグを入れてどう見えるかも試してみよう。
製造解と体積力
単位正方形、平面応力、ヤング率1、ポアソン比0.3。体積力 $\mathbf{b}$ は数式処理(sympy)で導いた。境界はすべて製造解の変位を与える。
理論の収束次数
$p$ は要素の次数(Q4は1、Q8は2)。$p_{obs}$ は分割を2倍にしたときの誤差の比から求める観測次数。
『答えを作る』という逆転の発想
製造解法の考え方は1980年代から使われていたが、コード検証の方法として広めたのは、Roache や、アメリカのサンディア国立研究所の Salari と Knupp らだ。2000年前後の報告書や論文で、製造解を使って収束次数を確かめる手順を整理し、『次数が合えば、次数に影響するすべての誤りがないと言える』と示した。厳密解を探すのではなく作るという逆転の発想で、どんな方程式やコードにも使えるようになった。
計算例:自作コードの収束
正しいコード
| 要素・分割 | 変位誤差 L2 | 次数 | 勾配誤差 H1 | 次数 |
|---|---|---|---|---|
| Q4, 8 | 2.25e-3 | 2.04 | 7.74e-2 | 0.99 |
| Q4, 16 | 5.58e-4 | 2.01 | 3.88e-2 | 1.00 |
| Q4, 32 | 1.39e-4 | 2.00 | 1.94e-2 | 1.00 |
| Q4, 64 | 3.48e-5 | 2.00 | 9.70e-3 | 1.00 |
| Q8, 8 | 1.41e-4 | 2.93 | 7.37e-3 | 2.00 |
| Q8, 16 | 1.78e-5 | 2.99 | 1.85e-3 | 2.00 |
| Q8, 32 | 2.23e-6 | 3.00 | 4.62e-4 | 2.00 |
バグを仕込んだコード
| 要素・分割 | 変位誤差 L2 | 次数 |
|---|---|---|
| Q4・ν誤り, 8 | 2.55e-3 | 1.88 |
| Q4・ν誤り, 16 | 1.22e-3 | 1.06 |
| Q4・ν誤り, 32 | 1.07e-3 | 0.19 |
| Q4・ν誤り, 64 | 1.06e-3 | 0.02 |
| Q8・中点誤り, 8 | 4.42e-4 | 2.23 |
| Q8・中点誤り, 16 | 1.05e-4 | 2.08 |
| Q8・中点誤り, 32 | 2.56e-5 | 2.03 |
ポアソン比のバグは、8分割までだと次数が1.9で、正常に見えますね。
粗いメッシュでは離散化の誤差の方が大きいので、バグによる小さなずれが隠れてしまう。メッシュを細かくして離散化の誤差が小さくなると、バグによるずれ1.1×10⁻³がそのまま残り、次数が0に落ちる。だから少なくとも4段階の分割で、次数が理論値に落ち着くことを確かめる必要がある。Q8の中点のバグはもっと見つけにくい。誤差は小さいままで、次数だけが3から2に下がる。境界の値を直線でつないだために、2次要素の力が境界で生かされていないのだ。誤差の大きさではなく次数を見るMMSだからこそ見つかるバグだ。
MMSの進め方
- すべての項(ひずみの各成分、境界)が効くように、なめらかで非自明な製造解を選ぶ。
- 体積力は数式処理で導き、手計算のミスを避ける。
- 分割を2倍ずつ4段階以上変え、観測次数を表にする。
- 変位(L2)と勾配(H1)の両方の次数を確かめる。
- 誤差の積分は十分な点数のガウス積分で行い、積分誤差を混ぜない。
「ベンチマークは合ったのに」
ある研究室のコードは、いくつかのベンチマークで参照値と1%以内で一致していたため、正しいと考えられていた。MMSで調べると、応力の誤差の次数が理論値より0.5ほど低かった。原因は、曲がった境界で荷重を積分するときに使う点の数が足りないことだった。ベンチマークの参照値との比較は、誤差がある程度以下かどうかしか教えてくれないが、MMSの次数は、どこかに誤りがあることを敏感に示す。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 分割が2〜3段階だけ | バグが隠れる | 4段階以上 |
| 誤差の大きさだけ見る | 次数の低下を見逃す | 観測次数を計算 |
| 製造解が単純すぎる | 一部の項が試されない | 全成分が効く関数 |
| 体積力を手で導出 | 式の誤りが混ざる | 数式処理を使う |
| 誤差の積分点が少ない | 次数を誤る | 高次のガウス積分 |
関連する内容も知りたいです。
関連するページはMMSの概要、MMS:2次元熱伝導、MMSの収束次数、コード検証、NAFEMS LE1が参考になる。
関連トピック
なった
詳しく
報告