事例報告 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
© Copyright 2024 ExpyDoc