2
subroutine ffdel3(del3,xpi,piDpj,ns,ier)
3
***#[*comment:***********************************************************
5
* Calculate del3(piDpj) = det(si.sj) with *
6
* the momenta as follows: *
10
* Input: xpi(ns) (real) m^2(i),i=1,3; p^2(i-3),i=4,10 *
11
* piDpj(ns,ns) (real) *
15
* Output: del3 (real) det(si.sj) *
17
***#]*comment:***********************************************************
24
DOUBLE PRECISION del3,xpi(6),piDpj(6,6)
29
parameter(mem=10,nperm=16)
30
integer i,jj(6),iperm(3,nperm),imem,memarr(mem,3),memind,inow
31
DOUBLE PRECISION s(6),xmax,del3p,xmaxp,rloss
32
save iperm,memind,memarr,inow
40
data memarr /mem*0,mem*0,mem*1/
43
* these are all permutations that give a non-zero result with the
44
* correct sign. This list was generated with getperm3.
47
+ 1,2,3, 1,2,5, 1,6,2, 1,4,3,
48
+ 1,3,5, 1,4,5, 1,6,4, 1,5,6,
49
+ 2,4,3, 2,3,6, 2,4,5, 2,6,4,
50
+ 2,5,6, 3,4,5, 3,6,4, 3,5,6/
52
* #[ starting point in memory?:
54
* see if we know were to start, if not: go on as last time
57
if ( id .eq. memarr(i,1) .and. idsub .eq. memarr(i,2) ) then
63
* #] starting point in memory?:
79
s(1) = +piDpj(jj(1),jj(2))*piDpj(jj(3),jj(4))*piDpj(jj(5),jj(6))
80
s(2) = +piDpj(jj(1),jj(4))*piDpj(jj(3),jj(6))*piDpj(jj(5),jj(2))
81
s(3) = +piDpj(jj(1),jj(6))*piDpj(jj(3),jj(2))*piDpj(jj(5),jj(4))
82
s(4) = -piDpj(jj(1),jj(2))*piDpj(jj(3),jj(6))*piDpj(jj(5),jj(4))
83
s(5) = -piDpj(jj(1),jj(6))*piDpj(jj(3),jj(4))*piDpj(jj(5),jj(2))
84
s(6) = -piDpj(jj(1),jj(4))*piDpj(jj(3),jj(2))*piDpj(jj(5),jj(6))
90
xmaxp = max(xmaxp,abs(s(i)))
92
if ( abs(del3p) .lt. xloss*xmaxp ) then
93
if ( lwrite ) print *,'del3+',inow,' = ',del3p,xmaxp
94
if ( inow .eq. imem .or. xmaxp .lt. xmax ) then
99
if ( inow .gt. nperm ) inow = 1
100
if ( inow .eq. imem ) then
101
if ( lwarn ) call ffwarn(73,ier,del3,xmax)
106
if ( inow .ne. imem ) then
107
if ( lwrite ) print *,'del3+',inow,' = ',del3p,xmaxp
115
if ( memind .gt. mem ) memind = 1
116
memarr(memind,1) = id
117
memarr(memind,2) = idsub
118
memarr(memind,3) = inow
123
s(1) = +piDpj(1,1)*piDpj(2,2)*piDpj(3,3)
124
s(2) = +piDpj(1,2)*piDpj(2,3)*piDpj(3,1)
125
s(3) = +piDpj(1,3)*piDpj(2,1)*piDpj(3,2)
126
s(4) = -piDpj(1,1)*piDpj(2,3)*piDpj(3,2)
127
s(5) = -piDpj(1,3)*piDpj(2,2)*piDpj(3,1)
128
s(6) = -piDpj(1,2)*piDpj(2,1)*piDpj(3,3)
134
xmaxp = max(xmaxp,abs(s(i)))
136
rloss = xloss*DBLE(10)**(-mod(ier,50))
137
if ( rloss*abs(del3p-del3) .gt. precx*xmaxp ) then
138
print *,'ffdel3: error: result does not agree with',
140
print *,'result: ',del3,xmax
141
print *,'normal: ',del3p,xmaxp
142
print *,'diff.: ',del3-del3p
149
subroutine ffdl3s(dl3s,xpi,piDpj,ii,ns,ier)
150
***#[*comment:***********************************************************
152
* Calculate dl3s(piDpj) = det(si.sj) with *
153
* the momenta indicated by the indices ii(1-6,1), ii(1-6,2) *
155
* p(|ii(1,)|-|ii(3,)|) = s(i) *
156
* p(|ii(4,)|-|ii(6,)|) = p(i) = sgn(ii())*(s(i+1) - s(i)) *
158
* At this moment (26-apr-1990) only the diagonal is tried *
160
* Input: xpi(ns) (real) m^2(i),i=1,3; p^2(i-3),i=4,10 *
161
* piDpj(ns,ns) (real) *
162
* ii(6,2) (integer) see above *
166
* Output: dl3s (real) det(si.sj) *
168
***#]*comment:***********************************************************
174
integer ii(6,2),ns,ier
175
DOUBLE PRECISION dl3s,xpi(ns),piDpj(ns,ns)
180
parameter(mem=10,nperm=16)
181
integer i,j,jj(6),jsgn,iperm(3,nperm),imem,memarr(mem,3),
183
DOUBLE PRECISION s(6),xmax,dl3sp,xmaxp,xlosn,xhck,rloss
184
save iperm,memind,memarr,inow
192
data memarr /mem*0,mem*0,mem*1/
195
* these are all permutations that give a non-zero result with the
196
* correct sign. This list was generated with getperm3.
199
+ 1,2,3, 1,2,5, 1,6,2, 1,4,3,
200
+ 1,3,5, 1,4,5, 1,6,4, 1,5,6,
201
+ 2,4,3, 2,3,6, 2,4,5, 2,6,4,
202
+ 2,5,6, 3,4,5, 3,6,4, 3,5,6/
206
* print *,'ffdl3s: input: ii(,1) = ',(ii(i,1),i=1,6)
207
* print *,' ii(,2) = ',(ii(i,2),i=1,6)
208
xlosn = xloss*DBLE(10)**(-mod(ier,50))
211
if ( abs(ii(i,j)) .gt. ns ) print *,'ffdl3s: error: ',
212
+ '|ii(i,j)| > ns: ',ii(i,j),ns
213
if ( abs(ii(i,j)) .eq. 0 ) print *,'ffdl3s: error: ',
214
+ '|ii(i,j)| = 0: ',ii(i,j)
218
xhck = piDpj(abs(ii(i,j)),ii(1,j))
219
+ - piDpj(abs(ii(i,j)),ii(2,j))
220
+ + sign(1,ii(4,j))*piDpj(abs(ii(i,j)),abs(ii(4,j)))
221
xmax = max(abs(piDpj(abs(ii(i,j)),ii(1,j))),
222
+ abs(piDpj(abs(ii(i,j)),ii(2,j))))
223
if ( xlosn*abs(xhck) .gt. precx*xmax ) print *,'ffdl3s:'
224
+ ,' error: dotproducts 124 with ',i,' do not add to 0:'
225
+ ,piDpj(abs(ii(i,j)),ii(1,j)),
226
+ piDpj(abs(ii(i,j)),ii(2,j)),
227
+ piDpj(abs(ii(i,j)),abs(ii(4,j))),xhck
229
xhck = piDpj(abs(ii(i,j)),ii(2,j))
230
+ - piDpj(abs(ii(i,j)),ii(3,j))
231
+ + sign(1,ii(5,j))*piDpj(abs(ii(i,j)),abs(ii(5,j)))
232
xmax = max(abs(piDpj(abs(ii(i,j)),ii(2,j))),
233
+ abs(piDpj(abs(ii(i,j)),ii(3,j))))
234
if ( xlosn*abs(xhck) .gt. precx*xmax ) print *,'ffdl3s:'
235
+ ,' error: dotproducts 235 with ',i,' do not add to 0:'
236
+ ,piDpj(abs(ii(i,j)),ii(2,j)),
237
+ piDpj(abs(ii(i,j)),ii(3,j)),
238
+ piDpj(abs(ii(i,j)),abs(ii(5,j))),xhck
240
xhck = piDpj(abs(ii(i,j)),ii(3,j))
241
+ - piDpj(abs(ii(i,j)),ii(1,j))
242
+ + sign(1,ii(6,j))*piDpj(abs(ii(i,j)),abs(ii(6,j)))
243
xmax = max(abs(piDpj(abs(ii(i,j)),ii(3,j))),
244
+ abs(piDpj(abs(ii(i,j)),ii(1,j))))
245
if ( xlosn*abs(xhck) .gt. precx*xmax ) print *,'ffdl3s:'
246
+ ,' error: dotproducts 316 with ',i,' do not add to 0:'
247
+ ,piDpj(abs(ii(i,j)),ii(3,j)),
248
+ piDpj(abs(ii(i,j)),ii(1,j)),
249
+ piDpj(abs(ii(i,j)),abs(ii(6,j))),xhck
251
xhck = sign(1,ii(4,j))*piDpj(abs(ii(i,j)),abs(ii(4,j)))
252
+ + sign(1,ii(5,j))*piDpj(abs(ii(i,j)),abs(ii(5,j)))
253
+ + sign(1,ii(6,j))*piDpj(abs(ii(i,j)),abs(ii(6,j)))
254
xmax = max(abs(piDpj(abs(ii(i,j)),abs(ii(4,j)))),
255
+ abs(piDpj(abs(ii(i,j)),abs(ii(5,j)))))
256
if ( xlosn*abs(xhck) .gt. precx*xmax ) print *,'ffdl3s:'
257
+ ,' error: dotproducts 456 with ',i,' do not add to 0:'
258
+ ,piDpj(abs(ii(i,j)),abs(ii(4,j))),
259
+ piDpj(abs(ii(i,j)),abs(ii(5,j))),
260
+ piDpj(abs(ii(i,j)),abs(ii(6,j))),xhck
266
* #[ starting point in memory?:
268
* see if we know were to start, if not: go on as last time
271
if ( id .eq. memarr(i,1) .and. idsub .eq. memarr(i,2) ) then
277
* #] starting point in memory?:
285
jj(1) = abs(ii(iperm(1,inow),1))
286
jj(3) = abs(ii(iperm(2,inow),1))
287
jj(5) = abs(ii(iperm(3,inow),1))
289
jj(2) = abs(ii(iperm(1,inow),2))
290
jj(4) = abs(ii(iperm(2,inow),2))
291
jj(6) = abs(ii(iperm(3,inow),2))
293
jsgn = sign(1,ii(iperm(1,inow),1))
294
+ *sign(1,ii(iperm(2,inow),1))
295
+ *sign(1,ii(iperm(3,inow),1))
296
+ *sign(1,ii(iperm(1,inow),2))
297
+ *sign(1,ii(iperm(2,inow),2))
298
+ *sign(1,ii(iperm(3,inow),2))
300
s(1) = +piDpj(jj(1),jj(2))*piDpj(jj(3),jj(4))*piDpj(jj(5),jj(6))
301
s(2) = +piDpj(jj(1),jj(4))*piDpj(jj(3),jj(6))*piDpj(jj(5),jj(2))
302
s(3) = +piDpj(jj(1),jj(6))*piDpj(jj(3),jj(2))*piDpj(jj(5),jj(4))
303
s(4) = -piDpj(jj(1),jj(2))*piDpj(jj(3),jj(6))*piDpj(jj(5),jj(4))
304
s(5) = -piDpj(jj(1),jj(6))*piDpj(jj(3),jj(4))*piDpj(jj(5),jj(2))
305
s(6) = -piDpj(jj(1),jj(4))*piDpj(jj(3),jj(2))*piDpj(jj(5),jj(6))
311
xmaxp = max(xmaxp,abs(s(i)))
313
if ( abs(dl3sp) .lt. xloss*xmaxp ) then
314
if ( lwrite ) print *,'dl3s+',inow,' = ',dl3sp,xmaxp
315
if ( inow .eq. imem .or. xmaxp .lt. xmax ) then
320
if ( inow .gt. nperm ) inow = 1
321
if ( inow .eq. imem ) then
322
if ( lwarn ) call ffwarn(85,ier,dl3s,xmax)
327
if ( inow .ne. imem ) then
328
if ( lwrite ) print *,'dl3s+',inow,' = ',dl3sp,xmaxp
336
if ( memind .gt. mem ) memind = 1
337
memarr(memind,1) = id
338
memarr(memind,2) = idsub
339
memarr(memind,3) = inow
344
s(1) = +piDpj(ii(1,1),ii(1,2))*piDpj(ii(2,1),ii(2,2))*
345
+ piDpj(ii(3,1),ii(3,2))
346
s(2) = +piDpj(ii(1,1),ii(2,2))*piDpj(ii(2,1),ii(3,2))*
347
+ piDpj(ii(3,1),ii(1,2))
348
s(3) = +piDpj(ii(1,1),ii(3,2))*piDpj(ii(3,1),ii(2,2))*
349
+ piDpj(ii(2,1),ii(1,2))
350
s(4) = -piDpj(ii(1,1),ii(1,2))*piDpj(ii(2,1),ii(3,2))*
351
+ piDpj(ii(3,1),ii(2,2))
352
s(5) = -piDpj(ii(1,1),ii(3,2))*piDpj(ii(2,1),ii(2,2))*
353
+ piDpj(ii(3,1),ii(1,2))
354
s(6) = -piDpj(ii(1,1),ii(2,2))*piDpj(ii(2,1),ii(1,2))*
355
+ piDpj(ii(3,1),ii(3,2))
361
xmaxp = max(xmaxp,abs(s(i)))
363
rloss = xloss*DBLE(10)**(-mod(ier,50))
364
if ( rloss*abs(dl3sp-dl3s) .gt. precx*xmaxp ) then
365
print *,'ffdl3s: error: result does not agree with',
367
print *,'result: ',dl3s,xmax
368
print *,'normal: ',dl3sp,xmaxp
369
print *,'diff.: ',dl3s-dl3sp