Skip to content

Commit

Permalink
Merge pull request #443 from NREL/develop
Browse files Browse the repository at this point in the history
Stochastic/Multi-Outages: add Outages outputs and CHP; CHP defaults fixes;
  • Loading branch information
hdunham authored Mar 23, 2023
2 parents 34a713a + e8c3bd0 commit 417122e
Show file tree
Hide file tree
Showing 17 changed files with 460 additions and 67 deletions.
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,21 @@ Classify the change according to the following categories:
##### Removed
### Patches

## v2.10.0
### Minor Updates
##### Added
- REopt.jl outage outputs not yet integrated into the API: **OutageOutputs** fields **storage_microgrid_upgrade_cost**, **storage_discharge_series_kw**, **pv_microgrid_size_kw**, **pv_microgrid_upgrade_cost**, **pv_to_storage_series_kw**, **pv_curtailed_series_kw**, **pv_to_load_series_kw**, **generator_microgrid_size_kw**, **generator_microgrid_upgrade_cost**, **generator_to_storage_series_kw**, **generator_curtailed_series_kw**, **generator_to_load_series_kw**, **chp_microgrid_size_kw**, **chp_microgrid_upgrade_cost**, **chp_to_storage_series_kw**, **chp_curtailed_series_kw**, **chp_to_load_series_kw**, **chp_fuel_used_per_outage_mmbtu**
##### Changed
- Default **FinancialInputs** field **microgrid_upgrade_cost_fraction** to 0
- Add missing units to **OutageOutputs** field names: **unserved_load_series_kw**, **unserved_load_per_outage_kwh**, **generator_fuel_used_per_outage_gal**
##### Fixed
- Default ERP **OutageInputs** **max_outage_duration** to max value in **ElectricUtility** **outage_durations** if **reopt_run_uuid** provided for ERP job

## v2.9.1
### Patches
##### Added
- In job/ app (v3): emissions_profile endpoint and view function that returns the emissions data for a location


## v2.9.0
### Minor Updates
##### Added
Expand Down
2 changes: 1 addition & 1 deletion job/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def obj_create(self, bundle, **kwargs):
meta = {
"run_uuid": run_uuid,
"api_version": 3,
"reopt_version": "0.28.0",
"reopt_version": "0.29.0",
"status": "Validating..."
}
bundle.data.update({"APIMeta": meta})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Generated by Django 4.0.4 on 2023-03-20 22:23

import django.contrib.postgres.fields
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('job', '0030_merge_20230317_1434'),
]

operations = [
migrations.RenameField(
model_name='outageoutputs',
old_name='unserved_load_series',
new_name='unserved_load_series_kw',
),
migrations.RemoveField(
model_name='outageoutputs',
name='generator_fuel_used_per_outage',
),
migrations.RemoveField(
model_name='outageoutputs',
name='unserved_load_per_outage',
),
migrations.AddField(
model_name='outageoutputs',
name='generator_curtailed_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of generator power curtailed in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='generator_fuel_used_per_outage_gal',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, help_text='Generator fuel used in each outage modeled. Outage duration changes along the first dimension and outage start time changes along the second dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='generator_microgrid_size_kw',
field=models.FloatField(blank=True, help_text='Optimal generator capacity included in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='generator_microgrid_upgrade_cost',
field=models.FloatField(blank=True, help_text='Capital cost of including the generator system in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='generator_to_load_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of generator power used to meet load in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='generator_to_storage_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of generator power sent to the battery in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='pv_curtailed_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of PV power curtailed in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='pv_microgrid_size_kw',
field=models.FloatField(blank=True, help_text='Optimal PV capacity included in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='pv_microgrid_upgrade_cost',
field=models.FloatField(blank=True, help_text='Capital cost of including the PV system in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='pv_to_load_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of PV power used to meet load in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='pv_to_storage_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of PV power sent to the battery in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='storage_discharge_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of storage power discharged in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='storage_microgrid_upgrade_cost',
field=models.FloatField(blank=True, help_text='Capital cost of including the electric storage system in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='unserved_load_per_outage_kwh',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, help_text='The total unserved load for each outage start time and duration. Outage duration changes along the first dimension and outage start time changes along the second dimension.', size=None),
),
migrations.AlterField(
model_name='reoptjlmessageoutputs',
name='has_stacktrace',
field=models.BooleanField(blank=True, default=False, help_text='REopt.jl can return a handled error with corrective instructions or an unhandled error with a stacktrace of what went wrong for further insepction.This field is True if the error message has a stacktrace, otherwise False.'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Generated by Django 4.0.4 on 2023-03-22 23:28

import django.contrib.postgres.fields
import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('job', '0031_rename_unserved_load_series_outageoutputs_unserved_load_series_kw_and_more'),
]

operations = [
migrations.AddField(
model_name='outageoutputs',
name='chp_curtailed_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of CHP power curtailed in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='chp_fuel_used_per_outage_mmbtu',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, help_text='CHP fuel used in each outage modeled. Outage duration changes along the first dimension and outage start time changes along the second dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='chp_microgrid_size_kw',
field=models.FloatField(blank=True, help_text='Optimal CHP electric capacity included in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='chp_microgrid_upgrade_cost',
field=models.FloatField(blank=True, help_text='Capital cost of including the CHP system in the microgrid.', null=True),
),
migrations.AddField(
model_name='outageoutputs',
name='chp_to_load_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of CHP power used to meet load in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AddField(
model_name='outageoutputs',
name='chp_to_storage_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True), blank=True, default=list, size=None), blank=True, default=list, size=None), blank=True, default=list, help_text='Array of CHP power sent to the battery in every outage modeled. Outage duration changes along the first dimension, outage start time changes along the second dimension, and hour within outage changes along the third dimension.', size=None),
),
migrations.AlterField(
model_name='financialinputs',
name='microgrid_upgrade_cost_fraction',
field=models.FloatField(blank=True, default=0, help_text='Additional cost, in percent of non-islandable capital costs, to make a distributed energy system islandable from the grid and able to serve critical loads. Includes all upgrade costs such as additional labor and critical load panels. Costs apply only when modeling outages using the outage_start_time_steps, outage_durations, and outage_probabilities inputs, and do not apply when modeling a single outage using outage_start_time_step and outage_end_time_step.', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1)]),
),
migrations.AlterField(
model_name='financialoutputs',
name='microgrid_upgrade_cost',
field=models.FloatField(blank=True, help_text='Cost to make a distributed energy system islandable from the grid. Determined by multiplying the total capital costs of resultant energy systems from REopt (such as PV and Storage system) with the input value for microgrid_upgrade_cost_fraction (which defaults to 0).', null=True),
),
]
Loading

0 comments on commit 417122e

Please sign in to comment.