X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fclifford.cpp;h=8a8bfe09294e942e88023d0770784f09d5d9f289;hp=06d9e5415a361d95b3305133e1032f84c10bae52;hb=43e0a8f5ca5e1c48cef5daaf014acdbca4e44568;hpb=e58f5808a2d0fe6cb9d60370ede700d97a8bb702 diff --git a/ginac/clifford.cpp b/ginac/clifford.cpp index 06d9e541..8a8bfe09 100644 --- a/ginac/clifford.cpp +++ b/ginac/clifford.cpp @@ -24,6 +24,7 @@ #include "ex.h" #include "idx.h" #include "ncmul.h" +#include "symbol.h" #include "print.h" #include "archive.h" #include "debugmsg.h" @@ -145,9 +146,10 @@ DEFAULT_PRINT(diracgamma5, "gamma5") /** Contraction of a gamma matrix with something else. */ bool diracgamma::contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const { - GINAC_ASSERT(is_ex_of_type(*self, indexed)); + GINAC_ASSERT(is_ex_of_type(*self, clifford)); GINAC_ASSERT(is_ex_of_type(*other, indexed)); GINAC_ASSERT(is_ex_of_type(self->op(0), diracgamma)); + unsigned char rl = ex_to_clifford(*self).get_representation_label(); if (is_ex_of_type(other->op(0), diracgamma)) { @@ -156,7 +158,7 @@ bool diracgamma::contract_with(exvector::iterator self, exvector::iterator other // gamma~mu*gamma.mu = dim*ONE if (other - self == 1) { *self = dim; - *other = dirac_ONE(); + *other = dirac_ONE(rl); return true; // gamma~mu*gamma~alpha*gamma.mu = (2-dim)*gamma~alpha @@ -170,7 +172,7 @@ bool diracgamma::contract_with(exvector::iterator self, exvector::iterator other } else if (other - self == 3 && is_ex_of_type(self[1], clifford) && is_ex_of_type(self[2], clifford)) { - *self = 4 * metric_tensor(self[1].op(1), self[2].op(1)) * dirac_ONE() + (dim - 4) * self[1] * self[2]; + *self = 4 * metric_tensor(self[1].op(1), self[2].op(1)) * dirac_ONE(rl) + (dim - 4) * self[1] * self[2]; self[1] = _ex1(); self[2] = _ex1(); *other = _ex1(); @@ -200,6 +202,7 @@ ex clifford::simplify_ncmul(const exvector & v) const { exvector s; s.reserve(v.size()); + unsigned rl = ex_to_clifford(v[0]).get_representation_label(); // Remove superfluous ONEs exvector::const_iterator cit = v.begin(), citend = v.end(); @@ -251,7 +254,7 @@ ex clifford::simplify_ncmul(const exvector & v) const const ex & ib = b.op(1); if (ia.is_equal(ib)) { a = lorentz_g(ia, ib); - b = dirac_ONE(); + b = dirac_ONE(rl); something_changed = true; } } @@ -260,7 +263,7 @@ ex clifford::simplify_ncmul(const exvector & v) const } if (s.size() == 0) - return clifford(diracone()) * sign; + return clifford(diracone(), rl) * sign; if (something_changed) return nonsimplified_ncmul(s) * sign; else @@ -299,4 +302,126 @@ ex dirac_gamma5(unsigned char rl) return clifford(diracgamma5(), rl); } +ex dirac_slash(const ex & e, const ex & dim, unsigned char rl) +{ + varidx mu((new symbol)->setflag(status_flags::dynallocated), dim); + return indexed(e, mu.toggle_variance()) * dirac_gamma(mu, rl); +} + +/** Check whether a given tinfo key (as returned by return_type_tinfo() + * is that of a clifford object with the specified representation label. */ +static bool is_clifford_tinfo(unsigned ti, unsigned char rl) +{ + return ti == (TINFO_clifford + rl); +} + +ex dirac_trace(const ex & e, unsigned char rl) +{ + if (is_ex_of_type(e, clifford)) { + + if (ex_to_clifford(e).get_representation_label() == rl + && is_ex_of_type(e.op(0), diracone)) + return _ex4(); + else + return _ex0(); + + } else if (is_ex_exactly_of_type(e, add)) { + + // Trace of sum = sum of traces + ex sum = _ex0(); + for (unsigned i=0; isetflag(status_flags::dynallocated), dim), + mu2((new symbol)->setflag(status_flags::dynallocated), dim), + mu3((new symbol)->setflag(status_flags::dynallocated), dim), + mu4((new symbol)->setflag(status_flags::dynallocated), dim); + exvector v; + v.reserve(num + 3); + v.push_back(dirac_gamma(mu1, rl)); + v.push_back(dirac_gamma(mu2, rl)); + v.push_back(dirac_gamma(mu3, rl)); + v.push_back(dirac_gamma(mu4, rl)); + for (int i=1; i