def cloud_shock(self): v_shock_approx = self.r_c / self.tau_cc T_ps = bowshock.rh_temperature_ratio(self.mach) * self.tau_s if (T_ps < 1): T_ps = 1 T_ps = T_ps * self.T_a n_ps = self.n_a * bowshock.rh_density_ratio(self.mach) * self.eta_s p_ps = n_ps * T_ps * pc.k p_therm_c = self.n_c * self.T_c * pc.k p_therm_a = self.n_a * self.T_a * pc.k self.v_shock = sqrt(p_ps / self.p_c) * self.cs_c # WARNING: Ignore the pressure difference between stagnation point and the shock front # if(self.mach < 1.2): # p_ps *= bowshock.postshock_pressure_fac(self.mach) self.rho_c = self.rho_c * p_ps / p_therm_a # Isothermal shock condition self.r_c = (self.M_c / self.rho_c / pi)**(1. / 3. ) # cylindrical geometry self.n_c = self.rho_c / (pc.mh * self.mu) # Assuming neutral self.r_c = (self.M_c / self.rho_c / pi)**(1. / 3. ) # cylindrical geometry p_cond = conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) * p_therm_a self.tau_evap = conduction.tau_evap(self.M_c, self.r_c, n_ps, T_ps) * self.f_cond self.tau_khi = bowshock.fac_khi(self.mach) * self.tau_cc self.N_c = self.M_c / (self.mu * pc.mh * pi * self.r_c * self.r_c) self.L = self.r_c # self.vrel = self.vrel - v_shock # fac_ram = bowshock.ram_pressure_fac(self.mach) * params.ram # p_ps = fac_ram * self.rho_a * self.vrel ** 2 self.a_ram = (p_ps - p_therm_a) * pi * (self.r_c)**2 / self.M_c
def cloud_shock(self, conduction_flag=False, verbose=False): v_shock_approx = self.r_c / self.tau_cc fac_ram = bowshock.ram_pressure_fac(self.mach) * params.ram p_ps = fac_ram * self.rho_a * self.vrel**2 v_shock = sqrt(p_ps / self.p_c) * self.cs_c self.rho_c = self.rho_a * (self.vrel / self.cs_c)**2 # self.rho_c = self.rho_c * (v_shock / self.cs_c) ** 2 self.r_c = (self.M_c / self.rho_c / pi)**(1. / 3. ) # cylindrical geometry if (conduction_flag == True): T_ps = bowshock.rh_temperature_ratio(self.mach) * params.T_ps if (T_ps < 1): T_ps = 1 T_ps = T_ps * self.T_a n_ps = self.n_a * bowshock.rh_density_ratio( self.mach) * params.n_ps # self.rho_c *= conduction.evap_pressure_fac(self.r_c, self.n_a, self.T_a) else: n_ps, T_ps = self.n_a, self.T_a self.rho_c *= conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) print "fac =", conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) self.n_c = self.rho_c / (pc.mh * 1.30) p_therm_c = self.n_c * self.T_c * pc.k p_therm_a = n_ps * T_ps * pc.k print "c_evap = ", conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) * p_therm_a * \ 4. * pi * self.r_c ** 2 / conduction.mass_loss_rate(self.r_c, n_ps, T_ps) / (1.e5) self.r_c = (self.M_c / self.rho_c / pi)**(1. / 3. ) # cylindrical geometry v_ps = v_shock - self.cs_c**2 / v_shock # post-shock velocity in rest-frame p_cond = conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) * p_therm_a self.tau_evap = conduction.tau_evap(self.M_c, self.r_c, n_ps, T_ps) self.tau_khi = bowshock.fac_khi(self.mach) * self.tau_cc self.N_c = self.M_c / (1.30 * pc.mh * pi * self.r_c * self.r_c) self.L = self.r_c # self.vrel = self.vrel - v_shock fac_ram = bowshock.ram_pressure_fac(self.mach) * params.ram p_ps = fac_ram * self.rho_a * self.vrel**2 # self.a_ram = (p_ps - p_therm_a) * pi * self.r_c ** 2 / self.M_c self.a_ram = (p_ps - self.T_a * self.n_a * pc.k) * pi * ( 0.1 * ac.kpc)**2 / self.M_c self.vrel = self.vrel - self.a_ram * self.tau_cc if (verbose == True): print "" print "Post Cloud Shock" print "--------------------------------" print "n_c = ", self.n_c, "[cm^-3]" print "R_c = ", self.r_c / ac.kpc * 1.e3, "[pc]" print "v_shock = ", v_shock / 1.e5, "[km/s]" print "v_shock_approx = ", v_shock_approx / 1.e5, "[km/s]" print "Pc/k = ", p_therm_c / pc.k, "[K]" print "Pa/k = ", p_therm_a / pc.k, "[K]" print "Pps/k = ", p_ps / pc.k, "[K]" print "Pcond/k = ", p_cond / pc.k, "[K]" print "sigma0 = ", conduction.sigma_cond(self.r_c, n_ps, T_ps) print "t_cc = ", self.tau_cc / 1.e6 / ac.yr, "[Myr]" print "t_khi = ", self.tau_khi / 1.e6 / ac.yr, "[Myr]" print "t_evap = ", self.tau_evap / 1.e6 / ac.yr, "[Myr]" print "N_c = ", self.N_c, "[cm^-2]"
def dynamical_update(self, dt): self.eta_s = conduction.fac_conduction_density(self.q_s, self.mach) self.tau_s = conduction.fac_conduction_temperature(self.q_s, self.mach) T_ps = bowshock.rh_temperature_ratio(self.mach) * self.tau_s if (T_ps < 1): T_ps = 1 T_ps = T_ps * self.T_a n_ps = self.n_a * bowshock.rh_density_ratio(self.mach) * self.eta_s self.tau_evap = conduction.tau_evap(self.M_c, self.r_c, n_ps, T_ps) * self.f_cond self.tau_evap = self.tau_evap / (self.L / (2.0 * self.r_c)) mlr = conduction.mass_loss_rate(self.r_c, n_ps, T_ps) * 0.5 # Head mlr += conduction.mass_loss_rate(self.r_c, FACDENS * self.n_a, FACTEMP * self.T_a) * self.L / ( 2.0 * self.r_c) # Tail self.tau_evap = self.M_c / mlr * self.f_cond # Calculate Acceleration p_therm_c = self.n_c * self.T_c * pc.k p_therm_a = self.n_a * self.T_a * pc.k p_ps = n_ps * T_ps * pc.k self.a_ram = (p_ps - p_therm_a) * pi * self.r_c**2 / self.M_c self.tau_khi = bowshock.fac_khi(self.mach) * self.tau_cc # Update Cloud Properties self.time = self.time + dt self.r = self.r + self.vrel * dt self.vrel = self.vrel - self.a_ram * dt if (self.gravity == True): a_grav = self.V_c**2 / self.r self.vrel = self.vrel - a_grav * dt self.mach = self.vrel / self.cs_a P_evap = 3.59 * conduction.sigma_cond(self.r_c, n_ps, T_ps)**0.28 if (self.tau_evap > 0): if (P_evap > 1.0): tau_disrupt = self.tau_evap else: tau_disrupt = 1. / (1. / self.tau_evap + 1. / self.tau_khi) else: tau_disrupt = self.tau_khi self.M_c = self.M_c * exp(-dt / tau_disrupt) print "Mc=%4.2f t(KHI,evap,cc)=%5.2f, %5.2f, %5.2f mach=%4.2f Pevap/Pth=%4.2f" % ( self.M_c / params.M_c, self.tau_khi / ac.myr, self.tau_evap / ac.myr, self.tau_cc / ac.myr, self.mach, P_evap) # ---------------- The Expansion ---------------- rho_eq = self.rho_a * self.T_a / self.T_c L_eq = self.M_c / (rho_eq * self.r_c * self.r_c * pi) v_exp = self.v_shock - (self.v_h - self.vrel) if (v_exp < 0): v_exp = 0 self.L = self.L + v_exp * dt # Here using free expansion approximation: v = 2.0 * c / (gamma - 1) self.r_c = sqrt(self.M_c / (self.N_c * pc.mh * self.mu) / pi) if (self.L > L_eq): self.L = L_eq self.rho_c = self.M_c / (self.L * self.r_c * self.r_c * pi) self.n_c = self.rho_c / (pc.mh * self.mu)
def show_heat_flux(mach, M_c, v, n_a, T_a, qguess): import bowshock # conduction.show_heat_flux(3.8, 6.7e4*ac.msolar, 1.e8, 1./300., 3.e6, 0.95) n_e = fac_conduction_density(qguess, mach) * n_a * bowshock.rh_density_ratio(mach) T_e = fac_conduction_temperature( qguess, mach) * T_a * bowshock.rh_temperature_ratio(mach) n_c = n_e * T_e / 1.e4 r_c = (M_c / (pi * n_c * 0.62 * pc.mh))**(1. / 3.) qclass = (5.6e-7 * T_e**2.5) * (T_e - T_a) / r_c qsat = 0.34 * n_e * pc.k * T_e * sqrt(pc.k * T_e / pc.me) qflow = 0.5 * n_a * v**3 * pc.mh * 0.60 qratio = min(qsat, qclass) / qflow print("Density, Temperature Ratios: %5.3f, %5.3f" % (n_e / n_a, T_e / T_a)) print("Cloud Radius: %5.3f [pc]" % (r_c * 1.e3 / ac.kpc)) print("Classical Flux: %5.3e" % (qclass)) print("Saturated Flux: %5.3e" % (qsat)) print("Flow Heat Flux: %5.3e" % (qflow)) print("Min(qcond/qflow) = %5.3f" % (qratio)) print("Density Enhancement = %5.3f" % (fac_conduction_density(qratio, mach))) print("Temperature Enhancement = %5.3f" % (fac_conduction_temperature(qratio, mach)))
def dynamical_update(self, dt, verbose=False, conduction_flag=True, compression_flag=False, geometry="spherical"): if (conduction_flag == True): # TRICK # self.a_ram *= conduction.evap_pressure_fac(self.r_c, self.n_a, self.T_a) T_ps = bowshock.rh_temperature_ratio(self.mach) * params.T_ps if (T_ps < 1): T_ps = 1 T_ps = T_ps * self.T_a n_ps = self.n_a * bowshock.rh_density_ratio( self.mach) * params.n_ps else: T_ps, n_ps = self.T_a, self.n_a self.tau_evap = conduction.tau_evap(self.M_c, self.r_c, n_ps, T_ps) # print self.tau_evap / ac.yr / 1.e6, n_ps, T_ps, self.r_c, self.L if (geometry == "cylindrical"): self.tau_evap = self.tau_evap / (self.L / (2.0 * self.r_c)) # self.tau_evap = self.tau_evap mlr = conduction.mass_loss_rate(self.r_c, n_ps, T_ps) * 0.5 # mlr += conduction.mass_loss_rate(self.r_c, FACDENS*self.n_a, FACTEMP*self.T_a) * self.L / (2.0 * self.r_c) mlr += conduction.mass_loss_rate(self.r_c, n_ps, T_ps) * self.L / (2.0 * self.r_c) # mlr += conduction.mass_loss_rate(self.r_c, self.n_a, self.T_a) * self.L / (2.0 * self.r_c) self.tau_evap = self.M_c / mlr # print "MLR[Total] / MLR[Head] = ", mlr / (conduction.mass_loss_rate(self.r_c, n_ps, T_ps) * 0.5) # Calculate Acceleration fac_ram = bowshock.ram_pressure_fac(self.mach) * params.ram p_therm_c = self.n_c * self.T_c * pc.k # p_therm_a = n_ps * T_ps * pc.k p_therm_a = self.n_a * self.T_a * pc.k # print "c_evap = ", conduction.evap_pressure_fac(self.r_c, self.n_a, self.T_a) * p_therm_a * \ # 4. * pi * self.r_c ** 2 / conduction.mass_loss_rate(self.r_c, self.n_a, self.T_a) / (1.e5) # p_ps = fac_ram * self.rho_a * self.vrel ** 2 p_ps = n_ps * T_ps * pc.k self.a_ram = (p_ps - p_therm_a) * pi * self.r_c**2 / self.M_c print "Log(P_ram) = ", log10(p_ps) self.tau_khi = bowshock.fac_khi(self.mach) * self.tau_cc # Update Cloud Properties self.time = self.time + dt self.r = self.r + self.vrel * dt self.vrel = self.vrel - self.a_ram * dt self.mach = self.vrel / self.cs_a self.M_c = self.M_c * exp(-dt / self.tau_evap) # self.M_c = self.M_c * exp(-dt / self.tau_khi) # TRICK # rho_eq = conduction.evap_pressure_fac(self.r_c, n_ps, T_ps) * (n_ps / self.n_a) * self.rho_a * T_ps / self.T_c # print rho_eq, self.rho_c, n_ps, T_ps, conduction.evap_pressure_fac(self.r_c, self.n_a, T_ps) # rho_eq = self.rho_a * self.T_a / self.T_c # print rho_eq, self.n_a, self.T_a, conduction.evap_pressure_fac(self.r_c, self.n_a, self.T_a) # rho_eq = conduction.evap_pressure_fac(self.r_c, self.n_a, self.T_a) * self.rho_a * self.T_a / self.T_c rho_eq = self.rho_a * self.T_a / self.T_c if (compression_flag == False): L_eq = self.M_c / (rho_eq * self.r_c * self.r_c * pi) # v_exp = self.cs_c * 3.0 # v_exp = VEXP * 1.e5 v_exp = self.cs_c * sqrt(1.0 + self.mach * self.mach) - (self.v_h - self.vrel) if (v_exp < 0): v_exp = 0 self.L = self.L + v_exp * dt # Here using free expansion approximation: v = 2.0 * c / (gamma - 1) self.r_c = sqrt(self.M_c / (self.N_c * pc.mh * 0.62) / pi) if (self.L > L_eq): self.L = L_eq else: L_eq = self.M_c / ( (self.T_a * self.rho_a / self.T_c) * self.r_c * self.r_c * pi) # Lower pressure (no vapor pressure), therefore longer L_eq self.L = self.L + self.cs_c * dt * 3.0 if (self.L > L_eq): self.L = L_eq self.rho_c = self.M_c / (self.L * self.r_c * self.r_c * pi) # Allow cloud size to shrink # However, problem is it induces a positive feedback: # Smaller Rc leads to higher vapor pressure and higher rho_eq, the cloud will collapse! if (self.rho_c < rho_eq): self.r_c = sqrt(self.M_c / (rho_eq * self.L * pi)) self.rho_c = self.M_c / (self.L * self.r_c * self.r_c * pi) self.n_c = self.rho_c / (pc.mh * 0.62) if (verbose == True): print "%5.3f(%5.3f) %6.2f %6.1f %5.3f %6.2f(%5.3f) %6.2f %5.3f %7.2f" % \ (self.time/ac.yr/1.e6, self.time/self.tau_cc, self.r / ac.kpc, self.vrel / 1.e5, self.M_c / M_0, \ self.L * 1.e3 / ac.kpc, self.L / L_eq, self.r_c * 1.e3 / ac.kpc, \ self.n_c, self.tau_evap / ac.yr / 1.e6)