Elmerを使ったパラメトリック解析


# Elmerについて
ElmerはフィンランドのCSCが中心となって開発しているFEM解析ソフトウェアです。豊富なモデル（31種類、2022/02/12現在）があり簡単な記述で解析設定を行えますが、最大の特徴はオープンソースであることです。GUIも比較的使いやすく、基本的な解析はGUIのみでも実行可能です。また、開発も活発に行われており、新しいモジュールが次々と出てきています。

ダウンロードページ（Linux版、Windows版）
https://www.csc.fi/web/elmer/binaries
以降はWindows版のElmer 8.4を使っていますが、基本的な使い方はLinux版でも同じはずです。


一方で、ジオメトリやメッシュを作成するプリプロセッサは含まれておらず、外部から持ってくる必要があります。Elmerで扱うメッシュ形式はElmer独自のものですが、ANSYSやCOMSOL、Abaqusといった商用ソフトで作ったメッシュや、UNVファイル、Gmshなどで作成したメッシュを変換するElmerGridというソフトウェアも付属しています。

ElmerGridの詳細はこちら
http://www.nic.funet.fi/index/elmer/doc/ElmerGridManual.pdf


ほとんどの解析設定はElmer独自のテキスト形式であるSIFファイルで記述されますが、FORTRANを使ってより高度で詳細なプログラムを行うこともできます。Elmerはオープンソースであるため、Elmer標準のモジュールの細かい仕様を確かめながらプログラミングができます。

また、いずれはオープンソースソフトウェアのSalomeを使ったメッシュ作成も記事にしたいと思いますが、今回はElmerのチュートリアルにあるメッシュファイルを使います。


# 使用するメッシュ
Elmerには有難いことに公式でGUIのチュートリアルが用意されており、熱伝導解析、構造解析、電磁界解析、流体解析、それらの連成解析といった幅広い解析のやり方を身につけることができます。今回の記事だけでも解析の手順が分かるように努めますが、興味を持たれたらこのチュートリアルをおすすめします。チュートリアルの詳細はこちらのPDFから
http://www.nic.funet.fi/index/elmer/doc/ElmerTutorials.pdf

今回はこのチュートリアルで使われるメッシュを使って、構造解析を例にヤング率をパラメータとしたパラメトリック解析を行います。単純な梁ではつまらないため、上記のチュートリアルのうちTutorial 8に使われているU字部品を使ってみます。解析設定の方法も一部共通しているため、この記事で分かりづらい部分は上記のチュートリアルを参照してください。


# 作業フォルダの作成・メッシュのインポート
おおよそチュートリアルと共通ですが、より簡易的にします。
まずElmer GUIを起動します。次にツールバーから
[File] -> [New Project]
で新規プロジェクトのフォルダを指定します。

次に、[Project directory]で適当な作業フォルダ（新規作成推奨）を選択します。

[Geometry Input]では、
[Geometry File] -> [Select geometry file]
で今回使うジオメトリファイルを選択します。ジオメトリファイルは、Elmerのインストールフォルダ内の`share\ElmerGUI\samples\grd\u_turn.grd`です。

その下の[Equation definition files]では各ソルバーの解析設定を簡単にするxmlファイルを選択できますが、今回の構造解析に使うxmlファイルはデフォルトで入っているため今回はそのままで大丈夫です。

[OK]を押して作業フォルダを作成すると、U字のジオメトリが表示されます。

![geometry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524246/8724601f-d872-c183-58b2-22f111f98820.png)


# 解析設定
解析モデルの設定はツールバーの[Model]から行います。
初めに、
[Model] -> [Setup]
から全体の設定をします。

パラメトリック解析を行う際には、
[Simulation] -> [Simulation type]
で [Scanning] と設定します。

次に、
[Simulation] -> [Timestep intervals]
を10、

[Simulation] -> [Timestep sizes]
を1に設定します。

それぞれ過渡解析におけるタイムステップ数、タイムステップ幅を示していますが、パラメトリック解析ではパラメータを1刻みで10個設定することに対応します。



次に、ツールバーから
[Model] -> [Equation] -> [Add]
でソルバーの指定および詳細設定を行います。

各ソルバーはFORTRANのモジュールで構成されており、タブ名がそれぞれモジュール名になっています。今回は [Linear elesticity] のタブで
[Active]、[Calculate Stresses]、[Body Property 1]
にそれぞれチェックし、
[Update]、[OK]
で確定します。


![equation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524246/3ec6b402-669a-05fb-deb9-0078cf49c0d7.png)



今回は物性値をパラメータとするため、物性値の設定は後回しにします。
次に、ツールバーから
[Model] -> [Boundary condition] -> [Add]
で境界条件として、例として固定端およびX方向の荷重を設定します。
片側が溶接されて、もう片側に押し広げるような力がかかっている状態です。

[Linear elesticity]のタブで
[Displacement 1] -> 0.0
[Displacement 2] -> 0.0
[Displacement 3] -> 0.0
[Apply to boundaries]-> Boundary 1
と設定して片側の端面に固定端の条件を与え、
[Add]
で確定します。

![confine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524246/373a908d-1269-fdcc-3f4d-93bd894b7d77.png)


続けて
[New]
で新しく境界条件を設定します。同様に
[Force 3] -> 4.0e7
[Apply to boundaries]-> Boundary 3
と設定して荷重の条件を与えます。




# ヤング率をパラメータにしてみる
次に、
[Model] -> [Material] -> [Add]
で物性値の設定をします。

各物性値を入力することもできますが、今回はElmerの物性値ライブラリを参考に利用します。
[Material library]から、例としてAustenitic stainless steel (AK Steel 201)を選択します。

ここで、ヤング率にパラメータを設定します。[Linear elesticity]のタブで
[Properties] -> [Youngs modulus]
のフォームの物性値を以下の文で書き換えます。
`Variable Time; Real MATC "tx/10*197.0e9"`

これは、タイムステップを変数txとして、ヤング率を`tx/10*197.0e9`で計算することを示しています。`Real`はFORTRANの`Real`型と同じようなものだと思って大丈夫で、`MATC`はElmer独自の数学ライブラリです。



これで解析設定が終わったので、ツールバーの
[Run] -> [Start Solver]
で解析を開始し、ログが表示されるようになります。終わるまで見守りましょう。



# 解析結果
解析結果はデフォルトではvtuファイルで`case_t0001.vtu`のように連番で出力されます。結果はParaViewで処理するのがおそらく一番簡単だと思います。

ParaViewのダウンロードはこちら
https://www.paraview.org/

ParaViewの使い方については省略します。
下のアニメーションはパラメータを1～10に振ったものです。

![u_turn.0000 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524246/be490056-c4d0-b84c-d48b-3a563d14169c.gif)


![u_turn_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524246/5b661dc7-8632-d291-4be9-278db957d57d.jpeg)


（ステンレス鋼をこんなに変形させているのでミーゼス応力がとんでもない値に…）



# 最後に
今回はヤング率のパラメトリック解析を行ってきましたが、この`MATC`キーワードを使えば境界条件なども掃引することができます。また、境界条件のパラメータ設定に使った`Variable`というキーワードは、タイムステップ番号の他にも`Variable Coordinate 1`とすればx座標をパラメータ`tx`とすることもできますし、`Variable Time, Coordinate`として`tx(0),tx(1),tx(2),tx(3)`でそれぞれタイムステップ番号、x,y,z座標を参照することも可能です。話す順序が逆になってしまっていますが、過渡解析に使うこともできるキーワードです。


このように、学術研究の解析にも利用可能なフリーウェアというのは非常に魅力的ではないでしょうか。興味を持った方は、Elmerで使える解析モデルのドキュメントがこちらに
https://www.nic.funet.fi/index/elmer/doc/ElmerModelsManual.pdf
ありますので、ご活用ください。また、モジュールは開発されているもののドキュメントに反映されていないものもあるため、「こういう解析ができたらいいのに」と思ったらドキュメントに加えて、ソースコードも探してみましょう。ソースコードはGitHubで見ることができます。
https://github.com/ElmerCSC/elmerfem

その他のドキュメントは公式ページに、細かいQ&Aなどはユーザーフォーラム
http://www.elmerfem.org/forum/
を調べると見つかるかもしれません。

今後はFORTRANでのプログラミングや、筆者が主に行っていた電磁界解析など、もっと踏み入った記事も作成していきたいと思います。