Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gamma ray spectra dep #2793

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions tardis/energy_input/GXPacket.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class GXPacketStatus(IntEnum):
("status", int64),
("shell", int64),
("time_current", float64),
("positron_fraction", float64),
("tau", float64),
]

Expand All @@ -53,6 +54,7 @@ def __init__(
status,
shell,
time_current,
positron_fraction,
):
self.location = location
self.direction = direction
Expand All @@ -64,6 +66,7 @@ def __init__(
self.shell = shell
self.time_current = time_current
# TODO: rename to tau_event
self.positron_fraction = positron_fraction
self.tau = -np.log(np.random.random())

def get_location_r(self):
Expand Down Expand Up @@ -95,6 +98,7 @@ def __init__(
status,
shell,
time_current,
positron_fraction,
):
self.location = location
self.direction = direction
Expand All @@ -106,6 +110,7 @@ def __init__(
self.shell = shell
self.time_current = time_current
self.number_of_packets = len(self.energy_rf)
self.positron_fraction = positron_fraction
self.tau = -np.log(np.random.random(self.number_of_packets))


Expand Down
63 changes: 16 additions & 47 deletions tardis/energy_input/gamma_packet_loop.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import numpy as np
from numba import njit

from tardis.energy_input.gamma_ray_estimators import deposition_estimator_kasen
from tardis.energy_input.gamma_ray_grid import (
distance_trace,
move_packet,
Expand Down Expand Up @@ -38,17 +37,15 @@ def gamma_packet_loop(
pair_creation_opacity_type,
electron_number_density_time,
mass_density_time,
inv_volume_time,
iron_group_fraction_per_shell,
inner_velocities,
outer_velocities,
times,
dt_array,
effective_time_array,
energy_bins,
energy_df_rows,
energy_plot_df_rows,
energy_out,
energy_deposited_gamma,
energy_deposited_positron,
packets_info_array,
):
"""Propagates packets through the simulation
Expand Down Expand Up @@ -103,13 +100,12 @@ def gamma_packet_loop(
escaped_packets = 0
scattered_packets = 0
packet_count = len(packets)
# Logging does not work with numba
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the "print statement".

print("Entering gamma ray loop for " + str(packet_count) + " packets")

deposition_estimator = np.zeros_like(energy_df_rows)

for i in range(packet_count):
packet = packets[i]
time_index = get_index(packet.time_current, times)
time_index = get_index(packet.time_current, effective_time_array)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Set positron energy to zero here now that it has been deposited?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively, remove and calculate separately.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i.e. instead of in this loop, use the dataframe and sum all the positron energy per shell per time step and use those to fill out this array

if time_index < 0:
print(packet.time_current, time_index)
Expand Down Expand Up @@ -203,7 +199,7 @@ def gamma_packet_loop(
outer_velocities,
total_opacity,
effective_time_array[time_index],
times[time_index + 1],
effective_time_array[time_index + 1],
)

distance = min(
Expand All @@ -214,16 +210,6 @@ def gamma_packet_loop(

packet = move_packet(packet, distance)

deposition_estimator[packet.shell, time_index] += (
(initial_energy * 1000)
* distance
* (packet.energy_cmf / initial_energy)
* deposition_estimator_kasen(
comoving_energy,
mass_density_time[packet.shell, time_index],
iron_group_fraction_per_shell[packet.shell],
)
)

if distance == distance_time:
time_index += 1
Expand All @@ -246,26 +232,8 @@ def gamma_packet_loop(

packet, ejecta_energy_gained = process_packet_path(packet)

# Save packets to dataframe rows
# convert KeV to eV / s / cm^3
energy_df_rows[packet.shell, time_index] += (
ejecta_energy_gained * 1000
)

energy_plot_df_rows[i] = np.array(
[
i,
ejecta_energy_gained * 1000
# * inv_volume_time[packet.shell, time_index]
/ dt,
packet.get_location_r(),
packet.time_current,
packet.shell,
compton_opacity,
photoabsorption_opacity,
pair_creation_opacity,
]
)
energy_deposited_positron[packet.shell, time_index] += packet.positron_fraction * packet.energy_cmf
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to deposit the positron energy of the packet at the end of its path instead of when it is created. I do not think that is correct.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved to the top of the loop. That is a good catch.

energy_deposited_gamma[packet.shell, time_index] += ejecta_energy_gained

if packet.status == GXPacketStatus.PHOTOABSORPTION:
# Packet destroyed, go to the next packet
Expand All @@ -279,14 +247,16 @@ def gamma_packet_loop(

if packet.shell > len(mass_density_time[:, 0]) - 1:
rest_energy = packet.nu_rf * H_CGS_KEV
lum_rf = (packet.energy_rf * 1.6022e-9) / dt
bin_index = get_index(rest_energy, energy_bins)
bin_width = (
energy_bins[bin_index + 1] - energy_bins[bin_index]
)
energy_out[bin_index, time_index] += rest_energy / (
bin_width * dt
freq_bin_width = bin_width / H_CGS_KEV
energy_out[bin_index, time_index] += (
packet.energy_rf / dt / freq_bin_width
)

luminosity = packet.energy_rf / dt
packet.status = GXPacketStatus.ESCAPED
escaped_packets += 1
if scattered:
Expand All @@ -303,22 +273,21 @@ def gamma_packet_loop(
packet.nu_cmf,
packet.nu_rf,
packet.energy_cmf,
lum_rf,
luminosity,
packet.energy_rf,
packet.shell,
]
)

print("Escaped packets:", escaped_packets)
print("Scattered packets:", scattered_packets)


return (
energy_df_rows,
energy_plot_df_rows,
energy_out,
deposition_estimator,
bin_width,
packets_info_array,
energy_deposited_gamma,
energy_deposited_positron,
)


Expand Down
94 changes: 92 additions & 2 deletions tardis/energy_input/gamma_ray_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import radioactivedecay as rd

from tardis.energy_input.util import KEV2ERG
from tardis.model.matter.decay import IsotopicMassFraction

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
Expand Down Expand Up @@ -83,10 +84,10 @@ def calculate_total_decays(inventories, time_delta):
cumulative_decay_df : pd.DataFrame
total decays for x g of isotope for time 't'
"""
time_delta = u.Quantity(time_delta, u.s)
time_delta = u.Quantity(time_delta, u.d)
total_decays = {}
for shell, inventory in inventories.items():
total_decays[shell] = inventory.cumulative_decays(time_delta.value)
total_decays[shell] = inventory.cumulative_decays(time_delta.value, "d")

flattened_dict = {}

Expand Down Expand Up @@ -167,3 +168,92 @@ def create_isotope_decay_df(cumulative_decay_df, gamma_ray_lines):
)

return isotope_decay_df


def time_evolve_mass_fraction(raw_isotope_mass_fraction, time_array):
"""
Function to evolve the mass fraction of isotopes with time.

Parameters
----------
raw_isotope_mass_fraction : pd.DataFrame
isotope mass fraction in mass fractions.
time_array : np.array
array of time in days.

Returns
-------
time_evolved_isotope_mass_fraction : pd.DataFrame
time evolved mass fraction of isotopes.
"""

initial_isotope_mass_fraction = raw_isotope_mass_fraction
isotope_mass_fraction_list = []

for time in time_array:

decayed_isotope_mass_fraction = IsotopicMassFraction(
initial_isotope_mass_fraction
).decay(time)
isotope_mass_fraction_list.append(decayed_isotope_mass_fraction)
initial_isotope_mass_fraction = decayed_isotope_mass_fraction

time_evolved_isotope_mass_fraction = pd.concat(
isotope_mass_fraction_list, keys=time_array, names=["time"]
)

return time_evolved_isotope_mass_fraction


def time_evolve_cumulative_decay(
raw_isotope_mass_fraction, shell_masses, gamma_ray_lines, time_array
):
"""
Function to calculate the total decays for each isotope for each shell at each time step.

Parameters
----------
raw_isotope_mass_fraction : pd.DataFrame
isotope abundance in mass fractions.
shell_masses : numpy.ndarray
shell masses in units of g
gamma_ray_lines : pd.DataFrame
gamma ray lines from nndc stored as a pandas dataframe.
time_array : numpy.ndarray
array of time steps in days.

Returns
-------
time_evolve_decay_df : pd.DataFrame
dataframe of isotopes for each shell with their decay mode, number of decays, radiation type,
radiation energy and radiation intensity at each time step.

"""

isotope_decay_df_list = []
initial_isotope_mass_fraction = raw_isotope_mass_fraction

dt = np.diff(time_array)


for time in dt:
#
isotope_dict = create_isotope_dicts(
initial_isotope_mass_fraction, shell_masses
)
inventories = create_inventories_dict(isotope_dict)
total_decays = calculate_total_decays(inventories, time)
isotope_df_time = create_isotope_decay_df(total_decays, gamma_ray_lines)
isotope_decay_df_list.append(isotope_df_time)

decayed_isotope_mass_fraction = IsotopicMassFraction(
initial_isotope_mass_fraction
).decay(time)

initial_isotope_mass_fraction = decayed_isotope_mass_fraction

time_evolved_decay_df = pd.concat(
isotope_decay_df_list, keys=time_array, names=["time"]
)

return time_evolved_decay_df
Loading
Loading