+ // 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")), B(symbol("B")), C(symbol("C")), D(symbol("D"));
+ 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));
+ e = spinor_metric(D, A) * spinor_metric(A_co, B_co) * spinor_metric(B, C) - spinor_metric(D, A_co) * spinor_metric(A, B_co) * spinor_metric(B, C);
+ result += check_equal_simplify(e, 0);
+
+ return result;
+}
+
+static unsigned dummy_check(void)
+{
+ // check dummy index renaming/repositioning
+
+ unsigned result = 0;
+
+ symbol p("p"), q("q");
+ idx i(symbol("i"), 3), j(symbol("j"), 3), n(symbol("n"), 3);
+ varidx mu(symbol("mu"), 4), nu(symbol("nu"), 4);
+ ex e;
+
+ e = indexed(p, i) * indexed(q, i) - indexed(p, j) * indexed(q, j);
+ result += check_equal_simplify(e, 0);
+
+ e = indexed(p, i) * indexed(p, i) * indexed(q, j) * indexed(q, j)
+ - indexed(p, n) * indexed(p, n) * indexed(q, j) * indexed(q, j);
+ result += check_equal_simplify(e, 0);
+
+ e = indexed(p, mu, mu.toggle_variance()) - indexed(p, nu, nu.toggle_variance());
+ result += check_equal_simplify(e, 0);
+
+ e = indexed(p, mu.toggle_variance(), nu, mu) * indexed(q, i)
+ - indexed(p, mu, nu, mu.toggle_variance()) * indexed(q, i);
+ result += check_equal_simplify(e, 0);
+
+ e = indexed(p, mu, mu.toggle_variance()) - indexed(p, nu.toggle_variance(), nu);
+ result += check_equal_simplify(e, 0);
+ e = indexed(p, mu.toggle_variance(), mu) - indexed(p, nu, nu.toggle_variance());
+ result += check_equal_simplify(e, 0);
+