def setUpClass(cls): print('\n testing single zone steady 08') # 計算用フォルダ s_folder = os.path.join(os.path.dirname(__file__), 'data') # 住宅計算条件JSONファイルの読み込み house_data_path = os.path.join(s_folder, "mid_data_house.json") with open(house_data_path, 'r', encoding='utf-8') as js: rd = json.load(js) # 気象データ読み出し # 外界条件 # 全ての値は0.0で一定とする。日射・夜間放射はなし。 oc = weather.Weather(a_sun_ns=np.zeros(8760 * 4, dtype=float), h_sun_ns=np.zeros(8760 * 4, dtype=float), i_dn_ns=np.zeros(8760 * 4, dtype=float), i_sky_ns=np.zeros(8760 * 4, dtype=float), r_n_ns=np.zeros(8760 * 4, dtype=float), theta_o_ns=np.zeros(8760 * 4, dtype=float), x_o_ns=np.zeros(8760 * 4, dtype=float), itv=interval.Interval.M15) # ステップ n の室 i における内部発熱, W, [i, n] ( = 100.0 ) # ステップ n の室 i における人体発湿を除く内部発湿, kg/s, [i, n] ( = 0.0 ) # ステップ n の室 i における局所換気量, m3/s, [i, n] ( = 0.0 ) # ステップ n の室 i における在室人数, [i, n] ( = 0 ) # ステップ n の室 i における空調需要, [i, n] ( = 0.0 ) scd = schedule.Schedule(q_gen_is_ns=np.full((1, 8760 * 4), 100.0, dtype=float), x_gen_is_ns=np.zeros((1, 8760 * 4), dtype=float), v_mec_vent_local_is_ns=np.zeros((1, 8760 * 4), dtype=float), n_hum_is_ns=np.zeros((1, 8760 * 4), dtype=float), ac_demand_is_ns=np.zeros((1, 8760 * 4), dtype=float)) # pre_calc_parametersの構築 ss, ppg = pre_calc_parameters.make_pre_calc_parameters(delta_t=900.0, rd=rd, oc=oc, scd=scd) q_srf_js_n = np.array([[ 16.66666667, 16.66666667, 16.66666667, 16.66666667, 16.66666667, 16.66666667 ]]).reshape(-1, 1) theta_ei_js_n = np.array([[ 22.83332338, 22.83332338, 22.83332338, 22.83332338, 22.83332338, 22.83332338 ]]).reshape(-1, 1) # 初期状態値の計算 c_n = conditions.Conditions( operation_mode_is_n=np.array( [[operation_mode.OperationMode.STOP_CLOSE]]), theta_r_is_n=np.array([[24.658324874564500]]), theta_mrt_hum_is_n=np.array([[21.32499154]]), x_r_is_n=np.array([[0.0]]), theta_dsh_s_a_js_ms_n=q_srf_js_n * ss.phi_a1_js_ms / (1.0 - ss.r_js_ms), theta_dsh_s_t_js_ms_n=(np.dot(ss.k_ei_js_js, theta_ei_js_n) + ss.theta_dstrb_js_ns[:, 1].reshape(-1, 1)) * ss.phi_t1_js_ms / (1.0 - ss.r_js_ms), q_s_js_n=q_srf_js_n, theta_frt_is_n=np.array([[24.658324874564500]]), x_frt_is_n=np.array([[0.0]]), theta_ei_js_n=theta_ei_js_n) # 計算実行 c_n_pls = sequence.run_tick(n=-2, delta_t=900.0, ss=ss, c_n=c_n, recorder=None) # 計算結果格納 cls._c_n = c_n cls._c_n_pls = c_n_pls
def setUpClass(cls): """ テスト条件 屋根と床が合板12mm、壁が複層ガラスの1m角の立方体の単室モデル。 内部発熱なし。 透過日射熱取得は100W固定 """ print('\n testing single zone steady 06') # 計算用フォルダ s_folder = os.path.join(os.path.dirname(__file__), 'data') # 住宅計算条件JSONファイルの読み込み house_data_path = os.path.join(s_folder, "mid_data_house.json") with open(house_data_path, 'r', encoding='utf-8') as js: rd = json.load(js) # 気象データ読み出し # 全ての値は0.0で一定とする。日射・夜間放射はなし。 oc = weather.Weather(a_sun_ns=np.zeros(8760 * 4, dtype=float), h_sun_ns=np.zeros(8760 * 4, dtype=float), i_dn_ns=np.zeros(8760 * 4, dtype=float), i_sky_ns=np.zeros(8760 * 4, dtype=float), r_n_ns=np.zeros(8760 * 4, dtype=float), theta_o_ns=np.zeros(8760 * 4, dtype=float), x_o_ns=np.zeros(8760 * 4, dtype=float), itv=interval.Interval.M15) # ステップnの室iにおける局所換気量, m3/s, [i, 8760*4] # 局所換気量は常に 0.0 m3/s とする。 v_mec_vent_local_is_ns = np.zeros((1, 8760 * 4), dtype=float) # ステップ n の室 i における内部発熱, W, [i, n] ( = 0.0 ) # ステップ n の室 i における人体発湿を除く内部発湿, kg/s, [i, n] ( = 0.0 ) # ステップ n の室 i における局所換気量, m3/s, [i, n] ( = 0.0 ) # ステップ n の室 i における在室人数, [i, n] ( = 0 ) # ステップ n の室 i における空調需要, [i, n] ( = 0.0 ) scd = schedule.Schedule(q_gen_is_ns=np.zeros((1, 8760 * 4), dtype=float), x_gen_is_ns=np.zeros((1, 8760 * 4), dtype=float), v_mec_vent_local_is_ns=np.zeros((1, 8760 * 4), dtype=float), n_hum_is_ns=np.zeros((1, 8760 * 4), dtype=float), ac_demand_is_ns=np.zeros((1, 8760 * 4), dtype=float)) # ステップnの室iにおける窓の透過日射熱取得, W, [8760*4] # 等価日射量は常に 100 W とする。 q_trs_sol_is_ns = np.full((1, 8760 * 4), 100.0, dtype=float) # pre_calc_parametersの構築 ss, ppg = pre_calc_parameters.make_pre_calc_parameters( delta_t=900.0, rd=rd, oc=oc, scd=scd, q_trs_sol_is_ns=q_trs_sol_is_ns) q_srf_js_n = np.array([[ 12.7809219004777, 12.7809219004777, 12.7809219004777, 12.7809219004777, 36.6603793746687, 12.2159349302242 ]]).reshape(-1, 1) theta_ei_js_n = np.array([[ 2.748585309, 2.748585309, 2.748585309, 2.748585309, 8.248585309, 2.748585309 ]]).reshape(-1, 1) # 初期状態値の計算 c_n = conditions.Conditions( operation_mode_is_n=np.array( [[operation_mode.OperationMode.STOP_CLOSE]]), theta_r_is_n=np.array([[4.57208809459]]), theta_mrt_hum_is_n=np.array([[2.642487123]]), x_r_is_n=np.array([[0.0]]), theta_dsh_s_a_js_ms_n=q_srf_js_n * ss.phi_a1_js_ms / (1.0 - ss.r_js_ms), theta_dsh_s_t_js_ms_n=(np.dot(ss.k_ei_js_js, theta_ei_js_n) + ss.theta_dstrb_js_ns[:, 1].reshape(-1, 1)) * ss.phi_t1_js_ms / (1.0 - ss.r_js_ms), q_s_js_n=q_srf_js_n, theta_frt_is_n=np.array([[22.60960613]]), x_frt_is_n=np.array([[0.0]]), theta_ei_js_n=theta_ei_js_n) # 計算実行 c_n_pls = sequence.run_tick(n=-2, delta_t=900.0, ss=ss, c_n=c_n, recorder=None) # 計算結果格納 cls._c_n = c_n cls._c_n_pls = c_n_pls
def calc(rd: Dict, w: weather.Weather, scd: schedule.Schedule, n_step_hourly: int = 4, n_d_main: int = 365, n_d_run_up: int = 365, n_d_run_up_build: int = 183) -> Tuple[pd.DataFrame, pd.DataFrame]: """coreメインプログラム Args: rd: 住宅計算条件 w: 外界気象条件 scd: スケジュール n_step_hourly: 計算間隔(1時間を何分割するかどうか)(デフォルトは4(15分間隔)) n_d_main: 本計算を行う日数(デフォルトは365日(1年間)), d n_d_run_up: 助走計算を行う日数(デフォルトは365日(1年間)), d n_d_run_up_build: 助走計算のうち建物全体を解く日数(デフォルトは183日(およそ半年)), d Returns: 以下のタプル (1) 計算結果(詳細版)をいれたDataFrame (2) 計算結果(簡易版)をいれたDataFrame Notes: 「助走計算のうち建物全体を解く日数」は「助走計算を行う日数」で指定した値以下でないといけない。 """ # 本計算のステップ数 # 助走計算のステップ数 # 助走計算のうち建物全体を解くステップ数 n_step_main, n_step_run_up, n_step_run_up_build = period.get_n_step( n_step_hourly=n_step_hourly, n_d_main=n_d_main, n_d_run_up=n_d_run_up, n_d_run_up_build=n_d_run_up_build) # 時間間隔, s delta_t = 3600.0 / n_step_hourly # json, csv ファイルからパラメータをロードする。 # (ループ計算する必要の無い)事前計算を行い, クラス PreCalcParameters, PreCalcParametersGround に必要な変数を格納する。 pp, ppg = pre_calc_parameters.make_pre_calc_parameters(delta_t=delta_t, rd=rd, oc=w, scd=scd) gc_n = conditions.initialize_ground_conditions(n_grounds=ppg.n_grounds) logger.info('助走計算(土壌のみ)') for n in range(-n_step_run_up, -n_step_run_up_build): gc_n = sequence_ground.run_tick(gc_n=gc_n, ss=ppg, n=n) result = recorder.Recorder(n_step_main=n_step_main, id_rm_is=list(pp.id_rm_is.flatten()), id_bdry_js=list(pp.id_bdry_js.flatten())) result.pre_recording(pp) # 建物を計算するにあたって初期値を与える c_n = conditions.initialize_conditions(n_spaces=pp.n_rm, n_bdries=pp.n_bdry) # 地盤計算の結果(項別公比法の指数項mの吸熱応答の項別成分・表面熱流)を建物の計算に引き継ぐ c_n = conditions.update_conditions_by_ground_conditions( is_ground=pp.is_ground_js.flatten(), c=c_n, gc=gc_n) logger.info('助走計算(建物全体)') for n in range(-n_step_run_up_build, 0): c_n = sequence.run_tick(n=n, delta_t=delta_t, ss=pp, c_n=c_n, recorder=result) logger.info('本計算') # TODO: recorder に1/1 0:00の瞬時状態値を書き込む m = 1 for n in range(0, n_step_main): c_n = sequence.run_tick(n=n, delta_t=delta_t, ss=pp, c_n=c_n, recorder=result) if n == int(n_step_main / 12 * m): logger.info("{} / 12 calculated.".format(m)) m = m + 1 result.post_recording(pp) logger.info('ログ作成') # dd: data detail, 15分間隔のすべてのパラメータ pd.DataFrame dd_i, dd_a = result.export_pd() return dd_i, dd_a
def setUpClass(cls): """ 屋根と床が合板12mm、壁が複層ガラスの1m角の立方体の単室モデル。 相当外気温度が屋根と南壁10℃、他は0℃。 内部発熱なし。 """ print('\n testing single zone steady 05') # 計算用フォルダ s_folder = os.path.join(os.path.dirname(__file__), 'data') # 住宅計算条件JSONファイルの読み込み house_data_path = os.path.join(s_folder, "mid_data_house.json") with open(house_data_path, 'r', encoding='utf-8') as js: rd = json.load(js) # 気象データ読み出し # 全ての値は0.0で一定とする。日射・夜間放射はなし。 oc = weather.Weather(a_sun_ns=np.zeros(8760 * 4, dtype=float), h_sun_ns=np.zeros(8760 * 4, dtype=float), i_dn_ns=np.zeros(8760 * 4, dtype=float), i_sky_ns=np.zeros(8760 * 4, dtype=float), r_n_ns=np.zeros(8760 * 4, dtype=float), theta_o_ns=np.zeros(8760 * 4, dtype=float), x_o_ns=np.zeros(8760 * 4, dtype=float), itv=interval.Interval.M15) # ステップ n の室 i における内部発熱, W, [i, n] ( = 0.0 ) # ステップ n の室 i における人体発湿を除く内部発湿, kg/s, [i, n] ( = 0.0 ) # ステップ n の室 i における局所換気量, m3/s, [i, n] ( = 0.0 ) # ステップ n の室 i における在室人数, [i, n] ( = 0 ) # ステップ n の室 i における空調需要, [i, n] ( = 0.0 ) scd = schedule.Schedule(q_gen_is_ns=np.zeros((1, 8760 * 4), dtype=float), x_gen_is_ns=np.zeros((1, 8760 * 4), dtype=float), v_mec_vent_local_is_ns=np.zeros((1, 8760 * 4), dtype=float), n_hum_is_ns=np.zeros((1, 8760 * 4), dtype=float), ac_demand_is_ns=np.zeros((1, 8760 * 4), dtype=float)) # ステップ n の境界 j における相当外気温度, ℃, [j, 8760*4] # 南(ID=2)と屋根(ID=5)の壁の相当外気温度を 10.0 ℃とする。 theta_o_eqv_js_ns = np.stack([ np.zeros(8760 * 4, dtype=float), np.zeros(8760 * 4, dtype=float), np.full(8760 * 4, 10.0, dtype=float), np.zeros(8760 * 4, dtype=float), np.zeros(8760 * 4, dtype=float), np.full(8760 * 4, 10.0, dtype=float) ]) # pre_calc_parametersの構築 ss, ppg = pre_calc_parameters.make_pre_calc_parameters( delta_t=900.0, rd=rd, oc=oc, theta_o_eqv_js_ns=theta_o_eqv_js_ns, scd=scd) q_srf_js_n = np.array([[ 15.384094583670, 15.384094583670, -31.115905416330, 15.384094583670, 14.704033054882, -29.740411389563 ]]).reshape(-1, 1) theta_ei_js_n = np.array([[ 3.308407437, 3.308407437, 3.308407437, 3.308407437, 3.308407437, 3.308407437 ]]).reshape(-1, 1) # 初期状態値の計算 c_n = conditions.Conditions( operation_mode_is_n=np.array( [[operation_mode.OperationMode.STOP_CLOSE]]), theta_r_is_n=np.array([[3.3084074373484]]), theta_mrt_hum_is_n=np.array([[2.758476601]]), x_r_is_n=np.array([[0.0]]), theta_dsh_s_a_js_ms_n=q_srf_js_n * ss.phi_a1_js_ms / (1.0 - ss.r_js_ms), theta_dsh_s_t_js_ms_n=(np.dot(ss.k_ei_js_js, theta_ei_js_n) + ss.theta_dstrb_js_ns[:, 1].reshape(-1, 1)) * ss.phi_t1_js_ms / (1.0 - ss.r_js_ms), q_s_js_n=q_srf_js_n, theta_frt_is_n=np.array([[3.3084074373484]]), x_frt_is_n=np.array([[0.0]]), theta_ei_js_n=theta_ei_js_n) # 計算実行 c_n_pls = sequence.run_tick(n=-2, delta_t=900.0, ss=ss, c_n=c_n, recorder=None) # 計算結果格納 cls._c_n = c_n cls._c_n_pls = c_n_pls