80
86
PCT(I,0)=PCT(I,0)+PL(I,J)
87
ABSPCT(I)=ABSPCT(I)+ABS(PL(I,J))
83
IF (CHECKPCONSERVATION) THEN
84
IF (PCT(0,0).GT.1.D-6) THEN
85
WRITE(*,*) 'energy is not conserved ',PCT(0,0)
86
STOP 'energy is not conserved'
87
ELSEIF (PCT(1,0).GT.1.D-6) THEN
88
WRITE(*,*) 'px is not conserved ',PCT(1,0)
89
STOP 'px is not conserved'
90
ELSEIF (PCT(2,0).GT.1.D-6) THEN
91
WRITE(*,*) 'py is not conserved ',PCT(2,0)
92
STOP 'py is not conserved'
93
ELSEIF (PCT(3,0).GT.1.D-6) THEN
94
WRITE(*,*) 'pz is not conserved ',PCT(3,0)
95
STOP 'pz is not conserved'
90
REF_P = MAX(ABSPCT(0), ABSPCT(1),ABSPCT(2),ABSPCT(3))
92
ABSPCT(I) = MAX(REF_P*1E-6, ABSPCT(I))
94
IF (CHECKPCONSERVATION.AND.REF_P.GT.1D-8) THEN
95
IF ((PCT(0,0)/ABSPCT(0)).GT.1.D-6) THEN
96
WRITE(*,*) 'energy is not conserved (flag:CT95)',PCT(0,0)
97
STOP 'energy is not conserved (flag:CT95)'
98
ELSEIF ((PCT(1,0)/ABSPCT(1)).GT.1.D-6) THEN
99
WRITE(*,*) 'px is not conserved (flag:CT95)',PCT(1,0)
100
STOP 'px is not conserved (flag:CT95)'
101
ELSEIF ((PCT(2,0)/ABSPCT(2)).GT.1.D-6) THEN
102
WRITE(*,*) 'py is not conserved (flag:CT95)',PCT(2,0)
103
STOP 'py is not conserved (flag:CT95)'
104
ELSEIF ((PCT(3,0)/ABSPCT(3)).GT.1.D-6) THEN
105
WRITE(*,*) 'pz is not conserved (flag:CT95)',PCT(3,0)
106
STOP 'pz is not conserved (flag:CT95)'
154
SUBROUTINE ML5_0_LOOP_4(W1, W2, W3, W4, M1, M2, M3, M4, RANK
155
$ , SQUAREDSOINDEX, LOOPNUM)
165
SUBROUTINE ML5_0_BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_LOOP,M2L
168
C Helper function that compute the loop kinematic matrix with
170
C NLOOPLINE : Number of loop lines
171
C P_LOOP : List of external momenta running in the loop, i.e.
172
C q_i in the denominator (l_i+q_i)**2-m_i**2
173
C M2L : List of complex-valued masses running in the loop.
174
C S_MAT(N,N): Kinematic matrix output.
179
REAL*8 P_LOOP(NLOOPLINE,0:3)
180
COMPLEX*16 M2L(NLOOPLINE)
181
COMPLEX*16 S_MAT(NLOOPLINE,NLOOPLINE)
185
INCLUDE 'MadLoopParams.inc'
191
REAL*8 REF_NORMALIZATION
201
S_MAT(I,J)=-(M2L(I)+M2L(J))
203
DIFFSQ = (DCMPLX(P_LOOP(I,0),0.0D0)-DCMPLX(P_LOOP(J,0)
206
DIFFSQ = DIFFSQ - (DCMPLX(P_LOOP(I,K),0.0D0)
207
$ -DCMPLX(P_LOOP(J,K),0.0D0))**2
209
C Default value of the kinematic matrix
210
S_MAT(I,J)=DIFFSQ-M2L(I)-M2L(J)
211
C And we now test various thresholds. Normaly, at most one
213
IF(ABS(M2L(I)).NE.0.0D0)THEN
214
IF(ABS((DIFFSQ-M2L(I))/M2L(I)).LT.OSTHRES)THEN
218
IF(ABS(M2L(J)).NE.0.0D0)THEN
219
IF(ABS((DIFFSQ-M2L(J))/M2L(J)).LT.OSTHRES)THEN
223
C Choose what seems the most appropriate way to compare
224
C massless onshellness.
225
REF_NORMALIZATION=0.0D0
226
C Here, we chose to base the threshold only on the energy
229
REF_NORMALIZATION = REF_NORMALIZATION + ABS(P_LOOP(I,K))
232
REF_NORMALIZATION = (REF_NORMALIZATION/2.0D0)**2
233
IF(REF_NORMALIZATION.NE.0.0D0)THEN
234
IF(ABS(DIFFSQ/REF_NORMALIZATION).LT.OSTHRES)THEN
235
S_MAT(I,J)=-(M2L(I)+M2L(J))
245
SUBROUTINE ML5_0_MP_BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_LOOP,M2L
248
C Helper function that compute the loop kinematic matrix with
250
C NLOOPLINE : Number of loop lines
251
C P_LOOP : List of external momenta running in the loop, i.e.
252
C q_i in the denominator (l_i+q_i)**2-m_i**2
253
C M2L : List of complex-valued masses running in the loop.
254
C S_MAT(N,N): Kinematic matrix output.
259
REAL*16 P_LOOP(NLOOPLINE,0:3)
260
COMPLEX*32 M2L(NLOOPLINE)
261
COMPLEX*32 S_MAT(NLOOPLINE,NLOOPLINE)
265
INCLUDE 'MadLoopParams.inc'
271
REAL*16 REF_NORMALIZATION
281
S_MAT(I,J)=-(M2L(I)+M2L(J))
283
DIFFSQ = (CMPLX(P_LOOP(I,0),0.0E0_16,KIND=16)
284
$ -CMPLX(P_LOOP(J,0),0.0E0_16,KIND=16))**2
286
DIFFSQ = DIFFSQ - (CMPLX(P_LOOP(I,K),0.0E0_16,KIND=16)
287
$ -CMPLX(P_LOOP(J,K),0.0E0_16,KIND=16))**2
289
C Default value of the kinematic matrix
290
S_MAT(I,J)=DIFFSQ-M2L(I)-M2L(J)
291
C And we now test various thresholds. Normaly, at most one
293
IF(ABS(M2L(I)).NE.0.0E0_16)THEN
294
IF(ABS((DIFFSQ-M2L(I))/M2L(I)).LT.OSTHRES)THEN
298
IF(ABS(M2L(J)).NE.0.0E0_16)THEN
299
IF(ABS((DIFFSQ-M2L(J))/M2L(J)).LT.OSTHRES)THEN
303
C Choose what seems the most appropriate way to compare
304
C massless onshellness.
305
REF_NORMALIZATION=0.0E0_16
306
C Here, we chose to base the threshold only on the energy
309
REF_NORMALIZATION = REF_NORMALIZATION + ABS(P_LOOP(I,K))
312
REF_NORMALIZATION = (REF_NORMALIZATION/2.0E0_16)**2
313
IF(REF_NORMALIZATION.NE.0.0E0_16)THEN
314
IF(ABS(DIFFSQ/REF_NORMALIZATION).LT.OSTHRES)THEN
315
S_MAT(I,J)=-(M2L(I)+M2L(J))
327
SUBROUTINE ML5_0_LOOP_4(W1, W2, W3, W4, M1, M2, M3, M4, RANK,
328
$ SQUAREDSOINDEX, LOOPNUM)
156
329
INTEGER NEXTERNAL
157
330
PARAMETER (NEXTERNAL=4)
158
331
INTEGER NLOOPLINE
256
C Determine it uses qp or not
258
IF(CTMODE.GE.4)DOING_QP=.TRUE.
259
442
C Choose the correct loop library
260
443
CALL ML5_0_CHOOSE_LOOPLIB(LIBINDEX,NLOOPLINE,RANK,COMPLEX_MASS
444
$ ,ID,DOING_QP,I_LIB)
262
445
IF(MLREDUCTIONLIB(I_LIB).EQ.1)THEN
264
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1,SQUAREDSOIN
265
$ DEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
447
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1
448
$ ,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
450
C Tensor Integral Reduction is used
268
451
CALL ML5_0_TIRLOOP(SQUAREDSOINDEX,LOOPNUM,I_LIB,NLOOPLINE,PL
269
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX
452
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)
453
$ ,S(SQUAREDSOINDEX,LOOPNUM))
273
456
LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)
380
C Determine it uses qp or not
382
IF(CTMODE.GE.4)DOING_QP=.TRUE.
383
576
C Choose the correct loop library
384
577
CALL ML5_0_CHOOSE_LOOPLIB(LIBINDEX,NLOOPLINE,RANK,COMPLEX_MASS
578
$ ,ID,DOING_QP,I_LIB)
386
579
IF(MLREDUCTIONLIB(I_LIB).EQ.1)THEN
388
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1,SQUAREDSOIN
389
$ DEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
581
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1
582
$ ,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
584
C Tensor Integral Reduction is used
392
585
CALL ML5_0_TIRLOOP(SQUAREDSOINDEX,LOOPNUM,I_LIB,NLOOPLINE,PL
393
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX
586
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)
587
$ ,S(SQUAREDSOINDEX,LOOPNUM))
397
590
LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)
502
C Determine it uses qp or not
504
IF(CTMODE.GE.4)DOING_QP=.TRUE.
505
708
C Choose the correct loop library
506
709
CALL ML5_0_CHOOSE_LOOPLIB(LIBINDEX,NLOOPLINE,RANK,COMPLEX_MASS
710
$ ,ID,DOING_QP,I_LIB)
508
711
IF(MLREDUCTIONLIB(I_LIB).EQ.1)THEN
510
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1,SQUAREDSOIN
511
$ DEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
713
CALL ML5_0_CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1
714
$ ,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
716
C Tensor Integral Reduction is used
514
717
CALL ML5_0_TIRLOOP(SQUAREDSOINDEX,LOOPNUM,I_LIB,NLOOPLINE,PL
515
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX
718
$ ,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)
719
$ ,S(SQUAREDSOINDEX,LOOPNUM))
519
722
LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)