openstudio-workflow 1.0.0.pat1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +16 -68
- data/Rakefile +9 -9
- data/bin/openstudio_cli +786 -0
- data/lib/openstudio/workflow/adapters/input/local.rb +97 -0
- data/lib/openstudio/workflow/adapters/output/local.rb +90 -0
- data/lib/openstudio/workflow/adapters/output/socket.rb +70 -0
- data/lib/openstudio/workflow/{jobs/run_preflight/run_preflight.rb → adapters/output/web.rb} +37 -19
- data/lib/openstudio/workflow/{adapter.rb → adapters/output_adapter.rb} +53 -51
- data/lib/openstudio/workflow/job.rb +22 -0
- data/lib/openstudio/workflow/jobs/{run_energyplus → resources}/monthly_report.idf +0 -0
- data/lib/openstudio/workflow/jobs/run_energyplus.rb +49 -0
- data/lib/openstudio/workflow/jobs/run_ep_measures.rb +55 -0
- data/lib/openstudio/workflow/jobs/run_initialization.rb +136 -0
- data/lib/openstudio/workflow/jobs/run_os_measures.rb +59 -0
- data/lib/openstudio/workflow/jobs/run_postprocess.rb +53 -0
- data/lib/openstudio/workflow/jobs/run_preprocess.rb +81 -0
- data/lib/openstudio/workflow/jobs/run_reporting_measures.rb +86 -0
- data/lib/openstudio/workflow/jobs/run_translation.rb +49 -0
- data/lib/openstudio/workflow/multi_delegator.rb +1 -3
- data/lib/openstudio/workflow/registry.rb +137 -0
- data/lib/openstudio/workflow/run.rb +182 -221
- data/lib/openstudio/workflow/time_logger.rb +1 -1
- data/lib/openstudio/workflow/util/energyplus.rb +564 -0
- data/lib/openstudio/workflow/util/io.rb +33 -0
- data/lib/openstudio/workflow/util/measure.rb +520 -0
- data/lib/openstudio/workflow/util/model.rb +100 -0
- data/lib/openstudio/workflow/util/post_process.rb +177 -0
- data/lib/openstudio/workflow/util/weather_file.rb +108 -0
- data/lib/openstudio/workflow/util.rb +14 -0
- data/lib/openstudio/workflow/version.rb +1 -1
- data/lib/openstudio/workflow_json.rb +399 -0
- data/lib/openstudio/workflow_runner.rb +213 -0
- data/lib/openstudio-workflow.rb +13 -118
- metadata +45 -85
- data/lib/openstudio/extended_runner.rb +0 -105
- data/lib/openstudio/workflow/adapters/local.rb +0 -101
- data/lib/openstudio/workflow/adapters/mongo.rb +0 -227
- data/lib/openstudio/workflow/jobs/lib/apply_measures.rb +0 -253
- data/lib/openstudio/workflow/jobs/run_energyplus/run_energyplus.rb +0 -314
- data/lib/openstudio/workflow/jobs/run_openstudio/run_openstudio.rb +0 -230
- data/lib/openstudio/workflow/jobs/run_postprocess/run_postprocess.rb +0 -110
- data/lib/openstudio/workflow/jobs/run_reporting_measures/run_reporting_measures.rb +0 -471
- data/lib/openstudio/workflow/jobs/run_runmanager/run_runmanager.rb +0 -247
- data/lib/openstudio/workflow/jobs/run_xml/run_xml.rb +0 -279
@@ -0,0 +1,97 @@
|
|
1
|
+
######################################################################
|
2
|
+
# Copyright (c) 2008-2014, Alliance for Sustainable Energy.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
######################################################################
|
19
|
+
|
20
|
+
require 'openstudio/workflow_json'
|
21
|
+
|
22
|
+
# Local file based workflow
|
23
|
+
module OpenStudio
|
24
|
+
module Workflow
|
25
|
+
module InputAdapter
|
26
|
+
class Local
|
27
|
+
def initialize(osw_path = './workflow.osw')
|
28
|
+
@osw_abs_path = File.absolute_path(osw_path, Dir.pwd)
|
29
|
+
|
30
|
+
@workflow = if File.exist? @osw_abs_path
|
31
|
+
::JSON.parse(File.read(@osw_abs_path), symbolize_names: true)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the OSW file from the local filesystem
|
36
|
+
#
|
37
|
+
def workflow
|
38
|
+
raise "Could not read workflow from #{@osw_abs_path}" if @workflow.nil?
|
39
|
+
@workflow
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the OSW path
|
43
|
+
#
|
44
|
+
def osw_path
|
45
|
+
@osw_abs_path
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get the OSW dir
|
49
|
+
#
|
50
|
+
def osw_dir
|
51
|
+
File.dirname(@osw_abs_path)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get the run dir
|
55
|
+
#
|
56
|
+
def run_dir
|
57
|
+
result = File.join(osw_dir, 'run')
|
58
|
+
if workflow
|
59
|
+
begin
|
60
|
+
workflow_json = nil
|
61
|
+
begin
|
62
|
+
# Create a temporary WorkflowJSON to compute run directory
|
63
|
+
workflow_json = OpenStudio::WorkflowJSON.new(JSON.fast_generate(workflow))
|
64
|
+
workflow_json.setOswDir(osw_dir)
|
65
|
+
rescue Exception => e
|
66
|
+
workflow_json = WorkflowJSON_Shim.new(workflow, osw_dir)
|
67
|
+
end
|
68
|
+
result = workflow_json.absoluteRunDir.to_s
|
69
|
+
rescue
|
70
|
+
end
|
71
|
+
end
|
72
|
+
result
|
73
|
+
end
|
74
|
+
|
75
|
+
# Get the associated OSD (datapoint) file from the local filesystem
|
76
|
+
#
|
77
|
+
def datapoint
|
78
|
+
# DLM: should this come from the OSW? the osd id and checksum are specified there.
|
79
|
+
osd_abs_path = File.join(osw_dir, 'datapoint.osd')
|
80
|
+
if File.exist? osd_abs_path
|
81
|
+
::JSON.parse(File.read(osd_abs_path), symbolize_names: true)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Get the associated OSA (analysis) definition from the local filesystem
|
86
|
+
#
|
87
|
+
def analysis
|
88
|
+
# DLM: should this come from the OSW? the osd id and checksum are specified there.
|
89
|
+
osa_abs_path = File.join(osw_dir, 'analysis.osa')
|
90
|
+
if File.exist? osa_abs_path
|
91
|
+
::JSON.parse(File.read(osa_abs_path), symbolize_names: true)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
######################################################################
|
2
|
+
# Copyright (c) 2008-2014, Alliance for Sustainable Energy.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
######################################################################
|
19
|
+
|
20
|
+
require 'openstudio/workflow/adapters/output_adapter'
|
21
|
+
|
22
|
+
# Local file based workflow
|
23
|
+
module OpenStudio
|
24
|
+
module Workflow
|
25
|
+
module OutputAdapter
|
26
|
+
class Local < OutputAdapters
|
27
|
+
def initialize(options = {})
|
28
|
+
raise 'The required :output_directory option was not passed to the local output adapter' unless options[:output_directory]
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
# Write to the filesystem that the process has started
|
33
|
+
#
|
34
|
+
def communicate_started
|
35
|
+
File.open("#{@options[:output_directory]}/started.job", 'w') { |f| f << "Started Workflow #{::Time.now}" }
|
36
|
+
end
|
37
|
+
|
38
|
+
# Write to the filesystem that the process has completed
|
39
|
+
#
|
40
|
+
def communicate_complete
|
41
|
+
File.open("#{@options[:output_directory]}/finished.job", 'w') { |f| f << "Finished Workflow #{::Time.now}" }
|
42
|
+
end
|
43
|
+
|
44
|
+
# Write to the filesystem that the process has failed
|
45
|
+
#
|
46
|
+
def communicate_failure
|
47
|
+
File.open("#{@options[:output_directory]}/failed.job", 'w') { |f| f << "Failed Workflow #{::Time.now}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Do nothing on a state transition
|
51
|
+
#
|
52
|
+
def communicate_transition(_ = nil, _ = nil, _ = nil)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Do nothing on EnergyPlus stdout
|
56
|
+
#
|
57
|
+
def communicate_energyplus_stdout(_ = nil, _ = nil)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Write the measure attributes to the filesystem
|
61
|
+
#
|
62
|
+
def communicate_measure_attributes(measure_attributes, _ = nil)
|
63
|
+
File.open("#{@options[:output_directory]}/measure_attributes.json", 'w') do |f|
|
64
|
+
f << JSON.pretty_generate(measure_attributes)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Write the objective function results to the filesystem
|
69
|
+
#
|
70
|
+
def communicate_objective_function(objectives, _ = nil)
|
71
|
+
obj_fun_file = "#{@options[:output_directory]}/objectives.json"
|
72
|
+
FileUtils.rm_f(obj_fun_file) if File.exist?(obj_fun_file)
|
73
|
+
File.open(obj_fun_file, 'w') { |f| f << JSON.pretty_generate(objectives) }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Write the results of the workflow to the filesystem
|
77
|
+
#
|
78
|
+
def communicate_results(directory, results)
|
79
|
+
zip_results(directory)
|
80
|
+
|
81
|
+
if results.is_a? Hash
|
82
|
+
File.open("#{@options[:output_directory]}/data_point_out.json", 'w') { |f| f << JSON.pretty_generate(results) }
|
83
|
+
else
|
84
|
+
puts "Unknown datapoint result type. Please handle #{results.class}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
######################################################################
|
2
|
+
# Copyright (c) 2008-2014, Alliance for Sustainable Energy.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
######################################################################
|
19
|
+
|
20
|
+
require_relative 'local'
|
21
|
+
require 'socket'
|
22
|
+
|
23
|
+
# Local file based workflow
|
24
|
+
module OpenStudio
|
25
|
+
module Workflow
|
26
|
+
module OutputAdapter
|
27
|
+
class Socket < Local
|
28
|
+
def initialize(options = {})
|
29
|
+
super
|
30
|
+
raise 'The required :port option was not passed to the socket output adapter' unless options[:port]
|
31
|
+
|
32
|
+
@socket = TCPSocket.open 'localhost', options[:port]
|
33
|
+
end
|
34
|
+
|
35
|
+
def communicate_started
|
36
|
+
super
|
37
|
+
@socket.write("Started\n")
|
38
|
+
end
|
39
|
+
|
40
|
+
def communicate_results(directory, results)
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
def communicate_complete
|
45
|
+
super
|
46
|
+
@socket.write("Complete\n")
|
47
|
+
end
|
48
|
+
|
49
|
+
def communicate_failure
|
50
|
+
super
|
51
|
+
@socket.write("Failure\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
def communicate_objective_function(objectives, options = {})
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
def communicate_transition(message, type, options = {})
|
59
|
+
super
|
60
|
+
@socket.write(message + "\n")
|
61
|
+
end
|
62
|
+
|
63
|
+
def communicate_energyplus_stdout(line, options = {})
|
64
|
+
super
|
65
|
+
@socket.write(line)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -17,28 +17,46 @@
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
18
|
######################################################################
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
require_relative 'local'
|
21
|
+
|
22
|
+
# Local file based workflow
|
23
|
+
module OpenStudio
|
24
|
+
module Workflow
|
25
|
+
module OutputAdapter
|
26
|
+
class Web < Local
|
27
|
+
def initialize(options = {})
|
28
|
+
super
|
29
|
+
raise 'The required :url option was not passed to the web output adapter' unless options[:url]
|
30
|
+
end
|
31
|
+
|
32
|
+
def communicate_started
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
def communicate_results(directory, results)
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def communicate_complete
|
41
|
+
super
|
42
|
+
end
|
33
43
|
|
34
|
-
|
35
|
-
|
44
|
+
def communicate_failure
|
45
|
+
super
|
46
|
+
end
|
36
47
|
|
37
|
-
|
48
|
+
def communicate_objective_function(objectives, options = {})
|
49
|
+
super
|
50
|
+
end
|
38
51
|
|
39
|
-
|
52
|
+
def communicate_transition(message, type, options = {})
|
53
|
+
super
|
54
|
+
end
|
40
55
|
|
41
|
-
|
42
|
-
|
56
|
+
def communicate_energyplus_stdout(line, options = {})
|
57
|
+
super
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
43
61
|
end
|
44
62
|
end
|
@@ -17,51 +17,46 @@
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
18
|
######################################################################
|
19
19
|
|
20
|
-
# Adapter class to decide where to obtain instructions to run the simulation workflow
|
21
20
|
module OpenStudio
|
22
21
|
module Workflow
|
23
|
-
class
|
22
|
+
# Base class for all output adapters. These methods define the expected return behavior of the adapter instance
|
23
|
+
class OutputAdapters
|
24
24
|
attr_accessor :options
|
25
25
|
|
26
26
|
def initialize(options = {})
|
27
27
|
@options = options
|
28
|
-
@log = nil
|
29
|
-
@datapoint = nil
|
30
28
|
end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
def load(filename, options = {})
|
36
|
-
instance.load(filename, options)
|
30
|
+
def communicate_started
|
31
|
+
instance.communicate_started
|
37
32
|
end
|
38
33
|
|
39
|
-
def
|
40
|
-
instance.
|
34
|
+
def communicate_transition(message, type, options = {})
|
35
|
+
instance.communicate_transition message, type, options
|
41
36
|
end
|
42
37
|
|
43
|
-
def
|
44
|
-
instance.
|
38
|
+
def communicate_energyplus_stdout(line, options = {})
|
39
|
+
instance.communicate_energyplus_stdout line, options
|
45
40
|
end
|
46
41
|
|
47
|
-
def
|
48
|
-
instance.
|
42
|
+
def communicate_measure_attributes(measure_attributes, options = {})
|
43
|
+
instance.communicate_measure_attributes measure_attributes, options
|
49
44
|
end
|
50
45
|
|
51
|
-
def
|
52
|
-
instance.
|
46
|
+
def communicate_objective_function(objectives, options = {})
|
47
|
+
instance.communicate_objective_function objectives, options
|
53
48
|
end
|
54
49
|
|
55
|
-
def
|
56
|
-
instance.
|
50
|
+
def communicate_results(directory, results)
|
51
|
+
instance.communicate_results directory, results
|
57
52
|
end
|
58
53
|
|
59
|
-
def
|
60
|
-
instance.
|
54
|
+
def communicate_complete
|
55
|
+
instance.communicate_complete
|
61
56
|
end
|
62
57
|
|
63
|
-
def
|
64
|
-
instance.
|
58
|
+
def communicate_failure
|
59
|
+
instance.communicate_failure
|
65
60
|
end
|
66
61
|
|
67
62
|
protected
|
@@ -70,11 +65,15 @@ module OpenStudio
|
|
70
65
|
def zip_directory(directory, zip_filename, pattern = '*')
|
71
66
|
# Submethod for adding the directory to the zip folder.
|
72
67
|
def add_directory_to_zip(zip_file, local_directory, root_directory)
|
73
|
-
Dir[File.join(
|
68
|
+
Dir[File.join(local_directory.to_s, '**', '**')].each do |file|
|
74
69
|
# remove the base directory from the zip file
|
75
70
|
rel_dir = local_directory.sub("#{root_directory}/", '')
|
76
|
-
zip_file_to_add = file.gsub(
|
77
|
-
|
71
|
+
zip_file_to_add = file.gsub(local_directory.to_s, rel_dir.to_s)
|
72
|
+
if File.directory?(file)
|
73
|
+
zip_file.addDirectory(file, zip_file_to_add)
|
74
|
+
else
|
75
|
+
zip_file.addFile(file, zip_file_to_add)
|
76
|
+
end
|
78
77
|
end
|
79
78
|
|
80
79
|
zip_file
|
@@ -82,36 +81,38 @@ module OpenStudio
|
|
82
81
|
|
83
82
|
FileUtils.rm_f(zip_filename) if File.exist?(zip_filename)
|
84
83
|
|
85
|
-
|
86
|
-
Zip::File.open(zip_filename, Zip::File::CREATE) do |zf|
|
87
|
-
Dir[File.join(directory, pattern)].each do |file|
|
88
|
-
if File.directory?(file)
|
89
|
-
# skip a few directory that should not be zipped as they are inputs
|
90
|
-
if File.basename(file) =~ /seed|measures|weather/
|
91
|
-
next
|
92
|
-
end
|
93
|
-
# skip x-large directory
|
94
|
-
if File.size?(file)
|
95
|
-
next if File.size?(file) >= 15000000
|
96
|
-
end
|
97
|
-
add_directory_to_zip(zf, file, directory)
|
98
|
-
else
|
99
|
-
next if File.extname(file) =~ /\.rb.*/
|
100
|
-
next if File.extname(file) =~ /\.zip.*/
|
101
|
-
# skip large non-osm/idf files
|
102
|
-
if File.size(file)
|
103
|
-
if File.size(file) >= 15000000
|
104
|
-
next unless File.extname(file) == '.osm' || File.extname(file) == '.idf'
|
105
|
-
end
|
106
|
-
end
|
84
|
+
zf = OpenStudio::ZipFile.new(zip_filename, false)
|
107
85
|
|
108
|
-
|
109
|
-
|
86
|
+
Dir[File.join(directory, pattern)].each do |file|
|
87
|
+
if File.directory?(file)
|
88
|
+
# skip a few directory that should not be zipped as they are inputs
|
89
|
+
if File.basename(file) =~ /seed|measures|weather/
|
90
|
+
next
|
110
91
|
end
|
92
|
+
# skip x-large directory
|
93
|
+
if File.size?(file)
|
94
|
+
next if File.size?(file) >= 15000000
|
95
|
+
end
|
96
|
+
add_directory_to_zip(zf, file, directory)
|
97
|
+
else
|
98
|
+
next if File.extname(file) =~ /\.rb.*/
|
99
|
+
next if File.extname(file) =~ /\.zip.*/
|
100
|
+
# skip large non-osm/idf files
|
101
|
+
if File.size(file)
|
102
|
+
if File.size(file) >= 15000000
|
103
|
+
next unless File.extname(file) == '.osm' || File.extname(file) == '.idf'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
zip_file_to_add = file.gsub("#{directory}/", '')
|
108
|
+
zf.addFile(file, zip_file_to_add)
|
111
109
|
end
|
112
110
|
end
|
113
111
|
|
114
|
-
|
112
|
+
zf = nil
|
113
|
+
GC.start
|
114
|
+
|
115
|
+
File.chmod(0o664, zip_filename)
|
115
116
|
end
|
116
117
|
|
117
118
|
# Main method to zip up the results of the simulation results. This will append the UUID of the data point
|
@@ -120,6 +121,7 @@ module OpenStudio
|
|
120
121
|
#
|
121
122
|
# @param directory [String] The data point directory to zip up.
|
122
123
|
# @return nil
|
124
|
+
#
|
123
125
|
def zip_results(directory)
|
124
126
|
# create zip file using a system call
|
125
127
|
if Dir.exist?(directory) && File.directory?(directory)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module OpenStudio
|
2
|
+
module Workflow
|
3
|
+
class Job
|
4
|
+
def initialize(input_adapter, output_adapter, registry, options = {})
|
5
|
+
@options = options
|
6
|
+
@input_adapter = input_adapter
|
7
|
+
@output_adapter = output_adapter
|
8
|
+
@registry = registry
|
9
|
+
@logger = @registry[:logger]
|
10
|
+
@results = {}
|
11
|
+
|
12
|
+
@logger.debug "#{self.class} passed the following options #{@options}"
|
13
|
+
@logger.debug "#{self.class} passed the following registry #{@registry.to_hash}" if @options[:debug]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.new_class(current_job, input_adapter, output_adapter, registry, options = {})
|
18
|
+
new_job = Object.const_get(current_job).new(input_adapter, output_adapter, registry, options)
|
19
|
+
return new_job
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
File without changes
|
@@ -0,0 +1,49 @@
|
|
1
|
+
######################################################################
|
2
|
+
# Copyright (c) 2008-2014, Alliance for Sustainable Energy.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
######################################################################
|
19
|
+
|
20
|
+
# This class runs the EnergyPlus simulation
|
21
|
+
class RunEnergyPlus < OpenStudio::Workflow::Job
|
22
|
+
require 'openstudio/workflow/util/energyplus'
|
23
|
+
include OpenStudio::Workflow::Util::EnergyPlus
|
24
|
+
|
25
|
+
def initialize(input_adapter, output_adapter, registry, options = {})
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def perform
|
30
|
+
@logger.debug "Calling #{__method__} in the #{self.class} class"
|
31
|
+
|
32
|
+
# Checks and configuration
|
33
|
+
raise 'No run_dir specified in the registry' unless @registry[:run_dir]
|
34
|
+
ep_path = @options[:energyplus_path] ? @options[:energyplus_path] : nil
|
35
|
+
@logger.warn "Using EnergyPlus path specified in options #{ep_path}" if ep_path
|
36
|
+
|
37
|
+
@logger.info 'Starting the EnergyPlus simulation'
|
38
|
+
@registry[:time_logger].start('Running EnergyPlus') if @registry[:time_logger]
|
39
|
+
call_energyplus(@registry[:run_dir], ep_path, @output_adapter, @logger, @registry[:workflow_json])
|
40
|
+
@registry[:time_logger].stop('Running EnergyPlus') if @registry[:time_logger]
|
41
|
+
@logger.info 'Completed the EnergyPlus simulation'
|
42
|
+
|
43
|
+
sql_path = File.join(@registry[:run_dir], 'eplusout.sql')
|
44
|
+
@registry.register(:sql) { sql_path } if File.exist? sql_path
|
45
|
+
@logger.warn "Unable to find sql file at #{sql_path}" unless @registry[:sql]
|
46
|
+
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
######################################################################
|
2
|
+
# Copyright (c) 2008-2014, Alliance for Sustainable Energy.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
######################################################################
|
19
|
+
|
20
|
+
# This class runs all EnergyPlus measures defined in the OSW
|
21
|
+
class RunEnergyPlusMeasures < OpenStudio::Workflow::Job
|
22
|
+
require 'openstudio/workflow/util'
|
23
|
+
include OpenStudio::Workflow::Util::Measure
|
24
|
+
include OpenStudio::Workflow::Util::Model
|
25
|
+
|
26
|
+
def initialize(input_adapter, output_adapter, registry, options = {})
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def perform
|
31
|
+
@logger.debug "Calling #{__method__} in the #{self.class} class"
|
32
|
+
|
33
|
+
# Ensure output_attributes is initialized in the registry
|
34
|
+
@registry.register(:output_attributes) { {} } unless @registry[:output_attributes]
|
35
|
+
|
36
|
+
# Apply the EnergyPlus measures
|
37
|
+
@options[:output_adapter] = @output_adapter
|
38
|
+
@logger.info 'Beginning to execute EnergyPlus measures.'
|
39
|
+
apply_measures('EnergyPlusMeasure'.to_MeasureType, @registry, @options)
|
40
|
+
@logger.info('Finished applying EnergyPlus measures.')
|
41
|
+
|
42
|
+
# Send the measure output attributes to the output adapter
|
43
|
+
@logger.debug 'Communicating measure output attributes to the output adapter'
|
44
|
+
@output_adapter.communicate_measure_attributes @registry[:output_attributes]
|
45
|
+
|
46
|
+
# Save both the OSM and IDF if the :debug option is true
|
47
|
+
return nil unless @options[:debug]
|
48
|
+
@registry[:time_logger].start('Saving IDF') if @registry[:time_logger]
|
49
|
+
idf_name = save_idf(@registry[:model_idf], @registry[:root_dir])
|
50
|
+
@registry[:time_logger].stop('Saving IDF') if @registry[:time_logger]
|
51
|
+
@logger.debug "Saved IDF as #{idf_name}"
|
52
|
+
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
end
|