![]() |
|
|||
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
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |