ubc-solar-physics 0.1.0__cp311-cp311-macosx_13_0_universal2.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.
Files changed (60) hide show
  1. core.cpython-311-darwin.so +0 -0
  2. physics/__init__.py +14 -0
  3. physics/environment/__init__.py +33 -0
  4. physics/environment/base_environment.py +62 -0
  5. physics/environment/environment.rs +3 -0
  6. physics/environment/gis/__init__.py +7 -0
  7. physics/environment/gis/base_gis.py +24 -0
  8. physics/environment/gis/gis.py +374 -0
  9. physics/environment/gis/gis.rs +25 -0
  10. physics/environment/gis.rs +1 -0
  11. physics/environment/openweather_environment.py +18 -0
  12. physics/environment/race.py +89 -0
  13. physics/environment/solar_calculations/OpenweatherSolarCalculations.py +529 -0
  14. physics/environment/solar_calculations/SolcastSolarCalculations.py +41 -0
  15. physics/environment/solar_calculations/__init__.py +9 -0
  16. physics/environment/solar_calculations/base_solar_calculations.py +9 -0
  17. physics/environment/solar_calculations/solar_calculations.rs +24 -0
  18. physics/environment/solar_calculations.rs +1 -0
  19. physics/environment/solcast_environment.py +18 -0
  20. physics/environment/weather_forecasts/OpenWeatherForecast.py +308 -0
  21. physics/environment/weather_forecasts/SolcastForecasts.py +216 -0
  22. physics/environment/weather_forecasts/__init__.py +9 -0
  23. physics/environment/weather_forecasts/base_weather_forecasts.py +57 -0
  24. physics/environment/weather_forecasts/weather_forecasts.rs +116 -0
  25. physics/environment/weather_forecasts.rs +1 -0
  26. physics/environment.rs +3 -0
  27. physics/lib.rs +76 -0
  28. physics/models/__init__.py +13 -0
  29. physics/models/arrays/__init__.py +7 -0
  30. physics/models/arrays/arrays.rs +0 -0
  31. physics/models/arrays/base_array.py +6 -0
  32. physics/models/arrays/basic_array.py +39 -0
  33. physics/models/arrays.rs +1 -0
  34. physics/models/battery/__init__.py +7 -0
  35. physics/models/battery/base_battery.py +29 -0
  36. physics/models/battery/basic_battery.py +141 -0
  37. physics/models/battery/battery.rs +0 -0
  38. physics/models/battery.rs +1 -0
  39. physics/models/constants.py +23 -0
  40. physics/models/lvs/__init__.py +7 -0
  41. physics/models/lvs/base_lvs.py +6 -0
  42. physics/models/lvs/basic_lvs.py +18 -0
  43. physics/models/lvs/lvs.rs +0 -0
  44. physics/models/lvs.rs +1 -0
  45. physics/models/motor/__init__.py +7 -0
  46. physics/models/motor/base_motor.py +6 -0
  47. physics/models/motor/basic_motor.py +179 -0
  48. physics/models/motor/motor.rs +0 -0
  49. physics/models/motor.rs +1 -0
  50. physics/models/regen/__init__.py +7 -0
  51. physics/models/regen/base_regen.py +6 -0
  52. physics/models/regen/basic_regen.py +39 -0
  53. physics/models/regen/regen.rs +0 -0
  54. physics/models/regen.rs +1 -0
  55. physics/models.rs +5 -0
  56. ubc_solar_physics-0.1.0.dist-info/LICENSE +21 -0
  57. ubc_solar_physics-0.1.0.dist-info/METADATA +44 -0
  58. ubc_solar_physics-0.1.0.dist-info/RECORD +60 -0
  59. ubc_solar_physics-0.1.0.dist-info/WHEEL +5 -0
  60. ubc_solar_physics-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,179 @@
1
+ import math
2
+ import numpy as np
3
+
4
+ from physics.models.motor.base_motor import BaseMotor
5
+ from physics.models.constants import ACCELERATION_G, AIR_DENSITY
6
+
7
+
8
+ class BasicMotor(BaseMotor):
9
+ def __init__(self, vehicle_mass, road_friction, tire_radius, vehicle_frontal_area, drag_coefficient):
10
+ super().__init__()
11
+
12
+ # Instantaneous voltage supplied by the battery to the motor controller
13
+ self.dc_v = 0
14
+
15
+ # Instantaneous current supplied by the battery to the motor controller
16
+ self.dc_i = 0
17
+
18
+ self.input_power = 0
19
+ self.vehicle_mass = vehicle_mass
20
+ self.acceleration_g = ACCELERATION_G
21
+ self.road_friction = road_friction
22
+ self.tire_radius = tire_radius
23
+
24
+ self.air_density = AIR_DENSITY
25
+ self.vehicle_frontal_area = vehicle_frontal_area
26
+ self.drag_coefficient = drag_coefficient
27
+
28
+ self.friction_force = (self.vehicle_mass * self.acceleration_g * self.road_friction)
29
+
30
+ self.e_mc = 0.98 # motor controller efficiency, subject to change
31
+ self.e_m = 0.9 # motor efficiency, subject to change
32
+
33
+ # print("torque experienced by motor: {} Nm".format(self.constant_torque))
34
+
35
+ @staticmethod
36
+ def calculate_motor_efficiency(motor_angular_speed, motor_output_energy, tick):
37
+ """
38
+
39
+ Calculates a NumPy array of motor efficiency from NumPy array of operating angular speeds and NumPy array
40
+ of output power. Based on data obtained from NGM SC-M150 Datasheet and modelling done in MATLAB
41
+
42
+ r squared value: 0.873
43
+
44
+ :param np.ndarray motor_angular_speed: (float[N]) angular speed motor operates in rad/s
45
+ :param np.ndarray motor_output_energy: (float[N]) energy motor outputs to the wheel in J
46
+ :param float tick: length of 1 update cycle in seconds
47
+ :returns e_m: (float[N]) efficiency of the motor
48
+ :rtype: np.ndarray
49
+
50
+ """
51
+
52
+ # Power = Energy / Time
53
+ motor_output_power = motor_output_energy * tick
54
+ rads_rpm_conversion_factor = 30 / math.pi
55
+
56
+ revolutions_per_minute = motor_angular_speed * rads_rpm_conversion_factor
57
+
58
+ e_m = calculate_motor_efficiency(motor_output_power, revolutions_per_minute)
59
+
60
+ e_m[e_m < 0.7382] = 0.7382
61
+ e_m[e_m > 1] = 1
62
+
63
+ return e_m
64
+
65
+ @staticmethod
66
+ def calculate_motor_controller_efficiency(motor_angular_speed, motor_output_energy, tick):
67
+ """
68
+
69
+ Calculates a NumPy array of motor controller efficiency from NumPy array of operating angular speeds and
70
+ NumPy array of output power. Based on data obtained from the WaveSculptor Motor Controller Datasheet efficiency
71
+ curve for a 90 V DC Bus and modelling done in MATLAB.
72
+
73
+ r squared value: 0.7431
74
+
75
+ :param np.ndarray motor_angular_speed: (float[N]) angular speed motor operates in rad/s
76
+ :param np.ndarray motor_output_energy: (float[N]) energy motor outputs to the wheel in J
77
+ :param float tick: length of 1 update cycle in seconds
78
+ :returns e_mc (float[N]) efficiency of the motor controller
79
+ :rtype: np.ndarray
80
+
81
+ """
82
+
83
+ # Ignore nan warning. Set nan value to 0
84
+ np.seterr(divide='ignore', invalid='ignore')
85
+
86
+ # Power = Energy / Time
87
+ motor_output_power = motor_output_energy / tick
88
+
89
+ # Torque = Power / Angular Speed
90
+ motor_torque_array = np.nan_to_num(motor_output_power / motor_angular_speed)
91
+
92
+ np.seterr(divide='warn', invalid='warn')
93
+
94
+ e_mc = calculate_motor_controller_efficiency(motor_angular_speed, motor_torque_array)
95
+
96
+ e_mc[e_mc < 0.9] = 0.9
97
+ e_mc[e_mc > 1] = 1
98
+
99
+ return e_mc
100
+
101
+ def calculate_energy_in(self, required_speed_kmh, gradients, wind_speeds, tick, parameters=None):
102
+ """
103
+
104
+ Create a function which takes in array of elevation, array of wind speed, required
105
+ speed, returns the consumed energy.
106
+
107
+ :param np.ndarray required_speed_kmh: (float[N]) required speed array in km/h
108
+ :param np.ndarray gradients: (float[N]) gradient at parts of the road
109
+ :param np.ndarray wind_speeds: (float[N]) speeds of wind in m/s, where > 0 means against the direction of the vehicle
110
+ :param float tick: length of 1 update cycle in seconds
111
+ :returns: (float[N]) energy expended by the motor at every tick
112
+ :rtype: np.ndarray
113
+
114
+ """
115
+ if parameters is None:
116
+ parameters = self.parameters
117
+
118
+ required_speed_ms = required_speed_kmh / 3.6
119
+
120
+ acceleration_ms2 = np.clip(np.gradient(required_speed_ms), a_min=0, a_max=None)
121
+ acceleration_force = acceleration_ms2 * self.vehicle_mass
122
+ acceleration_force *= np.polyval([parameters[0], parameters[1]], acceleration_ms2)
123
+
124
+ required_angular_speed_rads = required_speed_ms / self.tire_radius
125
+
126
+ drag_forces = 0.5 * self.air_density * (
127
+ (required_speed_ms + wind_speeds) ** 2) * self.drag_coefficient * self.vehicle_frontal_area
128
+
129
+ angles = np.arctan(gradients)
130
+ g_forces = self.vehicle_mass * self.acceleration_g * np.sin(angles)
131
+
132
+ road_friction_array = self.road_friction * self.vehicle_mass * self.acceleration_g * np.cos(angles)
133
+
134
+ net_force = road_friction_array + drag_forces + g_forces + acceleration_force
135
+
136
+ motor_output_energies = required_angular_speed_rads * net_force * self.tire_radius * tick
137
+ motor_output_energies = np.clip(motor_output_energies, a_min=0, a_max=None)
138
+ motor_output_energies *= np.polyval([parameters[2], parameters[3]], motor_output_energies)
139
+
140
+ e_m = self.calculate_motor_efficiency(required_angular_speed_rads, motor_output_energies, tick)
141
+ e_mc = self.calculate_motor_controller_efficiency(required_angular_speed_rads, motor_output_energies, tick)
142
+
143
+ motor_controller_input_energies = motor_output_energies / (e_m * e_mc)
144
+
145
+ # Filter out and replace negative energy consumption as 0
146
+ motor_controller_input_energies = np.where(motor_controller_input_energies > 0,
147
+ motor_controller_input_energies, 0)
148
+
149
+ return motor_controller_input_energies
150
+
151
+ def __str__(self):
152
+ return (f"Tire radius: {self.tire_radius}m\n"
153
+ f"Rolling resistance coefficient: {self.road_friction}\n"
154
+ f"Vehicle mass: {self.vehicle_mass}kg\n"
155
+ f"Acceleration of gravity: {self.acceleration_g}m/s^2\n"
156
+ f"Motor controller efficiency: {self.e_mc}%\n"
157
+ f"Motor efficiency: {self.e_m}%\n")
158
+
159
+
160
+ def calculate_motor_efficiency(motor_output_power, revolutions_per_minute):
161
+ return 0.7382 - (6.281e-5 * motor_output_power) + (6.708e-4 * revolutions_per_minute) \
162
+ - (2.89e-8 * motor_output_power ** 2) + (2.416e-7 * motor_output_power * revolutions_per_minute) \
163
+ - (8.672e-7 * revolutions_per_minute ** 2) + (5.653e-12 * motor_output_power ** 3) \
164
+ - (1.74e-11 * motor_output_power ** 2 * revolutions_per_minute) \
165
+ - (7.322e-11 * motor_output_power * revolutions_per_minute ** 2) \
166
+ + (3.263e-10 * revolutions_per_minute ** 3)
167
+
168
+
169
+ def calculate_motor_controller_efficiency(motor_angular_speed, motor_torque_array):
170
+ return 0.7694 + (0.007818 * motor_angular_speed) + (0.007043 * motor_torque_array) \
171
+ - (1.658e-4 * motor_angular_speed ** 2) - (1.806e-5 * motor_torque_array * motor_angular_speed) \
172
+ - (1.909e-4 * motor_torque_array ** 2) + (1.602e-6 * motor_angular_speed ** 3) \
173
+ + (4.236e-7 * motor_angular_speed ** 2 * motor_torque_array) \
174
+ - (2.306e-7 * motor_angular_speed * motor_torque_array ** 2) \
175
+ + (2.122e-06 * motor_torque_array ** 3) - (5.701e-09 * motor_angular_speed ** 4) \
176
+ - (2.054e-9 * motor_angular_speed ** 3 * motor_torque_array) \
177
+ - (3.126e-10 * motor_angular_speed ** 2 * motor_torque_array ** 2) \
178
+ + (1.708e-09 * motor_angular_speed * motor_torque_array ** 3) \
179
+ - (8.094e-09 * motor_torque_array ** 4)
File without changes
@@ -0,0 +1 @@
1
+ mod motor;
@@ -0,0 +1,7 @@
1
+ from .base_regen import BaseRegen
2
+ from .basic_regen import BasicRegen
3
+
4
+ __all__ = [
5
+ "BasicRegen",
6
+ "BaseRegen"
7
+ ]
@@ -0,0 +1,6 @@
1
+ from abc import ABC
2
+
3
+
4
+ class BaseRegen(ABC):
5
+ def __init__(self):
6
+ super().__init__(self)
@@ -0,0 +1,39 @@
1
+ from physics.models.regen import BaseRegen
2
+ import numpy as np
3
+
4
+
5
+ class BasicRegen(BaseRegen):
6
+ GRAVITY = 9.81
7
+ EFFICIENCY = 0.5 # currently set to 50% but best case scenario is 60-70%
8
+
9
+ def __init__(self, vehicle_mass):
10
+ super().__init__()
11
+ self.min_decel_mag = 0
12
+ self.vehicle_mass = vehicle_mass
13
+ self.kmh_to_mps = 0.278
14
+
15
+ def calculate_produced_energy(self, speed_kmh, gis_route_elevations, min_regen_speed, max_power):
16
+ """
17
+ Returns a numpy array containing the energy produced by regen
18
+ during each tick of the race based on the change in energy in that tick
19
+ :param speed_kmh: an array containing the speeds at each tick
20
+ :param gis_route_elevations: an array containing elevations on the route at each tick
21
+ """
22
+ # get the changes of energy from tick i to tick i + 1
23
+ speed_ms = speed_kmh / 3.6 # Convert to m/s from km/h
24
+ delta_kinetic_energy = np.diff((1 / 2) * self.vehicle_mass * pow(speed_ms, 2), append=[0])
25
+ delta_potential_energy = np.diff(self.vehicle_mass * self.GRAVITY * gis_route_elevations, append=[0])
26
+
27
+ # get the total change in energy at each tick
28
+ delta_energy = delta_kinetic_energy + delta_potential_energy
29
+
30
+ # create regen energy produced array
31
+ # if delta_energy is negative, we regen that energy back at the set efficiency rate; else 0 energy regen
32
+ produced_energy = np.where(delta_energy < 0, abs(delta_energy) * self.EFFICIENCY, 0)
33
+
34
+ # Regen does not occur below a certain speed
35
+ produced_energy = np.where(speed_ms >= min_regen_speed, produced_energy, 0)
36
+
37
+ # Regen power is capped by current limitations
38
+
39
+ return np.clip(produced_energy, a_min=0, a_max=max_power)
File without changes
@@ -0,0 +1 @@
1
+ mod regen;
physics/models.rs ADDED
@@ -0,0 +1,5 @@
1
+ mod arrays;
2
+ mod battery;
3
+ mod lvs;
4
+ mod motor;
5
+ mod regen;
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 UBC Solar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,44 @@
1
+ Metadata-Version: 2.1
2
+ Name: ubc-solar-physics
3
+ Version: 0.1.0
4
+ Summary: UBC Solar's Simulation Environment
5
+ Author: Fisher Xue, Mihir Nimgade, Chris Chang, David Widjaja, Justin Hua, Ilya Veksler, Renu Rajamagesh, Ritchie Xia, Erik Langille, Chris Aung, Nicolas Ric, Ishaan Trivedi, Jason Liang, Felix Toft, Mack Wilson, Jonah Lee, Tamzeed Quazi, Joshua Riefman
6
+ Author-email: UBC Solar <strategy@ubcsolar.com>
7
+ Maintainer: Renu Rajamagmesh, Felix Toft, Mack Wilson, Jonah Lee, Tamzeed Quazi
8
+ Maintainer-email: UBC Solar <strategy@ubcsolar.com>, Joshua Riefman <joshuariefman@gmail.com>
9
+ License: MIT License
10
+
11
+ Copyright (c) 2024 UBC Solar
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+
31
+ Project-URL: Homepage, https://ubcsolar.com
32
+ Project-URL: Repository, https://github.com/UBC-Solar/Simulation
33
+ Project-URL: Documentation, https://wiki.ubcsolar.com
34
+ Keywords: car,simulation,solar
35
+ Classifier: Programming Language :: Python :: 3
36
+ Classifier: Programming Language :: Rust
37
+ Classifier: Natural Language :: English
38
+ Classifier: Topic :: Scientific/Engineering :: Physics
39
+ Requires-Python: >=3.9
40
+ Description-Content-Type: text/markdown
41
+ License-File: LICENSE
42
+
43
+ # physics
44
+ UBC Solar's physics and environment models for simulating our groundbreaking solar cars
@@ -0,0 +1,60 @@
1
+ core.cpython-311-darwin.so,sha256=qusHdJJSNgWcLgfw15VEwv4aoDOLfAAah4eI8HhZj6c,624752
2
+ physics/__init__.py,sha256=mwlnk0K9sdBVXO8ys0SZWA_HzrVwDNqu10JfMrFH0H0,194
3
+ physics/environment.rs,sha256=TTW3iI6S2My8KL3AamgGztSRstocw6EE2SEJUy6LUWU,68
4
+ physics/lib.rs,sha256=Nd92mZFs1-Y2qQVEYo2FzjYiOUv-jXE8dB6WjBvtqa0,3336
5
+ physics/models.rs,sha256=KfvtkWTmbsqr7Y6hN0jPe7hTTgCN6Osydkb4fLnZHwA,55
6
+ physics/environment/__init__.py,sha256=p-PWwx79pDn7nCoHprLIzLOGxMwvTQ-fwuqUsQ7QXNM,655
7
+ physics/environment/base_environment.py,sha256=IoUZb9m5DztI2FHszUO-zcChajeRdDnmFWCCdKeyl5c,1563
8
+ physics/environment/environment.rs,sha256=jKilexdyGut0BqL7jo9X-xrn3Qo3ZEw3mYM8JzwYEoU,67
9
+ physics/environment/gis.rs,sha256=9R7G0cjf5PxQAz-CSryA6-KGfrh1eSwRhJ6qF8KfjDE,12
10
+ physics/environment/openweather_environment.py,sha256=mT0zQ8kMeI_a6IgweXt_5uKqCmDc2686S5K1bY3SOh8,478
11
+ physics/environment/race.py,sha256=0h-T0tfJ_GLaO3c711bzCVnvG5K2Cv4do6Y25KOqZww,2928
12
+ physics/environment/solar_calculations.rs,sha256=brqvMLAUJXrKRKQQ84EYiTLnOnNTrp0UszfFDALRxeI,27
13
+ physics/environment/solcast_environment.py,sha256=yQoZyqBYeS2GkRuDD4L1TedZW6hdco_jbomu8NUnvRY,418
14
+ physics/environment/weather_forecasts.rs,sha256=6ZH1L-sidv_WAczD-uTt9UFF2hBcguoyLG-x5086YHs,26
15
+ physics/environment/gis/__init__.py,sha256=Kp85UC1WvcAMBxbgvwaMTEk8ELYzwUJLCtP0e1hnMvM,90
16
+ physics/environment/gis/base_gis.py,sha256=PBaCz2irEArQs3k8HVG7BmAfC1HzA8FLPuYSiMxDmJo,632
17
+ physics/environment/gis/gis.py,sha256=-swnOTegpyALCkClaykTIXRm39VqrczO62SZDnRjMlU,12683
18
+ physics/environment/gis/gis.rs,sha256=ZCd7MbrENFXFl7MaLMGUl_kbqWKLc695Bf-MeWgo1S0,852
19
+ physics/environment/solar_calculations/OpenweatherSolarCalculations.py,sha256=zJFOA8SwzQ6HoQRBzMJJcsi4WKHxzLHq4EbZbRbGUNs,23044
20
+ physics/environment/solar_calculations/SolcastSolarCalculations.py,sha256=orCA-42_zU7CUR77A2iLoGanJXeDgDrmRJ6jvRStrgc,1771
21
+ physics/environment/solar_calculations/__init__.py,sha256=HDOKsHS0PL1cI-VmVB-JzhkXZSKJuLgxVnzIwbHcH2k,304
22
+ physics/environment/solar_calculations/base_solar_calculations.py,sha256=xrBoQuaFundXOHBtDKfGaPrTV2rLTuMtiXKzmkNDCAY,280
23
+ physics/environment/solar_calculations/solar_calculations.rs,sha256=WWGqoxVMSckQoEZRuWmdERi6gwaV_-tkCXzoJaKKwHo,829
24
+ physics/environment/weather_forecasts/OpenWeatherForecast.py,sha256=UO64bRD-BNyTaPvjbUxckQY8bN279fW0mXciYjMr89w,13722
25
+ physics/environment/weather_forecasts/SolcastForecasts.py,sha256=2Rm7Rf8y2Zh9mkHJ3UWii6mHrw_l1FIaf9_RAagV-yA,10913
26
+ physics/environment/weather_forecasts/__init__.py,sha256=RNdn0ASziRJETusV4yTyeJQkKZoDoNWiWXd5k6LkhDA,250
27
+ physics/environment/weather_forecasts/base_weather_forecasts.py,sha256=EqD8McRl_ej0WWURrsCQOXZa0O8eGsB_0DwzMAAxOI0,2170
28
+ physics/environment/weather_forecasts/weather_forecasts.rs,sha256=_-4V9y1NU0QY8ZohNQ4CCsGLchOQp6XEWR2sbkRG2Es,4311
29
+ physics/models/__init__.py,sha256=msz4YtXe7fsGr-FsV-yJK0frN5XrmsXPSAkpS8lxHW8,255
30
+ physics/models/arrays.rs,sha256=rtthXq7PDjL30lIt8y9L2xFAPJE5o_ltmCbOGzzOxrc,11
31
+ physics/models/battery.rs,sha256=GzPA7uaF5FdewEFZL2eOt9ZeA1GzfRDQ9db_qkEpLR8,12
32
+ physics/models/constants.py,sha256=mw0IkjhSJe51inbbzvVpHnpGLY_AoWxIxjfjcUF4cd8,816
33
+ physics/models/lvs.rs,sha256=uyJ1ZZ1Phq8cWCzr2aevCWzt8MlhCw9DO5ObUvEs8ds,8
34
+ physics/models/motor.rs,sha256=Iya1C_YF09KMy-9N-Mt-rBf1EIAs2Bf3Q4eDvyFuAoc,10
35
+ physics/models/regen.rs,sha256=WXwtzB72akG6L17wg-9Pz9kUe-57lqh4-PcSv1cKrGU,10
36
+ physics/models/arrays/__init__.py,sha256=yavs1K3JA6x3Aa-U1JCZJlcWggCOFrVxrrMCGsiceAw,119
37
+ physics/models/arrays/arrays.rs,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ physics/models/arrays/base_array.py,sha256=ZUjehd7vwNOBdFLUk9WJUeGOi9DPopYplH1gqAMnKgA,95
39
+ physics/models/arrays/basic_array.py,sha256=cGBwyrYpR313ECJ-SwnrK3JzYo24NRE70j8sj-sxFQI,1332
40
+ physics/models/battery/__init__.py,sha256=BIaUG06jULcloNv0hDFKjyGmdzWp02ZiV6MI_OZ8wb4,131
41
+ physics/models/battery/base_battery.py,sha256=yK-bkA2OolE6nIDn5rf5nzi8gwm-AqQRmgsQioi_UOA,1203
42
+ physics/models/battery/basic_battery.py,sha256=xkY77UpWz9qTuqT2t_tm5CZbtScQE6r3vkzlMXlnXog,5755
43
+ physics/models/battery/battery.rs,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ physics/models/lvs/__init__.py,sha256=GkO6SJxbbSnXYLdMDvsvTRhXotV3zaRNmYBgziQLGB8,107
45
+ physics/models/lvs/base_lvs.py,sha256=Xpj_5PmPtKtCoW7pWvcnb5hKJGeuWCDubua9PH9_H7g,125
46
+ physics/models/lvs/basic_lvs.py,sha256=UH6VmVWrSo-tKvcbSOm3Ptp0edz1xDQiQsM4HlOJ__0,603
47
+ physics/models/lvs/lvs.rs,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ physics/models/motor/__init__.py,sha256=tDFCMk8rdv2c_0Qp0EAtTpw0uKBnza-9BlMaNthcw0c,119
49
+ physics/models/motor/base_motor.py,sha256=uTSdkIQPk_q6l4wrPVBYWe5wUCzbA7k-khidW58rnas,99
50
+ physics/models/motor/basic_motor.py,sha256=jrFLhEsuBGE-ZqFA03Yp_SqpBIltOv5d_DdgQg8_e8A,8008
51
+ physics/models/motor/motor.rs,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ physics/models/regen/__init__.py,sha256=51t_BHuQqIVPPy_0b14MO6QGZayOO326JR7wK1egy-g,119
53
+ physics/models/regen/base_regen.py,sha256=VKOppL9x-E6tqpH5hN57XuXhzNXeXgliO4Vt7c3RLaY,99
54
+ physics/models/regen/basic_regen.py,sha256=eAQAb-bWA-CINGFK2Xykh7rIm4c16DwyZzHjdOzANrg,1772
55
+ physics/models/regen/regen.rs,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ ubc_solar_physics-0.1.0.dist-info/LICENSE,sha256=DAej6EJNqQWTair3XPAQiqoJbly4BAT1JMOsZxoZvH0,1066
57
+ ubc_solar_physics-0.1.0.dist-info/METADATA,sha256=ajwirs1MfaE7_IE5M1A_tC7pPb_iAcqd7AGSb1B7SxU,2388
58
+ ubc_solar_physics-0.1.0.dist-info/WHEEL,sha256=Lzvkiqi70HXhQLkDg5wgK7U0ZY4U3ls4sN2N5bd6S4o,115
59
+ ubc_solar_physics-0.1.0.dist-info/top_level.txt,sha256=aws060Zz-1h0Kx76JzcE1gLA_AfS1lrRtTCsyUYwDvM,8
60
+ ubc_solar_physics-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.43.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp311-cp311-macosx_13_0_universal2
5
+
@@ -0,0 +1 @@
1
+ physics