+ // Test 2: check energy density and Poynting vector of electromagnetic field
+
+ // Minkowski metric
+ ex eta = diag_matrix(lst(1, -1, -1, -1));
+
+ // Covariant field tensor
+ ex F_mu_nu = (indexed(eta, mu.toggle_variance(), rho.toggle_variance())
+ * indexed(eta, nu.toggle_variance(), sigma.toggle_variance())
+ * indexed(F, rho, sigma)).simplify_indexed();
+
+ // Energy-momentum tensor
+ ex T = (-indexed(eta, rho, sigma) * F_mu_nu.subs(s_nu == s_rho)
+ * F_mu_nu.subs(lst(s_mu == s_nu, s_nu == s_sigma))
+ + indexed(eta, mu.toggle_variance(), nu.toggle_variance())
+ * F_mu_nu.subs(lst(s_mu == s_rho, s_nu == s_sigma))
+ * indexed(F, rho, sigma) / 4).simplify_indexed() / (4 * Pi);
+
+ // Extract energy density and Poynting vector
+ ex E = T.subs(lst(s_mu == 0, s_nu == 0)).normal();
+ ex Px = T.subs(lst(s_mu == 0, s_nu == 1));
+ ex Py = T.subs(lst(s_mu == 0, s_nu == 2));
+ ex Pz = T.subs(lst(s_mu == 0, s_nu == 3));
+
+ // Check results
+ result += check_equal(E, (Ex*Ex+Ey*Ey+Ez*Ez+Bx*Bx+By*By+Bz*Bz) / (8 * Pi));
+ result += check_equal(Px, (Ez*By-Ey*Bz) / (4 * Pi));
+ result += check_equal(Py, (Ex*Bz-Ez*Bx) / (4 * Pi));
+ result += check_equal(Pz, (Ey*Bx-Ex*By) / (4 * Pi));
+
+ return result;
+}
+
+static unsigned spinor_check(void)
+{
+ // check identities of the spinor metric
+
+ unsigned result = 0;
+
+ symbol psi("psi");
+ spinidx A(symbol("A"), 2), B(symbol("B"), 2), C(symbol("C"), 2);
+ ex A_co = A.toggle_variance(), B_co = B.toggle_variance();
+ ex e;
+
+ e = spinor_metric(A_co, B_co) * spinor_metric(A, B);
+ result += check_equal_simplify(e, 2);
+ e = spinor_metric(A_co, B_co) * spinor_metric(B, A);
+ result += check_equal_simplify(e, -2);
+ e = spinor_metric(A_co, B_co) * spinor_metric(A, C);
+ result += check_equal_simplify(e, delta_tensor(B_co, C));
+ e = spinor_metric(A_co, B_co) * spinor_metric(B, C);
+ result += check_equal_simplify(e, -delta_tensor(A_co, C));
+ e = spinor_metric(A_co, B_co) * spinor_metric(C, A);
+ result += check_equal_simplify(e, -delta_tensor(B_co, C));
+ e = spinor_metric(A, B) * indexed(psi, B_co);
+ result += check_equal_simplify(e, indexed(psi, A));
+ e = spinor_metric(A, B) * indexed(psi, A_co);
+ result += check_equal_simplify(e, -indexed(psi, B));
+ e = spinor_metric(A_co, B_co) * indexed(psi, B);
+ result += check_equal_simplify(e, -indexed(psi, A_co));
+ e = spinor_metric(A_co, B_co) * indexed(psi, A);
+ result += check_equal_simplify(e, indexed(psi, B_co));
+