linerate 2.1.3__py3-none-any.whl → 2.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- linerate/equations/ieee738/convective_cooling.py +1 -1
- linerate/equations/solar_angles.py +12 -6
- linerate/models/cigre207.py +1 -1
- linerate/models/cigre601.py +50 -35
- linerate/models/ieee738.py +2 -4
- linerate/models/thermal_model.py +7 -2
- linerate/solver.py +18 -15
- linerate/types.py +9 -12
- linerate/units.py +1 -1
- {linerate-2.1.3.dist-info → linerate-2.2.1.dist-info}/METADATA +1 -1
- {linerate-2.1.3.dist-info → linerate-2.2.1.dist-info}/RECORD +14 -14
- {linerate-2.1.3.dist-info → linerate-2.2.1.dist-info}/WHEEL +1 -1
- {linerate-2.1.3.dist-info → linerate-2.2.1.dist-info}/licenses/LICENSE +0 -0
- {linerate-2.1.3.dist-info → linerate-2.2.1.dist-info}/top_level.txt +0 -0
|
@@ -190,7 +190,7 @@ def compute_forced_convection( # q_c1 or q_c2
|
|
|
190
190
|
q_c1 = K_angle * (1.01 + 1.35 * N_Re**0.52) * k_f * (T_s - T_a)
|
|
191
191
|
q_c2 = K_angle * 0.754 * N_Re**0.6 * k_f * (T_s - T_a)
|
|
192
192
|
|
|
193
|
-
if
|
|
193
|
+
if isinstance(q_c1, np.ndarray) and isinstance(q_c2, np.ndarray):
|
|
194
194
|
q_cf = []
|
|
195
195
|
for i in range(len(q_c1)):
|
|
196
196
|
if q_c1[i] > q_c2[i]:
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
from numba import vectorize
|
|
3
|
+
|
|
3
4
|
from linerate.equations import math
|
|
4
5
|
|
|
5
|
-
from ..units import Date, Degrees, Radian, Unitless
|
|
6
6
|
from ..types import Span
|
|
7
|
+
from ..units import Date, Degrees, Radian, Unitless
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def _get_day_of_year(when: Date) -> Unitless:
|
|
10
11
|
YearResolutionType = np.datetime64(1, "Y")
|
|
11
12
|
DayResolutionType = np.datetime64(1, "D")
|
|
12
13
|
|
|
13
|
-
return (when.astype(DayResolutionType) - when.astype(YearResolutionType)).astype(float) + 1
|
|
14
|
+
return (when.astype(DayResolutionType) - when.astype(YearResolutionType)).astype(float) + 1.0
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def _get_hour_of_day(when: Date) -> Unitless:
|
|
@@ -55,9 +56,11 @@ def compute_hour_angle_relative_to_noon(when: Date, longitude: Degrees) -> Radia
|
|
|
55
56
|
utc_minute = _get_minute_of_hour(when)
|
|
56
57
|
pi = np.pi
|
|
57
58
|
# We add longitude/15 since 15 degrees of longitude increases solar hour by 1
|
|
58
|
-
|
|
59
|
+
hour_angle = np.mod((-12 + utc_hour + utc_minute / 60 + longitude / 15), 24) * (
|
|
59
60
|
pi / 12
|
|
60
61
|
) # pi/12 is 15 degrees
|
|
62
|
+
# Shift to [-pi, pi] range to ensure negative values before noon
|
|
63
|
+
return np.where(hour_angle >= pi, hour_angle - 2 * pi, hour_angle)
|
|
61
64
|
|
|
62
65
|
|
|
63
66
|
def compute_solar_declination(
|
|
@@ -123,13 +126,16 @@ def _compute_solar_azimuth_constant(
|
|
|
123
126
|
if -pi <= omega < 0:
|
|
124
127
|
if chi >= 0:
|
|
125
128
|
C = 0
|
|
126
|
-
|
|
129
|
+
else:
|
|
127
130
|
C = pi
|
|
128
131
|
elif 0 <= omega < pi:
|
|
129
132
|
if chi >= 0:
|
|
130
133
|
C = pi
|
|
131
|
-
|
|
134
|
+
else:
|
|
132
135
|
C = 2 * pi
|
|
136
|
+
else:
|
|
137
|
+
raise ValueError(f"Hour angle {omega} out of range [-π, π)")
|
|
138
|
+
|
|
133
139
|
return C
|
|
134
140
|
|
|
135
141
|
|
|
@@ -138,7 +144,7 @@ def compute_solar_azimuth_constant(
|
|
|
138
144
|
) -> Radian:
|
|
139
145
|
r"""Compute the solar azimuth constant.
|
|
140
146
|
|
|
141
|
-
Table 2 on page 18 of:cite:p:`ieee738`.
|
|
147
|
+
Table 2 on page 18 of :cite:p:`ieee738`.
|
|
142
148
|
|
|
143
149
|
Parameters
|
|
144
150
|
----------
|
linerate/models/cigre207.py
CHANGED
linerate/models/cigre601.py
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from numbers import Real
|
|
2
|
-
|
|
3
1
|
import numpy as np
|
|
4
2
|
|
|
5
3
|
from linerate.equations import (
|
|
@@ -11,24 +9,25 @@ from linerate.equations import (
|
|
|
11
9
|
solar_heating,
|
|
12
10
|
)
|
|
13
11
|
from linerate.models.thermal_model import ThermalModel, _copy_method_docstring
|
|
14
|
-
from linerate.types import Span, Weather, WeatherWithSolarRadiation
|
|
12
|
+
from linerate.types import BaseWeather, Span, Weather, WeatherWithSolarRadiation
|
|
15
13
|
from linerate.units import (
|
|
16
14
|
Ampere,
|
|
17
15
|
Celsius,
|
|
18
16
|
Date,
|
|
19
17
|
JoulePerKilogramPerKelvin,
|
|
20
18
|
OhmPerMeter,
|
|
19
|
+
Unitless,
|
|
21
20
|
WattPerMeter,
|
|
22
21
|
)
|
|
23
22
|
|
|
24
23
|
|
|
25
|
-
class
|
|
24
|
+
class BaseCigre601(ThermalModel):
|
|
26
25
|
def __init__(
|
|
27
26
|
self,
|
|
28
27
|
span: Span,
|
|
29
|
-
weather:
|
|
28
|
+
weather: BaseWeather,
|
|
30
29
|
time: Date,
|
|
31
|
-
max_reynolds_number:
|
|
30
|
+
max_reynolds_number: Unitless = 4000.0, # Max value of the angle correction in CIGRE601
|
|
32
31
|
):
|
|
33
32
|
super().__init__(span, weather)
|
|
34
33
|
self.time = time
|
|
@@ -48,33 +47,6 @@ class Cigre601(ThermalModel):
|
|
|
48
47
|
conductor_temperature=conductor_temperature, current=current
|
|
49
48
|
)
|
|
50
49
|
|
|
51
|
-
@_copy_method_docstring(ThermalModel)
|
|
52
|
-
def compute_solar_heating(
|
|
53
|
-
self, conductor_temperature: Celsius, current: Ampere
|
|
54
|
-
) -> WattPerMeter:
|
|
55
|
-
alpha_s = self.span.conductor.solar_absorptivity
|
|
56
|
-
F = self.weather.ground_albedo
|
|
57
|
-
y = self.span.conductor_altitude
|
|
58
|
-
N_s = self.weather.clearness_ratio
|
|
59
|
-
D = self.span.conductor.conductor_diameter
|
|
60
|
-
|
|
61
|
-
sin_H_s = solar_angles.compute_sin_solar_altitude_for_span(self.span, self.time)
|
|
62
|
-
|
|
63
|
-
sin_eta = solar_angles.compute_sin_solar_effective_incidence_angle_for_span(
|
|
64
|
-
self.span, self.time, sin_H_s
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
I_B = cigre601.solar_heating.compute_direct_solar_radiation(sin_H_s, N_s, y)
|
|
68
|
-
I_d = cigre601.solar_heating.compute_diffuse_sky_radiation(I_B, sin_H_s)
|
|
69
|
-
I_T = cigre601.solar_heating.compute_global_radiation_intensity(
|
|
70
|
-
I_B, I_d, F, sin_eta, sin_H_s
|
|
71
|
-
)
|
|
72
|
-
return solar_heating.compute_solar_heating(
|
|
73
|
-
alpha_s,
|
|
74
|
-
I_T,
|
|
75
|
-
D,
|
|
76
|
-
)
|
|
77
|
-
|
|
78
50
|
@_copy_method_docstring(ThermalModel)
|
|
79
51
|
def compute_convective_cooling(
|
|
80
52
|
self, conductor_temperature: Celsius, current: Ampere
|
|
@@ -169,12 +141,55 @@ class Cigre601(ThermalModel):
|
|
|
169
141
|
)
|
|
170
142
|
|
|
171
143
|
|
|
172
|
-
class
|
|
144
|
+
class Cigre601(BaseCigre601):
|
|
145
|
+
def __init__(
|
|
146
|
+
self,
|
|
147
|
+
span: Span,
|
|
148
|
+
weather: Weather,
|
|
149
|
+
time: Date,
|
|
150
|
+
max_reynolds_number: Unitless = 4000.0, # Max value of the angle correction in CIGRE601
|
|
151
|
+
):
|
|
152
|
+
self.span = span
|
|
153
|
+
self.weather = weather
|
|
154
|
+
self.time = time
|
|
155
|
+
self.max_reynolds_number = max_reynolds_number
|
|
156
|
+
|
|
157
|
+
@_copy_method_docstring(ThermalModel)
|
|
158
|
+
def compute_solar_heating(
|
|
159
|
+
self, conductor_temperature: Celsius, current: Ampere
|
|
160
|
+
) -> WattPerMeter:
|
|
161
|
+
alpha_s = self.span.conductor.solar_absorptivity
|
|
162
|
+
F = self.weather.ground_albedo
|
|
163
|
+
y = self.span.conductor_altitude
|
|
164
|
+
N_s = self.weather.clearness_ratio
|
|
165
|
+
D = self.span.conductor.conductor_diameter
|
|
166
|
+
|
|
167
|
+
sin_H_s = solar_angles.compute_sin_solar_altitude_for_span(self.span, self.time)
|
|
168
|
+
|
|
169
|
+
sin_eta = solar_angles.compute_sin_solar_effective_incidence_angle_for_span(
|
|
170
|
+
self.span, self.time, sin_H_s
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
I_B = cigre601.solar_heating.compute_direct_solar_radiation(sin_H_s, N_s, y)
|
|
174
|
+
I_d = cigre601.solar_heating.compute_diffuse_sky_radiation(I_B, sin_H_s)
|
|
175
|
+
I_T = cigre601.solar_heating.compute_global_radiation_intensity(
|
|
176
|
+
I_B, I_d, F, sin_eta, sin_H_s
|
|
177
|
+
)
|
|
178
|
+
return solar_heating.compute_solar_heating(
|
|
179
|
+
alpha_s,
|
|
180
|
+
I_T,
|
|
181
|
+
D,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class Cigre601WithSolarRadiation(BaseCigre601):
|
|
173
186
|
"""Extension of the Cigre601 model that accepts external solar radiation data for direct and diffuse solar
|
|
174
187
|
radiation."""
|
|
175
188
|
|
|
176
189
|
def __init__(self, span: Span, weather: WeatherWithSolarRadiation, time: Date):
|
|
177
|
-
|
|
190
|
+
self.span = span
|
|
191
|
+
self.weather = weather
|
|
192
|
+
self.time = time
|
|
178
193
|
self.weather = weather
|
|
179
194
|
|
|
180
195
|
def compute_solar_heating(
|
linerate/models/ieee738.py
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
from numbers import Real
|
|
2
|
-
|
|
3
1
|
import numpy as np
|
|
4
2
|
|
|
5
3
|
from linerate.equations import dimensionless, ieee738, math, solar_angles
|
|
6
4
|
from linerate.models.thermal_model import ThermalModel, _copy_method_docstring
|
|
7
5
|
from linerate.types import Span, Weather
|
|
8
|
-
from linerate.units import Ampere, Celsius, Date, OhmPerMeter, WattPerMeter
|
|
6
|
+
from linerate.units import Ampere, Celsius, Date, OhmPerMeter, Unitless, WattPerMeter
|
|
9
7
|
|
|
10
8
|
|
|
11
9
|
class IEEE738(ThermalModel):
|
|
@@ -14,7 +12,7 @@ class IEEE738(ThermalModel):
|
|
|
14
12
|
span: Span,
|
|
15
13
|
weather: Weather,
|
|
16
14
|
time: Date,
|
|
17
|
-
max_reynolds_number:
|
|
15
|
+
max_reynolds_number: Unitless = 50_000.0, # Max Reynolds number for forced convection
|
|
18
16
|
):
|
|
19
17
|
super().__init__(span, weather)
|
|
20
18
|
self.time = time
|
linerate/models/thermal_model.py
CHANGED
|
@@ -3,7 +3,7 @@ from typing import Dict
|
|
|
3
3
|
|
|
4
4
|
from linerate import solver
|
|
5
5
|
from linerate.equations import joule_heating, radiative_cooling
|
|
6
|
-
from linerate.types import
|
|
6
|
+
from linerate.types import BaseWeather, Span
|
|
7
7
|
from linerate.units import Ampere, Celsius, OhmPerMeter, WattPerMeter
|
|
8
8
|
|
|
9
9
|
|
|
@@ -19,7 +19,7 @@ class ThermalModel(ABC):
|
|
|
19
19
|
"""Abstract class for a minimal conductor thermal model."""
|
|
20
20
|
|
|
21
21
|
@abstractmethod
|
|
22
|
-
def __init__(self, span: Span, weather:
|
|
22
|
+
def __init__(self, span: Span, weather: BaseWeather):
|
|
23
23
|
self.span = span
|
|
24
24
|
self.weather = weather
|
|
25
25
|
|
|
@@ -198,6 +198,7 @@ class ThermalModel(ABC):
|
|
|
198
198
|
min_ampacity: Ampere = 0,
|
|
199
199
|
max_ampacity: Ampere = 5000,
|
|
200
200
|
tolerance: float = 1.0,
|
|
201
|
+
accept_invalid_values: bool = False,
|
|
201
202
|
) -> Ampere:
|
|
202
203
|
r"""Use the bisection method to compute the steady-state thermal rating (ampacity).
|
|
203
204
|
|
|
@@ -216,6 +217,9 @@ class ThermalModel(ABC):
|
|
|
216
217
|
bisection iterations will stop once the numerical ampacity uncertainty is below
|
|
217
218
|
:math:`\Delta I`. The bisection method will run for
|
|
218
219
|
:math:`\left\lceil\frac{I_\text{min} - I_\text{min}}{\Delta I}\right\rceil` iterations.
|
|
220
|
+
accept_invalid_values:
|
|
221
|
+
If True, np.nan is returned whenever the current cannot be found within the provided
|
|
222
|
+
search interval. If False, a ValueError will be raised instead.
|
|
219
223
|
|
|
220
224
|
Returns
|
|
221
225
|
-------
|
|
@@ -228,6 +232,7 @@ class ThermalModel(ABC):
|
|
|
228
232
|
min_ampacity=min_ampacity,
|
|
229
233
|
max_ampacity=max_ampacity,
|
|
230
234
|
tolerance=tolerance,
|
|
235
|
+
accept_invalid_values=accept_invalid_values,
|
|
231
236
|
)
|
|
232
237
|
n = self.span.num_conductors
|
|
233
238
|
return I * n
|
linerate/solver.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from functools import partial
|
|
2
|
-
from typing import Callable
|
|
2
|
+
from typing import Callable
|
|
3
3
|
|
|
4
4
|
import numpy as np
|
|
5
5
|
|
|
@@ -13,7 +13,7 @@ def bisect(
|
|
|
13
13
|
xmin: FloatOrFloatArray,
|
|
14
14
|
xmax: FloatOrFloatArray,
|
|
15
15
|
tolerance: float,
|
|
16
|
-
|
|
16
|
+
accept_invalid_values: bool = False,
|
|
17
17
|
) -> FloatOrFloatArray:
|
|
18
18
|
r"""Compute the roots of a function using a vectorized bisection method.
|
|
19
19
|
|
|
@@ -32,10 +32,10 @@ def bisect(
|
|
|
32
32
|
bounded within an interval of size :math:`\Delta x` or less. The bisection method will
|
|
33
33
|
run for :math:`\left\lceil\frac{x_\max - x_\min}{\Delta x}\right\rceil`
|
|
34
34
|
iterations.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
:math:`\text{sign}(f(\mathbf{x}_\min)) = \text{sign}(f(\mathbf{x}_\max))
|
|
38
|
-
|
|
35
|
+
accept_invalid_values:
|
|
36
|
+
If True, np.nan is returned whenever
|
|
37
|
+
:math:`\text{sign}(f(\mathbf{x}_\min)) = \text{sign}(f(\mathbf{x}_\max))`
|
|
38
|
+
If False, a ValueError will be raised.
|
|
39
39
|
|
|
40
40
|
Returns
|
|
41
41
|
-------
|
|
@@ -44,7 +44,7 @@ def bisect(
|
|
|
44
44
|
there is a root :math:`x_i \in [\tilde{x}_i - 0.5 \Delta x, \tilde{x}_i + 0.5 \Delta x]`
|
|
45
45
|
so :math:`f_i(x_i) = 0`.
|
|
46
46
|
"""
|
|
47
|
-
_invalid_value = np.nan
|
|
47
|
+
_invalid_value = np.nan
|
|
48
48
|
|
|
49
49
|
if not np.all(np.isfinite(xmin)) or not np.all(np.isfinite(xmax)):
|
|
50
50
|
raise ValueError("xmin and xmax must be finite.")
|
|
@@ -54,7 +54,7 @@ def bisect(
|
|
|
54
54
|
f_right = f(xmax)
|
|
55
55
|
|
|
56
56
|
invalid_mask = np.sign(f_left) == np.sign(f_right)
|
|
57
|
-
if np.any(invalid_mask) and
|
|
57
|
+
if np.any(invalid_mask) and not accept_invalid_values:
|
|
58
58
|
raise ValueError(
|
|
59
59
|
"f(xmin) and f(xmax) have the same sign. Consider increasing the search interval."
|
|
60
60
|
)
|
|
@@ -114,7 +114,9 @@ def compute_conductor_temperature(
|
|
|
114
114
|
Union[float, float64, ndarray[Any, dtype[float64]]]
|
|
115
115
|
:math:`I~\left[\text{A}\right]`. The thermal rating.
|
|
116
116
|
"""
|
|
117
|
-
|
|
117
|
+
|
|
118
|
+
def f(conductor_temperature: Celsius) -> WattPerMeter:
|
|
119
|
+
return heat_balance(conductor_temperature, current)
|
|
118
120
|
|
|
119
121
|
return bisect(f, min_temperature, max_temperature, tolerance)
|
|
120
122
|
|
|
@@ -125,7 +127,7 @@ def compute_conductor_ampacity(
|
|
|
125
127
|
min_ampacity: Ampere = 0,
|
|
126
128
|
max_ampacity: Ampere = 5_000,
|
|
127
129
|
tolerance: float = 1, # Ampere
|
|
128
|
-
|
|
130
|
+
accept_invalid_values: bool = False,
|
|
129
131
|
) -> Ampere:
|
|
130
132
|
r"""Use the bisection method to compute the steady-state thermal rating (ampacity).
|
|
131
133
|
|
|
@@ -148,10 +150,9 @@ def compute_conductor_ampacity(
|
|
|
148
150
|
bisection iterations will stop once the numerical ampacity uncertainty is below
|
|
149
151
|
:math:`\Delta I`. The bisection method will run for
|
|
150
152
|
:math:`\left\lceil\frac{I_\text{max} - I_\text{min}}{\Delta I}\right\rceil` iterations.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
ampacities.
|
|
153
|
+
accept_invalid_values:
|
|
154
|
+
If True, np.nan is returned whenever the current cannot be found within the provided
|
|
155
|
+
search interval. If False, a ValueError will be raised instead.
|
|
155
156
|
|
|
156
157
|
Returns
|
|
157
158
|
-------
|
|
@@ -160,4 +161,6 @@ def compute_conductor_ampacity(
|
|
|
160
161
|
"""
|
|
161
162
|
f = partial(heat_balance, max_conductor_temperature)
|
|
162
163
|
|
|
163
|
-
return bisect(
|
|
164
|
+
return bisect(
|
|
165
|
+
f, min_ampacity, max_ampacity, tolerance, accept_invalid_values=accept_invalid_values
|
|
166
|
+
)
|
linerate/types.py
CHANGED
|
@@ -163,8 +163,8 @@ class Span:
|
|
|
163
163
|
return 0.5 * (self.start_tower.altitude + self.end_tower.altitude)
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
@dataclass
|
|
167
|
-
class
|
|
166
|
+
@dataclass
|
|
167
|
+
class BaseWeather:
|
|
168
168
|
#: :math:`T_a~\left[^\circ C\right]`. The ambient air temperature.
|
|
169
169
|
air_temperature: Celsius
|
|
170
170
|
#: :math:`\delta~\left[\text{radian}\right]`. Wind direction east of north.
|
|
@@ -173,24 +173,21 @@ class Weather:
|
|
|
173
173
|
wind_speed: MeterPerSecond
|
|
174
174
|
#: :math:`F`. The ground albedo.
|
|
175
175
|
ground_albedo: Unitless
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@dataclass
|
|
179
|
+
class Weather(BaseWeather):
|
|
176
180
|
#: :math:`N_s`. The clearness ratio (or clearness number in
|
|
177
181
|
#: :cite:p:`sharma1965interrelationships,cigre207`).
|
|
178
182
|
clearness_ratio: Unitless = 1
|
|
179
183
|
|
|
180
184
|
|
|
181
185
|
@dataclass
|
|
182
|
-
class WeatherWithSolarRadiation(
|
|
186
|
+
class WeatherWithSolarRadiation(BaseWeather):
|
|
183
187
|
"""Extension of the Weather class to accept solar radiation timeseries."""
|
|
184
188
|
|
|
185
189
|
#: :math:`I_d~\left[\text{W}~\text{m}^{-2}\right]`. The diffuse radiation intensity.
|
|
186
|
-
diffuse_radiation_intensity: WattPerSquareMeter
|
|
190
|
+
diffuse_radiation_intensity: WattPerSquareMeter
|
|
187
191
|
#: :math:`I_B~\left[\text{W}~\text{m}^{-2}\right]`. The direct radiation intensity on a surface normal to the
|
|
188
192
|
# sun's beam.
|
|
189
|
-
direct_radiation_intensity: WattPerSquareMeter
|
|
190
|
-
|
|
191
|
-
def __post_init__(self):
|
|
192
|
-
if (self.diffuse_radiation_intensity is None) or (self.direct_radiation_intensity is None):
|
|
193
|
-
raise ValueError(
|
|
194
|
-
"Both 'diffuse_radiation_intensity' and 'direct_radiation_intensity' must be provided. For weather"
|
|
195
|
-
" data without solar radiation, use the 'Weather' class instead.",
|
|
196
|
-
)
|
|
193
|
+
direct_radiation_intensity: WattPerSquareMeter
|
linerate/units.py
CHANGED
|
@@ -8,7 +8,7 @@ except ImportError: # Python version <3.9
|
|
|
8
8
|
import numpy as np
|
|
9
9
|
import numpy.typing as npt
|
|
10
10
|
|
|
11
|
-
FloatOrFloatArray = Union[float, np.
|
|
11
|
+
FloatOrFloatArray = Union[float, np.floating, npt.NDArray[np.floating]]
|
|
12
12
|
BoolOrBoolArray = Union[bool, np.bool_, npt.NDArray[np.bool_]]
|
|
13
13
|
|
|
14
14
|
OhmPerMeter = Annotated[FloatOrFloatArray, "Ω/m"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: linerate
|
|
3
|
-
Version: 2.1
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: Library for computing line ampacity ratings for overhead lines
|
|
5
5
|
Author-email: Statnett Datascience <Datascience.Drift@Statnett.no>, Yngve Mardal Moe <yngve.m.moe@gmail.com>
|
|
6
6
|
Requires-Python: >=3.9
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
linerate/__init__.py,sha256=456XlD7NFaT6nTM5k8qYpaf2Bg2ITYhh5wzL0CQRiDc,221
|
|
2
2
|
linerate/model.py,sha256=SUj4NunXdCctezpGeS62OQNmFGf5IKO2plYQlsGJLow,651
|
|
3
3
|
linerate/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
linerate/solver.py,sha256=
|
|
5
|
-
linerate/types.py,sha256=
|
|
6
|
-
linerate/units.py,sha256=
|
|
4
|
+
linerate/solver.py,sha256=cXL7t_Q0otnCJnCScVuo7yWRVHrO4WGlw2DWBYivQA8,6724
|
|
5
|
+
linerate/types.py,sha256=ygFECWP_DX1fWujvIrYPXDf4VcoSCf5T6srEybRomx8,7255
|
|
6
|
+
linerate/units.py,sha256=MyJkBiHDfsJXHga_uW7yAGYVPCWtyfFtPiQxwkXIwl4,1478
|
|
7
7
|
linerate/equations/__init__.py,sha256=cNvISWCp5TbXv4gZ8SWPf0pICRpwDzLSaOxYy5lftsU,464
|
|
8
8
|
linerate/equations/convective_cooling.py,sha256=K6-PxzUHBPOfGloE_uwao5dV0JuHFUmu3Pp_31qUi1g,1387
|
|
9
9
|
linerate/equations/dimensionless.py,sha256=omvurTJUfCMLwqQNvi4Yz_sVeUXcENqaY6K_3GIuO0Y,5625
|
|
@@ -11,7 +11,7 @@ linerate/equations/joule_heating.py,sha256=pHAKZKNXLAaW3Hg-IAO1lFvPaWWKI4H25qxP3
|
|
|
11
11
|
linerate/equations/math.py,sha256=PQ7blJJpkaQ7uJ-zTTw45G_PYc2Io6iTJtsjHYK0gSE,331
|
|
12
12
|
linerate/equations/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
linerate/equations/radiative_cooling.py,sha256=mNAkrVhsZKIB4kJUsH4-n7-FZSq4s-K_LyEwx6jHZFY,1351
|
|
14
|
-
linerate/equations/solar_angles.py,sha256=
|
|
14
|
+
linerate/equations/solar_angles.py,sha256=1k0dwsbOSBfXmA1dgSLUhvHnyAUa37WUyn_tEOh4sRs,10172
|
|
15
15
|
linerate/equations/solar_heating.py,sha256=6--ZotcQIvmFUE33BMtO9Rt3_naQJ0UJjHff9Hy1lpk,1174
|
|
16
16
|
linerate/equations/cigre207/__init__.py,sha256=96zEpd46HDjeIYayVIOWZ3hQHoXKmTcmGIDVDkFXN50,148
|
|
17
17
|
linerate/equations/cigre207/ac_resistance.py,sha256=0qQum8LUHzXBLCj11gGbmtILZaN4nbeW1YooKerdd0M,681
|
|
@@ -22,16 +22,16 @@ linerate/equations/cigre601/convective_cooling.py,sha256=pFPq7o-eZAuTzevN7qF2272
|
|
|
22
22
|
linerate/equations/cigre601/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
23
|
linerate/equations/cigre601/solar_heating.py,sha256=f5T8OGEA7gH6T6RzwjJt7CtI2W6htR0CVgB2WOzvlKE,6565
|
|
24
24
|
linerate/equations/ieee738/__init__.py,sha256=AoP-CEfuIproSppA8h1VvzRQ5ZMhoYrIjb6OZ-wkt9Y,147
|
|
25
|
-
linerate/equations/ieee738/convective_cooling.py,sha256=
|
|
25
|
+
linerate/equations/ieee738/convective_cooling.py,sha256=fKUZVxFHMYSqx2Dmi6bJ1S2nzSMW6SDvf4BohNsfZe8,10069
|
|
26
26
|
linerate/equations/ieee738/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
linerate/equations/ieee738/solar_heating.py,sha256=l3uOUCexDShTW3jOfUw6EOHUY2azWxZuetMdn_8NrmM,4559
|
|
28
28
|
linerate/models/Cigre207.md,sha256=FCKspzRL5zX9kH3gj1D78F6eUHJeET9yuvrhGs-PQBg,1685
|
|
29
|
-
linerate/models/cigre207.py,sha256=
|
|
30
|
-
linerate/models/cigre601.py,sha256=
|
|
31
|
-
linerate/models/ieee738.py,sha256=
|
|
32
|
-
linerate/models/thermal_model.py,sha256=
|
|
33
|
-
linerate-2.1.
|
|
34
|
-
linerate-2.1.
|
|
35
|
-
linerate-2.1.
|
|
36
|
-
linerate-2.1.
|
|
37
|
-
linerate-2.1.
|
|
29
|
+
linerate/models/cigre207.py,sha256=vnVtF4Uaxwf9s6sSFeCFb70md-utrXFQTLhWRLoFIUI,5480
|
|
30
|
+
linerate/models/cigre601.py,sha256=aFPiZBnZ6ihQ8bpiToldkhMSfps_8tEuJXxDarJaWK0,7932
|
|
31
|
+
linerate/models/ieee738.py,sha256=5hRsXisb177AdN3xXfL9qBBQxWAVFYl1O2l7fciqiU4,4281
|
|
32
|
+
linerate/models/thermal_model.py,sha256=uRnqDZMQO_YnvPTZ37wEtEF2RHKxbUqUjyrRmz_lO-o,11311
|
|
33
|
+
linerate-2.2.1.dist-info/licenses/LICENSE,sha256=HDUtv1ujna13BmYSP7JtGGsG5kGPAaZY2C2qJrANAOo,1059
|
|
34
|
+
linerate-2.2.1.dist-info/METADATA,sha256=pYArGqT9-_NS9FIv-aYVZein97h6H6kNqG7QNeB1fk0,4285
|
|
35
|
+
linerate-2.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
36
|
+
linerate-2.2.1.dist-info/top_level.txt,sha256=xHXGAzhQ04AqJCM-MG30tP_me8vBQ9PMlRWsbMLJdgE,9
|
|
37
|
+
linerate-2.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|