* Here we test manipulations on GiNaC's indexed objects. */
/*
- * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "exams.h"
+#include "ginac.h"
+using namespace GiNaC;
+
+#include <iostream>
+using namespace std;
static unsigned check_equal(const ex &e1, const ex &e2)
{
return 0;
}
-static unsigned delta_check(void)
+static unsigned delta_check()
{
// checks identities of the delta tensor
return result;
}
-static unsigned metric_check(void)
+static unsigned metric_check()
{
// checks identities of the metric tensor
return result;
}
-static unsigned epsilon_check(void)
+static unsigned epsilon_check()
{
// checks identities of the epsilon tensor
return result;
}
-static unsigned symmetry_check(void)
+DECLARE_FUNCTION_2P(symm_fcn)
+REGISTER_FUNCTION(symm_fcn, set_symmetry(sy_symm(0, 1)));
+DECLARE_FUNCTION_2P(anti_fcn)
+REGISTER_FUNCTION(anti_fcn, set_symmetry(sy_anti(0, 1)));
+
+static unsigned symmetry_check()
{
// check symmetric/antisymmetric objects
e = (indexed(A, sy_anti(), i, j, k, l) * (indexed(B, j) * indexed(C, k) + indexed(B, k) * indexed(C, j)) + indexed(B, i, l)).expand();
result += check_equal_simplify(e, indexed(B, i, l));
+ result += check_equal(symm_fcn(0, 1) + symm_fcn(1, 0), 2*symm_fcn(0, 1));
+ result += check_equal(anti_fcn(0, 1) + anti_fcn(1, 0), 0);
+ result += check_equal(anti_fcn(0, 0), 0);
+
return result;
}
-static unsigned scalar_product_check(void)
+static unsigned scalar_product_check()
{
// check scalar product replacement
return result;
}
-static unsigned edyn_check(void)
+static unsigned edyn_check()
{
// Relativistic electrodynamics
symbol Bx("Bx"), By("By"), Bz("Bz");
// Lorentz transformation matrix (boost along x axis)
- matrix L(4, 4);
- L(0, 0) = gamma;
- L(0, 1) = -beta*gamma;
- L(1, 0) = -beta*gamma;
- L(1, 1) = gamma;
- L(2, 2) = 1; L(3, 3) = 1;
+ matrix L = {{ gamma, -beta*gamma, 0, 0},
+ {-beta*gamma, gamma, 0, 0},
+ { 0, 0, 1, 0},
+ { 0, 0, 0, 1}};
// Electromagnetic field tensor
- matrix F(4, 4, lst(
- 0, -Ex, -Ey, -Ez,
- Ex, 0, -Bz, By,
- Ey, Bz, 0, -Bx,
- Ez, -By, Bx, 0
- ));
+ matrix F = {{ 0, -Ex, -Ey, -Ez},
+ {Ex, 0, -Bz, By},
+ {Ey, Bz, 0, -Bx},
+ {Ez, -By, Bx, 0}};
// Indices
symbol s_mu("mu"), s_nu("nu"), s_rho("rho"), s_sigma("sigma");
* indexed(F, rho, sigma)).simplify_indexed();
// Extract transformed electric and magnetic fields
- ex Ex_p = e.subs(lst(mu == 1, nu == 0)).normal();
- ex Ey_p = e.subs(lst(mu == 2, nu == 0)).normal();
- ex Ez_p = e.subs(lst(mu == 3, nu == 0)).normal();
- ex Bx_p = e.subs(lst(mu == 3, nu == 2)).normal();
- ex By_p = e.subs(lst(mu == 1, nu == 3)).normal();
- ex Bz_p = e.subs(lst(mu == 2, nu == 1)).normal();
+ ex Ex_p = e.subs(lst{mu == 1, nu == 0}).normal();
+ ex Ey_p = e.subs(lst{mu == 2, nu == 0}).normal();
+ ex Ez_p = e.subs(lst{mu == 3, nu == 0}).normal();
+ ex Bx_p = e.subs(lst{mu == 3, nu == 2}).normal();
+ ex By_p = e.subs(lst{mu == 1, nu == 3}).normal();
+ ex Bz_p = e.subs(lst{mu == 2, nu == 1}).normal();
// Check results
result += check_equal(Ex_p, Ex);
// Test 2: check energy density and Poynting vector of electromagnetic field
// Minkowski metric
- ex eta = diag_matrix(lst(1, -1, -1, -1));
+ ex eta = diag_matrix(lst{1, -1, -1, -1});
// Covariant field tensor
ex F_mu_nu = (indexed(eta, mu.toggle_variance(), rho.toggle_variance())
// 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))
+ * 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))
+ * 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));
+ 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));
return result;
}
-static unsigned spinor_check(void)
+static unsigned spinor_check()
{
// check identities of the spinor metric
return result;
}
-static unsigned dummy_check(void)
+static unsigned dummy_check()
{
// check dummy index renaming/repositioning
e = indexed(p, mu.toggle_variance(), mu) - indexed(p, nu, nu.toggle_variance());
result += check_equal_simplify(e, 0);
+ // GiNaC 1.2.1 had a bug here because p.i*p.i -> (p.i)^2
+ e = indexed(p, i) * indexed(p, i) * indexed(p, j) + indexed(p, j);
+ ex fi = exprseq(e.get_free_indices());
+ if (!fi.is_equal(exprseq{j})) {
+ clog << "get_free_indices(" << e << ") erroneously returned "
+ << fi << " instead of (.j)" << endl;
+ ++result;
+ }
+
return result;
}
-unsigned exam_indexed(void)
+unsigned exam_indexed()
{
unsigned result = 0;
cout << "examining indexed objects" << flush;
- clog << "----------indexed objects:" << endl;
result += delta_check(); cout << '.' << flush;
result += metric_check(); cout << '.' << flush;
result += spinor_check(); cout << '.' << flush;
result += dummy_check(); cout << '.' << flush;
- if (!result) {
- cout << " passed " << endl;
- clog << "(no output)" << endl;
- } else {
- cout << " failed " << endl;
- }
-
return result;
}
+
+int main(int argc, char** argv)
+{
+ return exam_indexed();
+}