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
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)
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." )
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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')
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)
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__))
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)
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
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)
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.' )
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__))
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)
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)
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)
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)
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)
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)
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)
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)