Module: ASHRAEPRMCoolingTower

Included in:
ASHRAE901PRM
Defined in:
lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb

Overview

A variety of cooling tower methods that are the same regardless of type. These methods are available to CoolingTowerSingleSpeed, CoolingTowerTwoSpeed, and CoolingTowerVariableSpeed

CoolingTower collapse

Instance Method Details

#cooling_tower_apply_minimum_power_per_flow(cooling_tower) ⇒ Bool

Set the cooling tower fan power such that the tower hits the minimum performance (gpm/hp) specified by the standard. Note that in this case hp is motor nameplate hp, per 90.1. This method assumes that the fan brake horsepower is 90% of the motor nameplate hp. This method determines the minimum motor efficiency for the nameplate motor hp and sets the actual fan power by multiplying the brake horsepower by the efficiency. Thus the fan power used as an input to the simulation divided by the design flow rate will not (and should not) exactly equal the minimum tower performance.



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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb', line 22

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'

  # Define the criteria to find the fan type
  search_criteria['fan_type'] = 'Axial'

  # 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' => 'Any',
    'type' => 'Any'
  }

  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(1)}, and fan motor actual power = #{fan_motor_actual_power_hp.round(1)} hp (#{fan_motor_actual_power_w.round} W) at #{fan_motor_eff} motor efficiency.")

  # Append the efficiency to the name
  cooling_tower.setName("#{cooling_tower.name} #{min_gpm_per_hp.round(1)} gpm/hp")

  # Hard size the design fan power.
  # Leave the water flow and air flow autosized.
  if cooling_tower.to_CoolingTowerVariableSpeed.is_initialized
    cooling_tower.setDesignFanPower(fan_motor_actual_power_w)
  end

  return true
end