{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Walker-Penrose Killing tensor in Kerr spacetime\n", "\n", "This Jupyter/SageMath notebook is relative to the lectures\n", "[Geometry and physics of black holes](https://relativite.obspm.fr/blackholes/).\n", "\n", "It focuses on the Killing tensor $K$ found by Walker & Penrose [[Commun. Math. Phys. **18**, 265 (1970)](https://doi.org/10.1007/BF01649445)]. \n", "\n", "The involved computations are based on tools developed through the [SageManifolds](https://sagemanifolds.obspm.fr) project." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*NB:* a version of SageMath at least equal to 8.2 is required to run this notebook:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.1.rc1, Release Date: 2020-04-22'" ] }, "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 the 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 Boyer-Lindquist domain of Kerr 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" ] } ], "source": [ "M = Manifold(4, 'M', latex_name=r'\\mathcal{M}', structure='Lorentzian')\n", "print(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us declare the **Boyer-Lindquist coordinates** via the method `chart()`, the argument of which is a string 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):\\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": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "t: (-oo, +oo); r: (-oo, +oo); th: (0, pi); ph: (0, 2*pi)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Metric tensor

\n", "\n", "

The 2 parameters $m$ and $a$ of the Kerr spacetime are declared as symbolic variables:

" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(m, a)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('m, a', domain='real')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get the (yet undefined) spacetime metric by " ] }, { "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/(a^2*cos(th)^2 + r^2) - 1) dt*dt - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dt*dph + (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) dr*dr + (a^2*cos(th)^2 + r^2) dth*dth - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dph*dt + (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^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/(a^2*cos(th)^2 + r^2) - 1 0 0 -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2)]\n", "[ 0 (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) 0 0]\n", "[ 0 0 a^2*cos(th)^2 + r^2 0]\n", "[ -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) 0 0 (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^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/(a^2*cos(th)^2 + r^2) - 1 \n", "g_t,ph = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_r,r = (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) \n", "g_th,th = a^2*cos(th)^2 + r^2 \n", "g_ph,t = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_ph,ph = (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^2 + r^2)*sin(th)^2 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Levi-Civita Connection

\n", "\n", "

The Levi-Civita connection $\\nabla$ associated with $g$:

" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "nabla = g.connection() ; print(nabla)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us verify that the covariant derivative of $g$ with respect to $\\nabla$ vanishes identically:

" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "nabla_g(g) = 0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla(g).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Killing vectors

\n", "

The default vector frame on the spacetime manifold is the coordinate basis associated with Boyer-Lindquist coordinates:

" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_frame() is BL.frame()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (M, (d/dt,d/dr,d/dth,d/dph))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL.frame()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us consider the first vector field of this frame:

" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector field d/dt on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi = BL.frame()[0] ; xi" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector field d/dt on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "print(xi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The 1-form associated to it by metric duality is

" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^2*cos(th)^2 - 2*m*r + r^2)/(a^2*cos(th)^2 + r^2) dt - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dph" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi_form = xi.down(g) ; xi_form.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Its covariant derivative is

" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (0,2) on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "(a^2*m*cos(th)^2 - m*r^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dt*dr + 2*a^2*m*r*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dt*dth - (a^2*m*cos(th)^2 - m*r^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dr*dt + (a^3*m*cos(th)^2 - a*m*r^2)*sin(th)^2/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dr*dph - 2*a^2*m*r*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dth*dt + 2*(a^3*m*r + a*m*r^3)*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dth*dph - (a^3*m*cos(th)^2 - a*m*r^2)*sin(th)^2/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dph*dr - 2*(a^3*m*r + a*m*r^3)*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dph*dth" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nab_xi = nabla(xi_form) ; print(nab_xi) ; nab_xi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us check that the Killing equation is satisfied:

" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nab_xi.symmetrize() == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Similarly, let us check that $\\frac{\\partial}{\\partial\\phi}$ is a Killing vector:

" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector field d/dph on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eta = BL.frame()[3] ; eta" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla(eta.down(g)).symmetrize() == 0" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Principal null vectors\n", "\n", "Let $k$ be the null vector tangent to the ingoing principal null geodesics associated\n", "with their affine parameter $-r$; the expression of $k$ in term of the 3+1 ingoing Kerr coordinates $(\\tilde{t}, r, \\theta, \\tilde\\phi)$ is \n", "$$k = \\frac{\\partial}{\\partial\\tilde{t}} - \\frac{\\partial}{\\partial\\tilde{r}} $$\n", "The expression of $k$ in terms of the Boyer-Lindquist coordinates is" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "k = (a^2 + r^2)/(a^2 - 2*m*r + r^2) d/dt - d/dr + a/(a^2 - 2*m*r + r^2) d/dph" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = M.vector_field(name='k')\n", "k[:] = [(r^2 + a^2)/Delta, -1, 0, a/Delta]\n", "k.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regarding the null vector tangent to the outgoing principal null geodesics, we select\n", "one associated with a (non-affine) parameter $\\lambda$ that is regular accross the two Killing horizons:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "el = 1/2 d/dt + 1/2*(a^2 - 2*m*r + r^2)/(a^2 + r^2) d/dr + 1/2*a/(a^2 + r^2) d/dph" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "el = M.vector_field(name='el', latex_name=r'\\ell')\n", "el[:] = [1/2, Delta/(2*(r^2+a^2)), 0, a/(2*(r^2+a^2))]\n", "el.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $k$ and $\\ell$ are null vectors:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(k,k).expr()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(el,el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Their scalar product is $-\\rho^2/(r^2 + a^2)$:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^2*cos(th)^2 + r^2)/(a^2 + r^2)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(k,el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the scalar product (with respect to metric $g$) can also be computed by means of the method `dot`:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^2*cos(th)^2 + r^2)/(a^2 + r^2)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k.dot(el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $k$ is a geodesic vector, i.e. that it obeys $\\nabla_k k = 0$:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_k = nabla(k).contract(k)\n", "acc_k.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We check that $\\ell$ is a pregeodesic vector, i.e. that $\\nabla_\\ell \\ell = \\kappa_\\ell \\ell$ for some scalar field $\\kappa_\\ell$:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/2*(a^2*m - m*r^2)/(a^4 + 2*a^2*r^2 + r^4) d/dt - 1/2*(a^4*m - 2*a^2*m^2*r + 2*m^2*r^3 - m*r^4)/(a^6 + 3*a^4*r^2 + 3*a^2*r^4 + r^6) d/dr - 1/2*(a^3*m - a*m*r^2)/(a^6 + 3*a^4*r^2 + 3*a^2*r^4 + r^6) d/dph" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_l = nabla(el).contract(el)\n", "acc_l.display()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "M --> R\n", "(t, r, th, ph) |--> -(a^2*m - m*r^2)/(a^4 + 2*a^2*r^2 + r^4)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kappa_l = acc_l[[0]] / el[[0]]\n", "kappa_l.display()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_l == kappa_l * el" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Walker-Penrose Killing tensor\n", "\n", "We need the 1-forms associated to $k$ and $\\ell$ by metric duality:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "uk = k.down(g)\n", "ul = el.down(g)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-dt - (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) dr + (2*a^3*m*r*sin(th)^4 - (2*a^3*m*r - a^3*r^2 + 2*a*m*r^3 - a*r^4 - (a^5 + a^3*r^2)*cos(th)^2)*sin(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2) dph" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uk.display()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(2*a^3*m*r*sin(th)^4 - (2*a^3*m*r - a^3*r^2 + 2*a*m*r^3 - a*r^4 - (a^5 + a^3*r^2)*cos(th)^2)*sin(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uk[3]" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(a^4*cos(th)^2 + a^2*r^2*cos(th)^2 + 2*a^2*m*r*sin(th)^2 - 2*a^2*m*r + a^2*r^2 - 2*m*r^3 + r^4)*a*sin(th)^2/((a^2*cos(th)^2 + r^2)*(a^2 - 2*m*r + r^2))" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uk[3].factor()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uk[3] == a*sin(th)^2" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "uk[3] = a*sin(th)^2" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-dt - (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) dr + a*sin(th)^2 dph" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uk.display()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/2*(a^2 - 2*m*r + r^2)/(a^2 + r^2) dt + 1/2*(a^2*cos(th)^2 + r^2)/(a^2 + r^2) dr + 1/2*(2*a^3*m*r*sin(th)^4 - (2*a^3*m*r - a^3*r^2 + 2*a*m*r^3 - a*r^4 - (a^5 + a^3*r^2)*cos(th)^2)*sin(th)^2)/(a^2*r^2 + r^4 + (a^4 + a^2*r^2)*cos(th)^2) dph" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ul.display()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1/2*(a^4*cos(th)^2 + a^2*r^2*cos(th)^2 + 2*a^2*m*r*sin(th)^2 - 2*a^2*m*r + a^2*r^2 - 2*m*r^3 + r^4)*a*sin(th)^2/((a^2*cos(th)^2 + r^2)*(a^2 + r^2))" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ul[3].factor()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ul[3] == a*sin(th)^2*(a^2 + r^2 - 2*m*r)/(2*(a^2 + r^2))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "ul[3] = a*sin(th)^2*(a^2 + r^2 - 2*m*r)/(2*(a^2 + r^2))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1/2*(a^2 - 2*m*r + r^2)/(a^2 + r^2) dt + 1/2*(a^2*cos(th)^2 + r^2)/(a^2 + r^2) dr + 1/2*(a^2 - 2*m*r + r^2)*a*sin(th)^2/(a^2 + r^2) dph" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ul.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Walker-Penrose Killing tensor $K$ is then formed as\n", "$$ K = (r^2 + a^2) (\\underline{\\ell}\\otimes \\underline{k} + (\\underline{k}\\otimes \\underline{\\ell}) + r^2 g $$" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms K on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "K = 2*((r^2 + a^2)*(ul*uk)).symmetrize() + r^2*g\n", "K.set_name('K')\n", "print(K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The non-vanishing components of $K$:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "K_t,t = (a^2*r^2 + (a^4 - 2*a^2*m*r)*cos(th)^2)/(a^2*cos(th)^2 + r^2) \n", "K_t,ph = -(a^3*r^2 + a*r^4 + (a^5 - 2*a^3*m*r + a^3*r^2)*cos(th)^2)*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "K_r,r = -(a^4*cos(th)^4 + a^2*r^2*cos(th)^2)/(a^2 - 2*m*r + r^2) \n", "K_th,th = a^2*r^2*cos(th)^2 + r^4 \n", "K_ph,t = -(a^3*r^2 + a*r^4 + (a^5 - 2*a^3*m*r + a^3*r^2)*cos(th)^2)*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "K_ph,ph = -((a^6 - 2*a^4*m*r + a^4*r^2)*sin(th)^6 - (a^6 - 2*a^4*m*r + a^4*r^2)*sin(th)^4 - (a^4*r^2 + 2*a^2*r^4 + r^6)*sin(th)^2)/(a^2*cos(th)^2 + r^2) " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We may simplify a little bit some components:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^4*cos(th)^2 - 2*a^2*m*r*cos(th)^2 + a^2*r^2*cos(th)^2 + a^2*r^2 + r^4)*a*sin(th)^2/(a^2*cos(th)^2 + r^2)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K[0,3].factor()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K[0,3] == - a*sin(th)^2*(r^2 + a^2 - 2*m*r*a^2*cos(th)^2/rho2)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "K[0, 3] = - a*sin(th)^2*(r^2 + a^2 - 2*m*r*a^2*cos(th)^2/rho2)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^2*cos(th)^2 + r^2)*a^2*cos(th)^2/(a^2 - 2*m*r + r^2)" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K[1,1].factor()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K[3,3] == sin(th)^2 * (r^2*(r^2 + a^2) \n", " + a^2*sin(th)^2*(r^2 + a^2 - 2*m*r/rho2*a^2*cos(th)^2))" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "K[3,3] = sin(th)^2 * (r^2*(r^2 + a^2) \n", " + a^2*sin(th)^2*(r^2 + a^2 - 2*m*r/rho2*a^2*cos(th)^2))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "K_t,t = (a^2*r^2 + (a^4 - 2*a^2*m*r)*cos(th)^2)/(a^2*cos(th)^2 + r^2) \n", "K_t,ph = (2*a^2*m*r*cos(th)^2/(a^2*cos(th)^2 + r^2) - a^2 - r^2)*a*sin(th)^2 \n", "K_r,r = -(a^2*cos(th)^2 + r^2)*a^2*cos(th)^2/(a^2 - 2*m*r + r^2) \n", "K_th,th = a^2*r^2*cos(th)^2 + r^4 \n", "K_ph,t = (2*a^2*m*r*cos(th)^2/(a^2*cos(th)^2 + r^2) - a^2 - r^2)*a*sin(th)^2 \n", "K_ph,ph = -((2*a^2*m*r*cos(th)^2/(a^2*cos(th)^2 + r^2) - a^2 - r^2)*a^2*sin(th)^2 - (a^2 + r^2)*r^2)*sin(th)^2 " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K.display_comp()" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field nabla_g(K) of type (0,3) on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "DK = nabla(K)\n", "print(DK)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "nabla_g(K)_t,r,ph = a*r*sin(th)^2 \n", "nabla_g(K)_t,th,ph = (a^3 - 2*a*m*r + a*r^2)*cos(th)*sin(th) \n", "nabla_g(K)_t,ph,r = -a*r*sin(th)^2 \n", "nabla_g(K)_t,ph,th = -(a^3 - 2*a*m*r + a*r^2)*cos(th)*sin(th) \n", "nabla_g(K)_r,t,ph = a*r*sin(th)^2 \n", "nabla_g(K)_r,r,th = 2*(a^4*cos(th)^3 + a^2*r^2*cos(th))*sin(th)/(a^2 - 2*m*r + r^2) \n", "nabla_g(K)_r,th,r = -(a^4*cos(th)^3 + a^2*r^2*cos(th))*sin(th)/(a^2 - 2*m*r + r^2) \n", "nabla_g(K)_r,th,th = -a^2*r*cos(th)^2 - r^3 \n", "nabla_g(K)_r,ph,ph = -(a^2*r + r^3)*sin(th)^2 \n", "nabla_g(K)_th,t,ph = (a^3 - 2*a*m*r + a*r^2)*cos(th)*sin(th) \n", "nabla_g(K)_th,r,r = -(a^4*cos(th)^3 + a^2*r^2*cos(th))*sin(th)/(a^2 - 2*m*r + r^2) \n", "nabla_g(K)_th,r,th = -a^2*r*cos(th)^2 - r^3 \n", "nabla_g(K)_th,th,r = 2*a^2*r*cos(th)^2 + 2*r^3 \n", "nabla_g(K)_th,ph,ph = -(a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)*sin(th)^3 \n", "nabla_g(K)_ph,t,r = -a*r*sin(th)^2 \n", "nabla_g(K)_ph,t,th = -(a^3 - 2*a*m*r + a*r^2)*cos(th)*sin(th) \n", "nabla_g(K)_ph,r,ph = -(a^2*r + r^3)*sin(th)^2 \n", "nabla_g(K)_ph,th,ph = -(a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)*sin(th)^3 \n", "nabla_g(K)_ph,ph,r = 2*(a^2*r + r^3)*sin(th)^2 \n", "nabla_g(K)_ph,ph,th = 2*(a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)*sin(th)^3 " ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DK.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $K$ is a Killing tensor:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DK.symmetrize().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Equivalently, we may write, using index notation:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DK['_(abc)'].display()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "p = pt d/dt + pr d/dr + pth d/dth + pph d/dph" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pt = var('pt', latex_name=r'p^t')\n", "pr = var('pr', latex_name=r'p^r')\n", "pth = var('pth', latex_name=r'p^\\theta')\n", "pph = var('pph', latex_name=r'p^\\phi')\n", "p = M.vector_field(name='p')\n", "p[:] = [pt, pr, pth, pph]\n", "p.display()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^6*pr^2*cos(th)^6 - a^2*pth^2*r^6 + 2*m*pth^2*r^7 - pth^2*r^8 - a^4*pt^2*r^2 + 2*a^2*m*pt^2*r^3 - a^2*pt^2*r^4 + (a^8*pph^2 - 4*a^6*m*pph^2*r - 4*a^4*m*pph^2*r^3 + a^4*pph^2*r^4 + 2*(a^6 + 2*a^4*m^2)*pph^2*r^2)*sin(th)^6 + (2*a^4*m*pth^2*r^3 - a^4*pth^2*r^4 - (a^6*pth^2 - 2*a^4*pr^2)*r^2)*cos(th)^4 - (a^8*pph^2 - 4*a^6*m*pph^2*r - 4*a^4*m*pph^2*r^3 + a^4*pph^2*r^4 + 2*(a^6 + 2*a^4*m^2)*pph^2*r^2)*sin(th)^4 + (4*a^2*m*pth^2*r^5 - 2*a^2*pth^2*r^6 - a^6*pt^2 + 4*a^4*m*pt^2*r + 2*a^2*m*pt^2*r^3 - (a^4 + 4*a^2*m^2)*pt^2*r^2 - (2*a^4*pth^2 - a^2*pr^2)*r^4)*cos(th)^2 + (2*m*pph^2*r^7 - pph^2*r^8 - (3*a^2*pph^2 - 2*a*pph*pt)*r^6 + 4*(a^2*m*pph^2 - a*m*pph*pt)*r^5 - (3*a^4*pph^2 - 4*a^3*pph*pt)*r^4 + 2*(a^4*m*pph^2 - 2*a^3*m*pph*pt)*r^3 - (a^6*pph^2 - 2*a^5*pph*pt)*r^2 + 2*(a^7*pph*pt - 4*a^5*m*pph*pt*r - 4*a^3*m*pph*pt*r^3 + a^3*pph*pt*r^4 + 2*(a^5 + 2*a^3*m^2)*pph*pt*r^2)*cos(th)^2)*sin(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K(p, p).expr()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^6*pr^2*cos(th)^6 - a^2*pth^2*r^6 + 2*m*pth^2*r^7 - pth^2*r^8 - a^4*pt^2*r^2 + 2*a^2*m*pt^2*r^3 - a^2*pt^2*r^4 + (a^8*pph^2 - 4*a^6*m*pph^2*r - 4*a^4*m*pph^2*r^3 + a^4*pph^2*r^4 + 2*(a^6 + 2*a^4*m^2)*pph^2*r^2)*sin(th)^6 + (2*a^4*m*pth^2*r^3 - a^4*pth^2*r^4 - (a^6*pth^2 - 2*a^4*pr^2)*r^2)*cos(th)^4 - (a^8*pph^2 - 4*a^6*m*pph^2*r - 4*a^4*m*pph^2*r^3 + a^4*pph^2*r^4 + 2*(a^6 + 2*a^4*m^2)*pph^2*r^2)*sin(th)^4 + (4*a^2*m*pth^2*r^5 - 2*a^2*pth^2*r^6 - a^6*pt^2 + 4*a^4*m*pt^2*r + 2*a^2*m*pt^2*r^3 - (a^4 + 4*a^2*m^2)*pt^2*r^2 - (2*a^4*pth^2 - a^2*pr^2)*r^4)*cos(th)^2 + (2*m*pph^2*r^7 - pph^2*r^8 - (3*a^2*pph^2 - 2*a*pph*pt)*r^6 + 4*(a^2*m*pph^2 - a*m*pph*pt)*r^5 - (3*a^4*pph^2 - 4*a^3*pph*pt)*r^4 + 2*(a^4*m*pph^2 - 2*a^3*m*pph*pt)*r^3 - (a^6*pph^2 - 2*a^5*pph*pt)*r^2 + 2*(a^7*pph*pt - 4*a^5*m*pph*pt*r - 4*a^3*m*pph*pt*r^3 + a^3*pph*pt*r^4 + 2*(a^5 + 2*a^3*m^2)*pph*pt*r^2)*cos(th)^2)*sin(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = K(p, p).expr()\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Metric dual of the Killing tensor ($K^{ab}$)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field uK of type (2,0) on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "uK = K.up(g)\n", "uK.set_name('uK', latex_name=r'\\hat{K}')\n", "print(uK)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "uK^t,t = (a^6 + 2*a^4*r^2 + a^2*r^4 - (a^6 + a^4*r^2 + 2*a^2*m*r^3)*sin(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2) \n", "uK^t,ph = (a^3*r^2 - 2*a*m*r^3 + a*r^4 + (a^5 + a^3*r^2)*cos(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2) \n", "uK^r,r = -(a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2/(a^2*cos(th)^2 + r^2) \n", "uK^th,th = r^2/(a^2*cos(th)^2 + r^2) \n", "uK^ph,t = (a^3*r^2 - 2*a*m*r^3 + a*r^4 + (a^5 + a^3*r^2)*cos(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2) \n", "uK^ph,ph = (a^4*sin(th)^4 - a^4*sin(th)^2 - a^2*r^2 + 2*m*r^3 - r^4)/((a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^4 - a^2*r^2 + 2*m*r^3 - r^4 - (a^4 - 2*a^2*m*r + 2*m*r^3 - r^4)*cos(th)^2) " ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK.display_comp()" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK[0,0] == a^2/Delta*(r^2 + a^2 - 2*m*r^3*sin(th)^2/rho2)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "uK[0,0] = a^2/Delta*(r^2 + a^2 - 2*m*r^3*sin(th)^2/rho2)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK[0,3] == a/Delta*(r^2 + a^2 - 2*m*r^3/rho2)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "uK[0,3] = a/Delta*(r^2 + a^2 - 2*m*r^3/rho2)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK[1,1] == - Delta*a^2*cos(th)^2/rho2" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "uK[1,1] = - Delta*a^2*cos(th)^2/rho2" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK[3,3] == (a^2 + r^2/sin(th)^2*(1 - 2*m*r/rho2))/Delta" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "uK[3,3] = (a^2 + r^2/sin(th)^2*(1 - 2*m*r/rho2))/Delta" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "uK^t,t = -(2*m*r^3*sin(th)^2/(a^2*cos(th)^2 + r^2) - a^2 - r^2)*a^2/(a^2 - 2*m*r + r^2) \n", "uK^t,ph = -(2*m*r^3/(a^2*cos(th)^2 + r^2) - a^2 - r^2)*a/(a^2 - 2*m*r + r^2) \n", "uK^r,r = -(a^2 - 2*m*r + r^2)*a^2*cos(th)^2/(a^2*cos(th)^2 + r^2) \n", "uK^th,th = r^2/(a^2*cos(th)^2 + r^2) \n", "uK^ph,t = (a^3*r^2 - 2*a*m*r^3 + a*r^4 + (a^5 + a^3*r^2)*cos(th)^2)/(a^2*r^2 - 2*m*r^3 + r^4 + (a^4 - 2*a^2*m*r + a^2*r^2)*cos(th)^2) \n", "uK^ph,ph = (a^2 - (2*m*r/(a^2*cos(th)^2 + r^2) - 1)*r^2/sin(th)^2)/(a^2 - 2*m*r + r^2) " ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uK.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Killing tensor leading directly to Carter constant Q" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We introduce first the Killing vector $V := \\eta + a \\xi$:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "a d/dt + d/dph" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V = eta + a*xi\n", "V.display()" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a*r^2 + (a^3 - 2*a*m*r)*cos(th)^2)/(a^2*cos(th)^2 + r^2) dt + (2*a^2*m*r*sin(th)^4 - (2*a^2*m*r - a^2*r^2 - r^4 - (a^4 + a^2*r^2)*cos(th)^2)*sin(th)^2)/(a^2*cos(th)^2 + r^2) dph" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V_form = V.down(g)\n", "V_form.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and form the Killing tensor \n", "$$\\tilde{K} = K - \\underline{V}\\otimes\\underline{V}$$" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "tK_t,t = 2*(a^2*m*r^3*cos(th)^2 + (a^4*m*r - 2*a^2*m^2*r^2)*cos(th)^4)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) \n", "tK_t,ph = 2*((a^5*m*r - 2*a^3*m^2*r^2 + a^3*m*r^3)*cos(th)^6 - (a^5*m*r - 2*a^3*m^2*r^2 - a*m*r^5)*cos(th)^4 - (a^3*m*r^3 + a*m*r^5)*cos(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) \n", "tK_r,r = -(a^2*cos(th)^2 + r^2)*a^2*cos(th)^2/(a^2 - 2*m*r + r^2) \n", "tK_th,th = a^2*r^2*cos(th)^2 + r^4 \n", "tK_ph,t = 2*((a^5*m*r - 2*a^3*m^2*r^2 + a^3*m*r^3)*cos(th)^6 - (a^5*m*r - 2*a^3*m^2*r^2 - a*m*r^5)*cos(th)^4 - (a^3*m*r^3 + a*m*r^5)*cos(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) \n", "tK_ph,ph = ((2*a^6*m*r + 4*a^4*m*r^3 - a^4*r^4 - (a^6 + 4*a^4*m^2)*r^2)*cos(th)^8 - (4*a^6*m*r + 6*a^4*m*r^3 + a^4*r^4 - 4*a^2*m*r^5 + 2*a^2*r^6 - (a^6 + 8*a^4*m^2)*r^2)*cos(th)^6 + (2*a^6*m*r - 4*a^4*m^2*r^2 + 2*a^4*r^4 - 8*a^2*m*r^5 + a^2*r^6 - r^8)*cos(th)^4 + (2*a^4*m*r^3 + 4*a^2*m*r^5 + a^2*r^6 + r^8)*cos(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) " ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K2 = K - V_form*V_form\n", "K2.set_name('tK', latex_name=r'\\tilde{K}')\n", "K2.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $\\tilde{K}$ is indeed a Killing tensor:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla(K2).symmetrize().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We check that\n", "$$ \\tilde{K}^{\\alpha\\beta} = - a^2 \\cos^2 \\theta \\, g^{\\alpha\\beta} \n", " + \\mathrm{diag}(-a^2\\cos^2\\theta, 0, 1, \\tan^{-2}\\theta)^{\\alpha\\beta}$$ " ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ -a^2*cos(th)^2 0 0 0]\n", "[ 0 0 0 0]\n", "[ 0 0 1 0]\n", "[ 0 0 0 cos(th)^2/sin(th)^2]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "T = K2 + (a^2*cos(th)^2)*g\n", "uT = T.up(g)\n", "uT[:]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.1.rc1", "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 }