Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

SageMath notebooks associated to the Black Hole Lectures (https://luth.obspm.fr/~luthier/gourgoulhon/bh16)

Project: BHLectures
Views: 20113
Kernel: SageMath 9.1.rc1

Walker-Penrose Killing tensor in Kerr spacetime

This Jupyter/SageMath notebook is relative to the lectures Geometry and physics of black holes.

It focuses on the Killing tensor KK found by Walker & Penrose [Commun. Math. Phys. 18, 265 (1970)].

The involved computations are based on tools developed through the SageManifolds project.

NB: a version of SageMath at least equal to 8.2 is required to run this notebook:

version()
'SageMath version 9.1.rc1, Release Date: 2020-04-22'

First we set up the notebook to display mathematical objects using LaTeX rendering:

%display latex

To speed up the computations, we ask for running them in parallel on 8 threads:

Parallelism().set(nproc=8)

Spacetime manifold

We declare the Kerr spacetime (or more precisely the Boyer-Lindquist domain of Kerr spacetime) as a 4-dimensional Lorentzian manifold:

M = Manifold(4, 'M', latex_name=r'\mathcal{M}', structure='Lorentzian') print(M)
4-dimensional Lorentzian manifold M

Let us declare the Boyer-Lindquist coordinates via the method chart(), the argument of which is a string expressing the coordinates names, their ranges (the default is (,+)(-\infty,+\infty)) and their LaTeX symbols:

BL.<t,r,th,ph> = M.chart(r't r th:(0,pi):\theta ph:(0,2*pi):\phi') print(BL) ; BL
Chart (M, (t, r, th, ph))
BL[0], BL[1]
BL.coord_range()

Metric tensor

The 2 parameters mm and aa of the Kerr spacetime are declared as symbolic variables:

var('m, a', domain='real')

We get the (yet undefined) spacetime metric by

g = M.metric()

The metric is set by its components in the coordinate frame associated with Boyer-Lindquist coordinates, which is the current manifold's default frame:

rho2 = r^2 + (a*cos(th))^2 Delta = r^2 -2*m*r + a^2 g[0,0] = -(1-2*m*r/rho2) g[0,3] = -2*a*m*r*sin(th)^2/rho2 g[1,1], g[2,2] = rho2/Delta, rho2 g[3,3] = (r^2+a^2+2*m*r*(a*sin(th))^2/rho2)*sin(th)^2 g.display()

A matrix view of the components with respect to the manifold's default vector frame:

g[:]

The list of the non-vanishing components:

g.display_comp()

Levi-Civita Connection

The Levi-Civita connection \nabla associated with gg:

nabla = g.connection() ; print(nabla)
Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional Lorentzian manifold M

Let us verify that the covariant derivative of gg with respect to \nabla vanishes identically:

nabla(g).display()

Killing vectors

The default vector frame on the spacetime manifold is the coordinate basis associated with Boyer-Lindquist coordinates:

M.default_frame() is BL.frame()
BL.frame()

Let us consider the first vector field of this frame:

xi = BL.frame()[0] ; xi
print(xi)
Vector field d/dt on the 4-dimensional Lorentzian manifold M

The 1-form associated to it by metric duality is

xi_form = xi.down(g) ; xi_form.display()

Its covariant derivative is

nab_xi = nabla(xi_form) ; print(nab_xi) ; nab_xi.display()
Tensor field of type (0,2) on the 4-dimensional Lorentzian manifold M

Let us check that the Killing equation is satisfied:

nab_xi.symmetrize() == 0

Similarly, let us check that ϕ\frac{\partial}{\partial\phi} is a Killing vector:

eta = BL.frame()[3] ; eta
nabla(eta.down(g)).symmetrize() == 0

Principal null vectors

Let kk be the null vector tangent to the ingoing principal null geodesics associated with their affine parameter r-r; the expression of kk in term of the 3+1 ingoing Kerr coordinates (t~,r,θ,ϕ~)(\tilde{t}, r, \theta, \tilde\phi) is k=t~r~k = \frac{\partial}{\partial\tilde{t}} - \frac{\partial}{\partial\tilde{r}} The expression of kk in terms of the Boyer-Lindquist coordinates is

k = M.vector_field(name='k') k[:] = [(r^2 + a^2)/Delta, -1, 0, a/Delta] k.display()

Regarding the null vector tangent to the outgoing principal null geodesics, we select one associated with a (non-affine) parameter λ\lambda that is regular accross the two Killing horizons:

el = M.vector_field(name='el', latex_name=r'\ell') el[:] = [1/2, Delta/(2*(r^2+a^2)), 0, a/(2*(r^2+a^2))] el.display()

Let us check that kk and \ell are null vectors:

g(k,k).expr()
g(el,el).expr()

Their scalar product is ρ2/(r2+a2)-\rho^2/(r^2 + a^2):

g(k,el).expr()

Note that the scalar product (with respect to metric gg) can also be computed by means of the method dot:

k.dot(el).expr()

Let us check that kk is a geodesic vector, i.e. that it obeys kk=0\nabla_k k = 0:

acc_k = nabla(k).contract(k) acc_k.display()

We check that \ell is a pregeodesic vector, i.e. that =κ\nabla_\ell \ell = \kappa_\ell \ell for some scalar field κ\kappa_\ell:

acc_l = nabla(el).contract(el) acc_l.display()
kappa_l = acc_l[[0]] / el[[0]] kappa_l.display()
acc_l == kappa_l * el

Walker-Penrose Killing tensor

We need the 1-forms associated to kk and \ell by metric duality:

uk = k.down(g) ul = el.down(g)
uk.display()
uk[3]
uk[3].factor()
uk[3] == a*sin(th)^2
uk[3] = a*sin(th)^2
uk.display()
ul.display()
ul[3].factor()
ul[3] == a*sin(th)^2*(a^2 + r^2 - 2*m*r)/(2*(a^2 + r^2))
ul[3] = a*sin(th)^2*(a^2 + r^2 - 2*m*r)/(2*(a^2 + r^2))
ul.display()

The Walker-Penrose Killing tensor KK is then formed as K=(r2+a2)(k+(k)+r2g K = (r^2 + a^2) (\underline{\ell}\otimes \underline{k} + (\underline{k}\otimes \underline{\ell}) + r^2 g

K = 2*((r^2 + a^2)*(ul*uk)).symmetrize() + r^2*g K.set_name('K') print(K)
Field of symmetric bilinear forms K on the 4-dimensional Lorentzian manifold M

The non-vanishing components of KK:

K.display_comp()

We may simplify a little bit some components:

K[0,3].factor()
K[0,3] == - a*sin(th)^2*(r^2 + a^2 - 2*m*r*a^2*cos(th)^2/rho2)
K[0, 3] = - a*sin(th)^2*(r^2 + a^2 - 2*m*r*a^2*cos(th)^2/rho2)
K[1,1].factor()
K[3,3] == sin(th)^2 * (r^2*(r^2 + a^2) + a^2*sin(th)^2*(r^2 + a^2 - 2*m*r/rho2*a^2*cos(th)^2))
K[3,3] = sin(th)^2 * (r^2*(r^2 + a^2) + a^2*sin(th)^2*(r^2 + a^2 - 2*m*r/rho2*a^2*cos(th)^2))
K.display_comp()
DK = nabla(K) print(DK)
Tensor field nabla_g(K) of type (0,3) on the 4-dimensional Lorentzian manifold M
DK.display_comp()

Let us check that KK is a Killing tensor:

DK.symmetrize().display()

Equivalently, we may write, using index notation:

DK['_(abc)'].display()
pt = var('pt', latex_name=r'p^t') pr = var('pr', latex_name=r'p^r') pth = var('pth', latex_name=r'p^\theta') pph = var('pph', latex_name=r'p^\phi') p = M.vector_field(name='p') p[:] = [pt, pr, pth, pph] p.display()
K(p, p).expr()
s = K(p, p).expr() s

Metric dual of the Killing tensor (KabK^{ab})

uK = K.up(g) uK.set_name('uK', latex_name=r'\hat{K}') print(uK)
Tensor field uK of type (2,0) on the 4-dimensional Lorentzian manifold M
uK.display_comp()
uK[0,0] == a^2/Delta*(r^2 + a^2 - 2*m*r^3*sin(th)^2/rho2)
uK[0,0] = a^2/Delta*(r^2 + a^2 - 2*m*r^3*sin(th)^2/rho2)
uK[0,3] == a/Delta*(r^2 + a^2 - 2*m*r^3/rho2)
uK[0,3] = a/Delta*(r^2 + a^2 - 2*m*r^3/rho2)
uK[1,1] == - Delta*a^2*cos(th)^2/rho2
uK[1,1] = - Delta*a^2*cos(th)^2/rho2
uK[3,3] == (a^2 + r^2/sin(th)^2*(1 - 2*m*r/rho2))/Delta
uK[3,3] = (a^2 + r^2/sin(th)^2*(1 - 2*m*r/rho2))/Delta
uK.display_comp()

Killing tensor leading directly to Carter constant Q

We introduce first the Killing vector V:=η+aξV := \eta + a \xi:

V = eta + a*xi V.display()
V_form = V.down(g) V_form.display()

and form the Killing tensor K~=KVV\tilde{K} = K - \underline{V}\otimes\underline{V}

K2 = K - V_form*V_form K2.set_name('tK', latex_name=r'\tilde{K}') K2.display_comp()

Let us check that K~\tilde{K} is indeed a Killing tensor:

nabla(K2).symmetrize().display()

We check that K~αβ=a2cos2θgαβ+diag(a2cos2θ,0,1,tan2θ)αβ \tilde{K}^{\alpha\beta} = - a^2 \cos^2 \theta \, g^{\alpha\beta} + \mathrm{diag}(-a^2\cos^2\theta, 0, 1, \tan^{-2}\theta)^{\alpha\beta}

T = K2 + (a^2*cos(th)^2)*g uT = T.up(g) uT[:]