3D積層造形プロセスにおいてき裂発生を抑制可能なNi合金組成の探索 - materialsintegration/optimization_by_sipmi GitHub Wiki
* 与えられた組成に対して、Thermo-Calcを用いたScheil凝固計算により、凝固開始温度と凝固完了温度の温度差(固液共存域温度、Brittle Temperature Range: BTR)を求める。
* Inconel 738LCをベースにする。
(Inconel 738LC)
* Ni Bal.
* Al 3.2
* C 0.1
* Co 8.5
* Cr 16.3
* Mo 1.65
* Nb 0.7
* Ta 1.8
* Ti 3.22
* W 2.7
* Zr 0.03
解析手順の1は以下のような条件により、最適なTiとAlの値を求める。
- TiとAlの組成和(Ti+Al)を7.0 (mass%)に固定、その他の元素は上記Inconel 738LCの成分に固定
- Thermo-Calcの平衡計算から、γ'体積率 30%以上
- 上記の条件を満足した上で、固液共存域(BTR)が最も小さくなるTiとAl濃度(=7.0 - Ti濃度)を求める。
- ベイズ最適化などの最適化手法を適用する。
- パラ平衡を入れる場合と、入れない場合の2パターンで探索を行う。
- TiとAl組成の有効桁は、0.01 mass%とする。
- BTRが最小のものから3個程度の候補組成を得る。
- JMatPro*1で力学特性を計算してみる。
※1: 他の元素が固定のため、γ'量やBTR値の変化幅は小さいかもしれないが、動作検証も兼ねる
解析手順の2は以下のような条件および手順で残り6つの元素の値を導出する。
- TiとAlの組成を解析1の結果に基づき固定。
- その他の元素について、1つずつ変化させていく。
- Thermo-Calcの平衡計算から、γ'体積率 30%以上となり、
- 固液共存域(BTR)が最も小さくなる濃度を各元素毎に求める。
- ベイズ最適化などの最適化手法を適用する。
- パラ平衡を入れる場合と、入れない場合の2パターンで探索を行う。
- 各有効桁(ステップ)は、0.01 mass%とする。
- 結果を眺めて、着目する元素を複数に絞り、解析3を行う。
解析手順の3は以下のような条件および手順を実行する予定である。
- 解析2の結果に基づき、影響の大きい元素およびその変化幅を決め、その中でγ'体積率 30%以上となり、BTR値が最小となる組成候補を探す。
- 多くの組み合わせが出てくると考えられるため、最終的にどう絞り込むか検討が必要。10~20候補程度に絞りこみ、それぞれについてJMatProでの強度予測を行い、K社への提案組成を決定する。
※ 候補組成について、例えば800度での降伏応力が500 MPa以上などといった条件を加えられると良い(今後の検討)
- 今後、Mn, S, Si, Bなども探索空間に加えたい。
Python用bayes推定パッケージ(py_basian_optimization)とDakotaを最適化のツールとして利用した。 bayes推定で大局解をもとめ、それをDakotaの初期値として利用する。 最適化の変数としてThermo-Calc用パラメータのうち、解析概要にあるパラメータを用い、目的関数としてThermo-Calcの計算を行った。計算の結果から固液共存域(BTR)を導出しこれが、最小となる最適化の評価を行った。 なお「γ'体積率 30%以上」の条件は後述のReLU関数を用いて30%以下の場合にペナルティを与えて評価値が除外される方向で対処した。最適化手法は「制約付き最小化共役勾配最適化法」を主に使用した。

graph TD;
subgraph bayes推定
bayes001[Python:bayesian]
bayes002[パラメータ決定]
bayes003[Thermo-Calc実行スクリプト]
bayes004[戻り値を評価]
bayes005[終了]
bayes001==>bayes002
bayes004==>bayes001
bayes002==>bayes003
bayes003==>bayes004
bayes001==>bayes005
end
subgraph Dakota最適化
dakota001[Dakota最適化ツール]
dakota002[variable:パラメータ決定]
dakota003[interface:Thermo-Calc実行スクリプト]
dakota004[response:戻り値を評価]
bayes005==>dakota001
dakota001==>dakota002
dakota004==>dakota001
dakota002==>dakota003
dakota003==>dakota004
end
検証に使用した環境を下記に記す。
- Dakota:6.7
- Thermo-Calc2019a
- CentOS 7.x
- Python3.6
- bayesian-optimization:1.0.1
bayes推定およびDakota実行時の標準出力への出力をログとして記録する。これが詳細な最適化評価の結果となる。他に、「tabulargraphics.dat」というファイルが出力される。これは変数と評価の履歴のみである。これらから最適な入力パラメータを判断することとなる。
bayes推定プログラムのためのパラメータ探索が主目的ではないので、使い方を検索して多く見受けられた、以下のパラメータを使用する。
- init_points:3を指定する。
- i_iter:10を指定する。
Dakotaの駆動には、まずパラメータファイルが必要である。いくつかのテンプレートをDakotaが用意しているので、それを使用してパラメータファイルを作成する。パラメータファイルは以下の構造を持つ。主な変更点を以下に列挙する。それぞれについて記述する。
- method:最適化手法の指定
- variables:変数の指定
- interface:目的関数の駆動法の指定
- response:目的関数からDakotaへ戻される評価値の処理方法の指定
最適化手法は以下のものを実施した。それぞれについて結果を後述する。
- conmin_fcgr:制約付き最小化共役勾配最適化法
- max_iterations:10000(1万回まで試行を許可)
- convergence_tolerance:1e-7(評価の際、小数点以下7桁まで見る)
Dakotaで管理するThermo-Calcのパラメータのうち、以下を変数として採用した。
- Ti
- 初期値/最小値/最大値:3.22/2.9/3.54
- Al + Ti = 7.0の条件は下記interface部で対処
最適化対象の関数、ソルバーの実行および必要であれば後処理を記述する。
- analysis_dirver:実行用のスクリプトを指定する。
- スクリプトの概要
- Thermo-Calcのパラメータファイルを組み立てる(パラメータ値はDakotaより指示あり)
- 同パラメータファイルに対し、Al + Ti = 7.0の処理を実施
- Thermo-Calcを実行
- 計算結果から固液共存域(BTR)とγ’体積率を導出
- ReLUを用いてγ’体積率<30%の処理を行い、適合すれば固液共存域(BTR)の値にペナルティを与えた値をDakotaへ通知する
- スクリプトの概要
最適化処理対象の関数、ソルバーからの戻り値に対する処理を記述する。
- objective_functions:1を指定する
- numerical_gradientを指定。
- method_source:dakota
- interval_type:central
- fd_step_size:.01
- no_hessiansを指定
Dakotaによる最適化の評価の対象外となるThermo-Calcへのパラメータの設定について
- オルソ平衡とパラ平衡での評価を実施した。
- Alの値
DakotaではTiの値のみ変化させたので、別途用意したAlの値はそのままでは出力されない。このためAl/Ti/gamma量を別ログに出力した。 - ログ
Dakotaの実行時にDakotaが標準出力へ出力するログはdakota-<日付>-<3桁通し番号>.logで都度保存した。
- 「固液共存域(BTR)の値」の取得
Thermo-Calcより出力される標準出力より、以下の範囲の最初の値から最後の値を減算したもの。CALCULATING SCHEIL SOLIDFICATION T(C) fraction solid 1344.239 0.000000 PHASE REGION:LIQUID + FCC_L12#2 T(C) fraction solid 1343.761 0.8371007E-02 1338.761 0.1111522 1333.761 0.1995743 ---途中省略--- PHASE REGION:LIQUID + BCC_B2#1 + FCC_L12#1 + FCC_L12#2 + H_L21 + MU_PHASE + NI3TI_D024 + SIGMA T(C) fraction solid 1131.808 0.9810916 PHASE REGION:LIQUID + FCC_L12#1 + FCC_L12#2 + H_L21 + MU_PHASE + NI3TI_D024 + SIGMA T(C) fraction solid 1131.648 0.9812790 1126.648 0.9861966 1121.648 0.9892608 1116.648 0.9912963 1111.648 0.9927217 ........................................................... - パラ平衡のための変更
マクロファイルの最後をを2000 none none NONE y N NONE2000 NONE NONE Y NONE C
に変更。
- 「γ'体積率」の取得
値は以下の行を取得。FCC_L12#3 ORD Status ENTERED Driving force 0.0000E+00 Moles 3.3661E-01, Mass 1.8643E+01, Volume fraction 3.3733E-01 Mass fractions: NI 7.44127E-01 TA 4.32362E-02 NB 6.79380E-03 ZR 5.20823E-04 TI 7.17173E-02 CO 3.62730E-02 W 6.18190E-03 C 4.33771E-05 AL 6.55129E-02 CR 2.41967E-02 MO 1.39737E-03
FCC_L12#で始まる行に、「ORD」である行の直下の行の「Volume fraction」の次の数字を取得する。
- 「γ'体積率30%以上」の判定
解析1の2にある計算の結果生成されるγ’量が30%以上の場合のみを最適化の対象とするため、30%以下の場合の評価に対して、ペナルティを与える方式を実装した。ペナルティはReLU関数(活性化関数のまとめ(ステップ、シグモイド、ReLU、ソフトマックス、恒等関数))を使用し、objective_functionの計算に以下を追加した。(max - min) + 100 * relu(0.3 - gammap)
Dakotaのパラメータについての考察
dakotaで与える、パラメータのうち、
- methodのscaling
- vvariablesのscale_typeおよびscales について、あまりにもまとはずれな値を返すことが多かったので、簡単な比較を行ったところ、以下の通りとなり、これを組み合わせの指標とした。
目的関数として、Rosesnbrock式を用いた。パラメータは以下の組み合わせを用いた。
- scalingの有無
- 初期値
- scalingありの場合のタイプ
結果は以下の通りとなった。
| scaling | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| スケールタイプ | なし | auto | value | なし | auto | value | なし | auto | value |
| スケール値 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | |||
| x初期値 | 5.00 | 5.00 | 5.00 | -5.00 | -5.00 | -5.00 | 0.00 | 0.00 | 0.00 |
| y初期値 | 5.00 | 5.00 | 5.00 | -5.00 | -5.00 | -5.00 | 0.00 | 0.00 | 0.00 |
| 戻り値無変換 | |||||||||
| 計算回数 | 1750 | 60.00 | 1681.00 | 246 | 372.00 | 267.00 | 369.00 | 110.00 | 404.00 |
| 最適解x | 1.0912880578 | 2.2354317523 | 1.0188332110 | 0.9681165434 | 0.5693465325 | 0.9836457563 | 0.9699425538 | 0.5905509836 | 0.9667705118 |
| 最適解y | 1.1915723701 | 4.9999871677 | 1.0381634256 | 0.9371588594 | 0.3225225892 | 0.9675381390 | 0.9407043756 | 0.3469214314 | 0.9345630200 |
| 返却値 | 0.0083774727 | 1.5270936645 | 0.0003567152 | 0.0010173789 | 0.1857290404 | 0.0002675047 | 0.0009041587 | 0.1679830331 | 0.0011048746 |
| 計算時間 | 643.98s | 19.3384s | 608.133s | 71.7297s | 135.851s | 90.1717s | 134.393s | 34.2958s | 137.839s |
上記より、スケール設定は無い、またはtypeをvalueとしたときのほうが良い結果が得られることがわかる。以降は基本、スケール設定無しで検証を進めることとする。
※スケール値を1とするか0.01とするかでの評価も行ったが、途中経過が設定値の倍率分違うだけで最適解は変わらなかったので、上記結果から省略した。
※responseのfd_step_sizeは評価しなかった。