Single-core cable with a 1000 mm² solid aluminum conductor
This example demonstrates how to build the model of a single-core cable and compute its series impedance and shunt admittance per unit length. The objective is to represent a cable with a solid aluminum conductor of 1000 mm² and an XLPE insulation 8.3 mm thick, buried at 1 m depth in a homogeneous earth of 100 Ω·m, over the frequency range from 0.1 Hz to 10 MHz.
This example covers:
- Defining the materials of the cable.
- Building the cable design with the
@cableand@terminalblocks. - Examining the equivalent coaxial representation of the design.
- Defining the cable system and the line parameters problem.
- Computing the line parameters and extracting R, L and C at the power frequency.
- Examining the frequency dependence of the series resistance.
Load the package:
using LineCableModelsMaterials
A Material is defined by its class (:conductor, :insulator or :semicon), followed by the electrical resistivity, relative permittivity, relative permeability, reference temperature and temperature coefficient of the resistivity. Omitted arguments take their default values.
Aluminum conductor and XLPE insulation:
aluminum = Material(:conductor, 2.8264e-8, 1.0, 1.000022, 20.0, 0.00429) # [Ω·m], [°C], [1/°C]
xlpe = Material(:insulator, 1.97e14, 2.5) # [Ω·m]Material{Float64, :insulator}(1.97e14, 2.5, 1.0, 20.0, 0.0, 0.0, 90.0, 0.0, 0.0)Cable design
The @cable block lists the parts of the cable from the inside out. The @terminal block assigns the conductive regions declared inside it to one terminal, in this case the core. The core builder declares a solid circular conductor by its radius, and the insulation builder declares a layer by its thickness, placed over the outline of the part beneath it.
Radius of a solid core with a cross-section of 1000 mm²:
core_radius = sqrt(1000.0e-6 / π) # [m]0.017841241161527712Build the cable design and inspect its outer radius:
design = @cable "solid_1000mm2" begin
@terminal :core begin
core(aluminum; r = core_radius, tag = :core_metal)
end
insulation(xlpe; t = 8.3e-3, tag = :core_insulation) # insulation_thickness [m]
end
r_ex(design.outer) # [m]0.02614124116152771Equivalent coaxial representation
Coaxial formulations represent each terminal of the cable by an equivalent tubular conductor, with the dielectric layers located between consecutive conductors. The function LineCableModels.flatten returns this representation of the design, which in this case consists of one solid conductor and one insulation layer.
Equivalent conductor, with radii in m and resistivity in Ω·m:
blueprint = LineCableModels.flatten(design)
[(terminal = conductor.terminal, r_in = conductor.r_in, r_ex = conductor.r_ex,
rho = conductor.material.rho) for conductor in blueprint.conductors]1-element Vector{@NamedTuple{terminal::Int64, r_in::Float64, r_ex::Float64, rho::Float64}}:
(terminal = 1, r_in = 0.0, r_ex = 0.017841241161527712, rho = 2.8264e-8)Insulation layer of the core:
[(conductor = layer.conductor, r_in = layer.r_in, r_ex = layer.r_ex,
eps_r = layer.material.eps_r) for layer in blueprint.dielectrics]1-element Vector{@NamedTuple{conductor::Int64, r_in::Float64, r_ex::Float64, eps_r::Float64}}:
(conductor = 1, r_in = 0.017841241161527712, r_ex = 0.02614124116152771, eps_r = 2.5)Cable system and problem definition
A CableSystem places one or more cable designs in the cross-section, with the vertical coordinate y negative below the earth surface. The connections assign a conductor index to each terminal, here index 1 to the core. The LineParametersProblem completes the definition with the earth model, the conductor temperature and the frequencies of interest.
Homogeneous earth model:
earth = homogeneous(rho = 100.0, eps_r = 10.0) # [Ω·m]EarthModel{Float64, 2}((EarthLayer{Float64}(Inf, 1.0, 1.0, Inf), EarthLayer{Float64}(100.0, 10.0, 1.0, Inf)))Cable buried at 1 m depth, in a line 1 km long:
system = build(CableSystem, [design], [Placement(0.0, -1.0)]; # [m]
connections = [(core = 1,)], id = "solid_1000mm2_single", line_length = 1000.0) # [m]CableSystem{Float64, Vector{CableDesign{Float64, Stack{Vector{AbstractCablePart}}, Vector{LineCableModels.DataModel.PlacedRegion}, Circle{Float64}}}, Vector{LineCableModels.DataModel.PlacedRegion}}("solid_1000mm2_single", 1000.0, CableDesign{Float64, Stack{Vector{AbstractCablePart}}, Vector{LineCableModels.DataModel.PlacedRegion}, Circle{Float64}}[CableDesign{Float64, Stack{Vector{AbstractCablePart}}, Vector{LineCableModels.DataModel.PlacedRegion}, Circle{Float64}}("solid_1000mm2", Stack{Vector{AbstractCablePart}}(AbstractCablePart[Terminal{Stack{Vector{AbstractCablePart}}}(:core, Stack{Vector{AbstractCablePart}}(AbstractCablePart[Region{Circle{Float64}, Material{Float64, :conductor}}(:core_metal, Circle{Float64}(0.017841241161527712, Placement{Float64}(0.0, 0.0, 0.0)), Material{Float64, :conductor}(2.8264e-8, 1.0, 1.000022, 20.0, 0.00429, 0.0, 90.0, 0.0, 0.0))])), Region{Offset{Float64}, Material{Float64, :insulator}}(:core_insulation, Offset{Float64}(0.0083), Material{Float64, :insulator}(1.97e14, 2.5, 1.0, 20.0, 0.0, 0.0, 90.0, 0.0, 0.0))]), LineCableModels.DataModel.PlacedRegion[LineCableModels.DataModel.PlacedRegion{Region{Circle{Float64}, Material{Float64, :conductor}}, Circle{Float64}}(Region{Circle{Float64}, Material{Float64, :conductor}}(:core_metal, Circle{Float64}(0.017841241161527712, Placement{Float64}(0.0, 0.0, 0.0)), Material{Float64, :conductor}(2.8264e-8, 1.0, 1.000022, 20.0, 0.00429, 0.0, 90.0, 0.0, 0.0)), Circle{Float64}(0.017841241161527712, Placement{Float64}(0.0, 0.0, 0.0))), LineCableModels.DataModel.PlacedRegion{Region{Offset{Float64}, Material{Float64, :insulator}}, Annulus{Float64}}(Region{Offset{Float64}, Material{Float64, :insulator}}(:core_insulation, Offset{Float64}(0.0083), Material{Float64, :insulator}(1.97e14, 2.5, 1.0, 20.0, 0.0, 0.0, 90.0, 0.0, 0.0)), Annulus{Float64}(0.017841241161527712, 0.02614124116152771, Placement{Float64}(0.0, 0.0, 0.0)))], Circle{Float64}(0.02614124116152771, Placement{Float64}(0.0, 0.0, 0.0)), [(name = :core, scope = @NamedTuple{repeat::Int64, copy::Int64}[], regions = [1])], @NamedTuple{at::Placement{Float64}, regions::Vector{Int64}, members::Vector{Int64}}[(at = Placement{Float64}(0.0, 0.0, 0.0), regions = [1, 2], members = [])], @NamedTuple{placements::Vector{Placement{Float64}}, copies::Vector{UnitRange{Int64}}}[], @NamedTuple{repeat::Int64, radii::Vector{Float64}, pitches::Vector{Float64}, overlengths::Vector{Float64}, axis::Tuple{Float64, Float64}}[], @NamedTuple{repeat::Int64, factor::Float64}[], @NamedTuple{region::Int64, contents::Vector{Int64}}[])], Placement{Float64}[Placement{Float64}(0.0, -1.0, 0.0)], LineCableModels.DataModel.PlacedRegion[LineCableModels.DataModel.PlacedRegion{Region{Circle{Float64}, Material{Float64, :conductor}}, Circle{Float64}}(Region{Circle{Float64}, Material{Float64, :conductor}}(:core_metal, Circle{Float64}(0.017841241161527712, Placement{Float64}(0.0, 0.0, 0.0)), Material{Float64, :conductor}(2.8264e-8, 1.0, 1.000022, 20.0, 0.00429, 0.0, 90.0, 0.0, 0.0)), Circle{Float64}(0.017841241161527712, Placement{Float64}(0.0, -1.0, 0.0))), LineCableModels.DataModel.PlacedRegion{Region{Offset{Float64}, Material{Float64, :insulator}}, Annulus{Float64}}(Region{Offset{Float64}, Material{Float64, :insulator}}(:core_insulation, Offset{Float64}(0.0083), Material{Float64, :insulator}(1.97e14, 2.5, 1.0, 20.0, 0.0, 0.0, 90.0, 0.0, 0.0)), Annulus{Float64}(0.017841241161527712, 0.02614124116152771, Placement{Float64}(0.0, -1.0, 0.0)))], [(cable = 1, terminal = 1, connection = 1, regions = [1])])Frequency range from 0.1 Hz to 10 MHz, logarithmically spaced:
frequencies = 10.0 .^ range(-1, 7; length = 101) # [Hz]101-element Vector{Float64}:
0.1
0.12022644346174127
0.14454397707459277
0.17378008287493754
0.20892961308540392
0.251188643150958
0.3019951720402016
0.36307805477010135
0.436515832240166
0.5248074602497725
⋮
2.2908676527677746e6
2.754228703338169e6
3.3113112148259077e6
3.9810717055349695e6
4.786300923226381e6
5.754399373371567e6
6.918309709189363e6
8.317637711026709e6
1.0e7Line parameters problem at 20 °C:
problem = LineParametersProblem(system, earth; temperature = 20.0, frequencies) # [°C]
length(problem.frequencies)101Line parameters at power frequency
The CoaxialFormulation selects one formula for each physical contribution to the series impedance and shunt admittance, by default the formulas implemented in this release. The compute function returns a LineParameters object containing the matrices Z, in Ω/m, and Y, in S/m, for each frequency, together with the label of each row.
Compute the line parameters and inspect the row labels:
result = compute(problem, CoaxialFormulation())
result.terminals1-element Vector{String}:
"cable:1:core"Frequency closest to 50 Hz, since the samples do not include 50 Hz exactly:
k = argmin(abs.(result.frequencies .- 50.0))
result.frequencies[k] # [Hz]52.48074602497726Series impedance at this frequency:
result.Z[:, :, k] # [Ω/m]1×1 Matrix{ComplexF64}:
8.31276467149311e-5 + 0.0007303423149187669imShunt admittance at this frequency:
result.Y[:, :, k] # [S/m]1×1 Matrix{ComplexF64}:
3.573260123394776e-12 + 1.200555142692445e-7imThe series resistance R and inductance L per unit length are obtained from the real and imaginary parts of Z, respectively, and the capacitance C from the imaginary part of Y, with $\omega = 2 \pi f$. Since Z is the impedance of the loop formed by the core and the earth, R and L include the earth-return contribution. The capacitance C results from the potential coefficients of the insulation and of the surrounding earth.
Per-unit-length R, L and C at the power frequency:
ω = 2π * result.frequencies[k] # [rad/s]
(R = real(result.Z[1, 1, k]), L = imag(result.Z[1, 1, k]) / ω,
C = imag(result.Y[1, 1, k]) / ω) # [Ω/m], [H/m], [F/m](R = 8.31276467149311e-5, L = 2.2148616087351024e-6, C = 3.640845450690812e-10)Frequency dependence of the series resistance
The DC resistance of the core at 20 °C is the ratio of its resistivity to its cross-section. At 0.1 Hz, the loop resistance is close to this value. As the frequency increases, the current in the core concentrates toward its outer surface due to the skin effect, and the return current in the earth concentrates closer to the cable, both increasing the loop resistance.
DC resistance of the core and loop resistance at 0.1 Hz, 50 Hz and 10 MHz:
(R_dc = aluminum.rho / (π * core_radius^2), R_first = real(result.Z[1, 1, 1]),
R_50Hz = real(result.Z[1, 1, k]), R_last = real(result.Z[1, 1, end])) # [Ω/m](R_dc = 2.8264e-5, R_first = 2.836271820720119e-5, R_50Hz = 8.31276467149311e-5, R_last = 14.534711833941154)Size of the impedance array and number of frequencies:
size(result.Z), length(result.frequencies)((1, 1, 101), 101)Conclusion
This example has demonstrated how to:
- Define the materials and the parts of a single-core cable.
- Obtain the equivalent coaxial representation of the cable design.
- Define a cable system and a line parameters problem in homogeneous earth.
- Compute the per-unit-length line parameters and extract R, L and C at the power frequency.
- Observe the increase of the series resistance with frequency.
The example of the 320 kV bipole separates the matrices of the cables from the earth-return contribution, which isolates the internal impedance of the conductors.