Validation of the pp equilibrium against the Fokker-Plank equation solution

In this tutorial we validate the integral solution for the \(e^{\pm}\) equilibrium, used for the pp jet against the Fokker-Plank equation solution implemented in the JetTimeEvol class (see the Hadronic pp jet model, for more details on the pp hadronic jet model)

Jet pp

from jetset.jet_model import Jet
from jetset.jetkernel import jetkernel
from astropy import constants as const
from jetset.jet_emitters_factory import EmittersFactory
from jetset.jet_emitters import InjEmittersArrayDistribution
import numpy as np
import matplotlib.pyplot as plt
def get_component(j_name,nu_name):
    j_nu_ptr=getattr(j._blob,j_name)
    nu_ptr=getattr(j._blob,nu_name)
    xg=np.zeros(j._blob.nu_grid_size)
    yg=np.zeros(j._blob.nu_grid_size)
    for i in range(j._blob.nu_grid_size):
        xg[i]=jetkernel.get_spectral_array(nu_ptr,j._blob,i)
        yg[i]=jetkernel.get_spectral_array(j_nu_ptr,j._blob,i)

    m=yg>0

    xg=xg[m]
    yg=yg[m]
    yg=yg*xg
    yg=yg*jetkernel.erg_to_TeV

    xg=xg*jetkernel.HPLANCK_TeV

    return xg,yg
import jetset
print('tested on jetset',jetset.__version__)
tested on jetset 1.2.0
j=Jet(emitters_distribution='plc',verbose=False,emitters_type='protons')
j.parameters.z_cosm.val=z=0.001
j.parameters.beam_obj.val=1
j.parameters.gamma_cut.val=1000/(jetkernel.MPC2_TeV)
j.parameters.NH_pp.val=1
j.parameters.N.val=1
j.parameters.p.val=2.0
j.parameters.B.val=.5
j.parameters.R.val=1E18
j.parameters.gmin.val=1
j.parameters.gmax.val=1E4
j.set_emiss_lim(1E-60)
j.set_IC_nu_size(100)
j.gamma_grid_size=200
j.eval()
gmin=1.0/jetkernel.MPC2_TeV
j.set_N_from_U_emitters(1.0, gmin=gmin)
j.eval()

#j.show_model()

m=j.emitters_distribution.gamma_p>gmin
print('U N(p) p>1 TeV=%e erg/cm-3'%(jetkernel.MPC2*np.trapz(j.emitters_distribution.n_gamma_p[m]*j.emitters_distribution.gamma_p[m],j.emitters_distribution.gamma_p[m])))
U N(p) p>1 TeV=9.999992e-01 erg/cm-3
j.energetic_report(verbose=False)
%matplotlib inline
j.emitters_distribution.plot()
<jetset.plot_sedfit.PlotPdistr at 0x7fc5c3373fd0>
../../../_images/hadronic_validate_temp_ev_11_1.png
j.save_model('hadronic.pkl')
from jetset.jet_model import Jet
j=Jet.load_model('hadronic.pkl')
Table length=11
model namenamepar typeunitsvalphys. bound. minphys. bound. maxlogfrozen
jet_hadronic_ppgminlow-energy-cut-offlorentz-factor*1.000000e+001.000000e+001.000000e+09FalseFalse
jet_hadronic_ppgmaxhigh-energy-cut-offlorentz-factor*1.000000e+041.000000e+001.000000e+15FalseFalse
jet_hadronic_ppNemitters_density1 / cm33.022554e+020.000000e+00--FalseFalse
jet_hadronic_ppNH_pptarget_density1 / cm31.000000e+000.000000e+00--FalseFalse
jet_hadronic_ppgamma_cutturn-over-energylorentz-factor*1.065789e+061.000000e+001.000000e+09FalseFalse
jet_hadronic_pppLE_spectral_slope2.000000e+00-1.000000e+011.000000e+01FalseFalse
jet_hadronic_ppRregion_sizecm1.000000e+181.000000e+031.000000e+30FalseFalse
jet_hadronic_ppR_Hregion_positioncm1.000000e+170.000000e+00--FalseTrue
jet_hadronic_ppBmagnetic_fieldgauss5.000000e-010.000000e+00--FalseFalse
jet_hadronic_ppbeam_objbeaminglorentz-factor*1.000000e+001.000000e-04--FalseFalse
jet_hadronic_ppz_cosmredshift1.000000e-030.000000e+00--FalseFalse

setting up the JetTimeEvol model

gamma_sec_evovled=np.copy(j.emitters_distribution.gamma_e)
n_gamma_sec_evovled=np.copy(j.emitters_distribution.n_gamma_e)
gamma_sec_inj=np.copy(j.emitters_distribution.gamma_e_second_inj)
n_gamma_sec_inj=np.copy(j.emitters_distribution.n_gamma_e_second_inj)
from jetset.jet_emitters_factory import EmittersFactory
from jetset.jet_emitters import InjEmittersArrayDistribution
q_inj=InjEmittersArrayDistribution(name='array_distr',emitters_type='electrons',gamma_array=gamma_sec_inj,n_gamma_array=n_gamma_sec_inj,normalize=False)
q_inj.parameters
Table length=3
namepar typeunitsvalphys. bound. minphys. bound. maxlogfrozen
gminlow-energy-cut-offlorentz-factor*1.000000e+001.000000e+001.000000e+09FalseFalse
gmaxhigh-energy-cut-offlorentz-factor*1.836150e+071.000000e+001.000000e+15FalseFalse
Qemitters_density1 / (cm3 s)1.000000e+000.000000e+00--FalseFalse
None
%matplotlib inline
p=q_inj.plot()
p.ax.plot(gamma_sec_inj, n_gamma_sec_inj,'.',ms=1.5)
[<matplotlib.lines.Line2D at 0x7fc5c471fd90>]
../../../_images/hadronic_validate_temp_ev_18_1.png
from jetset.jet_timedep import JetTimeEvol
from jetset.jet_model import Jet

temp_ev=JetTimeEvol(jet_rad=j,Q_inj=q_inj,only_radiation=True,inplace=True)
/Users/orion/anaconda3/envs/jetset/lib/python3.8/site-packages/jetset/model_manager.py:147: UserWarning: no cosmology defined, using default FlatLambdaCDM(name="Planck13", H0=67.8 km / (Mpc s), Om0=0.307, Tcmb0=2.725 K, Neff=3.05, m_nu=[0.   0.   0.06] eV, Ob0=0.0483)
  warnings.warn('no cosmology defined, using default %s'%self.cosmo)
temp_ev.Q_inj.parameters.Q.val
1

we use the acc region with escape time equal to radiative region

duration=5E9
duration_acc=0
T_SIZE=np.int(2E6)

temp_ev.parameters.duration.val=duration

temp_ev.parameters.TStart_Inj.val=0
temp_ev.parameters.TStop_Inj.val=duration
temp_ev.parameters.T_esc_rad.val= 1


temp_ev.parameters.Esc_Index_rad.val=0
temp_ev.parameters.t_size.val=T_SIZE
temp_ev.parameters.num_samples.val=500
temp_ev.IC_cooling='off'
temp_ev.parameters.L_inj.val=0

temp_ev.parameters.gmin_grid.val=1.1
temp_ev.parameters.gmax_grid.val=5E7
temp_ev.parameters.gamma_grid_size.val=400

temp_ev.init_TempEv()
temp_ev.region_expansion='off'
temp_ev.show_model()
--------------------------------------------------------------------------------
JetTimeEvol model description
--------------------------------------------------------------------------------

physical setup:

--------------------------------------------------------------------------------
Table length=12
namepar typevalunitsval*units*log
delta ttime2.500000e+03s7.494811449999999e-05R/cFalse
log. samplingtime0.000000e+00NoneFalse
R/ctime3.335641e+07s1.0R/cFalse
IC coolingoffNoneFalse
Sync coolingonNoneFalse
Adiab. coolingonNoneFalse
Reg. expansionoffNoneFalse
Tesc radtime3.335641e+07s1.0R/cFalse
R_rad rad startregion_position1.000000e+18cmNoneFalse
R_H rad startregion_position1.000000e+17cmNoneFalse
T min. synch. cooling6.190400e+01sNoneFalse
L inj (electrons)injected lum.7.490407e+38erg/sNoneFalse
model parameters:

--------------------------------------------------------------------------------
Table length=17
model namenamepar typeunitsvalphys. bound. minphys. bound. maxlogfrozen
jet_time_evdurationtime_grids5.000000e+090.000000e+00--FalseTrue
jet_time_evgmin_gridgamma_grid1.100000e+000.000000e+00--FalseTrue
jet_time_evgmax_gridgamma_grid5.000000e+070.000000e+00--FalseTrue
jet_time_evgamma_grid_sizegamma_grid4.000000e+020.000000e+00--FalseTrue
jet_time_evTStart_Injtime_grids0.000000e+000.000000e+00--FalseTrue
jet_time_evTStop_Injtime_grids5.000000e+090.000000e+00--FalseTrue
jet_time_evT_esc_radescape_time(R/c)*1.000000e+00----FalseTrue
jet_time_evEsc_Index_radfp_coeff_index0.000000e+00----FalseTrue
jet_time_evR_rad_startregion_sizecm1.000000e+180.000000e+00--FalseTrue
jet_time_evR_H_rad_startregion_positioncm1.000000e+170.000000e+00--FalseTrue
jet_time_evm_Bmagnetic_field_index1.000000e+001.000000e+002.000000e+00FalseTrue
jet_time_evt_jet_expexp_start_times1.000000e+050.000000e+00--FalseTrue
jet_time_evbeta_exp_Rbeta_expansionv/c*1.000000e+000.000000e+001.000000e+00FalseTrue
jet_time_evB_radmagnetic_fieldG5.000000e-010.000000e+00--FalseTrue
jet_time_evt_sizetime_grid2.000000e+060.000000e+00--FalseTrue
jet_time_evnum_samplestime_ev_output5.000000e+020.000000e+00--FalseTrue
jet_time_evL_injinj_luminosityerg / s0.000000e+000.000000e+00--FalseTrue
p=temp_ev.plot_pre_run_plot(dpi=100)
../../../_images/hadronic_validate_temp_ev_23_0.png
p=temp_ev.plot_time_profile()
../../../_images/hadronic_validate_temp_ev_24_0.png
temp_ev.run(only_injection=True,cache_SEDs_acc=False,do_injection=True,cache_SEDs_rad=False)
temporal evolution running
0%|          | 0/2000000 [00:00<?, ?it/s]
temporal evolution completed

we use the acc region with escape time equal to radiative region

p=temp_ev.plot_tempev_emitters(region='rad',loglog=False,energy_unit='gamma',pow=0,plot_Q_inj=True)
p.ax.plot(gamma_sec_evovled,n_gamma_sec_evovled,'-',label='analytical solution',lw=4,color='gray',alpha=0.75,zorder=0)
p.ax.legend()
p.setlim(y_min=1E-30,y_max=1E-2)
../../../_images/hadronic_validate_temp_ev_27_0.png
m=n_gamma_sec_evovled>0
x_analytical=np.log10(gamma_sec_evovled[m])
y_analytical=np.log10(n_gamma_sec_evovled[m])

m=temp_ev.rad_region.time_sampled_emitters.n_gamma[-1]>0
x_num=np.log10(temp_ev.rad_region.time_sampled_emitters.gamma[m])
y_num=np.log10(temp_ev.rad_region.time_sampled_emitters.n_gamma[-1][m])

y_analytical_interp = np.interp(x_num, x_analytical,y_analytical, left=np.nan, right=np.nan)

m=~np.isnan(y_analytical_interp)
m=np.logical_and(m,x_num>0.25)
m=np.logical_and(m,x_num<6)

y_analytical_interp=10**y_analytical_interp[m]
x_out=x_num[m]
y_num=10**y_num[m]
d=np.fabs(y_analytical_interp-y_num)/y_num
assert(all(d<0.25))
plt.plot(x_out,d)
[<matplotlib.lines.Line2D at 0x7fc5c4724130>]
../../../_images/hadronic_validate_temp_ev_30_1.png