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.
@@ -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 hasattr(q_c1, "__len__"):
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
- return np.mod((-12 + utc_hour + utc_minute / 60 + longitude / 15), 24) * (
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
- elif chi < 0:
129
+ else:
127
130
  C = pi
128
131
  elif 0 <= omega < pi:
129
132
  if chi >= 0:
130
133
  C = pi
131
- elif chi < 0:
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
  ----------
@@ -60,7 +60,7 @@ class Cigre207(ThermalModel):
60
60
  )
61
61
  if self.include_diffuse_radiation:
62
62
  I_d = cigre207.solar_heating.compute_diffuse_sky_radiation(I_B, sin_H_s)
63
- F = self.span.ground_albedo
63
+ F = self.weather.ground_albedo
64
64
  else:
65
65
  I_d = 0
66
66
  F = 0
@@ -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 Cigre601(ThermalModel):
24
+ class BaseCigre601(ThermalModel):
26
25
  def __init__(
27
26
  self,
28
27
  span: Span,
29
- weather: Weather,
28
+ weather: BaseWeather,
30
29
  time: Date,
31
- max_reynolds_number: Real = 4000, # Max value of the angle correction in CIGRE601
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 Cigre601WithSolarRadiation(Cigre601):
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
- super().__init__(span, weather, time)
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(
@@ -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: Real = 50_000, # Max Reynolds number for forced convection
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
@@ -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 Span, Weather
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: 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, Optional
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
- invalid_value: Optional[float] = None,
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
- invalid_value:
36
- This value is used whenever
37
- :math:`\text{sign}(f(\mathbf{x}_\min)) = \text{sign}(f(\mathbf{x}_\max))`. If not provided
38
- np.nan is used.
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 if invalid_value is None else invalid_value
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 invalid_value is None:
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
- f = partial(heat_balance, current=current)
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
- invalid_value=None,
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
- invalid_value:
152
- if the optimization problem is invalid, this value is returned instead of an error.
153
- Suggested value: 0 for 0-ampacity when max_conductor_temperature is exceeded for all
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(f, min_ampacity, max_ampacity, tolerance, invalid_value=invalid_value)
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 Weather:
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(Weather):
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 = None
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 = None
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.float64, npt.NDArray[np.float64]]
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
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=OaaTUBii7pTPTQMqpePNRhheSpLCOd0zjkspuaeUads,6665
5
- linerate/types.py,sha256=HEon3gQU0dX0ZtTxhs4kOhL3jTamXoC3oBtX5b2-Piw,7595
6
- linerate/units.py,sha256=nNU9SQ-eeUCtmbttKZ9IlNzomF8wwUPPwmixXjfvKhI,1476
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=74b2-7krx22YeeS5DyHfV9BsfEeY3vI59nYIzHs9UF0,9956
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=Yyi_LFfHZHDnv09FQb82-VpS2i2PDg4JpbHGyS_H37A,10032
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=FqeSkVzcsf8YIPuyxN0o3svrEp73vIAb42ylnQU_pBQ,5477
30
- linerate/models/cigre601.py,sha256=HuwAEsRtWdN5oG0AZqCISnww8ILFGdvk8IfrzLQ_nf0,7508
31
- linerate/models/ieee738.py,sha256=0o1rEjHhHUgCaK0PyBHBXvFCDs-c9HIF91uUP-VaLAg,4291
32
- linerate/models/thermal_model.py,sha256=SUeUrjxJaV4muoAiYNR-Ne-1vQspWCPsoJys6bP6pP8,10997
33
- linerate-2.1.3.dist-info/licenses/LICENSE,sha256=HDUtv1ujna13BmYSP7JtGGsG5kGPAaZY2C2qJrANAOo,1059
34
- linerate-2.1.3.dist-info/METADATA,sha256=EuetzmcfrIbkOFT7LHUXdlOZMHeqAg6plaR3ujXPlD8,4285
35
- linerate-2.1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- linerate-2.1.3.dist-info/top_level.txt,sha256=xHXGAzhQ04AqJCM-MG30tP_me8vBQ9PMlRWsbMLJdgE,9
37
- linerate-2.1.3.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5