@@ -16,64 +16,14 @@ function parse_matpower(file_string)
16
16
17
17
make_per_unit (data)
18
18
19
+ merge_generator_cost_data (data)
20
+
19
21
add_derived_values (data)
20
22
21
23
return data
22
24
end
23
25
24
26
25
- not_pu = Set ([" rate_a" ," rate_b" ," rate_c" ," bs" ," gs" ," pd" ," qd" ," pg" ," qg" ," pmax" ," pmin" ," qmax" ," qmin" ])
26
- not_rad = Set ([" angmax" ," angmin" ," shift" ," va" ])
27
-
28
- function make_per_unit (data:: Dict{AbstractString,Any} )
29
- if ! haskey (data, " per_unit" ) || data[" per_unit" ] == false
30
- make_per_unit (data[" baseMVA" ], data)
31
- data[" per_unit" ] = true
32
- end
33
- end
34
-
35
- function make_per_unit (mva_base:: Number , data:: Dict{AbstractString,Any} )
36
- for k in keys (data)
37
- if k == " gencost"
38
- for cost_model in data[k]
39
- if cost_model[" model" ] != 2
40
- warn (" Skipping generator cost model of type other than 2" )
41
- continue
42
- end
43
- degree = length (cost_model[" cost" ])
44
- for (i, item) in enumerate (cost_model[" cost" ])
45
- cost_model[" cost" ][i] = item* mva_base^ (degree- i)
46
- end
47
- end
48
- elseif isa (data[k], Number)
49
- if k in not_pu
50
- data[k] = data[k]/ mva_base
51
- end
52
- if k in not_rad
53
- data[k] = pi * data[k]/ 180.0
54
- end
55
- # println("$(k) $(data[k])")
56
- else
57
- make_per_unit (mva_base, data[k])
58
- end
59
- end
60
- end
61
-
62
- function make_per_unit (mva_base:: Number , data:: Array{Any,1} )
63
- for item in data
64
- make_per_unit (mva_base, item)
65
- end
66
- end
67
-
68
- function make_per_unit (mva_base:: Number , data:: AbstractString )
69
- # nothing to do
70
- end
71
-
72
- function make_per_unit (mva_base:: Number , data:: Number )
73
- # nothing to do
74
- end
75
-
76
-
77
27
# checks that phase angle differences are within 90 deg., if not tightens
78
28
function check_phase_angle_differences (data, default_pad = 60 )
79
29
for branch in data[" branch" ]
@@ -126,8 +76,22 @@ function check_thermal_limits(data)
126
76
end
127
77
128
78
79
+ # ensures all costs functions are quadratic and reverses their order
80
+ function standardize_cost_order (data:: Dict{AbstractString,Any} )
81
+ for gencost in data[" gencost" ]
82
+ if gencost[" model" ] == 2 && length (gencost[" cost" ]) < 3
83
+ # println("std gen cost: ",gencost["cost"])
84
+ cost_3 = [zeros (1 ,3 - length (gencost[" cost" ])); gencost[" cost" ]]
85
+ gencost[" cost" ] = cost_3
86
+ # println(" ",gencost["cost"])
87
+ warn (" added zeros to make generator cost ($(gencost[" index" ]) ) a quadratic function: $(cost_3) " )
88
+ end
89
+ end
90
+ end
91
+
92
+
129
93
# sets all line transformer taps to 1.0, to simplify line models
130
- function unify_transformer_taps (data)
94
+ function unify_transformer_taps (data:: Dict{AbstractString,Any} )
131
95
branches = [branch for branch in data[" branch" ]]
132
96
if haskey (data, " ne_branch" )
133
97
append! (branches, data[" ne_branch" ])
@@ -139,16 +103,74 @@ function unify_transformer_taps(data)
139
103
end
140
104
end
141
105
142
- # ensures all costs functions are quadratic and reverses their order
143
- function standardize_cost_order (data:: Dict{AbstractString,Any} )
144
- for gencost in data[" gencost" ]
145
- if gencost[" model" ] == 2 && length (gencost[" cost" ]) < 3
146
- # println("std gen cost: ",gencost["cost"])
147
- cost_3 = [zeros (1 ,3 - length (gencost[" cost" ])); gencost[" cost" ]]
148
- gencost[" cost" ] = cost_3
149
- # println(" ",gencost["cost"])
150
- warn (" added zeros to make generator cost ($(gencost[" index" ]) ) a quadratic function: $(cost_3) " )
106
+
107
+ # ## Recursive Per Unit Computation ###
108
+
109
+ not_pu = Set ([" rate_a" ," rate_b" ," rate_c" ," bs" ," gs" ," pd" ," qd" ," pg" ," qg" ," pmax" ," pmin" ," qmax" ," qmin" ])
110
+ not_rad = Set ([" angmax" ," angmin" ," shift" ," va" ])
111
+
112
+ function make_per_unit (data:: Dict{AbstractString,Any} )
113
+ if ! haskey (data, " per_unit" ) || data[" per_unit" ] == false
114
+ make_per_unit (data[" baseMVA" ], data)
115
+ data[" per_unit" ] = true
116
+ end
117
+ end
118
+
119
+ function make_per_unit (mva_base:: Number , data:: Dict{AbstractString,Any} )
120
+ for k in keys (data)
121
+ if k == " gencost"
122
+ for cost_model in data[k]
123
+ if cost_model[" model" ] != 2
124
+ warn (" Skipping generator cost model of type other than 2" )
125
+ continue
126
+ end
127
+ degree = length (cost_model[" cost" ])
128
+ for (i, item) in enumerate (cost_model[" cost" ])
129
+ cost_model[" cost" ][i] = item* mva_base^ (degree- i)
130
+ end
131
+ end
132
+ elseif isa (data[k], Number)
133
+ if k in not_pu
134
+ data[k] = data[k]/ mva_base
135
+ end
136
+ if k in not_rad
137
+ data[k] = pi * data[k]/ 180.0
138
+ end
139
+ # println("$(k) $(data[k])")
140
+ else
141
+ make_per_unit (mva_base, data[k])
142
+ end
143
+ end
144
+ end
145
+
146
+ function make_per_unit (mva_base:: Number , data:: Array{Any,1} )
147
+ for item in data
148
+ make_per_unit (mva_base, item)
149
+ end
150
+ end
151
+
152
+ function make_per_unit (mva_base:: Number , data:: AbstractString )
153
+ # nothing to do
154
+ end
155
+
156
+ function make_per_unit (mva_base:: Number , data:: Number )
157
+ # nothing to do
158
+ end
159
+
160
+ # merges generator cost functions into generator data, if they exist
161
+ function merge_generator_cost_data (data:: Dict{AbstractString,Any} )
162
+ if haskey (data, " gencost" )
163
+ # can assume same length is same as gen (or double)
164
+ # this is validated during parsing
165
+ for (i, gencost) in enumerate (data[" gencost" ])
166
+ gen = data[" gen" ][i]
167
+ assert (gen[" index" ] == gencost[" index" ])
168
+ delete! (gencost, " index" )
169
+
170
+ check_keys (gen, keys (gencost))
171
+ merge! (gen, gencost)
151
172
end
173
+ delete! (data, " gencost" )
152
174
end
153
175
end
154
176
0 commit comments