OF+DAKOTAによる形状最適化の事例紹介

事例報告
OF+DAKOTAによる形状最適化の事例紹介
一関高専・若嶋振一郎([email protected])
※ OpenFOAM 2.3.xについてのみ調査
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
1
流体解析→最適設計へ(計算条件・寸法・形状・トポロジー)
CADモデリング/CAE解析:
• このような形・条件ではどんな流れになるか?(現象の特徴・傾向を把握したい)
工学(エンジニアリング)のゴール:
• このような流速分布,圧力分布にするためにはどのような境界条件・形状・トポロ
ジーであれば良いか?ある評価基準に対する最適条件・形状はなにか??
• 最適設計・・・解析結果に基づき設計の良・不良を評価し,設計変更を行う
評価=しばしば評価関数の最小化(最大化)として扱われる
ある制約条件のもとで,取りうる設計パラメータセットの結果群から,設定した評
価基準が最も良い(=最適なもの)を自動的に選定したい
取りうる設計パラメータセットの影響度を分析したい(感度解析)
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
2
最適設計を行うには?
• 「最適化」=ある評価基準を最も良くするもの(形状,条件,トポロジー)を求める
• 「評価基準」=エンジニアリングでは客観的な基準が求められる
重量最小化,圧力損失最小化,流速分布の一様性最大化,材料・製造コスト最小化など
一般に「目的関数」と呼ばれる
• 最適化に関わるパラメータセットの感度解析(影響力の分析)も必要
しかし・・・・・
• 膨大な選択肢のなかから,あるパラメータセットを選定し,評価を行うのは多大な計算
コストがかかる(とくに流体解析)
 できるだけ少ない評価回数(流体解析)
 できるだけ高精度な感度解析
 ロバスト性・信頼性
効率的な最適化手法の研究開発
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
3
最適化問題の分類(アルゴリズムの選定)
•
•
•
•
線形計画問題
非線形計画問題
組み合わせ最適化問題(簡単なようで意外と難しいそうです)
多目的最適化問題
• 目的関数が複数有り,目的関数同士のバランスの異なる解を求める
• したがって,そのような最適なパラメータセットが複数存在する=パレート解
• アルゴリズムの提案
•
•
•
•
•
遺伝的アルゴリズム(GA)・・・・SOGA/MOGA
逐次近似アルゴリズム・・・・・・EGO
粒子群最適化・・・・・・・・・・・・・PSO
焼きなまし法
ニューラルネットワーク
など
※ 個々のアルゴリズムについては,別の機会に説明できればと思います(勉強中).
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
4
最適化(最適設計)ツール
• さまざまな最適化ツールがオープンソースとして実装・公開されている
• OpenMDAO・・・・OFとの連携事例紹介あり(OpenCAE勉強会)
• DAKOTA
• pyOpt
など
(もちろん商用ソフトウェアもあります)
• 他のCAEソフトウェアと違い,ブラックボックスとしては使いにくい
• アルゴリズムの選定,問題・評価基準をよく理解して設定する必要がある
 何をどの範囲で設計するか(設計パラメータの選定,設計パラメータの範囲)
 何を最適化するか(目的関数の設定)
 何が出来るか/出来ないか(設計パラメータや目的関数の制約条件)
• 出てきた最適化結果が本当に正しいのか,判断できる知識・経験が必要
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
5
最適化問題の形式化
• 近似的に数学問題として形式化すると・・・・
minimize
x0 ,x1
fi ( x0 ,x1
xn ) (i =1,2,3....)
g j ( x0 ,x1
xn )  0 (j =1,2,3....,l )
hk ( x0 ,x1
xn )  0 (k =1,2,3....,m)
xn
fi (i =1,2,3....)
gj
(j =1,2,3....,l )
hk
(k =1,2,3....,m)
「設計変数」(設計パラメータ*)
「目的関数」(評価関数)
「制約条件」(制約関数)
*当然ですが,設計変数個々にも取りうる範囲があります.
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
6
最適化問題の簡単な例
• 缶詰の形状最適化(Ref. http://www.cradle.co.jp/tec/column03/)
設計変数:D, H
(ただしD>0, H>0)
目的関数の例:
①材料費最小=体積あたりの表面積が最小
②製造時のかしめ作業のコスト最小化
(金属板を丸め繋ぎ合わせ,さらに上下蓋を取り付ける)
=体積辺りのつなぎ目長さを最小化
直径D
高さH
つなぎ目
2015/4/7
制約条件の例:
①体積Vが規定サイズVrefより大きい
②アスペクト比(H/D)は1以上である
第4回OpenCAE初歩情報交換会@北東北
7
DAKOTA
※ OpenMDAOについてはSlideShareで検索してみてください
• DAKOTA = Design and Analysis toolKit for Optimization and Terascale Applications
• https://dakota.sandia.gov/
• おもな特徴
• Open Source Software (GNU LGPL)
• Sandia National Laboratoryで開発
• 現在,DAKOTA 6.1 (linux 64bit/32bit, Windows, MacOS X binaries, source tar-ball)
• Gradient/Non-gradient based methods and many other applications (i.e.MOGA)
• DAKOTA 入力ファイル,計算テンプレート,計算実行ファイルを用意するだけ
• 入力ファイルのブロック(個々の変数は多数の選択肢あり)
a. Environment
b. Method
c. Model
d. Variables
e. Interface
f. Responses
• 実行はきわめてシンプルで,コマンドに引数として入力ファイルを渡すだけ
$ dakota dakota_input.in > dakota_output.out
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
8
DAKOTA ダウンロード・インストール
• バイナリのダウンロード・インストール
$ wget https://dakota.sandia.gov/sites/default/files/distributions/public/dakota-6.1public-Linux.x86_64.tar.gz
$ tar xvf dakota-6.1-public-Linux.x86_64.tar.gz(Binary package)
$ su
# mv dakota-6.1.0.Linux.x86_64 /usr/local
※ 解凍してできたフォルダを適当なディレクトリ(ここでは/usr/local)に入れて,
dakotaコマンドまでのpathを通して下さい
(.bashrcなどにPATHを設定してログインしなおす).
(.bashrc)
export DAKOTA_DIR=/usr/local/dakota-6.1.0.Linux.x86_64
export PATH=${DAKOTA_DIR}/bin:${DAKOTA_DIR}/test:$PATH
export LD_LIBRARY_PATH=${DAKOTA_DIR}/lib:${LD_LIBRARY_PATH}
• テスト
$ dakota -v
Dakota version 6.1 released Nov 15 2014.
Subversion revision 2951 built Nov 7 2014 09:52:09.と出てくればOK
※ CentOS6.6/OF2.3.x/DAKOTA 6.1.0の環境例です
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
9
補足
• DAKOTAの利用には,LinuxのバージョンによってはCmake, boostライブラリの
インストールないし更新が必要になる可能性があります
https://software.sandia.gov/trac/dakota/wiki/CMakeFAQ
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
10
DAKOTA 単体での練習
• 汎用的なdakota入力ファイルおよびスクリプトインターフェースが以
下に付属しています.
/usr/local/Dakota-6.1.0.Linux.x86_64/examples/script_interfaces/generic/
• generic/
:--- dakota_cleanup
:--- dakota_rosenbrock.in
:--- dprepro
:--- rosenbrock_bb
:--- simulator_script
:--- templatedir/
:--- ros.template
2015/4/7
掃除用csh script
①DAKOTAへの入力(設定)ファイル
Preprocessing用perl script(No edit)
simulation実行コード本体
(OFのソルバー等に相当)
②simulation startup script
③テンプレートディレクトリ
template simulation input file
第4回OpenCAE初歩情報交換会@北東北
11
Rosenblock問題(最適化の練習問題)
• http://en.wikipedia.org/wiki/Rosenbrock_function
• 最適化問題を目的関数の最小値検索としてとらえ,
様々な形の目的関数が提案されている
• Rosenblock function problem
目的関数 f(x,y)=(1-x)2+100(y-x2)2 の最小値を見つける
設計変数 x,y
(例題(dakota_rosenblock.in)では,|x|,|y|<2)
制約条件なし
from WikiPedia
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
12
dakotaで実行してみる
$ cp –r /usr/local/dakota-6.1.0.Linux.x86_64/examples/script_interfaces/generic .
$ cd generic
dakota_rosenblock.inのmethodブロックを一部書き換える
vi dakota_rosenblock.in
method,
##
npsol_sqp (コメントアウト)
# if NPSOL is not available, comment the above and try the following instead:
conmin_frcg (コメントアウトを解除)
simulator_scriptに実行権限を与える
$ chmod 755 simulator_script
実行してみる
$ dakota –i dakota_rosenblock.in
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
13
dakota_rosenblock.inの実行結果(端末に出力)
FINAL OPTIMIZATION INFORMATION
OBJ = 0.745998E-07
DECISION VARIABLES (X-VECTOR)
1) 0.99973E+00 0.99947E+00
THERE ARE 0 ACTIVE SIDE CONSTRAINTS
TERMINATION CRITERION
ABS(OBJ(I)-OBJ(I-1)) LESS THAN DABFUN FOR 3 ITERATIONS
NUMBER OF ITERATIONS = 30
OBJECTIVE FUNCTION WAS EVALUATED
91 TIMES
GRADIENT OF OBJECTIVE WAS CALCULATED
30 TIMES
<<<<< Function evaluation summary: 151 total (151 new, 0 duplicate)
<<<<< Best parameters
=
9.9973317928e-01 x1
9.9947226625e-01 x2
<<<<< Best objective function =
7.4599779236e-08
<<<<< Best data not found in evaluation cache
x=(x1)=9.99973317928e-01
y= (x2)=9.9947226625e-01
において,
最小値7.4599779236e-08を得ている
↑
実際はx,y=(1,1)でf(x,y)min=0
<<<<< Iterator conmin_frcg completed.
<<<<< Environment execution completed.
DAKOTA execution time in seconds:
Total CPU
=
0.13 [parent = 0.137979, child = -0.007979]
Total wall clock = 9.08344
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
14
DAKOTA+OFの連携の流れ
DAKOTA
(ex. Parametric study by gradient-based method)
Dakota output file
Dakota input file
Data pre-processing
Data post-processing
Simulation input file
i.e.,Remeshing etc.
Simulation output file
OpenFOAM
(ex. Script-based run of “mpirun –np 4 simpleFoam –parallel”)
まず以下を選定
(1)設計変数と目的関数をどうするか
例:Input・・・配管寸法,形状データ
Output・・・圧力損失,配管長さ
(2)制約条件
(3)最適化手法
2015/4/7
(1)Dakota入力ファイルを作成
(2)OFのテンプレート(case)を作成
(3)OFの実行結果から目的関数を評価する
スクリプトを作成
第4回OpenCAE初歩情報交換会@北東北
15
Example 1
• airFoil2D tutorial (simpleFoam)を使った例
• 目的:
• “L/D maximize” = “- L/D minimize” となるfreestream velocity “Uin”を
見出す
• その時のL/Dはいくらか?
• 設計変数はUin (0.1<Uin<5.0m/s)
• 目的関数は-L/D
• Dakotaは最小値問題として扱うので,マイナス符合をつけている
• 制約条件なし
• 準備したもの“openfoam_example1”
•
•
•
•
2015/4/7
airFoil2D.template/ OF case directory
dprepro
DAKOTA supplied preprocessor
dakora_of.in
DAKOTA input file
run_openfoam.sh
OF run script (including interface to DAKOTA)
第4回OpenCAE初歩情報交換会@北東北
16
準備1:airFoil2D.template/の作成
① tutorial “airFoil2D” caseを適当にリネームコピー“airFoil2D.template“
② 0/U file を 0/U.templateにリネームして編集
inlet
{
type fixedValue;
value uniform ( 5 0 0 );  value uniform ( {Uin} 0 0);
}
③ “Uin” はdakota入力ファイルdakota_of.inで参照されます.
{ } 付にしてあることに注意
※ この例では, 1つの(Uin) が設計変数で,目的関数も1つ (-L/D)である.すなわ
ち, -L/D の最小値を “Uin” を代えて見出すのが目標です
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
17
準備2:dakota_of.in
#
DAKOTA INPUT
<主な流れ>
1. dakotaにdakota_of.inが読み込まれる
2. dakotaはdakota_of.in に従ってparams.in(実際
variables,
は設計変数の具体的な数値)を作成し,
continuous_design = 1
cdv_initial_point
0.1
run_openfoam.shに渡す
cdv_lower_bounds
0.1
cdv_upper_bounds
5.0
3. run_openfoam.shの中では,dpreproを使って,
cdv_descriptor
'Uin'
指定した‘airFoil2D.template/*‘の中のテンプ
interface,
system
レート変数を上記の具体的な数値に置き換え
#
asynchronous
analysis_driver = 'run_openfoam.sh'
たのものをコピーする(ここではworkdir.*)
parameters_file = 'params.in'
results_file
= 'results.out'
4. そのコピーにおいてOFを実行後,
work_directory directory_tag
copy_files = 'airFoil2D.template/*'
# uncomment to leave params.in and results.out files in work_dir run_openfoam.shの中のPostProcessを実行し,
subdirectories
named 'workdir' file_save directory_save
results.outとして目的関数の値等を出力する
aprepro
# when using conmin_frcg (above) with analytic_gradients (below),
5. not
dakotaはresults.outを読み込み,勾配などを
# need to turn off the active set vector as rosenbrock_bb does
parse it.
##
deactivate active_set_vector
計算し(選定手法による),あらたな設計変数
responses,
を定め,1に戻る
num_objective_functions = 1
method,
#
npsol_sqp
# if NPSOL is not available, comment the above and try the following instead:
conmin_frcg
numerical_gradients
fd_gradient_step_size = 0.000001
# to instead use analytic gradients returned by the simulator comment the
# preceding two lines and uncomment the following:
##
analytic_gradients
no_hessians
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
18
準備3:run_openfoam.sh
#!/bin/sh
# Sample simulator to Dakota system call script
# See Advanced Simulation Code Interfaces chapter in Users Manual
# $1 is params.in FROM Dakota
# $2 is results.out returned to Dakota
#
#
#
#
#
#
-------------PRE-PROCESSING
-------------Incorporate the parameters from DAKOTA into the template, writing ros.in
Use the following line if SNL's APREPRO utility is used instead of DPrePro.
../aprepro -c '*' -q --nowarning ros.template ros.in
dprepro $1 0/U.template 0/U
# -------# ANALYSIS : Run OpenFOAM
# -------pwd
simpleFoam
テンプレート中の変数を実際の値に置き換え
OFの実行
このファイル名は,
dakota入力ファイル中で
指定したものを使う
# --------------# POST-PROCESSING
# ---------------
echo "current directory in" ; pwd
# extract L and D from final step of forces file and output –L/D to temporally file
tail -1 postProcessing/forces_wing/0/forces.dat | sed s/[¥(¥),]/" "/g | awk -F"
" '{print -($3+$6)/($2+$5)}' > OF_LbyD_results.tmp
cat OF_LbyD_results.tmp
mv OF_LbyD_results.tmp $2
OFの実行結果から,目的関数を評価して出力(results.out)
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
19
実行結果
FINAL OPTIMIZATION INFORMATION
OBJ =
Run results from
$ dakota –i dakota_of.in
(This command takes some time )
-0.202079E-01
DECISION VARIABLES (X-VECTOR)
1)
0.22893E+00
THERE ARE
0 ACTIVE SIDE CONSTRAINTS
TERMINATION CRITERION
ABS(1-OBJ(I-1)/OBJ(I)) LESS THAN DELFUN FOR
ABS(OBJ(I)-OBJ(I-1))
LESS THAN DABFUN FOR
NUMBER OF ITERATIONS =
3 ITERATIONS
3 ITERATIONS
5
OBJECTIVE FUNCTION WAS EVALUATED
37
TIMES
GRADIENT OF OBJECTIVE WAS CALCULATED
5 TIMES
<<<<< Function evaluation summary: 42 total (10 new, 32 duplicate)
<<<<< Best parameters
=
2.2892830477e-01 Uin
“L/D maximize” = “- L/D minimize” in the freestream
<<<<< Best objective function =
velocity “Uin=0.022892830477 m/s”
-2.0207900000e-02
<<<<< Best data captured at function evaluation 9
<<<<< Iterator conmin_frcg completed.
<<<<< Environment execution completed.
DAKOTA execution time in seconds:
Total CPU
=
0.06 [parent =
Total wall clock =
2822.12
2015/4/7
0.054992, child =
第4回OpenCAE初歩情報交換会@北東北
0.005008]
20
Example 2
• Diamond 翼形状の最適化(迎え角0度,低 Reynolds number flow)
y
Slip
設計変数:
Outlet
Uniform flow, 5m/s
(x,y)1
(0.1,0)
X
(x,y)2
• 0<x1,x2<0.1
• 0<y1<0.05
• -0.05<y2<0
Slip
Rec=5x0.1/1.5x10-5=3.33x104
2015/4/7
(0,0)
目的関数:
• -L/D but L > 0 (L/Dの最大化)
第4回OpenCAE初歩情報交換会@北東北
21
airFoil2D.template/
• “airFoil2D” を一部変更して “airFoil2D.template”としている
• constant/polyMesh/blockMeshDict をリネーム+編集
constant/polyMesh/blockMeshDict.template
:
({x2} -1 0)
({x2} {y2} 0)
({x1} {y1} 0)
({x1} 1 0)
:
• “x1” などは,dakota_of.inで編集すべきテンプレート変数として扱われる( { } が必要)
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
22
Step 1
• Choose base CASE files and solver (simpleFoam used here)
• Prepare
• blockMeshDict > blockMeshDIct.template (edit as previous slide!)
• OF run script and setup run functions (forces etc.) for objective
functions
Output L and D
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
23
Step 2
• Prepare simulation output file to DAKOTA input file
• Ex.) Extract forces
• use tail/head/grep/sed/awk commands
• other extraction tools
• some averaging process after extraction
> tail -1 postProcessing/forces_wing/0/forces.dat |
sed s/[¥(¥),]/" "/g |
awk -F" " '{print "D = "($2+$5)" L = "($3+$6)" L/D = ", ($3+$6)/($2+$5)}‘
(1 line)
D = 0.0322753 L = -0.0666165 L/D = -2.06401
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
24
Step 2(cont.)
• Make DAKOTA input file: dakota_of.in
## DAKOTA INPUT FILE - dakota_of.in
method,
#
npsol_sqp
# if NPSOL is not available, comment the above and try the
following instead:
conmin_frcg
# uncomment to leave params.in and results.out files in work_dir
subdirectories
named 'workdir' file_save directory_save
aprepro
# when using conmin_frcg (above) with analytic_gradients (below),
# need to turn off the active set vector as rosenbrock_bb does not
parse it.
##
deactivate active_set_vector
variables,
continuous_design = 4
cdv_initial_point
0.05 0.01 0.05 -0.05
cdv_lower_bounds 0 0 .01 0 -0.1
cdv_upper_bounds 0.1 0.05 0.1 -0.01
cdv_descriptor
'x1' 'y1' 'x2' 'y2'
interface,
#
2015/4/7
system
asynchronous
analysis_driver = 'run_openfoam.sh'
parameters_file = 'params.in'
results_file = 'results.out'
work_directory directory_tag
copy_files= 'airFoil2D.template/*'
responses,
num_objective_functions = 1
numerical_gradients
どれくらいの細かさで
fd_gradient_step_size = 0.005 評価するか
# to instead use analytic gradients returned by the simulator
comment the
# preceding two lines and uncomment the following:
##
analytic_gradients
no_hessians
第4回OpenCAE初歩情報交換会@北東北
25
Step 2(cont.)
• Make run script: run_openfoam.sh
#!/bin/sh
# Sample simulator to Dakota system call script
# See Advanced Simulation Code Interfaces chapter in Users Manual
# $1 is params.in FROM Dakota
# $2 is results.out returned to Dakota
# -------------# PRE-PROCESSING
# -------------# Incorporate the parameters from DAKOTA into the template, writing ros.in
# Use the following line if SNL's APREPRO utility is used instead of DPrePro.
# ../aprepro -c '*' -q --nowarning ros.template ros.in
dprepro $1 constant/polyMesh/blockMeshDict.template constant/polyMesh/blockMeshDict
# -------# ANALYSIS : Run OpenFOAM
# -------#cd airFoil2D.template
pwd
blockMesh
simpleFoam
#cd ..
# --------------# POST-PROCESSING
# --------------echo "current directory in" ; pwd
tail -1 postProcessing/forces_wing/0/forces.dat | sed s/[¥(¥),]/" "/g | awk -F" " '{print -($3+$6)/($2+$5)}' > OF_LbyD_results.tmp
cat OF_LbyD_results.tmp
mv OF_LbyD_results.tmp $2
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
26
Run results
FINAL OPTIMIZATION INFORMATION
OBJ = -0.148090E+02
DECISION VARIABLES (X-VECTOR)
1) 0.46533E-01 0.11214E-01 0.89585E-01 -0.10000E-01
THERE ARE 1 ACTIVE SIDE CONSTRAINTS
DECISION VARIABLES AT LOWER OR UPPER BOUNDS (MINUS INDICATES LOWER BOUND)
4
TERMINATION CRITERION
ABS(1-OBJ(I-1)/OBJ(I)) LESS THAN DELFUN FOR 3 ITERATIONS
ABS(OBJ(I)-OBJ(I-1)) LESS THAN DABFUN FOR 3 ITERATIONS
NUMBER OF ITERATIONS = 10
OBJECTIVE FUNCTION WAS EVALUATED
32 TIMES
GRADIENT OF OBJECTIVE WAS CALCULATED
9 TIMES
<<<<< Function evaluation summary: 69 total (69 new, 0 duplicate)
<<<<< Best parameters
=
4.6532769528e-02 x1
1.1214064793e-02 y1
8.9585348812e-02 x2
-1.0000000000e-02 y2
<<<<< Best objective function =
-1.4809000000e+01
<<<<< Best data captured at function evaluation 69
L/D=14.809
<<<<< Iterator conmin_frcg completed.
<<<<< Environment execution completed.
DAKOTA execution time in seconds:
Total CPU
=
0.45 [parent = 0.443933, child = 0.006067]
Total wall clock = 18874.9
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
27
参考文献
− DAKOTA Homepage
https://dakota.sandia.gov/
− Optimization with Dakota and OpenFOAM
http://www.dicat.unige.it/guerrero/dakotaof.html
− DAKOTA User’s Guide
− Sig Numerical Optimization
http://openfoamwiki.net/index.php/Sig_Numerical_Optimization
2015/4/7
第4回OpenCAE初歩情報交換会@北東北
28