計算の制御
計算の制御と出力設定を行います。
後で残差を確認できるように各領域ごとの残差出力設定を別ファイルで用意します。
これをsystem/controlDictのfunctionsで読み込むことにします。
system/residuals_coldwater(residuals_hotwater residuals_solid)
1 2 3 |
#includeEtc "caseDicts/postProcessing/numerical/solverInfo.cfg"; fields (".*"); region coldwater; |
system/controlDict
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
application chtMultiRegionSimpleFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 10000; deltaT 1; writeControl timeStep; writeInterval 200; purgeWrite 0; writeFormat binary;//ascii; writePrecision 8; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable yes; functions { #includeFunc residuals_coldwater; #includeFunc residuals_hotwater; #includeFunc residuals_solid; fieldMinMax_coldwater { type fieldMinMax; libs ("libfieldFunctionObjects.so"); region coldwater; writeToFile yes; log yes; location yes; mode magnitude; fields ( U p_rgh T ); } fieldMinMax_hotwater { type fieldMinMax; libs ("libfieldFunctionObjects.so"); region hotwater; writeToFile yes; log yes; location yes; mode magnitude; fields ( U p_rgh T ); } fieldMinMax_solid { type fieldMinMax; libs ("libfieldFunctionObjects.so"); region solid; writeToFile no; log yes; location yes; mode magnitude; fields ( T ); } probes_coldwater { type probes; libs ("libsampling.so"); region coldwater; writeControl timeStep; writeInterval 200; probeLocations ( (0 0.0065 0) (0.01 0.0065 0) (0.02 0.0065 0) (省略) (1 0.0065 0) ); fixedLocations true; fields ( U p_rgh T ); } probes_hotwater { type probes; libs ("libsampling.so"); region hotwater; writeControl timeStep; writeInterval 200; probeLocations ( (0 0 0) (0.01 0 0) (0.02 0 0) (省略) (1 0 0) ); fixedLocations true; fields ( U p_rgh T ); } yPlus_hotwater { type yPlus; libs ("libfieldFunctionObjects.so"); region hotwater; writeControl writeTime; log yes; } yPlus_coldwater { type yPlus; libs ("libfieldFunctionObjects.so"); region coldwater; writeControl writeTime; log yes; } } |
出力設定としてprobesでx軸方向の値を取得しています。
samplingを使えばもっと楽にできるかもしれませんが、chtMultiRegion系のソルバはうまくできなかったので、とりあえず座標値から値の取得はprobeで対応しました。
計算実行
では、計算実行します。
1 |
chtMultiRegionSimpleFoam > log.chtMultiRegionSimpleFoam & |
あれ?
なーんかおかしいな….
とりあえず軸対称をやめてみよう。
Yminの面は滑り無しに条件に変更。
見た目はそれっぽくなりました。
まだ収束していないっぽいですが、軸対称モデルで検証したいので計算を途中で止めました。
結果がどうして軸対称モデルでおかしかったのかはまだ確認中です。
ちなみにprobeで温度データを取得しておいたのでグラフ化することもできます。
postProcessing/probes_coldwater/0/T
1 2 3 4 5 6 7 8 9 10 |
# Probe 0 (0 0.0065 0) (省略) # Probe 100 (1 0.0065 0) # Time 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 200 293.15384 293.19307 293.23981 293.25615 293.25303 293.23999 293.22206 293.2021 293.1818 293.16213 293.14366 293.12665 293.11122 293.09739 293.08511 293.07429 293.06483 293.0566 293.04948 293.04334 293.03806 293.03352 293.02963 293.02629 293.02343 293.02096 293.01884 293.01701 293.01543 293.01407 293.01288 293.01187 293.01102 293.01034 293.00987 293.00964 293.00969 293.01002 293.01058 293.01129 293.01203 293.01272 293.01328 293.01369 293.01397 293.01413 293.01422 293.01426 293.01428 293.01428 293.01428 293.01427 293.01426 293.01425 293.01424 293.01423 293.01422 293.01422 293.01421 293.0142 293.01419 293.01418 293.01417 293.01416 293.01416 293.01415 293.01414 293.01414 293.01413 293.01412 293.01412 293.01411 293.01411 293.0141 293.0141 293.01409 293.01409 293.01409 293.01408 293.01408 293.01408 293.01408 293.01407 293.01407 293.01407 293.01407 293.01407 293.01407 293.01408 293.01408 293.01409 293.01409 293.0141 293.01411 293.01412 293.01413 293.01414 293.01415 293.01418 293.0143 293.01459 400 293.1545 293.20181 293.26347 293.29047 293.29303 293.28299 293.26676 293.24759 293.22725 293.20683 293.18695 293.168 293.15019 293.13365 293.11842 293.10455 293.09201 293.08076 293.07076 293.06192 293.05416 293.04739 293.04151 293.03642 293.03204 293.02828 293.02505 293.0223 293.01994 293.01793 293.01621 293.01475 293.01349 293.01242 293.0115 293.01071 293.01004 293.00945 293.00895 293.00852 293.00816 293.00788 293.00767 293.00756 293.00754 293.00762 293.00778 293.00801 293.00826 293.00851 293.00874 293.00892 293.00906 293.00915 293.00921 293.00924 293.00925 293.00926 293.00926 293.00926 293.00926 293.00925 293.00925 293.00924 293.00924 293.00923 293.00923 293.00922 293.00922 293.00922 293.00921 293.00921 293.0092 293.0092 293.0092 293.00919 293.00919 293.00919 293.00918 293.00918 293.00918 293.00918 293.00917 293.00917 293.00917 293.00917 293.00917 293.00918 293.00918 293.00918 293.00918 293.00919 293.0092 293.0092 293.00921 293.00922 293.00923 293.00924 293.00928 293.0094 293.00969 600 293.15511 293.20995 293.28598 293.32373 293.33181 293.32375 293.30774 293.28805 293.26684 293.24529 293.2241 293.20369 293.18429 293.16607 293.14909 293.13341 293.11902 293.1059 293.09401 293.08329 293.07366 293.06507 293.05743 293.05066 293.04468 293.03943 293.03484 293.03082 293.02733 293.02431 293.0217 293.01945 293.01752 293.01586 293.01445 293.01324 293.01221 293.01133 293.01059 293.00995 293.0094 293.00894 293.00854 293.0082 293.00791 293.00765 293.00744 293.00725 293.0071 293.00698 293.00689 293.00683 293.00681 293.00682 293.00687 293.00694 293.00702 293.00711 293.0072 293.00728 293.00734 293.00738 293.00741 293.00743 293.00744 293.00744 293.00745 293.00745 293.00744 293.00744 293.00744 293.00744 293.00743 293.00743 293.00743 293.00742 293.00742 293.00742 293.00742 293.00742 293.00741 293.00741 293.00741 293.00741 293.00741 293.00741 293.00741 293.00741 293.00742 293.00742 293.00742 293.00743 293.00743 293.00744 293.00745 293.00746 293.00747 293.00748 293.00752 293.00764 293.00793 800 293.15567 293.21754 293.30738 293.35581 293.36943 293.36313 293.3467 293.3257 293.3029 293.27966 293.25675 293.2346 293.21347 293.19353 293.17487 293.15754 293.14155 293.12688 293.11352 293.10139 293.09044 293.0806 293.07178 293.06391 293.05689 293.05066 293.04512 293.04022 293.03588 293.03205 293.02867 293.0257 293.02309 293.0208 293.0188 293.01706 293.01555 293.01424 293.0131 293.01213 293.01129 293.01057 293.00995 293.00943 293.00898 293.00859 293.00826 293.00799 293.00775 293.00754 293.00737 293.00722 293.00709 293.00698 293.00689 293.00681 293.00675 293.00669 293.00665 293.00662 293.00661 293.00661 293.00662 293.00664 293.00667 293.0067 293.00673 293.00676 293.00678 293.0068 293.00681 293.00682 293.00683 293.00683 293.00683 293.00683 293.00683 293.00683 293.00683 293.00683 293.00683 293.00683 293.00682 293.00682 293.00682 293.00682 293.00683 293.00683 293.00683 293.00683 293.00684 293.00684 293.00685 293.00686 293.00687 293.00688 293.00689 293.0069 293.00693 293.00706 293.00735 1000 293.1562 293.22465 293.32776 293.38678 293.40604 293.40152 293.38446 293.36175 293.33691 293.31161 293.28667 293.26257 293.23957 293.21784 293.19748 293.17852 293.161 293.14489 293.13016 293.11676 293.10463 293.09368 293.08384 293.07502 293.06713 293.06009 293.05381 293.04823 293.04326 293.03884 293.03493 293.03146 293.02838 293.02566 293.02326 293.02113 293.01926 293.01761 293.01615 293.01487 293.01375 293.01276 293.0119 293.01115 293.01049 293.00992 293.00943 293.00901 293.00864 293.00833 293.00806 293.00783 293.00763 293.00746 293.00732 293.0072 293.00709 293.007 293.00693 293.00686 293.0068 293.00676 293.00672 293.00668 293.00665 293.00663 293.00661 293.00659 293.00659 293.00658 293.00658 293.00659 293.0066 293.00661 293.00662 293.00663 293.00664 293.00664 293.00665 293.00665 293.00666 293.00666 293.00666 293.00666 293.00666 293.00666 293.00666 293.00667 293.00667 293.00667 293.00668 293.00668 293.00669 293.0067 293.0067 293.00671 293.00672 293.00674 293.00678 293.0069 293.00719 1200 293.15669 293.23134 293.3472 293.41671 293.4417 293.43908 293.42138 293.39679 293.3697 293.3421 293.31496 293.28877 293.26381 293.24024 293.21816 293.1976 293.17857 293.16106 293.14504 293.13043 293.11718 293.1052 293.09442 293.08472 293.07603 293.06826 293.06131 293.0551 293.04957 293.04464 293.04026 293.03635 293.03288 293.0298 293.02706 293.02463 293.02248 293.02057 293.01888 293.01738 293.01605 293.01488 293.01384 293.01293 293.01212 293.0114 293.01078 293.01022 293.00974 293.00931 293.00894 293.00861 293.00833 293.00808 293.00787 293.00768 293.00753 293.00739 293.00727 293.00717 293.00708 293.00701 293.00694 293.00689 293.00684 293.0068 293.00677 293.00674 293.00671 293.00669 293.00667 293.00666 293.00664 293.00663 293.00662 293.00662 293.00661 293.00661 293.00661 293.00661 293.00661 293.00661 293.00662 293.00662 293.00663 293.00663 293.00664 293.00664 293.00665 293.00665 293.00666 293.00666 293.00667 293.00668 293.00669 293.0067 293.00671 293.00672 293.00676 293.00689 293.00717 |
こちらのデータを適当に整えながらPythonでグラフ化します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import numpy as np import matplotlib.pyplot as plt import pandas as pd dir_ = 0 regionVolume = "hotwater" with open(f'./postProcessing/probes_{regionVolume}/{regionVolume}/{dir_}/T', "r") as f: data_ = f.readlines() x_list = np.arange(0,1.01,0.01) print(len(x_list)) temp_list = [] for temp_ in data_[-1].split(" "): if not temp_: pass else: temp_list.append(temp_[:-2]) temp_list = temp_list[1:-1] len(temp_list) dict_ = { "x":x_list, "Temp":temp_list } temp_df = pd.DataFrame(dict_) temp_df.columns = ["x", "Temp"] temp_df['Temp'] = temp_df['Temp'].astype(float) -273.15 plt.plot(temp_df["x"], temp_df["Temp"], color="blue") plt.grid() plt.xlim(0,1) plt.ylim(20,45) # plt.xticks(np.arange(0,1,30)) # plt.yticks(np.arange(1,10,2)) plt.xlabel("x[m]",fontsize=16) plt.ylabel("T[deg]",fontsize=16) |
hotwater領域だけ温度分布をグラフ化すると以下のようになります。
グラフを見ても全然収束している感じはしません。
今回は軸対称モデルの解析が失敗しましたが、2次元の熱交換器の解析としてひな形のモデルができたので本日はここまでにします。
まとめ
今回は熱交換器の2次元モデルから軸対称モデルでの解析を試みましたが、軸対称モデルでは挙動がおかしくなりました。
設定がおかしいのかは少し見直し中です・・・ chtMultiRegion系のソルバって各領域ごとに設定をしないといけないので面倒ですよね。
本記事はメモ程度に残しておいて、また時間を作って再トライしたいと思います。
chtMultiRegion系のソルバに関して深堀した記事もあり大変勉強になりました。
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。