00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef Physical_Qty_Complex_H
00010 #define Physical_Qty_Complex_H
00011 #include <complex>
00012
00017 namespace std {
00022 template<int DL, int DE, int DQ>
00023 class complex<ThePEG::Qty<0,0,0,DL,DE,DQ> >
00024 {
00025 public:
00027 complex(double r=0.0, double i=0.0)
00028 : rawValue_(r,i) {}
00029
00031 complex(complex<double> C)
00032 : rawValue_(C) {}
00033
00038 complex<double> rawValue() const { return rawValue_; }
00039
00041 double real() const { return rawValue_.real(); }
00042
00044 double imag() const { return rawValue_.imag(); }
00045
00047 operator complex<double>() const {
00048 return rawValue_;
00049 }
00050
00052 complex<ThePEG::Qty<0,0,0,DL,DE,DQ> > &
00053 operator+=(const complex<ThePEG::Qty<0,0,0,DL,DE,DQ> > x) {
00054 rawValue_ += x.rawValue();
00055 return *this;
00056 }
00057
00059 complex<ThePEG::Qty<0,0,0,DL,DE,DQ> > &
00060 operator-=(const complex<ThePEG::Qty<0,0,0,DL,DE,DQ> > x) {
00061 rawValue_ -= x.rawValue();
00062 return *this;
00063 }
00064
00065 private:
00067 complex<double> rawValue_;
00068 };
00069 }
00070
00071
00072 namespace ThePEG {
00073
00075
00076
00077 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00078 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00079 inline std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00080 DL1*DL2,DE1*DE2,DQ1*DQ2> >
00081 operator*(std::complex<Qty<L1,E1,Q1,DL1,DE1,DQ1> > q1,
00082 std::complex<Qty<L2,E2,Q2,DL2,DE2,DQ2> > q2) {
00083 typedef std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00084 DL1*DL2,DE1*DE2,DQ1*DQ2> > RetT;
00085 return RetT(q1.real()*q2.real() - q1.imag()*q2.imag(),
00086 q1.real()*q2.imag() + q1.imag()*q2.real());
00087 }
00088
00089
00090 template<int L, int E, int Q, int DL, int DE, int DQ>
00091 inline std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> >
00092 operator*(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00093 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00094 typedef std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> > RetT;
00095 return RetT(q1.real()*q2.real() - q1.imag()*q2.imag(),
00096 q1.real()*q2.imag() + q1.imag()*q2.real());
00097 }
00098
00099
00100 template<int DL, int DE, int DQ>
00101 inline std::complex<double>
00102 operator-(std::complex<double> q1,
00103 std::complex<Qty<0,0,0,DL,DE,DQ> > q2) {
00104 typedef std::complex<double> RetT;
00105 return RetT(q1.real()-q2.real(),q1.imag()-q2.imag());
00106 }
00107
00108
00109 template<int L, int E, int Q, int DL, int DE, int DQ>
00110 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00111 operator*(std::complex<double> q1,
00112 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00113 typedef std::complex<Qty<L,E,Q,DL,DE,DQ> > RetT;
00114 return RetT(q1.real()*q2.real() - q1.imag()*q2.imag(),
00115 q1.real()*q2.imag() + q1.imag()*q2.real());
00116 }
00117
00118
00119 template<int L, int E, int Q, int DL, int DE, int DQ>
00120 inline std::complex<Qty<-L,-E,-Q,DL,DE,DQ> >
00121 operator/(std::complex<double> q1,
00122 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00123 typedef std::complex<Qty<-L,-E,-Q,DL,DE,DQ> > RetT;
00124 std::complex<Qty<L,E,Q,DL,DE,DQ> > tmp = q1*conj(q2);
00125 Qty<2*L,2*E,2*Q,DL,DE,DQ> norm = (q2*conj(q2)).real();
00126 return RetT(tmp.real()/norm,tmp.imag()/norm);
00127 }
00128
00129
00130 template<int L, int E, int Q, int DL, int DE, int DQ>
00131 inline std::complex<Qty<-L,-E,-Q,DL,DE,DQ> >
00132 operator/(std::complex<double> q1,
00133 Qty<L,E,Q,DL,DE,DQ> q2) {
00134 typedef std::complex<Qty<-L,-E,-Q,DL,DE,DQ> > RetT;
00135 return RetT(q1.real()/q2,q1.imag()/q2);
00136 }
00137
00138
00139 template<int L, int E, int Q, int DL, int DE, int DQ>
00140 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00141 operator/(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00142 std::complex<double> q2) {
00143 std::complex<Qty<L,E,Q,DL,DE,DQ> > tmp = q1*conj(q2);
00144 double norm = (q2*conj(q2)).real();
00145 return std::complex<Qty<L,E,Q,DL,DE,DQ> >(tmp.real()/norm,tmp.imag()/norm);
00146 }
00147
00148
00149 template<int L, int E, int Q, int DL, int DE, int DQ>
00150 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00151 operator/(Qty<L,E,Q,DL,DE,DQ> q1,
00152 std::complex<double> q2) {
00153 std::complex<Qty<L,E,Q,DL,DE,DQ> > tmp = q1*conj(q2);
00154 double norm = (q2*conj(q2)).real();
00155 return std::complex<Qty<L,E,Q,DL,DE,DQ> >(tmp.real()/norm,tmp.imag()/norm);
00156 }
00157
00158
00159 template<int L, int E, int Q, int DL, int DE, int DQ>
00160 inline std::complex<double>
00161 operator/(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00162 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00163 std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> > tmp = q1*conj(q2);
00164 Qty<2*L,2*E,2*Q,DL,DE,DQ> norm = (q2*conj(q2)).real();
00165 return std::complex<double>(tmp.real()/norm,tmp.imag()/norm);
00166 }
00167
00168
00169 template<int L, int E, int Q, int DL, int DE, int DQ>
00170 inline std::complex<double>
00171 operator/(Qty<L,E,Q,DL,DE,DQ> q1,
00172 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00173 std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> > tmp = q1*conj(q2);
00174 Qty<2*L,2*E,2*Q,DL,DE,DQ> norm = (q2*conj(q2)).real();
00175 return std::complex<double>(tmp.real()/norm,tmp.imag()/norm);
00176 }
00177
00178
00179 template<int L, int E, int Q, int DL, int DE, int DQ>
00180 inline std::complex<double>
00181 operator/(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00182 Qty<L,E,Q,DL,DE,DQ> q2) {
00183 return std::complex<double>(q1.real()/q2,q1.imag()/q2);
00184 }
00185
00186
00187 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00188 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00189 inline std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2> >
00190 operator/(std::complex<Qty<L1,E1,Q1,DL1,DE1,DQ1> > q1,
00191 std::complex<Qty<L2,E2,Q2,DL2,DE2,DQ2> > q2) {
00192 typedef std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,
00193 DL1*DL2,DE1*DE2,DQ1*DQ2> > RetT;
00194 std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00195 DL1*DL2,DE1*DE2,DQ1*DQ2> > tmp = q1*conj(q2);
00196 Qty<2*L2,2*E2,2*Q2,DL2,DE2,DQ2> norm = (q2*conj(q2)).real();
00197 return RetT(tmp.real()/norm,tmp.imag()/norm);
00198 }
00199
00200
00201 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00202 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00203 inline std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2> >
00204 operator/(Qty<L1,E1,Q1,DL1,DE1,DQ1> q1,
00205 std::complex<Qty<L2,E2,Q2,DL2,DE2,DQ2> > q2) {
00206 typedef std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,
00207 DL1*DL2,DE1*DE2,DQ1*DQ2> > RetT;
00208 std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00209 DL1*DL2,DE1*DE2,DQ1*DQ2> > tmp = q1*conj(q2);
00210 Qty<2*L2,2*E2,2*Q2,DL2,DE2,DQ2> norm = (q2*conj(q2)).real();
00211 return RetT(tmp.real()/norm,tmp.imag()/norm);
00212 }
00213
00214
00215 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00216 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00217 inline std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2> >
00218 operator/(std::complex<Qty<L1,E1,Q1,DL1,DE1,DQ1> > q1,
00219 Qty<L2,E2,Q2,DL2,DE2,DQ2> q2) {
00220 typedef std::complex<Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,
00221 DL1*DL2,DE1*DE2,DQ1*DQ2> > RetT;
00222 return RetT(q1.real()/q2,q1.imag()/q2);
00223 }
00224
00225
00226
00227 template<int L, int E, int Q, int DL, int DE, int DQ>
00228 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00229 operator*(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00230 std::complex<double> q2) {
00231 return q2 * q1;
00232 }
00233
00234
00235
00236 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00237 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00238 inline std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00239 DL1*DL2,DE1*DE2,DQ1*DQ2> >
00240 operator*(Qty<L1,E1,Q1,DL1,DE1,DQ1> q1,
00241 std::complex<Qty<L2,E2,Q2,DL2,DE2,DQ2> > q2) {
00242 typedef std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00243 DL1*DL2,DE1*DE2,DQ1*DQ2> > RetT;
00244 return RetT(q1*q2.real(), q1*q2.imag());
00245 }
00246
00247
00248 template<int L, int E, int Q, int DL, int DE, int DQ>
00249 inline std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> >
00250 operator*(Qty<L,E,Q,DL,DE,DQ> q1,
00251 std::complex<Qty<L,E,Q,DL,DE,DQ> > q2) {
00252 typedef std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> > RetT;
00253 return RetT(q1*q2.real(), q1*q2.imag());
00254 }
00255
00256
00257 template<int L, int E, int Q, int DL, int DE, int DQ>
00258 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00259 operator*(Qty<L,E,Q,DL,DE,DQ> q1,
00260 std::complex<double> q2) {
00261 typedef std::complex<Qty<L,E,Q,DL,DE,DQ> > RetT;
00262 return RetT(q1*q2.real(), q1*q2.imag());
00263 }
00264
00265
00266 template<int L, int E, int Q, int DL, int DE, int DQ>
00267 inline std::complex<Qty<L,E,Q,DL,DE,DQ> >
00268 operator*(std::complex<double> q1,
00269 Qty<L,E,Q,DL,DE,DQ> q2) {
00270 return q2 * q1;
00271 }
00272
00273
00274
00275 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
00276 int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
00277 inline std::complex<Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,
00278 DL1*DL2,DE1*DE2,DQ1*DQ2> >
00279 operator*(std::complex<Qty<L1,E1,Q1,DL1,DE1,DQ1> > q1,
00280 Qty<L2,E2,Q2,DL2,DE2,DQ2> q2) {
00281 return q2 * q1;
00282 }
00283
00284
00285 template<int L, int E, int Q, int DL, int DE, int DQ>
00286 inline std::complex<Qty<2*L,2*E,2*Q,DL,DE,DQ> >
00287 operator*(std::complex<Qty<L,E,Q,DL,DE,DQ> > q1,
00288 Qty<L,E,Q,DL,DE,DQ> q2) {
00289 return q2 * q1;
00290 }
00291
00292
00293 template<int L, int E, int Q, int DL, int DE, int DQ>
00294 inline std::complex<Qty<L,E,Q,DL,DE,DQ> > &
00295 operator*=(std::complex<Qty<L,E,Q,DL,DE,DQ> > & q1,
00296 std::complex<double> q2) {
00297 q1 = q1 * q2;
00298 return q1;
00299 }
00300
00301
00302 template<int L, int E, int Q, int DL, int DE, int DQ>
00303 inline std::complex<Qty<L,E,Q,DL,DE,DQ> > &
00304 operator*=(std::complex<Qty<L,E,Q,DL,DE,DQ> > & q1,
00305 double q2) {
00306 q1 = q1 * q2;
00307 return q1;
00308 }
00309
00310
00311 template<int L, int E, int Q, int DL, int DE, int DQ>
00312 inline std::complex<Qty<L,E,Q,DL,DE,DQ> > &
00313 operator/=(std::complex<Qty<L,E,Q,DL,DE,DQ> > & q1,
00314 std::complex<double> q2) {
00315 q1 = q1 / q2;
00316 return q1;
00317 }
00318
00319
00320 template<int L, int E, int Q, int DL, int DE, int DQ>
00321 inline std::complex<Qty<L,E,Q,DL,DE,DQ> > &
00322 operator/=(std::complex<Qty<L,E,Q,DL,DE,DQ> > & q1,
00323 double q2) {
00324 q1 = q1 / q2;
00325 return q1;
00326 }
00328 }
00329
00330 #endif