Kerr spacetime in 3+1 Kerr coordinates

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

The corresponding tools have been developed within the SageManifolds project.

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

In [1]:
version()
Out[1]:
'SageMath version 9.2.beta14, Release Date: 2020-09-30'

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

In [2]:
%display latex

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

In [3]:
Parallelism().set(nproc=8)

Spacetime

We declare the spacetime manifold $M$:

In [4]:
M = Manifold(4, 'M')
print(M)
4-dimensional differentiable manifold M

and the 3+1 Kerr coordinates $(t,r,\theta,\phi)$ as a chart on $M$:

In [5]:
X.<t,r,th,ph> = M.chart(r't r th:(0,pi):\theta ph:(0,2*pi):\phi')
X
Out[5]:
In [6]:
X.coord_range()
Out[6]:

The Kerr parameters $m$ and $a$:

In [7]:
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 [8]:
g = M.lorentzian_metric('g')
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[8]:
In [9]:
g.display_comp()
Out[9]:

The inverse metric is pretty simple:

In [10]:
g.inverse()[:]
Out[10]:

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

In [11]:
g.determinant().display()
Out[11]:
In [12]:
g.determinant() == - (rho2*sin(th))^2
Out[12]:

Let us check that we are dealing with a solution of the Einstein equation in vacuum:

In [13]:
g.ricci().display()
Out[13]:

The Christoffel symbols w.r.t. the 3+1 Kerr coordinates:

In [14]:
g.christoffel_symbols_display()
Out[14]:

Vector normal to the hypersurfaces $r=\mathrm{const}$

In [15]:
dr = X.coframe()[1]
print(dr)
dr.display()
1-form dr on the 4-dimensional differentiable manifold M
Out[15]:
In [16]:
nr = dr.up(g)
print(nr)
nr.display()
Vector field on the 4-dimensional differentiable manifold M
Out[16]:
In [17]:
assume(a^2<m^2)
rp = m + sqrt(m^2-a^2)
rp
Out[17]:
In [18]:
p = M.point(coords=(t,rp,th,ph), name='p')
print(p)
Point p on the 4-dimensional differentiable manifold M
In [19]:
X(p)
Out[19]:
In [20]:
nrH = nr.at(p)
print(nrH)
Tangent vector at Point p on the 4-dimensional differentiable manifold M
In [21]:
Tp = M.tangent_space(p)
print(Tp)
Tangent space at Point p on the 4-dimensional differentiable manifold M
In [22]:
Tp.default_basis()
Out[22]:
In [23]:
nrH[:]
Out[23]:
In [24]:
OmegaH = a/(2*m*rp)
OmegaH
Out[24]:
In [25]:
xi = X.frame()[0]
xi
Out[25]:
In [26]:
eta = X.frame()[3]
eta
Out[26]:
In [27]:
chi = xi + OmegaH*eta
chi.display()
Out[27]:

Ingoing principal null geodesics

In [28]:
k = M.vector_field(name='k')
k[0] = 1
k[1] = -1
k.display()
Out[28]:

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

In [29]:
g(k,k).display()
Out[29]:

Computation of $\nabla_k k$:

In [30]:
nab = g.connection()
acc = nab(k).contract(k)
acc.display()
Out[30]:
In [31]:
nab(k).display()
Out[31]:

Outgoing principal null geodesics

In [32]:
el = M.vector_field(name='el', latex_name=r'\ell')
el[0] = 1/2 + m*r/(r^2+a^2)
el[1] = 1/2 - m*r/(r^2+a^2)
el[3] = a/(r^2+a^2)
el.display()
Out[32]:

Let us check that $\ell$ is a null vector:

In [33]:
g(el,el).display()
Out[33]:

Computation of $\nabla_\ell \ell$:

In [34]:
acc = nab(el).contract(el)
acc.display()
Out[34]:

We check that $\nabla_\ell \ell \propto \ell$:

In [35]:
for i in [0,1,3]:
    show(acc[i] / el[i])

Hence we may write $\nabla_\ell\ell = \kappa \ell$:

In [36]:
kappa = (acc[0] / el[0]).expr()
kappa
Out[36]:
In [37]:
acc == kappa * el
Out[37]:

The $g$-dual 1-form $\underline{\ell}$ (i.e. the 1-form of components $\ell_\alpha = g_{\alpha\mu} \ell^\mu$) is obtained via the method down():

In [38]:
el_form = el.down(g)
el_form.display()
Out[38]:

We apply extra trigonometric simplifications on the components and factor them, via the method apply_map:

In [39]:
el_form.apply_map(lambda x: x.trig_reduce())
el_form.apply_map(lambda x: x.simplify_trig())
el_form.apply_map(factor)
el_form.display()
Out[39]:

The scalar product $\ell\cdot k = \langle \underline\ell, k \rangle$:

In [40]:
el_form(k).display()
Out[40]:
In [41]:
el_form(k) == g(el, k)
Out[41]:

Surface gravity

On $H$, $\ell$ coincides with the Killing vector $\chi$:

In [42]:
el.at(p) == chi.at(p)
Out[42]:

Therefore the surface gravity of the Kerr black hole is nothing but the value of the non-affinity coefficient of $\ell$ on $H$:

In [43]:
kappaH = kappa.subs(r=rp).simplify_full()
kappaH
Out[43]:
In [44]:
bool(kappaH == sqrt(m^2-a^2)/(2*m*(m+sqrt(m^2-a^2))))
Out[44]:

A variant for $\ell$:

In [45]:
el = M.vector_field(name='el', latex_name=r'\ell')
el[0] = r^2+a^2 + 2*m*r
el[1] = r^2+a^2 - 2*m*r
el[3] = 2*a
el.display()
Out[45]:
In [46]:
g(el,el).display()
Out[46]:
In [47]:
acc = nab(el).contract(el)
acc.display()
Out[47]:
In [48]:
for i in [0,1,3]:
    pretty_print(acc[i] / el[i])
In [49]:
kappa = (acc[0] / el[0]).expr()
kappa
Out[49]:
In [50]:
acc == kappa * el
Out[50]: