GetFEMによるElliptic Membraneベンチマークテスト#

GetFEMによるElliptic Membraneベンチマークテストというタイトルでお話をさせていただきます。

背景と動機#

まずは、背景について説明させていだきます。 現在、FEABerというプロジェクトに参加しています。 このプロジェクトは複数のオープンソースプロジェクトの FEAコードをベンチマークするプロジェクトです。 ベンチマークテストは The Standard NAFEMS Benchmarks から引用しています。 参加プログラムにはCalculiX, Code-Aster, FrontISTR があります。 この発表ではそれらの結果とGetFEMの結果を比べた途中経過を報告したいと思います。 ベンチマークテストの解析にPythonスクリプトを使用していますが、今回はそれらについても詳細に解説いたします。

問題の説明#

今回対象とした問題は The Standard NAFEMS Benchmarks に LE1 として掲載されている問題です。 圧力を負荷された楕円形状に発生する応力を確認するベンチマークになっています。

モデル図

入力する物性値は次の通りです。

入力した材料物性#

材料物性

入力値

ヤング率

210000 MPa

ポアソン比

0.3

要素種別

平面応力要素

厚さ

0.1 mm

メッシュ作成#

ベンチマークに使用するメッシュパターンは粗いメッシュと細いメッシュの2種類です。 使用した要素は1次要素、2次要素およびそれらの低減要素です。 粗いメッシュと細いメッシュ図は以下の通りです。

粗いメッシュ

これらのメッシュをどのように作成しているかを説明します。 まず、GetFEMとNumPyをインポートして空の2次元メッシュを作成します。

1import getfem as gf
2import numpy as np
3
4mesh = gf.Mesh("empty", 2)

次に幾何変換のオブジェクトを定義します。 GT_QK(2,1) は2次元の1次4角形(quadrangle)幾何変換を表しています。

1gt = gf.GeoTrans("GT_QK(2,1)")

変数 x と変数 y に節点の座標を定義しておき要素の節点番号の構成を定義します。

1mesh.add_convex(gt, [[x[0], x[1], x[3], x[2]], [y[0], y[1], y[3], y[2]]])
2mesh.add_convex(gt, [[x[4], x[5], x[7], x[6]], [y[4], y[5], y[7], y[6]]])
3mesh.add_convex(gt, [[x[8], x[0], x[9], x[3]], [y[8], y[0], y[9], y[3]]])
4mesh.add_convex(gt, [[x[10], x[5], x[8], x[0]], [y[10], y[5], y[8], y[0]]])
5mesh.add_convex(gt, [[x[5], x[10], x[6], x[11]], [y[5], y[10], y[6], y[11]]])
6mesh.add_convex(gt, [[x[5], x[4], x[0], x[1]], [y[5], y[4], y[0], y[1]]])
_images/coarse-quadrilateron-1d.png

荷重の検討#

今回は検討として等価節点荷重の比較を行いました。

1md = gf.Model("real")
2md.add_fem_variable("u", mfu)
3md.add_initialized_fem_data("NeumannData", mfrhs, F)
4md.add_normal_source_term_brick(mim, "u", "NeumannData", OUTER_BOUND)
5# md.add_source_term(mim, "(Reshape(NeumannData,qdim(u),meshdim)*Normal).Test_u", OUTER_BOUND)
6md.assembly()
7RHS = md.rhs()
8print("RHS", RHS)
_images/coarse-quadrilateron-1d-02.png

荷重負荷点

X方向荷重

参照値との相対誤差

Y方向荷重

参照値との相対誤差

P1

0.22539711

0.01%

0.89149999

0.01%

P2

0.70099997

0.00%

1.41638279

0.01%

P3

1.14960289

0.00%

0.73350000

0.00%

P4

0.67400002

0.00%

0.20861721

0.00%

等価節点力の計算方法#

等価節点力は仮想変位 \(\delta u\left(\eta \right)\) と仮想仕事 \(\delta W\) の関係から計算されます。

\[\delta W=ph\int _0^1\delta u\left(\eta \right)d\eta\]

ただし、 \(p\) は分布荷重の値、 \(h\) は要素厚さ \(\eta (0 \leqq \eta \leqq 1)\) は分布荷重が加わる面の接線方向座標とします。

1次要素の場合、変位は次の式で与えられます。

\[\begin{split}\delta u\left(\eta \right)=\left\{N\left(\eta \right)\right\}^T\left\{U\right\}=\begin{Bmatrix}1-\eta &\eta \end{Bmatrix}\begin{Bmatrix}\delta u_1\\\delta u_2\end{Bmatrix}\end{split}\]

ただし、 \(u_1\)\(u_2\) はそれぞれ \(\eta = 0\)\(\eta = 1\) の節点における変位です。

この式を仮想変位の式に代入すると以下の式が得られます。

\[\delta W=ph\left(\frac{1}{2}\delta u_1+\frac{1}{2}\delta u_2\right)\]

以上で、分布荷重を求めることができました。 1次要素と2次要素いずれの場合もGetFEMで正しく等価節点力を求められることを確認しました。

まとめ#

  • GetFEMの機能を使用して The Standard NAFEMS Benchmarks のメッシュを作成できることを確認しました。

  • GetFEMを使用して等価節点荷重の値を計算しました。1次要素は参照値との相対誤差が0.01%以下でした。2次要素は参照値との相対誤差が0.50%以上98%以下でした。

  • 等価節点力の計算方法について定式化を確認しました。

  • 今後は単純なモデルで2次要素の等価節点荷重について確認をする予定です。 現在の定式化では分布荷重が一定となっていますがその部分をどう考えるかについて考察しています。 ご意見があればいただきたいです。