X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ftensor.cpp;h=2f12154d7023556911ea176c2478d74d3cab45bf;hp=25935f420b3e49ee8ba9ea1df612373baa10e425;hb=f7884835d397de85e648d1957c058b7d4c0948ba;hpb=9f86a69017e43c8054ee28e022183f224c6a077b diff --git a/ginac/tensor.cpp b/ginac/tensor.cpp index 25935f42..2f12154d 100644 --- a/ginac/tensor.cpp +++ b/ginac/tensor.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's special tensors. */ /* - * GiNaC Copyright (C) 1999-2006 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 @@ -20,10 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include -#include -#include - #include "tensor.h" #include "idx.h" #include "indexed.h" @@ -36,6 +32,10 @@ #include "archive.h" #include "utils.h" +#include +#include +#include + namespace GiNaC { GINAC_IMPLEMENT_REGISTERED_CLASS(tensor, basic) @@ -64,7 +64,7 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(tensepsilon, tensor, // constructors ////////// -tensor::tensor() : inherited(&tensor::tinfo_static) +tensor::tensor() { setflag(status_flags::evaluated | status_flags::expanded); } @@ -74,44 +74,34 @@ DEFAULT_CTOR(tensmetric) minkmetric::minkmetric() : pos_sig(false) { - tinfo_key = &minkmetric::tinfo_static; } spinmetric::spinmetric() { - tinfo_key = &spinmetric::tinfo_static; } minkmetric::minkmetric(bool ps) : pos_sig(ps) { - tinfo_key = &minkmetric::tinfo_static; } tensepsilon::tensepsilon() : minkowski(false), pos_sig(false) { - tinfo_key = &tensepsilon::tinfo_static; } tensepsilon::tensepsilon(bool mink, bool ps) : minkowski(mink), pos_sig(ps) { - tinfo_key = &tensepsilon::tinfo_static; } ////////// // archiving ////////// -DEFAULT_ARCHIVING(tensor) -DEFAULT_ARCHIVING(tensdelta) -DEFAULT_ARCHIVING(tensmetric) -DEFAULT_ARCHIVING(spinmetric) -DEFAULT_UNARCHIVE(minkmetric) -DEFAULT_UNARCHIVE(tensepsilon) - -minkmetric::minkmetric(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) +void minkmetric::read_archive(const archive_node& n, lst& sym_lst) { + inherited::read_archive(n, sym_lst); n.find_bool("pos_sig", pos_sig); } +GINAC_BIND_UNARCHIVER(minkmetric); void minkmetric::archive(archive_node &n) const { @@ -119,11 +109,13 @@ void minkmetric::archive(archive_node &n) const n.add_bool("pos_sig", pos_sig); } -tensepsilon::tensepsilon(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) +void tensepsilon::read_archive(const archive_node& n, lst& sym_lst) { + inherited::read_archive(n, sym_lst); n.find_bool("minkowski", minkowski); n.find_bool("pos_sig", pos_sig); } +GINAC_BIND_UNARCHIVER(tensepsilon); void tensepsilon::archive(archive_node &n) const { @@ -132,6 +124,10 @@ void tensepsilon::archive(archive_node &n) const n.add_bool("pos_sig", pos_sig); } +GINAC_BIND_UNARCHIVER(tensdelta); +GINAC_BIND_UNARCHIVER(tensmetric); +GINAC_BIND_UNARCHIVER(spinmetric); + ////////// // functions overriding virtual functions from base classes ////////// @@ -368,13 +364,17 @@ ex tensepsilon::eval_indexed(const basic & i) const if (minkowski) { for (size_t j=1; j(x)) + if (!is_a(x)) { throw(std::runtime_error("indices of epsilon tensor in Minkowski space must be of type varidx")); - if (ex_to(x).is_covariant()) - if (ex_to(x).get_value().is_zero()) + } + if (ex_to(x).is_covariant()) { + if (ex_to(x).get_value().is_zero()) { sign = (pos_sig ? -sign : sign); - else + } + else { sign = (pos_sig ? sign : -sign); + } + } } } @@ -576,7 +576,7 @@ bool tensepsilon::contract_with(exvector::iterator self, exvector::iterator othe ex delta_tensor(const ex & i1, const ex & i2) { - static ex delta = (new tensdelta)->setflag(status_flags::dynallocated); + static ex delta = dynallocate(); if (!is_a(i1) || !is_a(i2)) throw(std::invalid_argument("indices of delta tensor must be of type idx")); @@ -586,7 +586,7 @@ ex delta_tensor(const ex & i1, const ex & i2) ex metric_tensor(const ex & i1, const ex & i2) { - static ex metric = (new tensmetric)->setflag(status_flags::dynallocated); + static ex metric = dynallocate(); if (!is_a(i1) || !is_a(i2)) throw(std::invalid_argument("indices of metric tensor must be of type varidx")); @@ -596,8 +596,8 @@ ex metric_tensor(const ex & i1, const ex & i2) ex lorentz_g(const ex & i1, const ex & i2, bool pos_sig) { - static ex metric_neg = (new minkmetric(false))->setflag(status_flags::dynallocated); - static ex metric_pos = (new minkmetric(true))->setflag(status_flags::dynallocated); + static ex metric_neg = dynallocate(false); + static ex metric_pos = dynallocate(true); if (!is_a(i1) || !is_a(i2)) throw(std::invalid_argument("indices of metric tensor must be of type varidx")); @@ -607,7 +607,7 @@ ex lorentz_g(const ex & i1, const ex & i2, bool pos_sig) ex spinor_metric(const ex & i1, const ex & i2) { - static ex metric = (new spinmetric)->setflag(status_flags::dynallocated); + static ex metric = dynallocate(); if (!is_a(i1) || !is_a(i2)) throw(std::invalid_argument("indices of spinor metric must be of type spinidx")); @@ -619,7 +619,7 @@ ex spinor_metric(const ex & i1, const ex & i2) ex epsilon_tensor(const ex & i1, const ex & i2) { - static ex epsilon = (new tensepsilon)->setflag(status_flags::dynallocated); + static ex epsilon = dynallocate(); if (!is_a(i1) || !is_a(i2)) throw(std::invalid_argument("indices of epsilon tensor must be of type idx")); @@ -638,7 +638,7 @@ ex epsilon_tensor(const ex & i1, const ex & i2) ex epsilon_tensor(const ex & i1, const ex & i2, const ex & i3) { - static ex epsilon = (new tensepsilon)->setflag(status_flags::dynallocated); + static ex epsilon = dynallocate(); if (!is_a(i1) || !is_a(i2) || !is_a(i3)) throw(std::invalid_argument("indices of epsilon tensor must be of type idx")); @@ -657,8 +657,8 @@ ex epsilon_tensor(const ex & i1, const ex & i2, const ex & i3) ex lorentz_eps(const ex & i1, const ex & i2, const ex & i3, const ex & i4, bool pos_sig) { - static ex epsilon_neg = (new tensepsilon(true, false))->setflag(status_flags::dynallocated); - static ex epsilon_pos = (new tensepsilon(true, true))->setflag(status_flags::dynallocated); + static ex epsilon_neg = dynallocate(true, false); + static ex epsilon_pos = dynallocate(true, true); if (!is_a(i1) || !is_a(i2) || !is_a(i3) || !is_a(i4)) throw(std::invalid_argument("indices of Lorentz epsilon tensor must be of type varidx"));