Newer
Older
#* Functions for plotting hurricane impacts modelled in Impact.jl
#*------------------------------------------------------------------------------
#=
Plots histograms of the number of line failures for given values of γ
=#
function plothist_tl_failures(
γ_values::Array{Float64,1},
N_runs::Int64,
rstep = 20; # number of realizations that were saved together
datapath = "", # path to folder containing different γ scans
plotpath = "" # where to save the plot
)
N_γ = length(γ_values) # number of given γ values
mean_Nf_arr = zeros(N_γ) # array for mean number of line failures
σ_arr = zeros(N_γ) # array for standard deviations
### Go through γ values and plot the respective histogram
for i in 1:N_γ
mean_Nf, σ = plothist_tl_failures(
γ_values[i], N_runs, rstep, datapath=datapath, plotpath=plotpath
)
mean_Nf_arr[i] = mean_Nf # save mean number of failures
σ_arr[i] = σ # save standard deviation
end
return mean_Nf_arr, σ_arr
end
#=
Plots a histogram of the number of line failures for a given γ value
=#
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
function plothist_tl_failures(
γ::Float64,
N_runs::Int64,
rstep = 20; # number of realizations that were saved together
datapath::String, # path to folder containing data files
plotpath::String # where to save the plot
)
Nf = zeros(Int64, N_runs) # array for number of failures
### Read data and save the number of failures that occured in each run
for i in rstep:rstep:N_runs
res = load(datapath * "gamma$γ/" * "results_$γ" * "_$i.jld2", "result")
for j in 1:rstep
Nf[i-rstep+j] = length(res[j])
end
end
### Plot a historgram of the number of failures
N_bins = maximum(Nf) - minimum(Nf) # number of bins
n, bins, patches = plt[:hist](Nf, bins=N_bins, edgecolor="k")
### Calculate mean number of failures and standard deviation
mean_Nf = round(mean!([1.], Nf)[1], digits=1)
σ = round(std(Nf, mean=mean_Nf), digits=1)
### Legend with γ, mean number of failures and standard deviation
mlines = pyimport("matplotlib.lines")
no_marker = mlines.Line2D([], [], ls="None")
plt.legend(
[no_marker for i in 1:4],
[L"γ = " * "$γ",
L"N_r = " * "$N_runs",
L"\bar{N}_\mathrm{f} \approx" * "$mean_Nf",
L"\sigma_\mathrm{f} \approx" * "$σ"],
handletextpad = 0, handlelength = 0
)
### Axes labels
plt.xlabel("Number of line failures " * L"N_\mathrm{f}")
plt.ylabel("Frequency")
### Save and close figure
figpath = plotpath * "Texas_hist_tl_failures_gamma$γ.png"
plt.savefig(figpath, bbox_inches="tight")
plt.clf()
return mean_Nf, σ
end
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#*------------------------------------------------------------------------------
#=
Plots all frames contained in the provided wind data together with the current power grid. A hurricane may damage the grid according to the data in tl_failures and the corresponding lines are removed from variable_ndd.
=#
function plot_pg_impact(
network_data::Dict{String,<:Any},
tl_failures::Array{Tuple{String,Int64}}, # time series of tl failures
settings = Dict{String,Any}(); # plot settings
windfile = "", # .nc file containing wind data
figpath = ""
)
variable_ndd = deepcopy(network_data) # NDD that is changed during storm
### Get frames in which transmission lines failed
failure_frames = unique([tl_failures[i][2] for i in 1:length(tl_failures)])
N_frames, max_ws = get_winddata(windfile) # get number of frames
for f in 1:N_frames # plot every time step
if f in failure_frames # line failure occured
### Disable all lines that failed in this frame
destroyed_tl = [tlf[1] for tlf in tl_failures if tlf[2] == f]
destroy_tl!(variable_ndd, destroyed_tl)
end
figpath_f = figpath * "_frame$f.png"
plot_pg_map(
variable_ndd, settings, wind=(windfile, f), figpath=figpath_f
)
end
return variable_ndd
end