# Version vom 15.5.23
# Krümmungsgrößen der Sphäre im R^3

import sympy as sp
from sympy import symbols, diag, cos
#https://de.wikipedia.org/wiki/SymPy
#https://www.sympy.org/en/index.html 

from einsteinpy.symbolic import MetricTensor, RicciTensor, RicciScalar, ChristoffelSymbols, RiemannCurvatureTensor
#https://einsteinpy.org/

sp.init_printing()  # enables the best printing available in an environment

syms = symbols('theta phi')
theta, phi = syms

# Metrik in sphärischen Koordinaten - vgl. ART-Skript Bsp II.1.13
g = MetricTensor(diag(1, cos(theta)**2).tolist(), syms)
print('Metrik:', g.tensor())
print('g[theta, phi])=', g[0,1], '\n')

# Christoffelsymbole \Gamma^i_{jk} : äußerste Klammer k, innerste Klammer i
ch = ChristoffelSymbols.from_metric(g)
print('Christoffelsymbole:', ch.tensor())
print('Gamma^{theta}_{phi,phi}=',ch[0,1,1], '\n' )

#Konvention Riemann-Tensor auf https://docs.einsteinpy.org/en/stable/api/symbolic/riemann.html
# Riem^i_{jkl} wird mit Riem[i,k,l,j] ausgegeben
Riem = RiemannCurvatureTensor.from_metric(g)
print('Riem - Positionen der Indizes (u=upper, l=lower):',  Riem.config)
print('Riem - als (1,3)-Tensor:', Riem.tensor())
print('Riem^{theta}_{phi,theta, phi}=', Riem[1,0,1,0], '\n' )


Ric = RicciTensor.from_metric(g)
print('Ricci - als (0,2)-Tensor:', Ric.tensor())

uricci = Ric.change_config(metric=g)
print('Ricci - als (1,1)-Tensor:', uricci.tensor(), '\n')

R = RicciScalar.from_riccitensor(Ric)
R.simplify()
print('Skalarkrümmung:', R.tensor())

