urbanopt-reopt 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +12 -0
- data/CONTRIBUTING.md +4 -4
- data/Gemfile +13 -6
- data/LICENSE.md +1 -1
- data/RDOC_MAIN.md +10 -10
- data/README.md +61 -10
- data/Rakefile +1 -1
- data/{developer_nrel_key.rb → developer_api_key.rb} +2 -2
- data/doc_templates/LICENSE.md +1 -1
- data/doc_templates/copyright_erb.txt +1 -1
- data/doc_templates/copyright_js.txt +1 -1
- data/doc_templates/copyright_ruby.txt +1 -1
- data/docs/README.md +12 -12
- data/docs/package.json +1 -1
- data/docs/schemas/reopt-input-schema.md +4 -4
- data/docs/schemas/reopt-output-schema.md +5 -5
- data/index.md +10 -10
- data/lib/urbanopt/reopt/extension.rb +1 -1
- data/lib/urbanopt/reopt/feature_report_adapter.rb +27 -17
- data/lib/urbanopt/reopt/{reopt_lite_api.rb → reopt_api.rb} +83 -57
- data/lib/urbanopt/reopt/reopt_ghp_adapter_ghp.rb +563 -0
- data/lib/urbanopt/reopt/reopt_ghp_api.rb +26 -24
- data/lib/urbanopt/reopt/reopt_ghp_files/reopt_ghp_assumption.json +3 -3
- data/lib/urbanopt/reopt/reopt_ghp_post_processor.rb +16 -8
- data/lib/urbanopt/reopt/reopt_ghp_result.rb +145 -0
- data/lib/urbanopt/reopt/reopt_logger.rb +1 -1
- data/lib/urbanopt/reopt/reopt_post_processor.rb +59 -25
- data/lib/urbanopt/reopt/reopt_schema/REopt-BAU-input.json +174 -0
- data/lib/urbanopt/reopt/reopt_schema/REopt-GHP-input.json +263 -95
- data/lib/urbanopt/reopt/scenario/reopt_scenario_csv.rb +1 -1
- data/lib/urbanopt/reopt/scenario_report_adapter.rb +27 -16
- data/lib/urbanopt/reopt/url_config.rb +152 -0
- data/lib/urbanopt/reopt/utilities.rb +18 -1
- data/lib/urbanopt/reopt/version.rb +2 -2
- data/lib/urbanopt/reopt.rb +5 -3
- data/lib/urbanopt/reopt_scenario.rb +1 -1
- data/lib/urbanopt-reopt.rb +1 -1
- data/urbanopt-reopt.gemspec +1 -1
- metadata +10 -7
- data/lib/urbanopt/reopt/reopt_ghp_adapter.rb +0 -337
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56b147451f96d95e26e2ea20dfb9b408b4677dae6ae8d9233008ce7a07f4cb2d
|
|
4
|
+
data.tar.gz: 93660c184fdd2dcdfc20386c7230a96b3627ea38b751f08c8774b440fe4794dd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 502fabf84a4d43b93ba7b91ebe206f55eb7b117b310809592dc5190821bc7e36804feab7bee916b38ee9b7a66781cd23c0db95f8d373b03f68baff96ab9a8f52
|
|
7
|
+
data.tar.gz: 8049c39934e712e76db8d9dd6c4ac54b0c7788bc6f0129ec92cab1d929b15e253f6ff2df51893e995578107a91975e86f742a06a6d145aebd7ba1747c7487059
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# URBANopt REopt Gem
|
|
2
2
|
|
|
3
|
+
## Version 1.3.0
|
|
4
|
+
* Updates for developer.nlr.gov URL change
|
|
5
|
+
* Timeseries shift bug fix
|
|
6
|
+
* Added Domestic Hot Water to baseline load
|
|
7
|
+
|
|
8
|
+
## Version 1.2.0
|
|
9
|
+
|
|
10
|
+
* Updates for name change and license
|
|
11
|
+
* Lifecycle Cost Analysis (LCCA) Functionality for UO-REopt GHP workflow
|
|
12
|
+
* Updates to support system parameters file schema changes
|
|
13
|
+
* Updates to support URBANopt-REopt Cost Analysis capabilities
|
|
14
|
+
|
|
3
15
|
## Version 1.1.0
|
|
4
16
|
|
|
5
17
|
* Upgrade to OpenStudio 3.10
|
data/CONTRIBUTING.md
CHANGED
|
@@ -10,7 +10,7 @@ The contribution process for URBANopt is composed of three steps:
|
|
|
10
10
|
|
|
11
11
|
In order for us to distribute your code as part of URBANopt under the URBANopt SDK [license](https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md), we’ll need your consent. An email acknowledging your understanding of these terms and agreeing to them is all that will be asked of any contributor. Send an email to the URBANopt project manager ([see below](#documentation) for the address) including the following text and a list of co-contributors (if any):
|
|
12
12
|
|
|
13
|
-
*I agree to contribute to the URBANopt SDK. I agree to the following terms and conditions for my contributions: First, I agree that I am licensing the copyright to my contributions under the terms of the current URBANopt SDK license. Second, I hereby grant to Alliance for
|
|
13
|
+
*I agree to contribute to the URBANopt SDK. I agree to the following terms and conditions for my contributions: First, I agree that I am licensing the copyright to my contributions under the terms of the current URBANopt SDK license. Second, I hereby grant to Alliance for Energy Innovation, LLC, to any successor manager and distributor of URBANopt SDK appointed by the U.S. Department of Energy, and to all recipients of a version of URBANopt SDK that includes my contributions, a non-exclusive, worldwide, royalty-free, irrevocable patent license under any patent claims owned by me, or owned by my employer and known to me, that are or will be,necessarily infringed upon by my contributions alone, or by combination of my contributions with the version of URBANopt SDK to which they are contributed, to make, have made, use, offer to sell, sell, import, and otherwise transfer any version of URBANopt SDK that includes my contributions, in source code and object code form. Third, I represent and warrant that I am authorized to make the contributions and grant the foregoing license(s). Additionally, if, to my knowledge, my employer has rights to intellectual property that covers my contributions, I represent and warrant that I have received permission to make these contributions and grant the foregoing license(s) on behalf of my employer.*
|
|
14
14
|
|
|
15
15
|
Once we have your consent on file, you’ll only need to redo it if conditions change (e.g. a change of employer).
|
|
16
16
|
|
|
@@ -50,9 +50,9 @@ For further questions or information:
|
|
|
50
50
|
|
|
51
51
|
- Ben Polly\
|
|
52
52
|
URBANopt Project Management\
|
|
53
|
-
ben.polly@
|
|
53
|
+
ben.polly@nlr.gov\
|
|
54
54
|
(303) 384-7429
|
|
55
55
|
|
|
56
|
-
URBANopt is funded by the U.S. Department of Energy (DOE) and managed by the National
|
|
56
|
+
URBANopt is funded by the U.S. Department of Energy (DOE) and managed by the National Laboratory of the Rockies (NLR).
|
|
57
57
|
|
|
58
|
-
URBANopt is developed in collaboration with
|
|
58
|
+
URBANopt is developed in collaboration with NLR, LBNL, and private firms.
|
data/Gemfile
CHANGED
|
@@ -17,7 +17,7 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
|
|
|
17
17
|
# if allow_local && File.exist?('../OpenStudio-extension-gem')
|
|
18
18
|
# gem 'openstudio-extension', path: '../OpenStudio-extension-gem'
|
|
19
19
|
# elsif allow_local
|
|
20
|
-
# gem 'openstudio-extension', github: '
|
|
20
|
+
# gem 'openstudio-extension', github: 'NatLabRockies/OpenStudio-extension-gem', branch: 'develop'
|
|
21
21
|
# else
|
|
22
22
|
# gem 'openstudio-extension', '~> 0.8.1'
|
|
23
23
|
# end
|
|
@@ -25,7 +25,7 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
|
|
|
25
25
|
# if allow_local && File.exist?('../openstudio-common-measures-gem')
|
|
26
26
|
# gem 'openstudio-common-measures', path: '../openstudio-common-measures-gem'
|
|
27
27
|
# elsif allow_local
|
|
28
|
-
# gem 'openstudio-common-measures', github: '
|
|
28
|
+
# gem 'openstudio-common-measures', github: 'NatLabRockies/openstudio-common-measures-gem', branch: 'develop'
|
|
29
29
|
# else
|
|
30
30
|
# gem 'openstudio-common-measures', '0.12.3'
|
|
31
31
|
# end
|
|
@@ -33,13 +33,13 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
|
|
|
33
33
|
# if allow_local && File.exist?('../urbanopt-core-gem')
|
|
34
34
|
# gem 'urbanopt-core', path: '../urbanopt-core-gem'
|
|
35
35
|
# elsif allow_local
|
|
36
|
-
# gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: '
|
|
36
|
+
# gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'develop'
|
|
37
37
|
# end
|
|
38
38
|
#
|
|
39
39
|
# if allow_local && File.exist?('../openstudio-model-articulation-gem')
|
|
40
40
|
# gem 'openstudio-model-articulation', path: '../openstudio-model-articulation-gem'
|
|
41
41
|
# elsif allow_local
|
|
42
|
-
# gem 'openstudio-model-articulation', github: '
|
|
42
|
+
# gem 'openstudio-model-articulation', github: 'NatLabRockies/openstudio-model-articulation-gem', branch: 'develop'
|
|
43
43
|
# else
|
|
44
44
|
# gem 'openstudio-model-articulation', '0.12.2'
|
|
45
45
|
# end
|
|
@@ -47,11 +47,18 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
|
|
|
47
47
|
# if allow_local && File.exist?('../urbanopt-scenario-gem')
|
|
48
48
|
# gem 'urbanopt-scenario', path: '../urbanopt-scenario-gem'
|
|
49
49
|
# elsif allow_local
|
|
50
|
-
# gem 'urbanopt-scenario', github: 'URBANopt/urbanopt-scenario-gem', branch: '
|
|
50
|
+
# gem 'urbanopt-scenario', github: 'URBANopt/urbanopt-scenario-gem', branch: 'develop'
|
|
51
51
|
# end
|
|
52
52
|
|
|
53
53
|
# if allow_local && File.exist?('../urbanopt-geojson-gem')
|
|
54
54
|
# gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem'
|
|
55
55
|
# elsif allow_local
|
|
56
|
-
# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: '
|
|
56
|
+
# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop'
|
|
57
|
+
# end
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# if allow_local && File.exist?('../urbanopt-geojson-gem')
|
|
61
|
+
# gem 'urbanopt-reporting', path: '../urbanopt-reporting-gem'
|
|
62
|
+
# elsif allow_local
|
|
63
|
+
# gem 'urbanopt-reporting', github: 'URBANopt/urbanopt-reporting-gem', branch: 'develop'
|
|
57
64
|
# end
|
data/LICENSE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
URBANopt (tm), Copyright (c) 2019-
|
|
1
|
+
URBANopt (tm), Copyright (c) 2019-2026, Alliance for Energy Innovation, LLC, and other
|
|
2
2
|
contributors. All rights reserved.
|
|
3
3
|
|
|
4
4
|
Redistribution and use in source and binary forms, with or without modification,
|
data/RDOC_MAIN.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# **URBANopt REopt Gem**
|
|
2
2
|
|
|
3
|
-
The **URBANopt™ REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.
|
|
4
|
-
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.
|
|
3
|
+
The **URBANopt™ REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.nlr.gov/tool) decision support platform.
|
|
4
|
+
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.nlr.gov/docs/energy-optimization/reopt/v2/](https://developer.nlr.gov/docs/energy-optimization/reopt/v2/) for more detailed information on input parameters and default assumptions.
|
|
5
5
|
|
|
6
6
|
See the [example project](https://github.com/urbanopt/urbanopt-example-reopt-project.git) for more infomation about usage of this gem.
|
|
7
7
|
|
|
8
|
-
<b>Note:</b> This module requires an API Key from the [
|
|
8
|
+
<b>Note:</b> This module requires an API Key from the [NLR Developer Network](https://developer.nlr.gov/)
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -83,7 +83,7 @@ Moreover, the following optimal dispatch fields are added to its timeseries CSV.
|
|
|
83
83
|
| ElectricityProduced:Wind:ToGrid | kWh |
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See [https://developer.
|
|
86
|
+
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See [https://developer.nlr.gov/docs/energy-optimization/reopt/v2/](https://developer.nlr.gov/docs/energy-optimization/reopt/v2/) for more detailed information on input parameters and default assumptions.
|
|
87
87
|
|
|
88
88
|
<b>Note:</b> Required attributes for a REopt run include latitude and longitude. If no utility rate is specified in your REopt assumption settings, then a constant default rate of $0.13 is assumed without demand charges. Also, by default, only solar PV and storage are considered in the analysis (i.e. Wind and Generators are excluded from consideration).
|
|
89
89
|
|
|
@@ -110,8 +110,8 @@ timeseries_output_file = File.join(feature_report.directory_name, 'feature_repor
|
|
|
110
110
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
111
111
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
112
112
|
|
|
113
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
114
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil,
|
|
113
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
114
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil, DEVELOPER_API_KEY)
|
|
115
115
|
|
|
116
116
|
#Call REopt with the post processor to update the feature's distributed generation attributes and timeseries CSV.
|
|
117
117
|
updated_feature_report = reopt_post_processor.run_feature_report(feature_report,reopt_assumptions_file,reopt_output_file,timeseries_output_file)
|
|
@@ -145,8 +145,8 @@ end
|
|
|
145
145
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
146
146
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
147
147
|
|
|
148
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
149
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil,
|
|
148
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
149
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil, DEVELOPER_API_KEY)
|
|
150
150
|
|
|
151
151
|
#Call REopt with the post processor once on the sceanrio's aggregated load to update the scenario's distributed generation attributes and timeseries CSV.
|
|
152
152
|
updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_report)
|
|
@@ -157,9 +157,9 @@ updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_repo
|
|
|
157
157
|
|
|
158
158
|
First, check out the repository (i.e. git clone this repo).
|
|
159
159
|
|
|
160
|
-
Next, obtain a developer.
|
|
160
|
+
Next, obtain a developer.nlr.gov API key from the [NLR Developer Network](https://developer.nlr.gov/]). Copy and paste your key in to the _developer_api_key_._rb_ file then save the file:
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
DEVELOPER_API_KEY = '<insert your key here>'
|
|
163
163
|
|
|
164
164
|
Finally, execute:
|
|
165
165
|
|
data/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
[](https://coveralls.io/github/urbanopt/urbanopt-reopt-gem?branch=develop)
|
|
4
4
|
[](https://github.com/urbanopt/urbanopt-reopt-gem/actions/workflows/nightly_ci_build.yml)
|
|
5
5
|
|
|
6
|
-
The **URBANopt<sup>™</sup> REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.
|
|
7
|
-
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.
|
|
6
|
+
The **URBANopt<sup>™</sup> REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.nlr.gov/tool) decision support platform.
|
|
7
|
+
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.nlr.gov/docs/energy-optimization/reopt/v2/](https://developer.nlr.gov/docs/energy-optimization/reopt/v2/) for more detailed information on input parameters and default assumptions.
|
|
8
8
|
|
|
9
9
|
See the [example project](https://github.com/urbanopt/urbanopt-example-geojson-reopt-project) for more infomation about usage of this gem.
|
|
10
10
|
|
|
11
11
|
<b>Note:</b> this module requires an API Key from the
|
|
12
|
-
[
|
|
12
|
+
[NLR Developer Network](https://developer.nlr.gov/)
|
|
13
13
|
|
|
14
14
|
[RDoc Documentation](https://urbanopt.github.io/urbanopt-reopt-gem/)
|
|
15
15
|
|
|
@@ -88,7 +88,7 @@ Moreover, the following optimal dispatch fields are added to its timeseries CSV.
|
|
|
88
88
|
| ElectricityProduced:Wind:ToGrid | kWh |
|
|
89
89
|
|
|
90
90
|
|
|
91
|
-
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See <StaticLink target="\_blank" href="https://developer.
|
|
91
|
+
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See <StaticLink target="\_blank" href="https://developer.nlr.gov/docs/energy-optimization/reopt/v2/">https://developer.nlr.gov/docs/energy-optimization/reopt/v2/</StaticLink> for more detailed information on input parameters and default assumptions.
|
|
92
92
|
|
|
93
93
|
<b>Note:</b> Required attributes for a REopt run include latitude and longitude. If no utility rate is specified in your REopt assumption settings, then a constant default rate of $0.13 is assumed without demand charges. Also, by default, only solar PV and storage are considered in the analysis (i.e. Wind and Generators are excluded from consideration).
|
|
94
94
|
|
|
@@ -115,8 +115,8 @@ timeseries_output_file = File.join(feature_report.directory_name, 'feature_repor
|
|
|
115
115
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
116
116
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
117
117
|
|
|
118
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
119
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil,
|
|
118
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
119
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil, DEVELOPER_API_KEY)
|
|
120
120
|
|
|
121
121
|
#Call REopt with the post processor to update the feature's distributed generation attributes and timeseries CSV.
|
|
122
122
|
updated_feature_report = reopt_post_processor.run_feature_report(feature_report,reopt_assumptions_file,reopt_output_file,timeseries_output_file)
|
|
@@ -149,8 +149,8 @@ end
|
|
|
149
149
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
150
150
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
151
151
|
|
|
152
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
153
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil,
|
|
152
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
153
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil, DEVELOPER_API_KEY)
|
|
154
154
|
|
|
155
155
|
#Call REopt with the post processor once on the sceanrio's aggregated load to update the scenario's distributed generation attributes and timeseries CSV.
|
|
156
156
|
updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_report)
|
|
@@ -161,9 +161,60 @@ updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_repo
|
|
|
161
161
|
|
|
162
162
|
First, check out the repository (i.e. git clone this repo).
|
|
163
163
|
|
|
164
|
-
Next, obtain a developer.
|
|
164
|
+
Next, obtain a developer.nlr.gov API key from the [NLR Developer Network](https://developer.nlr.gov/]). Copy and paste your key in to the _developer_api_key.rb_ file then save the file:
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
DEVELOPER_API_KEY = '<insert your key here>'
|
|
167
|
+
|
|
168
|
+
## Configuration
|
|
169
|
+
|
|
170
|
+
### API Key Setup
|
|
171
|
+
|
|
172
|
+
The gem supports multiple ways to provide your developer API key:
|
|
173
|
+
|
|
174
|
+
1. **Environment Variable (Recommended):**
|
|
175
|
+
```bash
|
|
176
|
+
export GEM_DEVELOPER_KEY=your_api_key_here
|
|
177
|
+
# Then API instances automatically use this key
|
|
178
|
+
api = URBANopt::REopt::REoptAPI.new()
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
2. **Direct Parameter:**
|
|
182
|
+
```ruby
|
|
183
|
+
api = URBANopt::REopt::REoptAPI.new('your_api_key_here')
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
3. **Edit developer_api_key.rb file:**
|
|
187
|
+
```ruby
|
|
188
|
+
DEVELOPER_API_KEY = 'your_api_key_here'
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Environment Variables
|
|
192
|
+
|
|
193
|
+
You can customize the REopt API endpoints using environment variables:
|
|
194
|
+
|
|
195
|
+
- `REOPT_BASE_URL`: Override the default base URL for all REopt API endpoints.
|
|
196
|
+
- Default: `https://developer.nlr.gov/api/reopt/v3`
|
|
197
|
+
- Example: `export REOPT_BASE_URL=https://test.example.com/api/reopt/v3`
|
|
198
|
+
|
|
199
|
+
- `GEM_DEVELOPER_KEY`: Set the developer API key via environment variable instead of editing the source file.
|
|
200
|
+
- Example: `export GEM_DEVELOPER_KEY=your_api_key_here`
|
|
201
|
+
- This automatically becomes available as `DEVELOPER_API_KEY` constant in the code
|
|
202
|
+
|
|
203
|
+
### Localhost Development
|
|
204
|
+
|
|
205
|
+
For development against a local REopt instance, use the `REOPT_BASE_URL` environment variable:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Use localhost (no API key needed)
|
|
209
|
+
export REOPT_BASE_URL=http://127.0.0.1:8000/v3
|
|
210
|
+
|
|
211
|
+
# Then create API instances normally
|
|
212
|
+
api = URBANopt::REopt::REoptAPI.new()
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Note: When using custom URLs via `REOPT_BASE_URL`, API keys are automatically bypassed for non-official endpoints.
|
|
216
|
+
|
|
217
|
+
## Running Tests
|
|
167
218
|
|
|
168
219
|
Finally, execute:
|
|
169
220
|
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# *********************************************************************************
|
|
2
|
-
# URBANopt™, Copyright (c) 2019-
|
|
2
|
+
# URBANopt™, Copyright (c) 2019-2026, Alliance for Energy Innovation, LLC, and other
|
|
3
3
|
# contributors. All rights reserved.
|
|
4
4
|
|
|
5
5
|
# Redistribution and use in source and binary forms, with or without modification,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# *********************************************************************************
|
|
2
|
-
# URBANopt (tm), Copyright (c) Alliance for
|
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Energy Innovation, LLC.
|
|
3
3
|
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
|
4
4
|
# *********************************************************************************
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
DEVELOPER_API_KEY = (ENV['GEM_DEVELOPER_KEY'] || '< your key here https://developer.nlr.gov/signup >')
|
data/doc_templates/LICENSE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
URBANopt (tm), Copyright (c) 2019-
|
|
1
|
+
URBANopt (tm), Copyright (c) 2019-2026, Alliance for Energy Innovation, LLC, and other
|
|
2
2
|
contributors. All rights reserved.
|
|
3
3
|
|
|
4
4
|
Redistribution and use in source and binary forms, with or without modification,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<%
|
|
2
2
|
# *********************************************************************************
|
|
3
|
-
# URBANopt (tm), Copyright (c) 2019-
|
|
3
|
+
# URBANopt (tm), Copyright (c) 2019-2026, Alliance for Energy Innovation, LLC, and other
|
|
4
4
|
# contributors. All rights reserved.
|
|
5
5
|
|
|
6
6
|
# Redistribution and use in source and binary forms, with or without modification,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
# *********************************************************************************
|
|
2
|
-
# URBANopt (tm), Copyright (c) Alliance for
|
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Energy Innovation, LLC.
|
|
3
3
|
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
|
4
4
|
# *********************************************************************************
|
data/docs/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
### <StaticLink target="\_blank" href="rdoc/">Rdocs</StaticLink>
|
|
4
4
|
|
|
5
|
-
The **URBANopt<sup>™</sup> REopt Gem** extends a **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the <StaticLink target="\_blank" href="https://reopt.
|
|
6
|
-
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See <StaticLink target="\_blank" href="https://developer.
|
|
5
|
+
The **URBANopt<sup>™</sup> REopt Gem** extends a **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the <StaticLink target="\_blank" href="https://reopt.nlr.gov/tool">REopt</StaticLink> decision support platform.
|
|
6
|
+
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See <StaticLink target="\_blank" href="https://developer.nlr.gov/docs/energy-optimization/reopt/v2/">https://developer.nlr.gov/docs/energy-optimization/reopt/v2/</StaticLink> for more detailed information on input parameters and default assumptions.
|
|
7
7
|
|
|
8
8
|
The REopt Gem accomplishes three basic functions (described more below in the _Functionality_ section):
|
|
9
9
|
|
|
@@ -20,7 +20,7 @@ Moreover, the REopt Gem can be run in several modes, either on:
|
|
|
20
20
|
|
|
21
21
|
See the <StaticLink target="\_blank" href="https://github.com/urbanopt/urbanopt-example-reopt-project.git">example project</StaticLink> for more infomation about usage of this gem.
|
|
22
22
|
|
|
23
|
-
<b>Note:</b> This module requires an API Key from the <StaticLink target='blank' href="https://developer.
|
|
23
|
+
<b>Note:</b> This module requires an API Key from the <StaticLink target='blank' href="https://developer.nlr.gov/">NLR Developer Network</StaticLink>.
|
|
24
24
|
|
|
25
25
|
<StaticLink target="\_blank" href="https://urbanopt.github.io/urbanopt-reopt-gem/">RDoc Documentation</StaticLink>
|
|
26
26
|
|
|
@@ -99,7 +99,7 @@ Moreover, the following optimal dispatch fields are added to its timeseries CSV.
|
|
|
99
99
|
| ElectricityProduced:Wind:ToGrid | kWh |
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See <StaticLink target="\_blank" href="https://developer.
|
|
102
|
+
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See <StaticLink target="\_blank" href="https://developer.nlr.gov/docs/energy-optimization/reopt/v2/">https://developer.nlr.gov/docs/energy-optimization/reopt/v2/</StaticLink> for more detailed information on input parameters and default assumptions.
|
|
103
103
|
|
|
104
104
|
<b>Note:</b> Required attributes for a REopt run include latitude and longitude, parsed from the Feature or Scenario Report attributes. If no utility rate is specified in your assumptions, then a constant rate of $0.13 is assumed without demand charges. Also, by default, only solar PV and storage are considered in the analysis (i.e. Wind and Generators are excluded from consideration).
|
|
105
105
|
|
|
@@ -112,7 +112,7 @@ The code below shows how to run the REopt API on a single Feature Report hash us
|
|
|
112
112
|
```ruby
|
|
113
113
|
require 'urbanopt/reopt'
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
DEVELOPER_API_KEY = "" # <insert a valid API key from https://developer.nlr.gov/signup >
|
|
116
116
|
|
|
117
117
|
#Load a Feature Report Hash
|
|
118
118
|
feature_reports_hash = {} # <insert a valid Feature Report hash here with latitude and longitude filled in>
|
|
@@ -129,8 +129,8 @@ timeseries_output_file = File.join(feature_report.directory_name, 'feature_repor
|
|
|
129
129
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
130
130
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
131
131
|
|
|
132
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
133
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil,
|
|
132
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
133
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil, DEVELOPER_API_KEY)
|
|
134
134
|
|
|
135
135
|
#Call REopt with the post processor to update the feature's distributed generation attributes and timeseries CSV.
|
|
136
136
|
updated_feature_report = reopt_post_processor.run_feature_report(feature_report,reopt_assumptions_file,reopt_output_file,timeseries_output_file)
|
|
@@ -140,7 +140,7 @@ updated_feature_report = reopt_post_processor.run_feature_report(feature_report,
|
|
|
140
140
|
More commonly, this gem can be used to run REopt a collection of features stored in a Scenario Report as show here:
|
|
141
141
|
```ruby
|
|
142
142
|
require 'urbanopt/reopt'
|
|
143
|
-
|
|
143
|
+
DEVELOPER_API_KEY = "" # <insert a valid API key from https://developer.nlr.gov/signup >
|
|
144
144
|
|
|
145
145
|
#Create a Scenario Report
|
|
146
146
|
scenario_report = URBANopt::Reporting::DefaultReports::ScenarioReport.new({:directory_name => File.join(File.dirname(__FILE__), 'run/example_scenario'), :timeseries_csv => {:path => File.join(File.dirname(__FILE__), 'run/example_scenario/timeseries.csv') }})
|
|
@@ -165,8 +165,8 @@ end
|
|
|
165
165
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
166
166
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), 'files/reopt_assumptions_basic.json')
|
|
167
167
|
|
|
168
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
169
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil,
|
|
168
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
169
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil, DEVELOPER_API_KEY)
|
|
170
170
|
|
|
171
171
|
#Call REopt with the post processor once on the sceanrio's aggregated load to update the scenario's distributed generation attributes and timeseries CSV.
|
|
172
172
|
updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_report)
|
|
@@ -177,9 +177,9 @@ updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_repo
|
|
|
177
177
|
|
|
178
178
|
First, check out the repository (i.e. git clone this repo).
|
|
179
179
|
|
|
180
|
-
Next, obtain a developer.
|
|
180
|
+
Next, obtain a developer.nlr.gov API key from the [NLR Developer Network](https://developer.nlr.gov/]). Copy and paste your key in to the _developer_api_key_._rb_ file then save the file:
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
DEVELOPER_API_KEY = '<insert your key here>'
|
|
183
183
|
|
|
184
184
|
Finally, execute:
|
|
185
185
|
|
data/docs/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# REopt
|
|
1
|
+
# REopt Inputs Schema
|
|
2
2
|
|
|
3
|
-
The following shows the complete set of inputs to the REopt
|
|
3
|
+
The following shows the complete set of inputs to the REopt API which is called internally by the REopt Gem. You may refer to the data dictionary below in creating similarly formatted .json files containing alternatives to the defaults for optional parameters (i.e. specific utility rate, installed cost assumptions, solar PV losses, ...). The URBANopt REopt Gem will overwrite latitude, longitude, land_acres, roof_squarefeet, and loads_kw where possible from attributes of a Scenario Report and FeatureReports.
|
|
4
4
|
|
|
5
5
|
## Data Dictionary
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ The following shows the complete set of inputs to the REopt Lite AP which is cal
|
|
|
8
8
|
|
|
9
9
|
## Required Inputs
|
|
10
10
|
|
|
11
|
-
The only required parameters to the REopt
|
|
11
|
+
The only required parameters to the REopt API (called internally by the gem) are:
|
|
12
12
|
- *latitude*
|
|
13
13
|
- *longitude*
|
|
14
14
|
- *urdb_response* OR one of the following sets:
|
|
@@ -24,7 +24,7 @@ The only required parameters to the REopt Lite API (called internally by the gem
|
|
|
24
24
|
|
|
25
25
|
The gem sources *latitude*, *longitude* and *loads_kw* from a Feature or Scenario Report directly. If no specific *urdb_response* or *urdb_label* is specified as an custom assumption (see below), then a constant rate of $0.13/kWh with no demand charge is provided by the gem as a default to the REopt API.
|
|
26
26
|
|
|
27
|
-
Otherwise, all non-required input parameters will be filled in with default values unless otherwise specified. For an example of a minimally viable REopt
|
|
27
|
+
Otherwise, all non-required input parameters will be filled in with default values unless otherwise specified. For an example of a minimally viable REopt input, see:
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# REopt
|
|
1
|
+
# REopt Outputs Schema
|
|
2
2
|
|
|
3
|
-
When the gem calls the REopt
|
|
3
|
+
When the gem calls the REopt API it receives the following complete set of results described in the data dictionary below. Only those needed to update a Feature or Scenario Report's distributed_generation attribute set and timeseries CSV are pulled from the response and transferred to the Feature or Scenario Report. You may choose to modify the code to include more or less of the full REopt response.
|
|
4
4
|
|
|
5
5
|
## Data Dictionary
|
|
6
6
|
<ReoptOutputSchema />
|
|
@@ -8,7 +8,7 @@ When the gem calls the REopt Lite APUI it receives the following complete set of
|
|
|
8
8
|
## Updated from the Data Dictionary
|
|
9
9
|
|
|
10
10
|
### Distributed Generation Attributes
|
|
11
|
-
The REopt
|
|
11
|
+
The REopt API updates the distributed_generation attributes of a Scenario or Feature Report as shown in an example below.
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
"distributed_generation": {
|
|
@@ -35,7 +35,7 @@ The REopt Lite API updates the distributed_generation attributes of a Scenario o
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### Timeseries CSV
|
|
38
|
-
REopt
|
|
38
|
+
REopt API responses also map dispatches to the following columns in an updated timeseries CSV for a Feature or Scenario Report.
|
|
39
39
|
|
|
40
40
|
| output | unit |
|
|
41
41
|
| -----------------------------------------| ------- |
|
|
@@ -62,5 +62,5 @@ REopt Lite API responses also map dispatches to the following columns in an upda
|
|
|
62
62
|
<style type="text/css">
|
|
63
63
|
.content { max-width: 1200px !important; }
|
|
64
64
|
span.default { color: yellow !important; }
|
|
65
|
-
.description { color: #E0E0E0
|
|
65
|
+
.description { color: #E0E0E0 !important; }
|
|
66
66
|
</style>
|
data/index.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# **URBANopt REopt Gem**
|
|
2
2
|
|
|
3
|
-
The **URBANopt<sup>™</sup> REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.
|
|
4
|
-
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.
|
|
3
|
+
The **URBANopt<sup>™</sup> REopt Gem** extends **URBANopt::Reporting::DefaultReports::ScenarioReport** and **URBANopt::Reporting::DefaultReports::FeatureReport** with the ability to derive cost-optimal distributed energy resource (DER) technology sizes and annual dispatch strageties via the [REopt](https://reopt.nlr.gov/tool) decision support platform.
|
|
4
|
+
REopt is a technoeconomic model which leverages mixed integer linear programming to identify the cost-optimal sizing of solar PV, Wind, Storage and/or diesel generation given an electric load profile, a utility rate tariff and other technoeconomic parameters. See [https://developer.nlr.gov/docs/energy-optimization/reopt/v2/](https://developer.nlr.gov/docs/energy-optimization/reopt/v2/) for more detailed information on input parameters and default assumptions.
|
|
5
5
|
|
|
6
6
|
See the [example project](https://github.com/urbanopt/urbanopt-example-reopt-project.git) for more infomation about usage of this gem.
|
|
7
7
|
|
|
8
|
-
<b>Note:</b> This module requires an API Key from the [
|
|
8
|
+
<b>Note:</b> This module requires an API Key from the [NLR Developer Network](https://developer.nlr.gov/)
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -83,7 +83,7 @@ Moreover, the following optimal dispatch fields are added to its timeseries CSV.
|
|
|
83
83
|
| ElectricityProduced:Wind:ToGrid | kWh |
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See [https://developer
|
|
86
|
+
The REopt has default values for all non-required input parameters that are used unless the user specifies custom assumptions. See [https://developer..gov/docs/energy-optimization/reopt/v3/](https://developer.nlr.gov/docs/energy-optimization/reopt/v3/) for more detailed information on input parameters and default assumptions.
|
|
87
87
|
|
|
88
88
|
<b>Note:</b> Required attributes for a REopt run include latitude and longitude. If no utility rate is specified in your REopt assumption settings, then a constant default rate of $0.13 is assumed without demand charges. Also, by default, only solar PV and storage are considered in the analysis (i.e. Wind and Generators are excluded from consideration).
|
|
89
89
|
|
|
@@ -110,8 +110,8 @@ timeseries_output_file = File.join(feature_report.directory_name, 'feature_repor
|
|
|
110
110
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
111
111
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
112
112
|
|
|
113
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
114
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil,
|
|
113
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
114
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(nil, nil, nil, DEVELOPER_API_KEY)
|
|
115
115
|
|
|
116
116
|
#Call REopt with the post processor to update the feature's distributed generation attributes and timeseries CSV.
|
|
117
117
|
updated_feature_report = reopt_post_processor.run_feature_report(feature_report,reopt_assumptions_file,reopt_output_file,timeseries_output_file)
|
|
@@ -145,8 +145,8 @@ end
|
|
|
145
145
|
#Specify non-default REopt assumptions, saved in JSON format, to be used in calling the API
|
|
146
146
|
reopt_assumptions_file = File.join(File.dirname(__FILE__), '../files/reopt_assumptions_basic.json')
|
|
147
147
|
|
|
148
|
-
#Create a REopt Post Processor to call the API, note you will need a Developer.
|
|
149
|
-
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil,
|
|
148
|
+
#Create a REopt Post Processor to call the API, note you will need a Developer.nlr.gov API key in this step
|
|
149
|
+
reopt_post_processor = URBANopt::REopt::REoptPostProcessor.new(scenario_report, reopt_assumptions_file, nil, DEVELOPER_API_KEY)
|
|
150
150
|
|
|
151
151
|
#Call REopt with the post processor once on the sceanrio's aggregated load to update the scenario's distributed generation attributes and timeseries CSV.
|
|
152
152
|
updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_report)
|
|
@@ -157,9 +157,9 @@ updated_scenario_report = reopt_post_processor.run_scenario_report(scenario_repo
|
|
|
157
157
|
|
|
158
158
|
First, check out the repository (i.e. git clone this repo).
|
|
159
159
|
|
|
160
|
-
Next, obtain a developer.
|
|
160
|
+
Next, obtain a developer.nlr.gov API key from the [NLR Developer Network](https://developer.nlr.gov/]). Copy and paste your key in to the _developer_api_key_._rb_ file then save the file:
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
DEVELOPER_API_KEY = '<insert your key here>'
|
|
163
163
|
|
|
164
164
|
Finally, execute:
|
|
165
165
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# *********************************************************************************
|
|
2
|
-
# URBANopt (tm), Copyright (c) Alliance for
|
|
2
|
+
# URBANopt (tm), Copyright (c) Alliance for Energy Innovation, LLC.
|
|
3
3
|
# See also https://github.com/urbanopt/urbanopt-reopt-gem/blob/develop/LICENSE.md
|
|
4
4
|
# *********************************************************************************
|
|
5
5
|
|