pencleanenergy / MATCH-model

MATCH model for planning time-coincident clean energy portfolios
GNU Affero General Public License v3.0
27 stars 10 forks source link

Version 0.3.0 Closes #4, #9, #10, #17, #19, #34, #35 #39

Closed grgmiller closed 2 years ago

grgmiller commented 2 years ago

This commit includes many major updates to how generation and storage is dispatched in the model, and which costs are being optimized.

Closes #4

Wholesale costs

Over-building issue

Closes #9

Adds a decision variable for renewable curtailment, limited by the cap on curtailment. This should lead to economic curtailment during times when wholesale prices are low or negative.

Closes #10

Adds option to limit excess generation through a hard constraint. This can be implemented as an annual limit on excess generation, or a limit on the amount of excess generation in each hour. The limit is expressed as percentage of DispatchGen, so a limit of 0.10 would mean that ExcessGen could be no more than 10% of DispatchGen, either on an annual or hourly basis

Closes #17

We wanted to ensure that storage was only charging from renewable generation, rather than grid power. To do this, we implemented a new constraint that requires total storage charging to be less than total generator dispatch. This may mean that at some times, grid power is being consumed when batteries are charging. To get around this, we will simply adjust our accounting such that grid power is only ever assigned to load, and the charging reduces the net renewable generation available to meet load.

Closes #19

Previously, we had allowed power injections to be >= withdrawals, because we had specified that the full renewable capacity would be dispatched. We have changed the accounting so that generator dispatch is split into DispatchGen (the amount of dispatch needed to meet load and storage charging) and ExcessGen (the amount of generation available that is not used in that hour). This means that the load balance constraint is now an equality constraint, where Power injections == power withdrawals in all hours.

Closes #34

Allows the storage portion of hybrid projects to be built in any ratio with the generator portion, between a minimum and maximum ratio.

Closes #35

Adds hedge contract premiums to the objective function

Simultaneous Storage Charging and Discharging

Re-implements baseload generation functionality

Previously, baseload generators (like geothermal) were implemented as variable generators. However, now that we have allowed variable generators to have ExcessGen and CurtailGen, it makes sense to separate baseload resources out. In this implementation, baseload resources are still given a capacity factor for each timepoint (like variable generators), but baseload generators must dispatch at this capacity factor, and are not allowed to have excess gen. For baseload generators, this requires using all of their output, which either must be matched to load, or charged in a battery.

Other fixes: