Cascade Simulation#
After each converged contingency load flow, an optional cascade simulation can be
enabled via CascadeConfig.
It models how a single outage can trigger a chain of further trips through distance
protection or current overload.
How it works#
Each call to run_single_outage follows this pipeline:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | |
Trigger types#
| Type | Detection | Threshold |
|---|---|---|
| Current overload | Branch loading exceeds the threshold resolved for its element type and case | Configurable per CascadeConfig |
| Distance protection | Relay impedance falls inside warning or danger polygon zone | Defined per relay in sw_characteristics |
Current overload thresholds#
loading is the per-unit ratio i / i_max, so 1.5 means 150 %. The comparison is
strict: a branch loaded at exactly its threshold does not trip.
Each branch result row gets its own threshold, resolved from the element type
(line, transformer, or anything else) and from whether the row belongs to the base
case or to a contingency:
| Row | Threshold | Falls back to |
|---|---|---|
line, base case |
basecase_line_loading_threshold |
current_loading_threshold |
line, contingency |
contingency_line_loading_threshold |
basecase_line_loading_threshold, then current_loading_threshold |
trafo / trafo3w, base case |
basecase_transformer_loading_threshold |
current_loading_threshold |
trafo / trafo3w, contingency |
contingency_transformer_loading_threshold |
basecase_transformer_loading_threshold, then current_loading_threshold |
any other table (e.g. impedance) |
current_loading_threshold |
— |
All four overrides are optional. When none of them are set, every branch is compared
against current_loading_threshold, exactly as before they existed.
Configuration#
Cascade screening is opt-in. Pass a CascadeConfig instance when building the
analysis context:
To trip lines at 150 % and transformers at 180 % instead, add the per-type overrides (see Current overload thresholds):
When cascade is None in the context, the cascade step is skipped and
LoadflowResults.cascade_results is an empty DataFrame.
Required network input: net.sw_characteristics#
Distance protection requires a sw_characteristics table attached to the pandapower
network. Each row describes the protection settings of one relay. The table is linked
to net.switch via net.switch["origin_id"] → sw_characteristics["breaker_uuid"].
| Column | Type | Description |
|---|---|---|
breaker_uuid |
str |
Unique ID of the relay; matched against net.switch["origin_id"] |
relay_side |
str |
Side of the switch the relay measures from: "bus" or "element" |
angle |
float |
Opening angle of the protection zone polygon (degrees) |
r_i |
float |
Inner resistance reach of the danger zone (Ω) |
r_v |
float |
Outer resistance reach of the danger zone (Ω) |
x_v |
float |
Outer reactance reach of the danger zone (Ω) |
custom_warning_distance_protection |
float |
Per-relay warning zone scale factor; overrides the global CascadeConfig factors when set |
Example:
If sw_characteristics is absent or empty, distance protection triggers are skipped
and only current overload is checked.
Output#
Cascade events are stored in LoadflowResults.cascade_results. Each row describes one element trip at one cascade step.
Index columns (uniquely identify each row):
| Column | Description |
|---|---|
timestep |
Timestep of the contingency calculation |
contingency |
Unique ID of the contingency that started the cascade |
cascade_number |
Cascade step number (1 = first trip after the initial outage, 2 = next, …) |
element_mrid |
External identifier of the tripped element |
Data columns:
| Column | Description |
|---|---|
element_id |
Internal unique ID of the tripped element |
element_name |
Human-readable name of the tripped element |
element_outage_group_id |
ID of the outage group the tripped element belongs to |
contingency_name |
Human-readable name of the originating contingency |
contingency_outage_id |
Outage group ID of the originating contingency |
cascade_reason |
Why the element tripped: CURRENT_OVERLOAD or DISTANCE_PROTECTION |
loading |
Branch loading value that caused the trip (current overload events) |
r_ohm |
Relay resistance measurement at trip time (distance protection events) |
x_ohm |
Relay reactance measurement at trip time (distance protection events) |
distance_protection_severity |
How deep into the protection zone: WARNING or DANGER (distance protection events) |
activated_schemes_per_iter |
SpPS schemes that activated during this cascade step (JSON string) |