Back to home page

EIC code displayed by LXR

 
 

    


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   };// end of class CVec4
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 }// end of namespace ATOOLS
0192 
0193 #define DCVec4D METOOLS::CVec4<double>
0194 #define QCVec4D METOOLS::CVec4<long double>
0195 
0196 #endif