Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question
3

How to input cooling tower efficiency for baseline model as specified in ASHRAE 90.1

asked 2021-08-03 00:20:32 -0500

Keigo's avatar

ASHRAE90.1 2016 and 2019 editions specify a cooling tower efficiency of 3.23 L/s·kW for baseline model.

image description

According to an annotation in Table 6.8.1-7, this efficiency means the water flow divided by the fan motor nameplate power.

image description

How can we input this efficiency to IDF file? There are two objects for coolingtower with variable speed fan: CoolingTower:VariableSpeed:Merkel and CoolingTower:VariableSpeed, but both don't have such an input field. Design Water Flow Rate per Unit of Nominal Capacity field is different from this efficiency since Nominal Capacity and Fan motor power are different.

I'm thinking about the following approach, but is it correct?

  1. Run the simulation with Design Water Flow Rate and Design Fan Power set to autosize.
  2. Get the autosized Water Flow Rate from the simulation result.
  3. Calculate the Design Fan Power from the following equation: Design Fan Power[kW] = autosized Water Flow Rate[L/s] / 3.23[L/s·kW]
  4. Input the calculated Design Fan Power to Design Fan Power field, and run the simulation again.

image description

edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted
2

answered 2021-08-03 10:17:54 -0500

Oh, I do not like non-freedom units. But you are right, that is the way of doing it.

I am copying below a section of the openstudio-standards gem in OpenStudio that handles that calculation :)

  def cooling_tower_apply_minimum_power_per_flow(cooling_tower)
# Get the design water flow rate
design_water_flow_m3_per_s = nil
if cooling_tower.designWaterFlowRate.is_initialized
  design_water_flow_m3_per_s = cooling_tower.designWaterFlowRate.get
elsif cooling_tower.autosizedDesignWaterFlowRate.is_initialized
  design_water_flow_m3_per_s = cooling_tower.autosizedDesignWaterFlowRate.get
else
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name} design water flow rate is not available, cannot apply efficiency standard.")
  return false
end
design_water_flow_gpm = OpenStudio.convert(design_water_flow_m3_per_s, 'm^3/s', 'gal/min').get

# Get the table of cooling tower efficiencies
heat_rejection = standards_data['heat_rejection']

# Define the criteria to find the cooling tower properties
# in the hvac standards data set.
search_criteria = {}
search_criteria['template'] = template

# By definition cooling towers in E+ are open.
# Closed cooling towers are the fluidcooler objects.
search_criteria['equipment_type'] = 'Open Cooling Tower'

# @todo Standards replace this with a mechanism to store this
# data in the cooling tower object itself.
# For now, retrieve the fan type from the name
name = cooling_tower.name.get
fan_type = nil
if name.include?('Centrifugal')
  fan_type = 'Centrifugal'
elsif name.include?('Propeller or Axial')
  fan_type = 'Propeller or Axial'
end
unless fan_type.nil?
  search_criteria['fan_type'] = fan_type
end

# Limit on Centrifugal Fan
# Open Circuit Cooling Towers.
if fan_type == 'Centrifugal'
  gpm_limit = cooling_tower_apply_minimum_power_per_flow_gpm_limit(cooling_tower)
  if gpm_limit
    if design_water_flow_gpm >= gpm_limit
      fan_type = 'Propeller or Axial'
      search_criteria['fan_type'] = fan_type
      OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, the design flow rate of #{design_water_flow_gpm.round} gpm is higher than the limit of #{gpm_limit.round} gpm for open centrifugal towers.  This tower must meet the minimum performance of #{fan_type} instead.")
    end
  end
end

# Get the cooling tower properties
ct_props = model_find_object(heat_rejection, search_criteria)
unless ct_props
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, cannot find heat rejection properties, cannot apply standard efficiencies or curves.")
  return false
end

# Get cooling tower efficiency
min_gpm_per_hp = ct_props['minimum_performance']
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, design water flow = #{design_water_flow_gpm.round} gpm, minimum performance = #{min_gpm_per_hp} gpm/hp (nameplate).")

# Calculate the allowed fan brake horsepower
# per method used in PNNL prototype buildings.
# Assumes that the fan brake horsepower is 90%
# of the fan nameplate rated motor power.
fan_motor_nameplate_hp = design_water_flow_gpm / min_gpm_per_hp
fan_bhp = 0.9 * fan_motor_nameplate_hp

# Lookup the minimum motor efficiency
fan_motor_eff = 0.85
motors = standards_data['motors']

# Assuming all fan motors are 4-pole Enclosed
search_criteria = {
  'template' => template,
  'number_of_poles' => 4.0,
  'type' => 'Enclosed'
}

motor_properties = model_find_object(motors, search_criteria, fan_motor_nameplate_hp)
if motor_properties.nil?
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, could not find motor properties using search criteria: #{search_criteria}, motor_hp = #{fan_motor_nameplate_hp} hp.")
  return false
end

fan_motor_eff = motor_properties['nominal_full_load_efficiency']
nominal_hp = motor_properties['maximum_capacity'].to_f.round(1)
# Round to nearest whole HP for niceness
if nominal_hp >= 2
  nominal_hp = nominal_hp.round
end

# Calculate the fan motor power
fan_motor_actual_power_hp = fan_bhp / fan_motor_eff
# Convert to W
fan_motor_actual_power_w = fan_motor_actual_power_hp * 745.7 # 745.7 W/HP

OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, allowed fan motor nameplate hp = #{fan_motor_nameplate_hp.round(1)} hp, fan brake horsepower = #{fan_bhp.round ...
(more)
edit flag offensive delete link more

Comments

Thank you for your answer. May I ask you a very beginner question? Can OpenStudio automatically create an ASHRAE 90.1 compliant baseline model from a proposed model? My current energy simulation workflow is as follows:

  1. Create 3D models in Rhino.
  2. Assign geometry and HVACTemplate information to the 3D model in Grasshopper (Honeybee) and output the idf file.
  3. Edit the idf or idfexp file manually in IDFEditor as needed to complete the model.
  4. Run the simulation in EnergyPlus.

This is done separately for Baseline case and Proposal case... I want it to be more automated.

Keigo's avatar Keigo  ( 2021-08-06 23:31:06 -0500 )edit

HoneyBee can export .osm files, so you do not need to do edits in the IDF editor. If your models live within OpenStudio, yes, you can use the 'openstudio-standards' library to create 90.1 PRM baselines

Luis Lara's avatar Luis Lara  ( 2021-08-09 16:49:32 -0500 )edit

I'll try it. Thanks!

Keigo's avatar Keigo  ( 2021-08-09 20:14:10 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Careers

Question Tools

1 follower

Stats

Asked: 2021-08-03 00:20:32 -0500

Seen: 576 times

Last updated: Aug 09 '21