* * $Id: phasp.F,v 1.1.1.1 1995/10/24 10:21:01 cernlib Exp $ * * $Log: phasp.F,v $ * Revision 1.1.1.1 1995/10/24 10:21:01 cernlib * Geant * * #include "geant321/pilot.h" *CMZ : 3.21/02 29/03/94 15.41.39 by S.Giani *-- Author : SUBROUTINE PHASP C C *** NVE 29-MAR-1988 CERN GENEVA *** C C CALLED BY : NUCREC TWOCLU GENXPT C ORIGIN : H.FESEFELDT (02-DEC-1986) C #include "geant321/s_prntfl.inc" #include "geant321/s_genio.inc" #include "geant321/limits.inc" C #if !defined(CERNLIB_SINGLE) DOUBLE PRECISION WTMAX,WTMAXQ,WTFC,TWGT,ONE,TEXPXL,TEXPXU PARAMETER (ONE=1.D0) #endif #if defined(CERNLIB_SINGLE) PARAMETER (ONE=1.0) #endif LOGICAL LZERO DIMENSION EMM(18) DIMENSION RNO(50) DIMENSION EM(18),PD(18),EMS(18),SM(18),FFQ(18),PCM1(90) EQUIVALENCE (NT,NPG),(AMASS(1),EM(1)),(PCM1(1),PCM(1,1)) SAVE KNT C DATA FFQ/0.,3.141592, 19.73921, 62.01255, 129.8788, 204.0131, $ 256.3704, 268.4705, 240.9780, 189.2637, $ 132.1308, 83.0202, 47.4210, 24.8295, $ 12.0006, 5.3858, 2.2560, 0.8859/ DATA KNT , TWOPI / 1 , 6.2831853073 / C C --- Initialise local arrays and the result array PCM --- DO 10 JZERO=1,18 PCM(1,JZERO)=0. PCM(2,JZERO)=0. PCM(3,JZERO)=0. PCM(4,JZERO)=0. PCM(5,JZERO)=0. EMM(JZERO) =0. PD(JZERO) =0. EMS(JZERO) =0. SM(JZERO) =0. 10 CONTINUE C KNT = KNT + 1 IF (.NOT.NPRT(3).AND..NOT.NPRT(4)) GOTO 100 WRITE(NEWBCD,1200) NPG,TECM,(AMASS(JK),JK=1,NPG) 100 CONTINUE 150 IF (NT .LT. 2) GO TO 1001 IF (NT .GT. 18) GO TO 1002 NTM1=NT-1 NTM2=NT-2 NTNM4 = 3*NT - 4 EMM(1)=EM(1) TM=0.0 DO 200 I=1,NT EMS(I)=EM(I)**2 TM=TM+EM(I) 200 SM(I)=TM WGT=1. 210 TECMTM=TECM-TM IF (TECMTM .LE. 0.0) GO TO 1000 EMM(NT)=TECM IF (KGENEV.GT.1) GO TO 400 EMMAX=TECMTM+EM(1) EMMIN=0.0 C C For weight calculation, form sum of log's of terms C instead of product of terms. Note that thereby WTMAX C and WTMAXQ are changed in their contents; they are C currently not used outside the range from here to C label 531. We also need to check for zero factors now. C Negative values cannot appear as GPDK always returns a C nonnegative number. As coded, even the exotic cases C NT<2 (first loop not executed) and NTM1<1 (second loop C not executed) should be safe and give the same result C for WTG in the end as the old code. C WTMAX=0.0 LZERO=.TRUE. DO 350 I=2,NT EMMIN=EMMIN+EM(I-1) EMMAX=EMMAX+EM(I) WTFC=GPDK(EMMAX,EMMIN,EM(I)) IF(WTFC.LE.0.) THEN LZERO=.FALSE. GOTO 351 ENDIF WTMAX=WTMAX+LOG(WTFC) 350 CONTINUE 351 WTMAXQ= EXPXU IF(LZERO) WTMAXQ= -WTMAX GO TO 455 400 WTMAXQ=LOG(ONE*TECMTM**NTM2*FFQ(NT) / TECM) 455 CONTINUE CALL GRNDM(RNO,NTNM4) IF(NTM2) 900,509,460 460 CONTINUE CALL FLPSOR(RNO,NTM2) DO 508 J=2,NTM1 508 EMM(J)=RNO(J-1)*TECMTM+SM(J) 509 TWGT=WTMAXQ IR=NTM2 LZERO=.TRUE. DO 530 I=1,NTM1 PD(I)=GPDK(EMM(I+1),EMM(I),EM(I+1)) IF(PD(I).LE.0.0) THEN LZERO=.FALSE. ELSE TWGT=TWGT+LOG(ONE*PD(I)) ENDIF 530 CONTINUE 531 WGT=0.0 IF(LZERO) THEN TEXPXU=EXPXU TEXPXL=EXPXL WGT=EXP(MAX(MIN(TWGT,TEXPXU),TEXPXL)) ENDIF PCM(1,1)=0.0 PCM(2,1)=PD(1) PCM(3,1)=0.0 DO 570 I=2,NT PCM(1,I)=0.0 PCM(2,I) = -PD(I-1) PCM(3,I)=0.0 IR=IR+1 BANG=TWOPI*RNO(IR) CB=COS(BANG) SB=SIN(BANG) IR=IR+1 C=2.0*RNO(IR)-1.0 S=SQRT(ABS(1.0-C*C)) IF(I.EQ.NT) GO TO 1567 ESYS=SQRT(PD(I)**2+EMM(I)**2) BETA=PD(I)/ESYS GAMA=ESYS/EMM(I) DO 568 J=1,I NDX = 5*J - 5 AA= PCM1(NDX+1)**2 + PCM1(NDX+2)**2 + PCM1(NDX+3)**2 PCM1(NDX+5) = SQRT(AA) PCM1(NDX+4) = SQRT(AA+EMS(J)) CALL ROTES2(C,S,CB,SB,PCM,J) PSAVE = GAMA*(PCM(2,J)+BETA*PCM(4,J)) 568 PCM(2,J)=PSAVE GO TO 570 1567 DO 1568 J=1,I AA=PCM(1,J)**2 + PCM(2,J)**2 + PCM(3,J)**2 PCM(5,J)=SQRT(AA) PCM(4,J)=SQRT(AA+EMS(J)) CALL ROTES2(C,S,CB,SB,PCM,J) 1568 CONTINUE 570 CONTINUE 900 CONTINUE RETURN 1000 DO 212 I=1,NPG PCM(1,I)=0. PCM(2,I)=0. PCM(3,I)=0. PCM(4,I)=AMASS(I) 212 PCM(5,I)=AMASS(I) WGT=0. RETURN 1001 IF(NPRT(3).OR.NPRT(4)) WRITE(NEWBCD,1101) GO TO 1050 1002 WRITE(NEWBCD,1102) 1050 WRITE(NEWBCD,1150) KNT WRITE(NEWBCD,1200) NPG,TECM,(AMASS(JK),JK=1,NPG) RETURN 1100 FORMAT (1H0,'AVAILABLE ENERGY NEGATIVE') 1101 FORMAT (1H0,'LESS THAN 2 OUTGOING PARTICLES') 1102 FORMAT (1H0,'MORE THAN 18 OUTGOING PARTICLES') 1150 FORMAT (1H0,'ABOVE ERROR DETECTED IN PHASP AT CALL NUMBER',I7) 1200 FORMAT (1H0,'INPUT DATA TO PHASP. NPG= ' ,I6/ +2X,9H TECM= ,D15.7 ,18H PARTICLE MASSES=,5D15.7/(42X,5D15.7) +) END