123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- """Analysis of the transfer of angular momentum from luminous components
- for encounters with a dark matter halo"""
- import matplotlib.pyplot as plt
- import numpy as np
- from analysis import utils
- def luminousAngularMomentum(data):
- """Calculate angular momentum of the luminous components
- Parameters:
- data: a data dictionary in the format saved by the simulation
- Returns:
- The norm of the angular momentum vector of the luminous components
- """
- maskDisk = data['type'][:,0]=='disk'
- maskBulge = data['type'][:,0]=='bulge'
- # Plot luminous components
- mask = np.logical_or(maskDisk, maskBulge)
- return np.linalg.norm(np.sum(data['mass'][mask][:,np.newaxis]
- * np.cross(data['r_vec'][mask], data['v_vec'][mask]), axis=0))
- # Plotting
- f, ax = plt.subplots(1, 1)
- # No halo
- j1 = []
- ts = np.linspace(1, 50001, 251)
- for t in ts:
- data = utils.loadData('hyperbolic_nohalo', int(t))
- j1.append(luminousAngularMomentum(data))
- ax.plot(ts, j1/j1[0], c='black', linestyle='dashed', label='1:1:0')
- # Halo
- j2 = []
- ts = np.linspace(1, 150001, 751)
- for t in ts:
- data = utils.loadData('hyperbolic_halo', int(t))
- j2.append(luminousAngularMomentum(data))
- ax.plot(ts, j2/j2[0], c='black', linestyle='solid', label='1:3:16')
- # Plotting styling
- utils.setSize(ax, y=(0, 1.1))
- utils.setAxes(ax, x=r'$t$', y=r'Angular momentum (luminous)',
- ycoords=(.9,-0.08))
- ax.legend(title=r'bulge:disk:halo')
- utils.stylizePlot([ax])
- plt.show()
- # Quantitaive analysis
- print('Angular momentum is conserved in encounter 1 to within',
- (np.max(j1)-np.min(j1))/j1[0])
|