56
72
%(real_dp_format)s LSCALE
57
73
common/%(proc_prefix)sCT/LSCALE,CTMODE
75
c The argument ILIB is the TIR library to be used for that specific library.
77
COMMON/%(proc_prefix)sI_LIB/LIBINDEX
79
## if(not AmplitudeReduction){
60
80
%(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NSQUAREDSO,NLOOPGROUPS)
82
%(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NLOOPGROUPS)
61
84
COMMON/%(proc_prefix)sLCOEFS/LOOPCOEFS
86
C The index 0 of the second dimensions is filled with .false. as it makes the implementation simpler this way when the user sets TIR_CACHE_SIZE to be 0.
87
LOGICAL TIR_DONE(NLOOPGROUPS,0:TIR_CACHE_SIZE)
88
COMMON/%(proc_prefix)sTIRCACHING/TIR_DONE
94
C Initialize for the very first time ML is called LAST_ILIB with the first ILIB used.
95
IF(LAST_LIB_USED.eq.-1) THEN
96
LAST_LIB_USED = MLREDUCTIONLIB(LIBINDEX)
98
C We changed the TIR library so we must refresh the cache.
99
IF(MLREDUCTIONLIB(LIBINDEX).NE.LAST_LIB_USED) THEN
100
LAST_LIB_USED = MLREDUCTIONLIB(LIBINDEX)
101
CALL %(proc_prefix)sCLEAR_TIR_CACHE()
105
IF (MLReductionLib(I_LIB).EQ.4) THEN
106
## if(golem_available) {
108
C PDEN is dummy for Golem95 so we just initialize it to zero here so as to use it for the function SWITCHORDER
114
CALL %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
115
CALL %(proc_prefix)sGOLEMLOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
118
C Golem95 not available
119
WRITE(*,*) 'ERROR:: Golem95 is not interfaced.'
67
124
C INITIALIZE TIR IF NEEDED
71
127
CALL %(proc_prefix)sINITTIR()
121
177
NLOOPCOEFS=NLOOPCOEFS+(3+I)*(2+I)*(1+I)/6
180
if (TIR_CACHE_SIZE.eq.0) THEN
183
TIR_CACHE_INDEX = %(proc_prefix)sTIRCACHE_INDEX(CTMODE)
184
C This way whenever the CTMode exceeds the cache size it rolls back to the beginning and MadLoop will have taken care of having re-initialized TIR_DONE between labels 200 and 205 in loop_matrix.f
185
TIR_CACHE_INDEX = MOD(TIR_CACHE_INDEX-1,TIR_CACHE_SIZE)+1
188
IF(.NOT.TIR_DONE(I_LOOPGROUP,TIR_CACHE_INDEX))THEN
124
190
SELECT CASE(MLReductionLib(I_LIB))
193
## if(pjfry_available){
194
CALL %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
195
CALL PMLOOP(NLOOPLINE,RANK,PL,PDEN,M2L,MU_R,PJCOEFS(0:NLOOPCOEFS-1,1:3),STABLE)
196
C CONVERT TO MADLOOP CONVENTION
197
CALL %(proc_prefix)sCONVERT_PJFRY_COEFFS(RANK,PJCOEFS,TIRCOEFS)
199
WRITE(*,*) 'ERROR:: PJFRY++ is not interfaced.'
204
## if(iregi_available){
205
CALL IMLOOP(CTMODE,IREGIMODE,NLOOPLINE,LOOPMAXCOEFS,RANK,PDEN,M2L,MU_R,PJCOEFS,STABLE)
206
C CONVERT TO MADLOOP CONVENTION
207
CALL %(proc_prefix)sCONVERT_IREGI_COEFFS(RANK,PJCOEFS,TIRCOEFS)
209
WRITE(*,*) 'ERROR:: IREGI is not interfaced.'
214
C The zero index is dummy and means no caching at all since TIR_CACHE_SIZE=0.
215
IF(TIR_CACHE_INDEX.NE.0) THEN
218
TIRCOEFS_CACHING(I,J,I_LOOPGROUP,TIR_CACHE_INDEX)=TIRCOEFS(J,I)
221
TIR_DONE(I_LOOPGROUP,TIR_CACHE_INDEX)=.TRUE.
226
TIRCOEFS(J,I)=TIRCOEFS_CACHING(I,J,I_LOOPGROUP,TIR_CACHE_INDEX)
134
RES(I)=LOOPCOEFS(0,I_SQSO,I_LOOPGROUP)*TIRCOEFS(0,I)
136
RES(I)=RES(I)+LOOPCOEFS(J,I_SQSO,I_LOOPGROUP)*TIRCOEFS(J,I)
234
## if(not AmplitudeReduction){
235
RES(I)=RES(I)+LOOPCOEFS(J,I_SQSO,I_LOOPGROUP)*TIRCOEFS(J,I)
237
RES(I)=RES(I)+LOOPCOEFS(J,I_LOOPGROUP)*TIRCOEFS(J,I)
241
## if(AmplitudeReduction){
242
RES(1)=NORMALIZATION*RES(1)
243
RES(2)=NORMALIZATION*RES(2)
244
RES(3)=NORMALIZATION*RES(3)
246
RES(1)=NORMALIZATION*2.0d0*DBLE(RES(1))
247
RES(2)=NORMALIZATION*2.0d0*DBLE(RES(2))
248
RES(3)=NORMALIZATION*2.0d0*DBLE(RES(3))
140
250
C WRITE(*,*) 'Loop ID',ID,' =',RES(1),RES(2),RES(3)
253
SUBROUTINE %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
256
INTEGER CTMODE,NLOOPLINE
258
%(real_dp_format)s PL(0:3,NLOOPLINE)
259
%(real_dp_format)s PDEN(0:3,NLOOPLINE-1)
260
COMPLEX*16 M2L(NLOOPLINE)
261
%(real_dp_format)s NEW_PL(0:3,NLOOPLINE)
262
%(real_dp_format)s NEW_PDEN(0:3,NLOOPLINE-1)
263
%(complex_dp_format)s NEW_M2L(NLOOPLINE)
267
IF (CTMode.ne.2.and.CTMode.ne.4) THEN
271
IF (NLOOPLINE.le.2) THEN
277
NEW_PDEN(J,NLOOPLINE-I) = PDEN(J,I)
282
PDEN(J,I) = NEW_PDEN(J,I)
287
NEW_M2L(I)=M2L(NLOOPLINE-I+2)
296
NEW_PL(J,I) = -PL(J,NLOOPLINE+1-I)
301
PL(J,I) = NEW_PL(J,I)
143
307
SUBROUTINE %(proc_prefix)sINITTIR()
145
309
C INITIALISATION OF TIR
440
SUBROUTINE %(proc_prefix)sCLEAR_TIR_CACHE()
445
PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
446
INTEGER TIR_CACHE_SIZE
447
include 'tir_cache_size.inc'
451
LOGICAL TIR_DONE(NLOOPGROUPS,0:TIR_CACHE_SIZE)
452
COMMON/%(proc_prefix)sTIRCACHING/TIR_DONE
454
DO I=0,TIR_CACHE_SIZE
456
TIR_DONE(J,I)=.FALSE.
460
C No TIR caching implemented, this is dummy. (The subroutine is kept as it might be called by the MC).
466
integer function %(proc_prefix)sTIRCACHE_INDEX(CTMODE)
467
C Mapping function from CTMode to index and the TIR_cache
468
INTEGER TIR_CACHE_SIZE
469
include 'tir_cache_size.inc'
473
%(proc_prefix)sTIRCACHE_INDEX=CTMODE
474
IF(%(proc_prefix)sTIRCACHE_INDEX.gt.2) THEN
475
C This way, the CTMode 4 and 5 are sent to 3 and 4 respectively.
476
%(proc_prefix)sTIRCACHE_INDEX = %(proc_prefix)sTIRCACHE_INDEX-1
479
C In principle if we wanted to cache other modes or rotations, we could do it here