示例#1
0
    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")
示例#2
0
    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")
示例#3
0
    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)
示例#4
0
    def test_engine_isp(self):
        engine = document.Engine("test Name")

        self.assertEqual(engine.Isp, 0)

        engine.Isp = 169
        self.assertAlmostEqual(engine.Isp, 169)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
    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
示例#9
0
    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)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
 def test_engine_t_burn(self):
     engine = document.Engine("test Name")
     engine.t_burn = 123.456
     self.assertAlmostEqual(engine.t_burn, 123.456)
示例#13
0
 def __init__(self):
     self.engine = rdoc.Engine("Imported RASP Egine")
示例#14
0
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
示例#15
0
    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)
示例#16
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)
示例#17
0
 def test_engine_ve(self):
     engine = document.Engine("test Name")
     engine.Isp = 123
     self.assertAlmostEqual(engine.V_e, 1206.21795)
示例#18
0
 def __init__(self):
     self.engine = rdoc.Engine("Imported RockSim Engine")