~madteam/mg5amcnlo/series2.0

« back to all changes in this revision

Viewing changes to madgraph/iolibs/template_files/loop_optimized/TIR_interface.inc

  • Committer: olivier Mattelaer
  • Date: 2015-03-05 00:14:16 UTC
  • mfrom: (258.1.9 2.3)
  • mto: (258.8.1 2.3)
  • mto: This revision was merged to the branch mainline in revision 259.
  • Revision ID: olivier.mattelaer@uclouvain.be-20150305001416-y9mzeykfzwnl9t0j
partial merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
C  
9
9
C  
10
10
C CONSTANTS 
11
 
C  
 
11
12
12
      INTEGER NLOOPGROUPS
13
13
      PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
14
14
C     These are constants related to the split orders
22
22
      PARAMETER (checkPConservation=.TRUE.)
23
23
      %(real_dp_format)s NORMALIZATION
24
24
      PARAMETER (NORMALIZATION = 1.D0/(16.D0*3.14159265358979323846D0**2))
 
25
## if(TIRCaching){
 
26
      INTEGER TIR_CACHE_SIZE
 
27
      include 'tir_cache_size.inc'
 
28
## }
25
29
C  
26
30
C ARGUMENTS 
27
31
C
42
46
          LOGICAL CTINIT, TIRINIT, GOLEMINIT
43
47
          COMMON/REDUCTIONCODEINIT/CTINIT,TIRINIT,GOLEMINIT
44
48
 
 
49
c This variable will be used to detect changes in the TIR library used so as to force the reset of the TIR filter.
 
50
          INTEGER LAST_LIB_USED
 
51
          DATA LAST_LIB_USED/-1/
 
52
 
45
53
       %(complex_dp_format)s TIRCOEFS(0:LOOPMAXCOEFS-1,3)
46
54
       %(complex_dp_format)s PJCOEFS(0:LOOPMAXCOEFS-1,3)
 
55
## if(TIRCaching){
 
56
       integer TIR_CACHE_INDEX 
 
57
       %(complex_dp_format)s TIRCOEFS_CACHING(3,0:LOOPMAXCOEFS-1,NLOOPGROUPS,TIR_CACHE_SIZE)
 
58
       SAVE TIRCOEFS_CACHING
 
59
## }
47
60
C
48
61
C EXTERNAL FUNCTIONS
49
62
C
 
63
## if(TIRCaching){
 
64
        integer %(proc_prefix)sTIRCACHE_INDEX
 
65
## }
50
66
C
51
67
C GLOBAL VARIABLES
52
68
C
56
72
          %(real_dp_format)s LSCALE
57
73
      common/%(proc_prefix)sCT/LSCALE,CTMODE
58
74
 
 
75
c The argument ILIB is the TIR library to be used for that specific library.
 
76
      INTEGER LIBINDEX
 
77
      COMMON/%(proc_prefix)sI_LIB/LIBINDEX
59
78
 
 
79
## if(not AmplitudeReduction){
60
80
       %(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NSQUAREDSO,NLOOPGROUPS)
 
81
## }else{
 
82
       %(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NLOOPGROUPS)
 
83
## }
61
84
       COMMON/%(proc_prefix)sLCOEFS/LOOPCOEFS
62
 
 
 
85
## if(TIRCaching){
 
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
 
89
## }
63
90
C ----------
64
91
C BEGIN CODE
65
92
C ----------
66
93
 
 
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)
 
97
ELSE
 
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()
 
102
  ENDIF
 
103
ENDIF
 
104
 
 
105
IF (MLReductionLib(I_LIB).EQ.4) THEN
 
106
## if(golem_available) {
 
107
C Using Golem95
 
108
C PDEN is dummy for Golem95 so we just initialize it to zero here so as to use it for the function SWITCHORDER
 
109
  DO I=0,3
 
110
    DO J=1,NLOOPLINE-1
 
111
      PDEN(I,J)=0.0d0
 
112
    ENDDO
 
113
  ENDDO
 
114
  CALL %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
 
115
  CALL %(proc_prefix)sGOLEMLOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
 
116
  RETURN
 
117
## } else {
 
118
C Golem95 not available
 
119
  WRITE(*,*) 'ERROR:: Golem95 is not interfaced.'
 
120
  STOP
 
121
## }
 
122
ENDIF
 
123
 
67
124
C INITIALIZE TIR IF NEEDED
68
 
      %(golem_calling)s
69
125
      IF (TIRINIT) THEN
70
126
            TIRINIT=.FALSE.
71
127
                CALL %(proc_prefix)sINITTIR()
120
176
      DO I=0,RANK
121
177
         NLOOPCOEFS=NLOOPCOEFS+(3+I)*(2+I)*(1+I)/6
122
178
      ENDDO
123
 
 
 
179
## if(TIRCaching){
 
180
      if (TIR_CACHE_SIZE.eq.0) THEN
 
181
            TIR_CACHE_INDEX = 0
 
182
          ELSE
 
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 
 
186
          ENDIF
 
187
 
 
188
          IF(.NOT.TIR_DONE(I_LOOPGROUP,TIR_CACHE_INDEX))THEN
 
189
## } 
124
190
      SELECT CASE(MLReductionLib(I_LIB))
125
191
      CASE(2)
126
192
C     PJFry++
127
 
%(pjfry_calling)s
 
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)
 
198
## } else {
 
199
      WRITE(*,*) 'ERROR:: PJFRY++ is not interfaced.'
 
200
      STOP
 
201
## }
128
202
      CASE(3)
129
203
C     IREGI
130
 
%(iregi_calling)s
 
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)  
 
208
## } else {
 
209
      WRITE(*,*) 'ERROR:: IREGI is not interfaced.'
 
210
      STOP
 
211
## }
131
212
      END SELECT
132
 
 
 
213
## if(TIRCaching){
 
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
 
216
              DO I=1,3
 
217
                    DO J=0,NLOOPCOEFS-1
 
218
                 TIRCOEFS_CACHING(I,J,I_LOOPGROUP,TIR_CACHE_INDEX)=TIRCOEFS(J,I)
 
219
                ENDDO
 
220
              ENDDO
 
221
              TIR_DONE(I_LOOPGROUP,TIR_CACHE_INDEX)=.TRUE.
 
222
            ENDIF
 
223
          ELSE
 
224
            DO I=1,3
 
225
              DO J=0,NLOOPCOEFS-1
 
226
                TIRCOEFS(J,I)=TIRCOEFS_CACHING(I,J,I_LOOPGROUP,TIR_CACHE_INDEX)
 
227
              ENDDO
 
228
            ENDDO
 
229
          ENDIF
 
230
## }
133
231
      DO I=1,3
134
 
         RES(I)=LOOPCOEFS(0,I_SQSO,I_LOOPGROUP)*TIRCOEFS(0,I)
135
 
         DO J=1,NLOOPCOEFS-1
136
 
            RES(I)=RES(I)+LOOPCOEFS(J,I_SQSO,I_LOOPGROUP)*TIRCOEFS(J,I)
 
232
             RES(I)=(0.0d0,0.0d0)
 
233
         DO J=0,NLOOPCOEFS-1
 
234
## if(not AmplitudeReduction){
 
235
               RES(I)=RES(I)+LOOPCOEFS(J,I_SQSO,I_LOOPGROUP)*TIRCOEFS(J,I)
 
236
## }else{
 
237
               RES(I)=RES(I)+LOOPCOEFS(J,I_LOOPGROUP)*TIRCOEFS(J,I)
 
238
## }
137
239
         ENDDO
138
240
      ENDDO
139
 
          %(finalize_TIR)s
 
241
## if(AmplitudeReduction){
 
242
      RES(1)=NORMALIZATION*RES(1)
 
243
      RES(2)=NORMALIZATION*RES(2)
 
244
      RES(3)=NORMALIZATION*RES(3)
 
245
## } else {
 
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))
 
249
## }
140
250
C     WRITE(*,*) 'Loop ID',ID,' =',RES(1),RES(2),RES(3)
141
251
      END
142
252
 
 
253
      SUBROUTINE %(proc_prefix)sSWITCH_ORDER(CTMODE,NLOOPLINE,PL,PDEN,M2L)
 
254
      IMPLICIT NONE
 
255
 
 
256
      INTEGER CTMODE,NLOOPLINE
 
257
 
 
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)
 
264
 
 
265
      INTEGER I,J,K
 
266
 
 
267
      IF (CTMode.ne.2.and.CTMode.ne.4) THEN
 
268
        RETURN 
 
269
      ENDIF
 
270
 
 
271
      IF (NLOOPLINE.le.2) THEN
 
272
        RETURN
 
273
      ENDIF
 
274
 
 
275
      DO I=1,NLOOPLINE-1
 
276
        DO J=0,3
 
277
           NEW_PDEN(J,NLOOPLINE-I) = PDEN(J,I)
 
278
        ENDDO
 
279
      ENDDO
 
280
      DO I=1,NLOOPLINE-1
 
281
        DO J=0,3
 
282
           PDEN(J,I) = NEW_PDEN(J,I)
 
283
        ENDDO
 
284
      ENDDO
 
285
 
 
286
      DO I=2,NLOOPLINE
 
287
        NEW_M2L(I)=M2L(NLOOPLINE-I+2)
 
288
      ENDDO
 
289
      DO I=2,NLOOPLINE
 
290
        M2L(I)=NEW_M2L(I)
 
291
      ENDDO
 
292
 
 
293
 
 
294
      DO I=1,NLOOPLINE
 
295
        DO J=0,3
 
296
          NEW_PL(J,I) = -PL(J,NLOOPLINE+1-I)
 
297
        ENDDO
 
298
      ENDDO
 
299
      DO I=1,NLOOPLINE
 
300
        DO J=0,3
 
301
           PL(J,I) = NEW_PL(J,I)
 
302
        ENDDO
 
303
      ENDDO
 
304
 
 
305
      end
 
306
 
143
307
          SUBROUTINE %(proc_prefix)sINITTIR()
144
308
145
309
C INITIALISATION OF TIR
171
335
C 2 -> AVH
172
336
C 3 -> QCDLOOP
173
337
      LOOPLIB=CTLOOPLIBRARY
174
 
%(initiregi)s
 
338
## if (iregi_available) {
 
339
      CALL INITIREGI(IREGIRECY,LOOPLIB,1d-6)
 
340
## }
175
341
C      The initialization below is for CT v1.9.2+
176
342
       IF (CTINIT) THEN
177
343
             CTINIT=.FALSE.
193
359
C CONSTANTS
194
360
C
195
361
            INTEGER NLOOPLIB,QP_NLOOPLIB
196
 
            PARAMETER (NLOOPLIB=3,QP_NLOOPLIB=1)
 
362
            PARAMETER (NLOOPLIB=4,QP_NLOOPLIB=1)
197
363
C
198
364
C ARGUMENTS
199
365
C
202
368
C
203
369
C LOCAL VARIABLES
204
370
C
205
 
            INTEGER I,J_LIB,LIBNUM
 
371
            INTEGER I,J_LIB,LIBNUM,SELECT_LIBINDEX
206
372
            LOGICAL LPASS
207
373
C
208
374
C GLOBAL VARIABLES
222
388
                   STOP 'No qp tools available, please make sure MLReductionLib is correct'
223
389
                ENDIF
224
390
                J_LIB=0
225
 
                DO I=1,QP_NLOOPLIB
226
 
                   IF(INDEX_QP_TOOLS(I).EQ.LIBINDEX)THEN
227
 
                     J_LIB=I
228
 
                     EXIT
 
391
                SELECT_LIBINDEX=LIBINDEX
 
392
                DO WHILE(J_LIB.EQ.0)
 
393
                   DO I=1,QP_NLOOPLIB   
 
394
                      IF(INDEX_QP_TOOLS(I).EQ.SELECT_LIBINDEX)THEN
 
395
                        J_LIB=I
 
396
                        EXIT
 
397
                      ENDIF
 
398
                   ENDDO
 
399
                   IF(J_LIB.EQ.0)THEN
 
400
                      SELECT_LIBINDEX=SELECT_LIBINDEX+1         
 
401
                      IF(SELECT_LIBINDEX.GT.NLOOPLIB.OR.MLReductionLib(SELECT_LIBINDEX).EQ.0)SELECT_LIBINDEX=1
229
402
                   ENDIF
230
403
                ENDDO
231
 
                IF(J_LIB.EQ.0)THEN
232
 
                   STOP 'CANNOT find the correct qp tool'
233
 
                ENDIF
234
404
                I=J_LIB
235
 
                I_LIB=LIBINDEX
 
405
                I_LIB=SELECT_LIBINDEX
236
406
                LIBNUM=MLReductionLib(I_LIB)
237
407
                DO
238
408
                  CALL DETECT_LOOPLIB(LIBNUM,NLOOPLINE,RANK,complex_mass,LPASS)
266
436
            ENDIF
267
437
            RETURN
268
438
          END
 
439
 
 
440
          SUBROUTINE %(proc_prefix)sCLEAR_TIR_CACHE()
 
441
## if(TIRCaching){
 
442
            IMPLICIT NONE
 
443
 
 
444
                INTEGER NLOOPGROUPS
 
445
        PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
 
446
        INTEGER TIR_CACHE_SIZE
 
447
        include 'tir_cache_size.inc'
 
448
 
 
449
                INTEGER I,J
 
450
 
 
451
            LOGICAL TIR_DONE(NLOOPGROUPS,0:TIR_CACHE_SIZE)
 
452
            COMMON/%(proc_prefix)sTIRCACHING/TIR_DONE
 
453
        
 
454
                DO I=0,TIR_CACHE_SIZE
 
455
                  DO J=1,NLOOPGROUPS
 
456
            TIR_DONE(J,I)=.FALSE.
 
457
          ENDDO
 
458
                ENDDO
 
459
## } else {
 
460
C No TIR caching implemented, this is dummy. (The subroutine is kept as it might be called by the MC).
 
461
            CONTINUE
 
462
## }
 
463
          END SUBROUTINE
 
464
 
 
465
## if(TIRCaching){
 
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'
 
470
 
 
471
                INTEGER CTMODE
 
472
 
 
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
 
477
                ENDIF
 
478
 
 
479
C In principle if we wanted to cache other modes or rotations, we could do it here
 
480
            RETURN 
 
481
      END
 
482
## }