{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Visualizing the horizons and ergosurfaces of Kerr spacetime" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This Jupyter notebook illustrates some applications of SageMath functionalities in general relativity, specifically in deriving and displaying the horizons and ergosurfaces of the Kerr spacetime. Most of the involved tools are part of the [SageManifolds project](https://sagemanifolds.obspm.fr/).\n", "\n", "**Rogerio T. Cavalcanti**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It requires the SageMath version at least equal to 9.2." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.4, Release Date: 2021-08-22'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=8)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Kerr spacetime in Boyer–Lindquist coordinates" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "a = var('a', domain='positive')\n", "M. = manifolds.Kerr(m=1, a=a, coordinates='BL')\n", "BL = M.default_chart()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{lcl} g_{ \\, t \\, t }^{ \\phantom{\\, t}\\phantom{\\, t} } & = & \\frac{2 \\, r}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} - 1 \\\\ g_{ \\, t \\, {\\phi} }^{ \\phantom{\\, t}\\phantom{\\, {\\phi}} } & = & \\frac{2 \\, a r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} \\\\ g_{ \\, r \\, r }^{ \\phantom{\\, r}\\phantom{\\, r} } & = & \\frac{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}}{a^{2} + r^{2} - 2 \\, r} \\\\ g_{ \\, {\\theta} \\, {\\theta} }^{ \\phantom{\\, {\\theta}}\\phantom{\\, {\\theta}} } & = & a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2} \\\\ g_{ \\, {\\phi} \\, t }^{ \\phantom{\\, {\\phi}}\\phantom{\\, t} } & = & \\frac{2 \\, a r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} \\\\ g_{ \\, {\\phi} \\, {\\phi} }^{ \\phantom{\\, {\\phi}}\\phantom{\\, {\\phi}} } & = & {\\left(\\frac{2 \\, a^{2} r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} + a^{2} + r^{2}\\right)} \\sin\\left({\\theta}\\right)^{2} \\end{array}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{lcl} g_{ \\, t \\, t }^{ \\phantom{\\, t}\\phantom{\\, t} } & = & \\frac{2 \\, r}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} - 1 \\\\ g_{ \\, t \\, {\\phi} }^{ \\phantom{\\, t}\\phantom{\\, {\\phi}} } & = & \\frac{2 \\, a r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} \\\\ g_{ \\, r \\, r }^{ \\phantom{\\, r}\\phantom{\\, r} } & = & \\frac{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}}{a^{2} + r^{2} - 2 \\, r} \\\\ g_{ \\, {\\theta} \\, {\\theta} }^{ \\phantom{\\, {\\theta}}\\phantom{\\, {\\theta}} } & = & a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2} \\\\ g_{ \\, {\\phi} \\, t }^{ \\phantom{\\, {\\phi}}\\phantom{\\, t} } & = & \\frac{2 \\, a r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} \\\\ g_{ \\, {\\phi} \\, {\\phi} }^{ \\phantom{\\, {\\phi}}\\phantom{\\, {\\phi}} } & = & {\\left(\\frac{2 \\, a^{2} r \\sin\\left({\\theta}\\right)^{2}}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} + a^{2} + r^{2}\\right)} \\sin\\left({\\theta}\\right)^{2} \\end{array}$$" ], "text/plain": [ "g_t,t = 2*r/(a^2*cos(th)^2 + r^2) - 1 \n", "g_t,ph = 2*a*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_r,r = (a^2*cos(th)^2 + r^2)/(a^2 + r^2 - 2*r) \n", "g_th,th = a^2*cos(th)^2 + r^2 \n", "g_ph,t = 2*a*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_ph,ph = (2*a^2*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^2 + r^2)*sin(th)^2 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = M.metric()\n", "g.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Metric singularities and ergosurfaces" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The $g_{tt},g_{t\\phi}$ and $g_{\\phi\\phi}$ components are singular at the singular ring $a^2\\cos^2\\theta +r^2=0$, that is $r=0$ and $\\theta =\\frac{\\pi}{2}$. It corresponds to a physical singularity, as checked below." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "singular_ring = {r:0, th:pi/2}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Singular surfaces on $\\displaystyle ({g_{rr}})^{-1} = 0$ (Horizons)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left\\{r : -\\sqrt{-a^{2} + 1} + 1\\right\\}, \\left\\{r : \\sqrt{-a^{2} + 1} + 1\\right\\}\\right]\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left\\{r : -\\sqrt{-a^{2} + 1} + 1\\right\\}, \\left\\{r : \\sqrt{-a^{2} + 1} + 1\\right\\}\\right]$$" ], "text/plain": [ "[{r: -sqrt(-a^2 + 1) + 1}, {r: sqrt(-a^2 + 1) + 1}]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "horizons = solve(1/g[1,1].expr()==0,r,solution_dict=True)\n", "horizons" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "inner_horizon, outer_horizon = horizons" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The Ergosurfaces are the regions of vanishing $K_\\mu K^\\mu$, where $K = \\frac{\\partial}{\\partial t }$ is a Killing vector field." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}K = \\frac{\\partial}{\\partial t }\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}K = \\frac{\\partial}{\\partial t }$$" ], "text/plain": [ "K = ∂/∂t" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = M.vector_field(1,0,0,0, name='K')\n", "K.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking if $K$ is a Killing vector field $(\\mathcal{L}_{_K}g = 0)$" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}$$" ], "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.lie_derivative(K) == 0" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} g\\left(K,K\\right):& M & \\longrightarrow & \\mathbb{R} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\frac{2 \\, r}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} - 1 \\end{array}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} g\\left(K,K\\right):& M & \\longrightarrow & \\mathbb{R} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\frac{2 \\, r}{a^{2} \\cos\\left({\\theta}\\right)^{2} + r^{2}} - 1 \\end{array}$$" ], "text/plain": [ "g(K,K): M → ℝ\n", " (t, r, th, ph) ↦ 2*r/(a^2*cos(th)^2 + r^2) - 1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(K,K).display()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left\\{r : -\\sqrt{-a^{2} \\cos\\left({\\theta}\\right)^{2} + 1} + 1\\right\\}, \\left\\{r : \\sqrt{-a^{2} \\cos\\left({\\theta}\\right)^{2} + 1} + 1\\right\\}\\right]\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left\\{r : -\\sqrt{-a^{2} \\cos\\left({\\theta}\\right)^{2} + 1} + 1\\right\\}, \\left\\{r : \\sqrt{-a^{2} \\cos\\left({\\theta}\\right)^{2} + 1} + 1\\right\\}\\right]$$" ], "text/plain": [ "[{r: -sqrt(-a^2*cos(th)^2 + 1) + 1}, {r: sqrt(-a^2*cos(th)^2 + 1) + 1}]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ergosurfaces = solve(g(K,K).expr(),r,solution_dict=True)\n", "ergosurfaces" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "inner_ergo, outer_ergo = ergosurfaces" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "List of surfaces" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "surfaces_param = [outer_ergo,outer_horizon,inner_horizon,inner_ergo,singular_ring]" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Rational polynomial coordinates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In rational polinomial coordinates all components of the Kerr metric are rational polynomials, which in principle make it easyer to handle. We are going to use such coordinates for checking the Kretschmann scalar over the horizon and ergosurfaces of the spacetime." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "RP. = M.chart(r't:(-oo,+oo) r:(0,+oo) ch:(-1,1):\\chi ph:(-pi,pi):periodic:\\phi')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Transition map from Boyer–Lindquist coordinates to rational polynomial coordinates and its inverse." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & t \\\\ r & = & r \\\\ {\\chi} & = & \\cos\\left({\\theta}\\right) \\\\ {\\phi} & = & {\\phi} \\end{array}\\right.\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & t \\\\ r & = & r \\\\ {\\chi} & = & \\cos\\left({\\theta}\\right) \\\\ {\\phi} & = & {\\phi} \\end{array}\\right.$$" ], "text/plain": [ "t = t\n", "r = r\n", "ch = cos(th)\n", "ph = ph" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL_to_RP = BL.transition_map(RP, [t, r, cos(th), ph])\n", "BL_to_RP.display()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & t \\\\ r & = & r \\\\ {\\theta} & = & \\arccos\\left({\\chi}\\right) \\\\ {\\phi} & = & {\\phi} \\end{array}\\right.\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & t \\\\ r & = & r \\\\ {\\theta} & = & \\arccos\\left({\\chi}\\right) \\\\ {\\phi} & = & {\\phi} \\end{array}\\right.$$" ], "text/plain": [ "t = t\n", "r = r\n", "th = arccos(ch)\n", "ph = ph" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL_to_RP.set_inverse(t, r, acos(ch), ph)\n", "BL_to_RP.inverse().display()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{lcl} g_{ \\, t \\, t }^{ \\phantom{\\, t}\\phantom{\\, t} } & = & -\\frac{a^{2} {\\chi}^{2} + r^{2} - 2 \\, r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, t \\, {\\phi} }^{ \\phantom{\\, t}\\phantom{\\, {\\phi}} } & = & -\\frac{2 \\, {\\left(a {\\chi}^{2} - a\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, r \\, r }^{ \\phantom{\\, r}\\phantom{\\, r} } & = & \\frac{a^{2} {\\chi}^{2} + r^{2}}{a^{2} + r^{2} - 2 \\, r} \\\\ g_{ \\, {\\chi} \\, {\\chi} }^{ \\phantom{\\, {\\chi}}\\phantom{\\, {\\chi}} } & = & -\\frac{a^{2} {\\chi}^{2} + r^{2}}{{\\chi}^{2} - 1} \\\\ g_{ \\, {\\phi} \\, t }^{ \\phantom{\\, {\\phi}}\\phantom{\\, t} } & = & -\\frac{2 \\, {\\left(a {\\chi}^{2} - a\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, {\\phi} \\, {\\phi} }^{ \\phantom{\\, {\\phi}}\\phantom{\\, {\\phi}} } & = & -\\frac{a^{4} {\\chi}^{4} - a^{4} {\\chi}^{2} + {\\left({\\chi}^{2} - 1\\right)} r^{4} + {\\left(a^{2} {\\chi}^{4} - a^{2}\\right)} r^{2} - 2 \\, {\\left(a^{2} {\\chi}^{4} - 2 \\, a^{2} {\\chi}^{2} + a^{2}\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\end{array}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{lcl} g_{ \\, t \\, t }^{ \\phantom{\\, t}\\phantom{\\, t} } & = & -\\frac{a^{2} {\\chi}^{2} + r^{2} - 2 \\, r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, t \\, {\\phi} }^{ \\phantom{\\, t}\\phantom{\\, {\\phi}} } & = & -\\frac{2 \\, {\\left(a {\\chi}^{2} - a\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, r \\, r }^{ \\phantom{\\, r}\\phantom{\\, r} } & = & \\frac{a^{2} {\\chi}^{2} + r^{2}}{a^{2} + r^{2} - 2 \\, r} \\\\ g_{ \\, {\\chi} \\, {\\chi} }^{ \\phantom{\\, {\\chi}}\\phantom{\\, {\\chi}} } & = & -\\frac{a^{2} {\\chi}^{2} + r^{2}}{{\\chi}^{2} - 1} \\\\ g_{ \\, {\\phi} \\, t }^{ \\phantom{\\, {\\phi}}\\phantom{\\, t} } & = & -\\frac{2 \\, {\\left(a {\\chi}^{2} - a\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\\\ g_{ \\, {\\phi} \\, {\\phi} }^{ \\phantom{\\, {\\phi}}\\phantom{\\, {\\phi}} } & = & -\\frac{a^{4} {\\chi}^{4} - a^{4} {\\chi}^{2} + {\\left({\\chi}^{2} - 1\\right)} r^{4} + {\\left(a^{2} {\\chi}^{4} - a^{2}\\right)} r^{2} - 2 \\, {\\left(a^{2} {\\chi}^{4} - 2 \\, a^{2} {\\chi}^{2} + a^{2}\\right)} r}{a^{2} {\\chi}^{2} + r^{2}} \\end{array}$$" ], "text/plain": [ "g_t,t = -(a^2*ch^2 + r^2 - 2*r)/(a^2*ch^2 + r^2) \n", "g_t,ph = -2*(a*ch^2 - a)*r/(a^2*ch^2 + r^2) \n", "g_r,r = (a^2*ch^2 + r^2)/(a^2 + r^2 - 2*r) \n", "g_ch,ch = -(a^2*ch^2 + r^2)/(ch^2 - 1) \n", "g_ph,t = -2*(a*ch^2 - a)*r/(a^2*ch^2 + r^2) \n", "g_ph,ph = -(a^4*ch^4 - a^4*ch^2 + (ch^2 - 1)*r^4 + (a^2*ch^4 - a^2)*r^2 - 2*(a^2*ch^4 - 2*a^2*ch^2 + a^2)*r)/(a^2*ch^2 + r^2) " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display_comp(RP.frame(),RP)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting the default chart and frame" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "M.set_default_chart(RP)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "M.set_default_frame(RP.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Riemann tensor, Ricci tensor and Kretschmann scalar" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 5.26 s, sys: 634 ms, total: 5.89 s\n", "Wall time: 36.6 s\n" ] } ], "source": [ "%time Riem = g.riemann()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4.43 s, sys: 65.2 ms, total: 4.49 s\n", "Wall time: 2.6 s\n" ] } ], "source": [ "%time Ric = g.ricci()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}$$" ], "text/plain": [ "True" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ric == 0" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.54 s, sys: 236 ms, total: 1.78 s\n", "Wall time: 21.2 s\n" ] } ], "source": [ "%time R_up = Riem.up(g)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 404 ms, sys: 92.4 ms, total: 497 ms\n", "Wall time: 3.52 s\n" ] } ], "source": [ "%time R_down = Riem.down(g)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 49.8 s, sys: 891 ms, total: 50.7 s\n", "Wall time: 31.7 s\n" ] } ], "source": [ "%time Kretschmann_scalar = R_up['^{abcd}']*R_down['_{abcd}']" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & M & \\longrightarrow & \\mathbb{R} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & -\\frac{48 \\, {\\left(a^{6} \\cos\\left({\\theta}\\right)^{6} - 15 \\, a^{4} r^{2} \\cos\\left({\\theta}\\right)^{4} + 15 \\, a^{2} r^{4} \\cos\\left({\\theta}\\right)^{2} - r^{6}\\right)}}{a^{12} \\cos\\left({\\theta}\\right)^{12} + 6 \\, a^{10} r^{2} \\cos\\left({\\theta}\\right)^{10} + 15 \\, a^{8} r^{4} \\cos\\left({\\theta}\\right)^{8} + 20 \\, a^{6} r^{6} \\cos\\left({\\theta}\\right)^{6} + 15 \\, a^{4} r^{8} \\cos\\left({\\theta}\\right)^{4} + 6 \\, a^{2} r^{10} \\cos\\left({\\theta}\\right)^{2} + r^{12}} \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & -\\frac{48 \\, {\\left(a^{6} {\\chi}^{6} - 15 \\, a^{4} {\\chi}^{4} r^{2} + 15 \\, a^{2} {\\chi}^{2} r^{4} - r^{6}\\right)}}{a^{12} {\\chi}^{12} + 6 \\, a^{10} {\\chi}^{10} r^{2} + 15 \\, a^{8} {\\chi}^{8} r^{4} + 20 \\, a^{6} {\\chi}^{6} r^{6} + 15 \\, a^{4} {\\chi}^{4} r^{8} + 6 \\, a^{2} {\\chi}^{2} r^{10} + r^{12}} \\end{array}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & M & \\longrightarrow & \\mathbb{R} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & -\\frac{48 \\, {\\left(a^{6} \\cos\\left({\\theta}\\right)^{6} - 15 \\, a^{4} r^{2} \\cos\\left({\\theta}\\right)^{4} + 15 \\, a^{2} r^{4} \\cos\\left({\\theta}\\right)^{2} - r^{6}\\right)}}{a^{12} \\cos\\left({\\theta}\\right)^{12} + 6 \\, a^{10} r^{2} \\cos\\left({\\theta}\\right)^{10} + 15 \\, a^{8} r^{4} \\cos\\left({\\theta}\\right)^{8} + 20 \\, a^{6} r^{6} \\cos\\left({\\theta}\\right)^{6} + 15 \\, a^{4} r^{8} \\cos\\left({\\theta}\\right)^{4} + 6 \\, a^{2} r^{10} \\cos\\left({\\theta}\\right)^{2} + r^{12}} \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & -\\frac{48 \\, {\\left(a^{6} {\\chi}^{6} - 15 \\, a^{4} {\\chi}^{4} r^{2} + 15 \\, a^{2} {\\chi}^{2} r^{4} - r^{6}\\right)}}{a^{12} {\\chi}^{12} + 6 \\, a^{10} {\\chi}^{10} r^{2} + 15 \\, a^{8} {\\chi}^{8} r^{4} + 20 \\, a^{6} {\\chi}^{6} r^{6} + 15 \\, a^{4} {\\chi}^{4} r^{8} + 6 \\, a^{2} {\\chi}^{2} r^{10} + r^{12}} \\end{array}$$" ], "text/plain": [ "M → ℝ\n", "(t, r, th, ph) ↦ -48*(a^6*cos(th)^6 - 15*a^4*r^2*cos(th)^4 + 15*a^2*r^4*cos(th)^2 - r^6)/(a^12*cos(th)^12 + 6*a^10*r^2*cos(th)^10 + 15*a^8*r^4*cos(th)^8 + 20*a^6*r^6*cos(th)^6 + 15*a^4*r^8*cos(th)^4 + 6*a^2*r^10*cos(th)^2 + r^12)\n", "(t, r, ch, ph) ↦ -48*(a^6*ch^6 - 15*a^4*ch^4*r^2 + 15*a^2*ch^2*r^4 - r^6)/(a^12*ch^12 + 6*a^10*ch^10*r^2 + 15*a^8*ch^8*r^4 + 20*a^6*ch^6*r^6 + 15*a^4*ch^4*r^8 + 6*a^2*ch^2*r^10 + r^12)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kretschmann_scalar.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Getting and factoring the symbolic expression in the default chart" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}-\\frac{48 \\, {\\left(a^{2} {\\chi}^{2} + 4 \\, a {\\chi} r + r^{2}\\right)} {\\left(a^{2} {\\chi}^{2} - 4 \\, a {\\chi} r + r^{2}\\right)} {\\left(a {\\chi} + r\\right)} {\\left(a {\\chi} - r\\right)}}{{\\left(a^{2} {\\chi}^{2} + r^{2}\\right)}^{6}}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}-\\frac{48 \\, {\\left(a^{2} {\\chi}^{2} + 4 \\, a {\\chi} r + r^{2}\\right)} {\\left(a^{2} {\\chi}^{2} - 4 \\, a {\\chi} r + r^{2}\\right)} {\\left(a {\\chi} + r\\right)} {\\left(a {\\chi} - r\\right)}}{{\\left(a^{2} {\\chi}^{2} + r^{2}\\right)}^{6}}$$" ], "text/plain": [ "-48*(a^2*ch^2 + 4*a*ch*r + r^2)*(a^2*ch^2 - 4*a*ch*r + r^2)*(a*ch + r)*(a*ch - r)/(a^2*ch^2 + r^2)^6" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K_scalar = Kretschmann_scalar.expr().factor()\n", "K_scalar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kretschmann scalar along the singular ring, horizons and ergosurfaces" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Singular Ring $(r=0,\\chi=0)$" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}-\\frac{48}{a^{6} {\\chi}^{6}}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}-\\frac{48}{a^{6} {\\chi}^{6}}$$" ], "text/plain": [ "-48/(a^6*ch^6)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K_scalar.subs(r=0)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{r^{6}}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{r^{6}}$$" ], "text/plain": [ "48/r^6" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K_scalar.subs(ch=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outer ergosurface, outer horizon and inner horizon at $\\chi = 0$" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "outer_ergo\n" ] }, { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{3}{4}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{3}{4}$$" ], "text/plain": [ "3/4" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "outer_horizon\n" ] }, { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{{\\left(\\sqrt{-a^{2} + 1} + 1\\right)}^{6}}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{{\\left(\\sqrt{-a^{2} + 1} + 1\\right)}^{6}}$$" ], "text/plain": [ "48/(sqrt(-a^2 + 1) + 1)^6" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "inner_horizon\n" ] }, { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{{\\left(\\sqrt{-a^{2} + 1} - 1\\right)}^{6}}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{48}{{\\left(\\sqrt{-a^{2} + 1} - 1\\right)}^{6}}$$" ], "text/plain": [ "48/(sqrt(-a^2 + 1) - 1)^6" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for k in ['outer_ergo','outer_horizon','inner_horizon']:\n", " print(k)\n", " display(K_scalar.subs(eval(k)).subs({cos(th):ch}).subs(ch=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inner ergosurface for $\\chi \\neq 0$ (the inner ergosurface coincides with the singular ring at $\\chi = 0$)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{6 \\, {\\left(4 \\, a^{6} {\\chi}^{6} - 21 \\, a^{4} {\\chi}^{4} + 21 \\, a^{2} {\\chi}^{2} + {\\left(12 \\, a^{4} {\\chi}^{4} - 19 \\, a^{2} {\\chi}^{2} + 4\\right)} \\sqrt{a {\\chi} + 1} \\sqrt{-a {\\chi} + 1} - 4\\right)}}{a^{6} {\\chi}^{6} - 18 \\, a^{4} {\\chi}^{4} + 48 \\, a^{2} {\\chi}^{2} + 2 \\, {\\left(3 \\, a^{4} {\\chi}^{4} - 16 \\, a^{2} {\\chi}^{2} + 16\\right)} \\sqrt{a {\\chi} + 1} \\sqrt{-a {\\chi} + 1} - 32}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{6 \\, {\\left(4 \\, a^{6} {\\chi}^{6} - 21 \\, a^{4} {\\chi}^{4} + 21 \\, a^{2} {\\chi}^{2} + {\\left(12 \\, a^{4} {\\chi}^{4} - 19 \\, a^{2} {\\chi}^{2} + 4\\right)} \\sqrt{a {\\chi} + 1} \\sqrt{-a {\\chi} + 1} - 4\\right)}}{a^{6} {\\chi}^{6} - 18 \\, a^{4} {\\chi}^{4} + 48 \\, a^{2} {\\chi}^{2} + 2 \\, {\\left(3 \\, a^{4} {\\chi}^{4} - 16 \\, a^{2} {\\chi}^{2} + 16\\right)} \\sqrt{a {\\chi} + 1} \\sqrt{-a {\\chi} + 1} - 32}$$" ], "text/plain": [ "6*(4*a^6*ch^6 - 21*a^4*ch^4 + 21*a^2*ch^2 + (12*a^4*ch^4 - 19*a^2*ch^2 + 4)*sqrt(a*ch + 1)*sqrt(-a*ch + 1) - 4)/(a^6*ch^6 - 18*a^4*ch^4 + 48*a^2*ch^2 + 2*(3*a^4*ch^4 - 16*a^2*ch^2 + 16)*sqrt(a*ch + 1)*sqrt(-a*ch + 1) - 32)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K_inner_ergo = K_scalar.subs(inner_ergo).subs({cos(th):ch}).canonicalize_radical()\n", "K_inner_ergo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Series expansion up to $O(\\chi^5)$" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}{(-\\frac{48}{a^{6}})} {\\chi}^{(-6)} + {(\\frac{252}{a^{4}})} {\\chi}^{(-4)} + {(-\\frac{252}{a^{2}})} {\\chi}^{(-2)} + \\frac{189}{4} + {(\\frac{45}{16} \\, a^{2})} {\\chi}^{2} + {(\\frac{45}{64} \\, a^{4})} {\\chi}^{4} + \\mathcal{O}\\left({\\chi}^{5}\\right)\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{(-\\frac{48}{a^{6}})} {\\chi}^{(-6)} + {(\\frac{252}{a^{4}})} {\\chi}^{(-4)} + {(-\\frac{252}{a^{2}})} {\\chi}^{(-2)} + \\frac{189}{4} + {(\\frac{45}{16} \\, a^{2})} {\\chi}^{2} + {(\\frac{45}{64} \\, a^{4})} {\\chi}^{4} + \\mathcal{O}\\left({\\chi}^{5}\\right)$$" ], "text/plain": [ "(-48/a^6)*ch^(-6) + (252/a^4)*ch^(-4) + (-252/a^2)*ch^(-2) + 189/4 + (45/16*a^2)*ch^2 + (45/64*a^4)*ch^4 + Order(ch^5)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K_inner_ergo.series(ch,5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting the default chart and frame back to Boyer–Lindquist" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "M.set_default_chart(BL)\n", "M.set_default_frame(BL.frame())" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Kerr coordinates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Kerr original coordinates will be used as an intermediate step for introducing the Kerr-Schild coordinates." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "Kr. = M.chart(r'u:(-oo,+oo) r:(0,+oo) th:(0,pi):\\theta vph:(-pi,pi):periodic:\\varphi')" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "f(r) = r/(a^2+r^2-2*r)\n", "assume(a<1)\n", "F(r) = integral(f(r),r)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & u - \\frac{\\log\\left(\\frac{r - \\sqrt{-a^{2} + 1} - 1}{r + \\sqrt{-a^{2} + 1} - 1}\\right)}{\\sqrt{-a^{2} + 1}} - \\log\\left(a^{2} + r^{2} - 2 \\, r\\right) \\\\ r & = & r \\\\ {\\theta} & = & {\\theta} \\\\ {\\phi} & = & -\\frac{1}{2} \\, a {\\left(\\frac{\\log\\left(\\frac{r - \\sqrt{-a^{2} + 1} - 1}{r + \\sqrt{-a^{2} + 1} - 1}\\right)}{\\sqrt{-a^{2} + 1}} + \\log\\left(a^{2} + r^{2} - 2 \\, r\\right)\\right)} + {\\varphi} \\end{array}\\right.\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} t & = & u - \\frac{\\log\\left(\\frac{r - \\sqrt{-a^{2} + 1} - 1}{r + \\sqrt{-a^{2} + 1} - 1}\\right)}{\\sqrt{-a^{2} + 1}} - \\log\\left(a^{2} + r^{2} - 2 \\, r\\right) \\\\ r & = & r \\\\ {\\theta} & = & {\\theta} \\\\ {\\phi} & = & -\\frac{1}{2} \\, a {\\left(\\frac{\\log\\left(\\frac{r - \\sqrt{-a^{2} + 1} - 1}{r + \\sqrt{-a^{2} + 1} - 1}\\right)}{\\sqrt{-a^{2} + 1}} + \\log\\left(a^{2} + r^{2} - 2 \\, r\\right)\\right)} + {\\varphi} \\end{array}\\right.$$" ], "text/plain": [ "t = u - log((r - sqrt(-a^2 + 1) - 1)/(r + sqrt(-a^2 + 1) - 1))/sqrt(-a^2 + 1) - log(a^2 + r^2 - 2*r)\n", "r = r\n", "th = th\n", "ph = -1/2*a*(log((r - sqrt(-a^2 + 1) - 1)/(r + sqrt(-a^2 + 1) - 1))/sqrt(-a^2 + 1) + log(a^2 + r^2 - 2*r)) + vph" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kr_to_BL = Kr.transition_map(BL, [u-2*F(r), r, th, vph-a*F(r)])\n", "Kr_to_BL.display()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} u & = & \\frac{{\\left(a^{2} - 1\\right)} t + {\\left(a^{2} - 1\\right)} \\log\\left(a^{2} + r^{2} - 2 \\, r\\right) + \\sqrt{a + 1} \\sqrt{-a + 1} \\log\\left(-\\frac{a^{2} + r^{2} - 2 \\, r}{a^{2} + 2 \\, \\sqrt{a + 1} \\sqrt{-a + 1} {\\left(r - 1\\right)} - r^{2} + 2 \\, r - 2}\\right)}{a^{2} - 1} \\\\ r & = & r \\\\ {\\theta} & = & {\\theta} \\\\ {\\varphi} & = & \\frac{\\sqrt{a + 1} a \\sqrt{-a + 1} \\log\\left(-\\frac{a^{2} + r^{2} - 2 \\, r}{a^{2} + 2 \\, \\sqrt{a + 1} \\sqrt{-a + 1} {\\left(r - 1\\right)} - r^{2} + 2 \\, r - 2}\\right) + 2 \\, {\\left(a^{2} - 1\\right)} {\\phi} + {\\left(a^{3} - a\\right)} \\log\\left(a^{2} + r^{2} - 2 \\, r\\right)}{2 \\, {\\left(a^{2} - 1\\right)}} \\end{array}\\right.\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} u & = & \\frac{{\\left(a^{2} - 1\\right)} t + {\\left(a^{2} - 1\\right)} \\log\\left(a^{2} + r^{2} - 2 \\, r\\right) + \\sqrt{a + 1} \\sqrt{-a + 1} \\log\\left(-\\frac{a^{2} + r^{2} - 2 \\, r}{a^{2} + 2 \\, \\sqrt{a + 1} \\sqrt{-a + 1} {\\left(r - 1\\right)} - r^{2} + 2 \\, r - 2}\\right)}{a^{2} - 1} \\\\ r & = & r \\\\ {\\theta} & = & {\\theta} \\\\ {\\varphi} & = & \\frac{\\sqrt{a + 1} a \\sqrt{-a + 1} \\log\\left(-\\frac{a^{2} + r^{2} - 2 \\, r}{a^{2} + 2 \\, \\sqrt{a + 1} \\sqrt{-a + 1} {\\left(r - 1\\right)} - r^{2} + 2 \\, r - 2}\\right) + 2 \\, {\\left(a^{2} - 1\\right)} {\\phi} + {\\left(a^{3} - a\\right)} \\log\\left(a^{2} + r^{2} - 2 \\, r\\right)}{2 \\, {\\left(a^{2} - 1\\right)}} \\end{array}\\right.$$" ], "text/plain": [ "u = ((a^2 - 1)*t + (a^2 - 1)*log(a^2 + r^2 - 2*r) + sqrt(a + 1)*sqrt(-a + 1)*log(-(a^2 + r^2 - 2*r)/(a^2 + 2*sqrt(a + 1)*sqrt(-a + 1)*(r - 1) - r^2 + 2*r - 2)))/(a^2 - 1)\n", "r = r\n", "th = th\n", "vph = 1/2*(sqrt(a + 1)*a*sqrt(-a + 1)*log(-(a^2 + r^2 - 2*r)/(a^2 + 2*sqrt(a + 1)*sqrt(-a + 1)*(r - 1) - r^2 + 2*r - 2)) + 2*(a^2 - 1)*ph + (a^3 - a)*log(a^2 + r^2 - 2*r))/(a^2 - 1)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kr_to_BL.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Showing the change of frame from BL to Kerr" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrrr}\n", "1 & -\\frac{2 \\, r}{a^{2} + r^{2} - 2 \\, r} & 0 & 0 \\\\\n", "0 & 1 & 0 & 0 \\\\\n", "0 & 0 & 1 & 0 \\\\\n", "0 & -\\frac{a r}{a^{2} + r^{2} - 2 \\, r} & 0 & 1\n", "\\end{array}\\right)\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrrr}\n", "1 & -\\frac{2 \\, r}{a^{2} + r^{2} - 2 \\, r} & 0 & 0 \\\\\n", "0 & 1 & 0 & 0 \\\\\n", "0 & 0 & 1 & 0 \\\\\n", "0 & -\\frac{a r}{a^{2} + r^{2} - 2 \\, r} & 0 & 1\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 1 -2*r/(a^2 + r^2 - 2*r) 0 0]\n", "[ 0 1 0 0]\n", "[ 0 0 1 0]\n", "[ 0 -a*r/(a^2 + r^2 - 2*r) 0 1]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.change_of_frame(BL.frame(),Kr.frame())[:]" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Surfaces in Kerr-Schild coordinates" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "KS. = M.chart()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Change of coordinates from Kerr to Kerr-Schild" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} u & = & u \\\\ x & = & {\\left(r \\cos\\left({\\varphi}\\right) - a \\sin\\left({\\varphi}\\right)\\right)} \\sin\\left({\\theta}\\right) \\\\ y & = & {\\left(a \\cos\\left({\\varphi}\\right) + r \\sin\\left({\\varphi}\\right)\\right)} \\sin\\left({\\theta}\\right) \\\\ z & = & r \\cos\\left({\\theta}\\right) \\end{array}\\right.\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} u & = & u \\\\ x & = & {\\left(r \\cos\\left({\\varphi}\\right) - a \\sin\\left({\\varphi}\\right)\\right)} \\sin\\left({\\theta}\\right) \\\\ y & = & {\\left(a \\cos\\left({\\varphi}\\right) + r \\sin\\left({\\varphi}\\right)\\right)} \\sin\\left({\\theta}\\right) \\\\ z & = & r \\cos\\left({\\theta}\\right) \\end{array}\\right.$$" ], "text/plain": [ "u = u\n", "x = (r*cos(vph) - a*sin(vph))*sin(th)\n", "y = (a*cos(vph) + r*sin(vph))*sin(th)\n", "z = r*cos(th)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kr_to_KS = Kr.transition_map(KS, [u, (r*cos(vph) - a*sin(vph))*sin(th),\n", " (r*sin(vph) + a*cos(vph))*sin(th),\n", " r*cos(th)])\n", "Kr_to_KS.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parametrization of the surfaces in Kerr-Schild coordinates" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "surfaces_KS = [vector([s.subs(param) for s in Kr_to_KS(u, r, th, ph)[1:]]) for param in surfaces_param]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# plotting data\n", "surfs_data = {\n", "'outer_ergo': {'name': 'Outer ergosurface',\n", " 'color': 'gray',\n", " 'z_label': 1,\n", " 'param_index': 0,\n", " 'phi1': 7*pi/5,\n", " 'plot_points_factor': 1},\n", "'outer_orizon': {'name': 'Outer horizon', \n", " 'color': colormaps.Set1(1)[:3], \n", " 'z_label': .5,\n", " 'param_index': 1, \n", " 'phi1': 7*pi/5, \n", " 'plot_points_factor': 1},\n", "'inner_horizon': {'name': 'Inner horizon', \n", " 'color': colormaps.Set1(4)[:3], \n", " 'z_label': 0,\n", " 'param_index': 2, \n", " 'phi1': 6*pi/5, \n", " 'plot_points_factor': .7},\n", "'inner_ergo': {'name': 'Inner ergosurface',\n", " 'color': colormaps.Set1(3)[:3],\n", " 'z_label': -0.5,\n", " 'param_index': 3,\n", " 'phi1': 2*pi,\n", " 'plot_points_factor': .7}}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python function for plotting the surfaces" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "def kerr_surfaces(surf, a=.99, print_labels=True, plot_points=30, mesh=True, **kwargs):\n", " if a >1 or a < 0:\n", " print(\"choose 'a' between 0 and 1\")\n", " return None\n", "# Labels\n", " if print_labels:\n", " Ker_BH = text3d('Kerr black hole', (-2,-5,2.5), fontsize='200%', fontfamily='serif', fontweight='bold')\n", " sep_line = text3d(r'___', (-2,-5,1.7), fontsize='160%', fontfamily='serif', fontweight='bold')\n", " a_label = text3d('a = ' + str(a.n(digits=5)), (-2,-5,2), fontsize='170%')\n", " s_ring_label = text3d('Singular ring', (-2,-5,-1), color='red', fontsize='170%', fontfamily='serif')\n", " labels = sum([text3d(S['name'],\n", " (-2,-5,S['z_label']),\n", " color=S['color'],\n", " fontsize='170%', \n", " fontfamily='serif') for S in surfs_data.values()])\n", " labels += Ker_BH + a_label + s_ring_label + sep_line\n", " else: labels = Graphics()\n", "# Surfaces\n", " s_ring = parametric_plot3d(surf[4].subs(a=a),(ph,0,2*pi), color='red', thickness=4)\n", " plots = sum([parametric_plot3d(surf[S['param_index']].subs(a=a),\n", " (th,0,pi),\n", " (ph,0,S['phi1']), \n", " color=S['color'], \n", " mesh=mesh,\n", " plot_points=S['plot_points_factor']*plot_points, \n", " frame=False, \n", " **kwargs) for S in surfs_data.values()])\n", " plots += s_ring\n", " return plots+labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kerr_surfaces(surfaces_KS, 0.999, viewpoint=[[-0.6557,-0.5284,-0.5394],112.41])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dark theme" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kerr_surfaces(surfaces_KS, .9, viewpoint=[[-0.6557,-0.5284,-0.5394],112.41], theme='dark')" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Immersion in Euclidean space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also see the surfaces immersed in the Euclidian space $\\mathbb{E}^3$." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "E. = EuclideanSpace(3)\n", "spherical. = E.spherical_coordinates()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Differential map from Kerr coordinates to the Euclidean space" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "Kr_to_E = M.diff_map(E, {(Kr, spherical): [r,th,ph]}, \n", " name='Kr_to_E', \n", " latex_name=r'\\Phi_{_{\\text{Kerr} \\to \\mathbb{E}^3}}')" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\[\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi_{_{\\text{Kerr} \\to \\mathbb{E}^3}}:& M & \\longrightarrow & \\mathbb{E}^{3} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right) \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, \\arctan\\left(r \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right), \\arctan\\left(r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right)\\right)\\right) \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\cos\\left({\\phi}\\right), \\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\sin\\left({\\phi}\\right), {\\chi} r\\right) \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, \\arctan\\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r, {\\chi} r\\right), \\arctan\\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\sin\\left({\\phi}\\right), \\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\cos\\left({\\phi}\\right)\\right)\\right) \\\\ & \\left(u, r, {\\theta}, {\\varphi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right) \\\\ & \\left(u, r, {\\theta}, {\\varphi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, {\\theta}, {\\phi}\\right) \\end{array}\\]" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi_{_{\\text{Kerr} \\to \\mathbb{E}^3}}:& M & \\longrightarrow & \\mathbb{E}^{3} \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right) \\\\ & \\left(t, r, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, \\arctan\\left(r \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right), \\arctan\\left(r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right)\\right)\\right) \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\cos\\left({\\phi}\\right), \\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\sin\\left({\\phi}\\right), {\\chi} r\\right) \\\\ & \\left(t, r, {\\chi}, {\\phi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, \\arctan\\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r, {\\chi} r\\right), \\arctan\\left(\\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\sin\\left({\\phi}\\right), \\sqrt{{\\chi} + 1} \\sqrt{-{\\chi} + 1} r \\cos\\left({\\phi}\\right)\\right)\\right) \\\\ & \\left(u, r, {\\theta}, {\\varphi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), r \\cos\\left({\\theta}\\right)\\right) \\\\ & \\left(u, r, {\\theta}, {\\varphi}\\right) & \\longmapsto & \\left(r, {\\theta}, {\\phi}\\right) = \\left(r, {\\theta}, {\\phi}\\right) \\end{array}$$" ], "text/plain": [ "Kr_to_E: M → E^3\n", " (t, r, th, ph) ↦ (x, y, z) = (r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))\n", " (t, r, th, ph) ↦ (r, th, ph) = (r, arctan2(r*sin(th), r*cos(th)), arctan2(r*sin(ph)*sin(th), r*cos(ph)*sin(th)))\n", " (t, r, ch, ph) ↦ (x, y, z) = (sqrt(ch + 1)*sqrt(-ch + 1)*r*cos(ph), sqrt(ch + 1)*sqrt(-ch + 1)*r*sin(ph), ch*r)\n", " (t, r, ch, ph) ↦ (r, th, ph) = (r, arctan2(sqrt(ch + 1)*sqrt(-ch + 1)*r, ch*r), arctan2(sqrt(ch + 1)*sqrt(-ch + 1)*r*sin(ph), sqrt(ch + 1)*sqrt(-ch + 1)*r*cos(ph)))\n", " (u, r, th, vph) ↦ (x, y, z) = (r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))\n", " (u, r, th, vph) ↦ (r, th, ph) = (r, th, ph)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kr_to_E.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Coordinates in Euclidean space" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "coordinates = Kr_to_E(M.point((u,r,th,vph), chart=Kr)).coordinates()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Surfaces in Euclidean space" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "surfaces_E = [vector([s.subs(param) for s in coordinates]) for param in surfaces_param]" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kerr_surfaces(surfaces_E, .96, viewpoint=[[-0.8499,-0.3478,-0.396],91.88])" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Animating the surfaces" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now create an animation by varying the parameter $a$." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "theme = 'light' #'light' or 'dark'\n", "frames1 = [kerr_surfaces(surfaces_KS,k, theme=theme, \n", " viewpoint=[[-0.6557,-0.5284,-0.5394],112.41]) for k in srange(0,.5,.1)]\n", "frames2 = [kerr_surfaces(surfaces_KS,k, theme=theme, \n", " viewpoint=[[-0.6557,-0.5284,-0.5394],112.41]) for k in srange(.5,.95,.075)]\n", "frames3 = [kerr_surfaces(surfaces_KS,k, theme=theme, \n", " viewpoint=[[-0.6557,-0.5284,-0.5394],112.41]) for k in srange(.95,.9999,.005)]\n", "frames4 = [kerr_surfaces(surfaces_KS,k, theme=theme, \n", " viewpoint=[[-0.6557,-0.5284,-0.5394],112.41]) for k in srange(.9999,1,.000045)]\n", "frames = frames1+frames2+frames3+frames4" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "animate(frames).interactive()" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.4", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" } }, "nbformat": 4, "nbformat_minor": 4 }