SlideShare a Scribd company logo
OpenFOAM+のCo-simulation機能と
FMU(Functional Mock-up Unit)の試作
第58回オープンCAE勉強会@関東(流体など)
finback
1
OpenFOAM+のCo-simulation機能
• 概要
• Co-simulationのための設定方法
• 外部プログラムの動作
• データ交換のフォーマット
2
OpenFOAM+ の Co-simulation 機能の概要
http://www.openfoam.com/version-v3.0+/solution-control.php 13/01/2016
• 非定常シミュレーション中にファイルベースのデータ
転送を使用してOpenFOAMと外部コードの間で通信が
できる。
• function object externalCoupled に以下を定義する。
• データ交換に使用するディレクトリ
• リージョン毎またはパッチ、パッチグループ毎に
読み書きするフィールド
• ロックファイルが存在する間、外部プログラムが停止
(一時中断)して、OpenFOAMが境界値の読み書きを
行なう。
• デフォルトのデータフォーマットは、境界面1つに対
して1行の固定形式(ハードコーデッド)である。
チュートリアル
$FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/externalCoupledMultiRegionHeater
OpenFOAM v1606+にも同じチュートリアルがあるので、今回はv1606+を調べる。
3
チュートリアル externalCoupledMultiRegionHeater の概要
coupleGroup (topAirの入口面とheaterの底面)
の温度 T にexternalSolver (shellスクリプト)で
計算した値を設定する。
topAir
bottomWate
r
chtMultiRegionFoamcomms
T.inを出力する
OpenFOAM.lockを生成する T.inを読み込む
T.outを出力する
OpenFOAM.lockを消去する
T.outを読み込む
T.inを出力する
OpenFOAM.lockを生成する T.inを読み込む
T.outを出力する
OpenFOAM.lockを消去する
非定常シミュレーション中に
externalSolver(外部ソルバー)と
chtMultiRegionFoamの間で境界条件を交換する。
heater
OpenFOAM.lockが
無くなるまで 待つ
OpenFOAM.lockが
無くなるまで 待つ
T.in : externalSolverが出力する温度データファイル
T.out : chtMultiRegionFoamが出力する温度データファイル
OpenFOAM.lock : ロックファイル
時間
shellスクリプト
(外部コードの雛形)
データ交換
ディレクトリ
Co-simulationの流れ
OpenFOAM.lockが
生成されるのを待つ
OpenFOAM.lockが
生成されるのを待つ
OpenFOAM
ソルバー
1タイムステップ進める
1タイムステップ進める
externalSolver
4
Co-simulation のための設定方法
• system/controlDict
• system/topAir/changeDictionaryDict
• system/bottomWater/changeDictionaryDict
• Allrun.pre
• Allrunのソルバー実行部分
• externalSolver(外部コードの雛形)
externalCoupledMultiRegionHeater のモデルは、
$FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/multiRegionHeater
とほぼ同じである。違いを調べることによって、Co-simulation のための設定方法がわかる。
設定が必要なファイル
5
Co-Simulationの実行手順
外部プログラムの動き
*--------------------------------*- C++ -*----------------------------------*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: v1606+ |
| ¥¥ / A nd | Web: www.OpenFOAM.com |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Library defines new boundary conditions
libs ("libOpenFOAM.so" "libjobControl.so");
application chtMultiRegionFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 1;
deltaT 0.001;
writeControl adjustableRunTime;
writeInterval 0.1;
purgeWrite 0;
writeFormat ascii;
writePrecision 8;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable yes;
maxCo 0.6;
// Maximum diffusion number
maxDi 10.0;
adjustTimeStep yes;
functions
{
externalCoupled
{
// Where to load it from (if not already in solver)
functionObjectLibs ("libjobControl.so");
type externalCoupled;
// Directory to use for communication
commsDir "${FOAM_CASE}/comms";
// Does external process start first
initByExternal true;
// Additional output
log true;
regions
{
// Region name (wildcards allowed)
"(topAir|heater)"
{
// In topAir adjust the minX patch (fixedValue)
// Patch or patchGroup
coupleGroup
{
// Fields to output in commsDir
writeFields (T);
// Fields to read from commsDir
readFields (T);
}
}
}
}
}
system/controlDict – function object externalCoupled の設定
function object の
externalCoupledの設定
データ交換用ディレクトリ
初期値も外部から設定する
ログ出力する
coupleGroup
という patchGroup で
で温度のフィールドデー
タを交換する。
6
/*--------------------------------*- C++ -*----------------------------------
*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: v1606+ |
| ¥¥ / A nd | Web: www.OpenFOAM.com |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------
*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object changeDictionaryDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dictionaryReplacement
{
boundary
{
minX
{
inGroups (coupleGroup);
}
}
U
{
internalField uniform (0.1 0 0);
*--------------------------------*- C++ -*----------------------------------
*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: v1606+ |
| ¥¥ / A nd | Web: www.OpenFOAM.com |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------
*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object changeDictionaryDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dictionaryReplacement
{
boundary
{
minY
{
type patch;
inGroups (coupleGroup);
}
minZ
{
type patch;
}
maxZ/
{
type patch;
}
}
system/topAir/changeDictionaryDict (一部分) system/bottomWater/changeDictionaryDict(一部分)
topAirの入り口を
coupleGroup に入れる
Heaterの底面を
coupleGroup に入れる
7
① runApplication blockMesh
② runApplication topoSet
③ runApplication splitMeshRegions –cellZones –overwrite
④ 固体領域(heater, leftSolid, rightSolid)で
0/領域名の nut, alphat, epsilon, k, U, p_rgh を消去する。
⑤ 全ての領域で
changeDictionary -region 領域名
を実行する。
⑥ run Application createExternalCoupledPatchGeometry
–regions '(topAir heater)' coupleGroup
⑦ paraFoam -touchAll
comms/heater_topAir/coupleGroup に patchFaces と patchPoints が生成される。
Allrun.pre
① runApplication $(getApplication) &
② runApplication ./externalSolver
Allrun のソルバー実行部分(シングルプロセッサの場合)
OpenFOAMのソルバーをバックグラウンド、外部ソルバーをフォアグラウンドで実行する
8
externalSolverの動作
(外部プログラムの雛形)
chtMultiRegionFoamcomms
T.inを出力する
OpenFOAM.lockを生成する T.inを読み込む
T.outを出力する
OpenFOAM.lockを消去する
T.outを読み込む
T.inを出力する
OpenFOAM.lockを生成する T.inを読み込む
T.outを出力する
OpenFOAM.lockを消去する
OpenFOAM.lockが
無くなるまで 待つ
OpenFOAM.lockが
無くなるまで 待つ
T.in : externalSolverが出力する温度データファイル
T.out : chtMultiRegionFoamが出力する温度データファイル
OpenFOAM.lock : ロックファイル
時間
shellスクリプト データ交換
ディレクトリ
Co-simulationの流れ
OpenFOAM.lockが
生成されるのを待つ
OpenFOAM.lockが
生成されるのを待つ
OpenFOAM
ソルバー
1タイムステップ進める
1タイムステップ進める
externalSolver
初期化
① 境界温度初期値 T.in を出力する。
② OpenFOAM.lock を生成する。
OpneFAM.lock が無くなると。。。
① 境界温度出力 T.out を読み込んで
温度を1度足してT.in に出力する。
② OpenFOAM.lock を生成する。
これを繰り返す。
9
528 0 1
528 0 1
528 0 1
528 0 1
528 0 1
528 0 1
528 0 1
528 0 1
328 0 1
328 0 1
328 0 1
328 0 1
328 0 1
328 0 1
328 0 1
328 0 1
328 0 1
...
T.in
heater底面の温度 8行
topAir入り口面の温度 40行
T.in の各行の内容は、
値、勾配、値と勾配の割合
minX
{
type patch;
nFaces 40;
startFace 3440;
inGroup
( coupleGroup );
}
constant/topAir/polyMesh/boundary (一部分)
minY
{
type patch;
inGroups ( coupleGroup )
nFaces 8;
startFace 156;
}
constant/heater/polyMesh/boundary (一部分)
48
(
4(0 1 2 3)
4(3 2 4 5)
4(1 6 7 2)
…
comms/heater_topAir/coupleGroup/patchFaces (一部分)
531 47556.842
531 47556.841
531 47567.25
531 47567.25
531 47567.255
531 47567.255
531 47556.846
531 47556.846
331 2194.0633
331 1954.3748
331 1937.9028
331 1936.4325
331 2193.9723
331 1954.2926
331 1937.8204
331 1936.3528
331 2194.4991
...
T.out
T.out は1カラムが温度、2カラムは不明出力データ 入力データ
comms/heater_topAir/coupleGroup
データ交換のフォーマット
全体の行数行数は以下を参照。
行数は以下を参照。
10
FMU(Functional Mock-up Unit)の試作
• Co-Simulation システムの概要
• FMUの作成
• Xcos によるFMUの読み込みとシステムモデルの作成
• OpenFOAM 側の準備
• FMUサーバーの編集
• Co-Simulation の実行
11
FMUを使ったCo-Simulationシステムの概要
マスターツール(Xcos, PyFMIなど)
マスター
ツールの
モデル
FMU
FMU
サーバー
スレーブ
ツールの
モデルTCP/IP
ソケット
通信
FMU SDKを改造して
通信機能を持たせる。
PythonのThreadingTCPServer
を使用して作成する。
OpenFOAM
Windows, Linux, Mac, …
スレーブツール
Windows, Linux, Mac,…
構想中のシステム
前回の作成範囲
今回もWindows版のみ
Xcos を使用する。
今回の作成範囲
Linux, OpenFOAM
12
http://www.slideshare.net/AMANETANAKA/fmi10-fmi-for-cosimulation
13
作成したもの
FMUジェネレータ(Python)
• FMUのソースコード(可変部、モデル固有の
情報を含む)を出力する。
• XMLファイルを生成する。
• バッチファイルを使用してコンパイルし、ZIP
化を行う。
FMUのソースコード(不変部)(C言語)
• FMUサーバーと通信を行うクライアント。
• FMU SDKのCo-Simulation用のソースコード
を改造し通信機能を持たせる。
FMUサーバ (Python)
• FMU本体の要求によってスレーブツールをコ
ントロールするサーバ。
• Pythonの標準ライブラリを使用し、マルチプ
ラットフォームを目指す。
fmuchick (https://github.com/finback-at/fmuchick )
FMUジェネレータ
fmuchick.py
FMUのソースコード
FMUサーバー
fmuserver.py
テスト用データ
開発およびテスト環境
• Windows 10
• Visual Studio 2012
• Python 2.7.11 (32bit)
• wxPython 3.0
モデル名
• FOAMTestModel
入力変数
• T_heaterIn : heater 底面の温度
• T_topAirIn : topAir 入り口の温度
出力変数
• Tavr_topAir : topAirの平均温度
シミュレーション時間
Start Time 0 s
Stop Time 10 s
Communication Step 0.1 s
FMUの作成 generator¥fmuchick.py によるFMUの作成
チュートリアル
externalCoupledMultiRegionHeater
をベースとしてOpenFOAMと通信する
FOAMTestModel.fmu を作成する。
IP Address やポート番号はLinuxマシンに合わせて適宜変更する。14
Xcos によるFMUの読み込みとシステムモデル作成
OpenFOAMのモデル
のブロック
Heater底面温度
topAir入口温度
topAir平均温度
Functional Mock-up Interfaces>FMI 1.0>FMInterface
右クリックしてブロックパラメータで FOAMTestModel.fmu を読み込む。
Communication Step
15
信号源>CONST
信号源>CONST
信号源>CLOCK_c
信号源>GENSIN_f
Communication Step
0.1 s
出力/表示>CSCOPE
出力/表示>CSCOPE
シミュレーション>設定
Stop
Time
10s
Start Time
0 s
16
/*--------------------------------*- C++ -*----------------------------------
*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: v1606+ |
| ¥¥ / A nd | Web: www.OpenFOAM.com |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------
*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Library defines new boundary conditions
libs ("libOpenFOAM.so" "libjobControl.so"
"libfieldFunctionObjects.so" "libFVFunctionObjects.so");
application chtMultiRegionFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 10.0;
deltaT 0.01;
writeControl adjustableRunTime;
writeInterval 0.1;
purgeWrite 0;
writeFormat ascii;
writePrecision 8;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable yes;
maxCo 0.6;
// Maximum diffusion number
maxDi 10.0;
adjustTimeStep on;
functions
{
volAvgT
{
type cellSource;
region "topAir";
fields (T);
valueOutput false;
source all;
operation volAverage;
outputControl timeStep;
outputInterval 1;
}
OpenFOAM 側の準備(1)
system/controlDict
スタート時間
ストップ時間
コミュニケーションステップ
topAirの平均温度
の出力の設定
入口の流速が規定
されているため
クーラン条件から
ソルバーステップは
約 0.03秒になっている。
だいたい3ステップに1回
データ交換する。
function object の追加
17
externalCoupled
{
// Where to load it from (if not already in solver)
functionObjectLibs ("libjobControl.so");
type externalCoupled;
// Directory to use for communication
commsDir "${FOAM_CASE}/comms";
// Does external process start first
initByExternal true;
// Additional output
log true;
regions
{
// Region name (wildcards allowed)
"(topAir|heater)"
{
// In topAir adjust the minX patch (fixedValue)
// Patch or patchGroup
coupleGroup
{
// Fields to output in commsDir
writeFields (T);
// Fields to read from commsDir
readFields (T);
}
}
}
}
}
// ************************************************************************* //
system/controlDict (続き)
heater底面
topAir入口
の温度の書き出しと
読み込みの設定
(チュートリアルのまま)
http://www.geocities.jp/penguinitis2002/study/OpenFO
AM/function_objects.html
PENGUINITIS – function objects
http://www.slideshare.net/fumiyanozaki96/openfoam-
function-object
OpenFOAM の Function Object 機能について
出力変数の抽出のための function object の書き方は以下の
リンクが参考になる。
18
!/bin/sh
. $HOME/OpenFOAM/OpenFOAM-v1606+/etc/bashrc
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
rm -rf comms/OpenFOAM.lock
rm -rf postProcessing
rm -rf processor*
foamListTimes -rm -noZero
rm -rf log.decomposePar
rm -rf log.reconstructPar
#-- Run on single processor
#runApplication $(getApplication) &
# Simulated external solver
#runApplication ./externalSolver
# Decompose
runApplication decomposePar -allRegions
# Run OpenFOAM
runParallel $(getApplication)
!/bin/sh
. $HOME/OpenFOAM/OpenFOAM-v1606+/etc/bashrc
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
# Reconstruct
runApplication reconstructPar -allRegions
OpenFOAM 側の準備(2) Co-simulationでは、Allrun.pre を実行した後に、
FMUサーバー(fmuserver.py) を立ち上げる。
その前にFMUサーバーから起動されるスクリプトの作成や
FMUサーバーのカスタマイズを行う。
Run – OpenFOAM起動用スクリプト
Post – 並列計算後処理用スクリプト
以前の計算結果や不要
なログファイル、ロッ
クファイルなどを消去
する
OpenFOAMの
並列計算の
開始
リコンストラクト
19
def toolInitialize(self):
self.proc = subprocess.Popen('./Run', shell=True)
time.sleep(10)
print "pid = "+str(self.proc.pid)
self.stime = 0.0
def toolDoStep(self):
t = self.ctime + self.cstep
print str(self.stime)+" "+str(t)
while self.stime < t:
self.doSolverStep()
print "t = "+str(self.ctime) + " dt = "+str(self.cstep)
def toolTerminate(self):
subprocess.check_call('./Post', shell=True)
if not (self.proc is None):
os.killpg(os.getpgid(self.proc.pid), signal.SIGKILL)
print "Terminate tool!"
def doSolverStep(self):
grad0 = 0
ratio0 = 1
grad1 = 0
ratio1 = 1
f = open("comms/heater_topAir/coupleGroup/T.in","w")
for i in range(0,8):
f.write(str(self.inputValue[0])+" "+str(grad0)+" "+str(ratio0)+"¥n")
for i in range(8,48):
f.write(str(self.inputValue[1])+" "+str(grad1)+" "+str(ratio1)+"¥n")
f.close()
# generate lock file
f = open("comms/OpenFOAM.lock","w")
f.close()
while (os.path.isfile("comms/OpenFOAM.lock")):
time.sleep(0.02)
cmd = "tail -n1 postProcessing/topAir/volAvgT/0/cellSource.dat"
a = subprocess.check_output( cmd.split(" ") ).rstrip("¥n").split("¥t")
self.stime = float(a[0].rstrip())
self.outputValue[0] = float(a[1])
print "t="+str(self.stime)+" Tavr="+str(self.outputValue[0])
FMUサーバーの編集
初期化
(OpenFOAMの起動)
Runの実行
コミュニケーションステップ
のシミュレーション実行
シミュレーション
中止(終了処理)
Postの実行
heater底面温度、topAir入口温度
の入力データファイル作成
ロックファイルを生成
して無くなるまで待つ
OpenFOAMを操作するようにFMUサーバー (fmuserver.py)を編集する
topAir の平均温度と
ソルバー時間を取得する。
その他、fmuserver.py の最初の方にあるport number をFMUの設定値に合わせて変更する。
20
Co-Simulationの実行
OpenFOAMのモデル
Heater底面温度
topAir入口温度
topAir平均温度
① Linux 上でFMUサーバを実
行する。
② Xcosのシミュレーション
を実行する。
21
Co-Simulationの実行結果
Heater底面温度(黒)とtopAir入口温度(緑) topAir平均温度
22
0.0 s 0.4 s 0.8 s 1.2 s
1.6 s 2.0 s 2.4 s 2.8 s
3.2 s 3.6 s 4.0 s 4.4 s 23
OpenFOAM+のシミュレーション結果(温度)
まとめ
• OpenFOAM+のCo-simulation機能について、チュートリアル
モデルから使用方法を調べた。
• チュートリアルモデルをベースにしてFMUを作成し、Xcosをマ
スターソルバーとする簡単なCo-simulationを行った。
24

More Related Content

What's hot

配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
TatsuyaKatayama
 
OpenFoamの混相流solver interFoamのパラメータによる解の変化
OpenFoamの混相流solver interFoamのパラメータによる解の変化OpenFoamの混相流solver interFoamのパラメータによる解の変化
OpenFoamの混相流solver interFoamのパラメータによる解の変化
takuyayamamoto1800
 
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
Fumiya Nozaki
 
Dynamic Mesh in OpenFOAM
Dynamic Mesh in OpenFOAMDynamic Mesh in OpenFOAM
Dynamic Mesh in OpenFOAM
Fumiya Nozaki
 
OpenFOAM の境界条件をまとめよう!
OpenFOAM の境界条件をまとめよう!OpenFOAM の境界条件をまとめよう!
OpenFOAM の境界条件をまとめよう!
Fumiya Nozaki
 

What's hot (20)

配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
配管流路の多目的最適化OpenFOAM+OpenMDAO(第28回オープンCAE勉強会@関西)
 
Paraviewの等高面を綺麗に出力する
Paraviewの等高面を綺麗に出力するParaviewの等高面を綺麗に出力する
Paraviewの等高面を綺麗に出力する
 
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテストスーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
 
OpenFOAMソルバの実行時ベイズ最適化
OpenFOAMソルバの実行時ベイズ最適化OpenFOAMソルバの実行時ベイズ最適化
OpenFOAMソルバの実行時ベイズ最適化
 
FreeCAD OpenFOAM Workbenchセットアップ方法と課題
FreeCAD OpenFOAM Workbenchセットアップ方法と課題FreeCAD OpenFOAM Workbenchセットアップ方法と課題
FreeCAD OpenFOAM Workbenchセットアップ方法と課題
 
Mixer vessel by cfmesh
Mixer vessel by cfmeshMixer vessel by cfmesh
Mixer vessel by cfmesh
 
OpenFoamの混相流solver interFoamのパラメータによる解の変化
OpenFoamの混相流solver interFoamのパラメータによる解の変化OpenFoamの混相流solver interFoamのパラメータによる解の変化
OpenFoamの混相流solver interFoamのパラメータによる解の変化
 
OpenFOAMの壁関数
OpenFOAMの壁関数OpenFOAMの壁関数
OpenFOAMの壁関数
 
OpenFOAMにおける相変化解析
OpenFOAMにおける相変化解析OpenFOAMにおける相変化解析
OpenFOAMにおける相変化解析
 
OpenFOAMによる混相流シミュレーション入門
OpenFOAMによる混相流シミュレーション入門OpenFOAMによる混相流シミュレーション入門
OpenFOAMによる混相流シミュレーション入門
 
OpenFOAM v2.3.0のチュートリアル 『oscillatingInletACMI2D』
OpenFOAM v2.3.0のチュートリアル 『oscillatingInletACMI2D』OpenFOAM v2.3.0のチュートリアル 『oscillatingInletACMI2D』
OpenFOAM v2.3.0のチュートリアル 『oscillatingInletACMI2D』
 
OpenFOAMのinterfoamによる誤差
OpenFOAMのinterfoamによる誤差OpenFOAMのinterfoamによる誤差
OpenFOAMのinterfoamによる誤差
 
Dakota+openFoam1
Dakota+openFoam1Dakota+openFoam1
Dakota+openFoam1
 
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
 
About dexcs2021 for OpenFOAM
About dexcs2021 for OpenFOAMAbout dexcs2021 for OpenFOAM
About dexcs2021 for OpenFOAM
 
FMI1.0 FMI for Co-Simulation について
FMI1.0 FMI for Co-Simulation についてFMI1.0 FMI for Co-Simulation について
FMI1.0 FMI for Co-Simulation について
 
Mesh dexcs
Mesh dexcsMesh dexcs
Mesh dexcs
 
rhoCentralFoam in OpenFOAM
rhoCentralFoam in OpenFOAMrhoCentralFoam in OpenFOAM
rhoCentralFoam in OpenFOAM
 
Dynamic Mesh in OpenFOAM
Dynamic Mesh in OpenFOAMDynamic Mesh in OpenFOAM
Dynamic Mesh in OpenFOAM
 
OpenFOAM の境界条件をまとめよう!
OpenFOAM の境界条件をまとめよう!OpenFOAM の境界条件をまとめよう!
OpenFOAM の境界条件をまとめよう!
 

Viewers also liked

Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
Modelon
 
CAESES Free チュートリアル
CAESES Free チュートリアルCAESES Free チュートリアル
CAESES Free チュートリアル
Fumiya Nozaki
 
Limited Gradient Schemes in OpenFOAM
Limited Gradient Schemes in OpenFOAMLimited Gradient Schemes in OpenFOAM
Limited Gradient Schemes in OpenFOAM
Fumiya Nozaki
 
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
TatsuyaKatayama
 
Spatial Interpolation Schemes in OpenFOAM
Spatial Interpolation Schemes in OpenFOAMSpatial Interpolation Schemes in OpenFOAM
Spatial Interpolation Schemes in OpenFOAM
Fumiya Nozaki
 
研究の世界入門B 科学的方法
研究の世界入門B 科学的方法研究の世界入門B 科学的方法
研究の世界入門B 科学的方法
sympo2011
 

Viewers also liked (20)

オープンソースによるモデルベースデザイン(OpenModelica)
オープンソースによるモデルベースデザイン(OpenModelica)オープンソースによるモデルベースデザイン(OpenModelica)
オープンソースによるモデルベースデザイン(OpenModelica)
 
OpenFOAM を用いた Adjoint 形状最適化事例1
OpenFOAM を用いた Adjoint 形状最適化事例1OpenFOAM を用いた Adjoint 形状最適化事例1
OpenFOAM を用いた Adjoint 形状最適化事例1
 
Boundary Conditions in OpenFOAM
Boundary Conditions in OpenFOAMBoundary Conditions in OpenFOAM
Boundary Conditions in OpenFOAM
 
Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
Model-Based Integration for FMI Co-Simulation and Heterogeneous Simulations o...
 
Flow and Noise Simulation of the NASA Tandem Cylinder Experiment using OpenFOAM
Flow and Noise Simulation of the NASA Tandem Cylinder Experiment using OpenFOAMFlow and Noise Simulation of the NASA Tandem Cylinder Experiment using OpenFOAM
Flow and Noise Simulation of the NASA Tandem Cylinder Experiment using OpenFOAM
 
blockCoupledSwirlTestチュートリアル
blockCoupledSwirlTestチュートリアルblockCoupledSwirlTestチュートリアル
blockCoupledSwirlTestチュートリアル
 
CAESES Free チュートリアル
CAESES Free チュートリアルCAESES Free チュートリアル
CAESES Free チュートリアル
 
Limited Gradient Schemes in OpenFOAM
Limited Gradient Schemes in OpenFOAMLimited Gradient Schemes in OpenFOAM
Limited Gradient Schemes in OpenFOAM
 
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
OpenMDAOの最適化を試す(第23回オープンCAE勉強会@関西)
 
1. 北大URAシンポジウム発表資料 川端理事分 2015年10月6日
1. 北大URAシンポジウム発表資料 川端理事分 2015年10月6日1. 北大URAシンポジウム発表資料 川端理事分 2015年10月6日
1. 北大URAシンポジウム発表資料 川端理事分 2015年10月6日
 
簡易モデルと詳細モデル
簡易モデルと詳細モデル簡易モデルと詳細モデル
簡易モデルと詳細モデル
 
Softbridge featured in Japan' Nikkei Computer
Softbridge featured in Japan' Nikkei ComputerSoftbridge featured in Japan' Nikkei Computer
Softbridge featured in Japan' Nikkei Computer
 
3. 北大URAシンポジウム発表資料 江端URA分 2015年10月6日
3. 北大URAシンポジウム発表資料 江端URA分 2015年10月6日3. 北大URAシンポジウム発表資料 江端URA分 2015年10月6日
3. 北大URAシンポジウム発表資料 江端URA分 2015年10月6日
 
「熱」に関するシミュレーションの事例をご紹介
「熱」に関するシミュレーションの事例をご紹介「熱」に関するシミュレーションの事例をご紹介
「熱」に関するシミュレーションの事例をご紹介
 
Spatial Interpolation Schemes in OpenFOAM
Spatial Interpolation Schemes in OpenFOAMSpatial Interpolation Schemes in OpenFOAM
Spatial Interpolation Schemes in OpenFOAM
 
受動部品のスパイスモデル と シミュレーション
受動部品のスパイスモデルとシミュレーション受動部品のスパイスモデルとシミュレーション
受動部品のスパイスモデル と シミュレーション
 
研究の世界入門B 科学的方法
研究の世界入門B 科学的方法研究の世界入門B 科学的方法
研究の世界入門B 科学的方法
 
Processing.jsでおうちハック
Processing.jsでおうちハックProcessing.jsでおうちハック
Processing.jsでおうちハック
 
Oracle Cloud Developers Meetup@東京
Oracle Cloud Developers Meetup@東京Oracle Cloud Developers Meetup@東京
Oracle Cloud Developers Meetup@東京
 
外国語教育メディア学会第54回全国研究大会ワークショップ「Rによる外国語教育データの分析と可視化の基本」
外国語教育メディア学会第54回全国研究大会ワークショップ「Rによる外国語教育データの分析と可視化の基本」外国語教育メディア学会第54回全国研究大会ワークショップ「Rによる外国語教育データの分析と可視化の基本」
外国語教育メディア学会第54回全国研究大会ワークショップ「Rによる外国語教育データの分析と可視化の基本」
 

Similar to OpenFOAM+のCo-simulation機能とFMUの試作

C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
tripodworks
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
kasaharatt
 
X tapp lecture_20140226_tapioca
X tapp lecture_20140226_tapiocaX tapp lecture_20140226_tapioca
X tapp lecture_20140226_tapioca
xTAPP
 

Similar to OpenFOAM+のCo-simulation機能とFMUの試作 (20)

Altanative macro
Altanative macroAltanative macro
Altanative macro
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
Prelude to Halide
Prelude to HalidePrelude to Halide
Prelude to Halide
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
OpenFOAM Case Handling in dakota-6.8 gui
OpenFOAM Case Handling in dakota-6.8 guiOpenFOAM Case Handling in dakota-6.8 gui
OpenFOAM Case Handling in dakota-6.8 gui
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
B lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめB lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめ
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code reading
 
About chtMultiRegionFoam
About chtMultiRegionFoam About chtMultiRegionFoam
About chtMultiRegionFoam
 
X tapp lecture_20140226_tapioca
X tapp lecture_20140226_tapiocaX tapp lecture_20140226_tapioca
X tapp lecture_20140226_tapioca
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 

Recently uploaded

ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
miyp
 

Recently uploaded (8)

エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
 
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
 
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
 
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
 
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
 

OpenFOAM+のCo-simulation機能とFMUの試作

  • 2. OpenFOAM+のCo-simulation機能 • 概要 • Co-simulationのための設定方法 • 外部プログラムの動作 • データ交換のフォーマット 2
  • 3. OpenFOAM+ の Co-simulation 機能の概要 http://www.openfoam.com/version-v3.0+/solution-control.php 13/01/2016 • 非定常シミュレーション中にファイルベースのデータ 転送を使用してOpenFOAMと外部コードの間で通信が できる。 • function object externalCoupled に以下を定義する。 • データ交換に使用するディレクトリ • リージョン毎またはパッチ、パッチグループ毎に 読み書きするフィールド • ロックファイルが存在する間、外部プログラムが停止 (一時中断)して、OpenFOAMが境界値の読み書きを 行なう。 • デフォルトのデータフォーマットは、境界面1つに対 して1行の固定形式(ハードコーデッド)である。 チュートリアル $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/externalCoupledMultiRegionHeater OpenFOAM v1606+にも同じチュートリアルがあるので、今回はv1606+を調べる。 3
  • 4. チュートリアル externalCoupledMultiRegionHeater の概要 coupleGroup (topAirの入口面とheaterの底面) の温度 T にexternalSolver (shellスクリプト)で 計算した値を設定する。 topAir bottomWate r chtMultiRegionFoamcomms T.inを出力する OpenFOAM.lockを生成する T.inを読み込む T.outを出力する OpenFOAM.lockを消去する T.outを読み込む T.inを出力する OpenFOAM.lockを生成する T.inを読み込む T.outを出力する OpenFOAM.lockを消去する 非定常シミュレーション中に externalSolver(外部ソルバー)と chtMultiRegionFoamの間で境界条件を交換する。 heater OpenFOAM.lockが 無くなるまで 待つ OpenFOAM.lockが 無くなるまで 待つ T.in : externalSolverが出力する温度データファイル T.out : chtMultiRegionFoamが出力する温度データファイル OpenFOAM.lock : ロックファイル 時間 shellスクリプト (外部コードの雛形) データ交換 ディレクトリ Co-simulationの流れ OpenFOAM.lockが 生成されるのを待つ OpenFOAM.lockが 生成されるのを待つ OpenFOAM ソルバー 1タイムステップ進める 1タイムステップ進める externalSolver 4
  • 5. Co-simulation のための設定方法 • system/controlDict • system/topAir/changeDictionaryDict • system/bottomWater/changeDictionaryDict • Allrun.pre • Allrunのソルバー実行部分 • externalSolver(外部コードの雛形) externalCoupledMultiRegionHeater のモデルは、 $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/multiRegionHeater とほぼ同じである。違いを調べることによって、Co-simulation のための設定方法がわかる。 設定が必要なファイル 5 Co-Simulationの実行手順 外部プログラムの動き
  • 6. *--------------------------------*- C++ -*----------------------------------*¥ | ========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: v1606+ | | ¥¥ / A nd | Web: www.OpenFOAM.com | | ¥¥/ M anipulation | | ¥*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Library defines new boundary conditions libs ("libOpenFOAM.so" "libjobControl.so"); application chtMultiRegionFoam; startFrom startTime; startTime 0; stopAt endTime; endTime 1; deltaT 0.001; writeControl adjustableRunTime; writeInterval 0.1; purgeWrite 0; writeFormat ascii; writePrecision 8; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable yes; maxCo 0.6; // Maximum diffusion number maxDi 10.0; adjustTimeStep yes; functions { externalCoupled { // Where to load it from (if not already in solver) functionObjectLibs ("libjobControl.so"); type externalCoupled; // Directory to use for communication commsDir "${FOAM_CASE}/comms"; // Does external process start first initByExternal true; // Additional output log true; regions { // Region name (wildcards allowed) "(topAir|heater)" { // In topAir adjust the minX patch (fixedValue) // Patch or patchGroup coupleGroup { // Fields to output in commsDir writeFields (T); // Fields to read from commsDir readFields (T); } } } } } system/controlDict – function object externalCoupled の設定 function object の externalCoupledの設定 データ交換用ディレクトリ 初期値も外部から設定する ログ出力する coupleGroup という patchGroup で で温度のフィールドデー タを交換する。 6
  • 7. /*--------------------------------*- C++ -*---------------------------------- *¥ | ========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: v1606+ | | ¥¥ / A nd | Web: www.OpenFOAM.com | | ¥¥/ M anipulation | | ¥*--------------------------------------------------------------------------- */ FoamFile { version 2.0; format ascii; class dictionary; object changeDictionaryDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dictionaryReplacement { boundary { minX { inGroups (coupleGroup); } } U { internalField uniform (0.1 0 0); *--------------------------------*- C++ -*---------------------------------- *¥ | ========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: v1606+ | | ¥¥ / A nd | Web: www.OpenFOAM.com | | ¥¥/ M anipulation | | ¥*--------------------------------------------------------------------------- */ FoamFile { version 2.0; format ascii; class dictionary; object changeDictionaryDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dictionaryReplacement { boundary { minY { type patch; inGroups (coupleGroup); } minZ { type patch; } maxZ/ { type patch; } } system/topAir/changeDictionaryDict (一部分) system/bottomWater/changeDictionaryDict(一部分) topAirの入り口を coupleGroup に入れる Heaterの底面を coupleGroup に入れる 7
  • 8. ① runApplication blockMesh ② runApplication topoSet ③ runApplication splitMeshRegions –cellZones –overwrite ④ 固体領域(heater, leftSolid, rightSolid)で 0/領域名の nut, alphat, epsilon, k, U, p_rgh を消去する。 ⑤ 全ての領域で changeDictionary -region 領域名 を実行する。 ⑥ run Application createExternalCoupledPatchGeometry –regions '(topAir heater)' coupleGroup ⑦ paraFoam -touchAll comms/heater_topAir/coupleGroup に patchFaces と patchPoints が生成される。 Allrun.pre ① runApplication $(getApplication) & ② runApplication ./externalSolver Allrun のソルバー実行部分(シングルプロセッサの場合) OpenFOAMのソルバーをバックグラウンド、外部ソルバーをフォアグラウンドで実行する 8
  • 9. externalSolverの動作 (外部プログラムの雛形) chtMultiRegionFoamcomms T.inを出力する OpenFOAM.lockを生成する T.inを読み込む T.outを出力する OpenFOAM.lockを消去する T.outを読み込む T.inを出力する OpenFOAM.lockを生成する T.inを読み込む T.outを出力する OpenFOAM.lockを消去する OpenFOAM.lockが 無くなるまで 待つ OpenFOAM.lockが 無くなるまで 待つ T.in : externalSolverが出力する温度データファイル T.out : chtMultiRegionFoamが出力する温度データファイル OpenFOAM.lock : ロックファイル 時間 shellスクリプト データ交換 ディレクトリ Co-simulationの流れ OpenFOAM.lockが 生成されるのを待つ OpenFOAM.lockが 生成されるのを待つ OpenFOAM ソルバー 1タイムステップ進める 1タイムステップ進める externalSolver 初期化 ① 境界温度初期値 T.in を出力する。 ② OpenFOAM.lock を生成する。 OpneFAM.lock が無くなると。。。 ① 境界温度出力 T.out を読み込んで 温度を1度足してT.in に出力する。 ② OpenFOAM.lock を生成する。 これを繰り返す。 9
  • 10. 528 0 1 528 0 1 528 0 1 528 0 1 528 0 1 528 0 1 528 0 1 528 0 1 328 0 1 328 0 1 328 0 1 328 0 1 328 0 1 328 0 1 328 0 1 328 0 1 328 0 1 ... T.in heater底面の温度 8行 topAir入り口面の温度 40行 T.in の各行の内容は、 値、勾配、値と勾配の割合 minX { type patch; nFaces 40; startFace 3440; inGroup ( coupleGroup ); } constant/topAir/polyMesh/boundary (一部分) minY { type patch; inGroups ( coupleGroup ) nFaces 8; startFace 156; } constant/heater/polyMesh/boundary (一部分) 48 ( 4(0 1 2 3) 4(3 2 4 5) 4(1 6 7 2) … comms/heater_topAir/coupleGroup/patchFaces (一部分) 531 47556.842 531 47556.841 531 47567.25 531 47567.25 531 47567.255 531 47567.255 531 47556.846 531 47556.846 331 2194.0633 331 1954.3748 331 1937.9028 331 1936.4325 331 2193.9723 331 1954.2926 331 1937.8204 331 1936.3528 331 2194.4991 ... T.out T.out は1カラムが温度、2カラムは不明出力データ 入力データ comms/heater_topAir/coupleGroup データ交換のフォーマット 全体の行数行数は以下を参照。 行数は以下を参照。 10
  • 11. FMU(Functional Mock-up Unit)の試作 • Co-Simulation システムの概要 • FMUの作成 • Xcos によるFMUの読み込みとシステムモデルの作成 • OpenFOAM 側の準備 • FMUサーバーの編集 • Co-Simulation の実行 11
  • 12. FMUを使ったCo-Simulationシステムの概要 マスターツール(Xcos, PyFMIなど) マスター ツールの モデル FMU FMU サーバー スレーブ ツールの モデルTCP/IP ソケット 通信 FMU SDKを改造して 通信機能を持たせる。 PythonのThreadingTCPServer を使用して作成する。 OpenFOAM Windows, Linux, Mac, … スレーブツール Windows, Linux, Mac,… 構想中のシステム 前回の作成範囲 今回もWindows版のみ Xcos を使用する。 今回の作成範囲 Linux, OpenFOAM 12 http://www.slideshare.net/AMANETANAKA/fmi10-fmi-for-cosimulation
  • 13. 13 作成したもの FMUジェネレータ(Python) • FMUのソースコード(可変部、モデル固有の 情報を含む)を出力する。 • XMLファイルを生成する。 • バッチファイルを使用してコンパイルし、ZIP 化を行う。 FMUのソースコード(不変部)(C言語) • FMUサーバーと通信を行うクライアント。 • FMU SDKのCo-Simulation用のソースコード を改造し通信機能を持たせる。 FMUサーバ (Python) • FMU本体の要求によってスレーブツールをコ ントロールするサーバ。 • Pythonの標準ライブラリを使用し、マルチプ ラットフォームを目指す。 fmuchick (https://github.com/finback-at/fmuchick ) FMUジェネレータ fmuchick.py FMUのソースコード FMUサーバー fmuserver.py テスト用データ 開発およびテスト環境 • Windows 10 • Visual Studio 2012 • Python 2.7.11 (32bit) • wxPython 3.0
  • 14. モデル名 • FOAMTestModel 入力変数 • T_heaterIn : heater 底面の温度 • T_topAirIn : topAir 入り口の温度 出力変数 • Tavr_topAir : topAirの平均温度 シミュレーション時間 Start Time 0 s Stop Time 10 s Communication Step 0.1 s FMUの作成 generator¥fmuchick.py によるFMUの作成 チュートリアル externalCoupledMultiRegionHeater をベースとしてOpenFOAMと通信する FOAMTestModel.fmu を作成する。 IP Address やポート番号はLinuxマシンに合わせて適宜変更する。14
  • 15. Xcos によるFMUの読み込みとシステムモデル作成 OpenFOAMのモデル のブロック Heater底面温度 topAir入口温度 topAir平均温度 Functional Mock-up Interfaces>FMI 1.0>FMInterface 右クリックしてブロックパラメータで FOAMTestModel.fmu を読み込む。 Communication Step 15
  • 17. /*--------------------------------*- C++ -*---------------------------------- *¥ | ========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: v1606+ | | ¥¥ / A nd | Web: www.OpenFOAM.com | | ¥¥/ M anipulation | | ¥*--------------------------------------------------------------------------- */ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Library defines new boundary conditions libs ("libOpenFOAM.so" "libjobControl.so" "libfieldFunctionObjects.so" "libFVFunctionObjects.so"); application chtMultiRegionFoam; startFrom startTime; startTime 0; stopAt endTime; endTime 10.0; deltaT 0.01; writeControl adjustableRunTime; writeInterval 0.1; purgeWrite 0; writeFormat ascii; writePrecision 8; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable yes; maxCo 0.6; // Maximum diffusion number maxDi 10.0; adjustTimeStep on; functions { volAvgT { type cellSource; region "topAir"; fields (T); valueOutput false; source all; operation volAverage; outputControl timeStep; outputInterval 1; } OpenFOAM 側の準備(1) system/controlDict スタート時間 ストップ時間 コミュニケーションステップ topAirの平均温度 の出力の設定 入口の流速が規定 されているため クーラン条件から ソルバーステップは 約 0.03秒になっている。 だいたい3ステップに1回 データ交換する。 function object の追加 17
  • 18. externalCoupled { // Where to load it from (if not already in solver) functionObjectLibs ("libjobControl.so"); type externalCoupled; // Directory to use for communication commsDir "${FOAM_CASE}/comms"; // Does external process start first initByExternal true; // Additional output log true; regions { // Region name (wildcards allowed) "(topAir|heater)" { // In topAir adjust the minX patch (fixedValue) // Patch or patchGroup coupleGroup { // Fields to output in commsDir writeFields (T); // Fields to read from commsDir readFields (T); } } } } } // ************************************************************************* // system/controlDict (続き) heater底面 topAir入口 の温度の書き出しと 読み込みの設定 (チュートリアルのまま) http://www.geocities.jp/penguinitis2002/study/OpenFO AM/function_objects.html PENGUINITIS – function objects http://www.slideshare.net/fumiyanozaki96/openfoam- function-object OpenFOAM の Function Object 機能について 出力変数の抽出のための function object の書き方は以下の リンクが参考になる。 18
  • 19. !/bin/sh . $HOME/OpenFOAM/OpenFOAM-v1606+/etc/bashrc # Source tutorial run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions rm -rf comms/OpenFOAM.lock rm -rf postProcessing rm -rf processor* foamListTimes -rm -noZero rm -rf log.decomposePar rm -rf log.reconstructPar #-- Run on single processor #runApplication $(getApplication) & # Simulated external solver #runApplication ./externalSolver # Decompose runApplication decomposePar -allRegions # Run OpenFOAM runParallel $(getApplication) !/bin/sh . $HOME/OpenFOAM/OpenFOAM-v1606+/etc/bashrc # Source tutorial run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions # Reconstruct runApplication reconstructPar -allRegions OpenFOAM 側の準備(2) Co-simulationでは、Allrun.pre を実行した後に、 FMUサーバー(fmuserver.py) を立ち上げる。 その前にFMUサーバーから起動されるスクリプトの作成や FMUサーバーのカスタマイズを行う。 Run – OpenFOAM起動用スクリプト Post – 並列計算後処理用スクリプト 以前の計算結果や不要 なログファイル、ロッ クファイルなどを消去 する OpenFOAMの 並列計算の 開始 リコンストラクト 19
  • 20. def toolInitialize(self): self.proc = subprocess.Popen('./Run', shell=True) time.sleep(10) print "pid = "+str(self.proc.pid) self.stime = 0.0 def toolDoStep(self): t = self.ctime + self.cstep print str(self.stime)+" "+str(t) while self.stime < t: self.doSolverStep() print "t = "+str(self.ctime) + " dt = "+str(self.cstep) def toolTerminate(self): subprocess.check_call('./Post', shell=True) if not (self.proc is None): os.killpg(os.getpgid(self.proc.pid), signal.SIGKILL) print "Terminate tool!" def doSolverStep(self): grad0 = 0 ratio0 = 1 grad1 = 0 ratio1 = 1 f = open("comms/heater_topAir/coupleGroup/T.in","w") for i in range(0,8): f.write(str(self.inputValue[0])+" "+str(grad0)+" "+str(ratio0)+"¥n") for i in range(8,48): f.write(str(self.inputValue[1])+" "+str(grad1)+" "+str(ratio1)+"¥n") f.close() # generate lock file f = open("comms/OpenFOAM.lock","w") f.close() while (os.path.isfile("comms/OpenFOAM.lock")): time.sleep(0.02) cmd = "tail -n1 postProcessing/topAir/volAvgT/0/cellSource.dat" a = subprocess.check_output( cmd.split(" ") ).rstrip("¥n").split("¥t") self.stime = float(a[0].rstrip()) self.outputValue[0] = float(a[1]) print "t="+str(self.stime)+" Tavr="+str(self.outputValue[0]) FMUサーバーの編集 初期化 (OpenFOAMの起動) Runの実行 コミュニケーションステップ のシミュレーション実行 シミュレーション 中止(終了処理) Postの実行 heater底面温度、topAir入口温度 の入力データファイル作成 ロックファイルを生成 して無くなるまで待つ OpenFOAMを操作するようにFMUサーバー (fmuserver.py)を編集する topAir の平均温度と ソルバー時間を取得する。 その他、fmuserver.py の最初の方にあるport number をFMUの設定値に合わせて変更する。 20
  • 23. 0.0 s 0.4 s 0.8 s 1.2 s 1.6 s 2.0 s 2.4 s 2.8 s 3.2 s 3.6 s 4.0 s 4.4 s 23 OpenFOAM+のシミュレーション結果(温度)