#!/usr/bin/env python # coding: utf-8 # # Killing-Yano form and Killing tensor in Kerr off shell # This [SageMath](https://www.sagemath.org/) notebook accompanies the article *Black hole photon ring beyond General Relativity: an integrable parametrization* by J. Ben Achour, E. Gourgoulhon and H. Roussille, [arXiv:2506.09882](https://arxiv.org/abs/2506.09882). The notebook makes use of tools developed # developed through the [SageManifolds project](https://sagemanifolds.obspm.fr). # In[1]: sage.version.banner # In[2]: get_ipython().run_line_magic('display', 'latex') # ## Spacetime manifold # In[3]: M = Manifold(4, 'M', structure='Lorentzian') # In[4]: X. = M.chart(r'tau:\tau r y phi:(0,2*pi):\varphi') X # In[5]: dtau, dr, dy, dphi = X.coframe()[:] dtau, dr, dy, dphi # Let us introduce two basic 1-forms: # In[6]: om1 = dtau + y^2*dphi om1.set_name('om1', latex_name=r'\omega_1') om1.display() # In[7]: om2 = dtau - r^2*dphi om2.set_name('om2', latex_name=r'\omega_2') om2.display() # ## Metric tensor # In[8]: Sigma = r^2 + y^2 Dr = function('Dr', latex_name=r'\Delta_r') Dy = function('Dy', latex_name=r'\Delta_y') # In[9]: g = M.metric() g.set( - Dr(r)/Sigma*(om1*om1) + Dy(y)/Sigma*(om2*om2) + Sigma/Dr(r)*(dr*dr) + Sigma/Dy(y)*(dy*dy) ) g.display() # In[10]: g.inverse().display() # ## Levi-Civita connection # In[11]: nabla = g.connection() nabla.display(only_nonredundant=True) # ## Conformal Killing-Yano 2-form $p$ # In[12]: p = y*dy.wedge(om2) - r*dr.wedge(om1) p.set_name('p') p.display() # $p$ is a closed 2-form: # In[13]: diff(p).display() # The covariant derivative of $p$: # In[14]: nab_p = nabla(p) nab_p.display() # The 1-form $h_a = \frac{1}{3} \nabla_b p^b_{\ \, a}$ (note that we taking the trace on the indices 0 and 2, i.e. first and last, because # $\nabla_c p^b_{\ \, a} = (\nabla p^\sharp)^b_{\ \, ac}$): # In[15]: h = 1/3*nab_p.up(g,0).trace(0,2) h.set_name('h') h.display() # Let us check that $p$ satisfies the **conformal Killing-Yano equation**, taking into account that $\nabla_c p_{ab} =(\nabla p)_{abc}$, # In[16]: nab_p == -2*(h*g).antisymmetrize(0,1) # ## Killing-Yano 2-form $f$ # $f$ is obtained as the Hodge dual of $p$: # In[17]: f = p.hodge_dual(g) f.set_name('f') f.display() # Check that $f$ obeys the **Killing-Yano equation**, i.e. $\nabla_{(a} f_{b)c} = 0$ # In[18]: nab_f = nabla(f) nab_f.symmetrize(0,2).display() # Equivalently, we have $\nabla_{[a} f_{bc]} = \nabla_{a} f_{bc}$: # In[19]: nab_f.antisymmetrize() == nab_f # Note that, contrary to $p$, $f$ is not a closed 2-form: # In[20]: diff(f).display() # ## Killing tensor $K$ # We define $K$ as the square of $f$, i.e. $K_{ab} = f_{ac} f_b^{\ \, c}$: # In[21]: K = f['_ac']*f.up(g,1)['_b^c'] K.set_name('K') K.display() # Check of Eq. (1.9) of the article: # In[22]: K == (y^2/Sigma*Dr(r)*om1*om1 + r^2/Sigma*Dy(y)*om2*om2 + Sigma*r^2/Dy(y)*dy*dy - Sigma*y^2/Dr(r)*dr*dr) # Let us check that $K$ obeys the **Killing equation**, namely # $$ \nabla_{(a} K_{bc)} = 0$$ # In[23]: nabla(K).symmetrize().display()