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つの設定が追加で必要です.
抗力,揚力係数の計算を見てみましょう.
𝐶 𝑑 =
𝑭 ∙ 𝒆 𝑑
1
2
𝜌𝑈2 𝑆
抗力係数
揚力係数 𝐶𝑙 =
𝑭 ∙ 𝒆𝑙
1
2
𝜌𝑈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つの設定が追加で必要です.
トルク係数の計算を見てみましょう.
𝐶 𝑚 =
𝝉 ∙ 𝒆 𝑚
1
2
𝜌𝑈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)_coeff
calcTotal
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; //密度 (定数)
圧力係数
𝐶 𝑝 =
𝜌𝑝 − 𝑝∞
1
2
𝜌𝑈∞
2
= 1 −
𝑢
𝑈∞
2
 圧力 𝑝 と流束 𝒖 は計算結果から得られます.rhoInf
pInf
UInf
20
圧力係数の計算 pressureTools
よどみ点において
𝐶 𝑝 = 0
主流より流速が大きい場所で
𝐶 𝑝 < 0
21
Doxygen ドキュメントの活用
 Doxygen ドキュメントを活用することで,
Function Object の設定に関する情報にアクセスできます.
 Doxygen ドキュメントの使用方法は,春日様のページをご覧ください.
検索例)fieldMinMax

OpenFOAM の Function Object 機能について