2
subroutine ffcb2(cb2p,cb2d,cb1,cb0,ca0i,xp,xma,xmb,piDpj,ier)
3
***#[*comment:***********************************************************
5
* Calculate 1 / d^n Q Q(mu) Q(nu) *
6
* ------ | ------------------------ *
7
* i pi^2 / (Q^2-ma^2)((Q+p)^2-mb^2) *
9
* = B2p*p(mu)*p(nu) + B2d*delta /p^2 *
12
* Input: cb1 complex vector twopoint function *
13
* cb0 complex scalar twopoint function *
14
* ca0i(2) complex scalar onepoint function with *
16
* xp complex p.p in B&D metric *
17
* xma,2 complex m_1^2,m_2^2 *
18
* piDpj(3,3) complex dotproducts between s1,s2,p *
19
* ier integer digits lost so far *
20
* Output: cb2p complex coefficient of p(mu)*p(nu) *
21
* cb2d complex coefficient of delta()/p^2 *
22
* ier integer digits lost *
24
***#]*comment:***********************************************************
31
DOUBLE COMPLEX xp,xma,xmb,piDpj(3,3)
32
DOUBLE COMPLEX cb2p,cb2d,cb1,cb0,ca0i(2)
37
DOUBLE COMPLEX dmap,dmbp,dmamb,cc
39
DOUBLE PRECISION rm1,rm2,rp,rpiDpj(3,3),sprec
47
absc(cc) = abs(DBLE(cc)) + abs(DIMAG(cc))
51
if ( DIMAG(xma).eq.0 .and. DIMAG(xmb).eq.0 ) then
57
rpiDpj(i,j) = DBLE(piDpj(i,j))
62
call ffxb2(cb2p,cb2d,cb1,cb0,ca0i,rp,rm1,rm2,rpiDpj,
74
if ( absc(dmamb) .lt. xloss*absc(xma) .and. xma .ne. xmb )
75
+ call ffwarn(97,ier0,absc(dmamb),absc(xma))
76
if ( absc(dmap) .lt. xloss*absc(xp) .and. xp .ne. xma )
77
+ call ffwarn(98,ier0,absc(dmap),absc(xp))
78
if ( absc(dmbp) .lt. xloss*absc(xp) .and. xp .ne. xmb )
79
+ call ffwarn(99,ier0,absc(dmbp),absc(xp))
83
call ffcb2a(cb2p,cb2d,cb1,cb0,ca0i,xp,xma,xmb,dmap,dmbp,dmamb,
89
subroutine ffcb2a(cb2p,cb2d,cb1,cb0,ca0i,xp,xma,xmb,
90
+ dmap,dmbp,dmamb,piDpj,ier)
91
***#[*comment:***********************************************************
93
* see ffcb2, plus differences. *
95
***#]*comment:***********************************************************
102
DOUBLE COMPLEX xp,xma,xmb,dmap,dmbp,dmamb,piDpj(3,3)
103
DOUBLE COMPLEX cb2p,cb2d,cb1,cb0,ca0i(2)
107
integer i,j,ier0,init,ithres
109
DOUBLE PRECISION absc,xmax,xmxp,rloss
110
DOUBLE PRECISION rm1,rm2,rp,rm1p,rm2p,rm1m2,rpiDpj(3,3),sprec
111
DOUBLE COMPLEX delsp,xlam,xlo3,xlogmm,zfflo1,zfflo3
112
DOUBLE COMPLEX cc,cs(6),cb21,cb22,csom
113
DOUBLE COMPLEX cqi(3),cqiqj(3,3),qiDqj(3,3)
122
absc(cc) = abs(DBLE(cc)) + abs(DIMAG(cc))
126
if ( DIMAG(xma).eq.0 .and. DIMAG(xmb).eq.0 ) then
128
if ( lwrite ) print *,'ffcb2a: real masses'
129
elseif ( nschem.le.4 ) then
131
if ( lwrite .or. init.eq.0 ) then
133
print *,'ffcb2a: nschem <= 4, ignoring complex masses:',
136
elseif ( nschem.le.6 ) then
137
if ( lwrite .or. init.eq.0 ) then
139
print *,'ffcb2a: nschem = 5,6 complex masses near ',
140
+ 'threshold: ',nschem
146
cqiqj(2,1) = -cqiqj(1,2)
148
cqiqj(3,1) = -cqiqj(1,3)
150
cqiqj(3,2) = -cqiqj(2,3)
154
call ffthre(ithres,cqi,cqiqj,3,1,2,3)
155
if ( ithres.eq.0 .or. ithres.eq.1 .and. nschem.eq.5 ) then
157
if ( lwrite ) print *,'ffcb2a: no threshold'
159
if ( lwrite ) print *,'ffcb2a: found threshold'
174
rpiDpj(i,j) = DBLE(piDpj(i,j))
179
call ffxb2a(cb2p,cb2d,cb1,cb0,ca0i,rp,rm1,rm2,rm1p,rm2p,
188
call ffcot2(qiDqj,xp,xma,xmb,dmap,dmbp,dmamb,ier0)
189
rloss = xloss*DBLE(10)**(-mod(ier0,50))
192
if ( rloss*absc(piDpj(i,j)-qiDqj(i,j)).gt.precc*
193
+ absc(qiDqj(i,j)) ) print *,'ffcb2a: ',
194
+ 'error: piDpj(',i,j,') wrong: ',piDpj(i,j),
195
+ qiDqj(i,j),piDpj(i,j)-qiDqj(i,j),ier0
201
if ( xp .ne. 0 ) then
203
call ffclmb(xlam,-xp,-xmb,-xma,dmbp,dmap,dmamb,ier)
206
* the first one is simple...
208
cs(1) = 2*cb1*piDpj(1,3)
211
if ( absc(cb2p) .lt. xloss*absc(cs(2)) ) then
212
if ( lwarn ) call ffwarn(214,ier,absc(cb2p),absc(cs(2)))
215
* the next one ain't.
219
cs(3) = -2*piDpj(1,3)*cb1
222
cb2d = cs(1) + cs(2) + cs(3) + cs(4) + cs(5)
223
xmax = max(absc(cs(2)),absc(cs(3)),absc(cs(4)),absc(cs(5)))
224
if ( absc(cb2d) .ge. xloss*xmax ) goto 110
226
print '(a,2e30.16,e12.4)','cb2d = ',cb2d,xmax
228
print '(i3,2e30.16)',(i,cs(i),i=1,5)
231
call ffwarn(214,ier,absc(cb2d),xmax)
233
print *,'xp,xma,xmb = ',xp,xma,xmb
238
cb2p = cb2p*DBLE(1/(2*xp))
239
cb2d = cb2d*(1/DBLE(6))
242
elseif ( dmamb .ne. 0 ) then
243
if ( init.eq.0 ) then
246
print *,'ffcb2a: note: in this case p^2=0 B21 is ',
247
+ 'returned rather than B2p which is undefined'
250
if ( dmamb .ne. 0 ) then
254
* B21 (see thesis, b21.frm)
256
cs(1) = xma**2/3/dmamb**3*ca0i(1)
257
cs(2) = (-xma**2 + xma*xmb - xmb**2/3)/dmamb**3*ca0i(2)
258
cs(3) = (5*xma**3/18 - xma*xmb**2/2 + 2*xmb**3/9)
260
cb21 = cs(1)+cs(2)+cs(3)
261
xmax = max(absc(cs(2)),absc(cs(3)))
262
if ( absc(cb21).gt.xloss**2*xmax ) goto 160
264
print *,'cb21 = ',cb21,xmax
266
print '(i3,2e30.16)',(i,cs(i),i=1,3)
271
if ( absc(dmamb).lt.xloss*absc(xma) ) then
272
xlogmm = zfflo1(dmamb/xma,ier)
274
xlogmm = log(xmb/xma)
277
cs(1) = (xma/dmamb)/6
278
cs(2) = (xma/dmamb)**2/3
279
cs(3) = (xma/dmamb)**3*xlogmm/3
280
cs(4) = -2/DBLE(9) + ca0i(1)/(3*xma)
282
csom = cs(1)+cs(2)+cs(3)+cs(4)+cs(5)
283
xmxp = max(absc(cs(2)),absc(cs(3)),absc(cs(4)),
286
print *,'cb21+= ',csom,xmxp
288
print '(i3,2e30.16)',(i,cs(i),i=1,5)
290
if ( xmxp.lt.xmax ) then
293
if ( absc(cb21).gt.xloss**2*xmax ) goto 160
298
xlo3 = zfflo3(dmamb/xma,ier)
299
cs(1) = (dmamb/xma)**2/6
300
cs(2) = (dmamb/xma)/3
301
cs(3) = xlo3/(3*(dmamb/xma)**3)
302
*same cs(4) = -2/DBLE(9) + ca0i(1)/(3*xma)
304
csom = cs(1)+cs(2)+cs(3)+cs(4)+cs(5)
305
xmxp = max(absc(cs(2)),absc(cs(3)),absc(cs(4)),
308
print *,'cb21+= ',csom,xmxp
310
print '(i3,2e30.16)',(i,cs(i),i=1,5)
312
if ( xmxp.lt.xmax ) then
315
if ( absc(cb21).gt.xloss**2*xmax ) goto 160
321
call ffwarn(227,ier,absc(cb21),xmax)
323
print *,'xp,xma,xmb = ',xp,xma,xmb
332
cs(1) = +xma/(4*dmamb)*ca0i(1)
333
cs(2) = -xmb/(4*dmamb)*ca0i(2)
335
cb22 = cs(1) + cs(2) + cs(3)
336
xmax = max(absc(cs(2)),absc(cs(3)))
337
if ( absc(cb22).gt.xloss*xmax ) goto 210
339
print *,'cb22 = ',cb22,xmax
341
print '(i3,2e30.16)',(i,cs(i),i=1,3)
344
* second try, close together
346
if ( .not.llogmm ) then
347
if ( abs(dmamb).lt.xloss*absc(xma) ) then
348
xlogmm = zfflo1(dmamb/xma,ier)
350
xlogmm = log(xmb/xma)
353
cs(1) = dmamb*( -1/DBLE(8) - ca0i(1)/(4*xma) )
354
cs(2) = dmamb*xlogmm/4
355
cs(3) = xma*(xma/dmamb)/4*xlogmm
356
cs(4) = xma*( 1/DBLE(4) + ca0i(1)/(2*xma) )
357
cs(5) = -xma*xlogmm/2
358
csom = cs(1) + cs(2) + cs(3) + cs(4) + cs(5)
359
xmxp = max(absc(cs(2)),absc(cs(3)),absc(cs(4)),
362
print *,'cb22+= ',csom,xmxp
364
print '(i3,2e30.16)',(i,cs(i),i=1,2)
366
if ( xmxp.lt.xmax ) then
370
if ( absc(cb22).gt.xloss*xmax ) goto 210
375
call ffwarn(214,ier,absc(cb22),xmax)
377
print *,'xp,xma,xmb = ',xp,xma,xmb
387
cb22 = xma/2*(cb0 + 1)
395
print *,'ffcb2: cb2p = ',cb2p,ier
396
print *,' cb2d = ',cb2d,ier