def get_heat_flow_exhaust(matrix_temp: np.ndarray, param: Parameters, theta_as_in: float, h_cv: float) -> float: """ 通気層からの排気熱量の計算 :param matrix_temp: 各部温度計算結果 (5,1), degC :param param: 計算条件パラメータ群 :param theta_as_in: 通気層への流入温度=外気温度, degC :param h_cv: 通気層の対流熱伝達率, W/m2K :return: 通気層の排気熱量, W/m2 """ if param.v_a > 0.0: # 通気風量の計算 v_vent = param.v_a * param.l_d * param.l_w ec = math.exp( -2.0 * h_cv * param.l_w * param.l_h / (get_c_air(matrix_temp[4]) * get_rho_air(matrix_temp[4]) * v_vent)) # 出口温度の計算 theta_out = (1.0 - ec) * (matrix_temp[1] + matrix_temp[2]) / 2.0 + ec * theta_as_in # 通気層の排気熱量 return get_c_air(matrix_temp[4]) * get_rho_air( matrix_temp[4]) * v_vent * (theta_out - theta_as_in) / (param.l_w * param.l_h) else: return 0.0
def get_vent_wall_temperature_by_simplified_calculation_no_02( parm: vw.Parameters, h_out: float): """ 簡易計算法案No.2:簡易式により通気層の平均温度を求める関数 :param parm: 計算条件パラメータ群 :param h_out: 室外側総合熱伝達率[W/(m2・K)] :return: 通気層の平均温度[degC], 室外側から通気層までの熱貫流率[W/(m2・K)], 室内側から通気層までの熱貫流率[W/(m2・K)] """ # 相当外気温度を計算 theta_sat = epf.get_theta_SAT(theta_e=parm.theta_e, a_surf=parm.a_surf, j_surf=parm.J_surf, h_out=h_out) # 有効放射率の計算 effective_emissivity = htc.effective_emissivity_parallel( parm.emissivity_1, parm.emissivity_2) # 対流熱伝達率、放射熱伝達率の計算 if parm.theta_r == 20.0: h_cv = htc.convective_heat_transfer_coefficient_simplified_winter( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_winter( effective_emissivity=effective_emissivity) else: h_cv = htc.convective_heat_transfer_coefficient_simplified_summer( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_summer( effective_emissivity=effective_emissivity) # 室外側から通気層までの熱貫流率、室内側から通気層までの熱貫流率を計算 u_o = epf.get_u_o(parm.C_1, h_cv, h_rv) u_i = epf.get_u_i(parm.C_2, h_cv, h_rv) # theta_weを計算 theta_we = (u_o * theta_sat + u_i * parm.theta_r) / (u_o + u_i) # 通気風量の計算 v_vent = parm.v_a * parm.l_d * parm.l_w # 通気層の平均空気温度の計算用の値を設定 if parm.v_a > 0.0: w_h = (u_o + u_i) / (get_c_air(parm.theta_e) * get_rho_air(parm.theta_e) * v_vent) epc = 1.0 - math.exp(-w_h * parm.l_h) x = 1.0 - epc / (w_h * parm.l_h) else: w_h = 0.0 epc = 0.0 x = 1.0 theta_as_ave = (1.0 - x) * parm.theta_e + x * theta_we return theta_as_ave, u_o, u_i
def get_nusselt_number(theta_1: float, theta_2: float, angle: float, l_h: float, l_d: float) -> float: """ ヌセルト数の計算 :param theta_1: 通気層に面する面1の表面温度, degC :param theta_2: 通気層に面する面2の表面温度, degC :param angle: 通気層の傾斜角, degree :param l_h: 通気層の長さ, m :param l_d: 通気層の厚さ, m :return: ヌセルト数 """ # 表面温度の平均値 theta_ave = (theta_1 + theta_2) / 2.0 # プラントル数の計算 pr = get_pr_air(theta_ave) # レーリー数の計算 rayleigh_number = (get_g() * get_beta_air(theta_ave) * abs(theta_1 - theta_2) * (l_d**3) * (get_rho_air(theta_ave)**2) * get_c_air(theta_ave)) / ( get_mu_air(theta_ave) * get_lambda_air(theta_ave)) # ヌセルト数の計算 nusselt_number = 0 nu_ct = (1.0 + ((0.104 * rayleigh_number**0.293) / (1.0 + (6310.0 / rayleigh_number)**1.36))**3)**(1 / 3) nu_u1 = 0.242 * (rayleigh_number * l_d / l_h)**0.273 nu_ut = 0.0605 * rayleigh_number**(1 / 3) # 傾斜角が0°(水平)のとき if angle == 0.0: if rayleigh_number > 5830.0: nusselt_number = 1.44 * (1.0 - 1708.0 / rayleigh_number) + ( rayleigh_number / 5830.0)**(1 / 3) elif 1708.0 < rayleigh_number <= 5830.0: nusselt_number = 1.0 + 1.44 * (1.0 - 1708.0 / rayleigh_number) elif rayleigh_number <= 1708.0: nusselt_number = 1.0 # 傾斜角が90°(鉛直)のとき elif angle == 90.0: nusselt_number = max(nu_ct, nu_u1, nu_ut) # 傾斜角が0°<γ≤60°のとき elif 0.0 < angle <= 60.0: buff = rayleigh_number * math.cos(math.radians(angle)) if buff >= 5830.0: nusselt_number = 1.44 * (1.0 - 1708.0 / buff) * ( 1.0 - (1708.0 * (math.sin(1.8 * math.radians(angle))**1.6)) / buff) + ( buff / 5830.0)**(1 / 3) elif 1708.0 <= buff < 5830.0: nusselt_number = 1.44 * (1.0 - 1708.0 / buff) * ( 1.0 - (1708.0 * (math.sin(1.8 * math.radians(angle))**1.6)) / buff) elif buff < 1708.0: nusselt_number = 1.0 # 傾斜角が60°<γ<90°のとき elif 60.0 < angle < 90.0: buff_g = 0.5 / (1.0 + (rayleigh_number / 3165.0)**20.6)**0.1 nu_60_1 = (1.0 + ((0.0936 * rayleigh_number**0.314)**7) / (1.0 + buff_g))**(1 / 7) nu_60_2 = (0.1044 + 0.1759 * l_d / l_h) * rayleigh_number**0.283 nu_60 = max(nu_60_1, nu_60_2) nu_v = max(nu_ct, nu_u1, nu_ut) nusselt_number = nu_60 * (90.0 - angle) / 30.0 + nu_v * (angle - 60.0) / 30.0 else: raise ValueError("指定された傾斜角は計算対象外です") return nusselt_number
def get_vent_wall_temperature_by_simplified_calculation_no_01( parm: vw.Parameters, h_out: float) -> np.zeros(3): """ 簡易計算法案No.1:簡易版の行列式により各部位の温度を求める関数 :param parm: 計算条件パラメータ群 :param h_out: 室外側総合熱伝達率[W/(m2・K)] :return: 各部位の温度(3×1の行列)[degC], 対流熱伝達率[W/(m2・K)], 放射熱伝達率[W/(m2・K)], 室内側から通気層表面までの熱抵抗[(m2・K)/W] """ # 相当外気温度を計算 theta_SAT = epf.get_theta_SAT(theta_e=parm.theta_e, a_surf=parm.a_surf, j_surf=parm.J_surf, h_out=h_out) # 行列の初期化 matrix_coeff = np.zeros(shape=(3, 3)) matrix_const = np.zeros(3) # 有効放射率の計算 effective_emissivity = htc.effective_emissivity_parallel( parm.emissivity_1, parm.emissivity_2) # 対流熱伝達率、放射熱伝達率の計算 if parm.theta_r == 20.0: h_cv = htc.convective_heat_transfer_coefficient_simplified_winter( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_winter( effective_emissivity=effective_emissivity) else: h_cv = htc.convective_heat_transfer_coefficient_simplified_summer( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_summer( effective_emissivity=effective_emissivity) # 通気風量の計算 v_vent = parm.v_a * parm.l_d * parm.l_w # 通気層の平均空気温度の計算用の値を設定 epc_s = 0.0 if parm.v_a > 0.0: beta = (2 * h_cv * parm.l_w) / (get_c_air(parm.theta_e) * get_rho_air(parm.theta_e) * v_vent) epc_s = 1.0 / parm.l_h * 1.0 / beta * (math.exp(-beta * parm.l_h) - 1) # 熱抵抗を設定 R_o = epf.get_r_o(parm.C_1) R_i = epf.get_r_i(parm.C_2) # 行列に値を設定 matrix_coeff[0][0] = 1.0 / R_o + h_cv + h_rv matrix_coeff[0][1] = -h_cv matrix_coeff[0][2] = -h_rv matrix_coeff[1][0] = (1.0 + epc_s) / 2.0 matrix_coeff[1][1] = -1.0 matrix_coeff[1][2] = (1.0 + epc_s) / 2.0 matrix_coeff[2][0] = -h_rv matrix_coeff[2][1] = -h_cv matrix_coeff[2][2] = 1.0 / R_i + h_cv + h_rv matrix_const[0] = (1.0 / R_o) * theta_SAT matrix_const[1] = epc_s * parm.theta_e matrix_const[2] = (1.0 / R_i) * parm.theta_r # 逆行列を計算 matrix_coeff_inv = np.linalg.inv(matrix_coeff) # 各部位の温度を計算 matrix_temp = np.matmul(matrix_coeff_inv, matrix_const) return matrix_temp, h_cv, h_rv, R_i
def get_vent_wall_performance_factor_by_simplified_calculation_no_04( parm: vw.Parameters, h_out: float): """ 簡易計算法案No.4:簡易計算法案No.3をさらに簡略化 :param parm: 計算条件パラメータ群 :param h_out: 室外側総合熱伝達率[W/(m2・K)] :return: 修正熱貫流率[W/(m2・K)], 修正日射熱取得率[-], 室内表面熱流[W/m2] """ # 有効放射率の計算 effective_emissivity = htc.effective_emissivity_parallel( parm.emissivity_1, parm.emissivity_2) # 対流熱伝達率、放射熱伝達率の計算 if parm.theta_r == 20.0: h_cv = htc.convective_heat_transfer_coefficient_simplified_winter( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_winter( effective_emissivity=effective_emissivity) else: h_cv = htc.convective_heat_transfer_coefficient_simplified_summer( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_summer( effective_emissivity=effective_emissivity) # 通気風量の計算 v_vent = parm.v_a * parm.l_d * parm.l_w # 熱抵抗を設定 u_o_s = 1.0 / epf.get_r_o(parm.C_1) u_i_s = 1.0 / epf.get_r_i(parm.C_2) # 通気層の平均空気温度の計算用の値を設定 if parm.v_a > 0.0: beta = (2 * h_cv * parm.l_w) / (get_c_air(parm.theta_e) * get_rho_air(parm.theta_e) * v_vent) epc_s = 1.0 / parm.l_h * 1.0 / beta * (math.exp(-beta * parm.l_h) - 1) epc_s_dash = -((2.0 * h_cv) * epc_s) / (1 + epc_s) r_u = 1.0 / ((1.0 / (1.0 / u_o_s + 1.0 / h_rv)) + (1.0 / (1.0 / epc_s_dash + 1.0 / h_cv))) + 1.0 / u_i_s r_eta = 1.0 / ((1.0 / (1.0 / u_i_s + 1.0 / h_rv)) + (1.0 / (1.0 / epc_s_dash + 1.0 / h_cv))) + 1.0 / u_o_s else: r_u = 1.0 / ((1.0 / (1.0 / u_o_s + 1.0 / h_rv)) + (1.0 / (1.0 / h_cv))) + 1.0 / u_i_s r_eta = 1.0 / ((1.0 / (1.0 / u_i_s + 1.0 / h_rv)) + (1.0 / (1.0 / h_cv))) + 1.0 / u_o_s # 修正U値を計算 u_dash = 1.0 / r_u # 修正η値を計算 eta_dash = 1.0 / r_eta # 室内表面熱流を計算 q_room_side = u_dash * (parm.theta_e - parm.theta_r) + eta_dash * parm.J_surf return h_cv, h_rv, u_dash, eta_dash, q_room_side # デバッグ用 # parm_1: vw.Parameters = vw.Parameters(10, 20, 500, 1.0, 50.25, 2.55, 3.0, 0.05, 0.05, 45.0, 0.5, 0.45, 0.9, 0.9) # temps = get_vent_wall_temperature(parm_1, h_out=25.0, h_in=9.0) # print(temps)
def get_vent_wall_performance_factor_by_simplified_calculation_no_03( parm: vw.Parameters, h_out: float): """ 簡易計算法案No.3:通気層を有する壁体の修正熱貫流率、修正日射熱取得率、室内表面熱流を求める関数 :param parm: 計算条件パラメータ群 :param h_out: 室外側総合熱伝達率[W/(m2・K)] :return: 修正熱貫流率[W/(m2・K)], 修正日射熱取得率[-], 室内表面熱流[W/m2] """ # 有効放射率の計算 effective_emissivity = htc.effective_emissivity_parallel( parm.emissivity_1, parm.emissivity_2) # 対流熱伝達率、放射熱伝達率の計算 if parm.theta_r == 20.0: h_cv = htc.convective_heat_transfer_coefficient_simplified_winter( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_winter( effective_emissivity=effective_emissivity) else: h_cv = htc.convective_heat_transfer_coefficient_simplified_summer( v_a=parm.v_a) h_rv = htc.radiative_heat_transfer_coefficient_simplified_summer( effective_emissivity=effective_emissivity) # 熱伝達率の計算 h_v = 2.0 * h_rv + h_cv # 通気風量の計算 v_vent = parm.v_a * parm.l_d * parm.l_w # 通気層の熱抵抗の値を設定 if parm.v_a > 0.0: beta = (2 * h_cv * parm.l_w) / (get_c_air(parm.theta_e) * get_rho_air(parm.theta_e) * v_vent) epc_s = 1.0 / parm.l_h * 1.0 / beta * (math.exp(-beta * parm.l_h) - 1.0) epc_s_dash = -((2.0 * h_cv) * epc_s) / (1.0 + epc_s) h_v_dash = h_v + 1.0 / ((1.0 / epc_s_dash) + h_rv / (h_v * h_cv)) else: h_v_dash = h_v # 熱抵抗を設定 u_o_s = 1.0 / epf.get_r_o(parm.C_1) u_i_s = 1.0 / epf.get_r_i(parm.C_2) # 修正U値を計算 buf_x = h_v_dash - (h_v**2 / (u_o_s + h_v)) u_dash = 1.0 / (1.0 / buf_x + 1.0 / h_v + 1.0 / u_i_s) # 修正η値を計算 r_l = 1.0 / u_o_s + 1.0 / h_v r_r1 = 1.0 / u_i_s + 1.0 / h_v if parm.v_a > 0.0: r_r2 = 1.0 / epc_s_dash + h_rv / (h_v * h_cv) eta_dash = r_r2 / (r_l * r_r1 + r_l * r_r2 + r_r1 * r_r2) * (parm.a_surf / h_out) else: eta_dash = 1.0 / (r_l + r_r1) * (parm.a_surf / h_out) # 室内表面熱流を計算 q_room_side = u_dash * (parm.theta_e - parm.theta_r) + eta_dash * parm.J_surf return h_cv, h_rv, u_dash, eta_dash, q_room_side
def get_heat_balance(matrix_temp: np.zeros(5), parm: Parameters, calc_mode_h_cv: str, calc_mode_h_rv: str, h_out: float, h_in: float) -> np.zeros(5): """ 熱収支式を解く関数 :param matrix_temp: 各部温度計算結果 (5,1), degC :param parm: 計算条件パラメータ群 :param calc_mode_h_cv: 対流熱伝達率の計算モード :param calc_mode_h_rv: 放射熱伝達率の計算モード :param h_out: 室外側総合熱伝達率, W/(m2・K) :param h_in: 室内側総合熱伝達率, W/(m2・K) :return: 各層の熱収支, W/m2 """ # 相当外気温度を計算 theta_SAT = parm.theta_e + (parm.a_surf * parm.J_surf) / h_out # 行列の初期化 matrix_coeff = np.zeros(shape=(5, 5)) matrix_const = np.zeros(5) # 通気層内の表面温度を設定 theta_1 = matrix_temp[1] theta_2 = matrix_temp[2] # 対流熱伝達率の計算 h_cv = heat_transfer_coefficient.get_convective_heat_transfer_coefficient( calc_mode_h_cv, parm.v_a, theta_1, theta_2, parm.angle, parm.l_h, parm.l_d) # 有効放射率の計算 effective_emissivity = heat_transfer_coefficient.effective_emissivity_parallel( parm.emissivity_1, parm.emissivity_2) # 放射熱伝達率の計算 h_rv = heat_transfer_coefficient.get_radiative_heat_transfer_coefficient( calc_mode_h_rv, theta_1, theta_2, effective_emissivity) # 通気風量の計算 v_vent = parm.v_a * parm.l_d * parm.l_w # 通気層の平均空気温度の計算用の値を設定 beta = 0.0 if parm.v_a > 0.0: beta = (2 * h_cv * parm.l_w) / (get_c_air(matrix_temp[4]) * get_rho_air(matrix_temp[4]) * v_vent) # 行列に値を設定 matrix_coeff[0][0] = h_out + parm.C_1 matrix_coeff[0][1] = -parm.C_1 matrix_coeff[1][0] = parm.C_1 matrix_coeff[1][1] = -(h_cv + h_rv + parm.C_1) matrix_coeff[1][2] = h_rv matrix_coeff[1][4] = h_cv matrix_coeff[2][1] = h_rv matrix_coeff[2][2] = -(h_cv + h_rv + parm.C_2) matrix_coeff[2][3] = parm.C_2 matrix_coeff[2][4] = h_cv matrix_coeff[3][2] = parm.C_2 matrix_coeff[3][3] = -(h_in + parm.C_2) matrix_coeff[4][4] = -1.0 matrix_const[0] = h_out * theta_SAT matrix_const[3] = -h_in * parm.theta_r if parm.v_a > 0.0: matrix_coeff[4][1] = (1.0 + 1.0 / parm.l_h * 1.0 / beta * (math.exp(-beta * parm.l_h) - 1)) / 2 matrix_coeff[4][2] = (1.0 + 1.0 / parm.l_h * 1.0 / beta * (math.exp(-beta * parm.l_h) - 1)) / 2 matrix_const[4] = 1.0 / parm.l_h * 1.0 / beta * ( math.exp(-beta * parm.l_h) - 1) * parm.theta_e else: matrix_coeff[4][1] = 0.5 matrix_coeff[4][2] = 0.5 matrix_const[4] = 0.0 # 熱収支を計算 q_balance = np.matmul(matrix_coeff, matrix_temp) - matrix_const return q_balance