Class: DOERefPre1980

Inherits:
ASHRAE901 show all
Defined in:
lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb,
lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb,
lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb,
lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb,
lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.hvac_systems.rb,
lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb,
lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb,
lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb,
lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb

Overview

This class holds methods that apply the “standard” assumptions used in the DOE Pre-1980 Reference Buildings to a given model.

Technical References:

Constant Summary collapse

@@template =

rubocop:disable Style/ClassVars

'DOE Ref Pre-1980'

Instance Attribute Summary collapse

Model collapse

PlantLoop collapse

AirLoopHVAC collapse

hvac_systems collapse

refrigeration collapse

CoilHeatingGas collapse

elevators collapse

AirTerminalSingleDuctVAVReheat collapse

Instance Method Summary collapse

Constructor Details

#initializeDOERefPre1980

Returns a new instance of DOERefPre1980.


9
10
11
12
13
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb', line 9

def initialize
  super()
  @template = @@template
  load_standards_database
end

Instance Attribute Details

#templateObject (readonly)

Returns the value of attribute template


7
8
9
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb', line 7

def template
  @template
end

Instance Method Details

#air_loop_hvac_apply_multizone_vav_outdoor_air_sizing(air_loop_hvac) ⇒ Bool

TODO:

enable damper position adjustment for legacy IDFS

Apply multizone vav outdoor air method and adjust multizone VAV damper positions. Currently doesn't do anything for the DOE prototype buildings.

Returns:

  • (Bool)

    returns true if successful, false if not


10
11
12
13
14
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb', line 10

def air_loop_hvac_apply_multizone_vav_outdoor_air_sizing(air_loop_hvac)
  # TODO: enable damper position adjustment for legacy IDFS
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', 'Damper positions not modified for DOE Ref Pre-1980 or DOE Ref 1980-2004 vintages.')
  return true
end

#air_loop_hvac_static_pressure_reset_required?(air_loop_hvac, has_ddc) ⇒ Boolean

TODO:

Instead of requiring the input of whether a system has DDC control of VAV terminals or not, determine this from the system itself. This may require additional information be added to the OpenStudio data model.

Determine if static pressure reset is required for this system. Not required by DOE Pre-1980.

over VAV terminals. return [Bool] returns true if static pressure reset is required, false if not

Parameters:

  • has_ddc (Bool)

    whether or not the system has DDC control

Returns:

  • (Boolean)

26
27
28
29
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb', line 26

def air_loop_hvac_static_pressure_reset_required?(air_loop_hvac, has_ddc)
  sp_reset_required = false
  return sp_reset_required
end

#air_loop_hvac_vav_damper_action(air_loop_hvac) ⇒ String

Determine whether the VAV damper control is single maximum or dual maximum control. Single Maximum for DOE Ref Pre-1980.

Returns:

  • (String)

    the damper control type: Single Maximum, Dual Maximum


35
36
37
38
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb', line 35

def air_loop_hvac_vav_damper_action(air_loop_hvac)
  damper_action = 'Single Maximum'
  return damper_action
end

#air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(air_terminal_single_duct_vav_reheat, building_type, zone_oa_per_area) ⇒ Bool

TODO:

remove exception where older vintages don't have minimum positions adjusted.

Set the initial minimum damper position based on OA rate of the space and the template. Zones with low OA per area get lower initial guesses. Final position will be adjusted upward as necessary by Standards.AirLoopHVAC.apply_minimum_vav_damper_positions

Parameters:

  • zone_oa_per_area (Double)

    the zone outdoor air per area, m^3/s

Returns:

  • (Bool)

    returns true if successful, false if not


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb', line 12

def air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(air_terminal_single_duct_vav_reheat, building_type, zone_oa_per_area)
  vav_name = air_terminal_single_duct_vav_reheat.name.get
  min_damper_position = if building_type == 'Outpatient' && vav_name.include?('Floor 1')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('PatRoom')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('OR')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('ICU')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('Lab')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('ER')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('Kitchen')
                          1
                        elsif building_type == 'Hospital' && vav_name.include?('NurseStn')
                          0.3
                        else
                          0.3
                        end

  air_terminal_single_duct_vav_reheat.setConstantMinimumAirFlowFraction(min_damper_position)

  return true
end

#coil_heating_gas_apply_prototype_efficiency(coil_heating_gas) ⇒ Object

TODO:

Refactor: remove inconsistency in logic; all coils should be lower efficiency

Updates the efficiency of some gas heating coils per the prototype assumptions. Sets heating coils inside PSZ-AC systems to 78% efficiency per the older vintages.


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb', line 9

def coil_heating_gas_apply_prototype_efficiency(coil_heating_gas)
  # Only modify coils in PSZ-AC units
  name_patterns = ['PSZ-AC Gas Htg Coil',
                   'ZN HVAC_',
                   'PSZ-AC_2-7 Gas Htg',
                   'PSZ-AC_2-5 Gas Htg',
                   'PSZ-AC_1-6 Gas Htg',
                   'PSZ-AC-1 Gas Htg',
                   'PSZ-AC-2 Gas Htg',
                   'PSZ-AC-3 Gas Htg',
                   'PSZ-AC-4 Gas Htg',
                   'PSZ-AC-5 Gas Htg',
                   'PSZ-AC_3-7 Gas Htg',
                   'PSZ-AC_2-6 Gas Htg',
                   'PSZ-AC_5-9 Gas Htg',
                   'PSZ-AC_1-5 Gas Htg',
                   'PSZ-AC_4-8 Gas Htg',
                   'PSZ-AC_1 Gas Htg',
                   'PSZ-AC_2 Gas Htg',
                   'PSZ-AC_3 Gas Htg',
                   'PSZ-AC_4 Gas Htg',
                   'PSZ-AC_5 Gas Htg',
                   'PSZ-AC_6 Gas Htg',
                   'PSZ-AC_7 Gas Htg',
                   'PSZ-AC_8 Gas Htg',
                   'PSZ-AC_9 Gas Htg',
                   'PSZ-AC_10 Gas Htg']
  name_patterns.each do |pattern|
    if coil_heating_gas.name.get.include?(pattern)
      coil_heating_gas.setGasBurnerEfficiency(0.78)
    end
  end

  return true
end

#model_add_elevator(model, space, number_of_elevators, elevator_type, elevator_schedule, elevator_fan_schedule, elevator_lights_schedule, building_type = nil) ⇒ OpenStudio::Model::ElectricEquipment

TODO:

Inconsistency. Older vintages don't have lights or fans

Add an elevator the the specified space

to assign the elevators to. Traction, Hydraulic in elevators, which is not realistic.

Parameters:

  • space (OpenStudio::Model::Space)

    the space

  • number_of_elevators (Integer)

    the number of elevators

  • elevator_type (String)

    valid choices are

  • elevator_schedule (String)

    the name of the elevator schedule

  • elevator_fan_schedule (String)

    the name of the elevator fan schedule

  • elevator_lights_schedule (String)

    the name of the elevator lights schedule

  • building_type (String) (defaults to: nil)

    the building type

Returns:

  • (OpenStudio::Model::ElectricEquipment)

    the resulting elevator


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb', line 18

def model_add_elevator(model,
                       space,
                       number_of_elevators,
                       elevator_type,
                       elevator_schedule,
                       elevator_fan_schedule,
                       elevator_lights_schedule,
                       building_type = nil)

  # Lift motor assumptions
  lift_pwr_w = model_elevator_lift_power(model, elevator_type, building_type)

  # Size assumptions
  length_ft = 6.66
  width_ft = 4.25
  height_ft = 8.0
  area_ft2 = length_ft * width_ft
  volume_ft3 = area_ft2 * height_ft

  # Ventilation assumptions
  vent_rate_acm = 1 # air changes per minute
  vent_rate_cfm = volume_ft3 / vent_rate_acm
  vent_pwr_w = model_elevator_fan_pwr(model, vent_rate_cfm)

  # Heating fraction radiant assumptions
  elec_equip_frac_radiant = 0.5

  # Lighting assumptions
  design_ltg_lm_per_ft2 = 30
  light_loss_factor = 0.75
  pct_incandescent = model_elevator_lighting_pct_incandescent(model)
  pct_led = 1.0 - pct_incandescent

  incandescent_efficacy_lm_per_w = 10.0
  led_efficacy_lm_per_w = 35.0
  target_ltg_lm_per_ft2 = design_ltg_lm_per_ft2 / light_loss_factor # 40
  target_ltg_lm = target_ltg_lm_per_ft2 * area_ft2 # 1132.2
  lm_incandescent = target_ltg_lm * pct_incandescent # 792.54
  lm_led = target_ltg_lm * pct_led # 339.66
  w_incandescent = lm_incandescent / incandescent_efficacy_lm_per_w # 79.254
  w_led = lm_led / led_efficacy_lm_per_w # 9.7
  lighting_pwr_w = w_incandescent + w_led

  # Elevator lift motor
  elevator_definition = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
  elevator_definition.setName('Elevator Lift Motor')
  elevator_definition.setDesignLevel(lift_pwr_w)
  elevator_definition.setFractionRadiant(elec_equip_frac_radiant)

  elevator_equipment = OpenStudio::Model::ElectricEquipment.new(elevator_definition)
  elevator_equipment.setName("#{number_of_elevators.round} Elevator Lift Motors")
  elevator_sch = model_add_schedule(model, elevator_schedule)
  elevator_equipment.setSchedule(elevator_sch)
  elevator_equipment.setSpace(space)
  elevator_equipment.setMultiplier(number_of_elevators)

  return elevator_equipment
end

#model_apply_infiltration_standard(model) ⇒ Bool

TODO:

This infiltration method is not used by the Reference

Apply the air leakage requirements to the model. “For 'DOE Ref Pre-1980' and 'DOE Ref 1980-2004', infiltration rates are not defined using this method, no changes are actually made to the model.

base infiltration rates off of. buildings, fix this inconsistency.

Returns:

  • (Bool)

    true if successful, false if not


13
14
15
16
17
18
19
20
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb', line 13

def model_apply_infiltration_standard(model)
  # Set the infiltration rate at each space
  model.getSpaces.sort.each do |space|
    space_apply_infiltration_rate(space)
  end

  return true
end

#model_elevator_lift_power(model, elevator_type, building_type) ⇒ Object

Determines the power required by an individual elevator of a given type. Values used by the older vintages are slightly higher than those used by the DOE prototypes. Traction, Hydraulic

Parameters:

  • elevator_type (String)

    valid choices are


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb', line 82

def model_elevator_lift_power(model, elevator_type, building_type)
  lift_pwr_w = 0
  if elevator_type == 'Traction'
    lift_pwr_w = 18_537.0
  elsif elevator_type == 'Hydraulic'
    lift_pwr_w = if building_type == 'MidriseApartment'
                   16_055.0
                 else
                   14_610.0
                 end
  else
    lift_pwr_w = 14_610.0
    OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "Elevator type '#{elevator_type}', not recognized, will assume Hydraulic elevator, #{lift_pwr_w} W.")
  end

  return lift_pwr_w
end

#model_get_climate_zone_set_from_list(model, possible_climate_zone_sets) ⇒ Object

Determine which climate zone to use. For Pre-1980 and 1980-2004, use the most specific climate zone set. For example, 2A and 2 both contain 2A, so use 2A.


25
26
27
28
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb', line 25

def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
  climate_zone_set = possible_climate_zone_sets.sort.last
  return climate_zone_set
end

#model_swh_pump_type(model, building_type) ⇒ String

Determine the type of SWH pump that a model will have.

Returns:

  • (String)

    the SWH pump type: ConstantSpeed, VariableSpeed


7
8
9
10
11
12
13
14
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.hvac_systems.rb', line 7

def model_swh_pump_type(model, building_type)
  swh_pump_type = if building_type == 'Medium Office'
                    'ConstantSpeed'
                  else
                    'VariableSpeed'
                  end
  return swh_pump_type
end

#model_walkin_freezer_latent_case_credit_curve(model) ⇒ Object

TODO:

Should probably use the model_add_refrigeration_walkin

Determine the latent case credit curve to use for walkins. and lookups from the spreadsheet instead of hard-coded values.


8
9
10
11
# File 'lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb', line 8

def model_walkin_freezer_latent_case_credit_curve(model)
  latent_case_credit_curve_name = 'Single Shelf Horizontal Latent Energy Multiplier_Pre2004'
  return latent_case_credit_curve_name
end

#plant_loop_supply_water_temperature_reset_required?(plant_loop) ⇒ Boolean

Determine if temperature reset is required. Not required for the older DOE buildings.

Returns:

  • (Boolean)

6
7
8
9
# File 'lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb', line 6

def plant_loop_supply_water_temperature_reset_required?(plant_loop)
  reset_required = false
  return reset_required
end