File Formats Guide
In this section, we will give a brief introduction to the file formats supported in PowerModelsITD.jl. Place special attention at the Boundary section to understand how the boundary linking file must be formatted and how the auto_rename=true
option works.
File Formats Supported
- Transmission: Matpower ".m" and PTI ".raw" files (PSS(R)E v33 specification)
- Distribution: OpenDSS ".dss" files
- Boundary: JSON ".json" files
Transmission System
- Matpower (".m")
function mpc = case5
mpc.version = '2';
mpc.baseMVA = 100.0;
%% bus data
% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin
mpc.bus = [
1 2 0.0 0.0 0.0 0.0 1 1.07762 2.80377 230.0 1 1.10000 0.90000;
2 1 300.0 98.61 0.0 0.0 1 1.08407 -0.73465 230.0 1 1.10000 0.90000;
3 2 300.0 98.61 0.0 0.0 1 1.10000 -0.55972 230.0 1 1.10000 0.90000;
4 3 390.0 131.47 0.0 0.0 1 1.06414 0.00000 230.0 1 1.10000 0.90000;
5 1 8.0 1.2 0.0 0.0 1 1.00000 0.00000 230.0 1 1.10000 0.90000;
10 2 0.0 0.0 0.0 0.0 1 1.06907 3.59033 230.0 1 1.10000 0.90000;
];
%% generator data
% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin
mpc.gen = [
1 40.0 30.0 30.0 -30.0 1.07762 100.0 1 40.0 0.0;
1 170.0 127.5 127.5 -127.5 1.07762 100.0 1 170.0 0.0;
3 324.498 390.0 390.0 -390.0 1.1 100.0 1 520.0 0.0;
4 0.0 -10.802 150.0 -150.0 1.06414 100.0 1 200.0 0.0;
10 470.694 -165.039 450.0 -450.0 1.06907 100.0 1 600.0 0.0;
];
%% generator cost data
% 2 startup shutdown n c(n-1) ... c0
mpc.gencost = [
2 0.0 0.0 3 0.000000 14.000000 0.000000 2.000000;
2 0.0 0.0 3 0.000000 15.000000 0.000000 2.000000;
2 0.0 0.0 3 0.000000 30.000000 0.000000 2.000000;
2 0.0 0.0 3 0.000000 40.000000 0.000000 2.000000;
2 0.0 0.0 3 0.000000 10.000000 0.000000 2.000000;
];
%% branch data
% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax
mpc.branch = [
1 2 0.00281 0.0281 0.00712 400.0 400.0 400.0 0.0 0.0 1 -30.0 30.0;
1 4 0.00304 0.0304 0.00658 426 426 426 0.0 0.0 1 -30.0 30.0;
1 10 0.00064 0.0064 0.03126 426 426 426 0.0 0.0 1 -30.0 30.0;
2 3 0.00108 0.0108 0.01852 426 426 426 0.0 0.0 1 -30.0 30.0;
3 4 0.00297 0.0297 0.00674 426 426 426 1.05 1.0 1 -30.0 30.0;
4 10 0.00297 0.0297 0.00674 240.0 240.0 240.0 0.0 0.0 1 -30.0 30.0;
2 5 0.00297 0.0297 0.00674 426 426 426 0.0 0.0 1 -30.0 30.0;
];
- PSS(R)E v33 specification (".raw")
0, 100.00, 33, 0, 0, 60.00
tests an angle shifting transformer
tests two winding transformer status
1,'1', 230.0000,2, 1, 1, 1,1.00000000, 2.803770, 1.10000, 0.90000, 1.10000, 0.90000
2,'2', 230.0000,1, 1, 1, 1,1.08406997, -0.734650, 1.10000, 0.90000, 1.10000, 0.90000
3,'3', 230.0000,2, 1, 1, 1,1.00000000, -0.559720, 1.10000, 0.90000, 1.10000, 0.90000
4,'4', 230.0000,3, 1, 1, 1,1.06413996, 0.000000, 1.10000, 0.90000, 1.10000, 0.90000
5,'5', 230.0000,1, 1, 1, 1,1.00000000, 0.000000, 1.10000, 0.90000, 1.10000, 0.90000
10,'10', 230.0000,2, 1, 1, 1,1.00000000, 3.590330, 1.10000, 0.90000, 1.10000, 0.90000
0 / END OF BUS DATA, BEGIN LOAD DATA
2,'1',1, 1, 1, 300.000, 98.610, 0.000, 0.000, 0.000, 0.000, 1,1
3,'1',1, 1, 1, 300.000, 98.610, 0.000, 0.000, 0.000, 0.000, 1,1
4,'1',1, 1, 1, 390.000, 131.470, 0.000, 0.000, 0.000, 0.000, 1,1
5,'1',1, 1, 1, 8.00000, 1.20000, 0.000, 0.000, 0.000, 0.000, 1,1
0 / END OF LOAD DATA, BEGIN FIXED SHUNT DATA
0 / END OF FIXED SHUNT DATA, BEGIN GENERATOR DATA
1,'1', 40.000, 30.000, 30.000, -30.000,1.07762, 0, 100.000, 0.00000, 1.00000, 0.00000, 0.00000,1.00000,1, 100.0, 40.000, 0.000, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,0, 1.0000
1,'2', 170.000, 127.500, 127.500, -127.500,1.07762, 0, 100.000, 0.00000, 1.00000, 0.00000, 0.00000,1.00000,1, 100.0, 170.000, 0.000, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,0, 1.0000
3,'1', 324.498, 390.000, 390.000, -390.000,1.10000, 0, 100.000, 0.00000, 1.00000, 0.00000, 0.00000,1.00000,1, 100.0, 520.000, 0.000, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,0, 1.0000
4,'1', 0.000, -10.802, 150.000, -150.000,1.06414, 0, 100.000, 0.00000, 1.00000, 0.00000, 0.00000,1.00000,1, 100.0, 200.000, 0.000, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,0, 1.0000
10,'1', 470.694, -165.039, 450.000, -450.000,1.06907, 0, 100.000, 0.00000, 1.00000, 0.00000, 0.00000,1.00000,1, 100.0, 600.000, 0.000, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,0, 1.0000
0 / END OF GENERATOR DATA, BEGIN BRANCH DATA
1, 2,'1',2.81000E-3,2.81000E-2,7.12000E-3, 400.00, 400.00, 400.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
1, 4,'1',3.04000E-3,3.04000E-2,6.58000E-3, 426.00, 426.00, 426.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
1, 10,'1',6.40000E-4,6.40000E-3,3.12600E-2, 426.00, 426.00, 426.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
2, 3,'1',1.08000E-3,1.08000E-2,1.85200E-2, 426.00, 426.00, 426.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
3, 4,'1',2.97000E-3,2.97000E-2,6.74000E-3, 426.00, 426.00, 426.00, 1.05000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
4, 10,'1',2.97000E-3,2.97000E-2,6.74000E-3, 240.00, 240.00, 240.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
2, 5,'1',2.97000E-3,2.97000E-2,6.74000E-3, 426.00, 426.00, 426.00, 0.00000, 0.00000, 0.00000, 0.00000,1,1, 0.0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000
0 / END OF BRANCH DATA, BEGIN TRANSFORMER DATA
4, 3, 0,'1 ',0,1,1,0.00000E0,6.74000E-3,2,' ',1, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,' '
2.97000E-3,2.97000E-2, 100.00
1.050000,230.000, -1.000, 426.00, 426.00, 426.00,-3, 0, 30.00, -30.00, 150.00, 51.00,9601, 0, 0.00000, 0.00000, 0.000
1.000000,230.000
3, 4, 0,'2 ',1,0,1,0.00000E0,6.74000E-3,2,' ',1, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,' '
2.97000E-3,2.97000E-2, 100.00
1.050000,230.000, 1.000, 426.00, 426.00, 426.00,-3, 0, 30.00, -30.00, 150.00, 51.00,9601, 0, 0.00000, 0.00000, 0.000
1.000000,230.000
3, 4, 0,'2 ',1,1,0,0.00000E0,6.74000E-3,2,' ',0, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,' '
2.97000E-3,2.97000E-2, 100.00
1.050000,230.000, 1.000, 426.00, 426.00, 426.00,-3, 0, 30.00, -30.00, 150.00, 51.00,9601, 0, 0.00000, 0.00000, 0.000
1.000000,230.000
3, 4, 0,'2 ',1,1,1,0.00000E0,6.74000E-3,2,' ',2, 1,1.0000, 0,1.0000, 0,1.0000, 0,1.0000,' '
2.97000E-3,2.97000E-2, 100.00
1.050000,230.000, 1.000, 426.00, 426.00, 426.00,-3, 0, 30.00, -30.00, 150.00, 51.00,9601, 0, 0.00000, 0.00000, 0.000
1.000000,230.000
0 / END OF TRANSFORMER DATA, BEGIN AREA DATA
1, 0, 0.000, 1.000,'1 '
0 / END OF AREA DATA, BEGIN TWO-TERMINAL DC DATA
0 / END OF TWO-TERMINAL DC DATA, BEGIN VOLTAGE SOURCE CONVERTER DATA
0 / END OF VOLTAGE SOURCE CONVERTER 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
1,'1 '
0 / END OF ZONE DATA, BEGIN INTER-AREA TRANSFER DATA
0 / END OF INTER-AREA TRANSFER DATA, BEGIN OWNER DATA
1,'1'
0 / END OF OWNER DATA, BEGIN FACTS CONTROL DEVICE DATA
0 / END OF FACTS CONTROL DEVICE DATA, BEGIN SWITCHED SHUNT DATA
0 /END OF SWITCHED SHUNT DATA, BEGIN GNE DEVICE DATA
0 /END OF GNE DEVICE DATA
Q
Distribution System
- OpenDSS (".dss")
New Circuit.3bus_bal
! define a really stiff source
~ basekv=230 pu=1.00 MVAsc3=200000 MVAsc1=210000
! Substation Transformer
New Transformer.SubXF Phases=3 Windings=2 Xhl=0.01
~ wdg=1 bus=sourcebus conn=wye kv=230 kva=25000 %r=0.0005
~ wdg=2 bus=Substation conn=wye kv=13.8 kva=25000 %r=0.0005
!Define Linecodes
New linecode.556MCM nphases=3 basefreq=60 ! ohms per 5 mile
~ rmatrix = ( 0.1000 | 0.0400 0.1000 | 0.0400 0.0400 0.1000)
~ xmatrix = ( 0.0583 | 0.0233 0.0583 | 0.0233 0.0233 0.0583)
~ cmatrix = (50.92958178940651 | -0 50.92958178940651 | -0 -0 50.92958178940651 ) ! small capacitance
New linecode.4/0QUAD nphases=3 basefreq=60 ! ohms per 100ft
~ rmatrix = ( 0.1167 | 0.0467 0.1167 | 0.0467 0.0467 0.1167)
~ xmatrix = (0.0667 | 0.0267 0.0667 | 0.0267 0.0267 0.0667 )
~ cmatrix = (50.92958178940651 | -0 50.92958178940651 | -0 -0 50.92958178940651 ) ! small capacitance
!Define lines
New Line.OHLine bus1=Substation.1.2.3 Primary.1.2.3 linecode = 556MCM length=1 normamps=6000 emergamps=6000! 5 mile line
New Line.Quad Bus1=Primary.1.2.3 loadbus.1.2.3 linecode = 4/0QUAD length=1 normamps=6000 emergamps=6000 ! 100 ft
!Loads - single phase
New Load.L1 phases=1 loadbus.1.0 ( 13.8 3 sqrt / ) kW=3000 kvar=1500 model=1
New Load.L2 phases=1 loadbus.2.0 ( 13.8 3 sqrt / ) kW=3000 kvar=1500 model=1
New Load.L3 phases=1 loadbus.3.0 ( 13.8 3 sqrt / ) kW=3000 kvar=1500 model=1
!GENERATORS DEFINITIONS
New generator.gen1 Bus1=loadbus.1.2.3 Phases=3 kV=( 13.8 3 sqrt / ) kW=2000 pf=1 conn=wye Model=3
Set VoltageBases = "230,13.8"
Set tolerance=0.000001
set defaultbasefreq=60
Important Note: See how the defined file has a unique circuit (ckt) name (i.e., New Circuit.3bus_bal
). It is important that for scenarios where multiple distribution systems are to be used, each distribution system file must have a unique ckt name. Otherwise, PowerModelsITD.jl will generate an error indicating the user that they must input distribution systems with unique names (or use the auto_rename=true
option explained later).
Boundary
The file shown below shows the ideal format to be used when defining the boundary connections in the JSON file. For transmission system boundary buses, the name of the bus is sufficient. For distribution systems, especially, cases where multiple distribution systems will be inputted, the ideal format for distribution_boundary
names is circuit_name.object.name_of_object
. In this example, two distribution systems (3bus_unbal
and 3bus_bal
) are going to be connected to buses 5 and 6 in the transmission system.
- JSON (".json")
[
{
"transmission_boundary": "5",
"distribution_boundary": "3bus_unbal.voltage_source.source"
},
{
"transmission_boundary": "6",
"distribution_boundary": "3bus_bal.voltage_source.source"
}
]
As observed in the file, we follow the ideal format when defining the distribution_boundary
names. If this format is not followed (and the auto_rename=true
option is not used), errors will be displayed by PowerModelsITD.jl. Errors ranging from "The distribution bus/source specified in the JSON file does not exists. Please input an existing bus/source!"
to "Distribution systems have same circuit names! Please use different names for each distribution system. (e.g., New Circuit.NameOfCkt) or use the auto_rename=true option."
will be displayed warning the user that something is wrong with the JSON file information provided.
But, what happens when we would like to use the same distribution system file to create multiple dsitribution systems connected at different transmission system boundary buses. In other words, we don't care too much about the names of the distribution circuits, and the boundary names in the JSON file are inputted in a sequential order. Then, for use with caution, PowerModelsITD.jl supports the use of an auto-renaming option that renames repeated circuits in a sequential manner such as: pmd_files = [pmd, pmd, ..., pmd]
, pmd_cktName_1
, pmd_cktName_2
, ..., pmd_cktName_n
.
Important Note: All elements/components inside the pmd=>
dictionary will always be renamed based on the format ckt_name.component_name
The auto_rename=true
Option
Important Note: Use this option with extreme caution! When this option is used, a @warn
will be displayed such that the user is aware that the boundary connections may be wrong because they are assigned/connected in a sequential manner and not based on buses names.
Let's go through an example case where we would like to use the same distribution system file to create a test case where multiple distribution systems (with the same name) are connected to different transmission system boundary buses. And, we don't care about the specific boundary connections since they can be done sequentially (since all or some distribution systems will be a copy of the same circuit and will have the same names).
Let's first define the test case in Julia:
using PowerModelsITD
using Ipopt
pm_file = joinpath(dirname(trans_path), "case5_with2loads.m")
pmd_file = joinpath(dirname(dist_path), "case3_unbalanced_withoutgen.dss")
pmd_files = [pmd_file, pmd_file] # vector of multiple distro. systems copies
pmitd_file = joinpath(dirname(bound_path), "case5_case3x2.json")
pmitd_type = NLPowerModelITD{ACPPowerModel, ACPUPowerModel}
result = solve_opfitd(pm_file, pmd_files, pmitd_file, pmitd_type, Ipopt.Optimizer; auto_rename=true)
Another way to define and solve the problem could be (both ways are equivalent):
using PowerModelsITD
using Ipopt
pm_file = joinpath(dirname(trans_path), "case5_with2loads.m")
pmd_file = joinpath(dirname(dist_path), "case3_unbalanced_withoutgen.dss")
pmd_files = [pmd_file, pmd_file] # vector of multiple distro. systems copies
pmitd_file = joinpath(dirname(bound_path), "case5_case3x2.json")
pmitd_type = NLPowerModelITD{ACPPowerModel, ACPUPowerModel}
pmitd_data = parse_files(pm_file, pmd_files, pmitd_file; auto_rename=true)
result = solve_model(pmitd_data, pmitd_type, Ipopt.Optimizer, build_opfitd)
Note, how the option auto_rename=true
is defined such that PowerModelsITD.jl can understand that we don't care about the specific names of the circuits (because we are repeating ckts) so we are allowing the application to auto-rename the ckts as needed for its correct operation. If the auto_rename
option is not defined, errors will be displayed.
The JSON file for this example is defined as:
[
{
"transmission_boundary": "5",
"distribution_boundary": "voltage_source.source"
},
{
"transmission_boundary": "6",
"distribution_boundary": "voltage_source.source"
}
]
See how we do not need to especifically define the circuit names, but we still need to define the object.name_of_object
. Internally, PowerModelsITD.jl will parse the files and assign the names: 3bus_unbal_nogen_1
and 3bus_unbal_nogen_2
as the names of the circuits (based on the ckt_name_n
standard format).
Important Note: In the case where multiple distribuition systems are defined, let's say 3 or more, and only two have the same circuit name, if auto_rename=false
(i.e., not used) errors will be displayed, if auto_rename=true
only the repeated circuits will be renamed (in this case, all repeated circuits after the first one).
The auto rename
option can be very useful for some cases, but users must be very careful when using it since specific boundary connections are going to be performed in a sequential manner and PowerModelsITD.jl cannot guarantee that this is what the user is expecting. To avoid confusions, we recommend users stick to the ideal boundary linking file JSON format.