X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fclifford.cpp;h=a3f26c964cb010ddc60b67d2be302aefc7d5a2e0;hp=fec22857c89410efb95a7b006244bbdec956e189;hb=dad107ff48f68d45e72469a8716df375ae145cf3;hpb=383d5eb3b0f0506810d9105a268f939125bfc347 diff --git a/ginac/clifford.cpp b/ginac/clifford.cpp index fec22857..a3f26c96 100644 --- a/ginac/clifford.cpp +++ b/ginac/clifford.cpp @@ -26,12 +26,13 @@ #include "clifford.h" #include "ex.h" #include "ncmul.h" +#include "archive.h" #include "utils.h" #include "debugmsg.h" -#ifndef NO_NAMESPACE_GINAC namespace GiNaC { -#endif // ndef NO_NAMESPACE_GINAC + +GINAC_IMPLEMENT_REGISTERED_CLASS(clifford, lortensor) ////////// // default constructor, destructor, copy constructor assignment operator and helpers @@ -42,61 +43,67 @@ namespace GiNaC { clifford::clifford() { debugmsg("clifford default constructor",LOGLEVEL_CONSTRUCT); - serial=next_serial++; - name=autoname_prefix()+ToString(serial); - tinfo_key=TINFO_clifford; + tinfo_key = TINFO_clifford; } -clifford::~clifford() +// protected + +void clifford::copy(const clifford & other) { - debugmsg("clifford destructor",LOGLEVEL_DESTRUCT); - destroy(false); + inherited::copy(other); } -clifford::clifford(const clifford & other) +void clifford::destroy(bool call_parent) { - debugmsg("clifford copy constructor",LOGLEVEL_CONSTRUCT); - copy (other); + if (call_parent) inherited::destroy(call_parent); } -const clifford & clifford::operator=(const clifford & other) +////////// +// other constructors +////////// + +// public + +clifford::clifford(const std::string & n, const ex & mu) : inherited(lortensor_symbolic, n, mu) { - debugmsg("clifford operator=",LOGLEVEL_ASSIGNMENT); - if (this != &other) { - destroy(true); - copy(other); - } - return *this; + debugmsg("clifford constructor from string,ex",LOGLEVEL_CONSTRUCT); + tinfo_key=TINFO_clifford; } -// protected - -void clifford::copy(const clifford & other) +clifford::clifford(const std::string & n, const exvector & iv) : inherited(lortensor_symbolic, n, iv) { - indexed::copy(other); - name=other.name; - serial=other.serial; + debugmsg("clifford constructor from string,exvector", LOGLEVEL_CONSTRUCT); + GINAC_ASSERT(all_of_type_lorentzidx()); + tinfo_key=TINFO_clifford; } -void clifford::destroy(bool call_parent) +clifford::clifford(const std::string & n, exvector *ivp) : inherited(lortensor_symbolic, n, *ivp) { - if (call_parent) { - indexed::destroy(call_parent); - } + debugmsg("clifford constructor from string,exvector", LOGLEVEL_CONSTRUCT); + GINAC_ASSERT(all_of_type_lorentzidx()); + tinfo_key=TINFO_clifford; } ////////// -// other constructors +// archiving ////////// -// public +/** Construct object from archive_node. */ +clifford::clifford(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) +{ + debugmsg("clifford constructor from archive_node", LOGLEVEL_CONSTRUCT); +} -clifford::clifford(const std::string & initname) +/** Unarchive the object. */ +ex clifford::unarchive(const archive_node &n, const lst &sym_lst) { - debugmsg("clifford constructor from string",LOGLEVEL_CONSTRUCT); - name=initname; - serial=next_serial++; - tinfo_key=TINFO_clifford; + return (new clifford(n, sym_lst))->setflag(status_flags::dynallocated); +} + +/** Archive the object. */ +void clifford::archive(archive_node &n) const +{ + inherited::archive(n); } ////////// @@ -105,17 +112,10 @@ clifford::clifford(const std::string & initname) // public -basic * clifford::duplicate() const -{ - debugmsg("clifford duplicate",LOGLEVEL_DUPLICATE); - return new clifford(*this); -} - void clifford::printraw(std::ostream & os) const { debugmsg("clifford printraw",LOGLEVEL_PRINT); - os << "clifford(" << "name=" << name << ",serial=" << serial - << ",indices="; + os << "clifford(" << "indices="; printrawindices(os); os << ",hash=" << hashvalue << ",flags=" << flags << ")"; } @@ -123,8 +123,7 @@ void clifford::printraw(std::ostream & os) const void clifford::printtree(std::ostream & os, unsigned indent) const { debugmsg("clifford printtree",LOGLEVEL_PRINT); - os << std::string(indent,' ') << name << " (clifford): " - << "serial=" << serial << "," + os << std::string(indent,' ') << " (clifford): " << seq.size() << "indices="; printtreeindices(os, indent); os << ", hash=" << hashvalue @@ -139,81 +138,54 @@ void clifford::print(std::ostream & os, unsigned upper_precedence) const printindices(os); } -void clifford::printcsrc(std::ostream & os, unsigned type, unsigned upper_precedence) const -{ - debugmsg("clifford print csrc",LOGLEVEL_PRINT); - print(os,upper_precedence); -} - bool clifford::info(unsigned inf) const { - return indexed::info(inf); + return inherited::info(inf); } // protected int clifford::compare_same_type(const basic & other) const { - GINAC_ASSERT(other.tinfo() == TINFO_clifford); - const clifford *o = static_cast(&other); - if (serial==o->serial) { - return indexed::compare_same_type(other); - } - return serial < o->serial ? -1 : 1; + GINAC_ASSERT(is_of_type(other,clifford)); + // only compare indices + return exprseq::compare_same_type(other); } -ex clifford::simplify_ncmul(const exvector & v) const +bool clifford::is_equal_same_type(const basic & other) const { - return simplified_ncmul(v); + GINAC_ASSERT(is_of_type(other,clifford)); + // only compare indices + return exprseq::is_equal_same_type(other); } -unsigned clifford::calchash(void) const +ex clifford::thisexprseq(const exvector & v) const { - hashvalue=golden_ratio_hash(golden_ratio_hash(0x55555556U ^ - golden_ratio_hash(tinfo_key) ^ - serial)); - setflag(status_flags::hash_calculated); - return hashvalue; + return clifford(name, v); } -////////// -// virtual functions which can be overridden by derived classes -////////// - -// none - -////////// -// non-virtual functions in this class -////////// - -void clifford::setname(const std::string & n) +ex clifford::thisexprseq(exvector *vp) const { - name = n; + return clifford(name, vp); } -// private - -std::string & clifford::autoname_prefix(void) +ex clifford::simplify_ncmul(const exvector & v) const { - static std::string * s = new std::string("clifford"); - return *s; + return simplified_ncmul(v); } ////////// -// static member variables +// friend functions ////////// -// private - -unsigned clifford::next_serial=0; - -////////// -// global constants -////////// - -const clifford some_clifford; -const std::type_info & typeid_clifford = typeid(some_clifford); +/** Construct an object representing a Dirac gamma matrix. The index must + * be of class lorentzidx. + * + * @param mu Index + * @return newly constructed object */ +clifford clifford_gamma(const ex & mu) +{ + return clifford("gamma", mu); +} -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC