openstudio-model-articulation 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/Rakefile +20 -1
  4. data/lib/measures/AssignConstructionSetToBuilding/measure.rb +2 -0
  5. data/lib/measures/AssignSpaceTypeBySpaceName/measure.rb +2 -0
  6. data/lib/measures/AssignSpaceTypeToBuilding/measure.rb +2 -0
  7. data/lib/measures/AssignSpacesToStories/measure.rb +2 -0
  8. data/lib/measures/BarAspectRatioSlicedBySpaceType/measure.rb +2 -0
  9. data/lib/measures/BarAspectRatioSlicedBySpaceType/measure.xml +0 -6
  10. data/lib/measures/BarAspectRatioSlicedBySpaceType/resources/os_lib_cofee.rb +2 -0
  11. data/lib/measures/BarAspectRatioStudy/measure.rb +2 -0
  12. data/lib/measures/CleanupSpaceOrigins/measure.rb +2 -0
  13. data/lib/measures/FindAndReplaceObjectNames/measure.rb +2 -0
  14. data/lib/measures/InjectOsmGeometryIntoAnExternalIdf/measure.rb +2 -0
  15. data/lib/measures/InjectOsmGeometryIntoAnExternalIdf/measure.xml +9 -9
  16. data/lib/measures/RemoveHardAssignedConstructions/measure.rb +2 -0
  17. data/lib/measures/RenameSpaceSurfacesBasedonParentSpaceandOrientation/measure.rb +2 -0
  18. data/lib/measures/RotateBuilding/measure.rb +2 -0
  19. data/lib/measures/SetExtWallToGroundBoundaryConditionByStory/measure.rb +2 -0
  20. data/lib/measures/SetInteriorWallsAndFloorsToAdiabatic/measure.rb +2 -0
  21. data/lib/measures/SetInteriorWallsToSelectedConstruction/measure.rb +2 -0
  22. data/lib/measures/SetWindowToWallRatioByFacade/measure.rb +21 -31
  23. data/lib/measures/SetWindowToWallRatioByFacade/measure.xml +4 -4
  24. data/lib/measures/SimplifyGeometryToSlicedBar/measure.rb +2 -0
  25. data/lib/measures/SimplifyGeometryToSlicedBar/resources/os_lib_cofee.rb +2 -0
  26. data/lib/measures/SimplifyGeometryToSlicedBar/resources/os_lib_geometry.rb +2 -0
  27. data/lib/measures/SimplifyGeometryToSlicedBar/resources/os_lib_helper_methods.rb +3 -1
  28. data/lib/measures/SpaceTypeAndConstructionSetWizard/measure.rb +2 -0
  29. data/lib/measures/SpaceTypeAndConstructionSetWizard/measure.xml +1 -1
  30. data/lib/measures/SurfaceMatching/measure.rb +2 -0
  31. data/lib/measures/blended_space_type_from_floor_area_ratios/measure.rb +2 -0
  32. data/lib/measures/blended_space_type_from_model/measure.rb +2 -0
  33. data/lib/measures/blended_space_type_from_model/resources/os_lib_model_simplification.rb +2 -0
  34. data/lib/measures/clone_building_from_external_model/measure.rb +2 -0
  35. data/lib/measures/clone_building_from_external_model/measure.xml +4 -4
  36. data/lib/measures/create_DOE_prototype_building/measure.rb +8 -1
  37. data/lib/measures/create_DOE_prototype_building/measure.xml +2 -2
  38. data/lib/measures/create_and_assign_thermal_zones_for_unassigned_spaces/measure.rb +2 -0
  39. data/lib/measures/create_bar_from_building_type_ratios/measure.rb +3 -1
  40. data/lib/measures/create_bar_from_deer_building_type_ratios/measure.rb +2 -0
  41. data/lib/measures/create_bar_from_doe_building_type_ratios/measure.rb +2 -0
  42. data/lib/measures/create_bar_from_model/measure.rb +2 -0
  43. data/lib/measures/create_baseline_building/measure.rb +3 -1
  44. data/lib/measures/create_baseline_building/measure.xml +2 -2
  45. data/lib/measures/create_deer_prototype_building/measure.rb +2 -0
  46. data/lib/measures/create_deer_prototype_building/measure.xml +2 -2
  47. data/lib/measures/create_deer_prototype_building/resources/deer_building_types.rb +2 -0
  48. data/lib/measures/create_parametric_schedules/measure.rb +2 -0
  49. data/lib/measures/create_typical_building_from_model/measure.rb +2 -0
  50. data/lib/measures/create_typical_building_from_model/measure.xml +11 -11
  51. data/lib/measures/create_typical_building_from_model/resources/Model.hvac.rb +3 -1
  52. data/lib/measures/create_typical_deer_building_from_model/measure.rb +2 -0
  53. data/lib/measures/create_typical_deer_building_from_model/measure.xml +11 -11
  54. data/lib/measures/create_typical_deer_building_from_model/resources/Model.hvac.rb +3 -1
  55. data/lib/measures/create_typical_doe_building_from_model/measure.rb +2 -0
  56. data/lib/measures/create_typical_doe_building_from_model/measure.xml +19 -19
  57. data/lib/measures/create_typical_doe_building_from_model/resources/Model.hvac.rb +3 -1
  58. data/lib/measures/deer_space_type_and_construction_set_wizard/measure.rb +2 -0
  59. data/lib/measures/find_and_replace_in_all_thermal_zone_names/measure.rb +2 -0
  60. data/lib/measures/make_shading_surfaces_based_on_zone_multipliers/measure.rb +2 -0
  61. data/lib/measures/merge_floorspace_js_with_model/measure.rb +2 -0
  62. data/lib/measures/merge_floorspace_js_with_model/measure.xml +9 -15
  63. data/lib/measures/merge_spaces_from_external_file/measure.rb +2 -0
  64. data/lib/measures/merge_spaces_from_external_file/measure.xml +4 -4
  65. data/lib/measures/merge_spaces_from_external_file/resources/ScheduleTranslator.rb +6 -4
  66. data/lib/measures/radiance_measure/measure.rb +2 -0
  67. data/lib/measures/radiance_measure/measure.xml +9 -9
  68. data/lib/measures/radiant_slab_with_doas/LICENSE.md +27 -0
  69. data/lib/measures/radiant_slab_with_doas/README.md +156 -0
  70. data/lib/measures/radiant_slab_with_doas/README.md.erb +42 -0
  71. data/lib/measures/radiant_slab_with_doas/measure.rb +406 -0
  72. data/lib/measures/radiant_slab_with_doas/measure.xml +346 -0
  73. data/lib/measures/replace_geometry_by_story/measure.rb +2 -0
  74. data/lib/measures/scale_geometry/measure.rb +2 -0
  75. data/lib/openstudio/model_articulation/version.rb +1 -1
  76. metadata +12 -8
  77. data/lib/measures/merge_floorspace_js_with_model/docs/.gitkeep +0 -0
@@ -0,0 +1,406 @@
1
+ # frozen_string_literal: true
2
+
3
+ # *******************************************************************************
4
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
5
+ # All rights reserved.
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # (1) Redistributions of source code must retain the above copyright notice,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # (3) Neither the name of the copyright holder nor the names of any contributors
17
+ # may be used to endorse or promote products derived from this software without
18
+ # specific prior written permission from the respective party.
19
+ #
20
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
21
+ # of modifications or other derivative works may not use the "OpenStudio"
22
+ # trademark, "OS", "os", or any other confusingly similar designation without
23
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
24
+ #
25
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
26
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
29
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
30
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
32
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+ # *******************************************************************************
37
+
38
+ require 'openstudio-standards'
39
+
40
+ # start the measure
41
+ class RadiantSlabWithDoas < OpenStudio::Measure::ModelMeasure
42
+ # human readable name
43
+ def name
44
+ # Measure name should be the title case of the class name.
45
+ return 'Radiant Slab with DOAS'
46
+ end
47
+
48
+ # human readable description
49
+ def description
50
+ return 'Adds a radiant slab with DOAS ventilation system to the model.'
51
+ end
52
+
53
+ # human readable description of modeling approach
54
+ def modeler_description
55
+ return 'This measure adds either a radiant floor slab or radiant ceiling slab with dedicated outdoor air system to conditioned zones in the model.
56
+ Radiant systems are comfortable with wider zone air temperature range. Use the CBE Thermal Comfort Tool or other method to set thermostat setpoint temperatures.
57
+ This measure optionally removes existing HVAC systems (recommended).
58
+ This measure is dependent on an ASHRAE climate zone to set insulation and design supply temperature levels, so make sure this is set in the site parameters of the model.
59
+ Plant equipment options are an Air Source Heat Pump or a Boiler for hot water, and an Air Cooled Chiller or Water Cooled Chiller for chilled water.
60
+ The Air Source Heat Pump object uses a user-defined plant component in EnergyPlus and may not be compatible with several reporting measures, including the *Enable Detailed Output for Each Node in a Loop* measure.
61
+ If Water Cooled Chiller is selected, the measure will add a condenser loop with a variable speed cooling tower, and optionally enable water-side economizing when wet bulb conditions allow.
62
+ By default, the slab system does not include carpet. Carpet greatly reduces the heat transfer capacity of the radiant system. If carpet is preferred, a ceiling-type slab and no lockout are recommended to avoid unmet hours.
63
+ The measure includes several control parameters for radiant system operation. Use the defaults unless you have strong reasons to deviate from them.
64
+ This measure runs a sizing run to set equipment efficiency values, so it may take up to a few minutes to run.
65
+ This measure adds many EnergyManagementSystem objects to the model. **DO NOT** change design days after running this measure. Adding additional HVAC measures after applying this measure may break the model.
66
+ Radiant systems are particularly limited in cooling capacity and the model may have many unmet hours as a result.
67
+ To reduce unmet hours, use an expanded comfort range as mentioned above, remove carpet, reduce internal loads, reduce solar and envelope gains during peak times, or disable the lockout.'
68
+ end
69
+
70
+ # define the arguments that the user will input
71
+ def arguments(model)
72
+ args = OpenStudio::Measure::OSArgumentVector.new
73
+
74
+ # make bool argument to remove existing HVAC system
75
+ remove_existing_hvac = OpenStudio::Measure::OSArgument.makeBoolArgument('remove_existing_hvac', true)
76
+ remove_existing_hvac.setDisplayName('Remove existing HVAC system (keeps service water heating and zone exhaust fans)')
77
+ remove_existing_hvac.setDefaultValue(true)
78
+ args << remove_existing_hvac
79
+
80
+ # make an argument for heating plant type
81
+ heating_plant_types = OpenStudio::StringVector.new
82
+ heating_plant_types << 'Air Source Heat Pump'
83
+ heating_plant_types << 'Boiler'
84
+ heating_plant_type = OpenStudio::Measure::OSArgument.makeChoiceArgument('heating_plant_type', heating_plant_types, true)
85
+ heating_plant_type.setDisplayName('Heating Plant Type')
86
+ heating_plant_type.setDefaultValue('Air Source Heat Pump')
87
+ args << heating_plant_type
88
+
89
+ # make an argument for cooling plant type
90
+ cooling_plant_types = OpenStudio::StringVector.new
91
+ cooling_plant_types << 'Air Cooled Chiller'
92
+ cooling_plant_types << 'Water Cooled Chiller'
93
+ cooling_plant_type = OpenStudio::Measure::OSArgument.makeChoiceArgument('cooling_plant_type', cooling_plant_types, true)
94
+ cooling_plant_type.setDisplayName('Cooling Plant Type')
95
+ cooling_plant_type.setDefaultValue('Air Cooled Chiller')
96
+ args << cooling_plant_type
97
+
98
+ # make string argument for water-side economizing if water-cooled chiller
99
+ economizer_types = OpenStudio::StringVector.new
100
+ economizer_types << 'none'
101
+ economizer_types << 'integrated'
102
+ economizer_types << 'non-integrated'
103
+ waterside_economizer = OpenStudio::Measure::OSArgument.makeChoiceArgument('waterside_economizer', economizer_types, true)
104
+ waterside_economizer.setDisplayName('Water-side economizer (water cooled chiller only)')
105
+ waterside_economizer.setDefaultValue('none')
106
+ args << waterside_economizer
107
+
108
+ # make an argument for radiant system type
109
+ radiant_types = OpenStudio::StringVector.new
110
+ radiant_types << 'floor'
111
+ radiant_types << 'ceiling'
112
+ radiant_type = OpenStudio::Measure::OSArgument.makeChoiceArgument('radiant_type', radiant_types, true)
113
+ radiant_type.setDisplayName('Radiant System Type')
114
+ radiant_type.setDefaultValue('floor')
115
+ args << radiant_type
116
+
117
+ # make and argument for adding carpet
118
+ include_carpet = OpenStudio::Measure::OSArgument.makeBoolArgument('include_carpet', true)
119
+ include_carpet.setDisplayName('Include carpet over the radiant slab')
120
+ include_carpet.setDescription('Only applicable in radiant floor systems. This will greatly reduce system effectiveness and controllability.')
121
+ include_carpet.setDefaultValue(false)
122
+ args << include_carpet
123
+
124
+ # make an argument for control strategy
125
+ control_strategys = OpenStudio::StringVector.new
126
+ control_strategys << 'proportional_control'
127
+ control_strategy = OpenStudio::Measure::OSArgument.makeChoiceArgument('control_strategy', control_strategys, true)
128
+ control_strategy.setDisplayName('Control Strategy')
129
+ control_strategy.setDefaultValue('proportional_control')
130
+ args << control_strategy
131
+
132
+ # make an argument for proportional gain
133
+ proportional_gain = OpenStudio::Measure::OSArgument.makeDoubleArgument('proportional_gain', true)
134
+ proportional_gain.setDisplayName('Proportional Gain')
135
+ proportional_gain.setDefaultValue(0.3)
136
+ args << proportional_gain
137
+
138
+ # make an argument for minimum operating hours
139
+ minimum_operation = OpenStudio::Measure::OSArgument.makeDoubleArgument('minimum_operation', true)
140
+ minimum_operation.setDisplayName('Minimum Operating Hours')
141
+ minimum_operation.setDescription('Fractional Hours Allowed, e.g. 30 min = 0.5')
142
+ minimum_operation.setDefaultValue(1.0)
143
+ args << minimum_operation
144
+
145
+ # make an argument for switch over time
146
+ switch_over_time = OpenStudio::Measure::OSArgument.makeDoubleArgument('switch_over_time', true)
147
+ switch_over_time.setDisplayName('Switch Over Time')
148
+ switch_over_time.setDescription('Minimum time limitation for when the system can switch between heating and cooling. Fractional hours allowed, e.g. 30 min = 0.5.')
149
+ switch_over_time.setDefaultValue(24.0)
150
+ args << switch_over_time
151
+
152
+ # make and argument for including radiant lockout
153
+ radiant_lockout = OpenStudio::Measure::OSArgument.makeBoolArgument('radiant_lockout', true)
154
+ radiant_lockout.setDisplayName('Enable radiant lockout')
155
+ radiant_lockout.setDescription('Lockout the radiant system to avoid operating during peak hours.')
156
+ radiant_lockout.setDefaultValue(false)
157
+ args << radiant_lockout
158
+
159
+ # make an argument for lockout start time
160
+ lockout_start_time = OpenStudio::Measure::OSArgument.makeDoubleArgument('lockout_start_time', true)
161
+ lockout_start_time.setDisplayName('Lockout Start Time')
162
+ lockout_start_time.setDescription('Decimal hour of when radiant lockout starts. Fractional hours allowed, e.g. 30 min = 0.5.')
163
+ lockout_start_time.setDefaultValue(12.0)
164
+ args << lockout_start_time
165
+
166
+ # make an argument for lockout end time
167
+ lockout_end_time = OpenStudio::Measure::OSArgument.makeDoubleArgument('lockout_end_time', true)
168
+ lockout_end_time.setDisplayName('Lockout End Time')
169
+ lockout_end_time.setDescription('Decimal hour of when radiant lockout ends. Fractional hours allowed, e.g. 30 min = 0.5.')
170
+ lockout_end_time.setDefaultValue(20.0)
171
+ args << lockout_end_time
172
+
173
+ # make and argument for output variables
174
+ add_output_variables = OpenStudio::Measure::OSArgument.makeBoolArgument('add_output_variables', true)
175
+ add_output_variables.setDisplayName('Add output variables for radiant system')
176
+ add_output_variables.setDefaultValue(true)
177
+ args << add_output_variables
178
+
179
+ # make an argument for standards template
180
+ standards_templates = OpenStudio::StringVector.new
181
+ standards_templates << '90.1-2013'
182
+ standards_templates << 'DEER 2017'
183
+ standards_templates << 'DEER 2020'
184
+ standards_template = OpenStudio::Measure::OSArgument.makeChoiceArgument('standards_template', standards_templates, true)
185
+ standards_template.setDisplayName('Standards Template')
186
+ standards_template.setDescription('Standards template to use for HVAC equipment efficiencies and controls.')
187
+ standards_template.setDefaultValue('90.1-2013')
188
+ args << standards_template
189
+
190
+ return args
191
+ end
192
+
193
+ # define what happens when the measure is run
194
+ def run(model, runner, user_arguments)
195
+ super(model, runner, user_arguments)
196
+
197
+ # use the built-in error checking
198
+ if !runner.validateUserArguments(arguments(model), user_arguments)
199
+ return false
200
+ end
201
+
202
+ # assign user inputs
203
+ remove_existing_hvac = runner.getBoolArgumentValue('remove_existing_hvac', user_arguments)
204
+ heating_plant_type = runner.getStringArgumentValue('heating_plant_type', user_arguments)
205
+ cooling_plant_type = runner.getStringArgumentValue('cooling_plant_type', user_arguments)
206
+ waterside_economizer = runner.getStringArgumentValue('waterside_economizer', user_arguments)
207
+ radiant_type = runner.getStringArgumentValue('radiant_type', user_arguments)
208
+ include_carpet = runner.getBoolArgumentValue('include_carpet', user_arguments)
209
+ control_strategy = runner.getStringArgumentValue('control_strategy', user_arguments)
210
+ proportional_gain = runner.getDoubleArgumentValue('proportional_gain', user_arguments)
211
+ minimum_operation = runner.getDoubleArgumentValue('minimum_operation', user_arguments)
212
+ switch_over_time = runner.getDoubleArgumentValue('switch_over_time', user_arguments)
213
+ radiant_lockout = runner.getBoolArgumentValue('radiant_lockout', user_arguments)
214
+ lockout_start_time = runner.getDoubleArgumentValue('lockout_start_time', user_arguments)
215
+ lockout_end_time = runner.getDoubleArgumentValue('lockout_end_time', user_arguments)
216
+ add_output_variables = runner.getBoolArgumentValue('add_output_variables', user_arguments)
217
+ standards_template = runner.getStringArgumentValue('standards_template', user_arguments)
218
+
219
+ # standard to access methods in openstudio-standards
220
+ std = Standard.build(standards_template)
221
+
222
+ # remove existing hvac systems
223
+ if remove_existing_hvac
224
+ runner.registerInfo('Removing existing HVAC systems from the model')
225
+ std.remove_HVAC(model)
226
+ end
227
+
228
+ # exclude plenum zones, zones without thermostats, and zones with no floor area
229
+ conditioned_zones = []
230
+ model.getThermalZones.each do |zone|
231
+ next if std.thermal_zone_plenum?(zone)
232
+ next if !std.thermal_zone_heated?(zone) && !std.thermal_zone_cooled?(zone)
233
+ conditioned_zones << zone
234
+ end
235
+
236
+ # make sure the model has conditioned zones
237
+ if conditioned_zones.empty?
238
+ runner.registerAsNotApplicable('No conditioned zones identified in model. Make sure thermostats are assigned to zones.')
239
+ return false
240
+ end
241
+
242
+ # get the climate zone
243
+ climate_zone_obj = model.getClimateZones.getClimateZone('ASHRAE', 2006)
244
+ if climate_zone_obj.empty
245
+ climate_zone_obj = model.getClimateZones.getClimateZone('ASHRAE', 2013)
246
+ end
247
+
248
+ if climate_zone_obj.empty || climate_zone_obj.value == ''
249
+ runner.registerError('Please assign an ASHRAE climate zone to the model before running the measure.')
250
+ return false
251
+ else
252
+ climate_zone = climate_zone_obj.value
253
+ end
254
+
255
+ # get the radiant hot water temperature based on the climate zone
256
+ case climate_zone
257
+ when '1'
258
+ radiant_htg_dsgn_sup_wtr_temp_f = 90.0
259
+ when '2', '2A', '2B', 'CEC15'
260
+ radiant_htg_dsgn_sup_wtr_temp_f = 100.0
261
+ when '3', '3A', '3B', '3C', 'CEC3', 'CEC4', 'CEC5', 'CEC6', 'CEC7', 'CEC8', 'CEC9', 'CEC10', 'CEC11', 'CEC12', 'CEC13', 'CEC14'
262
+ radiant_htg_dsgn_sup_wtr_temp_f = 100.0
263
+ when '4', '4A', '4B', '4C', 'CEC1', 'CEC2'
264
+ radiant_htg_dsgn_sup_wtr_temp_f = 100.0
265
+ when '5', '5A', '5B', '5C', 'CEC16'
266
+ radiant_htg_dsgn_sup_wtr_temp_f = 110.0
267
+ when '6', '6A', '6B'
268
+ radiant_htg_dsgn_sup_wtr_temp_f = 120.0
269
+ when '7', '8'
270
+ radiant_htg_dsgn_sup_wtr_temp_f = 120.0
271
+ else # default to 4
272
+ radiant_htg_dsgn_sup_wtr_temp_f = 100.0
273
+ end
274
+ runner.registerInitialCondition("This measure will add radiant systems to #{conditioned_zones.size} conditioned zones with a hot water loop served by a #{heating_plant_type} and chilled water loop served by a #{cooling_plant_type}.")
275
+ runner.registerInfo("Based on model climate zone #{climate_zone}, using #{radiant_htg_dsgn_sup_wtr_temp_f}F heating supply water temperature.")
276
+
277
+ # establish hot water and chilled water loops
278
+ case heating_plant_type
279
+ when 'Air Source Heat Pump'
280
+ boiler_fuel_type = 'ASHP'
281
+ when 'Boiler'
282
+ boiler_fuel_type = 'NaturalGas'
283
+ end
284
+ hot_water_loop = std.model_add_hw_loop(model, boiler_fuel_type, dsgn_sup_wtr_temp: radiant_htg_dsgn_sup_wtr_temp_f, dsgn_sup_wtr_temp_delt: 10.0)
285
+
286
+ case cooling_plant_type
287
+ when 'Air Cooled Chiller'
288
+ # make chilled water loop
289
+ chilled_water_loop = std.model_add_chw_loop(model,
290
+ chw_pumping_type: 'const_pri_var_sec',
291
+ dsgn_sup_wtr_temp: 55.0,
292
+ dsgn_sup_wtr_temp_delt: 5.0,
293
+ chiller_cooling_type: 'AirCooled')
294
+ when 'Water Cooled Chiller'
295
+ # make condenser water loop
296
+ fan_type = std.model_cw_loop_cooling_tower_fan_type(model)
297
+ condenser_water_loop = std.model_add_cw_loop(model,
298
+ cooling_tower_type: 'Open Cooling Tower',
299
+ cooling_tower_fan_type: 'Propeller or Axial',
300
+ cooling_tower_capacity_control: fan_type,
301
+ number_of_cells_per_tower: 1,
302
+ number_cooling_towers: 1)
303
+ # make chilled water loop
304
+ chilled_water_loop = std.model_add_chw_loop(model,
305
+ chw_pumping_type: 'const_pri_var_sec',
306
+ dsgn_sup_wtr_temp: 55.0,
307
+ dsgn_sup_wtr_temp_delt: 5.0,
308
+ chiller_cooling_type: 'WaterCooled',
309
+ condenser_water_loop: condenser_water_loop,
310
+ waterside_economizer: waterside_economizer)
311
+ end
312
+
313
+ # add radiant system to conditioned zones
314
+ radiant_loops = std.model_add_low_temp_radiant(model, conditioned_zones, hot_water_loop, chilled_water_loop,
315
+ radiant_type: radiant_type,
316
+ include_carpet: include_carpet,
317
+ control_strategy: control_strategy,
318
+ proportional_gain: proportional_gain,
319
+ minimum_operation: minimum_operation,
320
+ switch_over_time: switch_over_time,
321
+ radiant_lockout: radiant_lockout,
322
+ radiant_lockout_start_time: lockout_start_time,
323
+ radiant_lockout_end_time: lockout_end_time)
324
+
325
+ # add DOAS system to conditioned zones
326
+ std.model_add_doas(model, conditioned_zones)
327
+ std.rename_air_loop_nodes(model)
328
+
329
+ # set the heating and cooling sizing parameters
330
+ std.model_apply_prm_sizing_parameters(model)
331
+
332
+ runner.registerInfo("Adjusting HVAC equipment efficiencies and controls to follow template #{standards_template}.")
333
+
334
+ # perform a sizing run
335
+ if std.model_run_sizing_run(model, "#{Dir.pwd}/radiant_sizing_run") == false
336
+ runner.registerError('Sizing run failed. See errors in sizing run directory of this measure')
337
+ return false
338
+ end
339
+
340
+ # Apply the HVAC efficiency standard
341
+ building_data = std.model_get_building_climate_zone_and_building_type(model)
342
+ std.model_apply_hvac_efficiency_standard(model, building_data['climate_zone'])
343
+
344
+ # add output variables
345
+ vars = []
346
+ if add_output_variables
347
+ # site outdoor drybulb temperature
348
+ vars << OpenStudio::Model::OutputVariable.new('Site Outdoor Air Drybulb Temperature', model)
349
+
350
+ # zone hvac low temperature radiant system object variables
351
+ vars << OpenStudio::Model::OutputVariable.new('Zone Radiant HVAC Cooling Energy', model)
352
+ vars << OpenStudio::Model::OutputVariable.new('Zone Radiant HVAC Heating Energy', model)
353
+ vars << OpenStudio::Model::OutputVariable.new('Zone Radiant HVAC Inlet Temperature', model)
354
+ vars << OpenStudio::Model::OutputVariable.new('Zone Radiant HVAC Outlet Temperature', model)
355
+ vars << OpenStudio::Model::OutputVariable.new('Zone Radiant HVAC Mass Flow Rate', model)
356
+
357
+ # plant loop variables
358
+ var = OpenStudio::Model::OutputVariable.new('System Node Mass Flow Rate', model)
359
+ var.setKeyValue('Chilled Water Loop Supply Outlet Node')
360
+ vars << var
361
+ var = OpenStudio::Model::OutputVariable.new('System Node Mass Flow Rate', model)
362
+ var.setKeyValue('Hot Water Loop Supply Outlet Node')
363
+ vars << var
364
+ var = OpenStudio::Model::OutputVariable.new('System Node Temperature', model)
365
+ var.setKeyValue('Chilled Water Loop Supply Outlet Node')
366
+ vars << var
367
+ var = OpenStudio::Model::OutputVariable.new('System Node Temperature', model)
368
+ var.setKeyValue('Hot Water Loop Supply Outlet Node')
369
+ vars << var
370
+ var = OpenStudio::Model::OutputVariable.new('System Node Setpoint Temperature', model)
371
+ var.setKeyValue('Chilled Water Loop Supply Outlet Node')
372
+ vars << var
373
+ var = OpenStudio::Model::OutputVariable.new('System Node Setpoint Temperature', model)
374
+ var.setKeyValue('Hot Water Loop Supply Outlet Node')
375
+ vars << var
376
+
377
+ conditioned_space_names = []
378
+ conditioned_zones.each do |zone|
379
+ zone.spaces.each { |space| conditioned_space_names << space.name }
380
+ end
381
+
382
+ # radiant surface temperatures
383
+ model.getSurfaces.each do |surface|
384
+ next if radiant_type == 'floor' && surface.surfaceType != 'Floor'
385
+ next if radiant_type == 'ceiling' && surface.surfaceType != 'RoofCeiling'
386
+ next unless surface.space.is_initialized
387
+ surface_space_name = surface.space.get.name.to_s
388
+ next unless conditioned_space_names.include? surface_space_name
389
+ var = OpenStudio::Model::OutputVariable.new('Surface Inside Face Temperature', model)
390
+ var.setKeyValue(surface.name.to_s)
391
+ vars << var
392
+ end
393
+
394
+ # set to timestep
395
+ vars.each { |var| var.setReportingFrequency('Timestep') }
396
+ end
397
+
398
+ # runner register final condition
399
+ runner.registerFinalCondition("This measure created #{model.getZoneHVACLowTempRadiantVarFlows.size} radiant #{radiant_type} objects.")
400
+
401
+ return true
402
+ end
403
+ end
404
+
405
+ # register the measure to be used by the application
406
+ RadiantSlabWithDoas.new.registerWithApplication
@@ -0,0 +1,346 @@
1
+ <?xml version="1.0"?>
2
+ <measure>
3
+ <schema_version>3.0</schema_version>
4
+ <name>radiant_slab_with_doas</name>
5
+ <uid>8091a0c3-7760-4da6-adf4-133d55872816</uid>
6
+ <version_id>b419f950-9f34-4477-bd99-6665edaa0d6b</version_id>
7
+ <version_modified>20201009T203050Z</version_modified>
8
+ <xml_checksum>C49A7DAB</xml_checksum>
9
+ <class_name>RadiantSlabWithDoas</class_name>
10
+ <display_name>Radiant Slab with DOAS</display_name>
11
+ <description>Adds a radiant slab with DOAS ventilation system to the model.</description>
12
+ <modeler_description>This measure adds either a radiant floor slab or radiant ceiling slab with dedicated outdoor air system to conditioned zones in the model.
13
+ Radiant systems are comfortable with wider zone air temperature range. Use the CBE Thermal Comfort Tool or other method to set thermostat setpoint temperatures.
14
+ This measure optionally removes existing HVAC systems (recommended).
15
+ This measure is dependent on an ASHRAE climate zone to set insulation and design supply temperature levels, so make sure this is set in the site parameters of the model.
16
+ Plant equipment options are an Air Source Heat Pump or a Boiler for hot water, and an Air Cooled Chiller or Water Cooled Chiller for chilled water.
17
+ The Air Source Heat Pump object uses a user-defined plant component in EnergyPlus and may not be compatible with several reporting measures, including the *Enable Detailed Output for Each Node in a Loop* measure.
18
+ If Water Cooled Chiller is selected, the measure will add a condenser loop with a variable speed cooling tower, and optionally enable water-side economizing when wet bulb conditions allow.
19
+ By default, the slab system does not include carpet. Carpet greatly reduces the heat transfer capacity of the radiant system. If carpet is preferred, a ceiling-type slab and no lockout are recommended to avoid unmet hours.
20
+ The measure includes several control parameters for radiant system operation. Use the defaults unless you have strong reasons to deviate from them.
21
+ This measure runs a sizing run to set equipment efficiency values, so it may take up to a few minutes to run.
22
+ This measure adds many EnergyManagementSystem objects to the model. **DO NOT** change design days after running this measure. Adding additional HVAC measures after applying this measure may break the model.
23
+ Radiant systems are particularly limited in cooling capacity and the model may have many unmet hours as a result.
24
+ To reduce unmet hours, use an expanded comfort range as mentioned above, remove carpet, reduce internal loads, reduce solar and envelope gains during peak times, or disable the lockout.</modeler_description>
25
+ <arguments>
26
+ <argument>
27
+ <name>remove_existing_hvac</name>
28
+ <display_name>Remove existing HVAC system (keeps service water heating and zone exhaust fans)</display_name>
29
+ <type>Boolean</type>
30
+ <required>true</required>
31
+ <model_dependent>false</model_dependent>
32
+ <default_value>true</default_value>
33
+ <choices>
34
+ <choice>
35
+ <value>true</value>
36
+ <display_name>true</display_name>
37
+ </choice>
38
+ <choice>
39
+ <value>false</value>
40
+ <display_name>false</display_name>
41
+ </choice>
42
+ </choices>
43
+ </argument>
44
+ <argument>
45
+ <name>heating_plant_type</name>
46
+ <display_name>Heating Plant Type</display_name>
47
+ <type>Choice</type>
48
+ <required>true</required>
49
+ <model_dependent>false</model_dependent>
50
+ <default_value>Air Source Heat Pump</default_value>
51
+ <choices>
52
+ <choice>
53
+ <value>Air Source Heat Pump</value>
54
+ <display_name>Air Source Heat Pump</display_name>
55
+ </choice>
56
+ <choice>
57
+ <value>Boiler</value>
58
+ <display_name>Boiler</display_name>
59
+ </choice>
60
+ </choices>
61
+ </argument>
62
+ <argument>
63
+ <name>cooling_plant_type</name>
64
+ <display_name>Cooling Plant Type</display_name>
65
+ <type>Choice</type>
66
+ <required>true</required>
67
+ <model_dependent>false</model_dependent>
68
+ <default_value>Air Cooled Chiller</default_value>
69
+ <choices>
70
+ <choice>
71
+ <value>Air Cooled Chiller</value>
72
+ <display_name>Air Cooled Chiller</display_name>
73
+ </choice>
74
+ <choice>
75
+ <value>Water Cooled Chiller</value>
76
+ <display_name>Water Cooled Chiller</display_name>
77
+ </choice>
78
+ </choices>
79
+ </argument>
80
+ <argument>
81
+ <name>waterside_economizer</name>
82
+ <display_name>Water-side economizer (water cooled chiller only)</display_name>
83
+ <type>Choice</type>
84
+ <required>true</required>
85
+ <model_dependent>false</model_dependent>
86
+ <default_value>none</default_value>
87
+ <choices>
88
+ <choice>
89
+ <value>none</value>
90
+ <display_name>none</display_name>
91
+ </choice>
92
+ <choice>
93
+ <value>integrated</value>
94
+ <display_name>integrated</display_name>
95
+ </choice>
96
+ <choice>
97
+ <value>non-integrated</value>
98
+ <display_name>non-integrated</display_name>
99
+ </choice>
100
+ </choices>
101
+ </argument>
102
+ <argument>
103
+ <name>radiant_type</name>
104
+ <display_name>Radiant System Type</display_name>
105
+ <type>Choice</type>
106
+ <required>true</required>
107
+ <model_dependent>false</model_dependent>
108
+ <default_value>floor</default_value>
109
+ <choices>
110
+ <choice>
111
+ <value>floor</value>
112
+ <display_name>floor</display_name>
113
+ </choice>
114
+ <choice>
115
+ <value>ceiling</value>
116
+ <display_name>ceiling</display_name>
117
+ </choice>
118
+ </choices>
119
+ </argument>
120
+ <argument>
121
+ <name>include_carpet</name>
122
+ <display_name>Include carpet over the radiant slab</display_name>
123
+ <description>Only applicable in radiant floor systems. This will greatly reduce system effectiveness and controllability.</description>
124
+ <type>Boolean</type>
125
+ <required>true</required>
126
+ <model_dependent>false</model_dependent>
127
+ <default_value>false</default_value>
128
+ <choices>
129
+ <choice>
130
+ <value>true</value>
131
+ <display_name>true</display_name>
132
+ </choice>
133
+ <choice>
134
+ <value>false</value>
135
+ <display_name>false</display_name>
136
+ </choice>
137
+ </choices>
138
+ </argument>
139
+ <argument>
140
+ <name>control_strategy</name>
141
+ <display_name>Control Strategy</display_name>
142
+ <type>Choice</type>
143
+ <required>true</required>
144
+ <model_dependent>false</model_dependent>
145
+ <default_value>proportional_control</default_value>
146
+ <choices>
147
+ <choice>
148
+ <value>proportional_control</value>
149
+ <display_name>proportional_control</display_name>
150
+ </choice>
151
+ </choices>
152
+ </argument>
153
+ <argument>
154
+ <name>proportional_gain</name>
155
+ <display_name>Proportional Gain</display_name>
156
+ <type>Double</type>
157
+ <required>true</required>
158
+ <model_dependent>false</model_dependent>
159
+ <default_value>0.3</default_value>
160
+ </argument>
161
+ <argument>
162
+ <name>minimum_operation</name>
163
+ <display_name>Minimum Operating Hours</display_name>
164
+ <description>Fractional Hours Allowed, e.g. 30 min = 0.5</description>
165
+ <type>Double</type>
166
+ <required>true</required>
167
+ <model_dependent>false</model_dependent>
168
+ <default_value>1</default_value>
169
+ </argument>
170
+ <argument>
171
+ <name>switch_over_time</name>
172
+ <display_name>Switch Over Time</display_name>
173
+ <description>Minimum time limitation for when the system can switch between heating and cooling. Fractional hours allowed, e.g. 30 min = 0.5.</description>
174
+ <type>Double</type>
175
+ <required>true</required>
176
+ <model_dependent>false</model_dependent>
177
+ <default_value>24</default_value>
178
+ </argument>
179
+ <argument>
180
+ <name>radiant_lockout</name>
181
+ <display_name>Enable radiant lockout</display_name>
182
+ <description>Lockout the radiant system to avoid operating during peak hours.</description>
183
+ <type>Boolean</type>
184
+ <required>true</required>
185
+ <model_dependent>false</model_dependent>
186
+ <default_value>false</default_value>
187
+ <choices>
188
+ <choice>
189
+ <value>true</value>
190
+ <display_name>true</display_name>
191
+ </choice>
192
+ <choice>
193
+ <value>false</value>
194
+ <display_name>false</display_name>
195
+ </choice>
196
+ </choices>
197
+ </argument>
198
+ <argument>
199
+ <name>lockout_start_time</name>
200
+ <display_name>Lockout Start Time</display_name>
201
+ <description>Decimal hour of when radiant lockout starts. Fractional hours allowed, e.g. 30 min = 0.5.</description>
202
+ <type>Double</type>
203
+ <required>true</required>
204
+ <model_dependent>false</model_dependent>
205
+ <default_value>12</default_value>
206
+ </argument>
207
+ <argument>
208
+ <name>lockout_end_time</name>
209
+ <display_name>Lockout End Time</display_name>
210
+ <description>Decimal hour of when radiant lockout ends. Fractional hours allowed, e.g. 30 min = 0.5.</description>
211
+ <type>Double</type>
212
+ <required>true</required>
213
+ <model_dependent>false</model_dependent>
214
+ <default_value>20</default_value>
215
+ </argument>
216
+ <argument>
217
+ <name>add_output_variables</name>
218
+ <display_name>Add output variables for radiant system</display_name>
219
+ <type>Boolean</type>
220
+ <required>true</required>
221
+ <model_dependent>false</model_dependent>
222
+ <default_value>true</default_value>
223
+ <choices>
224
+ <choice>
225
+ <value>true</value>
226
+ <display_name>true</display_name>
227
+ </choice>
228
+ <choice>
229
+ <value>false</value>
230
+ <display_name>false</display_name>
231
+ </choice>
232
+ </choices>
233
+ </argument>
234
+ <argument>
235
+ <name>standards_template</name>
236
+ <display_name>Standards Template</display_name>
237
+ <description>Standards template to use for HVAC equipment efficiencies and controls.</description>
238
+ <type>Choice</type>
239
+ <required>true</required>
240
+ <model_dependent>false</model_dependent>
241
+ <default_value>90.1-2013</default_value>
242
+ <choices>
243
+ <choice>
244
+ <value>90.1-2013</value>
245
+ <display_name>90.1-2013</display_name>
246
+ </choice>
247
+ <choice>
248
+ <value>DEER 2017</value>
249
+ <display_name>DEER 2017</display_name>
250
+ </choice>
251
+ <choice>
252
+ <value>DEER 2020</value>
253
+ <display_name>DEER 2020</display_name>
254
+ </choice>
255
+ </choices>
256
+ </argument>
257
+ </arguments>
258
+ <outputs />
259
+ <provenances />
260
+ <tags>
261
+ <tag>HVAC.Whole System</tag>
262
+ </tags>
263
+ <attributes>
264
+ <attribute>
265
+ <name>Measure Type</name>
266
+ <value>ModelMeasure</value>
267
+ <datatype>string</datatype>
268
+ </attribute>
269
+ <attribute>
270
+ <name>Intended Software Tool</name>
271
+ <value>Apply Measure Now</value>
272
+ <datatype>string</datatype>
273
+ </attribute>
274
+ <attribute>
275
+ <name>Intended Software Tool</name>
276
+ <value>OpenStudio Application</value>
277
+ <datatype>string</datatype>
278
+ </attribute>
279
+ <attribute>
280
+ <name>Intended Software Tool</name>
281
+ <value>Parametric Analysis Tool</value>
282
+ <datatype>string</datatype>
283
+ </attribute>
284
+ </attributes>
285
+ <files>
286
+ <file>
287
+ <filename>README.md.erb</filename>
288
+ <filetype>erb</filetype>
289
+ <usage_type>readmeerb</usage_type>
290
+ <checksum>703C9964</checksum>
291
+ </file>
292
+ <file>
293
+ <filename>USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw</filename>
294
+ <filetype>epw</filetype>
295
+ <usage_type>test</usage_type>
296
+ <checksum>EF1A69B0</checksum>
297
+ </file>
298
+ <file>
299
+ <filename>USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw</filename>
300
+ <filetype>epw</filetype>
301
+ <usage_type>test</usage_type>
302
+ <checksum>C254B53F</checksum>
303
+ </file>
304
+ <file>
305
+ <filename>multi_zone_office_3C.osm</filename>
306
+ <filetype>osm</filetype>
307
+ <usage_type>test</usage_type>
308
+ <checksum>7CBAD8AA</checksum>
309
+ </file>
310
+ <file>
311
+ <filename>single_zone_office_5A.osm</filename>
312
+ <filetype>osm</filetype>
313
+ <usage_type>test</usage_type>
314
+ <checksum>44FD3DF2</checksum>
315
+ </file>
316
+ <file>
317
+ <filename>README.md</filename>
318
+ <filetype>md</filetype>
319
+ <usage_type>readme</usage_type>
320
+ <checksum>8618B20F</checksum>
321
+ </file>
322
+ <file>
323
+ <filename>radiant_slab_with_doas_test.rb</filename>
324
+ <filetype>rb</filetype>
325
+ <usage_type>test</usage_type>
326
+ <checksum>E355D2C1</checksum>
327
+ </file>
328
+ <file>
329
+ <filename>LICENSE.md</filename>
330
+ <filetype>md</filetype>
331
+ <usage_type>license</usage_type>
332
+ <checksum>E0468DD6</checksum>
333
+ </file>
334
+ <file>
335
+ <version>
336
+ <software_program>OpenStudio</software_program>
337
+ <identifier>2.9.0</identifier>
338
+ <min_compatible>2.9.0</min_compatible>
339
+ </version>
340
+ <filename>measure.rb</filename>
341
+ <filetype>rb</filetype>
342
+ <usage_type>script</usage_type>
343
+ <checksum>466F7B10</checksum>
344
+ </file>
345
+ </files>
346
+ </measure>