module LargeOffice

Custom changes for the LargeOffice prototype. These are changes that are inconsistent with other prototype building types.

Public Instance Methods

air_loop_hvac_supply_air_temperature_reset_type(air_loop_hvac) click to toggle source

Type of SAT reset for this building type

@param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop @return [String] Returns type of SAT reset

# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 164
def air_loop_hvac_supply_air_temperature_reset_type(air_loop_hvac)
  return 'oa'
end
air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(air_terminal_single_duct_vav_reheat, zone_oa_per_area) click to toggle source

@!group AirTerminalSingleDuctVAVReheat 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

@param air_terminal_single_duct_vav_reheat [OpenStudio::Model::AirTerminalSingleDuctVAVReheat] the air terminal object @param zone_oa_per_area [Double] the zone outdoor air per area in m^3/s*m^2 @return [Boolean] returns true if successful, false if not

# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 151
def air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(air_terminal_single_duct_vav_reheat, zone_oa_per_area)
  min_damper_position = template == '90.1-2010' || template == '90.1-2013' || template == '90.1-2016' || template == '90.1-2019' ? 0.2 : 0.3

  # Set the minimum flow fraction
  air_terminal_single_duct_vav_reheat.setConstantMinimumAirFlowFraction(min_damper_position)

  return true
end
model_custom_daylighting_tweaks(building_type, climate_zone, prototype_input, model) click to toggle source
# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 115
def model_custom_daylighting_tweaks(building_type, climate_zone, prototype_input, model)
  return true
end
model_custom_geometry_tweaks(model, building_type, climate_zone, prototype_input) click to toggle source

geometry adjustments specific to the prototype model

@param model [OpenStudio::Model::Model] OpenStudio model object @param building_type [String] the building type @param climate_zone [String] ASHRAE climate zone, e.g. ‘ASHRAE 169-2013-4A’ @param prototype_input [Hash] hash of prototype inputs @return [Boolean] returns true if successful, false if not

# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 137
def model_custom_geometry_tweaks(model, building_type, climate_zone, prototype_input)
  # Set original building North axis
  OpenstudioStandards::Geometry.model_set_building_north_axis(model, 0.0)
  return true
end
model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input) click to toggle source

hvac adjustments specific to the prototype model

@param model [OpenStudio::Model::Model] OpenStudio model object @param building_type [String] the building type @param climate_zone [String] ASHRAE climate zone, e.g. ‘ASHRAE 169-2013-4A’ @param prototype_input [Hash] hash of prototype inputs @return [Boolean] returns true if successful, false if not

# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 11
def model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input)
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific HVAC adjustments')

  # add transformer
  # efficiency based on a 500 kVA transformer
  case template
  when '90.1-2004', '90.1-2007'
    transformer_efficiency = 0.979
  when '90.1-2010', '90.1-2013'
    transformer_efficiency = 0.987
  when '90.1-2016', '90.1-2019'
    transformer_efficiency = 0.991
  else
    transformer_efficiency = nil
  end
  return true unless !transformer_efficiency.nil?

  # rename datacenter plug loads sub categories, there should be 2 data center plug load objects in large office
  model.getElectricEquipments.sort.each do |item|
    if item.nameString.include? 'Data Center'
      item.setEndUseSubcategory('DataCenterPlugLoads')
    end
  end

  model_add_transformer(model,
                        wired_lighting_frac: 0.0281,
                        transformer_size: 500000,
                        transformer_efficiency: transformer_efficiency,
                        excluded_interiorequip_meter: 'DataCenterPlugLoads:InteriorEquipment:Electricity')

  system_to_space_map = define_hvac_system_map(building_type, climate_zone)

  system_to_space_map.each do |system|
    # find all zones associated with these spaces
    thermal_zones = []
    system['space_names'].each do |space_name|
      space = model.getSpaceByName(space_name)
      if space.empty?
        OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{space_name} was found in the model")
        return false
      end
      space = space.get
      zone = space.thermalZone
      if zone.empty?
        OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{space_name}")
        return false
      end
      thermal_zones << zone.get
    end

    return_plenum = nil
    unless system['return_plenum'].nil?
      return_plenum_space = model.getSpaceByName(system['return_plenum'])
      if return_plenum_space.empty?
        OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{system['return_plenum']} was found in the model")
        return false
      end
      return_plenum_space = return_plenum_space.get
      return_plenum = return_plenum_space.thermalZone
      if return_plenum.empty?
        OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{system['return_plenum']}")
        return false
      end
      return_plenum = return_plenum.get
    end
  end

  # set infiltration schedule for plenums
  # @todo remove once infil_sch in Standards.Space pulls from default building infiltration schedule
  model.getSpaces.each do |space|
    next unless space.name.get.to_s.include? 'Plenum'

    # add infiltration if DOE Ref vintage
    if template == 'DOE Ref 1980-2004' || template == 'DOE Ref Pre-1980'
      # Create an infiltration rate object for this space
      infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(space.model)
      infiltration.setName("#{space.name} Infiltration")
      all_ext_infil_m3_per_s_per_m2 = OpenStudio.convert(0.2232, 'ft^3/min*ft^2', 'm^3/s*m^2').get
      infiltration.setFlowperExteriorSurfaceArea(all_ext_infil_m3_per_s_per_m2)
      infiltration.setSchedule(model_add_schedule(model, 'Large Office Infil Quarter On'))
      infiltration.setConstantTermCoefficient(1.0)
      infiltration.setTemperatureTermCoefficient(0.0)
      infiltration.setVelocityTermCoefficient(0.0)
      infiltration.setVelocitySquaredTermCoefficient(0.0)
      infiltration.setSpace(space)
    else
      space.spaceInfiltrationDesignFlowRates.each do |infiltration_object|
        infiltration_object.setSchedule(model_add_schedule(model, 'OfficeLarge INFIL_SCH_PNNL'))
      end
    end
  end

  hp_loop = model.getPlantLoopByName('Heat Pump Loop')
  if hp_loop.is_initialized
    hp_loop = hp_loop.get

    # set working fluid to ethylene glycol
    hp_loop.setFluidType('EthyleneGlycol')
    hp_loop.setGlycolConcentration(40)
  end

  return true
end
model_custom_swh_tweaks(model, building_type, climate_zone, prototype_input) click to toggle source

swh adjustments specific to the prototype model

@param model [OpenStudio::Model::Model] OpenStudio model object @param building_type [String] the building type @param climate_zone [String] ASHRAE climate zone, e.g. ‘ASHRAE 169-2013-4A’ @param prototype_input [Hash] hash of prototype inputs @return [Boolean] returns true if successful, false if not

# File lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb, line 126
def model_custom_swh_tweaks(model, building_type, climate_zone, prototype_input)
  return true
end