Cable Crossings

When two cable circuits cross at different depths and at an angle, the heat from one cable raises the temperature of the other at the crossing point. The CableCrossing class computes this mutual temperature rise using the analytical line-source integration method from CIGRE Technical Brochure 640.

Defining a crossing

from thermal_cable_model import Cable, CableCrossing
from thermal_cable_model.materials import SOIL_STANDARD

mv_cable = Cable.single_core_xlpe_cu(240, voltage_class="MV", voltage_kv=20.0)
lv_cable = Cable.three_core_xlpe_cu(150, voltage_class="LV", voltage_kv=0.6)

crossing = CableCrossing(
    cable_upper=mv_cable,
    cable_lower=lv_cable,
    depth_upper=0.9,          # m
    depth_lower=1.2,          # m
    crossing_angle_deg=60.0,  # degrees
    soil=SOIL_STANDARD,
)

Note

The crossing angle is measured between the cable axes projected onto the horizontal plane. 90° is a perpendicular crossing; 0° (parallel) is rejected — use the parallel cable model instead.

Steady-state temperature rise

Compute the temperature rise at each cable due to the heat emission of the other:

W_mv = mv_cable.total_heat_per_length(350.0, 70.0)  # W/m
W_lv = lv_cable.total_heat_per_length(280.0, 55.0)

dT_at_mv = crossing.temperature_rise_at_upper(W_lv)
dT_at_lv = crossing.temperature_rise_at_lower(W_mv)
print(f"ΔT at MV cable: {dT_at_mv:.2f} °C")
print(f"ΔT at LV cable: {dT_at_lv:.2f} °C")

The underlying integral is:

\[\Delta T = \frac{W}{4\pi\lambda} \int_{-L}^{L} \left[ \frac{1}{\sqrt{s^2 \sin^2\!\alpha + \Delta h^2}} - \frac{1}{\sqrt{s^2 \sin^2\!\alpha + (h_1 + h_2)^2}} \right] ds\]

The second term is the image correction for the isothermal ground surface.

Transient temperature rise

For time-dependent analysis, the transient Green’s function uses the exponential integral E1:

for hours in [1, 4, 12, 24, 48]:
    dT = crossing.transient_temperature_rise_at_upper(
        W_lv, time_s=hours * 3600
    )
    print(f"t = {hours:3d} h → ΔT = {dT:.2f} °C")

Derating factor

The crossing_derating_factor() computes how much the cable’s permissible current must be reduced due to the crossing:

from thermal_cable_model.crossing import crossing_derating_factor

df = crossing_derating_factor(mv_cable, depth=0.9, delta_T_crossing=dT_at_mv,
                              soil=SOIL_STANDARD)
print(f"Derating factor: {df:.3f}")
print(f"Derated current: {350 * df:.0f} A")

The factor is computed as:

\[f = \sqrt{\frac{\Delta T_\text{max} - \Delta T_\text{crossing}}{\Delta T_\text{max}}}\]

where \(\Delta T_\text{max} = T_\text{max,conductor} - 20\,°\text{C}\).

Integration with ThermalSimulation

Cable crossings can be registered on a CableInstallation and are automatically applied during both steady-state and transient simulations:

from thermal_cable_model import CableInstallation, ThermalSimulation

inst = CableInstallation(soil=SOIL_STANDARD)
inst.add_cable(mv_cable, x=0.0, depth=0.9, load=load_mv)
inst.add_cable(lv_cable, x=0.0, depth=1.2, load=load_lv)
inst.add_crossing(crossing)

sim = ThermalSimulation(inst)
result = sim.run_transient(dt=300, duration=24 * 3600)