File indexing completed on 2025-04-19 09:09:51
0001 #ifndef ATOOLS_Math_Tensor_Contractions_Epsilon_H
0002 #define ATOOLS_Math_Tensor_Contractions_Epsilon_H
0003
0004
0005
0006
0007
0008
0009
0010 template<typename Scalar>
0011 Lorentz_Ten3<Scalar>
0012 ATOOLS::EpsilonTensorContraction(const Vec4<Scalar>& v) {
0013
0014 return Lorentz_Ten3<Scalar>(
0015 0. , 0. , 0. , 0. ,
0016 0. , 0. ,-v[3], v[2],
0017 0. , v[3], 0. ,-v[1],
0018 0. ,-v[2], v[1], 0. ,
0019 0. , 0. , v[3],-v[2],
0020 0. , 0. , 0. , 0. ,
0021 -v[3], 0. , 0. , v[0],
0022 v[2], 0. ,-v[0], 0. ,
0023 0. ,-v[3], 0. , v[1],
0024 v[3], 0. , 0. ,-v[0],
0025 0. , 0. , 0. , 0. ,
0026 -v[1], v[0], 0. , 0. ,
0027 0. , v[2],-v[1], 0. ,
0028 -v[2], 0. , v[0], 0. ,
0029 v[1],-v[0], 0. , 0. ,
0030 0. , 0. , 0. , 0. );
0031 }
0032
0033 template<typename Scal1, typename Scal2>
0034 Lorentz_Ten2<PROMOTE(Scal1,Scal2)>
0035 ATOOLS::EpsilonTensorContraction(const Vec4<Scal1>& p, const Vec4<Scal2>& q) {
0036
0037
0038 return Lorentz_Ten2<PROMOTE(Scal1,Scal2)>(
0039 0. , -p[2]*q[3]+p[3]*q[2] , p[1]*q[3]-p[3]*q[1] , -p[1]*q[2]+p[2]*q[1] ,
0040 p[2]*q[3]-p[3]*q[2] , 0. , -p[0]*q[3]+p[3]*q[0] , p[0]*q[2]-p[2]*q[0] ,
0041 -p[1]*q[3]+p[3]*q[1] , p[0]*q[3]-p[3]*q[0] , 0. , -p[0]*q[1]+p[1]*q[0] ,
0042 p[1]*q[2]-p[2]*q[1] , -p[0]*q[2]+p[2]*q[0] , p[0]*q[1]-p[1]*q[0] , 0. );
0043 }
0044
0045 template<typename Scal1, typename Scal2, typename Scal3>
0046 Vec4<PROMOTE(Scal1,PROMOTE(Scal2,Scal3))>
0047 ATOOLS::EpsilonTensorContraction(const Vec4<Scal1>& p1, const Vec4<Scal2>& p2,
0048 const Vec4<Scal3>& p3) {
0049
0050
0051
0052
0053
0054 return EpsilonTensorContraction(BuildTensor(p1,p2,p3),2,3,4);
0055 }
0056
0057 template<typename Scal1, typename Scal2, typename Scal3, typename Scal4>
0058 PROMOTE(Scal1,PROMOTE(Scal2,PROMOTE(Scal3,Scal4)))
0059 ATOOLS::EpsilonTensorContraction(const Vec4<Scal1>& p1, const Vec4<Scal2>& p2,
0060 const Vec4<Scal3>& p3, const Vec4<Scal4>& p4) {
0061
0062
0063
0064 return p1[0]*p2[1]*p3[2]*p4[3]
0065 -p1[0]*p2[1]*p3[3]*p4[2]
0066 -p1[0]*p2[2]*p3[1]*p4[3]
0067 +p1[0]*p2[2]*p3[3]*p4[1]
0068 +p1[0]*p2[3]*p3[1]*p4[2]
0069 -p1[0]*p2[3]*p3[2]*p4[1]
0070
0071 -p1[1]*p2[0]*p3[2]*p4[3]
0072 +p1[1]*p2[0]*p3[3]*p4[2]
0073 +p1[1]*p2[2]*p3[0]*p4[3]
0074 -p1[1]*p2[2]*p3[3]*p4[0]
0075 -p1[1]*p2[3]*p3[0]*p4[2]
0076 +p1[1]*p2[3]*p3[2]*p4[0]
0077
0078 +p1[2]*p2[0]*p3[1]*p4[3]
0079 -p1[2]*p2[0]*p3[3]*p4[1]
0080 -p1[2]*p2[1]*p3[0]*p4[3]
0081 +p1[2]*p2[1]*p3[3]*p4[0]
0082 +p1[2]*p2[3]*p3[0]*p4[1]
0083 -p1[2]*p2[3]*p3[1]*p4[0]
0084
0085 -p1[3]*p2[0]*p3[1]*p4[2]
0086 +p1[3]*p2[0]*p3[2]*p4[1]
0087 +p1[3]*p2[1]*p3[0]*p4[2]
0088 -p1[3]*p2[1]*p3[2]*p4[0]
0089 -p1[3]*p2[2]*p3[0]*p4[1]
0090 +p1[3]*p2[2]*p3[1]*p4[0];
0091 }
0092
0093 template<typename Scalar>
0094 Lorentz_Ten2<Scalar>
0095 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten2<Scalar>& t, int i, int j) {
0096
0097 if ((i==3) && (j==4))
0098 return Lorentz_Ten2<Scalar>(
0099 0. , -t.at(2,3)+t.at(3,2) , t.at(1,3)-t.at(3,1) , -t.at(1,2)+t.at(2,1) ,
0100 t.at(2,3)-t.at(3,2) , 0. , -t.at(0,3)+t.at(3,0) , t.at(0,2)-t.at(2,0) ,
0101 -t.at(1,3)+t.at(3,1) , t.at(0,3)-t.at(3,0) , 0. , -t.at(0,1)+t.at(1,0) ,
0102 t.at(1,2)-t.at(2,1) , -t.at(0,2)+t.at(2,0) , t.at(0,1)-t.at(1,0) , 0. );
0103 else if ((j==3) && (i==4))
0104 return -Lorentz_Ten2<Scalar>(
0105 0. , -t.at(2,3)+t.at(3,2) , t.at(1,3)-t.at(3,1) , -t.at(1,2)+t.at(2,1) ,
0106 t.at(2,3)-t.at(3,2) , 0. , -t.at(0,3)+t.at(3,0) , t.at(0,2)-t.at(2,0) ,
0107 -t.at(1,3)+t.at(3,1) , t.at(0,3)-t.at(3,0) , 0. , -t.at(0,1)+t.at(1,0) ,
0108 t.at(1,2)-t.at(2,1) , -t.at(0,2)+t.at(2,0) , t.at(0,1)-t.at(1,0) , 0. );
0109 return Lorentz_Ten2<Scalar>();
0110 }
0111
0112 template<typename Scal1, typename Scal2>
0113 Vec4<PROMOTE(Scal1,Scal2)>
0114 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten2<Scal1>& t, int i, int j,
0115 const Vec4<Scal2>& p, int k) {
0116
0117
0118 return EpsilonTensorContraction(BuildTensor(t,p),i,j,k);
0119 }
0120
0121 template<typename Scalar>
0122 Vec4<Scalar>
0123 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten3<Scalar>& ten, int i, int j, int k) {
0124 Lorentz_Ten3<Scalar> t;
0125
0126 if ((i==2) && (j==3) && (k==4))
0127 t = ten;
0128
0129 else if ((i==2) && (j==4) && (k==3))
0130 t = ten.Transpose(2,3);
0131
0132 else if ((i==3) && (j==2) && (k==4))
0133 t = ten.Transpose(1,2);
0134
0135 else if ((i==3) && (j==4) && (k==2))
0136 {t = ten.Transpose(2,3); t = t.Transpose(1,2);}
0137
0138 else if ((i==4) && (j==2) && (k==3))
0139 {t = ten.Transpose(1,2); t = t.Transpose(2,3);}
0140
0141 else if ((i==4) && (j==3) && (k==2))
0142 t = ten.Transpose(1,3);
0143 else
0144 return Vec4<Scalar>(0.,0.,0.,0.);
0145 return Vec4<Scalar>(
0146 t.at(3,2,1)-t.at(2,3,1)+t.at(1,3,2)-t.at(3,1,2)+t.at(2,1,3)-t.at(1,2,3),
0147 t.at(3,2,0)-t.at(2,3,0)+ t.at(0,3,2)-t.at(3,0,2)+t.at(2,0,3)-t.at(0,2,3),
0148 t.at(1,3,0)-t.at(3,1,0)+t.at(3,0,1)-t.at(0,3,1)+ t.at(0,1,3)-t.at(1,0,3),
0149 t.at(2,1,0)-t.at(1,2,0)+t.at(0,2,1)-t.at(2,1,0)+t.at(1,0,2)-t.at(0,1,2) );
0150 }
0151
0152 template<typename Scal1, typename Scal2>
0153 PROMOTE(Scal1,Scal2)
0154 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten2<Scal1>& ten, int i, int j,
0155 const Lorentz_Ten2<Scal2>& sen, int k, int l) {
0156
0157
0158
0159 return EpsilonTensorContraction(BuildTensor(ten,sen),i,j,k,l);
0160 }
0161
0162 template<typename Scal1, typename Scal2>
0163 PROMOTE(Scal1,Scal2)
0164 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten3<Scal1>& ten, int i, int j, int k,
0165 const Vec4<Scal2>& v, int l) {
0166
0167
0168
0169 return EpsilonTensorContraction(BuildTensor(ten,v),i,j,k,l);
0170 }
0171
0172 template<typename Scalar>
0173 Scalar
0174 ATOOLS::EpsilonTensorContraction(const Lorentz_Ten4<Scalar>& ten, int i, int j, int k, int l) {
0175 Lorentz_Ten4<Scalar> t;
0176
0177
0178
0179 if ((i == 1) && (j == 2) && (k == 3) && (l == 4))
0180 {t = ten;}
0181 else if ((i == 1) && (j == 2) && (k == 4) && (l == 3))
0182 {t = ten.Transpose(3,4);}
0183 else if ((i == 1) && (j == 3) && (k == 2) && (l == 4))
0184 {t = ten.Transpose(2,3);}
0185 else if ((i == 1) && (j == 3) && (k == 4) && (l == 2))
0186 {t = ten.Transpose(3,4); t = t.Transpose(2,3);}
0187 else if ((i == 1) && (j == 4) && (k == 2) && (l == 3))
0188 {t = ten.Transpose(2,3); t = t.Transpose(3,4);}
0189 else if ((i == 1) && (j == 4) && (k == 3) && (l == 2))
0190 {t = ten.Transpose(2,4);}
0191 else if ((i == 2) && (j == 1) && (k == 3) && (l == 4))
0192 {t = ten.Transpose(1,2);}
0193 else if ((i == 2) && (j == 1) && (k == 4) && (l == 3))
0194 {t = ten.Transpose(1,2); t = t.Transpose(3,4);}
0195 else if ((i == 2) && (j == 3) && (k == 1) && (l == 4))
0196 {t = ten.Transpose(2,3); t = t.Transpose(3,4);}
0197 else if ((i == 2) && (j == 3) && (k == 4) && (l == 1))
0198 {t = ten.Transpose(3,4); t = t.Transpose(2,3); t = t.Transpose(1,2);}
0199 else if ((i == 2) && (j == 4) && (k == 1) && (l == 3))
0200 {t = ten.Transpose(1,3); t = t.Transpose(2,3); t = t.Transpose(3,4);}
0201 else if ((i == 2) && (j == 4) && (k == 3) && (l == 1))
0202 {t = ten.Transpose(2,4); t = t.Transpose(1,2);}
0203 else if ((i == 3) && (j == 1) && (k == 2) && (l == 4))
0204 {t = ten.Transpose(1,2); t = t.Transpose(2,3);}
0205 else if ((i == 3) && (j == 1) && (k == 4) && (l == 2))
0206 {t = ten.Transpose(1,2); t = t.Transpose(2,4); t = t.Transpose(3,4);}
0207 else if ((i == 3) && (j == 2) && (k == 1) && (l == 4))
0208 {t = ten.Transpose(1,3);}
0209 else if ((i == 3) && (j == 2) && (k == 4) && (l == 1))
0210 {t = ten.Transpose(1,4); t = t.Transpose(3,4);}
0211 else if ((i == 3) && (j == 4) && (k == 1) && (l == 2))
0212 {t = ten.Transpose(1,3); t = t.Transpose(2,4);}
0213 else if ((i == 3) && (j == 4) && (k == 2) && (l == 1))
0214 {t = ten.Transpose(1,4); t = t.Transpose(2,3); t = t.Transpose(3,4);}
0215 else if ((i == 4) && (j == 1) && (k == 2) && (l == 3))
0216 {t = ten.Transpose(1,2); t = t.Transpose(2,3); t = t.Transpose(3,4);}
0217 else if ((i == 4) && (j == 1) && (k == 3) && (l == 2))
0218 {t = ten.Transpose(1,2); t = t.Transpose(2,4);}
0219 else if ((i == 4) && (j == 2) && (k == 1) && (l == 3))
0220 {t = ten.Transpose(1,3); t = t.Transpose(3,4);}
0221 else if ((i == 4) && (j == 2) && (k == 3) && (l == 1))
0222 {t = ten.Transpose(1,4);}
0223 else if ((i == 4) && (j == 3) && (k == 1) && (l == 2))
0224 {t = ten.Transpose(1,3); t = t.Transpose(2,4); t = t.Transpose(3,4);}
0225 else if ((i == 4) && (j == 3) && (k == 2) && (l == 1))
0226 {t = ten.Transpose(1,4); t = t.Transpose(2,3);}
0227 else
0228 return 0.;
0229 return t.at(0,1,2,3)
0230 -t.at(0,1,3,2)
0231 -t.at(0,2,1,3)
0232 +t.at(0,2,3,1)
0233 +t.at(0,3,1,2)
0234 -t.at(0,3,2,1)
0235
0236 -t.at(1,0,2,3)
0237 +t.at(1,0,3,2)
0238 +t.at(1,2,0,3)
0239 -t.at(1,2,3,0)
0240 -t.at(1,3,0,2)
0241 +t.at(1,3,2,0)
0242
0243 +t.at(2,0,1,3)
0244 -t.at(2,0,3,1)
0245 -t.at(2,1,0,3)
0246 +t.at(2,1,3,0)
0247 +t.at(2,3,0,1)
0248 -t.at(2,3,1,0)
0249
0250 -t.at(3,0,1,2)
0251 +t.at(3,0,2,1)
0252 +t.at(3,1,0,2)
0253 -t.at(3,1,2,0)
0254 -t.at(3,2,0,1)
0255 +t.at(3,2,1,0);
0256 }
0257
0258 #endif