From: Christian Bauer Date: Wed, 14 Mar 2001 23:05:10 +0000 (+0000) Subject: added predefined epsilon tensor X-Git-Tag: release_0-8-0~25 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=745d46b8492878030cc0decd1cb9bf2de2de03ff added predefined epsilon tensor --- diff --git a/ginac/idx.h b/ginac/idx.h index c760f67b..ea885fee 100644 --- a/ginac/idx.h +++ b/ginac/idx.h @@ -80,7 +80,6 @@ public: /** Check whether the dimension is symbolic. */ bool is_dim_symbolic(void) const {return !is_ex_exactly_of_type(dim, numeric);} - // member variables protected: ex value; /**< Expression that constitutes the index (numeric or symbolic name) */ ex dim; /**< Dimension of space (can be symbolic or numeric) */ diff --git a/ginac/indexed.cpp b/ginac/indexed.cpp index c3fe1d9a..fb34df95 100644 --- a/ginac/indexed.cpp +++ b/ginac/indexed.cpp @@ -66,56 +66,56 @@ indexed::indexed(const ex & b) : inherited(b), symmetry(unknown) { debugmsg("indexed constructor from ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, const ex & i1) : inherited(b, i1), symmetry(unknown) { debugmsg("indexed constructor from ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, const ex & i1, const ex & i2) : inherited(b, i1, i2), symmetry(unknown) { debugmsg("indexed constructor from ex,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, const ex & i1, const ex & i2, const ex & i3) : inherited(b, i1, i2, i3), symmetry(unknown) { debugmsg("indexed constructor from ex,ex,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, const ex & i1, const ex & i2, const ex & i3, const ex & i4) : inherited(b, i1, i2, i3, i4), symmetry(unknown) { debugmsg("indexed constructor from ex,ex,ex,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, symmetry_type symm, const ex & i1, const ex & i2) : inherited(b, i1, i2), symmetry(symm) { debugmsg("indexed constructor from ex,symmetry,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, symmetry_type symm, const ex & i1, const ex & i2, const ex & i3) : inherited(b, i1, i2, i3), symmetry(symm) { debugmsg("indexed constructor from ex,symmetry,ex,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, symmetry_type symm, const ex & i1, const ex & i2, const ex & i3, const ex & i4) : inherited(b, i1, i2, i3, i4), symmetry(symm) { debugmsg("indexed constructor from ex,symmetry,ex,ex,ex,ex", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, const exvector & v) : inherited(b), symmetry(unknown) @@ -123,7 +123,7 @@ indexed::indexed(const ex & b, const exvector & v) : inherited(b), symmetry(unkn debugmsg("indexed constructor from ex,exvector", LOGLEVEL_CONSTRUCT); seq.insert(seq.end(), v.begin(), v.end()); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(const ex & b, symmetry_type symm, const exvector & v) : inherited(b), symmetry(symm) @@ -131,28 +131,28 @@ indexed::indexed(const ex & b, symmetry_type symm, const exvector & v) : inherit debugmsg("indexed constructor from ex,symmetry,exvector", LOGLEVEL_CONSTRUCT); seq.insert(seq.end(), v.begin(), v.end()); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(symmetry_type symm, const exprseq & es) : inherited(es), symmetry(symm) { debugmsg("indexed constructor from symmetry,exprseq", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(symmetry_type symm, const exvector & v, bool discardable) : inherited(v, discardable), symmetry(symm) { debugmsg("indexed constructor from symmetry,exvector", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } indexed::indexed(symmetry_type symm, exvector * vp) : inherited(vp), symmetry(symm) { debugmsg("indexed constructor from symmetry,exvector *", LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_indexed; - GINAC_ASSERT(all_indices_of_type_idx()); + assert_all_indices_of_type_idx(); } ////////// @@ -426,16 +426,15 @@ void indexed::printindices(std::ostream & os) const /** Check whether all indices are of class idx. This function is used * internally to make sure that all constructed indexed objects really * carry indices and not some other classes. */ -bool indexed::all_indices_of_type_idx(void) const +void indexed::assert_all_indices_of_type_idx(void) const { GINAC_ASSERT(seq.size() > 0); exvector::const_iterator it = seq.begin() + 1, itend = seq.end(); while (it != itend) { if (!is_ex_of_type(*it, idx)) - return false; + throw(std::invalid_argument("indices of indexed object must be of type idx")); it++; } - return true; } ////////// @@ -502,6 +501,13 @@ static bool indices_consistent(const exvector & v1, const exvector & v2) return true; } +exvector indexed::get_dummy_indices(void) const +{ + exvector free_indices, dummy_indices; + find_free_and_dummy(seq.begin() + 1, seq.end(), free_indices, dummy_indices); + return dummy_indices; +} + exvector indexed::get_free_indices(void) const { exvector free_indices, dummy_indices; diff --git a/ginac/indexed.h b/ginac/indexed.h index b15ed8b3..b06fad10 100644 --- a/ginac/indexed.h +++ b/ginac/indexed.h @@ -173,11 +173,14 @@ public: * @see class info_flags */ bool all_index_values_are(unsigned inf) const; + /** Return a vector containing the dummy indices of the object, if any. */ + exvector get_dummy_indices(void) const; + protected: void printrawindices(std::ostream & os) const; void printtreeindices(std::ostream & os, unsigned indent) const; void printindices(std::ostream & os) const; - bool all_indices_of_type_idx(void) const; + void assert_all_indices_of_type_idx(void) const; // member variables protected: diff --git a/ginac/tensor.cpp b/ginac/tensor.cpp index 9d5feb63..cf0204b5 100644 --- a/ginac/tensor.cpp +++ b/ginac/tensor.cpp @@ -21,6 +21,7 @@ */ #include +#include #include "tensor.h" #include "idx.h" @@ -43,6 +44,13 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(tensepsilon, tensor) // default constructor, destructor, copy constructor assignment operator and helpers ////////// +#define DEFAULT_DESTROY(classname) \ +void classname::destroy(bool call_parent) \ +{ \ + if (call_parent) \ + inherited::destroy(call_parent); \ +} + #define DEFAULT_CTORS(classname) \ classname::classname() : inherited(TINFO_##classname) \ { \ @@ -52,11 +60,7 @@ void classname::copy(const classname & other) \ { \ inherited::copy(other); \ } \ -void classname::destroy(bool call_parent) \ -{ \ - if (call_parent) \ - inherited::destroy(call_parent); \ -} +DEFAULT_DESTROY(classname) tensor::tensor(unsigned ti) : inherited(ti) { @@ -66,7 +70,8 @@ tensor::tensor(unsigned ti) : inherited(ti) DEFAULT_CTORS(tensor) DEFAULT_CTORS(tensdelta) DEFAULT_CTORS(tensmetric) -DEFAULT_CTORS(tensepsilon) +DEFAULT_DESTROY(minkmetric) +DEFAULT_DESTROY(tensepsilon) minkmetric::minkmetric() : pos_sig(false) { @@ -86,25 +91,41 @@ void minkmetric::copy(const minkmetric & other) pos_sig = other.pos_sig; } -void minkmetric::destroy(bool call_parent) +tensepsilon::tensepsilon() : minkowski(false), pos_sig(false) +{ + debugmsg("tensepsilon default constructor", LOGLEVEL_CONSTRUCT); + tinfo_key = TINFO_tensepsilon; +} + +tensepsilon::tensepsilon(bool mink, bool ps) : minkowski(mink), pos_sig(ps) { - if (call_parent) - inherited::destroy(call_parent); + debugmsg("tensepsilon constructor from bool,bool", LOGLEVEL_CONSTRUCT); + tinfo_key = TINFO_tensepsilon; +} + +void tensepsilon::copy(const tensepsilon & other) +{ + inherited::copy(other); + minkowski = other.minkowski; + pos_sig = other.pos_sig; } ////////// // archiving ////////// +#define DEFAULT_UNARCHIVE(classname) \ +ex classname::unarchive(const archive_node &n, const lst &sym_lst) \ +{ \ + return (new classname(n, sym_lst))->setflag(status_flags::dynallocated); \ +} + #define DEFAULT_ARCHIVING(classname) \ classname::classname(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) \ { \ debugmsg(#classname " constructor from archive_node", LOGLEVEL_CONSTRUCT); \ } \ -ex classname::unarchive(const archive_node &n, const lst &sym_lst) \ -{ \ - return (new classname(n, sym_lst))->setflag(status_flags::dynallocated); \ -} \ +DEFAULT_UNARCHIVE(classname) \ void classname::archive(archive_node &n) const \ { \ inherited::archive(n); \ @@ -113,7 +134,8 @@ void classname::archive(archive_node &n) const \ DEFAULT_ARCHIVING(tensor) DEFAULT_ARCHIVING(tensdelta) DEFAULT_ARCHIVING(tensmetric) -DEFAULT_ARCHIVING(tensepsilon) +DEFAULT_UNARCHIVE(minkmetric) +DEFAULT_UNARCHIVE(tensepsilon) minkmetric::minkmetric(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) { @@ -121,14 +143,23 @@ minkmetric::minkmetric(const archive_node &n, const lst &sym_lst) : inherited(n, n.find_bool("pos_sig", pos_sig); } -ex minkmetric::unarchive(const archive_node &n, const lst &sym_lst) +void minkmetric::archive(archive_node &n) const { - return (new minkmetric(n, sym_lst))->setflag(status_flags::dynallocated); + inherited::archive(n); + n.add_bool("pos_sig", pos_sig); } -void minkmetric::archive(archive_node &n) const +tensepsilon::tensepsilon(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) +{ + debugmsg("tensepsilon constructor from archive_node", LOGLEVEL_CONSTRUCT); + n.find_bool("minkowski", minkowski); + n.find_bool("pos_sig", pos_sig); +} + +void tensepsilon::archive(archive_node &n) const { inherited::archive(n); + n.add_bool("minkowski", minkowski); n.add_bool("pos_sig", pos_sig); } @@ -146,7 +177,6 @@ int classname::compare_same_type(const basic & other) const \ DEFAULT_COMPARE(tensor) DEFAULT_COMPARE(tensdelta) DEFAULT_COMPARE(tensmetric) -DEFAULT_COMPARE(tensepsilon) int minkmetric::compare_same_type(const basic & other) const { @@ -159,6 +189,19 @@ int minkmetric::compare_same_type(const basic & other) const return inherited::compare_same_type(other); } +int tensepsilon::compare_same_type(const basic & other) const +{ + GINAC_ASSERT(is_of_type(other, tensepsilon)); + const tensepsilon &o = static_cast(other); + + if (minkowski != o.minkowski) + return minkowski ? -1 : 1; + else if (pos_sig != o.pos_sig) + return pos_sig ? -1 : 1; + else + return inherited::compare_same_type(other); +} + void tensdelta::print(std::ostream & os, unsigned upper_precedence) const { debugmsg("tensdelta print",LOGLEVEL_PRINT); @@ -249,6 +292,49 @@ ex minkmetric::eval_indexed(const basic & i) const return inherited::eval_indexed(i); } +/** Automatic symbolic evaluation of an indexed epsilon tensor. */ +ex tensepsilon::eval_indexed(const basic & i) const +{ + GINAC_ASSERT(is_of_type(i, indexed)); + GINAC_ASSERT(i.nops() > 1); + GINAC_ASSERT(is_ex_of_type(i.op(0), tensepsilon)); + + // Convolutions are zero + if (static_cast(i).get_dummy_indices().size() != 0) + return _ex0(); + + // Numeric evaluation + if (static_cast(i).all_index_values_are(info_flags::nonnegint)) { + + // Get sign of index permutation (the indices should already be in + // a canonic order but we can't assume what exactly that order is) + vector v; + v.reserve(i.nops() - 1); + for (unsigned j=1; j