urbanopt-reopt 0.8.0 → 0.10.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.
- checksums.yaml +4 -4
- data/.github/workflows/nightly_ci_build.yml +35 -0
- data/CHANGELOG.md +24 -7
- data/Gemfile +1 -1
- data/LICENSE.md +26 -11
- data/RDOC_MAIN.md +2 -2
- data/README.md +5 -2
- data/developer_nrel_key.rb +2 -27
- data/doc_templates/LICENSE.md +26 -11
- data/doc_templates/copyright_erb.txt +32 -16
- data/doc_templates/copyright_js.txt +2 -2
- data/doc_templates/copyright_ruby.txt +2 -27
- data/docs/README.md +2 -2
- data/docs/package-lock.json +23 -41
- data/index.md +2 -2
- data/lib/urbanopt/reopt/extension.rb +2 -27
- data/lib/urbanopt/reopt/feature_report_adapter.rb +2 -27
- data/lib/urbanopt/reopt/reopt_lite_api.rb +22 -43
- data/lib/urbanopt/reopt/reopt_logger.rb +5 -27
- data/lib/urbanopt/reopt/reopt_post_processor.rb +7 -35
- data/lib/urbanopt/reopt/reopt_schema/reopt_input_schema.json +1 -2
- data/lib/urbanopt/reopt/scenario/reopt_scenario_csv.rb +2 -27
- data/lib/urbanopt/reopt/scenario_report_adapter.rb +27 -55
- data/lib/urbanopt/reopt/utilities.rb +2 -27
- data/lib/urbanopt/reopt/version.rb +3 -28
- data/lib/urbanopt/reopt.rb +2 -27
- data/lib/urbanopt/reopt_scenario.rb +2 -27
- data/lib/urbanopt-reopt.rb +2 -27
- data/urbanopt-reopt.gemspec +4 -3
- metadata +30 -15
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'urbanopt/reporting/default_reports'
|
@@ -1,37 +1,11 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'net/https'
|
32
7
|
require 'openssl'
|
33
8
|
require 'uri'
|
34
|
-
require 'uri'
|
35
9
|
require 'json'
|
36
10
|
require 'securerandom'
|
37
11
|
require 'certified'
|
@@ -55,8 +29,8 @@ module URBANopt # :nodoc:
|
|
55
29
|
def initialize(nrel_developer_key = nil, use_localhost = false)
|
56
30
|
@use_localhost = use_localhost
|
57
31
|
if @use_localhost
|
58
|
-
@uri_submit = URI.parse('http//:127.0.0.1:8000/
|
59
|
-
@uri_submit_outagesimjob = URI.parse('http//:127.0.0.1:8000/
|
32
|
+
@uri_submit = URI.parse('http//:127.0.0.1:8000/v2/job/')
|
33
|
+
@uri_submit_outagesimjob = URI.parse('http//:127.0.0.1:8000/v2/outagesimjob/')
|
60
34
|
else
|
61
35
|
if [nil, '', '<insert your key here>'].include? nrel_developer_key
|
62
36
|
if [nil, '', '<insert your key here>'].include? DEVELOPER_NREL_KEY
|
@@ -66,8 +40,8 @@ module URBANopt # :nodoc:
|
|
66
40
|
end
|
67
41
|
end
|
68
42
|
@nrel_developer_key = nrel_developer_key
|
69
|
-
@uri_submit = URI.parse("https://developer.nrel.gov/api/reopt/
|
70
|
-
@uri_submit_outagesimjob = URI.parse("https://developer.nrel.gov/api/reopt/
|
43
|
+
@uri_submit = URI.parse("https://developer.nrel.gov/api/reopt/v2/job?api_key=#{@nrel_developer_key}")
|
44
|
+
@uri_submit_outagesimjob = URI.parse("https://developer.nrel.gov/api/reopt/v2/outagesimjob?api_key=#{@nrel_developer_key}")
|
71
45
|
# initialize @@logger
|
72
46
|
@@logger ||= URBANopt::REopt.reopt_logger
|
73
47
|
end
|
@@ -85,10 +59,10 @@ module URBANopt # :nodoc:
|
|
85
59
|
##
|
86
60
|
def uri_results(run_uuid) # :nodoc:
|
87
61
|
if @use_localhost
|
88
|
-
return URI.parse("http://127.0.0.1:8000/
|
62
|
+
return URI.parse("http://127.0.0.1:8000/v2/job/#{run_uuid}/results")
|
89
63
|
end
|
90
64
|
|
91
|
-
return URI.parse("https://developer.nrel.gov/api/reopt/
|
65
|
+
return URI.parse("https://developer.nrel.gov/api/reopt/v2/job/#{run_uuid}/results?api_key=#{@nrel_developer_key}")
|
92
66
|
end
|
93
67
|
|
94
68
|
##
|
@@ -103,26 +77,31 @@ module URBANopt # :nodoc:
|
|
103
77
|
##
|
104
78
|
def uri_resilience(run_uuid) # :nodoc:
|
105
79
|
if @use_localhost
|
106
|
-
return URI.parse("http://127.0.0.1:8000/
|
80
|
+
return URI.parse("http://127.0.0.1:8000/v2/job/#{run_uuid}/resilience_stats")
|
107
81
|
end
|
108
82
|
|
109
|
-
return URI.parse("https://developer.nrel.gov/api/reopt/
|
83
|
+
return URI.parse("https://developer.nrel.gov/api/reopt/v2/job/#{run_uuid}/resilience_stats?api_key=#{@nrel_developer_key}")
|
110
84
|
end
|
111
85
|
|
112
|
-
def make_request(http,
|
86
|
+
def make_request(http, req, max_tries = 3)
|
113
87
|
result = nil
|
114
88
|
tries = 0
|
115
89
|
while tries < max_tries
|
116
90
|
begin
|
117
|
-
result = http.request(
|
91
|
+
result = http.request(req)
|
118
92
|
# Result codes sourced from https://developer.nrel.gov/docs/errors/
|
119
93
|
if result.code == '429'
|
120
94
|
@@logger.fatal('Exceeded the REopt-Lite API limit of 300 requests per hour')
|
121
95
|
puts 'Using the URBANopt CLI to submit a Scenario optimization counts as one request per scenario'
|
122
96
|
puts 'Using the URBANopt CLI to submit a Feature optimization counts as one request per feature'
|
123
97
|
abort('Please wait and try again once the time period has elapsed. The URBANopt CLI flag --reopt-keep-existing can be used to resume the optimization')
|
98
|
+
elsif result.code == '404'
|
99
|
+
@@logger.info("REOpt is still calculating. We'll give it a moment and check again")
|
100
|
+
sleep 15
|
101
|
+
tries += 1
|
102
|
+
next
|
124
103
|
elsif (result.code != '201') && (result.code != '200') # Anything in the 200s is success
|
125
|
-
@@logger.
|
104
|
+
@@logger.warn("REopt-Lite has returned a '#{result.code}' status code. Visit https://developer.nrel.gov/docs/errors/ for more status code information")
|
126
105
|
# display error messages
|
127
106
|
json_res = JSON.parse(result.body, allow_nan: true)
|
128
107
|
json_res['messages'].delete('warnings') if json_res['messages']['warnings']
|
@@ -341,10 +320,10 @@ module URBANopt # :nodoc:
|
|
341
320
|
sleep 5
|
342
321
|
end
|
343
322
|
|
344
|
-
|
345
|
-
|
323
|
+
max_retry = 5
|
324
|
+
tries = 0
|
346
325
|
(check_complete = sizes == 0) && ((data['outputs']['Scenario']['Site']['Financial']['npv_us_dollars'] || 0) > 0)
|
347
|
-
while (
|
326
|
+
while (tries < max_retry) && check_complete
|
348
327
|
sleep 3
|
349
328
|
response = make_request(http, get_request)
|
350
329
|
data = JSON.parse(response.body, allow_nan: true)
|
@@ -358,7 +337,7 @@ module URBANopt # :nodoc:
|
|
358
337
|
end
|
359
338
|
sizes = pv_sizes + (data['outputs']['Scenario']['Site']['Storage']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0)
|
360
339
|
(check_complete = sizes == 0) && ((data['outputs']['Scenario']['Site']['Financial']['npv_us_dollars'] || 0) > 0)
|
361
|
-
|
340
|
+
tries += 1
|
362
341
|
end
|
363
342
|
|
364
343
|
data = JSON.parse(response.body, allow_nan: true)
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'logger'
|
@@ -33,6 +8,9 @@ require 'logger'
|
|
33
8
|
module URBANopt
|
34
9
|
module REopt
|
35
10
|
@@reopt_logger = Logger.new($stdout)
|
11
|
+
|
12
|
+
# Set Logger::DEBUG for development
|
13
|
+
@@reopt_logger.level = Logger::WARN
|
36
14
|
##
|
37
15
|
# Definining class variable "@@logger" to log errors, info and warning messages.
|
38
16
|
def self.reopt_logger
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'bundler/setup'
|
@@ -83,9 +58,6 @@ module URBANopt # :nodoc:
|
|
83
58
|
@@logger.info("Created directory: #{File.join(fr.directory_name, 'reopt')}")
|
84
59
|
end
|
85
60
|
@feature_reports_reopt_default_output_files << File.join(fr.directory_name, "reopt/feature_report_#{fr.id}_reopt_run.json")
|
86
|
-
end
|
87
|
-
|
88
|
-
@scenario_report.feature_reports.each do |fr|
|
89
61
|
@feature_reports_timeseries_default_output_files << File.join(fr.directory_name, "feature_report_#{fr.id}_timeseries.csv")
|
90
62
|
end
|
91
63
|
end
|
@@ -129,13 +101,13 @@ module URBANopt # :nodoc:
|
|
129
101
|
reopt_output_file = File.join(feature_report.directory_name, 'reopt')
|
130
102
|
end
|
131
103
|
reopt_output = api.reopt_request(reopt_input, reopt_output_file)
|
132
|
-
|
104
|
+
@@logger.debug("REOpt output file: #{reopt_output_file}")
|
133
105
|
if run_resilience
|
134
106
|
run_uuid = reopt_output['outputs']['Scenario']['run_uuid']
|
135
107
|
if File.directory? reopt_output_file
|
136
108
|
resilience_stats = api.resilience_request(run_uuid, reopt_output_file)
|
137
109
|
else
|
138
|
-
resilience_stats = api.resilience_request(run_uuid, reopt_output_file.sub
|
110
|
+
resilience_stats = api.resilience_request(run_uuid, reopt_output_file.sub('.json', '_resilience.json'))
|
139
111
|
end
|
140
112
|
else
|
141
113
|
resilience_stats = nil
|
@@ -160,7 +132,7 @@ module URBANopt # :nodoc:
|
|
160
132
|
#
|
161
133
|
# [*return:*] _URBANopt::Scenario::DefaultReports::ScenarioReport_ Returns an updated ScenarioReport
|
162
134
|
def run_scenario_report(scenario_report:, reopt_assumptions_hash: nil, reopt_output_file: nil, timeseries_csv_path: nil, save_name: nil, run_resilience: true, community_photovoltaic: nil)
|
163
|
-
puts
|
135
|
+
puts 'run scenario report'
|
164
136
|
@save_assumptions_filepath = false
|
165
137
|
if !reopt_assumptions_hash.nil?
|
166
138
|
@scenario_reopt_default_assumptions_hash = reopt_assumptions_hash
|
@@ -185,7 +157,7 @@ module URBANopt # :nodoc:
|
|
185
157
|
if File.directory? @scenario_reopt_default_output_file
|
186
158
|
resilience_stats = api.resilience_request(run_uuid, @scenario_reopt_default_output_file)
|
187
159
|
else
|
188
|
-
resilience_stats = api.resilience_request(run_uuid, @scenario_reopt_default_output_file.sub
|
160
|
+
resilience_stats = api.resilience_request(run_uuid, @scenario_reopt_default_output_file.sub('.json', '_resilience.json'))
|
189
161
|
end
|
190
162
|
else
|
191
163
|
resilience_stats = nil
|
@@ -254,7 +226,7 @@ module URBANopt # :nodoc:
|
|
254
226
|
if File.directory? @feature_reports_reopt_default_output_files[idx]
|
255
227
|
resilience_stats = api.resilience_request(run_uuid, @feature_reports_reopt_default_output_files[idx])
|
256
228
|
else
|
257
|
-
resilience_stats = api.resilience_request(run_uuid, @feature_reports_reopt_default_output_files[idx].sub
|
229
|
+
resilience_stats = api.resilience_request(run_uuid, @feature_reports_reopt_default_output_files[idx].sub('.json', '_resilience.json'))
|
258
230
|
end
|
259
231
|
else
|
260
232
|
resilience_stats = nil
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'urbanopt/scenario/scenario_base'
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'urbanopt/reporting/default_reports'
|
@@ -75,7 +50,7 @@ module URBANopt # :nodoc:
|
|
75
50
|
lats = []
|
76
51
|
longs = []
|
77
52
|
scenario_report.feature_reports.each do |x|
|
78
|
-
@@logger.
|
53
|
+
@@logger.debug("Latitude '#{x.location.latitude_deg}' in feature report but not in scenario report. Adding it now.")
|
79
54
|
if ![nil].include?(x.location.latitude_deg) && ![nil].include?(x.location.longitude_deg)
|
80
55
|
lats.push(x.location.latitude_deg)
|
81
56
|
longs.push(x.location.longitude_deg)
|
@@ -190,6 +165,29 @@ module URBANopt # :nodoc:
|
|
190
165
|
return results
|
191
166
|
end
|
192
167
|
|
168
|
+
def modrow(data, idx) # :nodoc:
|
169
|
+
data[$generation_timeseries_kwh_col] = $generation_timeseries_kwh[idx] || 0
|
170
|
+
data[$load_col] = $load[idx] || 0
|
171
|
+
data[$utility_to_load_col] = $utility_to_load[idx] || 0
|
172
|
+
data[$utility_to_battery_col] = $utility_to_battery[idx] || 0
|
173
|
+
data[$storage_to_load_col] = $storage_to_load[idx] || 0
|
174
|
+
data[$storage_to_grid_col] = $storage_to_grid[idx] || 0
|
175
|
+
data[$storage_soc_col] = $storage_soc[idx] || 0
|
176
|
+
data[$generator_total_col] = $generator_total[idx] || 0
|
177
|
+
data[$generator_to_battery_col] = $generator_to_battery[idx] || 0
|
178
|
+
data[$generator_to_load_col] = $generator_to_load[idx] || 0
|
179
|
+
data[$generator_to_grid_col] = $generator_to_grid[idx] || 0
|
180
|
+
data[$pv_total_col] = $pv_total[idx] || 0
|
181
|
+
data[$pv_to_battery_col] = $pv_to_battery[idx] || 0
|
182
|
+
data[$pv_to_load_col] = $pv_to_load[idx] || 0
|
183
|
+
data[$pv_to_grid_col] = $pv_to_grid[idx] || 0
|
184
|
+
data[$wind_total_col] = $wind_total[idx] || 0
|
185
|
+
data[$wind_to_battery_col] = $wind_to_battery[idx] || 0
|
186
|
+
data[$wind_to_load_col] = $wind_to_load[idx] || 0
|
187
|
+
data[$wind_to_grid_col] = $wind_to_grid[idx] || 0
|
188
|
+
return data
|
189
|
+
end
|
190
|
+
|
193
191
|
##
|
194
192
|
# Updates a ScenarioReport from a \REopt Lite response
|
195
193
|
#
|
@@ -282,9 +280,6 @@ module URBANopt # :nodoc:
|
|
282
280
|
module_type[pv['pv_name']] = pv_inputs[i]['module_type']
|
283
281
|
end
|
284
282
|
end
|
285
|
-
end
|
286
|
-
|
287
|
-
pv_outputs.each_with_index do |pv, i|
|
288
283
|
scenario_report.distributed_generation.add_tech 'solar_pv', URBANopt::Reporting::DefaultReports::SolarPV.new({ size_kw: (pv['size_kw'] || 0), id: i, location: location[pv['pv_name']], average_yearly_energy_produced_kwh: pv['average_yearly_energy_produced_kwh'], azimuth: azimuth[pv['pv_name']], tilt: tilt[pv['pv_name']], module_type: module_type[pv['pv_name']], gcr: gcr[pv['pv_name']] })
|
289
284
|
end
|
290
285
|
|
@@ -475,36 +470,13 @@ module URBANopt # :nodoc:
|
|
475
470
|
scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToGrid(kw)')
|
476
471
|
end
|
477
472
|
|
478
|
-
def modrow(x, i) # :nodoc:
|
479
|
-
x[$generation_timeseries_kwh_col] = $generation_timeseries_kwh[i] || 0
|
480
|
-
x[$load_col] = $load[i] || 0
|
481
|
-
x[$utility_to_load_col] = $utility_to_load[i] || 0
|
482
|
-
x[$utility_to_battery_col] = $utility_to_battery[i] || 0
|
483
|
-
x[$storage_to_load_col] = $storage_to_load[i] || 0
|
484
|
-
x[$storage_to_grid_col] = $storage_to_grid[i] || 0
|
485
|
-
x[$storage_soc_col] = $storage_soc[i] || 0
|
486
|
-
x[$generator_total_col] = $generator_total[i] || 0
|
487
|
-
x[$generator_to_battery_col] = $generator_to_battery[i] || 0
|
488
|
-
x[$generator_to_load_col] = $generator_to_load[i] || 0
|
489
|
-
x[$generator_to_grid_col] = $generator_to_grid[i] || 0
|
490
|
-
x[$pv_total_col] = $pv_total[i] || 0
|
491
|
-
x[$pv_to_battery_col] = $pv_to_battery[i] || 0
|
492
|
-
x[$pv_to_load_col] = $pv_to_load[i] || 0
|
493
|
-
x[$pv_to_grid_col] = $pv_to_grid[i] || 0
|
494
|
-
x[$wind_total_col] = $wind_total[i] || 0
|
495
|
-
x[$wind_to_battery_col] = $wind_to_battery[i] || 0
|
496
|
-
x[$wind_to_load_col] = $wind_to_load[i] || 0
|
497
|
-
x[$wind_to_grid_col] = $wind_to_grid[i] || 0
|
498
|
-
return x
|
499
|
-
end
|
500
|
-
|
501
473
|
old_data = CSV.open(scenario_report.timeseries_csv.path).read
|
502
474
|
start_date = Time.parse(old_data[1][0]) # Time is the end of the timestep
|
503
475
|
start_ts = (
|
504
476
|
(
|
505
477
|
((start_date.yday - 1) * 60.0 * 60.0 * 24) +
|
506
478
|
((start_date.hour - 1) * 60.0 * 60.0) +
|
507
|
-
(start_date.min * 60.0) + start_date.sec) /
|
479
|
+
(start_date.min * 60.0) + start_date.sec) / \
|
508
480
|
((60 / scenario_report.timesteps_per_hour) * 60)
|
509
481
|
).to_int
|
510
482
|
mod_data = old_data.map.with_index do |x, i|
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
def convert_powerflow_resolution(timeseries_kw, original_res, destination_res)
|
@@ -1,35 +1,10 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
module URBANopt # :nodoc:
|
32
7
|
module REopt # :nodoc:
|
33
|
-
VERSION = '0.
|
8
|
+
VERSION = '0.10.0'.freeze
|
34
9
|
end
|
35
10
|
end
|
data/lib/urbanopt/reopt.rb
CHANGED
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'urbanopt/reopt/extension'
|
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require 'urbanopt/reopt/scenario/reopt_scenario_csv'
|
data/lib/urbanopt-reopt.rb
CHANGED
@@ -1,31 +1,6 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
-
# are permitted provided that the following conditions are met:
|
7
|
-
#
|
8
|
-
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
-
# of conditions and the following disclaimer.
|
10
|
-
#
|
11
|
-
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
-
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
-
# materials provided with the distribution.
|
14
|
-
#
|
15
|
-
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
-
# used to endorse or promote products derived from this software without specific
|
17
|
-
# prior written permission.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
-
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
24
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26
|
-
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
|
-
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
|
-
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
|
3
|
+
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
29
4
|
# *********************************************************************************
|
30
5
|
|
31
6
|
require_relative 'urbanopt/reopt'
|