Implements pump power draw

This commit is contained in:
mwerezak
2014-07-12 19:59:49 -04:00
parent 3fb3efe401
commit 7e65984ae2
2 changed files with 45 additions and 11 deletions

View File

@@ -22,6 +22,10 @@ obj/machinery/atmospherics/binary/pump
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
var/power_rating = 7500 //A measure of how powerful the pump is, in Watts. 7500 W ~ 10 HP
//The maximum amount of volume in Liters the pump can transfer in 1 second.
//This is limited by how fast the pump can spin without breaking, and means you can't instantly fill up the distro even when it's empty (at 10000, it will take about 15 seconds)
var/max_volume_transfer = 10000
use_power = 1
idle_power_usage = 10 //10 W for internal circuitry and stuff
@@ -29,12 +33,17 @@ obj/machinery/atmospherics/binary/pump
var/frequency = 0
var/id = null
var/datum/radio_frequency/radio_connection
New()
..()
active_power_usage = power_rating //make sure this is equal to the max power rating so that auto use power works correctly
highcap
name = "High capacity gas pump"
desc = "A high capacity pump"
target_pressure = 15000000
target_pressure = 15000000 //15 GPa? Really?
power_rating = 112500 //150 Horsepower
on
on = 1
@@ -62,46 +71,65 @@ obj/machinery/atmospherics/binary/pump
return 0
var/output_starting_pressure = air2.return_pressure()
if( (target_pressure - output_starting_pressure) < 0.01)
//No need to pump gas if target is already reached!
if (use_power >= 2)
update_use_power(1)
return 1
var/output_volume = air2.volume
if (network2 && network2.air_transient)
output_volume = network2.air_transient.volume
output_volume = min(output_volume, max_volume_transfer)
//Calculate necessary moles to transfer using PV=nRT
if((air1.total_moles() > 0) && (air1.temperature > 0 || air2.temperature > 0))
var/air_temperature = (air2.temperature > 0)? air2.temperature : air1.temperature
var/pressure_delta = target_pressure - output_starting_pressure
var/transfer_moles = pressure_delta*air2.volume/(air_temperature * R_IDEAL_GAS_EQUATION) //The number of moles that would have to be transfered to bring air2 to the target pressure
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) //The number of moles that would have to be transfered to bring air2 to the target pressure
//estimate the amount of energy required
var/specific_entropy = air2.specific_entropy() - air1.specific_entropy() //air2 is gaining moles, air1 is loosing
var/specific_power = 0
src.visible_message("DEBUG: [src] >>> terminal pressures: sink = [air2.return_pressure()] kPa, source = [air1.return_pressure()] kPa")
src.visible_message("DEBUG: [src] >>> specific entropy = [air2.specific_entropy()] - [air1.specific_entropy()] = [specific_entropy] J/K")
//src.visible_message("DEBUG: [src] >>> terminal pressures: sink = [air2.return_pressure()] kPa, source = [air1.return_pressure()] kPa")
//src.visible_message("DEBUG: [src] >>> specific entropy = [air2.specific_entropy()] - [air1.specific_entropy()] = [specific_entropy] J/K")
//if specific_entropy >= 0 then gas just flows naturally and we are not limited by how powerful the pump is.
if (specific_entropy < 0)
specific_power = -specific_entropy*air_temperature //how much power we need per mole
src.visible_message("DEBUG: [src] >>> limiting transfer_moles to [power_rating / (air_temperature * -specific_entropy)] mol")
//src.visible_message("DEBUG: [src] >>> limiting transfer_moles to [power_rating / (air_temperature * -specific_entropy)] mol")
transfer_moles = min(transfer_moles, power_rating / specific_power)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
air2.merge(removed)
src.visible_message("DEBUG: [src] >>> entropy_change = [specific_entropy*transfer_moles] J/K")
//src.visible_message("DEBUG: [src] >>> entropy_change = [specific_entropy*transfer_moles] J/K")
//if specific_entropy >= 0 then gas is flowing naturally and we don't need to use extra power
if (specific_entropy < 0)
//pump draws power and heats gas according to 2nd law of thermodynamics
var/power_draw = transfer_moles*specific_power
var/power_draw = round(transfer_moles*specific_power)
air2.add_thermal_energy(power_draw)
use_power(power_draw)
if (power_draw >= power_rating - 5) //if we are close enough to max power just active_power_usage
if (use_power < 2)
update_use_power(2)
else
if (use_power >= 2)
update_use_power(1)
//src.visible_message("DEBUG: [src] >>> Forcing area power update: use_power changed to [use_power]")
if (power_draw > idle_power_usage)
use_power(power_draw)
else
if (use_power >= 2)
update_use_power(1)
//src.visible_message("DEBUG: [src] >>> Forcing area power update: use_power changed to [use_power]")
src.visible_message("DEBUG: [src] >>> drawing [power_draw] W of power.")
//src.visible_message("DEBUG: [src] >>> drawing [power_draw] W of power.")
if(network1)
network1.update = 1
@@ -163,6 +191,7 @@ obj/machinery/atmospherics/binary/pump
if("power_toggle" in signal.data)
on = !on
update_use_power(on)
if("set_output_pressure" in signal.data)
target_pressure = between(