Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/pm_io.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ include("pm_io/matpower.jl")
include("pm_io/common.jl")
include("pm_io/pti.jl")
include("pm_io/psse.jl")
include("pm_io/node_breaker.jl")
include("pm_io/data.jl")
14 changes: 14 additions & 0 deletions src/pm_io/data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,13 @@ function _make_per_unit!(data::Dict{String, <:Any}, mva_base::Real)
end
end

if haskey(data, "distributed_generation")
for (i, dgen) in data["distributed_generation"]
_apply_func!(dgen, "pg", rescale)
_apply_func!(dgen, "qg", rescale)
end
end

if haskey(data, "shunt")
for (i, shunt) in data["shunt"]
_apply_func!(shunt, "gs", rescale)
Expand Down Expand Up @@ -478,6 +485,13 @@ function _make_mixed_units!(data::Dict{String, <:Any})
end
end

if haskey(data, "distributed_generation")
for (i, dgen) in data["distributed_generation"]
_apply_func!(dgen, "pg", rescale)
_apply_func!(dgen, "qg", rescale)
end
end

if haskey(data, "shunt")
for (i, shunt) in data["shunt"]
_apply_func!(shunt, "gs", rescale)
Expand Down
325 changes: 325 additions & 0 deletions src/pm_io/node_breaker.jl

Large diffs are not rendered by default.

290 changes: 235 additions & 55 deletions src/pm_io/psse.jl

Large diffs are not rendered by default.

44 changes: 35 additions & 9 deletions src/pm_io/pti.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1523,6 +1523,14 @@ const _default_switched_shunt = Dict(
"S8" => 1, "N8" => 0, "B8" => 0.0,
)

# v35 adds a switched-shunt "ID" column absent from earlier versions. Kept as a
# separate dict (not merged into `_default_switched_shunt`) because the v29/30
# code path in `_populate_defaults!` injects every key of the shared default
# dict into SWITCHED SHUNT components regardless of the RAW's own fields, and
# v30 switched shunts have no ID field to default. "1" is the PSS/E v35
# documented default for an omitted switched-shunt ID.
const _default_switched_shunt_v35 = merge(_default_switched_shunt, Dict("ID" => "1"))

const _default_gne_device = Dict(
"NTERM" => 1,
"NREAL" => 0,
Expand Down Expand Up @@ -1580,7 +1588,10 @@ const _default_substation_data_v35 = Dict(
"LATITUDE" => 0.0,
"LONGITUDE" => 0.0,
"SGR" => 0.1,
"NODES" => Dict("NAME" => "", "STATUS" => 1, "VM" => 1.0, "VA" => 0.0),
# VM/VA are intentionally absent: a node's voltage is optional in the RAW,
# and when omitted the node inherits its bus voltage rather than a
# fabricated flat 1.0/0.0. _populate_defaults! skips these fields for NODES.
"NODES" => Dict("NAME" => "", "STATUS" => 1),
"SWITCHING DEVICES" => Dict(
"CKT" => "1",
"NAME" => "",
Expand Down Expand Up @@ -1637,7 +1648,7 @@ const _pti_defaults_v35 = Dict(
"INTER-AREA TRANSFER" => _default_interarea,
"OWNER" => _default_owner,
"FACTS CONTROL DEVICE" => _default_facts,
"SWITCHED SHUNT" => _default_switched_shunt,
"SWITCHED SHUNT" => _default_switched_shunt_v35,
"CASE IDENTIFICATION" => _default_case_identification,
"GNE DEVICE" => _default_gne_device,
"INDUCTION MACHINE" => _default_induction_machine,
Expand Down Expand Up @@ -2747,13 +2758,20 @@ proper types.
"""
function parse_pti(io::IO)::Dict
pti_data = _parse_pti_data(io)
try
pti_data["CASE IDENTIFICATION"][1]["NAME"] = match(
r"^\<file\s[\/\\]*(?:.*[\/\\])*(.*)\.raw\>$",
lowercase(io.name),
).captures[1]
catch
throw(error("This file is unrecognized and cannot be parsed"))
# Streams without a `name` field (e.g. an IOBuffer) have no file path to derive a
# case name from, so the case name is left blank instead of treating the stream as
# unrecognized.
if hasproperty(io, :name)
try
pti_data["CASE IDENTIFICATION"][1]["NAME"] = match(
r"^\<file\s[\/\\]*(?:.*[\/\\])*(.*)\.raw\>$",
lowercase(io.name),
).captures[1]
catch
throw(error("This file is unrecognized and cannot be parsed"))
end
else
pti_data["CASE IDENTIFICATION"][1]["NAME"] = ""
end

return pti_data
Expand Down Expand Up @@ -2831,6 +2849,14 @@ function _populate_defaults!(data::Dict)
for sub_component in field_value
for (sub_field, sub_field_value) in sub_component
if sub_field_value == ""
# Substation NODE voltages are optional; leave
# them unset when the RAW omits them so a node
# inheriting its bus voltage is not confused
# with one that genuinely solved to 1.0/0.0.
if field == "NODES" &&
(sub_field == "VM" || sub_field == "VA")
continue
end
try
sub_component[sub_field] =
sub_component_defaults[sub_field]
Expand Down
53 changes: 53 additions & 0 deletions test/fixtures/synthetic_v35_generic_connector.raw
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
@!IC,SBASE,REV,XFRRAT,NXFRAT,BASFRQ
0, 100.00, 35, 0, 1, 60.00
Synthetic fictional v35 case with a node-breaker SUBSTATION section including a TYPE 1 generic connector device
Second comment line
0 / END OF SYSTEM-WIDE DATA, BEGIN BUS DATA
@! I,'NAME ', BASKV, IDE,AREA,ZONE,OWNER, VM, VA, NVHI, NVLO, EVHI, EVLO
1,'BUSONE ', 138.0000,3, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
2,'BUSTWO ', 138.0000,2, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
3,'BUSTHREE ', 138.0000,1, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
0 / END OF BUS DATA, BEGIN LOAD DATA
3,'1 ', 1, 1, 1, 50.000, 10.000, 0.000, 0.000, 0.000, 0.000, 1, 1, 0, 0.000, 0.000, 0,' V'
0 / END OF LOAD DATA, BEGIN FIXED SHUNT DATA
0 / END OF FIXED SHUNT DATA, BEGIN GENERATOR DATA
1,'1 ', 80.000, 0.000, 80.000, -80.000,1.00000, 0, 0, 100.000, 0.00000E+0, 1.00000E-1, 0.00000E+0, 0.00000E+0,1.00000,1, 100.0, 120.000, 0.000, 0,1,1.0000
2,'1 ', 30.000, 0.000, 50.000, -50.000,1.00000, 0, 0, 100.000, 0.00000E+0, 1.00000E-1, 0.00000E+0, 0.00000E+0,1.00000,1, 100.0, 120.000, 0.000, 0,1,1.0000
0 / END OF GENERATOR DATA, BEGIN BRANCH DATA
1, 2,'1 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_1_2 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
2, 3,'1 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_2_3 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
0 / END OF BRANCH DATA, BEGIN SYSTEM SWITCHING DEVICE DATA
0 / END OF SYSTEM SWITCHING DEVICE DATA, BEGIN TRANSFORMER DATA
0 / END OF TRANSFORMER DATA, BEGIN AREA DATA
0 / END OF AREA DATA, BEGIN TWO-TERMINAL DC DATA
0 / END OF TWO-TERMINAL DC DATA, BEGIN VSC DC LINE DATA
0 / END OF VSC DC LINE DATA, BEGIN IMPEDANCE CORRECTION DATA
0 / END OF IMPEDANCE CORRECTION DATA, BEGIN MULTI-TERMINAL DC DATA
0 / END OF MULTI-TERMINAL DC DATA, BEGIN MULTI-SECTION LINE DATA
0 / END OF MULTI-SECTION LINE DATA, BEGIN ZONE DATA
0 / END OF ZONE DATA, BEGIN INTER-AREA TRANSFER DATA
0 / END OF INTER-AREA TRANSFER DATA, BEGIN OWNER DATA
0 / END OF OWNER DATA, BEGIN FACTS DEVICE DATA
0 / END OF FACTS DEVICE DATA, BEGIN SWITCHED SHUNT DATA
0 / END OF SWITCHED SHUNT DATA, BEGIN GNE DATA
0 / END OF GNE DATA, BEGIN INDUCTION MACHINE DATA
0 / END OF INDUCTION MACHINE DATA, BEGIN SUBSTATION DATA
@! BEGIN SUBSTATION DATA BLOCK
@! IS, 'N A M E' , LATITUDE, LONGITUDE, SGR
1,'GCSUB ', 0.0000000, 0.0000000, 0.0000
@! BEGIN SUBSTATION NODE DATA
@! NI, 'N A M E' , I,STATUS, VM , VA
1,'GCSUB$NODE1 ', 1, 1
2,'GCSUB$NODE2 ', 1, 1
3,'GCSUB$NODE3 ', 2, 1
0 / END OF SUBSTATION NODE DATA, BEGIN SUBSTATION SWITCHING DEVICE DATA
@! NI, NJ,CKTID, 'N A M E' , TYPE,STATUS, NSTAT, X , RATE1, RATE2, RATE3
1, 2, '1 ','SYNTHSUB$CB$1 ', 2, 1, 1, 0.00010, 0.00, 0.00, 0.00
2, 3, '1 ','GCSUB$GC$1 ', 1, 1, 1, 0.00010, 0.00, 0.00, 0.00
0 / END OF SUBSTATION SWITCHING DEVICE DATA, BEGIN SUBSTATION TERMINAL DATA
@! I, NI, TYP, J, K, ID
1, 1, 'B', 2, '1 '
2, 3, 'B', 3, '1 '
0 / END OF SUBSTATION TERMINAL DATA
0 / END OF SUBSTATION DATA
Q
54 changes: 54 additions & 0 deletions test/fixtures/synthetic_v35_node_breaker.raw
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
@!IC,SBASE,REV,XFRRAT,NXFRAT,BASFRQ
0, 100.00, 35, 0, 1, 60.00
Synthetic fictional v35 case with a node-breaker substation split by an open switch
Second comment line
0 / END OF SYSTEM-WIDE DATA, BEGIN BUS DATA
@! I,'NAME ', BASKV, IDE,AREA,ZONE,OWNER, VM, VA, NVHI, NVLO, EVHI, EVLO
1,'BUSONE ', 138.0000,3, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
2,'BUSTWO ', 138.0000,1, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
3,'BUSTHREE ', 138.0000,1, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
0 / END OF BUS DATA, BEGIN LOAD DATA
3,'1 ', 1, 1, 1, 50.000, 10.000, 0.000, 0.000, 0.000, 0.000, 1, 1, 0, 0.000, 0.000, 0,' V'
0 / END OF LOAD DATA, BEGIN FIXED SHUNT DATA
0 / END OF FIXED SHUNT DATA, BEGIN GENERATOR DATA
1,'1 ', 80.000, 0.000, 80.000, -80.000,1.00000, 0, 0, 100.000, 0.00000E+0, 1.00000E-1, 0.00000E+0, 0.00000E+0,1.00000,1, 100.0, 120.000, 0.000, 0,1,1.0000
0 / END OF GENERATOR DATA, BEGIN BRANCH DATA
2, 1,'1 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_2_1 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
2, 3,'2 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_2_3 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
0 / END OF BRANCH DATA, BEGIN SYSTEM SWITCHING DEVICE DATA
0 / END OF SYSTEM SWITCHING DEVICE DATA, BEGIN TRANSFORMER DATA
0 / END OF TRANSFORMER DATA, BEGIN AREA DATA
0 / END OF AREA DATA, BEGIN TWO-TERMINAL DC DATA
0 / END OF TWO-TERMINAL DC DATA, BEGIN VSC DC LINE DATA
0 / END OF VSC DC LINE DATA, BEGIN IMPEDANCE CORRECTION DATA
0 / END OF IMPEDANCE CORRECTION DATA, BEGIN MULTI-TERMINAL DC DATA
0 / END OF MULTI-TERMINAL DC DATA, BEGIN MULTI-SECTION LINE DATA
0 / END OF MULTI-SECTION LINE DATA, BEGIN ZONE DATA
0 / END OF ZONE DATA, BEGIN INTER-AREA TRANSFER DATA
0 / END OF INTER-AREA TRANSFER DATA, BEGIN OWNER DATA
0 / END OF OWNER DATA, BEGIN FACTS DEVICE DATA
0 / END OF FACTS DEVICE DATA, BEGIN SWITCHED SHUNT DATA
0 / END OF SWITCHED SHUNT DATA, BEGIN GNE DATA
0 / END OF GNE DATA, BEGIN INDUCTION MACHINE DATA
0 / END OF INDUCTION MACHINE DATA, BEGIN SUBSTATION DATA
@! BEGIN SUBSTATION DATA BLOCK
@! IS, 'N A M E' , LATITUDE, LONGITUDE, SGR
1,'NBFCSUB ', 0.0000000, 0.0000000, 0.0000
@! BEGIN SUBSTATION NODE DATA
@! NI, 'N A M E' , I,STATUS, VM , VA
1,'NBFCSUB$NODE1 ', 2, 1, 1.0200, -5.0
2,'NBFCSUB$NODE2 ', 2, 1, 1.0150, -5.5
3,'NBFCSUB$NODE3 ', 2, 1, 0.9800, 10.0
4,'NBFCSUB$NODE4 ', 2, 1, 0.9850, 10.5
0 / END OF SUBSTATION NODE DATA, BEGIN SUBSTATION SWITCHING DEVICE DATA
@! NI, NJ,CKTID, 'N A M E' , TYPE,STATUS, NSTAT, X , RATE1, RATE2, RATE3
1, 2, '1 ','NBFCSUB$CB$12 ', 2, 1, 1, 0.00010, 0.00, 0.00, 0.00
2, 3, '1 ','NBFCSUB$DSC$23 ', 3, 0, 1, 0.00010, 0.00, 0.00, 0.00
3, 4, '1 ','NBFCSUB$CB$34 ', 2, 1, 1, 0.00010, 0.00, 0.00, 0.00
0 / END OF SUBSTATION SWITCHING DEVICE DATA, BEGIN SUBSTATION TERMINAL DATA
@! I, NI, TYP, J, K, ID
2, 1, 'B', 1, '1 '
2, 4, 'B', 3, '2 '
0 / END OF SUBSTATION TERMINAL DATA
0 / END OF SUBSTATION DATA
Q
52 changes: 52 additions & 0 deletions test/fixtures/synthetic_v35_node_voltage_inherit.raw
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
@!IC,SBASE,REV,XFRRAT,NXFRAT,BASFRQ
0, 100.00, 35, 0, 1, 60.00
Synthetic fictional v35 case whose substation nodes store no voltage
Second comment line
0 / END OF SYSTEM-WIDE DATA, BEGIN BUS DATA
@! I,'NAME ', BASKV, IDE,AREA,ZONE,OWNER, VM, VA, NVHI, NVLO, EVHI, EVLO
1,'BUSONE ', 138.0000,3, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
2,'BUSTWO ', 138.0000,1, 1, 1, 1,1.05000, 3.0000,1.10000,0.90000,1.10000,0.90000
3,'BUSTHREE ', 138.0000,1, 1, 1, 1,1.00000, 0.0000,1.10000,0.90000,1.10000,0.90000
0 / END OF BUS DATA, BEGIN LOAD DATA
3,'1 ', 1, 1, 1, 50.000, 10.000, 0.000, 0.000, 0.000, 0.000, 1, 1, 0, 0.000, 0.000, 0,' V'
0 / END OF LOAD DATA, BEGIN FIXED SHUNT DATA
0 / END OF FIXED SHUNT DATA, BEGIN GENERATOR DATA
1,'1 ', 80.000, 0.000, 80.000, -80.000,1.00000, 0, 0, 100.000, 0.00000E+0, 1.00000E-1, 0.00000E+0, 0.00000E+0,1.00000,1, 100.0, 120.000, 0.000, 0,1,1.0000
0 / END OF GENERATOR DATA, BEGIN BRANCH DATA
2, 1,'1 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_2_1 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
2, 3,'2 ', 1.00000E-02, 1.00000E-01,0.02000,'BRANCH_2_3 ', 500.00, 500.00, 500.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 1.00, 1,1.0000
0 / END OF BRANCH DATA, BEGIN SYSTEM SWITCHING DEVICE DATA
0 / END OF SYSTEM SWITCHING DEVICE DATA, BEGIN TRANSFORMER DATA
0 / END OF TRANSFORMER DATA, BEGIN AREA DATA
0 / END OF AREA DATA, BEGIN TWO-TERMINAL DC DATA
0 / END OF TWO-TERMINAL DC DATA, BEGIN VSC DC LINE DATA
0 / END OF VSC DC LINE DATA, BEGIN IMPEDANCE CORRECTION DATA
0 / END OF IMPEDANCE CORRECTION DATA, BEGIN MULTI-TERMINAL DC DATA
0 / END OF MULTI-TERMINAL DC DATA, BEGIN MULTI-SECTION LINE DATA
0 / END OF MULTI-SECTION LINE DATA, BEGIN ZONE DATA
0 / END OF ZONE DATA, BEGIN INTER-AREA TRANSFER DATA
0 / END OF INTER-AREA TRANSFER DATA, BEGIN OWNER DATA
0 / END OF OWNER DATA, BEGIN FACTS DEVICE DATA
0 / END OF FACTS DEVICE DATA, BEGIN SWITCHED SHUNT DATA
0 / END OF SWITCHED SHUNT DATA, BEGIN GNE DATA
0 / END OF GNE DATA, BEGIN INDUCTION MACHINE DATA
0 / END OF INDUCTION MACHINE DATA, BEGIN SUBSTATION DATA
@! BEGIN SUBSTATION DATA BLOCK
@! IS, 'N A M E' , LATITUDE, LONGITUDE, SGR
1,'NVSUB ', 0.0000000, 0.0000000, 0.0000
@! BEGIN SUBSTATION NODE DATA
@! NI, 'N A M E' , I,STATUS (VM/VA omitted -> node inherits bus voltage)
1,'NVSUB$NODE1 ', 2, 1
2,'NVSUB$NODE2 ', 2, 1
3,'NVSUB$NODE3 ', 2, 1
0 / END OF SUBSTATION NODE DATA, BEGIN SUBSTATION SWITCHING DEVICE DATA
@! NI, NJ,CKTID, 'N A M E' , TYPE,STATUS, NSTAT, X , RATE1, RATE2, RATE3
1, 2, '1 ','NVSUB$CB$12 ', 2, 1, 1, 0.00010, 0.00, 0.00, 0.00
2, 3, '1 ','NVSUB$CB$23 ', 2, 1, 1, 0.00010, 0.00, 0.00, 0.00
0 / END OF SUBSTATION SWITCHING DEVICE DATA, BEGIN SUBSTATION TERMINAL DATA
@! I, NI, TYP, J, K, ID
2, 1, 'B', 1, '1 '
2, 3, 'B', 3, '2 '
0 / END OF SUBSTATION TERMINAL DATA
0 / END OF SUBSTATION DATA
Q
Loading
Loading