Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
eb294df
Temp change to REopt#after-tax-savings branch
Bill-Becker Feb 18, 2025
f8cbff8
Add new after tax fuel cost and other model fields
Bill-Becker Feb 19, 2025
6deb3c5
Avoid lifecycle_capital_cost GHP test discrepancy from it now includi…
Bill-Becker Feb 19, 2025
7a9439d
Add after-tax fuel cost for Generator
Bill-Becker Feb 19, 2025
d8799f3
Convert monthly_fraction to expected type in /simulated_load
Bill-Becker Feb 21, 2025
761bc99
Remove deprecated version in docker-compose.yml file
Bill-Becker Feb 21, 2025
bba9e69
Update REopt#after-tax-savings with cooling fix
Bill-Becker Feb 21, 2025
791ebba
Fix CoolingLoad type conversions in REopt.jl branch
Bill-Becker Feb 21, 2025
1ca2c7f
Update capital cost model fields
Bill-Becker Mar 3, 2025
f12cbd6
Add financial output model fields for total yearly costs and savings
Bill-Becker Mar 3, 2025
4ff2760
Update REopt.jl#after-tax-savings branch
Bill-Becker Mar 3, 2025
b7a3547
Update custom_table_config and some formatting for spreadsheet
Bill-Becker Mar 3, 2025
68b8a6f
Merge branch 'develop' into after-tax-savings
Bill-Becker Mar 3, 2025
91ce0a6
Merge migrations after merging develop with emissions updates into af…
Bill-Becker Mar 3, 2025
ba15009
Merge REopt.jl develop into after-tax-savings
Bill-Becker Mar 3, 2025
27c77e6
Update some new field names per REopt.jl PR review
Bill-Becker Mar 12, 2025
47f5b46
Update REopt.jl to develop branch
Bill-Becker Mar 12, 2025
2c76556
Update REopt.jl to latest registered version v0.51.1
Bill-Becker Mar 21, 2025
1a5d528
Update unaddressable fuel emissions, Formatting
Bill-Becker Mar 29, 2025
e9247e3
Change CO2 labels to CO2e
Bill-Becker Mar 29, 2025
66a0362
Move Results Table to FIRST tab, Instructions to second tab
Bill-Becker Mar 29, 2025
42b935e
Update instructions for playground updates
Bill-Becker Mar 29, 2025
38a8b82
Fix lifecycle CHP standby charge reference
Bill-Becker Mar 31, 2025
442486e
Improve description and formatting of playground sections
Bill-Becker Mar 31, 2025
601d92e
Update units label with "per year" where applicable
Bill-Becker Mar 31, 2025
28c83fc
Fix PV/Wind year one "production" and fix refactor "per year" name re…
Bill-Becker Mar 31, 2025
0efe3b8
Workaround for BAU ExistingBoiler to Load
Bill-Becker Mar 31, 2025
838c6e8
Add peak_grid_demand_kw to ElectricUtility outputs
Bill-Becker Apr 18, 2025
e23c0f7
Add unaddressable fuel cost and peak demand to results table
Bill-Becker Apr 18, 2025
1fed22b
Merge pull request #631 from NREL/after-tax-savings
Bill-Becker Apr 18, 2025
3343a06
Update CHANGELOG.md
Bill-Becker Apr 18, 2025
0b6ccf8
Merge pull request #636 from NREL/Bill-Becker-patch-1
Bill-Becker Apr 18, 2025
fa6b4cf
Update reoptjl/views.py
Bill-Becker Apr 18, 2025
d314ec2
Use single quotes for http.jl file name inside outer quotes in compos…
Bill-Becker Apr 18, 2025
a1c5f39
Revert "Use single quotes for http.jl file name inside outer quotes i…
Bill-Becker Apr 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ Classify the change according to the following categories:
##### Removed
### Patches

## v3.12.1
### Minor Updates
### Added
- Added the following output fields: `year_one_fuel_cost_after_tax` for `ExistingBoiler`, `CHP`, `Generator`, and `Boiler`; `ElectricTariff`: `year_one_bill_after_tax` and `year_one_export_benefit_after_tax`, `Financial`: `capital_costs_after_non_discounted_incentives`, `year_one_total_operating_cost_savings_before_tax`, `year_one_total_operating_cost_savings_after_tax`, `year_one_total_operating_cost_before_tax`, `year_one_total_operating_cost_after_tax`, `year_one_fuel_cost_before_tax`, `year_one_fuel_cost_after_tax`, `year_one_chp_standby_cost_after_tax`, `year_one_chp_standby_cost_after_tax`, `GHP.avoided_capex_by_ghp_present_value`, and `ElectricUtility.peak_grid_demand_kw`
- Added a lot of the output fields above to the custom_table_config.py file for the `job/generate_results_table` endpoint for the results table downloadable spreadsheet.
### Changed
- Using latest registered REopt.jl version 0.51.1
- For the results table downloadable spreadsheet, changed some labels to include units and made other improvements, in addition to mostly adding a bunch of the after-tax outputs described above
### Fixed
- Fixed a GHP test with the corrected `lifecycle_capital_cost` calculation to include the avoided HVAC cost and GHX residual value
- Fixed a type issue with the `/simulated_load` endpoing for cooling load with `monthly_fraction` input

## v3.12.0
### Major Updates
### Added
Expand Down
5 changes: 2 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
version: "2.1"

services:

redis:
Expand Down Expand Up @@ -67,7 +65,8 @@ services:
environment:
- XPRESS_JL_SKIP_LIB_CHECK=True
- XPRESS_INSTALLED=False
command: julia --project=/opt/julia_src http.jl
# command: julia --project=/opt/julia_src http.jl
command: julia --project=. -e 'using Pkg; Pkg.instantiate(); include("http.jl")'
Copy link

Copilot AI Apr 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The command string uses double quotes inside single quotes, which may cause YAML parsing issues. Consider escaping the inner double quotes or using a consistent quoting strategy (for example, use single quotes around the file name) to ensure proper command execution.

Suggested change
command: julia --project=. -e 'using Pkg; Pkg.instantiate(); include("http.jl")'
command: "julia --project=. -e \"using Pkg; Pkg.instantiate(); include('http.jl')\""

Copilot uses AI. Check for mistakes.
ports:
- "8081:8081"
volumes:
Expand Down
4 changes: 2 additions & 2 deletions julia_src/Manifest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -922,9 +922,9 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[deps.REopt]]
deps = ["ArchGDAL", "CSV", "CoolProp", "DataFrames", "Dates", "DelimitedFiles", "HTTP", "JLD", "JSON", "JuMP", "LinDistFlow", "LinearAlgebra", "Logging", "MathOptInterface", "Requires", "Roots", "Statistics", "TestEnv"]
git-tree-sha1 = "24f902b6f67ed1d4389d21b5d42f820036b182b4"
git-tree-sha1 = "9946abe774e30d82f786e68296ad1fdf8bb7dba4"
uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6"
version = "0.51.0"
version = "0.51.1"

[[deps.Random]]
deps = ["SHA"]
Expand Down
2 changes: 1 addition & 1 deletion julia_src/http.jl
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ function simulated_load(req::HTTP.Request)

# Convert vectors which come in as Vector{Any} to Vector{Float} (within Vector{<:Real})
vector_types = ["percent_share", "cooling_pct_share", "monthly_totals_kwh", "monthly_mmbtu",
"monthly_tonhour", "addressable_load_fraction", "load_profile"]
"monthly_tonhour", "monthly_fraction", "addressable_load_fraction", "load_profile"]
for key in vector_types
if key in keys(d) && typeof(d[key]) <: Vector{}
d[key] = convert(Vector{Real}, d[key])
Expand Down
476 changes: 326 additions & 150 deletions reoptjl/custom_table_config.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# Generated by Django 4.0.7 on 2025-02-19 05:32

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0076_ashpspaceheaterinputs_force_dispatch_and_more'),
]

operations = [
migrations.AddField(
model_name='boileroutputs',
name='year_one_fuel_cost_after_tax',
field=models.FloatField(blank=True, null=True),
),
migrations.AddField(
model_name='chpoutputs',
name='year_one_fuel_cost_after_tax',
field=models.FloatField(blank=True, help_text='Cost of fuel consumed by the CHP system in year one, after tax [\\$]', null=True),
),
migrations.AddField(
model_name='chpoutputs',
name='year_one_standby_cost_after_tax',
field=models.FloatField(blank=True, help_text='CHP standby charges in year one, after tax [\\$]', null=True),
),
migrations.AddField(
model_name='electrictariffoutputs',
name='year_one_bill_after_tax',
field=models.FloatField(blank=True, help_text='Optimal year one utility bill, after tax', null=True),
),
migrations.AddField(
model_name='electrictariffoutputs',
name='year_one_bill_after_tax_bau',
field=models.FloatField(blank=True, help_text='Business as usual year one utility bill, after tax', null=True),
),
migrations.AddField(
model_name='electrictariffoutputs',
name='year_one_export_benefit_after_tax',
field=models.FloatField(blank=True, help_text='Optimal year one value of exported energy, after tax. A positive value indicates a benefit.', null=True),
),
migrations.AddField(
model_name='electrictariffoutputs',
name='year_one_export_benefit_after_tax_bau',
field=models.FloatField(blank=True, help_text='Business as usual year one value of exported energy, after tax. A positive value indicates a benefit.', null=True),
),
migrations.AddField(
model_name='existingboileroutputs',
name='year_one_fuel_cost_after_tax',
field=models.FloatField(blank=True, null=True),
),
migrations.AddField(
model_name='existingboileroutputs',
name='year_one_fuel_cost_after_tax_bau',
field=models.FloatField(blank=True, null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='capital_costs_after_non_discounted_incentives',
field=models.FloatField(blank=True, help_text='Capital costs for all technologies, in present value, after all non-discounted incentives including MACRS, including present value of replacement costs', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_fuel_cost_after_tax',
field=models.FloatField(blank=True, help_text='Year one fuel cost of all combined fuel-burning techs, after tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_fuel_cost_after_tax_bau',
field=models.FloatField(blank=True, help_text='Year one fuel cost of all combined fuel-burning techs, after tax in the BAU case.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_fuel_cost_before_tax',
field=models.FloatField(blank=True, help_text='Year one fuel cost of all combined fuel-burning techs, before tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_fuel_cost_before_tax_bau',
field=models.FloatField(blank=True, help_text='Year one fuel cost of all combined fuel-burning techs, before tax in the BAU case.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_om_costs_after_tax_bau',
field=models.FloatField(blank=True, help_text='Year one operations and maintenance cost after tax in the BAU case.', null=True),
),
migrations.AddField(
model_name='ghpoutputs',
name='avoided_capex_by_ghp_present_value',
field=models.FloatField(blank=True, null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.0.7 on 2025-02-19 14:15

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0077_boileroutputs_year_one_fuel_cost_after_tax_and_more'),
]

operations = [
migrations.AddField(
model_name='generatoroutputs',
name='year_one_fuel_cost_after_tax',
field=models.FloatField(blank=True, null=True),
),
migrations.AddField(
model_name='generatoroutputs',
name='year_one_fuel_cost_after_tax_bau',
field=models.FloatField(blank=True, null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 4.0.7 on 2025-02-28 23:10

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0078_generatoroutputs_year_one_fuel_cost_after_tax_and_more'),
]

operations = [
migrations.RemoveField(
model_name='financialoutputs',
name='initial_capital_costs_after_incentives_without_macrs',
),
migrations.AddField(
model_name='financialoutputs',
name='capital_costs_after_incentives_without_macrs',
field=models.FloatField(blank=True, help_text='Capital costs for all technologies, including present value of replacement costs and incentives except for MACRS.', null=True),
),
migrations.AlterField(
model_name='financialoutputs',
name='capital_costs_after_non_discounted_incentives',
field=models.FloatField(blank=True, help_text='Capital costs for all technologies, including present value of replacement costs and all non-discounted incentives including MACRS.', null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Generated by Django 4.0.7 on 2025-03-03 17:06

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0079_remove_financialoutputs_initial_capital_costs_after_incentives_without_macrs_and_more'),
]

operations = [
migrations.AddField(
model_name='financialoutputs',
name='year_one_chp_standby_cost_after_tax',
field=models.FloatField(blank=True, help_text='Year one CHP standby charges, after tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_chp_standby_cost_before_tax',
field=models.FloatField(blank=True, help_text='Year one CHP standby charges, before tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_after_tax',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) costs, after tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_after_tax_bau',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) costs, after tax in the BAU case.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_before_tax',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) costs, before tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_before_tax_bau',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) costs, before tax in the BAU case.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_savings_after_tax',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) cost savings compared to BAU case, after tax.', null=True),
),
migrations.AddField(
model_name='financialoutputs',
name='year_one_total_cost_savings_before_tax',
field=models.FloatField(blank=True, help_text='Year one total operating (electricity, fuel, O&M) cost savings compared to BAU case, before tax.', null=True),
),
]
14 changes: 14 additions & 0 deletions reoptjl/migrations/0081_merge_20250303_1743.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 4.0.7 on 2025-03-03 17:43

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0080_electricloadoutputs_annual_electric_load_with_thermal_conversions_kwh_and_more'),
('reoptjl', '0080_financialoutputs_year_one_chp_standby_cost_after_tax_and_more'),
]

operations = [
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Generated by Django 4.0.7 on 2025-03-12 03:14

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0081_merge_20250303_1743'),
]

operations = [
migrations.RenameField(
model_name='financialoutputs',
old_name='capital_costs_after_incentives_without_macrs',
new_name='capital_costs_after_non_discounted_incentives_without_macrs',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_after_tax',
new_name='year_one_total_operating_cost_after_tax',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_after_tax_bau',
new_name='year_one_total_operating_cost_after_tax_bau',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_before_tax',
new_name='year_one_total_operating_cost_before_tax',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_before_tax_bau',
new_name='year_one_total_operating_cost_before_tax_bau',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_savings_after_tax',
new_name='year_one_total_operating_cost_savings_after_tax',
),
migrations.RenameField(
model_name='financialoutputs',
old_name='year_one_total_cost_savings_before_tax',
new_name='year_one_total_operating_cost_savings_before_tax',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.0.7 on 2025-04-18 21:26

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('reoptjl', '0082_rename_capital_costs_after_incentives_without_macrs_financialoutputs_capital_costs_after_non_discoun'),
]

operations = [
migrations.AddField(
model_name='electricutilityoutputs',
name='peak_grid_demand_kw',
field=models.FloatField(blank=True, help_text='Maximum grid demand calculated as the maximum of (electric_to_load_series_kw .+ electric_to_storage_series_kw).', null=True),
),
migrations.AddField(
model_name='electricutilityoutputs',
name='peak_grid_demand_kw_bau',
field=models.FloatField(blank=True, help_text='Maximum grid demand in the BAU case calculated as the maximum of electric_to_load_series_kw.', null=True),
),
]
Loading