sparse-tensor-0.1.0.0: src/Math/Tensor/Examples/Gravity/SchwarzschildSymbolic.hs
-----------------------------------------------------------------------------
-- |
-- Module : Math.Tensor.Examples.Gravity.SchwarzschildSymbolic
-- Copyright : (c) 2019 Tobias Reinhart and Nils Alex
-- License : MIT
-- Maintainer : tobi.reinhart@fau.de, nils.alex@fau.de
--
--
-- This module provides the Schwarzschild metric as an example for a tensor with symbolic values
-- as well as functions to calculate Christoffel symbols, Ricci tensors and Einstein tensors
-- from metric tensors with symbolic values.
--
-----------------------------------------------------------------------------
{-# LANGUAGE DataKinds #-}
module Math.Tensor.Examples.Gravity.SchwarzschildSymbolic (
schwarzschildS,
schwarzschildS',
christoffelS,
ricciS,
einsteinS
)
where
import Math.Tensor
-- | Schwarzschild metric \( g = (1-\frac{r_\text{s}}{r})\,\mathrm dt\otimes\mathrm dt - \frac{1}{1-\frac{r_\text{s}}{r}}\,\mathrm dr\otimes \mathrm dr - r^2\,\mathrm d\theta\otimes \mathrm d\theta - r^2\sin^2\theta\,\mathrm d\phi\otimes \mathrm d\phi \).
schwarzschildS :: STTens 0 2 SSymbolic
schwarzschildS = fromListT2
[
((Empty, Ind3 0 `Append` singletonInd (Ind3 0)), SSymbolic "1 - rs / r" ),
((Empty, Ind3 1 `Append` singletonInd (Ind3 1)), SSymbolic "-1 / (1 - rs / r)"),
((Empty, Ind3 2 `Append` singletonInd (Ind3 2)), SSymbolic "-r^2"),
((Empty, Ind3 3 `Append` singletonInd (Ind3 3)), SSymbolic "-r^2*sin(theta)^2")
]
-- | Inverse Schwarzschild metric \( g = \frac{1}{1-\frac{r_\text{s}}{r}}\,\partial_t \otimes \partial_t - (1-\frac{r_\text{s}}{r})\,\partial_r \otimes \partial_r - \frac{1}{r^2}\,\partial_\theta \otimes \partial_\theta - \frac{1}{r^2\sin^2\theta}\,\partial_\phi \otimes \partial_\phi \).
schwarzschildS' :: STTens 2 0 SSymbolic
schwarzschildS' = fromListT2
[
((Ind3 0 `Append` singletonInd (Ind3 0), Empty), SSymbolic "1/(1 - rs/r)"),
((Ind3 1 `Append` singletonInd (Ind3 1), Empty), SSymbolic "-(1-rs/r)"),
((Ind3 2 `Append` singletonInd (Ind3 2), Empty), SSymbolic "-1/r^2"),
((Ind3 3 `Append` singletonInd (Ind3 3), Empty), SSymbolic "-1/(r^2*sin(theta)^2)")
]
half :: SField Rational
half = SField (1/2)
-- | Christoffel symbols of any symbolic metric.
christoffelS :: STTens 0 2 SSymbolic -> STTens 2 0 SSymbolic -> STTens 1 2 SSymbolic
christoffelS g g' = gamma
where
del_g = partialSymbolic ["t", "r", "theta", "phi"] g
g'_del_g = g' &* del_g
t1 = contrATens1 (0, 0) g'_del_g
t2 = contrATens1 (0, 1) g'_del_g
t3 = tensorTrans2 (0, 1) t2
s = t2 &+ (t3 &- t1)
gamma = half &. s
-- | Ricci tensor of any symbolic metric.
ricciS :: STTens 0 2 SSymbolic -> STTens 2 0 SSymbolic -> STTens 0 2 SSymbolic
ricciS g g' = (term1 &- term2) &+ (term3 &- term4)
where
gamma = christoffelS g g'
del_gamma = partialSymbolic ["t", "r", "theta", "phi"] gamma
gamma_gamma = contrATens1 (1,1) $ gamma &* gamma
term1 = contrATens1 (0,0) del_gamma
term2 = contrATens1 (0,1) del_gamma
term3 = contrATens1 (0,0) gamma_gamma
term4 = contrATens1 (0,1) gamma_gamma
-- | Einstein tensor of any symbolic metric.
-- The components evaluate to zero:
--
-- >>> let g = schwarzschildS
-- >>> let g' = schwarzschildS'
-- >>> let e = einsteinS g g'
-- >>> print e
-- ZeroTensor -- modulo symbolic simplification, which is not implemented yet.
einsteinS :: STTens 0 2 SSymbolic -> STTens 2 0 SSymbolic -> STTens 0 2 SSymbolic
einsteinS g g' = r_ab &- (half &. r &* g)
where
r_ab = ricciS g g'
r = contrATens1 (0,0) $ contrATens1 (1,1) $ g' &* r_ab