Shunt line

The first model of line which can be used is a PI model with series impedance and shunt admittance. The corresponding diagram is:

Equations

The corresponding equations are:

\[\begin{split}\left\{ \begin{aligned} \underline{V_1} &= \underline{a} \cdot \underline{V_2} - \underline{b} \cdot \underline{I_2} + \underline{g} \cdot \underline{V_{\mathrm{g}}} \\ \underline{I_1} &= \underline{c} \cdot \underline{V_2} - \underline{d} \cdot \underline{I_2} + \underline{h} \cdot \underline{V_{\mathrm{g}}} \\ \underline{I_{\mathrm{g}}} &= \underline{f}^\top \cdot \left(\underline{V_1} + \underline{V_2} - 2\cdot \underline{V_{\mathrm{g}}}\right) \end{aligned} \right.\end{split}\]

where

\[\begin{split}\left\{ \begin{aligned} \underline{a} &= \mathcal{I}_4 + \dfrac{1}{2} \cdot \underline{Z} \cdot \underline{Y} \\ \underline{b} &= \underline{Z} \\ \underline{c} &= \underline{Y} + \dfrac{1}{4}\cdot \underline{Y} \cdot \underline{Z} \cdot \underline{Y} \\ \underline{d} &= \mathcal{I}_4 + \dfrac{1}{2} \cdot \underline{Y} \cdot \underline{Z} \\ \underline{f} &= -\dfrac{1}{2} \cdot \begin{pmatrix} \underline{y_{\mathrm{ag}}} & \underline{y_{\mathrm{bg}} } & \underline{y_{\mathrm{cg}}} & \underline{y_{\mathrm{ng}}} \end{pmatrix} ^\top \\ \underline{g} &= \underline{Z} \cdot \underline{f} \\ \underline{h} &= 2 \cdot \underline{f} + \frac{1}{2}\cdot \underline{Y} \cdot \underline{Z} \cdot \underline{f} \\ \end{aligned} \right.\end{split}\]

with \(\underline{Z}\) the series impedance matrix and \(\underline{Y}\) the shunt admittance matrix.

Available Results

In addition to the results available for all lines, as described here, the following results are available for lines with shunt components:

Result Accessor

Default Unit

Type

Description

res_shunt_currents

\(A\)

2 complex arrays

The currents flowing into the shunt admittances of the line

res_shunt_power_losses

\(V\!A\)

2 complex arrays

The power losses in the shunt admittances of the line

The results with two arrays are for the first and second ends of the line, respectively.

Usage

To create a shunt line, create an instance of LineParameter with the y_shunt argument. The ground argument of the Line constructor is mandatory for shunt lines. Here is a line that connects a constant power load to a voltage source.

import functools as ft
import numpy as np
import roseau.load_flow as rlf

# Two buses
bus1 = rlf.Bus(id="bus1", phases="abcn")
bus2 = rlf.Bus(id="bus2", phases="abcn")

# Create a ground element and set its potential to zero
ground = rlf.Ground(id="ground")
pref = rlf.PotentialRef(id="pref", element=ground)

# A shunt line
z_line = rlf.Q_(
    np.array(
        [
            [0.3 + 0.35j, 0.25j, 0.25j, 0.25j],
            [0.25j, 0.3 + 0.35j, 0.25j, 0.25j],
            [0.25j, 0.25j, 0.3 + 0.35j, 0.25j],
            [0.25j, 0.25j, 0.25j, 0.3 + 0.35j],
        ]
    ),
    "ohm/km",
)
y_shunt = rlf.Q_(
    np.array(
        [
            [20 + 475j, -68j, -10j, -68j],
            [-68j, 20 + 475j, -68j, -10j],
            [-10j, -68j, 20 + 475j, -68j],
            [-68j, -10j, -68j, 20 + 475j],
        ]
    ),
    "uS/km",  # micro Siemens per kilometer
)
line_parameters = rlf.LineParameters(id="line_parameters", z_line=z_line, y_shunt=y_shunt)
line = rlf.Line(
    id="line",
    bus1=bus1,
    bus2=bus2,
    parameters=line_parameters,
    length=rlf.Q_(1, "km"),
    ground=ground,
)

# A voltage source on the first bus
un = 400 / rlf.SQRT3
vs = rlf.VoltageSource(id="source", bus=bus1, voltages=rlf.Q_(un, "V"))


# A power load on the second bus
load = rlf.PowerLoad(
    id="load", bus=bus2, powers=rlf.Q_(np.array([5.0, 2.5, 0]) * (1 - 0.3j), "kVA")
)

# The impedance matrix (in Ohm) can be accessed from the line instance
line.z_line
# array(
#     [[0.3+0.35j, 0. +0.25j, 0. +0.25j, 0. +0.25j],
#      [0. +0.25j, 0.3+0.35j, 0. +0.25j, 0. +0.25j],
#      [0. +0.25j, 0. +0.25j, 0.3+0.35j, 0. +0.25j],
#      [0. +0.25j, 0. +0.25j, 0. +0.25j, 0.3+0.35j]]
# ) <Unit('ohm')>

# The shunt admittance matrix (in Siemens) can be accessed from the line instance
line.y_shunt
# array(
#     [[2.e-05+4.75e-04j, 0.e+00-6.80e-05j, 0.e+00-1.00e-05j, 0.e+00-6.80e-05j],
#      [0.e+00-6.80e-05j, 2.e-05+4.75e-04j, 0.e+00-6.80e-05j, 0.e+00-1.00e-05j],
#      [0.e+00-1.00e-05j, 0.e+00-6.80e-05j, 2.e-05+4.75e-04j, 0.e+00-6.80e-05j],
#      [0.e+00-6.80e-05j, 0.e+00-1.00e-05j, 0.e+00-6.80e-05j, 2.e-05+4.75e-04j]]
# ) <Unit('siemens')>

# For a shunt line, the property `with_shunt` is True
line.with_shunt
# True

# Create a network and solve a load flow
en = rlf.ElectricalNetwork.from_element(bus1)
en.solve_load_flow()

# The current "entering" into the line from the bus1
en.res_lines[["current1"]].transform([np.abs, ft.partial(np.angle, deg=True)])
# |               |   ('current1', 'absolute') |   ('current1', 'angle') |
# |:--------------|---------------------------:|------------------------:|
# | ('line', 'a') |                  23.9459   |                 15.6886 |
# | ('line', 'b') |                  11.2926   |               -104.492  |
# | ('line', 'c') |                   0.119763 |               -157.68   |
# | ('line', 'n') |                  20.6151   |                167.381  |

# The current "entering" into the line from the bus2
en.res_lines[["current2"]].transform([np.abs, ft.partial(np.angle, deg=True)])
# |               |   ('current2', 'absolute') |   ('current2', 'angle') |
# |:--------------|---------------------------:|------------------------:|
# | ('line', 'a') |               23.9202      |               -164.585  |
# | ('line', 'b') |               11.2551      |                 74.9044 |
# | ('line', 'c') |                5.68434e-14 |                  0      |
# | ('line', 'n') |               20.6273      |                -12.625  |

# The currents in the series components of the line
en.res_lines[["series_current"]].transform([np.abs, ft.partial(np.angle, deg=True)])
# |               |   ('series_current', 'absolute') |   ('series_current', 'angle') |
# |:--------------|---------------------------------:|------------------------------:|
# | ('line', 'a') |                       23.9333    |                       15.5496 |
# | ('line', 'b') |                       11.2737    |                     -104.796  |
# | ('line', 'c') |                        0.0598601 |                     -157.579  |
# | ('line', 'n') |                       20.6215    |                      167.376  |

# The losses of the series components of line can also be accessed
en.res_lines[["series_losses"]].transform([np.real, np.imag])
# |               |   ('series_losses', 'real') |   ('series_losses', 'imag') |
# |:--------------|----------------------------:|----------------------------:|
# | ('line', 'a') |                171.841      |                57.2802      |
# | ('line', 'b') |                 38.1291     |                12.7097      |
# | ('line', 'c') |                  0.00107497 |                 0.000358324 |
# | ('line', 'n') |                127.574      |                42.5246      |

# The shunt losses can be computed. Notice that the shunt losses are not null for the shunt line.
res_lines = en.res_lines
total_losses = res_lines["power1"] + res_lines["power2"]  # total = series + shunt
shunt_losses = total_losses - res_lines["series_losses"]
shunt_losses.to_frame("shunt_losses").transform([np.real, np.imag])
# |               |   ('shunt_losses', 'real') |   ('shunt_losses', 'imag') |
# |:--------------|---------------------------:|---------------------------:|
# | ('line', 'a') |                 -1.59017   |                -26.6385    |
# | ('line', 'b') |                  1.01834   |                -28.5657    |
# | ('line', 'c') |                  3.69511   |                -27.4104    |
# | ('line', 'n') |                  0.0351686 |                  0.0139828 |