Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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