egison-5.0.0: sample/math/geometry/euler-form-of-T2.egi
-- Euler form of T2 (Torus)
declare symbol θ, φ, a, b
def x := [| θ, φ |]
def X := [| '(a * cos θ + b) * cos φ, '(a * cos θ + b) * sin φ, a * sin θ |]
-- Local basis
def e_i_j : Matrix MathExpr := ∂/∂ X_j x~i
-- Metric tensor
def g_i_j := generateTensor (\[a, b] -> V.* e_a e_b) [2, 2]
def g~i~j := M.inverse g_#_#
assertEqual "Metric tensor"
g_#_#
[| [| a^2, 0 |], [| 0, '(a * cos θ + b)^2 |] |]_#_#
-- Christoffel symbols
def Γ_i_j_k := (1 / 2) * (∂/∂ g_i_k x~j + ∂/∂ g_i_j x~k - ∂/∂ g_j_k x~i)
def Γ~i_j_k := withSymbols [m]
g~i~m . Γ_m_j_k
-- Connection 1-form
def ω0 := Γ~#_#_#
-- Vielbein
def A := [| [| 1 / a, 0 |], [| 0, 1 / '(a * cos θ + b) |] |]
-- Transformed connection
def d A := (flip ∂/∂) x~# A_#_#
def ω := withSymbols [i, j, k, l]
(M.inverse A)~i_j . ω0~j_k . A~k_l + (M.inverse A)~i_j . d A~j_l
-- Curvature form
def wedge X Y := X !. Y
def Ω := withSymbols [i, j, k]
dfNormalize (d ω~i_j + wedge ω~i_k ω~k_j)
-- Euler form
def eulerForm := (1 / (2 * π)) * (Ω~1_2 - Ω~2_1)
-- The Euler form integrates to the Euler characteristic χ = 0 for T²
assertEqual "Euler form of T2"
eulerForm
[| [| cos θ / ('(a * cos θ + b) * a * π), 0 |], [| 0, cos θ / ('(a * cos θ + b) * a * π) |] |]