Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:09:50

0001 #ifndef ATOOLS_Math_Tensor_Build_H
0002 #define ATOOLS_Math_Tensor_Build_H
0003 
0004 /********************************************************************************************
0005 ******                                                                                 ******
0006 ******       tensor builds                                                             ******
0007 ******                                                                                 ******
0008 ********************************************************************************************/
0009 
0010 template<typename Scal1, typename Scal2> 
0011 Lorentz_Ten2<PROMOTE(Scal1,Scal2)> 
0012 ATOOLS::BuildTensor(const Vec4<Scal1>& p, const Vec4<Scal2>& q) {
0013   // T^{mu,nu} = p^{mu} q^{nu}
0014   PROMOTE(Scal1,Scal2) x[4][4];
0015   for (unsigned short int i=0; i<4; i++)
0016     for (unsigned short int j=0; j<4; j++)
0017       x[i][j] = p[i]*q[j];
0018   return Lorentz_Ten2<PROMOTE(Scal1,Scal2)>(x);
0019 //   return Lorentz_Ten2<PROMOTE(Scal1,Scal2)>(p[0]*q[0],p[1]*q[0],p[2]*q[0],p[3]*q[0],
0020 //                                             p[0]*q[1],p[1]*q[1],p[2]*q[1],p[3]*q[1],
0021 //                                             p[0]*q[2],p[1]*q[2],p[2]*q[2],p[3]*q[2],
0022 //                                             p[0]*q[3],p[1]*q[3],p[2]*q[3],p[3]*q[3]);
0023 }
0024 
0025 template<typename Scal1, typename Scal2, typename Scal3> 
0026 Lorentz_Ten3<PROMOTE(Scal1,PROMOTE(Scal2,Scal3))> 
0027 ATOOLS::BuildTensor(const Vec4<Scal1>& p1, const Vec4<Scal2>& p2, const Vec4<Scal3>& p3) {
0028   // T^{mu,nu,rho} = p1^{mu} p2^{nu} p3^{rho}
0029   PROMOTE(Scal1,PROMOTE(Scal2,Scal3)) x[4][4][4];
0030   for (unsigned short int i=0; i<4; ++i)
0031     for (unsigned short int j=0; j<4; ++j)
0032       for (unsigned short int k=0; k<4; ++k)
0033         x[i][j][k] = p1[i]*p2[j]*p3[k];
0034   return Lorentz_Ten3<PROMOTE(Scal1,PROMOTE(Scal2,Scal3))>(x);
0035 //   return BuildTensor(BuildTensor(p1,p2),p3);
0036 //   return Lorentz_Ten3<PROMOTE(Scal1,PROMOTE(Scal2,Scal3))>(
0037 //             p1[0]*p2[0]*p3[0],p1[1]*p2[0]*p3[0],p1[2]*p2[0]*p3[0],p1[3]*p2[0]*p3[0],
0038 //             p1[0]*p2[1]*p3[0],p1[1]*p2[1]*p3[0],p1[2]*p2[1]*p3[0],p1[3]*p2[1]*p3[0],
0039 //             p1[0]*p2[2]*p3[0],p1[1]*p2[2]*p3[0],p1[2]*p2[2]*p3[0],p1[3]*p2[2]*p3[0],
0040 //             p1[0]*p2[3]*p3[0],p1[1]*p2[3]*p3[0],p1[2]*p2[3]*p3[0],p1[3]*p2[3]*p3[0],
0041 //             p1[0]*p2[0]*p3[1],p1[1]*p2[0]*p3[1],p1[2]*p2[0]*p3[1],p1[3]*p2[0]*p3[1],
0042 //             p1[0]*p2[1]*p3[1],p1[1]*p2[1]*p3[1],p1[2]*p2[1]*p3[1],p1[3]*p2[1]*p3[1],
0043 //             p1[0]*p2[2]*p3[1],p1[1]*p2[2]*p3[1],p1[2]*p2[2]*p3[1],p1[3]*p2[2]*p3[1],
0044 //             p1[0]*p2[3]*p3[1],p1[1]*p2[3]*p3[1],p1[2]*p2[3]*p3[1],p1[3]*p2[3]*p3[1],
0045 //             p1[0]*p2[0]*p3[2],p1[1]*p2[0]*p3[2],p1[2]*p2[0]*p3[2],p1[3]*p2[0]*p3[2],
0046 //             p1[0]*p2[1]*p3[2],p1[1]*p2[1]*p3[2],p1[2]*p2[1]*p3[2],p1[3]*p2[1]*p3[2],
0047 //             p1[0]*p2[2]*p3[2],p1[1]*p2[2]*p3[2],p1[2]*p2[2]*p3[2],p1[3]*p2[2]*p3[2],
0048 //             p1[0]*p2[3]*p3[2],p1[1]*p2[3]*p3[2],p1[2]*p2[3]*p3[2],p1[3]*p2[3]*p3[2],
0049 //             p1[0]*p2[0]*p3[3],p1[1]*p2[0]*p3[3],p1[2]*p2[0]*p3[3],p1[3]*p2[0]*p3[3],
0050 //             p1[0]*p2[1]*p3[3],p1[1]*p2[1]*p3[3],p1[2]*p2[1]*p3[3],p1[3]*p2[1]*p3[3],
0051 //             p1[0]*p2[2]*p3[3],p1[1]*p2[2]*p3[3],p1[2]*p2[2]*p3[3],p1[3]*p2[2]*p3[3],
0052 //             p1[0]*p2[3]*p3[3],p1[1]*p2[3]*p3[3],p1[2]*p2[3]*p3[3],p1[3]*p2[3]*p3[3]);
0053 }
0054 
0055 template<typename Scal1, typename Scal2> 
0056 Lorentz_Ten3<PROMOTE(Scal1,Scal2)> 
0057 ATOOLS::BuildTensor(const Lorentz_Ten2<Scal1>& t, const Vec4<Scal2>& p) {
0058   // T^{mu,nu,rho} = t^{mu,nu} p^{rho}
0059   PROMOTE(Scal1,Scal2) x[4][4][4];
0060   for (unsigned short int i=0; i<4; ++i)
0061     for (unsigned short int j=0; j<4; ++j)
0062       for (unsigned short int k=0; k<4; ++k)
0063         x[i][j][k] = t.at(i,j)*p[k];
0064   return Lorentz_Ten3<PROMOTE(Scal1,Scal2)>(x);
0065 //   return Lorentz_Ten3<PROMOTE(Scal1,Scal2)>(
0066 //             t.at(0,0)*p[0],t.at(1,0)*p[0],t.at(2,0)*p[0],t.at(3,0)*p[0],
0067 //             t.at(0,1)*p[0],t.at(1,1)*p[0],t.at(2,1)*p[0],t.at(3,1)*p[0],
0068 //             t.at(0,2)*p[0],t.at(1,2)*p[0],t.at(2,2)*p[0],t.at(3,2)*p[0],
0069 //             t.at(0,3)*p[0],t.at(1,3)*p[0],t.at(2,3)*p[0],t.at(3,3)*p[0],
0070 //             t.at(0,0)*p[1],t.at(1,0)*p[1],t.at(2,0)*p[1],t.at(3,0)*p[1],
0071 //             t.at(0,1)*p[1],t.at(1,1)*p[1],t.at(2,1)*p[1],t.at(3,1)*p[1],
0072 //             t.at(0,2)*p[1],t.at(1,2)*p[1],t.at(2,2)*p[1],t.at(3,2)*p[1],
0073 //             t.at(0,3)*p[1],t.at(1,3)*p[1],t.at(2,3)*p[1],t.at(3,3)*p[1],
0074 //             t.at(0,0)*p[2],t.at(1,0)*p[2],t.at(2,0)*p[2],t.at(3,0)*p[2],
0075 //             t.at(0,1)*p[2],t.at(1,1)*p[2],t.at(2,1)*p[2],t.at(3,1)*p[2],
0076 //             t.at(0,2)*p[2],t.at(1,2)*p[2],t.at(2,2)*p[2],t.at(3,2)*p[2],
0077 //             t.at(0,3)*p[2],t.at(1,3)*p[2],t.at(2,3)*p[2],t.at(3,3)*p[2],
0078 //             t.at(0,0)*p[3],t.at(1,0)*p[3],t.at(2,0)*p[3],t.at(3,0)*p[3],
0079 //             t.at(0,1)*p[3],t.at(1,1)*p[3],t.at(2,1)*p[3],t.at(3,1)*p[3],
0080 //             t.at(0,2)*p[3],t.at(1,2)*p[3],t.at(2,2)*p[3],t.at(3,2)*p[3],
0081 //             t.at(0,3)*p[3],t.at(1,3)*p[3],t.at(2,3)*p[3],t.at(3,3)*p[3]);
0082 }
0083 
0084 template<typename Scal1, typename Scal2, typename Scal3, typename Scal4> 
0085 Lorentz_Ten4<PROMOTE(Scal1,PROMOTE(Scal2,PROMOTE(Scal3,Scal4)))> 
0086 ATOOLS::BuildTensor(const Vec4<Scal1>& p1, const Vec4<Scal2>& p2,
0087                     const Vec4<Scal3>& p3, const Vec4<Scal4>& p4) {
0088   // T^{mu,nu,rho,sigma} = p1^{mu} p2^{nu} p3^{rho} p4^{sigma}
0089   PROMOTE(Scal1,PROMOTE(Scal2,PROMOTE(Scal3,Scal4))) x[4][4][4][4];
0090   for (unsigned short int i=0; i<4; ++i)
0091     for (unsigned short int j=0; j<4; ++j)
0092       for (unsigned short int k=0; k<4; ++k)
0093         for (unsigned short int l=0; l<4; ++l)
0094           x[i][j][k][l] = p1[i]*p2[j]*p3[k]*p4[l];
0095   return Lorentz_Ten4<PROMOTE(Scal1,PROMOTE(Scal2,PROMOTE(Scal3,Scal4)))>(x);
0096 //   return BuildTensor(BuildTensor(p1,p2),BuildTensor(p3,p4));
0097 //   return BuildTensor(BuildTensor(p1,p2,p3),p4);
0098 }
0099 
0100 template<typename Scal1, typename Scal2>
0101 Lorentz_Ten4<PROMOTE(Scal1,Scal2)>
0102 ATOOLS::BuildTensor(const Lorentz_Ten2<Scal1>& t, const Lorentz_Ten2<Scal2>& s) {
0103   // T^{mu,nu,rho,sigma} = t^{mu,nu} s^{rho,sigma}
0104   PROMOTE(Scal1,Scal2) x[4][4][4][4];
0105   for (unsigned short int i=0; i<4; ++i)
0106     for (unsigned short int j=0; j<4; ++j)
0107       for (unsigned short int k=0; k<4; ++k)
0108         for (unsigned short int l=0; l<4; ++l)
0109           x[i][j][k][l] = t.at(i,j)*s.at(k,l);
0110   return Lorentz_Ten4<PROMOTE(Scal1,Scal2)>(x);
0111 }
0112 
0113 template<typename Scal1, typename Scal2> 
0114 Lorentz_Ten4<PROMOTE(Scal1,Scal2)> 
0115 ATOOLS::BuildTensor(const Lorentz_Ten3<Scal1>& t, const Vec4<Scal2>& p) {
0116   // T^{mu,nu,rho,sigma} = t^{mu,nu,rho} p^{sigma}
0117   PROMOTE(Scal1,Scal2) x[4][4][4][4];
0118   for (unsigned short int i=0; i<4; ++i)
0119     for (unsigned short int j=0; j<4; ++j)
0120       for (unsigned short int k=0; k<4; ++k)
0121         for (unsigned short int l=0; l<4; ++l)
0122           x[i][j][k][l] = t.at(i,j,k)*p[l];
0123   return Lorentz_Ten4<PROMOTE(Scal1,Scal2)>(x);
0124 }
0125 
0126 #endif