View
2.050
Download
11
Category
Preview:
DESCRIPTION
OpenFOAM の便利な機能の1つである Function Object についてまとめていきます!
Citation preview
Fumiya Nozaki
最終更新日: 2014年5月24日
Function Object
OpenFOAM v2.3.0
日本語版
Keywords: • OpenFOAM • Function Object
2
Function Object
Function Object でできること OpenFOAM に付属のそれぞれのソルバーを実行しながら, • 流量の計算 • 変数の最大・最小値の計算 • 力,トルクの計算 • 抗力係数,揚力係数,トルク係数の計算 • 断面データの生成 • 境界データの生成 など
を行うことができます.
その他たくさん!今後,逐次追記していきます.
資料中の数式や設定は,非圧縮性流れに関する記述になっています. 圧縮性流れの場合には,適宜読み換えてご使用ください.
注意
3
Function Object の設定方法
設定は,system ディレクトリ内の controlDict ファイルに記述します.
FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // ************************************* // application simpleFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 1000; deltaT 1; writeControl timeStep; writeInterval 50; purgeWrite 0; writeFormat ascii; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; functions { }
Function Object の設定 1つの計算中に使用できる Function Object の数に 制限はありません.
4
流量の計算
outletFlux { type functionObjectLibs enabled outputControl log valueOutput surfaceFormat source sourceName operation fields }
faceSource
faceSource; ("libfieldFunctionObjects.so"); true; outputTime; true; true; null; patch; outlet; sum; (phi);
“sourceName” で指定した『outlet』という名前の境界上で “fields” に指定した流束『phi』を 足し合わせることで出口の流量を計算しています. 流入境界では,phi の符号が負のため流量の符号が負になります.
functions {} の括弧の中に以下のように記述します.次ページ以降も同様.
使用する Function Object のタイプ
抽出するデータに付ける名前です.任意の名前が使用できます. 抽出されたデータは,postProcessing ディレクトリの中に保存されます. この例では,
postProcessing/outletFlux ディレクトリ にデータが保存されます.
注意
5
計算領域全体の流量の収支
totalFlux { type fieldValueDelta; functionObjectLibs ("libfieldFunctionObjects.so"); operation add; source1 { type faceSource; functionObjectLibs ("libfieldFunctionObjects.so"); enabled true; outputControl outputTime; log true; valueOutput true; surfaceFormat null; source patch; sourceName outlet; operation sum; fields (phi); } source2 { type faceSource; functionObjectLibs ("libfieldFunctionObjects.so"); enabled true; outputControl outputTime; log true; valueOutput true; surfaceFormat null; source patch; sourceName inlet; operation sum; fields (phi); } }
fieldValueDelta
入口と出口が1つずつある場合, 2つのタイプの Fuction object • “fieldValueDelta” • “faceSource” を組み合わせることで系全体の流量の 収支を計算することができます. この例では, source1 で出口 (outlet) の流量を計算し,source2 で入口 (inlet) の流量を計算し,それらを足し合わせています (operation add;).
6
変数の最大値・最小値の計算
minMax { // Type of functionObject type // Where to load it from (if not already in solver) functionObjectLibs // Function object enabled flag enabled // Log to output (default: false) log // Write information to file (default: true) write // Fields to be monitored - runTime modifiable fields ( U p ); }
fieldMinMax
fieldMinMax; ("libfieldFunctionObjects.so"); true; true; true;
“fields” に指定した変数 の最大値・最小値を計算 することができます. セル中心値だけではなく 境界値も含めた値が 算出されます.
7
力とトルクの計算 forces
forces { type functionObjectLibs outputControl timeInterval log patches pName UName rhoName log rhoInf CofR }
forces; ( "libforces.so" ); timeStep; 1; yes; ( motorBikeGroup ); p; U; rhoInf; true; 1; (0 0 0);
力の計算に使用される設定項目
𝑭 = 𝜌 𝒏 ∙ 𝑝𝑰 − 𝜈 𝛻𝒖 + 𝛻𝒖𝑇 𝑑𝑆
𝑆
patches
rhoInf
pName
UName
“forces” タイプを使用することで, 物体に作用する流体力とトルクの計算が できます. 非圧縮性のソルバーで使用する場合には, 左のように密度を設定します: • rhoName rhoInf; • rhoInf 1; //密度 (定数) まずは,力の計算を見てみましょう.
𝝉 = 𝜌 𝒓 − 𝒓0 × 𝒏 ∙ 𝑝𝑰 − 𝜈 𝛻𝒖 + 𝛻𝒖𝑇 𝑑𝑆
𝑆
8
力とトルクの計算 forces
forces { type functionObjectLibs outputControl timeInterval log patches pName UName rhoName log rhoInf CofR }
forces; ( "libforces.so" ); timeStep; 1; yes; ( motorBikeGroup ); p; U; rhoInf; true; 1; (0 0 0);
トルクの計算に使用される設定項目
patches
CofR
pName
UName
“forces” タイプを使用することで, 物体に作用する流体力とトルクの計算が できます. 非圧縮性のソルバーで使用する場合には, 左のように密度を設定します: • rhoName rhoInf; • rhoInf 1; //密度 (定数) 次に,トルクの計算を見てみましょう.
設定項目 ”log” で yes や true を設定した場合には,標準出力に下記に示すような出力があります.
力およびトルクそれぞれについて,圧力 (pressure),せん断応力 (viscous),ポーラスメディア (porous) からの寄与に分けて出力されます.
力とトルクはともにベクトル量なので,() 内に左から順番に X,Y,Z 方向成分が出力されます.
9
力とトルクの計算 forces
forces forces output: sum of forces: pressure : (3.19519479621e-07 -3.39283827297e-10 2.91694224797e-07) viscous : (8.61541020438e-08 -9.18181827176e-11 2.88570744872e-07) porous : (0 0 0) sum of moments: pressure : (-2.16036092974e-12 -3.91033482698e-11 2.73917236771e-12) viscous : (-7.83296928941e-11 -2.16231108031e-07 -8.21346879764e-11) porous : (0 0 0)
力
トルク
10
抗力係数,揚力係数,トルク係数の計算 forceCoeffs
forceCoeffs1 { type functionObjectLibs outputControl timeInterval log patches pName UName rhoName log rhoInf CofR liftDir dragDir pitchAxis magUInf lRef Aref }
forces; ( "libforces.so" ); timeStep; 1; yes; ( motorBikeGroup ); p; U; rhoInf; true; 1; (0 0 0); (1 0 0); (0 0 1); (0 1 0); 1; 1; 1;
“forceCoeffs” タイプを使用することで, 物体に作用する流体力とトルクを無次元化 した係数値の計算ができます. “forces” の場合に比べて,左の設定の “liftDir” 以下6つの設定が追加で必要です. 抗力,揚力係数の計算を見てみましょう.
𝐶𝑑 =𝑭 ∙ 𝒆𝑑12𝜌𝑈2𝑆
抗力係数
揚力係数 𝐶𝑙 =𝑭 ∙ 𝒆𝑙12𝜌𝑈2𝑆
dragDir
liftDir
magUInf Aref
11
抗力係数,揚力係数,トルク係数の計算 forceCoeffs
forceCoeffs1 { type functionObjectLibs outputControl timeInterval log patches pName UName rhoName log rhoInf CofR liftDir dragDir pitchAxis magUInf lRef Aref }
forces; ( "libforces.so" ); timeStep; 1; yes; ( motorBikeGroup ); p; U; rhoInf; true; 1; (0 0 0); (1 0 0); (0 0 1); (0 1 0); 1; 1; 1;
“forceCoeffs” タイプを使用することで, 物体に作用する流体力とトルクを無次元化 した係数値の計算ができます. “forces” の場合に比べて,左の設定の “liftDir” 以下6つの設定が追加で必要です. トルク係数の計算を見てみましょう.
𝐶𝑚 =𝝉 ∙ 𝒆𝑚12𝜌𝑈2 𝑙 𝑆
トルク係数
pitchAxis
magUInf Aref
lRef
12
抗力係数,揚力係数,トルク係数の計算 forceCoeffs
設定項目 ”log” で yes や true を設定した場合には,標準出力に下記に示すような出力があります.
Cl(f) および Cl(r) は次の量を表します.
• Cl(f) = Cl/2.0 + Cm
• Cl(r) = Cl/2.0 - Cm
forceCoeffs forceCoeffs1 output: Cm = -4.32540422758e-07 Cd = 1.16052993934e-06 Cl = 8.11347163329e-07 Cl(f) = -2.68668410934e-08 Cl(r) = 8.38214004422e-07
Cm Cd Cl
:トルク係数 :抗力係数 :揚力係数
forceCoeffs.C 223~224 行
13
抗力係数,揚力係数,トルク係数の計算 forceCoeffs
binData { nBin 20; direction (1 0 0); cumulative yes; }
patches を方向 (direction) に等分割 (分割数:nBin) して,それぞれの部分の各係数を出力することができます.
direction
nBin 分割
• cumulative = no 各部分の係数がそれぞれ出力されます.
• cumulative = yes 係数が分割方向の正方向に足されて 出力されます.
Release Note v2.2.0
14
(可視化用) 断面データの生成
cuttingPlane { type functionObjectLibs outputControl surfaceFormat fields interpolationScheme surfaces ( yNormal { type planeType pointAndNormalDict { basePoint normalVector } interpolate } );
surfaces
surfaces; ("libsampling.so"); outputTime; vtk; ( p U ); cellPoint; cuttingPlane; pointAndNormal; (0 0 0); (0 0 1); true;
“fields” の項目に指定した変数について, 断面上の値のデータを VTK 形式で出力 することができます. 左の設定では,断面の位置を • 断面上の点 (“basePoint”) • 断面の法線方向 (“normalVector”) で指定しています. 最適化計算の場合のようにたくさんの 計算を実行する場合や予め見たい断面 が決まっている場合には可視化の処理 を簡略化できるため便利です. 可視化例は16ページをご覧ください.
15
(可視化用) 境界データの生成
Patch { type functionObjectLibs outputControl surfaceFormat fields interpolationScheme surfaces ( rotor { type patches interpolate } ); }
surfaces
surfaces; ("libsampling.so"); outputTime; vtk; ( p U ); cellPoint; patch; 1(rotor); true;
“fields” に指定した変数 (流速 U と圧力 p) について,”patches” に指定した 境界上の値のデータを VTK 形式で出力 することができます. 可視化例は16ページをご覧ください.
16
可視化例
断面データ
境界データ
2つのオプション (calcTotal,calcCoeff) の値の組み合わせにより,出力する変数を4通りコントロールしています.
• total(p) の出力については,18ページをご覧ください.
• static(p)_coeff の出力については,19ページをご覧ください.
17
pressureTools 概要
FALSE TRUE
FALSE static(p) static(p)_coeff
TRUE total(p) total(p)_coeffcalcTotal
calcCoeff
pressureTools
18
全圧の計算
totalPressure { type functionObjectLibs outputControl calcTotal calcCoeff pRef rhoName rhoInf }
pressureTools; ( "libutilityFunctionObjects.so" ); outputTime; true; false; 101325; rhoInf; 1.2;
全圧を算出する場合
“calcTotal” を true に設定 “calcCoeff”を false に設定
非圧縮性ソルバーでの密度の 設定
• rhoName rhoInf; • rhoInf 1.2; //密度 (定数)
pressureTools
𝑝𝑡 = 𝑝𝑟𝑒𝑓 + 𝜌𝑝 +1
2𝜌𝑢2
全圧
pRef
rhoInf
圧力 𝑝 と流束 𝒖 は計算結果から得られます.
19
圧力係数の計算 pressureTools
totalPressure { type functionObjectLibs outputControl calcTotal calcCoeff pInf UInf rhoName rhoInf }
pressureTools; ( "libutilityFunctionObjects.so" ); outputTime; false; true; 231.5; // unit: [Pa] (25.75 3.62 0); // unit: [m/s] rhoInf; 1.2;
圧力係数を算出する場合
“calcTotal” を false に設定 “calcCoeff” を true に設定
非圧縮性ソルバーでの密度の 設定
• rhoName rhoInf; • rhoInf 1.2; //密度 (定数)
圧力係数
𝐶𝑝 =𝜌𝑝 − 𝑝∞12𝜌𝑈∞
2= 1 −
𝑢
𝑈∞
2
圧力 𝑝 と流束 𝒖 は計算結果から得られます. rhoInf
pInf
UInf
20
圧力係数の計算 pressureTools
よどみ点において
𝐶𝑝 = 0
主流より流速が大きい場所で 𝐶𝑝 < 0
21
Doxygen ドキュメントの活用
Doxygen ドキュメントを活用することで, Function Object の設定に関する情報にアクセスできます.
Doxygen ドキュメントの使用方法は,春日様のページをご覧ください.
検索例)fieldMinMax
Recommended