openstudio-workflow 1.3.4 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +89 -77
  3. data/README.md +67 -93
  4. data/Rakefile +36 -36
  5. data/lib/openstudio-workflow.rb +65 -65
  6. data/lib/openstudio/workflow/adapters/input/local.rb +311 -324
  7. data/lib/openstudio/workflow/adapters/output/local.rb +158 -161
  8. data/lib/openstudio/workflow/adapters/output/socket.rb +106 -107
  9. data/lib/openstudio/workflow/adapters/output/web.rb +82 -82
  10. data/lib/openstudio/workflow/adapters/output_adapter.rb +163 -163
  11. data/lib/openstudio/workflow/job.rb +57 -57
  12. data/lib/openstudio/workflow/jobs/resources/monthly_report.idf +222 -222
  13. data/lib/openstudio/workflow/jobs/run_energyplus.rb +70 -70
  14. data/lib/openstudio/workflow/jobs/run_ep_measures.rb +73 -73
  15. data/lib/openstudio/workflow/jobs/run_initialization.rb +203 -203
  16. data/lib/openstudio/workflow/jobs/run_os_measures.rb +89 -89
  17. data/lib/openstudio/workflow/jobs/run_postprocess.rb +73 -73
  18. data/lib/openstudio/workflow/jobs/run_preprocess.rb +104 -104
  19. data/lib/openstudio/workflow/jobs/run_reporting_measures.rb +118 -118
  20. data/lib/openstudio/workflow/jobs/run_translation.rb +84 -84
  21. data/lib/openstudio/workflow/multi_delegator.rb +62 -62
  22. data/lib/openstudio/workflow/registry.rb +172 -172
  23. data/lib/openstudio/workflow/run.rb +342 -328
  24. data/lib/openstudio/workflow/time_logger.rb +96 -96
  25. data/lib/openstudio/workflow/util.rb +49 -49
  26. data/lib/openstudio/workflow/util/energyplus.rb +575 -605
  27. data/lib/openstudio/workflow/util/io.rb +68 -68
  28. data/lib/openstudio/workflow/util/measure.rb +658 -650
  29. data/lib/openstudio/workflow/util/model.rb +151 -151
  30. data/lib/openstudio/workflow/util/post_process.rb +235 -238
  31. data/lib/openstudio/workflow/util/weather_file.rb +143 -143
  32. data/lib/openstudio/workflow/version.rb +40 -40
  33. data/lib/openstudio/workflow_json.rb +475 -476
  34. data/lib/openstudio/workflow_runner.rb +263 -268
  35. metadata +24 -24
@@ -1,70 +1,70 @@
1
- # *******************************************************************************
2
- # OpenStudio(R), Copyright (c) 2008-2018, Alliance for Sustainable Energy, LLC.
3
- # All rights reserved.
4
- # Redistribution and use in source and binary forms, with or without
5
- # modification, are permitted provided that the following conditions are met:
6
- #
7
- # (1) Redistributions of source code must retain the above copyright notice,
8
- # this list of conditions and the following disclaimer.
9
- #
10
- # (2) Redistributions in binary form must reproduce the above copyright notice,
11
- # this list of conditions and the following disclaimer in the documentation
12
- # and/or other materials provided with the distribution.
13
- #
14
- # (3) Neither the name of the copyright holder nor the names of any contributors
15
- # may be used to endorse or promote products derived from this software without
16
- # specific prior written permission from the respective party.
17
- #
18
- # (4) Other than as required in clauses (1) and (2), distributions in any form
19
- # of modifications or other derivative works may not use the "OpenStudio"
20
- # trademark, "OS", "os", or any other confusingly similar designation without
21
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
- # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
- # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
- # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
- # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
- # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
- # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
- # *******************************************************************************
35
-
36
- # This class runs the EnergyPlus simulation
37
- class RunEnergyPlus < OpenStudio::Workflow::Job
38
- require 'openstudio/workflow/util/energyplus'
39
- include OpenStudio::Workflow::Util::EnergyPlus
40
-
41
- def initialize(input_adapter, output_adapter, registry, options = {})
42
- super
43
- end
44
-
45
- def perform
46
- @logger.debug "Calling #{__method__} in the #{self.class} class"
47
-
48
- # skip if halted
49
- halted = @registry[:runner].halted
50
- @logger.info 'Workflow halted, skipping the EnergyPlus simulation' if halted
51
- return nil if halted
52
-
53
- # Checks and configuration
54
- raise 'No run_dir specified in the registry' unless @registry[:run_dir]
55
- ep_path = @options[:energyplus_path] ? @options[:energyplus_path] : nil
56
- @logger.warn "Using EnergyPlus path specified in options #{ep_path}" if ep_path
57
-
58
- @logger.info 'Starting the EnergyPlus simulation'
59
- @registry[:time_logger].start('Running EnergyPlus') if @registry[:time_logger]
60
- call_energyplus(@registry[:run_dir], ep_path, @output_adapter, @logger, @registry[:workflow_json])
61
- @registry[:time_logger].stop('Running EnergyPlus') if @registry[:time_logger]
62
- @logger.info 'Completed the EnergyPlus simulation'
63
-
64
- sql_path = File.join(@registry[:run_dir], 'eplusout.sql')
65
- @registry.register(:sql) { sql_path } if File.exist? sql_path
66
- @logger.warn "Unable to find sql file at #{sql_path}" unless @registry[:sql]
67
-
68
- nil
69
- end
70
- end
1
+ # *******************************************************************************
2
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
+ # All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # (1) Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # (3) Neither the name of the copyright holder nor the names of any contributors
15
+ # may be used to endorse or promote products derived from this software without
16
+ # specific prior written permission from the respective party.
17
+ #
18
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
19
+ # of modifications or other derivative works may not use the "OpenStudio"
20
+ # trademark, "OS", "os", or any other confusingly similar designation without
21
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
+ # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ # *******************************************************************************
35
+
36
+ # This class runs the EnergyPlus simulation
37
+ class RunEnergyPlus < OpenStudio::Workflow::Job
38
+ require 'openstudio/workflow/util/energyplus'
39
+ include OpenStudio::Workflow::Util::EnergyPlus
40
+
41
+ def initialize(input_adapter, output_adapter, registry, options = {})
42
+ super
43
+ end
44
+
45
+ def perform
46
+ @logger.debug "Calling #{__method__} in the #{self.class} class"
47
+
48
+ # skip if halted
49
+ halted = @registry[:runner].halted
50
+ @logger.info 'Workflow halted, skipping the EnergyPlus simulation' if halted
51
+ return nil if halted
52
+
53
+ # Checks and configuration
54
+ raise 'No run_dir specified in the registry' unless @registry[:run_dir]
55
+ ep_path = @options[:energyplus_path] ? @options[:energyplus_path] : nil
56
+ @logger.warn "Using EnergyPlus path specified in options #{ep_path}" if ep_path
57
+
58
+ @logger.info 'Starting the EnergyPlus simulation'
59
+ @registry[:time_logger].start('Running EnergyPlus') if @registry[:time_logger]
60
+ call_energyplus(@registry[:run_dir], ep_path, @output_adapter, @logger, @registry[:workflow_json])
61
+ @registry[:time_logger].stop('Running EnergyPlus') if @registry[:time_logger]
62
+ @logger.info 'Completed the EnergyPlus simulation'
63
+
64
+ sql_path = File.join(@registry[:run_dir], 'eplusout.sql')
65
+ @registry.register(:sql) { sql_path } if File.exist? sql_path
66
+ @logger.warn "Unable to find sql file at #{sql_path}" unless @registry[:sql]
67
+
68
+ nil
69
+ end
70
+ end
@@ -1,73 +1,73 @@
1
- # *******************************************************************************
2
- # OpenStudio(R), Copyright (c) 2008-2018, Alliance for Sustainable Energy, LLC.
3
- # All rights reserved.
4
- # Redistribution and use in source and binary forms, with or without
5
- # modification, are permitted provided that the following conditions are met:
6
- #
7
- # (1) Redistributions of source code must retain the above copyright notice,
8
- # this list of conditions and the following disclaimer.
9
- #
10
- # (2) Redistributions in binary form must reproduce the above copyright notice,
11
- # this list of conditions and the following disclaimer in the documentation
12
- # and/or other materials provided with the distribution.
13
- #
14
- # (3) Neither the name of the copyright holder nor the names of any contributors
15
- # may be used to endorse or promote products derived from this software without
16
- # specific prior written permission from the respective party.
17
- #
18
- # (4) Other than as required in clauses (1) and (2), distributions in any form
19
- # of modifications or other derivative works may not use the "OpenStudio"
20
- # trademark, "OS", "os", or any other confusingly similar designation without
21
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
- # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
- # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
- # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
- # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
- # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
- # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
- # *******************************************************************************
35
-
36
- # This class runs all EnergyPlus measures defined in the OSW
37
- class RunEnergyPlusMeasures < OpenStudio::Workflow::Job
38
- require 'openstudio/workflow/util'
39
- include OpenStudio::Workflow::Util::Measure
40
- include OpenStudio::Workflow::Util::Model
41
-
42
- def initialize(input_adapter, output_adapter, registry, options = {})
43
- super
44
- end
45
-
46
- def perform
47
- @logger.debug "Calling #{__method__} in the #{self.class} class"
48
-
49
- # halted workflow is handled in apply_measures
50
-
51
- # Ensure output_attributes is initialized in the registry
52
- @registry.register(:output_attributes) { {} } unless @registry[:output_attributes]
53
-
54
- # Apply the EnergyPlus measures
55
- @options[:output_adapter] = @output_adapter
56
- @logger.info 'Beginning to execute EnergyPlus measures.'
57
- apply_measures('EnergyPlusMeasure'.to_MeasureType, @registry, @options)
58
- @logger.info('Finished applying EnergyPlus measures.')
59
-
60
- # Send the measure output attributes to the output adapter
61
- @logger.debug 'Communicating measure output attributes to the output adapter'
62
- @output_adapter.communicate_measure_attributes @registry[:output_attributes]
63
-
64
- # Save both the OSM and IDF if the :debug option is true
65
- return nil unless @options[:debug]
66
- @registry[:time_logger].start('Saving IDF') if @registry[:time_logger]
67
- idf_name = save_idf(@registry[:model_idf], @registry[:root_dir])
68
- @registry[:time_logger].stop('Saving IDF') if @registry[:time_logger]
69
- @logger.debug "Saved IDF as #{idf_name}"
70
-
71
- nil
72
- end
73
- end
1
+ # *******************************************************************************
2
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
+ # All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # (1) Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # (3) Neither the name of the copyright holder nor the names of any contributors
15
+ # may be used to endorse or promote products derived from this software without
16
+ # specific prior written permission from the respective party.
17
+ #
18
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
19
+ # of modifications or other derivative works may not use the "OpenStudio"
20
+ # trademark, "OS", "os", or any other confusingly similar designation without
21
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
+ # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ # *******************************************************************************
35
+
36
+ # This class runs all EnergyPlus measures defined in the OSW
37
+ class RunEnergyPlusMeasures < OpenStudio::Workflow::Job
38
+ require 'openstudio/workflow/util'
39
+ include OpenStudio::Workflow::Util::Measure
40
+ include OpenStudio::Workflow::Util::Model
41
+
42
+ def initialize(input_adapter, output_adapter, registry, options = {})
43
+ super
44
+ end
45
+
46
+ def perform
47
+ @logger.debug "Calling #{__method__} in the #{self.class} class"
48
+
49
+ # halted workflow is handled in apply_measures
50
+
51
+ # Ensure output_attributes is initialized in the registry
52
+ @registry.register(:output_attributes) { {} } unless @registry[:output_attributes]
53
+
54
+ # Apply the EnergyPlus measures
55
+ @options[:output_adapter] = @output_adapter
56
+ @logger.info 'Beginning to execute EnergyPlus measures.'
57
+ apply_measures('EnergyPlusMeasure'.to_MeasureType, @registry, @options)
58
+ @logger.info('Finished applying EnergyPlus measures.')
59
+
60
+ # Send the measure output attributes to the output adapter
61
+ @logger.debug 'Communicating measure output attributes to the output adapter'
62
+ @output_adapter.communicate_measure_attributes @registry[:output_attributes]
63
+
64
+ # Save both the OSM and IDF if the :debug option is true
65
+ return nil unless @options[:debug]
66
+ @registry[:time_logger].start('Saving IDF') if @registry[:time_logger]
67
+ idf_name = save_idf(@registry[:model_idf], @registry[:root_dir])
68
+ @registry[:time_logger].stop('Saving IDF') if @registry[:time_logger]
69
+ @logger.debug "Saved IDF as #{idf_name}"
70
+
71
+ nil
72
+ end
73
+ end
@@ -1,203 +1,203 @@
1
- # *******************************************************************************
2
- # OpenStudio(R), Copyright (c) 2008-2018, Alliance for Sustainable Energy, LLC.
3
- # All rights reserved.
4
- # Redistribution and use in source and binary forms, with or without
5
- # modification, are permitted provided that the following conditions are met:
6
- #
7
- # (1) Redistributions of source code must retain the above copyright notice,
8
- # this list of conditions and the following disclaimer.
9
- #
10
- # (2) Redistributions in binary form must reproduce the above copyright notice,
11
- # this list of conditions and the following disclaimer in the documentation
12
- # and/or other materials provided with the distribution.
13
- #
14
- # (3) Neither the name of the copyright holder nor the names of any contributors
15
- # may be used to endorse or promote products derived from this software without
16
- # specific prior written permission from the respective party.
17
- #
18
- # (4) Other than as required in clauses (1) and (2), distributions in any form
19
- # of modifications or other derivative works may not use the "OpenStudio"
20
- # trademark, "OS", "os", or any other confusingly similar designation without
21
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
- # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
- # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
- # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
- # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
- # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
- # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
- # *******************************************************************************
35
-
36
- # Run the initialization job to run validations and initializations
37
- class RunInitialization < OpenStudio::Workflow::Job
38
- require 'openstudio/workflow/util'
39
- include OpenStudio::Workflow::Util::WeatherFile
40
- include OpenStudio::Workflow::Util::Model
41
- include OpenStudio::Workflow::Util::Measure
42
-
43
- def initialize(input_adapter, output_adapter, registry, options = {})
44
- defaults = {
45
- verify_osw: true
46
- }
47
- options = defaults.merge(options)
48
- super
49
- end
50
-
51
- def perform
52
- # DLM: why are there multiple loggers running around? there is one in the registry can we just use that?
53
- @logger.info "Calling #{__method__} in the #{self.class} class"
54
-
55
- # do not skip initialization if halted
56
-
57
- # Communicate that the workflow has been started
58
- @logger.debug 'Registering that the workflow has started with the adapter'
59
- @output_adapter.communicate_started
60
-
61
- # Load various files and set basic directories for the registry
62
- # DLM: this key is the raw JSON object, it is deprecated and should not be used, use :workflow_json instead
63
- @registry.register(:workflow) { @input_adapter.workflow }
64
- raise 'Specified workflow was nil' unless @registry[:workflow]
65
- @logger.debug 'Retrieved the workflow from the adapter'
66
-
67
- @registry.register(:osw_dir) { @input_adapter.osw_dir }
68
- @logger.debug "osw_dir is #{@registry[:osw_dir]}"
69
-
70
- @registry.register(:datapoint) { @input_adapter.datapoint }
71
- @logger.debug 'Found associated OSD file' if @registry[:datapoint]
72
-
73
- @registry.register(:analysis) { @input_adapter.analysis }
74
- @logger.debug 'Found associated OSA file' if @registry[:analysis]
75
-
76
- # create the real WorkflowJSON here, we will be able to edit this during the run
77
- if @registry[:openstudio_2]
78
- workflow_json = OpenStudio::WorkflowJSON.new(JSON.fast_generate(@registry[:workflow]))
79
- workflow_json.setOswDir(@registry[:osw_dir])
80
- else
81
- workflow_json = WorkflowJSON_Shim.new(@registry[:workflow], @registry[:osw_dir])
82
- end
83
- @registry.register(:workflow_json) { workflow_json }
84
-
85
- @registry.register(:root_dir) { workflow_json.absoluteRootDir }
86
- @logger.debug "The root_dir for the datapoint is #{@registry[:root_dir]}"
87
-
88
- generated_files_dir = "#{@registry[:root_dir]}/generated_files"
89
- if File.exist?(generated_files_dir)
90
- @logger.debug "Removing existing generated files directory: #{generated_files_dir}"
91
- FileUtils.rm_rf(generated_files_dir)
92
- end
93
- @logger.debug "Creating generated files directory: #{generated_files_dir}"
94
- FileUtils.mkdir_p(generated_files_dir)
95
-
96
- # insert the generated files directory in the first spot so all generated ExternalFiles go here
97
- file_paths = @registry[:workflow_json].filePaths
98
- @registry[:workflow_json].resetFilePaths
99
- @registry[:workflow_json].addFilePath(generated_files_dir)
100
- file_paths.each do |file_path|
101
- @registry[:workflow_json].addFilePath(file_path)
102
- end
103
-
104
- reports_dir = "#{@registry[:root_dir]}/reports"
105
- if File.exist?(reports_dir)
106
- @logger.debug "Removing existing reports directory: #{reports_dir}"
107
- FileUtils.rm_rf(reports_dir)
108
- end
109
-
110
- # create the runner with our WorkflowJSON
111
- @registry.register(:runner) { WorkflowRunner.new(@registry[:logger], @registry[:workflow_json], @registry[:openstudio_2]) }
112
- @registry[:runner].setDatapoint(@registry[:datapoint])
113
- @registry[:runner].setAnalysis(@registry[:analysis])
114
- @logger.debug 'Initialized runner'
115
-
116
- # Validate the OSW measures if the flag is set to true, (the default state)
117
- if @options[:verify_osw]
118
- @logger.info 'Attempting to validate the measure workflow'
119
- validate_measures(@registry, @logger)
120
- @logger.info 'Validated the measure workflow'
121
- end
122
-
123
- # Load or create the seed OSM object
124
- @logger.debug 'Finding and loading the seed file'
125
- model_path = workflow_json.seedFile
126
- if !model_path.empty?
127
-
128
- model_full_path = workflow_json.findFile(model_path.get)
129
- if model_full_path.empty?
130
- raise "Seed model #{model_path.get} specified in OSW cannot be found"
131
- end
132
- model_full_path = model_full_path.get
133
-
134
- if File.extname(model_full_path.to_s) == '.idf'
135
- @registry.register(:model_idf) { load_idf(model_full_path, @logger) }
136
- @registry.register(:model) { nil }
137
- else
138
- @registry.register(:model) { load_osm(model_full_path, @logger) }
139
- end
140
- else
141
- @registry.register(:model) { OpenStudio::Model::Model.new }
142
-
143
- # add default objects to the model
144
- begin
145
- OpenStudio::Model::initializeModelObjects(@registry[:model])
146
- rescue NameError
147
- @registry[:model].getBuilding
148
- @registry[:model].getFacility
149
- @registry[:model].getSimulationControl
150
- @registry[:model].getSizingParameters
151
- @registry[:model].getTimestep
152
- @registry[:model].getShadowCalculation
153
- @registry[:model].getHeatBalanceAlgorithm
154
- @registry[:model].getRunPeriod
155
- @registry[:model].getLifeCycleCostParameters
156
- end
157
- end
158
-
159
- if @registry[:openstudio_2]
160
- if @registry[:model]
161
- @registry[:model].setWorkflowJSON(workflow_json.clone)
162
- end
163
- end
164
-
165
- # DLM: TODO, load weather_file from options so it can be overriden by user_options
166
-
167
- # Find the weather file, should it exist and be findable
168
- @logger.debug 'Getting the initial weather file'
169
- weather_path = workflow_json.weatherFile
170
- if weather_path.empty?
171
- @logger.debug 'No weather file specified in OSW, looking in model'
172
- if @registry[:model]
173
- model = @registry[:model]
174
- unless model.weatherFile.empty?
175
- weather_path = model.weatherFile.get.path
176
- end
177
- end
178
- end
179
-
180
- unless weather_path.empty?
181
- weather_path = weather_path.get
182
- @logger.debug 'Searching for weather file #{weather_path}'
183
-
184
- weather_full_path = workflow_json.findFile(weather_path)
185
- if weather_full_path.empty?
186
- weather_full_path = workflow_json.findFile(File.basename(weather_path.to_s))
187
- end
188
-
189
- if weather_full_path.empty?
190
- raise "Weather file '#{weather_path}' specified but cannot be found"
191
- end
192
- weather_full_path = weather_full_path.get
193
-
194
- @registry.register(:wf) { weather_full_path.to_s }
195
-
196
- end
197
- @logger.warn 'No valid weather file defined in either the osm or osw.' unless @registry[:wf]
198
-
199
- workflow_json.start
200
-
201
- nil
202
- end
203
- end
1
+ # *******************************************************************************
2
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
+ # All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # (1) Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # (3) Neither the name of the copyright holder nor the names of any contributors
15
+ # may be used to endorse or promote products derived from this software without
16
+ # specific prior written permission from the respective party.
17
+ #
18
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
19
+ # of modifications or other derivative works may not use the "OpenStudio"
20
+ # trademark, "OS", "os", or any other confusingly similar designation without
21
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
+ # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ # *******************************************************************************
35
+
36
+ # Run the initialization job to run validations and initializations
37
+ class RunInitialization < OpenStudio::Workflow::Job
38
+ require 'openstudio/workflow/util'
39
+ include OpenStudio::Workflow::Util::WeatherFile
40
+ include OpenStudio::Workflow::Util::Model
41
+ include OpenStudio::Workflow::Util::Measure
42
+
43
+ def initialize(input_adapter, output_adapter, registry, options = {})
44
+ defaults = {
45
+ verify_osw: true
46
+ }
47
+ options = defaults.merge(options)
48
+ super
49
+ end
50
+
51
+ def perform
52
+ # DLM: why are there multiple loggers running around? there is one in the registry can we just use that?
53
+ @logger.info "Calling #{__method__} in the #{self.class} class"
54
+
55
+ # do not skip initialization if halted
56
+
57
+ # Communicate that the workflow has been started
58
+ @logger.debug 'Registering that the workflow has started with the adapter'
59
+ @output_adapter.communicate_started
60
+
61
+ # Load various files and set basic directories for the registry
62
+ # DLM: this key is the raw JSON object, it is deprecated and should not be used, use :workflow_json instead
63
+ @registry.register(:workflow) { @input_adapter.workflow }
64
+ raise 'Specified workflow was nil' unless @registry[:workflow]
65
+ @logger.debug 'Retrieved the workflow from the adapter'
66
+
67
+ @registry.register(:osw_dir) { @input_adapter.osw_dir }
68
+ @logger.debug "osw_dir is #{@registry[:osw_dir]}"
69
+
70
+ @registry.register(:datapoint) { @input_adapter.datapoint }
71
+ @logger.debug 'Found associated OSD file' if @registry[:datapoint]
72
+
73
+ @registry.register(:analysis) { @input_adapter.analysis }
74
+ @logger.debug 'Found associated OSA file' if @registry[:analysis]
75
+
76
+ # create the real WorkflowJSON here, we will be able to edit this during the run
77
+ if @registry[:openstudio_2]
78
+ workflow_json = OpenStudio::WorkflowJSON.new(JSON.fast_generate(@registry[:workflow]))
79
+ workflow_json.setOswDir(@registry[:osw_dir])
80
+ else
81
+ workflow_json = WorkflowJSON_Shim.new(@registry[:workflow], @registry[:osw_dir])
82
+ end
83
+ @registry.register(:workflow_json) { workflow_json }
84
+
85
+ @registry.register(:root_dir) { workflow_json.absoluteRootDir }
86
+ @logger.debug "The root_dir for the datapoint is #{@registry[:root_dir]}"
87
+
88
+ generated_files_dir = "#{@registry[:root_dir]}/generated_files"
89
+ if File.exist?(generated_files_dir)
90
+ @logger.debug "Removing existing generated files directory: #{generated_files_dir}"
91
+ FileUtils.rm_rf(generated_files_dir)
92
+ end
93
+ @logger.debug "Creating generated files directory: #{generated_files_dir}"
94
+ FileUtils.mkdir_p(generated_files_dir)
95
+
96
+ # insert the generated files directory in the first spot so all generated ExternalFiles go here
97
+ file_paths = @registry[:workflow_json].filePaths
98
+ @registry[:workflow_json].resetFilePaths
99
+ @registry[:workflow_json].addFilePath(generated_files_dir)
100
+ file_paths.each do |file_path|
101
+ @registry[:workflow_json].addFilePath(file_path)
102
+ end
103
+
104
+ reports_dir = "#{@registry[:root_dir]}/reports"
105
+ if File.exist?(reports_dir)
106
+ @logger.debug "Removing existing reports directory: #{reports_dir}"
107
+ FileUtils.rm_rf(reports_dir)
108
+ end
109
+
110
+ # create the runner with our WorkflowJSON
111
+ @registry.register(:runner) { WorkflowRunner.new(@registry[:logger], @registry[:workflow_json], @registry[:openstudio_2]) }
112
+ @registry[:runner].setDatapoint(@registry[:datapoint])
113
+ @registry[:runner].setAnalysis(@registry[:analysis])
114
+ @logger.debug 'Initialized runner'
115
+
116
+ # Validate the OSW measures if the flag is set to true, (the default state)
117
+ if @options[:verify_osw]
118
+ @logger.info 'Attempting to validate the measure workflow'
119
+ validate_measures(@registry, @logger)
120
+ @logger.info 'Validated the measure workflow'
121
+ end
122
+
123
+ # Load or create the seed OSM object
124
+ @logger.debug 'Finding and loading the seed file'
125
+ model_path = workflow_json.seedFile
126
+ if !model_path.empty?
127
+
128
+ model_full_path = workflow_json.findFile(model_path.get)
129
+ if model_full_path.empty?
130
+ raise "Seed model #{model_path.get} specified in OSW cannot be found"
131
+ end
132
+ model_full_path = model_full_path.get
133
+
134
+ if File.extname(model_full_path.to_s) == '.idf'
135
+ @registry.register(:model_idf) { load_idf(model_full_path, @logger) }
136
+ @registry.register(:model) { nil }
137
+ else
138
+ @registry.register(:model) { load_osm(model_full_path, @logger) }
139
+ end
140
+ else
141
+ @registry.register(:model) { OpenStudio::Model::Model.new }
142
+
143
+ # add default objects to the model
144
+ begin
145
+ OpenStudio::Model.initializeModelObjects(@registry[:model])
146
+ rescue NameError
147
+ @registry[:model].getBuilding
148
+ @registry[:model].getFacility
149
+ @registry[:model].getSimulationControl
150
+ @registry[:model].getSizingParameters
151
+ @registry[:model].getTimestep
152
+ @registry[:model].getShadowCalculation
153
+ @registry[:model].getHeatBalanceAlgorithm
154
+ @registry[:model].getRunPeriod
155
+ @registry[:model].getLifeCycleCostParameters
156
+ end
157
+ end
158
+
159
+ if @registry[:openstudio_2]
160
+ if @registry[:model]
161
+ @registry[:model].setWorkflowJSON(workflow_json.clone)
162
+ end
163
+ end
164
+
165
+ # DLM: TODO, load weather_file from options so it can be overriden by user_options
166
+
167
+ # Find the weather file, should it exist and be findable
168
+ @logger.debug 'Getting the initial weather file'
169
+ weather_path = workflow_json.weatherFile
170
+ if weather_path.empty?
171
+ @logger.debug 'No weather file specified in OSW, looking in model'
172
+ if @registry[:model]
173
+ model = @registry[:model]
174
+ unless model.weatherFile.empty?
175
+ weather_path = model.weatherFile.get.path
176
+ end
177
+ end
178
+ end
179
+
180
+ unless weather_path.empty?
181
+ weather_path = weather_path.get
182
+ @logger.debug 'Searching for weather file #{weather_path}'
183
+
184
+ weather_full_path = workflow_json.findFile(weather_path)
185
+ if weather_full_path.empty?
186
+ weather_full_path = workflow_json.findFile(File.basename(weather_path.to_s))
187
+ end
188
+
189
+ if weather_full_path.empty?
190
+ raise "Weather file '#{weather_path}' specified but cannot be found"
191
+ end
192
+ weather_full_path = weather_full_path.get
193
+
194
+ @registry.register(:wf) { weather_full_path.to_s }
195
+
196
+ end
197
+ @logger.warn 'No valid weather file defined in either the osm or osw.' unless @registry[:wf]
198
+
199
+ workflow_json.start
200
+
201
+ nil
202
+ end
203
+ end