This worksheet demonstrates a few capabilities of SageManifolds (version 1.0, as included in SageMath 7.5) in computations regarding the Curzon-Chazy spacetime. It implements the computation of the Simon-Mars tensor of Curzon-Chazy spacetime used in the article arXiv:1412.6542.
Click here to download the worksheet file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command sage -n jupyter
NB: a version of SageMath at least equal to 7.5 is required to run this worksheet:
version()
'SageMath version 7.5.1, Release Date: 2017-01-15'
First we set up the notebook to display mathematical objects using LaTeX rendering:
%display latex
We declare the Curzon-Chazy spacetime as a 4-dimensional manifold:
M = Manifold(4, 'M', latex_name=r'\mathcal{M}')
print(M)
4-dimensional differentiable manifold M
We introduce the coordinates $(t,r,y,\phi)$ with $y$ related to the standard Weyl-Papapetrou coordinates $(t,r,\theta,\phi)$ by $y=\cos\theta$:
X.<t,r,y,ph> = M.chart(r't r:(0,+oo) y:(-1,1) ph:(0,2*pi):\phi')
print(X) ; X
Chart (M, (t, r, y, ph))
We declare the only parameter of the Curzon-Chazy spacetime, which is the mass $m$ as a symbolic variable:
var('m')
Without any loss of generality, we set $m$ to some specific value (this amounts simply to fixing some length scale):
m = 12
Let us introduce the spacetime metric $g$ and set its components in the coordinate frame associated with Weyl-Papapetrou coordinates:
g = M.lorentzian_metric('g')
g[0,0] = - exp(-2*m/r)
g[1,1] = exp(2*m/r-m^2*(1-y^2)/r^2)
g[2,2] = exp(2*m/r-m^2*(1-y^2)/r^2)*r^2/(1-y^2)
g[3,3] = exp(2*m/r)*r^2*(1-y^2)
g[:]
The Levi-Civita connection $\nabla$ associated with $g$:
nab = g.connection() ; print(nab)
Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional differentiable manifold M
As a check, we verify that the covariant derivative of $g$ with respect to $\nabla$ vanishes identically:
nab(g).display()
The default vector frame on the spacetime manifold is the coordinate basis associated with Weyl-Papapetrou coordinates:
M.default_frame() is X.frame()
X.frame()
Let us consider the first vector field of this frame:
xi = X.frame()[0] ; xi
print(xi)
Vector field d/dt on the 4-dimensional differentiable manifold M
The 1-form associated to it by metric duality is
xi_form = xi.down(g)
xi_form.set_name('xi_form', r'\underline{\xi}')
print(xi_form) ; xi_form.display()
1-form xi_form on the 4-dimensional differentiable manifold M
Its covariant derivative is
nab_xi = nab(xi_form)
print(nab_xi) ; nab_xi.display()
Tensor field nabla_g(xi_form) of type (0,2) on the 4-dimensional differentiable manifold M
Let us check that the Killing equation is satisfied:
nab_xi.symmetrize().display()
Equivalently, we check that the Lie derivative of the metric along $\xi$ vanishes:
g.lie_der(xi).display()
Thank to Killing equation, $\nabla_g \underline{\xi}$ is antisymmetric. We may therefore define a 2-form by $F := - \nabla_g \xi$. Here we enforce the antisymmetry by calling the function antisymmetrize() on nab_xi:
F = - nab_xi.antisymmetrize()
F.set_name('F')
print(F)
F.display()
2-form F on the 4-dimensional differentiable manifold M
We check that
F == - nab_xi
The squared norm of the Killing vector is
lamb = - g(xi,xi)
lamb.set_name('lambda', r'\lambda')
print(lamb)
lamb.display()
Scalar field lambda on the 4-dimensional differentiable manifold M
Instead of invoking $g(\xi,\xi)$, we could have evaluated $\lambda$ by means of the 1-form $\underline{\xi}$ acting on the vector field $\xi$:
lamb == - xi_form(xi)
or we could have used index notation in the form $\lambda = - \xi_a \xi^a$:
lamb == - ( xi_form['_a']*xi['^a'] )
The Riemann curvature tensor associated with $g$ is
Riem = g.riemann()
print(Riem)
Tensor field Riem(g) of type (1,3) on the 4-dimensional differentiable manifold M
The component $R^0_{\ \, 101} = R^t_{\ \, rtr}$ is
Riem[0,1,0,1]
while the component $R^2_{\ \, 323} = R^y_{\ \, \phi y \phi}$ is
Riem[2,3,2,3]
All the non-vanishing components of the Riemann tensor, taking into account the antisymmetry on the last two indices:
Riem.display_comp(only_nonredundant=True)
The Ricci tensor:
Ric = g.ricci()
print(Ric)
Field of symmetric bilinear forms Ric(g) on the 4-dimensional differentiable manifold M
Let us check that the Curzon-Chazy metric is a solution of the vacuum Einstein equation:
Ric.display()
The Weyl conformal curvature tensor is
C = g.weyl()
print(C)
Tensor field C(g) of type (1,3) on the 4-dimensional differentiable manifold M
Let us exhibit two of its components $C^0_{\ \, 123}$ and $C^0_{\ \, 101}$:
C[0,1,2,3]
C[0,1,0,1]
To form the Mars-Simon tensor, we need the fully covariant (type-(0,4) tensor) form of the Weyl tensor (i.e. $C_{\alpha\beta\mu\nu} = g_{\alpha\sigma} C^\sigma_{\ \, \beta\mu\nu}$); we get it by lowering the first index with the metric:
Cd = C.down(g)
print(Cd)
Tensor field of type (0,4) on the 4-dimensional differentiable manifold M
The (monoterm) symmetries of this tensor are those inherited from the Weyl tensor, i.e. the antisymmetry on the last two indices (position 2 and 3, the first index being at position 0):
Cd.symmetries()
no symmetry; antisymmetry: (2, 3)
Actually, Cd is also antisymmetric with respect to the first two indices (positions 0 and 1), as we can check:
Cd == Cd.antisymmetrize(0,1)
To take this symmetry into account explicitely, we set
Cd = Cd.antisymmetrize(0,1)
Hence we have now
Cd.symmetries()
no symmetry; antisymmetries: [(0, 1), (2, 3)]
The Simon-Mars tensor with respect to the Killing vector $\xi$ is a rank-3 tensor introduced by Marc Mars in 1999 (Class. Quantum Grav. 16, 2507). It has the remarkable property to vanish identically if, and only if, the spacetime $(\mathcal{M},g)$ is locally isometric to a Kerr spacetime.
Let us evaluate the Simon-Mars tensor by following the formulas given in Mars' article. The starting point is the self-dual complex 2-form associated with the Killing 2-form $F$, i.e. the object $\mathcal{F} := F + i \, {}^* F$, where ${}^*F$ is the Hodge dual of $F$:
FF = F + I * F.hodge_dual(g)
FF.set_name('FF', r'\mathcal{F}')
print(FF) ; FF.display()
2-form FF on the 4-dimensional differentiable manifold M
Let us check that $\mathcal{F}$ is self-dual, i.e. that it obeys ${}^* \mathcal{F} = -i \mathcal{F}$:
FF.hodge_dual(g) == - I * FF
Let us form the right self-dual of the Weyl tensor as follows
$$\mathcal{C}_{\alpha\beta\mu\nu} = C_{\alpha\beta\mu\nu} + \frac{i}{2} \epsilon^{\rho\sigma}_{\ \ \ \mu\nu} \, C_{\alpha\beta\rho\sigma}$$
where $\epsilon^{\rho\sigma}_{\ \ \ \mu\nu}$ is associated to the Levi-Civita tensor $\epsilon_{\rho\sigma\mu\nu}$ and is obtained by
eps = g.volume_form(2) # 2 = the first 2 indices are contravariant
print(eps)
eps.symmetries()
Tensor field of type (2,2) on the 4-dimensional differentiable manifold M no symmetry; antisymmetries: [(0, 1), (2, 3)]
The right self-dual Weyl tensor is then:
CC = Cd + I/2*( eps['^rs_..']*Cd['_..rs'] )
CC.set_name('CC', r'\mathcal{C}') ; print(CC)
Tensor field CC of type (0,4) on the 4-dimensional differentiable manifold M
CC.symmetries()
no symmetry; antisymmetries: [(0, 1), (2, 3)]
CC[0,1,2,3]
The Ernst 1-form $\sigma_\alpha = 2 \mathcal{F}_{\mu\alpha} \, \xi^\mu$ (0 = contraction on the first index of $\mathcal{F}$):
sigma = 2*FF.contract(0, xi)
Instead of invoking the function contract(), we could have used the index notation to denote the contraction:
sigma == 2*( FF['_ma']*xi['^m'] )
sigma.set_name('sigma', r'\sigma')
print(sigma) ; sigma.display()
1-form sigma on the 4-dimensional differentiable manifold M
The symmetric bilinear form $\gamma = \lambda \, g + \underline{\xi}\otimes\underline{\xi}$:
gamma = lamb*g + xi_form * xi_form
gamma.set_name('gamma', r'\gamma')
print(gamma) ; gamma.display()
Field of symmetric bilinear forms gamma on the 4-dimensional differentiable manifold M
The first part of the Simon-Mars tensor is
$$ S^{(1)}_{\alpha\beta\gamma} = 4 \mathcal{C}_{\mu\alpha\nu\beta} \, \xi^\mu \, \xi^\nu \, \sigma_\gamma$$
S1 = 4*( CC.contract(0,xi).contract(1,xi) ) * sigma
print(S1)
Tensor field of type (0,3) on the 4-dimensional differentiable manifold M
The second part is the tensor
$$ S^{(2)}_{\alpha\beta\gamma} = - \gamma_{\alpha\beta} \, \mathcal{C}_{\rho\gamma\mu\nu} \, \xi^\rho \, \mathcal{F}^{\mu\nu}$$
which we compute by using the index notation to denote the contractions:
FFuu = FF.up(g)
xiCC = CC['_.r..']*xi['^r']
S2 = gamma * ( xiCC['_.mn']*FFuu['^mn'] )
print(S2)
Tensor field of type (0,3) on the 4-dimensional differentiable manifold M
S2.symmetries()
symmetry: (0, 1); no antisymmetry
The Mars-Simon tensor with respect to $\xi$ is obtained by antisymmetrizing $S^{(1)}$ and $S^{(2)}$ on their last two indices and adding them:
We use the index notation for the antisymmetrization:
S1A = S1['_a[bc]']
S2A = S2['_a[bc]']
An equivalent writing would have been (the last two indices being in position 1 and 2):
# S1A = S1.antisymmetrize(1,2)
# S2A = S2.antisymmetrize(1,2)
The Simon-Mars tensor is
S = S1A + S2A
S.set_name('S') ; print(S)
S.symmetries()
Tensor field S of type (0,3) on the 4-dimensional differentiable manifold M no symmetry; antisymmetry: (1, 2)
S.display()
S.display_comp()
Hence the Simon-Mars tensor is not zero: the Curzon-Chazy spacetime is not locally isomorphic to the Kerr spacetime.
First we form the "square" of the Simon-Mars tensor:
Su = S.up(g)
print(Su)
Tensor field of type (3,0) on the 4-dimensional differentiable manifold M
SS = S['_ijk']*Su['^ijk']
print(SS)
Scalar field on the 4-dimensional differentiable manifold M
SS.display()
SSE=SS.expr()
Then we take the real and imaginary part of this compex scalar field. Because this spacetime is spherically symmetric, we expect that the imaginary part vanishes.
SS1 = real(SSE) ; SS1
SS2 = imag(SSE) ; SS2
Furthermore we scale those scalars by the ADM mass of the Curzon-Chazy spacetime, which corresponds to $m$:
SS1ad = m^6*SS1 ; SS1ad
And we take the log of this quantity
lSS1ad = log(SS1ad,10) ; lSS1ad
Then we plot the value of this quantity as a function of $\rho = x = r \sqrt{1-y^2}$ and $z = r y$, thereby producing Figure 10 of arXiv:1412.6542:
var('x z')
lSS1xzad = lSS1ad.subs(r=sqrt(x^2+z^2),
y = z/sqrt(x^2+z^2)).simplify_full()
lSS1xzad
S1CC1 = contour_plot(lSS1xzad, (x,-20,20), (z,-20,20), plot_points=200,
fill=False, cmap='hsv', linewidths=1,
contours=(-14,-13.5,-13,-12.5,-12,-11.5,-11,
-10.5,-10,-9.5,-9,-8.5,-8,-7.5,-7,
-6.5,-6,-5.5,-5,-4.5,-4,-3.5,-3,-2.5,
-2,-1.5,-1,-0.5,0),
colorbar=True, colorbar_spacing='uniform',
colorbar_format='%1.f',
axes_labels=(r"$\rho\,\left[M\right]$",
r"$z\,\left[M\right]$"),
fontsize=14)
S1CC1
We also a viewer for 3D plots (use 'threejs'
or 'jmol'
for interactive 3D graphics):
viewer3D = 'tachyon' # must be 'threejs', 'jmol', 'tachyon' or None (default)
plot3d(lSS1xzad, (x,0.12,20), (z,0.12,20), viewer=viewer3D,
aspect_ratio=[1,1,0.05], plot_points=100,
axes_labels=['rho', 'z', 'log(beta)'])