Distribution networks

OpenDSS, PMD JSON, and BMOPF sources parse into a MulticonductorNetwork: buses with named terminals, lines with per length impedance matrices, transformers with windings, loads and generators with per terminal powers.

feeder = parse("IEEE13Nodeckt.dss")     # PioModule{MulticonductorNetwork}
net = feeder.value

net.name
net.base_frequency                       # 60.0
net.source_format                        # "dss"

net.buses                                # Elements{MulticonductorBus}
net.line_codes                            # Elements{MulticonductorLineCode}
net.lines
net.switches
net.transformers
net.loads
net.generators
net.ibrs                                 # inverter based resources
net.control_profiles
net.shunts
net.capacitors
net.voltage_sources
net.untyped_objects                              # source objects kept without a typed slot
net.commands                             # retained source commands (solve, ...)
net.options                              # name => value pairs
lc = net.line_codes[1]
lc.resistance                            # conductor_count square, ohm per metre
lc.reactance
lc.susceptance_from + lc.susceptance_to  # siemens per metre

line = net.lines[1]
line.bus_from, line.terminals_from       # "650", ["1", "2", "3"]
line.line_code, line.length_m

load = net.loads[1]
load.terminals                           # phases and neutral
load.active_power_nominal_w              # one entry per phase
load.voltage_model                       # "constant_power", ...

Units are SI (volts, watts, vars, metres, ohms, siemens), and terminal maps are vectors of terminal names in the order the source lists them.

Writing

emit writes the same three formats. If you read a module from OpenDSS and change nothing, writing it as "dss" gives you the original .dss files back; PMD JSON and BMOPF are canonical output, with diagnostics for whatever the target format cannot represent.

emit(feeder, "dss", "copy.dss")
emit(feeder, "pmd").text
emit(feeder, "bmopf").text
emit(feeder, "bmopf-json@0.1.0").text
emit(feeder, "bmopf-json@0.2.0").text

OpenDSS, PMD JSON, and BMOPF are grid exchange formats: other tools read and write them, and they enter PowerIO through parse and leave through emit. PowerIO IR, written by serialize and read by deserialize, is PowerIO's own serialization of a module, diagnostics and history included, for handing a module to another PowerIO consumer. It is not an exchange format, and no other tool reads it.

BMOPF 0.2.0 output follows draft BMOPF 0.2, subject to Task Force review. Its metadata identifies the immutable schema and producer provenance. Explicit schema-version selection converts the typed value even when its source is BMOPF. Fields outside the 0.1.0 schema move to extras, with relocation diagnostics.

Bus phase_to_ground_voltage_min_v and phase_to_ground_voltage_max_v contain unequal phase limits in volts. Their entries follow bus terminal order, excluding neutral and earth terminals. Uniform limits use voltage_min_v and voltage_max_v. These values survive PowerIO IR serialization and typed access after the module that supplied the network leaves scope.

Calculations

to_mc_ac_pf_instance and to_mc_ac_opf_instance construct multiconductor power flow and optimal power flow instances from a network module. The multiconductor admittance matrix is not bound in this release.

PowerIO.MulticonductorNetworkType
MulticonductorNetwork

A conductor level distribution network. Read the tables through properties: net.buses, net.line_codes, net.lines, net.switches, net.transformers, net.loads, net.generators, net.ibrs, net.control_profiles, net.shunts, net.capacitors, net.voltage_sources, net.untyped_objects, net.commands, net.options. Scalars: net.name, net.base_frequency, net.source_format, net.geo.

source
PowerIO.MulticonductorBusType
MulticonductorBus

One multiconductor bus: its id, terminals, grounded_terminals, and the voltage limits the source states (volts). Phase vectors follow terminal order with neutral and earth terminals excluded. Scalar bounds apply uniformly.

source
PowerIO.MulticonductorLineCodeType
MulticonductorLineCode

Per length impedance of a line: the resistance, reactance, and terminal conductance_from, susceptance_from, conductance_to, susceptance_to matrices (ohm per metre and siemens per metre, conductor_count square), the per conductor limits, and the source the code came from.

source
PowerIO.MulticonductorLineType
MulticonductorLine

One line from bus_from to bus_to with its terminal maps, line_code, length_m, optional route, and per conductor limits.

source
PowerIO.MulticonductorLoadType
MulticonductorLoad

One load: configuration, per terminal nominal powers, the voltage_model name, and the per terminal ZIP and exponential coefficients.

source
PowerIO.MulticonductorGeneratorType
MulticonductorGenerator

One generator with per terminal nominal powers, optional limits, dispatch cost, and apparent power and current limits.

source
PowerIO.InverterBasedResourceType
InverterBasedResource

One inverter based resource: topology, prime_mover, limits, available active power, and the control_profile it follows.

source
PowerIO.ControlProfileType
ControlProfile

One inverter control profile: a fixed power_factor, a volt_var curve, a volt_watt curve, or a combination.

source
PowerIO.VoltageSourceType
VoltageSource

One ideal voltage source with per terminal magnitude (volts), angle (radians), and optional per-phase energy cost rates (dollars/kWh).

source
PowerIO.UntypedObjectType
UntypedObject

One source object retained without a typed PowerIO representation: its class_name, name, and properties as name => value pairs (a positional property has nothing as its name).

source

Source energy prices from draft BMOPF 0.2 are available as net.voltage_sources[i].energy_cost_rate_per_kwh. The optional vector follows phase order in the source terminal map, excluding neutral terminals. Its unit is $/kWh. The prices survive PowerIO IR serialization; using them in an objective remains the responsibility of the selected calculation.