def calc_polar_roots(aa, slr, ecc, x, digits): """ Compute polar roots. Parameters: aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: zp (mpf): polar root zm (mpf): polar root """ try: mp.dps = digits prec = mp.prec mp.prec += 30 aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) zp, zm = polar_roots(En, Lz, aa, slr, x) return zp, zm finally: mp.prec = prec
def calc_radial_roots(aa, slr, ecc, x, digits): """ Compute radial roots. Parameters: aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: r1 (mpf): apastron r2 (mpf): periastron r3 (mpf): radial root 3 r4 (mpf): radial root 4 """ try: mp.dps = digits prec = mp.prec mp.prec += 30 aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) r1, r2, r3, r4 = radial_roots(En, Q, aa, slr, ecc) return r1, r2, r3, r4 finally: mp.prec = prec
def calc_consts(aa, slr, ecc, x, digits): """ Compute adiabatic constants. Parameters: aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: En (mpf): energy Lz (mpf): angular momentum Q (mpf): Carter constant """ try: mp.dps = digits prec = mp.prec mp.prec += 30 aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) return En, Lz, Q finally: mp.prec = prec
def calc_mino_freqs(aa, slr, ecc, x, digits, M=1): """ Compute Mino frequencies. Parameters: aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: ups_r (mpf): radial Mino frequency ups_theta (mpf): polar Mino frequency ups_phi (mpf): azimuthal Mino frequency gamma (mpf): temporal Mino frequency """ try: mp.dps = digits prec = mp.prec mp.prec += 30 aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) r1, r2, r3, r4 = radial_roots(En, Q, aa, slr, ecc, M) ups_r, ups_theta, ups_phi, gamma = mino_freqs( r1, r2, r3, r4, En, Lz, Q, aa, slr, ecc, x ) return ups_r, ups_theta, ups_phi, gamma finally: mp.prec = prec
def mino_coords(mino_t, aa, slr, ecc, x, digits): """ Compute coordinates of the orbit given two angles psi and chi. Parameters: mino_t (float): mino time coordinate lambda aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: t (mpf): time coordinate r (mpf): radial coordinate theta (mpf): theta coordinate phi (mpf): phi coordinate """ try: mp.dps = digits prec = mp.prec mp.prec += 30 mino_t = mpf(str(mino_t)) aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) r1, r2, r3, r4 = radial_roots(En, Q, aa, slr, ecc, M=1) zp, zm = polar_roots(En, Lz, aa, slr, x) ups_r, ups_theta, ups_phi, gamma = mino_freqs( r1, r2, r3, r4, En, Lz, Q, aa, slr, ecc, x ) t, r, theta, phi = calc_gen_coords_mino( mino_t, ups_r, ups_theta, ups_phi, gamma, r1, r2, r3, r4, zp, zm, En, Lz, Q, aa, ) return t, r, theta, phi finally: mp.prec = prec
def coordinates(psi, aa, slr, ecc, x, digits): """ Compute coordinates of the orbit given two angles psi and chi. Parameters: psi (float): radial angle chi (float): polar angle aa (float): SMBH spin slr (float): semi-latus rectum ecc (float): eccentricity x (float): cos of the inclination digits (int): number of digits of accuracy requested Returns: t (mpf): time coordinate r (mpf): radial coordinate theta (mpf): theta coordinate phi (mpf): phi coordinate """ if x ** 2 == 1: chi = 0 # equatorial orbits don't need chi try: mp.dps = digits prec = mp.prec mp.prec += 30 psi = mpf(str(psi)) # chi = mpf(str(chi)) aa = mpf(str(aa)) slr = mpf(str(slr)) ecc = mpf(str(ecc)) x = mpf(str(x)) En, Lz, Q = calc_constants(aa, slr, ecc, x) r1, r2, r3, r4 = radial_roots(En, Q, aa, slr, ecc, M=1) zp, zm = polar_roots(En, Lz, aa, slr, x) ups_r, ups_theta, ups_phi, gamma = mino_freqs( r1, r2, r3, r4, En, Lz, Q, aa, slr, ecc, x ) print(psi) # print(chi) t, r, theta, phi = calc_coords( psi, # chi, ups_r, ups_theta, ups_phi, gamma, r1, r2, r3, r4, zp, zm, En, Lz, Q, aa, slr, ecc, x, ) return t, r, theta, phi finally: mp.prec = prec