Repository navigation
Start the rectangular AC model from a power flow solved on the projected cone point (IndACConeStart = 2) - #213
Merged
Conversation
…ted cone point (IndACConeStart = 2) The projection of a loose cone violates the nodal balances, and Ipopt spends its first iterations repairing that. With IndACConeStart = 2 an AC power flow is solved per load level from the projected point, with the cone's dispatch, the projected voltage held at the buses with a reactive-capable unit in service and a distributed slack per synchronous area weighted by the room of the units. The voltages, branch flows, shunt injections, unit outputs and reactive outputs are set from it within their bounds, and the balance residual at the start is reported. On the 11 June day of the Nordic case Ipopt is feasible at iteration 27 instead of 317 and reaches the optimal exit in 559 iterations against 623 from a flat start and 838 from the projection.
A shunt out of service has its injection bounded at zero, and the value scaled from the cone point could land a rounding error outside it, which Pyomo reported at every shunt and load level.
…ound by the power flow start The 75 shunts of the Nordic case with no susceptance have their injection bounded at zero and were reported as 1,800 values at a bound per day.
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.
Problem
IndACConeStart = 1(#212) starts the rectangular model from the rank-one projection of the W-space cone. Where the cone is tight the projection is close to an AC operating point and the start is good. Where the cone is loose it is not: the angle differences of its branches do not close around loops, and the projected voltages with the cone's dispatch violate the nodal balances by hundreds of MW. On 11 June of the Nordic calendar sample, the day whose cone has the largest loop mismatch (1.4 pu of voltage), Ipopt started from the projection with a primal infeasibility of 144 and spent its first 300 iterations repairing it, with the objective climbing to 1,357 MEUR on the load-shedding penalties before it fell. The flat start was feasible by iteration 100. The cone start was slower than the flat one on that day and on 21 May, and faster only on 19 February (entries 153 to 155 of the study log).Solution
IndACConeStart = 2: the cone, its projection, and then an AC power flow per load level from the projected point before the model is handed to the solver._PowerFlowFromProjectioninopenTEPES_ModelFormulationElectricity.py:_NewtonPV: Newton-Raphson in polar form with PV buses and the slack variables, a step halved until the mismatch falls, dense, numpy only. A load level that does not converge from the projection is tried from a flat profile at the free buses, and keeps the projection if that fails too.mTEPES.pACStartResidual[(p, sc, st)].The option is validated in
InputData(0, 1 or 2; 1 and 2 needIndACPowerFlow = 3), declared as a non-negative integer inDataConfiguration, and named byReportConfiguration.Observed behaviour
9n_AC, first two hours,IndACPowerFlow = 3, Ipopt: the three starts reach the same total cost, 0.0367991 MEUR, in 96 (flat), 107 (projection) and 104 (power flow) iterations; the power flow converges in its one load level with a slack of 13 MW and leaves the balances at a residual of 0.000 MW.695-bus Nordic case, 11 June, 24 coupled hours with storage, Ipopt with MUMPS (
data/cases/2026-06-11_calendar-ac-voltband-rect,-coneand-pfin the study repository). The cone took Gurobi 16 seconds and gave the bound 27.940062 MEUR, 5.5 per cent below the exact cost; the power flow took 8 seconds, converged in all 24 load levels, and the balances hold at its point. That point is outside the limits the cone's dispatch ignored: 276 branch-hours carry more than their rating, one 400 kV line by 1.25 GW, 24 bus-hours sit outside the voltage band, and the regulated buses need reactive power beyond capability that goes to reactive power not served. Put at their bounds, those flows leave the balance violated by 1.25 GW at that line. Ipopt still starts far better from it: the primal infeasibility falls below 1e-3 at iteration 27, against 317 from the projection and 59 from the flat start, and the run ends at the optimal exit in fewer iterations than either.The three solutions are the same: losses, hydro, branch-hours at the rating, every zonal price and the water values agree, and both power flow checks of the study reproduce the point exactly.
21 May, the other day where the projection start lost (gap 4.3 per cent): the cone needed the presolve-off retry, the power flow converged in all 24 load levels in 5 seconds with 194 branch-hours put at their rating, and Ipopt was feasible at iteration 20 against 131 from the projection and 59 from the flat start.
Again the same solution, reproduced exactly by both checks.
The two days where the projection was neutral or won, 15 January (gap 0.13 per cent) and 19 February (gap 7.2 per cent), run the same way. Iterations and Ipopt seconds, with the iteration at which the primal infeasibility first falls below 1e-3:
On all four days the power flow start takes 9 to 26 per cent fewer iterations than the flat start and reaches the same solution, which both checks reproduce exactly. It beats the projection on three days; on 19 February, where the projection was already feasible at iteration 26, it is 7 per cent slower than the projection and still faster than flat. The early feasibility is the mechanism, and the flows it leaves beyond the ratings, 4 to 276 branch-hours, do not undo it. A fifth day, the coupled development day of 17 February, gives 348 iterations and 568 s to the optimal exit against 533 and 825 to the acceptable level from the flat start.
Tests
tests/test_ac_input.py:test_cone_start_reaches_the_flat_start_optimumnow runs the three starts and asserts, for the power flow start, that the balance residual at the start is below 0.01 MW;test_cone_start_power_flow_converges_with_a_distributed_slackchecks_NewtonPVon a two-bus network, the load bus at its injection and the slack equal to the load plus the loss.Files
openTEPES_ModelFormulationElectricity.py(_PowerFlowFromProjection,_NewtonPV,_dSbus_dV, the call fromACConeWarmStart),openTEPES_InputData.py(the option's values and validation),openTEPES_DataConfiguration.py(the parameter's domain),openTEPES.py(the configuration report),doc/md/InputData.md,CHANGELOG.md,tests/test_ac_input.py.