diff --git a/Config/PhysicalQtyComplex.h b/Config/PhysicalQtyComplex.h --- a/Config/PhysicalQtyComplex.h +++ b/Config/PhysicalQtyComplex.h @@ -1,284 +1,290 @@ // -*- C++ -*- // // PhysicalQtyComplex.h is a part of ThePEG - Toolkit for HEP Event Generation // Copyright (C) 2006-2017 David Grellscheid, Leif Lonnblad // // ThePEG is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // #ifndef Physical_Qty_Complex_H #define Physical_Qty_Complex_H #include "PhysicalQty.h" #include "PhysicalQtyOps.h" #include /** @file PhysicalQtyComplex.h * Overloads for operations on complex physical quantities. */ namespace std { /** * Template specialization for std::complex > * with conversions to complex */ template<> class complex { public: /// Default constructor constexpr complex(double r=0.0, double i=0.0) : rawValue_(r,i) {} /// Constructor from complex constexpr complex(complex C) : rawValue_(C) {} /** * The internal representation of the dimensionful quantity. * Using this will break dimension-consistency. */ constexpr complex rawValue() const { return rawValue_; } /// Real part constexpr double real() const { return rawValue_.real(); } /// Imaginary part constexpr double imag() const { return rawValue_.imag(); } /// Cast to complex constexpr operator complex() const { return rawValue_; } /// Addition-assignment complex & operator+=(const complex x) { rawValue_ += x.rawValue(); return *this; } /// Subtraction-assignment complex & operator-=(const complex x) { rawValue_ -= x.rawValue(); return *this; } private: /// Internal value of the dimensioned quantity complex rawValue_; }; } // ========================================= namespace ThePEG { /// @name Overloads for mathematical operations //@{ // complex qty = complex qty * complex qty template inline constexpr auto operator*(std::complex> q1, std::complex> q2) -> std::complex { return {q1.real()*q2.real() - q1.imag()*q2.imag(), q1.real()*q2.imag() + q1.imag()*q2.real()}; } // complex qty = complex qty * complex qty template inline constexpr std::complex::Squared> operator*(std::complex> q1, std::complex> q2) { return {q1.real()*q2.real() - q1.imag()*q2.imag(), q1.real()*q2.imag() + q1.imag()*q2.real()}; } // complex qty = complex double - complex qty inline constexpr std::complex operator-(std::complex q1, std::complex q2) { return {q1.real()-q2.real(), q1.imag()-q2.imag()}; } +// complex qty = complex double + complex qty +inline constexpr std::complex +operator+(std::complex q1, std::complex q2) { + return {q1.real()+q2.real(), q1.imag()+q2.imag()}; +} + // complex qty = complex double * complex qty template inline constexpr std::complex> operator*(std::complex q1, std::complex> q2) { return {q1.real()*q2.real() - q1.imag()*q2.imag(), q1.real()*q2.imag() + q1.imag()*q2.real()}; } // complex qty = complex double / complex qty template inline std::complex::Inverse> operator/(std::complex q1, std::complex> q2) { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex qty = complex double / qty template inline constexpr std::complex::Inverse> operator/(std::complex q1, Qty q2) { return {q1.real()/q2, q1.imag()/q2}; } // complex qty = complex qty / complex double template inline std::complex> operator/(std::complex> q1, std::complex q2) { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex qty = qty / complex double template inline std::complex> operator/(Qty q1, std::complex q2) { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex double = complex qty / complex qty template inline std::complex operator/(std::complex> q1, std::complex> q2) { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex double = qty / complex qty template inline std::complex operator/(Qty q1, std::complex> q2) { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex double = complex qty / qty template inline constexpr std::complex operator/(std::complex> q1, Qty q2) { return {q1.real()/q2, q1.imag()/q2}; } // complex qty = complex qty / complex qty template inline auto operator/(std::complex> q1, std::complex> q2) -> std::complex { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex qty = qty / complex qty template inline auto operator/(Qty q1, std::complex> q2) -> std::complex { auto tmp = q1*conj(q2); auto norm = (q2*conj(q2)).real(); return {tmp.real()/norm, tmp.imag()/norm}; } // complex qty = complex qty / qty template inline constexpr auto operator/(std::complex> q1, Qty q2) -> std::complex { return {q1.real()/q2, q1.imag()/q2}; } // complex qty = complex qty * complex double template inline constexpr std::complex> operator*(std::complex> q1, std::complex q2) { return q2 * q1; } // complex qty = qty * complex qty template inline constexpr auto operator*(Qty q1, std::complex> q2) -> std::complex { return {q1*q2.real(), q1*q2.imag()}; } // complex qty = qty * complex qty template inline constexpr std::complex::Squared> operator*(Qty q1, std::complex> q2) { return {q1*q2.real(), q1*q2.imag()}; } // complex qty = qty * complex double template inline constexpr std::complex> operator*(Qty q1, std::complex q2) { return {q1*q2.real(), q1*q2.imag()}; } // complex qty = complex double * qty template inline constexpr std::complex> operator*(std::complex q1, Qty q2) { return q2 * q1; } // complex qty = complex qty * qty template inline constexpr auto operator*(std::complex> q1, Qty q2) -> decltype(q2*q1) { return q2 * q1; } // complex qty = complex qty * qty template inline constexpr std::complex::Squared> operator*(std::complex> q1, Qty q2) { return q2 * q1; } // complex qty *= double template inline constexpr std::complex> & operator*=(std::complex> & q1, double q2) { return (q1 = q1 * q2); } // complex qty /= double template inline constexpr std::complex> & operator/=(std::complex> & q1, double q2) { return (q1 = q1 / q2); } //@} } #endif