From GridLAB-D Wiki
Jump to: navigation, search

Spec:Commercial - Specifications for commercial building models

Fig. 1: An example of a 6-node commercial building model. The branch from node 0 to node 2 is the original ETP model such as is used by the residential module. Node 3 represents an unconditioned space, while nodes 4 and 5 represent a series of massless nodes between the indoor spaces and the outdoor.

Large multizone commercial buildings are simulated using a linearized N-node ETP model, such as the one illustrated in Fig. 1. Because large buildings are separated into multiple control zones, each control zone must be associated with exactly one thermal node. Other thermal nodes may be defined as needed.

Each thermal node is characterized by its temperature [math] T_n [/math], its thermal mass [math] C_n [/math], and an exogenous heat gain (or loss) [math] Q_n [/math] from solar, internal, and/or HVAC boundary conditions (and which may be zero).

Two nodes [math] n [/math] and [math] m [/math] are connected by the conductance [math]U_{nm}[/math], which represents the combined effect of the UA of the surfaces separating the two zones, the associated convective surface heat transfers, and the air exchange between the zones.

Explicit Solution

To solve this thermal circuit explicitly, the heat flow from the node [math] n [/math] to the node [math] m [/math] is computed as

[math] Q_{nm} = U_{nm} \left ( T_n - T_m \right ) [/math].

where [math]T_n[/math] is the temperature of the node [math]n[/math]. Note that the sign convention for [math] Q [/math] is positive for heat flowing into a node. Thus by definition [math] Q_{nm} = -Q_{mn} [/math].

Massive node temperature

Assuming a "small" time step, [math]dt[/math] during which all temperature changes are "small" enough relative to the differences between the node temperatures that all the quantities [math] Q_{nm} [/math] can be considered constant. This is the linearization assumption.

The heat balance for a massive node [math]n[/math] (i.e., [math]C_n \gt 0[/math] with respect to all nodes [math] m \in {1,M} [/math] over the time interval from [math]t[/math] to [math] t + \Delta t [/math] is

[math] Q_n(t) + \sum_{m=1}^M Q_{mn}(t) = \frac { C_n \left [ T_n(t+\Delta t)-T_n(t) \right ] } { \Delta t } [/math]

where [math] Q_n(t) [/math] is a boundary condition assumed to be constant over the interval [math]t[/math] to [math] t + \Delta t [/math]. The explicit solution to this equation is

[math] T_n(t+\Delta t) = \frac { \Delta t } { C_n } Q_n(t) + \frac { \Delta t } { C_n } \sum_{m=1}^M U_{mn} T_m(t) + T_n(t) \left ( 1 - \frac { \Delta t } { C_n } \sum_{m=1}^M U_mn \right ) [/math]

Massless node reduction

Before computing the temperatures of the massless nodes, all those in series must be reduced until all the adjacent nodes are massive. Most often series reductions are sufficient:

[math] U_ik = \left ( \frac{1}{U_{ij}} + \frac{1}{U_{jk}} \right )^{-1} [/math].

In some cases a parallel reduction over [math] K [/math] paths is necessary

[math] U_{ij_k} = \sum_{k=1}^K U_{ij_k} [/math].

More generally, all "star" configurations of massless nodes must be reduced to "mesh" configuration by eliminating the node [math] k [/math] for all other pairs of nodes [math] i,j [/math] using

[math] U_{ij} = z_{ik} z_{jk} \sum z^{-1} [/math].

Massless node temperature

Each massless node (i.e., [math] C_n = 0 [/math]) must be in thermal equilibrium with all connected nodes. So the above heat balance equation reduces to

[math] Q_n(t) + \sum_{m=1}^M Q_{nm}(t+\Delta t) = 0 [/math]

the explicit solution of which is

[math] T_n(t+\Delta t) = \frac { Q_n(t) + \sum_{m=1}^M U_{mn} T_m(t+\Delta t) } { \sum_{m=1}^M U_{mn} } [/math]

Massless node temperatures can be left uncomputed when a) the node temperature is not used in any non-linear portion of the simulation (e.g., thermostat input), and b) the node temperature is not use as an output variable.

In general, if the modeler has created a massless node, it should be presumed necessary for some reason and its temperature should be calculated.

Bang-bang HVAC controls

Only massive nodes may have "bang-bang" HVAC controls applied to them. The total heat contribution from the HVAC systems is

[math] Q_{HVAC} = Q_{heat} - Q_{cool} + Q_{fan} [/math]


  • [math] Q_{heat} [/math] is the plant heating contribution to the zone (if any)
  • [math] Q_{cool} [/math] is the plant cooling contribution to the zone (if any)
  • [math] Q_{reheat} [/math] is the terminate reheat contribution to the zone (if any)
  • [math] Q_{fan} [/math] is the heat from the circulation fan (if running)

The thermostat in the zone [math] n [/math] controls the heating/cooling/ventilation by operating in one of four modes, [math]Mode_n[/math]

  • [math] OFF [/math] - the fan is off (no heating or cooling)
  • [math] VENT [/math] - the fan is on without heating or cooling
  • [math] HEAT [/math] - the fan is on for heating
  • [math] COOL [/math] - the fan is on for cooling

Each zone thermostat has two set-points, a deadband, and minimum separation:

  • [math] T_{heat} [/math] - the heating set-point
  • [math] T_{cool} [/math] - the cooling set-point
  • [math] T_{dead} [/math] - the deadband width around each set-point (half above and half below)
  • [math] T_{sep} [/math] - the minimum separation between the heating and cooling set-points

The following constraints exists for the thermostats parameters:

[math] T_{heat} \lt T_{cool} - T_{sep} [/math]
[math] T_{sep} \lt 2*T_{dead} [/math]
[math] T_{dead} \gt 0.0 [/math]

The ventilation schedule for each zone must be specified as weekly schedule of days and hours when minimum ventilation must be maintained:

  • [math] V_{min} [/math] - the minimum % of air that must be replaced each hour (value between 0.0 and 1.0)

The thermostat modes persist in time until changed as follows:

  • When no ventilation is scheduled:
    • [math] ( Mode_n \ne HEAT ) \and ( T_n \lt T_{heat_n} - \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr HEAT [/math]
    • [math] ( Mode_n = HEAT ) \and ( T_n \gt T_{heat_n} + \frac{1}{2} T_{dead_n}) \implies Mode_n \larr OFF [/math]
    • [math] ( Mode_n \ne COOL ) \and ( T_n \gt T_{cool_n} + \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr COOL [/math]
    • [math] ( Mode_n = COOL ) \and ( T_n \lt T_{cool_n} - \frac{1}{2} T_{dead_n}) \implies Mode_n \larr OFF [/math]
  • When ventilation is scheduled:
    • [math] ( Mode_n \ne HEAT ) \and ( T_n \lt T_{heat_n} - \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr HEAT [/math]
    • [math] ( Mode_n = HEAT ) \and ( T_n \gt T_{heat_n} + \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr VENT [/math]
    • [math] ( Mode_n \ne COOL ) \and ( T_n \gt T_{cool_n} + \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr COOL [/math]
    • [math] ( Mode_n = COOL ) \and ( T_n \lt T_{cool_n} - \frac{1}{2} T_{dead_n} ) \implies Mode_n \larr VENT [/math]

The thermostat modes are locked for a minimum time duration during which time no change in the mode is permitted:

  • [math] T_{lock} [/math] - the minimum lock time (default is 2 minutes)

The heats are computed as follows:

[math] Mode_n=OFF \implies Q_{heat} \larr 0.0 \and Q_{cool} \larr 0.0 \and Q_{fan} \larr 0.0 [/math]
[math] Mode_n=VENT \implies Q_{heat} \larr 0.0 \and Q_{cool} \larr 0.0 \and Q_{fan} \larr Q_{fan_{low}} [/math]
[math] Mode_n=HEAT \implies Q_{heat} \larr Q_{heat_{cap_n}} \and Q_{cool_n} \larr 0.0 \and Q_{fan} \larr Q_{fan_{high}} [/math]
[math] Mode_n=COOL \implies Q_{heat} \larr 0.0 \and Q_{cool} \larr Q_{cool_{cap_n}} \and Q_{fan} \larr Q_{fan_{high}} [/math]


  • [math] Q_{heat_{cap_n}} [/math] is the heating capacity of the heating system for node [math] n [/math]
  • [math] Q_{cool_{cap_n}} [/math] is the cooling capacity of the heating system for node [math] n [/math]
  • [math] Q_{fan_{low_n}} [/math] is heat from the fan when running at low power
  • [math] Q_{fan_{high_n}} [/math] is heat from the fan when running at high power

The time until the next mode change is

[math] \Delta t = \frac { C_n [ T_{target_n}(t) - T_n(t) ] } { Q_n(t) + \sum_{m=1}^M U_{mn} [ T_m(t) - T_n(t) ] } [/math]

where the target temperature is determined as follows

[math] Mode_n=HEAT \implies T_{target_n} \larr T_{heat_n} + \frac{1}{2} T_{dead_n}[/math]
[math] Mode_n=COOL \implies T_{target_n} \larr T_{cool_n} - \frac{1}{2} T_{dead_n} [/math]
[math] ( Mode_n=OFF \or Mode_n=VENT ) \and ( \Delta T_n \lt 0 ) \implies T_{target_n} \larr T_{heat_n} - \frac{1}{2} T_{dead_n}[/math]
[math] ( Mode_n=OFF \or Mode_n=VENT ) \and ( \Delta T_n \gt 0 ) \implies T_{target_n} \larr T_{cool_n} + \frac{1}{2} T_{dead_n}[/math]

where [math] \Delta T_n = T_n(t-\Delta t)-T_n(t) [/math].

In the rare event that [math] T_{target_n}(t) = T_n(t) [/math] the mode should remain unchanged.

The time [math] \Delta t [/math] must not to exceed 5 minutes. There is no practical minimum for the [math] \Delta t [/math].

PID HVAC controls

When proportional (optionally with integral and/or differential) control is used for a zone, the following is used

  • When [math] T_n(t) \lt T_{heat_n}(t) [/math]
[math] Q_{heat_n}(t) = Q_{heat_{cap_n}}(t) \underset {0.0} \overset {1.0} {\Big [} k_{P_{heat}} \left [ T_n(t)-T_{heat_n}(t) \right ] + k_{I_{heat}} \sum_{\tau=t_{reset}}^t T_n(\tau) \Delta t_\tau + k_{D_{heat}} \frac { T_n(t) - T_n(t-\Delta t) } { \Delta t } {\Big ]} [/math]
[math] Q_{cool_n}(t) = 0 [/math]
[math] Q_{fan_n}(t) = Q_{fan_{high_n}} [/math]
  • When [math] T_n \gt T_{cool_n} [/math]
[math] Q_{heat_n}(t) = 0.0 [/math]
[math] Q_{cool_n}(t) = Q_{cool_{cap_n}}(t) \underset {0.0} \overset {1.0} {\Big [} k_{P_{cool}} \left [ T_n(t)-T_{cool_n}(t) \right ] + k_{I_{cool}} \sum_{\tau=t_{reset}}^t T_n(\tau) \Delta t_\tau + k_{D_{cool}} \frac { T_n(t) - T_n(t-\Delta t) } { \Delta t } {\Big ]} [/math]
[math] Q_{fan_n}(t) = Q_{fan_{high_n}} [/math]
  • When [math] T_{heat_n} \le T_n \le T_{cool_n} [/math]
[math] Q_{cool_n} = Q_{heat_n} = 0.0 [/math]
  • When ventilation is scheduled
[math] Q_{fan_n} = Q_{fan_{low_n}} [/math]
  • When ventilation is not scheduled
[math] Q_{fan_n} = 0.0 [/math]


  • [math] t_{reset} [/math] is the time of the last set-point reset
  • [math] k_P [/math] is the proportional control gain
  • [math] k_I [/math] is the integral control gain (set to zero to disable integral control)
  • [math] k_D [/math] is the differential control gain (set to zero to disable differential control)

See also