2 C*********************************************************************
4 SUBROUTINE LUROBO(THE,PHI,BEX,BEY,BEZ)
6 C...Purpose: to perform rotations and boosts.
7 IMPLICIT DOUBLE PRECISION(D)
8 COMMON/LUJETS/N,K(4000,5),P(4000,5),V(4000,5)
9 COMMON/LUDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
10 SAVE /LUJETS/,/LUDAT1/
11 DIMENSION ROT(3,3),PR(3),VR(3),DP(4),DV(4)
13 C...Find range of rotation/boost. Convert boost to double precision.
15 IF(MSTU(1).GT.0) IMIN=MSTU(1)
17 IF(MSTU(2).GT.0) IMAX=MSTU(2)
23 C...Entry for specific range and double precision boost.
24 ENTRY LUDBRB(IMI,IMA,THE,PHI,DBEX,DBEY,DBEZ)
33 C...Optional resetting of V (when not set before.)
34 IF(MSTU(33).NE.0) THEN
35 DO 110 I=MIN(IMIN,MSTU(4)),MIN(IMAX,MSTU(4))
43 C...Check range of rotation/boost.
44 120 IF(IMIN.GT.MSTU(4).OR.IMAX.GT.MSTU(4)) THEN
45 CALL LUERRM(11,'(LUROBO:) range outside LUJETS memory')
49 C...Rotate, typically from z axis to direction (theta,phi).
50 IF(THE**2+PHI**2.GT.1E-20) THEN
51 ROT(1,1)=COS(THE)*COS(PHI)
53 ROT(1,3)=SIN(THE)*COS(PHI)
54 ROT(2,1)=COS(THE)*SIN(PHI)
56 ROT(2,3)=SIN(THE)*SIN(PHI)
61 IF(K(I,1).LE.0) GOTO 150
67 P(I,J)=ROT(J,1)*PR(1)+ROT(J,2)*PR(2)+ROT(J,3)*PR(3)
68 V(I,J)=ROT(J,1)*VR(1)+ROT(J,2)*VR(2)+ROT(J,3)*VR(3)
73 C...Boost, typically from rest to momentum/energy=beta.
74 IF(DBX**2+DBY**2+DBZ**2.GT.1E-20) THEN
75 DB=SQRT(DBX**2+DBY**2+DBZ**2)
76 IF(DB.GT.0.99999999D0) THEN
77 C...Rescale boost vector if too close to unity.
78 CALL LUERRM(3,'(LUROBO:) boost vector too large')
79 DBX=DBX*(0.99999999D0/DB)
80 DBY=DBY*(0.99999999D0/DB)
81 DBZ=DBZ*(0.99999999D0/DB)
84 DGA=1D0/SQRT(1D0-DB**2)
86 IF(K(I,1).LE.0) GOTO 170
91 DBP=DBX*DP(1)+DBY*DP(2)+DBZ*DP(3)
92 DGABP=DGA*(DGA*DBP/(1D0+DGA)+DP(4))
93 P(I,1)=DP(1)+DGABP*DBX
94 P(I,2)=DP(2)+DGABP*DBY
95 P(I,3)=DP(3)+DGABP*DBZ
96 P(I,4)=DGA*(DP(4)+DBP)
97 DBV=DBX*DV(1)+DBY*DV(2)+DBZ*DV(3)
98 DGABV=DGA*(DGA*DBV/(1D0+DGA)+DV(4))
99 V(I,1)=DV(1)+DGABV*DBX
100 V(I,2)=DV(2)+DGABV*DBY
101 V(I,3)=DV(3)+DGABV*DBZ
102 V(I,4)=DGA*(DV(4)+DBV)