def get_eos_array(u_min,u_max,eos_args): n_s,a,b,Lambda,kappa,mass_args=eos_args n_s_mev4=toMev4(n_s,'mevfm') k_Fn_max=opt.newton(n_B_for_newton,1000.,args=(n_s_mev4*u_max,Lambda,kappa)) k_Fn_min=(3*np.pi**2*n_s_mev4*u_min)**(1./3) k_Fn_array=k_Fn_min*np.exp(np.linspace(0,np.log(k_Fn_max/k_Fn_min),500)) baryon_density=np.concatenate(([0],n_B(k_Fn_array,Lambda,kappa))) energy_density=np.concatenate(([0],Energy_density(k_Fn_array,n_s_mev4,a,b,Lambda,kappa,mass_args))) pressure=np.concatenate(([0],Pressure(k_Fn_array,n_s_mev4,a,b,Lambda,kappa,mass_args))) eos_array=np.array([baryon_density,energy_density,pressure]) k_Fs=(3*np.pi**2*n_s_mev4)**(1./3) sol_saturation=np.array([n_B(k_Fs,Lambda,kappa),Energy_density(k_Fs,n_s_mev4,a,b,Lambda,kappa,mass_args),Pressure(k_Fs,n_s_mev4,a,b,Lambda,kappa,mass_args)]) stability=np.logical_and(eos_array[1,1:]-eos_array[1,:-1]>0,eos_array[2,1:]-eos_array[2,:-1]>0) causality=eos_array[1,1:]-eos_array[1,:-1]>eos_array[2,1:]-eos_array[2,:-1] return toMevfm(eos_array,'mev4'),toMevfm(sol_saturation,'mev4'),bool(stability.min() and causality.min())
def __init__(self,init_args,init_sat,args): self.baryon_density_sat,self.bd_energy,self.incompressibility,\ self.m_eff,self.J,self.L,self.self_W,self.mass_args=args self.args=args self.eos_RMF=EOS_RMF(init_args,init_sat,args) self.eos_args=self.eos_RMF.eos_args self.init_sat=self.eos_RMF.init_sat self.eos_array=self.eos_RMF.eos_array self.sol_saturation=toMevfm(np.array(self.eos_RMF.sol_saturation),'mev4') fix_crust_baryon_density=np.linspace(0.6,0.3,4)*self.sol_saturation[0] self.fix_crust_logic=False for fix_crust_baryon_density_i in fix_crust_baryon_density: if(self.sol_saturation[2]>1.1*EOS_BPS.eosPressure_frombaryon(fix_crust_baryon_density_i)): self.eos_SLY4withPoly=EOS_BPSwithPoly([fix_crust_baryon_density_i,self.sol_saturation[2],self.sol_saturation[0],4*self.sol_saturation[2],2*self.sol_saturation[0],8*self.sol_saturation[2],3*self.sol_saturation[0]]) self.fix_crust_logic=True break self.stability=self.eos_RMF.stability self.positive_pressure=self.eos_RMF.positive_pressure self.baryon_density_s=self.eos_RMF.baryon_density_s self.pressure_s=self.eos_RMF.pressure_s self.density_s=self.eos_RMF.density_s self.unit_mass=self.eos_RMF.unit_mass self.unit_radius=self.eos_RMF.unit_radius self.unit_N=self.eos_RMF.unit_N
def __init__(self, args): self.m0, self.ms, self.ns, self.g = args #m in unit MeV self.baryon_density_s = self.ns self.pressure_s = toMevfm(self.m0**4, 'mev4') self.density_s = self.pressure_s n_intepolation = np.linspace(0, 20, 1001) self.pressureFermiGas = self.eos_for_intepolation(n_intepolation) self.eos_n_from_pressure = interp1d(self.pressureFermiGas, n_intepolation, kind='linear')
def __init__(self, args): self.m, self.g = args #m in unit MeV self.baryon_density_s = 0.16 self.pressure_s = toMevfm(self.m**4, 'mev4') self.density_s = self.pressure_s x_intepolation = np.linspace(0, 2000. / self.m, 1001) self.pressureFermiGas = self.eos_for_intepolation(x_intepolation) self.eos_x_from_pressure = interp1d(self.pressureFermiGas, x_intepolation, kind='linear')
def pressure_density_PNM(PNM_args,eos_args,extra_args): g2_Phi,g2_W,g2_rho,b,c,Lambda,self_W=eos_args n,mass_args=extra_args m_e,m,m_Phi,m_W,m_rho=mass_args m_eff,W_0=PNM_args n_n=n n3=-n_n k_F_n=(3*np.pi**2*n_n)**(1./3) E_F_n=(k_F_n**2+m_eff**2)**0.5 Phi_0=m-m_eff rho_0=0.5*n3/((m_rho)**2/g2_rho + 2*Lambda*W_0**2) chempo_n=E_F_n+W_0-rho_0/2 energy_density=((E_F_n*k_F_n**3+E_F_n**3*k_F_n-m_eff**4*np.log((k_F_n+E_F_n)/m_eff)))/(8*np.pi**2)+(m_Phi*Phi_0)**2/(2*g2_Phi)+(m_W*W_0)**2/(2*g2_W)+(m_rho*rho_0)**2/(2*g2_rho)+b*m*Phi_0**3/3+c*Phi_0**4/4+self_W*W_0**4/8+3*Lambda*(W_0*rho_0)**2 pressure=chempo_n*n_n-energy_density return toMevfm(np.array([energy_density,pressure]),'mev4')
def eos_pressure_density(eos_array_args,eos_args_with_baryon,mass_args): m_e,m,m_Phi,m_W,m_rho=mass_args n,g2_Phi,g2_W,g2_rho,b,c,Lambda,self_W=eos_args_with_baryon m_eff,W_0,k_F_n=eos_array_args n_n=k_F_n**3/(3*np.pi**2) n_p=n-n_n n3=n_p-n_n n_e=n_p k_F_p=(3*np.pi**2*n_p)**(1./3) k_F_e=k_F_p E_F_e=(k_F_e**2+m_e**2)**0.5 E_F_p=(k_F_p**2+m_eff**2)**0.5 E_F_n=(k_F_n**2+m_eff**2)**0.5 Phi_0=m-m_eff rho_0=0.5*n3/((m_rho)**2/g2_rho + 2*Lambda*W_0**2) chempo_e=E_F_e chempo_p=E_F_p+W_0+rho_0/2 chempo_n=E_F_n+W_0-rho_0/2 energy_density=((E_F_e*k_F_e**3+E_F_e**3*k_F_e-m_e**4*np.log((k_F_e+E_F_e)/m_e))+(E_F_p*k_F_p**3+E_F_p**3*k_F_p-m_eff**4*np.log((k_F_p+E_F_p)/m_eff))+(E_F_n*k_F_n**3+E_F_n**3*k_F_n-m_eff**4*np.log((k_F_n+E_F_n)/m_eff)))/(8*np.pi**2)+(m_Phi*Phi_0)**2/(2*g2_Phi)+(m_W*W_0)**2/(2*g2_W)+(m_rho*rho_0)**2/(2*g2_rho)+b*m*Phi_0**3/3+c*Phi_0**4/4+self_W*W_0**4/8+3*Lambda*(W_0*rho_0)**2 pressure=chempo_e*n_e+chempo_p*n_p+chempo_n*n_n-energy_density return toMevfm(np.array([n,energy_density,pressure]),'mev4')
class EOS_BPS(object): # ============================================================================= # #density in units: g/cm3 # densityBPS = np.array([-7.861E0,0.0,7.861E0, 7.900E0, 8.150E0, 1.160E1, 1.640E1, 4.510E1, 2.120E2, 1.150E3, 1.044E4, 2.622E4, 6.587E4, 1.654E5, 4.156E5, 1.044E6, 2.622E6, 6.588E6, 8.294E6, 1.655E7, 3.302E7, 6.590E7, 1.315E8, 2.624E8, 3.304E8, 5.237E8, 8.301E8, 1.045E9, 1.316E9, 1.657E9, 2.626E9, 4.164E9, 6.602E9, 8.313E9, 1.046E10, 1.318E10, 1.659E10, 2.090E10, 2.631E10, 3.313E10, 4.172E10, 5.254E10, 6.617E10, 8.333E10, 1.049E11, 1.322E11, 1.664E11, 1.844E11, 2.096E11, 2.640E11, 3.325E11, 4.188E11, 4.299E11, 4.460E11, 5.228E11, 6.610E11, 7.964E11, 9.728E11, 1.196E12, 1.471E12, 1.805E12, 2.202E12, 2.930E12, 3.833E12, 4.933E12, 6.248E12, 7.801E12, 9.612E12, 1.246E13, 1.496E13, 1.778E13, 2.210E13, 2.988E13, 3.767E13, 5.081E13, 6.193E13, 7.732E13, 9.826E13, 1.262E14]) # #pressure in units: g*cm/s # pressureBPS = np.array([-1.010E9,0.0, 1.010E9, 1.010E10, 1.010E11, 1.210E12, 1.400E13, 1.700E14, 5.820E15, 1.900E17, 9.744E18, 4.968E19, 2.431E20, 1.151E21, 5.266E21, 2.318E22, 9.755E22, 3.911E23, 5.259E23, 1.435E24, 3.833E24, 1.006E25, 2.604E25, 6.676E25, 8.738E25, 1.629E26, 3.029E26, 4.129E26, 5.036E26, 6.860E26, 1.272E27, 2.356E27, 4.362E27, 5.662E27, 7.702E27, 1.048E28, 1.425E28, 1.938E28, 2.503E28, 3.404E28, 4.628E28, 5.949E28, 8.089E28, 1.100E29, 1.495E29, 2.033E29, 2.597E29, 2.892E29, 3.290E29, 4.473E29, 5.816E29, 7.538E29, 7.805E29, 7.890E29, 8.352E29, 9.098E29, 9.831E29, 1.083E30, 1.218E30, 1.399E30, 1.638E30, 1.950E30, 2.592E30, 3.506E30, 4.771E30, 6.481E30, 8.748E30, 1.170E31, 1.695E31, 2.209E31, 2.848E31, 3.931E31, 6.178E31, 8.774E31, 1.386E32, 1.882E32, 2.662E32, 3.897E32, 5.861E32]) # #baryon density in units: 1/cm3 # baryondensityBPS = np.array([-4.73E24,0.0, 4.73E24, 4.76E24, 4.91E24, 6.990E24, 9.900E24, 2.720E25, 1.270E26, 6.930E26, 6.295E27, 1.581E28, 3.972E28, 9.976E28, 2.506E29, 6.294E29, 1.581E30, 3.972E30, 5.000E30, 9.976E30, 1.990E31, 3.972E31, 7.924E31, 1.581E32, 1.990E32, 3.155E32, 5.000E32, 6.294E32, 7.924E32, 9.976E32, 1.581E33, 2.506E33, 3.972E33, 5.000E33, 6.294E33, 7.924E33, 9.976E33, 1.256E34, 1.581E34, 1.990E34, 2.506E34, 3.155E34, 3.972E34, 5.000E34, 6.294E34, 7.924E34, 9.976E34, 1.105E35, 1.256E35, 1.581E35, 1.990E35, 2.506E35, 2.572E35, 2.670E35, 3.126E35, 3.951E35, 4.759E35, 5.812E35, 7.143E35, 8.786E35, 1.077E36, 1.314E36, 1.748E36, 2.287E36, 2.942E36, 3.726E36, 4.650E36, 5.728E36, 7.424E36, 8.907E36, 1.059E37, 1.315E37, 1.777E37, 2.239E37, 3.017E37, 3.675E37, 4.585E37, 5.821E37, 7.468E37]) # #density in units: Mevfm3 # densityBPS = toMevfm(densityBPS,'density') # #pressure in units: Mevfm3 # pressureBPS = toMevfm(pressureBPS,'pressure') # #baryon density in units: 1/fm3 # baryondensityBPS = toMevfm(baryondensityBPS,'baryondensity') # ============================================================================= eos_sly4 = np.loadtxt('./eos_sly4.dat') baryondensityBPS = eos_sly4[:, 0] densityBPS = eos_sly4[:, 1] pressureBPS = eos_sly4[:, 2] #density in units: Mevfm3 densityBPS = toMevfm(densityBPS, 'density') #pressure in units: Mevfm3 pressureBPS = toMevfm(pressureBPS, 'pressure') eos_array = np.array([baryondensityBPS, densityBPS, pressureBPS]) eosPressure_frombaryon = interp1d( list(baryondensityBPS[:66]) + [0.16 / 2.7] + list(baryondensityBPS[66:]) + [baryondensityBPS[-1] * 100], list(pressureBPS[:66]) + [0.22201] + list(pressureBPS[66:]) + [pressureBPS[-1] * 100], kind='quadratic') eosPressure = interp1d(list(densityBPS[:66]) + [56.2006] + list(densityBPS[66:]) + [densityBPS[-1] * 100], list(pressureBPS[:66]) + [0.22201] + list(pressureBPS[66:]) + [pressureBPS[-1] * 100], kind='quadratic') eosDensity = interp1d(list(pressureBPS[:66]) + [0.22201] + list(pressureBPS[66:]) + [pressureBPS[-1] * 100], list(densityBPS[:66]) + [56.2006] + list(densityBPS[66:]) + [densityBPS[-1] * 100], kind='quadratic') eosBaryonDensity = interp1d( list(pressureBPS[:66]) + [0.22201] + list(pressureBPS[66:]) + [pressureBPS[-1] * 100], list(baryondensityBPS[:66]) + [0.16 / 2.7] + list(baryondensityBPS[66:]) + [baryondensityBPS[-1] * 100], kind='quadratic') baryon_density_s = 0.16 chempo_surface = (pressureBPS[0] + densityBPS[0]) / baryondensityBPS[0] pressure_s = eosPressure_frombaryon(baryon_density_s) density_s = eosDensity(pressure_s) unit_mass = c**4 / (G**3 * density_s * 1e51 * e)**0.5 unit_radius = c**2 / (G * density_s * 1e51 * e)**0.5 unit_N = unit_radius**3 * baryon_density_s * 1e45 def eosChempo(self, pressure): return (pressure + self.eosDensity(pressure)) / self.eosBaryonDensity(pressure) def eosCs2(self, pressure): return 1.0 / derivative( self.eosDensity, pressure, dx=pressure * dlnx_cs2)
def Cs2(k_Fn, n_s, a, b, Lambda, kappa, mass_args): det_Pressure = Pressure( k_Fn * 1.001, n_s, a, b, Lambda, kappa, mass_args) - Pressure( k_Fn * 0.999, n_s, a, b, Lambda, kappa, mass_args) det_Energy_density = Energy_density( k_Fn * 1.001, n_s, a, b, Lambda, kappa, mass_args) - Energy_density( k_Fn * 0.999, n_s, a, b, Lambda, kappa, mass_args) return det_Pressure / det_Energy_density Lambda = 380. kappa = 0.3 mass_args = (939., 313., 313.) n_s = toMev4(0.16, 'mevfm') a = -28.8 b = 10. k_Fn = 10**np.linspace(0, 3.3, 100) k_FQ_array = k_FQ(k_Fn, Lambda, kappa) n_B_array = toMevfm(n_B(k_Fn, Lambda, kappa), 'mev4') Energy_density_array = toMevfm( Energy_density(k_Fn, n_s, a, b, Lambda, kappa, mass_args), 'mev4') Pressure_array = toMevfm(Pressure(k_Fn, n_s, a, b, Lambda, kappa, mass_args), 'mev4') Cs2_array = Cs2(k_Fn, n_s, a, b, Lambda, kappa, mass_args) plt.plot(n_B_array, Cs2_array) plt.xlabel('n_B') plt.ylabel('c$_s^2$')
mn,mp=np.loadtxt(path+EOS_i+'/eos.thermo',max_rows=1)[:2] thermo=np.loadtxt(path+EOS_i+'/eos.thermo',skiprows=1) chempo_min=(thermo[0,5]+1)*mn eos.append(EOS_intepolation(chempo_min,EOS_ns_i,nb,(thermo[:,9]+1)*(nb*mn),thermo[:,3]*nb)) import matplotlib.pyplot as plt import show_properity as sp fig, axes = plt.subplots(1, 1,figsize=(8,6),sharex=True,sharey=True) sp.show_eos(axes,eos,0,1,500,pressure_range=[0.01,300,'log'],legend=EOS_LIST) path='../EOS_Tables_Ozel/' eos=[] EOS_LIST=['ap4','mpa1','wff1','sly'] EOS_ns_LIST=[0.16,0.16,0.16,0.159] for EOS_i,EOS_ns_i in zip(EOS_LIST,EOS_ns_LIST): eos_array_i=np.loadtxt(path+EOS_i+'.dat',skiprows=0) nb=toMevfm(eos_array_i[:,0]/1.66*1e24,'baryondensity') pr=toMevfm(eos_array_i[:,1],'density') ep=toMevfm(eos_array_i[:,2],'density') chempo_min=(ep[0]+pr[0]) eos.append(EOS_intepolation(chempo_min,EOS_ns_i,nb,ep,pr)) import matplotlib.pyplot as plt import show_properity as sp fig, axes = plt.subplots(1, 1,figsize=(8,6),sharex=True,sharey=True) sp.show_eos(axes,eos,0,1,500,pressure_range=[0.01,300,'log'],legend=EOS_LIST) # ============================================================================= # from scipy.optimize import curve_fit # from FindMaxmass import Maxmass # index_bondary=2. # for i in range(4): # pc_max=Maxmass(1e-8,1e-5,eos[i])[1]
def __setstate__(self, state): self.__dict__.update(state) self.eosPressure_frombaryon = interp1d(toMevfm(self.eos_array[0],'mev4'),toMevfm(self.eos_array[2],'mev4'), kind='linear') self.eosPressure = interp1d(toMevfm(self.eos_array[1],'mev4'),toMevfm(self.eos_array[2],'mev4'), kind='linear') self.eosDensity = interp1d(toMevfm(self.eos_array[2],'mev4'),toMevfm(self.eos_array[1],'mev4'), kind='linear') self.eosBaryonDensity = interp1d(toMevfm(self.eos_array[2],'mev4'),toMevfm(self.eos_array[0],'mev4'), kind='linear')
def __init__(self,init_args,init_sat,args): self.baryon_density_sat,self.bd_energy,self.incompressibility,\ self.m_eff,self.J,self.L,self.self_W,self.mass_args=args self.args=args sol_parameters = opt.root(equations,init_args[:6],tol=Preset_tol,args=self.args) self.eos_args=list(sol_parameters.x)+[self.self_W] #init_saturation = [6.2e+02,3.2e+02,2.6e+02,4.9e+01,3.2e+02,1.1e+09,1.8e+07] self.init_sat,self.eos_array,self.sol_saturation,self.stability,self.positive_pressure=get_eos_array(init_sat,Preset_tol,self.baryon_density_sat,self.mass_args,self.eos_args) print(self.stability,self.positive_pressure) # ============================================================================= # plt.plot(toMevfm(self.eos_array[6],'mev4'),toMevfm(self.eos_array[7],'mev4')) # print(toMevfm(self.eos_array[7],'mev4')) # plt.xlim(0,500) # plt.ylim(0,5) # ============================================================================= self.baryon_density_s=toMevfm(self.baryon_density_sat,'mev4') self.pressure_s=toMevfm(self.sol_saturation[2],'mev4') self.density_s=toMevfm(self.sol_saturation[1],'mev4') self.unit_mass=c**4/(G**3*self.density_s*1e51*e)**0.5 self.unit_radius=c**2/(G*self.density_s*1e51*e)**0.5 self.unit_N=self.unit_radius**3*self.baryon_density_s*1e45 self.eosPressure_frombaryon = interp1d(toMevfm(self.eos_array[0],'mev4'),toMevfm(self.eos_array[2],'mev4'), kind='linear') self.eosPressure = interp1d(toMevfm(self.eos_array[1],'mev4'),toMevfm(self.eos_array[2],'mev4'), kind='linear') self.eosDensity = interp1d(toMevfm(self.eos_array[2],'mev4'),toMevfm(self.eos_array[1],'mev4'), kind='linear') self.eosBaryonDensity = interp1d(toMevfm(self.eos_array[2],'mev4'),toMevfm(self.eos_array[0],'mev4'), kind='linear')
def eosBaryonDensity(self, pressure): n = self.eos_n_from_pressure(pressure) return toMevfm(self.g * self.m(n)**3 * self.x(n)**3 / (6 * np.pi**2), 'mev4')
def eosDensity(self, pressure): n = self.eos_n_from_pressure(pressure) return toMevfm(self.g * self.m(n)**4 * self.chi(self.x(n)), 'mev4')
def eos_for_intepolation(self, n): pressure = toMevfm(self.g * self.m(n)**4 * self.phi(self.x(n)), 'mev4') #energydensity=toMevfm(self.g*self.m**4*self.chi(x),'mev4') return pressure #,energydensity
def eos_for_intepolation(self, chempo): pressure = toMevfm(-self.Omega(chempo), 'mev4') - self.bag baryondensity = toMevfm(-self.dOmega_dchempo(chempo), 'mev4') energydensity = chempo * baryondensity - pressure return pressure, energydensity, baryondensity
def eosBaryonDensity(self, pressure): return toMevfm( self.g * self.m**3 * self.eos_x_from_pressure(pressure)**3 / (6 * np.pi**2), 'mev4')
def eosDensity(self, pressure): return toMevfm( self.g * self.m**4 * self.chi(self.eos_x_from_pressure(pressure)), 'mev4')