Line data Source code
1 : //--------------------------------------------------------------------------
2 : //
3 : // Environment:
4 : // This software is part of the EvtGen package developed jointly
5 : // for the BaBar and CLEO collaborations. If you use all or part
6 : // of it, please give an appropriate acknowledgement.
7 : //
8 : // Copyright Information: See EvtGen/COPYRIGHT
9 : // Copyright (C) 1998 Caltech, UCSB
10 : //
11 : // Module: EvtTensor3C.cc
12 : //
13 : // Description: Implementation of 3 tensors.
14 : //
15 : // Modification history:
16 : //
17 : // RYD September 14, 1996 Module created
18 : //
19 : //------------------------------------------------------------------------
20 : //
21 : #include "EvtGenBase/EvtPatches.hh"
22 : #include <iostream>
23 : #include <math.h>
24 : #include "EvtGenBase/EvtComplex.hh"
25 : #include "EvtGenBase/EvtVector3C.hh"
26 : #include "EvtGenBase/EvtTensor3C.hh"
27 : #include "EvtGenBase/EvtReport.hh"
28 : using std::endl;
29 : using std::ostream;
30 :
31 :
32 0 : EvtTensor3C::~EvtTensor3C(){}
33 :
34 :
35 0 : EvtTensor3C::EvtTensor3C( const EvtTensor3C& t1 ) {
36 :
37 : int i,j;
38 :
39 0 : for(i=0;i<3;i++) {
40 0 : for(j=0;j<3;j++) {
41 0 : t[i][j] = t1.t[i][j];
42 : }
43 : }
44 0 : }
45 :
46 0 : EvtTensor3C::EvtTensor3C(double d11, double d22, double d33) {
47 :
48 : int i,j;
49 :
50 0 : for(i=0;i<3;i++) {
51 0 : for(j=0;j<3;j++) {
52 0 : t[i][j] = 0.0;
53 : }
54 : }
55 :
56 0 : t[0][0]=d11;
57 0 : t[1][1]=d22;
58 0 : t[2][2]=d33;
59 :
60 0 : }
61 :
62 :
63 :
64 : EvtTensor3C& EvtTensor3C::operator=(const EvtTensor3C& t1) {
65 : int i,j;
66 :
67 0 : for(i=0;i<3;i++) {
68 0 : for(j=0;j<3;j++) {
69 0 : t[i][j] = t1.t[i][j];
70 : }
71 : }
72 0 : return *this;
73 : }
74 :
75 : EvtTensor3C EvtTensor3C::conj() const {
76 0 : EvtTensor3C temp;
77 :
78 : int i,j;
79 :
80 0 : for(i=0;i<3;i++) {
81 0 : for(j=0;j<3;j++) {
82 0 : temp.set(j,i,::conj(t[i][j]));
83 : }
84 : }
85 : return temp;
86 0 : }
87 :
88 : void EvtTensor3C::zero(){
89 : int i,j;
90 0 : for(i=0;i<3;i++){
91 0 : for(j=0;j<3;j++){
92 0 : t[i][j]=EvtComplex(0.0,0.0);
93 : }
94 : }
95 0 : }
96 :
97 :
98 0 : EvtTensor3C::EvtTensor3C(){
99 :
100 : int i,j;
101 :
102 0 : for(i=0;i<3;i++){
103 0 : for(j=0;j<3;j++){
104 0 : t[i][j]=EvtComplex(0.0,0.0);
105 : }
106 : }
107 :
108 0 : }
109 :
110 : EvtTensor3C EvtTensor3C::operator+=(const EvtTensor3C& t2) {
111 :
112 : int i,j;
113 :
114 0 : for (i=0;i<3;i++) {
115 0 : for (j=0;j<3;j++) {
116 0 : t[i][j]+=t2.t[i][j];
117 : }
118 : }
119 0 : return *this;
120 0 : }
121 :
122 :
123 : EvtTensor3C EvtTensor3C::operator-=(const EvtTensor3C& t2) {
124 :
125 : int i,j;
126 :
127 0 : for (i=0;i<3;i++) {
128 0 : for (j=0;j<3;j++) {
129 0 : t[i][j]-=t2.t[i][j];
130 : }
131 : }
132 0 : return *this;
133 0 : }
134 :
135 :
136 :
137 : EvtTensor3C EvtTensor3C::operator*=(const EvtComplex& c) {
138 :
139 : int i,j;
140 :
141 0 : for (i=0;i<3;i++) {
142 0 : for (j=0;j<3;j++) {
143 0 : t[i][j]*=c;
144 : }
145 : }
146 0 : return *this;
147 0 : }
148 :
149 :
150 : EvtTensor3C EvtTensor3C::operator*=(const double c){
151 :
152 : int i,j;
153 :
154 0 : for (i=0;i<3;i++) {
155 0 : for (j=0;j<3;j++) {
156 0 : t[i][j]*=EvtComplex(c);
157 : }
158 : }
159 0 : return *this;
160 0 : }
161 :
162 :
163 :
164 :
165 : EvtTensor3C EvtGenFunctions::directProd(const EvtVector3C& c1,const EvtVector3C& c2){
166 0 : EvtTensor3C temp;
167 : int i,j;
168 :
169 0 : for (i=0;i<3;i++) {
170 0 : for (j=0;j<3;j++) {
171 0 : temp.set(i,j,c1.get(i)*c2.get(j));
172 : }
173 : }
174 : return temp;
175 0 : }
176 :
177 :
178 : EvtTensor3C EvtGenFunctions::directProd(const EvtVector3C& c1,const EvtVector3R& c2){
179 0 : EvtTensor3C temp;
180 : int i,j;
181 :
182 0 : for (i=0;i<3;i++) {
183 0 : for (j=0;j<3;j++) {
184 0 : temp.set(i,j,c1.get(i)*c2.get(j));
185 : }
186 : }
187 : return temp;
188 0 : }
189 :
190 :
191 : EvtTensor3C EvtGenFunctions::directProd(const EvtVector3R& c1,const EvtVector3R& c2){
192 0 : EvtTensor3C temp;
193 : int i,j;
194 :
195 0 : for (i=0;i<3;i++) {
196 0 : for (j=0;j<3;j++) {
197 0 : temp.t[i][j]=EvtComplex(c1.get(i)*c2.get(j),0.0);
198 : }
199 : }
200 : return temp;
201 0 : }
202 :
203 :
204 : EvtTensor3C conj(const EvtTensor3C& t2) {
205 0 : EvtTensor3C temp;
206 :
207 : int i,j;
208 :
209 0 : for(i=0;i<3;i++){
210 0 : for(j=0;j<3;j++){
211 0 : temp.set(i,j,::conj((t2.get(i,j))));
212 : }
213 : }
214 :
215 : return temp;
216 0 : }
217 :
218 :
219 : EvtTensor3C cont22(const EvtTensor3C& t1,const EvtTensor3C& t2){
220 0 : EvtTensor3C temp;
221 :
222 : int i,j;
223 0 : EvtComplex c;
224 :
225 0 : for(i=0;i<3;i++){
226 0 : for(j=0;j<3;j++){
227 0 : c=t1.get(i,0)*t2.get(j,0)+t1.get(i,1)*t2.get(j,1)
228 0 : +t1.get(i,2)*t2.get(j,2);
229 0 : temp.set(i,j,c);
230 : }
231 : }
232 :
233 : return temp;
234 0 : }
235 :
236 : EvtTensor3C cont11(const EvtTensor3C& t1,const EvtTensor3C& t2){
237 0 : EvtTensor3C temp;
238 :
239 : int i,j;
240 0 : EvtComplex c;
241 :
242 0 : for(i=0;i<3;i++){
243 0 : for(j=0;j<3;j++){
244 0 : c=t1.get(0,i)*t2.get(0,j)+t1.get(1,i)*t2.get(1,j)
245 0 : +t1.get(2,i)*t2.get(2,j);
246 0 : temp.set(i,j,c);
247 : }
248 : }
249 :
250 : return temp;
251 0 : }
252 :
253 :
254 : EvtVector3C EvtTensor3C::cont1(const EvtVector3C& v) const {
255 0 : EvtVector3C temp;
256 :
257 : int i;
258 :
259 0 : for(i=0;i<3;i++){
260 0 : temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
261 0 : +t[2][i]*v.get(2));
262 : }
263 :
264 : return temp;
265 0 : }
266 :
267 : EvtVector3C EvtTensor3C::cont2(const EvtVector3C& v) const {
268 0 : EvtVector3C temp;
269 :
270 : int i;
271 :
272 0 : for(i=0;i<3;i++){
273 0 : temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
274 0 : +t[i][2]*v.get(2));
275 : }
276 :
277 : return temp;
278 0 : }
279 :
280 : EvtVector3C EvtTensor3C::cont1(const EvtVector3R& v) const {
281 0 : EvtVector3C temp;
282 :
283 : int i;
284 :
285 0 : for(i=0;i<3;i++){
286 0 : temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
287 0 : +t[2][i]*v.get(2));
288 : }
289 :
290 : return temp;
291 0 : }
292 :
293 : EvtVector3C EvtTensor3C::cont2(const EvtVector3R& v) const {
294 0 : EvtVector3C temp;
295 :
296 : int i;
297 :
298 0 : for(i=0;i<3;i++){
299 0 : temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
300 0 : +t[i][2]*v.get(2));
301 : }
302 :
303 : return temp;
304 0 : }
305 :
306 :
307 : EvtTensor3C EvtGenFunctions::eps(const EvtVector3R& v){
308 :
309 0 : EvtTensor3C temp;
310 :
311 0 : temp.t[0][0]=0.0;
312 0 : temp.t[1][1]=0.0;
313 0 : temp.t[2][2]=0.0;
314 :
315 0 : temp.t[0][1]=v.get(2);
316 0 : temp.t[0][2]=-v.get(1);
317 :
318 0 : temp.t[1][0]=-v.get(2);
319 0 : temp.t[1][2]=v.get(0);
320 :
321 0 : temp.t[2][0]=v.get(1);
322 0 : temp.t[2][1]=-v.get(0);
323 :
324 : return temp;
325 :
326 0 : }
327 :
328 :
329 :
330 : const EvtTensor3C& EvtTensor3C::id(){
331 :
332 0 : static EvtTensor3C identity(1.0,1.0,1.0);
333 :
334 0 : return identity;
335 :
336 0 : }
337 :
338 : ostream& operator<<(ostream& s,const EvtTensor3C& v){
339 :
340 0 : s<<endl<<"("<<v.t[0][0]<<","<<v.t[0][1]<<","<<v.t[0][2]<<")";
341 0 : s<<endl<<"("<<v.t[1][0]<<","<<v.t[1][1]<<","<<v.t[1][2]<<")";
342 0 : s<<endl<<"("<<v.t[2][0]<<","<<v.t[2][1]<<","<<v.t[2][2]<<")"<<endl;
343 :
344 0 : return s;
345 : }
346 :
347 :
348 : EvtTensor3C EvtGenFunctions::rotateEuler(const EvtTensor3C& v,
349 : double alpha,double beta,double gamma){
350 :
351 0 : EvtTensor3C tmp(v);
352 0 : tmp.applyRotateEuler(alpha,beta,gamma);
353 : return tmp;
354 :
355 0 : }
356 :
357 :
358 : void EvtTensor3C::applyRotateEuler(double phi,double theta,double ksi){
359 :
360 0 : EvtComplex temp[3][3];
361 : double sp,st,sk,cp,ct,ck;
362 0 : double r[3][3];
363 : int i,j,k;
364 :
365 0 : sp=sin(phi);
366 0 : st=sin(theta);
367 0 : sk=sin(ksi);
368 0 : cp=cos(phi);
369 0 : ct=cos(theta);
370 0 : ck=cos(ksi);
371 :
372 0 : r[0][0]=ck*ct*cp-sk*sp;
373 0 : r[0][1]=ck*ct*sp+sk*cp;
374 0 : r[0][2]=-ck*st;
375 :
376 0 : r[1][0]=-sk*ct*cp-ck*sp;
377 0 : r[1][1]=-sk*ct*sp+ck*cp;
378 0 : r[1][2]=sk*st;
379 :
380 0 : r[2][0]=st*cp;
381 0 : r[2][1]=st*sp;
382 0 : r[2][2]=ct;
383 :
384 0 : for(i=0;i<3;i++){
385 0 : for(j=0;j<3;j++){
386 0 : temp[i][j]=0.0;
387 0 : for(k=0;k<3;k++){
388 0 : temp[i][j]+=r[i][k]*t[k][j];
389 : }
390 : }
391 : }
392 :
393 0 : for(i=0;i<3;i++){
394 0 : for(j=0;j<3;j++){
395 0 : t[i][j]=0.0;
396 0 : for(k=0;k<3;k++){
397 0 : t[i][j]+=r[i][k]*temp[j][k];
398 : }
399 : }
400 : }
401 :
402 :
403 0 : }
404 :
405 :
|