################################################################################ # This file is part of SWIFT. # Copyright (c) 2024 Jonathan Davies (j.j.davies@ljmu.ac.uk) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ################################################################################ """ Make some very simple plots showing the evolution of the single sink. Run with python make_test_plots.py """ import numpy as np from sys import argv from glob import glob import matplotlib.pyplot as plt import unyt import h5py params = { "text.usetex": True, "axes.labelsize": 16, "xtick.labelsize": 13, "ytick.labelsize": 13, "lines.linewidth": 2, "axes.titlesize": 16, "font.family": "serif", } plt.rcParams.update(params) # Units G_cgs = 6.6743e-8 * unyt.cm ** 3 * unyt.g ** -1 * unyt.s ** -2 unit_mass_cgs = 1.988409870698051e43 * unyt.g unit_density_cgs = 6.767905323247329e-22 * unyt.Unit("g/cm**3") unit_velocity_cgs = (1.0 * unyt.Unit("km/s")).to("cm/s") # Basic Bondi-Hoyle prediction from the sink's starting mass in a constant medium def simple_bondi_hoyle(t, m, rho, v, cs): m_sink = np.zeros(len(t), dtype=np.float64) * unyt.g m_sink[0] = m[0] * unit_mass_cgs rho_0 = rho[0] * unit_density_cgs v_0 = v[0] * unit_velocity_cgs cs_0 = cs[0] * unit_velocity_cgs timestep = ((t[1] - t[0]) * unyt.Gyr).to("s") for i in range(len(times) - 1): numerator = 4.0 * np.pi * G_cgs ** 2 * m_sink[i] ** 2 * rho_0 denominator = np.power(v_0 ** 2 + cs_0 ** 2, 3.0 / 2.0) m_sink[i + 1] = m_sink[i] + (numerator / denominator) * timestep return m_sink.to("Msun") snapshots = glob(f"./{argv[1]}/*.hdf5") times = np.empty(len(snapshots), dtype=np.float32) mass_evo = np.empty(len(snapshots), dtype=np.float32) subgrid_mass_evo = np.empty(len(snapshots), dtype=np.float32) rho_evo = np.empty(len(snapshots), dtype=np.float32) v_evo = np.empty(len(snapshots), dtype=np.float32) cs_evo = np.empty(len(snapshots), dtype=np.float32) hsml_evo = np.empty(len(snapshots), dtype=np.float32) for s, snap in enumerate(snapshots): with h5py.File(snap) as f: times[s] = f["Header"].attrs["Time"][0] mass_evo[s] = f["PartType3/Masses"][0] subgrid_mass_evo[s] = f["PartType3/SubgridMasses"][0] rho_evo[s] = f["PartType3/GasDensities"][0] cs_evo[s] = f["PartType3/GasSoundSpeeds"][0] hsml_evo[s] = f["PartType3/SmoothingLengths"][0] v = f["PartType3/GasVelocities"][0] - f["PartType3/Velocities"][0] v_evo[s] = np.sqrt(v[0] ** 2 + v[1] ** 2 + v[2] ** 2) # Run the Bondi-Hoyle prediction m_sink_bondi_prediction = simple_bondi_hoyle(times, mass_evo, rho_evo, v_evo, cs_evo) # Normalise time to go up to 1 t = times / times[-1] # Time evolution of the sink mass, target mass, and Bondi-Hoyle prediction fig, ax = plt.subplots(1, figsize=(8, 6)) ax.plot( t, np.log10(m_sink_bondi_prediction), label=r"Simple Bondi-Hoyle, constant $\rho$, $v$, $c_{\rm s}$", ) ax.plot(t, np.log10(subgrid_mass_evo * 1e10), label=r"Subgrid mass") ax.plot(t, np.log10(mass_evo * 1e10), label=r"Dynamical mass") ax.set_xlabel(r"$t/t_{\rm final}$") ax.set_ylabel(r"$\log_{10}(M_{\rm sink})$") ax.legend(fontsize=14) ax.set_ylim(6.68, 7.0) fig.savefig("mass_evolution.png", bbox_inches="tight") # Time evolution of the total mass accreted relative to the target mass fig, ax = plt.subplots(1, figsize=(8, 6)) ax.plot(t, mass_evo / subgrid_mass_evo) ax.set_xlabel(r"$t/t_{\rm final}$") ax.set_ylabel(r"$m_{\rm accr}^{\rm gas}/m_{\rm target}^{\rm gas}$") fig.savefig("target_mass_ratio.png", bbox_inches="tight") # Time evolution of the smoothing length fig, ax = plt.subplots(1, figsize=(8, 6)) ax.plot(t, hsml_evo) ax.set_xlabel(r"$t/t_{\rm final}$") ax.set_ylabel(r"$h_{\rm sink}$ [kpc]") fig.savefig("smoothing_length.png", bbox_inches="tight")