File indexing completed on 2025-04-19 09:10:06
0001 #ifndef METOOLS_Explicit_C_Vector_H
0002 #define METOOLS_Explicit_C_Vector_H
0003
0004 #include "METOOLS/Explicit/C_Object.H"
0005 #include "ATOOLS/Math/Vec4.H"
0006 #include "ATOOLS/Org/STL_Tools.H"
0007
0008 #include <vector>
0009
0010 namespace METOOLS {
0011
0012 template <class Scalar>
0013 class CVec4: public CObject {
0014 public:
0015
0016 typedef std::complex<Scalar> SComplex;
0017
0018 private:
0019
0020 SComplex m_x[4];
0021
0022 static double s_accu;
0023
0024 static ATOOLS::AutoDelete_Vector<CVec4> s_objects;
0025
0026 template <class _Scalar> friend std::ostream &
0027 operator<<(std::ostream &s,const CVec4<_Scalar> &vec);
0028
0029 public:
0030
0031 static CVec4 *New();
0032 static CVec4 *New(const CVec4 &s);
0033 static CVec4 *New(const Scalar &x0, const Scalar &x1,
0034 const Scalar &x2, const Scalar &x3,
0035 const int c1=0,const int c2=0,
0036 const size_t &hm=0,
0037 const size_t &hp=0);
0038
0039 CObject* Copy() const;
0040
0041 void Delete();
0042
0043 bool IsZero() const;
0044
0045 inline CVec4()
0046 {
0047 m_x[0]=m_x[1]=m_x[2]=m_x[3]=0.0;
0048 m_c[0]=m_c[1]=0;
0049 m_h=m_s=0;
0050 }
0051 inline CVec4(const CVec4 &v)
0052 {
0053 m_x[0]=v[0]; m_x[1]=v[1]; m_x[2]=v[2]; m_x[3]=v[3];
0054 m_c[0]=v(0); m_c[1]=v(1);
0055 m_h=v.m_h; m_s=v.m_s;
0056 }
0057 inline CVec4(const Scalar &x0, const Scalar &x1,
0058 const Scalar &x2, const Scalar &x3,
0059 const int c1=0,const int c2=0,
0060 const size_t &h=0,const size_t &s=0)
0061 {
0062 m_x[0]=x0; m_x[1]=x1; m_x[2]=x2; m_x[3]=x3;
0063 m_c[0]=c1; m_c[1]=c2; m_h=h; m_s=s;
0064 }
0065 inline CVec4(const int c1,const int c2,
0066 const size_t &h=0,const size_t &s=0)
0067 {
0068 m_x[0]=m_x[1]=m_x[2]=m_x[3]=0.0;
0069 m_c[0]=c1; m_c[1]=c2; m_h=h; m_s=s;
0070 }
0071 inline CVec4(const SComplex &x0, const SComplex &x1,
0072 const SComplex &x2, const SComplex &x3,
0073 const int c1=0,const int c2=0,
0074 const size_t &h=0,const size_t &s=0)
0075 {
0076 m_x[0]=x0; m_x[1]=x1; m_x[2]=x2; m_x[3]=x3;
0077 m_c[0]=c1; m_c[1]=c2; m_h=h; m_s=s;
0078 }
0079 inline CVec4(const ATOOLS::Vec4<Scalar> &v,
0080 const int c1=0,const int c2=0,
0081 const size_t &h=0,const size_t &s=0)
0082 {
0083 m_x[0]=v[0]; m_x[1]=v[1]; m_x[2]=v[2]; m_x[3]=v[3];
0084 m_c[0]=c1; m_c[1]=c2; m_h=h; m_s=s;
0085 }
0086 inline CVec4(const CVec4 &v,const Scalar &c)
0087 {
0088 m_x[0]=v[0]*c; m_x[1]=v[1]*c; m_x[2]=v[2]*c; m_x[3]=v[3]*c;
0089 m_c[0]=v(0); m_c[1]=v(1); m_h=v.m_h; m_s=v.m_s;
0090 }
0091 inline CVec4(const CVec4 &v,const SComplex &c)
0092 {
0093 m_x[0]=v[0]*c; m_x[1]=v[1]*c; m_x[2]=v[2]*c; m_x[3]=v[3]*c;
0094 m_c[0]=v(0); m_c[1]=v(1); m_h=v.m_h; m_s=v.m_s;
0095 }
0096
0097 void Add(const CObject *c);
0098 void Divide(const double &d);
0099 void Multiply(const Complex &c);
0100 void Invert();
0101
0102 inline SComplex &operator[](const int i) { return m_x[i]; }
0103
0104 inline const SComplex &operator[](const int i) const { return m_x[i]; }
0105
0106 inline CVec4 operator+(const CVec4 &v) const
0107 {
0108 return CVec4(m_x[0]+v[0],m_x[1]+v[1],m_x[2]+v[2],m_x[3]+v[3],
0109 m_c[0],m_c[1],m_h,m_s);
0110 }
0111 inline CVec4 operator-(const CVec4 &v) const
0112 {
0113 return CVec4(m_x[0]-v[0],m_x[1]-v[1],m_x[2]-v[2],m_x[3]-v[3],
0114 m_c[0],m_c[1],m_h,m_s);
0115 }
0116 inline CVec4 operator-() const
0117 {
0118 return CVec4(-m_x[0],-m_x[1],-m_x[2],-m_x[3],
0119 m_c[0],m_c[1],m_h,m_s);
0120 }
0121
0122 inline CVec4& operator+=(const CVec4 &v)
0123 {
0124 m_x[0]+=v[0]; m_x[1]+=v[1]; m_x[2]+=v[2]; m_x[3]+=v[3];
0125 return *this;
0126 }
0127 inline CVec4& operator-=(const CVec4 &v)
0128 {
0129 m_x[0]-=v[0]; m_x[1]-=v[1]; m_x[2]-=v[2]; m_x[3]-=v[3];
0130 return *this;
0131 }
0132 inline CVec4& operator*=(const SComplex &c)
0133 {
0134 m_x[0]*=c; m_x[1]*=c; m_x[2]*=c; m_x[3]*=c;
0135 return *this;
0136 }
0137
0138 inline CVec4 Conj() const
0139 {
0140 return CVec4(std::conj(m_x[0]),std::conj(m_x[1]),
0141 std::conj(m_x[2]),std::conj(m_x[3]),
0142 m_c[0],m_c[1],m_h,m_s);
0143 }
0144 inline SComplex Abs2() const
0145 {
0146 return m_x[0]*m_x[0]-m_x[1]*m_x[1]-m_x[2]*m_x[2]-m_x[3]*m_x[3];
0147 }
0148 inline SComplex Abs() const
0149 {
0150 return sqrt(Abs2());
0151 }
0152
0153 bool Nan() const;
0154
0155 static void ResetAccu();
0156
0157 inline static void SetAccu(const double &accu) { s_accu=accu; }
0158 inline static double Accu() { return s_accu; }
0159
0160 };
0161
0162 template <class Scalar> inline CVec4<Scalar>
0163 operator*(const Scalar &c,const CVec4<Scalar> &v)
0164 { return CVec4<Scalar>(v,c); }
0165 template <class Scalar> inline CVec4<Scalar>
0166 operator*(const CVec4<Scalar> &v,const Scalar &c)
0167 { return CVec4<Scalar>(v,c); }
0168 template <class Scalar> inline CVec4<Scalar>
0169 operator*(const std::complex<Scalar> &c,const CVec4<Scalar> &v)
0170 { return CVec4<Scalar>(v,c); }
0171 template <class Scalar> inline CVec4<Scalar>
0172 operator*(const CVec4<Scalar> &v,const std::complex<Scalar> &c)
0173 { return CVec4<Scalar>(v,c); }
0174 template <class Scalar> inline CVec4<Scalar>
0175 operator/(const CVec4<Scalar> &v,const std::complex<Scalar> &c)
0176 { return CVec4<Scalar>(v,Scalar(1.0)/c); }
0177
0178 template <class Scalar> inline std::complex<Scalar>
0179 operator*(const CVec4<Scalar> &v1,const ATOOLS::Vec4<Scalar> &v2)
0180 { return v1[0]*v2[0]-v1[1]*v2[1]-v1[2]*v2[2]-v1[3]*v2[3]; }
0181 template <class Scalar> inline std::complex<Scalar>
0182 operator*(const ATOOLS::Vec4<Scalar> &v1,const CVec4<Scalar> &v2)
0183 { return v1[0]*v2[0]-v1[1]*v2[1]-v1[2]*v2[2]-v1[3]*v2[3]; }
0184 template <class Scalar> inline std::complex<Scalar>
0185 operator*(const CVec4<Scalar> &v1,const CVec4<Scalar> &v2)
0186 { return v1[0]*v2[0]-v1[1]*v2[1]-v1[2]*v2[2]-v1[3]*v2[3]; }
0187
0188 template <class Scalar>
0189 std::ostream &operator<<(std::ostream &s,const CVec4<Scalar> &vec);
0190
0191 }
0192
0193 #define DCVec4D METOOLS::CVec4<double>
0194 #define QCVec4D METOOLS::CVec4<long double>
0195
0196 #endif