Skip to content

Commit 339d488

Browse files
committed
moved gen cost function merging to matpower parser code
1 parent a32a228 commit 339d488

File tree

2 files changed

+84
-68
lines changed

2 files changed

+84
-68
lines changed

src/core/base.jl

-6
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,6 @@ function build_ref(data::Dict{AbstractString,Any})
101101
end
102102
end
103103

104-
if haskey(ref, :gencost)
105-
for (i, gencost) in ref[:gencost]
106-
merge!(ref[:gen][i], gencost)
107-
end
108-
end
109-
110104
# filter turned off stuff
111105
ref[:bus] = filter((i, bus) -> bus["bus_type"] != 4, ref[:bus])
112106
ref[:gen] = filter((i, gen) -> gen["gen_status"] == 1 && gen["gen_bus"] in keys(ref[:bus]), ref[:gen])

src/io/matpower.jl

+84-62
Original file line numberDiff line numberDiff line change
@@ -16,64 +16,14 @@ function parse_matpower(file_string)
1616

1717
make_per_unit(data)
1818

19+
merge_generator_cost_data(data)
20+
1921
add_derived_values(data)
2022

2123
return data
2224
end
2325

2426

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-
7727
# checks that phase angle differences are within 90 deg., if not tightens
7828
function check_phase_angle_differences(data, default_pad = 60)
7929
for branch in data["branch"]
@@ -126,8 +76,22 @@ function check_thermal_limits(data)
12676
end
12777

12878

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+
12993
# 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})
13195
branches = [branch for branch in data["branch"]]
13296
if haskey(data, "ne_branch")
13397
append!(branches, data["ne_branch"])
@@ -139,16 +103,74 @@ function unify_transformer_taps(data)
139103
end
140104
end
141105

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)
151172
end
173+
delete!(data, "gencost")
152174
end
153175
end
154176

0 commit comments

Comments
 (0)