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

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

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

Keigo gravatar image

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

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

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
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{} design water flow rate is not available, cannot apply efficiency standard.")
  return false
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 =
fan_type = nil
if name.include?('Centrifugal')
  fan_type = 'Centrifugal'
elsif name.include?('Propeller or Axial')
  fan_type = 'Propeller or Axial'
unless fan_type.nil?
  search_criteria['fan_type'] = fan_type

# 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 #{}, 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.")

# 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 #{}, cannot find heat rejection properties, cannot apply standard efficiencies or curves.")
  return false

# Get cooling tower efficiency
min_gpm_per_hp = ct_props['minimum_performance']
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{}, 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 #{}, could not find motor properties using search criteria: #{search_criteria}, motor_hp = #{fan_motor_nameplate_hp} hp.")
  return false

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

# 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 #{}, allowed fan motor nameplate hp = #{fan_motor_nameplate_hp.round(1)} hp, fan brake horsepower = #{fan_bhp.round ...
edit flag offensive delete link more


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 gravatar image Keigo  ( 2021-08-06 23:31:06 -0600 )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 gravatar image Luis Lara  ( 2021-08-09 16:49:32 -0600 )edit

I'll try it. Thanks!

Keigo gravatar image Keigo  ( 2021-08-09 20:14:10 -0600 )edit

Your Answer

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

Add Answer

Training Workshops

Question Tools

1 follower


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

Seen: 201 times

Last updated: Aug 09 '21