1
SUBROUTINE SLOOPMATRIXHEL(P,HEL,ANS)
7
PARAMETER (NEXTERNAL=%(nexternal)d)
11
%(real_dp_format)s P(0:3,NEXTERNAL)
12
%(real_dp_format)s ANS(3)
14
common/USERCHOICE/USERHEL
19
CALL SLOOPMATRIX(P,ANS)
22
SUBROUTINE SLOOPMATRIX(P_USER,ANS)
26
C Returns amplitude squared summed/avg over colors
27
c and helicities for the point in phase space P(0:3,NEXTERNAL)
28
c and external lines W(0:6,NEXTERNAL)
36
CHARACTER*64 paramFileName
37
PARAMETER ( paramFileName='MadLoopParams.dat')
39
INTEGER NLOOPS, NLOOPGROUPS, NCTAMPS
40
PARAMETER (NLOOPS=%(nloops)d, NLOOPGROUPS=%(nloop_groups)d, NCTAMPS=%(nctamps)d)
42
PARAMETER (NCOLORROWS=%(nloopamps)d)
44
PARAMETER (NEXTERNAL=%(nexternal)d)
45
INTEGER NWAVEFUNCS,NLOOPWAVEFUNCS
46
PARAMETER (NWAVEFUNCS=%(nwavefuncs)d,NLOOPWAVEFUNCS=%(nloopwavefuncs)d)
48
PARAMETER (MAXLWFSIZE=%(max_lwf_size)d)
49
INTEGER LOOPMAXCOEFS, VERTEXMAXCOEFS
50
PARAMETER (LOOPMAXCOEFS=%(loop_max_coefs)d, VERTEXMAXCOEFS=%(vertex_max_coefs)d)
52
PARAMETER (NCOMB=%(ncomb)d)
53
%(real_dp_format)s ZERO
55
%(real_mp_format)s MP__ZERO
56
PARAMETER (MP__ZERO=0E0_16)
57
%(complex_dp_format)s IMAG1
58
PARAMETER (IMAG1=(0D0,1D0))
59
C This parameter is designed for the check timing command of MG5
61
PARAMETER (SKIPLOOPEVAL=.FALSE.)
63
PARAMETER (BOOTANDSTOP=.FALSE.)
64
INTEGER MAXSTABILITYLENGTH
65
DATA MAXSTABILITYLENGTH/20/
66
common/stability_tests/maxstabilitylength
70
%(real_dp_format)s P_USER(0:3,NEXTERNAL)
71
%(real_dp_format)s ANS(3)
77
%(real_dp_format)s MLSTABTHRES_BU
79
LOGICAL HEL_INCONSISTENT
80
%(real_dp_format)s P(0:3,NEXTERNAL)
81
C DP_RES STORES THE DOUBLE PRECISION RESULT OBTAINED FROM DIFFERENT EVALUATION METHODS IN ORDER TO ASSESS STABILITY.
82
C THE STAB_STAGE COUNTER I CORRESPONDANCE GOES AS FOLLOWS
83
C I=1 -> ORIGINAL PS, CTMODE=1
84
C I=2 -> ORIGINAL PS, CTMODE=2, (ONLY WITH CTMODERUN=-1)
85
C I=3 -> PS WITH ROTATION 1, CTMODE=1, (ONLY WITH CTMODERUN=-2)
86
C I=4 -> PS WITH ROTATION 2, CTMODE=1, (ONLY WITH CTMODERUN=-3)
87
C I=5 -> POSSIBLY MORE EVALUATION METHODS IN THE FUTURE, MAX IS MAXSTABILITYLENGTH
88
C IF UNSTABLE IT GOES TO THE SAME PATTERN BUT STAB_INDEX IS THEN I+20.
89
LOGICAL EVAL_DONE(MAXSTABILITYLENGTH)
90
LOGICAL DOING_QP_EVALS
91
INTEGER STAB_INDEX,BASIC_CT_MODE
92
INTEGER N_DP_EVAL, N_QP_EVAL
95
%(real_dp_format)s ACC
96
%(real_dp_format)s DP_RES(3,MAXSTABILITYLENGTH)
97
C QP_RES STORES THE QUADRUPLE PRECISION RESULT OBTAINED FROM DIFFERENT EVALUATION METHODS IN ORDER TO ASSESS STABILITY.
98
%(real_dp_format)s QP_RES(3,MAXSTABILITYLENGTH)
99
INTEGER NHEL(NEXTERNAL), IC(NEXTERNAL)
103
%(real_dp_format)s HELSAVED(3,NCOMB)
104
%(real_dp_format)s BUFFR(3),BUFFR_BIS(3),TEMP(3),TEMP1,TEMP2
105
%(complex_dp_format)s COEFS(MAXLWFSIZE,0:VERTEXMAXCOEFS-1,MAXLWFSIZE)
106
%(complex_dp_format)s CFTOT
107
LOGICAL FOUNDHELFILTER,FOUNDLOOPFILTER
108
DATA FOUNDHELFILTER/.TRUE./
109
DATA FOUNDLOOPFILTER/.TRUE./
110
LOGICAL LOOPFILTERBUFF(NLOOPGROUPS)
111
DATA (LOOPFILTERBUFF(I),I=1,NLOOPGROUPS)/NLOOPGROUPS*.FALSE./
116
DATA HELAVGFACTOR/%(hel_avg_factor)d/
117
LOGICAL DONEHELDOUBLECHECK
118
DATA DONEHELDOUBLECHECK/.FALSE./
121
C Below are variables to bypass the checkphase and insure stability check to take place
122
LOGICAL OLD_CHECKPHASE, OLD_HELDOUBLECHECKED
123
INTEGER OLD_GOODHEL(NCOMB)
124
LOGICAL OLD_GOODAMP(NLOOPGROUPS)
125
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
126
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
136
include 'mp_coupl.inc'
137
include 'MadLoopParams.inc'
140
DATA CHECKPHASE/.TRUE./
141
LOGICAL HELDOUBLECHECKED
142
DATA HELDOUBLECHECKED/.FALSE./
143
common/INIT/CHECKPHASE, HELDOUBLECHECKED
146
%(real_dp_format)s REF
150
DATA MP_DONE/.FALSE./
151
common/MP_DONE/MP_DONE
153
C PS CAN POSSIBILY BE PASSED THROUGH IMPROVE_PS BUT IS NOT MODIFIED FOR THE PURPOSE OF THE STABILITY TEST
154
C EVEN THOUGH THEY ARE PUT IN COMMON BLOCK, FOR NOW THEY ARE NOT USED ANYWHERE ELSE
155
%(real_dp_format)s PS(0:3,NEXTERNAL)
157
C AGAIN BELOW, MP_PS IS THE FIXED (POSSIBLY IMPROVED) MP PS POINT AND MP_P IS THE ONE WHICH CAN BE MODIFIED (I.E. ROTATED ETC.) FOR STABILITY PURPOSE
158
%(real_mp_format)s MP_PS(0:3,NEXTERNAL),MP_P(0:3,NEXTERNAL)
159
common/MP_PSPOINT/MP_PS,MP_P
161
%(real_dp_format)s LSCALE
163
common/CT/LSCALE,CTMODE
165
DATA MP_PS_SET/.FALSE./
167
C The parameter below sets the convention for the helicity filter
168
C For a given helicity, the attached integer 'i' means
169
C 'i' in ]-inf;-HELOFFSET[ -> Helicity is equal, up to a sign, to helicity number abs(i+HELOFFSET)
170
C 'i' == -HELOFFSET -> Helicity is analytically zero
171
C 'i' in ]-HELOFFSET,inf[ -> Helicity is contributing with weight 'i'. If it is zero, it is skipped.
172
C Typically, the hel_offset is 10000
174
DATA HELOFFSET/%(hel_offset)d/
175
INTEGER GOODHEL(NCOMB)
176
LOGICAL GOODAMP(NLOOPGROUPS)
177
common/Filters/GOODAMP,GOODHEL,HELOFFSET
181
common/HELCHOICE/HELPICKED
184
common/USERCHOICE/USERHEL
186
%(dp_born_amps_decl)s
187
%(complex_dp_format)s W(20,NWAVEFUNCS)
190
%(complex_mp_format)s MPW(20,NWAVEFUNCS)
193
%(complex_dp_format)s WL(MAXLWFSIZE,0:LOOPMAXCOEFS-1,MAXLWFSIZE,0:NLOOPWAVEFUNCS)
194
%(complex_dp_format)s PL(0:3,0:NLOOPWAVEFUNCS)
197
%(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NLOOPS)
198
common/LCOEFS/LOOPCOEFS
200
%(complex_dp_format)s AMPL(3,NCTAMPS)
203
%(complex_dp_format)s LOOPRES(3,NLOOPGROUPS)
204
LOGICAL S(NLOOPGROUPS)
205
common/LOOPRES/LOOPRES,S
207
INTEGER CF_D(NCOLORROWS,%(color_matrix_size)s)
208
INTEGER CF_N(NCOLORROWS,%(color_matrix_size)s)
211
INTEGER HELC(NEXTERNAL,NCOMB)
212
common/HELCONFIGS/HELC
214
%(real_dp_format)s PREC,USER_STAB_PREC
215
DATA USER_STAB_PREC/-1.0d0/
216
COMMON/USER_STAB_PREC/USER_STAB_PREC
218
C Return codes H,T,U correspond to the hundreds, tens and units
219
C building returncode, i.e.
220
C RETURNCODE=100*RET_CODE_H+10*RET_CODE_T+RET_CODE_U
222
INTEGER RET_CODE_H,RET_CODE_T,RET_CODE_U
223
%(real_dp_format)s ACCURACY
225
DATA RET_CODE_H,RET_CODE_T,RET_CODE_U/1,1,0/
226
common/ACC/ACCURACY,RET_CODE_H,RET_CODE_T,RET_CODE_U
229
DATA MP_DONE_ONCE/.FALSE./
230
common/MP_DONE_ONCE/MP_DONE_ONCE
237
CALL MADLOOPPARAMREADER(paramFileName,.TRUE.)
238
CALL SET_N_EVALS(N_DP_EVAL,N_QP_EVAL)
239
HELDOUBLECHECKED=.NOT.DoubleCheckHelicityFilter
240
OPEN(1, FILE="LoopFilter.dat", err=100, status='OLD', action='READ')
242
READ(1,*,END=101) GOODAMP(J)
246
FOUNDLOOPFILTER=.FALSE.
248
GOODAMP(J)=(.NOT.USELOOPFILTER)
252
OPEN(1, FILE="HelFilter.dat", err=102, status='OLD', action='READ')
254
READ(1,*,END=103) GOODHEL(I)
258
FOUNDHELFILTER=.FALSE.
264
OPEN(1, FILE="ColorNumFactors.dat", err=104, status='OLD', action='READ')
266
READ(1,*,END=105) (CF_N(I,J),J=1,%(color_matrix_size)s)
270
STOP 'Color factors could not be initialized from file ColorNumFactors.dat. File not found'
273
OPEN(1, FILE="ColorDenomFactors.dat", err=106, status='OLD', action='READ')
275
READ(1,*,END=107) (CF_D(I,J),J=1,%(color_matrix_size)s)
279
STOP 'Color factors could not be initialized from file ColorDenomFactors.dat. File not found'
282
OPEN(1, FILE="HelConfigs.dat", err=108, status='OLD', action='READ')
284
READ(1,*,END=109) (HELC(I,H),I=1,NEXTERNAL)
288
STOP 'Color helictiy configurations could not be initialized from file HelConfigs.dat. File not found'
292
C SETUP OF THE COMMON STARTING EXTERNAL LOOP WAVEFUNCTION
293
C IT IS ALSO PS POINT INDEPENDENT, SO IT CAN BE DONE HERE.
295
PL(I,0)=(0.0d0,0.0d0)
298
DO J=0,LOOPMAXCOEFS-1
300
IF(I.EQ.K.AND.J.EQ.0) then
301
WL(I,J,K,0)=(1.0d0,0.0d0)
303
WL(I,J,K,0)=(0.0d0,0.0d0)
309
WRITE(*,*) 'Stopped by user request.'
318
DOING_QP_EVALS=.FALSE.
320
DO I=2,MAXSTABILITYLENGTH
324
IF(.NOT.BYPASS_CHECK) THEN
328
IF (USER_STAB_PREC.GT.0.0d0) THEN
329
MLSTABTHRES_BU=MLSTABTHRES
330
MLSTABTHRES=USER_STAB_PREC
331
C In the initialization, I cannot perform stability test and therefore guarantee any precision
332
CTMODEINIT_BU=CTMODEINIT
333
C So either one choses quad precision directly
335
C Or, because this is very slow, we keep the orignal value. The accuracy returned is -1 and tells the MC that he should not trust the evaluation for checks.
336
CTMODEINIT=CTMODEINIT_BU
339
IF(DONEHELDOUBLECHECK.AND.(.NOT.HELDOUBLECHECKED)) THEN
340
HELDOUBLECHECKED=.TRUE.
341
DONEHELDOUBLECHECK=.FALSE.
344
CHECKPHASE=(NTRY.LE.CHECKCYCLE).AND.(((.NOT.FOUNDLOOPFILTER).AND.USELOOPFILTER).OR.(.NOT.FOUNDHELFILTER))
346
IF ((.NOT. CHECKPHASE).AND.(.NOT.FOUNDHELFILTER)) THEN
347
OPEN(1, FILE="HelFilter.dat", err=110, status='NEW', action='WRITE')
349
WRITE(1,*) GOODHEL(I)
353
FOUNDHELFILTER=.TRUE.
356
IF ((.NOT. CHECKPHASE).AND.(.NOT.FOUNDLOOPFILTER).AND.USELOOPFILTER) THEN
357
OPEN(1, FILE="LoopFilter.dat", err=111, status='NEW', action='WRITE')
359
WRITE(1,*) GOODAMP(J)
363
FOUNDLOOPFILTER=.TRUE.
366
IF (BYPASS_CHECK) THEN
367
OLD_CHECKPHASE = CHECKPHASE
368
OLD_HELDOUBLECHECKED = HELDOUBLECHECKED
370
HELDOUBLECHECKED = .TRUE.
372
OLD_GOODHEL(I)=GOODHEL(I)
376
OLD_GOODAMP(I)=GOODAMP(I)
381
IF(CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED)) THEN
385
IF (USERHEL.ne.-1) then
386
IF(GOODHEL(USERHEL).eq.-HELOFFSET) THEN
394
IF (CTMODERUN.NE.-1) THEN
407
IF (ImprovePSPoint.ge.0) THEN
408
C Make the input PS more precise (exact onshell and energy-momentum conservation)
409
CALL IMPROVE_PS_POINT_PRECISION(PS)
423
AMPL(K,I)=(0.0d0,0.0d0)
429
IF (.NOT.MP_PS_SET.AND.(CTMODE.EQ.0.OR.CTMODE.GE.4)) THEN
430
CALL SET_MP_PS(P_USER)
434
LSCALE=DSQRT(ABS((P(0,1)+P(0,2))**2-(P(1,1)+P(1,2))**2-(P(2,1)+P(2,2))**2-(P(3,1)+P(3,2))**2))
437
DO J=0,LOOPMAXCOEFS-1
438
LOOPCOEFS(J,I)=(0.0d0,0.0d0)
446
C Check if we directly go to multiple precision
447
IF (CTMODE.GE.4) THEN
448
IF (.NOT.MP_DONE) THEN
449
CALL MP_COMPUTE_LOOP_COEFS(MP_P,BUFFR_BIS)
450
C It should be safe to directly set MP_DONE to true already here. But maybe I overlooked something.
453
C Even if MP_DONE is .TRUE. we should anyway skip the
454
C double precision evaluation as it as already been
455
c computed in quadruple precision.
460
IF ((HELPICKED.EQ.H).OR.((HELPICKED.EQ.-1).AND.(CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED).OR.(GOODHEL(H).GT.-HELOFFSET.AND.GOODHEL(H).NE.0)))) THEN
464
%(born_ct_helas_calls)s
465
IF (.NOT.CHECKPHASE.AND.HELDOUBLECHECKED.AND.HELPICKED.EQ.-1) THEN
470
DO I=1,%(nctamps_or_nloopamps)s
471
DO J=1,%(nbornamps_or_nloopamps)s
472
CFTOT=DCMPLX(CF_N(I,J)/DBLE(ABS(CF_D(I,J))),0.0d0)
473
IF(CF_D(I,J).LT.0) CFTOT=CFTOT*IMAG1
477
%(coef_construction)s
491
IF(SKIPLOOPEVAL) THEN
501
IF (CHECKPHASE.OR.(.NOT.HELDOUBLECHECKED)) THEN
502
IF((USERHEL.EQ.-1).OR.(USERHEL.EQ.HELPICKED)) THEN
503
C TO KEEP TRACK OF THE FINAL ANSWER TO BE RETURNED DURING CHECK PHASE
504
BUFFR(1)=BUFFR(1)+ANS(1)
505
BUFFR(2)=BUFFR(2)+ANS(2)
506
BUFFR(3)=BUFFR(3)+ANS(3)
508
C SAVE RESULT OF EACH INDEPENDENT HELICITY FOR COMPARISON DURING THE HELICITY FILTER SETUP
509
HELSAVED(1,HELPICKED)=ANS(1)
510
HELSAVED(2,HELPICKED)=ANS(2)
511
HELSAVED(3,HELPICKED)=ANS(3)
514
C SET THE HELICITY FILTER
515
IF(.NOT.FOUNDHELFILTER) THEN
516
HEL_INCONSISTENT=.FALSE.
517
IF(ISZERO(ABS(ANS(1))+ABS(ANS(2))+ABS(ANS(3)),REF/DBLE(NCOMB),-1)) THEN
519
GOODHEL(HELPICKED)=-HELOFFSET
520
ELSEIF(GOODHEL(HELPICKED).NE.-HELOFFSET) THEN
521
WRITE(*,*) '##W02A WARNING Inconsistent helicity ',HELPICKED
522
IF(HELINITSTARTOVER) THEN
523
WRITE(*,*) '##I01 INFO Initialization starting over because of inconsistency in the helicity filter setup.'
526
HEL_INCONSISTENT=.TRUE.
531
IF(GOODHEL(H).GT.-HELOFFSET) THEN
532
C Be looser for helicity check, bring a factor 100
533
DUMMY=ISSAME(ANS,HELSAVED(1,H),REF,.FALSE.)
536
C Set the matching helicity to be contributing once more
537
GOODHEL(H)=GOODHEL(H)+DUMMY
538
C Use an offset to clearly show it is linked to an other one and to avoid overlap
539
GOODHEL(HELPICKED)=-H-HELOFFSET
540
C Make sure we have paired this hel config to the same one last PS point
541
ELSEIF(GOODHEL(HELPICKED).NE.(-H-HELOFFSET)) THEN
542
WRITE(*,*) '##W02B WARNING Inconsistent helicity ',HELPICKED
543
IF(HELINITSTARTOVER) THEN
544
WRITE(*,*) '##I01 INFO Initialization starting over because of inconsistency in the helicity filter setup.'
547
HEL_INCONSISTENT=.TRUE.
554
IF(HEL_INCONSISTENT) THEN
555
C This helicity has unstable filter so we will always compute it by itself.
556
C We therefore also need to remove it from the multiplicative factor of the corresponding helicity.
557
IF(GOODHEL(HELPICKED).LT.-HELOFFSET) THEN
558
GOODHEL(-GOODHEL(HELPICKED)-HELOFFSET)=GOODHEL(-GOODHEL(HELPICKED)-HELOFFSET)-1
560
C If several helicities were matched to that one, we need to chose another one as reference and redirect the others to this new one
561
C Of course if it is one, then we do not need to do anything (because with HELINITSTARTOVER=.FALSE. we only support exactly identical Hels.)
562
IF(GOODHEL(HELPICKED).GT.-HELOFFSET.AND.GOODHEL(HELPICKED).NE.1) THEN
565
IF (GOODHEL(H).EQ.(-HELOFFSET-HELPICKED)) THEN
566
IF (NEWHELREF.EQ.-1) THEN
568
GOODHEL(H)=GOODHEL(HELPICKED)-1
570
GOODHEL(H)=-NEWHELREF-HELOFFSET
575
C In all cases, from now on this helicity will be computed independantly of the others.
576
C In particular, it is the only thing to do if the helicity was flagged not contributing.
581
C SET THE LOOP FILTER
582
IF(.NOT.FOUNDLOOPFILTER.AND.USELOOPFILTER) THEN
584
IF(.NOT.ISZERO(ABS(LOOPRES(1,I))+ABS(LOOPRES(2,I))+ABS(LOOPRES(3,I)),(REF*1.0d-4),I)) THEN
587
LOOPFILTERBUFF(I)=.TRUE.
588
ELSEIF(.NOT.LOOPFILTERBUFF(I)) THEN
589
WRITE(*,*) '##W02 WARNING Inconsistent loop amp ',I,'.'
590
IF(LOOPINITSTARTOVER) THEN
591
WRITE(*,*) '##I01 INFO Initialization starting over because of inconsistency in the loop filter setup.'
600
ELSEIF (.NOT.HELDOUBLECHECKED.AND.NTRY.NE.0)THEN
601
C DOUBLE CHECK THE HELICITY FILTER
602
IF (GOODHEL(HELPICKED).EQ.-HELOFFSET) THEN
603
IF (.NOT.ISZERO(ABS(ANS(1))+ABS(ANS(2))+ABS(ANS(3)),REF/DBLE(NCOMB),-1)) THEN
604
write(*,*) '##W15 Helicity filter could not be successfully double checked.'
605
write(*,*) 'One reason for this is that you might have changed sensible parameters which affected what are the zero helicity configurations.'
606
write(*,*) 'MadLoop will try to reset the Helicity filter with the next PS points it receives.'
608
OPEN(29,FILE='HelFilter.dat',err=348)
610
CLOSE(29,STATUS='delete')
613
IF (GOODHEL(HELPICKED).LT.-HELOFFSET.AND.NTRY.NE.0) THEN
614
IF(ISSAME(ANS,HELSAVED(1,ABS(GOODHEL(HELPICKED)+HELOFFSET)),REF,.TRUE.).EQ.0) THEN
615
write(*,*) '##W15 Helicity filter could not be successfully double checked.'
616
write(*,*) 'One reason for this is that you might have changed sensible parameters which affected the helicity dependance relations.'
617
write(*,*) 'MadLoop will try to reset the Helicity filter with the next PS points it receives.'
619
OPEN(30,FILE='HelFilter.dat',err=349)
621
CLOSE(30,STATUS='delete')
624
C SET HELDOUBLECHECKED TO .TRUE. WHEN DONE
625
C even if it failed we do not want to redo the check afterwards if HELINITSTARTOVER=.FALSE.
626
IF (HELPICKED.EQ.NCOMB.AND.(NTRY.NE.0.OR..NOT.HELINITSTARTOVER)) THEN
627
DONEHELDOUBLECHECK=.TRUE.
631
C GOTO NEXT HELICITY OR FINISH
632
IF(HELPICKED.NE.NCOMB) THEN
633
HELPICKED=HELPICKED+1
639
c write(*,*) 'HELSAVED(1,',I,')=',HELSAVED(1,I)
640
c write(*,*) 'HELSAVED(2,',I,')=',HELSAVED(2,I)
641
c write(*,*) 'HELSAVED(3,',I,')=',HELSAVED(3,I)
642
c write(*,*) ' GOODHEL(',I,')=',GOODHEL(I)
648
NATTEMPTS=NATTEMPTS+1
649
IF(NATTEMPTS.EQ.MAXATTEMPTS) THEN
650
WRITE(*,*) '##E01 ERROR Could not initialize the filters in ',MAXATTEMPTS,' trials'
659
ANS(K)=ANS(K)/DBLE(IDEN)
660
IF (USERHEL.NE.-1) THEN
661
ANS(K)=ANS(K)*HELAVGFACTOR
665
IF(.NOT.CHECKPHASE.AND.HELDOUBLECHECKED.AND.(CTMODERUN.EQ.-1)) THEN
666
STAB_INDEX=STAB_INDEX+1
667
IF(DOING_QP_EVALS) THEN
668
QP_RES(1,STAB_INDEX)=ANS(1)
669
QP_RES(2,STAB_INDEX)=ANS(2)
670
QP_RES(3,STAB_INDEX)=ANS(3)
672
DP_RES(1,STAB_INDEX)=ANS(1)
673
DP_RES(2,STAB_INDEX)=ANS(2)
674
DP_RES(3,STAB_INDEX)=ANS(3)
677
IF(DOING_QP_EVALS) THEN
683
C BEGINNING OF THE DEFINITIONS OF THE DIFFERENT EVALUATION METHODS
685
IF(.NOT.EVAL_DONE(2)) THEN
687
CTMODE=BASIC_CT_MODE+1
693
IF(.NOT.EVAL_DONE(3).AND. ((DOING_QP_EVALS.AND.NRotations_QP.GE.1).OR.((.NOT.DOING_QP_EVALS).AND.NRotations_DP.GE.1)) ) THEN
695
CALL ROTATE_PS(PS,P,1)
696
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,1)
700
IF(.NOT.EVAL_DONE(4).AND. ((DOING_QP_EVALS.AND.NRotations_QP.GE.2).OR.((.NOT.DOING_QP_EVALS).AND.NRotations_DP.GE.2)) ) THEN
702
CALL ROTATE_PS(PS,P,2)
703
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,2)
707
CALL ROTATE_PS(PS,P,0)
708
IF (DOING_QP_EVALS) CALL MP_ROTATE_PS(MP_PS,MP_P,0)
710
C END OF THE DEFINITIONS OF THE DIFFERENT EVALUATION METHODS
712
IF(DOING_QP_EVALS) THEN
713
CALL COMPUTE_ACCURACY(QP_RES,N_QP_EVAL,ACC,ANS)
716
IF(ACC.GE.MLSTABTHRES) THEN
719
CALL COMPUTE_ACCURACY(DP_RES,N_DP_EVAL,TEMP1,TEMP)
720
WRITE(*,*) '##W03 WARNING An exceptional PS point was', ' detected.'
721
WRITE(*,*) '(DP,QP) accuracies : (',TEMP1,',',ACC,')'
722
WRITE(*,*) 'Best estimate (fin,1eps,2eps) :',(ANS(I),I=1,3)
724
WRITE(*,*) 'Double precision evaluations :',(DP_RES(1,I),I=1,N_DP_EVAL)
725
WRITE(*,*) 'Quad precision evaluations :',(QP_RES(1,I),I=1,N_QP_EVAL)
726
WRITE(*,*) 'PS point specification :'
727
WRITE(*,*) 'Renormalization scale MU_R=',MU_R
729
WRITE (*,'(i2,1x,4e27.17)') i, P(0,i),P(1,i),P(2,i),P(3,i)
733
WRITE(*,*) 'Further output of the details of these unstable PS points will now be suppressed.'
737
CALL COMPUTE_ACCURACY(DP_RES,N_DP_EVAL,ACC,ANS)
738
IF(ACC.GE.MLSTABTHRES) THEN
739
DOING_QP_EVALS=.TRUE.
741
DO I=2,MAXSTABILITYLENGTH
759
C Finalize the return code
760
IF (MP_DONE_ONCE) THEN
765
IF(CHECKPHASE.OR..NOT.HELDOUBLECHECKED) THEN
767
RET_CODE_T=RET_CODE_T+2
772
C Reinitialize the default threshold if it was specified by the user
773
IF (USER_STAB_PREC.GT.0.0d0) THEN
774
MLSTABTHRES=MLSTABTHRES_BU
775
CTMODEINIT=CTMODEINIT_BU
778
C Reinitialize the check phase logicals and the filters if check bypassed
779
IF (BYPASS_CHECK) THEN
780
CHECKPHASE = OLD_CHECKPHASE
781
HELDOUBLECHECKED = OLD_HELDOUBLECHECKED
783
GOODHEL(I)=OLD_GOODHEL(I)
786
GOODAMP(I)=OLD_GOODAMP(I)
792
logical function IsZero(toTest, reference_value, loop)
798
PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
802
%(real_dp_format)s toTest, reference_value
807
INCLUDE 'MadLoopParams.inc'
808
%(complex_dp_format)s LOOPRES(3,NLOOPGROUPS)
809
LOGICAL S(NLOOPGROUPS)
810
common/LOOPRES/LOOPRES,S
814
IF(abs(reference_value).eq.0.0d0) then
816
write(*,*) '##E02 ERRROR Reference value for comparison is zero.'
819
IsZero=((abs(toTest)/abs(reference_value)).lt.ZEROTHRES)
823
IF((.NOT.ISZERO).AND.(.NOT.S(loop))) THEN
824
write(*,*) '##W01 WARNING Contribution ',loop,' is detected as contributing with CR=',(abs(toTest)/abs(reference_value)),' but is unstable.'
830
integer function ISSAME(resA,resB,ref,useMax)
832
C This function compares the result from two different helicity configuration A and B
833
C It returns 0 if they are not related and (+/-wgt) if A=(+/-wgt)*B.
834
C For now, the only wgt implemented is the integer 1 or -1.
835
C If useMax is .TRUE., it uses all implemented weights no matter what is HELINITSTARTOVER
839
integer MAX_WGT_TO_TRY
840
parameter (MAX_WGT_TO_TRY=2)
844
%(real_dp_format)s resA(3), resB(3)
845
%(real_dp_format)s ref
853
integer WGT_TO_TRY(MAX_WGT_TO_TRY)
854
data WGT_TO_TRY/1,-1/
858
include 'MadLoopParams.inc'
864
C If the helicity can be constructed progressively while allowing inconsistency, then we only allow for weight one comparisons.
865
IF (.NOT.HELINITSTARTOVER.AND..NOT.USEMAX) THEN
868
N_WGT_TO_TRY=MAX_WGT_TO_TRY
873
IF (IsZero(ABS(resB(J)),ref,-1)) THEN
874
IF(.NOT.IsZero(ABS(resB(J))+ABS(resA(J)),ref,-1)) THEN
877
C Be loser for helicity comparison, so bring a factor 100
878
ELSEIF(.NOT.IsZero((resA(J)/resB(J))-DBLE(WGT_TO_TRY(I)),ref*100.0d0,-1)) THEN
882
ISSAME = WGT_TO_TRY(I)
888
SUBROUTINE compute_accuracy(fulllist, length, acc, estimate)
893
integer maxstabilitylength
894
common/stability_tests/maxstabilitylength
898
real*8 fulllist(3,maxstabilitylength)
900
real*8 acc, estimate(3)
904
logical mask(maxstabilitylength)
906
data mask3/.TRUE.,.TRUE.,.TRUE./
911
real*8 list(maxstabilitylength)
919
do i=length+1,maxstabilitylength
921
C For some architectures, it is necessary to initialize all the elements of fulllist(i,j)
922
C Beware that if the length provided is incorrect, then this can corrup the fulllist given in argument.
929
do j=1,maxstabilitylength
930
list(j)=fulllist(i,j)
932
diff=maxval(list,1,mask)-minval(list,1,mask)
933
avg=(maxval(list,1,mask)+minval(list,1,mask))/2.0d0
935
if (avg.eq.0.0d0) then
938
accuracies(i)=diff/abs(avg)
942
C The technique below is too sensitive, typically to
943
C unstablities in very small poles
944
C ACC=MAXVAL(ACCURACIES,1,MASK3)
945
C The following is used instead
949
ACC = ACC + ACCURACIES(I)*ABS(ESTIMATE(I))
950
AVG = AVG + ESTIMATE(I)
952
ACC = ACC / ( ABS(AVG) / 3.0d0)
956
SUBROUTINE SET_N_EVALS(N_DP_EVALS,N_QP_EVALS)
959
INTEGER N_DP_EVALS, N_QP_EVALS
961
include 'MadLoopParams.inc'
963
IF(CTMODERUN.LE.-1) THEN
964
N_DP_EVALS=2+NRotations_DP
965
N_QP_EVALS=2+NRotations_QP
971
IF(N_DP_EVALS.GT.20.OR.N_QP_EVALS.GT.20) THEN
972
WRITE(*,*) 'ERROR:: Increase hardcoded maxstabilitylength.'
978
C THIS SUBROUTINE SIMPLY SET THE GLOBAL PS CONFIGURATION GLOBAL VARIABLES FROM A GIVEN VARIABLE IN DOUBLE PRECISION
979
SUBROUTINE SET_MP_PS(P)
982
PARAMETER (NEXTERNAL=%(nexternal)d)
983
%(real_mp_format)s MP_PS(0:3,NEXTERNAL),MP_P(0:3,NEXTERNAL)
984
common/MP_PSPOINT/MP_PS,MP_P
985
%(real_dp_format)s P(0:3,NEXTERNAL)
992
CALL MP_IMPROVE_PS_POINT_PRECISION(MP_PS)
1001
SUBROUTINE FORCE_STABILITY_CHECK(ONOFF)
1003
C This function can be called by the MadLoop user so as to always have stability
1004
C checked, even during initialisation, when calling the *_thres routines.
1008
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1009
DATA BYPASS_CHECK, ALWAYS_TEST_STABILITY /.FALSE.,.FALSE./
1010
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1012
ALWAYS_TEST_STABILITY = ONOFF
1016
SUBROUTINE SLOOPMATRIXHEL_THRES(P,HEL,ANS,PREC_ASKED,PREC_FOUND,RET_CODE)
1022
PARAMETER (NEXTERNAL=%(nexternal)d)
1026
%(real_dp_format)s P(0:3,NEXTERNAL)
1027
%(real_dp_format)s ANS(3)
1028
INTEGER HEL,RET_CODE
1029
%(real_dp_format)s PREC_ASKED,PREC_FOUND
1033
%(real_dp_format)s USER_STAB_PREC
1034
COMMON/USER_STAB_PREC/USER_STAB_PREC
1037
%(real_dp_format)s ACCURACY
1038
common/ACC/ACCURACY,H,T,U
1040
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1041
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1046
USER_STAB_PREC = PREC_ASKED
1048
CALL SLOOPMATRIXHEL(P,HEL,ANS)
1049
IF(ALWAYS_TEST_STABILITY.AND.(H.eq.1.OR.ACCURACY.lt.0.0d0)) THEN
1050
BYPASS_CHECK = .TRUE.
1051
CALL SLOOPMATRIXHEL(P,HEL,ANS)
1052
BYPASS_CHECK = .FALSE.
1053
C Make sure we correctly return an initialization-type T code
1058
C Reset it to default value not to affect next runs
1059
USER_STAB_PREC = -1.0d0
1061
RET_CODE=100*H+10*T+U
1065
SUBROUTINE SLOOPMATRIX_THRES(P,ANS,PREC_ASKED,PREC_FOUND,RET_CODE)
1068
C P(0:3, Nexternal) double :: Kinematic configuration (E,px,py,pz)
1069
C PEC_ASKED double :: Target relative accuracy, -1 for default
1072
C ANS(3) double :: Result (finite, single pole, double pole)
1073
C PREC_FOUND double :: Relative accuracy estimated for the result
1074
C Returns -1 if no stab test could be performed.
1075
C RET_CODE integer :: Return code. See below for details
1077
C Return code conventions: RET_CODE = H*100 + T*10 + U
1080
C Stability unknown.
1082
C Stable PS (SPS) point.
1083
C No stability rescue was necessary.
1085
C Unstable PS (UPS) point.
1086
C Stability rescue necessary, and successful.
1088
C Exceptional PS (EPS) point.
1089
C Stability rescue attempted, but unsuccessful.
1092
C Default computation (double prec.) was performed.
1094
C Quadruple precision was used for this PS point.
1096
C MadLoop in initialization phase. Only double precision used.
1098
C MadLoop in initialization phase. Quadruple precision used.
1100
C U is a number left for future use (always set to 0 for now).
1101
C example: TIR vs OPP usage.
1108
PARAMETER (NEXTERNAL=%(nexternal)d)
1112
%(real_dp_format)s P(0:3,NEXTERNAL)
1113
%(real_dp_format)s ANS(3)
1114
%(real_dp_format)s PREC_ASKED,PREC_FOUND
1119
%(real_dp_format)s USER_STAB_PREC
1120
COMMON/USER_STAB_PREC/USER_STAB_PREC
1123
%(real_dp_format)s ACCURACY
1124
common/ACC/ACCURACY,H,T,U
1126
LOGICAL BYPASS_CHECK, ALWAYS_TEST_STABILITY
1127
COMMON/BYPASS_CHECK/BYPASS_CHECK, ALWAYS_TEST_STABILITY
1132
USER_STAB_PREC = PREC_ASKED
1134
CALL SLOOPMATRIX(P,ANS)
1135
IF(ALWAYS_TEST_STABILITY.AND.(H.eq.1.OR.ACCURACY.lt.0.0d0)) THEN
1136
BYPASS_CHECK = .TRUE.
1137
CALL SLOOPMATRIX(P,ANS)
1138
BYPASS_CHECK = .FALSE.
1139
C Make sure we correctly return an initialization-type T code
1144
C Reset it to default value not to affect next runs
1145
USER_STAB_PREC = -1.0d0
1147
RET_CODE=100*H+10*T+U