More Related Content
Similar to CAESES-FFW,GridPro,OpenFOAMを使用した形状最適化事例#1
Similar to CAESES-FFW,GridPro,OpenFOAMを使用した形状最適化事例#1 (20)
CAESES-FFW,GridPro,OpenFOAMを使用した形状最適化事例#1
- 2. 2
目的と概要
L字管を題材にして,CAESES/FFW を使用した設計最適化の基本的な部分
を解説しています.
内部流れで一般的な性能指標である圧力損失を目的関数として最適化を行っ
ています.
成果としては,圧力損失を基準形状に対して 50% 以上低減させることに成
功しました.
この資料をご覧いただいて,ご不明な点などございましたら,お気軽にお問
い合わせください.フィードバックはどんなものでもありがたいです.
- 5. 5
目的関数を何にするか?
“入口と出口間の全圧差” を目的関数とします.
퐼 = −
휌 푝 +
1
2
푢2 풖 ∙ 풏 푑훤 inlet
풖 ∙ 풏 푑훤 inlet
−
휌 푝 +
1
2
푢2 풖 ∙ 풏 푑훤 outlet
풖 ∙ 풏 푑훤 outlet
[Pa]
휌: 密度
푝: 密度で割った圧力
풖: 流速
풏: 境界の単位法線ベクトル (計算領域外向き)
simpleFoam の表記方法に合わせています.
- 7. 7
使用するソフトウェア
次の3つのソフトウェアを組み合わせて最適化計算を行います.
• パラメトリックモデルの生成
• 連携するソフトウェアの実行制御
• 最適化
• 計算格子生成
• 流体計算
• 目的関数値の評価
格子生成には,GridPro (商用ソフト) を使用しています.
- 8. 8
計算とデータの流れ
目的関数値 形状データ
流体計算を行い
形状の性能を評価
流体計算の実行に必要な
計算格子の生成
変形形状の生成,最適化
繰り返し計算の制御
繰り返し
計算格子
- 9. 9
最適化計算の流れ
1. CAESES/FFW を使用してパラメトリック形状モデルを生成
2. 基準形状 (パラメータ値が基準値の形状) に対して設定ファイルを作成
• GridPro の設定ファイル (~.fra,~.sch)
• OpenFOAM の設定ファイル
3. 試しの計算を実行
4. 実行スクリプトファイルの作成
5. 連携の設定:[Software Connector] の設定
6. 設計空間の探索:実験計画法 (Design of experiments) を使用
7. 最適化計算 (近日中に追記予定)
8. Adjoint 法による形状最適化 (近日中に追記予定)
- 12. 12
1. パラメトリック形状モデルの生成
Design Velocity:
各設計変数の値を変更した際の
法線方向への変形の大きさ
大きい
小さい
設計変数:mid_height1
各設計変数について,
形状のどの部分の移動量が大きいのか
直感的に把握することができます.
- 13. 13
1. パラメトリック形状モデルの生成
Design Velocity:
各設計変数の値を変更した際の
法線方向への変形の大きさ
大きい
小さい
設計変数:mid_height2
各設計変数について,
形状のどの部分の移動量が大きいのか
直感的に把握することができます.
- 14. 14
1. パラメトリック形状モデルの生成
大きい
小さい
設計変数:mid_weight1
断面の丸みをコントロール
Design Velocity:
各設計変数の値を変更した際の
法線方向への変形の大きさ
各設計変数について,
形状のどの部分の移動量が大きいのか
直感的に把握することができます.
- 15. 15
1. パラメトリック形状モデルの生成
大きい
小さい
設計変数:mid_weight2
断面の丸みをコントロール
Design Velocity:
各設計変数の値を変更した際の
法線方向への変形の大きさ
各設計変数について,
形状のどの部分の移動量が大きいのか
直感的に把握することができます.
- 16. 16
1. パラメトリック形状モデルの生成
Design Velocity:
各設計変数の値を変更した際の
法線方向への変形の大きさ
大きい
小さい
設計変数:mid_width
各設計変数について,
形状のどの部分の移動量が大きいのか
直感的に把握することができます.
- 17. 17
2-1. GridPro の設定ファイルの作成
計算格子のトポロジーを設定
• ブロック分割 (ワイヤーフレーム)
• サーフェスと点の対応関係
- 19. 19
2-1. GridPro の設定ファイルの作成
基準形状に対して準備したトポロジーを変形形状の計算格子の生成にも活用
マルチブロックの
構造格子
ブロックごとに
色分け表示
します.
基準形状 変形形状
- 21. 21
5. 連携の設定
OpenFOAM との連携の設定
目的関数の計算値の出力ファイル
圧力差をファイルに出力するように simpleFoam を改造
(資料の最後にある補足をご覧ください)
可視化用 vtk ファイル (Function object 機能で生成)
- 22. 22
5. 連携の設定
最新バージョン 3.1.2 では,CAESES Free と
OpenFOAM の連携の設定のチュートリアルが
追加されています.
1. クリック
2. クリック
3. クリック
PDF ファイル
が開きます.
設定の詳細が解説されています!
- 24. 24
6. 設計空間の探索
探索点の数が多いほど得られる情報は多くなりますが,計算コストもそれに
比例して増加します.
最も直感的なアイディア:
各設計変数の定義域を均等に分割
1つ目の設計変数の値の範囲
2つ目の設計変数の値の範囲
それぞれの探索点 (変形形状) について,
• 計算格子の生成
• 流体計算
を実行する必要があります.
- 25. 25
6. 設計空間の探索
この方法では,設計変数の数の増加に伴い,計算コストが指数関数的に増加
してしまいます.
できるだけ少ない計算コストで
効率的に情報を得られるように
探索点を配置する方法はないのか?
実験計画法
Design Of Experiments (DOE)
この資料では,Sobol を使用します.
- 26. 26
6. 設計空間の探索
Sobol とは?
• Low-discrepancy sequence (低食い違い量列,超一様分布列),または,
quasi random sequence (準乱数列) と呼ばれる点列の生成方法の一種です.
• 決定論的な点列であり,同じ設定では同じ点列が生成されます.
• 空間的に均等な分布をもたらすように設計されています.
実際に生成される点列の分布を見てみましょう.
- 30. 30
6. 設計空間の探索
Sobol の設定
変形形状の数を指定します.
それぞれの設計変数の
• 上限値 [Upper]
• 下限値 [Lower]
を設定します.
目的関数を指定します.
- 51. 51
6. 設計空間の探索
終了したタスクを表示
実行中のタスクを表示
選択したタスクの
標準出力を表示
この図では,
OpenFOAM の出力
- 54. 54
6. 設計空間の探索
基準形状 (baseline) Sobol のベスト形状
921.12 [Pa] 439.32 [Pa]
形状比較
- 57. 57
7. 最適化計算
設計空間の探索で得られたベストな形状 (Sobol_01_des0019) を初期形状
として最適化計算を実行します.
- 60. 60
補足. mysimpleFoam の作成
目的関数の値を計算してファイルに出力するように simpleFoam に変更を加
えます.
変更後のソルバー名を,mysimpleFoam としています.
• OpenFOAM の環境変数の読み込み
$ source $HOME/OpenFOAM/OpenFOAM-2.3.x/etc/bashrc
• simpleFoam ディレクトリへ移動
$ sol
$ cd incompressible/simpleFoam
$ wclean
• simpleFoam をコピー
$ cd ../
$ cp -r simpleFoam mysimpleFoam
• mysimpleFoam ディレクトリへ移動
$ cd mysimpleFoam
- 61. 61
補足. mysimpleFoam の作成
• 不要なファイル等を削除します.
$ rm Allwmake
$ rm –r SRFSimpleFoam
$ rm –r porousSimpleFoam
• ファイル名を変更します.
$ mv simpleFoam.C mysimpleFoam.C
• Make/files の内容を修正します.
simpleFoam.C
files (修正前)
EXE = $(FOAM_APPBIN)/simpleFoam
mysimpleFoam.C
files (修正後)
EXE = $(FOAM_USER_APPBIN)/mysimpleFoam
- 62. 62
補足. mysimpleFoam の作成
• 密度の値を [transportProperties] ファイルから読み込めるようにします.
[createFields.H] ファイルの最後に以下を追加します.
Info<< "¥nReading density rho¥n" << endl;
IOdictionary transportProperties
(
IOobject
(
"transportProperties",
runTime.constant(),
mesh,
IOobject::MUST_READ,
IOobject::NO_WRITE
)
);
dimensionedScalar rho = transportProperties.lookup("rho");
- 63. 63
補足. mysimpleFoam の作成
• 全圧用の変数 totP を定義します.
[createFields.H] ファイルの最後に以下を追加します.
// Total pressure field
volScalarField totP
(
IOobject
(
"totP",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh,
dimensionedScalar("totP", dimPressure, 0.0)
);
- 64. 64
補足. mysimpleFoam の作成
• 目的関数の計算値の出力ファイルを設定します.
[createFields.H] ファイルの最後に以下を追加します.
label wPrecision(readScalar(runTime.controlDict().lookup("writePrecision")));
std::ofstream fout("objValue", std::ios::out | std::ios::app);
fout.precision(wPrecision);
- 65. 65
補足. mysimpleFoam の作成
• 目的関数の値を計算して,ファイルへ書き出すようにします.
[objective.H] ファイルを新規に作成し,下記の内容を追加します.
scalar volFlux = 0.0;
scalar objValueIn = 0.0;
scalar objValueOut = 0.0;
scalar tPressDiff = 0.0;
// Update total pressure field
totP = p*rho + 0.5*rho*magSqr(U);
label inletID = mesh.boundaryMesh().findPatchID("inlet");
label outletID = mesh.boundaryMesh().findPatchID("outlet");
// Calculate total pressure difference
volFlux = -gSum(phi.boundaryField()[inletID]);
objValueIn = -gSum(totP.boundaryField()[inletID]*phi.boundaryField()[inletID])/volFlux;
objValueOut = gSum(totP.boundaryField()[outletID]*phi.boundaryField()[outletID])/volFlux;
tPressDiff = objValueIn - objValueOut;
fout<< "Total Pressure Difference = " << tPressDiff << " [Pa]" << std::endl;
- 66. 66
補足. mysimpleFoam の作成
• [mysimpleFoam.C] ファイルに #include “objective.H” を追記します.
turbulence->correct();
#include “objective.H”
runTime.write();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
- 67. 67
補足. CAESES Free のダウンロードサイト
Windows,Linux ともに
32bit,64bit の両方に
対応しています.
ダウンロードサイト