def _Superheat_Forward(self, w_superheat): self.w_superheat = w_superheat DWS = DWSVals() #DryWetSegment structure AS = self.AS #AbstractState # Store temporary values to be passed to DryWetSegment DWS.A_a = self.Fins.A_a * w_superheat DWS.cp_da = self.Fins.cp_da DWS.eta_a = self.Fins.eta_a DWS.h_a = self.Fins.h_a * self.h_a_tuning #Heat transfer coefficient DWS.mdot_da = self.mdot_da * w_superheat DWS.pin_a = self.Fins.Air.p DWS.Fins = self.Fins DWS.FinsType = self.FinsType # Inputs on the air side to two phase region are inlet air again DWS.Tin_a = self.Tin_a DWS.RHin_a = self.Fins.Air.RH DWS.Tin_r = self.Tdew_r DWS.A_r = self.A_r_wetted * w_superheat DWS.Rw = self.Rw / w_superheat AS.update(CP.PT_INPUTS, self.psat_r, self.Tdew_r + 2.5) DWS.cp_r = AS.cpmass( ) #Use a guess value of 6K superheat to calculate cp [J/kg-K] DWS.pin_r = self.psat_r DWS.mdot_r = self.mdot_r DWS.IsTwoPhase = False #Use a guess value of 6K superheat to calculate the properties self.f_r_superheat, self.h_r_superheat, self.Re_r_superheat = f_h_1phase_Tube( self.mdot_r / self.Ncircuits, self.ID, self.Tdew_r + 3, self.psat_r, self.AS, "Single") # Average Refrigerant heat transfer coefficient DWS.h_r = self.h_r_superheat #Run DryWetSegment DryWetSegment(DWS) AS.update(CP.PT_INPUTS, self.psat_r, (DWS.Tout_r + self.Tdew_r) / 2.0) rho_superheat = AS.rhomass() #[kg/m^3] self.Charge_superheat = w_superheat * self.V_r * rho_superheat #Pressure drop calculations for superheated refrigerant v_r = 1 / rho_superheat #Pressure gradient using Darcy friction factor dpdz_r = -self.f_r_superheat * v_r * self.G_r**2 / ( 2 * self.ID) #Pressure gradient self.DP_r_superheat = dpdz_r * self.Lcircuit * self.w_superheat #Set values self.Q_superheat = DWS.Q self.Q_sensible_superheat = DWS.Q_sensible self.fdry_superheat = DWS.f_dry self.Tout_a_superheat = DWS.Tout_a self.Tout_r = DWS.Tout_r
def Calculate(self): """ This function is now simply a wrapper around the DryWetSegment() function in order to decrease the amount of code replication """ #Initialize self.Initialize() AS_g = self.AS_g DWS=DWSVals() #DryWetSegment structure # Store temporary values to be passed to DryWetSegment DWS.A_a=self.Fins.A_a DWS.cp_da=self.Fins.cp_da DWS.eta_a=self.Fins.eta_a DWS.h_a=self.Fins.h_a*self.h_a_tuning #Heat transfer coefficient DWS.mdot_da=self.Fins.mdot_da DWS.pin_a=self.Fins.Air.p DWS.Tin_a=self.Tin_a DWS.RHin_a=self.Fins.Air.RH DWS.Fins=self.Fins DWS.FinsType=self.FinsType #Added to pass FinsType to DryWetSegment DWS.Tin_r=self.Tin_g DWS.A_r=self.A_g_wetted DWS.Rw=self.Rw AS_g.update(CP.PT_INPUTS, self.pin_g, (self.Tin_g+DWS.Tin_a)/2.0) DWS.cp_r=AS_g.cpmass() #[J/kg-K] DWS.pin_r=self.pin_g DWS.mdot_r=self.mdot_g DWS.IsTwoPhase=False #Use a guess value of 6K superheat to calculate the properties self.f_g, self.h_g, self.Re_g=f_h_1phase_Tube(self.mdot_g / self.Ncircuits, self.ID, (self.Tin_g+DWS.Tin_a)/2.0, self.pin_g, self.AS_g, "Single"); # Average Refrigerant heat transfer coefficient DWS.h_r=self.h_g*self.h_g_tuning #Run DryWetSegment DryWetSegment(DWS) #Average mass flux of glycol in circuit self.G_g = self.mdot_g/(self.Ncircuits*pi*self.ID**2/4.0) #[kg/m^2-s] #Pressure drop calculations for glycol (water) Dh_g=self.ID AS_g.update(CP.PT_INPUTS, self.pin_g, self.Tin_g) v_g=1/AS_g.rhomass() #[m^3/kg] #Pressure gradient using Darcy friction factor dp_dz_g=-self.f_g*v_g*self.G_g**2/(2*Dh_g) DP_g=dp_dz_g*self.Lcircuit self.f_dry=DWS.f_dry self.DP_g=DP_g*self.DP_tuning self.Q=DWS.Q self.Tout_g=DWS.Tout_r self.Tout_a=DWS.Tout_a self.hout_a=DWS.hout_a self.hin_a=DWS.hin_a self.SHR=self.Fins.cp_da*(DWS.Tout_a-DWS.Tin_a)/(DWS.hout_a-DWS.hin_a) self.Capacity=DWS.Q-self.Fins.Air.FanPower
def _Subcool_Forward(self, w_subcool): # ********************************************************************** # SUPERCRITICAL_LIQUID PART # ********************************************************************** self.w_subcool = w_subcool if self.w_subcool < 0: raise ValueError( 'w_subcool in Gas cooler cannot be less than zero') #AbstractState AS = self.AS DWS = DWSVals() #DryWetSegment structure # Store temporary values to be passed to DryWetSegment DWS.A_a = self.Fins.A_a * w_subcool DWS.cp_da = self.Fins.cp_da DWS.eta_a = self.Fins.eta_a DWS.h_a = self.Fins.h_a #Heat transfer coefficient DWS.mdot_da = self.mdot_da * w_subcool DWS.pin_a = self.Fins.Air.p DWS.Fins = self.Fins DWS.FinsType = self.FinsType # Inputs on the air side to two phase region are inlet air again DWS.Tin_a = self.Tin_a DWS.RHin_a = self.Fins.Air.RH DWS.Tin_r = self.Tcr DWS.A_r = self.A_r_wetted * w_subcool AS.update(CP.PT_INPUTS, self.psat_r, self.Tcr - 1) DWS.cp_r = AS.cpmass() #[J/kg-K] DWS.pin_r = self.psat_r DWS.mdot_r = self.mdot_r DWS.IsTwoPhase = False # Friction factor and HTC in the refrigerant portions. # Average fluid temps are used for the calculation of properties # Average temp of refrigerant is average of sat. temp and outlet temp # Secondary fluid is air over the fins self.f_r_subcool, self.h_r_subcool, self.Re_r_subcool = f_h_1phase_Tube( self.mdot_r / self.Ncircuits, self.ID, self.Tcr - 1.0, self.psat_r, self.AS, "Single") # Average Refrigerant heat transfer coefficient DWS.h_r = self.h_r_subcool #Run DryWetSegment DryWetSegment(DWS) AS.update(CP.PT_INPUTS, self.psat_r, (self.Tcr + DWS.Tout_r) / 2) rho_subcool = AS.rhomass() #[kg/m^3] self.Charge_subcool = self.w_subcool * self.V_r * rho_subcool #Pressure drop calculations for subcooled refrigerant v_r = 1 / rho_subcool #Pressure gradient using Darcy friction factor dpdz_r = -self.f_r_subcool * v_r * self.G_r**2 / (2 * self.ID ) #Pressure gradient self.DP_r_subcool = dpdz_r * self.Lcircuit * self.w_subcool # Positive Q is heat input to the refrigerant, negative Q is heat output from refrigerant. # Heat is removed here from the refrigerant since it is condensing self.Q_subcool = DWS.Q self.fdry_subcool = DWS.f_dry self.Tout_a_subcool = DWS.Tout_a self.Tout_r = DWS.Tout_r
def _Supercrit_liq_Forward(self, w_supercrit_liq): # ********************************************************************** # SUPERCRITICAL_LIQUID PART # ********************************************************************** self.w_supercrit_liq = w_supercrit_liq if self.w_supercrit_liq < 0: raise ValueError( 'w_supercrit_liq in Gas cooler cannot be less than zero') #AbstractState AS = self.AS DWS = DWSVals() #DryWetSegment structure # Store temporary values to be passed to DryWetSegment DWS.A_a = self.Fins.A_a * w_supercrit_liq DWS.cp_da = self.Fins.cp_da DWS.eta_a = self.Fins.eta_a DWS.h_a = self.Fins.h_a * self.h_a_tuning #Heat transfer coefficient DWS.mdot_da = self.mdot_da * w_supercrit_liq DWS.pin_a = self.Fins.Air.p DWS.Fins = self.Fins DWS.FinsType = self.FinsType # Inputs on the air side to two phase region are inlet air again DWS.Tin_a = self.Tin_a DWS.RHin_a = self.Fins.Air.RH DWS.Tin_r = self.Tcr DWS.A_r = self.A_r_wetted * w_supercrit_liq DWS.Rw = self.Rw / w_supercrit_liq AS.update(CP.PT_INPUTS, self.psat_r, self.Tcr - 1) DWS.cp_r = AS.cpmass() #[J/kg-K] DWS.pin_r = self.psat_r DWS.mdot_r = self.mdot_r DWS.IsTwoPhase = False # # Friction factor and HTC in the refrigerant portions. # # Average fluid temps are used for the calculation of properties # # Average temp of refrigerant is average of sat. temp and outlet temp # # Secondary fluid is air over the fins # self.f_r_supercrit_liq, self.h_r_supercrit_liq, self.Re_r_supercrit_liq=f_h_1phase_Tube( # self.mdot_r / self.Ncircuits, self.ID, self.Tcr-1.0, self.psat_r, self.AS, # "Single") # # # Average Refrigerant heat transfer coefficient # DWS.h_r=self.h_r_supercrit_liq*self.h_r_tuning # # #Run DryWetSegment # DryWetSegment(DWS) # # AS.update(CP.PT_INPUTS, self.psat_r, (self.Tcr + DWS.Tout_r) / 2) # rho_supercrit_liq=AS.rhomass() #[kg/m^3] # self.Charge_supercrit_liq = self.w_supercrit_liq * self.V_r * rho_supercrit_liq # # #Pressure drop calculations for supercrit_liqed refrigerant # v_r=1/rho_supercrit_liq # #Pressure gradient using Darcy friction factor # dpdz_r=-self.f_r_supercrit_liq*v_r*self.G_r**2/(2*self.ID) #Pressure gradient # self.DP_r_supercrit_liq=dpdz_r*self.Lcircuit*self.w_supercrit_liq # # # Positive Q is heat input to the refrigerant, negative Q is heat output from refrigerant. # # Heat is removed here from the refrigerant since it is condensing # self.Q_supercrit_liq=DWS.Q # self.fdry_supercrit_liq=DWS.f_dry # self.Tout_a_supercrit_liq=DWS.Tout_a # self.Tout_r=DWS.Tout_r AS.update(CP.PT_INPUTS, self.psat_r, self.Tout_r_sc) hout = AS.hmass() #[J/kg] #Target heat transfer to go from inlet temperature (critical) to iterative outlet temperature Q_target = self.mdot_r * (hout - self.hcr) if Q_target > 0: raise ValueError('Q_target in Gas cooler must be negative') # Friction factor and HTC in the refrigerant portions. # Average fluid temps are used for the calculation of properties # Average temp of refrigerant is average of sat. temp and outlet temp # Secondary fluid is air over the fins h_r, self.f_r_supercrit_liq, DWS.cp_r, rho_supercrit_liq = Petterson_supercritical_average( self.Tout_r_sc, self.Tcr, self.T_w, self.AS, self.G_r, self.ID, 0, self.ID / self.Lcircuit, self.mdot_r / self.Ncircuits, self.psat_r, -Q_target / DWS.A_r) DWS.h_r = h_r * self.h_r_tuning #Correct refrigerant HTC with tuning factor #Run DryWetSegment DryWetSegment(DWS) # Positive Q is heat input to the refrigerant, negative Q is heat output from refrigerant. # Heat is removed here from the refrigerant since it is condensing self.T_w = DWS.Twall_s #inner surface wall temperature (refrigerant) self.Q_supercrit_liq = DWS.Q self.h_r_supercrit_liq = DWS.h_r self.fdry_supercrit_liq = DWS.f_dry self.Tout_a_supercrit_liq = DWS.Tout_a self.Tout_r = DWS.Tout_r self.Charge_supercrit_liq = self.w_supercrit_liq * self.V_r * rho_supercrit_liq #Pressure drop calculations for supercrit_liqed refrigerant v_r = 1 / rho_supercrit_liq #Pressure gradient using Darcy friction factor dpdz_r = -self.f_r_supercrit_liq * v_r * self.G_r**2 / ( 2 * self.ID) #Pressure gradient self.DP_r_supercrit_liq = dpdz_r * self.Lcircuit * self.w_supercrit_liq return Q_target - DWS.Q
def _TwoPhase_Forward(self, w_2phase): DWS = DWSVals() #DryWetSegment structure # Store temporary values to be passed to DryWetSegment DWS.Fins = self.Fins DWS.FinsType = self.FinsType DWS.A_a = self.Fins.A_a * w_2phase DWS.cp_da = self.Fins.cp_da DWS.eta_a = self.Fins.eta_a DWS.h_a = self.Fins.h_a * self.h_a_tuning #Heat transfer coefficient, not enthalpy DWS.mdot_da = self.mdot_da * w_2phase DWS.pin_a = self.Fins.Air.p DWS.Tdew_r = self.Tdew_r DWS.Tbubble_r = self.Tbubble_r DWS.Tin_a = self.Tin_a DWS.RHin_a = self.Fins.Air.RH DWS.Tin_r = self.Tsat_r DWS.A_r = self.A_r_wetted * w_2phase DWS.Rw = self.Rw / w_2phase DWS.cp_r = 1.0e15 #In the two-phase region the cp is infinite, use 1e15 as a big number; DWS.pin_r = self.psat_r DWS.mdot_r = self.mdot_r DWS.IsTwoPhase = True #Target heat transfer to go from inlet quality to saturated vapor Q_target = self.mdot_r * (self.xout_2phase - self.xin_r) * self.h_fg if Q_target < 0: raise ValueError('Q_target in Evaporator must be positive') # Average Refrigerant heat transfer coefficient try: if self.AS.name() in 'CarbonDioxide': h_r = KandlikarEvaporation_average(self.xin_r, self.xout_2phase, self.AS, self.G_r, self.ID, self.psat_r, Q_target / DWS.A_r, self.Tbubble_r, self.Tdew_r) else: h_r = ShahEvaporation_Average(self.xin_r, self.xout_2phase, self.AS, self.G_r, self.ID, self.psat_r, Q_target / DWS.A_r, self.Tbubble_r, self.Tdew_r) except: h_r = ShahEvaporation_Average(self.xin_r, self.xout_2phase, self.AS, self.G_r, self.ID, self.psat_r, Q_target / DWS.A_r, self.Tbubble_r, self.Tdew_r) DWS.h_r = h_r * self.h_tp_tuning #correct refrigerant side convection heat transfer #Run the DryWetSegment to carry out the heat and mass transfer analysis DryWetSegment(DWS) self.Q_2phase = DWS.Q self.Q_sensible_2phase = DWS.Q_sensible self.h_r_2phase = DWS.h_r self.fdry_2phase = DWS.f_dry self.Tout_a_2phase = DWS.Tout_a rho_average = TwoPhaseDensity(self.AS, self.xin_r, self.xout_2phase, self.Tdew_r, self.Tbubble_r, slipModel='Zivi') self.Charge_2phase = rho_average * w_2phase * self.V_r #Frictional pressure drop component DP_frict = LMPressureGradientAvg( self.xin_r, self.xout_2phase, self.AS, self.G_r, self.ID, self.Tbubble_r, self.Tdew_r) * self.Lcircuit * w_2phase #Accelerational pressure drop component try: if self.AS.name() in 'CarbonDioxide': DP_accel = AccelPressureDrop( self.xin_r, self.xout_2phase, self.AS, self.G_r, self.Tbubble_r, self.Tdew_r, D=self.ID, slipModel='Premoli') * self.Lcircuit * w_2phase else: DP_accel = AccelPressureDrop( self.xin_r, self.xout_2phase, self.AS, self.G_r, self.Tbubble_r, self.Tdew_r, slipModel='Zivi') * self.Lcircuit * w_2phase except: DP_accel = AccelPressureDrop( self.xin_r, self.xout_2phase, self.AS, self.G_r, self.Tbubble_r, self.Tdew_r, slipModel='Zivi') * self.Lcircuit * w_2phase self.DP_r_2phase = DP_frict + DP_accel if self.Verbosity > 7: print(w_2phase, DWS.Q, Q_target, self.xin_r, "w_2phase,DWS.Q,Q_target,self.xin_r") return DWS.Q - Q_target
def _TwoPhase_Forward(self,w_2phase): DWS=DWSVals() #DryWetSegment structure # Store temporary values to be passed to DryWetSegment DWS.Fins=self.Fins DWS.FinsType = self.FinsType DWS.A_a=self.Fins.A_a*w_2phase DWS.cp_da=self.Fins.cp_da DWS.eta_a=self.Fins.eta_a DWS.h_a=self.Fins.h_a*self.h_a_tuning #Heat transfer coefficient, not enthalpy DWS.mdot_da=self.mdot_da*w_2phase DWS.pin_a=self.Fins.Air.p DWS.Tdew_r=self.Tdew_r DWS.Tbubble_r=self.Tbubble_r DWS.Tin_a=self.Tin_a DWS.RHin_a=self.Fins.Air.RH DWS.Tin_r=self.Tsat_r DWS.A_r=self.A_r_wetted*w_2phase DWS.Rw=self.Rw/w_2phase DWS.cp_r=1.0e15 #In the two-phase region the cp is infinite, use 1e15 as a big number; DWS.pin_r=self.psat_r DWS.mdot_r=self.mdot_r DWS.IsTwoPhase=True #Target heat transfer to go from inlet quality to saturated vapor Q_target=self.mdot_r*(self.xout_2phase-self.xin_r)*self.h_fg if Q_target<0: raise ValueError('Q_target in Evaporator must be positive') # Average Refrigerant heat transfer coefficient #Shah correlation #h_r=ShahEvaporation_Average(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Dh,self.psat_r,Q_target/DWS.A_r,self.Tbubble_r,self.Tdew_r) #Bertsch correlation #h_r=Bertsch_MC_Average(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Dh,Q_target/DWS.A_r,self.Lcircuit,self.Tbubble_r,self.Tdew_r) #Kandlikar correlation #h_r=KandlikarEvaporation_average(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Dh,self.psat_r,Q_target/DWS.A_r,self.Tbubble_r,self.Tdew_r) #Kim and Mudawar (2013) DPDZ_frict_2phase, h_r = KM_Evap_Average(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Dh,self.Tbubble_r,self.Tdew_r,self.psat_r,self.beta,Q_target/DWS.A_r,self.PH_PF) DWS.h_r=h_r*self.h_tp_tuning #correct refrigerant side convection heat transfer #Run the DryWetSegment to carry out the heat and mass transfer analysis DryWetSegment(DWS) self.Q_2phase=DWS.Q self.Q_sensible_2phase=DWS.Q_sensible self.h_r_2phase=DWS.h_r self.fdry_2phase=DWS.f_dry self.Tout_a_2phase=DWS.Tout_a rho_average=TwoPhaseDensity(self.AS,self.xin_r,self.xout_2phase,self.Tdew_r,self.Tbubble_r,slipModel='Zivi') self.Charge_2phase = rho_average * w_2phase * self.V_r #Frictional pressure drop component #Lockhart-Martinelli correlation #DP_frict=LMPressureGradientAvg(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Dh,self.Tbubble_r,self.Tdew_r)*self.Lcircuit*w_2phase #using the pressure gradient of Kim & Mudawar (2013) DP_frict=DPDZ_frict_2phase*self.Lcircuit*w_2phase #Accelerational pressure drop component if self.Ref in 'CarbonDioxide' or 'CO2' or 'R744': #TODO: self.AS.name() is not available yet for all backends, using self.Ref for now DP_accel=AccelPressureDrop(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Tbubble_r,self.Tdew_r,D=self.Dh,slipModel='Premoli')*self.Lcircuit*w_2phase else: DP_accel=AccelPressureDrop(self.xin_r,self.xout_2phase,self.AS,self.G_r,self.Tbubble_r,self.Tdew_r,slipModel='Zivi')*self.Lcircuit*w_2phase self.DP_r_2phase=DP_frict+DP_accel; if self.Verbosity>7: print (w_2phase,DWS.Q,Q_target,self.xin_r,"w_2phase,DWS.Q,Q_target,self.xin_r") return DWS.Q-Q_target