Warren 2020 Models

Data from “Constraining properties of the next nearby core-collapse supernova with multi-messenger signals: multi-messenger signals” by Warren, MacKenzie; Couch, Sean; O’Connor, Evan; Morozova, Viktoriya.

1D FLASH simulations with STIR, for alpha_lambda = 1.23, 1.25, and 1.27. Run with SFHo EOS, M1 with 12 energy groups.

For more information on these simulations, see Warren, Couch, O’Connor, & Morozova (arXiv:1912.03328) and Couch, Warren, & O’Connor (2020).

Includes the multi-messenger data from the STIR simulations. The filename indicates the turbulent mixing parameter a and progenitor mass m of the simulation. Columns are time [s], shock radius [cm], explosion energy [ergs], electron neutrino mean energy [MeV], electron neutrino rms energy [MeV], electron neutrino luminosity [10^51 ergs/s], electron antineutrino mean energy [MeV], electron antineutrino rms energy [MeV], electron antineutrino luminosity [10^51 ergs/s], x neutrino mean energy [MeV], x neutrino rms energy [MeV], x neutrino luminosity [10^51 ergs/s], gravitational wave frequency from eigenmode analysis of the protoneutron star structure [Hz]. Note that the x neutrino luminosity is for one neutrino flavor - to get the total mu/tau neutrino and antineutrino luminosities requires multiplying this number by 4.

[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 Warren_2020
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 Warren_2020 model. We can use the param property to view all physics parameters and their possible values:

[2]:
Warren_2020.param
[2]:
{'progenitor_mass': <Quantity [  9.  ,   9.25,   9.5 ,   9.75,  10.  ,  10.25,  10.5 ,  10.75,
             11.  ,  11.25,  11.5 ,  11.75,  12.  ,  12.25,  12.5 ,  12.75,
             13.  ,  13.1 ,  13.2 ,  13.3 ,  13.4 ,  13.5 ,  13.6 ,  13.7 ,
             13.8 ,  13.9 ,  14.  ,  14.1 ,  14.2 ,  14.3 ,  14.4 ,  14.5 ,
             14.6 ,  14.7 ,  14.8 ,  14.9 ,  15.  ,  15.1 ,  15.2 ,  15.3 ,
             15.4 ,  15.5 ,  15.6 ,  15.7 ,  15.8 ,  15.9 ,  16.  ,  16.1 ,
             16.2 ,  16.3 ,  16.4 ,  16.5 ,  16.6 ,  16.7 ,  16.8 ,  16.9 ,
             17.  ,  17.1 ,  17.2 ,  17.3 ,  17.4 ,  17.5 ,  17.6 ,  17.7 ,
             17.8 ,  17.9 ,  18.  ,  18.1 ,  18.2 ,  18.3 ,  18.4 ,  18.5 ,
             18.6 ,  18.7 ,  18.8 ,  18.9 ,  19.  ,  19.1 ,  19.2 ,  19.3 ,
             19.4 ,  19.5 ,  19.6 ,  19.7 ,  19.8 ,  19.9 ,  20.  ,  20.1 ,
             20.2 ,  20.3 ,  20.4 ,  20.5 ,  20.6 ,  20.7 ,  20.8 ,  20.9 ,
             21.  ,  21.1 ,  21.2 ,  21.3 ,  21.4 ,  21.5 ,  21.6 ,  21.7 ,
             21.8 ,  21.9 ,  22.  ,  22.1 ,  22.2 ,  22.3 ,  22.4 ,  22.5 ,
             22.6 ,  22.7 ,  22.8 ,  22.9 ,  23.  ,  23.1 ,  23.2 ,  23.3 ,
             23.4 ,  23.5 ,  23.6 ,  23.7 ,  23.8 ,  23.9 ,  24.  ,  24.1 ,
             24.2 ,  24.3 ,  24.4 ,  24.5 ,  24.6 ,  24.7 ,  24.8 ,  24.9 ,
             25.  ,  25.1 ,  25.2 ,  25.3 ,  25.4 ,  25.5 ,  25.6 ,  25.7 ,
             25.8 ,  25.9 ,  26.  ,  26.1 ,  26.2 ,  26.3 ,  26.4 ,  26.5 ,
             26.6 ,  26.7 ,  26.8 ,  26.9 ,  27.  ,  27.1 ,  27.2 ,  27.3 ,
             27.4 ,  27.5 ,  27.6 ,  27.7 ,  27.8 ,  27.9 ,  28.  ,  28.1 ,
             28.2 ,  28.3 ,  28.4 ,  28.5 ,  28.6 ,  28.7 ,  28.8 ,  28.9 ,
             29.  ,  29.1 ,  29.2 ,  29.3 ,  29.4 ,  29.5 ,  29.6 ,  29.7 ,
             29.8 ,  29.9 ,  30.  ,  31.  ,  32.  ,  33.  ,  35.  ,  40.  ,
             45.  ,  50.  ,  55.  ,  60.  ,  70.  ,  80.  , 100.  , 120.  ] solMass>,
 'turbmixing_param': [1.23, 1.25, 1.27],
 'eos': ['SFHo']}

Quite a lot of choice there! Let’s use the get_param_combinations function to get a list of all valid combinations and filter it:

[3]:
# This will print a long tuple of combinations:
#Warren_2020.get_param_combinations()

# To get a more manageable list, let’s filter it to show only the
# available progenitors with integer masses and mixing of 1.23:
filtered_models = list(params for params in Warren_2020.get_param_combinations()
                              if params['turbmixing_param'] == 1.23
                              and params['progenitor_mass'].value.is_integer()
                              and 10 <= params['progenitor_mass'].value <= 25)
print("Filtered list of progenitors:\n", *filtered_models, sep='\n')

Filtered list of progenitors:

{'progenitor_mass': <Quantity 10. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 11. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 12. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 13. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 14. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 15. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 16. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 17. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 18. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 19. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 20. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 21. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 22. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 23. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 24. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 25. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}

We’ll pick one of these progenitors and initialise it. If this is the first time you’re using this progenitor, snewpy will automatically download the required data file for you.

[4]:
m10 = Warren_2020(**filtered_models[0])
m25 = Warren_2020(**filtered_models[-1])
# This is equivalent to:
#m10 = Warren_2020(progenitor_mass=10*u.solMass, turbmixing_param=1.23)
#m25 = Warren_2020(progenitor_mass=25*u.solMass, turbmixing_param=1.23)

m10
/tmp/ipykernel_2221/1210975369.py:1: UserWarning: Argument `eos` is deprecated.
  m10 = Warren_2020(**filtered_models[0])
/tmp/ipykernel_2221/1210975369.py:2: UserWarning: Argument `eos` is deprecated.
  m25 = Warren_2020(**filtered_models[-1])
[4]:

Warren_2020 Model: stir_multimessenger_a1.23_m10.0.h5

Parameter

Value

EOS

SFHo

Progenitor mass

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

Turb. mixing param.

1.23

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

[5]:
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True, tight_layout=True)

for i, model in enumerate([m10, m25]):
    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_Warren_2020_9_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

[6]:
# 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)
[7]:
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_Warren_2020_12_0.png