forked from smross106/propellant-selector
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpropellant.py
More file actions
94 lines (75 loc) · 3.01 KB
/
propellant.py
File metadata and controls
94 lines (75 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"""
Defines the Propellant class, used throughout the program
"""
from numpy import poly1d
from nist_reader import propellant_data, combo_data
from phase import Phase
oxidisers_phases = {
"nitrous": [Phase.TWO_PHASE, 44],
}
fuels_phases = {
"ammonia": [Phase.TWO_PHASE, 17],
"ethane": [Phase.TWO_PHASE, 30],
"ethanol": [Phase.LIQUID, 46],
"diesel": [Phase.LIQUID, 166],
}
class Propellant(object):
def __init__(self, phase):
self.phase = phase
self.F_density_liquid = None
self.F_density_vapour = None
self.F_pressure = None
def pressure(self, temperature):
if type(self.F_pressure) == poly1d:
return(self.F_pressure(temperature))
else:
if self.phase == Phase.LIQUID:
return(0)
def liquid_density(self, temperature):
if type(self.F_pressure) == poly1d:
return(self.F_density_liquid(temperature))
else:
if self.phase == Phase.GAS:
return(0)
def vapor_density(self, temperature):
if type(self.F_pressure) == poly1d and self.phase != Phase.LIQUID:
return(self.F_density_vapour(temperature))
else:
if self.phase == Phase.LIQUID:
return(0)
class Propellant_Mix(object):
def __init__(self, fuel, oxidiser, temperature, pressure):
if not (fuel in fuels_phases.keys()):
return ValueError("Fuel not defined")
else:
self.fuel = Propellant(fuels_phases[fuel][0])
self.fuel_name = fuel
if not oxidiser in oxidisers_phases.keys():
return ValueError("Oxidiser not defined")
else:
self.oxidiser = Propellant(oxidisers_phases[oxidiser][0])
self.oxidiser_name = oxidiser
combo_data(self, "combos")
propellant_data(self.fuel, fuel)
propellant_data(self.oxidiser, oxidiser)
self.temperature = temperature
self.pressure = pressure
self.OF_mass_ratio = self.OF_molar_ratio * \
oxidisers_phases[oxidiser][1] / fuels_phases[fuel][1]
if self.fuel.pressure(self.temperature) > self.pressure:
print("Fuel will self-pressurise to greater than specified pressure")
input("Input any value to increase pressure to fuel vapour pressure ")
if input != "":
self.pressure = self.fuel.pressure(self.temperature)
if self.oxidiser.pressure(self.temperature) > self.pressure:
print("Oxidiser will self-pressurise to greater than specified pressure")
input("Input any value to increase pressure to oxidiser vapour pressure ")
if input != "":
self.pressure = self.oxidiser.pressure(self.temperature)
if self.pressure != pressure:
print("New pressure is "+str(round(self.pressure, 2))+" bar")
class Pressurant(object):
def __init__(self, name, molar_mass, R):
self.name = name
self.molar_mass = molar_mass
self.R = R