{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Near-horizon geometry of the extremal Kerr black hole\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook derives the near-horizon geometry of the extremal (i.e. maximally spinning) Kerr black hole. It is based on SageMath tools developed through the [SageManifolds project](https://sagemanifolds.obspm.fr/). Some of these tools, like the series expansion of tensor fields, are quite recent and require a version of SageMath at least equal to 8.8:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.0.beta7, Release Date: 2019-11-26'" ] }, "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": [ "To speed up computations, we ask for running them in parallel on 8 threads:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spacetime manifold\n", "\n", "We declare the Kerr spacetime (or more precisely the part of it covered by Boyer-Lindquist coordinates) as a 4-dimensional Lorentzian manifold $\\mathcal{M}$:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "M = Manifold(4, 'M', latex_name=r'\\mathcal{M}', structure='Lorentzian')\n", "print(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then introduce the standard **Boyer-Lindquist coordinates** $(t,r,\\theta,\\phi)$ as a chart `BL` (for *Boyer-Lindquist*) on $\\mathcal{M}$, via the method `chart()`. The argument of the latter is a string\n", "(delimited by `r\"...\"` because of the backslash symbols) expressing the coordinates names, their ranges (the default is $(-\\infty,+\\infty)$) and their LaTeX symbols:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chart (M, (t, r, th, ph))\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (t, r, th, ph))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL. = M.chart(r\"t r th:(0,pi):\\theta ph:(0,2*pi):periodic:\\phi\") \n", "print(BL); BL" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(t, r)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL[0], BL[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Metric tensor of the extremal Kerr spacetime\n", "\n", "The mass parameter $m$ of the Kerr spacetime is declared as a symbolic variable:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "m = var('m', domain='real')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the extremal Kerr black hole, the spin parameter $a$ reaches its upper bound, namely $m$:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "a = m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get the (yet undefined) spacetime metric:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "g = M.metric()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The metric is set by its components in the coordinate frame associated with Boyer-Lindquist coordinates, which is the current manifold's default frame:

" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = (2*m*r/(m^2*cos(th)^2 + r^2) - 1) dt*dt - 2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) dt*dph + (m^2*cos(th)^2 + r^2)/(m^2 - 2*m*r + r^2) dr*dr + (m^2*cos(th)^2 + r^2) dth*dth - 2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) dph*dt + (2*m^3*r*sin(th)^2/(m^2*cos(th)^2 + r^2) + m^2 + r^2)*sin(th)^2 dph*dph" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rho2 = r^2 + (a*cos(th))^2\n", "Delta = r^2 -2*m*r + a^2\n", "g[0,0] = -(1-2*m*r/rho2)\n", "g[0,3] = -2*a*m*r*sin(th)^2/rho2\n", "g[1,1], g[2,2] = rho2/Delta, rho2\n", "g[3,3] = (r^2+a^2+2*m*r*(a*sin(th))^2/rho2)*sin(th)^2\n", "g.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A matrix view of the components with respect to the manifold's default vector frame:

" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 2*m*r/(m^2*cos(th)^2 + r^2) - 1 0 0 -2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2)]\n", "[ 0 (m^2*cos(th)^2 + r^2)/(m^2 - 2*m*r + r^2) 0 0]\n", "[ 0 0 m^2*cos(th)^2 + r^2 0]\n", "[ -2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) 0 0 (2*m^3*r*sin(th)^2/(m^2*cos(th)^2 + r^2) + m^2 + r^2)*sin(th)^2]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The list of the non-vanishing components:

" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g_t,t = 2*m*r/(m^2*cos(th)^2 + r^2) - 1 \n", "g_t,ph = -2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) \n", "g_r,r = (m^2*cos(th)^2 + r^2)/(m^2 - 2*m*r + r^2) \n", "g_th,th = m^2*cos(th)^2 + r^2 \n", "g_ph,t = -2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) \n", "g_ph,ph = (2*m^3*r*sin(th)^2/(m^2*cos(th)^2 + r^2) + m^2 + r^2)*sin(th)^2 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that we are dealing with a solution of the vacuum Einstein equation:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Ric(g) = 0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.ricci().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Near-horizon coordinates\n", "\n", "Let us introduce the chart `NH` of the near-horizon coordinates $(\\bar{t}, \\bar{r}, \\theta, \\bar{\\phi})$:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chart (M, (tb, rb, th, phb))\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (tb, rb, th, phb))" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NH. = M.chart(r\"tb:\\bar{t} rb:\\bar{r} th:(0,pi):\\theta phb:(0,2*pi):periodic:\\bar{\\phi}\") \n", "print(NH)\n", "NH" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Chart (M, (t, r, th, ph)), Chart (M, (tb, rb, th, phb))]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Following J. Bardeen and G. T. Horowitz, \n", "[Phys. Rev. D **60**, 104030 (1999)](https://doi.org/10.1103/PhysRevD.60.104030), the near-horizon coordinates $(\\bar{t}, \\bar{r}, \\theta, \\bar{\\phi})$ are related to the Boyer-Lindquist coordinates by\n", "$$\\bar{t} = \\epsilon t, \\quad \\bar{r} = \\frac{r-m}{\\epsilon},\\quad \\theta = \\theta, \n", "\\quad\\bar{\\phi} = \\phi - \\frac{t}{2m},$$\n", "where $\\epsilon$ is a constant parameter.\n", "The horizon of the extremal Kerr black hole is located at $r=m$, which corresponds to $\\bar{r}=0$.\n", "\n", "We implement the above relations as a transition map from the chart `BL` to the chart `NH`:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "tb = eps*t\n", "rb = -(m - r)/eps\n", "th = th\n", "phb = ph - 1/2*t/m" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eps = var('eps', latex_name=r'\\epsilon')\n", "BL_to_NH = BL.transition_map(NH, [eps*t, (r-m)/eps, th, ph - t/(2*m)])\n", "BL_to_NH.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The inverse relation is" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "t = tb/eps\n", "r = eps*rb + m\n", "th = th\n", "ph = 1/2*(2*eps*m*phb + tb)/(eps*m)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL_to_NH.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ eps 0 0 0]\n", "[ 0 1/eps 0 0]\n", "[ 0 0 1 0]\n", "[-1/2/m 0 0 1]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL_to_NH.jacobian()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL_to_NH.jacobian_det()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The metric components with respect the coordinates \n", "$(\\bar{t}, \\bar{r}, \\theta, \\bar{\\phi})$ are computed by passing the \n", "chart `NH` to the method `display()`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (t, r, th, ph))" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_chart()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = (2*m*r/(m^2*cos(th)^2 + r^2) - 1) dt*dt - 2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) dt*dph + (m^2*cos(th)^2 + r^2)/(m^2 - 2*m*r + r^2) dr*dr + (m^2*cos(th)^2 + r^2) dth*dth - 2*m^2*r*sin(th)^2/(m^2*cos(th)^2 + r^2) dph*dt + (2*m^3*r*sin(th)^2/(m^2*cos(th)^2 + r^2) + m^2 + r^2)*sin(th)^2 dph*dph" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = -1/4*(m^2*rb^2*cos(th)^4 - eps^2*rb^4 - 4*eps*m*rb^3 - 3*m^2*rb^2 + (eps^2*rb^4 + 4*eps*m*rb^3 + 6*m^2*rb^2)*cos(th)^2)/(eps^2*m^2*rb^2 + m^4*cos(th)^2 + 2*eps*m^3*rb + m^4) dtb*dtb - 1/2*(eps*m^2*rb^2*sin(th)^4 - (eps^3*rb^4 + 4*eps^2*m*rb^3 + 8*eps*m^2*rb^2 + 4*m^3*rb)*sin(th)^2)/(eps^2*m*rb^2 + m^3*cos(th)^2 + 2*eps*m^2*rb + m^3) dtb*dphb + (eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2)/rb^2 drb*drb + (eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2) dth*dth - 1/2*(eps*m^2*rb^2*sin(th)^4 - (eps^3*rb^4 + 4*eps^2*m*rb^3 + 8*eps*m^2*rb^2 + 4*m^3*rb)*sin(th)^2)/(eps^2*m*rb^2 + m^3*cos(th)^2 + 2*eps*m^2*rb + m^3) dphb*dtb - (eps^2*m^2*rb^2*sin(th)^4 - (eps^4*rb^4 + 4*eps^3*m*rb^3 + 8*eps^2*m^2*rb^2 + 8*eps*m^3*rb + 4*m^4)*sin(th)^2)/(eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2) dphb*dphb" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display(NH)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From now on, we use the near-horizon coordinates as the default ones on the spacetime manifold:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "M.set_default_chart(NH)\n", "M.set_default_frame(NH.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence `NH` becomes the default argument of `display()`:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = -1/4*(m^2*rb^2*cos(th)^4 - eps^2*rb^4 - 4*eps*m*rb^3 - 3*m^2*rb^2 + (eps^2*rb^4 + 4*eps*m*rb^3 + 6*m^2*rb^2)*cos(th)^2)/(eps^2*m^2*rb^2 + m^4*cos(th)^2 + 2*eps*m^3*rb + m^4) dtb*dtb - 1/2*(eps*m^2*rb^2*sin(th)^4 - (eps^3*rb^4 + 4*eps^2*m*rb^3 + 8*eps*m^2*rb^2 + 4*m^3*rb)*sin(th)^2)/(eps^2*m*rb^2 + m^3*cos(th)^2 + 2*eps*m^2*rb + m^3) dtb*dphb + (eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2)/rb^2 drb*drb + (eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2) dth*dth - 1/2*(eps*m^2*rb^2*sin(th)^4 - (eps^3*rb^4 + 4*eps^2*m*rb^3 + 8*eps*m^2*rb^2 + 4*m^3*rb)*sin(th)^2)/(eps^2*m*rb^2 + m^3*cos(th)^2 + 2*eps*m^2*rb + m^3) dphb*dtb - (eps^2*m^2*rb^2*sin(th)^4 - (eps^4*rb^4 + 4*eps^3*m*rb^3 + 8*eps^2*m^2*rb^2 + 8*eps*m^3*rb + 4*m^4)*sin(th)^2)/(eps^2*rb^2 + m^2*cos(th)^2 + 2*eps*m*rb + m^2) dphb*dphb" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The near-horizon metric $h$ as the limit $\\epsilon\\to 0$ of the Kerr metric $g$\n", "\n", "Let us define the *near-horizon metric* as the metric $h$ on $\\mathcal{M}$ that is the limit $\\epsilon\\to 0$ of the Kerr metric $g$. The limit is taken by asking for a series expansion of $g$ with respect to $\\epsilon$ up to the 0-th order (i.e. keeping only $\\epsilon^0$ terms). This is acheived via the method `truncate`:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "h = -1/4*(rb^2*cos(th)^4 + 6*rb^2*cos(th)^2 - 3*rb^2)/(m^2*cos(th)^2 + m^2) dtb*dtb + 2*rb*sin(th)^2/(cos(th)^2 + 1) dtb*dphb + (m^2*cos(th)^2 + m^2)/rb^2 drb*drb + (m^2*cos(th)^2 + m^2) dth*dth + 2*rb*sin(th)^2/(cos(th)^2 + 1) dphb*dtb + 4*m^2*sin(th)^2/(cos(th)^2 + 1) dphb*dphb" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = M.lorentzian_metric('h')\n", "h.set(g.truncate(eps, 0))\n", "h.display()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "h_tb,tb = -1/4*(rb^2*cos(th)^4 + 6*rb^2*cos(th)^2 - 3*rb^2)/(m^2*cos(th)^2 + m^2) \n", "h_tb,phb = 2*rb*sin(th)^2/(cos(th)^2 + 1) \n", "h_rb,rb = (m^2*cos(th)^2 + m^2)/rb^2 \n", "h_th,th = m^2*cos(th)^2 + m^2 \n", "h_phb,tb = 2*rb*sin(th)^2/(cos(th)^2 + 1) \n", "h_phb,phb = 4*m^2*sin(th)^2/(cos(th)^2 + 1) " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The $\\epsilon$-expansion of $g$ has been performed on all sets of components. Those in the Boyer-Lindquist frame are not valid since nothing in them depend explicitely on $\\epsilon$. To have consistent sets of components, we simply delete these components:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "del h._components[BL.frame()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a check, we compare with Eq. (2.6) of [Bardeen & Horowitz, Phys. Rev. D **60**, 104030 (1999)](https://doi.org/10.1103/PhysRevD.60.104030), which involves the bilinear form\n", "$$ q = \\frac{4m^2\\sin^2\\theta}{1+\\cos^2\\theta} \n", "\\left( \\mathrm{d}\\bar{\\phi} + \\frac{\\bar{r}}{2m^2} \\mathrm{d}\\bar{t} \\right)^2$$\n", "We construct $h$ by getting first the 1-forms $\\mathrm{d}\\bar{t}$ and\n", "$\\mathrm{d}\\bar{\\phi}$:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1-form dtb on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtb = NH.coframe()[0]\n", "dtb" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1-form dphb on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dphb = NH.coframe()[3]\n", "dphb" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "rb^2*sin(th)^2/(m^2*cos(th)^2 + m^2) dtb*dtb + 2*rb*sin(th)^2/(cos(th)^2 + 1) dtb*dphb + 2*rb*sin(th)^2/(cos(th)^2 + 1) dphb*dtb + 4*m^2*sin(th)^2/(cos(th)^2 + 1) dphb*dphb" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = 4*m^2*sin(th)^2/(1+cos(th)^2) * (dphb + rb/(2*m^2)*dtb) * (dphb + rb/(2*m^2)*dtb)\n", "q.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We evaluate then $h-q$ to compare with Eq. (2.6) of Bardeen & Horowitz:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/4*(rb^2*cos(th)^2 + rb^2)/m^2 dtb*dtb + (m^2*cos(th)^2 + m^2)/rb^2 drb*drb + (m^2*cos(th)^2 + m^2) dth*dth" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(h - q).display()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/4*(rb^2*cos(th)^2 + rb^2)/((cos(th)^2 + 1)*m^2) dtb*dtb + (m^2*cos(th)^2 + m^2)/((cos(th)^2 + 1)*rb^2) drb*drb + (m^2*cos(th)^2 + m^2)/(cos(th)^2 + 1) dth*dth" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = (h - q)/(1+cos(th)^2)\n", "s.display()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/4*rb^2/m^2 dtb*dtb + m^2/rb^2 drb*drb + m^2 dth*dth" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for i in range(4):\n", " for j in range(i, 4):\n", " s[i,j].simplify()\n", "s.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above result shows the complete agreement with Eq. (2.6) of Bardeen & Horowitz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We note that the metric $h$ is not asymptotically flat. \n", "Besides, it is a solution of the vacuum Einstein equation:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Ric(h) = 0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.ricci().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Killing vectors of the near-horizon geometry" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us first consider the vector field $\\eta := \\frac{\\partial}{\\partial\\bar{\\phi}}$:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "eta = d/dphb" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eta = M.vector_field(0, 0, 0, 1, name='eta', latex_name=r'\\eta')\n", "eta.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is a Killing vector of the near-horizon metric, since the Lie derivative of $h$ along $\\eta$ vanishes:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.lie_derivative(eta).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is not surprising since the components of $h$ are independent from $\\bar{\\phi}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, we can check that $\\xi_1 := \\frac{\\partial}{\\partial\\bar{t}}$ is a Killing vector of $h$, reflecting the independence of the components of $h$ from $\\bar{t}$:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi1 = d/dtb" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1 = M.vector_field(1, 0, 0, 0, name='xi1', latex_name=r'\\xi_{1}')\n", "xi1.display()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.lie_derivative(xi1).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above two Killing vectors correspond respectively to the **axisymmetry** and the **pseudo-stationarity** of the Kerr metric. A third symmetry, which is not present in the original Kerr metric, is the invariance under the **scaling** $(\\bar{t},\\bar{r})\\mapsto (\\alpha \\bar{t}, \\bar{r}/\\alpha)$, as it is clear on the metric components in Out[21]. The corresponding Killing vector is " ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi2 = tb d/dtb - rb d/drb" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi2 = M.vector_field(tb, -rb, 0, 0, name='xi2', latex_name=r'\\xi_{2}')\n", "xi2.display()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.lie_derivative(xi2).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, a fourth Killing vector is" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi3 = (2*m^4/rb^2 + 1/2*tb^2) d/dtb - rb*tb d/drb - 2*m^2/rb d/dphb" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi3 = M.vector_field(tb^2/2 + 2*m^4/rb^2, -tb*rb, 0, -2*m^2/rb,\n", " name='xi3', latex_name=r'\\xi_{3}')\n", "xi3.display()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.lie_derivative(xi3).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symmetry group" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have four independent Killing vectors, $\\eta$, $\\xi_1$, $\\xi_2$ and $\\xi_3$, which implies that the symmetry group of the near-horizon geometry is a 4-dimensional Lie group $G$. Let us determine $G$ by investigating the **structure constants** of the basis \n", "$(\\eta, \\xi_1, \\xi_2, \\xi_3)$ of the Lie algebra of $G$. First of all, we notice that \n", "$\\eta$ commutes with the other Killing vectors:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[eta,xi1] = 0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[eta,xi2] = 0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[eta,xi3] = 0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for xi in [xi1, xi2, xi3]:\n", " show(eta.bracket(xi).display())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since $\\eta$ generates the rotation group $\\mathrm{SO}(2)=\\mathrm{U}(1)$, we may write that $G = \\mathrm{U}(1)\\times G_3$, where $G_3$\n", "is a 3-dimensional Lie group, whose generators are $(\\xi_1, \\xi_2, \\xi_3)$. Let us determine the structure constants of these three vectors. We have" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[xi1,xi2] = d/dtb" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1.bracket(xi2).display()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1.bracket(xi2) == xi1" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[xi1,xi3] = tb d/dtb - rb d/drb" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1.bracket(xi3).display()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1.bracket(xi3) == xi2" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[xi2,xi3] = 1/2*(4*m^4 + rb^2*tb^2)/rb^2 d/dtb - rb*tb d/drb - 2*m^2/rb d/dphb" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi2.bracket(xi3).display()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi2.bracket(xi3) == xi3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To summarize, we have" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([xi1.bracket(xi2) == xi1,\n", " xi1.bracket(xi3) == xi2,\n", " xi2.bracket(xi3) == xi3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To recognize a standard Lie algebra, let us perform a slight change of basis:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "vE = -sqrt(2)*xi3\n", "vF = sqrt(2)*xi1\n", "vH = 2*xi2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have then the following commutation relations:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([vE.bracket(vF) == vH,\n", " vH.bracket(vE) == 2*vE,\n", " vH.bracket(vF) == -2*vF])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We recognize the Lie algebra $\\mathfrak{sl}(2, \\mathbb{R})$. Indeed, we have, using the representation of $\\mathfrak{sl}(2, \\mathbb{R})$ by traceless $2\\times 2$ matrices:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "sl2 = lie_algebras.sl(QQ, 2, representation='matrix')\n", "E,F,H = sl2.gens()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[0 1]\n", "[0 0]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[0 0]\n", "[1 0]" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 1 0]\n", "[ 0 -1]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([E.bracket(F) == H,\n", " H.bracket(E) == 2*E,\n", " H.bracket(F) == -2*F])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence, we have $$\\mathrm{Lie}(G_3) = \\mathfrak{sl}(2, \\mathbb{R}).$$\n", "\n", "At this stage, $G_3$ could be $\\mathrm{SL}(2, \\mathbb{R})$, $\\mathrm{PSL}(2, \\mathbb{R})$\n", "or $\\overline{\\mathrm{SL}(2, \\mathbb{R})}$ (the universal covering group of $\\mathrm{SL}(2, \\mathbb{R})$). One can show that actually \n", "$G_3 = \\mathrm{SL}(2, \\mathbb{R})$.\n", "We conclude that the full isometry group of the near-horizon geometry is \n", "$$ G = \\mathrm{U}(1) \\times \\mathrm{SL}(2, \\mathbb{R}).$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Expression of the near-horizon Killing vectors in the Boyer-Lindquist basis\n", "\n", "We have:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "eta = d/dph" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eta.display(BL)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi1 = 1/eps d/dt + 1/2/(eps*m) d/dph" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi1.display(BL)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given that for an extremal Kerr black hole $\\Omega_H = 1/(2m)$, we recognize that \n", "$$ \\xi_1 = \\epsilon^{-1} \\chi $$\n", "where $\\chi := \\frac{\\partial}{\\partial t} + \\Omega_H \\frac{\\partial}{\\partial \\phi}$ is the\n", "Killing vector that is tangent to the horizon null generators on $\\mathcal{H}$, or equivalently that is the null normal of the Killing horizon $\\mathcal{H}$. " ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi2 = t d/dt + (m - r) d/dr + 1/2*t/m d/dph" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi2.display(BL)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi3 = 1/2*(4*eps*m^4 + (eps*m^2 - 2*eps*m*r + eps*r^2)*t^2)/(m^2 - 2*m*r + r^2) d/dt + (eps*m - eps*r)*t d/dr + 1/4*(12*eps*m^4 - 8*eps*m^3*r + (eps*m^2 - 2*eps*m*r + eps*r^2)*t^2)/(m^3 - 2*m^2*r + m*r^2) d/dph" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi3.display(BL)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xi3 = 1/2*(4*m^4 + m^2*t^2 - 2*m*r*t^2 + r^2*t^2)*eps/(m - r)^2 d/dt + eps*(m - r)*t d/dr + 1/4*(12*m^4 - 8*m^3*r + m^2*t^2 - 2*m*r*t^2 + r^2*t^2)*eps/((m - r)^2*m) d/dph" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for i in M.irange():\n", " xi3[BL.frame(), i, BL].factor()\n", "xi3.display(BL)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Killing operator of $g$ applied to the near-horizon Killing vectors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this part, we set the Boyer-Lindquist chart and frame back to the defaults ones:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "M.set_default_chart(BL)\n", "M.set_default_frame(BL.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Levi-Civita connection $\\nabla$ of $g$:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "nabla = g.connection()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Killing form $\\mathrm{K}v$ of a vector field $v$ is defined by\n", "$$(\\mathrm{K}v)_{ab} := \\nabla_a v_b + \\nabla_b v_a,$$\n", "where $v_a := g_{ab} v^b$. With SageMath, this becomes" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "def killing_form(v):\n", " Kv = 2*nabla(v.down(g)).symmetrize()\n", " if v._name is not None:\n", " Kv.set_name('K' + v._name, latex_name=r'\\mathrm{K}' + str(latex(v)))\n", " return Kv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For some reason (to be investigated...), what follows does not work with multiprocessing:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Killing form of $\\eta$ is identically zero:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Keta on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Keta = 0" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Keta = killing_form(eta)\n", "print(Keta)\n", "Keta.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We recover the fact that $\\eta$ is a Killing vector of $g$. Similarly, we have " ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Kxi1 on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Kxi1 = 0" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kxi1 = killing_form(xi1)\n", "print(Kxi1)\n", "Kxi1.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We recover the fact that $\\xi_1 = \\epsilon^{-1}\\chi$ is a Killing vector of $g$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But $\\xi_2$ and $\\xi_3$ are not Killing vectors of $g$:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Kxi2 on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Kxi2 = -2*((m^4 - m^3*r)*cos(th)^4 + m^2*r^2 - 2*m*r^3 + r^4 - (m^4 - 2*m^2*r^2 + m*r^3)*cos(th)^2)/(m^4*cos(th)^4 + 2*m^2*r^2*cos(th)^2 + r^4) dt*dt + 1/2*((m^6 - 2*m^5*r + m^4*r^2)*sin(th)^6 + 2*(m^6 + m^5*r - 2*m^4*r^2 + m^3*r^3 - m^2*r^4)*sin(th)^4 - (3*m^6 - 7*m^4*r^2 + 8*m^3*r^3 - 3*m^2*r^4 - r^6)*sin(th)^2)/(m^5*cos(th)^4 + 2*m^3*r^2*cos(th)^2 + m*r^4) dt*dph + 2*r/(m - r) dr*dr + (2*m*r - 2*r^2) dth*dth + 1/2*((m^6 - 2*m^5*r + m^4*r^2)*sin(th)^6 + 2*(m^6 + m^5*r - 2*m^4*r^2 + m^3*r^3 - m^2*r^4)*sin(th)^4 - (3*m^6 - 7*m^4*r^2 + 8*m^3*r^3 - 3*m^2*r^4 - r^6)*sin(th)^2)/(m^5*cos(th)^4 + 2*m^3*r^2*cos(th)^2 + m*r^4) dph*dt - 2*((m^4*r^2 - m^3*r^3 - (m^6 - m^5*r)*cos(th)^2)*sin(th)^4 - (m*r^5 - r^6 + (m^5*r - m^4*r^2)*cos(th)^4 + 2*(m^3*r^3 - m^2*r^4)*cos(th)^2)*sin(th)^2)/(m^4*cos(th)^4 + 2*m^2*r^2*cos(th)^2 + r^4) dph*dph" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kxi2 = killing_form(xi2)\n", "print(Kxi2)\n", "Kxi2.display()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Kxi3 on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Kxi3 = -2*((eps*m^4 - eps*m^3*r)*t*cos(th)^4 - (eps*m^4 - 2*eps*m^2*r^2 + eps*m*r^3)*t*cos(th)^2 + (eps*m^2*r^2 - 2*eps*m*r^3 + eps*r^4)*t)/(m^4*cos(th)^4 + 2*m^2*r^2*cos(th)^2 + r^4) dt*dt + (eps*m^4*cos(th)^4 + eps*r^4 - 2*(2*eps*m^4 - eps*m^2*r^2)*cos(th)^2)/(m*r^2 - r^3 + (m^3 - m^2*r)*cos(th)^2) dt*dr + 1/2*((eps*m^6 - 2*eps*m^5*r + eps*m^4*r^2)*t*sin(th)^6 + 2*(eps*m^6 + eps*m^5*r - 2*eps*m^4*r^2 + eps*m^3*r^3 - eps*m^2*r^4)*t*sin(th)^4 - (3*eps*m^6 - 7*eps*m^4*r^2 + 8*eps*m^3*r^3 - 3*eps*m^2*r^4 - eps*r^6)*t*sin(th)^2)/(m^5*cos(th)^4 + 2*m^3*r^2*cos(th)^2 + m*r^4) dt*dph + (eps*m^4*cos(th)^4 + eps*r^4 - 2*(2*eps*m^4 - eps*m^2*r^2)*cos(th)^2)/(m*r^2 - r^3 + (m^3 - m^2*r)*cos(th)^2) dr*dt + 2*eps*r*t/(m - r) dr*dr - 2*((2*eps*m^5 - eps*m^4*r)*sin(th)^4 - (2*eps*m^5 - eps*m^4*r - eps*m^2*r^3)*sin(th)^2)/(m*r^2 - r^3 + (m^3 - m^2*r)*cos(th)^2) dr*dph + 2*(eps*m*r - eps*r^2)*t dth*dth + 1/2*((eps*m^6 - 2*eps*m^5*r + eps*m^4*r^2)*t*sin(th)^6 + 2*(eps*m^6 + eps*m^5*r - 2*eps*m^4*r^2 + eps*m^3*r^3 - eps*m^2*r^4)*t*sin(th)^4 - (3*eps*m^6 - 7*eps*m^4*r^2 + 8*eps*m^3*r^3 - 3*eps*m^2*r^4 - eps*r^6)*t*sin(th)^2)/(m^5*cos(th)^4 + 2*m^3*r^2*cos(th)^2 + m*r^4) dph*dt - 2*((2*eps*m^5 - eps*m^4*r)*sin(th)^4 - (2*eps*m^5 - eps*m^4*r - eps*m^2*r^3)*sin(th)^2)/(m*r^2 - r^3 + (m^3 - m^2*r)*cos(th)^2) dph*dr + 2*(((eps*m^6 - eps*m^5*r)*t*cos(th)^2 - (eps*m^4*r^2 - eps*m^3*r^3)*t)*sin(th)^4 + ((eps*m^5*r - eps*m^4*r^2)*t*cos(th)^4 + 2*(eps*m^3*r^3 - eps*m^2*r^4)*t*cos(th)^2 + (eps*m*r^5 - eps*r^6)*t)*sin(th)^2)/(m^4*cos(th)^4 + 2*m^2*r^2*cos(th)^2 + r^4) dph*dph" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kxi3 = killing_form(xi3)\n", "print(Kxi3)\n", "Kxi3.display()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Kxi3.truncate(eps, 0).display()" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.0.beta7", "language": "sage", "name": "sagemath" }, "language": "python", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }