DakotaとSYSWELDを利用した最適化のまとめ - materialsintegration/optimization_by_sipmi GitHub Wiki

表題の通り、DakotaとSYSWELDを利用した最適化についての記述である。

概要

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

    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を実行するワークフローである。
workflow

入力

付録にある「他の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 
  • 結果

sactter_3d_graph_no001

付録

使用したpythonスクリプト

  • workflow_python_lib/workflow_execute.py
    汎用ワークフロー実行スクリプト。
  • scatter_plot.py
    tabulargraphics.datから散布図を作成する。ただし説明変数2つ、目的変数1つの場合のみ対応。
  • objective_function.py
    最適化手法ごとに必要な形に整形するスクリプト
  • go_opt.sh
    セッション毎の出力を別名保存する統括シェルスクリプト

適用メッシュ構造

この解析で使用したメッシュ構造は、2次元である。

  • 全体像
    mesh_all
  • 溶接部アップ mesh_weld_toe

入熱部付近の温度分布図

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

他の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