def solve_nonlinear(self, params, unknowns, resids): self._clear_unknowns('flow_in', unknowns) self._clear_unknowns('flow_out', unknowns) self._solve_flow_vars('flow_in', params, unknowns) unknowns['flow_out:out:W'] = params['flow_in:in:W'] if params['design']: # Design Calculations Pt_out = unknowns['flow_in:out:Pt'] * params['PR_des'] unknowns['PR'] = params['PR_des'] ideal_ht = flowstation.solve(s=unknowns['flow_in:out:s'], Pt=Pt_out).ht ht_out = (ideal_ht - unknowns['flow_in:out:ht']) / params['eff_des'] + unknowns['flow_in:out:ht'] unknowns['flow_out:out:ht'] = ht_out unknowns['flow_out:out:Pt'] = Pt_out unknowns['flow_out:out:Mach'] = params['MNexit_des'] self._solve_flow_vars('flow_out', params, unknowns) self._exit_area_des = unknowns['flow_out:out:area'] self._Wc_des = unknowns['flow_in:out:Wc'] else: # Assumed Op Line Calculation unknowns['PR'] = self._op_line(params, unknowns['flow_in:out:Wc']) unknowns['eff'] = params['eff_des'] # TODO: add in eff variation with W # Operational Conditions Pt_out = unknowns['flow_in:out:Pt'] * unknowns['PR'] ideal_ht = flowstation.solve(s=unknowns['flow_in:out:s'], Pt=Pt_out).ht ht_out = (ideal_ht - unknowns['flow_in:out:ht']) / unknowns['eff'] + unknowns['flow_in:out:ht'] unknowns['flow_out:out:ht'] = ht_out unknowns['flow_out:out:Pt'] = Pt_out unknowns['flow_out:out:area'] = self._exit_area_des # causes Mach to be calculated based on fixed area self._solve_flow_vars('flow_out', params, unknowns) C = flowstation.GAS_CONSTANT * math.log(unknowns['PR']) delta_s = unknowns['flow_out:out:s'] - unknowns['flow_in:out:s'] unknowns['eff_poly'] = C / (C + delta_s) unknowns['pwr'] = params['flow_in:in:W'] * (unknowns['flow_out:out:ht'] - unknowns['flow_in:out:ht']) * 1.4148532 # btu/s to hp unknowns['tip_radius'] = (unknowns['flow_out:out:area'] / math.pi / (1 - params['hub_to_tip'] ** 2)) ** 0.5 unknowns['hub_radius'] = params['hub_to_tip'] * unknowns['tip_radius']
def test_solve_total_sP(self): s = flowstation.solve(Pt=15.0, Tt=518.0, W=100.0).s flow = flowstation.solve(s=s, Pt=15.0, W=100.0) self.assertAlmostEqual(flow.Pt, 15.0, places=2) self.assertAlmostEqual(flow.Tt, 518, places=2) self.assertAlmostEqual(flow.ht, -6.32357, places=4) #Tom says the ht values will be different self.assertAlmostEqual(flow.rhot, .07812, places=4)
def test_dels(self): s = flowstation.solve(Pt=15.0, Tt=518.0, W=100.0).s flow = flowstation.solve(Tt=1000.0, Pt=40.0, W=100.0) diffs = flow.s - s assert_rel_error(self, diffs, .092609, .0001)
def test_delh(self): ht = flowstation.solve(Pt=15.0, Tt=518.0, W=100.0).ht flow = flowstation.solve(Tt=1000.0, Pt=40.0, W=100.0) diffh = flow.ht - ht assert_rel_error(self, diffh, 117.4544, .0001)
def test_solve_super(self): flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, area=32.006, is_super=True) self.assertGreater(flow.Mach, 1.0)
def test_solve_sub(self): flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, area=32.006, is_super=False) self.assertLess(flow.Mach, 1.0)
def test_solve_Ps(self): flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, Ps=376.194) self._assert(flow)
def test_solve_area(self): flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, area=32.006) self.assertLess(flow.Mach, 1.0) self._assert(flow)
def test_solve_Mach(self): flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, Mach=0.3) self._assert(flow)
def solve_nonlinear(self, params, unknowns, resids): self._clear_unknowns('flow_in', unknowns) self._clear_unknowns('flow_out', unknowns) self._solve_flow_vars('flow_in', params, unknowns) Pt_out = (1.0 - params['dPqP']) * unknowns['flow_in:out:Pt'] flow_throat = flowstation.solve(Tt=unknowns['flow_in:out:Tt'], Pt=Pt_out, Mach=1.0, W=unknowns['flow_in:out:W']) unknowns['Athroat_dmd'] = flow_throat.area unknowns['flow_out:out:W'] = unknowns['flow_in:out:W'] flow_exit_ideal = flowstation.solve(W=unknowns['flow_in:out:W'], Tt=unknowns['flow_in:out:Tt'], Pt=Pt_out, Ps=params['back_Ps']) if params['design']: unknowns['Athroat_des'] = flow_throat.area unknowns['Aexit_des'] = flow_exit_ideal.area unknowns['flow_out:out:Tt'] = unknowns['flow_in:out:Tt'] unknowns['flow_out:out:Pt'] = Pt_out unknowns['flow_out:out:Mach'] = flow_exit_ideal.Mach self._solve_flow_vars('flow_out', params, unknowns) unknowns['switchRegime'] = 'PERFECTLY_EXPANDED' else: # subsonic solution, curve 4 flow_out_subsonic = flowstation.solve(W=unknowns['flow_out:out:W'], Tt=unknowns['flow_in:out:Tt'], Pt=unknowns['flow_in:out:Pt'], is_super=False, area=unknowns['Aexit_des']) # supersonic solution, curve 5 flow_out_supersonic = flowstation.solve(W=unknowns['flow_out:out:W'], Tt=unknowns['flow_in:out:Tt'], Pt=unknowns['flow_in:out:Pt'], is_super=True, area=unknowns['Aexit_des']) # normal shock at nozzle exit, curve c Pt_exit = Nozzle.shockPR(flow_out_supersonic.Mach, flow_throat.gams) * flow_throat.Pt flow_out_shock = flowstation.solve(W=unknowns['flow_out:out:W'], Tt=flow_throat.Tt, Pt=Pt_exit, is_super=False, area=unknowns['Aexit_des']) if params['back_Ps'] >= flow_out_subsonic.Ps: # curves 1 to 4 unknowns['switchRegime'] = 'UNCHOKED' flow_throat = flowstation.solve(Tt=unknowns['flow_in:out:Tt'], Pt=Pt_out, W=unknowns['flow_in:out:W'], area=unknowns['Athroat_des']) unknowns['flow_out:out:Tt'] = flow_throat.Tt unknowns['flow_out:out:Pt'] = flow_throat.Pt unknowns['flow_out:out:area'] = unknowns['Aexit_des'] elif params['back_Ps'] >= flow_out_shock.Ps: # between curves 4 and c unknowns['switchRegime'] = 'NORMAL_SHOCK' unknowns['flow_out:out:Tt'] = flow_throat.Tt unknowns['flow_out:out:Pt'] = flow_out_shock.Pt unknowns['flow_out:out:Ps'] = params['back_Ps'] elif params['back_Ps'] > flow_out_supersonic.Ps: # between curves c and 5 unknowns['switchRegime'] = 'OVEREXPANDED' unknowns['flow_out:out:is_super'] = True unknowns['flow_out:out:Tt'] = flow_throat.Tt unknowns['flow_out:out:Pt'] = flow_throat.Pt unknowns['flow_out:out:area'] = unknowns['Aexit_des'] else: # between curves 5 and e unknowns['switchRegime'] = 'UNDEREXPANDED' unknowns['flow_out:out:is_super'] = True unknowns['flow_out:out:Tt'] = flow_throat.Tt unknowns['flow_out:out:Pt'] = flow_throat.Pt unknowns['flow_out:out:area'] = unknowns['Aexit_des'] self._solve_flow_vars('flow_out', params, unknowns) if abs(params['back_Ps'] - flow_out_supersonic.Ps) / params['back_Ps'] < 0.001: unknowns['switchRegime'] = 'PERFECTLY_EXPANDED' unknowns['Fg'] = unknowns['flow_out:out:W'] * unknowns['flow_out:out:Vflow'] / 32.174 + unknowns['flow_out:out:area'] * (unknowns['flow_out:out:Ps'] - params['back_Ps']) unknowns['PR'] = flow_throat.Pt / unknowns['flow_out:out:Ps'] unknowns['AR'] = unknowns['flow_out:out:area'] / flow_throat.area if unknowns['switchRegime'] == 'UNCHOKED': unknowns['WqAexit'] = unknowns['flow_in:out:W'] / params['back_Ps'] unknowns['WqAexit_dmd'] = unknowns['flow_in:out:W'] / unknowns['flow_out:out:Ps'] else: unknowns['WqAexit'] = unknowns['flow_in:out:W'] / unknowns['Athroat_des'] unknowns['WqAexit_dmd'] = unknowns['flow_in:out:W'] / unknowns['Athroat_dmd']