{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kerr spacetime in Kerr coordinates\n",
"\n",
"This Jupyter/SageMath worksheet is relative to the lectures\n",
"[Geometry and physics of black holes](https://luth.obspm.fr/~luthier/gourgoulhon/bh16/)\n",
"\n",
"These computations are based on tools developed through the [SageManifolds](http://sagemanifolds.obspm.fr) project.\n",
"\n",
"*NB:* a version of SageMath at least equal to 8.2 is required to run this worksheet: "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'SageMath version 8.9.beta4, Release Date: 2019-07-28'"
]
},
"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 formatting:"
]
},
{
"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\n",
"\n",
"We declare the spacetime manifold $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', structure='Lorentzian')\n",
"print(M)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and the Kerr coordinates $(v,r,\\theta,\\phi)$ as a chart on $M$:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Chart (M, (v, r, th, ph))"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X. = M.chart(r'v r th:(0,pi):\\theta ph:(0,2*pi):\\phi')\n",
"X"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"v: (-oo, +oo); r: (-oo, +oo); th: (0, pi); ph: (0, 2*pi)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X.coord_range()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Kerr parameters $m$ and $a$:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"m = var('m', domain='real')\n",
"assume(m>0)\n",
"a = var('a', domain='real')\n",
"assume(a>=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Kerr metric\n",
"\n",
"We define the metric $g$ by its components w.r.t. the Kerr coordinates:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"g = (2*m*r/(a^2*cos(th)^2 + r^2) - 1) dv*dv + dv*dr - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dv*dph + dr*dv - a*sin(th)^2 dr*dph + (a^2*cos(th)^2 + r^2) dth*dth - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dph*dv - a*sin(th)^2 dph*dr + (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": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g = M.metric()\n",
"rho2 = r^2 + (a*cos(th))^2\n",
"g[0,0] = -(1 - 2*m*r/rho2)\n",
"g[0,1] = 1\n",
"g[0,3] = -2*a*m*r*sin(th)^2/rho2\n",
"g[1,3] = -a*sin(th)^2\n",
"g[2,2] = 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": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"g_v,v = 2*m*r/(a^2*cos(th)^2 + r^2) - 1 \n",
"g_v,r = 1 \n",
"g_v,ph = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n",
"g_r,v = 1 \n",
"g_r,ph = -a*sin(th)^2 \n",
"g_th,th = a^2*cos(th)^2 + r^2 \n",
"g_ph,v = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n",
"g_ph,r = -a*sin(th)^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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.display_comp()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The inverse metric is pretty simple:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"[ a^2*sin(th)^2/(a^2*cos(th)^2 + r^2) (a^2 + r^2)/(a^2*cos(th)^2 + r^2) 0 a/(a^2*cos(th)^2 + r^2)]\n",
"[ (a^2 + r^2)/(a^2*cos(th)^2 + r^2) (a^2 - 2*m*r + r^2)/(a^2*cos(th)^2 + r^2) 0 a/(a^2*cos(th)^2 + r^2)]\n",
"[ 0 0 1/(a^2*cos(th)^2 + r^2) 0]\n",
"[ a/(a^2*cos(th)^2 + r^2) a/(a^2*cos(th)^2 + r^2) 0 -1/(a^2*sin(th)^4 - (a^2 + r^2)*sin(th)^2)]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.inverse()[:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"as well as the determinant w.r.t. to the Kerr coordinates:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"M --> R\n",
"(v, r, th, ph) |--> a^4*cos(th)^6 - (a^4 - 2*a^2*r^2)*cos(th)^4 - r^4 - (2*a^2*r^2 - r^4)*cos(th)^2"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.determinant().display()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"True"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.determinant() == - (rho2*sin(th))^2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let us check that we are dealing with a solution of the Einstein equation in vacuum:"
]
},
{
"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": [
"The Christoffel symbols w.r.t. the Kerr coordinates:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"0"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.ricci()[0,0]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Gam^v_v,v = -(a^4*m - m*r^4 - (a^4*m + a^2*m*r^2)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^v_v,th = -2*a^2*m*r*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) \n",
"Gam^v_v,ph = -((a^5*m + a^3*m*r^2)*sin(th)^4 - (a^5*m - a*m*r^4)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^v_r,th = -a^2*cos(th)*sin(th)/(a^2*cos(th)^2 + r^2) \n",
"Gam^v_r,ph = a*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n",
"Gam^v_th,th = -(a^2*r + r^3)/(a^2*cos(th)^2 + r^2) \n",
"Gam^v_th,ph = -2*(a^5*m*r*cos(th)*sin(th)^5 - (a^5*m*r + a^3*m*r^3)*cos(th)*sin(th)^3)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^v_ph,ph = ((a^4*m*r^2 + a^2*m*r^4 - (a^6*m + a^4*m*r^2)*cos(th)^2)*sin(th)^4 - (a^2*r^5 + r^7 + (a^6*r + a^4*r^3)*cos(th)^4 + 2*(a^4*r^3 + a^2*r^5)*cos(th)^2)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^r_v,v = (a^2*m*r^2 - 2*m^2*r^3 + m*r^4 - (a^4*m - 2*a^2*m^2*r + a^2*m*r^2)*cos(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^r_v,r = (a^2*m*cos(th)^2 - m*r^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) \n",
"Gam^r_v,ph = -(a^3*m*r^2 - 2*a*m^2*r^3 + a*m*r^4 - (a^5*m - 2*a^3*m^2*r + a^3*m*r^2)*cos(th)^2)*sin(th)^2/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^r_r,th = -a^2*cos(th)*sin(th)/(a^2*cos(th)^2 + r^2) \n",
"Gam^r_r,ph = ((a^5*m*cos(th)^2 + a^5*m)*sin(th)^4 + (a^5*r*cos(th)^4 + 2*a^3*r^3*cos(th)^2 - a^5*m + a*m*r^4 + a*r^5)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^r_th,th = -(a^2*r - 2*m*r^2 + r^3)/(a^2*cos(th)^2 + r^2) \n",
"Gam^r_ph,ph = ((a^4*m*r^2 - 2*a^2*m^2*r^3 + a^2*m*r^4 - (a^6*m - 2*a^4*m^2*r + a^4*m*r^2)*cos(th)^2)*sin(th)^4 - (a^2*r^5 - 2*m*r^6 + r^7 + (a^6*r - 2*a^4*m*r^2 + a^4*r^3)*cos(th)^4 + 2*(a^4*r^3 - 2*a^2*m*r^4 + a^2*r^5)*cos(th)^2)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^th_v,v = -2*a^2*m*r*cos(th)*sin(th)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^th_v,ph = 2*(a^3*m*r + a*m*r^3)*cos(th)*sin(th)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^th_r,th = r/(a^2*cos(th)^2 + r^2) \n",
"Gam^th_r,ph = a*cos(th)*sin(th)/(a^2*cos(th)^2 + r^2) \n",
"Gam^th_th,th = -a^2*cos(th)*sin(th)/(a^2*cos(th)^2 + r^2) \n",
"Gam^th_ph,ph = -((a^6 - 2*a^4*m*r + a^4*r^2)*cos(th)^5 + 2*(a^4*r^2 - 2*a^2*m*r^3 + a^2*r^4)*cos(th)^3 + (2*a^4*m*r + 4*a^2*m*r^3 + a^2*r^4 + r^6)*cos(th))*sin(th)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^ph_v,v = -(a^3*m*cos(th)^2 - a*m*r^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^ph_v,th = -2*a*m*r*cos(th)/((a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)*sin(th)) \n",
"Gam^ph_v,ph = (a^4*m*cos(th)^2 - a^2*m*r^2)*sin(th)^2/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) \n",
"Gam^ph_r,th = -a*cos(th)/((a^2*cos(th)^2 + r^2)*sin(th)) \n",
"Gam^ph_r,ph = r/(a^2*cos(th)^2 + r^2) \n",
"Gam^ph_th,th = -a*r/(a^2*cos(th)^2 + r^2) \n",
"Gam^ph_th,ph = (a^4*cos(th)^5 - 2*(a^2*m*r - a^2*r^2)*cos(th)^3 + (2*a^2*m*r + r^4)*cos(th))/((a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)*sin(th)) \n",
"Gam^ph_ph,ph = -((a^5*m*cos(th)^2 - a^3*m*r^2)*sin(th)^4 + (a^5*r*cos(th)^4 + 2*a^3*r^3*cos(th)^2 + a*r^5)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.christoffel_symbols_display()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vector normal to the hypersurfaces $r=\\mathrm{const}$"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1-form dr on the 4-dimensional Lorentzian manifold M\n"
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"dr = dr"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dr = X.coframe()[1]\n",
"print(dr)\n",
"dr.display()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Vector field on the 4-dimensional Lorentzian manifold M\n"
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"(a^2 + r^2)/(a^2*cos(th)^2 + r^2) d/dv + (a^2 - 2*m*r + r^2)/(a^2*cos(th)^2 + r^2) d/dr + a/(a^2*cos(th)^2 + r^2) d/dph"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nr = dr.up(g)\n",
"print(nr)\n",
"nr.display()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"m + sqrt(-a^2 + m^2)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"assume(a^2