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 9.2 is required to run this notebook:
version()
'SageMath version 9.5.rc1, Release Date: 2022-01-12'
First we set up the notebook to display mathematical objects using LaTeX formatting:
%display latex
We declare the spacetime manifold $M$:
M = Manifold(4, 'M', structure='Lorentzian')
print(M)
4-dimensional Lorentzian manifold M
and the Eddington-Finkelstein coordinates $(t,r,\theta,\phi)$ as a chart on $M$:
X.<t,r,th,ph> = M.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi')
X
The mass parameter and the metric tensor:
var('m', domain='real')
assume(m>=0)
g = M.metric()
g[0,0] = -(1-2*m/r)
g[0,1] = 2*m/r
g[1,1] = 1+2*m/r
g[2,2] = r^2
g[3,3] = (r*sin(th))^2
g.display()
g[:]
g.inverse()[:]
g.christoffel_symbols_display()
Let us check that we are dealing with a solution of Einstein's equation in vacuum:
g.ricci().display()
u = M.scalar_field(coord_expression={X: (1-r/(2*m))*exp((r-t)/(4*m))}, name='u')
u.display()
plm2 = implicit_plot(u.expr().subs(m=1)+2, (r, 0, 15), (t, -10, 15), color='green') + \
text('$u=-2$', (11,12), color='green')
plm1 = implicit_plot(u.expr().subs(m=1)+1, (r, 0, 15), (t, -10, 15), color='green') + \
text('$u=-1$', (6.3,12), color='green')
pl0 = implicit_plot(u.expr().subs(m=1), (r, 0, 15), (t, -10, 15), color='green') + \
text('$u=0$', (3.1, 12), color='green')
pl1 = implicit_plot(u.expr().subs(m=1)-1, (r, 0, 15), (t, -10, 15), color='green') + \
text('$u=1$', (0.8, 0.5), color='green')
pl2 = implicit_plot(u.expr().subs(m=1)-2, (r, 0, 15), (t, -10, 15), color='green') + \
text('$u=2$', (-0.2, -2.5), color='green', background_color='white')
graph = plm2+plm1+pl0+pl1+pl2
show(graph, aspect_ratio=True, axes_labels=[r'$r/m$', r'$t/m$'], figsize=8)
graph.save('def_Schwarz_Hu.pdf', aspect_ratio=True,
axes_labels=[r'$r/m$', r'$t/m$'], figsize=8)
du = diff(u)
print(du)
du.display()
1-form du on the 4-dimensional Lorentzian manifold M
grad_u = du.up(g)
print(grad_u)
grad_u.display()
Vector field on the 4-dimensional Lorentzian manifold M
Let us check that each hypersurface $u={\rm const}$ is a null hypersurface:
g(grad_u, grad_u).expr()
rho = - log(-grad_u[[0]])
print(rho)
rho.display()
Scalar field on the 4-dimensional Lorentzian manifold M
l = - exp(rho) * grad_u
l.set_name('l', latex_name=r'\ell')
print(l)
l.display()
Vector field l on the 4-dimensional Lorentzian manifold M
graph_l = l.plot(ambient_coords=(r,t), ranges={r:(0.01,8), t:(0,8)},
fixed_coords={th:pi/2, ph:pi}, parameters={m:1}, color='green',
scale=0.8, aspect_ratio=1)
show(graph_l, figsize=8)
Let us check that $\ell$ is a null vector everywhere:
g(l,l).expr()
l_form = l.down(g)
l_form.set_name('lf', latex_name=r'\underline{\ell}')
print(l_form)
l_form.display()
1-form lf on the 4-dimensional Lorentzian manifold M
nab = g.connection()
print(nab)
nab
Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional Lorentzian manifold M
nab_l_form = nab(l_form)
nab_l_form.display()
nab_l_form.symmetrize().display()
Check of the identity $\ell^\mu \nabla_\alpha \ell_\mu=0$:
v = l.contract(nab_l_form, 0)
v.display()
nab_l = nab(l)
nab_l[:]
div_l = nab_l.trace()
print(div_l)
div_l.display()
Scalar field on the 4-dimensional Lorentzian manifold M
div_l.expr().factor()
div_l.expr().subs(r=2*m)
acc_l = l.contract(0,nab_l,1)
print(acc_l)
acc_l.display()
Vector field on the 4-dimensional Lorentzian manifold M
The non-affinity parameter $\kappa$:
kappa = l(rho)
kappa.display()
Check of the pregeodesic equation $\nabla_{\ell} \ell = \kappa \ell$:
acc_l == kappa * l
kappa.expr().factor()
Value of $\kappa$ on the horizon:
kappaH = kappa.expr().subs(r=2*m)
kappaH
k = M.vector_field(name='k')
k[0] = 1/2 + m/r
k[1] = -1/2 - m/r
k.display()
g(k,k).expr()
g(k,l).expr()
graph_k = k.plot(ambient_coords=(r,t), ranges={r:(1,8), t:(0,8)}, number_values={r:8, t:9},
fixed_coords={th:pi/2, ph:pi}, parameters={m:1}, color='red',
scale=0.8, aspect_ratio=1)
graph_lk = graph_l+graph_k
show(graph_lk, figsize=8)
graph_lk.save('def_plot_lk.pdf', figsize=8)
k_form = k.down(g)
k_form.set_name('kf', latex_name=r'\underline{k}')
k_form.display()
We define $q = g + \underline{\ell}\otimes \underline{k} + \underline{k}\otimes \underline{\ell}$:
q = g + l_form*k_form + k_form*l_form
q.set_name('q')
q.display()
q_up = q.up(g)
print(q_up)
q_up.display()
Tensor field of type (2,0) on the 4-dimensional Lorentzian manifold M
We compute $\theta_{(\ell)}$ as $\theta_{(\ell)} = q^{\mu\nu}\nabla_\mu \ell_\nu$:
theta = q_up.contract(0,1,nab(l_form),0,1)
theta.expr()
Check of the formula $\theta_{(\ell)} = \nabla\cdot\ell - \kappa$:
theta == div_l - kappa
Check of the forumla $\theta_{(\ell)} = \frac{1}{2} \mathcal{L}_{\ell} \ln \det q$:
detq = M.scalar_field({X: r^4*sin(th)^2})
theta == 1/2*ln(detq).lie_der(l)
theta == 1/2*l(ln(detq))
We compute $\Theta$ as $\Theta = \frac{1}{2} \mathcal{L}_{\ell} q$:
Theta = 1/2 * q.lie_der(l)
Theta.set_name('Theta', latex_name=r'\Theta')
print(Theta)
Theta.display()
Tensor field Theta of type (0,2) on the 4-dimensional Lorentzian manifold M
We compute $\theta_{(k)}$ as $\theta_{(k)} = q^{\mu\nu}\nabla_\mu k_\nu$:
theta_k = q_up.contract(0,1,nab(k_form),0,1)
theta_k.expr()
Value of $\theta_{(k)}$ at the horizon:
theta_k.expr().subs(r=2*m)