Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Jupyter notebook for the lectures "Geometry and physics of black holes"

Views: 149
Kernel: SageMath 7.4.beta5

Schwarzschild horizon in 3+1 Eddington-Finkelstein coordinates

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

These computations are based on SageManifolds (v0.9)

The worksheet file (ipynb format) can be downloaded from here. To run it, you must start SageMath with the Jupyter notebook, with the command sage -n jupyter

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

%display latex

Spacetime

We declare the spacetime manifold MM:

M = Manifold(4, 'M') print M
4-dimensional differentiable manifold M

and the 3+1 Eddington-Finkelstein coordinates (t,r,θ,ϕ)(t,r,\theta,\phi) as a chart on MM:

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:

var('m', domain='real') assume(m>=0)
g = M.lorentzian_metric('g') 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 have a solution of Einstein equation in vacuum:

g.ricci().display()

The scalar field uu defining the horizon

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$'],)
Image in a Jupyter notebook
graph.save('def_Schwarz_Hu.pdf', aspect_ratio=True, axes_labels=[r'$r/m$', r'$t/m$'])
du = u.differential() print du du.display()
1-form du on the 4-dimensional differentiable manifold M
grad_u = du.up(g) print grad_u grad_u.display()
Vector field on the 4-dimensional differentiable manifold M

Let us check that each hypersurface u=constu={\rm const} is a null hypersurface:

g(grad_u, grad_u).expr()

The null normal \ell

rho = - log(-grad_u[[0]]) print rho rho.display()
Scalar field on the 4-dimensional differentiable 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 differentiable 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)
Image in a Jupyter notebook

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 differentiable manifold M
nab = g.connection() print nab nab
Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional differentiable manifold M
nab_l_form = nab(l_form) nab_l_form.display()
nab_l_form.symmetrize().display()

Check of the identity μαμ=0\ell^\mu \nabla_\alpha \ell_\mu=0:

v = l.contract(nab_l_form, 0) v.display()

The null normal as a pregeodesic vector field

nab_l = nab(l) nab_l[:]
div_l = nab_l.trace() print div_l div_l.display()
Scalar field on the 4-dimensional differentiable 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 differentiable 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

The complementary null vector field kk

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)}, nb_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) graph_lk.save('def_plot_lk.pdf')
Image in a Jupyter notebook
k_form = k.down(g) k_form.set_name('kf', latex_name=r'\underline{k}') k_form.display()

The 2-metric qq

We define q=g+k+kq = 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 differentiable manifold M

Expansion along the null normal

We compute θ()\theta_{(\ell)} as θ()=qμνμν\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 θ()=12Llndetq\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))

Deformation rate tensor of the cross-sections

We compute Θ\Theta as Θ=12Lq\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 differentiable manifold M

Expansion of the cross-sections along the null normal kk:

We compute θ(k)\theta_{(k)} as θ(k)=qμνμkν\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 θ(k)\theta_{(k)} at the horizon:

theta_k.expr().subs(r=2*m)