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 current_loading_threshold |
Configurable per CascadeConfig |
| Distance protection | Relay impedance falls inside warning or danger polygon zone | Defined per relay in sw_characteristics |
Configuration#
Cascade screening is opt-in. Pass a CascadeConfig instance when building the
analysis context:
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) |