Source code for honeybee_openstudio.hvac.standards.cooling_tower
# coding=utf-8
"""Module taken from OpenStudio-standards.
https://github.com/NREL/openstudio-standards/blob/master/
lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb
"""
from __future__ import division
from ladybug.datatype.temperature import Temperature
from ladybug.datatype.temperaturedelta import TemperatureDelta
from honeybee_openstudio.openstudio import openstudio_model
TEMPERATURE = Temperature()
TEMP_DELTA = TemperatureDelta()
[docs]
def prototype_apply_condenser_water_temperatures(condenser_loop, design_wet_bulb_c=None):
"""Apply approach temperature sizing criteria to a condenser water loop.
Args:
condenser_loop: [<OpenStudio::Model::PlantLoop>] a condenser loop served
by a cooling tower.
design_wet_bulb_c: [Double] the outdoor design wetbulb conditions in
degrees Celsius
"""
sizing_plant = condenser_loop.sizingPlant()
loop_type = sizing_plant.loopType()
if loop_type != 'Condenser':
return None
# if values are absent, use the CTI rating condition 78F
if design_wet_bulb_c is None:
design_wet_bulb_c = TEMPERATURE.to_unit([78.0], 'C', 'F')[0]
# EnergyPlus has a minimum limit of 68F and maximum limit of 80F for cooling towers
design_wet_bulb_f = TEMPERATURE.to_unit([78.0], 'F', 'C')[0]
eplus_min_design_wet_bulb_f = 68.0
eplus_max_design_wet_bulb_f = 80.0
if design_wet_bulb_f < eplus_min_design_wet_bulb_f:
design_wet_bulb_f = eplus_min_design_wet_bulb_f
elif design_wet_bulb_f > eplus_max_design_wet_bulb_f:
design_wet_bulb_f = eplus_max_design_wet_bulb_f
design_wet_bulb_c = TEMPERATURE.to_unit([design_wet_bulb_f], 'C', 'F')[0]
# Determine the design CW temperature, approach, and range
leaving_cw_t_c, approach_k, range_k = \
prototype_condenser_water_temperatures(design_wet_bulb_c)
approach_r = TEMP_DELTA.to_unit([10.0], 'dF', 'dC')[0]
# Set Cooling Tower sizing parameters.
# Only the variable speed cooling tower in E+ allows you to set the design temperatures.
#
# Per the documentation
# for CoolingTowerSingleSpeed and CoolingTowerTwoSpeed
# E+ uses the following values during sizing:
# 95F entering water temp
# 95F OATdb
# 78F OATwb
# range = loop design delta-T aka range (specified above)
for sc in condenser_loop.supplyComponents():
if sc.to_CoolingTowerVariableSpeed().is_initialized():
ct = sc.to_CoolingTowerVariableSpeed().get()
ct.setDesignInletAirWetBulbTemperature(design_wet_bulb_c)
ct.setDesignApproachTemperature(approach_k)
ct.setDesignRangeTemperature(range_k)
# Set the CW sizing parameters
# EnergyPlus autosizing routine assumes 85F and 10F temperature difference
energyplus_design_loop_exit_temperature_c = TEMPERATURE.to_unit([85.0], 'C', 'F')[0]
sizing_plant.setDesignLoopExitTemperature(energyplus_design_loop_exit_temperature_c)
sizing_plant.setLoopDesignTemperatureDifference(TEMP_DELTA.to_unit([10.0], 'dC', 'dF')[0])
# Cooling Tower operational controls
# G3.1.3.11 - Tower shall be controlled to maintain a 70F LCnWT where weather permits,
# floating up to leaving water at design conditions.
float_down_to_c = TEMPERATURE.to_unit([70.0], 'C', 'F')[0]
# get or create a setpoint manager
cw_t_stpt_manager = None
for spm in condenser_loop.supplyOutletNode().setpointManagers():
if spm.to_SetpointManagerFollowOutdoorAirTemperature().is_initialized() and \
'Setpoint Manager Follow OATwb' in spm.nameString():
cw_t_stpt_manager = spm.to_SetpointManagerFollowOutdoorAirTemperature().get()
if cw_t_stpt_manager is None:
cw_t_stpt_manager = openstudio_model.SetpointManagerFollowOutdoorAirTemperature(
condenser_loop.model)
cw_t_stpt_manager.addToNode(condenser_loop.supplyOutletNode())
st_pt_name = '{} Setpoint Manager Follow OATwb with {}F Approach'.format(
condenser_loop.nameString(), round(approach_r, 1))
cw_t_stpt_manager.setName(st_pt_name)
cw_t_stpt_manager.setReferenceTemperatureType('OutdoorAirWetBulb')
# At low design OATwb, it is possible to calculate
# a maximum temperature below the minimum. In this case,
# make the maximum and minimum the same.
if leaving_cw_t_c < float_down_to_c:
leaving_cw_t_c = float_down_to_c
cw_t_stpt_manager.setMaximumSetpointTemperature(leaving_cw_t_c)
cw_t_stpt_manager.setMinimumSetpointTemperature(float_down_to_c)
cw_t_stpt_manager.setOffsetTemperatureDifference(approach_k)
return True
[docs]
def prototype_condenser_water_temperatures(design_oat_wb_c):
"""Determine the performance rating method specified design condenser properties.
Water temperature, approach, and range.
Args:
design_oat_wb_c: [Double] the design OA wetbulb temperature (C).
"""
design_oat_wb_f = TEMPERATURE.to_unit([design_oat_wb_c], 'F', 'C')[0]
# 90.1-2010 G3.1.3.11 - CW supply temp = 85F or 10F approaching design wet bulb temp.
# Design range = 10F
# Design Temperature rise of 10F => Range: 10F
range_r = 10.0
# Determine the leaving CW temp
max_leaving_cw_t_f = 85.0
leaving_cw_t_10f_approach_f = design_oat_wb_f + 10.0
leaving_cw_t_f = min([max_leaving_cw_t_f, leaving_cw_t_10f_approach_f])
# Calculate the approach
approach_r = leaving_cw_t_f - design_oat_wb_f
# Convert to SI units
leaving_cw_t_c = TEMPERATURE.to_unit([leaving_cw_t_f], 'C', 'F')[0]
approach_k = TEMP_DELTA.to_unit([approach_r], 'dC', 'dF')[0]
range_k = TEMP_DELTA.to_unit([range_r], 'dC', 'dF')[0]
return leaving_cw_t_c, approach_k, range_k