Grid reinforcement

In plain terms

Reinforcement (grid expansion) is eDisGo’s answer to the question “what does it cost to make this grid handle the load and generation?”. It looks for lines and transformers that are overloaded and buses whose voltage is out of bounds, then applies the measures a German distribution grid operator would typically use (parallel cables, bigger/extra transformers, split feeders) until all problems are solved — and reports the cost.

How it works

Reinforcement is orchestrated by reinforce_grid() (exposed as reinforce()). It runs the following measures in order:

  1. Reinforce stations and lines due to overloading.

  2. Reinforce MV lines due to voltage issues.

  3. Reinforce distribution substations (MV/LV stations) due to voltage issues.

  4. Reinforce LV lines due to voltage issues.

  5. Reinforce stations and lines due to overloading again — the lower impedance created by the voltage measures can produce new overloads.

../_images/grid_expansion_measures.png

Fig. 2 Grid reinforcement measures and the order in which issues are identified and solved.

Overloading is usually fixed in a single step. Voltage issues can only be solved iteratively: after each measure a power flow is run and the voltages are re-checked, up to max_while_iterations times (default 20).

Useful options of reinforce():

  • copy_grid=True — compute the needs without changing the grid topology.

  • mode — restrict to "mv", "mvlv" or "lv".

  • split_voltage_band — split the allowed voltage band between the voltage levels MV, MV/LV stations and LV (default True; see below).

  • reduced_analysis — only analyse the most critical time steps to save time.

  • catch_convergence_problems=True — fall back to catch_convergence_reinforce_grid(), which handles non-convergence in stages: it first reinforces using only the converging time steps, then the initially non-converging ones, and only as a last resort scales the time series iteratively (starting from a minimal factor of 0.05 and increasing it, for up to 10 iterations).

Enhanced reinforcement

On very large or heavily overloaded grids even catch_convergence_problems=True can fail to find a feasible grid. enhanced_reinforce_grid() is a more robust wrapper that reinforces voltage level by voltage level and falls back to ever more drastic measures until a grid is found on which the power flow converges:

  1. Separate heavily overloaded LV grids (if separate_lv_grids=True, default). An LV grid whose overloading exceeds separation_threshold times the nominal apparent power of its MV/LV transformer(s) is split by adding a new MV/LV station (run_separate_lv_grids()).

  2. Reinforce each LV grid on its own. If a single LV grid does not converge in the power flow, it is split first (separate_lv_grid()) and then reinforced.

  3. Reinforce everything at once. If that fails, it runs, in sequence (each step is attempted regardless of whether the previous one succeeded), the MV level only, then MV + MV/LV stations (mode="mvlv"), then each LV grid separately (again splitting any that do not converge).

  4. Cost-distorting last resort (only if activate_cost_results_disturbing_mode=True). For LV grids that still cannot be solved, first all lines are replaced by the standard line type; if that is still not enough, all components of the LV grid are aggregated onto the MV/LV station bus. These measures restore convergence but distort the reported costs: the line replacement is recorded in equipment_changes and does enter the cost calculation, whereas the aggregation leaves no costed trace, so the total is an underestimate (a warning is logged and recorded in edisgo.results.measures).

  5. A final full reinforcement is run over the now-feasible grid. Note that the fallback sequence in step 3, the cost-distorting measures in step 4 and this final reinforcement only run if the “everything at once” attempt at the start of step 3 fails; if it converges right away, the function returns at that point.

Use it when a normal reinforce() raises convergence or iteration errors; for well-behaved grids the standard reinforcement is sufficient.

Note

The MV line reinforcement that splits a feeder with voltage issues at an LV station does not yet actually insert a switch disconnector at the split point (TODO in reinforce_lines_voltage_issues()), so the resulting half-rings are not switchable in the model. See Switches for the role of switch disconnectors in reinforcement.

Identifying problems

Constraint checking lives in check_tech_constraints.

Overloading is determined from allowed load factors (config_grid_expansion, section grid_expansion_load_factors). These factors can differ between load and feed-in case (Load case and feed-in case), but for normal operation they all default to 1.0; case-dependent factors (e.g. 0.5 for the MV load case) exist only in the currently unusable n-1 section.

Voltage problems are determined by voltage_issues() against the allowed deviations in config_grid_expansion (section grid_expansion_allowed_voltage_deviations). With split_voltage_band=True (default) the band is split between MV, MV/LV stations and LV, which get separate limits — a combined limit can leave almost no room in the LV grids when the MV deviation is already close to the limit. voltage_deviation_from_allowed_voltage_limits() returns the absolute deviations.

Physics

  • Loading / current. A line’s apparent power must stay below \(S_\text{allowed} = S_\text{nom}\cdot \text{load factor}\), with the current \(I = S / (\sqrt{3}\,V)\). A transformer’s loading uses \(S = \sqrt{P^2 + Q^2} \le S_\text{nom}\cdot \text{load factor}\).

  • Voltage. The voltage deviation along a feeder is approximately \(\Delta V \approx I\,Z\) (with line impedance \(Z = R + \mathrm{j}X\)). The configured allowed deviations follow DIN EN 50160 (combined ±10 %) and VDE-AR-N 4105 (LV voltage drop); the component-connection limits in config_grid additionally reference VDE-AR-N 4100/4110. Reinforcement reduces \(\Delta V\) either by lowering \(Z\) (parallel lines, shorter feeders) or by adding transformer capacity.

Reinforcement measures

Measures are implemented in reinforce_measures.

Lines due to overloading

reinforce_lines_overloading() decides per line up front, in three cases: lines that are already of standard type get as many additional parallel standard lines as needed; single-circuit cables with a relative overload below 2 get one parallel line of the same type; all other lines are replaced by as many parallel standard lines as needed.

Stations due to overloading

reinforce_hv_mv_station_overloading() and reinforce_mv_lv_station_overloading() add a parallel transformer of the existing type (the smallest one that solves the problem if several exist); otherwise the existing transformers are replaced by as many standard transformers as needed to cover the previous plus the missing capacity.

MV/LV stations due to voltage issues

reinforce_mv_lv_station_voltage_issues() installs a parallel standard transformer, re-runs the power flow and repeats until the voltage is within limits or the iteration limit is reached.

Lines due to voltage issues

reinforce_lines_voltage_issues() addresses, per feeder, the critical node farthest from the station (by path length). The treatment differs by voltage level: in MV grids the feeder is split at an LV station (after 2/3 of the path length), or — if there is none to split at — the node is connected directly to the MV station busbar; in LV grids the split point is the first node at or beyond 2/3 of the path length, moved back to a node outside a building. If the relevant node is already directly connected to the station, a parallel standard line is added when the line is already of standard type, otherwise the line is replaced by a standard line. Only one voltage problem per feeder is treated per iteration, because each measure affects the whole feeder.

Separating overloaded LV grids

separate_lv_grid() splits a heavily overloaded LV grid by adding a new MV/LV station, redistributing the load.

Grid-expansion costs

Costs are computed by grid_expansion_costs() (which uses line_expansion_costs(); transformer_expansion_costs() is a standalone helper not called by it). The total is the sum of the cost of every added transformer and line. Costs are distinguished only by voltage level, not by equipment type, and for lines additionally by whether they run in a rural (≤ 500 inhabitants/km², lower earthwork cost) or urban area ([DENA]). Unit costs come from config_grid_expansion.

References

[DENA]

A.C. Agricola et al.: dena-Verteilnetzstudie: Ausbau- und Innovationsbedarf der Stromverteilnetze in Deutschland bis 2030. 2012.