Added Support for DCOPF Constrained Expansion - #915
Open
dlcole3 wants to merge 52 commits into
Open
Conversation
…ance for multistage
…d Integer_Build column
dlcole3
marked this pull request as ready for review
July 21, 2026 00:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR adds code to support expansion decisions of DCOPF constrained GenX models that can be solved both monolithically or using Benders Decomposition. This work was originally started by @sambuddhac. It includes updates to settings, inputs loading, model construction, and solution methods. Part of the motivation for this work is supporting nodal spatial resolution of CEMs. In these cases, you might solve with DCOPF constraints, and you might also want to have integer decisions on new transmisison or generation builds (e.g., CC might be built in 500 MW increments to avoid unrealistic modular CC construction in lots of different zones). This PR is intended as a second step after the Benders PR (#914) is merged.
DiscreteInvestmentsflag in the settings of GenX. This controls whether there can be integer variables in the model (not that I chose to call thisDiscreteInvestmentsoverIntegerInvestmentsbecause MacroEnergySolvers.jl already has anIntegerInvestmentssetting). This can be applied to both resources and transmission lines. IfDiscreteInvestmentsis set to 1, then GenX will look for a column headerDiscrete_Buildin the Network.csv, Thermal.csv, and Vre.CSV and throw a warning statement if none of these files have the column header. This header controls which resources or lines can have discrete builds. This also gives the user flexiblity in controlling which components should be treated as integer/binary build decisions.Discrete_Buildcolumn has a 1, then there can be at least one new line constructed on that corridor. GenX internally builds a new DataFrame with each line separated out with individual flow variables on them. This is important for handling DC-OPF constraints. In addition, it supports the case where there may be multiple discrete parallel lines on a corridor, and the user can pass these directly with only one line of the CSV. There is an additional constraint added which adds a solve order to identical lines to avoid degeneracy.Discrete_Buildto zero, but there is a nonzeroLine_Max_Reinforcement_MW, then that line will be treated as the traditional line expansion available in GenX (note that this can essentially be thought of as reconductoring). If the discrete build flag is set to 1, thenLine_Max_Reinforcement_MWis used to determine the size of the new lines (note: we can restructure this if you think new lines should have more columns to support this instead of using the existing), with theNew_Line_Cap_Size_MWcolumn name used to determine how may lines fit intoLine_Max_Reinforcement_MW.FIXED_LINESwhich are lines that can't be expanded,EXPANSION_LINES, which are lines that have continuous reinforcement on them,DISCRETE_BUILD_LINESwhich are lines that have a binary build decision associated with them, andPHANTOM_LINES, which are theDISCRETE_BUILD_LINESwhich are on new corridors (this is important for the line angle limit constraints, which you only want to have applied if the line is built).A couple of additional notes:
vFLOWvariable, and this will be zero for any line not constructed. @sambuddhac may have a better idea on whether this is the case.@gschivley and I had discussions on the above structuring, so tagging him in case he wants to give input on how it came together.
What type of PR is this? (check all applicable)
Related Tickets & Documents
This PR also address the feature request of #900
Checklist
How this can be tested
There is a new example case (12) and a new set of unit tests. The unit tests run a smaller time horizon version of example 12 with both monolithic and Benders. In addition, the unit test running the three zone case also runs it with
DiscreteInvestments=1to test integer build decisions on resources.Post-approval checklist for GenX core developers
After the PR is approved