# Near-horizon geometry of the extremal Kerr black hole¶

This notebook derives the near-horizon geometry of the extremal (i.e. maximally spinning) Kerr black hole. It is based on SageMath tools developed through the SageManifolds project. Some of these tools, like the series expansion of tensor fields, are quite recent and require a version of SageMath at least equal to 8.8:

In [1]:
version()

Out[1]:
'SageMath version 9.0.beta7, Release Date: 2019-11-26'

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

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 manifold¶

We declare the Kerr spacetime (or more precisely the part of it covered by Boyer-Lindquist coordinates) as a 4-dimensional Lorentzian manifold $\mathcal{M}$:

In [4]:
M = Manifold(4, 'M', latex_name=r'\mathcal{M}', structure='Lorentzian')
print(M)

4-dimensional Lorentzian manifold M


We then introduce the standard Boyer-Lindquist coordinates $(t,r,\theta,\phi)$ as a chart BL (for Boyer-Lindquist) on $\mathcal{M}$, via the method chart(). The argument of the latter is a string (delimited by r"..." because of the backslash symbols) expressing the coordinates names, their ranges (the default is $(-\infty,+\infty)$) and their LaTeX symbols:

In [5]:
BL.<t,r,th,ph> = M.chart(r"t r th:(0,pi):\theta ph:(0,2*pi):periodic:\phi")
print(BL); BL

Chart (M, (t, r, th, ph))

Out[5]:
In [6]:
BL[0], BL[1]

Out[6]:

## Metric tensor of the extremal Kerr spacetime¶

The mass parameter $m$ of the Kerr spacetime is declared as a symbolic variable:

In [7]:
m = var('m', domain='real')


For the extremal Kerr black hole, the spin parameter $a$ reaches its upper bound, namely $m$:

In [8]:
a = m


We get the (yet undefined) spacetime metric:

In [9]:
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:

In [10]:
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()

Out[10]:

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

In [11]:
g[:]

Out[11]:

The list of the non-vanishing components:

In [12]:
g.display_comp()

Out[12]:

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

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

Out[13]:

## Near-horizon coordinates¶

Let us introduce the chart NH of the near-horizon coordinates $(\bar{t}, \bar{r}, \theta, \bar{\phi})$:

In [14]:
NH.<tb,rb,th,phb> = M.chart(r"tb:\bar{t} rb:\bar{r} th:(0,pi):\theta phb:(0,2*pi):periodic:\bar{\phi}")
print(NH)
NH

Chart (M, (tb, rb, th, phb))

Out[14]:
In [15]:
M.atlas()

Out[15]:

Following J. Bardeen and G. T. Horowitz, Phys. Rev. D 60, 104030 (1999), the near-horizon coordinates $(\bar{t}, \bar{r}, \theta, \bar{\phi})$ are related to the Boyer-Lindquist coordinates by $$\bar{t} = \epsilon t, \quad \bar{r} = \frac{r-m}{\epsilon},\quad \theta = \theta, \quad\bar{\phi} = \phi - \frac{t}{2m},$$ where $\epsilon$ is a constant parameter. The horizon of the extremal Kerr black hole is located at $r=m$, which corresponds to $\bar{r}=0$.

We implement the above relations as a transition map from the chart BL to the chart NH:

In [16]:
eps = var('eps', latex_name=r'\epsilon')
BL_to_NH = BL.transition_map(NH, [eps*t, (r-m)/eps, th, ph - t/(2*m)])
BL_to_NH.display()

Out[16]:

The inverse relation is

In [17]:
BL_to_NH.inverse().display()

Out[17]:

Note that we have

In [18]:
BL_to_NH.jacobian()

Out[18]:

and

In [19]:
BL_to_NH.jacobian_det()

Out[19]:

The metric components with respect the coordinates $(\bar{t}, \bar{r}, \theta, \bar{\phi})$ are computed by passing the chart NH to the method display():

In [20]:
M.default_chart()

Out[20]:
In [21]:
g.display()

Out[21]:
In [22]:
g.display(NH)

Out[22]:

From now on, we use the near-horizon coordinates as the default ones on the spacetime manifold:

In [23]:
M.set_default_chart(NH)
M.set_default_frame(NH.frame())


Hence NH becomes the default argument of display():

In [24]:
g.display()

Out[24]:

## The near-horizon metric $h$ as the limit $\epsilon\to 0$ of the Kerr metric $g$¶

Let us define the near-horizon metric as the metric $h$ on $\mathcal{M}$ that is the limit $\epsilon\to 0$ of the Kerr metric $g$. The limit is taken by asking for a series expansion of $g$ with respect to $\epsilon$ up to the 0-th order (i.e. keeping only $\epsilon^0$ terms). This is acheived via the method truncate:

In [25]:
h = M.lorentzian_metric('h')
h.set(g.truncate(eps, 0))
h.display()

Out[25]:
In [26]:
h.display_comp()

Out[26]:

The $\epsilon$-expansion of $g$ has been performed on all sets of components. Those in the Boyer-Lindquist frame are not valid since nothing in them depend explicitely on $\epsilon$. To have consistent sets of components, we simply delete these components:

In [27]:
del h._components[BL.frame()]


As a check, we compare with Eq. (2.6) of Bardeen & Horowitz, Phys. Rev. D 60, 104030 (1999), which involves the bilinear form $$q = \frac{4m^2\sin^2\theta}{1+\cos^2\theta} \left( \mathrm{d}\bar{\phi} + \frac{\bar{r}}{2m^2} \mathrm{d}\bar{t} \right)^2$$ We construct $h$ by getting first the 1-forms $\mathrm{d}\bar{t}$ and $\mathrm{d}\bar{\phi}$:

In [28]:
dtb = NH.coframe()[0]
dtb

Out[28]:
In [29]:
dphb = NH.coframe()[3]
dphb

Out[29]:
In [30]:
q = 4*m^2*sin(th)^2/(1+cos(th)^2) * (dphb + rb/(2*m^2)*dtb) * (dphb + rb/(2*m^2)*dtb)
q.display()

Out[30]:

We evaluate then $h-q$ to compare with Eq. (2.6) of Bardeen & Horowitz:

In [31]:
(h - q).display()

Out[31]:
In [32]:
s = (h - q)/(1+cos(th)^2)
s.display()

Out[32]:
In [33]:
for i in range(4):
for j in range(i, 4):
s[i,j].simplify()
s.display()

Out[33]:

The above result shows the complete agreement with Eq. (2.6) of Bardeen & Horowitz.

We note that the metric $h$ is not asymptotically flat. Besides, it is a solution of the vacuum Einstein equation:

In [34]:
h.ricci().display()

Out[34]:

## Killing vectors of the near-horizon geometry¶

Let us first consider the vector field $\eta := \frac{\partial}{\partial\bar{\phi}}$:

In [35]:
eta = M.vector_field(0, 0, 0, 1, name='eta', latex_name=r'\eta')
eta.display()

Out[35]:

It is a Killing vector of the near-horizon metric, since the Lie derivative of $h$ along $\eta$ vanishes:

In [36]:
h.lie_derivative(eta).display()

Out[36]:

This is not surprising since the components of $h$ are independent from $\bar{\phi}$.

Similarly, we can check that $\xi_1 := \frac{\partial}{\partial\bar{t}}$ is a Killing vector of $h$, reflecting the independence of the components of $h$ from $\bar{t}$:

In [37]:
xi1 = M.vector_field(1, 0, 0, 0, name='xi1', latex_name=r'\xi_{1}')
xi1.display()

Out[37]:
In [38]:
h.lie_derivative(xi1).display()

Out[38]:

The above two Killing vectors correspond respectively to the axisymmetry and the pseudo-stationarity of the Kerr metric. A third symmetry, which is not present in the original Kerr metric, is the invariance under the scaling $(\bar{t},\bar{r})\mapsto (\alpha \bar{t}, \bar{r}/\alpha)$, as it is clear on the metric components in Out[21]. The corresponding Killing vector is

In [39]:
xi2 = M.vector_field(tb, -rb, 0, 0, name='xi2', latex_name=r'\xi_{2}')
xi2.display()

Out[39]:
In [40]:
h.lie_derivative(xi2).display()

Out[40]:

Finally, a fourth Killing vector is

In [41]:
xi3 = M.vector_field(tb^2/2 + 2*m^4/rb^2, -tb*rb, 0, -2*m^2/rb,
name='xi3', latex_name=r'\xi_{3}')
xi3.display()

Out[41]:
In [42]:
h.lie_derivative(xi3).display()

Out[42]:

## Symmetry group¶

We have four independent Killing vectors, $\eta$, $\xi_1$, $\xi_2$ and $\xi_3$, which implies that the symmetry group of the near-horizon geometry is a 4-dimensional Lie group $G$. Let us determine $G$ by investigating the structure constants of the basis $(\eta, \xi_1, \xi_2, \xi_3)$ of the Lie algebra of $G$. First of all, we notice that $\eta$ commutes with the other Killing vectors:

In [43]:
for xi in [xi1, xi2, xi3]:
show(eta.bracket(xi).display())


Since $\eta$ generates the rotation group $\mathrm{SO}(2)=\mathrm{U}(1)$, we may write that $G = \mathrm{U}(1)\times G_3$, where $G_3$ is a 3-dimensional Lie group, whose generators are $(\xi_1, \xi_2, \xi_3)$. Let us determine the structure constants of these three vectors. We have

In [44]:
xi1.bracket(xi2).display()

Out[44]:
In [45]:
xi1.bracket(xi2) == xi1

Out[45]:
In [46]:
xi1.bracket(xi3).display()

Out[46]:
In [47]:
xi1.bracket(xi3) == xi2

Out[47]:
In [48]:
xi2.bracket(xi3).display()

Out[48]:
In [49]:
xi2.bracket(xi3) == xi3

Out[49]:

To summarize, we have

In [50]:
all([xi1.bracket(xi2) == xi1,
xi1.bracket(xi3) == xi2,
xi2.bracket(xi3) == xi3])

Out[50]:

To recognize a standard Lie algebra, let us perform a slight change of basis:

In [51]:
vE = -sqrt(2)*xi3
vF = sqrt(2)*xi1
vH = 2*xi2


We have then the following commutation relations:

In [52]:
all([vE.bracket(vF) == vH,
vH.bracket(vE) == 2*vE,
vH.bracket(vF) == -2*vF])

Out[52]:

We recognize the Lie algebra $\mathfrak{sl}(2, \mathbb{R})$. Indeed, we have, using the representation of $\mathfrak{sl}(2, \mathbb{R})$ by traceless $2\times 2$ matrices:

In [53]:
sl2 = lie_algebras.sl(QQ, 2, representation='matrix')
E,F,H = sl2.gens()

In [54]:
E

Out[54]:
In [55]:
F

Out[55]:
In [56]:
H

Out[56]:
In [57]:
all([E.bracket(F) == H,
H.bracket(E) == 2*E,
H.bracket(F) == -2*F])

Out[57]:

Hence, we have $$\mathrm{Lie}(G_3) = \mathfrak{sl}(2, \mathbb{R}).$$

At this stage, $G_3$ could be $\mathrm{SL}(2, \mathbb{R})$, $\mathrm{PSL}(2, \mathbb{R})$ or $\overline{\mathrm{SL}(2, \mathbb{R})}$ (the universal covering group of $\mathrm{SL}(2, \mathbb{R})$). One can show that actually $G_3 = \mathrm{SL}(2, \mathbb{R})$. We conclude that the full isometry group of the near-horizon geometry is $$G = \mathrm{U}(1) \times \mathrm{SL}(2, \mathbb{R}).$$

## Expression of the near-horizon Killing vectors in the Boyer-Lindquist basis¶

We have:

In [58]:
eta.display(BL)

Out[58]:
In [59]:
xi1.display(BL)

Out[59]:

Given that for an extremal Kerr black hole $\Omega_H = 1/(2m)$, we recognize that $$\xi_1 = \epsilon^{-1} \chi$$ where $\chi := \frac{\partial}{\partial t} + \Omega_H \frac{\partial}{\partial \phi}$ is the Killing vector that is tangent to the horizon null generators on $\mathcal{H}$, or equivalently that is the null normal of the Killing horizon $\mathcal{H}$.

In [60]:
xi2.display(BL)

Out[60]:
In [61]:
xi3.display(BL)

Out[61]:
In [62]:
for i in M.irange():
xi3[BL.frame(), i, BL].factor()
xi3.display(BL)

Out[62]:

### The Killing operator of $g$ applied to the near-horizon Killing vectors¶

In this part, we set the Boyer-Lindquist chart and frame back to the defaults ones:

In [63]:
M.set_default_chart(BL)
M.set_default_frame(BL.frame())


The Levi-Civita connection $\nabla$ of $g$:

In [64]:
nabla = g.connection()


The Killing form $\mathrm{K}v$ of a vector field $v$ is defined by $$(\mathrm{K}v)_{ab} := \nabla_a v_b + \nabla_b v_a,$$ where $v_a := g_{ab} v^b$. With SageMath, this becomes

In [65]:
def killing_form(v):
Kv = 2*nabla(v.down(g)).symmetrize()
if v._name is not None:
Kv.set_name('K' + v._name, latex_name=r'\mathrm{K}' + str(latex(v)))
return Kv


For some reason (to be investigated...), what follows does not work with multiprocessing:

In [66]:
Parallelism().set(nproc=1)


The Killing form of $\eta$ is identically zero:

In [67]:
Keta = killing_form(eta)
print(Keta)
Keta.display()

Field of symmetric bilinear forms Keta on the 4-dimensional Lorentzian manifold M

Out[67]:

We recover the fact that $\eta$ is a Killing vector of $g$. Similarly, we have

In [68]:
Kxi1 = killing_form(xi1)
print(Kxi1)
Kxi1.display()

Field of symmetric bilinear forms Kxi1 on the 4-dimensional Lorentzian manifold M

Out[68]:

We recover the fact that $\xi_1 = \epsilon^{-1}\chi$ is a Killing vector of $g$.

But $\xi_2$ and $\xi_3$ are not Killing vectors of $g$:

In [69]:
Kxi2 = killing_form(xi2)
print(Kxi2)
Kxi2.display()

Field of symmetric bilinear forms Kxi2 on the 4-dimensional Lorentzian manifold M

Out[69]:
In [70]:
Kxi3 = killing_form(xi3)
print(Kxi3)
Kxi3.display()

Field of symmetric bilinear forms Kxi3 on the 4-dimensional Lorentzian manifold M

Out[70]:
In [71]:
Kxi3.truncate(eps, 0).display()

Out[71]: