Sukhbold 2015 Models

CSN neutrino models from the MPA Garching CCSN archive based on the paper by Sukhbold et al., 2015. The archive is available on their website, but the data are private and available only upon request. Note these are the results using the PROMETHEUS-VERTEX code https://ui.adsabs.harvard.edu/abs/2002A%26A…396..361R/abstract. The four models are also described in Appendix C of this paper https://arxiv.org/abs/2010.04728

The citation is: Core-Collapse Supernovae from 9 to 120 Solar Masses Based on Neutrino-powered Explosions, Tuguldur Sukhbold, T. Ertl, S. E. Woosley, Justin M. Brown, H.-T. Janka, Astrophys. J. 821 (2016) 38, arXiv:1510.04643.

[1]:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

from astropy import units as u

from snewpy.neutrino import Flavor, MassHierarchy
from snewpy.models.ccsn import Sukhbold_2015
from snewpy.flavor_transformation import NoTransformation, AdiabaticMSW, ThreeFlavorDecoherence

mpl.rc('font', size=16)
%matplotlib inline

Initialize Models

To start, let’s see what progenitors are available for the Sukhbold_2015 model. We can use the param property to view all physics parameters and their possible values:

[2]:
Sukhbold_2015.param
[2]:
{'progenitor_mass': <Quantity [27. ,  9.6] solMass>, 'eos': ['LS220', 'SFHo']}

We’ll initialise two of these progenitors. If this is the first time you’re using a progenitor, snewpy will automatically download the required data files for you.

[3]:
mls220 = Sukhbold_2015(progenitor_mass=27*u.solMass, eos='LS220')
msfho = Sukhbold_2015(progenitor_mass=27*u.solMass, eos='SFHo')

mls220
[3]:

Sukhbold_2015 Model: sukhbold-LS220-s27.0.fits

Parameter

Value

Progenitor mass

\(27\) \(\mathrm{M_{\odot}}\)

EOS

LS220

Finally, let’s plot the luminosity of different neutrino flavors for this model. (Note that the Sukhbold_2015 simulations didn’t distinguish between \(\nu_x\) and \(\bar{\nu}_x\), so both have the same luminosity.)

[4]:

fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True, tight_layout=True) for i, model in enumerate([mls220, msfho]): ax = axes[i] for flavor in Flavor: ax.plot(model.time, model.luminosity[flavor]/1e51, # Report luminosity in units foe/s label=flavor.to_tex(), color='C0' if flavor.is_electron else 'C1', ls='-' if flavor.is_neutrino else ':', lw=2) ax.set(xlim=(-0.05, 0.65), xlabel=r'$t-t_{\rm bounce}$ [s]', title=r'{}: {} $M_\odot$'.format(model.metadata['EOS'], model.metadata['Progenitor mass'].value)) ax.grid() ax.legend(loc='upper right', ncol=2, fontsize=18) axes[0].set(ylabel=r'luminosity [foe s$^{-1}$]');
../../_images/nb_ccsn_Sukhbold_2015_7_0.png

Initial and Oscillated Spectra

Plot the neutrino spectra at the source and after the requested flavor transformation has been applied.

Adiabatic MSW Flavor Transformation: Normal mass ordering

[5]:
# Adiabatic MSW effect. NMO is used by default.
xform_nmo = AdiabaticMSW()

# Energy array and time to compute spectra.
# Note that any convenient units can be used and the calculation will remain internally consistent.
E = np.linspace(0,100,201) * u.MeV
t = 50*u.ms

ispec = model.get_initial_spectra(t, E)
ospec_nmo = model.get_transformed_spectra(t, E, xform_nmo)
[6]:
fig, axes = plt.subplots(1,2, figsize=(12,5), sharex=True, sharey=True, tight_layout=True)

for i, spec in enumerate([ispec, ospec_nmo]):
    ax = axes[i]
    for flavor in Flavor:
        ax.plot(E, spec[flavor],
                label=flavor.to_tex(),
                color='C0' if flavor.is_electron else 'C1',
                ls='-' if flavor.is_neutrino else ':', lw=2,
                alpha=0.7)

    ax.set(xlabel=r'$E$ [{}]'.format(E.unit),
           title='Initial Spectra: $t = ${:.1f}'.format(t) if i==0 else 'Oscillated Spectra: $t = ${:.1f}'.format(t))
    ax.grid()
    ax.legend(loc='upper right', ncol=2, fontsize=16)

ax = axes[0]
ax.set(ylabel=r'flux [erg$^{-1}$ s$^{-1}$]')

fig.tight_layout();
../../_images/nb_ccsn_Sukhbold_2015_10_0.png