1
C ===========================================
2
C ===== Beginning of CutTools Interface =====
3
C ===========================================
4
SUBROUTINE CTLOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
6
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
7
C By the MadGraph5_aMC@NLO Development Team
8
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
10
C Interface between MG5 and CutTools.
12
C Process: u d~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
13
C Process: c s~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
19
PARAMETER (NEXTERNAL=3)
20
LOGICAL CHECKPCONSERVATION
21
PARAMETER (CHECKPCONSERVATION=.TRUE.)
23
PARAMETER (NORMALIZATION = 1.D0/(16.D0*3.14159265358979323846D0*
28
INTEGER NLOOPLINE, RANK
29
REAL*8 PL(0:3,NLOOPLINE)
30
REAL*8 PCT(0:3,0:NLOOPLINE-1),ABSPCT(0:3)
32
COMPLEX*16 M2L(NLOOPLINE)
33
COMPLEX*16 M2LCT(0:NLOOPLINE-1)
41
LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
42
COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
55
COMMON/CT/LSCALE,CTMODE
57
INTEGER ID,SQSOINDEX,R
58
COMMON/LOOP/ID,SQSOINDEX,R
64
C INITIALIZE CUTTOOLS IF NEEDED
70
C YOU CAN FIND THE DETAILS ABOUT THE DIFFERENT CTMODE AT THE
71
C BEGINNING OF THE FILE CTS_CUTS.F90 IN THE CUTTOOLS DISTRIBUTION
73
C CONVERT THE MASSES TO BE COMPLEX
78
C CONVERT THE MOMENTA FLOWING IN THE LOOP LINES TO CT CONVENTIONS
87
PCT(I,0)=PCT(I,0)+PL(I,J)
88
ABSPCT(I)=ABSPCT(I)+ABS(PL(I,J))
91
REF_P = MAX(ABSPCT(0), ABSPCT(1),ABSPCT(2),ABSPCT(3))
93
ABSPCT(I) = MAX(REF_P*1E-6, ABSPCT(I))
95
IF (CHECKPCONSERVATION.AND.REF_P.GT.1D-8) THEN
96
IF ((PCT(0,0)/ABSPCT(0)).GT.1.D-6) THEN
97
WRITE(*,*) 'energy is not conserved (flag:CT95)',PCT(0,0)
98
STOP 'energy is not conserved (flag:CT95)'
99
ELSEIF ((PCT(1,0)/ABSPCT(1)).GT.1.D-6) THEN
100
WRITE(*,*) 'px is not conserved (flag:CT95)',PCT(1,0)
101
STOP 'px is not conserved (flag:CT95)'
102
ELSEIF ((PCT(2,0)/ABSPCT(2)).GT.1.D-6) THEN
103
WRITE(*,*) 'py is not conserved (flag:CT95)',PCT(2,0)
104
STOP 'py is not conserved (flag:CT95)'
105
ELSEIF ((PCT(3,0)/ABSPCT(3)).GT.1.D-6) THEN
106
WRITE(*,*) 'pz is not conserved (flag:CT95)',PCT(3,0)
107
STOP 'pz is not conserved (flag:CT95)'
113
PCT(I,J)=PCT(I,J)+PL(I,K)
118
CALL CTSXCUT(CTMODE,LSCALE,MU_R,NLOOPLINE,LOOPNUM,MPLOOPNUM,RANK
119
$ ,PCT,M2LCT,RES,ACC,R1,STABLE)
120
RES(1)=NORMALIZATION*2.0D0*DBLE(RES(1))
121
RES(2)=NORMALIZATION*2.0D0*DBLE(RES(2))
122
RES(3)=NORMALIZATION*2.0D0*DBLE(RES(3))
123
C WRITE(*,*) 'CutTools: Loop ID',ID,' =',RES(1),RES(2),RES(3)
128
C INITIALISATION OF CUTTOOLS
133
LOGICAL EXT_NUM_FOR_R1
137
INCLUDE 'MadLoopParams.inc'
142
C DEFAULT PARAMETERS FOR CUTTOOLS
143
C -------------------------------
144
C THRS1 IS THE PRECISION LIMIT BELOW WHICH THE MP ROUTINES
147
C LOOPLIB SET WHAT LIBRARY CT USES
151
LOOPLIB=CTLOOPLIBRARY
152
C MADLOOP'S NUMERATOR IN THE OPEN LOOP IS MUCH FASTER THAN THE
153
C RECONSTRUCTED ONE IN CT. SO WE BETTER USE MADLOOP ONE IN THIS
155
EXT_NUM_FOR_R1=.TRUE.
156
C -------------------------------
158
C The initialization below is for CT v1.8.+
159
CALL CTSINIT(THRS,LOOPLIB,EXT_NUM_FOR_R1)
160
C The initialization below is for the older stable CT v1.7, still
161
C used for now in the beta release.
162
C CALL CTSINIT(THRS,LOOPLIB)
166
SUBROUTINE BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_LOOP,M2L,S_MAT)
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 MP_BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_LOOP,M2L,S_MAT)
247
C Helper function that compute the loop kinematic matrix with
249
C NLOOPLINE : Number of loop lines
250
C P_LOOP : List of external momenta running in the loop, i.e.
251
C q_i in the denominator (l_i+q_i)**2-m_i**2
252
C M2L : List of complex-valued masses running in the loop.
253
C S_MAT(N,N): Kinematic matrix output.
258
REAL*16 P_LOOP(NLOOPLINE,0:3)
259
COMPLEX*32 M2L(NLOOPLINE)
260
COMPLEX*32 S_MAT(NLOOPLINE,NLOOPLINE)
264
INCLUDE 'MadLoopParams.inc'
270
REAL*16 REF_NORMALIZATION
280
S_MAT(I,J)=-(M2L(I)+M2L(J))
282
DIFFSQ = (CMPLX(P_LOOP(I,0),0.0E0_16,KIND=16)
283
$ -CMPLX(P_LOOP(J,0),0.0E0_16,KIND=16))**2
285
DIFFSQ = DIFFSQ - (CMPLX(P_LOOP(I,K),0.0E0_16,KIND=16)
286
$ -CMPLX(P_LOOP(J,K),0.0E0_16,KIND=16))**2
288
C Default value of the kinematic matrix
289
S_MAT(I,J)=DIFFSQ-M2L(I)-M2L(J)
290
C And we now test various thresholds. Normaly, at most one
292
IF(ABS(M2L(I)).NE.0.0E0_16)THEN
293
IF(ABS((DIFFSQ-M2L(I))/M2L(I)).LT.OSTHRES)THEN
297
IF(ABS(M2L(J)).NE.0.0E0_16)THEN
298
IF(ABS((DIFFSQ-M2L(J))/M2L(J)).LT.OSTHRES)THEN
302
C Choose what seems the most appropriate way to compare
303
C massless onshellness.
304
REF_NORMALIZATION=0.0E0_16
305
C Here, we chose to base the threshold only on the energy
308
REF_NORMALIZATION = REF_NORMALIZATION + ABS(P_LOOP(I,K))
311
REF_NORMALIZATION = (REF_NORMALIZATION/2.0E0_16)**2
312
IF(REF_NORMALIZATION.NE.0.0E0_16)THEN
313
IF(ABS(DIFFSQ/REF_NORMALIZATION).LT.OSTHRES)THEN
314
S_MAT(I,J)=-(M2L(I)+M2L(J))
326
C ===========================================
327
C ===== Beginning of Ninja interface =====
328
C ===========================================
330
SUBROUTINE NINJA_LOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
336
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
337
C By the MadGraph5_aMC@NLO Development Team
338
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
340
C Interface between MG5 and Ninja.
342
C Process: u d~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
343
C Process: c s~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
349
PARAMETER (NEXTERNAL=3)
350
LOGICAL CHECKPCONSERVATION
351
PARAMETER (CHECKPCONSERVATION=.TRUE.)
353
PARAMETER (NORMALIZATION = 1.D0/(16.D0*3.14159265358979323846D0*
356
PARAMETER (NLOOPGROUPS=1)
357
C These are constants related to the split orders
359
PARAMETER (NSQUAREDSO=1)
360
INCLUDE 'loop_max_coefs.inc'
364
INTEGER NLOOPLINE, RANK
365
REAL*8 PL(0:3,NLOOPLINE)
366
COMPLEX*16 M2L(NLOOPLINE)
372
REAL*8 P_TMP(0:3,0:NLOOPLINE-1),ABSP_TMP(0:3)
374
REAL*8 P_NINJA(0:3,NLOOPLINE)
375
REAL*8 P_S_MAT(NLOOPLINE,0:3)
376
COMPLEX*16 M2L_NINJA(NLOOPLINE)
377
COMPLEX*16 NINJA_RES(0:2)
381
REAL*8 PDEN_DUMMY(0:3,NLOOPLINE-1)
383
COMPLEX*16 S_MAT(NLOOPLINE,NLOOPLINE)
384
REAL*8 REAL_S_MAT(NLOOPLINE,NLOOPLINE)
387
COMPLEX*16, ALLOCATABLE :: TENSORCOEFS(:)
394
LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
395
COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
400
COMMON/CT/LSCALE,CTMODE
402
INTEGER ID,SQSOINDEX,R
403
COMMON/LOOP/ID,SQSOINDEX,R
404
COMPLEX*16 LOOPCOEFS(0:LOOPMAXCOEFS-1,NSQUAREDSO,NLOOPGROUPS)
405
COMMON/LCOEFS/LOOPCOEFS
407
LOGICAL FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
408
COMMON/FPE_IN_REDUCTION/FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
414
C For the direction test, we must switch the direction in which
415
C the loop is read for CTMode equal to 2 or 4.
416
CALL SWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN_DUMMY,M2L)
418
C The CT initialization is also performed here if not done already
419
C because it calls MPINIT of OneLOop which is necessary on some
426
C INITIALIZE NINJA IF NEEDED
432
C CONVERT THE MASSES TO BE COMPLEX
437
C CONVERT THE MOMENTA FLOWING IN THE LOOP LINES TO NINJA
447
P_TMP(I,0)=P_TMP(I,0)+PL(I,J)
448
ABSP_TMP(I) = ABSP_TMP(I)+ABS(PL(I,J))
451
REF_P = MAX(ABSP_TMP(0), ABSP_TMP(1),ABSP_TMP(2),ABSP_TMP(3))
453
ABSP_TMP(I) = MAX(REF_P*1E-6, ABSP_TMP(I))
456
IF (CHECKPCONSERVATION.AND.REF_P.GT.1D-8) THEN
457
IF ((P_TMP(0,0)/ABSP_TMP(0)).GT.1.D-6) THEN
458
WRITE(*,*) 'energy is not conserved (flag:CT692)',P_TMP(0,0)
459
STOP 'energy is not conserved (flag:CT692)'
460
ELSEIF ((P_TMP(1,0)/ABSP_TMP(1)).GT.1.D-6) THEN
461
WRITE(*,*) 'px is not conserved (flag:CT692)',P_TMP(1,0)
462
STOP 'px is not conserved (flag:CT692)'
463
ELSEIF ((P_TMP(2,0)/ABSP_TMP(2)).GT.1.D-6) THEN
464
WRITE(*,*) 'py is not conserved (flag:CT692)',P_TMP(2,0)
465
STOP 'py is not conserved (flag:CT692)'
466
ELSEIF ((P_TMP(3,0)/ABSP_TMP(3)).GT.1.D-6) THEN
467
WRITE(*,*) 'pz is not conserved (flag:CT692)',P_TMP(3,0)
468
STOP 'pz is not conserved (flag:CT692)'
474
P_TMP(I,J)=P_TMP(I,J)+PL(I,K)
478
C In Ninja, the loop line index starts at 1
480
P_NINJA(0,I+1) = P_TMP(0,I)
481
P_NINJA(1,I+1) = P_TMP(1,I)
482
P_NINJA(2,I+1) = P_TMP(2,I)
483
P_NINJA(3,I+1) = P_TMP(3,I)
486
C Number of coefficients for the current rank
489
CURR_MAXCOEF=CURR_MAXCOEF+(3+I)*(2+I)*(1+I)/6
491
C Now write the tensor coefficients for Ninja
492
C It should never be allocated at this stage
493
IF (.NOT. ALLOCATED(TENSORCOEFS)) THEN
494
ALLOCATE(TENSORCOEFS(0:CURR_MAXCOEF-1))
496
DO I=0,CURR_MAXCOEF-1
497
TENSORCOEFS(I) = LOOPCOEFS(I,SQSOINDEX,ID)
499
C The loop momentum is in fact q_loop -> -q_loop, so that the
500
C coefficients must be changed accordingly
501
CALL INVERT_MOMENTA_IN_POLYNOMIAL(CURR_MAXCOEF,TENSORCOEFS)
503
C Compute the kinematic matrix
506
P_S_MAT(J,I)=P_NINJA(I,J)
509
CALL BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_S_MAT,M2L,S_MAT)
513
REAL_S_MAT(I,J) = DBLE(S_MAT(I,J)+M2L(I)+M2L(J))
517
C Below is the call specifying the kinematic matrix
518
CALL NINJA_TENSOR_EVALUATE(TENSORCOEFS,NLOOPLINE,RANK,REAL_S_MAT
519
$ ,P_NINJA,M2L,MU_R**2,NINJA_RES,R1,NINJA_STATUS)
521
C Below is the call without specification of the kinematic matrix
522
C call ninja_tensor_evaluate(TENSORCOEFS,NLOOPLINE,RANK,P_NINJA,M2L
523
C ,MU_R**2,NINJA_RES,R1,NINJA_STATUS)
525
C If a floating point exception was found in Ninja (e.g. exactly
527
C Then warn loop_matrix.f so that it will flag this kinematic
528
C point as unstable no matter what.
529
IF (NINJA_STATUS.EQ.NINJA_UNSTABLE_KINEMATICS) THEN
530
FPE_IN_DP_REDUCTION = .TRUE.
533
C Make sure to deallocate the tensor of coefficients
534
IF (ALLOCATED(TENSORCOEFS)) THEN
535
DEALLOCATE(TENSORCOEFS)
538
RES(1)=NORMALIZATION*2.0D0*DBLE(NINJA_RES(0))
539
RES(2)=NORMALIZATION*2.0D0*DBLE(NINJA_RES(1))
540
RES(3)=NORMALIZATION*2.0D0*DBLE(NINJA_RES(2))
541
C WRITE(*,*) 'Ninja: Loop ID',ID,' =',RES(1),RES(2),RES(3)
545
C Quadruple precision version of loop_ninja
547
SUBROUTINE MP_NINJA_LOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
553
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
554
C By the MadGraph5_aMC@NLO Development Team
555
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
557
C Interface between MG5 and Ninja.
559
C Process: u d~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
560
C Process: c s~ > w+ WEIGHTED<=2 QED<=1 [ all = QCD ]
566
PARAMETER (NEXTERNAL=3)
567
LOGICAL CHECKPCONSERVATION
568
PARAMETER (CHECKPCONSERVATION=.TRUE.)
570
PARAMETER (NORMALIZATION = 1.D0/(16.D0*3.14159265358979323846D0*
573
PARAMETER (NLOOPGROUPS=1)
574
C These are constants related to the split orders
576
PARAMETER (NSQUAREDSO=1)
577
INCLUDE 'loop_max_coefs.inc'
581
INTEGER NLOOPLINE, RANK
582
REAL*16 PL(0:3,NLOOPLINE)
583
COMPLEX*16 M2L(NLOOPLINE)
590
REAL*16 P_TMP(0:3,0:NLOOPLINE-1), ABSP_TMP(0:3)
592
REAL(KI_QNIN) MP_P_NINJA(0:3,NLOOPLINE)
593
REAL*16 MP_P(0:3,NLOOPLINE)
594
REAL*16 P_S_MAT(NLOOPLINE,0:3)
595
COMPLEX*32 MP_M2L(NLOOPLINE)
596
COMPLEX(KI_QNIN) MP_M2L_NINJA(NLOOPLINE)
597
COMPLEX(KI_QNIN) NINJA_RES(0:2)
598
COMPLEX(KI_QNIN) NINJA_R1
600
COMPLEX*16 DP_RES(0:2)
603
REAL*16 PDEN_DUMMY(0:3,NLOOPLINE-1)
605
COMPLEX*32 MP_S_MAT(NLOOPLINE,NLOOPLINE)
606
REAL*16 MP_REAL_S_MAT(NLOOPLINE,NLOOPLINE)
607
REAL(KI_QNIN) MP_REAL_S_MAT_NINJA(NLOOPLINE,NLOOPLINE)
610
COMPLEX*32, ALLOCATABLE :: MP_TENSORCOEFS(:)
611
COMPLEX(KI_QNIN), ALLOCATABLE :: MP_NINJA_TENSORCOEFS(:)
618
LOGICAL CTINIT, TIRINIT, GOLEMINIT, SAMURAIINIT, NINJAINIT
619
COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT,SAMURAIINIT
624
COMMON/CT/LSCALE,CTMODE
626
INTEGER ID,SQSOINDEX,R
627
COMMON/LOOP/ID,SQSOINDEX,R
628
COMPLEX*32 MP_LOOPCOEFS(0:LOOPMAXCOEFS-1,NSQUAREDSO,NLOOPGROUPS)
629
COMMON/MP_LCOEFS/MP_LOOPCOEFS
631
LOGICAL FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
632
COMMON/FPE_IN_REDUCTION/FPE_IN_DP_REDUCTION, FPE_IN_QP_REDUCTION
638
C Cast the masses in complex quadruple precision
640
MP_M2L(I) = CMPLX(M2L(I),KIND=16)
643
C For the direction test, we must switch the direction in which
644
C the loop is read for CTMode equal to 2 or 4.
645
CALL MP_SWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN_DUMMY,MP_M2L)
647
C The CT initialization is also performed here if not done already
648
C because it calls MPINIT of OneLOop which is necessary on some
655
C INITIALIZE NINJA IF NEEDED
661
C CONVERT THE MOMENTA FLOWING IN THE LOOP LINES TO NINJA
664
ABSP_TMP(I)=0.E0+0_16
671
P_TMP(I,0)=P_TMP(I,0)+PL(I,J)
672
ABSP_TMP(I)=ABSP_TMP(I)+ABS(PL(I,J))
675
REF_P = MAX(ABSP_TMP(0), ABSP_TMP(1),ABSP_TMP(2),ABSP_TMP(3))
677
ABSP_TMP(I) = MAX(REF_P*1E-6, ABSP_TMP(I))
679
IF (CHECKPCONSERVATION.AND.REF_P.GT.1.E-8_16) THEN
680
IF ((P_TMP(0,0)/ABSP_TMP(0)).GT.1.E-6_16) THEN
681
WRITE(*,*) 'energy is not conserved (flag:CT968)'
683
STOP 'energy is not conserved (flag:CT968)'
684
ELSEIF ((P_TMP(1,0)/ABSP_TMP(1)).GT.1.E-6_16) THEN
685
WRITE(*,*) 'px is not conserved (flag:CT968)',DBLE(P_TMP(1,0)
687
STOP 'px is not conserved (flag:CT968)'
688
ELSEIF ((P_TMP(2,0)/ABSP_TMP(2)).GT.1.E-6_16) THEN
689
WRITE(*,*) 'py is not conserved (flag:CT968)',DBLE(P_TMP(2,0)
691
STOP 'py is not conserved (flag:CT968)'
692
ELSEIF ((P_TMP(3,0)/ABSP_TMP(3)).GT.1.E-6_16) THEN
693
WRITE(*,*) 'pz is not conserved (flag:CT968)',DBLE(P_TMP(3,0)
695
STOP 'pz is not conserved (flag:CT968)'
701
P_TMP(I,J)=P_TMP(I,J)+PL(I,K)
705
C In Ninja, the loop line index starts at 1
707
MP_P(0,I+1) = P_TMP(0,I)
708
MP_P(1,I+1) = P_TMP(1,I)
709
MP_P(2,I+1) = P_TMP(2,I)
710
MP_P(3,I+1) = P_TMP(3,I)
713
C Number of coefficients for the current rank
716
CURR_MAXCOEF=CURR_MAXCOEF+(3+I)*(2+I)*(1+I)/6
718
C Now write the tensor coefficients for Ninja
719
C It should never be allocated at this stage
720
IF (.NOT. ALLOCATED(MP_TENSORCOEFS)) THEN
721
ALLOCATE(MP_TENSORCOEFS(0:CURR_MAXCOEF-1))
723
IF (.NOT. ALLOCATED(MP_NINJA_TENSORCOEFS)) THEN
724
ALLOCATE(MP_NINJA_TENSORCOEFS(0:CURR_MAXCOEF-1))
726
DO I=0,CURR_MAXCOEF-1
727
MP_TENSORCOEFS(I) = MP_LOOPCOEFS(I,SQSOINDEX,ID)
729
C The loop momentum is in fact q_loop -> -q_loop, so that the
730
C coefficients must be changed accordingly
731
CALL MP_INVERT_MOMENTA_IN_POLYNOMIAL(CURR_MAXCOEF,MP_TENSORCOEFS)
733
C Compute the kinematic matrix
736
P_S_MAT(J,I)=MP_P(I,J)
739
CALL MP_BUILD_KINEMATIC_MATRIX(NLOOPLINE,P_S_MAT,MP_M2L,MP_S_MAT)
743
MP_REAL_S_MAT(I,J) = REAL(MP_S_MAT(I,J)+MP_M2L(I)+MP_M2L(J)
748
C Now typecast to Ninja's quadruple precision format
749
DO I=0,CURR_MAXCOEF-1
750
MP_NINJA_TENSORCOEFS(I)=CMPLX(MP_TENSORCOEFS(I),KIND=KI_QNIN)
754
MP_REAL_S_MAT_NINJA(I,J) = REAL(MP_REAL_S_MAT(I,J)
759
MP_M2L_NINJA(I)=CMPLX(MP_M2L(I),KIND=KI_QNIN)
762
MP_P_NINJA(0,I) = REAL(MP_P(0,I),KIND=KI_QNIN)
763
MP_P_NINJA(1,I) = REAL(MP_P(1,I),KIND=KI_QNIN)
764
MP_P_NINJA(2,I) = REAL(MP_P(2,I),KIND=KI_QNIN)
765
MP_P_NINJA(3,I) = REAL(MP_P(3,I),KIND=KI_QNIN)
767
NINJA_SCALE = REAL(MU_R**2,KIND=KI_QNIN)
770
C Below is the call specifying the kinematic matrix
771
CALL NINJA_TENSOR_EVALUATE(MP_NINJA_TENSORCOEFS,NLOOPLINE,RANK
772
$ ,MP_REAL_S_MAT_NINJA,MP_P_NINJA,MP_M2L_NINJA,NINJA_SCALE
773
$ ,NINJA_RES,NINJA_R1,NINJA_STATUS)
774
C Below is the call without specification of the kinematic matrix
775
C call ninja_tensor_evaluate(MP_NINJA_TENSORCOEFS,NLOOPLINE,RANK,MP
776
C _P_NINJA,MP_M2L_NINJA,NINJA_SCALE,NINJA_RES,NINJA_R1,NINJA_STATUS)
779
C If a floating point exception was found in Ninja (e.g. exactly
781
C Then warn loop_matrix.f so that it will flag this kinematic
782
C point as unstable no matter what.
783
IF (NINJA_STATUS.EQ.NINJA_UNSTABLE_KINEMATICS) THEN
784
FPE_IN_QP_REDUCTION = .TRUE.
787
C Typecast the result back
790
DP_RES(I)=DCMPLX(NINJA_RES(I))
793
C Make sure to deallocate the tensor of coefficients
794
IF (ALLOCATED(MP_TENSORCOEFS)) THEN
795
DEALLOCATE(MP_TENSORCOEFS)
797
IF (ALLOCATED(MP_NINJA_TENSORCOEFS)) THEN
798
DEALLOCATE(MP_NINJA_TENSORCOEFS)
801
RES(1)=NORMALIZATION*2.0D0*DBLE(DP_RES(0))
802
RES(2)=NORMALIZATION*2.0D0*DBLE(DP_RES(1))
803
RES(3)=NORMALIZATION*2.0D0*DBLE(DP_RES(2))
804
C WRITE(*,*) 'QP Ninja: Loop ID',ID,' =',RES(1),RES(2),RES(3)
807
SUBROUTINE INITNINJA()
813
C Initialization of Ninja
821
INCLUDE 'MadLoopParams.inc'
826
C LOOPLIB SET WHAT LIBRARY NINJA USES
830
IF (CTLOOPLIBRARY.EQ.1) THEN
831
WRITE(*,*) 'Warning in Ninja initialization. LoopTools is not'
832
$ //' supported by the Ninja interface. It will use OneLOop'
835
ELSEIF (CTLOOPLIBRARY.EQ.3) THEN
836
WRITE(*,*) 'Warning in Ninja initialization. LoopTools is not'
837
$ //' supported by the Ninja interface. It will use OneLOop'
840
ELSEIF (CTLOOPLIBRARY.EQ.2) THEN
843
WRITE(*,*) 'Error in Ninja initialization. Loop library ID='
844
$ ,CTLOOPLIBRARY,' is not supported. Change variable'
845
$ //' CTLoopLibrary in MadLoopParams.dat.'
848
CALL NINJA_SET_INTEGRAL_LIBRARY(LOOPLIB)
852
SUBROUTINE LOOP_3(W1, W2, W3, M1, M2, M3, RANK, SQUAREDSOINDEX,
855
PARAMETER (NEXTERNAL=3)
857
PARAMETER (NLOOPLINE=3)
859
PARAMETER (NWAVEFUNCS=3)
861
PARAMETER (NLOOPGROUPS=1)
864
C These are constants related to the split orders
866
PARAMETER (NSQUAREDSO=1)
871
COMPLEX*16 M1, M2, M3
873
INTEGER RANK, LSYMFACT
874
INTEGER LOOPNUM, SQUAREDSOINDEX
878
REAL*8 PL(0:3,NLOOPLINE)
879
REAL*16 MP_PL(0:3,NLOOPLINE)
880
COMPLEX*16 M2L(NLOOPLINE)
881
INTEGER PAIRING(NLOOPLINE),WE(3)
882
INTEGER I, J, K, TEMP,I_LIB
883
LOGICAL COMPLEX_MASS,DOING_QP
887
INCLUDE 'MadLoopParams.inc'
888
INTEGER ID,SQSOINDEX,R
889
COMMON/LOOP/ID,SQSOINDEX,R
891
LOGICAL CHECKPHASE, HELDOUBLECHECKED
892
COMMON/INIT/CHECKPHASE, HELDOUBLECHECKED
895
INTEGER GOODHEL(NCOMB)
896
LOGICAL GOODAMP(NSQUAREDSO,NLOOPGROUPS)
897
COMMON/FILTERS/GOODAMP,GOODHEL,HELOFFSET
899
COMPLEX*16 LOOPRES(3,NSQUAREDSO,NLOOPGROUPS)
900
LOGICAL S(NSQUAREDSO,NLOOPGROUPS)
901
COMMON/LOOPRES/LOOPRES,S
904
COMPLEX*16 W(20,NWAVEFUNCS)
906
COMPLEX*32 MP_W(20,NWAVEFUNCS)
911
COMMON/CT/LSCALE,CTMODE
913
COMMON/I_LIB/LIBINDEX
919
C Determine it uses qp or not
920
DOING_QP = (CTMODE.GE.4)
922
IF (CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED).OR.GOODAMP(SQUAREDSOIND
936
SQSOINDEX=SQUAREDSOINDEX
944
DO K=TEMP,(TEMP+PAIRING(J)-1)
945
PL(I,J)=PL(I,J)-DBLE(W(1+I,WE(K)))
947
MP_PL(I,J)=MP_PL(I,J)-REAL(MP_W(1+I,WE(K)),KIND=16)
953
C Determine whether the integral is with complex masses or not
954
C since some reduction libraries, e.g.PJFry++ and IREGI, are
956
C not able to deal with complex masses
959
IF(DIMAG(M2L(I)).EQ.0D0)CYCLE
960
IF(ABS(DIMAG(M2L(I)))/MAX(ABS(M2L(I)),1D-2).GT.1D-15)THEN
965
C Choose the correct loop library
966
CALL CHOOSE_LOOPLIB(LIBINDEX,NLOOPLINE,RANK,COMPLEX_MASS,ID
968
IF(MLREDUCTIONLIB(I_LIB).EQ.1)THEN
970
CALL CTLOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1,SQUAREDSOINDEX
971
$ ,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
972
ELSEIF (MLREDUCTIONLIB(I_LIB).EQ.6) THEN
974
IF (.NOT.DOING_QP) THEN
975
CALL NINJA_LOOP(NLOOPLINE,PL,M2L,RANK,LOOPRES(1
976
$ ,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
978
CALL MP_NINJA_LOOP(NLOOPLINE,MP_PL,M2L,RANK,LOOPRES(1
979
$ ,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX,LOOPNUM))
982
C Tensor Integral Reduction is used
983
CALL TIRLOOP(SQUAREDSOINDEX,LOOPNUM,I_LIB,NLOOPLINE,PL,M2L
984
$ ,RANK,LOOPRES(1,SQUAREDSOINDEX,LOOPNUM),S(SQUAREDSOINDEX
988
LOOPRES(1,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)
989
LOOPRES(2,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)
990
LOOPRES(3,SQUAREDSOINDEX,LOOPNUM)=(0.0D0,0.0D0)
991
S(SQUAREDSOINDEX,LOOPNUM)=.TRUE.