Skip to content

ConvectiveCooling

ConvectiveCooling

ConvectiveCooling(
    altitude: floatArrayLike,
    cable_azimuth: floatArrayLike,
    ambient_temperature: floatArrayLike,
    wind_speed: floatArrayLike,
    outer_diameter: floatArrayLike,
    roughness_ratio: floatArrayLike,
    wind_azimuth: floatArrayLike = None,
    wind_attack_angle: floatArrayLike = None,
    g: float = 9.81,
    **kwargs: Any,
)

Bases: PowerTerm

Convective cooling term.

If more than one input are numpy arrays, they should have the same size.

Parameters:

Name Type Description Default

altitude

float | ndarray

Altitude (m).

required

cable_azimuth

float | ndarray

Azimuth (deg).

required

ambient_temperature

float | ndarray

Ambient temperature (°C).

required

wind_speed

float | ndarray

Wind speed (m·s⁻¹).

required

wind_azimuth

float | ndarray

wind azimuth regarding north (deg).

None

outer_diameter

float | ndarray

External diameter (m).

required

roughness_ratio

float | ndarray

Cable roughness (—).

required

g

float

Gravitational acceleration (m·s⁻²). The default is 9.81.

9.81
Source code in src/thermohl/power/cigre/convective_cooling.py
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def __init__(
    self,
    altitude: floatArrayLike,
    cable_azimuth: floatArrayLike,
    ambient_temperature: floatArrayLike,
    wind_speed: floatArrayLike,
    outer_diameter: floatArrayLike,
    roughness_ratio: floatArrayLike,
    wind_azimuth: floatArrayLike = None,
    wind_attack_angle: floatArrayLike = None,
    g: float = 9.81,
    **kwargs: Any,
):
    r"""Init with args.

    If more than one input are numpy arrays, they should have the same size.

    Args:
        altitude (float | numpy.ndarray): Altitude (m).
        cable_azimuth (float | numpy.ndarray): Azimuth (deg).
        ambient_temperature (float | numpy.ndarray): Ambient temperature (°C).
        wind_speed (float | numpy.ndarray): Wind speed (m·s⁻¹).
        wind_azimuth (float | numpy.ndarray): wind azimuth regarding north (deg).
        outer_diameter (float | numpy.ndarray): External diameter (m).
        roughness_ratio (float | numpy.ndarray): Cable roughness (—).
        g (float, optional): Gravitational acceleration (m·s⁻²). The default is 9.81.

    """
    self.altitude = altitude
    self.ambient_temp = ambient_temperature
    self.wind_speed = wind_speed
    self.outer_diameter = outer_diameter
    self.roughness_ratio = roughness_ratio
    self.gravity = g

    if wind_attack_angle is None and wind_azimuth is None:
        raise ValueError("Must provide either wind_attack_angle or wind_azimuth.")
    if wind_attack_angle is not None and wind_azimuth is not None:
        logger.warning(
            "both wind_attack_angle and wind_azimuth are provided. wind_azimuth will be ignored."
        )
    if wind_attack_angle is not None:
        self.wind_attack_angle = wind_attack_angle
    else:
        self.wind_attack_angle = compute_wind_attack_angle(
            cable_azimuth, wind_azimuth
        )

derivative

derivative(
    conductor_temperature: floatArrayLike,
    temperature_increment: float = _TEMP_INCREMENT,
) -> floatArrayLike

Compute power term derivative regarding temperature in function of temperature.

Usually this function should be overriden in children classes; if it is not the case it will evaluate the derivative from the value method with a second-order approximation.

Parameters:

Name Type Description Default

conductor_temperature

float | ndarray

Conductor temperature (°C).

required

temperature_increment

float

Temperature increment. The default is 1.0E-03.

_TEMP_INCREMENT

Returns:

Type Description
floatArrayLike

float | numpy.ndarray: Power term derivative (W·m⁻¹·K⁻¹).

Source code in src/thermohl/power/power_term.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
def derivative(
    self,
    conductor_temperature: floatArrayLike,
    temperature_increment: float = _TEMP_INCREMENT,
) -> floatArrayLike:
    r"""Compute power term derivative regarding temperature in function of temperature.

    Usually this function should be overriden in children classes; if it is
    not the case it will evaluate the derivative from the value method with
    a second-order approximation.

    Args:
        conductor_temperature (float | numpy.ndarray): Conductor temperature (°C).
        temperature_increment (float, optional): Temperature increment. The default is 1.0E-03.

    Returns:
        float | numpy.ndarray: Power term derivative (W·m⁻¹·K⁻¹).

    """
    return (
        self.value(conductor_temperature + temperature_increment)
        - self.value(conductor_temperature - temperature_increment)
    ) / (2.0 * temperature_increment)

value

value(
    conductor_temperature: floatArrayLike,
) -> floatArrayLike

Compute convective cooling.

Parameters:

Name Type Description Default

conductor_temperature

float | ndarray

Conductor temperature (°C).

required

Returns:

Type Description
floatArrayLike

float | numpy.ndarray: Power term value (W·m⁻¹).

Source code in src/thermohl/power/cigre/convective_cooling.py
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
def value(self, conductor_temperature: floatArrayLike) -> floatArrayLike:
    r"""Compute convective cooling.

    Args:
        conductor_temperature (float | numpy.ndarray): Conductor temperature (°C).

    Returns:
        float | numpy.ndarray: Power term value (W·m⁻¹).

    """
    film_temperature = 0.5 * (conductor_temperature + self.ambient_temp)
    temperature_delta = conductor_temperature - self.ambient_temp
    kinematic_viscosity = Air.kinematic_viscosity(film_temperature)
    # nu[nu < 1.0E-06] = 1.0E-06
    thermal_conductivity = Air.thermal_conductivity(film_temperature)
    # lm[lm < 0.01] = 0.01
    nusselt_forced = self._nu_forced(film_temperature, kinematic_viscosity)
    nusselt_natural = self._nu_natural(
        film_temperature, temperature_delta, kinematic_viscosity
    )
    return (
        np.pi
        * thermal_conductivity
        * (conductor_temperature - self.ambient_temp)
        * np.maximum(nusselt_forced, nusselt_natural)
    )