.. _hadronic_pp_jet_validation_guide: Validation of the pp equilibrium against the Fokker-Plank equation solution =========================================================================== In this tutorial we validate the integral solution for the :math:`e^{\pm}` equilibrium, used for the pp jet against the Fokker-Plank equation solution implemented in the :class:`.JetTimeEvol` class (see the :ref:`hadronic_pp_jet_guide`, for more details on the pp hadronic jet model) Jet pp ------ .. code:: ipython3 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 .. code:: ipython3 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 .. code:: ipython3 import jetset print('tested on jetset',jetset.__version__) .. parsed-literal:: tested on jetset 1.2.0 .. code:: ipython3 j=Jet(emitters_distribution='plc',verbose=False,emitters_type='protons') .. code:: ipython3 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() .. code:: ipython3 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]))) .. parsed-literal:: U N(p) p>1 TeV=9.999992e-01 erg/cm-3 .. code:: ipython3 j.energetic_report(verbose=False) .. code:: ipython3 %matplotlib inline j.emitters_distribution.plot() .. parsed-literal:: .. image:: hadronic_validate_temp_ev_files/hadronic_validate_temp_ev_11_1.png .. code:: ipython3 j.save_model('hadronic.pkl') .. code:: ipython3 from jetset.jet_model import Jet j=Jet.load_model('hadronic.pkl') .. raw:: html 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 -------------------------------- .. code:: ipython3 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) .. code:: ipython3 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) .. code:: ipython3 q_inj.parameters .. raw:: html 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
.. parsed-literal:: None .. code:: ipython3 %matplotlib inline p=q_inj.plot() p.ax.plot(gamma_sec_inj, n_gamma_sec_inj,'.',ms=1.5) .. parsed-literal:: [] .. image:: hadronic_validate_temp_ev_files/hadronic_validate_temp_ev_18_1.png .. code:: ipython3 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) .. parsed-literal:: /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) .. code:: ipython3 temp_ev.Q_inj.parameters.Q.val .. parsed-literal:: 1 we use the acc region with escape time equal to radiative region .. code:: ipython3 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() .. parsed-literal:: -------------------------------------------------------------------------------- JetTimeEvol model description -------------------------------------------------------------------------------- physical setup: -------------------------------------------------------------------------------- .. raw:: html 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
.. parsed-literal:: model parameters: -------------------------------------------------------------------------------- .. raw:: html 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
.. code:: ipython3 p=temp_ev.plot_pre_run_plot(dpi=100) .. image:: hadronic_validate_temp_ev_files/hadronic_validate_temp_ev_23_0.png .. code:: ipython3 p=temp_ev.plot_time_profile() .. image:: hadronic_validate_temp_ev_files/hadronic_validate_temp_ev_24_0.png .. code:: ipython3 temp_ev.run(only_injection=True,cache_SEDs_acc=False,do_injection=True,cache_SEDs_rad=False) .. parsed-literal:: temporal evolution running .. parsed-literal:: 0%| | 0/2000000 [00:000 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] .. code:: ipython3 d=np.fabs(y_analytical_interp-y_num)/y_num assert(all(d<0.25)) .. code:: ipython3 plt.plot(x_out,d) .. parsed-literal:: [] .. image:: hadronic_validate_temp_ev_files/hadronic_validate_temp_ev_30_1.png