1
SUBROUTINE SMATRIX_3(P,ANS)
1
SUBROUTINE SMATRIX3(P,ANS_SUMMED)
3
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
4
C By the MadGraph5_aMC@NLO Development Team
5
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
8
C Return the sum of the split orders which are required in
9
C orders.inc (NLO_ORDERS)
12
C Process: d~ g > w+ u~ [ all = QED QCD ] QCD^2<=2 QED^2<=2
13
C Process: s~ g > w+ c~ [ all = QED QCD ] QCD^2<=2 QED^2<=2
20
PARAMETER (NEXTERNAL=4)
22
PARAMETER (NSQAMPSO=1)
26
REAL*8 P(0:3,NEXTERNAL), ANS_SUMMED
31
REAL*8 ANS(0:NSQAMPSO)
32
LOGICAL KEEP_ORDER(NSQAMPSO), FIRSTTIME
34
DATA KEEP_ORDER / NSQAMPSO*.TRUE. /
35
DATA FIRSTTIME / .TRUE. /
36
INTEGER AMP_ORDERS(NSPLITORDERS)
37
DOUBLE PRECISION ANS_MAX, TINY
38
PARAMETER (TINY = 1D-12)
39
DOUBLE PRECISION WGT_ME_BORN,WGT_ME_REAL
40
COMMON /C_WGT_ME_TREE/ WGT_ME_BORN,WGT_ME_REAL
44
INTEGER GETORDPOWFROMINDEX3
45
INTEGER ORDERS_TO_AMP_SPLIT_POS
50
C look for orders which match the nlo order constraint
54
DO J = 1, NSPLITORDERS
55
IF(GETORDPOWFROMINDEX3(J, I) .GT. NLO_ORDERS(J)) THEN
56
KEEP_ORDER(I) = .FALSE.
60
IF (KEEP_ORDER(I)) THEN
61
WRITE(*,*) 'REAL 3: keeping split order ', I
63
WRITE(*,*) 'REAL 3: not keeping split order ', I
69
CALL SMATRIX3_SPLITORDERS(P,ANS)
73
C reset the amp_split array
74
AMP_SPLIT(1:AMP_SPLIT_SIZE) = 0D0
77
ANS_MAX = MAX(DABS(ANS(I)),ANS_MAX)
81
IF (KEEP_ORDER(I)) THEN
82
ANS_SUMMED = ANS_SUMMED + ANS(I)
83
C keep track of the separate pieces correspoinding to
84
C different coupling combinations
85
DO J = 1, NSPLITORDERS
86
AMP_ORDERS(J) = GETORDPOWFROMINDEX3(J, I)
88
IF (ABS(ANS(I)).GT.ANS_MAX*TINY)
89
$ AMP_SPLIT(ORDERS_TO_AMP_SPLIT_POS(AMP_ORDERS)) = ANS(I)
93
C avoid fake non-zeros
94
IF (DABS(ANS_SUMMED).LT.TINY*ANS_MAX) ANS_SUMMED=0D0
96
WGT_ME_REAL = ANS_SUMMED
102
SUBROUTINE SMATRIX3_SPLITORDERS(P,ANS)
3
104
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
4
105
C By the MadGraph5_aMC@NLO Development Team
18
119
INCLUDE 'nexternal.inc'
20
121
PARAMETER ( NCOMB=24)
123
PARAMETER (NSQAMPSO=1)
24
REAL*8 P(0:3,NEXTERNAL),ANS
25
DOUBLE PRECISION WGT_ME_BORN,WGT_ME_REAL
26
COMMON /C_WGT_ME_TREE/ WGT_ME_BORN,WGT_ME_REAL
127
REAL*8 P(0:3,NEXTERNAL),ANS(0:NSQAMPSO)
30
INTEGER IHEL,IDEN,I,T_IDENT(NCOMB)
32
REAL*8 T,T_SAVE(NCOMB)
131
INTEGER IHEL,IDEN,I,J,T_IDENT(NCOMB)
132
REAL*8 T(0:NSQAMPSO),T_SAVE(NCOMB,0:NSQAMPSO)
33
133
SAVE T_SAVE,T_IDENT
34
134
INTEGER NHEL(NEXTERNAL,NCOMB)
35
135
DATA (NHEL(I, 1),I=1,4) /-1,-1,-1, 1/
70
172
IF (GOODHEL(IHEL) .OR. NTRY .LT. 2) THEN
71
173
IF (NTRY.LT.2) THEN
72
174
C for the first ps-point, check for helicities that give
73
175
C identical matrix elements
74
T=MATRIX_3(P ,NHEL(1,IHEL))
176
CALL MATRIX_3(P ,NHEL(1,IHEL),T)
79
IF (T_SAVE(I).EQ.0D0) CYCLE
80
IF (ABS(T/T_SAVE(I)-1D0) .LT. 1D-12) THEN
81
C WRITE (*,*) 'FOUND IDENTICAL',T,IHEL,T_SAVE(I),I
182
IF (T(0).EQ.0D0) EXIT
183
IF (T_SAVE(I,0).EQ.0D0) CYCLE
185
IF (ABS(T(J)/T_SAVE(I,J)-1D0) .GT. 1D-12) GOTO 444
86
191
IF (T_IDENT(IHEL).GT.0) THEN
87
192
C if two helicity states are identical, dont recompute
88
T=T_SAVE(T_IDENT(IHEL))
194
T(I)=T_SAVE(T_IDENT(IHEL),I)
91
T=MATRIX_3(P ,NHEL(1,IHEL))
198
CALL MATRIX_3(P ,NHEL(1,IHEL),T)
95
204
C add to the sum of helicities
97
IF (T .NE. 0D0 .AND. .NOT. GOODHEL(IHEL)) THEN
205
DO I=1,NSQAMPSO !keep loop from 1!!
208
IF (T(0) .NE. 0D0 .AND. .NOT. GOODHEL(IHEL)) THEN
98
209
GOODHEL(IHEL)=.TRUE.
214
ANS(I)=ANS(I)/DBLE(IDEN)
107
REAL*8 FUNCTION MATRIX_3(P,NHEL)
220
SUBROUTINE MATRIX_3(P,NHEL,RES)
109
222
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
110
223
C By the MadGraph5_aMC@NLO Development Team
162
283
CALL FFV2_1(W(1,1),W(1,3),GC_11,ZERO,ZERO,W(1,5))
163
284
C Amplitude(s) for diagram number 2
164
285
CALL FFV1_0(W(1,4),W(1,5),W(1,2),GC_5,AMP(2))
165
JAMP(1) = (-1.000000000000000D+00)*AMP(1)+(-1.000000000000000D
286
C JAMPs contributing to orders QCD=1 QED=1
287
JAMP(1,1) = (-1.000000000000000D+00)*AMP(1)+(-1.000000000000000D
171
ZTEMP = ZTEMP + CF(J,I)*JAMP(J)
173
MATRIX_3 = MATRIX_3+ZTEMP*DCONJG(JAMP(I))
297
ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M)
300
RES(SQSOINDEX3(M,N)) = RES(SQSOINDEX3(M,N)) + ZTEMP
313
C Helper functions to deal with the split orders.
316
INTEGER FUNCTION SQSOINDEX3(AMPORDERA,AMPORDERB)
318
C This functions plays the role of the interference matrix. It can
320
C made more elegant using hashtables if its execution speed ever
322
C factor. From two split order indices of the jamps, it return the
324
C index in the squared order canonical ordering.
329
INTEGER NAMPSO, NSQAMPSO
330
PARAMETER (NAMPSO=1, NSQAMPSO=1)
332
PARAMETER (NSPLITORDERS=2)
336
INTEGER AMPORDERA, AMPORDERB
340
INTEGER I, SQORDERS(NSPLITORDERS)
341
INTEGER AMPSPLITORDERS(NAMPSO,NSPLITORDERS)
342
DATA (AMPSPLITORDERS( 1,I),I= 1, 2) / 1, 1/
346
INTEGER SQSOINDEX_FROM_ORDERS3
351
SQORDERS(I)=AMPSPLITORDERS(AMPORDERA,I)
352
$ +AMPSPLITORDERS(AMPORDERB,I)
354
SQSOINDEX3=SQSOINDEX_FROM_ORDERS3(SQORDERS)
359
INTEGER FUNCTION SQSOINDEX_FROM_ORDERS3(ORDERS)
361
C From a list of values for the split orders, this function
363
C corresponding index in the squared orders canonical ordering.
367
PARAMETER (NSQAMPSO=1)
369
PARAMETER (NSPLITORDERS=2)
373
INTEGER ORDERS(NSPLITORDERS)
378
INTEGER SQSPLITORDERS(NSQAMPSO,NSPLITORDERS)
379
C the values listed below are for QCD, QED
380
DATA (SQSPLITORDERS( 1,I),I= 1, 2) / 2, 2/
386
IF (ORDERS(J).NE.SQSPLITORDERS(I,J)) GOTO 1009
388
SQSOINDEX_FROM_ORDERS3 = I
393
WRITE(*,*) 'ERROR:: Stopping function sqsoindex_from_orders'
394
WRITE(*,*) 'Could not find squared orders ',(ORDERS(I),I=1
402
INTEGER FUNCTION GETORDPOWFROMINDEX3(IORDER, INDX)
404
C Return the power of the IORDER-th order appearing at position
406
C in the split-orders output
410
PARAMETER (NSQAMPSO=1)
412
PARAMETER (NSPLITORDERS=2)
421
INTEGER SQSPLITORDERS(NSQAMPSO,NSPLITORDERS)
422
C the values listed below are for QCD, QED
423
DATA (SQSPLITORDERS( 1,I),I= 1, 2) / 2, 2/
427
IF (IORDER.GT.NSPLITORDERS.OR.IORDER.LT.1) THEN
428
WRITE(*,*) 'INVALID IORDER 3', IORDER
429
WRITE(*,*) 'SHOULD BE BETWEEN 1 AND ', NSPLITORDERS
433
IF (INDX.GT.NSQAMPSO.OR.INDX.LT.1) THEN
434
WRITE(*,*) 'INVALID INDX 3', INDX
435
WRITE(*,*) 'SHOULD BE BETWEEN 1 AND ', NSQAMPSO
439
GETORDPOWFROMINDEX3=SQSPLITORDERS(INDX, IORDER)
444
SUBROUTINE GET_NSQSO_REAL3(NSQSO)
446
C Simple subroutine returning the number of squared split order
447
C contributions returned in ANS when calling SMATRIX_SPLITORDERS
451
PARAMETER (NSQAMPSO=1)