~maddevelopers/mg5amcnlo/2.9.4

« back to all changes in this revision

Viewing changes to vendor/CutTools/src/qcdloop/ffxe0.f

pass to v2.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
*       $Id: ffxe0.f,v 1.4 1996/01/10 15:36:51 gj Exp $
 
2
*###[ ffxe0:
 
3
        subroutine ffxe0(ce0,cd0i,xpi,ier)
 
4
***#[*comment:***********************************************************
 
5
*                                                                       *
 
6
*       calculate                                                       *
 
7
*                                                                       *
 
8
*             1  /   /                                               \-1*
 
9
*       e0= -----\dq |(q^2-m_1^2)((q+p_1)^2-m_2^2)...((q-p_5)^2-m_5^2|  *
 
10
*           ipi^2/   \                                               /  *
 
11
*                                                                       *
 
12
*       following the five four-point-function method in ....           *
 
13
*       As an extra the five fourpoint function Di are also returned    *
 
14
*       if ( ldot ) the dotproducts are left behind in fpij5(15,15) in  *
 
15
*       /ffdot/ and the external determinants fdel4 and fdl3i(5) in     *
 
16
*       /ffdel/.                                                        *
 
17
*                                                                       *
 
18
*       Input:  xpi = m_i^2        (real)  i=1,5                        *
 
19
*               xpi = p_i.p_i      (real)  i=6,10 (note: B&D metric)    *
 
20
*               xpi = (p_i+p_{i+1})^2 (r)  i=11,15                      *
 
21
*               xpi = (p_i+p_{i+2})^2 (r)  i=16,20 OR 0                 *
 
22
*                                                                       *
 
23
*       Output: ce0               (complex)                             *
 
24
*               cd0i(5)           (complex) D0 with s_i missing         *
 
25
*               ier               (integr) 0=ok 1=inaccurate 2=error    *
 
26
*                                                                       *
 
27
***#]*comment:***********************************************************
 
28
*  #[ declarations:
 
29
        implicit none
 
30
*
 
31
*       arguments
 
32
*
 
33
        DOUBLE PRECISION xpi(20)
 
34
        DOUBLE COMPLEX ce0,cd0i(5)
 
35
        integer ier
 
36
*
 
37
*       local variables
 
38
*
 
39
        integer i,j,NMIN,NMAX,ier0,i6,i7,i8,i9
 
40
        parameter(NMIN=15,NMAX=20)
 
41
        DOUBLE PRECISION dpipj(NMIN,NMAX),xmax
 
42
        logical lp5(NMAX-NMIN)
 
43
*
 
44
*       common blocks:
 
45
*
 
46
        include 'ff.h'
 
47
*  #] declarations:
 
48
*  #[ get differences:
 
49
*
 
50
*       simulate the differences in the masses etc..
 
51
*
 
52
        if ( lwrite ) print *,'ffxe0: input xpi: ',xpi
 
53
*
 
54
*       first p16-p20
 
55
*
 
56
        do 5 i=1,5
 
57
            if ( xpi(i+15) .eq. 0 ) then
 
58
                i6 = i+5
 
59
                i7 = i6+1
 
60
                if ( i7 .ge. 11 ) i7 = 6
 
61
                i8 = i7+1
 
62
                if ( i8 .ge. 11 ) i8 = 6
 
63
                i9 = i8+1
 
64
                if ( i9 .ge. 11 ) i9 = 6
 
65
                xpi(i+15) = xpi(i6)+xpi(i7)+xpi(i8)-xpi(i6+5)-xpi(i7+5)+
 
66
     +                  xpi(i9+5)
 
67
                xmax = max(abs(xpi(i6)),abs(xpi(i7)),abs(xpi(i8)),abs(
 
68
     +                  xpi(i6+5)),abs(xpi(i7+5)),abs(xpi(i9+5)))
 
69
                if ( abs(xpi(i+15)) .lt. xloss*xmax )
 
70
     +                  call ffwarn(168,ier,xpi(i+15),xmax)
 
71
                lp5(i) = .TRUE.
 
72
            else
 
73
                lp5(i) = .FALSE.
 
74
            endif
 
75
    5   continue
 
76
*
 
77
*       next the differences
 
78
*
 
79
        ier0 = 0
 
80
        if ( lwarn ) then
 
81
            do 20 i=1,NMAX
 
82
                if ( i .le. NMIN ) dpipj(i,i) = 0
 
83
                do 10 j=1,min(i-1,NMIN)
 
84
                    dpipj(j,i) = xpi(j) - xpi(i)
 
85
                    if ( i .le. NMIN ) then
 
86
                        dpipj(i,j) = -dpipj(j,i)
 
87
                    endif
 
88
*                   we do not need the differences of the u-like variables accurately
 
89
                    if ( i.gt.10 .and. j.gt.10 ) goto 10
 
90
                    if ( abs(dpipj(j,i)) .lt. xloss*abs(xpi(i))
 
91
     +                  .and. xpi(i) .ne. xpi(j) ) then
 
92
                        call ffwarn(158,ier0,dpipj(j,i),xpi(i))
 
93
                        if ( lwrite ) print *,'between xpi(',i,
 
94
     +                          ') and xpi(',j,')'
 
95
                    endif
 
96
   10           continue
 
97
   20       continue
 
98
        else
 
99
            do 40 i=1,NMAX
 
100
                do 30 j=1,NMIN
 
101
                    dpipj(j,i) = xpi(j) - xpi(i)
 
102
   30           continue
 
103
   40       continue
 
104
        endif
 
105
*  #] get differences:
 
106
*  #[ call ffxe0a:
 
107
        call ffxe0a(ce0,cd0i,xpi,dpipj,ier)
 
108
*  #] call ffxe0a:
 
109
*  #[ clean up:
 
110
        do 90 i=1,5
 
111
            if ( lp5(i) ) then
 
112
                 xpi(i+NMIN) = 0
 
113
            endif
 
114
   90   continue
 
115
*  #] clean up:
 
116
*###] ffxe0:
 
117
        end
 
118
*###[ ffxe0a:
 
119
        subroutine ffxe0a(ce0,cd0i,xpi,dpipj,ier)
 
120
***#[*comment:***********************************************************
 
121
*                                                                       *
 
122
*       calculate                                                       *
 
123
*                                                                       *
 
124
*             1  /   /                                               \-1*
 
125
*       e0= -----\dq |(q^2-m_1^2)((q+p_1)^2-m_2^2)...((q-p_5)^2-m_5^2|  *
 
126
*           ipi^2/   \                                               /  *
 
127
*                                                                       *
 
128
*       following the five four-point-function method in ....           *
 
129
*       As an extra the five fourpoint function Di are also returned    *
 
130
*       if ( ldot ) the dotproducts are left behind in fpij5(15,15) in  *
 
131
*       /ffdot/ and the external determinants fdel4 and fdl3i(5) in     *
 
132
*       /ffdel/.                                                        *
 
133
*                                                                       *
 
134
*       Input:  xpi = m_i^2        (real)  i=1,5                        *
 
135
*               xpi = p_i.p_i      (real)  i=6,10 (note: B&D metric)    *
 
136
*               xpi = (p_i+p_{i+1})^2 (r)  i=11,15                      *
 
137
*               xpi = (p_i+p_{i+2})^2 (r)  i=16,20                      *
 
138
*               dpipj(15,20)       (real)  = pi(i) - pi(j)              *
 
139
*                                                                       *
 
140
*       Output: ce0               (complex)                             *
 
141
*               cd0i(5)           (complex) D0 with s_i missing         *
 
142
*               ier               (integer) <50:lost # digits 100=error *
 
143
*                                                                       *
 
144
***#]*comment:***********************************************************
 
145
*  #[ declarations:
 
146
        implicit none
 
147
*
 
148
*       arguments
 
149
*
 
150
        integer ier
 
151
        DOUBLE COMPLEX ce0,cd0i(5)
 
152
        DOUBLE PRECISION xpi(20),dpipj(15,20)
 
153
*
 
154
*       local variables
 
155
*
 
156
        integer i,j,ii(10),ii4(6),ieri(5),ier0,imin,itype,ndiv,idone,
 
157
     +          ier1
 
158
        logical lwsav,ldel2s
 
159
        DOUBLE COMPLEX c,cfac,cs,csum
 
160
        DOUBLE PRECISION dl5s,dl4p,xpi4(13),dpipj4(10,13),piDpj4(10,10),
 
161
     +          absc,xmax,piDpj(15,15),xqi4(13),dqiqj4(10,13),
 
162
     +          qiDqj4(10,10),del2s,xmx5(5),dl4ri(5)
 
163
        save ii4
 
164
*
 
165
*       common blocks:
 
166
*
 
167
        include 'ff.h'
 
168
*
 
169
*       statement function
 
170
*
 
171
        absc(c) = abs(DBLE(c)) + abs(DIMAG(c))
 
172
*
 
173
*       data
 
174
*
 
175
        data ii4 /5,6,7,8,9,10/
 
176
*
 
177
*  #] declarations:
 
178
*  #[ initialisations:
 
179
        ndiv = 0
 
180
        idsub = 0
 
181
        ce0 = 0
 
182
        do 1 i=1,5
 
183
            cd0i(i) = 0
 
184
    1   continue
 
185
*  #] initialisations:
 
186
*  #[ calculations:
 
187
*
 
188
        idsub = idsub + 1
 
189
        call ffdot5(piDpj,xpi,dpipj,ier)
 
190
        if ( ldot ) then
 
191
            do 6 i=1,15
 
192
                do 5 j=1,15
 
193
                    fpij5(j,i) = piDpj(j,i)
 
194
    5           continue
 
195
    6       continue
 
196
            do 10 i=1,10
 
197
                ii(i) = i+5
 
198
   10       continue
 
199
            idsub = idsub + 1
 
200
            ier0 = 0
 
201
            call ffdl4p(dl4p,xpi,piDpj,15,ii,ier0)
 
202
*           if ( dl4p .lt. 0 ) then
 
203
*               call fferr(57,ier)
 
204
*           endif
 
205
            fdel4 = dl4p
 
206
        endif
 
207
        idsub = idsub + 1
 
208
        call ffdel5(dl5s,xpi,piDpj,15,ier)
 
209
        if ( lwrite ) then
 
210
            print *,'ffxe0: dl5s = ',dl5s
 
211
        endif
 
212
*
 
213
        do 40 i=1,5
 
214
            ieri(i) = ier
 
215
   40   continue
 
216
*
 
217
        do 100 i=1,5
 
218
            if ( lwrite ) print *,'ffxe0a: fourpoint function nr ',i
 
219
*
 
220
*           get the coefficient determinant
 
221
*
 
222
            idsub = idsub + 1
 
223
            call ffdl4r(dl4ri(i),xpi,piDpj,15,i,ieri(i))
 
224
*
 
225
*           get four-point momenta
 
226
*
 
227
            call ffpi54(xpi4,dpipj4,piDpj4,xpi,dpipj,piDpj,i,ieri(i))
 
228
*
 
229
*           first try IR divergent function to avoid error messages from ffrot4
 
230
*
 
231
            ier1 = ieri(i)
 
232
            call ffxdir(cs,cfac,idone,xpi4,dpipj4,6,ndiv,ier1)
 
233
            if ( idone .gt. 0 ) then
 
234
*               done
 
235
                xmax = abs(cs)*10d0**(-mod((ier1-ieri(i)),50))
 
236
            else
 
237
*
 
238
*               rotate to calculable posistion
 
239
*
 
240
                call ffrot4(irota4,del2s,xqi4,dqiqj4,qiDqj4,xpi4,dpipj4,
 
241
     +                  piDpj4,5,itype,ieri(i))
 
242
                if ( itype .lt. 0 ) then
 
243
                    print *,'ffxe0:  error:  Cannot handle this ',
 
244
     +                  ' 4point masscombination yet:'
 
245
                    print *,(xpi(j),j=1,20)
 
246
                    return
 
247
                endif
 
248
                if ( itype .eq. 1 ) then
 
249
                    ldel2s = .TRUE.
 
250
                    isgnal = +1
 
251
                    print *,'ffxe0a: Cannot handle del2s = 0 yet'
 
252
                    stop
 
253
                else
 
254
                    ldel2s = .FALSE.
 
255
                endif
 
256
                if ( itype .eq. 2 ) then
 
257
                    print *,'ffxe0a: no doubly IR divergent yet'
 
258
                    stop
 
259
                endif
 
260
*
 
261
*               get fourpoint function
 
262
*
 
263
                ier0 = ieri(i)
 
264
                lwsav = lwrite
 
265
                lwrite = .FALSE.
 
266
                call ffxd0e(cs,cfac,xmax, .FALSE.,ndiv,xqi4,dqiqj4,
 
267
     +                  qiDqj4,del2s,ldel2s,ieri(i))
 
268
                if ( ieri(i).gt.10 ) then
 
269
                    if ( ltest ) then
 
270
                        print *,'ffxe0: id = ',id,', nevent = ',nevent
 
271
                        print *,'ffxe0: lost ',ieri(i),
 
272
     +                          ' digits in D0 with isgnal ',isgnal,
 
273
     +                          ', trying other roots, isgnal ',-isgnal
 
274
                    endif
 
275
                    isgnal = -isgnal
 
276
                    ieri(i) = ier0
 
277
                    call ffxd0e(cs,cfac,xmax, .TRUE.,ndiv,xqi4,dqiqj4,
 
278
     +                  qiDqj4,del2s,ldel2s,ieri(i))
 
279
                    isgnal = -isgnal
 
280
                endif
 
281
                lwrite = lwsav
 
282
            endif
 
283
*
 
284
*           Finally ...
 
285
*
 
286
            cd0i(i) = cs*cfac
 
287
            xmx5(i) = xmax*absc(cfac)
 
288
            if ( ldot ) then
 
289
                call ffdl3p(fdl3i(i),piDpj4,10,ii4,ii4,ieri(i))
 
290
*               let's hope tha tthese have been set by ffxd0e...
 
291
                fdl4si(i) = fdel4s
 
292
                if ( ltest ) then
 
293
                    ier0 = 0
 
294
                    call ffdel4(fdel4s,xpi4,piDpj4,10,ier0)
 
295
                    if ( xloss*10d0**(-ier0-1)*abs(fdl4si(i)-fdel4s)
 
296
     +                          .gt. precx*abs(fdel4s) ) then
 
297
                        print *,'ffxe0a: error: Del4s was not correct',
 
298
     +                          fdl4si(i),fdel4s,fdl4si(i)-fdel4s,ier0
 
299
                    endif
 
300
                endif
 
301
                if ( lwrite ) print *,'ffxe0: fdel4s = ',fdel4s
 
302
            endif
 
303
  100   continue
 
304
*
 
305
*  #] calculations:
 
306
*  #[ add all up:
 
307
*
 
308
        csum = 0
 
309
        xmax = 0
 
310
        imin = 1
 
311
        do 200 i=1,5
 
312
            imin = -imin
 
313
            csum = csum + imin*DBLE(dl4ri(i))*cd0i(i)
 
314
            if ( ieri(i) .gt. 50 ) then
 
315
                ieri(i) = mod(ieri(i),50)
 
316
            endif
 
317
            xmax = max(xmax,dl4ri(i)*xmx5(i)*DBLE(10)**mod(ieri(i),50))
 
318
  200   continue
 
319
*
 
320
*       Check for cancellations in the final adding up
 
321
*
 
322
        if ( lwarn .and. 2*absc(csum) .lt. xloss*xmax )
 
323
     +          call ffwarn(161,ier,absc(csum),xmax)
 
324
*
 
325
*       Check for a sum close to the minimum of the range (underflow
 
326
*       problems)
 
327
*
 
328
        if ( lwarn .and. absc(csum).lt.xalogm/precc .and. csum.ne.0 )
 
329
     +          call ffwarn(162,ier,absc(csum),xalogm/precc)
 
330
*
 
331
*       If the imaginary part is very small it most likely is zero
 
332
*       (can be removed, just esthetically more pleasing)
 
333
*
 
334
        if ( abs(DIMAG(csum)) .lt. precc*abs(DBLE(csum)) )
 
335
     +          csum = DCMPLX(DBLE(csum))
 
336
*
 
337
*       Finally ...
 
338
*
 
339
        ce0 = csum*(1/DBLE(2*dl5s))
 
340
*
 
341
        if ( lwrite ) then
 
342
            do i=1,5
 
343
                print '(a,5e16.8,i6)','cs,del4r,D0 = ',
 
344
     +                  DBLE(dl4ri(i))*cd0i(i)*(1/DBLE(2*dl5s)),
 
345
     +                  dl4ri(i)/DBLE(2*dl5s),cd0i(i),ieri(i)
 
346
            enddo
 
347
            print '(a,2e24.16,i6)','ffxe0a: ce0 = ',ce0,ier
 
348
        endif
 
349
*  #] add all up:
 
350
*###] ffxe0a:
 
351
        end
 
352
*###[ ffxe00:
 
353
        subroutine ffxe00(ce0,cd0i,dl4ri,xpi,piDpj,ier)
 
354
***#[*comment:***********************************************************
 
355
*                                                                       *
 
356
*       calculate                                                       *
 
357
*                                                                       *
 
358
*             1  /   /                                               \-1*
 
359
*       e0= -----\dq |(q^2-m_1^2)((q+p_1)^2-m_2^2)...((q-p_5)^2-m_5^2|  *
 
360
*           ipi^2/   \                                               /  *
 
361
*                                                                       *
 
362
*       following the five four-point-function method in ....           *
 
363
*       The four five fourpoint function Di are input in this version.  *
 
364
*                                                                       *
 
365
*       Input:  cd0i(5)         (complex)       D0 with s_i missing     *
 
366
*               dl4ri(5)                (real)          coeff of D0             *
 
367
*               xpi = m_i^2     (real)  i=1,5                           *
 
368
*               xpi = p_i.p_i   (real)  i=6,10 (note: B&D metric)       *
 
369
*               xpi = (p_i+p_{i+1})^2 (r)  i=11,15                      *
 
370
*               xpi = (p_i+p_{i+2})^2 (r)  i=16,20                      *
 
371
*               piDpj(15,15)       (real)  pi.pj                        *
 
372
*                                                                       *
 
373
*       Output: ce0               (complex)                             *
 
374
*               ier               (integer) <50:lost # digits 100=error *
 
375
*                                                                       *
 
376
***#]*comment:***********************************************************
 
377
*  #[ declarations:
 
378
        implicit none
 
379
*
 
380
*       arguments
 
381
*
 
382
        integer ier
 
383
        DOUBLE COMPLEX ce0,cd0i(5)
 
384
        DOUBLE PRECISION dl4ri(5),xpi(20),piDpj(15,15)
 
385
*
 
386
*       local variables
 
387
*
 
388
        integer i,ii(10),imin,ier0
 
389
        DOUBLE COMPLEX c,csum
 
390
        DOUBLE PRECISION dl5s,dl4p,absc,xmax
 
391
*
 
392
*       common blocks:
 
393
*
 
394
        include 'ff.h'
 
395
*
 
396
*       statement function
 
397
*
 
398
        absc(c) = abs(DBLE(c)) + abs(DIMAG(c))
 
399
*  #] declarations:
 
400
*  #[ initialisations:
 
401
*
 
402
        idsub = idsub + 1
 
403
        ce0 = 0
 
404
        if ( lwrite ) then
 
405
            print *,'ffxe00: input:'
 
406
            print *,'  cd0i = ',cd0i
 
407
            print *,'  dl4ri = ',dl4ri
 
408
            print *,'  xpi  = ',xpi
 
409
        endif
 
410
*
 
411
*  #] initialisations:
 
412
*  #[ calculations:
 
413
*
 
414
        if ( ldot ) then
 
415
            do 10 i=1,10
 
416
                ii(i) = i+5
 
417
   10       continue
 
418
            idsub = idsub + 1
 
419
            ier0 = 0
 
420
            call ffdl4p(dl4p,xpi,piDpj,15,ii,ier0)
 
421
            fdel4 = dl4p
 
422
        endif
 
423
        idsub = idsub + 1
 
424
        call ffdel5(dl5s,xpi,piDpj,15,ier)
 
425
        if ( lwrite ) then
 
426
            print *,'ffxe00: dl5s = ',dl5s
 
427
        endif
 
428
*
 
429
*  #] calculations:
 
430
*  #[ add all up:
 
431
*
 
432
        csum = 0
 
433
        xmax = 0
 
434
        imin = 1
 
435
        do 200 i=1,5
 
436
            imin = -imin
 
437
            csum = csum + imin*DBLE(dl4ri(i))*cd0i(i)
 
438
            xmax = max(xmax,abs(dl4ri(i))*absc(cd0i(i)))
 
439
  200   continue
 
440
*
 
441
*       Check for cancellations in the final adding up
 
442
*
 
443
        if ( lwarn .and. 2*absc(csum) .lt. xloss*xmax )
 
444
     +          call ffwarn(161,ier,absc(csum),xmax)
 
445
*
 
446
*       Check for a sum close to the minimum of the range (underflow
 
447
*       problems)
 
448
*
 
449
        if ( lwarn .and. absc(csum).lt.xalogm/precc .and. csum.ne.0 )
 
450
     +          call ffwarn(162,ier,absc(csum),xalogm/precc)
 
451
*
 
452
*       If the imaginary part is very small it most likely is zero
 
453
*       (can be removed, just esthetically more pleasing)
 
454
*
 
455
        if ( abs(DIMAG(csum)) .lt. precc*abs(DBLE(csum)) )
 
456
     +          csum = DCMPLX(DBLE(csum))
 
457
*
 
458
*       Finally ...
 
459
*
 
460
        ce0 = csum*(1/DBLE(2*dl5s))
 
461
*
 
462
*  #] add all up:
 
463
*###] ffxe00:
 
464
        end
 
465
*###[ ffdot5:
 
466
        subroutine ffdot5(piDpj,xpi,dpipj,ier)
 
467
***#[*comment:***********************************************************
 
468
*                                                                       *
 
469
*       calculate the dotproducts pi.pj with                            *
 
470
*                                                                       *
 
471
*               xpi(i) = s_i            i=1,5                           *
 
472
*               xpi(i) = p_i            i=6,10                          *
 
473
*               xpi(i) = p_i+p_{i+1}    i=11,15                         *
 
474
*                                                                       *
 
475
***#]*comment:***********************************************************
 
476
*  #[ declarations:
 
477
        implicit none
 
478
*
 
479
*       arguments
 
480
*
 
481
        integer ier
 
482
        DOUBLE PRECISION xpi(20),dpipj(15,20),piDpj(15,15)
 
483
*
 
484
*       local variables
 
485
*
 
486
        integer is1,is2,is3,is4,ip6,ip7,ip8,ip11,ip12,ip14,i,j,
 
487
     +          igehad(15,15),itel,i1,i2,i3,i4,i5,i6,ierin,ier0
 
488
*       werkt niet bij Absoft
 
489
*       parameter (locwrt=.TRUE.)
 
490
        logical locwrt
 
491
        DOUBLE PRECISION xheck,xmax
 
492
*
 
493
*       common blocks
 
494
*
 
495
        include 'ff.h'
 
496
*
 
497
*       data
 
498
*
 
499
        data locwrt /.FALSE./
 
500
*  #] declarations:
 
501
*  #[ check input:
 
502
        if ( ltest ) call ffxhck(xpi,dpipj,15,ier)
 
503
        if ( locwrt ) then
 
504
            do 2 i=1,15
 
505
                do 1 j=1,15
 
506
                    igehad(j,i) = 0
 
507
    1           continue
 
508
    2       continue
 
509
        endif
 
510
*  #] check input:
 
511
*  #[ indices:
 
512
        ierin = ier
 
513
        do 10 is1=1,5
 
514
            is2 = is1 + 1
 
515
            if ( is2 .eq. 6 ) is2 = 1
 
516
            is3 = is2 + 1
 
517
            if ( is3 .eq. 6 ) is3 = 1
 
518
            ip6 = is1 + 5
 
519
            ip7 = is2 + 5
 
520
            ip11 = ip6 + 5
 
521
*
 
522
*           we have now defined a 3point function
 
523
*
 
524
*                 | -p11
 
525
*                 |
 
526
*                / \
 
527
*             s1/   \s3
 
528
*           ___/_____\___
 
529
*           p6   s2    p7
 
530
*
 
531
*  #] indices:
 
532
*  #[ all in one vertex:
 
533
*
 
534
*           pi.pi, si.si
 
535
*
 
536
            piDpj(is1,is1) = xpi(is1)
 
537
            piDpj(ip6,ip6) = xpi(ip6)
 
538
            piDpj(ip11,ip11) = xpi(ip11)
 
539
            if ( locwrt ) then
 
540
                igehad(is1,is1) = igehad(is1,is1) + 1
 
541
                igehad(ip6,ip6) = igehad(ip6,ip6) + 1
 
542
                igehad(ip11,ip11) = igehad(ip11,ip11) + 1
 
543
            endif
 
544
*
 
545
*           si.s(i+1)
 
546
*
 
547
            if ( xpi(is2) .le. xpi(is1) ) then
 
548
                piDpj(is1,is2) = (dpipj(is1,ip6) + xpi(is2))/2
 
549
            else
 
550
                piDpj(is1,is2) = (dpipj(is2,ip6) + xpi(is1))/2
 
551
            endif
 
552
            piDpj(is2,is1) = piDpj(is1,is2)
 
553
            if ( locwrt ) then
 
554
                igehad(is1,is2) = igehad(is1,is2) + 1
 
555
                igehad(is2,is1) = igehad(is2,is1) + 1
 
556
            endif
 
557
            if ( lwarn .and. abs(piDpj(is1,is2)) .lt.
 
558
     +                  xloss*min(xpi(is1),xpi(is2)) ) then
 
559
                ier0 = ierin
 
560
                call ffwarn(105,ier0,piDpj(is1,is2),min(xpi(is1),
 
561
     +                  xpi(is2)))
 
562
                ier = max(ier,ier0)
 
563
            endif
 
564
*
 
565
*           si.s(i+2)
 
566
*
 
567
            if ( xpi(is1) .le. xpi(is3) ) then
 
568
                piDpj(is3,is1) = (dpipj(is3,ip11) + xpi(is1))/2
 
569
            else
 
570
                piDpj(is3,is1) = (dpipj(is1,ip11) + xpi(is3))/2
 
571
            endif
 
572
            piDpj(is1,is3) = piDpj(is3,is1)
 
573
            if ( locwrt ) then
 
574
                igehad(is1,is3) = igehad(is1,is3) + 1
 
575
                igehad(is3,is1) = igehad(is3,is1) + 1
 
576
            endif
 
577
            if ( lwarn .and. abs(piDpj(is1,is3)) .lt.
 
578
     +          xloss*min(xpi(is1),xpi(is3)) ) then
 
579
                ier0 = ierin
 
580
                call ffwarn(106,ier0,
 
581
     +          piDpj(is1,is3),min(xpi(is1),xpi(is3)))
 
582
                ier = max(ier,ier0)
 
583
            endif
 
584
*
 
585
*           pi.si
 
586
*
 
587
            if ( abs(xpi(ip6)) .le. xpi(is1) ) then
 
588
                piDpj(ip6,is1) = (dpipj(is2,is1) - xpi(ip6))/2
 
589
            else
 
590
                piDpj(ip6,is1) = (dpipj(is2,ip6) - xpi(is1))/2
 
591
            endif
 
592
            piDpj(is1,ip6) = piDpj(ip6,is1)
 
593
            if ( locwrt ) then
 
594
                igehad(is1,ip6) = igehad(is1,ip6) + 1
 
595
                igehad(ip6,is1) = igehad(ip6,is1) + 1
 
596
            endif
 
597
            if ( lwarn .and. abs(piDpj(ip6,is1)) .lt.
 
598
     +          xloss*min(abs(xpi(ip6)),xpi(is1))) then
 
599
                ier0 = ierin
 
600
                call ffwarn(107,ier0,
 
601
     +          piDpj(ip6,is1),min( abs(xpi(ip6)),xpi(is1)))
 
602
                ier = max(ier,ier0)
 
603
            endif
 
604
*
 
605
*           pi.s(i+1)
 
606
*
 
607
            if ( abs(xpi(ip6)) .le. xpi(is2) ) then
 
608
                piDpj(ip6,is2) = (dpipj(is2,is1) + xpi(ip6))/2
 
609
            else
 
610
                piDpj(ip6,is2) = (dpipj(ip6,is1) + xpi(is2))/2
 
611
            endif
 
612
            if ( locwrt ) then
 
613
                igehad(is2,ip6) = igehad(is2,ip6) + 1
 
614
                igehad(ip6,is2) = igehad(ip6,is2) + 1
 
615
            endif
 
616
            piDpj(is2,ip6) = piDpj(ip6,is2)
 
617
            if ( lwarn .and. abs(piDpj(ip6,is2)) .lt.
 
618
     +          xloss*min(abs(xpi(ip6)),xpi(is2))) then
 
619
                ier0 = ierin
 
620
                call ffwarn(108,ier0,
 
621
     +          piDpj(ip6,is2),min(abs(xpi(ip6)),xpi (is2)))
 
622
                ier = max(ier,ier0)
 
623
            endif
 
624
*
 
625
*           p(i+2).s(i)
 
626
*
 
627
            if ( abs(xpi(ip11)) .le. xpi(is1) ) then
 
628
                piDpj(ip11,is1) = -(dpipj(is1,is3) + xpi(ip11))/2
 
629
            else
 
630
                piDpj(ip11,is1) = -(dpipj(ip11,is3) + xpi(is1))/2
 
631
            endif
 
632
            piDpj(is1,ip11) = piDpj(ip11,is1)
 
633
            if ( locwrt ) then
 
634
                igehad(is1,ip11) = igehad(is1,ip11) + 1
 
635
                igehad(ip11,is1) = igehad(ip11,is1) + 1
 
636
            endif
 
637
            if ( lwarn .and. abs(piDpj(ip11,is1)) .lt.
 
638
     +          xloss*min(abs(xpi(ip11)),xpi(is1))) then
 
639
                ier0 = ierin
 
640
                call ffwarn(109,ier0,
 
641
     +          piDpj(ip11,is1),min(abs(xpi(ip11)),xpi(is1)))
 
642
                ier = max(ier,ier0)
 
643
            endif
 
644
*
 
645
*           p(i+2).s(i+2)
 
646
*
 
647
            if ( abs(xpi(ip11)) .le. xpi(is3) ) then
 
648
                piDpj(ip11,is3) = -(dpipj(is1,is3) - xpi(ip11))/2
 
649
            else
 
650
                piDpj(ip11,is3) = -(dpipj(is1,ip11) - xpi(is3))/2
 
651
            endif
 
652
            piDpj(is3,ip11) = piDpj(ip11,is3)
 
653
            if ( locwrt ) then
 
654
                igehad(is3,ip11) = igehad(is3,ip11) + 1
 
655
                igehad(ip11,is3) = igehad(ip11,is3) + 1
 
656
            endif
 
657
            if ( lwarn .and. abs(piDpj(ip11,is3)) .lt.
 
658
     +          xloss*min(abs(xpi(ip11)),xpi(is3))) then
 
659
                ier0 = ierin
 
660
                call ffwarn(109,ier0,
 
661
     +          piDpj(ip11,is3),min(abs(xpi(ip11)),xpi(is3)))
 
662
                ier = max(ier,ier0)
 
663
            endif
 
664
*  #] all in one vertex:
 
665
*  #[ all in one 3point:
 
666
*
 
667
*           pi.s(i+2)
 
668
*
 
669
            if ( min(abs(dpipj(is2,is1)),abs(dpipj(ip11,ip7))) .le.
 
670
     +           min(abs(dpipj(ip11,is1)),abs(dpipj(is2,ip7))) ) then
 
671
                piDpj(ip6,is3) = (dpipj(ip11,ip7) + dpipj(is2,is1))/2
 
672
            else
 
673
                piDpj(ip6,is3) = (dpipj(ip11,is1) + dpipj(is2,ip7))/2
 
674
            endif
 
675
            piDpj(is3,ip6) = piDpj(ip6,is3)
 
676
            if ( locwrt ) then
 
677
                igehad(is3,ip6) = igehad(is3,ip6) + 1
 
678
                igehad(ip6,is3) = igehad(ip6,is3) + 1
 
679
            endif
 
680
            if ( lwarn .and. abs(piDpj(ip6,is3)) .lt.
 
681
     +          xloss*min(abs(dpipj(ip11,ip7)),abs(dpipj(ip11,is1))) )
 
682
     +          then
 
683
                ier0 = ierin
 
684
                call ffwarn(110,ier0,piDpj(ip6,is3),
 
685
     +          min(abs(dpipj(ip11,ip7)),abs(dpipj(ip11,is1))))
 
686
                ier = max(ier,ier0)
 
687
            endif
 
688
*
 
689
*           p(i+1).s(i)
 
690
*
 
691
            if ( min(abs(dpipj(is3,is2)),abs(dpipj(ip6,ip11))) .le.
 
692
     +           min(abs(dpipj(ip6,is2)),abs(dpipj(is3,ip11))) ) then
 
693
                piDpj(ip7,is1) = (dpipj(ip6,ip11) + dpipj(is3,is2))/2
 
694
            else
 
695
                piDpj(ip7,is1) = (dpipj(ip6,is2) + dpipj(is3,ip11))/2
 
696
            endif
 
697
            piDpj(is1,ip7) = piDpj(ip7,is1)
 
698
            if ( locwrt ) then
 
699
                igehad(is1,ip7) = igehad(is1,ip7) + 1
 
700
                igehad(ip7,is1) = igehad(ip7,is1) + 1
 
701
            endif
 
702
            if ( lwarn .and. abs(piDpj(ip7,is1)) .lt.
 
703
     +          xloss*min(abs(dpipj(ip6,ip11)),abs(dpipj(ip6,is2))) )
 
704
     +          then
 
705
                ier0 = ierin
 
706
                call ffwarn(111,ier0,piDpj(ip7,is1),
 
707
     +          min(abs(dpipj(ip6,ip11)),abs(dpipj(ip6,is2))))
 
708
                ier = max(ier,ier0)
 
709
            endif
 
710
*
 
711
*           p(i+2).s(i+1)
 
712
*
 
713
            if ( min(abs(dpipj(is1,is3)),abs(dpipj(ip7,ip6))) .le.
 
714
     +           min(abs(dpipj(ip7,is3)),abs(dpipj(is1,ip6))) ) then
 
715
                piDpj(ip11,is2) = -(dpipj(ip7,ip6) + dpipj(is1,is3))/2
 
716
            else
 
717
                piDpj(ip11,is2) = -(dpipj(ip7,is3) + dpipj(is1,ip6))/2
 
718
            endif
 
719
            piDpj(is2,ip11) = piDpj(ip11,is2)
 
720
            if ( locwrt ) then
 
721
                igehad(is2,ip11) = igehad(is2,ip11) + 1
 
722
                igehad(ip11,is2) = igehad(ip11,is2) + 1
 
723
            endif
 
724
            if ( lwarn .and. abs(piDpj(ip11,is2)) .lt.
 
725
     +          xloss*min(abs(dpipj(ip7,ip6)),abs(dpipj(ip7,is3))) )
 
726
     +          then
 
727
                ier0 = ierin
 
728
                call ffwarn(112,ier0,piDpj(ip11,is2),
 
729
     +          min(abs(dpipj(ip7,ip6)),abs(dpipj(ip7,is3))))
 
730
                ier = max(ier,ier0)
 
731
            endif
 
732
*  #] all in one 3point:
 
733
*  #[ all external 3point:
 
734
*
 
735
*           pi.p(i+1)
 
736
*
 
737
            if ( abs(xpi(ip7)) .le. abs(xpi(ip6)) ) then
 
738
                piDpj(ip6,ip7) = (dpipj(ip11,ip6) - xpi(ip7))/2
 
739
            else
 
740
                piDpj(ip6,ip7) = (dpipj(ip11,ip7) - xpi(ip6))/2
 
741
            endif
 
742
            piDpj(ip7,ip6) = piDpj(ip6,ip7)
 
743
            if ( locwrt ) then
 
744
                igehad(ip7,ip6) = igehad(ip7,ip6) + 1
 
745
                igehad(ip6,ip7) = igehad(ip6,ip7) + 1
 
746
            endif
 
747
            if ( lwarn .and. abs(piDpj(ip6,ip7)) .lt.
 
748
     +          xloss*min(abs(xpi(ip6)),abs(xpi(ip7))) ) then
 
749
                ier0 = ierin
 
750
                call ffwarn(113,ier0,piDpj(ip6,ip7),
 
751
     +          min(abs(xpi(ip6)),abs(xpi(ip7))))
 
752
                ier = max(ier,ier0)
 
753
            endif
 
754
*
 
755
*           p(i+1).p(i+2)
 
756
*
 
757
            if ( abs(xpi(ip11)) .le. abs(xpi(ip7)) ) then
 
758
                piDpj(ip7,ip11) = -(dpipj(ip6,ip7) - xpi(ip11))/2
 
759
            else
 
760
                piDpj(ip7,ip11) = -(dpipj(ip6,ip11) - xpi(ip7))/2
 
761
            endif
 
762
            piDpj(ip11,ip7) = piDpj(ip7,ip11)
 
763
            if ( locwrt ) then
 
764
                igehad(ip11,ip7) = igehad(ip11,ip7) + 1
 
765
                igehad(ip7,ip11) = igehad(ip7,ip11) + 1
 
766
            endif
 
767
            if ( lwarn .and. abs(piDpj(ip7,ip11)) .lt.
 
768
     +          xloss*min(abs(xpi(ip7)),abs(xpi(ip11))) ) then
 
769
                ier0 = ierin
 
770
                call ffwarn(114,ier0,piDpj(ip7,ip11),
 
771
     +          min(abs(xpi(ip7)),abs(xpi(ip11))))
 
772
                ier = max(ier,ier0)
 
773
            endif
 
774
*
 
775
*           p(i+2).p(i)
 
776
*
 
777
            if ( abs(xpi(ip6)) .le. abs(xpi(ip11)) ) then
 
778
                piDpj(ip11,ip6) = -(dpipj(ip7,ip11) - xpi(ip6))/2
 
779
            else
 
780
                piDpj(ip11,ip6) = -(dpipj(ip7,ip6) - xpi(ip11))/2
 
781
            endif
 
782
            piDpj(ip6,ip11) = piDpj(ip11,ip6)
 
783
            if ( locwrt ) then
 
784
                igehad(ip6,ip11) = igehad(ip6,ip11) + 1
 
785
                igehad(ip11,ip6) = igehad(ip11,ip6) + 1
 
786
            endif
 
787
            if ( lwarn .and. abs(piDpj(ip11,ip6)) .lt.
 
788
     +          xloss*min(abs(xpi(ip11)),abs(xpi(ip6))) ) then
 
789
                ier0 = ierin
 
790
                call ffwarn(115,ier0,piDpj(ip11,ip6),
 
791
     +          min(abs(xpi(ip11)),abs(xpi(ip6))))
 
792
                ier = max(ier,ier0)
 
793
            endif
 
794
*  #] all external 3point:
 
795
*  #[ the other 3point:
 
796
            is4 = is3 + 1
 
797
            if ( is4 .eq. 6 ) is4 = 1
 
798
            ip8 = is3 + 5
 
799
            ip14 = is4 + 10
 
800
*
 
801
*           we now work with the threepoint configuration
 
802
*
 
803
*                 | p14
 
804
*                 |
 
805
*                / \
 
806
*             s1/   \s4
 
807
*           ___/_____\___
 
808
*           p11  s3    p8
 
809
*
 
810
*           s1.p8
 
811
*
 
812
            do 11 itel = 1,3
 
813
                if ( itel .eq. 1 ) then
 
814
                    i1 = is1
 
815
                    i2 = is3
 
816
                    i3 = is4
 
817
                    i4 = ip11
 
818
                    i5 = ip8
 
819
                    i6 = ip14
 
820
                elseif ( itel .eq. 2 ) then
 
821
                    i1 = is3
 
822
                    i2 = is4
 
823
                    i3 = is1
 
824
                    i4 = ip8
 
825
                    i5 = ip14
 
826
                    i6 = ip11
 
827
                else
 
828
                    i1 = is4
 
829
                    i2 = is1
 
830
                    i3 = is3
 
831
                    i4 = ip14
 
832
                    i5 = ip11
 
833
                    i6 = ip8
 
834
                endif
 
835
*
 
836
*               in one go: the opposite sides
 
837
*
 
838
                if ( min(abs(dpipj(i3,i2)),abs(dpipj(i4,i6))) .le.
 
839
     +               min(abs(dpipj(i4,i2)),abs(dpipj(i3,i6))) ) then
 
840
                    piDpj(i5,i1) = (dpipj(i3,i2) + dpipj(i4,i6))/2
 
841
                else
 
842
                    piDpj(i5,i1) = (dpipj(i4,i2) + dpipj(i3,i6))/2
 
843
                endif
 
844
                piDpj(i1,i5) = piDpj(i5,i1)
 
845
                if ( locwrt ) then
 
846
                    igehad(i1,i5) = igehad(i1,i5) + 1
 
847
                    igehad(i5,i1) = igehad(i5,i1) + 1
 
848
                endif
 
849
                if ( lwarn .and. abs(piDpj(i5,i1)) .lt. xloss*
 
850
     +                  min(abs(dpipj(i4,i6)),abs(dpipj(i4,i2))) ) then
 
851
                    ier0 = ierin
 
852
                    call ffwarn(111,ier0,piDpj(i5,i1),
 
853
     +                  min(abs(dpipj(i4,i6)),abs(dpipj(i4,i2))))
 
854
                    ier = max(ier,ier0)
 
855
                endif
 
856
*
 
857
*               and the remaining external ones
 
858
*
 
859
                if ( abs(xpi(i5)) .le. abs(xpi(i4)) ) then
 
860
                    piDpj(i4,i5) = (dpipj(i6,i4) - xpi(i5))/2
 
861
                else
 
862
                    piDpj(i4,i5) = (dpipj(i6,i5) - xpi(i4))/2
 
863
                endif
 
864
                piDpj(i5,i4) = piDpj(i4,i5)
 
865
                if ( locwrt ) then
 
866
                    igehad(i5,i4) = igehad(i5,i4) + 1
 
867
                    igehad(i4,i5) = igehad(i4,i5) + 1
 
868
                endif
 
869
                if ( lwarn .and. abs(piDpj(i4,i5)) .lt.
 
870
     +                  xloss*min(abs(xpi(i4)),abs(xpi(i5))) ) then
 
871
                    ier0 = ierin
 
872
                    call ffwarn(113,ier0,piDpj(i4,i5),
 
873
     +                          min(abs(xpi(i4)),abs(xpi(i5))))
 
874
                    ier = max(ier,ier0)
 
875
                endif
 
876
   11       continue
 
877
*  #] the other 3point:
 
878
*  #[ 4point indices:
 
879
            ip12 = ip7+5
 
880
*
 
881
*           we now have the fourpoint configuration
 
882
*
 
883
*           \p14   /p8
 
884
*            \____/
 
885
*            | s4 |
 
886
*          s1|    |s3
 
887
*            |____|
 
888
*          p6/ s2 \p7
 
889
*           /      \
 
890
*
 
891
*
 
892
*
 
893
            do 12 itel = 1,2
 
894
                if ( itel .eq. 1 ) then
 
895
                    i1 = ip6
 
896
                    i2 = ip8
 
897
                    i3 = ip7
 
898
                    i4 = ip14
 
899
                else
 
900
                    i1 = ip7
 
901
                    i2 = ip14
 
902
                    i3 = ip6
 
903
                    i4 = ip8
 
904
                endif
 
905
                if ( min(abs(dpipj(i3,ip11)),abs(dpipj(i4,ip12))) .le.
 
906
     +               min(abs(dpipj(i4,ip11)),abs(dpipj(i3,ip12))) ) then
 
907
                    piDpj(i1,i2) = (dpipj(i3,ip11) + dpipj(i4,ip12))/2
 
908
                else
 
909
                    piDpj(i1,i2) = (dpipj(i4,ip11) + dpipj(i3,ip12))/2
 
910
                endif
 
911
                piDpj(i2,i1) = piDpj(i1,i2)
 
912
                if ( locwrt ) then
 
913
                    igehad(i1,i2) = igehad(i1,i2) + 1
 
914
                    igehad(i2,i1) = igehad(i2,i1) + 1
 
915
                endif
 
916
                if ( lwarn .and. abs(piDpj(i2,i1)) .lt. xloss*
 
917
     +                  min(abs(dpipj(i4,ip12)),abs(dpipj(i4,ip11))))
 
918
     +                  then
 
919
                    ier0 = ierin
 
920
                    call ffwarn(111,ier0,piDpj(i2,i1),
 
921
     +                  min(abs(dpipj(i4,ip12)),abs(dpipj(i4,ip11))))
 
922
                    ier = max(ier,ier0)
 
923
                endif
 
924
   12       continue
 
925
*
 
926
*           we are only left with p11.p12 etc.
 
927
*
 
928
            if ( min(abs(dpipj(ip14,ip8)),abs(dpipj(ip7,ip6))) .le.
 
929
     +           min(abs(dpipj(ip7,ip8)),abs(dpipj(ip14,ip6))) ) then
 
930
                piDpj(ip11,ip12) = (dpipj(ip7,ip6) + dpipj(ip14,ip8))/2
 
931
            else
 
932
                piDpj(ip11,ip12) = (dpipj(ip7,ip8) + dpipj(ip14,ip6))/2
 
933
            endif
 
934
            piDpj(ip12,ip11) = piDpj(ip11,ip12)
 
935
            if ( locwrt ) then
 
936
                igehad(ip12,ip11) = igehad(ip12,ip11) + 1
 
937
                igehad(ip11,ip12) = igehad(ip11,ip12) + 1
 
938
            endif
 
939
            if ( lwarn .and. abs(piDpj(ip11,ip12)) .lt. xloss*
 
940
     +              min(abs(dpipj(ip7,ip6)),abs(dpipj(ip7,ip8))) ) then
 
941
                ier0 = ierin
 
942
                call ffwarn(112,ier0,piDpj(ip11,ip12),
 
943
     +                  min(abs(dpipj(ip7,ip6)),abs(dpipj(ip7,ip8))))
 
944
                ier = max(ier,ier0)
 
945
            endif
 
946
   10   continue
 
947
*  #] 4point indices:
 
948
*  #[ check:
 
949
        if ( locwrt ) then
 
950
            print *,'We hebben gehad:'
 
951
            print '(15i2)',igehad
 
952
        endif
 
953
        if ( ltest ) then
 
954
            do 40 i = 1,15
 
955
*
 
956
*               sum over all (incoming) momenta => 0
 
957
*
 
958
                xheck = 0
 
959
                xmax = 0
 
960
                do 20 j=6,10
 
961
                    xheck = xheck + piDpj(j,i)
 
962
                    xmax = max(abs(piDpj(j,i)),xmax)
 
963
   20           continue
 
964
                if ( xloss*abs(xheck) .gt. precx*xmax ) print *,
 
965
     +                  'ffdot5: error: dotproducts with p(',i,
 
966
     +                  ') wrong: (som(.p(i))<>0) ',
 
967
     +                  (piDpj(i,j),j=6,10),xheck
 
968
*
 
969
*               sum over all (incoming) momentum pairs => 0
 
970
*
 
971
                xheck = 0
 
972
                xmax = 0
 
973
                do 25 j=11,15
 
974
                    xheck = xheck + piDpj(j,i)
 
975
                    xmax = max(abs(piDpj(j,i)),xmax)
 
976
   25           continue
 
977
                if ( xloss*abs(xheck) .gt. precx*xmax ) print *,
 
978
     +                  'ffdot5: error: dotproducts with p(',i,
 
979
     +                  ') wrong: (som(.(p(i)+p(i+1)))<>0) ',
 
980
     +                  (piDpj(i,j),j=11,15),xheck
 
981
*
 
982
*               check for symmetry
 
983
*
 
984
                do 30 j=1,15
 
985
                    if ( piDpj(i,j) .ne. piDpj(j,i) ) print *,
 
986
     +                  'ffdot5: error: piDpj(',i,j,') <> piDpj',j,i,')'
 
987
   30           continue
 
988
*
 
989
*               check the diagonal
 
990
*
 
991
                if ( piDpj(i,i) .ne. xpi(i) ) print *,'ffdot5: error: ',
 
992
     +                  'piDpj(',i,i,') <> xpi(',i,')'
 
993
                do 35 j=6,10
 
994
                    do 34 i5=1,2
 
995
                        if ( i5.eq.1 ) then
 
996
*
 
997
*                           see if indeed pi+p(i+1) = p(i+5)
 
998
*
 
999
                            i2 = j+5
 
1000
                            i1 = j+1
 
1001
                            if ( i1 .eq. 11 ) i1 = 6
 
1002
                        else
 
1003
*
 
1004
*                           check that si+p(i+5) = s(i+1)
 
1005
*
 
1006
                            i2 = i1-5
 
1007
                            i1 = j-5
 
1008
                        endif
 
1009
                        xheck = piDpj(j,i)+piDpj(i1,i)-piDpj(i2,i)
 
1010
                        xmax = max(abs(piDpj(j,i)),abs(piDpj(i2,i)),
 
1011
     +                          abs(piDpj(i1,i)))
 
1012
                        if ( xloss*abs(xheck) .gt. precx*xmax ) print *,
 
1013
     +                          'ffdot5: error: piDpj(',j,i,')+piDpj(',
 
1014
     +                          i2,i,')-piDpj(',i1,i,') <> 0',xmax,xheck
 
1015
   34               continue
 
1016
   35           continue
 
1017
   40       continue
 
1018
        endif
 
1019
*  #] check:
 
1020
*###] ffdot5:
 
1021
        end
 
1022
*###[ ffpi54:
 
1023
        subroutine ffpi54(xpi4,dpipj4,piDpj4,xpi,dpipj,piDpj,inum,ier)
 
1024
***#[*comment:***********************************************************
 
1025
*                                                                       *
 
1026
*       Gets the dotproducts pertaining to the fourpoint function with  *
 
1027
*       s_i missing out of the five point function dotproduct array.    *
 
1028
*                                                                       *
 
1029
*       Input:  xpi     real(20)        si.si,pi.pi                     *
 
1030
*               dpipj   real(15,20)     xpi(i) - xpi(j)                 *
 
1031
*               piDpj   real(15,15)     pi(i).pi(j)                     *
 
1032
*               inum    integer         1--5                            *
 
1033
*                                                                       *
 
1034
*       Output: xpi4    real(13)                                        *
 
1035
*               dpipj4  real(10,13)                                     *
 
1036
*               piDpj4  real(10,10)                                     *
 
1037
*               ier     integer                                         *
 
1038
*                                                                       *
 
1039
***#]*comment:***********************************************************
 
1040
*  #[ declarations:
 
1041
        implicit none
 
1042
*
 
1043
*       arguments
 
1044
*
 
1045
        integer inum,ier
 
1046
        DOUBLE PRECISION xpi(20),dpipj(15,20),piDpj(15,15),xpi4(13),
 
1047
     +          dpipj4(10,13),piDpj4(10,10),qDq(10,10)
 
1048
*
 
1049
*       local variables
 
1050
*
 
1051
        integer i,j,iplace(11,5),isigns(11,5),ier0
 
1052
        save iplace,isigns
 
1053
        DOUBLE PRECISION xmax
 
1054
*
 
1055
*       common blocks
 
1056
*
 
1057
        include 'ff.h'
 
1058
*
 
1059
*       data
 
1060
*
 
1061
        data iplace /
 
1062
     +          2,3,4,5, 07,08,09,15, 12,13, 17,
 
1063
     +          1,3,4,5, 11,08,09,10, 14,13, 18,
 
1064
     +          1,2,4,5, 06,12,09,10, 14,15, 19,
 
1065
     +          1,2,3,5, 06,07,13,10, 11,15, 20,
 
1066
     +          1,2,3,4, 06,07,08,14, 11,12, 16/
 
1067
*
 
1068
        data isigns /
 
1069
     +          +1,+1,+1,+1, +1,+1,+1,+1, -1,+1, +1,
 
1070
     +          +1,+1,+1,+1, +1,+1,+1,+1, +1,+1, +1,
 
1071
     +          +1,+1,+1,+1, +1,+1,+1,+1, +1,-1, +1,
 
1072
     +          +1,+1,+1,+1, +1,+1,+1,+1, -1,-1, +1,
 
1073
     +          +1,+1,+1,+1, +1,+1,+1,+1, -1,+1, +1/
 
1074
*  #] declarations:
 
1075
*  #[ distribute:
 
1076
*
 
1077
*       copy p5-p11
 
1078
*
 
1079
        do 20 i=1,11
 
1080
            xpi4(i) = xpi(iplace(i,inum))
 
1081
            do 10 j=1,10
 
1082
                dpipj4(j,i) = dpipj(iplace(j,inum),iplace(i,inum))
 
1083
   10       continue
 
1084
   20   continue
 
1085
*
 
1086
*       these cannot be simply copied I think
 
1087
*
 
1088
        xpi4(12) = -xpi4(5)+xpi4(6)-xpi4(7)+xpi4(8)+xpi4(9)+xpi4(10)
 
1089
        if ( lwarn ) then
 
1090
            xmax = max(abs(xpi4(5)),abs(xpi4(6)),abs(xpi4(7)),
 
1091
     +                 abs(xpi4(8)),abs(xpi4(9)),abs(xpi4(10)))
 
1092
            if ( abs(xpi4(12)) .lt. xloss*xmax )
 
1093
     +              call ffwarn(154,ier,xpi4(12),xmax)
 
1094
        endif
 
1095
        xpi4(13) = xpi4(5)-xpi4(6)+xpi4(7)-xpi4(8)+xpi4(9)+xpi4(10)
 
1096
        if ( lwarn ) then
 
1097
            xmax = max(abs(xpi4(5)),abs(xpi4(6)),abs(xpi4(7)),
 
1098
     +                 abs(xpi4(8)),abs(xpi4(9)),abs(xpi4(10)))
 
1099
            if ( abs(xpi4(13)) .lt. xloss*xmax )
 
1100
     +              call ffwarn(155,ier,xpi4(13),xmax)
 
1101
        endif
 
1102
*
 
1103
*       and the differences
 
1104
*
 
1105
        do 40 i=12,13
 
1106
            do 30 j=1,10
 
1107
                dpipj4(j,i) = xpi4(j) - xpi4(i)
 
1108
   30       continue
 
1109
   40   continue
 
1110
*
 
1111
*       copy the dotproducts (watch the signs of p9,p10!)
 
1112
*
 
1113
        do 60 i=1,10
 
1114
            do 50 j=1,10
 
1115
                piDpj4(j,i) = isigns(j,inum)*isigns(i,inum)*
 
1116
     +                  piDpj(iplace(j,inum),iplace(i,inum))
 
1117
   50       continue
 
1118
   60   continue
 
1119
*  #] distribute:
 
1120
*  #[ check:
 
1121
        if ( lwrite ) then
 
1122
            print *,'ffpi54: xpi4 = ',xpi4
 
1123
        endif
 
1124
        if ( ltest ) then
 
1125
            ier0 = 0
 
1126
            call ffxhck(xpi4,dpipj4,10,ier0)
 
1127
            call ffxuvw(xpi4,dpipj4,ier0)
 
1128
            if ( ier0 .ne. 0 ) print *,'ffpi54: error detected'
 
1129
*
 
1130
*           check piDpj
 
1131
*
 
1132
            ier0 = ier
 
1133
            call ffdot4(qDq,xpi4,dpipj4,10,ier0)
 
1134
            do 190 i=1,10
 
1135
                do 180 j=1,10
 
1136
                    if ( xloss*10d0**(-mod(ier0,50))*abs(qDq(j,i)-
 
1137
     +                  piDpj4(j,i)) .gt. precx*abs(qDq(j,i)) ) print *,
 
1138
     +                  'ffpi54: error: piDpj4(',j,i,') not correct: ',
 
1139
     +                  piDpj4(j,i),qDq(j,i),piDpj4(j,i)-qDq(j,i),ier0
 
1140
  180           continue
 
1141
  190       continue
 
1142
        endif
 
1143
*  #] check:
 
1144
*###] ffpi54:
 
1145
        end
 
1146
*###[ ffxe0r:
 
1147
        subroutine ffxe0r(ce0,cd0i,xpi,ier)
 
1148
***#[*comment:***********************************************************
 
1149
*                                                                       *
 
1150
*       Tries all 12 permutations of the 5pointfunction                 *
 
1151
*                                                                       *
 
1152
***#]*comment:***********************************************************
 
1153
*  #[ declarations:
 
1154
        implicit none
 
1155
        integer ier,nrot
 
1156
        parameter(nrot=12)
 
1157
        DOUBLE PRECISION xpi(20),xqi(20)
 
1158
        DOUBLE COMPLEX ce0,cd0i(5),ce0p,cd0ip(5),cd0ipp(5)
 
1159
        integer inew(20,nrot),irota,ier1,i,j,k,icon,ialsav,init
 
1160
        logical lcon
 
1161
        parameter (icon=3)
 
1162
        save inew,init,lcon
 
1163
        include 'ff.h'
 
1164
        data inew
 
1165
     +         /1,2,3,4,5, 6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,
 
1166
     +          2,1,3,4,5, 6,11,8,9,15,7,14,13,12,10, 16,18,17,19,-20,
 
1167
     +          1,3,2,4,5, 11,7,12,9,10,6,8,15,14,13, -16,17,19,18,20,
 
1168
     +          1,2,4,3,5, 6,12,8,13,10,14,7,9,11,15, 16,-17,18,20,19,
 
1169
     +          1,2,3,5,4, 6,7,13,9,14,11,15,8,10,12, 20,17,-18,19,16,
 
1170
     +          5,2,3,4,1, 15,7,8,14,10,13,12,11,9,6, 17,16,18,-19,20,
 
1171
     +          2,1,4,3,5, 6,14,8,13,15,12,11,9,7,10, 16,-18,17,20,-19,
 
1172
     +          1,3,2,5,4, 11,7,15,9,14,6,13,12,10,8, -20,17,-19,18,16,
 
1173
     +          5,2,4,3,1, 15,12,8,11,10,9,7,14,13,6, 17,-16,18,-20,19,
 
1174
     +          2,1,3,5,4, 6,11,13,9,12,7,10,8,15,14, 20,18,-17,19,-16,
 
1175
     +          5,3,2,4,1, 13,7,12,14,10,15,8,6,9,11, -17,16,19,-18,20,
 
1176
     +        1,3,5,2,4, 11,13,15,12,14,10,7,9,6,8,-20,-17,-19,-16,-18/
 
1177
        data init /0/
 
1178
*  #] declarations:
 
1179
*  #[ open console for some activity on screen:
 
1180
        if ( init .eq. 0 ) then
 
1181
            init = 1
 
1182
            if ( lwrite ) then
 
1183
                open(icon,file='CON:',status='old',err=11)
 
1184
                lcon = .TRUE.
 
1185
                goto 13
 
1186
            endif
 
1187
   11       continue
 
1188
            lcon = .FALSE.
 
1189
   13       continue
 
1190
        endif
 
1191
*  #] open console for some activity on screen:
 
1192
*  #[ calculations:
 
1193
        ce0 = 0
 
1194
        ier = 999
 
1195
        ialsav = isgnal
 
1196
        do 30 j = -1,1,2
 
1197
            do 20 irota=1,nrot
 
1198
                do 10 i=1,20
 
1199
                    if ( inew(i,irota) .lt. 0 ) then
 
1200
                        xqi(-inew(i,irota)) = 0
 
1201
                    else
 
1202
                        xqi(inew(i,irota)) = xpi(i)
 
1203
                    endif
 
1204
   10           continue
 
1205
                print '(a,i2,a,i2)','---#[ rotation ',irota,': isgnal ',
 
1206
     +                  isgnal
 
1207
                if (lcon) write(icon,'(a,i2,a,i2)')'rotation ',irota,',
 
1208
     +                  isgnal ',isgnal
 
1209
                ier1 = 0
 
1210
                ner = 0
 
1211
                id = id + 1
 
1212
                isgnal = ialsav
 
1213
                call ffxe0(ce0p,cd0ip,xqi,ier1)
 
1214
                ier1 = ier1 + ner
 
1215
                print '(a,i1,a,i2)','---#] rotation ',irota,': isgnal ',
 
1216
     +                  isgnal
 
1217
                print '(a,2g28.16,i3)','e0 = ',ce0p,ier1
 
1218
                do 15 k=1,5
 
1219
                    cd0ipp(k) = cd0ip(inew(k,irota))
 
1220
                    print '(a,2g28.16,i3)','d0 = ',cd0ipp(k),k
 
1221
   15           continue
 
1222
                if (lcon) write(icon,'(a,2g28.16,i3)')'e0 = ',ce0p,ier1
 
1223
                if ( ier1 .lt. ier ) then
 
1224
                    ce0 = ce0p
 
1225
                    do 19 k=1,5
 
1226
                        cd0i(k) = cd0ipp(k)
 
1227
   19               continue
 
1228
                    ier = ier1
 
1229
                endif
 
1230
   20       continue
 
1231
            ialsav = -ialsav
 
1232
   30   continue
 
1233
*  #] calculations:
 
1234
*###] ffxe0r:
 
1235
        end
 
1236