Use Case 5 - Flooding and landslides in Slovenia#

This notebook evaluates the vulnerability of Slovenia’s electricity transmission system to both single and compound natural hazards. It allows to simulate historical floods in the upper, middle, and lower Sava River regions, a simultaneous three‑region worst‑case flood, a single‑point‑of‑failure landslide, and a combined flood‑and‑landslide scenario. Both hazards can result from extreme rainfall, which is projected to intensify in the future, and present risk conditions typical for Slovenia.

1. Introduction#

In this UC5 simulation, we assess the impacts of severe flooding along the Sava River and associated landslides on Slovenia’s electricity transmission system, considering both hazards individually as well as their combined effects. The spatial extents of the hazards are based on historical events; however, the simulated intensities are intentionally more extreme to represent plausible future conditions under a changing climate. Floods and landslides are both frequently triggered by prolonged or intense precipitation, and their co-occurrence can lead to compound impacts that significantly increase system vulnerability.

Hide code cell source

# HIDE CODE
#import required libraries
import os
import sys
import pandas as pd
import pandapower as pp
from pandapower.plotting import pf_res_plotly
# import costum functionalities that execute the simulation
# The notebook lives in the book/ subfolder; hop up to the repo root so
# that src/ and inputs/ resolve no matter where Jupyter is launched.
if not os.path.isdir('src') and os.path.isdir(os.path.join('..', 'src')):
    os.chdir('..')
current_folder = os.getcwd() # Get the current working directory
sys.path.append(os.path.join(current_folder, "src"))
from time_series_calculations import time_series_calculations, restore_original_net, initialize_gen_tracking
from case_study_disruptions import plot_regions, create_disruption, run_predefined_simulation, single_point_of_failure
from risk_assesment import case_study_results, disconnected_elements, disruption_diagnostics
from settings import define_interval, fix_geodata
from UC5_disruption_flooding_events import plot_historical_affected_regions

2. Hazard Characterisation: Flooding#

Based on historical evidence and recent analyses, the Sava River in Slovenia has shown a pattern of flooding that varies by region and season. A detailed analysis of historical floods along the Sava River in Slovenia can be found in the paper titled ” Analysis of floods on the Sava River in the historical record” by Mira Kobold (2024). It documents the largest floods in the upper, middle, and lower courses of the river, including:

  • 30 October 1926 in Radovljica (upper Sava corridor)

  • 4 August 2023 in Litija (middle Sava corridor)

  • 19 September 2010 in Čatež (lower Sava corridor)

The study notes that major floods have occurred almost every decade since the 1970s, with the August 2023 flood being the first major summer flood event on the Sava River.

The predefined simulation allows selecting either individual major‑flood regions or a combined worst‑case scenario. While the spatial footprints of these scenarios draw on historical observations, the flood intensities used in the model are intentionally enhanced and do not replicate any specific historical event. In all configurations, substations located within a 5‑km hazard impact zone are assumed to be disconnected, establishing the initial network‑level disturbance. This substation outage triggers further consequences at the asset-level through line overloads (equipment protection), and ultimately leads to systemic‑level impacts such as generation losses and demand interruptions.

plot_regions(current_folder, "SI")
../../../_images/a7c647c078ea59b8198f64d9164af8902e4b8634f1ce234735d90552ac063d3f.png

Import complete UC5 pandapower network#

The Slovenian electricity transmission grid is loaded from a compressed pickle file that contains the complete pandapower model. This file integrates ENTSO‑E‑based network topology, OSM‑derived geometries, LAU‑level regional updates, spatially distributed national consumption data, and the economic and temporal profiles of power plants including regulation strategies and energy storage integration consolidated into one unified dataset.

net = pp.from_pickle(os.path.join(current_folder, "inputs/pickle_files/uc5_network.p"))
print(net)

# Save net SI single-state:
net_single_state = net.deepcopy()    

# Save net bus and line copies for network reset
net_bus_copy = net.bus.copy()
net_line_copy = net.line.copy()

# Fix geodata
fix_geodata(net)
This pandapower network includes the following parameter tables:
   - bus (191 elements)
   - load (212 elements)
   - storage (3 elements)
   - gen (91 elements)
   - line (282 elements)
   - trafo (28 elements)
   - poly_cost (94 elements)
   - line_geodata (282 elements)
   - bus_geodata (191 elements)

Import load profiles#

The load profiles for Slovenia are imported from a compressed pickle file, derived from the original dataset used in the EU‑wide model. The load mapping to locations of demand is performed using the KdTree Nearest Neighbour Search with additional focus on prioritizing load mapping to 110kV level.

# Import load profiles
load_profiles = pd.read_pickle(os.path.join(current_folder, "inputs/pickle_files/load_profiles_uc5.pkl"))

start_time, end_time = define_interval(load_profiles)

load_profiles = load_profiles.loc[start_time:end_time]
Start time: 2020-08-01 00:00:00 
End time: 2020-08-08 00:00:00 

Run flood impact simulation#

# Run predefined_simulation 
#chose one of the flooding scenarios (upper/middle/lower/all)  that will be used for the rest of the notebook
simulation_type = "lower"  

pf_results = run_predefined_simulation(net, current_folder, "SI", pd, load_profiles, pf_res_plotly, time_series_calculations, simulation_type)    
../../../_images/ec133fe49dd7b117115039d5d87e8a60b5b57c6cb1928c6767b9464a57e6a821.png
affected nodes:
Index([9, 39, 48, 77, 78, 79], dtype='int64')
../../../_images/3314c1e7866a204091a46beb33ad1055430a4b6828fff7084277b4d24cf567be.png
Best generator index: 39, max_p_mw: 423.0400203072779
../../../_images/3009223d64f149e50f85044ebe96f14abd7dd8db7a4fa8193cff6ad31f5703ee.png

Case Study Results#

case_study_results(simulation_type)
Case study results  (DC_OPF_results_lower_Sava.xlsx)
  Total generator costs :    1.53 million €
  Max line loading      :   61.10 %
  Indirect losses       :    0.63 million €
  Energy not supplied   : 2143.10 MWh

Network and Asset-level risk assessment#

disconnected_elements(net)
Disconnected elements:
  Buses :   6  (400 kV: 1, 110 kV: 5)
  Lines :  26  (400 kV: 10, 220 kV: 1, 110 kV: 15)
  Loads :   2
  Gens  :  10
  Generators on disconnected buses: Brezice - Gen 3, KRS - O_RES, NEK, Mokrice - Gen 2, KRS - PV, KRS - O_nonRES, Mokrice - Gen 1, Mokrice - Gen 3, Brezice - Gen 2, Brezice - Gen 1

Systemic-risk assessment#

disruption_diagnostics(net)
Systemic impact (share of national total):
  Load not supplied :  0.97 %
  Generation lost   : 21.98 %
  Buses out         :  3.14 %
  Lines out         :  9.22 %

3. Multi Hazard Risk Assessment: Landslides#

The floods in Slovenia in 2023 were caused by severe rainfall that also triggered numerous landslides in different parts of the country. While these caused no additional major outages of the power grid, this may happen in the future as rainfall becomes more intense under climate change. In the example below we showcase how an additional failure of a substation would affect the system.

# Reload the baseline state of the power network
net = pp.from_pickle(os.path.join(current_folder, "inputs/pickle_files/uc5_network.p"))
# Fix geodata
fix_geodata(net)
# Run predefined_simulation 

# Choose which substation fails due to a potential landslide event
failed_substation = "BOHINJ" #this can be changed to another substation to simulate an alternative scenario 

pf_results = single_point_of_failure(net, current_folder, "SI", pd, load_profiles, pf_res_plotly, time_series_calculations, simulation_type, failed_substation)    
../../../_images/3dc64a92bf995d4f4cbb49b90963d8c5840f0cb6622d681eca25094bd3edb045.png
[apply_node_outage_by_name] New slack generator index: 33, max_p_mw: 703.0
../../../_images/c595330d6cae7b68321107d363285f135278effcb96d9e28e653295574dea479.png ../../../_images/0e2197ea6a763e81ed536e8a7b902ea719cea68ffab3cea7b54028fb07380734.png

Results of the single point of failure (landslide) analysis

case_study_results("SPOF")
Case study results  (DC_OPF_results_SPOF.xlsx)
  Total generator costs :    1.75 million €
  Max line loading      :   53.08 %
  Indirect losses       :    0.17 million €
  Energy not supplied   :  752.75 MWh
disconnected_elements(net)
Disconnected elements:
  Buses :   1  (110 kV: 1)
  Lines :   2  (110 kV: 2)
  Loads :   1
  Gens  :   0
  Generators on disconnected buses: none
disruption_diagnostics(net)
Systemic impact (share of national total):
  Load not supplied :  0.38 %
  Generation lost   :  0.00 %
  Buses out         :  0.52 %
  Lines out         :  0.71 %

4. Compound hazard: Flooding and Landslides#

This last example shows the compound effect of both flooding and landslide events in the network system.

#reload the baseline state of the power network
net = pp.from_pickle(os.path.join(current_folder, "inputs/pickle_files/uc5_network.p"))
# Fix geodata
fix_geodata(net)
# Run compound hazard failure simulation 
pf_results = run_predefined_simulation(net, current_folder, "SI", pd, load_profiles, pf_res_plotly, time_series_calculations, simulation_type, failed_substation)    
../../../_images/ec133fe49dd7b117115039d5d87e8a60b5b57c6cb1928c6767b9464a57e6a821.png
[apply_node_outage_by_name] New slack generator index: 33, max_p_mw: 703.0
affected nodes:
Index([9, 39, 48, 77, 78, 79], dtype='int64')
../../../_images/a7d94c62ea320f9604a1230dd0304b620bb91fe736caaecfb1b0c7b76d4b4c6e.png
Best generator index: 39, max_p_mw: 423.0400203072779
[apply_node_outage_by_name] New slack generator index: 39, max_p_mw: 423.0400203072779
../../../_images/47b3467bfa6dc4ccd589aa26994fa9d1750d73066854799cc19b096c93d6bb44.png

Results of the multi-hazard (floods and landslides) risk assessment

case_study_results(simulation_type)
Case study results  (DC_OPF_results_lower_Sava.xlsx)
  Total generator costs :    1.52 million €
  Max line loading      :   60.99 %
  Indirect losses       :    0.79 million €
  Energy not supplied   : 2698.46 MWh
disconnected_elements(net)
Disconnected elements:
  Buses :   7  (400 kV: 1, 110 kV: 6)
  Lines :  28  (400 kV: 10, 220 kV: 1, 110 kV: 17)
  Loads :   3
  Gens  :  10
  Generators on disconnected buses: Brezice - Gen 3, KRS - O_RES, NEK, Mokrice - Gen 2, KRS - PV, KRS - O_nonRES, Mokrice - Gen 1, Mokrice - Gen 3, Brezice - Gen 2, Brezice - Gen 1
disruption_diagnostics(net)
Systemic impact (share of national total):
  Load not supplied :  1.35 %
  Generation lost   : 21.98 %
  Buses out         :  3.66 %
  Lines out         :  9.93 %