openstudio-ee 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +7 -0
  4. data/Rakefile +0 -2
  5. data/lib/measures/GLHEProExportLoadsforGroundHeatExchangerSizing/measure.rb +1 -1
  6. data/lib/measures/GLHEProExportLoadsforGroundHeatExchangerSizing/measure.xml +3 -4
  7. data/lib/measures/nze_hvac/measure.rb +8 -6
  8. data/lib/measures/nze_hvac/measure.xml +9 -9
  9. data/lib/openstudio/ee_measures/version.rb +1 -1
  10. data/openstudio-ee.gemspec +6 -8
  11. metadata +11 -50
  12. data/lib/measures/ImproveFanTotalEfficiencybyPercentage/measure.rb +0 -333
  13. data/lib/measures/ImproveFanTotalEfficiencybyPercentage/measure.xml +0 -150
  14. data/lib/measures/ReplaceFanTotalEfficiency/measure.rb +0 -330
  15. data/lib/measures/ReplaceFanTotalEfficiency/measure.xml +0 -150
  16. data/lib/measures/add_apszhp_to_each_zone/measure.rb +0 -607
  17. data/lib/measures/add_apszhp_to_each_zone/measure.xml +0 -184
  18. data/lib/measures/add_energy_recovery_ventilator/measure.rb +0 -354
  19. data/lib/measures/add_energy_recovery_ventilator/measure.xml +0 -78
  20. data/lib/measures/improve_simple_glazing_by_percentage/measure.rb +0 -81
  21. data/lib/measures/improve_simple_glazing_by_percentage/measure.xml +0 -70
  22. data/lib/measures/reduce_water_use_by_percentage/measure.rb +0 -61
  23. data/lib/measures/reduce_water_use_by_percentage/measure.xml +0 -62
  24. data/lib/measures/replace_hvac_with_gshp_and_doas/measure.rb +0 -511
  25. data/lib/measures/replace_hvac_with_gshp_and_doas/measure.xml +0 -375
  26. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_AedgMeasures.rb +0 -454
  27. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Constructions.rb +0 -221
  28. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Geometry.rb +0 -41
  29. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_HVAC.rb +0 -1682
  30. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_HelperMethods.rb +0 -114
  31. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_LightingAndEquipment.rb +0 -99
  32. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Schedules.rb +0 -142
  33. data/lib/measures/replace_simple_glazing/measure.rb +0 -86
  34. data/lib/measures/replace_simple_glazing/measure.xml +0 -78
  35. data/lib/measures/set_boiler_thermal_efficiency/measure.rb +0 -520
  36. data/lib/measures/set_boiler_thermal_efficiency/measure.xml +0 -78
  37. data/lib/measures/set_water_heater_efficiency_heat_lossand_peak_water_flow_rate/measure.rb +0 -207
  38. data/lib/measures/set_water_heater_efficiency_heat_lossand_peak_water_flow_rate/measure.xml +0 -78
  39. data/lib/measures/tenant_star_internal_loads/measure.rb +0 -134
  40. data/lib/measures/tenant_star_internal_loads/measure.xml +0 -67
  41. data/lib/measures/tenant_star_internal_loads/resources/os_lib_helper_methods.rb +0 -401
  42. data/lib/measures/vr_fwith_doas/measure.rb +0 -468
  43. data/lib/measures/vr_fwith_doas/measure.xml +0 -298
  44. data/lib/measures/vr_fwith_doas/resources/OsLib_AedgMeasures.rb +0 -454
  45. data/lib/measures/vr_fwith_doas/resources/OsLib_Constructions.rb +0 -221
  46. data/lib/measures/vr_fwith_doas/resources/OsLib_Geometry.rb +0 -41
  47. data/lib/measures/vr_fwith_doas/resources/OsLib_HVAC.rb +0 -1516
  48. data/lib/measures/vr_fwith_doas/resources/OsLib_HelperMethods.rb +0 -114
  49. data/lib/measures/vr_fwith_doas/resources/OsLib_LightingAndEquipment.rb +0 -99
  50. data/lib/measures/vr_fwith_doas/resources/OsLib_Schedules.rb +0 -142
@@ -1,150 +0,0 @@
1
- <measure>
2
- <schema_version>3.0</schema_version>
3
- <name>improve_fan_total_efficiencyby_percentage</name>
4
- <uid>ebeca0aa-a432-4283-a714-17116f7c8f8c</uid>
5
- <version_id>2988238d-43fd-4d62-883b-130aecd70a90</version_id>
6
- <version_modified>20190212T002510Z</version_modified>
7
- <xml_checksum>F78494F2</xml_checksum>
8
- <class_name>ImproveFanTotalEfficiencybyPercentage</class_name>
9
- <display_name>Improve Fan Total Efficiency by Percentage</display_name>
10
- <description></description>
11
- <modeler_description></modeler_description>
12
- <arguments>
13
- <argument>
14
- <name>object</name>
15
- <display_name>Choose an Air Loop to Alter.</display_name>
16
- <type>Choice</type>
17
- <required>true</required>
18
- <model_dependent>false</model_dependent>
19
- <default_value>*All Air Loops*</default_value>
20
- <choices>
21
- <choice>
22
- <value>{be2619d7-0a6a-4a6f-87eb-90118a121a42}</value>
23
- <display_name>*All Air Loops*</display_name>
24
- </choice>
25
- </choices>
26
- </argument>
27
- <argument>
28
- <name>motor_eff</name>
29
- <display_name>Fan Total Efficiency Improvement(%).</display_name>
30
- <type>Double</type>
31
- <required>true</required>
32
- <model_dependent>false</model_dependent>
33
- <default_value>3</default_value>
34
- </argument>
35
- <argument>
36
- <name>remove_costs</name>
37
- <display_name>Remove Baseline Costs From Effected Fans?</display_name>
38
- <type>Boolean</type>
39
- <required>true</required>
40
- <model_dependent>false</model_dependent>
41
- <default_value>false</default_value>
42
- <choices>
43
- <choice>
44
- <value>true</value>
45
- <display_name>true</display_name>
46
- </choice>
47
- <choice>
48
- <value>false</value>
49
- <display_name>false</display_name>
50
- </choice>
51
- </choices>
52
- </argument>
53
- <argument>
54
- <name>material_cost</name>
55
- <display_name>Material and Installation Costs per Motor ($).</display_name>
56
- <type>Double</type>
57
- <required>true</required>
58
- <model_dependent>false</model_dependent>
59
- <default_value>0</default_value>
60
- </argument>
61
- <argument>
62
- <name>demolition_cost</name>
63
- <display_name>Demolition Costs per Motor ($).</display_name>
64
- <type>Double</type>
65
- <required>true</required>
66
- <model_dependent>false</model_dependent>
67
- <default_value>0</default_value>
68
- </argument>
69
- <argument>
70
- <name>years_until_costs_start</name>
71
- <display_name>Years Until Costs Start (whole years).</display_name>
72
- <type>Integer</type>
73
- <required>true</required>
74
- <model_dependent>false</model_dependent>
75
- <default_value>0</default_value>
76
- </argument>
77
- <argument>
78
- <name>demo_cost_initial_const</name>
79
- <display_name>Demolition Costs Occur During Initial Construction?</display_name>
80
- <type>Boolean</type>
81
- <required>true</required>
82
- <model_dependent>false</model_dependent>
83
- <default_value>false</default_value>
84
- <choices>
85
- <choice>
86
- <value>true</value>
87
- <display_name>true</display_name>
88
- </choice>
89
- <choice>
90
- <value>false</value>
91
- <display_name>false</display_name>
92
- </choice>
93
- </choices>
94
- </argument>
95
- <argument>
96
- <name>expected_life</name>
97
- <display_name>Expected Life (whole years).</display_name>
98
- <type>Integer</type>
99
- <required>true</required>
100
- <model_dependent>false</model_dependent>
101
- <default_value>20</default_value>
102
- </argument>
103
- <argument>
104
- <name>om_cost</name>
105
- <display_name>O &amp; M Costs per Motor ($).</display_name>
106
- <type>Double</type>
107
- <required>true</required>
108
- <model_dependent>false</model_dependent>
109
- <default_value>0</default_value>
110
- </argument>
111
- <argument>
112
- <name>om_frequency</name>
113
- <display_name>O &amp; M Frequency (whole years).</display_name>
114
- <type>Integer</type>
115
- <required>true</required>
116
- <model_dependent>false</model_dependent>
117
- <default_value>1</default_value>
118
- </argument>
119
- </arguments>
120
- <outputs/>
121
- <provenances/>
122
- <tags>
123
- <tag>HVAC.Distribution</tag>
124
- </tags>
125
- <attributes>
126
- <attribute>
127
- <name>Measure Type</name>
128
- <value>ModelMeasure</value>
129
- <datatype>string</datatype>
130
- </attribute>
131
- <attribute>
132
- <name>Uses SketchUp API</name>
133
- <value>false</value>
134
- <datatype>boolean</datatype>
135
- </attribute>
136
- </attributes>
137
- <files>
138
- <file>
139
- <version>
140
- <software_program>OpenStudio</software_program>
141
- <identifier>1.0.3</identifier>
142
- <min_compatible>1.0.3</min_compatible>
143
- </version>
144
- <filename>measure.rb</filename>
145
- <filetype>rb</filetype>
146
- <usage_type>script</usage_type>
147
- <checksum>7ED92CF1</checksum>
148
- </file>
149
- </files>
150
- </measure>
@@ -1,330 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # start the measure
4
- class ReplaceFanTotalEfficiency < OpenStudio::Ruleset::ModelUserScript
5
- # define the name that a user will see, this method may be deprecated as
6
- # the display name in PAT comes from the name field in measure.xml
7
- def name
8
- return 'Replace Fan Total Efficiency'
9
- end
10
-
11
- # define the arguments that the user will input
12
- def arguments(model)
13
- args = OpenStudio::Ruleset::OSArgumentVector.new
14
-
15
- # populate choice argument for constructions that are applied to surfaces in the model
16
- loop_handles = OpenStudio::StringVector.new
17
- loop_display_names = OpenStudio::StringVector.new
18
-
19
- # putting air loops and names into hash
20
- loop_args = model.getAirLoopHVACs
21
- loop_args_hash = {}
22
- loop_args.each do |loop_arg|
23
- loop_args_hash[loop_arg.name.to_s] = loop_arg
24
- end
25
-
26
- # looping through sorted hash of air loops
27
- loop_args_hash.sort.map do |key, value|
28
- show_loop = false
29
- components = value.supplyComponents
30
- components.each do |component|
31
- if !component.to_FanConstantVolume.empty?
32
- show_loop = true
33
- end
34
- if !component.to_FanVariableVolume.empty?
35
- show_loop = true
36
- end
37
- if !component.to_FanOnOff.empty?
38
- show_loop = true
39
- end
40
- end
41
-
42
- # if loop as object of correct type then add to hash.
43
- if show_loop == true
44
- loop_handles << value.handle.to_s
45
- loop_display_names << key
46
- end
47
- end
48
-
49
- # add building to string vector with air loops
50
- building = model.getBuilding
51
- loop_handles << building.handle.to_s
52
- loop_display_names << '*All Air Loops*'
53
-
54
- # make an argument for air loops
55
- object = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('object', loop_handles, loop_display_names, true)
56
- object.setDisplayName('Choose an Air Loop to Alter.')
57
- object.setDefaultValue('*All Air Loops*') # if no loop is chosen this will run on all air loops
58
- args << object
59
-
60
- # TODO: - change this to choice list from design document
61
- # make an argument to add new space true/false
62
- motor_eff = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('motor_eff', true)
63
- motor_eff.setDisplayName('Fan Total Efficiency Replacement in %')
64
- motor_eff.setDefaultValue(70)
65
- args << motor_eff
66
-
67
- # bool argument to remove existing costs
68
- remove_costs = OpenStudio::Ruleset::OSArgument.makeBoolArgument('remove_costs', true)
69
- remove_costs.setDisplayName('Remove Baseline Costs From Effected Fans?')
70
- remove_costs.setDefaultValue(false)
71
- args << remove_costs
72
-
73
- # make an argument for material and installation cost
74
- material_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('material_cost', true)
75
- material_cost.setDisplayName('Material and Installation Costs per Motor ($).')
76
- material_cost.setDefaultValue(0.0)
77
- args << material_cost
78
-
79
- # make an argument for demolition cost
80
- demolition_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('demolition_cost', true)
81
- demolition_cost.setDisplayName('Demolition Costs per Motor ($).')
82
- demolition_cost.setDefaultValue(0.0)
83
- args << demolition_cost
84
-
85
- # make an argument for duration in years until costs start
86
- years_until_costs_start = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('years_until_costs_start', true)
87
- years_until_costs_start.setDisplayName('Years Until Costs Start (whole years).')
88
- years_until_costs_start.setDefaultValue(0)
89
- args << years_until_costs_start
90
-
91
- # make an argument to determine if demolition costs should be included in initial construction
92
- demo_cost_initial_const = OpenStudio::Ruleset::OSArgument.makeBoolArgument('demo_cost_initial_const', true)
93
- demo_cost_initial_const.setDisplayName('Demolition Costs Occur During Initial Construction?')
94
- demo_cost_initial_const.setDefaultValue(false)
95
- args << demo_cost_initial_const
96
-
97
- # make an argument for expected life
98
- expected_life = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('expected_life', true)
99
- expected_life.setDisplayName('Expected Life (whole years).')
100
- expected_life.setDefaultValue(20)
101
- args << expected_life
102
-
103
- # make an argument for o&m cost
104
- om_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('om_cost', true)
105
- om_cost.setDisplayName('O & M Costs per Motor ($).')
106
- om_cost.setDefaultValue(0.0)
107
- args << om_cost
108
-
109
- # make an argument for o&m frequency
110
- om_frequency = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('om_frequency', true)
111
- om_frequency.setDisplayName('O & M Frequency (whole years).')
112
- om_frequency.setDefaultValue(1)
113
- args << om_frequency
114
-
115
- return args
116
- end # end the arguments method
117
-
118
- # define what happens when the measure is cop
119
- def run(model, runner, user_arguments)
120
- super(model, runner, user_arguments)
121
-
122
- # use the built-in error checking
123
- if !runner.validateUserArguments(arguments(model), user_arguments)
124
- return false
125
- end
126
-
127
- # assign the user inputs to variables
128
- object = runner.getOptionalWorkspaceObjectChoiceValue('object', user_arguments, model) # model is passed in because of argument type
129
- motor_eff = runner.getDoubleArgumentValue('motor_eff', user_arguments)
130
- remove_costs = runner.getBoolArgumentValue('remove_costs', user_arguments)
131
- material_cost = runner.getDoubleArgumentValue('material_cost', user_arguments)
132
- demolition_cost = runner.getDoubleArgumentValue('demolition_cost', user_arguments)
133
- years_until_costs_start = runner.getIntegerArgumentValue('years_until_costs_start', user_arguments)
134
- demo_cost_initial_const = runner.getBoolArgumentValue('demo_cost_initial_const', user_arguments)
135
- expected_life = runner.getIntegerArgumentValue('expected_life', user_arguments)
136
- om_cost = runner.getDoubleArgumentValue('om_cost', user_arguments)
137
- om_frequency = runner.getIntegerArgumentValue('om_frequency', user_arguments)
138
-
139
- # check the loop for reasonableness
140
- apply_to_all_loops = false
141
- loop = nil
142
- if object.empty?
143
- handle = runner.getStringArgumentValue('loop', user_arguments)
144
- if handle.empty?
145
- runner.registerError('No loop was chosen.')
146
- else
147
- runner.registerError("The selected loop with handle '#{handle}' was not found in the model. It may have been removed by another measure.")
148
- end
149
- return false
150
- else
151
- if !object.get.to_Loop.empty?
152
- loop = object.get.to_Loop.get
153
- elsif !object.get.to_Building.empty?
154
- apply_to_all_loops = true
155
- else
156
- runner.registerError('Script Error - argument not showing up as loop.')
157
- return false
158
- end
159
- end # end of if loop.empty?
160
-
161
- # set flags to use later
162
- costs_requested = false
163
-
164
- # set values to use later
165
- yr0_capital_totalCosts_baseline = 0
166
- yr0_capital_totalCosts_proposed = 0
167
-
168
- # If demo_cost_initial_const is true then will be applied once in the lifecycle. Future replacements use the demo cost of the new construction.
169
- demo_costs_of_baseline_objects = 0
170
-
171
- # check costs for reasonableness
172
- if material_cost.abs + demolition_cost.abs + om_cost.abs == 0
173
- runner.registerInfo('No costs were requested for motors improvements.')
174
- else
175
- costs_requested = true
176
- end
177
-
178
- # check lifecycle arguments for reasonableness
179
- if (years_until_costs_start < 0) && (years_until_costs_start > expected_life)
180
- runner.registerError('Years until costs start should be a non-negative integer less than Expected Life.')
181
- end
182
- if (expected_life < 1) && (expected_life > 100)
183
- runner.registerError('Choose an integer greater than 0 and less than or equal to 100 for Expected Life.')
184
- end
185
- if om_frequency < 1
186
- runner.registerError('Choose an integer greater than 0 for O & M Frequency.')
187
- end
188
-
189
- # short def to make numbers pretty (converts 4125001.25641 to 4,125,001.26 or 4,125,001). The definition be called through this measure
190
- def neat_numbers(number, roundto = 2) # round to 0 or 2)
191
- if roundto == 2
192
- number = format '%.2f', number
193
- else
194
- number = number.round
195
- end
196
- # regex to add commas
197
- number.to_s.reverse.gsub(/([0-9]{3}(?=([0-9])))/, '\\1,').reverse
198
- end # end def neat_numbers
199
-
200
- # helper that loops through lifecycle costs getting total costs under "Construction" or "Salvage" category and add to counter if occurs during year 0
201
- def get_total_costs_for_objects(objects)
202
- counter = 0
203
- objects.each do |object|
204
- object_LCCs = object.lifeCycleCosts
205
- object_LCCs.each do |object_LCC|
206
- if (object_LCC.category == 'Construction') || (object_LCC.category == 'Salvage')
207
- if object_LCC.yearsFromStart == 0
208
- counter += object_LCC.totalCost
209
- end
210
- end
211
- end
212
- end
213
- return counter
214
- end # end of def get_total_costs_for_objects(objects)
215
-
216
- # get loops for measure
217
- if apply_to_all_loops
218
- loops = model.getAirLoopHVACs
219
- else
220
- loops = []
221
- loops << loop # only run on a single space type
222
- end
223
-
224
- # get cop values
225
- initial_motor_efficiency_values = []
226
- missing_initial_motor_efficiency = 0
227
-
228
- # loop through air loops
229
- loops.each do |loop|
230
- supply_components = loop.supplyComponents
231
-
232
- # find fans on loop
233
- supply_components.each do |supply_component|
234
- hVACComponent = supply_component.to_FanConstantVolume
235
- if hVACComponent.empty?
236
- hVACComponent = supply_component.to_FanVariableVolume
237
- end
238
- if hVACComponent.empty?
239
- hVACComponent = supply_component.to_FanOnOff
240
- end
241
-
242
- # alter components of correct type
243
- if !hVACComponent.empty?
244
- hVACComponent = hVACComponent.get
245
-
246
- # change and report changes to fans and motors
247
- initial_motor_efficiency = hVACComponent.fanEfficiency
248
- target_motor_efficiency = motor_eff * 0.01
249
- initial_motor_efficiency_values << initial_motor_efficiency
250
- if target_motor_efficiency > 1
251
- hVACComponent.setFanEfficiency(1.0)
252
- runner.registerWarning("Requested efficiency of #{target_motor_efficiency * 100}% for #{hVACComponent.name} is not possible. Setting motor efficiency to 100%.")
253
- elsif target_motor_efficiency < 0
254
- hVACComponent.setFanEfficiency(0.0)
255
- runner.registerWarning("Requested efficiency of #{target_motor_efficiency * 100}% for #{hVACComponent.name} is not possible. Setting motor efficiency to 0%.")
256
- elsif target_motor_efficiency < initial_motor_efficiency
257
- hVACComponent.setFanEfficiency(initial_motor_efficiency)
258
- runner.registerWarning("Requested efficiency of #{target_motor_efficiency * 100}% for #{hVACComponent.name} is the same as the initial efficiency. No changes.")
259
- else
260
- hVACComponent.setFanEfficiency(target_motor_efficiency)
261
- runner.registerInfo("Changing the motor efficiency from #{initial_motor_efficiency * 100}% to #{target_motor_efficiency * 100}% for '#{hVACComponent.name}' onloop '#{loop.name}.'")
262
- if target_motor_efficiency > 0.96
263
- runner.registerWarning("Requested efficiency for #{hVACComponent.name} is greater than 96%.")
264
- end
265
- end
266
-
267
- # get initial year 0 cost
268
- yr0_capital_totalCosts_baseline += get_total_costs_for_objects([hVACComponent])
269
-
270
- # demo value of baseline costs associated with unit
271
- demo_LCCs = hVACComponent.lifeCycleCosts
272
- demo_LCCs.each do |demo_LCC|
273
- if demo_LCC.category == 'Salvage'
274
- demo_costs_of_baseline_objects += demo_LCC.totalCost
275
- end
276
- end
277
-
278
- # remove all old costs
279
- if !hVACComponent.lifeCycleCosts.empty? && (remove_costs == true)
280
- runner.registerInfo("Removing existing lifecycle cost objects associated with #{hVACComponent.name}")
281
- removed_costs = hVACComponent.removeLifeCycleCosts
282
- end
283
-
284
- # add new costs
285
- if costs_requested == true
286
-
287
- # adding new cost items
288
- lcc_mat = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_Mat - #{hVACComponent.name}", hVACComponent, material_cost, 'CostPerEach', 'Construction', expected_life, years_until_costs_start)
289
- # cost for if demo_initial_Construction == true is added at the end of the measure
290
- lcc_demo = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_Demo - #{hVACComponent.name}", hVACComponent, demolition_cost, 'CostPerEach', 'Salvage', expected_life, years_until_costs_start + expected_life)
291
- lcc_om = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_OM - #{hVACComponent.name}", hVACComponent, om_cost, 'CostPerEach', 'Maintenance', om_frequency, 0)
292
-
293
- # get final year 0 cost
294
- yr0_capital_totalCosts_proposed += get_total_costs_for_objects([hVACComponent])
295
-
296
- end # end of costs_requested == true
297
-
298
- end # end if not hVACComponent.empty?
299
- end # end supply_components.each do
300
- end # end loops.each do
301
-
302
- # add one time demo cost of removed windows if appropriate
303
- if demo_cost_initial_const == true
304
- building = model.getBuilding
305
- lcc_baseline_demo = OpenStudio::Model::LifeCycleCost.createLifeCycleCost('LCC_baseline_demo', building, demo_costs_of_baseline_objects, 'CostPerEach', 'Salvage', 0, years_until_costs_start).get # using 0 for repeat period since one time cost.
306
- runner.registerInfo("Adding one time cost of $#{neat_numbers(lcc_baseline_demo.totalCost, 0)} related to demolition of baseline objects.")
307
-
308
- # if demo occurs on year 0 then add to initial capital cost counter
309
- if lcc_baseline_demo.yearsFromStart == 0
310
- yr0_capital_totalCosts_proposed += lcc_baseline_demo.totalCost
311
- end
312
- end
313
-
314
- if initial_motor_efficiency_values.size + missing_initial_motor_efficiency == 0
315
- runner.registerAsNotApplicable('The affected loop(s) does not contain any fans, the model will not be altered.')
316
- return true
317
- end
318
-
319
- # reporting initial condition of model
320
- runner.registerInitialCondition("The starting motor efficiency values in affected loop(s) range from #{initial_motor_efficiency_values.min * 100}% to #{initial_motor_efficiency_values.max * 100}%. Initial year 0 capital costs for affected fans is $#{neat_numbers(yr0_capital_totalCosts_baseline, 0)}.")
321
-
322
- # reporting final condition of model
323
- runner.registerFinalCondition("#{initial_motor_efficiency_values.size + missing_initial_motor_efficiency} fans had motor efficiency values set to altered. Final year 0 capital costs for affected fans is $#{neat_numbers(yr0_capital_totalCosts_proposed, 0)}.")
324
-
325
- return true
326
- end # end the cop method
327
- end # end the measure
328
-
329
- # this allows the measure to be used by the application
330
- ReplaceFanTotalEfficiency.new.registerWithApplication