From c6f1782cb2f71c7d741caee90d3a6d22a5fae524 Mon Sep 17 00:00:00 2001 From: bill-becker Date: Thu, 2 May 2024 16:23:11 -0600 Subject: [PATCH 01/35] Reduce memory usage on production pods --- .helm/values.production.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.helm/values.production.yaml b/.helm/values.production.yaml index 34f49d5e3..e2c39fa8c 100644 --- a/.helm/values.production.yaml +++ b/.helm/values.production.yaml @@ -1,13 +1,13 @@ appEnv: production djangoSettingsModule: reopt_api.production_settings djangoReplicas: 10 -djangoMemoryRequest: "2800Mi" -djangoMemoryLimit: "2800Mi" +djangoMemoryRequest: "2000Mi" +djangoMemoryLimit: "2000Mi" celeryReplicas: 10 celeryMemoryRequest: "900Mi" celeryMemoryLimit: "900Mi" juliaReplicas: 15 juliaCpuRequest: "1000m" juliaCpuLimit: "4000m" -juliaMemoryRequest: "12000Mi" -juliaMemoryLimit: "12000Mi" +juliaMemoryRequest: "8000Mi" +juliaMemoryLimit: "8000Mi" From 3b2a9b9ef093c7838f942f6910b9f061b111747c Mon Sep 17 00:00:00 2001 From: bill-becker Date: Thu, 2 May 2024 16:23:23 -0600 Subject: [PATCH 02/35] Increase memory allocation on development pods --- .helm/values.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.helm/values.yaml b/.helm/values.yaml index 83c14452b..5de3f46fb 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -19,7 +19,7 @@ celeryCpuLimit: "2000m" celeryMemoryRequest: "700Mi" celeryMemoryLimit: "700Mi" juliaReplicas: 2 -juliaCpuRequest: "300m" +juliaCpuRequest: "1000m" juliaCpuLimit: "4000m" -juliaMemoryRequest: "3000Mi" -juliaMemoryLimit: "3000Mi" +juliaMemoryRequest: "8000Mi" +juliaMemoryLimit: "8000Mi" From 2d17596a966687e218a01c408cd75dc86637720b Mon Sep 17 00:00:00 2001 From: adfarth Date: Mon, 6 May 2024 14:41:12 -0600 Subject: [PATCH 03/35] Update models.py --- reoptjl/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index bb744b1b4..4544a7e41 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -1842,8 +1842,9 @@ def clean(self): elif self.outage_durations not in [None,[]]: self.outage_probabilities = [1/len(self.outage_durations)] * len(self.outage_durations) - if self.co2_from_avert or len(self.emissions_factor_series_lb_CO2_per_kwh) > 0: - self.emissions_factor_CO2_decrease_fraction = EMISSIONS_DECREASE_DEFAULTS.get("CO2e", None) # leave blank otherwise; the Julia Pkg will set to 0 unless site is in AK or HI + if (self.co2_from_avert or len(self.emissions_factor_series_lb_CO2_per_kwh) > 0) and self.emissions_factor_CO2_decrease_fraction == None: + # use default if not provided and using AVERT or custom EFs. Leave blank otherwise and the Julia Pkg will set to 0 unless site is in AK or HI. + self.emissions_factor_CO2_decrease_fraction = EMISSIONS_DECREASE_DEFAULTS.get("CO2e", None) if self.emissions_factor_NOx_decrease_fraction == None: self.emissions_factor_NOx_decrease_fraction = EMISSIONS_DECREASE_DEFAULTS.get("NOx", 0.0) From 01499fb3fd5d5e3fef20149954042b56ed3cc503 Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 17:38:46 -0600 Subject: [PATCH 04/35] add boolean inputs for heat loads served --- reoptjl/models.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/reoptjl/models.py b/reoptjl/models.py index 4544a7e41..b9c83f527 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -2834,6 +2834,24 @@ class PV_LOCATION_CHOICES(models.TextChoices): blank=True, help_text="True/False for if technology has the ability to curtail energy production." ) + can_serve_dhw = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve space heating load" + ) + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve space heating load" + ) + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve process heat load" + ) operating_reserve_required_fraction = models.FloatField( validators=[ @@ -4105,6 +4123,25 @@ class CHPInputs(BaseModel, models.Model): blank=True, help_text="Boolean indicator if CHP can supply steam to the steam turbine for electric production" ) + can_serve_dhw = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if CHP can serve domestice hot water load" + ) + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if CHP can serve space heating load" + ) + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if CHP can serve process heat load" + ) + #Financial and emissions macrs_option_years = models.IntegerField( @@ -4916,6 +4953,25 @@ class ExistingBoilerInputs(BaseModel, models.Model): help_text="If the boiler can supply steam to the steam turbine for electric production" ) + can_serve_dhw = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if the existing boiler can serve domestice hot water load" + ) + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if the existing boiler can serve space heating load" + ) + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if the existing boiler can serve process heat load" + ) + # For custom validations within model. def clean(self): error_messages = {} @@ -5152,6 +5208,28 @@ class BoilerInputs(BaseModel, models.Model): help_text="If the boiler can supply steam to the steam turbine for electric production" ) + can_serve_dhw = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if boiler can serve domestice hot water load" + ) + + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if boiler can serve space heating load" + ) + + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if boiler can serve process heat load" + ) + + # For custom validations within model. def clean(self): error_messages = {} @@ -5448,6 +5526,8 @@ class SIZE_CLASS_LIST(models.IntegerChoices): help_text="True/False for if technology has the ability to curtail energy production." ) + + macrs_option_years = models.IntegerField( default=MACRS_YEARS_CHOICES.ZERO, choices=MACRS_YEARS_CHOICES.choices, @@ -5676,6 +5756,25 @@ class HotThermalStorageInputs(BaseModel, models.Model): blank=True, help_text="Rebate per unit installed energy capacity" ) + can_serve_dhw = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if hot thermal storage can serve space heating load" + ) + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if hot thermal storage can serve space heating load" + ) + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if hot thermal storage can serve process heat load" + ) + def clean(self): # perform custom validation here. @@ -6828,6 +6927,20 @@ class GHPInputs(BaseModel, models.Model): blank=True, help_text="If GHP can serve the domestic hot water (DHW) portion of the heating load" ) + + can_serve_space_heating = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if GHP can serve space heating load" + ) + + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if GHP can serve process heat load" + ) macrs_option_years = models.IntegerField( default=MACRS_YEARS_CHOICES.FIVE, From 8a1c040a24b02024facdd93ce4fac0792b57ecdc Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 17:43:11 -0600 Subject: [PATCH 05/35] update defaults for heating loads served --- reoptjl/models.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index b9c83f527..8b3c85a0a 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -2835,19 +2835,19 @@ class PV_LOCATION_CHOICES(models.TextChoices): help_text="True/False for if technology has the ability to curtail energy production." ) can_serve_dhw = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if steam turbine can serve space heating load" ) can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if steam turbine can serve space heating load" ) can_serve_process_heat = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if steam turbine can serve process heat load" @@ -4124,19 +4124,19 @@ class CHPInputs(BaseModel, models.Model): help_text="Boolean indicator if CHP can supply steam to the steam turbine for electric production" ) can_serve_dhw = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if CHP can serve domestice hot water load" ) can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if CHP can serve space heating load" ) can_serve_process_heat = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if CHP can serve process heat load" @@ -4954,19 +4954,21 @@ class ExistingBoilerInputs(BaseModel, models.Model): ) can_serve_dhw = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if the existing boiler can serve domestice hot water load" ) + can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if the existing boiler can serve space heating load" ) + can_serve_process_heat = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if the existing boiler can serve process heat load" @@ -5209,21 +5211,21 @@ class BoilerInputs(BaseModel, models.Model): ) can_serve_dhw = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if boiler can serve domestice hot water load" ) can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if boiler can serve space heating load" ) can_serve_process_heat = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if boiler can serve process heat load" @@ -5757,13 +5759,13 @@ class HotThermalStorageInputs(BaseModel, models.Model): help_text="Rebate per unit installed energy capacity" ) can_serve_dhw = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if hot thermal storage can serve space heating load" ) can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if hot thermal storage can serve space heating load" @@ -6929,7 +6931,7 @@ class GHPInputs(BaseModel, models.Model): ) can_serve_space_heating = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if GHP can serve space heating load" From b996221ffc8edb2994b0f27bd279cefc42f4a255 Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 17:43:40 -0600 Subject: [PATCH 06/35] add field retire_in_optimal to ExistingBoilerInputs --- reoptjl/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reoptjl/models.py b/reoptjl/models.py index 8b3c85a0a..ab0f6d754 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -4874,6 +4874,13 @@ class ExistingBoilerInputs(BaseModel, models.Model): help_text="Existing boiler system efficiency - conversion of fuel to usable heating thermal energy." ) + retire_in_optimal = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if the existing boiler is unavailable in the optimal case (still used in BAU)" + ) + fuel_renewable_energy_fraction = models.FloatField( validators=[ MinValueValidator(0), From 4c94c05dc44951d8fc069819adbc0580e0137382 Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 17:46:22 -0600 Subject: [PATCH 07/35] add field heating_laod_input to AbsorptionChillerInputs --- reoptjl/models.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reoptjl/models.py b/reoptjl/models.py index ab0f6d754..874cf8d8d 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -6528,6 +6528,12 @@ class AbsorptionChillerInputs(BaseModel, models.Model): 'hot_water' )) + HEATING_LOAD_INPUT = models.TextChoices('HEATING_LOAD_INPUT', ( + 'DomesitHotWater', + 'SpaceHeating', + 'ProcessHeat' + )) + thermal_consumption_hot_water_or_steam = models.TextField( blank=True, null=True, @@ -6617,6 +6623,13 @@ class AbsorptionChillerInputs(BaseModel, models.Model): help_text="Percent of upfront project costs to depreciate in year one in addition to scheduled depreciation" ) + heating_load_input = models.TextField( + blank=True, + null=True, + choices=HEATING_LOAD_INPUT.choices, + help_text="Absorption chiller heat input - determines what heating load is added to by absorption chiller use" + ) + def clean(self): pass From 077c266e8806ebb9f9b6bad9858261d14d79d353 Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 20:00:07 -0600 Subject: [PATCH 08/35] add new model ProcessHeatLoadInputs --- reoptjl/models.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/reoptjl/models.py b/reoptjl/models.py index 874cf8d8d..57b2c569a 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -6301,6 +6301,55 @@ def clean(self): if self.addressable_load_fraction == None: self.addressable_load_fraction = list([1.0]) # should not convert to timeseries, in case it is to be used with monthly_mmbtu or annual_mmbtu +class ProcessHeatLoadInputs(BaseModel, models.Model): + # DHW + key = "ProcessHeatLoad" + + meta = models.OneToOneField( + APIMeta, + on_delete=models.CASCADE, + related_name="ProcessHeatLoadInputs", + primary_key=True + ) + + possible_sets = [ + ["fuel_loads_mmbtu_per_hour"], + ["annual_mmbtu"], + [], + ] + + annual_mmbtu = models.FloatField( + validators=[ + MinValueValidator(1), + MaxValueValidator(MAX_BIG_NUMBER) + ], + null=True, + blank=True, + help_text=("Annual site process heat consumption, used " + "to scale simulated load profile [MMBtu]") + ) + + fuel_loads_mmbtu_per_hour = ArrayField( + models.FloatField( + blank=True + ), + default=list, + blank=True, + help_text=("Typical load over all hours in one year. Must be hourly (8,760 samples), 30 minute (17," + "520 samples), or 15 minute (35,040 samples). All non-net load values must be greater than or " + "equal to zero. " + ) + + ) + + def clean(self): + error_messages = {} + + # possible sets for defining load profile + if not at_least_one_set(self.dict, self.possible_sets): + error_messages["required inputs"] = \ + "Must provide at least one set of valid inputs from {}.".format(self.possible_sets) + class HeatingLoadOutputs(BaseModel, models.Model): key = "HeatingLoadOutputs" From 13d003b9eb4daf0109e7e81cf769f54dff81a7c9 Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 21:14:10 -0600 Subject: [PATCH 09/35] add tech-specific, heat-load-specific outputs --- reoptjl/models.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/reoptjl/models.py b/reoptjl/models.py index 57b2c569a..2833447aa 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -5053,6 +5053,21 @@ class ExistingBoilerOutputs(BaseModel, models.Model): default = list, ) + thermal_to_dhw_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_space_heating_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_process_heat_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + def clean(self): # perform custom validation here. pass @@ -5304,6 +5319,21 @@ class BoilerOutputs(BaseModel, models.Model): annual_thermal_production_mmbtu = models.FloatField(null=True, blank=True) + thermal_to_dhw_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_space_heating_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_process_heat_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + class SteamTurbineInputs(BaseModel, models.Model): @@ -5622,6 +5652,21 @@ class SteamTurbineOutputs(BaseModel, models.Model): default = list, ) + thermal_to_dhw_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_space_heating_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + thermal_to_process_heat_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + class HotThermalStorageInputs(BaseModel, models.Model): key = "HotThermalStorage" @@ -5807,6 +5852,20 @@ class HotThermalStorageOutputs(BaseModel, models.Model): models.FloatField(null=True, blank=True), default = list, ) + storage_to_dhw_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + storage_to_space_heating_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) + + storage_to_process_heat_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list + ) def clean(self): # perform custom validation here. From 277b798141c31a3852bb070a19a017282209444d Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 21:17:15 -0600 Subject: [PATCH 10/35] add process heat loads to heating load outputs --- reoptjl/models.py | 54 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index 2833447aa..1dba444b2 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -6441,7 +6441,19 @@ class HeatingLoadOutputs(BaseModel, models.Model): blank=True ), default=list, blank=True, - help_text=("Hourly domestic space heating load [MMBTU/hr]") + help_text=("Hourly space heating load [MMBTU/hr]") + ) + + process_heat_thermal_load_series_mmbtu_per_hour = ArrayField( + models.FloatField( + validators=[ + MinValueValidator(0), + MaxValueValidator(MAX_BIG_NUMBER) + ], + blank=True + ), + default=list, blank=True, + help_text=("Hourly process heat load [MMBTU/hr]") ) total_heating_thermal_load_series_mmbtu_per_hour = ArrayField( @@ -6465,7 +6477,7 @@ class HeatingLoadOutputs(BaseModel, models.Model): blank=True ), default=list, blank=True, - help_text=("Hourly domestic hot water load [MMBTU/hr]") + help_text=("Hourly domestic hot water boiler fuel load [MMBTU/hr]") ) space_heating_boiler_fuel_load_series_mmbtu_per_hour = ArrayField( @@ -6477,7 +6489,19 @@ class HeatingLoadOutputs(BaseModel, models.Model): blank=True ), default=list, blank=True, - help_text=("Hourly domestic space heating load [MMBTU/hr]") + help_text=("Hourly space heating boiler fuel load [MMBTU/hr]") + ) + + process_heat_boiler_fuel_load_series_mmbtu_per_hour = ArrayField( + models.FloatField( + validators=[ + MinValueValidator(0), + MaxValueValidator(MAX_BIG_NUMBER) + ], + blank=True + ), + default=list, blank=True, + help_text=("Hourly process heat boiler fuel load [MMBTU/hr]") ) total_heating_boiler_fuel_load_series_mmbtu_per_hour = ArrayField( @@ -6489,7 +6513,7 @@ class HeatingLoadOutputs(BaseModel, models.Model): blank=True ), default=list, blank=True, - help_text=("Hourly total heating load [MMBTU/hr]") + help_text=("Hourly total boiler fuel load [MMBTU/hr]") ) annual_calculated_dhw_thermal_load_mmbtu = models.FloatField( @@ -6514,6 +6538,17 @@ class HeatingLoadOutputs(BaseModel, models.Model): help_text=("Annual site space heating load [MMBTU]") ) + annual_calculated_process_heat_thermal_load_mmbtu = models.FloatField( + validators=[ + MinValueValidator(0), + MaxValueValidator(MAX_BIG_NUMBER) + ], + null=True, + blank=True, + default=0, + help_text=("Annual site process heat load [MMBTU]") + ) + annual_calculated_total_heating_thermal_load_mmbtu = models.FloatField( validators=[ MinValueValidator(0), @@ -6547,6 +6582,17 @@ class HeatingLoadOutputs(BaseModel, models.Model): help_text=("Annual site space heating boiler fuel load [MMBTU]") ) + annual_calculated_process_heat_boiler_fuel_load_mmbtu = models.FloatField( + validators=[ + MinValueValidator(0), + MaxValueValidator(MAX_BIG_NUMBER) + ], + null=True, + blank=True, + default=0, + help_text=("Annual site process heat boiler fuel load [MMBTU]") + ) + annual_calculated_total_heating_boiler_fuel_load_mmbtu = models.FloatField( validators=[ MinValueValidator(0), From f8cd01d4f449044cb344d3568988123d96e33bee Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 21:17:32 -0600 Subject: [PATCH 11/35] add ProcessHeatLoadInputs to validators --- reoptjl/validators.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reoptjl/validators.py b/reoptjl/validators.py index b46a9307b..4e7238ea4 100644 --- a/reoptjl/validators.py +++ b/reoptjl/validators.py @@ -4,7 +4,7 @@ from reoptjl.models import MAX_BIG_NUMBER, APIMeta, ExistingBoilerInputs, UserProvidedMeta, SiteInputs, Settings, ElectricLoadInputs, ElectricTariffInputs, \ FinancialInputs, BaseModel, Message, ElectricUtilityInputs, PVInputs, ElectricStorageInputs, GeneratorInputs, WindInputs, SpaceHeatingLoadInputs, \ DomesticHotWaterLoadInputs, CHPInputs, CoolingLoadInputs, ExistingChillerInputs, HotThermalStorageInputs, ColdThermalStorageInputs, \ - AbsorptionChillerInputs, BoilerInputs, SteamTurbineInputs, GHPInputs + AbsorptionChillerInputs, BoilerInputs, SteamTurbineInputs, GHPInputs, ProcessHeatLoadInputs from django.core.exceptions import ValidationError from pyproj import Proj from typing import Tuple @@ -79,7 +79,8 @@ def __init__(self, raw_inputs: dict, ghpghx_inputs_validation_errors=None): ColdThermalStorageInputs, AbsorptionChillerInputs, SteamTurbineInputs, - GHPInputs + GHPInputs, + ProcessHeatLoadInputs ) self.pvnames = [] on_grid_required_object_names = [ @@ -521,6 +522,12 @@ def assign_ref_buildings_from_electric_load(self, load_to_assign): self.add_validation_error(load_to_assign, "doe_reference_name", f"Must provide DOE commercial reference building profiles either under {load_to_assign} or ElectricLoad") + """ + ProcessHeatLaod + """ + if "ProcessHeatLoad" in self.models.keys(): + self.clean_time_series("ProcessHeatLoad", "fuel_loads_mmbtu_per_hour") + """ Off-grid input keys validation """ From dda4d3a35056516f3fae1a2cc8ce914395b4bace Mon Sep 17 00:00:00 2001 From: Zolan Date: Mon, 6 May 2024 21:25:02 -0600 Subject: [PATCH 12/35] add ProcessHeatLoadInputs to views and get_input_dict_from_run_uuid --- reoptjl/models.py | 3 +++ reoptjl/views.py | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index 1dba444b2..3ddb5cc5e 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -7341,6 +7341,9 @@ def filter_none_and_empty_array(d:dict): try: d["DomesticHotWaterLoad"] = filter_none_and_empty_array(meta.DomesticHotWaterLoadInputs.dict) except: pass + try: d["ProcessHeatLoad"] = filter_none_and_empty_array(meta.ProcessHeatLoadInputs.dict) + except: pass + try: d["HotThermalStorage"] = filter_none_and_empty_array(meta.HotThermalStorageInputs.dict) except: pass diff --git a/reoptjl/views.py b/reoptjl/views.py index 6cea32daa..3e41f7f62 100644 --- a/reoptjl/views.py +++ b/reoptjl/views.py @@ -14,7 +14,7 @@ CoolingLoadOutputs, HeatingLoadOutputs, REoptjlMessageOutputs, HotThermalStorageInputs, HotThermalStorageOutputs,\ ColdThermalStorageInputs, ColdThermalStorageOutputs, AbsorptionChillerInputs, AbsorptionChillerOutputs,\ FinancialInputs, FinancialOutputs, UserUnlinkedRuns, BoilerInputs, BoilerOutputs, SteamTurbineInputs, \ - SteamTurbineOutputs, GHPInputs, GHPOutputs + SteamTurbineOutputs, GHPInputs, GHPOutputs, ProcessHeatLoadInputs import os import requests import numpy as np @@ -53,6 +53,7 @@ def help(request): d["ColdThermalStorage"] = ColdThermalStorageInputs.info_dict(ColdThermalStorageInputs) d["SpaceHeatingLoad"] = SpaceHeatingLoadInputs.info_dict(SpaceHeatingLoadInputs) d["DomesticHotWaterLoad"] = DomesticHotWaterLoadInputs.info_dict(DomesticHotWaterLoadInputs) + d["ProcessHeatLoad"] = ProcessHeatLoadInputs.info_dict(ProcessHeatLoadInputs) d["Site"] = SiteInputs.info_dict(SiteInputs) d["CHP"] = CHPInputs.info_dict(CHPInputs) d["AbsorptionChiller"] = AbsorptionChillerInputs.info_dict(AbsorptionChillerInputs) @@ -214,6 +215,9 @@ def results(request, run_uuid): try: r["inputs"]["DomesticHotWaterLoad"] = meta.DomesticHotWaterLoadInputs.dict except: pass + try: r["inputs"]["ProcessHeatLoad"] = meta.ProcessHeatLoadInputs.dict + except: pass + try: r["inputs"]["CHP"] = meta.CHPInputs.dict except: pass From 8c9d8446c8b564e6f33735921339a0f4459908de Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 08:07:15 -0600 Subject: [PATCH 13/35] point to add-process-heat-load branch --- julia_src/Manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 204307475..2cae08885 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -917,9 +917,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 = "d2bbcbb8344f19ed87ee8cb6a196d4ed8415255b" +git-tree-sha1 = "889950d32d143d0af8f4dd699c7e453e0b0b9589" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" -version = "0.45.0" +rev="add-process-heat-load" [[deps.Random]] deps = ["SHA"] From 72905192900529bc7107c68e16bbbe06d1c110e0 Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 08:48:44 -0600 Subject: [PATCH 14/35] update help text --- reoptjl/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index 3ddb5cc5e..6b09a1037 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -4127,7 +4127,7 @@ class CHPInputs(BaseModel, models.Model): default=True, null=True, blank=True, - help_text="Boolean indicator if CHP can serve domestice hot water load" + help_text="Boolean indicator if CHP can serve hot water load" ) can_serve_space_heating = models.BooleanField( default=True, @@ -4964,7 +4964,7 @@ class ExistingBoilerInputs(BaseModel, models.Model): default=True, null=True, blank=True, - help_text="Boolean indicator if the existing boiler can serve domestice hot water load" + help_text="Boolean indicator if the existing boiler can serve domestic hot water load" ) can_serve_space_heating = models.BooleanField( @@ -5236,7 +5236,7 @@ class BoilerInputs(BaseModel, models.Model): default=True, null=True, blank=True, - help_text="Boolean indicator if boiler can serve domestice hot water load" + help_text="Boolean indicator if boiler can serve domestic hot water load" ) can_serve_space_heating = models.BooleanField( From 4642c1b6d727e19477c6cbc074d6b19f523792c7 Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 10:50:03 -0600 Subject: [PATCH 15/35] update migrations --- .../0059_processheatloadinputs_and_more.py | 226 ++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 reoptjl/migrations/0059_processheatloadinputs_and_more.py diff --git a/reoptjl/migrations/0059_processheatloadinputs_and_more.py b/reoptjl/migrations/0059_processheatloadinputs_and_more.py new file mode 100644 index 000000000..c9966fcc7 --- /dev/null +++ b/reoptjl/migrations/0059_processheatloadinputs_and_more.py @@ -0,0 +1,226 @@ +# Generated by Django 4.0.7 on 2024-05-07 16:49 + +import django.contrib.postgres.fields +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import reoptjl.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('reoptjl', '0058_merge_20240425_1527'), + ] + + operations = [ + migrations.CreateModel( + name='ProcessHeatLoadInputs', + fields=[ + ('meta', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='ProcessHeatLoadInputs', serialize=False, to='reoptjl.apimeta')), + ('annual_mmbtu', models.FloatField(blank=True, help_text='Annual site process heat consumption, used to scale simulated load profile [MMBtu]', null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100000000.0)])), + ('fuel_loads_mmbtu_per_hour', django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, help_text='Typical load over all hours in one year. Must be hourly (8,760 samples), 30 minute (17,520 samples), or 15 minute (35,040 samples). All non-net load values must be greater than or equal to zero. ', size=None)), + ], + bases=(reoptjl.models.BaseModel, models.Model), + ), + migrations.AddField( + model_name='absorptionchillerinputs', + name='heating_load_input', + field=models.TextField(blank=True, choices=[('DomesitHotWater', 'Domesithotwater'), ('SpaceHeating', 'Spaceheating'), ('ProcessHeat', 'Processheat')], help_text='Absorption chiller heat input - determines what heating load is added to by absorption chiller use', null=True), + ), + migrations.AddField( + model_name='boilerinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if boiler can serve domestic hot water load', null=True), + ), + migrations.AddField( + model_name='boilerinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if boiler can serve process heat load', null=True), + ), + migrations.AddField( + model_name='boilerinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if boiler can serve space heating load', null=True), + ), + migrations.AddField( + model_name='boileroutputs', + name='thermal_to_dhw_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='boileroutputs', + name='thermal_to_process_heat_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='boileroutputs', + name='thermal_to_space_heating_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='chpinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if CHP can serve hot water load', null=True), + ), + migrations.AddField( + model_name='chpinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if CHP can serve process heat load', null=True), + ), + migrations.AddField( + model_name='chpinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if CHP can serve space heating load', null=True), + ), + migrations.AddField( + model_name='existingboilerinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if the existing boiler can serve domestic hot water load', null=True), + ), + migrations.AddField( + model_name='existingboilerinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if the existing boiler can serve process heat load', null=True), + ), + migrations.AddField( + model_name='existingboilerinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if the existing boiler can serve space heating load', null=True), + ), + migrations.AddField( + model_name='existingboilerinputs', + name='retire_in_optimal', + field=models.BooleanField(blank=True, default=False, help_text='Boolean indicator if the existing boiler is unavailable in the optimal case (still used in BAU)', null=True), + ), + migrations.AddField( + model_name='existingboileroutputs', + name='thermal_to_dhw_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='existingboileroutputs', + name='thermal_to_process_heat_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='existingboileroutputs', + name='thermal_to_space_heating_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='ghpinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=False, help_text='Boolean indicator if GHP can serve process heat load', null=True), + ), + migrations.AddField( + model_name='ghpinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if GHP can serve space heating load', null=True), + ), + migrations.AddField( + model_name='heatingloadoutputs', + name='annual_calculated_process_heat_boiler_fuel_load_mmbtu', + field=models.FloatField(blank=True, default=0, help_text='Annual site process heat boiler fuel load [MMBTU]', null=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), + ), + migrations.AddField( + model_name='heatingloadoutputs', + name='annual_calculated_process_heat_thermal_load_mmbtu', + field=models.FloatField(blank=True, default=0, help_text='Annual site process heat load [MMBTU]', null=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), + ), + migrations.AddField( + model_name='heatingloadoutputs', + name='process_heat_boiler_fuel_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly process heat boiler fuel load [MMBTU/hr]', size=None), + ), + migrations.AddField( + model_name='heatingloadoutputs', + name='process_heat_thermal_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly process heat load [MMBTU/hr]', size=None), + ), + migrations.AddField( + model_name='hotthermalstorageinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if hot thermal storage can serve space heating load', null=True), + ), + migrations.AddField( + model_name='hotthermalstorageinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=False, help_text='Boolean indicator if hot thermal storage can serve process heat load', null=True), + ), + migrations.AddField( + model_name='hotthermalstorageinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if hot thermal storage can serve space heating load', null=True), + ), + migrations.AddField( + model_name='hotthermalstorageoutputs', + name='storage_to_dhw_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='hotthermalstorageoutputs', + name='storage_to_process_heat_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='hotthermalstorageoutputs', + name='storage_to_space_heating_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='pvinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), + ), + migrations.AddField( + model_name='pvinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve process heat load', null=True), + ), + migrations.AddField( + model_name='pvinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), + ), + migrations.AddField( + model_name='steamturbineoutputs', + name='thermal_to_dhw_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='steamturbineoutputs', + name='thermal_to_process_heat_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='steamturbineoutputs', + name='thermal_to_space_heating_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AlterField( + model_name='heatingloadoutputs', + name='dhw_boiler_fuel_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly domestic hot water boiler fuel load [MMBTU/hr]', size=None), + ), + migrations.AlterField( + model_name='heatingloadoutputs', + name='space_heating_boiler_fuel_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly space heating boiler fuel load [MMBTU/hr]', size=None), + ), + migrations.AlterField( + model_name='heatingloadoutputs', + name='space_heating_thermal_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly space heating load [MMBTU/hr]', size=None), + ), + migrations.AlterField( + model_name='heatingloadoutputs', + name='total_heating_boiler_fuel_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100000000.0)]), blank=True, default=list, help_text='Hourly total boiler fuel load [MMBTU/hr]', size=None), + ), + migrations.AlterField( + model_name='pvinputs', + name='tilt', + field=models.FloatField(blank=True, help_text='PV system tilt angle. Default tilt is 20 degrees for fixed arrays (rooftop or ground-mounted) and 0 degrees for axis-tracking systems.', null=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(90)]), + ), + ] From 9a641d78d02041df640f487268415030f4303353 Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 11:14:11 -0600 Subject: [PATCH 16/35] update manifest pointer --- julia_src/Manifest.toml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 2cae08885..735b72b77 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.2" +julia_version = "1.10.3" manifest_format = "2.0" project_hash = "b3c6037c53375dada9e36c23f668bcd0efac8f34" @@ -198,7 +198,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.0+0" +version = "1.1.1+0" [[deps.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" @@ -917,9 +917,11 @@ 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 = "889950d32d143d0af8f4dd699c7e453e0b0b9589" +git-tree-sha1 = "386a43d35bb0328bf8ab28e33925cfdead6d1f29" +repo-rev = "add-process-heat-load" +repo-url = "https://github.com/NREL/REopt.jl.git" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" -rev="add-process-heat-load" +version = "0.45.0" [[deps.Random]] deps = ["SHA"] From f12130d502ca3af343ecf8120a5f2da1b51a5d7e Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 13:15:48 -0600 Subject: [PATCH 17/35] rm superfluous model updates to PV --- .../0059_processheatloadinputs_and_more.py | 15 --------------- reoptjl/models.py | 18 ------------------ 2 files changed, 33 deletions(-) diff --git a/reoptjl/migrations/0059_processheatloadinputs_and_more.py b/reoptjl/migrations/0059_processheatloadinputs_and_more.py index c9966fcc7..69b6a4949 100644 --- a/reoptjl/migrations/0059_processheatloadinputs_and_more.py +++ b/reoptjl/migrations/0059_processheatloadinputs_and_more.py @@ -168,21 +168,6 @@ class Migration(migrations.Migration): name='storage_to_space_heating_load_series_mmbtu_per_hour', field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), ), - migrations.AddField( - model_name='pvinputs', - name='can_serve_dhw', - field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), - ), - migrations.AddField( - model_name='pvinputs', - name='can_serve_process_heat', - field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve process heat load', null=True), - ), - migrations.AddField( - model_name='pvinputs', - name='can_serve_space_heating', - field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), - ), migrations.AddField( model_name='steamturbineoutputs', name='thermal_to_dhw_load_series_mmbtu_per_hour', diff --git a/reoptjl/models.py b/reoptjl/models.py index 6b09a1037..07e9ee730 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -2834,24 +2834,6 @@ class PV_LOCATION_CHOICES(models.TextChoices): blank=True, help_text="True/False for if technology has the ability to curtail energy production." ) - can_serve_dhw = models.BooleanField( - default=True, - null=True, - blank=True, - help_text="Boolean indicator if steam turbine can serve space heating load" - ) - can_serve_space_heating = models.BooleanField( - default=True, - null=True, - blank=True, - help_text="Boolean indicator if steam turbine can serve space heating load" - ) - can_serve_process_heat = models.BooleanField( - default=True, - null=True, - blank=True, - help_text="Boolean indicator if steam turbine can serve process heat load" - ) operating_reserve_required_fraction = models.FloatField( validators=[ From 4507f18f8489d1c49babd86a4b8509659dd26831 Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 13:16:30 -0600 Subject: [PATCH 18/35] point to develop branch --- julia_src/Manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 735b72b77..6ee4132c5 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -917,11 +917,11 @@ 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 = "386a43d35bb0328bf8ab28e33925cfdead6d1f29" -repo-rev = "add-process-heat-load" +git-tree-sha1 = "a72618235b98d6617e51c1e823e8ca01b5c7e404" +repo-rev = "develop" repo-url = "https://github.com/NREL/REopt.jl.git" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" -version = "0.45.0" +version = "0.46.0" [[deps.Random]] deps = ["SHA"] From ed3257354764038e7ea813f75583061e46ba825a Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 17:06:49 -0600 Subject: [PATCH 19/35] update tolerance on test --- reoptjl/test/test_job_endpoint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reoptjl/test/test_job_endpoint.py b/reoptjl/test/test_job_endpoint.py index 9ccf40042..b9e9a3479 100644 --- a/reoptjl/test/test_job_endpoint.py +++ b/reoptjl/test/test_job_endpoint.py @@ -226,7 +226,8 @@ def test_superset_input_fields(self): resp = self.api_client.get(f'/v3/job/{run_uuid}/results') r = json.loads(resp.content) results = r["outputs"] - self.assertAlmostEqual(results["Financial"]["npv"], -258533.19, places=-3) + print(r["Messages"]) + self.assertAlmostEqual(results["Financial"]["npv"], -258533.19, delta=0.01*results["Financiel"]["lcc"]) assert(resp.status_code==200) def test_steamturbine_defaults_from_julia(self): From c08c77f6de7a3f0051c15a6cf07772ba9a9bffe3 Mon Sep 17 00:00:00 2001 From: Zolan Date: Tue, 7 May 2024 17:06:56 -0600 Subject: [PATCH 20/35] Update Manifest.toml --- julia_src/Manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 6ee4132c5..9fdd36be2 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -917,7 +917,7 @@ 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 = "a72618235b98d6617e51c1e823e8ca01b5c7e404" +git-tree-sha1 = "01338b98d1a5a63ce1ae08dd14f7370f76ad6051" repo-rev = "develop" repo-url = "https://github.com/NREL/REopt.jl.git" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" From e96130873b203e4a0e7a513628a2491c98bdd2be Mon Sep 17 00:00:00 2001 From: Zolan Date: Wed, 8 May 2024 12:10:45 -0600 Subject: [PATCH 21/35] add heat-load-specific outputs to CHPOutputs --- .../0059_processheatloadinputs_and_more.py | 17 ++++++++++++++++- reoptjl/models.py | 12 ++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/reoptjl/migrations/0059_processheatloadinputs_and_more.py b/reoptjl/migrations/0059_processheatloadinputs_and_more.py index 69b6a4949..dfbdbb7a5 100644 --- a/reoptjl/migrations/0059_processheatloadinputs_and_more.py +++ b/reoptjl/migrations/0059_processheatloadinputs_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.7 on 2024-05-07 16:49 +# Generated by Django 4.0.7 on 2024-05-08 18:09 import django.contrib.postgres.fields import django.core.validators @@ -73,6 +73,21 @@ class Migration(migrations.Migration): name='can_serve_space_heating', field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if CHP can serve space heating load', null=True), ), + migrations.AddField( + model_name='chpoutputs', + name='thermal_to_dhw_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='chpoutputs', + name='thermal_to_process_heat_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), + migrations.AddField( + model_name='chpoutputs', + name='thermal_to_space_heating_load_series_mmbtu_per_hour', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), + ), migrations.AddField( model_name='existingboilerinputs', name='can_serve_dhw', diff --git a/reoptjl/models.py b/reoptjl/models.py index 07e9ee730..912d5d23d 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -4476,6 +4476,18 @@ class CHPOutputs(BaseModel, models.Model): models.FloatField(null=True, blank=True), default = list, ) + thermal_to_dhw_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list, + ) + thermal_to_space_heating_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list, + ) + thermal_to_process_heat_load_series_mmbtu_per_hour = ArrayField( + models.FloatField(null=True, blank=True), + default = list, + ) def clean(): pass From 643903ae2e02fa57c8fd4b845f0fd840a91a1239 Mon Sep 17 00:00:00 2001 From: Zolan Date: Wed, 8 May 2024 13:07:59 -0600 Subject: [PATCH 22/35] update lcc test condition for test_superset_input_fields --- reoptjl/test/test_job_endpoint.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reoptjl/test/test_job_endpoint.py b/reoptjl/test/test_job_endpoint.py index b9e9a3479..3e386c228 100644 --- a/reoptjl/test/test_job_endpoint.py +++ b/reoptjl/test/test_job_endpoint.py @@ -226,8 +226,7 @@ def test_superset_input_fields(self): resp = self.api_client.get(f'/v3/job/{run_uuid}/results') r = json.loads(resp.content) results = r["outputs"] - print(r["Messages"]) - self.assertAlmostEqual(results["Financial"]["npv"], -258533.19, delta=0.01*results["Financiel"]["lcc"]) + self.assertAlmostEqual(results["Financial"]["npv"], -258533.19, delta=0.01*results["Financial"]["lcc"]) assert(resp.status_code==200) def test_steamturbine_defaults_from_julia(self): From 324f738e686f46115ebf7509ad3b2e3cc74b7f30 Mon Sep 17 00:00:00 2001 From: Zolan Date: Wed, 8 May 2024 22:26:20 -0600 Subject: [PATCH 23/35] point to feature branch in manifest for GHP bugfix --- julia_src/Manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 9fdd36be2..83a1172a6 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -917,8 +917,8 @@ 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 = "01338b98d1a5a63ce1ae08dd14f7370f76ad6051" -repo-rev = "develop" +git-tree-sha1 = "28bbe232da58b84194f3c1b4f0d60d577f24ba2c" +repo-rev = "fix-ghp-storage-dispatch" repo-url = "https://github.com/NREL/REopt.jl.git" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" version = "0.46.0" From 80078108be79d5ca55ca1db04997fcc5145578cd Mon Sep 17 00:00:00 2001 From: Zolan Date: Thu, 9 May 2024 09:47:21 -0600 Subject: [PATCH 24/35] Add test for process heat load in thermal results --- reoptjl/test/posts/test_thermal_in_results.json | 3 +++ reoptjl/test/test_job_endpoint.py | 1 + 2 files changed, 4 insertions(+) diff --git a/reoptjl/test/posts/test_thermal_in_results.json b/reoptjl/test/posts/test_thermal_in_results.json index 2918f87a4..2be1bc8ce 100644 --- a/reoptjl/test/posts/test_thermal_in_results.json +++ b/reoptjl/test/posts/test_thermal_in_results.json @@ -37,6 +37,9 @@ "doe_reference_name": "Hospital", "annual_mmbtu": 500.0 }, + "ProcessHeatLoad": { + "annual_mmbtu": 100 + }, "ExistingBoiler": { "efficiency": 0.72, "production_type": "hot_water", diff --git a/reoptjl/test/test_job_endpoint.py b/reoptjl/test/test_job_endpoint.py index 3e386c228..fe2b227d0 100644 --- a/reoptjl/test/test_job_endpoint.py +++ b/reoptjl/test/test_job_endpoint.py @@ -136,6 +136,7 @@ def test_thermal_in_results(self): self.assertIn("ExistingChiller",list(results.keys())) self.assertIn("ExistingBoiler", list(results.keys())) self.assertIn("HeatingLoad", list(results.keys())) + self.assertIn("process_heat_thermal_load_series_mmbtu_per_hour", list(results["HeatingLoad"].keys())) self.assertIn("HotThermalStorage", list(results.keys())) self.assertIn("ColdThermalStorage", list(results.keys())) self.assertIn("AbsorptionChiller", list(results.keys())) From 68b2a0ff8f99a42d333088f894a5b9b3cbac14b0 Mon Sep 17 00:00:00 2001 From: Zolan Date: Thu, 9 May 2024 15:08:33 -0600 Subject: [PATCH 25/35] add booleans to SteamTurbineInputs --- .../0059_processheatloadinputs_and_more.py | 17 ++++++++++++++++- reoptjl/models.py | 19 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/reoptjl/migrations/0059_processheatloadinputs_and_more.py b/reoptjl/migrations/0059_processheatloadinputs_and_more.py index dfbdbb7a5..5390cffbd 100644 --- a/reoptjl/migrations/0059_processheatloadinputs_and_more.py +++ b/reoptjl/migrations/0059_processheatloadinputs_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.7 on 2024-05-08 18:09 +# Generated by Django 4.0.7 on 2024-05-09 20:02 import django.contrib.postgres.fields import django.core.validators @@ -183,6 +183,21 @@ class Migration(migrations.Migration): name='storage_to_space_heating_load_series_mmbtu_per_hour', field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), default=list, size=None), ), + migrations.AddField( + model_name='steamturbineinputs', + name='can_serve_dhw', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), + ), + migrations.AddField( + model_name='steamturbineinputs', + name='can_serve_process_heat', + field=models.BooleanField(blank=True, default=False, help_text='Boolean indicator if steam turbine can serve process heat load', null=True), + ), + migrations.AddField( + model_name='steamturbineinputs', + name='can_serve_space_heating', + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve space heating load', null=True), + ), migrations.AddField( model_name='steamturbineoutputs', name='thermal_to_dhw_load_series_mmbtu_per_hour', diff --git a/reoptjl/models.py b/reoptjl/models.py index 912d5d23d..76a398c5f 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -5559,7 +5559,24 @@ class SIZE_CLASS_LIST(models.IntegerChoices): help_text="True/False for if technology has the ability to curtail energy production." ) - + can_serve_dhw = models.BooleanField( + default=True, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve space heating load" + ) + can_serve_space_heating = models.BooleanField( + default=True, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve space heating load" + ) + can_serve_process_heat = models.BooleanField( + default=False, + null=True, + blank=True, + help_text="Boolean indicator if steam turbine can serve process heat load" + ) macrs_option_years = models.IntegerField( default=MACRS_YEARS_CHOICES.ZERO, From 1aa8d45b29218ff11bad4c37e8c96281de498eb4 Mon Sep 17 00:00:00 2001 From: Zolan Date: Thu, 9 May 2024 15:32:23 -0600 Subject: [PATCH 26/35] add heat-load-specific outputs to test --- reoptjl/test/test_job_endpoint.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reoptjl/test/test_job_endpoint.py b/reoptjl/test/test_job_endpoint.py index fe2b227d0..5ac8f3dc9 100644 --- a/reoptjl/test/test_job_endpoint.py +++ b/reoptjl/test/test_job_endpoint.py @@ -133,11 +133,18 @@ def test_thermal_in_results(self): self.assertIn("CoolingLoad", list(inputs.keys())) self.assertIn("CoolingLoad", list(results.keys())) self.assertIn("CHP", list(results.keys())) + self.assertIn("thermal_to_dhw_load_series_mmbtu_per_hour", list(results["CHP"].keys())) + self.assertIn("thermal_to_space_heating_load_series_mmbtu_per_hour", list(results["CHP"].keys())) + self.assertIn("thermal_to_dhw_load_series_mmbtu_per_hour", list(results["CHP"].keys())) self.assertIn("ExistingChiller",list(results.keys())) self.assertIn("ExistingBoiler", list(results.keys())) self.assertIn("HeatingLoad", list(results.keys())) self.assertIn("process_heat_thermal_load_series_mmbtu_per_hour", list(results["HeatingLoad"].keys())) + self.assertIn("process_heat_boiler_fuel_load_series_mmbtu_per_hour", list(results["HeatingLoad"].keys())) self.assertIn("HotThermalStorage", list(results.keys())) + self.assertIn("storage_to_dhw_load_series_mmbtu_per_hour", list(results["HotThermalStorage"].keys())) + self.assertIn("storage_to_space_heating_load_series_mmbtu_per_hour", list(results["HotThermalStorage"].keys())) + self.assertIn("storage_to_dhw_load_series_mmbtu_per_hour", list(results["HotThermalStorage"].keys())) self.assertIn("ColdThermalStorage", list(results.keys())) self.assertIn("AbsorptionChiller", list(results.keys())) self.assertIn("GHP", list(results.keys())) From af2ed82b7f8984e3fc5125369fc2712e2081af75 Mon Sep 17 00:00:00 2001 From: Zolan Date: Thu, 9 May 2024 15:46:40 -0600 Subject: [PATCH 27/35] reset non-REopt manifest changes --- julia_src/Manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 83a1172a6..8cfb22e46 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.3" +julia_version = "1.10.2" manifest_format = "2.0" project_hash = "b3c6037c53375dada9e36c23f668bcd0efac8f34" @@ -198,7 +198,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" +version = "1.1.0+0" [[deps.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" From 44e40273908586036ac17b7ee009161312c730e9 Mon Sep 17 00:00:00 2001 From: Alex Zolan Date: Thu, 9 May 2024 15:53:44 -0600 Subject: [PATCH 28/35] Update CHANGELOG.md --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37d4a6034..42e7068d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,19 @@ Classify the change according to the following categories: ##### Removed ### Patches +## Develop 2024-05-09 +### Minor Updates +#### Added +- In `reoptjl/models.py`, added the following fields: + - booleans **can_serve_dhw**, **can_serve_space_heating**, and **can_serve_process_heat** to models **CHPInputs**, **ExistingBoilerInputs**, **BoilerInputs**, **SteamTurbineInputs**, and **HotThermalStorageInputs** + - booleans **can_serve_space_heating** and **can_serve_process_heat** to model **GHPInputs** + - arrays **storage_to_dhw_load_series_mmbtu_per_hour**, **storage_to_space_heating_load_series_mmbtu_per_hour** and **storage_to_process_heat_load_series_mmbtu_per_hour** to model **HotThermalStorageOutputs** + - **heating_load_input** to model **AbsorptionChillerInputs** + - arrays **thermal_to_dhw_load_series_mmbtu_per_hour**, **thermal_to_space_heating_load_series_mmbtu_per_hour**, and **thermal_to_process_heat_load_series_mmbtu_per_hour** to models **CHPOutputs**, **ExistingBoilerOutputs**, **BoilerOutputs**, **SteamTurbineOutputs**, and **HotThermalStorageOutputs** +- In `reopt.jl/models.py`, added new model **ProcessHeatLoadInputs** with references in `reoptjl/validators.py` and `reoptjl/views.py` +- Added process heat load to test scenario `reoptjl/test/posts/test_thermal_in_results.json` +- Added tests for the presence of process heat load and heat-load-specfic outputs to `test_thermal_in_results` within `reoptjl/test/test_job_endpoint.py` + ## v3.8.0 ### Minor Updates #### Changed From 7415e8adde300f9ce25fd463a8bb84b8924c761c Mon Sep 17 00:00:00 2001 From: Zolan Date: Thu, 9 May 2024 20:55:59 -0600 Subject: [PATCH 29/35] change steam turbine can_serve_process_heat default to True --- reoptjl/migrations/0059_processheatloadinputs_and_more.py | 2 +- reoptjl/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reoptjl/migrations/0059_processheatloadinputs_and_more.py b/reoptjl/migrations/0059_processheatloadinputs_and_more.py index 5390cffbd..7c0bed303 100644 --- a/reoptjl/migrations/0059_processheatloadinputs_and_more.py +++ b/reoptjl/migrations/0059_processheatloadinputs_and_more.py @@ -191,7 +191,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='steamturbineinputs', name='can_serve_process_heat', - field=models.BooleanField(blank=True, default=False, help_text='Boolean indicator if steam turbine can serve process heat load', null=True), + field=models.BooleanField(blank=True, default=True, help_text='Boolean indicator if steam turbine can serve process heat load', null=True), ), migrations.AddField( model_name='steamturbineinputs', diff --git a/reoptjl/models.py b/reoptjl/models.py index 76a398c5f..c2da664ca 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -5572,7 +5572,7 @@ class SIZE_CLASS_LIST(models.IntegerChoices): help_text="Boolean indicator if steam turbine can serve space heating load" ) can_serve_process_heat = models.BooleanField( - default=False, + default=True, null=True, blank=True, help_text="Boolean indicator if steam turbine can serve process heat load" From 6b22d333648848dded146a32c83585986fb5839f Mon Sep 17 00:00:00 2001 From: adfarth Date: Thu, 9 May 2024 21:51:15 -0600 Subject: [PATCH 30/35] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42e7068d1..5f0bf52f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ Classify the change according to the following categories: - arrays **storage_to_dhw_load_series_mmbtu_per_hour**, **storage_to_space_heating_load_series_mmbtu_per_hour** and **storage_to_process_heat_load_series_mmbtu_per_hour** to model **HotThermalStorageOutputs** - **heating_load_input** to model **AbsorptionChillerInputs** - arrays **thermal_to_dhw_load_series_mmbtu_per_hour**, **thermal_to_space_heating_load_series_mmbtu_per_hour**, and **thermal_to_process_heat_load_series_mmbtu_per_hour** to models **CHPOutputs**, **ExistingBoilerOutputs**, **BoilerOutputs**, **SteamTurbineOutputs**, and **HotThermalStorageOutputs** + - boolean **retire_in_optimal** to **ExistingBoilerInputs** - In `reopt.jl/models.py`, added new model **ProcessHeatLoadInputs** with references in `reoptjl/validators.py` and `reoptjl/views.py` - Added process heat load to test scenario `reoptjl/test/posts/test_thermal_in_results.json` - Added tests for the presence of process heat load and heat-load-specfic outputs to `test_thermal_in_results` within `reoptjl/test/test_job_endpoint.py` From abf56a1e8cf0c94e1e24797785f88290bf010b69 Mon Sep 17 00:00:00 2001 From: adfarth Date: Thu, 9 May 2024 21:56:04 -0600 Subject: [PATCH 31/35] spelling fix --- reoptjl/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index c2da664ca..53c907f49 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -6694,7 +6694,7 @@ class AbsorptionChillerInputs(BaseModel, models.Model): )) HEATING_LOAD_INPUT = models.TextChoices('HEATING_LOAD_INPUT', ( - 'DomesitHotWater', + 'DomesticHotWater', 'SpaceHeating', 'ProcessHeat' )) From ae8fceac0a30a8552d465260066a59d28f2edd00 Mon Sep 17 00:00:00 2001 From: Zolan Date: Fri, 10 May 2024 09:53:38 -0600 Subject: [PATCH 32/35] point to v0.46.1 of REopt.jl --- julia_src/Manifest.toml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/julia_src/Manifest.toml b/julia_src/Manifest.toml index 8cfb22e46..ef21d5b2a 100644 --- a/julia_src/Manifest.toml +++ b/julia_src/Manifest.toml @@ -917,11 +917,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 = "28bbe232da58b84194f3c1b4f0d60d577f24ba2c" -repo-rev = "fix-ghp-storage-dispatch" -repo-url = "https://github.com/NREL/REopt.jl.git" +git-tree-sha1 = "3c40f3939f79c3f66df69e9acc503fef614cdd63" uuid = "d36ad4e8-d74a-4f7a-ace1-eaea049febf6" -version = "0.46.0" +version = "0.46.1" [[deps.Random]] deps = ["SHA"] From d7d6652c4dd3dcc0970c7305c035673fd374f744 Mon Sep 17 00:00:00 2001 From: Zolan Date: Fri, 10 May 2024 09:55:02 -0600 Subject: [PATCH 33/35] update comment in ProcessHeatLoadInputs --- reoptjl/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reoptjl/models.py b/reoptjl/models.py index c2da664ca..35d66ba6b 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -6372,7 +6372,7 @@ def clean(self): self.addressable_load_fraction = list([1.0]) # should not convert to timeseries, in case it is to be used with monthly_mmbtu or annual_mmbtu class ProcessHeatLoadInputs(BaseModel, models.Model): - # DHW + # Process Heat key = "ProcessHeatLoad" meta = models.OneToOneField( From 991e2a0d1c4e487b07089856d030a9513e81d93b Mon Sep 17 00:00:00 2001 From: adfarth Date: Mon, 13 May 2024 13:15:39 -0600 Subject: [PATCH 34/35] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f0bf52f6..c896b284f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ Classify the change according to the following categories: ##### Removed ### Patches -## Develop 2024-05-09 +## v3.9.0 ### Minor Updates #### Added - In `reoptjl/models.py`, added the following fields: @@ -39,6 +39,8 @@ Classify the change according to the following categories: - In `reopt.jl/models.py`, added new model **ProcessHeatLoadInputs** with references in `reoptjl/validators.py` and `reoptjl/views.py` - Added process heat load to test scenario `reoptjl/test/posts/test_thermal_in_results.json` - Added tests for the presence of process heat load and heat-load-specfic outputs to `test_thermal_in_results` within `reoptjl/test/test_job_endpoint.py` +#### Changed +- Point to REopt.jl v0.46.1 which includes bug fixes in net metering and updated PV resource data calls ## v3.8.0 ### Minor Updates From 547986a0938012db97b66a87f2303c4ba8d44f06 Mon Sep 17 00:00:00 2001 From: adfarth Date: Mon, 13 May 2024 13:20:31 -0600 Subject: [PATCH 35/35] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c896b284f..d582c6dda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ Classify the change according to the following categories: - Added tests for the presence of process heat load and heat-load-specfic outputs to `test_thermal_in_results` within `reoptjl/test/test_job_endpoint.py` #### Changed - Point to REopt.jl v0.46.1 which includes bug fixes in net metering and updated PV resource data calls +#### Fixed +- Fix bug in setting default ElectricUtility.emissions_factor_CO2_decrease_fraction. Previously, user-input values were getting overwritten. ## v3.8.0 ### Minor Updates