Utility Functions
Fundamental Frequencies
Get dimensionless fundamental frequencies from Schmidt 2002:
[1]:
import numpy as np
[2]:
from few.utils.geodesic import get_fundamental_frequencies
a = 0.5
num = 10
p = np.linspace(8.0, 10.0, num)
e = np.linspace(0.2, 0.4, num)
x = np.linspace(0.3, 0.4, num)
OmegaPhi, OmegaTheta, OmegaR = get_fundamental_frequencies(a, p, e, x)
out = np.array([p, e, x, OmegaPhi, OmegaTheta, OmegaR]).T
print("p\t\te\t\tx\tOmegaPhi\tOmegaTheta\tOmegaR")
print(out)
p e x OmegaPhi OmegaTheta OmegaR
[[ 8. 0.2 0.3 0.04344785 0.04162395 0.02349858]
[ 8.22222222 0.22222222 0.31111111 0.0412017 0.03953685 0.02299122]
[ 8.44444444 0.24444444 0.32222222 0.03905666 0.03753599 0.02241441]
[ 8.66666667 0.26666667 0.33333333 0.03700405 0.03561442 0.02178189]
[ 8.88888889 0.28888889 0.34444444 0.03503633 0.03376608 0.02110469]
[ 9.11111111 0.31111111 0.35555556 0.0331469 0.03198567 0.02039181]
[ 9.33333333 0.33333333 0.36666667 0.03133003 0.03026855 0.01965064]
[ 9.55555556 0.35555556 0.37777778 0.02958068 0.02861065 0.01888732]
[ 9.77777778 0.37777778 0.38888889 0.02789444 0.02700838 0.01810703]
[10. 0.4 0.4 0.02626744 0.02545863 0.01731413]]
Separatrix in Generic Kerr
Get the separatrix in generic Kerr from Stein & Warburton 2020:
[3]:
from few.utils.geodesic import get_separatrix
a = 0.5
num = 10
e = np.linspace(0.2, 0.4, num)
x = np.linspace(0.3, 0.4, num)
p_sep = get_separatrix(a, e, x)
out = np.array([e, x, p_sep]).T
print("e\t\tx\tseparatrix")
print(out)
e x separatrix
[[0.2 0.3 5.69505166]
[0.22222222 0.31111111 5.71503602]
[0.24444444 0.32222222 5.73483554]
[0.26666667 0.33333333 5.75445904]
[0.28888889 0.34444444 5.7739152 ]
[0.31111111 0.35555556 5.79321253]
[0.33333333 0.36666667 5.81235943]
[0.35555556 0.37777778 5.83136416]
[0.37777778 0.38888889 5.85023483]
[0.4 0.4 5.86897945]]
Converting between the integrals of motion \((E, L, Q)\) and the orbital elements \((p, e, x)\)
We can convert to the three constants of motion \((E,L,Q)\) in generic Kerr spacetime, and go back to \((p, e, x)\) via Hughes 2024:
[5]:
from few.utils.geodesic import get_kerr_geo_constants_of_motion, ELQ_to_pex
a = 0.5
num = 11
p = np.linspace(8.0, 10.0, num)
e = np.linspace(0.2, 0.4, num)
x = np.linspace(0.3, 0.4, num)
print("To ELQ:")
E, L, Q = get_kerr_geo_constants_of_motion(a, p, e, x) # obtain (E, L, Q) given (a, p, e, x)
out = np.array([p, e, x, E, L, Q]).T
print("p\t\te\t\tx\tE\tL\tQ")
print(out)
print("To pex:")
p_new, e_new, x_new = ELQ_to_pex(a, E, L, Q) # obtain (p, e, x) given (a, E, L, Q)
out = np.array([p_new, e_new, x_new, E, L, Q]).T
print("p\t\te\t\tx\tE\tL\tQ")
print(out)
To ELQ:
p e x E L Q
[[ 8. 0.2 0.3 0.94869805 1.0488073 11.14493312]
[ 8.2 0.22 0.31 0.94995592 1.09042731 11.20587846]
[ 8.4 0.24 0.32 0.9512292 1.1326752 11.26724045]
[ 8.6 0.26 0.33 0.95251428 1.17554328 11.32839477]
[ 8.8 0.28 0.34 0.95380826 1.21902438 11.38878189]
[ 9. 0.3 0.35 0.95510877 1.26311183 11.44789629]
[ 9.2 0.32 0.36 0.95641391 1.30779937 11.50527773]
[ 9.4 0.34 0.37 0.9577221 1.35308111 11.5605041 ]
[ 9.6 0.36 0.38 0.9590321 1.3989515 11.61318563]
[ 9.8 0.38 0.39 0.96034289 1.44540531 11.66296002]
[10. 0.4 0.4 0.96165365 1.49243756 11.70948848]]
To pex:
p e x E L Q
[[ 8. 0.2 0.3 0.94869805 1.0488073 11.14493312]
[ 8.2 0.22 0.31 0.94995592 1.09042731 11.20587846]
[ 8.4 0.24 0.32 0.9512292 1.1326752 11.26724045]
[ 8.6 0.26 0.33 0.95251428 1.17554328 11.32839477]
[ 8.8 0.28 0.34 0.95380826 1.21902438 11.38878189]
[ 9. 0.3 0.35 0.95510877 1.26311183 11.44789629]
[ 9.2 0.32 0.36 0.95641391 1.30779937 11.50527773]
[ 9.4 0.34 0.37 0.9577221 1.35308111 11.5605041 ]
[ 9.6 0.36 0.38 0.9590321 1.3989515 11.61318563]
[ 9.8 0.38 0.39 0.96034289 1.44540531 11.66296002]
[10. 0.4 0.4 0.96165365 1.49243756 11.70948848]]
Convert between \(x_I\) and \(Y\)
\(Y\equiv\cos{\iota}=L/\sqrt{L^2 + Q}\) is different than \(x_I\equiv \cos{I}\), which is accepted for relativistic waveforms and in the generic waveform interface discussed above. \(I\) is the inclination angle of the orbital plane to the equatorial plane.
[6]:
from few.utils.mappings.pn import xI_to_Y, Y_to_xI
a = 0.5
num = 11
p = np.linspace(8.0, 10.0, num)
e = np.linspace(0.2, 0.4, num)
x = np.linspace(0.3, 0.4, num)
Y = xI_to_Y(a, p, e, x)
out = np.array([p, e, x, Y]).T
print("To Y:\np\t\te\t\tx\tY")
print(out)
x_new = Y_to_xI(a, p, e, Y)
out = np.array([p, e, x_new, Y]).T
print("To x:\np\t\te\t\tx\tY")
print(out)
To Y:
p e x Y
[[ 8. 0.2 0.3 0.29972126]
[ 8.2 0.22 0.31 0.30972412]
[ 8.4 0.24 0.32 0.31972764]
[ 8.6 0.26 0.33 0.32973176]
[ 8.8 0.28 0.34 0.33973642]
[ 9. 0.3 0.35 0.34974158]
[ 9.2 0.32 0.36 0.35974718]
[ 9.4 0.34 0.37 0.36975319]
[ 9.6 0.36 0.38 0.37975956]
[ 9.8 0.38 0.39 0.38976626]
[10. 0.4 0.4 0.39977325]]
To x:
p e x Y
[[ 8. 0.2 0.3 0.29972126]
[ 8.2 0.22 0.31 0.30972412]
[ 8.4 0.24 0.32 0.31972764]
[ 8.6 0.26 0.33 0.32973176]
[ 8.8 0.28 0.34 0.33973642]
[ 9. 0.3 0.35 0.34974158]
[ 9.2 0.32 0.36 0.35974718]
[ 9.4 0.34 0.37 0.36975319]
[ 9.6 0.36 0.38 0.37975956]
[ 9.8 0.38 0.39 0.38976626]
[10. 0.4 0.4 0.39977325]]