00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "EvtGenBase/EvtPatches.hh"
00022 #include <iostream>
00023 #include <math.h>
00024 #include "EvtGenBase/EvtComplex.hh"
00025 #include "EvtGenBase/EvtVector3C.hh"
00026 #include "EvtGenBase/EvtTensor3C.hh"
00027 #include "EvtGenBase/EvtReport.hh"
00028 using std::endl;
00029 using std::ostream;
00030
00031
00032 EvtTensor3C::~EvtTensor3C(){}
00033
00034
00035 EvtTensor3C::EvtTensor3C( const EvtTensor3C& t1 ) {
00036
00037 int i,j;
00038
00039 for(i=0;i<3;i++) {
00040 for(j=0;j<3;j++) {
00041 t[i][j] = t1.t[i][j];
00042 }
00043 }
00044 }
00045
00046 EvtTensor3C::EvtTensor3C(double d11, double d22, double d33) {
00047
00048 int i,j;
00049
00050 for(i=0;i<3;i++) {
00051 for(j=0;j<3;j++) {
00052 t[i][j] = 0.0;
00053 }
00054 }
00055
00056 t[0][0]=d11;
00057 t[1][1]=d22;
00058 t[2][2]=d33;
00059
00060 }
00061
00062
00063
00064 EvtTensor3C& EvtTensor3C::operator=(const EvtTensor3C& t1) {
00065 int i,j;
00066
00067 for(i=0;i<3;i++) {
00068 for(j=0;j<3;j++) {
00069 t[i][j] = t1.t[i][j];
00070 }
00071 }
00072 return *this;
00073 }
00074
00075 EvtTensor3C EvtTensor3C::conj() const {
00076 EvtTensor3C temp;
00077
00078 int i,j;
00079
00080 for(i=0;i<3;i++) {
00081 for(j=0;j<3;j++) {
00082 temp.set(j,i,::conj(t[i][j]));
00083 }
00084 }
00085 return temp;
00086 }
00087
00088 void EvtTensor3C::zero(){
00089 int i,j;
00090 for(i=0;i<3;i++){
00091 for(j=0;j<3;j++){
00092 t[i][j]=EvtComplex(0.0,0.0);
00093 }
00094 }
00095 }
00096
00097
00098 EvtTensor3C::EvtTensor3C(){
00099
00100 int i,j;
00101
00102 for(i=0;i<3;i++){
00103 for(j=0;j<3;j++){
00104 t[i][j]=EvtComplex(0.0,0.0);
00105 }
00106 }
00107
00108 }
00109
00110 EvtTensor3C EvtTensor3C::operator+=(const EvtTensor3C& t2) {
00111
00112 int i,j;
00113
00114 for (i=0;i<3;i++) {
00115 for (j=0;j<3;j++) {
00116 t[i][j]+=t2.t[i][j];
00117 }
00118 }
00119 return *this;
00120 }
00121
00122
00123 EvtTensor3C EvtTensor3C::operator-=(const EvtTensor3C& t2) {
00124
00125 int i,j;
00126
00127 for (i=0;i<3;i++) {
00128 for (j=0;j<3;j++) {
00129 t[i][j]-=t2.t[i][j];
00130 }
00131 }
00132 return *this;
00133 }
00134
00135
00136
00137 EvtTensor3C EvtTensor3C::operator*=(const EvtComplex& c) {
00138
00139 int i,j;
00140
00141 for (i=0;i<3;i++) {
00142 for (j=0;j<3;j++) {
00143 t[i][j]*=c;
00144 }
00145 }
00146 return *this;
00147 }
00148
00149
00150 EvtTensor3C EvtTensor3C::operator*=(const double c){
00151
00152 int i,j;
00153
00154 for (i=0;i<3;i++) {
00155 for (j=0;j<3;j++) {
00156 t[i][j]*=EvtComplex(c);
00157 }
00158 }
00159 return *this;
00160 }
00161
00162
00163
00164
00165 EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3C& c2){
00166 EvtTensor3C temp;
00167 int i,j;
00168
00169 for (i=0;i<3;i++) {
00170 for (j=0;j<3;j++) {
00171 temp.set(i,j,c1.get(i)*c2.get(j));
00172 }
00173 }
00174 return temp;
00175 }
00176
00177
00178 EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3R& c2){
00179 EvtTensor3C temp;
00180 int i,j;
00181
00182 for (i=0;i<3;i++) {
00183 for (j=0;j<3;j++) {
00184 temp.set(i,j,c1.get(i)*c2.get(j));
00185 }
00186 }
00187 return temp;
00188 }
00189
00190
00191 EvtTensor3C directProd(const EvtVector3R& c1,const EvtVector3R& c2){
00192 EvtTensor3C temp;
00193 int i,j;
00194
00195 for (i=0;i<3;i++) {
00196 for (j=0;j<3;j++) {
00197 temp.t[i][j]=EvtComplex(c1.get(i)*c2.get(j),0.0);
00198 }
00199 }
00200 return temp;
00201 }
00202
00203
00204 EvtTensor3C conj(const EvtTensor3C& t2) {
00205 EvtTensor3C temp;
00206
00207 int i,j;
00208
00209 for(i=0;i<3;i++){
00210 for(j=0;j<3;j++){
00211 temp.set(i,j,::conj((t2.get(i,j))));
00212 }
00213 }
00214
00215 return temp;
00216 }
00217
00218
00219 EvtTensor3C cont22(const EvtTensor3C& t1,const EvtTensor3C& t2){
00220 EvtTensor3C temp;
00221
00222 int i,j;
00223 EvtComplex c;
00224
00225 for(i=0;i<3;i++){
00226 for(j=0;j<3;j++){
00227 c=t1.get(i,0)*t2.get(j,0)+t1.get(i,1)*t2.get(j,1)
00228 +t1.get(i,2)*t2.get(j,2);
00229 temp.set(i,j,c);
00230 }
00231 }
00232
00233 return temp;
00234 }
00235
00236 EvtTensor3C cont11(const EvtTensor3C& t1,const EvtTensor3C& t2){
00237 EvtTensor3C temp;
00238
00239 int i,j;
00240 EvtComplex c;
00241
00242 for(i=0;i<3;i++){
00243 for(j=0;j<3;j++){
00244 c=t1.get(0,i)*t2.get(0,j)+t1.get(1,i)*t2.get(1,j)
00245 +t1.get(2,i)*t2.get(2,j);
00246 temp.set(i,j,c);
00247 }
00248 }
00249
00250 return temp;
00251 }
00252
00253
00254 EvtVector3C EvtTensor3C::cont1(const EvtVector3C& v) const {
00255 EvtVector3C temp;
00256
00257 int i;
00258
00259 for(i=0;i<3;i++){
00260 temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
00261 +t[2][i]*v.get(2));
00262 }
00263
00264 return temp;
00265 }
00266
00267 EvtVector3C EvtTensor3C::cont2(const EvtVector3C& v) const {
00268 EvtVector3C temp;
00269
00270 int i;
00271
00272 for(i=0;i<3;i++){
00273 temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
00274 +t[i][2]*v.get(2));
00275 }
00276
00277 return temp;
00278 }
00279
00280 EvtVector3C EvtTensor3C::cont1(const EvtVector3R& v) const {
00281 EvtVector3C temp;
00282
00283 int i;
00284
00285 for(i=0;i<3;i++){
00286 temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
00287 +t[2][i]*v.get(2));
00288 }
00289
00290 return temp;
00291 }
00292
00293 EvtVector3C EvtTensor3C::cont2(const EvtVector3R& v) const {
00294 EvtVector3C temp;
00295
00296 int i;
00297
00298 for(i=0;i<3;i++){
00299 temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
00300 +t[i][2]*v.get(2));
00301 }
00302
00303 return temp;
00304 }
00305
00306
00307 EvtTensor3C eps(const EvtVector3R& v){
00308
00309 EvtTensor3C temp;
00310
00311 temp.t[0][0]=0.0;
00312 temp.t[1][1]=0.0;
00313 temp.t[2][2]=0.0;
00314
00315 temp.t[0][1]=v.get(2);
00316 temp.t[0][2]=-v.get(1);
00317
00318 temp.t[1][0]=-v.get(2);
00319 temp.t[1][2]=v.get(0);
00320
00321 temp.t[2][0]=v.get(1);
00322 temp.t[2][1]=-v.get(0);
00323
00324 return temp;
00325
00326 }
00327
00328
00329
00330 const EvtTensor3C& EvtTensor3C::id(){
00331
00332 static EvtTensor3C identity(1.0,1.0,1.0);
00333
00334 return identity;
00335
00336 }
00337
00338 ostream& operator<<(ostream& s,const EvtTensor3C& v){
00339
00340 s<<endl<<"("<<v.t[0][0]<<","<<v.t[0][1]<<","<<v.t[0][2]<<")";
00341 s<<endl<<"("<<v.t[1][0]<<","<<v.t[1][1]<<","<<v.t[1][2]<<")";
00342 s<<endl<<"("<<v.t[2][0]<<","<<v.t[2][1]<<","<<v.t[2][2]<<")"<<endl;
00343
00344 return s;
00345 }
00346
00347
00348 EvtTensor3C rotateEuler(const EvtTensor3C& v,
00349 double alpha,double beta,double gamma){
00350
00351 EvtTensor3C tmp(v);
00352 tmp.applyRotateEuler(alpha,beta,gamma);
00353 return tmp;
00354
00355 }
00356
00357
00358 void EvtTensor3C::applyRotateEuler(double phi,double theta,double ksi){
00359
00360 EvtComplex temp[3][3];
00361 double sp,st,sk,cp,ct,ck;
00362 double r[3][3];
00363 int i,j,k;
00364
00365 sp=sin(phi);
00366 st=sin(theta);
00367 sk=sin(ksi);
00368 cp=cos(phi);
00369 ct=cos(theta);
00370 ck=cos(ksi);
00371
00372 r[0][0]=ck*ct*cp-sk*sp;
00373 r[0][1]=ck*ct*sp+sk*cp;
00374 r[0][2]=-ck*st;
00375
00376 r[1][0]=-sk*ct*cp-ck*sp;
00377 r[1][1]=-sk*ct*sp+ck*cp;
00378 r[1][2]=sk*st;
00379
00380 r[2][0]=st*cp;
00381 r[2][1]=st*sp;
00382 r[2][2]=ct;
00383
00384 for(i=0;i<3;i++){
00385 for(j=0;j<3;j++){
00386 temp[i][j]=0.0;
00387 for(k=0;k<3;k++){
00388 temp[i][j]+=r[i][k]*t[k][j];
00389 }
00390 }
00391 }
00392
00393 for(i=0;i<3;i++){
00394 for(j=0;j<3;j++){
00395 t[i][j]=0.0;
00396 for(k=0;k<3;k++){
00397 t[i][j]+=r[i][k]*temp[j][k];
00398 }
00399 }
00400 }
00401
00402
00403 }
00404
00405