{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Anti-de Sitter spacetime\n", "\n", "This worksheet demonstrates a few capabilities of SageMath in computations regarding the 4-dimensional anti-de Sitter spacetime. The corresponding tools have been developed within the [SageManifolds](http://sagemanifolds.obspm.fr) project (version 1.2, as included in SageMath 8.2).\n", "\n", "Click [here](https://raw.githubusercontent.com/sagemanifolds/SageManifolds/master/Worksheets/v1.2/SM_AdS.ipynb) to download the worksheet file (ipynb format). To run it, you must start SageMath within the Jupyter notebook, via the command `sage -n jupyter`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*NB:* a version of SageMath at least equal to 8.2 is required to run this worksheet:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 8.2, Release Date: 2018-05-05'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we set up the notebook to display mathematical objects using LaTeX rendering:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also define a viewer for 3D plots (use `'threejs'` or `'jmol'` for interactive 3D graphics):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "viewer3D = 'threejs' # must be 'threejs', 'jmol', 'tachyon' or None (default)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spacetime manifold\n", "\n", "We declare the anti-de Sitter spacetime as a 4-dimensional Lorentzian manifold:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "4-dimensional Lorentzian manifold M" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M = Manifold(4, 'M', r'\\mathcal{M}', structure='Lorentzian')\n", "print(M); M" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
We consider hyperbolic coordinates $(\\tau,\\rho,\\theta,\\phi)$ on $\\mathcal{M}$. Allowing for the standard coordinate singularities at $\\rho=0$, $\\theta=0$ or $\\theta=\\pi$, these coordinates cover the entire spacetime manifold (which is topologically $\\mathbb{R}^4$). If we restrict ourselves to regular coordinates (i.e. to considering only mathematically well defined charts), the hyperbolic coordinates cover only an open part of $\\mathcal{M}$, which we call $\\mathcal{M}_0$, on which $\\rho$ spans the open interval $(0,+\\infty)$, $\\theta$ the open interval $(0,\\pi)$ and $\\phi$ the open interval $(0,2\\pi)$. Therefore, we declare:
" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chart (M_0, (ta, rh, th, ph))\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M_0, (ta, rh, th, ph))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M0 = M.open_subset('M_0', r'\\mathcal{M}_0' )\n", "X_hyp.The expression of $g$ in terms of $\\mathcal{M}$'s default frame is found to be
" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = -cosh(rh)^2 dta*dta + l^2 drh*drh + l^2*sinh(rh)^2 dth*dth + l^2*sin(th)^2*sinh(rh)^2 dph*dph" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ -cosh(rh)^2 0 0 0]\n", "[ 0 l^2 0 0]\n", "[ 0 0 l^2*sinh(rh)^2 0]\n", "[ 0 0 0 l^2*sin(th)^2*sinh(rh)^2]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Riemann tensor of $g$ is
" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field Riem(g) of type (1,3) on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "Riem = g.riemann()\n", "print(Riem)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Riem(g)^ta_rh,ta,rh = -1 \n", "Riem(g)^ta_th,ta,th = -sinh(rh)^2 \n", "Riem(g)^ta_ph,ta,ph = -sin(th)^2*sinh(rh)^2 \n", "Riem(g)^rh_ta,ta,rh = -cosh(rh)^2/l^2 \n", "Riem(g)^rh_th,rh,th = -sinh(rh)^2 \n", "Riem(g)^rh_ph,rh,ph = -sin(th)^2*sinh(rh)^2 \n", "Riem(g)^th_ta,ta,th = -cosh(rh)^2/l^2 \n", "Riem(g)^th_rh,rh,th = 1 \n", "Riem(g)^th_ph,th,ph = -sin(th)^2*sinh(rh)^2 \n", "Riem(g)^ph_ta,ta,ph = -cosh(rh)^2/l^2 \n", "Riem(g)^ph_rh,rh,ph = 1 \n", "Riem(g)^ph_th,th,ph = sinh(rh)^2 " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Riem.display_comp(only_nonredundant=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Ricci tensor:
" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Ric(g) on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Ric(g) = 3*cosh(rh)^2/l^2 dta*dta - 3 drh*drh - 3*sinh(rh)^2 dth*dth - 3*sin(th)^2*sinh(rh)^2 dph*dph" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ric = g.ricci()\n", "print(Ric)\n", "Ric.display()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 3*cosh(rh)^2/l^2 0 0 0]\n", "[ 0 -3 0 0]\n", "[ 0 0 -3*sinh(rh)^2 0]\n", "[ 0 0 0 -3*sin(th)^2*sinh(rh)^2]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ric[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Ricci scalar:
" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field r(g) on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "r(g): M --> R\n", "on M_0: (ta, rh, th, ph) |--> -12/l^2" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R = g.ricci_scalar()\n", "print(R)\n", "R.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We recover the fact that AdS spacetime has a constant curvature. It is indeed a **maximally symmetric space**. In particular, the Riemann tensor is expressible as\n", "$$ R^i_{\\ \\, jlk} = \\frac{R}{n(n-1)} \\left( \\delta^i_{\\ \\, k} g_{jl} - \\delta^i_{\\ \\, l} g_{jk} \\right), $$\n", "where $n$ is the dimension of $\\mathcal{M}$: $n=4$ in the present case. Let us check this formula here, under the form $R^i_{\\ \\, jlk} = -\\frac{R}{6} g_{j[k} \\delta^i_{\\ \\, l]}$:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "delta = M.tangent_identity_field() \n", "Riem == - (R/6)*(g*delta).antisymmetrize(2,3) # 2,3 = last positions of the type-(1,3) tensor g*delta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We may also check that AdS metric is a solution of the vacuum **Einstein equation** with (negative) cosmological constant $\\Lambda = - 3/\\ell^2$:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Lambda = -3/l^2\n", "Ric - 1/2*R*g + Lambda*g == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Radial null geodesics\n", "\n", "Null geodesics that are radial with respect to coordinates $(\\tau,\\rho,\\theta,\\phi)$ obey\n", "$$ \\tau = \\pm 2 \\ell \\left( \\mathrm{atan} \\left(\\mathrm{e}^\\rho\\right) - \\frac{\\pi}{4} \\right) + \\tau_0,$$\n", "where $\\tau_0$ is a constant (the value of $\\tau$ at $\\rho=0$). Note that, due to the homogeneity of AdS spacetime, any null geodesic is a \"radial\" geodesic with respect to some coordinate system $(\\tau',\\rho',\\theta',\\phi')$, as in Minkowski spacetime, any null geodesic is a straight line and one can always find a Minkowskian coordinate system $(t',x',y',z')$ with respect to which the null geodesic is radial.\n", "\n", "Let us consider two finite families of radial null geodesics having $\\theta=\\pi/2$ and $\\phi=0$ or $\\pi$: \n", "- `null_geod1` has $\\phi=\\pi$ when $\\tau< 0$ and $\\phi=0$ when $\\tau>0$\n", "- `null_geod2` has $\\phi=0$ when $\\tau<0$ and $\\phi=\\pi$ when $\\tau>0$" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "lamb = var('lamb', latex_name=r'\\lambda')\n", "null_geod1 = [M.curve({X_hyp: [2*sgn(lamb)*l*(atan(exp(abs(lamb))) - pi/4) + 2*pi*(i-4)/8, \n", " abs(lamb), pi/2, pi*unit_step(-lamb)]}, \n", " (lamb, -oo, +oo)) for i in range(9)]\n", "null_geod2 = [M.curve({X_hyp: [2*sgn(lamb)*l*(atan(exp(abs(lamb))) - pi/4) + 2*pi*(i-4)/8, \n", " abs(lamb), pi/2, pi*unit_step(lamb)]}, \n", " (lamb, -oo, +oo)) for i in range(9)]\n", "null_geods = null_geod1 + null_geod2" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Curve in the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "print(null_geods[0])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R --> M\n", " lamb |--> (ta, rh, th, ph) = (-pi - 1/2*(pi - 4*arctan(e^abs(lamb)))*l*sgn(lamb), abs(lamb), 1/2*pi, pi*unit_step(-lamb))" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "null_geods[0].display()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R --> M\n", " lamb |--> (ta, rh, th, ph) = (-pi - 1/2*(pi - 4*arctan(e^abs(lamb)))*l*sgn(lamb), abs(lamb), 1/2*pi, pi*unit_step(lamb))" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "null_geods[9].display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To graphically display these geodesics, we introduce a Cartesian-like coordinate system\n", "$(\\tau,x_\\rho,y_\\rho,z_\\rho)$ linked to $(\\tau,\\rho,\\theta,\\phi)$ by the standard formulas:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ta = ta\n", "x_rho = rh*cos(ph)*sin(th)\n", "y_rho = rh*sin(ph)*sin(th)\n", "z_rho = rh*cos(th)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_hyp_graph.