#!/usr/bin/env python # coding: utf-8 # # Carter-Penrose diagram of Schwarzschild spacetime # # This worksheet demonstrates a few capabilities of SageMath in computations regarding # the Carter-Penrose diagram of Schwarzschild spacetime. It is used to illustrate the lectures # [Geometry and physics of black holes](http://luth.obspm.fr/~luthier/gourgoulhon/bh16/). # The corresponding tools have been developed within the [SageManifolds](http://sagemanifolds.obspm.fr) project (version 1.3, as included in SageMath 8.3). # # Click [here](https://raw.githubusercontent.com/sagemanifolds/SageManifolds/master/Worksheets/v1.3/SM_Carter-Penrose_diag.ipynb) to download the worksheet file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command `sage -n jupyter` # *NB:* a version of SageMath at least equal to 7.5 is required to run this worksheet: # In[1]: version() # First we set up the notebook to display mathematical objects using LaTeX formatting: # In[2]: get_ipython().run_line_magic('display', 'latex') # ## Spacetime # # We declare the spacetime manifold $M$: # In[3]: M = Manifold(4, 'M') print(M) # ## The Schwarzschild-Droste domain # # The domain of Schwarzschild-Droste coordinates is $M_{\rm SD} = M_{\rm I} \cup M_{\rm II}$: # In[4]: M_SD = M.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)$: # In[5]: X_SD. = M_SD.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi') m = var('m', domain='real') ; assume(m>=0) X_SD.add_restrictions(r!=2*m) X_SD # In[6]: X_SD_I = X_SD.restrict(M_I, r>2*m) X_SD_I # In[7]: X_SD_II = X_SD.restrict(M_II, r<2*m) X_SD_II # In[8]: M.default_chart() # In[9]: M.atlas() # ## Kruskal-Szekeres coordinates # In[10]: X_KS. = M.chart(r'T X th:(0,pi):\theta ph:(0,2*pi):\phi') X_KS.add_restrictions(T^2 < 1 + X^2) X_KS # In[11]: X_KS_I = X_KS.restrict(M_I, [X>0, T-X]) ; X_KS_I # In[12]: X_KS_II = X_KS.restrict(M_II, [T>0, T>abs(X)]) ; X_KS_II # In[13]: 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() # In[14]: 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() # ### Plot of Schwarzschild-Droste grid on $M_{\rm I}$ in terms of KS coordinates # In[15]: 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}) # Adding the Schwarzschild horizon to the plot: # In[16]: hor = line([(0,0), (4,4)], color='black', thickness=2) \ + text(r'$\mathscr{H}$', (3, 2.7), fontsize=20, color='black') # In[17]: 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 show(graph2, xmin=-3, xmax=3, ymin=-3, ymax=3) # Adding the curvature singularity $r=0$ to the plot: # In[18]: 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') # In[19]: 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}) 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') graph += hor + sing + region_labels show(graph, xmin=-3, xmax=3, ymin=-3, ymax=3) # ## Extension to $M_{\rm III}$ and $M_{\rm IV}$ # In[20]: M_III = M.open_subset('M_III', latex_name=r'M_{\rm III}', coord_def={X_KS: [X<0, X = M_III_IV.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi') X_SD_III_IV.add_restrictions(r!=2*m) # In[23]: X_SD_III = X_SD_III_IV.restrict(M_III, r>2*m) X_SD_III # In[24]: X_SD_IV = X_SD_III_IV.restrict(M_IV, r<2*m) X_SD_IV # In[25]: 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() # In[26]: 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() # ## Standard compactified coordinates # # The coordinates $(\hat T, \hat X, \theta, \varphi)$ associated with the conformal compactification of the Schwarzschild spacetime are # In[27]: X_C. = M.chart(r'T1:(-pi/2,pi/2):\hat{T} X1:(-pi,pi):\hat{X} th:(0,pi):\theta ph:(0,2*pi):\varphi') X_C.add_restrictions([-pi+abs(X1)