Add alex's code as referance & re-generate output for compairasons

This commit is contained in:
Cal Wing 2025-02-27 20:46:41 +10:00
parent 780ee331e4
commit 619478dae3
4 changed files with 330 additions and 11 deletions

19
a1.py
View File

@ -1,5 +1,5 @@
# These could be from the std math lib, but I like the numpy ones better personally
from numpy import sin, cos, pi, sqrt
from numpy import sin, cos, pi, sqrt, pow
# Pull a1 support
from a1_support import GRAVITY_ACC, WATER_DENSITY, HELP_MESSAGE
@ -158,11 +158,8 @@ def calc_energy_power(heights: tuple[float, ...], water_mass_outs: tuple[float,
energy_jules = water_mass_outs[i] * GRAVITY_ACC * \
(heights[i] + relative_elevation) * (efficiency/100) # note the comma
energy += energy_jules / 3.6e+6, # convert to kWh
power_watts = energy[i] / time_inc
power += power_watts / 1e3, # convert to kW
energy += energy_jules / 3.6e6, # convert to kWh
power += (energy_jules / time_inc) / 1e3, # convert to kW
return energy, power
@ -170,9 +167,9 @@ def calc_energy_power(heights: tuple[float, ...], water_mass_outs: tuple[float,
def calc_daily_profit(energy: tuple[float, ...], peak_tariff: float,
off_peak_tariff: float, efficiency: float) -> float:
total_profit = sum(energy) * (peak_tariff - off_peak_tariff / pow(efficiency/100, 2))
return 0.0
return total_profit
# See if I get what the task sheet wants
# [NOTE] It seems I am witing my own test suite :/ that wasn't the initention lol
@ -181,6 +178,8 @@ def sheet_tasks():
from debug_lib import NO_EVAL, TUPLE_EVAL
from debug_lib import compair_outputs
# from a1_alex import calc_daily_profit
TASKS = (
(determine_power_used, (5e6, 250, 8, 85), 500.9191176470588),
(determine_water_released, (300, 250, 8, 85), 2994495.4128440367),
@ -188,8 +187,8 @@ def sheet_tasks():
(calc_speed_at_outlet, (30,), 24.261079942986875),
(calc_new_water_height, (20, 40000, 1, 30), (19.985143183382704, 592567.1021442247)),
(calc_heights_water_out, (40, 5, 40000, 1, 30), ((39.97898928844613, 39.95798409574207, 39.93698442188801), (838016.4324684857, 837796.3120398963, 837576.1916037091), TUPLE_EVAL)),
(calc_energy_power, tuple(i for i in calc_heights_water_out(30, 20, 40000, 1, 30)) + (200, 85, 30), ((387.7129370269342, 387.56468335928287, 387.4164575872225), (46525.5524432321, 46507.762003113945, 46489.9749104667), TUPLE_EVAL))
# (calc_daily_profit, (calc_energy_power(*(tuple(i for i in calc_heights_water_out(30, 20, 40000, 1, 30)) + (200, 85, 30)))[0], 0.02, 0.005, 85), 2726.5251609213365)
(calc_energy_power, tuple(i for i in calc_heights_water_out(30, 20, 40000, 1, 30)) + (200, 85, 30), ((386.6002008976669, 386.4523727180418, 386.3045723539472), (46392.024107720026, 46374.28472616501, 46356.548682473665), TUPLE_EVAL)),
(calc_daily_profit, (calc_energy_power(*(tuple(i for i in calc_heights_water_out(30, 20, 40000, 1, 30)) + (200, 85, 30)))[0], 0.02, 0.005, 85), 2718.700033709491)
)
compair_outputs(TASKS)

284
a1_alex.py Normal file
View File

@ -0,0 +1,284 @@
from a1_support import *
def determine_power_used(water_mass, elevation, pumping_time, efficiency):
"""
Calculates the power required to pump a certain mass of water a certain height
taking into account the pumping_time and efficiency.
Parameters:
water_mass (float): the mass of the water pumped [kg]
elevation (float): the height difference [m]
pumping_time (float): the amount of time the pump is running for [hrs]
efficiency (float): the conversion efficiency [%]
Returns:
(float): the power required by the pump [kW]
"""
potential_energy = water_mass * elevation * GRAVITY_ACC
power = potential_energy / (pumping_time*3600 * (efficiency/100))/1000
return power
def determine_water_released(gen_power, elevation, pumping_time, efficiency):
"""
Calculates the mass of water released required to generate a specified power
Parameters:
gen_power (float): the specified power to be generated [kW]
elevation (float): the height difference [m]
pumping_time (float): the time the pump is running for [hrs]
efficiency (float): the conversion efficiency [%]
Returns:
(float): the mass of water required [kg]
"""
power = gen_power * 1000
water_mass = power * pumping_time*3600 * (efficiency/100) / (elevation * GRAVITY_ACC)
return water_mass
def determine_cost_to_pump(gen_power, pumping_time, off_peak_tariff):
"""
Calculates the cost of using the pump during off peak period
Parameters:
gen_power (float): the amount of power generated by the pump [kW]
pumping_time (float): the amount of time the pump is running for [hrs]
off_peak_tariff (float): the off-peak tarriff cost for electricity [$/kWh]
Returns:
(float): the cost of running the pump ($)
"""
cost = gen_power * pumping_time * off_peak_tariff
return cost
def calc_speed_at_outlet(water_height):
"""
Calculates the speed of the water at the outlet of the dam
Parameters:
water_height (float): the height of the water in the pipe [m]
Returns:
(float): the speed of the water at the outlet [m/s]
"""
speed = (2*GRAVITY_ACC*water_height)**0.5
return speed
def calc_new_water_height(old_water_height, reservoir_area, outlet_area, time_inc):
"""
Calculates the new water height in the reservoir after a certain time increment
Parameters:
old_water_height (float): the initial height of the water in the reservoir [m]
reservoir_area (float): the area of the reservoir [m^2]
outlet_area (float): the area of the outlet [m^2]
time_inc (float): the time increment [s]
Returns:
(tuple): the new water height and the mass of water outflow
"""
water_mass_out = outlet_area * calc_speed_at_outlet(old_water_height) * WATER_DENSITY * time_inc
new_water_height = old_water_height - (water_mass_out / (reservoir_area * WATER_DENSITY))
return new_water_height, water_mass_out
def calc_heights_water_out(initial_height, final_height, reservoir_area, outlet_area, time_inc):
"""
Calculates the water height in the reservoir and the water outflow after a certain time increment
Parameters:
initial_height (float): the initial height of the water in the reservoir [m]
final_height (float): the final height of the water in the reservoir [m]
reservoir_area (float): the area of the reservoir [m^2]
outlet_area (float): the area of the outlet [m^2]
time_inc (float): the time increment [s]
Returns:
(tuple): the water heights and water masses
"""
water_heights = ()
water_height = initial_height
water_masses = ()
while water_height > final_height:
water_height, water_mass_out = calc_new_water_height(water_height, reservoir_area, outlet_area, time_inc)
water_heights += (water_height, )
water_masses += (water_mass_out, )
return water_heights, water_masses
def calc_energy_power(heights, water_mass_outs, relative_elevation, efficiency, time_inc):
"""
Calculates the energy generated and the power generated
Parameters:
heights (tuple): the water heights [m]
water_mass_outs (tuple): the water masses [kg]
relative_elevation (float): the height difference between the generators and the dam [m]
efficiency (float): the conversion efficiency [%]
time_inc (float): the time increment [s]
Returns:
(tuple): the energy generated and the power generated [kWh, kW]
"""
energies = ()
powers = ()
for i in range(len(heights)):
energy = water_mass_outs[i] * GRAVITY_ACC * (heights[i] + relative_elevation) * efficiency / 100 /1000 / 3600
power = energy*3600/(time_inc)
energies += (energy, )
powers += (power, )
return energies, powers
def calc_daily_profit(energies, peak_tariff, off_peak_tariff, efficiency):
"""
Calculates the daily profit generated by the dam
Parameters:
energy (tuple): the energy generated by the dam [kWh]
peak_tariff (float): the peak tariff cost for electricity [$/kWh]
off_peak_tariff (float): the off-peak tariff cost for electricity [$/kWh]
efficiency (float): the conversion efficiency [%]
Returns:
(float): the daily profit generated by the dam ($)
"""
profit = 0
for energy in energies:
profit += energy * (peak_tariff - off_peak_tariff/((efficiency/100)**2))
return profit
def print_table(start_relative_elevation, step_size, num_steps, initial_height,
final_height, reservoir_area, outlet_area, time_inc, peak_tariff,
off_peak_tariff, efficiency):
"""
Prints a table of the daily profit generated by the dam for different water heights
Parameters:
start_relative_elevation (float): the height difference between the generators and the dam [m]
step_size (float): the increment in water height [m]
num_steps (int): the number of steps to take
initial_height (float): the initial height of the water in the reservoir [m]
final_height (float): the final height of the water in the reservoir [m]
reservoir_area (float): the area of the reservoir [m^2]
outlet_area (float): the area of the outlet [m^2]
time_inc (float): the time increment [s]
peak_tariff (float): the peak tariff cost for electricity [$/kWh]
off_peak_tariff (float): the off-peak tariff cost for electricity [$/kWh]
efficiency (float): the conversion efficiency [%]
Returns:
None
"""
COLUMN_WIDTH = 25
HEADER = '#'*((COLUMN_WIDTH + 1)*3 + 1)
print(HEADER)
print(f"#{'Relative elevation (m)':^{COLUMN_WIDTH}}#{'Daily Profit ($)':^{COLUMN_WIDTH}}#{'Total Energy (kWh)':^{COLUMN_WIDTH}}#")
print(HEADER)
for _ in range(num_steps):
water_heights, water_masses = calc_heights_water_out(initial_height, final_height, reservoir_area, outlet_area, time_inc)
energy, power = calc_energy_power(water_heights, water_masses, start_relative_elevation, efficiency, time_inc)
profit = calc_daily_profit(energy, peak_tariff, off_peak_tariff, efficiency)
print(f"#{start_relative_elevation:^{COLUMN_WIDTH}}#{profit:^{COLUMN_WIDTH}.2f}#{sum(energy):^{COLUMN_WIDTH}.2f}#")
start_relative_elevation += step_size
print(HEADER)
def main():
"""
Main function that handles the user interface
Parameters:
None
Returns:
None
"""
running = True
data = None
while running:
command = input("Please enter a command: ")
if command == 'h':
print(HELP_MESSAGE)
elif command.startswith('r'):
directory = input("Please specify the directory: ")
filename = input("Please specify the filename: ")
data = load_data(directory, filename)
elif command.startswith('p'):
if data is None:
print("Please load data before using this command")
else:
args = command.split()[1:]
if len(args) != 3:
print("Please enter the correct number of arguments")
else:
start_relative_elevation = int(args[0])
step_size = float(args[1])
num_steps = int(args[2])
print_table(start_relative_elevation, step_size, num_steps, *data)
elif command.startswith('s'):
if data is None:
print("Please load data before using this command")
else:
initial_height = data[0]
final_height = data[1]
reservoir_area = data[2]
outlet_area = data[3]
time_inc = data[4]
water_heights, _ = calc_heights_water_out(initial_height, final_height,
reservoir_area, outlet_area, time_inc)
print("Simulating water heights...")
plot_water_height(water_heights, time_inc)
elif command == 'q':
command = input("Are you sure (y/n): ")
if command == 'y':
running = False
else:
continue
else:
print("Please enter a valid command")
if __name__ == '__main__':
print("Task 1")
print(determine_power_used(5e6, 250, 8, 85))
print("\nTask 2")
print(determine_water_released(300, 250, 8, 85))
print("\nTask 3")
print(determine_cost_to_pump(300, 8, 0.02))
print("\nTask 4")
print(calc_speed_at_outlet(30))
print("\nTask 5")
print(calc_new_water_height(20, 40000, 1, 30))
print("\nTask 6")
water_heights, water_masses = calc_heights_water_out(40, 5, 40000, 1, 30)
print(water_heights[0:3], water_masses[0:3])
print(len(water_heights), len(water_masses))
print("\nTask 7")
water_heights, water_masses = calc_heights_water_out(30, 20, 40000, 1, 30)
energy, power = calc_energy_power(water_heights, water_masses, 200, 85, 30)
print(energy[0:3], power[0:3])
print(len(energy), len(power))
print(calc_daily_profit(energy, 0.02, 0.005, 85))
print("\nTask 8")
print_table(280, 20, 6, 30, 20, 40000, 1, 30, 0.02, 0.005, 85)
# main()

35
alex_dump.txt Normal file
View File

@ -0,0 +1,35 @@
Task 1
500.9191176470588
Task 2
2994495.4128440367
Task 3
48.0
Task 4
24.261079942986875
Task 5
(19.985143183382704, 592567.1021442247)
Task 6
(39.97898928844613, 39.95798409574207, 39.93698442188801) (838016.4324684857, 837796.3120398963, 837576.1916037091)
2461 2461
Task 7
(386.6002008976669, 386.4523727180418, 386.3045723539472) (46392.024107720026, 46374.28472616501, 46356.548682473665)
605 605
2718.700033709491
Task 8
###############################################################################
# Relative elevation (m) # Daily Profit ($) # Total Energy (kWh) #
###############################################################################
# 280 # 3685.38 # 281766.19 #
# 300 # 3927.06 # 300243.16 #
# 320 # 4168.73 # 318720.14 #
# 340 # 4410.40 # 337197.12 #
# 360 # 4652.07 # 355674.09 #
# 380 # 4893.74 # 374151.07 #
###############################################################################

View File

@ -36,7 +36,8 @@ def compair_outputs(tasks):
# Number comparison
if isinstance(expected, (float, int)):
foo = np.isclose(result, expected, IS_CLOSE_VAR)
print(f'{task.__qualname__}{args} -> {result} {"~=" if foo else "!="} {expected}')
print(f'{task.__qualname__}{args}')
print(f' -> {result} {"~=" if foo else "!="} {expected}')
print(f'Task is{"" if foo else " NOT"} close enough to expected result.')
# Run the task and print out what is is expected on a new line