OpenFOAM 勉強会 for beginner 進捗報告 2011 年 10 月 22 日髙橋 1
本日のお題 : 空気齢 部屋の空気窓から流入してから何秒経っているか? 空気齢 =20 秒 : よどんだ空気 空気齢 =1 秒 : 新鮮な空気 3m/s 流速 (m/s) 空気齢 ( 秒 ) 2
空気齢の算出 パッシブスカラー方程式を使用 部屋内に一様な汚染質生成項を与えて汚染質の濃度分布を計算 汚染質濃度から空気齢を算出 汚染質の算出方程式 ( ρc) + ( ρvc) = ( ρd C) + q t ρc C: 汚染質濃度 τ = q q: 一様汚染質発生 (kg/m 3 /s) τ: 空気齢 (s) S.Kato, S.Murakami, H.Kobayashi NEW SCALES FOR EVALUATING VENTILATION EFFICIENCY AS AFFECTED BY SUPPLY AND EXHAUST OPENINGS BASED ON SPATIAL DISTRIBUTION OF CONTAMINANT, International Symosium on Room Air Convection and Ventilation Effectiveness 3
今回の実施内容 simplefoam をベースにして空気齢を算出するソルバ simpleagefoam を作成 作成手順 (I)simpleFoam にパッシブスカラーの方程式を追加 (II) ソース項を追加 (III) 空気齢の算出式を追加 (*) これまでの勉強会 for beginnner や講習会の情報を活用させていただきました 4
5 元の方程式の書き換え = + = + q C q C D C t C ρ τ ρ ρ ρ ) ( ) ( ) ( v OpenFOAM の simplefoam ソルバの記述に合わせて元の方程式の記述形式を修正 = + = + ' ' ) ( ) ( q C q C D C t C τ v 質量保存の記述体積保存の記述 q =q/ρ: 汚染質発生量 (1/s) ρ で割る q: 汚染質発生量 (kg/m 3 /s)
createfields.h (1) Info<< Reading field C n << endl; volscalarfield C // 汚染質濃度 CのFieldを定義 ( IOobject ( "C", runtime.timename(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ); パッシブスカラーの追加参考資料 OpenFOAM 非圧縮性流体解析演習シリーズ第 8 回 ( 中級講習 ) 6
createfields.h (2) singlephasetransportmodel laminartransport(u, phi); dimensionedscalar Sc(laminarTransport.lookup( Sc )); dimensionedscalar Sct(laminarTransport.lookup( Sct )); dimensionedscalar q(laminartransport.lookup("q")); // 新規追加した変数の読み込み 7
createfields.h (3) dimensionedscalar q(laminartransport.lookup("q")); volscalarfield tau // 空気齢 τ の Field を定義 ( IOobject ( "tau", runtime.timename(), mesh, IOobject::NO_READ, //τ は汚染質濃度 C から算出 IOobject::AUTO_WRITE // するので NO_READ で OK ); ), C/q //τ の計算式 8
simpleagefoam.c (simplefoam.c をリネーム 追記 ) Info<< " nstarting time loop n" << endl; while (simple.loop()) Info<< "Time = " << runtime.timename() << nl << endl; p.storepreviter(); // --- Pressure-velocity SIMPLE corrector #include "UEqn.H" #include "peqn.h #include "CEqn.H // CEqn.Hの行を追加 パッシブスカラーの追加参考資料 9 OpenFOAM 非圧縮性流体解析演習シリーズ第 8 回 ( 中級講習 )
CEqn.H volscalarfield diffeff("diffeff", turbulence->nu()/sc + turbulence->nut()/sct); fvscalarmatrix CEqn ( fvm::div(phi, C) - fvm::laplacian(diffeff, C) // 汚染質濃度 C の輸送方程式 == q // 一様な汚染質生成項 ); CEqn.relax(); CEqn.solve(); tau=c/q; // 空気齢の算出式 ソース項の追加参考資料 OpenFOAM 勉強会 for beginner 第 9 回実践ソルバー改良 scalartransportfoam の改良事例 ( 柴田 ) 10
Make/files simpleagefoam.c EXE = $(FOAM_USER_APPBIN)/simpleAgeFoam パッシブスカラーの追加参考資料 OpenFOAM 非圧縮性流体解析演習シリーズ第 8 回 ( 中級講習 ) ソースの書き換えは以上で終わり 11
解析対象 玄関ドア 北窓 風 5m/s 南窓 例題 : 集合住宅 3LDK( 髙橋家 ) 部屋の換気挙動を解析 12
メッシュ作成 google sketchup でモデル作成 STL エクスポート snappyhexmesh 71058 メッシュ google sketchup によるモデリング &STL 変換参考資料 OpenFOAM 勉強会 for beginner 第 5 回 題 6 回テーマ進捗報告 ( 小縣 ) 13
境界条件 南側 inlet(5m/s) window_sw_room 北側 outlet(0pa) window_nw_room door_room window_se_room window_ne_room (*)door_room は開と閉の 2 条件 14
境界条件 & 設定ファイルの準備 手順 とりあえず simpleagefoam を実行 エラーメッセージを見て 不足しているファイル / 記述を特定 よく似た前後の記述を真似して書く 15
0/C ( 境界条件 ) boundaryfield window_n.* // 流出の窓 (2 箇所 ) type zerogradient; // ゼロ勾配 window_s.* // 流入の窓 (2 箇所 ) type fixedvalue; --> FOAM FATAL IO ERROR: cannot find file file: /home/k-takahashi/openfoam/k-takahashi-2.0.1/run/ test/0/c at line 0. value uniform 0; // 流入窓は汚染質濃度 =0 16
( 参考 ) 境界条件の正規表現表示 boundaryfield window_ne_room type zerogradient; window_nw_room type zerogradient; boundaryfield window_n.* //*.( ドットコメ ) は任意の文字列 type zerogradient; 複数の境界条件をまとめて記述 正規表現の他の書き方例 ( よく使いそうなもの ) window_ne_room window_nw_room ( 縦棒 : もしくは ) window_n._room ( ドット : 任意の一文字 ) 17
constant/transportproperties --> FOAM FATAL IO ERROR: keyword Sc is undefined in dictionary "/home/k-takahashi/ OpenFOAM/k-takahashi-2.0.1/run/test/constant/ transportproperties"foam exiting transportmodel Newtonian; nu nu [ 0 2-1 0 0 0 0 ] 1e-05; Sc Sc [ 0 0 0 0 0 0 0 ] 1; // シュミット数 Sct Sct [ 0 0 0 0 0 0 0 ] 1; // 乱流シュミット数 q q [ 0 0-1 0 0 0 0 ] 1; // 汚染質発生量 (*) 汚染質発生量にはどの値を入れてもよい空気齢は q の値に無関係 18
system/fvscheme (1) --> FOAM FATAL IO ERROR: keyword laplacian(diffeff,c) is undefined in dictionary "/home/ k-takahashi/openfoam/k-takahashi-2.0.1/ run/test/system/fvschemes::laplacianschemes" laplacianschemes default none; laplacian(nueff,u) Gauss linear corrected; laplacian((1 A(U)),p) Gauss linear corrected; laplacian(dkeff,k) Gauss linear corrected; laplacian(depsiloneff,epsilon) Gauss linear corrected; laplacian(dreff,r) Gauss linear corrected; laplacian(dnutildaeff,nutilda) Gauss linear corrected; laplacian(diffeff,c) Gauss linear corrected; 19
system/fvscheme (2) --> FOAM FATAL IO ERROR: keyword div(phi,c) is undefined in dictionary "/home/k-takahashi/ OpenFOAM/ k-takahashi-2.0.1/run/test/system/fvschemes::divschemes" divschemes default none; div(phi,u) Gauss upwind; div(phi,k) Gauss upwind; div(phi,epsilon) Gauss upwind; div(phi,r) Gauss upwind; div(r) Gauss linear; div(phi,nutilda) Gauss upwind; div((nueff*dev(t(grad(u))))) Gauss linear; div(phi,c) Gauss upwind; 20
system/fvsolution (1) --> FOAM FATAL IO ERROR: keyword C is undefined in dictionary "/home/k-takahashi/openfoam/ k-takahashi-2.0.1/run/test/system/fvsolution::solvers" solvers C //kやepsilonと同じ記述 solver PBiCG; preconditioner DILU; tolerance 1e-05; reltol 0.1; 21
system/fvsolution (2) エラー出ないが 下記も追記 ( なくても実行できます ) SIMPLE nnonorthogonalcorrectors 0; residualcontrol p 1e-2; U 1e-3; "(k epsilon omega)" 1e-3; C 1e-5; // 残差がこの値以下になると // 計算が終了する relaxationfactors p 0.3; U 0.7; k 0.7; epsilon 0.7; R 0.7; nutilda 0.7; C 1.0; // 緩和係数 22
空気齢小 ( 新鮮な空気 ) 空気齢の計算結果 ( 玄関ドア : 閉 ) 空気齢 (s) 閉 空気齢大 ( 空気がよどんでいる ) 風上の部屋のほうが換気しにくい!! 23
空気齢の計算結果 ( 玄関ドア : 開 ) 空気齢 (s) 開 空気齢大 玄関ドアを開けると 風下の部屋が換気しにくくなる 24
まとめ 過去の勉強会情報等を活用して 空気齢を計算するカスタムソルバを作成できた 部屋の換気挙動が明らかになった 今夏 我が家の節電に貢献 その他進捗 swak4foam の練習 OpenFOAM-2.0.1 にインストール成功 使い方勉強中 funky, Groovy simplefunction いろいろありすぎて混乱中 blender の練習 やはり Google SketchUp のほうが手軽か?? chtmultiretionsimplefoam 挑戦 今のところ手も足も出ず 25