openfoam の function object 機能について

21
Fumiya Nozaki 最終更新日: 2014年5月24日 Function Object OpenFOAM v2.3.0 日本語版 Keywords: OpenFOAM Function Object

Upload: fumiya-nozaki

Post on 22-Nov-2014

2.050 views

Category:

Technology


11 download

DESCRIPTION

OpenFOAM の便利な機能の1つである Function Object についてまとめていきます!

TRANSCRIPT

Page 1: OpenFOAM の Function Object 機能について

Fumiya Nozaki

最終更新日: 2014年5月24日

Function Object

OpenFOAM v2.3.0

日本語版

Keywords: • OpenFOAM • Function Object

Page 2: OpenFOAM の Function Object 機能について

2

Function Object

Function Object でできること OpenFOAM に付属のそれぞれのソルバーを実行しながら, • 流量の計算 • 変数の最大・最小値の計算 • 力,トルクの計算 • 抗力係数,揚力係数,トルク係数の計算 • 断面データの生成 • 境界データの生成 など

を行うことができます.

その他たくさん!今後,逐次追記していきます.

資料中の数式や設定は,非圧縮性流れに関する記述になっています. 圧縮性流れの場合には,適宜読み換えてご使用ください.

注意

Page 3: OpenFOAM の Function Object 機能について

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 の数に 制限はありません.

Page 4: OpenFOAM の 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 ディレクトリ にデータが保存されます.

注意

Page 5: OpenFOAM の Function Object 機能について

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;).

Page 6: OpenFOAM の Function Object 機能について

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” に指定した変数 の最大値・最小値を計算 することができます. セル中心値だけではなく 境界値も含めた値が 算出されます.

Page 7: OpenFOAM の Function Object 機能について

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; //密度 (定数) まずは,力の計算を見てみましょう.

Page 8: OpenFOAM の Function Object 機能について

𝝉 = 𝜌 𝒓 − 𝒓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; //密度 (定数) 次に,トルクの計算を見てみましょう.

Page 9: OpenFOAM の Function Object 機能について

設定項目 ”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)

トルク

Page 10: OpenFOAM の Function Object 機能について

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

Page 11: OpenFOAM の Function Object 機能について

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

Page 12: OpenFOAM の Function Object 機能について

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 行

Page 13: OpenFOAM の Function Object 機能について

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

Page 14: OpenFOAM の Function Object 機能について

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ページをご覧ください.

Page 15: OpenFOAM の Function Object 機能について

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ページをご覧ください.

Page 16: OpenFOAM の Function Object 機能について

16

可視化例

断面データ

境界データ

Page 17: OpenFOAM の Function Object 機能について

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

Page 18: OpenFOAM の Function Object 機能について

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

圧力 𝑝 と流束 𝒖 は計算結果から得られます.

Page 19: OpenFOAM の Function Object 機能について

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

Page 20: OpenFOAM の Function Object 機能について

20

圧力係数の計算 pressureTools

よどみ点において

𝐶𝑝 = 0

主流より流速が大きい場所で 𝐶𝑝 < 0

Page 21: OpenFOAM の Function Object 機能について

21

Doxygen ドキュメントの活用

Doxygen ドキュメントを活用することで, Function Object の設定に関する情報にアクセスできます.

Doxygen ドキュメントの使用方法は,春日様のページをご覧ください.

検索例)fieldMinMax