This Jupyter/SageMath notebook is relative to the lectures Geometry and physics of black holes
The involved computations make use of tools developed through the SageManifolds project.
NB: a version of SageMath at least equal to 9.4 is required to run this notebook:
version()
'SageMath version 10.1.beta2, Release Date: 2023-06-03'
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')
print(M)
4-dimensional differentiable manifold M
The domain of ingoing Eddington-Finkelstein coordinates $(\tilde t, r, \theta, \phi)$:
M_EF = M.open_subset('M_EF', latex_name=r'M_{\rm EF}')
The domain of Schwarzschild-Droste coordinates is $M_{\rm SD} = M_{\rm I} \cup M_{\rm II}$:
M_SD = M_EF.open_subset('M_SD', latex_name=r'M_{\rm SD}')
M_I = M_SD.open_subset('M_I', latex_name=r'M_{\rm I}')
M_II = M_SD.open_subset('M_II', latex_name=r'M_{\rm II}')
M_SD.declare_union(M_I, M_II)
The Schwarzschild-Droste coordinates $(t,r,\theta,\phi)$:
m = var('m')
assume(m>=0)
X_SD.<t,r,th,ph> = M_SD.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\varphi',
coord_restrictions=lambda t,r,th,ph: r!=2*m)
X_SD
X_SD_I = X_SD.restrict(M_I, r>2*m)
X_SD_I
X_SD_II = X_SD.restrict(M_II, r<2*m)
X_SD_II
M.default_chart()
The ingoing Eddington-Finkelstein chart:
X_EF.<te,r,th,ph> = M_EF.chart(r'te:\tilde{t} r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\varphi')
X_EF
SD_to_EF = X_SD.transition_map(X_EF, [t+2*m*ln(abs(r/(2*m)-1)), r, th, ph])
SD_to_EF.display()
SD_to_EF.inverse().display()
X_EF_I = X_EF.restrict(M_I, r>2*m)
X_EF_I
X_EF_II = X_EF.restrict(M_II, r<2*m)
X_EF_II
M.atlas()
X_KS.<T,X,th,ph> = M.chart(r'T X th:(0,pi):\theta ph:(0,2*pi):\varphi',
coord_restrictions=lambda T,X,th,ph: T^2 < 1 + X^2)
X_KS
X_KS_I = X_KS.restrict(M_I, [X>0, T<X, T>-X])
X_KS_I
X_KS_II = X_KS.restrict(M_II, [T>0, T>abs(X)])
X_KS_II
X_KS_EF = X_KS.restrict(M_EF, X+T>0)
X_KS_EF
SD_I_to_KS = X_SD_I.transition_map(X_KS_I, [sqrt(r/(2*m)-1)*exp(r/(4*m))*sinh(t/(4*m)),
sqrt(r/(2*m)-1)*exp(r/(4*m))*cosh(t/(4*m)),
th, ph])
SD_I_to_KS.display()
SD_II_to_KS = X_SD_II.transition_map(X_KS_II, [sqrt(1-r/(2*m))*exp(r/(4*m))*cosh(t/(4*m)),
sqrt(1-r/(2*m))*exp(r/(4*m))*sinh(t/(4*m)),
th, ph])
SD_II_to_KS.display()
EF_to_KS = X_EF.transition_map(X_KS_EF, [exp(r/(4*m))*(cosh(te/(4*m))-r/(4*m)*exp(-te/(4*m))),
exp(r/(4*m))*(sinh(te/(4*m))+r/(4*m)*exp(-te/(4*m))),
th, ph])
EF_to_KS.display()
graph = X_EF.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={te:(-16,6), r:(1e-6,5)}, steps={te:1, r:0.5},
style={te:'--', r:'-'}, parameters={m:1})
graph1 = copy(graph)
graph += text(r'$\tilde{t}=0$', (2.65, 0.25), fontsize=16, color='red', rotation=-24)
graph += text(r'$\tilde{t}=2m$', (2.8, 1.6), fontsize=16, color='red')
graph += text(r'$\tilde{t}=-2m$', (2.68, -0.9), fontsize=16, color='red', rotation=-35)
plot_options = {'xmin': -3, 'xmax': 3, 'ymin': -3, 'ymax': 3, 'figsize': 8}
show(graph, **plot_options)
Adding the Schwarzschild horizon to the plot:
hor = line([(0,0), (4,4)], color='black', thickness=2) \
+ text(r'$\mathscr{H}$', (3, 2.7), fontsize=20, color='black')
graph += hor
Adding the curvature singularity $r=0$ to the plot:
sing = X_SD_II.plot(X_KS, fixed_coords={r:0, th:pi/2, ph:pi}, ambient_coords=(X,T),
color='brown', thickness=4, style='--', parameters={m:1}) \
+ text(r'$r=0$', (2.5, 3), rotation=45, fontsize=16, color='brown')
graph += sing
graph.save("max_IEF_KS.pdf", **plot_options)
show(graph, **plot_options)
Zoom showing the regular sclicing of the hypersurface $r=0$ by the $\tilde{t}=\mathrm{const}$ hypersurfaces:
graph1 += line([(0,0), (4,4)], color='black', thickness=2)
graph1 += X_SD_II.plot(X_KS, fixed_coords={r:0, th:pi/2, ph:pi}, ambient_coords=(X,T),
color='brown', thickness=4, style='--', parameters={m:1})
show(graph1, xmin=0, xmax=3, ymin=0.8, ymax=2.5)
graph = X_SD_I.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(2.001,5)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='blue', parameters={m:1})
hor2 = line([(0,0), (4,4)], color='black', thickness=2) \
+ text(r'$\mathscr{H}$', (2.95, 3.2), fontsize=20, color='black')
region_labels = text(r'$\mathscr{M}_{\rm I}$', (2.4, 0.4), fontsize=20, color='blue')
graph2 = graph + hor2 + region_labels
graph2.save("max_SD_I_KS.pdf", **plot_options)
show(graph2, **plot_options)
graph += X_SD_II.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(0.001,1.999)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='blue', parameters={m:1})
region_labels = text(r'$\mathscr{M}_{\rm I}$', (2.4, 0.4), fontsize=20, color='blue') + \
text(r'$\mathscr{M}_{\rm II}$', (0, 0.5), fontsize=20, color='blue')
graph += hor + sing + region_labels
graph.save("max_SD_KS.pdf", **plot_options)
show(graph, **plot_options)
The outgoing family:
var('u')
outgeod = M.curve({X_EF: [r + 4*m*ln(abs(r/(2*m)-1)) + u, r, pi/2, pi]}, (r, 0, +oo))
outgeod.display()
The ingoing family:
var('v')
ingeod = M.curve({X_EF: [-r + v, r, pi/2, pi]}, (r, 0, +oo))
ingeod.display()
graph = Graphics()
for u0 in range(-10, 10, 2):
graph += outgeod.plot(chart=X_KS, ambient_coords=(X,T), prange=(0.01, 1.99),
parameters={m: 1, u: u0}, color='green', style='-')
graph += outgeod.plot(chart=X_KS, ambient_coords=(X,T), prange=(2.01, 5),
parameters={m: 1, u: u0}, color='green', style='-')
graph += ingeod.plot(chart=X_KS, ambient_coords=(X,T), prange=(0.01, 5),
parameters={m: 1, v: u0}, color='green', style='--')
graph += hor
graph += sing
graph.save("max_rad_null_geod_KS.pdf", **plot_options)
show(graph, **plot_options)
The second Schwarzschild-Droste domain:
M_SD2 = M.open_subset('M_SD2', latex_name=r"{M'}_{\rm SD}", coord_def={X_KS: T<-X})
X_SD2.<t,r,th,ph> = M_SD2.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\varphi')
Definition of regions $M_{\rm III}$ and $M_{\rm IV}$:
M_III = M_SD2.open_subset('M_III', latex_name=r'M_{\rm III}',
coord_def={X_KS.restrict(M_SD2): [X<0, X<T]})
M_IV = M_SD2.open_subset('M_IV', latex_name=r'M_{\rm IV}',
coord_def={X_KS.restrict(M_SD2): [T<0, T<X]})
M_SD2.declare_union(M_III, M_IV)
X_KS_III = X_KS.restrict(M_III)
X_KS_III
X_KS_IV = X_KS.restrict(M_IV)
X_KS_IV
Schwarzschild-Droste coordinates in $M_{\rm III}$ and $M_{\rm IV}$:
X_SD_III = X_SD2.restrict(M_III, r>2*m)
X_SD_III
SD_III_to_KS = X_SD_III.transition_map(X_KS_III, [-sqrt(r/(2*m)-1)*exp(r/(4*m))*sinh(t/(4*m)),
- sqrt(r/(2*m)-1)*exp(r/(4*m))*cosh(t/(4*m)),
th, ph])
SD_III_to_KS.display()
X_SD_IV = X_SD2.restrict(M_IV, r<2*m)
X_SD_IV
SD_IV_to_KS = X_SD_IV.transition_map(X_KS_IV, [-sqrt(1-r/(2*m))*exp(r/(4*m))*cosh(t/(4*m)),
-sqrt(1-r/(2*m))*exp(r/(4*m))*sinh(t/(4*m)),
th, ph])
SD_IV_to_KS.display()
graph = X_SD_I.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(2.001,5)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='blue', parameters={m:1})
graph += X_SD_II.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(0.001,1.999)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='steelblue', parameters={m:1})
graph += X_SD_III.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(2.001,5)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='chocolate', parameters={m:1})
graph += X_SD_IV.plot(X_KS, ambient_coords=(X,T), fixed_coords={th:pi/2,ph:pi},
ranges={t:(-10,10), r:(0.001,1.999)}, steps={t:1, r:0.5},
style={t:'--', r:'-'}, color='gold', parameters={m:1})
bifhor = line([(-4,-4), (4,4)], color='black', thickness=3) + \
line([(-4,4), (4,-4)], color='black', thickness=3) + \
text(r'$\mathscr{H}$', (3, 2.7), fontsize=20, color='black')
sing2 = X_SD_IV.plot(X_KS, fixed_coords={r:0, th:pi/2, ph:pi}, ambient_coords=(X,T),
color='brown', thickness=4, style='--', parameters={m:1}) \
+ text(r"$r'=0$", (2.5, -3), rotation=-45, fontsize=16, color='brown')
region_labels = text(r'$\mathscr{M}_{\rm I}$', (2.4, 0.4), fontsize=20, color='blue') + \
text(r'$\mathscr{M}_{\rm II}$', (0, 0.5), fontsize=20, color='steelblue') + \
text(r'$\mathscr{M}_{\rm III}$', (-2.4, 0.4), fontsize=20, color='chocolate') + \
text(r'$\mathscr{M}_{\rm IV}$', (0, -0.5), fontsize=20, color='gold')
graph += bifhor + sing + sing2 + region_labels
graph.save("max_kruskal_diag.pdf", **plot_options)
show(graph, **plot_options)
xi = M.vector_field(name='xi', latex_name=r'\xi')
xi[X_KS.frame(), 0, X_KS] = X/(4*m)
xi[X_KS.frame(), 1, X_KS] = T/(4*m)
xi.display(X_KS.frame(), X_KS)
xi.display(X_KS_I.frame(), X_SD_I)
xi.display(X_SD_I.frame())
graph_xi = xi.plot(X_KS, chart_domain=X_KS, ambient_coords=(X,T),
fixed_coords={th:pi/2,ph:pi}, max_range=4,
number_values=19, color='red', parameters={m: 1})
graph = bifhor + graph_xi + sing + sing2
graph.save("max_xi_extend.pdf", **plot_options)
show(graph, **plot_options)