やったこと
heatrapyでの一次元非定常伝熱解析で熱伝達率と温度で入熱出来る機能を追加しました。
もともと、任意の位置への入熱は出来る仕様なので、それを利用しました。
改修点
- system.pyのclass single_objectをいじってます
set_input_heat_transferで入力条件をセットして、computeで計算する際に熱を入れていきます。時間毎の温度差に応じて、各々の時間ステップで入熱しています。
henko.py
class single_object(object):
def __init__(self, amb_temperature, materials=('Cu',), borders=(1, 11),
materials_order=(0,), dx=0.001, dt=0.1, file_name='data.txt',
boundaries=(0, 0), Q=[], Q0=[], heat_points=(1, -2),
initial_state=False, h_left=50000., h_right=50000.,
materials_path=False):
【中略】
self.input_heat_transfer = False #これをTrueにすると熱伝達率+温度での入熱を入れる
【中略】
def set_input_heat_transfer(self,input_heat_transfer_point,Heat_transfer_coefficient,Heat_transfer_temparature):
"""熱伝達率と温度でを任意の位置へ追加します。現状、一点のみへの入熱です
Arguments:
input_heat_transfer_point {int} -- 入熱するポイントです。一番上の場合は、1です
Heat_transfer_coefficient {float} -- 熱伝達率[W/(m2K)]
Heat_transfer_temparature {float} -- 熱伝達に使用される温度です[K]
"""
self.input_heat_transfer=True
self.input_heat_transfer_point = input_heat_transfer_point
self.Heat_transfer_coefficient = Heat_transfer_coefficient
self.Heat_transfer_temparature = Heat_transfer_temparature
【中略】
def compute(self, timeInterval, write_interval, solver='explicit_k(x)',
modeTemp=False, numFlag=0.5, modeTempPoint=1):
#熱伝達率と温度でインプットする場合
if self.input_heat_transfer:
td = self.temperature[self.input_heat_transfer_point][0]
self.Q0[self.input_heat_transfer_point] = self.Heat_transfer_coefficient * (self.Heat_transfer_temparature - td)/self.dx
print(td,self.Q0)
はまったところ
思ったような入熱になりませんでした。理由は単純で単位のミスでありました。Q0計算のところで、self.dxで割っているところです。熱伝達率の単位は[W/(m2 K)]の場合です。
テスト
銅でやってみました。
【インプット】
- 初期温度 : 293[K]
- 材料 :銅(物性値はheatrapyに入っている値
- 長さ : 20mm
- 境界条件:両端断熱
- 入熱ポイント:端部(x=0)
- 熱伝達率:700[W/(m2K)]
- 雰囲気温度:900[K]
- 解析時間:30秒
heat_transfer_test.py
import heatrapy as ht
import pandas as pd
import os
if os.path.exists("heat_transfer.txt"):
os.remove("heat_transfer.txt")
example = ht.single_object(amb_temperature=293, materials=('Cu',), borders=(1,21),materials_order=(0,),
dx=0.001, dt=0.001, file_name='heat_transfer.txt',boundaries=(0,0), Q=[], Q0=[],initial_state=False)
example.set_input_heat_transfer(1,700,900)
example.compute(timeInterval=30, write_interval=10, solver='implicit_k(x)')
df = pd.read_csv("heat_transfer.txt")
df=df.drop("heat[1](W)", axis=1)
df=df.drop("heat[-2](J)", axis=1)
df = df.set_index("time(s)")
df.plot(figsize=(15,8))
【結果】
よい感じですね。dtの値は注意が必要です。dtを小さくすると精度は上がりますが、解析時間が長くなります。回しながら良いdtの値を探していく必要があります。
ソースコード
ソースコードは以下です。
https://github.com/myao9494/heatrapy
テストは、heat_transfer_test.ipynbです