7R2C

Overview

7R2C HVAC model aligned with VDI 6007 multi‑node transient method.

Purpose and scope:

  • Represents a thermal zone with two thermal masses and multiple heat‑transfer paths to capture phase shifts and damping effects beyond 1R1C/5R1C models. Suitable for envelope studies, solar‑gain interactions, and scenarios where interior vs exterior mass coupling matters.

Conceptual structure:

  • Two capacitances: exterior mass (AW = Außenwände) and interior mass (IW = Innenwände).

  • Seven resistances connect masses, surfaces, indoor air, and outside, including parallel window/opaque paths on the AW side and a radiative “star” network that couples surfaces and air.

  • Three principal temperature states are resolved per step: • theta_m_aw (exterior mass), • theta_m_iw (interior mass), • theta_air (indoor air).

  • Internal and solar gains are split into convective (air) and radiant parts distributed to AW/IW surfaces via σ parameters (sigma_aw, sigma_iw; remainder convective).

  • Ventilation is split into mechanical and infiltration parts and applied to the air node.

Notes:

  • Windows are modeled as a parallel conductance in the AW branch, affecting the equivalent resistance split between opaque and transparent parts.

  • The equivalent outdoor temperature T_eq for the AW path is a conductance‑weighted blend of sol‑air temperature (opaque) and ambient dry‑bulb (windows).

  • Includes a stabilization of initial states to reduce sensitivity to initial conditions.

  • For lighter‑weight simulations with fewer states consider 5R1C (ISO 13790); for quicker control‑oriented studies consider 1R1C.

Reference:

  • VDI 6007: Calculation of transient thermal response of rooms and buildings (7R2C concept).

Key facts

  • Method key: 7R2C

  • Supported types:

    • hvac

Requirements

Required keys (specify in objects)

  • R_1_AW[K W-1]

  • C_1_AW[J K-1]

  • R_1_IW[K W-1]

  • C_1_IW[J K-1]

  • R_alpha_star_IL[K W-1]

  • R_alpha_star_AW[K W-1]

  • R_alpha_star_IW[K W-1]

  • R_rest_AW[K W-1]

  • weather

Optional keys (specify in objects)

  • power_heating[W]

  • power_cooling[W]

  • active_heating

  • active_cooling

  • active_gains_internal

  • active_gains_solar

  • active_ventilation

  • init_temperature[C]

  • min_temperature[C]

  • max_temperature[C]

  • deadband[K]

  • target_humidity_rel[1]

  • gains_internal_latent[W]

  • supply_temperature[C]

  • area[m2]

  • height[m]

  • fraction_conv_internal

  • fraction_rad_AW

  • sigma_7R2C_AW

  • sigma_7R2C_IW

  • H_ve[W K-1]

  • ventilation_split

  • T_eq[C]

  • T_eq[C]_column

  • T_eq_alpha_SW[1]

  • T_eq_h_o[W m-2 K-1]

  • gains_internal[W]

  • gains_solar[W]

  • ventilation[W K-1]

Required data (specify in data)

  • weather

Optional data (specify in data)

  • windows

  • gains_internal[W]

  • gains_solar[W]

  • H_ve[W K-1]

  • T_eq[C]

Outputs

Summary metrics

Key

Description

heating:demand[Wh]

total heating demand

heating:load_max[W]

maximum heating load

cooling:demand[Wh]

total cooling demand (sensible + latent)

cooling:load_max[W]

maximum cooling load (sensible + latent)

Timeseries columns

Column

Description

indoor_temperature[C]

indoor air temperature

heating:load[W]

heating load

cooling:load[W]

total cooling load (sensible + latent)

cooling:sensible_load[W]

sensible cooling load

cooling:latent_load[W]

latent cooling load

Public methods

  • generate

      def generate(
        self, obj: dict = None, data: dict = None, results: dict = None, ts_type: str = Types.HVAC, **kwargs
    ) -> dict:
        obj, data = self._process_kwargs(obj, data, **kwargs)
        obj, data = self._get_input_data(obj, data, ts_type)
        data = self._prepare_inputs(obj, data)
    
        temp_in, p_heat, p_cool = calculate_timeseries_7r2c(**data)
    
        meta = data["meta"]
        p_cool_sensible, p_cool_latent = self._apply_latent_cooling(obj, data, p_cool)
        return self._format_output(
            temp_in.round(3),
            p_heat.round().astype(int),
            p_cool_sensible.round().astype(int),
            p_cool_latent.round().astype(int),
            meta["index"],
            meta["dt_s"],
        )