/usr/include/ginac/clifford.h is in libginac-dev 1.6.6-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | /** @file clifford.h
*
* Interface to GiNaC's clifford algebra (Dirac gamma) objects. */
/*
* GiNaC Copyright (C) 1999-2015 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef GINAC_CLIFFORD_H
#define GINAC_CLIFFORD_H
#include "indexed.h"
#include "tensor.h"
#include "symbol.h"
#include "idx.h"
#include <set>
namespace GiNaC {
/** This class holds an object representing an element of the Clifford
* algebra (the Dirac gamma matrices). These objects only carry Lorentz
* indices. Spinor indices are hidden. A representation label (an unsigned
* 8-bit integer) is used to distinguish elements from different Clifford
* algebras (objects with different labels commutate). */
class clifford : public indexed
{
GINAC_DECLARE_REGISTERED_CLASS(clifford, indexed)
// other constructors
public:
clifford(const ex & b, unsigned char rl = 0);
clifford(const ex & b, const ex & mu, const ex & metr, unsigned char rl = 0, int comm_sign = -1);
// internal constructors
clifford(unsigned char rl, const ex & metr, int comm_sign, const exvector & v, bool discardable = false);
clifford(unsigned char rl, const ex & metr, int comm_sign, std::auto_ptr<exvector> vp);
// functions overriding virtual functions from base classes
public:
unsigned precedence() const { return 65; }
void archive(archive_node& n) const;
void read_archive(const archive_node& n, lst& sym_lst);
protected:
ex eval_ncmul(const exvector & v) const;
bool match_same_type(const basic & other) const;
ex thiscontainer(const exvector & v) const;
ex thiscontainer(std::auto_ptr<exvector> vp) const;
unsigned return_type() const { return return_types::noncommutative; }
return_type_t return_type_tinfo() const;
// non-virtual functions in this class
public:
unsigned char get_representation_label() const { return representation_label; }
ex get_metric() const { return metric; }
virtual ex get_metric(const ex & i, const ex & j, bool symmetrised = false) const;
bool same_metric(const ex & other) const;
int get_commutator_sign() const { return commutator_sign; } //**< See the member variable commutator_sign */
inline size_t nops() const {return inherited::nops() + 1; }
ex op(size_t i) const;
ex & let_op(size_t i);
ex subs(const exmap & m, unsigned options = 0) const;
protected:
void do_print_dflt(const print_dflt & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
// member variables
protected:
unsigned char representation_label; /**< Representation label to distinguish independent spin lines */
ex metric; /**< Metric of the space, all constructors make it an indexed object */
int commutator_sign; /**< It is the sign in the definition e~i e~j +/- e~j e~i = B(i, j) + B(j, i)*/
};
GINAC_DECLARE_UNARCHIVER(clifford);
/** This class represents the Clifford algebra unity element. */
class diracone : public tensor
{
GINAC_DECLARE_REGISTERED_CLASS(diracone, tensor)
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(diracone);
/** This class represents the Clifford algebra generators (units). */
class cliffordunit : public tensor
{
GINAC_DECLARE_REGISTERED_CLASS(cliffordunit, tensor)
// functions overriding virtual functions from base classes
public:
bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const;
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(cliffordunit);
/** This class represents the Dirac gamma Lorentz vector. */
class diracgamma : public cliffordunit
{
GINAC_DECLARE_REGISTERED_CLASS(diracgamma, cliffordunit)
// functions overriding virtual functions from base classes
public:
bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const;
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(diracgamma);
/** This class represents the Dirac gamma5 object which anticommutates with
* all other gammas. */
class diracgamma5 : public tensor
{
GINAC_DECLARE_REGISTERED_CLASS(diracgamma5, tensor)
// functions overriding virtual functions from base classes
ex conjugate() const;
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(diracgamma5);
/** This class represents the Dirac gammaL object which behaves like
* 1/2 (1-gamma5). */
class diracgammaL : public tensor
{
GINAC_DECLARE_REGISTERED_CLASS(diracgammaL, tensor)
// functions overriding virtual functions from base classes
ex conjugate() const;
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(diracgammaL);
/** This class represents the Dirac gammaL object which behaves like
* 1/2 (1+gamma5). */
class diracgammaR : public tensor
{
GINAC_DECLARE_REGISTERED_CLASS(diracgammaR, tensor)
// functions overriding virtual functions from base classes
ex conjugate() const;
// non-virtual functions in this class
protected:
void do_print(const print_context & c, unsigned level) const;
void do_print_latex(const print_latex & c, unsigned level) const;
};
GINAC_DECLARE_UNARCHIVER(diracgammaR);
// global functions
/** Check whether a given return_type_t object (as returned by return_type_tinfo()
* is that of a clifford object (with an arbitrary representation label).
*
* @param ti tinfo key */
inline bool is_clifford_tinfo(const return_type_t& ti)
{
return *(ti.tinfo) == typeid(clifford);
}
/** Create a Clifford unity object.
*
* @param rl Representation label
* @return newly constructed object */
ex dirac_ONE(unsigned char rl = 0);
/** Create a Clifford unit object.
*
* @param mu Index (must be of class varidx or a derived class)
* @param metr Metric (should be indexed, tensmetric or a derived class, or a matrix)
* @param rl Representation label
* @return newly constructed Clifford unit object */
ex clifford_unit(const ex & mu, const ex & metr, unsigned char rl = 0);
/** Create a Dirac gamma object.
*
* @param mu Index (must be of class varidx or a derived class)
* @param rl Representation label
* @return newly constructed gamma object */
ex dirac_gamma(const ex & mu, unsigned char rl = 0);
/** Create a Dirac gamma5 object.
*
* @param rl Representation label
* @return newly constructed object */
ex dirac_gamma5(unsigned char rl = 0);
/** Create a Dirac gammaL object.
*
* @param rl Representation label
* @return newly constructed object */
ex dirac_gammaL(unsigned char rl = 0);
/** Create a Dirac gammaR object.
*
* @param rl Representation label
* @return newly constructed object */
ex dirac_gammaR(unsigned char rl = 0);
/** Create a term of the form e_mu * gamma~mu with a unique index mu.
*
* @param e Original expression
* @param dim Dimension of index
* @param rl Representation label */
ex dirac_slash(const ex & e, const ex & dim, unsigned char rl = 0);
/** Calculate dirac traces over the specified set of representation labels.
* The computed trace is a linear functional that is equal to the usual
* trace only in D = 4 dimensions. In particular, the functional is not
* always cyclic in D != 4 dimensions when gamma5 is involved.
*
* @param e Expression to take the trace of
* @param rls Set of representation labels
* @param trONE Expression to be returned as the trace of the unit matrix */
ex dirac_trace(const ex & e, const std::set<unsigned char> & rls, const ex & trONE = 4);
/** Calculate dirac traces over the specified list of representation labels.
* The computed trace is a linear functional that is equal to the usual
* trace only in D = 4 dimensions. In particular, the functional is not
* always cyclic in D != 4 dimensions when gamma5 is involved.
*
* @param e Expression to take the trace of
* @param rll List of representation labels
* @param trONE Expression to be returned as the trace of the unit matrix */
ex dirac_trace(const ex & e, const lst & rll, const ex & trONE = 4);
/** Calculate the trace of an expression containing gamma objects with
* a specified representation label. The computed trace is a linear
* functional that is equal to the usual trace only in D = 4 dimensions.
* In particular, the functional is not always cyclic in D != 4 dimensions
* when gamma5 is involved.
*
* @param e Expression to take the trace of
* @param rl Representation label
* @param trONE Expression to be returned as the trace of the unit matrix */
ex dirac_trace(const ex & e, unsigned char rl = 0, const ex & trONE = 4);
/** Bring all products of clifford objects in an expression into a canonical
* order. This is not necessarily the most simple form but it will allow
* to check two expressions for equality. */
ex canonicalize_clifford(const ex & e);
/** Automorphism of the Clifford algebra, simply changes signs of all
* clifford units. */
ex clifford_prime(const ex & e);
/** Main anti-automorphism of the Clifford algebra: makes reversion
* and changes signs of all clifford units. */
inline ex clifford_bar(const ex & e) { return clifford_prime(e.conjugate()); }
/** Reversion of the Clifford algebra, coincides with the conjugate(). */
inline ex clifford_star(const ex & e) { return e.conjugate(); }
/** Replaces dirac_ONE's (with a representation_label no less than rl) in e with 1.
* For the default value rl = 0 remove all of them. Aborts if e contains any
* clifford_unit with representation_label to be removed.
*
* @param e Expression to be processed
* @param rl Value of representation label
* @param options Defines some internal use */
ex remove_dirac_ONE(const ex & e, unsigned char rl = 0, unsigned options = 0);
/** Returns the maximal representation label of a clifford object
* if e contains at least one, otherwise returns -1
*
* @param e Expression to be processed
* @ignore_ONE defines if clifford_ONE should be ignored in the search*/
int clifford_max_label(const ex & e, bool ignore_ONE = false);
/** Calculation of the norm in the Clifford algebra. */
ex clifford_norm(const ex & e);
/** Calculation of the inverse in the Clifford algebra. */
ex clifford_inverse(const ex & e);
/** List or vector conversion into the Clifford vector.
*
* @param v List or vector of coordinates
* @param mu Index (must be of class varidx or a derived class)
* @param metr Metric (should be indexed, tensmetric or a derived class, or a matrix)
* @param rl Representation label
* @param e Clifford unit object
* @return Clifford vector with given components */
ex lst_to_clifford(const ex & v, const ex & mu, const ex & metr, unsigned char rl = 0);
ex lst_to_clifford(const ex & v, const ex & e);
/** An inverse function to lst_to_clifford(). For given Clifford vector extracts
* its components with respect to given Clifford unit. Obtained components may
* contain Clifford units with a different metric. Extraction is based on
* the algebraic formula (e * c.i + c.i * e)/ pow(e.i, 2) for non-degenerate cases
* (i.e. neither pow(e.i, 2) = 0).
*
* @param e Clifford expression to be decomposed into components
* @param c Clifford unit defining the metric for splitting (should have numeric dimension of indices)
* @param algebraic Use algebraic or symbolic algorithm for extractions
* @return List of components of a Clifford vector*/
lst clifford_to_lst(const ex & e, const ex & c, bool algebraic=true);
/** Calculations of Moebius transformations (conformal map) defined by a 2x2 Clifford matrix
* (a b\\c d) in linear spaces with arbitrary signature. The expression is
* (a * x + b)/(c * x + d), where x is a vector build from list v with metric G.
* (see Jan Cnops. An introduction to {D}irac operators on manifolds, v.24 of
* Progress in Mathematical Physics. Birkhauser Boston Inc., Boston, MA, 2002.)
*
* @param a (1,1) entry of the defining matrix
* @param b (1,2) entry of the defining matrix
* @param c (2,1) entry of the defining matrix
* @param d (2,2) entry of the defining matrix
* @param v Vector to be transformed
* @param G Metric of the surrounding space, may be a Clifford unit then the next parameter is ignored
* @param rl Representation label
* @return List of components of the transformed vector*/
ex clifford_moebius_map(const ex & a, const ex & b, const ex & c, const ex & d, const ex & v, const ex & G, unsigned char rl = 0);
/** The second form of Moebius transformations defined by a 2x2 Clifford matrix M
* This function takes the transformation matrix M as a single entity.
*
* @param M the defining matrix
* @param v Vector to be transformed
* @param G Metric of the surrounding space, may be a Clifford unit then the next parameter is ignored
* @param rl Representation label
* @return List of components of the transformed vector*/
ex clifford_moebius_map(const ex & M, const ex & v, const ex & G, unsigned char rl = 0);
} // namespace GiNaC
#endif // ndef GINAC_CLIFFORD_H
|