OpenFOAM勉強会 for beginner 進捗報告 2011年10月22日 髙橋 1 本日のお題:空気齢 部屋の空気 窓から流入してから 何秒経っているか? 空気齢=1秒: 新鮮な空気 空気齢=20秒: よどんだ空気 3m/s 流速(m/s) 空気齢(秒) 2 空気齢の算出 •パッシブスカラー方程式を使用 •部屋内に一様な汚染質生成項を与えて汚染質の濃度分布を計算 •汚染質濃度から空気齢を算出 汚染質の算出方程式 ( C ) ( vC ) ( DC ) q t C:汚染質濃度 C 3/s) q:一様汚染質発生(kg/m q τ:空気齢(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, 3 International Symosium on Room Air Convection and Ventilation Effectiveness 今回の実施内容 simpleFOAMをベースにして空気齢を算出するソルバ “simpleAgeFoam”を作成 【作成手順】 (I)simpleFoamにパッシブスカラーの方程式を追加 (II)ソース項を追加 (III)空気齢の算出式を追加 (*)これまでの勉強会 for beginnnerや講習会の 情報を活用させていただきました 4 元の方程式の書き換え OpenFOAMのsimpleFoamソルバの記述に合わせて 元の方程式の記述形式を修正 質量保存の 記述 ( C ) ( vC ) ( DC ) q t C q:汚染質発生量(kg/m3/s) q ρで割る 体積保存の 記述 C t ( vC ) ( DC ) q' C q’=q/ρ:汚染質発生量(1/s) q' 5 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) 北側 outlet(0Pa) window_nw_room window_sw_room door_room window_se_room window_ne_room (*)door_roomは 開と閉の2条件 14 境界条件&設定ファイルの準備 【手順】 •とりあえずsimpleAgeFoamを実行 •エラーメッセージを見て、不足しているファイル/記述を特定 •よく似た前後の記述を真似して書く 15 0/C (境界条件) --> FOAM FATAL IO ERROR: cannot find file file: /home/k-takahashi/OpenFOAM/k-takahashi-2.0.1/run/ test/0/C at line 0. boundaryField ・・・ “window_n.*” //流出の窓(2箇所) { type zeroGradient; //ゼロ勾配 } “window_s.*” //流入の窓(2箇所) { type fixedValue; 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 Sct q Sc [ 0 0 0 0 0 0 0 ] 1; Sct [ 0 0 0 0 0 0 0 ] 1; 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
© Copyright 2024 ExpyDoc