1
SUBROUTINE SLOOPMATRIXHEL(P,HEL,ANS)
7
PARAMETER (NEXTERNAL=4)
11
REAL*8 P(0:3,NEXTERNAL)
14
COMMON/USERCHOICE/USERHEL
19
CALL SLOOPMATRIX(P,ANS)
22
LOGICAL FUNCTION ISZERO(TOTEST, REFERENCE_VALUE, AMPLN)
28
PARAMETER (NLOOPAMPS=20)
32
REAL*8 TOTEST, REFERENCE_VALUE
37
INCLUDE 'MadLoopParams.inc'
39
COMPLEX*16 AMPL(3,NLOOPAMPS)
45
IF(ABS(REFERENCE_VALUE).EQ.0.0D0) THEN
47
WRITE(*,*) '##E02 ERRROR Reference value for comparison is
51
ISZERO=((ABS(TOTEST)/ABS(REFERENCE_VALUE)).LT.ZEROTHRES)
54
IF((.NOT.ISZERO).AND.(.NOT.S(AMPLN))) THEN
55
WRITE(*,*) '##W01 WARNING Contribution ',AMPLN,' is detected
56
$ as contributing with CR=',(ABS(TOTEST)/ABS(REFERENCE_VALUE
57
$ )),' but is unstable.'
63
SUBROUTINE SLOOPMATRIX(P_USER,ANS)
65
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
66
C By the MadGraph5_aMC@NLO Development Team
67
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
69
C Returns amplitude squared summed/avg over colors
70
C and helicities for the point in phase space P(0:3,NEXTERNAL)
71
C and external lines W(0:6,NEXTERNAL)
73
C Process: g g > h h QED=2 QCD=2 [ virt = QCD ] WEIGHTED=12
79
CHARACTER*64 PARAMFILENAME
80
PARAMETER ( PARAMFILENAME='MadLoopParams.dat')
82
INTEGER NLOOPAMPS, NCTAMPS
83
PARAMETER (NLOOPAMPS=20, NCTAMPS=4)
85
PARAMETER (NEXTERNAL=4)
87
PARAMETER (NWAVEFUNCS=5)
93
PARAMETER (MP__ZERO=0E0_16)
95
PARAMETER (IMAG1=(0D0,1D0))
96
C This parameter is designed for the check timing command of MG5
98
PARAMETER (SKIPLOOPEVAL=.FALSE.)
100
PARAMETER (BOOTANDSTOP=.FALSE.)
101
INTEGER MAXSTABILITYLENGTH
102
DATA MAXSTABILITYLENGTH/20/
103
COMMON/STABILITY_TESTS/MAXSTABILITYLENGTH
107
REAL*8 P_USER(0:3,NEXTERNAL)
113
INTEGER HELPICKED_BU, CTMODEINIT_BU
114
REAL*8 MLSTABTHRES_BU
115
C P is the actual PS POINT used for the computation, and can be
116
C rotated for the stability test purposes.
117
REAL*8 P(0:3,NEXTERNAL)
118
C DP_RES STORES THE DOUBLE PRECISION RESULT OBTAINED FROM
119
C DIFFERENT EVALUATION METHODS IN ORDER TO ASSESS STABILITY.
120
C THE STAB_STAGE COUNTER I CORRESPONDANCE GOES AS FOLLOWS
121
C I=1 -> ORIGINAL PS, CTMODE=1
122
C I=2 -> ORIGINAL PS, CTMODE=2, (ONLY WITH CTMODERUN=-1)
123
C I=3 -> PS WITH ROTATION 1, CTMODE=1, (ONLY WITH CTMODERUN=-2)
124
C I=4 -> PS WITH ROTATION 2, CTMODE=1, (ONLY WITH CTMODERUN=-3)
125
C I=5 -> POSSIBLY MORE EVALUATION METHODS IN THE FUTURE, MAX IS
127
C IF UNSTABLE IT GOES TO THE SAME PATTERN BUT STAB_INDEX IS THEN
129
LOGICAL EVAL_DONE(MAXSTABILITYLENGTH)
130
LOGICAL DOING_QP_EVALS
131
INTEGER STAB_INDEX,BASIC_CT_MODE
132
INTEGER N_DP_EVAL, N_QP_EVAL
135
C This is used for loop-induced where the reference scale for
136
C comparisons is infered from
137
C the previous points
144
REAL*8 DP_RES(3,MAXSTABILITYLENGTH)
145
C QP_RES STORES THE QUADRUPLE PRECISION RESULT OBTAINED FROM
146
C DIFFERENT EVALUATION METHODS IN ORDER TO ASSESS STABILITY.
147
REAL*8 QP_RES(3,MAXSTABILITYLENGTH)
148
INTEGER NHEL(NEXTERNAL), IC(NEXTERNAL)
152
REAL*8 BUFFR(3),TEMP(3),TEMP1,TEMP2
154
LOGICAL FOUNDHELFILTER,FOUNDLOOPFILTER
155
DATA FOUNDHELFILTER/.TRUE./
156
DATA FOUNDLOOPFILTER/.TRUE./
161
LOGICAL DONEHELDOUBLECHECK
162
DATA DONEHELDOUBLECHECK/.FALSE./
165
C Below are variables to bypass the checkphase and insure
166
C stability check to take place
167
LOGICAL OLD_CHECKPHASE, OLD_HELDOUBLECHECKED
168
LOGICAL OLD_GOODHEL(NCOMB)
169
LOGICAL OLD_GOODAMP(NLOOPAMPS,NCOMB)
171
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
172
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
181
INCLUDE 'mp_coupl.inc'
182
INCLUDE 'MadLoopParams.inc'
187
DATA CHECKPHASE/.TRUE./
188
LOGICAL HELDOUBLECHECKED
189
DATA HELDOUBLECHECKED/.FALSE./
192
COMMON/INIT/NTRY,CHECKPHASE,HELDOUBLECHECKED,REF
194
C THE LOGICAL BELOWS ARE JUST TO KEEP TRACK OF WHETHER THE MP_PS
195
C HAS BEEN SET YET OR NOT AND WHETER THE MP EXTERNAL WFS HAVE
198
DATA MP_DONE/.FALSE./
199
COMMON/MP_DONE/MP_DONE
201
DATA MP_PS_SET/.FALSE./
202
COMMON/MP_PS_SET/MP_PS_SET
204
C PS CAN POSSIBILY BE PASSED THROUGH IMPROVE_PS BUT IS NOT
205
C MODIFIED FOR THE PURPOSE OF THE STABILITY TEST
206
C EVEN THOUGH THEY ARE PUT IN COMMON BLOCK, FOR NOW THEY ARE NOT
208
REAL*8 PS(0:3,NEXTERNAL)
210
C AGAIN BELOW, MP_PS IS THE FIXED (POSSIBLY IMPROVED) MP PS POINT
211
C AND MP_P IS THE ONE WHICH CAN BE MODIFIED (I.E. ROTATED ETC.)
212
C FOR STABILITY PURPOSE
213
C EVEN THOUGH THEY ARE PUT IN COMMON BLOCK, FOR NOW THEY ARE NOT
214
C USED ANYWHERE ELSE THAN HERE AND SET_MP_PS()
215
REAL*16 MP_PS(0:3,NEXTERNAL),MP_P(0:3,NEXTERNAL)
216
COMMON/MP_PSPOINT/MP_PS,MP_P
220
COMMON/CT/LSCALE,CTMODE
222
LOGICAL GOODHEL(NCOMB)
223
LOGICAL GOODAMP(NLOOPAMPS,NCOMB)
224
COMMON/FILTERS/GOODAMP,GOODHEL
228
COMMON/HELCHOICE/HELPICKED
231
COMMON/USERCHOICE/USERHEL
234
COMPLEX*16 W(20,NWAVEFUNCS)
239
COMPLEX*16 AMPL(3,NLOOPAMPS)
243
INTEGER CF_D(NLOOPAMPS,NLOOPAMPS)
244
INTEGER CF_N(NLOOPAMPS,NLOOPAMPS)
247
INTEGER HELC(NEXTERNAL,NCOMB)
248
COMMON/HELCONFIGS/HELC
250
REAL*8 PREC,USER_STAB_PREC
251
DATA USER_STAB_PREC/-1.0D0/
252
COMMON/USER_STAB_PREC/USER_STAB_PREC
254
C Return codes H,T,U correspond to the hundreds, tens and units
255
C building returncode, i.e.
256
C RETURNCODE=100*RET_CODE_H+10*RET_CODE_T+RET_CODE_U
258
INTEGER RET_CODE_H,RET_CODE_T,RET_CODE_U
261
DATA RET_CODE_H,RET_CODE_T,RET_CODE_U/1,1,0/
262
COMMON/ACC/ACCURACY,RET_CODE_H,RET_CODE_T,RET_CODE_U
265
DATA MP_DONE_ONCE/.FALSE./
266
COMMON/MP_DONE_ONCE/MP_DONE_ONCE
273
CALL MADLOOPPARAMREADER(PARAMFILENAME,.TRUE.)
274
CALL SET_N_EVALS(N_DP_EVAL,N_QP_EVAL)
275
HELDOUBLECHECKED=.NOT.DOUBLECHECKHELICITYFILTER
281
OPEN(1, FILE='LoopFilter.dat', ERR=100, STATUS='OLD',
284
READ(1,*,END=101) (GOODAMP(I,J),I=NCTAMPS+1,NLOOPAMPS)
288
FOUNDLOOPFILTER=.FALSE.
290
DO I=NCTAMPS+1,NLOOPAMPS
291
GOODAMP(I,J)=(.NOT.USELOOPFILTER)
296
OPEN(1, FILE='HelFilter.dat', ERR=102, STATUS='OLD',
298
READ(1,*,END=103) (GOODHEL(I),I=1,NCOMB)
301
FOUNDHELFILTER=.FALSE.
307
OPEN(1, FILE='ColorNumFactors.dat', ERR=104, STATUS='OLD'
310
READ(1,*,END=105) (CF_N(I,J),J=1,NLOOPAMPS)
314
STOP 'Color factors could not be initialized from file
315
$ ColorNumFactors.dat. File not found'
318
OPEN(1, FILE='ColorDenomFactors.dat', ERR=106, STATUS='OLD'
321
READ(1,*,END=107) (CF_D(I,J),J=1,NLOOPAMPS)
325
STOP 'Color factors could not be initialized from file
326
$ ColorDenomFactors.dat. File not found'
329
OPEN(1, FILE='HelConfigs.dat', ERR=108, STATUS='OLD',
332
READ(1,*,END=109) (HELC(I,H),I=1,NEXTERNAL)
336
STOP 'Color helictiy configurations could not be initialized
337
$ from file HelConfigs.dat. File not found'
341
WRITE(*,*) 'Stopped by user request.'
349
DOING_QP_EVALS=.FALSE.
351
DO I=2,MAXSTABILITYLENGTH
355
IF (USER_STAB_PREC.GT.0.0D0) THEN
356
MLSTABTHRES_BU=MLSTABTHRES
357
MLSTABTHRES=USER_STAB_PREC
358
C In the initialization, I cannot perform stability test and
359
C therefore guarantee any precision
360
CTMODEINIT_BU=CTMODEINIT
361
C So either one choses quad precision directly
363
C Or, because this is very slow, we keep the orignal value. The
364
C accuracy returned is -1 and tells the MC that he should not
365
C trust the evaluation for checks.
366
CTMODEINIT=CTMODEINIT_BU
369
IF(.NOT.BYPASS_CHECK) THEN
373
IF(DONEHELDOUBLECHECK.AND.(.NOT.HELDOUBLECHECKED)) THEN
374
HELDOUBLECHECKED=.TRUE.
375
DONEHELDOUBLECHECK=.FALSE.
378
CHECKPHASE=(NTRY.LE.CHECKCYCLE).AND.(((.NOT.FOUNDLOOPFILTER
379
$ ).AND.USELOOPFILTER).OR.(.NOT.FOUNDHELFILTER))
381
IF ((.NOT. CHECKPHASE).AND.(.NOT.FOUNDHELFILTER)) THEN
382
OPEN(1, FILE='HelFilter.dat', ERR=110, STATUS='NEW',
384
WRITE(1,*) (GOODHEL(I),I=1,NCOMB)
387
FOUNDHELFILTER=.TRUE.
390
IF ((.NOT. CHECKPHASE).AND.(.NOT.FOUNDLOOPFILTER).AND.USELOOPFILT
392
OPEN(1, FILE='LoopFilter.dat', ERR=111, STATUS='NEW',
395
WRITE(1,*) (GOODAMP(I,J),I=NCTAMPS+1,NLOOPAMPS)
399
FOUNDLOOPFILTER=.TRUE.
402
IF (BYPASS_CHECK) THEN
403
OLD_CHECKPHASE = CHECKPHASE
404
OLD_HELDOUBLECHECKED = HELDOUBLECHECKED
406
HELDOUBLECHECKED = .TRUE.
408
OLD_GOODHEL(I)=GOODHEL(I)
413
OLD_GOODAMP(J,I)=GOODAMP(J,I)
414
GOODAMP(J,I) = .TRUE.
419
IF(CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED)) THEN
423
IF (USERHEL.NE.-1) THEN
424
IF(.NOT.GOODHEL(USERHEL)) THEN
432
IF (CTMODERUN.GT.-1) THEN
445
IF (IMPROVEPSPOINT.GE.0) THEN
446
C Make the input PS more precise (exact onshell and energy-moment
448
CALL IMPROVE_PS_POINT_PRECISION(PS)
460
AMPL(K,I)=(0.0D0,0.0D0)
464
LSCALE=DSQRT(ABS((P(0,1)+P(0,2))**2-(P(1,1)+P(1,2))**2-(P(2,1)
465
$ +P(2,2))**2-(P(3,1)+P(3,2))**2))
467
C For loop-induced, the reference for comparison is set later from
468
C the total contribution of the previous PS point considered.
469
C But you can edit here the value to be used for the first PS
471
IF (NPSPOINTS.EQ.0) THEN
474
REF=NEXTREF/DBLE(NPSPOINTS)
479
IF (CTMODE.EQ.0.OR.CTMODE.GE.4) THEN
480
CALL MP_UPDATE_AS_PARAM()
483
IF (.NOT.MP_PS_SET.AND.(CTMODE.EQ.0.OR.CTMODE.GE.4)) THEN
484
CALL SET_MP_PS(P_USER)
494
IF ((HELPICKED.EQ.H).OR.((HELPICKED.EQ.-1).AND.(CHECKPHASE.OR.(
495
$ .NOT.HELDOUBLECHECKED).OR.GOODHEL(H)))) THEN
496
IF (VALIDH.EQ.-1) VALIDH=H
500
C Check if we are in multiple precision and compute wfs and
501
C amps accordingly if needed
502
IF (CTMODE.GE.4) THEN
503
C Force that only current helicity is used in the routine
505
C This should always be done, even if MP_DONE is True
506
C because the AMPL of the R2 MUST be recomputed for loop
508
C (because they are not saved for each hel configuration)
509
C (This is not optimal unlike what is done int the loop
511
HELPICKED_BU = HELPICKED
513
CALL MP_BORN_AMPS_AND_WFS(MP_P)
514
HELPICKED = HELPICKED_BU
517
CALL VXXXXX(P(0,1),ZERO,NHEL(1),-1*IC(1),W(1,1))
518
CALL VXXXXX(P(0,2),ZERO,NHEL(2),-1*IC(2),W(1,2))
519
CALL SXXXXX(P(0,3),+1*IC(3),W(1,3))
520
CALL SXXXXX(P(0,4),+1*IC(4),W(1,4))
521
C Counter-term amplitude(s) for loop diagram number 1
522
CALL R2_GGHH_0(W(1,1),W(1,2),W(1,4),W(1,3),R2_GGHHB,AMPL(1
524
CALL SSS1_1(W(1,3),W(1,4),GC_30,MDL_MH,MDL_WH,W(1,5))
525
C Counter-term amplitude(s) for loop diagram number 3
526
CALL VVS1_0(W(1,1),W(1,2),W(1,5),R2_GGHB,AMPL(1,2))
527
C Counter-term amplitude(s) for loop diagram number 9
528
CALL R2_GGHH_0(W(1,1),W(1,2),W(1,4),W(1,3),R2_GGHHT,AMPL(1
530
C Counter-term amplitude(s) for loop diagram number 11
531
CALL VVS1_0(W(1,1),W(1,2),W(1,5),R2_GGHT,AMPL(1,4))
533
HELPICKED_BU=HELPICKED
536
IF(SKIPLOOPEVAL) THEN
539
C Loop amplitude for loop diagram with ID 1
540
CALL LOOP_4_4(1,1,2,4,3,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
541
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
542
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
543
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
544
$ ,GC_33,MP__GC_33,GC_33,MP__GC_33,4,1,5,AMPL(1,5),S(5))
545
C Loop amplitude for loop diagram with ID 2
546
CALL LOOP_4_4(1,1,2,3,4,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
547
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
548
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
549
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
550
$ ,GC_33,MP__GC_33,GC_33,MP__GC_33,4,1,6,AMPL(1,6),S(6))
551
C Loop amplitude for loop diagram with ID 3
552
CALL LOOP_3_3(2,1,2,5,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
553
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
554
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5
555
$ ,GC_5,MP__GC_5,GC_33,MP__GC_33,3,1,7,AMPL(1,7),S(7))
556
C Loop amplitude for loop diagram with ID 4
557
CALL LOOP_3_3(3,1,2,5,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
558
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
559
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5
560
$ ,GC_5,MP__GC_5,GC_33,MP__GC_33,3,1,8,AMPL(1,8),S(8))
561
C Loop amplitude for loop diagram with ID 5
562
CALL LOOP_4_4(4,1,2,4,3,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
563
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
564
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
565
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
566
$ ,GC_33,MP__GC_33,GC_33,MP__GC_33,4,1,9,AMPL(1,9),S(9))
567
C Loop amplitude for loop diagram with ID 6
568
CALL LOOP_4_4(5,1,3,2,4,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
569
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
570
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
571
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_33,MP__GC_33
572
$ ,GC_5,MP__GC_5,GC_33,MP__GC_33,4,1,10,AMPL(1,10),S(10))
573
C Loop amplitude for loop diagram with ID 7
574
CALL LOOP_4_4(4,1,2,3,4,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
575
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
576
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
577
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
578
$ ,GC_33,MP__GC_33,GC_33,MP__GC_33,4,1,11,AMPL(1,11),S(11))
579
C Loop amplitude for loop diagram with ID 8
580
CALL LOOP_4_4(6,1,3,2,4,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB
581
$ ,KIND=16),DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16)
582
$ ,DCMPLX(MDL_MB),CMPLX(MP__MDL_MB,KIND=16),DCMPLX(MDL_MB)
583
$ ,CMPLX(MP__MDL_MB,KIND=16),GC_5,MP__GC_5,GC_33,MP__GC_33
584
$ ,GC_5,MP__GC_5,GC_33,MP__GC_33,4,1,12,AMPL(1,12),S(12))
585
C Loop amplitude for loop diagram with ID 9
586
CALL LOOP_4_4(1,1,2,4,3,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
587
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
588
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
589
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
590
$ ,GC_37,MP__GC_37,GC_37,MP__GC_37,4,1,13,AMPL(1,13),S(13))
591
C Loop amplitude for loop diagram with ID 10
592
CALL LOOP_4_4(1,1,2,3,4,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
593
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
594
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
595
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
596
$ ,GC_37,MP__GC_37,GC_37,MP__GC_37,4,1,14,AMPL(1,14),S(14))
597
C Loop amplitude for loop diagram with ID 11
598
CALL LOOP_3_3(2,1,2,5,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
599
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
600
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5
601
$ ,GC_5,MP__GC_5,GC_37,MP__GC_37,3,1,15,AMPL(1,15),S(15))
602
C Loop amplitude for loop diagram with ID 12
603
CALL LOOP_3_3(3,1,2,5,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
604
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
605
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5
606
$ ,GC_5,MP__GC_5,GC_37,MP__GC_37,3,1,16,AMPL(1,16),S(16))
607
C Loop amplitude for loop diagram with ID 13
608
CALL LOOP_4_4(4,1,2,4,3,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
609
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
610
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
611
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
612
$ ,GC_37,MP__GC_37,GC_37,MP__GC_37,4,1,17,AMPL(1,17),S(17))
613
C Loop amplitude for loop diagram with ID 14
614
CALL LOOP_4_4(5,1,3,2,4,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
615
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
616
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
617
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_37,MP__GC_37
618
$ ,GC_5,MP__GC_5,GC_37,MP__GC_37,4,1,18,AMPL(1,18),S(18))
619
C Loop amplitude for loop diagram with ID 15
620
CALL LOOP_4_4(4,1,2,3,4,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
621
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
622
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
623
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_5,MP__GC_5
624
$ ,GC_37,MP__GC_37,GC_37,MP__GC_37,4,1,19,AMPL(1,19),S(19))
625
C Loop amplitude for loop diagram with ID 16
626
CALL LOOP_4_4(6,1,3,2,4,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT
627
$ ,KIND=16),DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16)
628
$ ,DCMPLX(MDL_MT),CMPLX(MP__MDL_MT,KIND=16),DCMPLX(MDL_MT)
629
$ ,CMPLX(MP__MDL_MT,KIND=16),GC_5,MP__GC_5,GC_37,MP__GC_37
630
$ ,GC_5,MP__GC_5,GC_37,MP__GC_37,4,1,20,AMPL(1,20),S(20))
631
HELPICKED=HELPICKED_BU
632
DO I=NCTAMPS+1,NLOOPAMPS
633
IF((CTMODERUN.NE.-1).AND..NOT.CHECKPHASE.AND.(.NOT.S(I))
635
WRITE(*,*) '##W03 WARNING Contribution ',I
636
WRITE(*,*) ' is unstable for helicity ',H
638
C IF(.NOT.ISZERO(ABS(AMPL(2,I))+ABS(AMPL(3,I)),REF,-1,H))
640
C WRITE(*,*) '##W04 WARNING Contribution ',I,' for helicity
641
C ',H,' has a contribution to the poles.'
642
C WRITE(*,*) 'Finite contribution = ',AMPL(1,I)
643
C WRITE(*,*) 'single pole contribution = ',AMPL(2,I)
644
C WRITE(*,*) 'double pole contribution = ',AMPL(3,I)
650
CFTOT=DCMPLX(CF_N(I,J)/DBLE(ABS(CF_D(I,J))),0.0D0)
651
IF(CF_D(I,J).LT.0) CFTOT=CFTOT*IMAG1
652
ANS(1)=ANS(1)+DBLE(CFTOT*AMPL(1,I)*DCONJG(AMPL(1,J)))
654
ANS(2)=ANS(2)+DBLE(CFTOT*AMPL(2,I))+DIMAG(CFTOT
656
ANS(3)=ANS(3)+DBLE(CFTOT*AMPL(3,I))+DIMAG(CFTOT
664
C WHEN CTMODE IS >=4, then the MP computation of wfs and amps is
665
C automatically done.
666
IF (CTMODE.GE.4) THEN
670
IF(SKIPLOOPEVAL) THEN
676
IF(.NOT.ISZERO(ABS(ANS(2))+ABS(ANS(3)),REF*(10.0D0**-2),
678
WRITE(*,*) '##W05 WARNING Found a PS point with a contribution
679
$ to the single pole.'
680
WRITE(*,*) 'Finite contribution = ',ANS(1)
681
WRITE(*,*) 'single pole contribution = ',ANS(2)
682
WRITE(*,*) 'double pole contribution = ',ANS(3)
687
IF (CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED)) THEN
688
C Update of NEXTREF, will be used for loop induced only.
689
NEXTREF = NEXTREF + ANS(1) + ANS(2) + ANS(3)
690
IF((USERHEL.EQ.-1).OR.(USERHEL.EQ.HELPICKED)) THEN
691
BUFFR(1)=BUFFR(1)+ANS(1)
692
BUFFR(2)=BUFFR(2)+ANS(2)
693
BUFFR(3)=BUFFR(3)+ANS(3)
697
C SET THE HELICITY FILTER
698
IF(.NOT.FOUNDHELFILTER) THEN
699
IF(ISZERO(ABS(ANS(1))+ABS(ANS(2))+ABS(ANS(3)),REF
700
$ /DBLE(NCOMB),-1)) THEN
702
GOODHEL(HELPICKED)=.FALSE.
703
ELSEIF(GOODHEL(HELPICKED)) THEN
704
WRITE(*,*) '##W02A WARNING Inconsistent helicity '
706
IF(HELINITSTARTOVER) THEN
707
WRITE(*,*) '##I01 INFO Initialization starting over
708
$ because of inconsistency in the helicity filter
714
IF(.NOT.GOODHEL(HELPICKED)) THEN
715
WRITE(*,*) '##W02B WARNING Inconsistent helicity '
717
IF(HELINITSTARTOVER) THEN
718
WRITE(*,*) '##I01 INFO Initialization starting over
719
$ because of inconsistency in the helicity filter
723
GOODHEL(HELPICKED)=.TRUE.
729
C SET THE LOOP FILTER
730
IF(.NOT.FOUNDLOOPFILTER.AND.USELOOPFILTER) THEN
731
DO I=NCTAMPS+1,NLOOPAMPS
732
IF(.NOT.ISZERO(ABS(AMPL(1,I))+ABS(AMPL(2,I))+ABS(AMPL(3
733
$ ,I)),(REF*1.0D-4),I)) THEN
735
GOODAMP(I,HELPICKED)=.TRUE.
736
ELSEIF(.NOT.GOODAMP(I,HELPICKED)) THEN
737
WRITE(*,*) '##W02 WARNING Inconsistent loop amp ',I
738
$ ,' for helicity ',HELPICKED,'.'
739
IF(LOOPINITSTARTOVER) THEN
740
WRITE(*,*) '##I01 INFO Initialization starting
741
$ over because of inconsistency in the loop filter
745
GOODAMP(I,HELPICKED)=.TRUE.
751
ELSEIF (.NOT.HELDOUBLECHECKED)THEN
752
IF ((.NOT.GOODHEL(HELPICKED)).AND.(.NOT.ISZERO(ABS(ANS(1))
753
$ +ABS(ANS(2))+ABS(ANS(3)),REF/DBLE(NCOMB),-1))) THEN
754
WRITE(*,*) '##W15 Helicity filter could not be successfully
756
WRITE(*,*) 'One reason for this is that you have changed
757
$ sensible parameters which affected what are the zero
758
$ helicity configurations.'
759
WRITE(*,*) 'MadLoop will try to reset the Helicity filter
760
$ with the next PS points it receives.'
762
OPEN(30,FILE='HelFilter.dat',ERR=349)
764
CLOSE(30,STATUS='delete')
766
C SET HELDOUBLECHECKED TO .TRUE. WHEN DONE
767
C even if it failed we do not want to redo the check afterwards
768
C if HELINITSTARTOVER=.FALSE.
769
IF (HELPICKED.EQ.NCOMB.AND.(NTRY.NE.0.OR..NOT.HELINITSTARTOVE
771
DONEHELDOUBLECHECK=.TRUE.
775
C GOTO NEXT HELICITY OR FINISH
776
IF(HELPICKED.NE.NCOMB) THEN
777
HELPICKED=HELPICKED+1
784
C We add one here to the number of PS points used for building
785
C the reference scale for comparison (used only for loop-induc
787
NPSPOINTS = NPSPOINTS+1
789
NATTEMPTS=NATTEMPTS+1
790
IF(NATTEMPTS.EQ.MAXATTEMPTS) THEN
791
WRITE(*,*) '##E01 ERROR Could not initialize the filters
792
$ in ',MAXATTEMPTS,' trials'
801
ANS(K)=ANS(K)/DBLE(IDEN)
802
IF (USERHEL.NE.-1) THEN
803
ANS(K)=ANS(K)*HELAVGFACTOR
807
IF(.NOT.CHECKPHASE.AND.HELDOUBLECHECKED.AND.(CTMODERUN.LE.
809
STAB_INDEX=STAB_INDEX+1
810
IF(DOING_QP_EVALS) THEN
811
QP_RES(1,STAB_INDEX)=ANS(1)
812
QP_RES(2,STAB_INDEX)=ANS(2)
813
QP_RES(3,STAB_INDEX)=ANS(3)
815
DP_RES(1,STAB_INDEX)=ANS(1)
816
DP_RES(2,STAB_INDEX)=ANS(2)
817
DP_RES(3,STAB_INDEX)=ANS(3)
820
IF(DOING_QP_EVALS) THEN
826
C BEGINNING OF THE DEFINITIONS OF THE DIFFERENT EVALUATION
829
IF(.NOT.EVAL_DONE(2)) THEN
831
CTMODE=BASIC_CT_MODE+1
837
IF(.NOT.EVAL_DONE(3).AND. ((DOING_QP_EVALS.AND.NROTATIONS_QP.GE
838
$ .1).OR.((.NOT.DOING_QP_EVALS).AND.NROTATIONS_DP.GE.1)) ) THEN
840
CALL ROTATE_PS(PS,P,1)
841
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,1)
845
IF(.NOT.EVAL_DONE(4).AND. ((DOING_QP_EVALS.AND.NROTATIONS_QP.GE
846
$ .2).OR.((.NOT.DOING_QP_EVALS).AND.NROTATIONS_DP.GE.2)) ) THEN
848
CALL ROTATE_PS(PS,P,2)
849
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,2)
853
CALL ROTATE_PS(PS,P,0)
854
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,0)
856
C END OF THE DEFINITIONS OF THE DIFFERENT EVALUATION METHODS
858
IF(DOING_QP_EVALS) THEN
859
CALL COMPUTE_ACCURACY(QP_RES,N_QP_EVAL,ACC,ANS)
862
IF(ACC.GE.MLSTABTHRES) THEN
865
CALL COMPUTE_ACCURACY(DP_RES,N_DP_EVAL,TEMP1,TEMP)
866
WRITE(*,*) '##W03 WARNING An unstable PS point was'
868
WRITE(*,*) '(DP,QP) accuracies : (',TEMP1,',',ACC,')'
869
WRITE(*,*) 'Best estimate (fin,1eps,2eps) :',(ANS(I),I=1,3)
871
WRITE(*,*) 'Double precision evaluations :',(DP_RES(1,I)
873
WRITE(*,*) 'Quad precision evaluations :',(QP_RES(1,I)
875
WRITE(*,*) 'PS point specification :'
876
WRITE(*,*) 'Renormalization scale MU_R=',MU_R
878
WRITE (*,'(i2,1x,4e27.17)') I, P(0,I),P(1,I),P(2,I)
883
WRITE(*,*) 'Further output of the details of these
884
$ unstable PS points will now be suppressed.'
888
CALL COMPUTE_ACCURACY(DP_RES,N_DP_EVAL,ACC,ANS)
889
IF(ACC.GE.MLSTABTHRES) THEN
890
DOING_QP_EVALS=.TRUE.
892
DO I=2,MAXSTABILITYLENGTH
910
C Finalize the return code
911
IF (MP_DONE_ONCE) THEN
916
IF(CHECKPHASE.OR..NOT.HELDOUBLECHECKED) THEN
918
RET_CODE_T=RET_CODE_T+2
923
C Reinitialize the default threshold if it was specified by the
925
IF (USER_STAB_PREC.GT.0.0D0) THEN
926
MLSTABTHRES=MLSTABTHRES_BU
927
CTMODEINIT=CTMODEINIT_BU
930
C Reinitialize the check phase logicals and the filters if check
932
IF (BYPASS_CHECK) THEN
933
CHECKPHASE = OLD_CHECKPHASE
934
HELDOUBLECHECKED = OLD_HELDOUBLECHECKED
936
GOODHEL(I)=OLD_GOODHEL(I)
940
GOODAMP(J,I)=OLD_GOODAMP(J,I)
947
SUBROUTINE COMPUTE_ACCURACY(FULLLIST, LENGTH, ACC, ESTIMATE)
952
INTEGER MAXSTABILITYLENGTH
953
COMMON/STABILITY_TESTS/MAXSTABILITYLENGTH
957
REAL*8 FULLLIST(3,MAXSTABILITYLENGTH)
959
REAL*8 ACC, ESTIMATE(3)
963
LOGICAL MASK(MAXSTABILITYLENGTH)
965
DATA MASK3/.TRUE.,.TRUE.,.TRUE./
970
REAL*8 LIST(MAXSTABILITYLENGTH)
978
DO I=LENGTH+1,MAXSTABILITYLENGTH
980
C For some architectures, it is necessary to initialize all the
981
C elements of fulllist(i,j)
982
C Beware that if the length provided is incorrect, then this can
983
C corrup the fulllist given in argument.
990
DO J=1,MAXSTABILITYLENGTH
991
LIST(J)=FULLLIST(I,J)
993
DIFF=MAXVAL(LIST,1,MASK)-MINVAL(LIST,1,MASK)
994
AVG=(MAXVAL(LIST,1,MASK)+MINVAL(LIST,1,MASK))/2.0D0
996
IF (AVG.EQ.0.0D0) THEN
999
ACCURACIES(I)=DIFF/ABS(AVG)
1003
C The technique below is too sensitive, typically to
1004
C unstablities in very small poles
1005
C ACC=MAXVAL(ACCURACIES,1,MASK3)
1006
C The following is used instead
1010
ACC = ACC + ACCURACIES(I)*ABS(ESTIMATE(I))
1011
AVG = AVG + ESTIMATE(I)
1013
ACC = ACC / ( ABS(AVG) / 3.0D0)
1017
SUBROUTINE SET_N_EVALS(N_DP_EVALS,N_QP_EVALS)
1020
INTEGER N_DP_EVALS, N_QP_EVALS
1022
INCLUDE 'MadLoopParams.inc'
1024
IF(CTMODERUN.LE.-1) THEN
1025
N_DP_EVALS=2+NROTATIONS_DP
1026
N_QP_EVALS=2+NROTATIONS_QP
1032
IF(N_DP_EVALS.GT.20.OR.N_QP_EVALS.GT.20) THEN
1033
WRITE(*,*) 'ERROR:: Increase hardcoded maxstabilitylength.'
1040
C THIS SUBROUTINE SIMPLY SET THE GLOBAL PS CONFIGURATION GLOBAL
1041
C VARIABLES FROM A GIVEN VARIABLE IN DOUBLE PRECISION
1042
SUBROUTINE SET_MP_PS(P)
1045
PARAMETER (NEXTERNAL=4)
1046
REAL*16 MP_PS(0:3,NEXTERNAL),MP_P(0:3,NEXTERNAL)
1047
COMMON/MP_PSPOINT/MP_PS,MP_P
1048
REAL*8 P(0:3,NEXTERNAL)
1055
CALL MP_IMPROVE_PS_POINT_PRECISION(MP_PS)
1058
MP_P(J,I)=MP_PS(J,I)
1064
SUBROUTINE FORCE_STABILITY_CHECK(ONOFF)
1066
C This function can be called by the MadLoop user so as to always
1068
C checked, even during initialisation, when calling the *_thres
1073
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1074
DATA BYPASS_CHECK, ALWAYS_TEST_STABILITY /.FALSE.,.FALSE./
1075
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1077
ALWAYS_TEST_STABILITY = ONOFF
1081
SUBROUTINE SLOOPMATRIXHEL_THRES(P,HEL,ANS,PREC_ASKED,PREC_FOUND
1088
PARAMETER (NEXTERNAL=4)
1092
REAL*8 P(0:3,NEXTERNAL)
1094
INTEGER HEL,RET_CODE
1095
REAL*8 PREC_ASKED,PREC_FOUND
1099
REAL*8 USER_STAB_PREC
1100
COMMON/USER_STAB_PREC/USER_STAB_PREC
1104
COMMON/ACC/ACCURACY,H,T,U
1106
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1107
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1112
USER_STAB_PREC = PREC_ASKED
1114
CALL SLOOPMATRIXHEL(P,HEL,ANS)
1115
IF(ALWAYS_TEST_STABILITY.AND.(H.EQ.1.OR.ACCURACY.LT.0.0D0)) THEN
1116
BYPASS_CHECK = .TRUE.
1117
CALL SLOOPMATRIXHEL(P,HEL,ANS)
1118
BYPASS_CHECK = .FALSE.
1119
C Make sure we correctly return an initialization-type T code
1125
RET_CODE=100*H+10*T+U
1126
C Reset it to default value not to affect next runs
1127
USER_STAB_PREC = -1.0D0
1131
SUBROUTINE SLOOPMATRIX_THRES(P,ANS,PREC_ASKED,PREC_FOUND
1135
C P(0:3, Nexternal) double :: Kinematic configuration (E,px,py,pz
1137
C PEC_ASKED double :: Target relative accuracy, -1 for
1141
C ANS(3) double :: Result (finite, single pole,
1143
C PREC_FOUND double :: Relative accuracy estimated for
1145
C Returns -1 if no stab test could be performed.
1146
C RET_CODE integer :: Return code. See below for details
1148
C Return code conventions: RET_CODE = H*100 + T*10 + U
1151
C Stability unknown.
1153
C Stable PS (SPS) point.
1154
C No stability rescue was necessary.
1156
C Unstable PS (UPS) point.
1157
C Stability rescue necessary, and successful.
1159
C Exceptional PS (EPS) point.
1160
C Stability rescue attempted, but unsuccessful.
1163
C Default computation (double prec.) was performed.
1165
C Quadruple precision was used for this PS point.
1167
C MadLoop in initialization phase. Only double precision used.
1169
C MadLoop in initialization phase. Quadruple precision used.
1171
C U is a number left for future use (always set to 0 for now).
1172
C example: TIR vs OPP usage.
1179
PARAMETER (NEXTERNAL=4)
1183
REAL*8 P(0:3,NEXTERNAL)
1185
REAL*8 PREC_ASKED,PREC_FOUND
1190
REAL*8 USER_STAB_PREC
1191
COMMON/USER_STAB_PREC/USER_STAB_PREC
1195
COMMON/ACC/ACCURACY,H,T,U
1197
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1198
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1203
USER_STAB_PREC = PREC_ASKED
1205
CALL SLOOPMATRIX(P,ANS)
1206
IF(ALWAYS_TEST_STABILITY.AND.(H.EQ.1.OR.ACCURACY.LT.0.0D0)) THEN
1207
BYPASS_CHECK = .TRUE.
1208
CALL SLOOPMATRIX(P,ANS)
1209
BYPASS_CHECK = .FALSE.
1210
C Make sure we correctly return an initialization-type T code
1215
C Reset it to default value not to affect next runs
1216
USER_STAB_PREC = -1.0D0
1218
RET_CODE=100*H+10*T+U