~maddevelopers/mg5amcnlo/dim6_eft

« back to all changes in this revision

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

  • Committer: olivier Mattelaer
  • Date: 2014-09-24 20:33:52 UTC
  • mfrom: (253.17.56 2.2.0)
  • Revision ID: olivier.mattelaer@uclouvain.be-20140924203352-bplvftjd8czlhagt
pass to 2.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
          SUBROUTINE %(proc_prefix)sGOLEMLOOP(NLOOPLINE,PL,M2L,RANK,RES,STABLE)
 
2
C  
 
3
%(info_lines)s
 
4
 
5
C Interface between MG5 and Golem95.
 
6
C The Golem95 version should be higher than 1.3.0.
 
7
C It supports RANK = NLOOPLINE + 1 tensor integrals when 1 < NLOOPLINE < 6.
 
8
C  
 
9
%(process_lines)s
 
10
C
 
11
C
 
12
C MODULES
 
13
C
 
14
          USE MATRICE_S
 
15
          USE FORM_FACTOR_TYPE, ONLY: FORM_FACTOR
 
16
          USE PRECISION_GOLEM, ONLY: KI
 
17
          USE TENS_COMB
 
18
          USE TENS_REC
 
19
          USE FORM_FACTOR_1P, ONLY: A10
 
20
          USE FORM_FACTOR_2P, ONLY: A20
 
21
          USE FORM_FACTOR_3P, ONLY: A30
 
22
          USE FORM_FACTOR_4P, ONLY: A40
 
23
          USE FORM_FACTOR_5P, ONLY: A50
 
24
          USE FORM_FACTOR_6P, ONLY: A60 
 
25
          IMPLICIT NONE
 
26
C  
 
27
C CONSTANTS 
 
28
C  
 
29
          INTEGER    NEXTERNAL
 
30
      PARAMETER (NEXTERNAL=%(nexternal)d)
 
31
      LOGICAL checkPConservation
 
32
      PARAMETER (checkPConservation=.TRUE.)
 
33
      %(real_dp_format)s NORMALIZATION
 
34
      PARAMETER (NORMALIZATION = 1.D0/(16.D0*3.14159265358979323846D0**2))
 
35
      REAL(KI),DIMENSION(0:3),PARAMETER::NULL_VEC = (/0.0_ki,0.0_ki,0.0_ki,0.0_ki/)
 
36
C     GOLEM_RUN_MODE = 1: Use directly MadLoop tensorial coefficients
 
37
C     GOLEM_RUN_MODE = 2: Reconstruct the tensorial coefficeints directly from 
 
38
C                         numerator using golem internal reconstruction routine
 
39
C     GOLEM_RUN_MODE = 3: Cross-checked reconstructed coefficients against
 
40
C                         MadLoop internal ones.
 
41
      INTEGER GOLEM_RUN_MODE
 
42
      PARAMETER (GOLEM_RUN_MODE=1)
 
43
C     The following is the acceptance threshold used for GOLEM_RUN_MODE = 3
 
44
      %(real_dp_format)s coef_check_thrs
 
45
      DATA coef_check_thrs/1.0d-13/
 
46
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
47
 
 
48
      LOGICAL PASS_COEF_CHECK     
 
49
C  
 
50
C ARGUMENTS 
 
51
C
 
52
      INTEGER NLOOPLINE, RANK
 
53
      %(real_dp_format)s PL(0:3,NLOOPLINE)
 
54
      %(real_dp_format)s PCT(0:3,0:NLOOPLINE-1)
 
55
      REAL(ki) PGOLEM(NLOOPLINE,0:3)
 
56
      %(mass_dp_format)s M2L(NLOOPLINE)
 
57
      COMPLEX(ki) M2LGOLEM(NLOOPLINE)
 
58
      %(complex_dp_format)s RES(3)
 
59
          LOGICAL STABLE          
 
60
C  
 
61
C LOCAL VARIABLES 
 
62
C
 
63
          INTEGER I, J, K
 
64
          TYPE(FORM_FACTOR)::RES_GOLEM
 
65
          
 
66
          COMPLEX(KI)::COEFFS0,COEFFS0_REC
 
67
          TYPE(COEFF_TYPE_1)::COEFFS1,COEFFS1_REC
 
68
          TYPE(COEFF_TYPE_2)::COEFFS2,COEFFS2_REC
 
69
          TYPE(COEFF_TYPE_3)::COEFFS3,COEFFS3_REC
 
70
          TYPE(COEFF_TYPE_4)::COEFFS4,COEFFS4_REC
 
71
          TYPE(COEFF_TYPE_5)::COEFFS5,COEFFS5_REC
 
72
          TYPE(COEFF_TYPE_6)::COEFFS6,COEFFS6_REC
 
73
 
 
74
C         The pinch propagator optimization is not used, so for now it is
 
75
C         always 0.
 
76
          INTEGER PINCH
 
77
C
 
78
C EXTERNAL FUNCTIONS
 
79
C
 
80
      COMPLEX(KI) %(proc_prefix)sGOLEM_LOOPNUM
 
81
      EXTERNAL %(proc_prefix)sGOLEM_LOOPNUM
 
82
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_0
 
83
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_1
 
84
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_2
 
85
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_3
 
86
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_4
 
87
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_5
 
88
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_6
 
89
C
 
90
C GLOBAL VARIABLES
 
91
C
 
92
      include 'coupl.inc'
 
93
          INTEGER CTMODE
 
94
          %(real_dp_format)s LSCALE
 
95
      common/%(proc_prefix)sCT/LSCALE,CTMODE
 
96
 
 
97
      INTEGER ID,SQSOINDEX,R
 
98
      COMMON/%(proc_prefix)sLOOP/ID,SQSOINDEX,R
 
99
 
 
100
      LOGICAL CTINIT, TIRINIT, GOLEMINIT
 
101
      COMMON/REDUCTIONCODEINIT/CTINIT, TIRINIT,GOLEMINIT
 
102
 
 
103
      INTEGER NLOOPGROUPS
 
104
      PARAMETER (NLOOPGROUPS=%(nloop_groups)d)
 
105
      INTEGER LOOPMAXCOEFS
 
106
      PARAMETER (LOOPMAXCOEFS=%(loop_max_coefs)d)
 
107
      INTEGER NSQUAREDSO
 
108
      PARAMETER (NSQUAREDSO=%(nSquaredSO)d)
 
109
 
 
110
      %(complex_dp_format)s LOOPCOEFS(0:LOOPMAXCOEFS-1,NSQUAREDSO,NLOOPGROUPS)
 
111
      COMMON/%(proc_prefix)sLCOEFS/LOOPCOEFS
 
112
C ----------
 
113
C BEGIN CODE
 
114
C ----------
 
115
 
 
116
C INITIALIZE CUTTOOLS IF NEEDED
 
117
      IF (GOLEMINIT) THEN
 
118
            GOLEMINIT=.FALSE.
 
119
            CALL %(proc_prefix)sINITGOLEM()
 
120
      ENDIF
 
121
 
 
122
C  No stability test intrisic to Golem95 now
 
123
      STABLE=.TRUE.
 
124
 
 
125
C  This initialization must be done for each reduction because we
 
126
C  have not setup anyoptimization using pinched propagators yet.
 
127
      CALL INITGOLEM95(NLOOPLINE)
 
128
      PINCH = 0
 
129
 
 
130
C YOU CAN FIND THE DETAILS ABOUT THE DIFFERENT CTMODE AT THE BEGINNING OF THE FILE CTS_CUTS.F90 IN THE CUTTOOLS DISTRIBUTION
 
131
 
 
132
C  CONVERT THE MASSES TO BE COMPLEX
 
133
      do I=1,NLOOPLINE
 
134
            M2LGOLEM(I)=M2L(I)
 
135
          ENDDO
 
136
 
 
137
C  CONVERT THE MOMENTA FLOWING IN THE LOOP LINES TO CT CONVENTIONS
 
138
      do I=0,3
 
139
        do J=0,(NLOOPLINE-1)
 
140
          PCT(I,J)=0.D0
 
141
        enddo
 
142
      enddo
 
143
      do I=0,3
 
144
        do J=1,NLOOPLINE
 
145
          PCT(I,0)=PCT(I,0)+PL(I,J)
 
146
        enddo
 
147
      enddo
 
148
      if (checkPConservation) then
 
149
        if (PCT(0,0).gt.1.d-6) then
 
150
          write(*,*) 'energy is not conserved ',PCT(0,0)
 
151
          stop 'energy is not conserved'
 
152
        elseif (PCT(1,0).gt.1.d-6) then
 
153
         write(*,*) 'px is not conserved ',PCT(1,0)
 
154
         stop 'px is not conserved'
 
155
        elseif (PCT(2,0).gt.1.d-6) then
 
156
         write(*,*) 'py is not conserved ',PCT(2,0)
 
157
         stop 'py is not conserved'
 
158
        elseif (PCT(3,0).gt.1.d-6) then
 
159
         write(*,*) 'pz is not conserved ',PCT(3,0)
 
160
         stop 'pz is not conserved'
 
161
        endif
 
162
      endif
 
163
      do I=0,3
 
164
        do J=1,(NLOOPLINE-1)
 
165
          do K=1,J
 
166
            PCT(I,J)=PCT(I,J)+PL(I,K)
 
167
          enddo
 
168
        enddo
 
169
      enddo
 
170
 
 
171
C     Now convert the loop momenta to Golem95 conventions
 
172
      DO i=0,3
 
173
         PGOLEM(1,i)=0.0e0_ki
 
174
         DO j=2,NLOOPLINE
 
175
            PGOLEM(j,i)=PCT(i,j-1)
 
176
         ENDDO
 
177
      ENDDO
 
178
 
 
179
C     Fill in the kinematic s-matrix while taking care of on-shell limits.
 
180
      CALL %(proc_prefix)sSETUP_KIN_MATRIX(NLOOPLINE,PGOLEM,M2LGOLEM)
 
181
C     Construct the golem internal matrices derived from the kinetic one.
 
182
      CALL PREPARESMATRIX()
 
183
 
 
184
C     Fill in the golem coefficents and compute the loop
 
185
      IF(GOLEM_RUN_MODE.EQ.2)THEN
 
186
        res_golem = evaluate_b(%(proc_prefix)sGOLEM_LOOPNUM,PGOLEM,0,RANK)
 
187
      ELSE
 
188
        PASS_COEF_CHECK=.TRUE.
 
189
        SELECT CASE(RANK)
 
190
        CASE(0)
 
191
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_0(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS0)
 
192
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
193
                COEFFS0_REC = %(proc_prefix)sGOLEM_LOOPNUM(NULL_VEC,0.0_ki)
 
194
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_0(COEFFS0,COEFFS0_REC)
 
195
            ENDIF
 
196
        CASE(1)
 
197
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_1(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS1)
 
198
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
199
                CALL RECONSTRUCT1(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS1_REC)
 
200
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_1(COEFFS1,COEFFS1_REC)
 
201
            ENDIF
 
202
        CASE(2)
 
203
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_2(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS2)
 
204
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
205
                CALL RECONSTRUCT2(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS2_REC)
 
206
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_2(COEFFS2,COEFFS2_REC)
 
207
            ENDIF
 
208
        CASE(3)
 
209
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_3(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS3)
 
210
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
211
                CALL RECONSTRUCT3(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS3_REC)
 
212
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_3(COEFFS3,COEFFS3_REC)
 
213
            ENDIF
 
214
        CASE(4)
 
215
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_4(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS4)
 
216
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
217
                CALL RECONSTRUCT4(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS4_REC)
 
218
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_4(COEFFS4,COEFFS4_REC)
 
219
            ENDIF
 
220
        CASE(5)
 
221
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_5(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS5)
 
222
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
223
                CALL RECONSTRUCT5(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS5_REC)
 
224
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_5(COEFFS5,COEFFS5_REC)
 
225
            ENDIF
 
226
        CASE(6)
 
227
            CALL %(proc_prefix)sFILL_GOLEM_COEFFS_6(LOOPCOEFS(0,SQSOINDEX,ID),COEFFS6)
 
228
            IF(GOLEM_RUN_MODE.EQ.3)THEN
 
229
                CALL RECONSTRUCT6(%(proc_prefix)sGOLEM_LOOPNUM,COEFFS6_REC)
 
230
                PASS_COEF_CHECK=%(proc_prefix)sCOMPARE_COEFS_6(COEFFS6,COEFFS6_REC)
 
231
            ENDIF
 
232
        CASE DEFAULT
 
233
            WRITE(*,*)"Not yet implemented in Golem95 for rank= ",RANK
 
234
            STOP
 
235
        END SELECT
 
236
        
 
237
        IF(.NOT.PASS_COEF_CHECK)THEN
 
238
            WRITE(*,*)'Coefs mismatch for ID ',ID,' and rank ',RANK
 
239
            WRITE(*,*)'Coefs form MadLoop5:'
 
240
            SELECT CASE(RANK)
 
241
            CASE(0)
 
242
                WRITE(*,*)'Constant coef = ',COEFFS0
 
243
            CASE(1)
 
244
                CALL PRINT_COEFFS(COEFFS1)
 
245
            CASE(2)
 
246
                CALL PRINT_COEFFS(COEFFS2)
 
247
            CASE(3)
 
248
                CALL PRINT_COEFFS(COEFFS3)
 
249
            CASE(4)
 
250
                CALL PRINT_COEFFS(COEFFS4)
 
251
            CASE(5)
 
252
                CALL PRINT_COEFFS(COEFFS5)
 
253
            CASE(6)
 
254
                CALL PRINT_COEFFS(COEFFS6)
 
255
            END SELECT
 
256
            WRITE(*,*)'Coefs reconstructed by Golem95:'
 
257
            SELECT CASE(RANK)
 
258
            CASE(0)
 
259
                WRITE(*,*)'Constant coef = ',COEFFS0_REC
 
260
            CASE(1)
 
261
                CALL PRINT_COEFFS(COEFFS1_REC)
 
262
            CASE(2)
 
263
                CALL PRINT_COEFFS(COEFFS2_REC)
 
264
            CASE(3)
 
265
                CALL PRINT_COEFFS(COEFFS3_REC)
 
266
            CASE(4)
 
267
                CALL PRINT_COEFFS(COEFFS4_REC)
 
268
            CASE(5)
 
269
                CALL PRINT_COEFFS(COEFFS5_REC)
 
270
            CASE(6)
 
271
                CALL PRINT_COEFFS(COEFFS6_REC)
 
272
            END SELECT
 
273
            STOP
 
274
      ENDIF
 
275
 
 
276
      SELECT CASE(NLOOPLINE)
 
277
      CASE(1)
 
278
         WRITE(*,*)'Golem95 cannot handle with tadpole yet'
 
279
         STOP
 
280
      CASE(2)
 
281
         SELECT CASE(RANK)
 
282
         CASE(0)
 
283
             RES_GOLEM = COEFFS0*A20(PINCH)
 
284
         CASE(1)
 
285
             RES_GOLEM = CONTRACT2_1(COEFFS1,PGOLEM,PINCH)
 
286
         CASE(2)
 
287
             RES_GOLEM = CONTRACT2_2(COEFFS2,PGOLEM,PINCH)
 
288
         CASE(3)
 
289
             RES_GOLEM = CONTRACT2_3(COEFFS3,PGOLEM,PINCH)
 
290
         CASE DEFAULT
 
291
             WRITE(*,*)"Golem95 cannot handle with: N,r = ",2,RANK
 
292
             STOP
 
293
         END SELECT
 
294
       CASE(3)
 
295
          SELECT CASE(RANK)
 
296
          CASE(0)
 
297
              RES_GOLEM = COEFFS0*A30(PINCH)
 
298
          CASE(1)
 
299
              RES_GOLEM = CONTRACT3_1(COEFFS1,PGOLEM,PINCH)
 
300
          CASE(2)
 
301
              RES_GOLEM = CONTRACT3_2(COEFFS2,PGOLEM,PINCH)
 
302
          CASE(3)
 
303
              RES_GOLEM = CONTRACT3_3(COEFFS3,PGOLEM,PINCH)
 
304
          CASE(4)
 
305
              RES_GOLEM = CONTRACT3_4(COEFFS4,PGOLEM,PINCH)
 
306
          CASE DEFAULT
 
307
              WRITE(*,*)"Golem95 cannot handle with: N,r = ",3,RANK
 
308
              STOP
 
309
          END SELECT
 
310
       CASE(4)
 
311
          SELECT CASE(RANK)
 
312
          CASE(0)
 
313
              RES_GOLEM = COEFFS0*A40(PINCH)
 
314
          CASE(1)
 
315
              RES_GOLEM = CONTRACT4_1(COEFFS1,PGOLEM,PINCH)
 
316
          CASE(2)
 
317
              RES_GOLEM = CONTRACT4_2(COEFFS2,PGOLEM,PINCH)
 
318
          CASE(3)
 
319
              RES_GOLEM = CONTRACT4_3(COEFFS3,PGOLEM,PINCH)
 
320
          CASE(4)
 
321
              RES_GOLEM = CONTRACT4_4(COEFFS4,PGOLEM,PINCH)
 
322
          CASE(5)
 
323
              RES_GOLEM = CONTRACT4_5(COEFFS5,PGOLEM,PINCH)
 
324
          CASE DEFAULT
 
325
              WRITE(*,*)"Golem95 cannot handle with: N,r = ",4,RANK
 
326
              STOP
 
327
          END SELECT
 
328
        CASE(5)
 
329
          SELECT CASE(RANK)
 
330
          CASE(0)
 
331
              RES_GOLEM = COEFFS0*A50(PINCH)
 
332
          CASE(1)
 
333
              RES_GOLEM = CONTRACT5_1(COEFFS1,PGOLEM,PINCH)
 
334
          CASE(2)
 
335
              RES_GOLEM = CONTRACT5_2(COEFFS2,PGOLEM,PINCH)
 
336
          CASE(3)
 
337
              RES_GOLEM = CONTRACT5_3(COEFFS3,PGOLEM,PINCH)
 
338
          CASE(4)
 
339
              RES_GOLEM = CONTRACT5_4(COEFFS4,PGOLEM,PINCH)
 
340
          CASE(5)
 
341
              RES_GOLEM = CONTRACT5_5(COEFFS5,PGOLEM,PINCH)
 
342
          CASE(6)
 
343
              RES_GOLEM = CONTRACT5_6(COEFFS6,PGOLEM,PINCH)
 
344
          CASE DEFAULT
 
345
              WRITE(*,*)"Golem95 cannot handle with: N,r = ",5,RANK
 
346
              STOP
 
347
          END SELECT
 
348
        CASE(6)
 
349
          SELECT CASE(RANK)
 
350
          CASE(0)
 
351
              RES_GOLEM = COEFFS0*A60(PINCH)
 
352
          CASE(1)
 
353
              RES_GOLEM = CONTRACT6_1(COEFFS1,PGOLEM,PINCH)
 
354
          CASE(2)
 
355
              RES_GOLEM = CONTRACT6_2(COEFFS2,PGOLEM,PINCH)
 
356
          CASE(3)
 
357
              RES_GOLEM = CONTRACT6_3(COEFFS3,PGOLEM,PINCH)
 
358
          CASE(4)
 
359
              RES_GOLEM = CONTRACT6_4(COEFFS4,PGOLEM,PINCH)
 
360
          CASE(5)
 
361
              RES_GOLEM = CONTRACT6_5(COEFFS5,PGOLEM,PINCH)
 
362
          CASE(6)
 
363
              RES_GOLEM = CONTRACT6_6(COEFFS6,PGOLEM,PINCH)
 
364
          CASE DEFAULT
 
365
              WRITE(*,*)"Golem95 cannot handle with: N,r = ",6,RANK
 
366
              STOP
 
367
          END SELECT
 
368
         CASE DEFAULT
 
369
           WRITE(*,*)"Golem95 cannot handle with: N = ",NLOOPLINE
 
370
           STOP
 
371
         END SELECT
 
372
      ENDIF
 
373
      
 
374
          %(finalize_GOLEM)s
 
375
C     WRITE(*,*) 'Loop ID',ID,' =',RES(1),RES(2),RES(3)
 
376
 
 
377
C     Finally free golem memory and cache
 
378
      CALL EXITGOLEM95()
 
379
 
 
380
      END
 
381
 
 
382
         FUNCTION %(proc_prefix)sGOLEM_LOOPNUM(Q,mu2)
 
383
         USE PRECISION_GOLEM, ONLY: KI
 
384
         REAL(KI),DIMENSION(0:3),INTENT(IN)::Q
 
385
         REAL(KI),INTENT(IN)::mu2
 
386
         COMPLEX(KI)::%(proc_prefix)sGOLEM_LOOPNUM
 
387
         
 
388
         %(complex_dp_format)s QQ(0:3),num
 
389
         INTEGER i
 
390
 
 
391
            DO i=0,3
 
392
                QQ(i)=CMPLX(Q(i),0.0d0,KIND=16)
 
393
            ENDDO
 
394
 
 
395
            CALL %(proc_prefix)sLOOPNUM(QQ,num)
 
396
            %(proc_prefix)sGOLEM_LOOPNUM=num
 
397
            RETURN
 
398
         END FUNCTION
 
399
 
 
400
          SUBROUTINE %(proc_prefix)sINITGOLEM()
 
401
 
402
C INITIALISATION OF GOLEM
 
403
C
 
404
C  
 
405
C MODULE
 
406
C
 
407
          USE PARAMETRE
 
408
C
 
409
C LOCAL VARIABLES 
 
410
C
 
411
          %(real_dp_format)s THRS
 
412
          LOGICAL EXT_NUM_FOR_R1
 
413
C  
 
414
C GLOBAL VARIABLES 
 
415
C
 
416
          include 'MadLoopParams.inc'
 
417
C ----------
 
418
C BEGIN CODE
 
419
C ----------
 
420
 
 
421
C DEFAULT PARAMETERS FOR GOLEM
 
422
C -------------------------------  
 
423
C One can chose here to have either just the rational R1 piece 
 
424
C or everything but the R2
 
425
       RAT_OR_TOT_PAR = TOT
 
426
 
 
427
          END
 
428
 
 
429
     SUBROUTINE %(proc_prefix)sSETUP_KIN_MATRIX(NLOOPLINE,PGOLEM,M2L)
 
430
C    
 
431
C    MODULE
 
432
C
 
433
     USE MATRICE_S
 
434
     USE PRECISION_GOLEM, ONLY: KI
 
435
C    
 
436
C    ARGUMENTS
 
437
C
 
438
     INTEGER NLOOPLINE
 
439
     REAL(KI) PGOLEM(NLOOPLINE,0:3)
 
440
     COMPLEX(KI) M2L(NLOOPLINE)
 
441
 
 
442
C    
 
443
C    GLOBAL VARIABLES
 
444
C
 
445
     include 'MadLoopParams.inc'
 
446
     INTEGER CTMODE
 
447
     %(real_dp_format)s LSCALE
 
448
     COMMON/%(proc_prefix)sCT/LSCALE,CTMODE
 
449
     %(real_dp_format)s REF_NORMALIZATION
 
450
C
 
451
C    LOCAL VARIABLES
 
452
C
 
453
     INTEGER I,J,K
 
454
     COMPLEX(KI) DIFFSQ
 
455
C     ----------
 
456
C     BEGIN CODE
 
457
C     ----------
 
458
 
 
459
     do i=1,NLOOPLINE
 
460
       do j=1,NLOOPLINE
 
461
          if(i.eq.j)then
 
462
            s_mat(i,j)=-(M2L(i)+M2L(j))
 
463
          else
 
464
            DIFFSQ = (CMPLX(PGOLEM(i,0),0.0_KI,kind=KI)-CMPLX(PGOLEM(j,0),0.0_KI,KIND=KI))**2
 
465
            do k=1,3
 
466
              DIFFSQ = DIFFSQ-(CMPLX(PGOLEM(i,k),0.0_KI,KIND=KI)-CMPLX(PGOLEM(j,k),0.0_KI,KIND=KI))**2
 
467
            enddo
 
468
            s_mat(i,j)=DIFFSQ-M2L(i)-M2L(j)
 
469
            IF(M2L(i).NE.0.0D0)THEN
 
470
              IF(ABS((DIFFSQ-M2L(i))/M2L(i)).LT.OSThres)THEN
 
471
                 s_mat(i,j)=-M2L(j)
 
472
              ENDIF
 
473
            ENDIF
 
474
            IF(M2L(j).NE.0.0D0)THEN
 
475
              IF(ABS((DIFFSQ-M2L(j))/M2L(j)).LT.OSThres)THEN
 
476
                 s_mat(i,j)=-M2L(i)
 
477
              ENDIF
 
478
            ENDIF
 
479
C           Chose what seems the most appropriate way to compare
 
480
C           massless onshellness. (here we pick the energy component)
 
481
            REF_NORMALIZATION=(PGOLEM(i,0)+PGOLEM(j,0))**2
 
482
            IF(REF_NORMALIZATION.NE.0.0D0)THEN
 
483
               IF(ABS(DIFFSQ/REF_NORMALIZATION).LT.OSThres)THEN
 
484
                  s_mat(i,j)=-(M2L(i)+M2L(j))
 
485
               ENDIF
 
486
            ENDIF
 
487
         ENDIF
 
488
        ENDDO
 
489
       ENDDO
 
490
       
 
491
      END
 
492
 
 
493
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_0(COEFS_A,COEFS_B)
 
494
 
 
495
      USE PRECISION_GOLEM, ONLY: KI
 
496
      COMPLEX(KI) COEFS_A,COEFS_B
 
497
      %(real_dp_format)s coef_check_thrs
 
498
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
499
      %(real_dp_format)s DENOM,NUM
 
500
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_0
 
501
 
 
502
      NUM = ABS(COEFS_A-COEFS_B)
 
503
      DENOM = ABS(COEFS_A+COEFS_B)
 
504
      IF(DENOM.GT.0d0)THEN
 
505
        %(proc_prefix)sCOMPARE_COEFS_0=((NUM/DENOM).LT.coef_check_thrs)
 
506
      ELSE
 
507
        %(proc_prefix)sCOMPARE_COEFS_0=(NUM.LT.coef_check_thrs)      
 
508
      ENDIF
 
509
 
 
510
      END
 
511
 
 
512
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_1(COEFS_A,COEFS_B)
 
513
      
 
514
      USE TENS_REC
 
515
      TYPE(COEFF_TYPE_1)COEFS_A,COEFS_B
 
516
      %(real_dp_format)s COEF_CHECK_THRS
 
517
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
518
      %(real_dp_format)s DENOM,NUM
 
519
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_1
 
520
      
 
521
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))
 
522
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))
 
523
      
 
524
      IF(DENOM.GT.0d0)THEN
 
525
        %(proc_prefix)sCOMPARE_COEFS_1=((NUM/DENOM).LT.coef_check_thrs)
 
526
      ELSE
 
527
        %(proc_prefix)sCOMPARE_COEFS_1=(NUM.LT.coef_check_thrs)
 
528
      ENDIF
 
529
 
 
530
      END
 
531
 
 
532
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_2(COEFS_A,COEFS_B)
 
533
      
 
534
      USE TENS_REC
 
535
      TYPE(COEFF_TYPE_2) COEFS_A,COEFS_B
 
536
      %(real_dp_format)s coef_check_thrs
 
537
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
538
      %(real_dp_format)s DENOM,NUM
 
539
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_2
 
540
      
 
541
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2-COEFS_B%%c2))
 
542
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2+COEFS_B%%c2))
 
543
      IF(DENOM.GT.0d0)THEN
 
544
        %(proc_prefix)sCOMPARE_COEFS_2=((NUM/DENOM).LT.coef_check_thrs)
 
545
      ELSE
 
546
        %(proc_prefix)sCOMPARE_COEFS_2=(NUM.LT.coef_check_thrs)
 
547
      ENDIF
 
548
 
 
549
      END
 
550
 
 
551
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_3(COEFS_A,COEFS_B)
 
552
 
 
553
      USE TENS_REC
 
554
      TYPE(COEFF_TYPE_3) COEFS_A, COEFS_B
 
555
      %(real_dp_format)s coef_check_thrs
 
556
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
557
      %(real_dp_format)s DENOM,NUM
 
558
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_3
 
559
 
 
560
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2-COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3-COEFS_B%%c3))
 
561
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2+COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3+COEFS_B%%c3))
 
562
      IF(DENOM.GT.0d0)THEN
 
563
        %(proc_prefix)sCOMPARE_COEFS_3=((NUM/DENOM).LT.coef_check_thrs)
 
564
      ELSE
 
565
        %(proc_prefix)sCOMPARE_COEFS_3=(NUM.LT.coef_check_thrs)
 
566
      ENDIF
 
567
 
 
568
      END            
 
569
 
 
570
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_4(COEFS_A,COEFS_B)
 
571
      
 
572
      USE TENS_REC
 
573
      TYPE(COEFF_TYPE_4) COEFS_A, COEFS_B
 
574
      %(real_dp_format)s coef_check_thrs
 
575
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
576
      %(real_dp_format)s DENOM,NUM
 
577
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_4
 
578
 
 
579
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2-COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3-COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4-COEFS_B%%c4))
 
580
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2+COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3+COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4+COEFS_B%%c4))
 
581
      IF(DENOM.GT.0d0)THEN
 
582
        %(proc_prefix)sCOMPARE_COEFS_4=((NUM/DENOM).LT.coef_check_thrs)
 
583
      ELSE
 
584
        %(proc_prefix)sCOMPARE_COEFS_4=(NUM.LT.coef_check_thrs)
 
585
      ENDIF
 
586
 
 
587
      END
 
588
 
 
589
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_5(COEFS_A,COEFS_B)
 
590
      
 
591
      USE TENS_REC
 
592
      TYPE(COEFF_TYPE_5) COEFS_A,COEFS_B
 
593
      %(real_dp_format)s coef_check_thrs
 
594
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
595
      %(real_dp_format)s DENOM,NUM
 
596
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_5
 
597
 
 
598
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2-COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3-COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4-COEFS_B%%c4))
 
599
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2+COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3+COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4+COEFS_B%%c4))
 
600
      IF(DENOM.GT.0d0)THEN
 
601
        %(proc_prefix)sCOMPARE_COEFS_5=((NUM/DENOM).LT.coef_check_thrs)
 
602
      ELSE
 
603
        %(proc_prefix)sCOMPARE_COEFS_5=(NUM.LT.coef_check_thrs)
 
604
      ENDIF
 
605
 
 
606
      END
 
607
 
 
608
      FUNCTION %(proc_prefix)sCOMPARE_COEFS_6(COEFS_A,COEFS_B)
 
609
      
 
610
      USE TENS_REC
 
611
      TYPE(COEFF_TYPE_6) COEFS_A,COEFS_B
 
612
      %(real_dp_format)s coef_check_thrs
 
613
      COMMON/%(proc_prefix)scoef_check_thrs/coef_check_thrs
 
614
      %(real_dp_format)s DENOM,NUM
 
615
      LOGICAL %(proc_prefix)sCOMPARE_COEFS_6
 
616
 
 
617
      NUM = ABS(COEFS_A%%c0-COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1-COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2-COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3-COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4-COEFS_B%%c4))
 
618
      DENOM = ABS(COEFS_A%%c0+COEFS_B%%c0)+SUM(ABS(COEFS_A%%c1+COEFS_B%%c1))+SUM(ABS(COEFS_A%%c2+COEFS_B%%c2))+SUM(ABS(COEFS_A%%c3+COEFS_B%%c3))+SUM(ABS(COEFS_A%%c4+COEFS_B%%c4))
 
619
      IF(DENOM.GT.0d0)THEN
 
620
        %(proc_prefix)sCOMPARE_COEFS_6=((NUM/DENOM).LT.coef_check_thrs)
 
621
      ELSE
 
622
        %(proc_prefix)sCOMPARE_COEFS_6=(NUM.LT.coef_check_thrs)
 
623
      ENDIF
 
624
 
 
625
      END
 
 
b'\\ No newline at end of file'