Esempio n. 1
0
    def _build_problem(self, designed_stream=1, complex=False):

        p = Problem()

        cycle = p.model = Cycle()

        cycle.set_input_defaults('start1.P', 9.218, units='psi')
        cycle.set_input_defaults('start1.T', 1524.32, units='degR')
        cycle.set_input_defaults('start1.MN', 0.4463)
        cycle.set_input_defaults('start1.W', 161.49, units='lbm/s')

        cycle.set_input_defaults('start2.P', 8.68, units='psi')
        cycle.set_input_defaults('start2.T', 524., units='degR')
        cycle.set_input_defaults('start2.MN', 0.4463)
        cycle.set_input_defaults('start2.W', 158., units='lbm/s')

        cycle.add_subsystem('start1', FlowStart(elements=AIR_FUEL_ELEMENTS))
        cycle.add_subsystem('start2', FlowStart(elements=AIR_ELEMENTS))

        cycle.add_subsystem(
            'mixer',
            Mixer(design=True,
                  designed_stream=designed_stream,
                  Fl_I1_elements=AIR_FUEL_ELEMENTS,
                  Fl_I2_elements=AIR_ELEMENTS))

        cycle.pyc_connect_flow('start1.Fl_O', 'mixer.Fl_I1')
        cycle.pyc_connect_flow('start2.Fl_O', 'mixer.Fl_I2')

        p.setup(force_alloc_complex=complex)

        p.set_solver_print(level=-1)

        return p
Esempio n. 2
0
    def test_mix_diff(self):
        # mix two identical streams and make sure you get twice the area and the same total pressure

        thermo = Thermo(janaf, AIR_MIX)

        p = Problem()

        p.model.set_input_defaults('start1.P', 17., units='psi')
        p.model.set_input_defaults('start2.P', 15., units='psi')
        p.model.set_input_defaults('T', 500., units='degR')
        p.model.set_input_defaults('MN', 0.5)
        p.model.set_input_defaults('W', 100., units='lbm/s')

        p.model.add_subsystem('start1', FlowStart(), promotes=['MN', 'T', 'W'])
        p.model.add_subsystem('start2', FlowStart(), promotes=['MN', 'T', 'W'])

        p.model.add_subsystem(
            'mixer',
            Mixer(design=True, Fl_I1_elements=AIR_MIX, Fl_I2_elements=AIR_MIX))

        connect_flow(p.model, 'start1.Fl_O', 'mixer.Fl_I1')
        connect_flow(p.model, 'start2.Fl_O', 'mixer.Fl_I2')

        p.set_solver_print(level=-1)

        p.setup()
        p.run_model()
        tol = 2e-7
        assert_near_equal(p['mixer.Fl_O:stat:area'],
                          653.2652635,
                          tolerance=tol)
        assert_near_equal(p['mixer.Fl_O:tot:P'], 15.94216641, tolerance=tol)
        assert_near_equal(p['mixer.ER'], 1.1333333333, tolerance=tol)
Esempio n. 3
0
    def test_case2(self):

        with self.assertRaises(ValueError) as cm:

            p = Problem()
            p.model = FlowStart(elements=AIR_MIX,
                                use_WAR=True,
                                thermo_data=species_data.janaf)
            p.model.set_input_defaults('WAR', .01)
            p.setup()

        self.assertEqual(
            str(cm.exception),
            "The provided elements to FlightConditions do not contain H2O. In order to specify a nonzero WAR the elements must contain H2O."
        )

        with self.assertRaises(ValueError) as cm:

            prob = Problem()
            prob.model = FlowStart(elements=WET_AIR_MIX,
                                   use_WAR=False,
                                   thermo_data=species_data.janaf)
            prob.setup()

        self.assertEqual(
            str(cm.exception),
            "In order to provide elements containing H2O, a nonzero water to air ratio (WAR) must be specified. Please set the option use_WAR to True."
        )
Esempio n. 4
0
    def test_mix_diff(self):
        # mix two identical streams and make sure you get twice the area and the same total pressure

        p = Problem()
        cycle = p.model = Cycle()
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = janaf

        cycle.set_input_defaults('start1.P', 17., units='psi')
        cycle.set_input_defaults('start2.P', 15., units='psi')
        cycle.set_input_defaults('T', 500., units='degR')
        cycle.set_input_defaults('MN', 0.5)
        cycle.set_input_defaults('W', 100., units='lbm/s')

        cycle.add_subsystem('start1', FlowStart(), promotes=['MN', 'T', 'W'])
        cycle.add_subsystem('start2', FlowStart(), promotes=['MN', 'T', 'W'])

        cycle.add_subsystem('mixer', Mixer(design=True))

        cycle.pyc_connect_flow('start1.Fl_O', 'mixer.Fl_I1')
        cycle.pyc_connect_flow('start2.Fl_O', 'mixer.Fl_I2')

        p.set_solver_print(level=-1)

        p.setup()
        p.run_model()
        tol = 1e-6
        assert_near_equal(p['mixer.Fl_O:stat:area'],
                          653.26524074,
                          tolerance=tol)
        assert_near_equal(p['mixer.Fl_O:tot:P'], 15.89206597, tolerance=tol)
        assert_near_equal(p['mixer.ER'], 1.1333333333, tolerance=tol)
Esempio n. 5
0
    def setUp(self):

        self.prob = Problem()

        des_vars = self.prob.model.add_subsystem('des_vars', IndepVarComp(), promotes=['*'])
        des_vars.add_output('P', 17., units='psi')
        des_vars.add_output('T', 500., units='degR')
        des_vars.add_output('MN', 0.5)
        des_vars.add_output('W', 10., units='lbm/s')
        des_vars.add_output('PR', 6.)
        des_vars.add_output('eff', 0.9)
        self.prob.model.connect("P", "flow_start.P")
        self.prob.model.connect("T", "flow_start.T")
        self.prob.model.connect("W", "flow_start.W")
        self.prob.model.connect("MN", "compressor.MN")
        self.prob.model.connect('PR', 'compressor.PR')
        self.prob.model.connect('eff', 'compressor.eff')

        self.prob.model.add_subsystem('flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem('compressor', Compressor(design=True, elements=AIR_MIX))

        connect_flow(self.prob.model, "flow_start.Fl_O", "compressor.Fl_I")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 6
0
    def setUp(self):

        self.prob = Problem()
        self.prob.model = Group()

        des_vars = self.prob.model.add_subsystem('des_vars', IndepVarComp(), promotes=['*'])
        des_vars.add_output('P', 17, units='psi')
        des_vars.add_output('T', 500.0, units='degR')
        des_vars.add_output('MN', 0.5)
        des_vars.add_output('W', 1., units='lbm/s')
        des_vars.add_output('V', 1., units='ft/s')

        self.prob.model.add_subsystem('flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem('inlet', Inlet(elements=AIR_MIX))

        # total and static
        fl_src = "flow_start.Fl_O"
        fl_target = "inlet.Fl_I"
        for v_name in ('h', 'T', 'P', 'S', 'rho', 'gamma', 'Cp', 'Cv', 'n'):
            self.prob.model.connect('%s:tot:%s' % (
                fl_src, v_name), '%s:tot:%s' % (fl_target, v_name))

        # no prefix
        for v_name in ('W', ):  # ('Wc', 'W', 'FAR'):
            self.prob.model.connect('%s:stat:%s' % (
                fl_src, v_name), '%s:stat:%s' % (fl_target, v_name))

        self.prob.model.connect("P", "flow_start.P")
        self.prob.model.connect("T", "flow_start.T")
        self.prob.model.connect("MN", "inlet.MN")
        self.prob.model.connect("W", "flow_start.W")
        self.prob.model.connect("V", "inlet.Fl_I:stat:V")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 7
0
    def setup(self):
        thermo_data = self.options['thermo_data']
        elements = self.options['elements']

        self.add_subsystem('fs', FlowStart(thermo_data=thermo_data, elements=elements), promotes_outputs=['Fl_O:*'], promotes_inputs=['W'] )

        balance = om.BalanceComp()
        balance.add_balance('P', val=10., units='psi', eq_units='psi', lhs_name='Ps_computed', rhs_name='Ps', lower=1e-1)
                            #guess_func=lambda inputs, resids: 5.)
        balance.add_balance('T', val=800., units='degR', eq_units='ft/s', lhs_name='V_computed', rhs_name='V', lower=1e-1)
                            #guess_func=lambda inputs, resids: 400.)
        balance.add_balance('MN', val=.3, eq_units='inch**2', lhs_name='area_computed', rhs_name='area', lower=1e-6)
                            #guess_func=lambda inputs, resids: .6)

        self.add_subsystem('balance', balance, promotes_inputs=['Ps', 'V', 'area'])
        self.connect('Fl_O:stat:P', 'balance.Ps_computed')
        self.connect('Fl_O:stat:V', 'balance.V_computed')
        self.connect('Fl_O:stat:area', 'balance.area_computed')

        self.connect('balance.P', 'fs.P')
        self.connect('balance.T', 'fs.T')
        self.connect('balance.MN', 'fs.MN')

        newton = self.nonlinear_solver = om.NewtonSolver()
        newton.options['solve_subsystems'] = True
        newton.options['maxiter'] = 10
        # newton.linesearch = BoundsEnforceLS()
        # newton.linesearch.options['print_bound_enforce'] = True

        self.linear_solver = om.DirectSolver(assemble_jac=True)
Esempio n. 8
0
    def setUp(self):

        thermo = Thermo(janaf, AIR_MIX)

        self.prob = Problem()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem('splitter', Splitter(elements=AIR_MIX))

        self.prob.model.set_input_defaults('flow_start.P', 17., units='psi')
        self.prob.model.set_input_defaults('flow_start.T', 500., units='degR')
        self.prob.model.set_input_defaults('splitter.MN1', 0.5)
        self.prob.model.set_input_defaults('splitter.MN2', 0.5)
        self.prob.model.set_input_defaults('flow_start.W', 10., units='lbm/s')

        #total and static
        fl_src = "flow_start.Fl_O"
        fl_target = "splitter.Fl_I"
        for v_name in ('h', 'T', 'P', 'S', 'rho', 'gamma', 'Cp', 'Cv', 'n'):
            self.prob.model.connect('%s:tot:%s' % (fl_src, v_name),
                                    '%s:tot:%s' % (fl_target, v_name))
        # no prefix
        for v_name in ('W', ):
            self.prob.model.connect('%s:stat:%s' % (fl_src, v_name),
                                    '%s:stat:%s' % (fl_target, v_name))

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 9
0
    def setUp(self):

        self.prob = Problem()
        cycle = self.prob.model = Cycle()
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = janaf

        # cycle.options['thermo_method'] = 'TABULAR'
        # cycle.options['thermo_data'] = AIR_JETA_TAB_SPEC

        cycle.set_input_defaults('flow_start.P', 17, units='psi')
        cycle.set_input_defaults('flow_start.T', 500.0, units='degR')
        cycle.set_input_defaults('inlet.MN', 0.5)
        cycle.set_input_defaults('inlet.Fl_I:stat:V', 1., units='ft/s')
        cycle.set_input_defaults('flow_start.W', 1., units='lbm/s')

        cycle.add_subsystem('flow_start', FlowStart())
        cycle.add_subsystem('inlet', Inlet())

        # total and static
        fl_src = "flow_start.Fl_O"
        fl_target = "inlet.Fl_I"
        cycle.pyc_connect_flow("flow_start.Fl_O", "inlet.Fl_I")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False, force_alloc_complex=True)
Esempio n. 10
0
    def test_fs_with_water(self):

        prob = Problem()
        prob.model.set_input_defaults('fl_start.P', 17., units='psi')
        prob.model.set_input_defaults('fl_start.T', 500., units='degR')
        prob.model.set_input_defaults('fl_start.MN', 0.5)
        prob.model.set_input_defaults('fl_start.W', 100., units='lbm/s')
        prob.model.set_input_defaults('fl_start.WAR', .01)

        prob.model.add_subsystem(
            'fl_start',
            FlowStart(thermo_data=species_data.wet_air,
                      elements=WET_AIR_ELEMENTS,
                      use_WAR=True))

        prob.set_solver_print(level=-1)
        prob.setup(check=False)

        prob.run_model()

        tol = 1e-5
        assert_near_equal(prob['fl_start.Fl_O:tot:composition'][0],
                          3.18139345e-04, tol)
        assert_near_equal(prob['fl_start.Fl_O:tot:composition'][1],
                          1.08367806e-05, tol)
        assert_near_equal(prob['fl_start.Fl_O:tot:composition'][2],
                          1.77859e-03, tol)
        assert_near_equal(prob['fl_start.Fl_O:tot:composition'][3],
                          5.305198e-02, tol)
        assert_near_equal(prob['fl_start.Fl_O:tot:composition'][4],
                          1.51432e-02, tol)
Esempio n. 11
0
    def setUp(self):

        self.prob = Problem()
        self.prob.model = Cycle()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_ELEMENTS))
        self.prob.model.add_subsystem(
            'turbine',
            Turbine(map_data=LPT2269, design=True, elements=AIR_ELEMENTS))

        self.prob.model.set_input_defaults('turbine.Nmech',
                                           1000.0,
                                           units='rpm')
        self.prob.model.set_input_defaults('flow_start.MN', 0.0)
        self.prob.model.set_input_defaults('turbine.PR', 4.0)
        self.prob.model.set_input_defaults('turbine.MN', 0.0)
        self.prob.model.set_input_defaults('flow_start.P', 17.0, units='psi')
        self.prob.model.set_input_defaults('flow_start.T', 500.0, units='degR')
        self.prob.model.set_input_defaults('flow_start.W',
                                           100.0,
                                           units='lbm/s')
        self.prob.model.set_input_defaults('turbine.eff', 0.9)

        self.prob.model.pyc_connect_flow('flow_start.Fl_O', 'turbine.Fl_I')

        self.prob.setup(check=False, force_alloc_complex=True)
        self.prob.set_solver_print(level=-1)
Esempio n. 12
0
    def setUp(self):

        thermo = Thermo(janaf, AIR_FUEL_MIX)

        self.prob = Problem()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'burner',
            Combustor(thermo_data=janaf,
                      inflow_elements=AIR_MIX,
                      air_fuel_elements=AIR_FUEL_MIX,
                      fuel_type="JP-7"))
        self.prob.model.add_subsystem(
            'turbine',
            Turbine(map_data=LPT2269, design=False, elements=AIR_FUEL_MIX))

        self.prob.model.set_input_defaults('burner.MN', .01, units=None)
        self.prob.model.set_input_defaults('burner.Fl_I:FAR', .01, units=None)
        self.prob.model.set_input_defaults('turbine.Nmech', 1000.,
                                           units='rpm'),
        self.prob.model.set_input_defaults('flow_start.P', 17., units='psi'),
        self.prob.model.set_input_defaults('flow_start.T', 500.0,
                                           units='degR'),
        self.prob.model.set_input_defaults('flow_start.W', 0., units='lbm/s'),
        self.prob.model.set_input_defaults('turbine.area',
                                           150.,
                                           units='inch**2')

        connect_flow(self.prob.model, "flow_start.Fl_O", "burner.Fl_I")
        connect_flow(self.prob.model, "burner.Fl_O", "turbine.Fl_I")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 13
0
    def test_mix_air_with_airfuel(self):

        p = Problem()

        cycle = p.model = Cycle()
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = janaf

        cycle.set_input_defaults('start1.P', 9.218, units='psi')
        cycle.set_input_defaults('start1.T', 1524.32, units='degR')
        cycle.set_input_defaults('start1.MN', 0.4463)
        cycle.set_input_defaults('start1.W', 161.49, units='lbm/s')

        cycle.set_input_defaults('start2.P', 8.68, units='psi')
        cycle.set_input_defaults('start2.T', 524., units='degR')
        cycle.set_input_defaults('start2.MN', 0.4463)
        cycle.set_input_defaults('start2.W', 158., units='lbm/s')

        cycle.add_subsystem('start1',
                            FlowStart(composition=CEA_AIR_FUEL_COMPOSITION))
        cycle.add_subsystem('start2',
                            FlowStart(composition=CEA_AIR_COMPOSITION))

        cycle.add_subsystem('mixer', Mixer(design=True, designed_stream=1))

        cycle.pyc_connect_flow('start1.Fl_O', 'mixer.Fl_I1')
        cycle.pyc_connect_flow('start2.Fl_O', 'mixer.Fl_I2')

        p.setup(force_alloc_complex=True)

        p.set_solver_print(level=-1)

        p.run_model()

        tol = 1e-6
        assert_near_equal(p['mixer.Fl_O:stat:area'],
                          2786.86877031,
                          tolerance=tol)
        assert_near_equal(p['mixer.Fl_O:tot:P'], 8.87520497, tolerance=tol)
        assert_near_equal(p['mixer.ER'], 1.06198157, tolerance=tol)

        partials = p.check_partials(
            includes=['mixer.area_calc*', 'mixer.mix_flow*', 'mixer.imp_out*'],
            out_stream=None,
            method='cs')
        assert_check_partials(partials, atol=1e-8, rtol=1e-8)
Esempio n. 14
0
    def test_case1(self):

        thermo = Thermo(janaf, constants.AIR_MIX)

        self.prob = Problem()
        self.prob.model = Group()
        self.prob.model.add_subsystem('flow_start',
                                      FlowStart(thermo_data=janaf,
                                                elements=AIR_MIX),
                                      promotes=['MN', 'P', 'T'])
        self.prob.model.add_subsystem('duct',
                                      Duct(elements=AIR_MIX),
                                      promotes=['MN'])

        connect_flow(self.prob.model, 'flow_start.Fl_O', 'duct.Fl_I')

        self.prob.model.set_input_defaults('MN', 0.5)
        self.prob.model.set_input_defaults('duct.dPqP', 0.0)
        self.prob.model.set_input_defaults('P', 17., units='psi')
        self.prob.model.set_input_defaults('T', 500., units='degR')
        self.prob.model.set_input_defaults('flow_start.W', 500., units='lbm/s')

        self.prob.setup(check=False)
        self.prob.set_solver_print(level=-1)

        # 6 cases to check against
        for i, data in enumerate(ref_data):

            self.prob['duct.dPqP'] = data[h_map['dPqP']]

            # input flowstation
            self.prob['P'] = data[h_map['Fl_I.Pt']]
            self.prob['T'] = data[h_map['Fl_I.Tt']]
            self.prob['MN'] = data[h_map['Fl_O.MN']]
            self.prob['flow_start.W'] = data[h_map['Fl_I.W']]
            self.prob['duct.Fl_I:stat:V'] = data[h_map['Fl_I.V']]

            # give a decent initial guess for Ps

            print(i, self.prob['P'], self.prob['T'], self.prob['MN'])

            self.prob.run_model()

            # check outputs
            pt, ht, ps, ts = data[h_map['Fl_O.Pt']], data[h_map[
                'Fl_O.ht']], data[h_map['Fl_O.Ps']], data[h_map['Fl_O.Ts']]
            pt_computed = self.prob['duct.Fl_O:tot:P']
            ht_computed = self.prob['duct.Fl_O:tot:h']
            ps_computed = self.prob['duct.Fl_O:stat:P']
            ts_computed = self.prob['duct.Fl_O:stat:T']

            tol = 2.0e-2
            assert_near_equal(pt_computed, pt, tol)
            assert_near_equal(ht_computed, ht, tol)
            assert_near_equal(ps_computed, ps, tol)
            assert_near_equal(ts_computed, ts, tol)

            check_element_partials(self, self.prob)
Esempio n. 15
0
    def setup(self):
        thermo_method = self.options['thermo_method']
        thermo_data = self.options['thermo_data']
        elements = self.options['elements']
        use_WAR = self.options['use_WAR']

        self.add_subsystem('ambient', Ambient(),
                           promotes=('alt', 'dTs'))  # inputs

        conv = self.add_subsystem('conv', om.Group(), promotes=['*'])
        if use_WAR == True:
            proms = ['Fl_O:*', 'MN', 'W', 'WAR']
        else:
            proms = ['Fl_O:*', 'MN', 'W']
        conv.add_subsystem('fs',
                           FlowStart(thermo_method=thermo_method,
                                     thermo_data=thermo_data,
                                     elements=elements,
                                     use_WAR=use_WAR),
                           promotes=proms)
        balance = conv.add_subsystem('balance', om.BalanceComp())
        balance.add_balance('Tt',
                            val=500.0,
                            lower=1e-4,
                            units='degR',
                            desc='Total temperature',
                            eq_units='degR')
        balance.add_balance('Pt',
                            val=14.696,
                            lower=1e-4,
                            units='psi',
                            desc='Total pressure',
                            eq_units='psi')
        # sub.set_order(['fs','balance'])

        newton = conv.nonlinear_solver = om.NewtonSolver()
        newton.options['atol'] = 1e-10
        newton.options['rtol'] = 1e-10
        newton.options['maxiter'] = 10
        newton.options['iprint'] = -1
        newton.options['solve_subsystems'] = True
        newton.options['reraise_child_analysiserror'] = False
        newton.linesearch = om.BoundsEnforceLS()
        newton.linesearch.options['bound_enforcement'] = 'scalar'

        newton.linesearch.options['iprint'] = -1
        # newton.linesearch.options['solve_subsystems'] = True

        conv.linear_solver = om.DirectSolver(assemble_jac=True)

        self.connect('ambient.Ps', 'balance.rhs:Pt')
        self.connect('ambient.Ts', 'balance.rhs:Tt')

        self.connect('balance.Pt', 'fs.P')
        self.connect('balance.Tt', 'fs.T')

        self.connect('Fl_O:stat:P', 'balance.lhs:Pt')
        self.connect('Fl_O:stat:T', 'balance.lhs:Tt')
Esempio n. 16
0
    def setUp(self):

        self.prob = Problem()

        des_vars = self.prob.model.add_subsystem('des_vars',
                                                 IndepVarComp(),
                                                 promotes=['*'])
        des_vars.add_output('P', 17., units='psi')
        des_vars.add_output('T', 500., units='degR')
        des_vars.add_output('W', 0., units='lbm/s')
        des_vars.add_output('Nmech', 0., units='rpm')
        des_vars.add_output('area_targ', 50., units='inch**2')

        des_vars.add_output('s_PR', val=1.)
        des_vars.add_output('s_eff', val=1.)
        des_vars.add_output('s_Wc', val=1.)
        des_vars.add_output('s_Nc', val=1.)
        des_vars.add_output('alphaMap', val=0.)

        self.prob.model.connect("P", "flow_start.P")
        self.prob.model.connect("T", "flow_start.T")
        self.prob.model.connect("W", "flow_start.W")
        self.prob.model.connect("Nmech", "compressor.Nmech")
        self.prob.model.connect("area_targ", "compressor.area")

        self.prob.model.connect("s_PR", "compressor.s_PR")
        self.prob.model.connect("s_eff", "compressor.s_eff")
        self.prob.model.connect("s_Wc", "compressor.s_Wc")
        self.prob.model.connect("s_Nc", "compressor.s_Nc")
        self.prob.model.connect('alphaMap', 'compressor.map.alphaMap')

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'compressor',
            Compressor(map_data=AXI5,
                       design=False,
                       elements=AIR_MIX,
                       map_extrap=False))

        connect_flow(self.prob.model, "flow_start.Fl_O", "compressor.Fl_I")

        newton = self.prob.model.nonlinear_solver = NewtonSolver()
        newton.options['atol'] = 1e-8
        newton.options['rtol'] = 1e-8
        newton.options['iprint'] = 2
        newton.options['maxiter'] = 10
        newton.options['solve_subsystems'] = True
        newton.options['max_sub_solves'] = 10
        newton.linesearch = BoundsEnforceLS()
        newton.linesearch.options['bound_enforcement'] = 'scalar'
        newton.linesearch.options['iprint'] = -1

        self.prob.model.linear_solver = DirectSolver(assemble_jac=True)

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 17
0
    def setup_helper(self, NozzType, LossType):

        self.prob = Problem()
        self.prob.model = Group()

        des_vars = self.prob.model.add_subsystem('des_vars',
                                                 IndepVarComp(),
                                                 promotes=['*'])
        des_vars.add_output('Pt', 17.0, units='psi')
        des_vars.add_output('Tt', 500.0, units='degR')
        des_vars.add_output('W', 0.0, units='lbm/s')
        des_vars.add_output('MN', 0.2)
        des_vars.add_output('Ps_exhaust', 17.0, units='psi')
        des_vars.add_output('Cv', 0.99)
        des_vars.add_output('Cfg', 0.99)

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'nozzle',
            Nozzle(nozzType=NozzType,
                   lossCoef=LossType,
                   thermo_data=janaf,
                   elements=AIR_MIX,
                   internal_solver=True))

        connect_flow(self.prob.model, "flow_start.Fl_O", "nozzle.Fl_I")

        self.prob.model.connect("Pt", "flow_start.P")
        self.prob.model.connect("Tt", "flow_start.T")
        self.prob.model.connect("W", "flow_start.W")
        self.prob.model.connect("MN", "flow_start.MN")
        self.prob.model.connect("Ps_exhaust", "nozzle.Ps_exhaust")

        if LossType == 'Cv':
            self.prob.model.connect("Cv", "nozzle.Cv")
        elif LossType == 'Cfg':
            self.prob.model.connect("Cfg", "nozzle.Cfg")

        # self.prob.model.connect("area_targ", "compressor.area")

        self.prob.set_solver_print(level=2)
        self.prob.setup(check=False)

        header = [
            'Cfg', 'Cv', 'PsExh', 'Fl_I.W', 'Fl_I.MN', 'Fl_I.s', 'Fl_I.Pt',
            'Fl_I.Tt', 'Fl_I.ht', 'Fl_I.rhot', 'Fl_I.gamt', 'Fl_O.MN',
            'Fl_O.s', 'Fl_O.Pt', 'Fl_O.Tt', 'Fl_O.ht', 'Fl_O.rhot',
            'Fl_O.gamt', 'Fl_O.Ps', 'Fl_Th.MN', 'Fl_Th.s', 'Fl_Th.Pt',
            'Fl_Th.Tt', 'Fl_Th.ht', 'Fl_Th.rhot', 'Fl_Th.gamt', 'Fl_Th.Ps',
            'Fl_Th.Aphy', 'Fg', 'FgIdeal', 'Vactual', 'AthCold', 'AR', 'PR'
        ]

        self.h_map = dict(((v_name, i) for i, v_name in enumerate(header)))
        self.fpath = os.path.dirname(os.path.realpath(__file__))
Esempio n. 18
0
    def test_mix_diff(self):
        # mix two identical streams and make sure you get twice the area and the same total pressure

        p = Problem()

        des_vars = p.model.add_subsystem('des_vars', IndepVarComp())
        des_vars.add_output('P1', 17., units='psi')
        des_vars.add_output('P2', 15., units='psi')
        des_vars.add_output('T', 500., units='degR')
        des_vars.add_output('W', 100., units='lbm/s')
        des_vars.add_output('MN', 0.5)

        p.model.add_subsystem('start1', FlowStart())
        p.model.add_subsystem('start2', FlowStart())

        p.model.connect('des_vars.P1', 'start1.P')
        p.model.connect('des_vars.P2', 'start2.P')
        p.model.connect('des_vars.T', ['start1.T', 'start2.T'])
        p.model.connect('des_vars.W', ['start1.W', 'start2.W'])
        p.model.connect('des_vars.MN', ['start1.MN', 'start2.MN'])

        p.model.add_subsystem(
            'mixer',
            Mixer(design=True, Fl_I1_elements=AIR_MIX, Fl_I2_elements=AIR_MIX))

        connect_flow(p.model, 'start1.Fl_O', 'mixer.Fl_I1')
        connect_flow(p.model, 'start2.Fl_O', 'mixer.Fl_I2')

        p.set_solver_print(level=-1)

        p.setup()
        p.run_model()
        tol = 2e-7
        assert_rel_error(self,
                         p['mixer.Fl_O:stat:area'],
                         653.2652635,
                         tolerance=tol)
        assert_rel_error(self,
                         p['mixer.Fl_O:tot:P'],
                         15.94216641,
                         tolerance=tol)
        assert_rel_error(self, p['mixer.ER'], 1.1333333333, tolerance=tol)
Esempio n. 19
0
    def _build_problem(self, designed_stream=1, complex=False):
        p = Problem()

        des_vars = p.model.add_subsystem('des_vars', IndepVarComp())
        des_vars.add_output('P1', 9.218, units='psi')
        des_vars.add_output('T1', 1524.32, units='degR')
        des_vars.add_output('W1', 161.49, units='lbm/s')
        des_vars.add_output('MN1', 0.4463)

        des_vars.add_output('P2', 8.68, units='psi')
        des_vars.add_output('T2', 524., units='degR')
        des_vars.add_output('W2', 158., units='lbm/s')
        des_vars.add_output('MN2', 0.4463)

        p.model.add_subsystem('start1', FlowStart(elements=AIR_FUEL_MIX))
        p.model.add_subsystem('start2', FlowStart(elements=AIR_MIX))

        p.model.connect('des_vars.P1', 'start1.P')
        p.model.connect('des_vars.T1', 'start1.T')
        p.model.connect('des_vars.W1', 'start1.W')
        p.model.connect('des_vars.MN1', 'start1.MN')

        p.model.connect('des_vars.P2', 'start2.P')
        p.model.connect('des_vars.T2', 'start2.T')
        p.model.connect('des_vars.W2', 'start2.W')
        p.model.connect('des_vars.MN2', 'start2.MN')

        p.model.add_subsystem(
            'mixer',
            Mixer(design=True,
                  designed_stream=designed_stream,
                  Fl_I1_elements=AIR_FUEL_MIX,
                  Fl_I2_elements=AIR_MIX))

        connect_flow(p.model, 'start1.Fl_O', 'mixer.Fl_I1')
        connect_flow(p.model, 'start2.Fl_O', 'mixer.Fl_I2')

        p.setup(force_alloc_complex=complex)

        p.set_solver_print(level=-1)

        return p
Esempio n. 20
0
    def test_mix_same(self):
        # mix two identical streams and make sure you get twice the area and the same total pressure

        p = Problem()

        cycle = p.model = Cycle()

        cycle.set_input_defaults('P', 17., units='psi')
        cycle.set_input_defaults('T', 500., units='degR')
        cycle.set_input_defaults('MN', 0.5)
        cycle.set_input_defaults('W', 100., units='lbm/s')

        cycle.add_subsystem('start1',
                            FlowStart(),
                            promotes=['P', 'T', 'MN', 'W'])
        cycle.add_subsystem('start2',
                            FlowStart(),
                            promotes=['P', 'T', 'MN', 'W'])

        cycle.add_subsystem(
            'mixer',
            Mixer(design=True,
                  Fl_I1_elements=AIR_ELEMENTS,
                  Fl_I2_elements=AIR_ELEMENTS))

        cycle.pyc_connect_flow('start1.Fl_O', 'mixer.Fl_I1')
        cycle.pyc_connect_flow('start2.Fl_O', 'mixer.Fl_I2')
        p.set_solver_print(level=-1)

        p.setup()
        p['mixer.balance.P_tot'] = 17
        p.run_model()
        tol = 2e-7
        assert_near_equal(p['mixer.Fl_O:stat:area'],
                          2 * p['start1.Fl_O:stat:area'],
                          tolerance=tol)
        assert_near_equal(p['mixer.Fl_O:tot:P'], p['P'], tolerance=tol)
        assert_near_equal(p['mixer.ER'], 1, tolerance=tol)
Esempio n. 21
0
    def test_case2(self):

        with self.assertRaises(ValueError) as cm:

            p = Problem()
            p.model = FlowStart(elements=AIR_ELEMENTS,
                                use_WAR=True,
                                thermo_data=species_data.janaf)
            p.model.set_input_defaults('WAR', .01)
            p.setup()

        self.assertEqual(
            str(cm.exception),
            'The provided elements to FlightConditions do not contain H or O. In order to specify a nonzero WAR the elements must contain both H and O.'
        )
Esempio n. 22
0
    def setup_helper(self, NozzType, LossType):

        thermo = Thermo(janaf, AIR_MIX)

        self.prob = Problem()
        self.prob.model = Group()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'nozzle',
            Nozzle(nozzType=NozzType,
                   lossCoef=LossType,
                   thermo_data=janaf,
                   elements=AIR_MIX,
                   internal_solver=True))

        self.prob.model.set_input_defaults('flow_start.P', 17.0, units='psi')
        self.prob.model.set_input_defaults('flow_start.T', 500.0, units='degR')
        self.prob.model.set_input_defaults('flow_start.MN', 0.2)
        self.prob.model.set_input_defaults('nozzle.Ps_exhaust',
                                           17.0,
                                           units='psi')
        self.prob.model.set_input_defaults('flow_start.W', 0.0, units='lbm/s')

        connect_flow(self.prob.model, "flow_start.Fl_O", "nozzle.Fl_I")

        if LossType == 'Cv':
            self.prob.model.set_input_defaults('nozzle.Cv', 0.99)
        elif LossType == 'Cfg':
            self.prob.model.set_input_defaults('nozzle.Cfg', 0.99)

        self.prob.set_solver_print(level=2)
        self.prob.setup(check=False)

        header = [
            'Cfg', 'Cv', 'PsExh', 'Fl_I.W', 'Fl_I.MN', 'Fl_I.s', 'Fl_I.Pt',
            'Fl_I.Tt', 'Fl_I.ht', 'Fl_I.rhot', 'Fl_I.gamt', 'Fl_O.MN',
            'Fl_O.s', 'Fl_O.Pt', 'Fl_O.Tt', 'Fl_O.ht', 'Fl_O.rhot',
            'Fl_O.gamt', 'Fl_O.Ps', 'Fl_Th.MN', 'Fl_Th.s', 'Fl_Th.Pt',
            'Fl_Th.Tt', 'Fl_Th.ht', 'Fl_Th.rhot', 'Fl_Th.gamt', 'Fl_Th.Ps',
            'Fl_Th.Aphy', 'Fg', 'FgIdeal', 'Vactual', 'AthCold', 'AR', 'PR'
        ]

        self.h_map = dict(((v_name, i) for i, v_name in enumerate(header)))
        self.fpath = os.path.dirname(os.path.realpath(__file__))
Esempio n. 23
0
    def test_case1(self):

        self.prob = Problem()
        cycle = self.prob.model = Cycle()
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = species_data.janaf

        cycle.add_subsystem('flow_start', FlowStart(), promotes=['MN', 'P', 'T'])
        cycle.add_subsystem('bleed', BleedOut(bleed_names=['bld1', 'bld2']), promotes=['MN'])

        cycle.pyc_connect_flow('flow_start.Fl_O', 'bleed.Fl_I')

        cycle.set_input_defaults('MN', 0.5)
        cycle.set_input_defaults('bleed.bld1:frac_W', 0.1)
        cycle.set_input_defaults('bleed.bld2:frac_W', 0.1)
        cycle.set_input_defaults('P', 17., units='psi')
        cycle.set_input_defaults('T', 500., units='degR')
        cycle.set_input_defaults('flow_start.W', 500., units='lbm/s')

        self.prob.setup(check=False, force_alloc_complex=True)
        self.prob.set_solver_print(level=-1)

        self.prob.run_model()

        tol = 2.0e-5

        Tt_in = self.prob.get_val('bleed.Fl_I:tot:T', units='degR')
        Pt_in = self.prob.get_val('bleed.Fl_I:tot:P', units='psi')
        W_in = self.prob['bleed.Fl_I:stat:W']
        
        assert_near_equal(self.prob['bleed.Fl_O:tot:T'], Tt_in, tol)
        assert_near_equal(self.prob['bleed.bld1:tot:T'], Tt_in, tol)
        assert_near_equal(self.prob['bleed.bld2:tot:T'], Tt_in, tol)

        assert_near_equal(self.prob['bleed.Fl_O:tot:P'], Pt_in, tol)
        assert_near_equal(self.prob['bleed.bld1:tot:P'], Pt_in, tol)
        assert_near_equal(self.prob['bleed.bld2:tot:P'], Pt_in, tol)

        assert_near_equal(self.prob['bleed.Fl_O:stat:W'], W_in*0.8, tol)
        assert_near_equal(self.prob['bleed.bld1:stat:W'], W_in*0.1, tol)
        assert_near_equal(self.prob['bleed.bld2:stat:W'], W_in*0.1, tol)

        partial_data = self.prob.check_partials(out_stream=None, method='cs', 
                                                includes=['bleed.*'], excludes=['*.base_thermo.*',])
        assert_check_partials(partial_data, atol=1e-8, rtol=1e-8)
Esempio n. 24
0
    def setUp(self):

        thermo = Thermo(janaf, constants.AIR_MIX)

        self.prob = Problem()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'compressor',
            Compressor(map_data=AXI5,
                       design=False,
                       elements=AIR_MIX,
                       map_extrap=False))

        self.prob.model.set_input_defaults('compressor.s_PR', val=1.)
        self.prob.model.set_input_defaults('compressor.s_eff', val=1.)
        self.prob.model.set_input_defaults('compressor.s_Wc', val=1.)
        self.prob.model.set_input_defaults('compressor.s_Nc', val=1.)
        self.prob.model.set_input_defaults('compressor.map.alphaMap', val=0.)
        self.prob.model.set_input_defaults('compressor.Nmech', 0., units='rpm')
        self.prob.model.set_input_defaults('flow_start.P', 17., units='psi')
        self.prob.model.set_input_defaults('flow_start.T', 500., units='degR')
        self.prob.model.set_input_defaults('flow_start.W', 0., units='lbm/s')
        self.prob.model.set_input_defaults('compressor.area',
                                           50.,
                                           units='inch**2')

        connect_flow(self.prob.model, "flow_start.Fl_O", "compressor.Fl_I")

        newton = self.prob.model.nonlinear_solver = NewtonSolver()
        newton.options['atol'] = 1e-8
        newton.options['rtol'] = 1e-8
        newton.options['iprint'] = 2
        newton.options['maxiter'] = 10
        newton.options['solve_subsystems'] = True
        newton.options['max_sub_solves'] = 10
        newton.linesearch = BoundsEnforceLS()
        newton.linesearch.options['bound_enforcement'] = 'scalar'
        newton.linesearch.options['iprint'] = -1

        self.prob.model.linear_solver = DirectSolver(assemble_jac=True)

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 25
0
    def setUp(self):

        self.prob = Problem()
        cycle = self.prob.model = Cycle()

        cycle.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_ELEMENTS))
        cycle.add_subsystem('splitter', Splitter(elements=AIR_ELEMENTS))

        cycle.set_input_defaults('flow_start.P', 17., units='psi')
        cycle.set_input_defaults('flow_start.T', 500., units='degR')
        cycle.set_input_defaults('splitter.MN1', 0.5)
        cycle.set_input_defaults('splitter.MN2', 0.5)
        cycle.set_input_defaults('flow_start.W', 10., units='lbm/s')

        cycle.pyc_connect_flow('flow_start.Fl_O', 'splitter.Fl_I')

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False, force_alloc_complex=True)
Esempio n. 26
0
    def setUp(self):

        self.prob = Problem()

        des_vars = self.prob.model.add_subsystem('des_vars', IndepVarComp())
        des_vars.add_output('P', 17., units='psi')
        des_vars.add_output('T', 500., units='degR')
        des_vars.add_output('W', 100., units='lbm/s')
        des_vars.add_output('MN', 0.5)

        self.prob.model.add_subsystem(
            'fl_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.connect('des_vars.P', 'fl_start.P')
        self.prob.model.connect('des_vars.T', 'fl_start.T')
        self.prob.model.connect('des_vars.W', 'fl_start.W')
        self.prob.model.connect('des_vars.MN', 'fl_start.MN')

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 27
0
    def setUp(self):

        self.prob = Problem()
        cycle = self.prob.model = Cycle()
        cycle.options['design'] = False
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = species_data.janaf

        cycle.add_subsystem('flow_start', FlowStart())
        cycle.add_subsystem(
            'compressor',
            Compressor(map_data=AXI5, design=False, map_extrap=False))

        cycle.set_input_defaults('compressor.s_PR', val=1.)
        cycle.set_input_defaults('compressor.s_eff', val=1.)
        cycle.set_input_defaults('compressor.s_Wc', val=1.)
        cycle.set_input_defaults('compressor.s_Nc', val=1.)
        cycle.set_input_defaults('compressor.map.alphaMap', val=0.)
        cycle.set_input_defaults('compressor.Nmech', 0., units='rpm')
        cycle.set_input_defaults('flow_start.P', 17., units='psi')
        cycle.set_input_defaults('flow_start.T', 500., units='degR')
        cycle.set_input_defaults('flow_start.W', 0., units='lbm/s')
        cycle.set_input_defaults('compressor.area', 50., units='inch**2')

        cycle.pyc_connect_flow("flow_start.Fl_O", "compressor.Fl_I")

        newton = self.prob.model.nonlinear_solver = NewtonSolver()
        newton.options['atol'] = 1e-8
        newton.options['rtol'] = 1e-8
        newton.options['iprint'] = 2
        newton.options['maxiter'] = 10
        newton.options['solve_subsystems'] = True
        newton.options['max_sub_solves'] = 10
        newton.linesearch = BoundsEnforceLS()
        newton.linesearch.options['bound_enforcement'] = 'scalar'
        newton.linesearch.options['iprint'] = -1

        self.prob.model.linear_solver = DirectSolver(assemble_jac=True)

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False, force_alloc_complex=True)
Esempio n. 28
0
    def setUp(self):

        self.prob = Problem()
        cycle = self.prob.model = Cycle()
        cycle.options['thermo_method'] = 'CEA'
        cycle.options['thermo_data'] = janaf

        cycle.add_subsystem('flow_start', FlowStart(thermo_data=janaf))
        cycle.add_subsystem('compressor', Compressor(design=True))

        cycle.set_input_defaults('flow_start.P', 17., units='psi')
        cycle.set_input_defaults('flow_start.T', 500., units='degR')
        cycle.set_input_defaults('compressor.MN', 0.5)
        cycle.set_input_defaults('flow_start.W', 10., units='lbm/s')
        cycle.set_input_defaults('compressor.PR', 6.)
        cycle.set_input_defaults('compressor.eff', 0.9)

        cycle.pyc_connect_flow("flow_start.Fl_O", "compressor.Fl_I")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False, force_alloc_complex=True)
Esempio n. 29
0
    def setUp(self):

        thermo = Thermo(janaf, constants.AIR_MIX)

        self.prob = Problem()

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'compressor', Compressor(design=True, elements=AIR_MIX))

        self.prob.model.set_input_defaults('flow_start.P', 17., units='psi')
        self.prob.model.set_input_defaults('flow_start.T', 500., units='degR')
        self.prob.model.set_input_defaults('compressor.MN', 0.5)
        self.prob.model.set_input_defaults('flow_start.W', 10., units='lbm/s')
        self.prob.model.set_input_defaults('compressor.PR', 6.)
        self.prob.model.set_input_defaults('compressor.eff', 0.9)

        connect_flow(self.prob.model, "flow_start.Fl_O", "compressor.Fl_I")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)
Esempio n. 30
0
    def setUp(self):
        self.prob = Problem()

        des_vars = self.prob.model.add_subsystem('des_vars',
                                                 IndepVarComp(),
                                                 promotes=['*'])
        des_vars.add_output('P', 17., units='psi'),
        des_vars.add_output('T', 500.0, units='degR'),
        des_vars.add_output('W', 0., units='lbm/s'),
        des_vars.add_output('Nmech', 1000., units='rpm'),
        des_vars.add_output('area_targ', 150., units='inch**2')
        des_vars.add_output('burner_MN', .01, units=None)
        des_vars.add_output('burner_FAR', .01, units=None)

        self.prob.model.add_subsystem(
            'flow_start', FlowStart(thermo_data=janaf, elements=AIR_MIX))
        self.prob.model.add_subsystem(
            'burner',
            Combustor(thermo_data=janaf,
                      inflow_elements=AIR_MIX,
                      air_fuel_elements=AIR_FUEL_MIX,
                      fuel_type="JP-7"))
        self.prob.model.add_subsystem(
            'turbine',
            Turbine(map_data=LPT2269, design=False, elements=AIR_FUEL_MIX))

        connect_flow(self.prob.model, "flow_start.Fl_O", "burner.Fl_I")
        connect_flow(self.prob.model, "burner.Fl_O", "turbine.Fl_I")

        self.prob.model.connect("P", "flow_start.P")
        self.prob.model.connect("T", "flow_start.T")
        self.prob.model.connect("W", "flow_start.W")
        self.prob.model.connect("Nmech", "turbine.Nmech")
        self.prob.model.connect("area_targ", "turbine.area")
        self.prob.model.connect("burner_MN", "burner.MN")
        self.prob.model.connect("burner_FAR", "burner.Fl_I:FAR")

        self.prob.set_solver_print(level=-1)
        self.prob.setup(check=False)