Skip to content

Commit

Permalink
Merge pull request #452 from NREL/develop
Browse files Browse the repository at this point in the history
Add hybrid GHX functionality
  • Loading branch information
Bill-Becker authored Mar 30, 2023
2 parents 016a630 + 5d7dc6d commit babfb0b
Show file tree
Hide file tree
Showing 29 changed files with 801 additions and 23 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ Classify the change according to the following categories:
##### Removed
### Patches

## v2.11.0
### Minor Updates
##### Added
- Enabled hybrid GHX sizing within the GHP model through the **hybrid_ghx_sizing_method** variable
- User is able to select "Automatic" (REopt sizes GHX based on the smaller of the heating or cooling load), "Fractional" (GHX size is a user-defined fraction of the non-hybrid GHX size), or "None" (non-hybrid)
- Auxiliary heater and cooler are both currently only electric
- Outputs added to track the thermal production, electrical consumption, and size of the auxiliary unit
##### Changed
- Updated default value **init_sizing_factor_ft_per_peak_ton** from 246.1 to 75 for the `/ghpghx` endpoint

## v2.10.1
### Patches
- Make **ERPOutageInputs** field **max_outage_duration** required
Expand Down
39 changes: 39 additions & 0 deletions ghpghx/migrations/0004_ghpghxoutputs_end_of_year_eft_f_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Generated by Django 4.0.7 on 2023-03-07 01:46

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


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0003_auto_20211222_1817'),
]

operations = [
migrations.AddField(
model_name='ghpghxoutputs',
name='end_of_year_eft_f',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='End of year entering fluid temperature for all years in the last iteration of GHX sizing [degF]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='peak_auxiliary_boiler_mmbtu_per_hour',
field=models.FloatField(blank=True, help_text='Peak auxiliary boiler consumption for boiler sizing [MMBtu/hr]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='peak_auxiliary_cooling_tower_ton',
field=models.FloatField(blank=True, help_text='Peak auxiliary cooling tower consumption for cooling tower sizing [ton]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_auxiliary_boiler_consumption_series_mmbtu_per_hour',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary boiler consumption, average across simulation years [MMBtu/hr]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_auxiliary_cooling_tower_consumption_series_ton',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary cooling tower consumption, average across simulation years [ton]', null=True, size=None),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Generated by Django 4.0.7 on 2023-03-10 02:48

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


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0004_ghpghxoutputs_end_of_year_eft_f_and_more'),
]

operations = [
migrations.RemoveField(
model_name='ghpghxoutputs',
name='peak_auxiliary_boiler_mmbtu_per_hour',
),
migrations.RemoveField(
model_name='ghpghxoutputs',
name='peak_auxiliary_cooling_tower_ton',
),
migrations.RemoveField(
model_name='ghpghxoutputs',
name='yearly_auxiliary_boiler_consumption_series_mmbtu_per_hour',
),
migrations.RemoveField(
model_name='ghpghxoutputs',
name='yearly_auxiliary_cooling_tower_consumption_series_ton',
),
migrations.AddField(
model_name='ghpghxinputs',
name='is_hybrid_ghx',
field=models.BooleanField(blank=True, default=True, help_text='If the GHP system uses a hybrid GHX with auxiliary heater or cooler', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='annual_aux_cooler_electric_consumption_kwh',
field=models.FloatField(blank=True, help_text='Annual auxiliary cooler electrical consumption [kWh]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='annual_aux_heater_electric_consumption_kwh',
field=models.FloatField(blank=True, help_text='Annual auxiliary heater electrical consumption [kWh]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='peak_aux_cooler_thermal_production_ton',
field=models.FloatField(blank=True, help_text='Peak auxiliary cooler thermal production for cooler sizing [ton]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='peak_aux_heater_thermal_production_mmbtu_per_hour',
field=models.FloatField(blank=True, help_text='Peak auxiliary heater thermal production for heater sizing [MMBtu/hr]', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_aux_cooler_electric_consumption_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary cooler electrical consumption, average across simulation years [kW]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_aux_cooler_thermal_production_series_kwt',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary cooler thermal production, average across simulation years [kW-thermal]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_aux_heater_electric_consumption_series_kw',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary heater electrical consumption, average across simulation years [kW]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_aux_heater_thermal_production_series_mmbtu_per_hour',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly auxiliary heater thermal production, average across simulation years [MMBtu/hr]', null=True, size=None),
),
]
18 changes: 18 additions & 0 deletions ghpghx/migrations/0006_alter_ghpghxinputs_is_hybrid_ghx.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.0.7 on 2023-03-10 05:48

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0005_remove_ghpghxoutputs_peak_auxiliary_boiler_mmbtu_per_hour_and_more'),
]

operations = [
migrations.AlterField(
model_name='ghpghxinputs',
name='is_hybrid_ghx',
field=models.BooleanField(blank=True, help_text='If the GHP system uses a hybrid GHX with auxiliary heater or cooler', null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.0.7 on 2023-03-10 07:19

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0006_alter_ghpghxinputs_is_hybrid_ghx'),
]

operations = [
migrations.AddField(
model_name='ghpghxoutputs',
name='aux_heat_exchange_unit_type',
field=models.TextField(blank=True, help_text='Specifies if the auxiliary heat exchange unit is a heater or cooler', null=True),
),
migrations.AlterField(
model_name='ghpghxinputs',
name='is_hybrid_ghx',
field=models.BooleanField(blank=True, default=True, help_text='If the GHP system uses a hybrid GHX with auxiliary heater or cooler', null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 4.0.7 on 2023-03-12 04:18

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0007_ghpghxoutputs_aux_heat_exchange_unit_type_and_more'),
]

operations = [
migrations.AddField(
model_name='ghpghxinputs',
name='aux_cooler_energy_use_intensity_kwe_per_kwt',
field=models.FloatField(blank=True, default=0.2, help_text='The energy use intensity of the auxiliary cooler [kWe/kWt]', null=True, validators=[django.core.validators.MinValueValidator(0.001), django.core.validators.MaxValueValidator(10.0)]),
),
migrations.AddField(
model_name='ghpghxinputs',
name='aux_heater_thermal_efficiency',
field=models.FloatField(blank=True, default=0.98, help_text='The thermal efficiency (thermal_out/fuel_in) of the auxiliary heater', null=True, validators=[django.core.validators.MinValueValidator(0.001), django.core.validators.MaxValueValidator(10.0)]),
),
]
23 changes: 23 additions & 0 deletions ghpghx/migrations/0009_ghpghxinputs_hybrid_sizing_flag_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.0.7 on 2023-03-13 16:57

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0008_ghpghxinputs_aux_cooler_energy_use_intensity_kwe_per_kwt_and_more'),
]

operations = [
migrations.AddField(
model_name='ghpghxinputs',
name='hybrid_sizing_flag',
field=models.FloatField(blank=True, default=1.0, help_text='Possible values: -2 (size for heating), -1.0 (size for cooling), 1.0 (non-hybrid), value between 0-1 (fraction of full GHE size)', null=True),
),
migrations.AddField(
model_name='ghpghxinputs',
name='is_heating_electric',
field=models.BooleanField(blank=True, default=True, help_text='Set to True if heating is electric, false otherwise', null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Generated by Django 4.0.7 on 2023-03-20 17:02

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


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0009_ghpghxinputs_hybrid_sizing_flag_and_more'),
]

operations = [
migrations.RemoveField(
model_name='ghpghxoutputs',
name='end_of_year_eft_f',
),
migrations.AddField(
model_name='ghpghxoutputs',
name='end_of_year_ghx_lft_f',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='End of year GHX leaving fluid temperature for all years in the last iteration of GHX sizing [degF]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='ghx_soln_number_of_iterations',
field=models.IntegerField(blank=True, help_text='The number of iterations taken to get GHX sizing', null=True),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='max_yearly_ghx_lft_f',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Maximum GHX leaving fluid temperature for all years in the last iteration of GHX sizing [degF]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='min_yearly_ghx_lft_f',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Minimum GHX leaving fluid temperature for all years in the last iteration of GHX sizing [degF]', null=True, size=None),
),
migrations.AddField(
model_name='ghpghxoutputs',
name='yearly_ghx_lft_series_f',
field=django.contrib.postgres.fields.ArrayField(base_field=models.FloatField(blank=True, null=True), blank=True, default=list, help_text='Hourly GHX leaving fluid temperature (lft), average across simulation years [kW]', null=True, size=None),
),
migrations.AlterField(
model_name='ghpghxinputs',
name='aux_cooler_energy_use_intensity_kwe_per_kwt',
field=models.FloatField(blank=True, default=0.02, help_text='The energy use intensity of the auxiliary cooler [kWe/kWt]', null=True, validators=[django.core.validators.MinValueValidator(0.001), django.core.validators.MaxValueValidator(1.0)]),
),
migrations.AlterField(
model_name='ghpghxinputs',
name='aux_heater_thermal_efficiency',
field=models.FloatField(blank=True, default=0.98, help_text='The thermal efficiency (thermal_out/fuel_in) of the auxiliary heater', null=True, validators=[django.core.validators.MinValueValidator(0.001), django.core.validators.MaxValueValidator(1.0)]),
),
migrations.AlterField(
model_name='ghpghxinputs',
name='hybrid_sizing_flag',
field=models.FloatField(blank=True, default=1.0, help_text='Possible values: -2 (size for heating), -1.0 (size for cooling), 1.0 (non-hybrid), value between 0-1 (fraction of full GHX size)', null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 4.0.7 on 2023-03-22 03:34

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0010_remove_ghpghxoutputs_end_of_year_eft_f_and_more'),
]

operations = [
migrations.AddField(
model_name='ghpghxinputs',
name='hybrid_ghx_sizing_fraction',
field=models.FloatField(blank=True, default=0.6, help_text='Applies fraction to full GHX size for hybrid sizing (value between 0.1 - 1.0)', null=True, validators=[django.core.validators.MinValueValidator(0.1), django.core.validators.MaxValueValidator(1.0)]),
),
migrations.AddField(
model_name='ghpghxinputs',
name='hybrid_ghx_sizing_method',
field=models.TextField(blank=True, default='None', help_text="Possible values: 'Fractional' (user inputs fraction of full GHX size), 'Automatic' (REopt determines based on the smaller heating or cooling load), 'None' (non-hybrid)", null=True),
),
]
17 changes: 17 additions & 0 deletions ghpghx/migrations/0012_remove_ghpghxinputs_is_hybrid_ghx.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.0.7 on 2023-03-23 21:53

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0011_ghpghxinputs_hybrid_ghx_sizing_fraction_and_more'),
]

operations = [
migrations.RemoveField(
model_name='ghpghxinputs',
name='is_hybrid_ghx',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.0.7 on 2023-03-28 18:32

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('ghpghx', '0012_remove_ghpghxinputs_is_hybrid_ghx'),
]

operations = [
migrations.AlterField(
model_name='ghpghxinputs',
name='init_sizing_factor_ft_per_peak_ton',
field=models.FloatField(blank=True, default=75, help_text='Initial guess of total feet of GHX boreholes (total feet = N bores * Length bore) based on peak ton heating/cooling [ft/ton]', validators=[django.core.validators.MinValueValidator(1.0), django.core.validators.MaxValueValidator(5000.0)]),
),
]
Loading

0 comments on commit babfb0b

Please sign in to comment.