def test_engine_name_slug(self): # replace spaces with dashes engine = document.Engine("My Rocket Motor 12") self.assertEqual(engine.name_slug, "my-rocket-motor-12") # one word, not much to do engine = document.Engine("Motor") self.assertEqual(engine.name_slug, "motor") # trailing space engine = document.Engine("Motor ") self.assertEqual(engine.name_slug, "motor") # leading space engine = document.Engine(" Motor") self.assertEqual(engine.name_slug, "motor") # blank name engine = document.Engine("") self.assertEqual(engine.name_slug, "engine") # blank name engine = document.Engine(" ") self.assertEqual(engine.name_slug, "engine") # blank name engine = document.Engine(" ") self.assertEqual(engine.name_slug, "engine") # Illegal characters engine = document.Engine("my **engIne: ") self.assertEqual(engine.name_slug, "my-engine")
def test_engine_name(self): engine = document.Engine("test Name") self.assertEqual(engine.name, "test Name") self.assertEqual(engine.manufacturer, "") engine.manufacturer = "python" self.assertEqual(engine.manufacturer, "python")
def test_write_simple_raspengine(self): engine = rdoc.Engine("test engine") engine.manufacturer = "Open Aerospace" engine.length = 0.1 engine.diameter = 0.2 engine.Isp = 169 engine.m_prop = 1.0 engine.thrust_avg = 1000 str_file = writers.RaspEngine().dump(engine) # smoke test self.assertGreater(len(str_file), 10) # re-read into loader, it should still parse eng_loader = loaders.RaspEngine() reloaded_motor = eng_loader.load(str_file) self.assertGreater(len(reloaded_motor.comments), 0) self.assertEqual(reloaded_motor.name, "test-engine") self.assertEqual(reloaded_motor.manufacturer, "Open-Aerospace") self.assertAlmostEqual(reloaded_motor.diameter, 0.2) self.assertAlmostEqual(reloaded_motor.length, 0.1) self.assertAlmostEqual(reloaded_motor.m_prop, 1.0) self.assertAlmostEqual(reloaded_motor.m_init, 1.0) self.assertAlmostEqual(reloaded_motor.thrust_avg, 1000.0, places=1) self.assertAlmostEqual(reloaded_motor.I_total, 1105.0, places=0) self.assertAlmostEqual(reloaded_motor.t_burn, 1.105) self.assertAlmostEqual(reloaded_motor.thrust_peak, 1000.0) self.assertAlmostEqual(reloaded_motor.m_frac, 100.00, places=2)
def test_engine_isp(self): engine = document.Engine("test Name") self.assertEqual(engine.Isp, 0) engine.Isp = 169 self.assertAlmostEqual(engine.Isp, 169)
def test_write_simple_JSBSimAircraft(self): rocket = rdoc.Rocket("Rocket") stage0 = rdoc.Stage("Sustainer") body = rdoc.Bodytube("body", 1, 0.2, diameter=0.33) engine = rdoc.Engine("test engine") engine.manufacturer = "Open Aerospace" engine.length = 0.1 engine.diameter = 0.2 engine.Isp = 169 engine.m_prop = 1.0 engine.thrust_avg = 1000 body.components = [engine] stage0.components = [ rdoc.Nosecone(rdoc.Noseshape.VONKARMAN, 1, 0.2, 1.0), body ] rocket.stages = [stage0] rocket.aero_properties['CD'] = [(0.1, 0.8), (0.5, 0.6), (1.0, 0.8)] str_file = writers.JSBSimAircraft.dump(rocket) # print(str_file) # smoke test self.assertGreater(len(str_file), 150)
def test_engine_length(self): engine = document.Engine("test") # length not set self.assertEqual(engine.length, 0) # set directly engine.length = 25.4 self.assertEqual(engine.length, 25.4)
def test_engine_avgthrust(self): engine = document.Engine("test Name") self.assertEqual(engine.thrust_avg, 0) engine.thrustcurve.append({'t': 0, 'thrust': 500}) engine.thrustcurve.append({'t': 1, 'thrust': 500}) self.assertAlmostEqual(engine.thrust_avg, 500)
def __init__(self, Isp, thrust, impulse, CD): """Take variables as input, build a rocket""" # Create an engine document engine = document.Engine('Motor') # Set our design engine.Isp = Isp engine.thrust_avg = thrust engine.I_total = impulse # volume of propellent needed prop_volume = engine.m_prop / self.prop_density # Solve for the radius/length of the fuel grain (assume solid, end burning) engine.diameter = 2 * (prop_volume / (2 * self.LD * pi))**(1 / 3.0) engine.length = engine.diameter * self.LD # Add a nose nose = document.Nosecone( document.Noseshape.TANGENT_OGIVE, # Shape 1.0, # shape_parameter 3.5, # mass engine.diameter * self.Nose_LD, # Length diameter=engine.diameter, ) # Payload section payload = document.Bodytube( "Payload", # Name 3.5, # mass 0.33, # length, fixed diameter=engine.diameter, ) # Body section the size of the engine body = document.Bodytube( "Body", # Name 20.0, # mass engine.length, diameter=engine.diameter, ) body.components = [engine] # Rocket: rocket = document.Rocket("Rocket") rocket.aero_properties['CD'] = CD stage0 = document.Stage("Sustainer") stage0.components = [nose, payload, body] rocket.stages = [stage0] self.rocket = rocket
def test_write_simple_JSBSimEngine(self): engine = rdoc.Engine("test engine") engine.manufacturer = "Open Aerospace" engine.length = 0.1 engine.diameter = 0.2 engine.Isp = 169 engine.m_prop = 1.0 engine.thrust_avg = 1000 str_file = writers.JSBSimEngine.dump(engine) # print(str_file) # smoke test self.assertGreater(len(str_file), 50)
def test_engine_simple_1(self): engine = document.Engine("test Name") # minimum to set up real engine engine.Isp = 123 engine.thrust_avg = 4567 engine.I_total = 15000 self.assertAlmostEqual(engine.Isp, 123) self.assertAlmostEqual(engine.thrust_avg, 4567) self.assertAlmostEqual(engine.I_total, 15000) self.assertAlmostEqual(engine.m_prop, 12.435563572901) self.assertAlmostEqual(engine.t_burn, 3.2844317932997593) self.assertAlmostEqual(engine.thrust_peak, 4567) self.assertAlmostEqual(engine.V_e, 1206.21795)
def test_engine_simple_0(self): engine = document.Engine("test Name") # minimum to set up real engine engine.Isp = 123 engine.thrust_avg = 4567 engine.t_burn = 89 self.assertAlmostEqual(engine.Isp, 123) self.assertAlmostEqual(engine.thrust_avg, 4567) self.assertAlmostEqual(engine.t_burn, 89) self.assertAlmostEqual(engine.m_prop, 336.9730984354) self.assertAlmostEqual(engine.I_total, 406463) self.assertAlmostEqual(engine.thrust_peak, 4567) self.assertAlmostEqual(engine.V_e, 1206.21795)
def test_engine_t_burn(self): engine = document.Engine("test Name") engine.t_burn = 123.456 self.assertAlmostEqual(engine.t_burn, 123.456)
def __init__(self): self.engine = rdoc.Engine("Imported RASP Egine")
def rocket(): # parametric thrust curve: peak_thrust = random.uniform(3000, 4200) delay_time = random.uniform(0.5, 30.0) min_thrust = random.uniform(0.5, 1.0) growth_rate = random.uniform(1.01, 2.5) engine = document.Engine("Motor") engine.m_prop = 70.0 # kg engine.diameter = 0.28 engine.length = 1.5 isp = 244 max_impulse = engine.m_prop * isp * 9.8 thrust = 1.0 thrustcurve = [] itot = 0 for i in range(500): t = i * 0.1 if t > delay_time: thrust = min_thrust * growth_rate**(t - delay_time) if thrust > 1.0: thrust = 1.0 thrust_N = thrust * peak_thrust # compute Total impulse if i > 0: x = thrustcurve[-1]['t'] x_1 = t f_x = thrustcurve[-1]['thrust'] f_x1 = thrust_N itot += ((x_1 - x) * (f_x1 + f_x)) / 2.0 thrustcurve.append({'t': t, 'thrust': thrust_N}) # When we exceed our impulse budget quit if itot > max_impulse: break engine.thrustcurve = thrustcurve body.components = [engine] # Rocket: rocket = document.Rocket("Rocket") rocket.aero_properties['CD'] = [ (0.010, 0.699865), (0.200, 0.580362), (0.300, 0.586504), (0.400, 0.595115), (0.500, 0.606208), (0.600, 0.619801), (0.700, 0.635912), (0.800, 0.654567), (0.900, 0.675792), (0.950, 0.681607), (1.000, 0.688266), (1.050, 0.725044), (1.100, 0.722610), (1.200, 0.657679), (1.300, 0.595412), (1.400, 0.572275), (1.500, 0.550839), (1.600, 0.530843), (1.700, 0.512105), (1.800, 0.494492), (1.900, 0.477901), (2.000, 0.462252), ] stage0 = document.Stage("Sustainer") stage0.components = [nose, payload, body] rocket.stages = [stage0] return rocket
def test_engine_nar_code(self): # blank engine case engine = document.Engine("test Name") self.assertEqual(engine.nar_code, "") # NAR B motor spec: 2.51 –- 5.00 Ns # 0% B motor, it's almost zero engine.thrust_avg = 2.501 engine.t_burn = 1 self.assertEqual(engine.nar_code, "B") self.assertAlmostEqual(engine.nar_percent, 0, places=1) # 50% B motor engine.thrust_avg = 3.755 engine.t_burn = 1 self.assertEqual(engine.nar_code, "B") self.assertAlmostEqual(engine.nar_percent, 50, places=0) # 100% B motor, but it rounds up, that's okay I guess engine.thrust_avg = 4.99999 engine.t_burn = 1 self.assertEqual(engine.nar_code, "B") self.assertAlmostEqual(engine.nar_percent, 100, places=0) # NAR N motor spec: 10,200 -- 20,500 Ns # 0% N motor engine.thrust_avg = 10200 engine.t_burn = 1 engine.nar_percent self.assertEqual(engine.nar_code, "M") self.assertAlmostEqual(engine.nar_percent, 99, places=0) # 50% N motor engine.thrust_avg = 10240 + 5150 engine.t_burn = 1 self.assertEqual(engine.nar_code, "N") self.assertAlmostEqual(engine.nar_percent, 50, places=0) # 100% N motor engine.thrust_avg = 20450 engine.t_burn = 1 self.assertEqual(engine.nar_code, "N") self.assertAlmostEqual(engine.nar_percent, 100, places=0) # NAR Z motor spec: 41,900,000 -- 83,900,000 Ns # 0% N motor engine.thrust_avg = 41.9e6 engine.t_burn = 1 engine.nar_percent self.assertEqual(engine.nar_code, "Y") self.assertAlmostEqual(engine.nar_percent, 100, places=0) # 50% N motor engine.thrust_avg = 41.9e6 + 10e6 engine.t_burn = 1 self.assertEqual(engine.nar_code, "Z") self.assertAlmostEqual(engine.nar_percent, 24, places=0) # 100% N motor engine.thrust_avg = 83.8e6 engine.t_burn = 1 self.assertEqual(engine.nar_code, "Z") self.assertAlmostEqual(engine.nar_percent, 100, places=0) # Greater than Z: engine.thrust_avg = 500e6 engine.t_burn = 1 self.assertEqual(engine.nar_code, "AC") self.assertAlmostEqual(engine.nar_percent, 49, places=0)
def test_write_blank_rocksimEngine(self): engine = rdoc.Engine("test engine") str_file = writers.RockSimEngine().dump(engine) # smoketest self.assertGreater(len(str_file), 50)
def test_engine_ve(self): engine = document.Engine("test Name") engine.Isp = 123 self.assertAlmostEqual(engine.V_e, 1206.21795)
def __init__(self): self.engine = rdoc.Engine("Imported RockSim Engine")