Bianchi Identities

Load the environment:

(require '[sicmutils.env :refer :all])

Preliminaries

A couple of utilities:

(defn cyclic-sum [f]
  (fn [x y z]
    (+ (f x y z)
      (f y z x)
      (f z x y))))

And a checking function that will supply us with the four literals we need, customized for a particular coordinate system:

(defn with-literals [coordsys f]
  (let [omega (literal-oneform-field 'omega-rect coordsys)
        X (literal-vector-field 'X-rect coordsys)
        Y (literal-vector-field 'Y-rect coordsys)
        Z (literal-vector-field 'Z-rect coordsys)
        V (literal-vector-field 'V-rect coordsys)]
    (f omega X Y Z V)))

Symmetry Check

FDG, section 8.4, page 129: A system with a symmetric connection is torsion-free. The returned expression should simplify to zero.

(defn torsion-symmetric [coordsys]
  (let [C (symmetrize-Cartan
            (literal-Cartan 'C coordsys))
        del (covariant-derivative C)
        R (Riemann del)]
    (with-literals
      coordsys
      (fn [omega X Y Z _]
        (((torsion del) omega X Y)
         (typical-point coordsys))))))

Check for R3-rect:

(torsion-symmetric R3-rect)

R4-rect:

(torsion-symmetric R4-rect)

Symmetric (torsion-free) Bianchi Identities

FDG, equation 8.32, page 130 — first Bianchi identity with a symmetric (torsion-free) connection.

(defn Bianchi1-symmetric [coordsys]
  (let [C (symmetrize-Cartan
            (literal-Cartan 'C coordsys))
        del (covariant-derivative C)
        R (Riemann del)]
    (with-literals
      coordsys
      (fn [omega X Y Z _]
        (((cyclic-sum
            (fn [x y z]
             (R omega x y z)))
          X Y Z)
         (typical-point coordsys))))))

Check for R2-rect:

(Bianchi1-symmetric R2-rect)

The identity holds for R3-rect and R4-rect, of course, but it's too painful to wait for these to run in the browser. The current simplifier takes too long.

Second Identity

(defn Bianchi2-symmetric [coordsys]
  (let [C (symmetrize-Cartan
            (literal-Cartan 'C coordsys))
        del (covariant-derivative C)
        R (Riemann del)]
    (with-literals
      coordsys
      (fn [omega X Y Z V]
        (let [R (Riemann del)]
          (((cyclic-sum
              (fn [x y z]
               (((del x) R) omega V y z)))
            X Y Z)
           (typical-point coordsys)))))))

FDG, equation 8.33, page 130 — second Bianchi identity with a symmetric (torsion-free) connection.

Check it for R2-rect:

(Bianchi2-symmetric R2-rect)

General Bianchi Identities

Bianchi's First Identity with a general (not necessarily torsion-free) connection:

(defn Bianchi1-general [coordsys]
  (let [C (literal-Cartan 'C coordsys)
        del (covariant-derivative C)
        R (Riemann-curvature del)
        T (torsion-vector del)
        TT (torsion del)]
    (with-literals
      coordsys
      (fn [omega X Y Z _]
        (((cyclic-sum
            (fn [x y z]
             (- (omega ((R x y) z))
               (+ (omega (T (T x y) z))
                 (((del x) TT) omega y z)))))
          X Y Z)
         (typical-point coordsys))))))

Check it for R2-rect:

(Bianchi1-general R2-rect)

Bianchi's second identity with a general (not necessarily torsion-free) connection.

(defn Bianchi2-general [coordsys]
  (let [C (literal-Cartan 'C coordsys)
        del (covariant-derivative C)
        R (Riemann del)
        T (torsion-vector del)
        TT (fn [omega x y]
              (omega (T x y)))]
    (with-literals
      coordsys
      (fn [omega X Y Z V]
        (((cyclic-sum
            (fn [x y z]
             (+ (R omega V (T x y) z)
               (((del x) R) omega V y z))))
          X Y Z)
         (typical-point coordsys))))))

Check it for R2-rect:

(Bianchi2-general R2-rect)

Voilá!

Runtimes (1)