# Kerr-Schild coordinates on Kerr spacetime¶

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

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

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

In :
version()

Out:
'SageMath version 9.1.beta8, Release Date: 2020-03-18'

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

In :
%display latex


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

In :
Parallelism().set(nproc=8)


## Spacetime¶

We declare the spacetime manifold $M$:

In :
M = Manifold(4, 'M', structure='Lorentzian')
print(M)

4-dimensional Lorentzian manifold M


## 3+1 Kerr coordinates $(t,r,\theta,\phi)$¶

We restrict the 3+1 Kerr patch to $r>0$, in order to introduce latter the Kerr-Schild coordinates:

In :
X.<t,r,th,ph> = M.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi')
X

Out:
In :
X.coord_range()

Out:

The Kerr parameters $m$ and $a$:

In :
m = var('m', domain='real')
assume(m>0)
a = var('a', domain='real')
assume(a>=0)


## Kerr metric¶

We define the metric $g$ by its components w.r.t. the 3+1 Kerr coordinates:

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

Out:
In :
g.display_comp()

Out:

The inverse metric is pretty simple:

In :
g.inverse()[:]

Out:

as well as the determinant w.r.t. to the 3+1 Kerr coordinates:

In :
g.determinant().display()

Out:
In :
g.determinant() == - (rho2*sin(th))^2

Out:

## Ingoing principal null geodesics¶

In :
k = M.vector_field(1, -1, 0, 0, name='k')
k.display()

Out:

Let us check that $k$ is a null vector:

In :
g(k,k).display()

Out:

Computation of $\nabla_k k$:

In :
nabla = g.connection()
acc = nabla(k).contract(k)
acc.display()

Out:
In :
k_form = k.down(g)
k_form.display()

Out:

## Kerr-Schild form of the Kerr metric¶

Let us introduce the metric $f$ such that $$g = f + 2 H \underline{k} \otimes \underline{k}$$ where $H = m r / \rho^2$:

In :
H = M.scalar_field({X: m*r/rho2}, name='H')
H.display()

Out:
In :
f = M.lorentzian_metric('f')
f.set(g - 2*H*(k_form*k_form))
f.display()

Out:
In :
f[:]

Out:

$f$ is a flat metric:

In :
f.riemann().display()

Out:

which proves that $g$ is a Kerr-Schild metric.

Let us check that $k$ is a null vector for $f$ as well:

In :
f(k,k).expr()

Out:

## Kerr-Schild coordinates $(t, x, y, z)$¶

In :
KS.<t,x,y,z> = M.chart()
KS

Out:
In :
X_to_KS = X.transition_map(KS, [t,
(r*cos(ph) - a*sin(ph))*sin(th),
(r*sin(ph) + a*cos(ph))*sin(th),
r*cos(th)])
X_to_KS.display()

Out:
In :
R = sqrt((x^2 + y^2 + z^2 - a^2
+ sqrt((x^2 + y^2 + z^2 - a^2)^2 + 4*a^2*z^2))/2)
R

Out:
In :
#X_to_KS.set_inverse(t, R, acos(z/R),
#                    atan2(R*y - a*x, R*x + a*y))


Check of the identity $$\frac{x^2 + y^2}{r^2 + a^2} + \frac{z^2}{r^2} = 1$$

In :
((x^2 + y^2)/(R^2 + a^2) + z^2/R^2).simplify_full()

Out:

### Minkowskian expression of $f$ in terms of Kerr-Schild coordinates:¶

In :
f.display(KS.frame())

Out:

Equivalently, we may check the following identity:

In :
dt, dx, dy, dz = KS.coframe()[:]
f == - dt*dt + dx*dx + dy*dy + dz*dz

Out:
In :
dx.display()

Out:
In :
(dx*dx + dy*dy + dz*dz).display()

Out:

### Expression of $k$ and $g$ in the Kerr-Schild frame:¶

In :
k.display(KS.frame())

Out:
In :
k_form.display(KS.frame())

Out:
In :
g.display(KS.frame())

Out:

Expression of the Killing vector $\partial/\partial\phi$ in terms of the Kerr-Schild frame:

In :
X.frame().display(KS.frame())

Out:

## Plots¶

In :
ap = 0.9  # value of a for the plots
rmax = 3

In :
rcol = 'green'       # color of the curves (th,ph) = const
thcol = 'red'        # color of the curves (r,ph) = const
phcol = 'goldenrod'  # color of the curves (r,th) = const
coordcol = {r: rcol, th: thcol, ph: phcol}

In :
opacity = 1
surf_shift = 0.03


Numerical values of the event and Cauchy horizons:

In :
rHp = 1 + sqrt(1 - ap^2)
rCp = 1 - sqrt(1 - ap^2)
rHp, rCp

Out:
In :
X_plot = X.plot(KS, fixed_coords={t: 0, ph: 0}, ambient_coords=(x,y,z),
parameters={a: ap}, number_values=11,
color=coordcol, thickness=2, max_range=rmax,
label_axes=False)

In :
X_to_KS(t, r, th, ph)

Out:
In :
xyz_n = [s.subs({a: ap, ph: 0}) for s in X_to_KS(t, r, th, ph)[1:]]
xyz_n

Out:
In :
xyz_H = [s.subs({r: rHp}) for s in xyz_n]
xyz_H

Out:
In :
xyz_C = [s.subs({r: rCp}) for s in xyz_n]
xyz_C

Out:
In :
xyz_n += surf_shift  # small adjustment to ensure that the surface does not cover
# the coordinate grid lines

In :
graph = parametric_plot3d(xyz_n, (r, 0, rmax), (th, 0, pi), color='ivory',
opacity=opacity)
graph += X_plot
graph += parametric_plot3d(xyz_H, (th, 0, pi), color='black', thickness=6)
graph += parametric_plot3d(xyz_C, (th, 0, pi), color='blue', thickness=6)
graph += line([(0.03,0,0), (0.03,ap,0)], color='red', thickness=6)
graph

Out:
In :
xyz_n = [s.subs({a: ap, ph: pi}) for s in X_to_KS(t, r, th, ph)[1:]]
xyz_H = [s.subs({r: rHp}) for s in xyz_n]
xyz_C = [s.subs({r: rCp}) for s in xyz_n]
X_plot_pi = X.plot(KS, fixed_coords={t: 0, ph: pi}, ambient_coords=(x,y,z),
parameters={a: ap}, number_values=11,
color=coordcol, thickness=2, max_range=rmax,
label_axes=False)

In :
xyz_n += surf_shift  # small adjustment to ensure that the surface does not cover
# the coordinate grid lines
graph_pi = parametric_plot3d(xyz_n, (r, 0, rmax), (th, 0, pi), color='ivory',
opacity=opacity)
graph_pi += X_plot_pi
graph_pi += parametric_plot3d(xyz_H, (th, 0, pi), color='black', thickness=6)
graph_pi += parametric_plot3d(xyz_C, (th, 0, pi), color='blue', thickness=6)
graph_pi += line([(0.03,0,0), (0.03,-ap,0)], color='red', thickness=6)
graph_pi += line([(0,0,-1.1*rmax), (0,0,1.1*rmax)], color='green', thickness=4)
ph_slice = graph + graph_pi
show(ph_slice)