Skip to content

Apparent power limit at both ends of an AC branch - #207

Merged
erikfilias merged 6 commits into
masterfrom
feature/apparent-power-limit
Sep 25, 2026
Merged

erikfilias merged 6 commits into
masterfrom
feature/apparent-power-limit

Conversation

@erikfilias

@erikfilias erikfilias commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Under the branch flow model, the rating limits the current at the lowest voltage of the sending bus, l <= (TTC / Vmin)^2.
The apparent power this admits is TTC * V / Vmin: 2% above the rating at 1.0 p.u. on a 0.98 lower limit, 5% on 0.95, and
16% at 1.10 p.u. on 0.95. The DC model limits the active power to the rating itself, so an AC and DC comparison gives the AC
model up to 5% more transfer capacity on most branches.

Solution

IndACApparentPowerLimit = 1 in oT_Data_Option adds P^2 + Q^2 <= TTC^2 at both ends of each branch.

  • SOCP and piecewise linear: a 24-sided polygon inside the circle, linear and at most 0.9% below the rating. The circle as
    a quadratic constraint gave Gurobi numerical trouble on a 695-bus case.
  • Exact NLP: the circle, scaled by the rating.
  • AC recovery step: the circle replaces the polygon.
  • The current limit is kept. Off by default, which leaves the model unchanged.

Results

9n_AC, 8736 hours:

Current limit only With the option
SOCP: branch-hours above the rating (largest) 618 of 52416 (105.8%) 0 (99.9%)
SOCP: generation cost 149.019 MEUR 149.249 MEUR (+0.15%)
Piecewise linear: branch-hours above the rating (largest) 614 (105.2%) 0 (99.9%)
Piecewise linear: generation cost 149.059 MEUR 149.266 MEUR (+0.14%)

695-bus Nordic case, one hour, generation fixed at a reference power flow solution: with the case's ratings, the option
sheds 22.5 MW of load, because the reference flows exceed six ratings. With those ratings raised to the reference loading,
the option changes nothing; the solve takes 90 s.

Tests

  • The option is off by default, and 2 is refused.
  • 9n_AC: largest loading above 101% without the option, at most 100% with it.
  • First 12 hours of 9n_AC with IndACRestore = 1: the circle replaces the polygon, largest loading 99.6% against 105.0%.
    Ipopt does not converge on the full year, with or without the option.
  • AC tests without the solve marker: 80 passed; AC recovery step tests: 4 passed.

Documentation

doc/md/InputData.md: the option in the oT_Data_Option table and a section "The thermal limit of an AC branch". The
comment listing the AC options in openTEPES_InputData.py is shortened.

erikfilias and others added 6 commits September 25, 2026 11:57
The current limit uses the lowest voltage of the sending bus, so it lets a branch carry up to 5 % more than its rating at 1.0 p.u. The new option IndACApparentPowerLimit also keeps P^2 + Q^2 within the rating squared at both ends. The piecewise-linear model uses a 12-sided polygon inside the circle instead. The option is off by default, and the model is then unchanged. On 9n_AC the option brings the branch-hours above rating from 618 to none, for 0.14 % more generation cost.
The comment above the option defaults in InputData is 18 lines instead of 28. It keeps every option, value and reference, and the unfinished last sentence is now complete.
…olve

As a quadratic constraint, the apparent power limit left Gurobi's barrier with numerical trouble on a 695-bus case. Scaling it by the rating, or turning presolve aggregation off, only moved the failure to other inputs. The SOCP and piecewise-linear models now use a 24-sided polygon inside the circle, which is at most 0.9 % below the rating. The exact NLP and the AC recovery step use the circle itself, scaled by the rating. A new test checks that the recovery step swaps the polygon for the circle.
The entry is four lines instead of seven. The detail stays in the documentation and the pull request.
The comments and test docstrings added in this pull request are shorter. The code is unchanged.
@erikfilias
erikfilias merged commit 481d1c9 into master Sep 25, 2026
13 of 14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant