From edbb6b80a3bfa7319b6c6ed10a511a2c3288e781 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:25:22 -0700 Subject: [PATCH 1/8] update generator capx default --- job/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/job/models.py b/job/models.py index 613799a37..b31694881 100644 --- a/job/models.py +++ b/job/models.py @@ -3271,7 +3271,7 @@ class GeneratorInputs(BaseModel, models.Model): help_text="Maximum diesel generator size constraint for optimization. Set to zero to disable PV" ) installed_cost_per_kw = models.FloatField( - default=500, + default=650, validators=[ MinValueValidator(0.0), MaxValueValidator(1.0e5) From c415a2af14bcaa7c10ed005dce72deab1689be83 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:26:03 -0700 Subject: [PATCH 2/8] Create 0037_alter_generatorinputs_installed_cost_per_kw.py --- ...r_generatorinputs_installed_cost_per_kw.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 job/migrations/0037_alter_generatorinputs_installed_cost_per_kw.py diff --git a/job/migrations/0037_alter_generatorinputs_installed_cost_per_kw.py b/job/migrations/0037_alter_generatorinputs_installed_cost_per_kw.py new file mode 100644 index 000000000..c4637b3e0 --- /dev/null +++ b/job/migrations/0037_alter_generatorinputs_installed_cost_per_kw.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.4 on 2023-07-03 20:25 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('job', '0036_merge_20230424_1645'), + ] + + operations = [ + migrations.AlterField( + model_name='generatorinputs', + name='installed_cost_per_kw', + field=models.FloatField(blank=True, default=650, help_text='Installed diesel generator cost in $/kW', validators=[django.core.validators.MinValueValidator(0.0), django.core.validators.MaxValueValidator(100000.0)]), + ), + ] From 2207049931918c1e8ad97bb861e70c87f9b67ad2 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 11:52:49 -0700 Subject: [PATCH 3/8] update generator defaults --- job/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/job/models.py b/job/models.py index b31694881..7345fa0f6 100644 --- a/job/models.py +++ b/job/models.py @@ -3271,15 +3271,15 @@ class GeneratorInputs(BaseModel, models.Model): help_text="Maximum diesel generator size constraint for optimization. Set to zero to disable PV" ) installed_cost_per_kw = models.FloatField( - default=650, validators=[ MinValueValidator(0.0), MaxValueValidator(1.0e5) ], blank=True, + null=True, help_text="Installed diesel generator cost in $/kW" ) - om_cost_per_kw = models.FloatField( + om_cost_per_kw = models.FloatField( #depends on Settings.off_grid_flag validators=[ MinValueValidator(0.0), MaxValueValidator(1.0e3) @@ -3601,6 +3601,8 @@ class GeneratorInputs(BaseModel, models.Model): ) def clean(self): + if not self.installed_cost_per_kw: + self.installed_cost_per_kw = 650.0 if self.only_runs_during_grid_outage else 800.0 if not self.electric_efficiency_half_load: self.electric_efficiency_half_load = self.electric_efficiency_full_load From 5827f3bcc04ee913e99cb1b0cd6b61e713b07608 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 11:53:06 -0700 Subject: [PATCH 4/8] Create 0038_alter_generatorinputs_installed_cost_per_kw.py --- ...r_generatorinputs_installed_cost_per_kw.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 job/migrations/0038_alter_generatorinputs_installed_cost_per_kw.py diff --git a/job/migrations/0038_alter_generatorinputs_installed_cost_per_kw.py b/job/migrations/0038_alter_generatorinputs_installed_cost_per_kw.py new file mode 100644 index 000000000..e7fcaddd9 --- /dev/null +++ b/job/migrations/0038_alter_generatorinputs_installed_cost_per_kw.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.4 on 2023-07-05 18:52 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('job', '0037_alter_generatorinputs_installed_cost_per_kw'), + ] + + operations = [ + migrations.AlterField( + model_name='generatorinputs', + name='installed_cost_per_kw', + field=models.FloatField(blank=True, help_text='Installed diesel generator cost in $/kW', null=True, validators=[django.core.validators.MinValueValidator(0.0), django.core.validators.MaxValueValidator(100000.0)]), + ), + ] From 2121ded8b9570d6bfc34f879fd4f80564c3fc054 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 12:37:23 -0700 Subject: [PATCH 5/8] Update all_inputs_test.json --- job/test/posts/all_inputs_test.json | 1 + 1 file changed, 1 insertion(+) diff --git a/job/test/posts/all_inputs_test.json b/job/test/posts/all_inputs_test.json index 24d6e7cae..c3febff9e 100644 --- a/job/test/posts/all_inputs_test.json +++ b/job/test/posts/all_inputs_test.json @@ -256,6 +256,7 @@ }, "SpaceHeatingLoad": { "annual_mmbtu": null, + "year": 2017, "doe_reference_name": "MidriseApartment", "monthly_mmbtu": [], "fuel_loads_mmbtu_per_hour": [], From 3e33f030597e455258158383bd13ecf0d601170d Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 12:38:09 -0700 Subject: [PATCH 6/8] fix gen installed_cost_per_kw in outage.json to old default so test passes --- job/test/posts/outage.json | 1 + 1 file changed, 1 insertion(+) diff --git a/job/test/posts/outage.json b/job/test/posts/outage.json index c819b7311..5eb556b08 100644 --- a/job/test/posts/outage.json +++ b/job/test/posts/outage.json @@ -13,6 +13,7 @@ "outage_probabilities": [1] }, "Generator": { + "installed_cost_per_kw": 500, "min_kw": 1736.84, "max_kw": 1736.84, "min_turn_down_fraction": 0.0, From 3402b13e1e7b62d748d6be58ea41f046139dcfac Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:08:30 -0700 Subject: [PATCH 7/8] add test_other_conditional_inputs --- CHANGELOG.md | 5 +++++ job/test/test_validator.py | 43 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b9875e95..488f218f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,11 @@ Classify the change according to the following categories: ##### Removed ### Patches +## Develop +### Patches +- Update `Generator` **installed_cost_per_kw** from 500 to 650 if **only_runs_during_grid_outage** is _true_ or 800 if _false_ +- Add `test_other_conditional_inputs` method in `job/test/test_validator.py` to test inputs with defaults or overrides based on other input values within the same model + ## v2.13.0 ### Minor Updates ##### Fixed diff --git a/job/test/test_validator.py b/job/test/test_validator.py index b6cc5adc9..9a73d3f63 100644 --- a/job/test/test_validator.py +++ b/job/test/test_validator.py @@ -33,6 +33,7 @@ import uuid from django.test import TestCase from job.validators import InputValidator +from job.models import FUEL_DEFAULTS class InputValidatorTests(TestCase): @@ -178,8 +179,7 @@ def test_off_grid_defaults_overrides(self): self.assertAlmostEqual(validator.models["Generator"].replacement_year, 7) self.assertAlmostEqual(validator.models["Generator"].replace_cost_per_kw, 200.0) - def existing_boiler_validation(self): - + def test_existing_boiler_validation(self): """ Validate clean, cross-clean methods are working as expected """ @@ -345,7 +345,46 @@ def test_pv_tilt_defaults(self): validator.cross_clean() self.assertAlmostEquals(validator.models["PV"].tilt, post["Site"]["latitude"], places=-3) + def test_other_conditional_defaults(self): + """ + Validate defaults that are based on other inputs in the same model are set properly in clean method + """ + # Remove/change inputs that we want to check defaulting of + post_file = os.path.join('job', 'test', 'posts', 'all_inputs_test.json') + post = json.load(open(post_file, 'r')) + post["APIMeta"] = {"run_uuid": uuid.uuid4()} + post["ElectricLoad"]["year"] = 2020 + post["SpaceHeatingLoad"]["year"] = 2020 + #TODO: uncomment when CoolingLoad added to all_inputs_test.json + # post["CoolingLoad"]["year"] = 2020 + post["ElectricUtility"]["outage_durations"] = [10,20] + del(post["ElectricUtility"]["outage_probabilities"]) + del(post["Financial"]["owner_tax_rate_fraction"]) + del(post["Financial"]["owner_discount_rate_fraction"]) + del(post["Generator"]["installed_cost_per_kw"]) + #TODO: uncomment when CHP added to all_inputs_test.json + # del(post["CHP"]["electric_efficiency_half_load"]) + # del(post["CHP"]["emissions_factor_lb_CO2_per_mmbtu"]) + del(post["ExistingBoiler"]["emissions_factor_lb_CO2_per_mmbtu"]) + + # Create validator and call clean method + validator = InputValidator(post) + validator.clean_fields() + validator.clean() + # Check conditional defaults + self.assertEqual(validator.models["ElectricLoad"].year, 2017) + self.assertEqual(validator.models["ElectricLoad"].year, 2017) + #TODO: uncomment when CoolingLoad added to all_inputs_test.json + # self.assertEqual(validator.models["CoolingLoad"].year, 2017) + self.assertEqual(validator.models["ElectricUtility"].outage_probabilities, [0.5,0.5]) + self.assertEqual(validator.models["Financial"].owner_tax_rate_fraction, post["Financial"]["offtaker_tax_rate_fraction"]) + self.assertEqual(validator.models["Financial"].owner_discount_rate_fraction, post["Financial"]["offtaker_discount_rate_fraction"]) + self.assertEqual(validator.models["Generator"].installed_cost_per_kw, 650) + #TODO: uncomment when CHP added to all_inputs_test.json + # self.assertEqual(validator.models["CHP"].electric_efficiency_half_load, post["CHP"]["electric_efficiency_full_load"]) + # self.assertEqual(validator.models["CHP"].emissions_factor_lb_CO2_per_mmbtu, FUEL_DEFAULTS[post["CHP"]["fuel_type"]]) + self.assertEqual(validator.models["ExistingBoiler"].emissions_factor_lb_CO2_per_mmbtu, FUEL_DEFAULTS["emissions_factor_lb_CO2_per_mmbtu"][post["ExistingBoiler"]["fuel_type"]]) From 8221d1e1eded0af2ab92d4a35fd47454828f6093 Mon Sep 17 00:00:00 2001 From: hdunham <70401017+hdunham@users.noreply.github.com> Date: Wed, 5 Jul 2023 15:00:59 -0700 Subject: [PATCH 8/8] Update CHANGELOG.md --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 488f218f0..8db67f018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,10 +26,11 @@ Classify the change according to the following categories: ##### Removed ### Patches -## Develop -### Patches -- Update `Generator` **installed_cost_per_kw** from 500 to 650 if **only_runs_during_grid_outage** is _true_ or 800 if _false_ -- Add `test_other_conditional_inputs` method in `job/test/test_validator.py` to test inputs with defaults or overrides based on other input values within the same model +## Develop v2.14.0 +### Minor Updates +##### Fixed +- In job/ app (v3), updated `Generator` **installed_cost_per_kw** from 500 to 650 if **only_runs_during_grid_outage** is _true_ or 800 if _false_ +- Added `test_other_conditional_inputs` method in `job/test/test_validator.py` to test inputs with defaults or overrides based on other input values within the same model ## v2.13.0 ### Minor Updates