In [1]:
# Always run this first
# NOTE: Do not define new basic variables in this notebook;
#       define them in Variables_Q.ipynb.  Use this notebook
#       to define new expressions built from those variables.

from __future__ import division # This needs to be here, even though it's in Variables_Q.ipynb
import sys
sys.path.insert(0, '..') # Look for modules in directory above this one
execfile('../Utilities/ExecNotebook.ipy')
try: execnotebook(VariablesNotebook)
except: execnotebook('Variables_Q.ipynb')

The following PNCollection objects will contain all the terms describing precession.


In [2]:
Precession_ellHat  = PNCollection()
Precession_chiVec1 = PNCollection()
Precession_chiVec2 = PNCollection()

Precession of orbital angular velocity $\vec{\Omega}_{\hat{\ell}}$

Bohé et al. (2013) say that the precession of the orbital angular velocity is along $\hat{n}$, with magnitude (in their notation) $a_{\ell}/r\omega = \gamma\, a_{\ell} / v^3$.

NOTE: There is a 3pN gauge term in $\gamma_{\text{PN}}$ that I have simply dropped here. It is $\ln(r/r_0')$.

The following two cells are Eqs. (4.3) and (4.4) of Bohé et al. (2013), respectively.


In [3]:
Precession_ellHat.AddDerivedVariable('gamma_PN_coeff', v**2)

Precession_ellHat.AddDerivedConstant('gamma_PN_0', 1)
# gamma_PN_1 is 0
Precession_ellHat.AddDerivedConstant('gamma_PN_2', -nu/3 + 1)
Precession_ellHat.AddDerivedVariable('gamma_PN_3', (5*S_ell/3 + Sigma_ell*delta)/M**2)
Precession_ellHat.AddDerivedConstant('gamma_PN_4', -65*nu/12 + 1)
Precession_ellHat.AddDerivedVariable('gamma_PN_5',
    ((frac(8,9)*nu + frac(10,3))*S_ell + 2*Sigma_ell*delta)/M**2)
Precession_ellHat.AddDerivedConstant('gamma_PN_6',
    nu**3/81 + 229*nu**2/36 - 41*pi**2*nu/192 - 2203*nu/2520 + 1)
Precession_ellHat.AddDerivedVariable('gamma_PN_7',
    ((-6*nu**2 - 127*nu/12 + 5)*S_ell - 8*Sigma_ell*delta*nu**2/3 + (-61*nu/6 + 3)*Sigma_ell*delta)/M**2)

In [4]:
Precession_ellHat.AddDerivedVariable('a_ell_coeff', v**7/M**3)

Precession_ellHat.AddDerivedVariable('a_ell_0', 7*S_n + 3*Sigma_n*delta)
# gamma_PN_1 is 0
Precession_ellHat.AddDerivedVariable('a_ell_2', (-29*nu/3-10)*S_n + (-9*nu/2-6)*delta*Sigma_n)
# gamma_PN_3 is 0
Precession_ellHat.AddDerivedVariable('a_ell_4',
    (frac(52,9)*nu**2 + frac(59,4)*nu + frac(3,2))*S_n
     + (frac(17,6)*nu**2 + frac(73,8)*nu + frac(3,2))*delta*Sigma_n)

In [5]:
def Precession_ellHatExpression(PNOrder=frac(7,2)):
    OmegaVec_ellHat = (gamma_PN_coeff.substitution*a_ell_coeff.substitution/v**3)\
        *horner(sum([key*(v**n) for n in range(2*PNOrder+1)
                     for key,val in Precession_ellHat.items() if val==('gamma_PN_{0}'.format(n))]))\
        *horner(sum([key*(v**n) for n in range(2*PNOrder+1)
                     for key,val in Precession_ellHat.items() if val==('a_ell_{0}'.format(n))]))
    return OmegaVec_ellHat

In [6]:
# Precession_ellHatExpression()


Out[6]:
$$\frac{v^{6}}{M^{3}} \left(a_{\ell 0} + v^{2} \left(a_{\ell 2} + a_{\ell 4} v^{2}\right)\right) \left(\gamma_{PN 0} + v^{2} \left(\gamma_{PN 2} + v \left(\gamma_{PN 3} + v \left(\gamma_{PN 4} + v \left(\gamma_{PN 5} + v \left(\gamma_{PN 6} + \gamma_{PN 7} v\right)\right)\right)\right)\right)\right)$$

Precession of spins $\vec{\Omega}_{1,2}$

Equation (4.5) of Bohé et al. (2013) gives spin-orbit terms:


In [7]:
Precession_chiVec1.AddDerivedVariable('Omega1_coeff', v**5/M)

Precession_chiVec1.AddDerivedVariable('OmegaVec1_SO_0',
    (frac(3,4) + frac(1,2)*nu - frac(3,4)*delta)*ellHat, datatype=ellHat.datatype)
Precession_chiVec1.AddDerivedVariable('OmegaVec1_SO_2',
    (frac(9,16) + frac(5,4)*nu - frac(1,24)*nu**2 + delta*(-frac(9,16)+frac(5,8)*nu))*ellHat, datatype=ellHat.datatype)
Precession_chiVec1.AddDerivedVariable('OmegaVec1_SO_4',
    (frac(27,32) + frac(3,16)*nu - frac(105,32)*nu**2 - frac(1,48)*nu**3
     + delta*(-frac(27,32) + frac(39,8)*nu - frac(5,32)*nu**2))*ellHat, datatype=ellHat.datatype)

In his Eqs. (2.4), Kidder (1995) summarized certain spin-spin terms:


In [8]:
Precession_chiVec1.AddDerivedVariable('OmegaVec1_SS_1', M2**2*(-chiVec2+3*chi2_n*nHat)/M**2, datatype=nHat.datatype)
#print("WARNING: OmegaVec1_SS_1 in Precession.ipynb is disabled temporarily")

NOTE: Is Etienne's notation consistent with others? It seems like when he introduces other people's terms, he mixes $\hat{n}$ and $\hat{\ell}$.

Finally, in his Eq. (2.7) Racine (2008) added a quadrupole-monopole term along $\hat{n}$:


In [9]:
Precession_chiVec1.AddDerivedVariable('OmegaVec1_QM_1', 3*nu*chi1_n*nHat, datatype=nHat.datatype)
#print("WARNING: OmegaVec1_QM_1 in Precession.ipynb is disabled temporarily")

For the precession vector of the other spin, rather than re-entering the same things with 1 and 2 swapped, we just let python do it:


In [10]:
for key,val in Precession_chiVec1.items():
    try:
        tmp = key.substitution.subs({delta: -delta, M1:'swap1', M2:M1, chi1_n:'swap2', chi2_n:chi1_n,
                                     chiVec1:'swap3', chiVec2:chiVec1}).subs({'swap1':M2,'swap2':chi2_n,'swap3':chiVec2})
        Precession_chiVec2.AddDerivedVariable(val.replace('OmegaVec1', 'OmegaVec2').replace('Omega1', 'Omega2'),
                                              tmp, datatype=key.datatype)
    except AttributeError:
        Precession_chiVec2.AddDerivedVariable(val.replace('OmegaVec1', 'OmegaVec2').replace('Omega1', 'Omega2'),
                                              key, datatype=key.datatype)

Finally, we define functions to put them together:


In [11]:
def Precession_chiVec1Expression(PNOrder=frac(7,2)):
    return Omega1_coeff*collect(expand(sum([key.substitution*(v**n)
                                            for n in range(2*PNOrder+1)
                                            for key,val in Precession_chiVec1.items()
                                            if val.endswith('_{0}'.format(n))])),
                                [ellHat,nHat,lambdaHat,chiVec1,chiVec2], horner)
def Precession_chiVec2Expression(PNOrder=frac(7,2)):
    return Omega2_coeff*collect(expand(sum([key.substitution*(v**n)
                                            for n in range(2*PNOrder+1)
                                            for key,val in Precession_chiVec2.items()
                                            if val.endswith('_{0}'.format(n))])),
                                [ellHat,nHat,lambdaHat,chiVec1,chiVec2], horner)

In [12]:
# Precession_chiVec1Expression()


Out[12]:
$$\Omega_{1 coeff} \left(- \frac{\vec{\chi}_{2} M_{2}^{2}}{M^{2}} v + \hat{\ell} \left(- \frac{3 \delta}{4} + \frac{\nu}{2} + v^{2} \left(\delta \left(\frac{5 \nu}{8} - \frac{9}{16}\right) + \nu \left(- \frac{\nu}{24} + \frac{5}{4}\right) + v^{2} \left(\delta \left(\nu \left(- \frac{5 \nu}{32} + \frac{39}{8}\right) - \frac{27}{32}\right) + \nu \left(\nu \left(- \frac{\nu}{48} - \frac{105}{32}\right) + \frac{3}{16}\right) + \frac{27}{32}\right) + \frac{9}{16}\right) + \frac{3}{4}\right) + \hat{n} v \left(3 \chi_{1 n} \nu + \frac{3 M_{2}^{2}}{M^{2}} \chi_{2 n}\right)\right)$$