DakotaとSYSWELDを利用した最適化のまとめ - materialsintegration/optimization_by_sipmi GitHub Wiki
表題の通り、DakotaとSYSWELDを利用した最適化についての記述である。
概要
Dakotaを最適化のツールとして利用し、最適化の変数としてSYSWELDの溶接シミュレーション用パラメータのうち、入熱量と溶接終了時間を用い、目的関数としてSYSWELDの溶接シミュレーションの計算を行った。結果から最高到達温度を取り出し、これを目的の温度(例えば1000℃)に近づける最適化の評価を行い、最適な入熱量と溶接終了時間を求めた。ここでは最適化手法は「制約付き最小化共役勾配最適化法」を主に使用した。

graph TD;
dakota001[Dakota最適化ツール]
dakota002[interface:WF-API駆動スクリプト]
dakota004[response:戻り値を評価]
dakota003[MIntシステム:ワークフロー実行]
dakota001==>dakota002
dakota004==>dakota001
dakota002==>dakota003
dakota003==>dakota004
バージョン
検証に使用したバージョンを下記に記す。
- Dakota:6.7
- SYSWELD:11.x/12.x/13.x/15.x
- CentOS 7.x
- Python3.6(MIntシステムAPI駆動用)
Dakotaの制御やパラメータについてはホームページ又はオンラインマニュアルなどを参考にした。
実行結果の評価
Dakota実行時の標準出力への出力をログとして記録する。これが詳細な最適化評価の結果となる。他に、「tabulargraphics.dat」というファイルが出力される。これは変数と評価の履歴のみである。これを散布図などに出力すると履歴が図示される。後述するスクリプトで簡単に3Dグラフが作れる。これらから最適な入力パラメータを判断することとなる。
Dakotaパラメータファイル
Dakotaの駆動には、まずパラメータファイルが必要である。いくつかのテンプレートをDakotaが用意しているので、それを使用してパラメータファイルを作成する。パラメータファイルは以下の構造を持つ。主な変更点を以下に列挙する。それぞれについて記述する。
- method:最適化手法の指定
- variables:変数の指定
- interface:目的関数の駆動法の指定
- response:目的関数からDAKOTAへ戻される評価値の処理方法の指定
method、手法の詳細
最適化手法は以下のものを実施した。それぞれについて結果を後述する。
- conmin_fcgr:制約付き最小化共役勾配最適化法
- max_iterations:10000(1万回まで試行を許可)
- convergence_tolerance:1e-7(評価の際、小数点以下7桁まで見る)
variables、変数詳細
SYSWELDのパラメータのうち、以下の2つを変数として採用した。
-
入熱量(J/mm):キーはEnergy
- 初期値は500
- これを±10%の幅で変化させた。
- dakotaは小数点以下を変化させることが多いので、これを1/1000にして与える。
-
溶接終了時間(s):キーはWeld_End_Time
- 初期値は4.17
- これを±10%の幅で変化させた。
これらの変数のパラメータファイル内で配置を逆にしたものも評価する。
interface、目的関数
- analisis_dirver:実行用のスクリプトを指定する。
- スクリプトの概要
- MIntシステムのワークフローとして用意されている
- ワークフローが実行するソルバーはSYSWELDの溶接シミュレーション
- 同ワークフローをAPIで実行、結果を取得する。処理は別途pythonスクリプトプログラムを用意。
- ワークフロー内で溶接結果のファイル(Project_V_POST1000.erfh5)から全ステップを対象にして最高到達温度を抽出する。
- 最高温度が指定された温度(例えば1000℃など)になるように、最適化手法毎の処理を行う。
- 今回は目標温度へ合わせるが手法は最低値を目指すので、取得できた温度 - 1000 を2乗して平方根を取得した。なので、最適値はうまく行けば0となるはず。
- スクリプトの概要
response
- objective_functions:1を指定する
- numerical_gradientを指定。
- method_source:dakota
- interval_type:central
- fd_step_size:.01
- no_hessiansを指定
ワークフロー
用意したワークフローはSYSWELDを実行するワークフローである。

入力
付録にある「他のSYSWELDパラメータ」にある=を挟んだ文字列の左側をポート名としたパラメータを受け取る。
出力
- 使用したメッシュ全体画像(pngファイル)
- 同、溶接部分アップ画像(pngファイル)
- 最終ステップの温度分布状態画像(jpgファイル)
- 最終ステップの応力分布画像(jpgファイル)
- 硬さ分布画像(jpgファイル)
- 最終ステップ溶接画像(jpgファイル)
- 最高温度(スカラー値)
- 硬さ分布(データファイル)
- 残留応力(データファイル)
- 粒径情報(データファイル)
- 上記含む計算で出力されたすべてのファイルをまとめたファイル(zipファイル)
検証
検証はDakotaによる目的変数以外にDakota用のパラメータや目的変数の変換方法を変更して行った。
組み合わせ
| 項番 | 変数1 | 変数2 | 目的値 | fd_step_size |
|---|---|---|---|---|
| 1 | 入熱量 | 終了時間 | 1000℃ | 0.01 |
| 2 | 入熱量 | 終了時間 | 1000℃ | 0.1 |
| 3 | 入熱量 | 終了時間 | 800℃ | 0.01 |
| 4 | 入熱量 | 終了時間 | 800℃ | 0.1 |
| 5 | 終了時間 | 入熱量 | 1000℃ | 0.01 |
- 入熱量:0.5/0.45/0.55(MJ/mm)
- 溶接終了時間:0.41/3.753/4.587(s)
手法
手法は「手法の詳細」で列挙した手法を1つだけ使用した。組み合わせての使用は行っていない。
検証結果の例
tabulargraphics.datの内容は、左から評価回数、目的関数のID(今回は無いのでNO_IDとなる)変数1、変数2、目的関数の値となる。目的関数の値が0に近い値を導き出せればその時の説明変数が最適なものと判断できる。
項番1
項番1の組み合わせの評価結果を記述する。
- tabulargraphics.datの内容
%eval_id interface Energy Weld_End_Time obj_fn
1 NO_ID 0.5 4.17 44.83
2 NO_ID 0.4985389197 4.170080465 40.39
3 NO_ID 0.4926945987 4.170402323 22.16
4 NO_ID 0.4634729935 4.172011615 56.558
5 NO_ID 0.4912383329 4.170482124 17.73
6 NO_ID 0.4854132697 4.170801326 1.19
7 NO_ID 0.4757116784 4.171332955 24.601
8 NO_ID 0.4846233224 4.17087462 0.927
9 NO_ID 0.4814635333 4.171167797 9.365
10 NO_ID 0.4843069308 4.170903976 1.771
11 NO_ID 0.4858144073 4.170711742 2.26
12 NO_ID 0.4846960395 4.170864677 0.732
13 NO_ID 0.4849869077 4.170824901 0.05
14 NO_ID 0.4848024709 4.170824215 0.448
15 NO_ID 0.4849846474 4.170824893 0.04
16 NO_ID 0.4849756064 4.170824859 0.02
17 NO_ID 0.4848925925 4.170826659 0.206
18 NO_ID 0.4849747326 4.170824878 0.01
19 NO_ID 0.4849712373 4.170824954 0.01
20 NO_ID 0.4849266912 4.17082643 0.113
21 NO_ID 0.4849707918 4.170824969 0
22 NO_ID 0.48496901 4.170825028 0.003
23 NO_ID 0.4849259351 4.170826442 0.116
24 NO_ID 0.4849703432 4.170824983 0
25 NO_ID 0.4849705678 4.170824976 0
26 NO_ID 0.4849257109 4.170826445 0.116
27 NO_ID 0.4849701192 4.170824991 0
28 NO_ID 0.4849703437 4.170824983 0
29 NO_ID 0.4849703213 4.170824984 0
30 NO_ID 0.4849703325 4.170824984 0
31 NO_ID 0.4849702876 4.170824985 0
- 結果

付録
使用したpythonスクリプト
- workflow_python_lib/workflow_execute.py
汎用ワークフロー実行スクリプト。 - scatter_plot.py
tabulargraphics.datから散布図を作成する。ただし説明変数2つ、目的変数1つの場合のみ対応。 - objective_function.py
最適化手法ごとに必要な形に整形するスクリプト - go_opt.sh
セッション毎の出力を別名保存する統括シェルスクリプト
適用メッシュ構造
この解析で使用したメッシュ構造は、2次元である。
- 全体像

- 溶接部アップ

入熱部付近の温度分布図
温度分布(入熱部付近)の画像である。

他のSYSWELDパラメータ
SYSWELDへ与える他のパラメータは以下の通り。
## Trajectory Path
##
##
TRAJECTORY_COOD = (0, 0)
TRAJECTORY_REFCOOD = (1, 0)
##Component Properties
##
BASE_Material="SM490B"
WELD_Material="MX-Z200"
##
## 4. Welding Process
##
Velocity=4.17
Welding_Initial_Time=0
Welding_End_Time=4.796 <--- 説明変数
Length=12
Width=18
Penetration=2
Energy=500 <--- 説明変数
Efficiency=0.92
##
## 5. Cooling Condition
##
Ambient_Temp=20
Cooling_Initial_Time=0
Cooling_End_Time=500
##
## 6. Clamping Condition
##
Clamping_Initial_Time=0
Clamping_End_Time=500
##
## 9. Solution Parameter
##
Initial_Temperature=20