diff --git a/CHANGELOG.md b/CHANGELOG.md index fda68a3d4..7458b5124 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,11 @@ Classify the change according to the following categories: ##### Removed ### Patches +## v3.17.3 +### Minor Updates +##### Added +- Input for `Wind`: `acres_per_kw` which has a default of 0.03; Wind is only constrained by this for sizes greater than 1500 kW. + ## v3.17.2 ### Minor Updates ##### Added diff --git a/reoptjl/migrations/0112_windinputs_acres_per_kw.py b/reoptjl/migrations/0112_windinputs_acres_per_kw.py new file mode 100644 index 000000000..37d87f2b9 --- /dev/null +++ b/reoptjl/migrations/0112_windinputs_acres_per_kw.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.26 on 2025-12-08 23:22 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('reoptjl', '0111_alter_electricloadinputs_monthly_totals_kwh'), + ] + + operations = [ + migrations.AddField( + model_name='windinputs', + name='acres_per_kw', + field=models.FloatField(blank=True, default=0.03, help_text='Land area required per kW of wind capacity in acres/kW; only constrained by this for systems greater than 1500 kW', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100.0)]), + ), + ] diff --git a/reoptjl/models.py b/reoptjl/models.py index 4d0a27450..9335f5929 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -3615,6 +3615,15 @@ class WIND_SIZE_CLASS_CHOICES(models.TextChoices): help_text="Only applicable when off_grid_flag=True; defaults to 0.5 (50 pct) for off-grid scenarios and fixed at 0 otherwise." "Required operating reserves applied to each timestep as a fraction of wind generation serving load in that timestep." ) + acres_per_kw = models.FloatField( + default=0.03, + validators=[ + MinValueValidator(0), + MaxValueValidator(100.0) + ], + blank=True, + help_text="Land area required per kW of wind capacity in acres/kW; only constrained by this for systems greater than 1500 kW" + ) def clean(self): if self.size_class != "" and self.installed_cost_per_kw is None: diff --git a/reoptjl/test/posts/all_inputs_test.json b/reoptjl/test/posts/all_inputs_test.json index a2355ef95..6aee38046 100644 --- a/reoptjl/test/posts/all_inputs_test.json +++ b/reoptjl/test/posts/all_inputs_test.json @@ -265,7 +265,8 @@ "can_wholesale": true, "can_export_beyond_nem_limit": true, "can_curtail": true, - "operating_reserve_required_fraction": 0.0 + "operating_reserve_required_fraction": 0.0, + "acres_per_kw": 0.03 }, "ExistingBoiler": { "production_type": "hot_water",