Esempio n. 1
0
 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']
Esempio n. 2
0
    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)
Esempio n. 3
0
 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)
Esempio n. 4
0
    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)
Esempio n. 5
0
 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)
Esempio n. 6
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)
Esempio n. 7
0
 def test_solve_Ps(self):
     flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, Ps=376.194)
     self._assert(flow)
Esempio n. 8
0
 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)
Esempio n. 9
0
 def test_solve_Mach(self):
     flow = flowstation.solve(W=self.W, Tt=self.Tt, Pt=self.Pt, Mach=0.3)
     self._assert(flow)
Esempio n. 10
0
 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']