Maximal extension of the extremal Kerr black hole

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

The computations make use of tools developed through the SageManifolds project.

In [1]:
version()
Out[1]:
'SageMath version 9.5.beta2, Release Date: 2021-09-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 as a 4-dimensional Lorentzian manifold $M$:

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

We then introduce (3+1 version of) the Kerr coordinates $(\tilde{t},r,\theta,\tilde{\varphi})$ as a chart KC on $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]:
KC.<tt,r,th,tph> = M.chart(r"tt:\tilde{t} r th:(0,pi):\theta tph:(0,2*pi):periodic:\tilde{\varphi}") 
print(KC); KC
Chart (M, (tt, r, th, tph))
Out[5]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(M,({\tilde{t}}, r, {\theta}, {\tilde{\varphi}})\right)\]
In [6]:
KC.coord_range()
Out[6]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}{\tilde{t}} :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( -\infty, +\infty \right) ;\quad {\theta} :\ \left( 0 , \pi \right) ;\quad {\tilde{\varphi}} :\ \left[ 0 , 2 \, \pi \right] \mbox{(periodic)}\]

Metric tensor

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

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

We get the (yet undefined) spacetime metric:

In [8]:
g = M.metric()

and initialize it by providing its components in the coordinate frame associated with the Kerr coordinates, which is the current manifold's default frame:

In [9]:
rho2 = r^2 + (m*cos(th))^2
g[0,0] = - (1 - 2*m*r/rho2)
g[0,1] = 2*m*r/rho2
g[0,3] = -2*m^2*r*sin(th)^2/rho2
g[1,1] = 1 + 2*m*r/rho2
g[1,3] = -m*(1 + 2*m*r/rho2)*sin(th)^2
g[2,2] = rho2
g[3,3] = (r^2 + m^2 + 2*m^3*r*sin(th)^2/rho2)*sin(th)^2
g.display()
Out[9]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}g = \left( \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} - 1 \right) \mathrm{d} {\tilde{t}}\otimes \mathrm{d} {\tilde{t}} + \left( \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{t}}\otimes \mathrm{d} r + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{t}}\otimes \mathrm{d} {\tilde{\varphi}} + \left( \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} r\otimes \mathrm{d} {\tilde{t}} + \left( \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1 \right) \mathrm{d} r\otimes \mathrm{d} r -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} \mathrm{d} r\otimes \mathrm{d} {\tilde{\varphi}} + \left( m^{2} \cos\left({\theta}\right)^{2} + r^{2} \right) \mathrm{d} {\theta}\otimes \mathrm{d} {\theta} + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\varphi}}\otimes \mathrm{d} {\tilde{t}} -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} \mathrm{d} {\tilde{\varphi}}\otimes \mathrm{d} r + {\left(\frac{2 \, m^{3} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + m^{2} + r^{2}\right)} \sin\left({\theta}\right)^{2} \mathrm{d} {\tilde{\varphi}}\otimes \mathrm{d} {\tilde{\varphi}}\]

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

In [10]:
g[:]
Out[10]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrr} \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} - 1 & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} & 0 & -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \\ \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1 & 0 & -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} \\ 0 & 0 & m^{2} \cos\left({\theta}\right)^{2} + r^{2} & 0 \\ -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} & -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} & 0 & {\left(\frac{2 \, m^{3} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + m^{2} + r^{2}\right)} \sin\left({\theta}\right)^{2} \end{array}\right)\]

The list of the non-vanishing components:

In [11]:
g.display_comp()
Out[11]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\begin{array}{lcl} g_{ \, {\tilde{t}} \, {\tilde{t}} }^{ \phantom{\, {\tilde{t}}}\phantom{\, {\tilde{t}}} } & = & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} - 1 \\ g_{ \, {\tilde{t}} \, r }^{ \phantom{\, {\tilde{t}}}\phantom{\, r} } & = & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \\ g_{ \, {\tilde{t}} \, {\tilde{\varphi}} }^{ \phantom{\, {\tilde{t}}}\phantom{\, {\tilde{\varphi}}} } & = & -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \\ g_{ \, r \, {\tilde{t}} }^{ \phantom{\, r}\phantom{\, {\tilde{t}}} } & = & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \\ g_{ \, r \, r }^{ \phantom{\, r}\phantom{\, r} } & = & \frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1 \\ g_{ \, r \, {\tilde{\varphi}} }^{ \phantom{\, r}\phantom{\, {\tilde{\varphi}}} } & = & -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} \\ g_{ \, {\theta} \, {\theta} }^{ \phantom{\, {\theta}}\phantom{\, {\theta}} } & = & m^{2} \cos\left({\theta}\right)^{2} + r^{2} \\ g_{ \, {\tilde{\varphi}} \, {\tilde{t}} }^{ \phantom{\, {\tilde{\varphi}}}\phantom{\, {\tilde{t}}} } & = & -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \\ g_{ \, {\tilde{\varphi}} \, r }^{ \phantom{\, {\tilde{\varphi}}}\phantom{\, r} } & = & -m {\left(\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + 1\right)} \sin\left({\theta}\right)^{2} \\ g_{ \, {\tilde{\varphi}} \, {\tilde{\varphi}} }^{ \phantom{\, {\tilde{\varphi}}}\phantom{\, {\tilde{\varphi}}} } & = & {\left(\frac{2 \, m^{3} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} + m^{2} + r^{2}\right)} \sin\left({\theta}\right)^{2} \end{array}\]

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

In [12]:
#g.ricci().display()

Regions $M_{\rm I}$ and $M_{\rm III}$

In [13]:
M_I = M.open_subset('M_I', latex_name=r'M_{\rm I}', coord_def={KC: r>m})
KC.restrict(M_I).coord_range()
Out[13]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}{\tilde{t}} :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( m , +\infty \right) ;\quad {\theta} :\ \left( -\infty, +\infty \right) ;\quad {\tilde{\varphi}} :\ \left( -\infty, +\infty \right)\]
In [14]:
M_III = M.open_subset('M_III', latex_name=r'M_{\rm III}', coord_def={KC: r<m})
KC.restrict(M_III).coord_range()
Out[14]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}{\tilde{t}} :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( -\infty, m \right) ;\quad {\theta} :\ \left( -\infty, +\infty \right) ;\quad {\tilde{\varphi}} :\ \left( -\infty, +\infty \right)\]

Boyer-Lindquist coordinates on $M_{\rm I}$

Let us introduce on the chart of Boyer-Lindquist coordinates $(t,r,\theta,\varphi)$ on $M_{\rm I}$:

In [15]:
BL.<t,r,th,ph> = M_I.chart(r"t r:(m,+oo) th:(0,pi):\theta ph:(0,2*pi):periodic:\varphi") 
print(BL); BL
Chart (M_I, (t, r, th, ph))
Out[15]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(M_{\rm I},(t, r, {\theta}, {\varphi})\right)\]
In [16]:
BL.coord_range()
Out[16]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}t :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( m , +\infty \right) ;\quad {\theta} :\ \left( 0 , \pi \right) ;\quad {\varphi} :\ \left[ 0 , 2 \, \pi \right] \mbox{(periodic)}\]
In [17]:
KC_to_BL = KC.restrict(M_I).transition_map(BL, [tt + 2*m^2/(r-m) - 2*m*ln(abs(r-m)/m),
                                                r, th, tph + m/(r-m)])
KC_to_BL.display()
Out[17]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} t & = & -2 \, m \log\left(\frac{{\left| -m + r \right|}}{m}\right) - \frac{2 \, m^{2}}{m - r} + {\tilde{t}} \\ r & = & r \\ {\theta} & = & {\theta} \\ {\varphi} & = & {\tilde{\varphi}} - \frac{m}{m - r} \end{array}\right.\]
In [18]:
KC_to_BL.inverse().display()
Out[18]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} {\tilde{t}} & = & -\frac{2 \, m^{2} \log\left(m\right) - 2 \, m r \log\left(m\right) - 2 \, m^{2} - {\left(m - r\right)} t - 2 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{m - r} \\ r & = & r \\ {\theta} & = & {\theta} \\ {\tilde{\varphi}} & = & \frac{m {\varphi} - {\varphi} r + m}{m - r} \end{array}\right.\]
In [19]:
g.display(BL)
Out[19]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}g = \left( -\frac{m^{2} \cos\left({\theta}\right)^{2} - 2 \, m r + r^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} t\otimes \mathrm{d} t + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} t\otimes \mathrm{d} {\varphi} + \left( \frac{m^{2} \cos\left({\theta}\right)^{2} + r^{2}}{m^{2} - 2 \, m r + r^{2}} \right) \mathrm{d} r\otimes \mathrm{d} r + \left( m^{2} \cos\left({\theta}\right)^{2} + r^{2} \right) \mathrm{d} {\theta}\otimes \mathrm{d} {\theta} + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\varphi}\otimes \mathrm{d} t + \left( \frac{2 \, m^{3} r \sin\left({\theta}\right)^{4} + {\left(m^{2} r^{2} + r^{4} + {\left(m^{4} + m^{2} r^{2}\right)} \cos\left({\theta}\right)^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\varphi}\otimes \mathrm{d} {\varphi}\]

Ingoing principal null geodesics

In [20]:
k = M.vector_field(1, -1, 0, 0, name='k')
k.display()
Out[20]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}k = \frac{\partial}{\partial {\tilde{t}} }-\frac{\partial}{\partial r }\]

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

In [21]:
g(k, k).expr()
Out[21]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}0\]

Check that $k$ is a geodesic vector field, i.e. obeys $\nabla_k k = 0$:

In [22]:
nabla = g.connection()
In [23]:
nabla(k).contract(k).display()
Out[23]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}0\]

Expression of $k$ with respect to the Boyer-Lindquist frame:

In [24]:
k.display(BL)
Out[24]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}k = \left( \frac{m^{2} + r^{2}}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial t } -\frac{\partial}{\partial r } + \left( \frac{m}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\varphi} }\]

Outgoing principal null geodesics

In [25]:
el = M.vector_field((r + m)^2/(2*(r^2 + m^2)),
                    (r - m)^2/(2*(r^2 + m^2)),
                    0,
                    m/(r^2 + m^2),
                    name='el', latex_name=r'\ell')
el.display()
Out[25]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell = \frac{{\left(m + r\right)}^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \frac{\partial}{\partial {\tilde{t}} } + \frac{{\left(m - r\right)}^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \frac{\partial}{\partial r } + \left( \frac{m}{m^{2} + r^{2}} \right) \frac{\partial}{\partial {\tilde{\varphi}} }\]

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

In [26]:
g(el, el).expr()
Out[26]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}0\]

Expression of $\ell$ with respect to the Boyer-Lindquist frame:

In [27]:
el.display(BL)
Out[27]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell = \frac{1}{2} \frac{\partial}{\partial t } + \frac{{\left(m - r\right)}^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \frac{\partial}{\partial r } + \frac{m}{2 \, {\left(m^{2} + r^{2}\right)}} \frac{\partial}{\partial {\varphi} }\]

Computation of $\nabla_\ell \ell$:

In [28]:
acc = nabla(el).contract(el)
acc.display()
Out[28]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( -\frac{m^{5} + 2 \, m^{4} r - 2 \, m^{2} r^{3} - m r^{4}}{2 \, {\left(m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}\right)}} \right) \frac{\partial}{\partial {\tilde{t}} } + \left( -\frac{m^{5} - 2 \, m^{4} r + 2 \, m^{2} r^{3} - m r^{4}}{2 \, {\left(m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}\right)}} \right) \frac{\partial}{\partial r } + \left( -\frac{m^{4} - m^{2} r^{2}}{m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}} \right) \frac{\partial}{\partial {\tilde{\varphi}} }\]

We check that $\nabla_\ell \ell = \kappa \ell$:

In [29]:
kappa = acc[0] / el[0]
kappa
Out[29]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{m^{3} - m r^{2}}{m^{4} + 2 \, m^{2} r^{2} + r^{4}}\]
In [30]:
kappa.factor()
Out[30]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{{\left(m + r\right)} {\left(m - r\right)} m}{{\left(m^{2} + r^{2}\right)}^{2}}\]
In [31]:
acc == kappa*el
Out[31]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{True}\]

Outgoing Kerr coordinates on $M_{\rm I}$

In [32]:
OKC.<to,r,th,oph> = M_I.chart(r"to:\tilde{\tilde{t}} r:(m,+oo) th:(0,pi):\theta oph:(0,2*pi):periodic:\tilde{\tilde{\varphi}}") 
OKC.coord_range()
Out[32]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}{\tilde{\tilde{t}}} :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( m , +\infty \right) ;\quad {\theta} :\ \left( 0 , \pi \right) ;\quad {\tilde{\tilde{\varphi}}} :\ \left[ 0 , 2 \, \pi \right] \mbox{(periodic)}\]
In [33]:
BL_to_OKC = BL.transition_map(OKC, [t + 2*m^2/(r-m) - 2*m*ln(abs(r-m)/m),
                                    r, th, ph + m/(r-m)])
BL_to_OKC.display()
Out[33]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} {\tilde{\tilde{t}}} & = & -2 \, m \log\left(\frac{{\left| -m + r \right|}}{m}\right) - \frac{2 \, m^{2}}{m - r} + t \\ r & = & r \\ {\theta} & = & {\theta} \\ {\tilde{\tilde{\varphi}}} & = & {\varphi} - \frac{m}{m - r} \end{array}\right.\]
In [34]:
BL_to_OKC.inverse().display()
Out[34]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} t & = & -\frac{2 \, m^{2} \log\left(m\right) - 2 \, m r \log\left(m\right) - 2 \, m^{2} - {\left(m - r\right)} {\tilde{\tilde{t}}} - 2 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{m - r} \\ r & = & r \\ {\theta} & = & {\theta} \\ {\varphi} & = & \frac{m {\tilde{\tilde{\varphi}}} - {\tilde{\tilde{\varphi}}} r + m}{m - r} \end{array}\right.\]
In [35]:
KC_to_OKC = BL_to_OKC * KC_to_BL.restrict(M_I)
KC_to_OKC.display()
Out[35]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} {\tilde{\tilde{t}}} & = & \frac{4 \, m^{2} \log\left(m\right) - 4 \, m r \log\left(m\right) - 4 \, m^{2} + {\left(m - r\right)} {\tilde{t}} - 4 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{m - r} \\ r & = & r \\ {\theta} & = & {\theta} \\ {\tilde{\tilde{\varphi}}} & = & \frac{{\left(m - r\right)} {\tilde{\varphi}} - 2 \, m}{m - r} \end{array}\right.\]
In [36]:
KC_to_OKC.inverse().display()
Out[36]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} {\tilde{t}} & = & -\frac{4 \, m^{2} \log\left(m\right) - 4 \, m r \log\left(m\right) - 4 \, m^{2} - {\left(m - r\right)} {\tilde{\tilde{t}}} - 4 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{m - r} \\ r & = & r \\ {\theta} & = & {\theta} \\ {\tilde{\varphi}} & = & \frac{m {\tilde{\tilde{\varphi}}} - {\tilde{\tilde{\varphi}}} r + 2 \, m}{m - r} \end{array}\right.\]
In [37]:
M_I.set_default_chart(OKC)
M_I.set_default_frame(OKC.frame())
In [38]:
gI = g.restrict(M_I)
gI.display()
Out[38]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}g = \left( -\frac{m^{2} \cos\left({\theta}\right)^{2} - 2 \, m r + r^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{t}}}\otimes \mathrm{d} {\tilde{\tilde{t}}} + \left( -\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{t}}}\otimes \mathrm{d} r + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{t}}}\otimes \mathrm{d} {\tilde{\tilde{\varphi}}} + \left( -\frac{2 \, m r}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} r\otimes \mathrm{d} {\tilde{\tilde{t}}} + \left( \frac{m^{2} \cos\left({\theta}\right)^{2} + 2 \, m r + r^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} r\otimes \mathrm{d} r + \left( -\frac{m^{3} \sin\left({\theta}\right)^{4} - {\left(m^{3} + 2 \, m^{2} r + m r^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} r\otimes \mathrm{d} {\tilde{\tilde{\varphi}}} + \left( m^{2} \cos\left({\theta}\right)^{2} + r^{2} \right) \mathrm{d} {\theta}\otimes \mathrm{d} {\theta} + \left( -\frac{2 \, m^{2} r \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{\varphi}}}\otimes \mathrm{d} {\tilde{\tilde{t}}} + \left( -\frac{m^{3} \sin\left({\theta}\right)^{4} - {\left(m^{3} + 2 \, m^{2} r + m r^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{\varphi}}}\otimes \mathrm{d} r + \left( \frac{2 \, m^{3} r \sin\left({\theta}\right)^{4} + {\left(m^{2} r^{2} + r^{4} + {\left(m^{4} + m^{2} r^{2}\right)} \cos\left({\theta}\right)^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}} \right) \mathrm{d} {\tilde{\tilde{\varphi}}}\otimes \mathrm{d} {\tilde{\tilde{\varphi}}}\]
In [39]:
gI[1,3]
Out[39]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{m^{3} \sin\left({\theta}\right)^{4} - {\left(m^{3} + 2 \, m^{2} r + m r^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}}\]
In [40]:
gI[1,3] == m*(1 + 2*m*r/rho2)*sin(th)^2
Out[40]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{True}\]
In [41]:
gI[3,3]
Out[41]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\frac{2 \, m^{3} r \sin\left({\theta}\right)^{4} + {\left(m^{2} r^{2} + r^{4} + {\left(m^{4} + m^{2} r^{2}\right)} \cos\left({\theta}\right)^{2}\right)} \sin\left({\theta}\right)^{2}}{m^{2} \cos\left({\theta}\right)^{2} + r^{2}}\]
In [42]:
g[3,3] == (r^2 + m^2 + 2*m^3*r*sin(th)^2/rho2)*sin(th)^2
Out[42]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{True}\]
In [43]:
ol = M_I.vector_field({OKC.frame(): (1, 1, 0, 0)}, name='ol', 
                      latex_name=r"\ell'")
ol.display()
Out[43]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell' = \frac{\partial}{\partial {\tilde{\tilde{t}}} }+\frac{\partial}{\partial r }\]
In [44]:
ol.display(KC.restrict(M_I).frame())
Out[44]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell' = \left( \frac{m^{2} + 2 \, m r + r^{2}}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\tilde{t}} } +\frac{\partial}{\partial r } + \left( \frac{2 \, m}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\tilde{\varphi}} }\]
In [45]:
ol.display(BL.frame())
Out[45]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell' = \left( \frac{m^{2} + r^{2}}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial t } +\frac{\partial}{\partial r } + \left( \frac{m}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\varphi} }\]
In [46]:
g(ol, ol).expr()
Out[46]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}0\]
In [47]:
nabla.coef(OKC.frame())
Out[47]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\verb|3-indices|\phantom{\verb!x!}\verb|components|\phantom{\verb!x!}\verb|w.r.t.|\phantom{\verb!x!}\verb|Coordinate|\phantom{\verb!x!}\verb|frame|\phantom{\verb!x!}\verb|(M_I,|\phantom{\verb!x!}\verb|(∂/∂to,∂/∂r,∂/∂th,∂/∂oph)),|\phantom{\verb!x!}\verb|with|\phantom{\verb!x!}\verb|symmetry|\phantom{\verb!x!}\verb|on|\phantom{\verb!x!}\verb|the|\phantom{\verb!x!}\verb|index|\phantom{\verb!x!}\verb|positions|\phantom{\verb!x!}\verb|(1,|\phantom{\verb!x!}\verb|2)|\]
In [48]:
nabla(ol).contract(ol).display()
Out[48]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}0\]
In [49]:
elI = el.restrict(M_I)
elI.display()
Out[49]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\ell = \left( \frac{m^{2} - 2 \, m r + r^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \right) \frac{\partial}{\partial {\tilde{\tilde{t}}} } + \left( \frac{m^{2} - 2 \, m r + r^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \right) \frac{\partial}{\partial r }\]

Check of the relation $\ell' = 2 \frac{r^2 + m^2}{(r - m)^2} \, \ell$:

In [50]:
ol == 2*(r^2 + m^2)/(r - m)^2 * elI
Out[50]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{True}\]
In [51]:
kI = k.restrict(M_I)
kI.display()
Out[51]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}k = \left( \frac{m^{2} + 2 \, m r + r^{2}}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\tilde{\tilde{t}}} } -\frac{\partial}{\partial r } + \left( \frac{2 \, m}{m^{2} - 2 \, m r + r^{2}} \right) \frac{\partial}{\partial {\tilde{\tilde{\varphi}}} }\]
In [52]:
ok = (r - m)^2/(2*(r^2 + m^2)) * kI
ok.set_name('ok', latex_name=r"k'")
ok.display()
Out[52]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}k' = \left( \frac{m^{2} + 2 \, m r + r^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \right) \frac{\partial}{\partial {\tilde{\tilde{t}}} } + \left( -\frac{m^{2} - 2 \, m r + r^{2}}{2 \, {\left(m^{2} + r^{2}\right)}} \right) \frac{\partial}{\partial r } + \left( \frac{m}{m^{2} + r^{2}} \right) \frac{\partial}{\partial {\tilde{\tilde{\varphi}}} }\]
In [53]:
g(k, el).expr()
Out[53]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{m^{2} \cos\left({\theta}\right)^{2} + r^{2}}{m^{2} + r^{2}}\]
In [54]:
g(ok, ol).expr()
Out[54]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{m^{2} \cos\left({\theta}\right)^{2} + r^{2}}{m^{2} + r^{2}}\]
In [55]:
g(k, ol).expr().factor()
Out[55]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{2 \, {\left(m^{2} \cos\left({\theta}\right)^{2} + r^{2}\right)}}{{\left(m - r\right)}^{2}}\]
In [56]:
g(ok, el).expr().factor()
Out[56]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{{\left(m^{2} \cos\left({\theta}\right)^{2} + r^{2}\right)} {\left(m - r\right)}^{2}}{2 \, {\left(m^{2} + r^{2}\right)}^{2}}\]

Non-affinity coefficient of $k'$

In [57]:
acc_ok = nabla(ok).contract(ok)
acc_ok.display()
Out[57]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( \frac{m^{5} + 2 \, m^{4} r - 2 \, m^{2} r^{3} - m r^{4}}{2 \, {\left(m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}\right)}} \right) \frac{\partial}{\partial {\tilde{\tilde{t}}} } + \left( -\frac{m^{5} - 2 \, m^{4} r + 2 \, m^{2} r^{3} - m r^{4}}{2 \, {\left(m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}\right)}} \right) \frac{\partial}{\partial r } + \left( \frac{m^{4} - m^{2} r^{2}}{m^{6} + 3 \, m^{4} r^{2} + 3 \, m^{2} r^{4} + r^{6}} \right) \frac{\partial}{\partial {\tilde{\tilde{\varphi}}} }\]
In [58]:
kappa_ok = acc_ok[0] / ok[0]
kappa_ok.factor()
Out[58]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\frac{{\left(m + r\right)} {\left(m - r\right)} m}{{\left(m^{2} + r^{2}\right)}^{2}}\]

We check that $\nabla_{k'} k' = \kappa_{k'} k'$:

In [59]:
acc_ok == kappa_ok * ok
Out[59]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{True}\]

Compactified coordinates on $M$

In [60]:
CC.<T,X,th,tph> = M.chart(r"T X th:(0,pi):\theta tph:(0,2*pi):periodic:\tilde{\varphi}")
CC
Out[60]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(M,(T, X, {\theta}, {\tilde{\varphi}})\right)\]
In [61]:
uc = (tt - r)/m + 4*m/(r - m) - 4*ln(abs((r - m)/m))
vc = (tt + r)/m
KC_to_CC = KC.transition_map(CC, [atan(uc/2) + atan(vc/2) + pi*unit_step(m - r),
                                  atan(vc/2) - atan(uc/2) - pi*unit_step(m - r),
                                  th,
                                  tph])
KC_to_CC.display()
Out[61]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} T & = & \pi \mathrm{u}\left(m - r\right) + \arctan\left(-\frac{2 \, m}{m - r} - \frac{r - {\tilde{t}}}{2 \, m} - 2 \, \log\left({\left| \frac{m - r}{m} \right|}\right)\right) + \arctan\left(\frac{r + {\tilde{t}}}{2 \, m}\right) \\ X & = & -\pi \mathrm{u}\left(m - r\right) - \arctan\left(-\frac{2 \, m}{m - r} - \frac{r - {\tilde{t}}}{2 \, m} - 2 \, \log\left({\left| \frac{m - r}{m} \right|}\right)\right) + \arctan\left(\frac{r + {\tilde{t}}}{2 \, m}\right) \\ {\theta} & = & {\theta} \\ {\tilde{\varphi}} & = & {\tilde{\varphi}} \end{array}\right.\]
In [62]:
OKC_to_CC = KC_to_CC.restrict(M_I) * KC_to_OKC.inverse()
OKC_to_CC.display()
Out[62]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} T & = & \arctan\left(-\frac{4 \, m^{2} \log\left(m\right) - 4 \, m^{2} - {\left(4 \, m \log\left(m\right) + m\right)} r + r^{2} - {\left(m - r\right)} {\tilde{\tilde{t}}} - 4 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{2 \, {\left(m^{2} - m r\right)}}\right) + \arctan\left(-\frac{r - {\tilde{\tilde{t}}}}{2 \, m}\right) \\ X & = & \arctan\left(-\frac{4 \, m^{2} \log\left(m\right) - 4 \, m^{2} - {\left(4 \, m \log\left(m\right) + m\right)} r + r^{2} - {\left(m - r\right)} {\tilde{\tilde{t}}} - 4 \, {\left(m^{2} - m r\right)} \log\left(-m + r\right)}{2 \, {\left(m^{2} - m r\right)}}\right) - \arctan\left(-\frac{r - {\tilde{\tilde{t}}}}{2 \, m}\right) \\ {\theta} & = & {\theta} \\ {\tilde{\varphi}} & = & \frac{m {\tilde{\tilde{\varphi}}} - {\tilde{\tilde{\varphi}}} r + 2 \, m}{m - r} \end{array}\right.\]

Spacetime $(M', g)$

In [63]:
forget(r>m)
In [64]:
Mp = Manifold(4, "M'", structure='Lorentzian')
OKCp.<to,r,th,oph> = Mp.chart(r"to:\tilde{\tilde{t}} r th:(0,pi):\theta oph:(0,2*pi):periodic:\tilde{\tilde{\varphi}}") 
OKCp
Out[64]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(M',({\tilde{\tilde{t}}}, r, {\theta}, {\tilde{\tilde{\varphi}}})\right)\]
In [65]:
OKCp.coord_range()
Out[65]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}{\tilde{\tilde{t}}} :\ \left( -\infty, +\infty \right) ;\quad r :\ \left( -\infty, +\infty \right) ;\quad {\theta} :\ \left( 0 , \pi \right) ;\quad {\tilde{\tilde{\varphi}}} :\ \left[ 0 , 2 \, \pi \right] \mbox{(periodic)}\]
In [66]:
CCp.<T,X,th,oph> = Mp.chart(r"T X th:(0,pi):\theta oph:(0,2*pi):periodic:\tilde{\tilde{\varphi}}")
CCp
Out[66]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left(M',(T, X, {\theta}, {\tilde{\tilde{\varphi}}})\right)\]
In [67]:
uc = (to - r)/m 
vc = (to + r)/m - 4*m/(r - m) + 4*ln(abs((r - m)/m))
OKC_to_CCp = OKCp.transition_map(CCp, [atan(uc/2) + atan(vc/2) - pi*unit_step(m - r),
                                       atan(vc/2) - atan(uc/2) - pi*unit_step(m - r),
                                       th,
                                       oph])
OKC_to_CCp.display()
Out[67]:
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left\{\begin{array}{lcl} T & = & -\pi \mathrm{u}\left(m - r\right) + \arctan\left(\frac{2 \, m}{m - r} + \frac{r + {\tilde{\tilde{t}}}}{2 \, m} + 2 \, \log\left({\left| \frac{m - r}{m} \right|}\right)\right) + \arctan\left(-\frac{r - {\tilde{\tilde{t}}}}{2 \, m}\right) \\ X & = & -\pi \mathrm{u}\left(m - r\right) + \arctan\left(\frac{2 \, m}{m - r} + \frac{r + {\tilde{\tilde{t}}}}{2 \, m} + 2 \, \log\left({\left| \frac{m - r}{m} \right|}\right)\right) - \arctan\left(-\frac{r - {\tilde{\tilde{t}}}}{2 \, m}\right) \\ {\theta} & = & {\theta} \\ {\tilde{\tilde{\varphi}}} & = & {\tilde{\tilde{\varphi}}} \end{array}\right.\]

Plot of principal null geodesics

In [68]:
lamb = var('lamb', latex_name=r'\lambda')

def inPNG(v0, th0, tph0):
    return M.curve({KC: [lamb + v0, -lamb, th0, tph0]}, param=lamb)

def outPNG(u0, th0, oph0):
    return Mp.curve({OKCp: [u0 + r, r, th0, oph0]}, param=r)

def outPNG_III(u0, th0, tph0):
    return M.curve({KC: [u0 + r - 4*m^2/(r - m) + 4*m*ln(abs(r - m)/m), 
                         r, th0, tph0]}, 
                   param=(r, -oo, 1))

def inPNG_IIIp(v0, th0, oph0):
    return Mp.curve({OKCp: [v0 + lamb - 4*m^2/(lamb + m) - 4*m*ln(abs(lamb + m)/m), 
                            -lamb, th0, oph0]}, 
                    param=(lamb, -1, +oo))
In [69]:
graph0 = polygon([(0, pi), (-pi, 2*pi), (-2*pi, pi), (-pi, 0)], 
                color='cornsilk', edgecolor='black') \
         + polygon([(pi, 0), (0, pi), (-pi, 0), (0, -pi)], 
                   color='white', edgecolor='black') \
         + polygon([(0, -pi), (-pi, 0), (-2*pi, -pi), (-pi, -2*pi)], 
                color='cornsilk', edgecolor='black') 
In [70]:
graph_PNG = Graphics()

for L in [inPNG(0, pi/3, 0), inPNG(-4, pi/3, 0), inPNG(4, pi/3, 0)]:
    L.expr(chart2=CC)
    graph_PNG += L.plot(CC, ambient_coords=(X, T), color='green', style='--', 
                        max_range=100, plot_points=4, parameters={m: 1})
    
for L in [outPNG(0, pi/3, 0), outPNG(-4, pi/3, 0), outPNG(4, pi/3, 0)]:
    L.expr(chart2=CCp)
    graph_PNG += L.plot(CCp, ambient_coords=(X, T), color='green', 
                        max_range=100, plot_points=4, parameters={m: 1})

for L in [outPNG_III(0, pi/3, 0), outPNG_III(-4, pi/3, 0), outPNG_III(4, pi/3, 0)]:
    L.expr(chart2=CC)
    graph_PNG += L.plot(CC, ambient_coords=(X, T), color='green', 
                        prange=(-100, 0.999), plot_points=4, parameters={m: 1})
    
for L in [inPNG_IIIp(0, pi/3, 0), inPNG_IIIp(-4, pi/3, 0), inPNG_IIIp(4, pi/3, 0)]:
    L.expr(chart2=CCp)
    graph_PNG += L.plot(CCp, ambient_coords=(X, T), color='green', style='--', 
                        prange=(-0.999, 100), plot_points=4, parameters={m: 1})
    
graph = graph0 + graph_PNG 
graph
Out[70]:

Plots of hypersurfaces of constant $r$

In [71]:
def plot_const_r(r0, color='red', linestyle=':', thickness=1, plot_points=300):
    return KC.plot(CC, ambient_coords=(X,T), fixed_coords={th: pi/3, tph: 0, r: r0},
                   ranges={tt: (-100, 100)}, color=color, style=linestyle,
                   thickness=thickness, plot_points=plot_points, parameters={m: 1})

def plot_const_tt(tt0, color='darkgrey', linestyle='-', thickness=1, plot_points=100):
    resu = KC.plot(CC, ambient_coords=(X,T), fixed_coords={th: pi/3, tph: 0, tt: tt0},
                   ranges={r: (-100, -10)}, color=color, style=linestyle,
                   thickness=thickness, plot_points=plot_points, parameters={m: 1}) \
           + KC.plot(CC, ambient_coords=(X,T), fixed_coords={th: pi/3, tph: 0, tt: tt0},
                     ranges={r: (-10, 10)}, color=color, style=linestyle,
                     thickness=thickness, plot_points=plot_points, parameters={m: 1}) \
           + KC.plot(CC, ambient_coords=(X,T), fixed_coords={th: pi/3, tph: 0, tt: tt0},
                     ranges={r: (10, 100)}, color=color, style=linestyle,
                     thickness=thickness, plot_points=plot_points, parameters={m: 1})
    return resu
In [72]:
def plot_const_r_p(r0, color='red', linestyle=':', thickness=1, plot_points=300):
    return OKCp.plot(CCp, ambient_coords=(X,T), fixed_coords={th: pi/3, oph: 0, r: r0},
                     ranges={to: (-100, 100)}, color=color, style=linestyle,
                     thickness=thickness, plot_points=plot_points, parameters={m: 1})

def plot_const_to(to0, color='violet', linestyle='-', thickness=1, plot_points=100):
    resu = OKCp.plot(CCp, ambient_coords=(X,T), fixed_coords={th: pi/3, oph: 0, to: to0},
                     ranges={r: (-100, -10)}, color=color, style=linestyle,
                     thickness=thickness, plot_points=plot_points, parameters={m: 1}) \
           + OKCp.plot(CCp, ambient_coords=(X,T), fixed_coords={th: pi/3, oph: 0, to: to0},
                       ranges={r: (-10, 10)}, color=color, style=linestyle,
                       thickness=thickness, plot_points=plot_points, parameters={m: 1}) \
           + OKCp.plot(CCp, ambient_coords=(X,T), fixed_coords={th: pi/3, oph: 0, to: to0},
                       ranges={r: (10, 100)}, color=color, style=linestyle,
                       thickness=thickness, plot_points=plot_points, parameters={m: 1})
    return resu
In [73]:
for r0 in [-10, -8, -6, -4, -2, 0.5, 1.5, 2, 2.5, 3, 5, 7, 9]:
    graph += plot_const_r(r0)
graph += plot_const_r(0, color='maroon', linestyle='--', thickness=2)

for r0 in [-10, -8, -6, -4, -2, 0.5]:
    graph += plot_const_r_p(r0)
graph += plot_const_r_p(0, color='maroon', linestyle='--', thickness=2)

show(graph, figsize=10, axes=False, frame=True)

Plots of hypersurfaces of constant $\tilde{t}$

In [74]:
tmin, tmax, dt = -10, 10, 2
for i in range(int((tmax - tmin)/dt) + 1):
    ti = tmin + dt*i
    graph += plot_const_tt(ti) 
graph += plot_const_tt(0, thickness=2)
show(graph, figsize=10, axes=False, frame=True)

Plots of hypersurfaces of constant $\tilde{\tilde{t}}$

In [75]:
tmin, tmax, dt = -10, 10, 2
for i in range(int((tmax - tmin)/dt) + 1):
    ti = tmin + dt*i
    graph += plot_const_to(ti) 
graph += plot_const_to(0, thickness=2)

graph += line([(-pi,0), (0, pi)], color='black', thickness=3) \
         + line([(-pi,0), (0, -pi)], color='black', thickness=3)

show(graph, figsize=10, axes=False, frame=True)
In [76]:
graph.save('exk_CPdiag_M0-raw.svg', figsize=10, axes=False, frame=True)

Maximal extension

In [77]:
Tc(tt, r) = KC_to_CC(tt, r, th, tph)[0].subs(m=1).simplify_full()
Xc(tt, r) = KC_to_CC(tt, r, th, tph)[1].subs(m=1).simplify_full()
show(Tc)
show(Xc)
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( {\tilde{t}}, r \right) \ {\mapsto} \ \pi \mathrm{u}\left(-r + 1\right) + \arctan\left(\frac{1}{2} \, r + \frac{1}{2} \, {\tilde{t}}\right) - \arctan\left(\frac{r^{2} - {\left(r - 1\right)} {\tilde{t}} + r {\left(4 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 4 \, \log\left({\left| r - 1 \right|}\right) - 4}{2 \, {\left(r - 1\right)}}\right)\]
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( {\tilde{t}}, r \right) \ {\mapsto} \ -\pi \mathrm{u}\left(-r + 1\right) + \arctan\left(\frac{1}{2} \, r + \frac{1}{2} \, {\tilde{t}}\right) + \arctan\left(\frac{r^{2} - {\left(r - 1\right)} {\tilde{t}} + r {\left(4 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 4 \, \log\left({\left| r - 1 \right|}\right) - 4}{2 \, {\left(r - 1\right)}}\right)\]
In [78]:
TBL(t, r) = Tc(t - 2/(r-1) + 2*ln(abs(r-1)), r).simplify_full()
XBL(t, r) = Xc(t - 2/(r-1) + 2*ln(abs(r-1)), r).simplify_full()
show(TBL)
show(XBL)
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( t, r \right) \ {\mapsto} \ \pi \mathrm{u}\left(-r + 1\right) + \arctan\left(\frac{r^{2} + {\left(r - 1\right)} t + r {\left(2 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 2 \, \log\left({\left| r - 1 \right|}\right) - 2}{2 \, {\left(r - 1\right)}}\right) - \arctan\left(\frac{r^{2} - {\left(r - 1\right)} t + r {\left(2 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 2 \, \log\left({\left| r - 1 \right|}\right) - 2}{2 \, {\left(r - 1\right)}}\right)\]
\[\newcommand{\Bold}[1]{\mathbf{#1}}\left( t, r \right) \ {\mapsto} \ -\pi \mathrm{u}\left(-r + 1\right) + \arctan\left(\frac{r^{2} + {\left(r - 1\right)} t + r {\left(2 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 2 \, \log\left({\left| r - 1 \right|}\right) - 2}{2 \, {\left(r - 1\right)}}\right) + \arctan\left(\frac{r^{2} - {\left(r - 1\right)} t + r {\left(2 \, \log\left({\left| r - 1 \right|}\right) - 1\right)} - 2 \, \log\left({\left| r - 1 \right|}\right) - 2}{2 \, {\left(r - 1\right)}}\right)\]
In [79]:
def plot_I(n, t_values=None, r_min=1.0001, r_max=100, 
           color_t='dimgray', linestyle_t='-', 
           r_values=None, t_min=-100, t_max=100, 
           color_r='red', linestyle_r=':', 
           plot_null_geod=True, hor_thickness=3):
    n2 = 2*n
    res = polygon([(pi, n2*pi), (0, (n2 + 1)*pi), (-pi, n2*pi), (0, (n2 - 1)*pi)], 
                  color='white', edgecolor='black')
    if r_values is not None:
        for r0 in r_values:
            res += parametric_plot((Xc(tt, r0), Tc(tt, r0) + n2*pi), (tt, t_min, t_max), 
                                   color=color_r, linestyle=linestyle_r)
    if t_values is not None:
        for t0 in t_values:
            res += parametric_plot((XBL(t0, r), TBL(t0, r) + n2*pi), (r, r_min, r_max), 
                                   color=color_t, linestyle=linestyle_t)
    if plot_null_geod:
        res += line([(pi/2, -pi/2 + n2*pi), (-pi/2, pi/2 + n2*pi)], color='green', 
                    linestyle='--')
        res += line([(-pi/2, -pi/2 + n2*pi), (pi/2, pi/2 + n2*pi)], color='green')
    res += line([(-pi, n2*pi), (0, (n2 + 1)*pi)], color='black', thickness=hor_thickness)
    res += line([(-pi, n2*pi), (0, (n2 - 1)*pi)], color='black', thickness=hor_thickness)
    return res

def plot_III(n, t_values=None, r_min=-100, r_max=0.9999, 
           color_t='dimgray', linestyle_t='-', 
           r_values=None, t_min=-100, t_max=100, 
           color_r='red', linestyle_r=':', 
           plot_null_geod=True):
    n2 = 2*n
    res = polygon([(0, (n2 + 1)*pi), (-pi, (n2 + 2)*pi), (-2*pi, (n2 + 1)*pi), (-pi, n2*pi)], 
                  color='cornsilk', edgecolor='black')
    res += parametric_plot((Xc(tt, 0), Tc(tt, 0) + n2*pi), (tt, t_min, t_max), color='maroon', 
                           linestyle='--', thickness=2)
    if r_values is not None:
        for r0 in r_values:
            res += parametric_plot((Xc(tt, r0), Tc(tt, r0) + n2*pi), (tt, t_min, t_max), 
                                   color=color_r, linestyle=linestyle_r)
    if t_values is not None:
        for t0 in t_values:
            res += parametric_plot((XBL(t0, r), TBL(t0, r) + n2*pi), (r, r_min, r_max), 
                                   color=color_t, linestyle=linestyle_t)
    if plot_null_geod:
        res += line([(-pi/2, pi/2 + n2*pi), (-3*pi/2, 3*pi/2 + n2*pi)], color='green', 
                    linestyle='--')
        res += line([(-3*pi/2, pi/2 + n2*pi), (-pi/2, 3*pi/2 + n2*pi)], color='green')
    return res
In [80]:
r_val_I = [1.2, 1.4, 1.6, 1.8, 2, 4, 6, 8, 10]
r_val_III = [-10, -8, -6, -4, -2, 0.2, 0.4, 0.6, 0.8]
show(graphics_array([plot_I(0, r_values=r_val_I), 
                     plot_III(0, r_values=r_val_III)]), axes=True)
In [81]:
graph = Graphics()
for n in [-2..2]:
    graph += plot_I(n, r_values=r_val_I) + plot_III(n, r_values=r_val_III)
show(graph, figsize=10, axes=False, ymin=-3*pi, ymax=3*pi)
In [82]:
graph.save('exk_CPdiag_maximal-raw.svg', figsize=10, axes=False,
           ymin=-3*pi, ymax=3*pi)

Near-horizon region

In [83]:
r_val_I = [1.1, 1.2, 1.3, 1.4, 1.5]
r_val_III = [0.9, 0.8, 0.7, 0.6, 0.5]
t_val = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
graph = Graphics()
for n in [-1..1]:
    graph += plot_I(n, t_values=t_val, r_max=1.5, 
                    r_values=r_val_I, linestyle_r='-', 
                    plot_null_geod=False, hor_thickness=4) 
    graph += plot_III(n, t_values=t_val, r_min=0.5, 
                      r_values=r_val_III, linestyle_r='-', 
                      plot_null_geod=False)
show(graph, figsize=8, axes=False, frame=True, ymin=-pi, ymax=2*pi)
In [84]:
graph += text(r"$r=\!+\infty$", (pi/2+0.2, pi/2+0.2), rotation=-45, color='black',
              fontsize=16) \
         + text(r"$r=\!+\infty$", (pi/2+0.2, -pi/2-0.2), rotation=45, color='black',
                fontsize=16) \
         + text(r"$r=\!+\infty$", (pi/2+0.2, 3*pi/2-0.2), rotation=45, color='black',
                fontsize=16) \
         + text(r"$r=\!-\infty$", (-3*pi/2-0.2, pi/2-0.2), rotation=-45, color='black',
                fontsize=16) \
         + text(r"$r=\!-\infty$", (-3*pi/2-0.2, 3*pi/2+0.2), rotation=45, color='black',
                fontsize=16) \
         + text(r"$r=\!-\infty$", (-3*pi/2-0.2, -pi/2+0.2), rotation=45, color='black',
                fontsize=16) \
         + text(r"$r=m$", (-pi/2-0.2, pi/2+0.2), rotation=45, color='black',
                fontsize=16) \
         + text(r"$r=m$", (-pi/2+0.15, 3*pi/2+0.15), rotation=-45, color='black',
                fontsize=16) \
         + text(r"$r=m$", (-pi/2+0.15, -pi/2+0.15), rotation=-45, color='black',
                fontsize=16) \
         + text(r"$r=0$", (-2.4, 2), rotation=55, color='maroon',
                fontsize=16) \
         + text(r"$\mathscr{H}$", (-0.25, 2.4), color='black', fontsize=20) \
         + text(r"$\mathscr{H}'$", (-0.25, -2.2), color='black', fontsize=20) \
         + text(r"$i^{\rm int}$", (-3.6, -0.1), color='orangered', fontsize=16) \
         + text(r"$\mathscr{M}_{\rm I}$", (0, 0), color='black', fontsize=24) \
         + text(r"$\mathscr{M}_{\rm III}$", (-pi, pi), color='black', fontsize=24)
graph.save("exk_NH_region.pdf", figsize=9, axes=False, ymin=-pi, ymax=2*pi)
show(graph, figsize=9, axes=False, ymin=-pi, ymax=2*pi)