8012
9392
use avh_olo_dp_box
8013
9393
use avh_olo_dp_boxc
8016
,intent(out) :: rslt(0:2)
8018
,intent(in) :: p1,p2,p3,p4,p12,p23
8020
,intent(in) :: m1,m2,m3,m4
8029
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
8031
:: mulocal,mulocal2,small,hh,min13,min24,min56
8032
integer :: icase,ii,jj
8034
integer ,parameter :: lp(6,3)=&
8035
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
8036
integer ,parameter :: lm(4,3)=&
8037
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
8038
character(25+99) ,parameter :: warning=&
8039
'WARNING from OneLOop d0: '//warnonshell
8040
if (initz) call init
8054
ap(ii) = areal(pp(ii))
8055
if (aimag(pp(ii)).ne.RZRO) then
8056
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8057
,'momentum with non-zero imaginary part, putting it to zero.'
8058
pp(ii) = acmplx( ap(ii) ,0 )
8060
ap(ii) = abs(ap(ii))
8061
if (ap(ii).gt.smax) smax = ap(ii)
8065
am(ii) = areal(mm(ii))
8067
if (hh.gt.RZRO) then
8068
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8069
,'mass-squared has positive imaginary part, switching its sign.'
8070
mm(ii) = acmplx( am(ii) ,-hh )
8072
am(ii) = abs(am(ii)) + abs(hh)
8073
if (am(ii).gt.smax) smax = am(ii)
8079
if (hh.gt.small) small=hh
8081
small = small*neglig(prcpar)
8085
mulocal2 = mulocal*mulocal
8087
if (smax.eq.RZRO) then
8088
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8089
,'all input equal zero, returning 0'
8090
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
8094
if (mulocal2.gt.smax) smax = mulocal2
8096
if (nonzerothrs) then
8099
if (ap(ii).lt.hh) ap(ii) = 0
8100
if (am(ii).lt.hh) am(ii) = 0
8103
hh = onshellthrs*smax
8104
if (wunit.gt.0) then
8106
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
8107
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
8113
min56 = min(ap(5),ap(6))
8114
if (min56.lt.hh) then
8115
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8116
,'input does not seem to represent hard kinematics, '&
8117
,'trying to permutate'
8118
min13=min(ap(1),ap(3))
8119
min24=min(ap(2),ap(4))
8120
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
8121
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
8123
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8124
,'no permutation helps, errors might follow'
8130
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
8132
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
8133
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
8134
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
8135
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
8136
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
8137
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
8138
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
8139
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
8140
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
8141
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
8142
icase = casetable(icase)
8144
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
8145
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
8146
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
8147
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
8148
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
8149
if (nonzerothrs) then
8150
if (s1r2.lt.hh) s1r2 = 0
8151
if (s2r2.lt.hh) s2r2 = 0
8152
if (s2r3.lt.hh) s2r3 = 0
8153
if (s3r4.lt.hh) s3r4 = 0
8154
if (s4r4.lt.hh) s4r4 = 0
8155
elseif (wunit.gt.0) then
8156
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
8157
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
8158
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
8159
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
8160
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
8163
if (icase.eq.4) then
8164
!4 non-zero internal masses
8165
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8166
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8167
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8168
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8169
.or.( areal(ss(1)).ge.-small &
8170
.and.areal(ss(2)).ge.-small &
8171
.and.areal(ss(3)).ge.-small &
8172
.and.areal(ss(4)).ge.-small) )
8174
call boxc( rslt ,ss,rr ,as ,smax )
8176
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
8178
elseif (icase.eq.3) then
8179
!3 non-zero internal masses
8180
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8181
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8182
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8183
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8184
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8185
.or.( areal(ss(1)).ge.-small &
8186
.and.areal(ss(2)).ge.-small &
8187
.and.areal(ss(3)).ge.-small &
8188
.and.areal(ss(4)).ge.-small) )
8190
call boxc( rslt ,ss,rr ,as ,smax )
8192
call boxf3( rslt, ss,rr )
8195
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
8197
elseif (icase.eq.5) then
8198
!2 non-zero internal masses, opposite case
8199
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8200
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8201
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
8203
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8205
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8206
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8208
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8210
elseif (icase.eq.2) then
8211
!2 non-zero internal masses, adjacent case
8212
if (as(1).ne.RZRO) then
8213
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
8214
elseif (s2r3.ne.RZRO) then
8215
if (s4r4.ne.RZRO) then
8216
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8218
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
8220
elseif (s4r4.ne.RZRO) then
8221
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8223
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8225
elseif (icase.eq.1) then
8226
!1 non-zero internal mass
8227
if (as(1).ne.RZRO) then
8228
if (as(2).ne.RZRO) then
8229
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
8231
if (s3r4.ne.RZRO) then
8232
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8234
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8237
elseif (as(2).ne.RZRO) then
8238
if (s4r4.ne.RZRO) then
8239
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8241
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8244
if (s3r4.ne.RZRO) then
8245
if (s4r4.ne.RZRO) then
8246
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8248
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8250
elseif (s4r4.ne.RZRO) then
8251
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8253
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
8257
!0 non-zero internal mass
8258
call box00( rslt ,ss ,as ,mulocal )
8260
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
8261
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
8263
if (punit.gt.0) then
8264
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
8265
write(punit,*) 'muscale:',trim(myprint(mulocal))
8266
write(punit,*) ' p1:',trim(myprint(p1))
8267
write(punit,*) ' p2:',trim(myprint(p2))
8268
write(punit,*) ' p3:',trim(myprint(p3))
8269
write(punit,*) ' p4:',trim(myprint(p4))
8270
write(punit,*) 'p12:',trim(myprint(p12))
8271
write(punit,*) 'p23:',trim(myprint(p23))
8272
write(punit,*) ' m1:',trim(myprint(m1))
8273
write(punit,*) ' m2:',trim(myprint(m2))
8274
write(punit,*) ' m3:',trim(myprint(m3))
8275
write(punit,*) ' m4:',trim(myprint(m4))
8276
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
8277
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
8278
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
8282
subroutine d0ccr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
8287
,intent(out) :: rslt(0:2)
8289
,intent(in) :: p1,p2,p3,p4,p12,p23
8291
,intent(in) :: m1,m2,m3,m4
8302
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
8304
:: mulocal,mulocal2,small,hh,min13,min24,min56
8305
integer :: icase,ii,jj
8307
integer ,parameter :: lp(6,3)=&
8308
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
8309
integer ,parameter :: lm(4,3)=&
8310
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
8311
character(25+99) ,parameter :: warning=&
8312
'WARNING from OneLOop d0: '//warnonshell
8313
if (initz) call init
8327
ap(ii) = areal(pp(ii))
8328
if (aimag(pp(ii)).ne.RZRO) then
8329
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8330
,'momentum with non-zero imaginary part, putting it to zero.'
8331
pp(ii) = acmplx( ap(ii) ,0 )
8333
ap(ii) = abs(ap(ii))
8334
if (ap(ii).gt.smax) smax = ap(ii)
8338
am(ii) = areal(mm(ii))
8340
if (hh.gt.RZRO) then
8341
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8342
,'mass-squared has positive imaginary part, switching its sign.'
8343
mm(ii) = acmplx( am(ii) ,-hh )
8345
am(ii) = abs(am(ii)) + abs(hh)
8346
if (am(ii).gt.smax) smax = am(ii)
8352
if (hh.gt.small) small=hh
8354
small = small*neglig(prcpar)
8358
mulocal2 = mulocal*mulocal
8360
if (smax.eq.RZRO) then
8361
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8362
,'all input equal zero, returning 0'
8363
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
8367
if (mulocal2.gt.smax) smax = mulocal2
8369
if (nonzerothrs) then
8372
if (ap(ii).lt.hh) ap(ii) = 0
8373
if (am(ii).lt.hh) am(ii) = 0
8376
hh = onshellthrs*smax
8377
if (wunit.gt.0) then
8379
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
8380
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
8386
min56 = min(ap(5),ap(6))
8387
if (min56.lt.hh) then
8388
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8389
,'input does not seem to represent hard kinematics, '&
8390
,'trying to permutate'
8391
min13=min(ap(1),ap(3))
8392
min24=min(ap(2),ap(4))
8393
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
8394
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
8396
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8397
,'no permutation helps, errors might follow'
8403
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
8405
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
8406
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
8407
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
8408
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
8409
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
8410
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
8411
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
8412
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
8413
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
8414
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
8415
icase = casetable(icase)
8417
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
8418
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
8419
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
8420
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
8421
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
8422
if (nonzerothrs) then
8423
if (s1r2.lt.hh) s1r2 = 0
8424
if (s2r2.lt.hh) s2r2 = 0
8425
if (s2r3.lt.hh) s2r3 = 0
8426
if (s3r4.lt.hh) s3r4 = 0
8427
if (s4r4.lt.hh) s4r4 = 0
8428
elseif (wunit.gt.0) then
8429
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
8430
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
8431
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
8432
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
8433
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
8436
if (icase.eq.4) then
8437
!4 non-zero internal masses
8438
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8439
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8440
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8441
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8442
.or.( areal(ss(1)).ge.-small &
8443
.and.areal(ss(2)).ge.-small &
8444
.and.areal(ss(3)).ge.-small &
8445
.and.areal(ss(4)).ge.-small) )
8447
call boxc( rslt ,ss,rr ,as ,smax )
8449
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
8451
elseif (icase.eq.3) then
8452
!3 non-zero internal masses
8453
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8454
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8455
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8456
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8457
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8458
.or.( areal(ss(1)).ge.-small &
8459
.and.areal(ss(2)).ge.-small &
8460
.and.areal(ss(3)).ge.-small &
8461
.and.areal(ss(4)).ge.-small) )
8463
call boxc( rslt ,ss,rr ,as ,smax )
8465
call boxf3( rslt, ss,rr )
8468
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
8470
elseif (icase.eq.5) then
8471
!2 non-zero internal masses, opposite case
8472
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8473
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8474
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
8476
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8478
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8479
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8481
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8483
elseif (icase.eq.2) then
8484
!2 non-zero internal masses, adjacent case
8485
if (as(1).ne.RZRO) then
8486
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
8487
elseif (s2r3.ne.RZRO) then
8488
if (s4r4.ne.RZRO) then
8489
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8491
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
8493
elseif (s4r4.ne.RZRO) then
8494
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8496
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8498
elseif (icase.eq.1) then
8499
!1 non-zero internal mass
8500
if (as(1).ne.RZRO) then
8501
if (as(2).ne.RZRO) then
8502
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
8504
if (s3r4.ne.RZRO) then
8505
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8507
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8510
elseif (as(2).ne.RZRO) then
8511
if (s4r4.ne.RZRO) then
8512
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8514
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8517
if (s3r4.ne.RZRO) then
8518
if (s4r4.ne.RZRO) then
8519
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8521
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8523
elseif (s4r4.ne.RZRO) then
8524
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8526
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
8530
!0 non-zero internal mass
8531
call box00( rslt ,ss ,as ,mulocal )
8533
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
8534
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
8536
if (punit.gt.0) then
8537
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
8538
write(punit,*) 'muscale:',trim(myprint(mulocal))
8539
write(punit,*) ' p1:',trim(myprint(p1))
8540
write(punit,*) ' p2:',trim(myprint(p2))
8541
write(punit,*) ' p3:',trim(myprint(p3))
8542
write(punit,*) ' p4:',trim(myprint(p4))
8543
write(punit,*) 'p12:',trim(myprint(p12))
8544
write(punit,*) 'p23:',trim(myprint(p23))
8545
write(punit,*) ' m1:',trim(myprint(m1))
8546
write(punit,*) ' m2:',trim(myprint(m2))
8547
write(punit,*) ' m3:',trim(myprint(m3))
8548
write(punit,*) ' m4:',trim(myprint(m4))
8549
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
8550
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
8551
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
8555
subroutine d0rc( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
8560
,intent(out) :: rslt(0:2)
8562
,intent(in) :: p1,p2,p3,p4,p12,p23
8564
,intent(in) :: m1,m2,m3,m4
8573
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
8575
:: mulocal,mulocal2,small,hh,min13,min24,min56
8576
integer :: icase,ii,jj
8578
integer ,parameter :: lp(6,3)=&
8579
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
8580
integer ,parameter :: lm(4,3)=&
8581
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
8582
character(25+99) ,parameter :: warning=&
8583
'WARNING from OneLOop d0: '//warnonshell
8584
if (initz) call init
8598
ap(ii) = abs(pp(ii))
8599
if (ap(ii).gt.smax) smax = ap(ii)
8603
am(ii) = areal(mm(ii))
8605
if (hh.gt.RZRO) then
8606
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8607
,'mass-squared has positive imaginary part, switching its sign.'
8608
mm(ii) = acmplx( am(ii) ,-hh )
8610
am(ii) = abs(am(ii)) + abs(hh)
8611
if (am(ii).gt.smax) smax = am(ii)
8617
if (hh.gt.small) small=hh
8619
small = small*neglig(prcpar)
8623
mulocal2 = mulocal*mulocal
8625
if (smax.eq.RZRO) then
8626
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8627
,'all input equal zero, returning 0'
8628
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
8632
if (mulocal2.gt.smax) smax = mulocal2
8634
if (nonzerothrs) then
8637
if (ap(ii).lt.hh) ap(ii) = 0
8638
if (am(ii).lt.hh) am(ii) = 0
8641
hh = onshellthrs*smax
8642
if (wunit.gt.0) then
8644
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
8645
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
8651
min56 = min(ap(5),ap(6))
8652
if (min56.lt.hh) then
8653
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8654
,'input does not seem to represent hard kinematics, '&
8655
,'trying to permutate'
8656
min13=min(ap(1),ap(3))
8657
min24=min(ap(2),ap(4))
8658
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
8659
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
8661
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8662
,'no permutation helps, errors might follow'
8668
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
8670
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
8671
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
8672
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
8673
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
8674
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
8675
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
8676
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
8677
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
8678
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
8679
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
8680
icase = casetable(icase)
8682
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
8683
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
8684
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
8685
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
8686
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
8687
if (nonzerothrs) then
8688
if (s1r2.lt.hh) s1r2 = 0
8689
if (s2r2.lt.hh) s2r2 = 0
8690
if (s2r3.lt.hh) s2r3 = 0
8691
if (s3r4.lt.hh) s3r4 = 0
8692
if (s4r4.lt.hh) s4r4 = 0
8693
elseif (wunit.gt.0) then
8694
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
8695
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
8696
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
8697
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
8698
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
8701
if (icase.eq.4) then
8702
!4 non-zero internal masses
8703
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8704
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8705
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8706
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8707
.or.( areal(ss(1)).ge.-small &
8708
.and.areal(ss(2)).ge.-small &
8709
.and.areal(ss(3)).ge.-small &
8710
.and.areal(ss(4)).ge.-small) )
8712
call boxc( rslt ,ss,rr ,as ,smax )
8714
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
8716
elseif (icase.eq.3) then
8717
!3 non-zero internal masses
8718
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8719
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8720
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8721
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8722
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8723
.or.( areal(ss(1)).ge.-small &
8724
.and.areal(ss(2)).ge.-small &
8725
.and.areal(ss(3)).ge.-small &
8726
.and.areal(ss(4)).ge.-small) )
8728
call boxc( rslt ,ss,rr ,as ,smax )
8730
call boxf3( rslt, ss,rr )
8733
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
8735
elseif (icase.eq.5) then
8736
!2 non-zero internal masses, opposite case
8737
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8738
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8739
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
8741
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8743
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
8744
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8746
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
8748
elseif (icase.eq.2) then
8749
!2 non-zero internal masses, adjacent case
8750
if (as(1).ne.RZRO) then
8751
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
8752
elseif (s2r3.ne.RZRO) then
8753
if (s4r4.ne.RZRO) then
8754
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8756
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
8758
elseif (s4r4.ne.RZRO) then
8759
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8761
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
8763
elseif (icase.eq.1) then
8764
!1 non-zero internal mass
8765
if (as(1).ne.RZRO) then
8766
if (as(2).ne.RZRO) then
8767
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
8769
if (s3r4.ne.RZRO) then
8770
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8772
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8775
elseif (as(2).ne.RZRO) then
8776
if (s4r4.ne.RZRO) then
8777
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8779
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8782
if (s3r4.ne.RZRO) then
8783
if (s4r4.ne.RZRO) then
8784
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8786
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
8788
elseif (s4r4.ne.RZRO) then
8789
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
8791
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
8795
!0 non-zero internal mass
8796
call box00( rslt ,ss ,as ,mulocal )
8798
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
8799
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
8801
if (punit.gt.0) then
8802
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
8803
write(punit,*) 'muscale:',trim(myprint(mulocal))
8804
write(punit,*) ' p1:',trim(myprint(p1))
8805
write(punit,*) ' p2:',trim(myprint(p2))
8806
write(punit,*) ' p3:',trim(myprint(p3))
8807
write(punit,*) ' p4:',trim(myprint(p4))
8808
write(punit,*) 'p12:',trim(myprint(p12))
8809
write(punit,*) 'p23:',trim(myprint(p23))
8810
write(punit,*) ' m1:',trim(myprint(m1))
8811
write(punit,*) ' m2:',trim(myprint(m2))
8812
write(punit,*) ' m3:',trim(myprint(m3))
8813
write(punit,*) ' m4:',trim(myprint(m4))
8814
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
8815
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
8816
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
8820
subroutine d0rcr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
8825
,intent(out) :: rslt(0:2)
8827
,intent(in) :: p1,p2,p3,p4,p12,p23
8829
,intent(in) :: m1,m2,m3,m4
8840
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
8842
:: mulocal,mulocal2,small,hh,min13,min24,min56
8843
integer :: icase,ii,jj
8845
integer ,parameter :: lp(6,3)=&
8846
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
8847
integer ,parameter :: lm(4,3)=&
8848
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
8849
character(25+99) ,parameter :: warning=&
8850
'WARNING from OneLOop d0: '//warnonshell
8851
if (initz) call init
8865
ap(ii) = abs(pp(ii))
8866
if (ap(ii).gt.smax) smax = ap(ii)
8870
am(ii) = areal(mm(ii))
8872
if (hh.gt.RZRO) then
8873
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8874
,'mass-squared has positive imaginary part, switching its sign.'
8875
mm(ii) = acmplx( am(ii) ,-hh )
8877
am(ii) = abs(am(ii)) + abs(hh)
8878
if (am(ii).gt.smax) smax = am(ii)
8884
if (hh.gt.small) small=hh
8886
small = small*neglig(prcpar)
8890
mulocal2 = mulocal*mulocal
8892
if (smax.eq.RZRO) then
8893
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
8894
,'all input equal zero, returning 0'
8895
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
8899
if (mulocal2.gt.smax) smax = mulocal2
8901
if (nonzerothrs) then
8904
if (ap(ii).lt.hh) ap(ii) = 0
8905
if (am(ii).lt.hh) am(ii) = 0
8908
hh = onshellthrs*smax
8909
if (wunit.gt.0) then
8911
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
8912
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
8918
min56 = min(ap(5),ap(6))
8919
if (min56.lt.hh) then
8920
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8921
,'input does not seem to represent hard kinematics, '&
8922
,'trying to permutate'
8923
min13=min(ap(1),ap(3))
8924
min24=min(ap(2),ap(4))
8925
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
8926
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
8928
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
8929
,'no permutation helps, errors might follow'
8935
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
8937
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
8938
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
8939
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
8940
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
8941
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
8942
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
8943
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
8944
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
8945
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
8946
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
8947
icase = casetable(icase)
8949
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
8950
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
8951
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
8952
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
8953
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
8954
if (nonzerothrs) then
8955
if (s1r2.lt.hh) s1r2 = 0
8956
if (s2r2.lt.hh) s2r2 = 0
8957
if (s2r3.lt.hh) s2r3 = 0
8958
if (s3r4.lt.hh) s3r4 = 0
8959
if (s4r4.lt.hh) s4r4 = 0
8960
elseif (wunit.gt.0) then
8961
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
8962
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
8963
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
8964
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
8965
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
8968
if (icase.eq.4) then
8969
!4 non-zero internal masses
8970
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8971
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8972
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8973
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8974
.or.( areal(ss(1)).ge.-small &
8975
.and.areal(ss(2)).ge.-small &
8976
.and.areal(ss(3)).ge.-small &
8977
.and.areal(ss(4)).ge.-small) )
8979
call boxc( rslt ,ss,rr ,as ,smax )
8981
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
8983
elseif (icase.eq.3) then
8984
!3 non-zero internal masses
8985
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
8986
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
8987
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
8988
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
8989
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
8990
.or.( areal(ss(1)).ge.-small &
8991
.and.areal(ss(2)).ge.-small &
8992
.and.areal(ss(3)).ge.-small &
8993
.and.areal(ss(4)).ge.-small) )
8995
call boxc( rslt ,ss,rr ,as ,smax )
8997
call boxf3( rslt, ss,rr )
9000
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
9002
elseif (icase.eq.5) then
9003
!2 non-zero internal masses, opposite case
9004
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9005
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9006
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
9008
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9010
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9011
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9013
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9015
elseif (icase.eq.2) then
9016
!2 non-zero internal masses, adjacent case
9017
if (as(1).ne.RZRO) then
9018
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
9019
elseif (s2r3.ne.RZRO) then
9020
if (s4r4.ne.RZRO) then
9021
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9023
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
9025
elseif (s4r4.ne.RZRO) then
9026
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9028
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9030
elseif (icase.eq.1) then
9031
!1 non-zero internal mass
9032
if (as(1).ne.RZRO) then
9033
if (as(2).ne.RZRO) then
9034
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
9036
if (s3r4.ne.RZRO) then
9037
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9039
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9042
elseif (as(2).ne.RZRO) then
9043
if (s4r4.ne.RZRO) then
9044
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9046
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9049
if (s3r4.ne.RZRO) then
9050
if (s4r4.ne.RZRO) then
9051
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9053
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9055
elseif (s4r4.ne.RZRO) then
9056
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9058
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
9062
!0 non-zero internal mass
9063
call box00( rslt ,ss ,as ,mulocal )
9065
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
9066
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
9068
if (punit.gt.0) then
9069
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
9070
write(punit,*) 'muscale:',trim(myprint(mulocal))
9071
write(punit,*) ' p1:',trim(myprint(p1))
9072
write(punit,*) ' p2:',trim(myprint(p2))
9073
write(punit,*) ' p3:',trim(myprint(p3))
9074
write(punit,*) ' p4:',trim(myprint(p4))
9075
write(punit,*) 'p12:',trim(myprint(p12))
9076
write(punit,*) 'p23:',trim(myprint(p23))
9077
write(punit,*) ' m1:',trim(myprint(m1))
9078
write(punit,*) ' m2:',trim(myprint(m2))
9079
write(punit,*) ' m3:',trim(myprint(m3))
9080
write(punit,*) ' m4:',trim(myprint(m4))
9081
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
9082
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
9083
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
9087
subroutine d0rr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
9092
,intent(out) :: rslt(0:2)
9094
,intent(in) :: p1,p2,p3,p4,p12,p23
9096
,intent(in) :: m1,m2,m3,m4
9105
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
9107
:: mulocal,mulocal2,small,hh,min13,min24,min56
9108
integer :: icase,ii,jj
9110
integer ,parameter :: lp(6,3)=&
9111
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
9112
integer ,parameter :: lm(4,3)=&
9113
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
9114
character(25+99) ,parameter :: warning=&
9115
'WARNING from OneLOop d0: '//warnonshell
9116
if (initz) call init
9130
ap(ii) = abs(pp(ii))
9131
if (ap(ii).gt.smax) smax = ap(ii)
9135
am(ii) = abs(mm(ii))
9136
if (am(ii).gt.smax) smax = am(ii)
9142
if (hh.gt.small) small=hh
9144
small = small*neglig(prcpar)
9148
mulocal2 = mulocal*mulocal
9150
if (smax.eq.RZRO) then
9151
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9152
,'all input equal zero, returning 0'
9153
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
9157
if (mulocal2.gt.smax) smax = mulocal2
9159
if (nonzerothrs) then
9162
if (ap(ii).lt.hh) ap(ii) = 0
9163
if (am(ii).lt.hh) am(ii) = 0
9166
hh = onshellthrs*smax
9167
if (wunit.gt.0) then
9169
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
9170
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
9176
min56 = min(ap(5),ap(6))
9177
if (min56.lt.hh) then
9178
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9179
,'input does not seem to represent hard kinematics, '&
9180
,'trying to permutate'
9181
min13=min(ap(1),ap(3))
9182
min24=min(ap(2),ap(4))
9183
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
9184
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
9186
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9187
,'no permutation helps, errors might follow'
9193
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
9195
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
9196
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
9197
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
9198
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
9199
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
9200
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
9201
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
9202
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
9203
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
9204
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
9205
icase = casetable(icase)
9207
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
9208
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
9209
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
9210
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
9211
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
9212
if (nonzerothrs) then
9213
if (s1r2.lt.hh) s1r2 = 0
9214
if (s2r2.lt.hh) s2r2 = 0
9215
if (s2r3.lt.hh) s2r3 = 0
9216
if (s3r4.lt.hh) s3r4 = 0
9217
if (s4r4.lt.hh) s4r4 = 0
9218
elseif (wunit.gt.0) then
9219
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
9220
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
9221
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
9222
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
9223
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
9226
if (icase.eq.4) then
9227
!4 non-zero internal masses
9228
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9229
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9230
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9231
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9232
.or.( areal(ss(1)).ge.-small &
9233
.and.areal(ss(2)).ge.-small &
9234
.and.areal(ss(3)).ge.-small &
9235
.and.areal(ss(4)).ge.-small) )
9237
call boxc( rslt ,ss,rr ,as ,smax )
9239
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
9241
elseif (icase.eq.3) then
9242
!3 non-zero internal masses
9243
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9244
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9245
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9246
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9247
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9248
.or.( areal(ss(1)).ge.-small &
9249
.and.areal(ss(2)).ge.-small &
9250
.and.areal(ss(3)).ge.-small &
9251
.and.areal(ss(4)).ge.-small) )
9253
call boxc( rslt ,ss,rr ,as ,smax )
9255
call boxf3( rslt, ss,rr )
9258
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
9260
elseif (icase.eq.5) then
9261
!2 non-zero internal masses, opposite case
9262
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9263
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9264
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
9266
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9268
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9269
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9271
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9273
elseif (icase.eq.2) then
9274
!2 non-zero internal masses, adjacent case
9275
if (as(1).ne.RZRO) then
9276
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
9277
elseif (s2r3.ne.RZRO) then
9278
if (s4r4.ne.RZRO) then
9279
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9281
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
9283
elseif (s4r4.ne.RZRO) then
9284
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9286
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9288
elseif (icase.eq.1) then
9289
!1 non-zero internal mass
9290
if (as(1).ne.RZRO) then
9291
if (as(2).ne.RZRO) then
9292
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
9294
if (s3r4.ne.RZRO) then
9295
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9297
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9300
elseif (as(2).ne.RZRO) then
9301
if (s4r4.ne.RZRO) then
9302
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9304
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9307
if (s3r4.ne.RZRO) then
9308
if (s4r4.ne.RZRO) then
9309
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9311
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9313
elseif (s4r4.ne.RZRO) then
9314
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9316
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
9320
!0 non-zero internal mass
9321
call box00( rslt ,ss ,as ,mulocal )
9323
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
9324
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
9326
if (punit.gt.0) then
9327
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
9328
write(punit,*) 'muscale:',trim(myprint(mulocal))
9329
write(punit,*) ' p1:',trim(myprint(p1))
9330
write(punit,*) ' p2:',trim(myprint(p2))
9331
write(punit,*) ' p3:',trim(myprint(p3))
9332
write(punit,*) ' p4:',trim(myprint(p4))
9333
write(punit,*) 'p12:',trim(myprint(p12))
9334
write(punit,*) 'p23:',trim(myprint(p23))
9335
write(punit,*) ' m1:',trim(myprint(m1))
9336
write(punit,*) ' m2:',trim(myprint(m2))
9337
write(punit,*) ' m3:',trim(myprint(m3))
9338
write(punit,*) ' m4:',trim(myprint(m4))
9339
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
9340
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
9341
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
9345
subroutine d0rrr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
9350
,intent(out) :: rslt(0:2)
9352
,intent(in) :: p1,p2,p3,p4,p12,p23
9354
,intent(in) :: m1,m2,m3,m4
9365
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
9367
:: mulocal,mulocal2,small,hh,min13,min24,min56
9368
integer :: icase,ii,jj
9370
integer ,parameter :: lp(6,3)=&
9371
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
9372
integer ,parameter :: lm(4,3)=&
9373
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
9374
character(25+99) ,parameter :: warning=&
9375
'WARNING from OneLOop d0: '//warnonshell
9376
if (initz) call init
9390
ap(ii) = abs(pp(ii))
9391
if (ap(ii).gt.smax) smax = ap(ii)
9395
am(ii) = abs(mm(ii))
9396
if (am(ii).gt.smax) smax = am(ii)
9402
if (hh.gt.small) small=hh
9404
small = small*neglig(prcpar)
9396
,intent(out) :: rslt(0:2)
9398
,intent(in) :: p1,p2,p3,p4,p12,p23
9400
,intent(in) :: m1,m2,m3,m4
9409
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
9411
:: mulocal,mulocal2,small,hh,min13,min24,min56
9412
integer :: icase,ii,jj
9414
integer ,parameter :: lp(6,3)=&
9415
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
9416
integer ,parameter :: lm(4,3)=&
9417
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
9418
character(25+99) ,parameter :: warning=&
9419
'WARNING from OneLOop d0: '//warnonshell
9420
if (initz) call init
9434
ap(ii) = areal(pp(ii))
9435
if (aimag(pp(ii)).ne.RZRO) then
9436
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9437
,'momentum with non-zero imaginary part, putting it to zero.'
9438
pp(ii) = acmplx( ap(ii) ,0 )
9440
ap(ii) = abs(ap(ii))
9441
if (ap(ii).gt.smax) smax = ap(ii)
9445
am(ii) = areal(mm(ii))
9447
if (hh.gt.RZRO) then
9448
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9449
,'mass-squared has positive imaginary part, switching its sign.'
9450
mm(ii) = acmplx( am(ii) ,-hh )
9452
am(ii) = abs(am(ii)) + abs(hh)
9453
if (am(ii).gt.smax) smax = am(ii)
9459
if (hh.gt.small) small=hh
9461
small = small*neglig(prcpar)
9465
mulocal2 = mulocal*mulocal
9467
if (smax.eq.RZRO) then
9468
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9469
,'all input equal zero, returning 0'
9470
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
9474
if (mulocal2.gt.smax) smax = mulocal2
9476
if (nonzerothrs) then
9479
if (ap(ii).lt.hh) ap(ii) = 0
9480
if (am(ii).lt.hh) am(ii) = 0
9483
hh = onshellthrs*smax
9484
if (wunit.gt.0) then
9486
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
9487
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
9493
min56 = min(ap(5),ap(6))
9494
if (min56.lt.hh) then
9495
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9496
,'input does not seem to represent hard kinematics, '&
9497
,'trying to permutate'
9498
min13=min(ap(1),ap(3))
9499
min24=min(ap(2),ap(4))
9500
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
9501
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
9503
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9504
,'no permutation helps, errors might follow'
9510
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
9512
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
9513
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
9514
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
9515
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
9516
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
9517
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
9518
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
9519
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
9520
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
9521
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
9522
icase = casetable(icase)
9524
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
9525
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
9526
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
9527
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
9528
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
9529
if (nonzerothrs) then
9530
if (s1r2.lt.hh) s1r2 = 0
9531
if (s2r2.lt.hh) s2r2 = 0
9532
if (s2r3.lt.hh) s2r3 = 0
9533
if (s3r4.lt.hh) s3r4 = 0
9534
if (s4r4.lt.hh) s4r4 = 0
9535
elseif (wunit.gt.0) then
9536
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
9537
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
9538
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
9539
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
9540
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
9543
if (icase.eq.4) then
9544
!4 non-zero internal masses
9545
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9546
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9547
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9548
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9549
.or.( areal(ss(1)).ge.-small &
9550
.and.areal(ss(2)).ge.-small &
9551
.and.areal(ss(3)).ge.-small &
9552
.and.areal(ss(4)).ge.-small) )
9554
call boxc( rslt ,ss,rr ,as ,smax )
9556
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
9558
elseif (icase.eq.3) then
9559
!3 non-zero internal masses
9560
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9561
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9562
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9563
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9564
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9565
.or.( areal(ss(1)).ge.-small &
9566
.and.areal(ss(2)).ge.-small &
9567
.and.areal(ss(3)).ge.-small &
9568
.and.areal(ss(4)).ge.-small) )
9570
call boxc( rslt ,ss,rr ,as ,smax )
9572
call boxf3( rslt, ss,rr )
9575
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
9577
elseif (icase.eq.5) then
9578
!2 non-zero internal masses, opposite case
9579
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9580
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9581
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
9583
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9585
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9586
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9588
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9590
elseif (icase.eq.2) then
9591
!2 non-zero internal masses, adjacent case
9592
if (as(1).ne.RZRO) then
9593
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
9594
elseif (s2r3.ne.RZRO) then
9595
if (s4r4.ne.RZRO) then
9596
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9598
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
9600
elseif (s4r4.ne.RZRO) then
9601
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9603
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9605
elseif (icase.eq.1) then
9606
!1 non-zero internal mass
9607
if (as(1).ne.RZRO) then
9608
if (as(2).ne.RZRO) then
9609
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
9611
if (s3r4.ne.RZRO) then
9612
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9614
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9617
elseif (as(2).ne.RZRO) then
9618
if (s4r4.ne.RZRO) then
9619
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9621
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9624
if (s3r4.ne.RZRO) then
9625
if (s4r4.ne.RZRO) then
9626
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9628
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9630
elseif (s4r4.ne.RZRO) then
9631
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9633
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
9637
!0 non-zero internal mass
9638
call box00( rslt ,ss ,as ,mulocal )
9640
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
9641
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
9643
if (punit.gt.0) then
9644
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
9645
write(punit,*) 'muscale:',trim(myprint(mulocal))
9646
write(punit,*) ' p1:',trim(myprint(p1))
9647
write(punit,*) ' p2:',trim(myprint(p2))
9648
write(punit,*) ' p3:',trim(myprint(p3))
9649
write(punit,*) ' p4:',trim(myprint(p4))
9650
write(punit,*) 'p12:',trim(myprint(p12))
9651
write(punit,*) 'p23:',trim(myprint(p23))
9652
write(punit,*) ' m1:',trim(myprint(m1))
9653
write(punit,*) ' m2:',trim(myprint(m2))
9654
write(punit,*) ' m3:',trim(myprint(m3))
9655
write(punit,*) ' m4:',trim(myprint(m4))
9656
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
9657
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
9658
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
9662
subroutine d0ccr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
9667
,intent(out) :: rslt(0:2)
9669
,intent(in) :: p1,p2,p3,p4,p12,p23
9671
,intent(in) :: m1,m2,m3,m4
9682
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
9684
:: mulocal,mulocal2,small,hh,min13,min24,min56
9685
integer :: icase,ii,jj
9687
integer ,parameter :: lp(6,3)=&
9688
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
9689
integer ,parameter :: lm(4,3)=&
9690
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
9691
character(25+99) ,parameter :: warning=&
9692
'WARNING from OneLOop d0: '//warnonshell
9693
if (initz) call init
9707
ap(ii) = areal(pp(ii))
9708
if (aimag(pp(ii)).ne.RZRO) then
9709
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9710
,'momentum with non-zero imaginary part, putting it to zero.'
9711
pp(ii) = acmplx( ap(ii) ,0 )
9713
ap(ii) = abs(ap(ii))
9714
if (ap(ii).gt.smax) smax = ap(ii)
9718
am(ii) = areal(mm(ii))
9720
if (hh.gt.RZRO) then
9721
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9722
,'mass-squared has positive imaginary part, switching its sign.'
9723
mm(ii) = acmplx( am(ii) ,-hh )
9725
am(ii) = abs(am(ii)) + abs(hh)
9726
if (am(ii).gt.smax) smax = am(ii)
9732
if (hh.gt.small) small=hh
9734
small = small*neglig(prcpar)
9738
mulocal2 = mulocal*mulocal
9740
if (smax.eq.RZRO) then
9741
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9742
,'all input equal zero, returning 0'
9743
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
9747
if (mulocal2.gt.smax) smax = mulocal2
9749
if (nonzerothrs) then
9752
if (ap(ii).lt.hh) ap(ii) = 0
9753
if (am(ii).lt.hh) am(ii) = 0
9756
hh = onshellthrs*smax
9757
if (wunit.gt.0) then
9759
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
9760
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
9766
min56 = min(ap(5),ap(6))
9767
if (min56.lt.hh) then
9768
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9769
,'input does not seem to represent hard kinematics, '&
9770
,'trying to permutate'
9771
min13=min(ap(1),ap(3))
9772
min24=min(ap(2),ap(4))
9773
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
9774
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
9776
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
9777
,'no permutation helps, errors might follow'
9783
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
9785
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
9786
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
9787
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
9788
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
9789
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
9790
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
9791
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
9792
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
9793
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
9794
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
9795
icase = casetable(icase)
9797
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
9798
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
9799
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
9800
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
9801
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
9802
if (nonzerothrs) then
9803
if (s1r2.lt.hh) s1r2 = 0
9804
if (s2r2.lt.hh) s2r2 = 0
9805
if (s2r3.lt.hh) s2r3 = 0
9806
if (s3r4.lt.hh) s3r4 = 0
9807
if (s4r4.lt.hh) s4r4 = 0
9808
elseif (wunit.gt.0) then
9809
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
9810
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
9811
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
9812
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
9813
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
9816
if (icase.eq.4) then
9817
!4 non-zero internal masses
9818
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9819
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9820
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9821
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9822
.or.( areal(ss(1)).ge.-small &
9823
.and.areal(ss(2)).ge.-small &
9824
.and.areal(ss(3)).ge.-small &
9825
.and.areal(ss(4)).ge.-small) )
9827
call boxc( rslt ,ss,rr ,as ,smax )
9829
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
9831
elseif (icase.eq.3) then
9832
!3 non-zero internal masses
9833
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9834
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
9835
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
9836
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
9837
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
9838
.or.( areal(ss(1)).ge.-small &
9839
.and.areal(ss(2)).ge.-small &
9840
.and.areal(ss(3)).ge.-small &
9841
.and.areal(ss(4)).ge.-small) )
9843
call boxc( rslt ,ss,rr ,as ,smax )
9845
call boxf3( rslt, ss,rr )
9848
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
9850
elseif (icase.eq.5) then
9851
!2 non-zero internal masses, opposite case
9852
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
9853
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9854
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
9856
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9858
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
9859
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9861
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
9863
elseif (icase.eq.2) then
9864
!2 non-zero internal masses, adjacent case
9865
if (as(1).ne.RZRO) then
9866
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
9867
elseif (s2r3.ne.RZRO) then
9868
if (s4r4.ne.RZRO) then
9869
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9871
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
9873
elseif (s4r4.ne.RZRO) then
9874
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9876
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
9878
elseif (icase.eq.1) then
9879
!1 non-zero internal mass
9880
if (as(1).ne.RZRO) then
9881
if (as(2).ne.RZRO) then
9882
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
9884
if (s3r4.ne.RZRO) then
9885
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9887
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9890
elseif (as(2).ne.RZRO) then
9891
if (s4r4.ne.RZRO) then
9892
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9894
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9897
if (s3r4.ne.RZRO) then
9898
if (s4r4.ne.RZRO) then
9899
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9901
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
9903
elseif (s4r4.ne.RZRO) then
9904
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
9906
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
9910
!0 non-zero internal mass
9911
call box00( rslt ,ss ,as ,mulocal )
9913
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
9914
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
9916
if (punit.gt.0) then
9917
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
9918
write(punit,*) 'muscale:',trim(myprint(mulocal))
9919
write(punit,*) ' p1:',trim(myprint(p1))
9920
write(punit,*) ' p2:',trim(myprint(p2))
9921
write(punit,*) ' p3:',trim(myprint(p3))
9922
write(punit,*) ' p4:',trim(myprint(p4))
9923
write(punit,*) 'p12:',trim(myprint(p12))
9924
write(punit,*) 'p23:',trim(myprint(p23))
9925
write(punit,*) ' m1:',trim(myprint(m1))
9926
write(punit,*) ' m2:',trim(myprint(m2))
9927
write(punit,*) ' m3:',trim(myprint(m3))
9928
write(punit,*) ' m4:',trim(myprint(m4))
9929
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
9930
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
9931
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
9935
subroutine d0rc( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
9940
,intent(out) :: rslt(0:2)
9942
,intent(in) :: p1,p2,p3,p4,p12,p23
9944
,intent(in) :: m1,m2,m3,m4
9953
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
9955
:: mulocal,mulocal2,small,hh,min13,min24,min56
9956
integer :: icase,ii,jj
9958
integer ,parameter :: lp(6,3)=&
9959
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
9960
integer ,parameter :: lm(4,3)=&
9961
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
9962
character(25+99) ,parameter :: warning=&
9963
'WARNING from OneLOop d0: '//warnonshell
9964
if (initz) call init
9978
ap(ii) = abs(pp(ii))
9979
if (ap(ii).gt.smax) smax = ap(ii)
9983
am(ii) = areal(mm(ii))
9985
if (hh.gt.RZRO) then
9986
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
9987
,'mass-squared has positive imaginary part, switching its sign.'
9988
mm(ii) = acmplx( am(ii) ,-hh )
9990
am(ii) = abs(am(ii)) + abs(hh)
9991
if (am(ii).gt.smax) smax = am(ii)
9997
if (hh.gt.small) small=hh
9999
small = small*neglig(prcpar)
10003
mulocal2 = mulocal*mulocal
10005
if (smax.eq.RZRO) then
10006
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
10007
,'all input equal zero, returning 0'
10008
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
10012
if (mulocal2.gt.smax) smax = mulocal2
10014
if (nonzerothrs) then
10017
if (ap(ii).lt.hh) ap(ii) = 0
10018
if (am(ii).lt.hh) am(ii) = 0
10021
hh = onshellthrs*smax
10022
if (wunit.gt.0) then
10024
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
10025
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
10031
min56 = min(ap(5),ap(6))
10032
if (min56.lt.hh) then
10033
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10034
,'input does not seem to represent hard kinematics, '&
10035
,'trying to permutate'
10036
min13=min(ap(1),ap(3))
10037
min24=min(ap(2),ap(4))
10038
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
10039
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
10041
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10042
,'no permutation helps, errors might follow'
10048
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
10050
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
10051
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
10052
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
10053
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
10054
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
10055
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
10056
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
10057
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
10058
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
10059
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
10060
icase = casetable(icase)
10062
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
10063
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
10064
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
10065
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
10066
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
10067
if (nonzerothrs) then
10068
if (s1r2.lt.hh) s1r2 = 0
10069
if (s2r2.lt.hh) s2r2 = 0
10070
if (s2r3.lt.hh) s2r3 = 0
10071
if (s3r4.lt.hh) s3r4 = 0
10072
if (s4r4.lt.hh) s4r4 = 0
10073
elseif (wunit.gt.0) then
10074
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
10075
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
10076
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
10077
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
10078
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
10081
if (icase.eq.4) then
10082
!4 non-zero internal masses
10083
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10084
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10085
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10086
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10087
.or.( areal(ss(1)).ge.-small &
10088
.and.areal(ss(2)).ge.-small &
10089
.and.areal(ss(3)).ge.-small &
10090
.and.areal(ss(4)).ge.-small) )
10092
call boxc( rslt ,ss,rr ,as ,smax )
10094
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
10096
elseif (icase.eq.3) then
10097
!3 non-zero internal masses
10098
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10099
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10100
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10101
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10102
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10103
.or.( areal(ss(1)).ge.-small &
10104
.and.areal(ss(2)).ge.-small &
10105
.and.areal(ss(3)).ge.-small &
10106
.and.areal(ss(4)).ge.-small) )
10108
call boxc( rslt ,ss,rr ,as ,smax )
10110
call boxf3( rslt, ss,rr )
10113
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
10115
elseif (icase.eq.5) then
10116
!2 non-zero internal masses, opposite case
10117
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10118
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10119
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
10121
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10123
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10124
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10126
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10128
elseif (icase.eq.2) then
10129
!2 non-zero internal masses, adjacent case
10130
if (as(1).ne.RZRO) then
10131
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
10132
elseif (s2r3.ne.RZRO) then
10133
if (s4r4.ne.RZRO) then
10134
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10136
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
10138
elseif (s4r4.ne.RZRO) then
10139
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10141
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10143
elseif (icase.eq.1) then
10144
!1 non-zero internal mass
10145
if (as(1).ne.RZRO) then
10146
if (as(2).ne.RZRO) then
10147
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
10149
if (s3r4.ne.RZRO) then
10150
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10152
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10155
elseif (as(2).ne.RZRO) then
10156
if (s4r4.ne.RZRO) then
10157
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10159
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10162
if (s3r4.ne.RZRO) then
10163
if (s4r4.ne.RZRO) then
10164
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10166
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10168
elseif (s4r4.ne.RZRO) then
10169
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10171
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
10175
!0 non-zero internal mass
10176
call box00( rslt ,ss ,as ,mulocal )
10178
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
10179
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
10181
if (punit.gt.0) then
10182
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
10183
write(punit,*) 'muscale:',trim(myprint(mulocal))
10184
write(punit,*) ' p1:',trim(myprint(p1))
10185
write(punit,*) ' p2:',trim(myprint(p2))
10186
write(punit,*) ' p3:',trim(myprint(p3))
10187
write(punit,*) ' p4:',trim(myprint(p4))
10188
write(punit,*) 'p12:',trim(myprint(p12))
10189
write(punit,*) 'p23:',trim(myprint(p23))
10190
write(punit,*) ' m1:',trim(myprint(m1))
10191
write(punit,*) ' m2:',trim(myprint(m2))
10192
write(punit,*) ' m3:',trim(myprint(m3))
10193
write(punit,*) ' m4:',trim(myprint(m4))
10194
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
10195
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
10196
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
10200
subroutine d0rcr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
10202
use avh_olo_dp_boxc
10205
,intent(out) :: rslt(0:2)
10207
,intent(in) :: p1,p2,p3,p4,p12,p23
10209
,intent(in) :: m1,m2,m3,m4
10220
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
10222
:: mulocal,mulocal2,small,hh,min13,min24,min56
10223
integer :: icase,ii,jj
10225
integer ,parameter :: lp(6,3)=&
10226
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
10227
integer ,parameter :: lm(4,3)=&
10228
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
10229
character(25+99) ,parameter :: warning=&
10230
'WARNING from OneLOop d0: '//warnonshell
10231
if (initz) call init
10245
ap(ii) = abs(pp(ii))
10246
if (ap(ii).gt.smax) smax = ap(ii)
10250
am(ii) = areal(mm(ii))
10252
if (hh.gt.RZRO) then
10253
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
10254
,'mass-squared has positive imaginary part, switching its sign.'
10255
mm(ii) = acmplx( am(ii) ,-hh )
10257
am(ii) = abs(am(ii)) + abs(hh)
10258
if (am(ii).gt.smax) smax = am(ii)
10264
if (hh.gt.small) small=hh
10266
small = small*neglig(prcpar)
10270
mulocal2 = mulocal*mulocal
10272
if (smax.eq.RZRO) then
10273
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
10274
,'all input equal zero, returning 0'
10275
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
10279
if (mulocal2.gt.smax) smax = mulocal2
10281
if (nonzerothrs) then
10284
if (ap(ii).lt.hh) ap(ii) = 0
10285
if (am(ii).lt.hh) am(ii) = 0
10288
hh = onshellthrs*smax
10289
if (wunit.gt.0) then
10291
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
10292
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
10298
min56 = min(ap(5),ap(6))
10299
if (min56.lt.hh) then
10300
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10301
,'input does not seem to represent hard kinematics, '&
10302
,'trying to permutate'
10303
min13=min(ap(1),ap(3))
10304
min24=min(ap(2),ap(4))
10305
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
10306
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
10308
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10309
,'no permutation helps, errors might follow'
10315
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
10317
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
10318
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
10319
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
10320
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
10321
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
10322
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
10323
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
10324
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
10325
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
10326
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
10327
icase = casetable(icase)
10329
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
10330
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
10331
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
10332
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
10333
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
10334
if (nonzerothrs) then
10335
if (s1r2.lt.hh) s1r2 = 0
10336
if (s2r2.lt.hh) s2r2 = 0
10337
if (s2r3.lt.hh) s2r3 = 0
10338
if (s3r4.lt.hh) s3r4 = 0
10339
if (s4r4.lt.hh) s4r4 = 0
10340
elseif (wunit.gt.0) then
10341
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
10342
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
10343
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
10344
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
10345
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
10348
if (icase.eq.4) then
10349
!4 non-zero internal masses
10350
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10351
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10352
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10353
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10354
.or.( areal(ss(1)).ge.-small &
10355
.and.areal(ss(2)).ge.-small &
10356
.and.areal(ss(3)).ge.-small &
10357
.and.areal(ss(4)).ge.-small) )
10359
call boxc( rslt ,ss,rr ,as ,smax )
10361
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
10363
elseif (icase.eq.3) then
10364
!3 non-zero internal masses
10365
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10366
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10367
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10368
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10369
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10370
.or.( areal(ss(1)).ge.-small &
10371
.and.areal(ss(2)).ge.-small &
10372
.and.areal(ss(3)).ge.-small &
10373
.and.areal(ss(4)).ge.-small) )
10375
call boxc( rslt ,ss,rr ,as ,smax )
10377
call boxf3( rslt, ss,rr )
10380
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
10382
elseif (icase.eq.5) then
10383
!2 non-zero internal masses, opposite case
10384
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10385
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10386
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
10388
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10390
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10391
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10393
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10395
elseif (icase.eq.2) then
10396
!2 non-zero internal masses, adjacent case
10397
if (as(1).ne.RZRO) then
10398
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
10399
elseif (s2r3.ne.RZRO) then
10400
if (s4r4.ne.RZRO) then
10401
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10403
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
10405
elseif (s4r4.ne.RZRO) then
10406
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10408
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10410
elseif (icase.eq.1) then
10411
!1 non-zero internal mass
10412
if (as(1).ne.RZRO) then
10413
if (as(2).ne.RZRO) then
10414
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
10416
if (s3r4.ne.RZRO) then
10417
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10419
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10422
elseif (as(2).ne.RZRO) then
10423
if (s4r4.ne.RZRO) then
10424
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10426
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10429
if (s3r4.ne.RZRO) then
10430
if (s4r4.ne.RZRO) then
10431
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10433
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10435
elseif (s4r4.ne.RZRO) then
10436
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10438
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
10442
!0 non-zero internal mass
10443
call box00( rslt ,ss ,as ,mulocal )
10445
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
10446
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
10448
if (punit.gt.0) then
10449
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
10450
write(punit,*) 'muscale:',trim(myprint(mulocal))
10451
write(punit,*) ' p1:',trim(myprint(p1))
10452
write(punit,*) ' p2:',trim(myprint(p2))
10453
write(punit,*) ' p3:',trim(myprint(p3))
10454
write(punit,*) ' p4:',trim(myprint(p4))
10455
write(punit,*) 'p12:',trim(myprint(p12))
10456
write(punit,*) 'p23:',trim(myprint(p23))
10457
write(punit,*) ' m1:',trim(myprint(m1))
10458
write(punit,*) ' m2:',trim(myprint(m2))
10459
write(punit,*) ' m3:',trim(myprint(m3))
10460
write(punit,*) ' m4:',trim(myprint(m4))
10461
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
10462
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
10463
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
10467
subroutine d0rr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
10469
use avh_olo_dp_boxc
10472
,intent(out) :: rslt(0:2)
10474
,intent(in) :: p1,p2,p3,p4,p12,p23
10476
,intent(in) :: m1,m2,m3,m4
10485
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
10487
:: mulocal,mulocal2,small,hh,min13,min24,min56
10488
integer :: icase,ii,jj
10490
integer ,parameter :: lp(6,3)=&
10491
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
10492
integer ,parameter :: lm(4,3)=&
10493
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
10494
character(25+99) ,parameter :: warning=&
10495
'WARNING from OneLOop d0: '//warnonshell
10496
if (initz) call init
10510
ap(ii) = abs(pp(ii))
10511
if (ap(ii).gt.smax) smax = ap(ii)
10515
am(ii) = abs(mm(ii))
10516
if (am(ii).gt.smax) smax = am(ii)
10522
if (hh.gt.small) small=hh
10524
small = small*neglig(prcpar)
10528
mulocal2 = mulocal*mulocal
10530
if (smax.eq.RZRO) then
10531
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
10532
,'all input equal zero, returning 0'
10533
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
10537
if (mulocal2.gt.smax) smax = mulocal2
10539
if (nonzerothrs) then
10542
if (ap(ii).lt.hh) ap(ii) = 0
10543
if (am(ii).lt.hh) am(ii) = 0
10546
hh = onshellthrs*smax
10547
if (wunit.gt.0) then
10549
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
10550
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
10556
min56 = min(ap(5),ap(6))
10557
if (min56.lt.hh) then
10558
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10559
,'input does not seem to represent hard kinematics, '&
10560
,'trying to permutate'
10561
min13=min(ap(1),ap(3))
10562
min24=min(ap(2),ap(4))
10563
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
10564
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
10566
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10567
,'no permutation helps, errors might follow'
10573
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
10575
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
10576
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
10577
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
10578
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
10579
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
10580
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
10581
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
10582
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
10583
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
10584
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
10585
icase = casetable(icase)
10587
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
10588
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
10589
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
10590
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
10591
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
10592
if (nonzerothrs) then
10593
if (s1r2.lt.hh) s1r2 = 0
10594
if (s2r2.lt.hh) s2r2 = 0
10595
if (s2r3.lt.hh) s2r3 = 0
10596
if (s3r4.lt.hh) s3r4 = 0
10597
if (s4r4.lt.hh) s4r4 = 0
10598
elseif (wunit.gt.0) then
10599
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
10600
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
10601
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
10602
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
10603
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
10606
if (icase.eq.4) then
10607
!4 non-zero internal masses
10608
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10609
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10610
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10611
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10612
.or.( areal(ss(1)).ge.-small &
10613
.and.areal(ss(2)).ge.-small &
10614
.and.areal(ss(3)).ge.-small &
10615
.and.areal(ss(4)).ge.-small) )
10617
call boxc( rslt ,ss,rr ,as ,smax )
10619
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
10621
elseif (icase.eq.3) then
10622
!3 non-zero internal masses
10623
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10624
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10625
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10626
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10627
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10628
.or.( areal(ss(1)).ge.-small &
10629
.and.areal(ss(2)).ge.-small &
10630
.and.areal(ss(3)).ge.-small &
10631
.and.areal(ss(4)).ge.-small) )
10633
call boxc( rslt ,ss,rr ,as ,smax )
10635
call boxf3( rslt, ss,rr )
10638
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
10640
elseif (icase.eq.5) then
10641
!2 non-zero internal masses, opposite case
10642
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10643
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10644
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
10646
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10648
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10649
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10651
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10653
elseif (icase.eq.2) then
10654
!2 non-zero internal masses, adjacent case
10655
if (as(1).ne.RZRO) then
10656
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
10657
elseif (s2r3.ne.RZRO) then
10658
if (s4r4.ne.RZRO) then
10659
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10661
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
10663
elseif (s4r4.ne.RZRO) then
10664
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10666
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10668
elseif (icase.eq.1) then
10669
!1 non-zero internal mass
10670
if (as(1).ne.RZRO) then
10671
if (as(2).ne.RZRO) then
10672
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
10674
if (s3r4.ne.RZRO) then
10675
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10677
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10680
elseif (as(2).ne.RZRO) then
10681
if (s4r4.ne.RZRO) then
10682
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10684
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10687
if (s3r4.ne.RZRO) then
10688
if (s4r4.ne.RZRO) then
10689
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10691
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10693
elseif (s4r4.ne.RZRO) then
10694
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10696
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
10700
!0 non-zero internal mass
10701
call box00( rslt ,ss ,as ,mulocal )
10703
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
10704
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
10706
if (punit.gt.0) then
10707
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
10708
write(punit,*) 'muscale:',trim(myprint(mulocal))
10709
write(punit,*) ' p1:',trim(myprint(p1))
10710
write(punit,*) ' p2:',trim(myprint(p2))
10711
write(punit,*) ' p3:',trim(myprint(p3))
10712
write(punit,*) ' p4:',trim(myprint(p4))
10713
write(punit,*) 'p12:',trim(myprint(p12))
10714
write(punit,*) 'p23:',trim(myprint(p23))
10715
write(punit,*) ' m1:',trim(myprint(m1))
10716
write(punit,*) ' m2:',trim(myprint(m2))
10717
write(punit,*) ' m3:',trim(myprint(m3))
10718
write(punit,*) ' m4:',trim(myprint(m4))
10719
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
10720
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
10721
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
10725
subroutine d0rrr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
10727
use avh_olo_dp_boxc
10730
,intent(out) :: rslt(0:2)
10732
,intent(in) :: p1,p2,p3,p4,p12,p23
10734
,intent(in) :: m1,m2,m3,m4
10745
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
10747
:: mulocal,mulocal2,small,hh,min13,min24,min56
10748
integer :: icase,ii,jj
10750
integer ,parameter :: lp(6,3)=&
10751
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
10752
integer ,parameter :: lm(4,3)=&
10753
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
10754
character(25+99) ,parameter :: warning=&
10755
'WARNING from OneLOop d0: '//warnonshell
10756
if (initz) call init
10770
ap(ii) = abs(pp(ii))
10771
if (ap(ii).gt.smax) smax = ap(ii)
10775
am(ii) = abs(mm(ii))
10776
if (am(ii).gt.smax) smax = am(ii)
10782
if (hh.gt.small) small=hh
10784
small = small*neglig(prcpar)
10788
mulocal2 = mulocal*mulocal
10790
if (smax.eq.RZRO) then
10791
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
10792
,'all input equal zero, returning 0'
10793
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
10797
if (mulocal2.gt.smax) smax = mulocal2
10799
if (nonzerothrs) then
10802
if (ap(ii).lt.hh) ap(ii) = 0
10803
if (am(ii).lt.hh) am(ii) = 0
10806
hh = onshellthrs*smax
10807
if (wunit.gt.0) then
10809
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
10810
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
10816
min56 = min(ap(5),ap(6))
10817
if (min56.lt.hh) then
10818
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10819
,'input does not seem to represent hard kinematics, '&
10820
,'trying to permutate'
10821
min13=min(ap(1),ap(3))
10822
min24=min(ap(2),ap(4))
10823
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
10824
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
10826
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
10827
,'no permutation helps, errors might follow'
10833
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
10835
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
10836
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
10837
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
10838
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
10839
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
10840
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
10841
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
10842
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
10843
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
10844
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
10845
icase = casetable(icase)
10847
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
10848
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
10849
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
10850
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
10851
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
10852
if (nonzerothrs) then
10853
if (s1r2.lt.hh) s1r2 = 0
10854
if (s2r2.lt.hh) s2r2 = 0
10855
if (s2r3.lt.hh) s2r3 = 0
10856
if (s3r4.lt.hh) s3r4 = 0
10857
if (s4r4.lt.hh) s4r4 = 0
10858
elseif (wunit.gt.0) then
10859
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
10860
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
10861
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
10862
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
10863
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
10866
if (icase.eq.4) then
10867
!4 non-zero internal masses
10868
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10869
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10870
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10871
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10872
.or.( areal(ss(1)).ge.-small &
10873
.and.areal(ss(2)).ge.-small &
10874
.and.areal(ss(3)).ge.-small &
10875
.and.areal(ss(4)).ge.-small) )
10877
call boxc( rslt ,ss,rr ,as ,smax )
10879
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
10881
elseif (icase.eq.3) then
10882
!3 non-zero internal masses
10883
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10884
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
10885
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
10886
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
10887
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
10888
.or.( areal(ss(1)).ge.-small &
10889
.and.areal(ss(2)).ge.-small &
10890
.and.areal(ss(3)).ge.-small &
10891
.and.areal(ss(4)).ge.-small) )
10893
call boxc( rslt ,ss,rr ,as ,smax )
10895
call boxf3( rslt, ss,rr )
10898
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
10900
elseif (icase.eq.5) then
10901
!2 non-zero internal masses, opposite case
10902
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
10903
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10904
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
10906
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10908
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
10909
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10911
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
10913
elseif (icase.eq.2) then
10914
!2 non-zero internal masses, adjacent case
10915
if (as(1).ne.RZRO) then
10916
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
10917
elseif (s2r3.ne.RZRO) then
10918
if (s4r4.ne.RZRO) then
10919
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10921
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
10923
elseif (s4r4.ne.RZRO) then
10924
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10926
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
10928
elseif (icase.eq.1) then
10929
!1 non-zero internal mass
10930
if (as(1).ne.RZRO) then
10931
if (as(2).ne.RZRO) then
10932
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
10934
if (s3r4.ne.RZRO) then
10935
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10937
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10940
elseif (as(2).ne.RZRO) then
10941
if (s4r4.ne.RZRO) then
10942
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10944
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10947
if (s3r4.ne.RZRO) then
10948
if (s4r4.ne.RZRO) then
10949
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10951
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
10953
elseif (s4r4.ne.RZRO) then
10954
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
10956
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
10960
!0 non-zero internal mass
10961
call box00( rslt ,ss ,as ,mulocal )
10963
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
10964
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
10966
if (punit.gt.0) then
10967
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
10968
write(punit,*) 'muscale:',trim(myprint(mulocal))
10969
write(punit,*) ' p1:',trim(myprint(p1))
10970
write(punit,*) ' p2:',trim(myprint(p2))
10971
write(punit,*) ' p3:',trim(myprint(p3))
10972
write(punit,*) ' p4:',trim(myprint(p4))
10973
write(punit,*) 'p12:',trim(myprint(p12))
10974
write(punit,*) 'p23:',trim(myprint(p23))
10975
write(punit,*) ' m1:',trim(myprint(m1))
10976
write(punit,*) ' m2:',trim(myprint(m2))
10977
write(punit,*) ' m3:',trim(myprint(m3))
10978
write(punit,*) ' m4:',trim(myprint(m4))
10979
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
10980
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
10981
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
10988
module avh_olo_qp_kinds
10989
integer ,parameter :: kindr2=16
10993
module avh_olo_qp_arrays
10995
use avh_olo_qp_kinds
10998
public :: shift1,shift2,shift3,resize,enlarge
11000
! Increase the size of the last dimension by one,
11001
! and move x(...,n:nsize) to x(...,n+1:nsize+1).
11002
interface shift1 ! for x(:)
11003
module procedure shift1_r,shift1_i
11005
interface shift2 ! for x(:,:)
11006
module procedure shift2_r,shift2_i
11008
interface shift3 ! for x(:,:,:)
11009
module procedure shift3_r,shift3_i
11012
! Resize x to the new bounds. Anything that doesn't fit anymore is lost.
11014
module procedure resize1_r,resize2_r
11017
! Resize x to the maximum of the bounds it has and then new bounds.
11019
module procedure enlarge1_r,enlarge2_r
11024
subroutine shift1_r( xx ,nn )
11026
,allocatable ,intent(inout) :: xx(:)
11027
integer ,intent(in ) :: nn
11029
,allocatable :: tt(:)
11030
integer ,parameter :: dm=1
11031
integer :: lb(dm),ub(dm)
11032
if (.not.allocated(xx)) then
11033
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift1_r'
11036
lb=lbound(xx) ;ub=ubound(xx)
11037
allocate(tt(lb(dm):ub(dm)))
11041
allocate(xx(lb(dm):ub(dm)))
11042
xx(lb(dm):nn-1) = tt(lb(dm):nn-1)
11043
xx(nn+1:ub(dm)) = tt(nn:ub(dm)-1)
11047
subroutine shift1_i( xx ,nn )
11048
integer ,allocatable ,intent(inout) :: xx(:)
11049
integer ,intent(in ) :: nn
11050
integer ,allocatable :: tt(:)
11051
integer ,parameter :: dm=1
11052
integer :: lb(dm),ub(dm)
11053
if (.not.allocated(xx)) then
11054
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift1_i'
11057
lb=lbound(xx) ;ub=ubound(xx)
11058
allocate(tt(lb(dm):ub(dm)))
11062
allocate(xx(lb(dm):ub(dm)))
11063
xx(lb(dm):nn-1) = tt(lb(dm):nn-1)
11064
xx(nn+1:ub(dm)) = tt(nn:ub(dm)-1)
11068
subroutine shift2_r( xx ,nn )
11070
,allocatable ,intent(inout) :: xx(:,:)
11071
integer ,intent(in ) :: nn
11073
,allocatable :: tt(:,:)
11074
integer ,parameter :: dm=2
11075
integer :: lb(dm),ub(dm)
11076
if (.not.allocated(xx)) then
11077
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift2_r'
11080
lb=lbound(xx) ;ub=ubound(xx)
11081
allocate(tt(lb(1):ub(1),lb(dm):ub(dm)))
11085
allocate(xx(lb(1):ub(1),lb(dm):ub(dm)))
11086
xx(:,lb(dm):nn-1) = tt(:,lb(dm):nn-1)
11087
xx(:,nn+1:ub(dm)) = tt(:,nn:ub(dm)-1)
11091
subroutine shift2_i( xx ,nn )
11092
integer ,allocatable ,intent(inout) :: xx(:,:)
11093
integer ,intent(in ) :: nn
11094
integer ,allocatable :: tt(:,:)
11095
integer ,parameter :: dm=2
11096
integer :: lb(dm),ub(dm)
11097
if (.not.allocated(xx)) then
11098
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift2_i'
11101
lb=lbound(xx) ;ub=ubound(xx)
11102
allocate(tt(lb(1):ub(1),lb(dm):ub(dm)))
11106
allocate(xx(lb(1):ub(1),lb(dm):ub(dm)))
11107
xx(:,lb(dm):nn-1) = tt(:,lb(dm):nn-1)
11108
xx(:,nn+1:ub(dm)) = tt(:,nn:ub(dm)-1)
11112
subroutine shift3_r( xx ,nn )
11114
,allocatable ,intent(inout) :: xx(:,:,:)
11115
integer ,intent(in ) :: nn
11117
,allocatable :: tt(:,:,:)
11118
integer ,parameter :: dm=3
11119
integer :: lb(dm),ub(dm)
11120
if (.not.allocated(xx)) then
11121
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift3_r'
11124
lb=lbound(xx) ;ub=ubound(xx)
11125
allocate(tt(lb(1):ub(1),lb(2):ub(2),lb(dm):ub(dm)))
11129
allocate(xx(lb(1):ub(1),lb(2):ub(2),lb(dm):ub(dm)))
11130
xx(:,:,lb(dm):nn-1) = tt(:,:,lb(dm):nn-1)
11131
xx(:,:,nn+1:ub(dm)) = tt(:,:,nn:ub(dm)-1)
11135
subroutine shift3_i( xx ,nn )
11136
integer ,allocatable ,intent(inout) :: xx(:,:,:)
11137
integer ,intent(in ) :: nn
11138
integer ,allocatable :: tt(:,:,:)
11139
integer ,parameter :: dm=3
11140
integer :: lb(dm),ub(dm)
11141
if (.not.allocated(xx)) then
11142
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop shift3_i'
11145
lb=lbound(xx) ;ub=ubound(xx)
11146
allocate(tt(lb(1):ub(1),lb(2):ub(2),lb(dm):ub(dm)))
11150
allocate(xx(lb(1):ub(1),lb(2):ub(2),lb(dm):ub(dm)))
11151
xx(:,:,lb(dm):nn-1) = tt(:,:,lb(dm):nn-1)
11152
xx(:,:,nn+1:ub(dm)) = tt(:,:,nn:ub(dm)-1)
11157
subroutine resize1_r( xx ,l1,u1 )
11159
,allocatable ,intent(inout) :: xx(:)
11160
integer ,intent(in ) :: l1,u1
11162
,allocatable :: tt(:)
11163
integer :: lb(1),ub(1)
11164
if (.not.allocated(xx)) then
11165
allocate(xx(l1:u1))
11168
lb=lbound(xx) ;ub=ubound(xx)
11169
allocate(tt(lb(1):ub(1)))
11172
allocate( xx(l1:u1) )
11173
lb(1)=max(l1,lb(1)) ;ub(1)=min(u1,ub(1))
11174
xx(lb(1):ub(1)) = tt(lb(1):ub(1))
11178
subroutine resize2_r( xx ,l1,u1 ,l2,u2 )
11180
,allocatable ,intent(inout) :: xx(:,:)
11181
integer ,intent(in ) :: l1,u1,l2,u2
11183
,allocatable :: tt(:,:)
11184
integer :: lb(2),ub(2)
11185
if (.not.allocated(xx)) then
11186
allocate(xx(l1:u1,l2:u2))
11189
lb=lbound(xx) ;ub=ubound(xx)
11190
allocate(tt(lb(1):ub(1),lb(2):ub(2)))
11193
allocate( xx(l1:u1,l2:u2) )
11194
lb(1)=max(l1,lb(1)) ;ub(1)=min(u1,ub(1))
11195
lb(2)=max(l2,lb(2)) ;ub(2)=min(u2,ub(2))
11196
xx(lb(1):ub(1),lb(2):ub(2)) = &
11197
tt(lb(1):ub(1),lb(2):ub(2))
11202
subroutine enlarge1_r( xx ,l1,u1 )
11204
,allocatable ,intent(inout) :: xx(:)
11205
integer ,intent(in ) :: l1,u1
11207
,allocatable :: tt(:)
11208
integer :: lb(1),ub(1)
11209
if (.not.allocated(xx)) then
11210
allocate(xx(l1:u1))
11213
lb=lbound(xx) ;ub=ubound(xx)
11214
if (lb(1).le.l1.and.u1.le.ub(1)) return
11215
if (lb(1).gt.ub(1)) then
11217
allocate( xx(min(l1,lb(1)):max(u1,ub(1))) )
11220
allocate(tt(lb(1):ub(1)))
11223
allocate( xx(min(l1,lb(1)):max(u1,ub(1))) )
11224
xx(lb(1):ub(1)) = tt(lb(1):ub(1))
11228
subroutine enlarge2_r( xx ,l1,u1 ,l2,u2 )
11230
,allocatable ,intent(inout) :: xx(:,:)
11231
integer ,intent(in ) :: l1,u1,l2,u2
11233
,allocatable :: tt(:,:)
11234
integer :: lb(2),ub(2)
11235
if (.not.allocated(xx)) then
11236
allocate(xx(l1:u1,l2:u2))
11239
lb=lbound(xx) ;ub=ubound(xx)
11240
if (lb(1).le.l1.and.u1.le.ub(1).and. &
11241
lb(2).le.l2.and.u2.le.ub(2) ) return
11242
if (lb(1).gt.ub(1).or.lb(2).gt.ub(2)) then
11244
allocate( xx(min(l1,lb(1)):max(u1,ub(1)) &
11245
,min(l2,lb(2)):max(u2,ub(2))) )
11248
allocate(tt(lb(1):ub(1),lb(2):ub(2)))
11251
allocate( xx(min(l1,lb(1)):max(u1,ub(1)) &
11252
,min(l2,lb(2)):max(u2,ub(2))) )
11253
xx(lb(1):ub(1),lb(2):ub(2)) = &
11254
tt(lb(1):ub(1),lb(2):ub(2))
11261
module avh_olo_qp_prec
11262
use avh_olo_qp_kinds
11266
private :: IMAG,acmplx_r,acmplx_rr,acmplx_ir,acmplx_ri,acmplx_c
11268
integer ,save :: prcpar=0
11269
integer ,save :: ndecim(1)
11271
,save :: epsilo(1),neglig(1)
11274
,save :: RZRO ,RONE ,EPSN ,EPSN2 ,TWOPI ,ONEPI
11276
,save :: IEPS ,CZRO ,CONE ,IMAG ,PISQo24 ,IPI
11279
module procedure acmplx_r,acmplx_rr,acmplx_ir,acmplx_ri,acmplx_c
11285
subroutine set_precision( newprc )
11286
!***********************************************************************
11287
!***********************************************************************
11289
logical ,intent(out) :: newprc
11291
if (prcpar.eq.1) then
11300
IMAG=cmplx(0,1,kind=kind(IMAG))
11305
PISQo24=CONE*ONEPI*ONEPI/24
11312
subroutine set_epsn
11313
EPSN = epsilon(EPSN)
11314
ndec = -log10(EPSN)
11315
ndecim(prcpar) = ndec
11316
epsilo(prcpar) = EPSN
11317
neglig(prcpar) = EPSN*10**(ndec/7)
11323
function adble(xx) result(rslt)
11324
!***********************************************************************
11325
! Turn real(kindr2) into kind(1d0)
11326
!***********************************************************************
11327
real(kindr2) ,intent(in) :: xx
11328
real(kind(1d0)) :: rslt
11329
rslt = real(xx,kind=kind(rslt))
11332
function convert(xx) result(rslt)
11333
!***********************************************************************
11334
! Turn kind(1d0) into real(kindr2)
11335
!***********************************************************************
11336
real(kind(1d0)) ,intent(in) :: xx
11337
real(kindr2) :: rslt
11338
rslt = real(xx,kind=kind(rslt))
11341
function areal(zz) result(rslt)
11342
!***********************************************************************
11343
! Get real part of a complex
11344
!***********************************************************************
11352
function acmplx_r(xx) result(rslt)
11353
!***********************************************************************
11354
! Turn a real into a complex
11355
!***********************************************************************
11363
function acmplx_rr(xx,yy) result(rslt)
11364
!***********************************************************************
11365
! Turn two reals into one complex
11366
!***********************************************************************
11368
,intent(in) :: xx,yy
11371
rslt = cmplx(xx,yy,kind=kind(rslt))
11374
function acmplx_ri(xx,yy) result(rslt)
11375
!***********************************************************************
11376
! Turn a real and an integer into one complex
11377
!***********************************************************************
11380
integer ,intent(in) :: yy
11383
rslt = cmplx(xx,yy,kind=kind(rslt))
11386
function acmplx_ir(xx,yy) result(rslt)
11387
!***********************************************************************
11388
! Turn an integer and a real into one complex
11389
!***********************************************************************
11390
integer ,intent(in) :: xx
11395
rslt = cmplx(xx,yy,kind=kind(rslt))
11398
function acmplx_c(zz) result(rslt)
11399
!***********************************************************************
11400
! Replaces the real part of zz by its absolute value
11401
!***********************************************************************
11411
rslt = cmplx(xx,yy,kind=kind(rslt))
11417
module avh_olo_qp_print
11418
use avh_olo_qp_prec
11423
integer ,parameter :: novh=10 !maximally 6 decimals for exponent
11424
integer ,parameter :: nxtr=4 !extra decimals
11427
module procedure printr,printc,printi
11432
function printc( zz ,ndec ) result(rslt)
11435
integer,optional,intent(in) :: ndec
11436
character((ndecim(prcpar)+nxtr+novh)*2+3) :: rslt
11437
if (present(ndec)) then
11438
rslt = '('//trim(printr(areal(zz),ndec)) &
11439
//','//trim(printr(aimag(zz),ndec)) &
11442
rslt = '('//trim(printr(areal(zz))) &
11443
//','//trim(printr(aimag(zz))) &
11446
rslt = adjustl(rslt)
11449
function printr( xx_in ,ndec_in ) result(rslt)
11451
,intent(in) :: xx_in
11452
integer,optional,intent(in) :: ndec_in
11453
character(ndecim(prcpar)+nxtr+novh ) :: rslt
11454
character(ndecim(prcpar)+nxtr+novh+1) :: cc
11455
character(10) :: aa,bb
11459
if (present(ndec_in)) then ;ndec=ndec_in
11460
else ;ndec=ndecim(prcpar)+nxtr
11462
write(aa,'(i10)') min(len(cc),ndec+novh+1) ;aa=adjustl(aa)
11463
write(bb,'(i10)') min(len(cc),ndec ) ;bb=adjustl(bb)
11464
aa = '(e'//trim(aa)//'.'//trim(bb)//')'
11465
write(cc,aa) xx ;cc=adjustl(cc)
11466
if (cc(1:2).eq.'-0') then ;rslt = '-'//cc(3:len(cc))
11467
else ;rslt = ' '//cc(2:len(cc))
11471
function printi( ii ) result(rslt)
11472
integer ,intent(in) :: ii
11473
character(ndecim(prcpar)) :: rslt
11474
character(ndecim(prcpar)) :: cc
11475
character(10) :: aa
11476
write(aa,'(i10)') ndecim(prcpar) ;aa=adjustl(aa)
11477
aa = '(i'//trim(aa)//')'
11478
write(cc,aa) ii ;cc=adjustl(cc)
11479
if (cc(1:1).ne.'-') then ;rslt=' '//cc
11487
module avh_olo_qp_auxfun
11489
use avh_olo_qp_prec
11493
public :: mysqrt,eta5,eta3,eta2,sgnIm,sgnRe,kallen
11494
public :: solabc,rfun,rfun0,solabc_rcc
11497
module procedure mysqrt_c,mysqrt_cr,mysqrt_ci
11501
module procedure eta5_0
11504
module procedure eta3_r,eta3_0
11507
module procedure eta2_r,eta2_0
11511
module procedure sgnIm_c,sgnIm_ci
11514
module procedure sgnRe_c,sgnRe_r,sgnRe_ri
11520
function mysqrt_c(xx) result(rslt)
11521
!*******************************************************************
11522
! Returns the square-root of xx .
11523
! If Im(xx) is equal zero and Re(xx) is negative, the result is
11524
! negative imaginary.
11525
!*******************************************************************
11533
if (xim.eq.RZRO) then
11535
if (xre.ge.RZRO) then
11536
zz = acmplx(sqrt(xre),0)
11538
zz = acmplx(0,-sqrt(-xre))
11546
function mysqrt_cr(xx,sgn) result(rslt)
11547
!*******************************************************************
11548
! Returns the square-root of xx .
11549
! If Im(xx) is equal zero and Re(xx) is negative, the result is
11550
! imaginary and has the same sign as sgn .
11551
!*******************************************************************
11561
if (xim.eq.RZRO) then
11563
if (xre.ge.RZRO) then
11564
zz = acmplx(sqrt(xre),0)
11566
zz = acmplx(0,sign(sqrt(-xre),sgn))
11574
function mysqrt_ci(xx,sgn) result(rslt)
11575
!*******************************************************************
11576
! Returns the square-root of xx .
11577
! If Im(xx) is equal zero and Re(xx) is negative, the result is
11578
! imaginary and has the same sign as sgn .
11579
!*******************************************************************
11582
integer ,intent(in) :: sgn
11588
if (xim.eq.RZRO) then
11590
if (xre.ge.RZRO) then
11591
zz = acmplx(sqrt(xre),0)
11594
zz = acmplx(0,sign(sqrt(-xre),hh))
11603
subroutine solabc( x1,x2 ,dd ,aa,bb,cc ,imode )
11604
!*******************************************************************
11605
! Returns the solutions x1,x2 to the equation aa*x^2+bb*x+cc=0
11606
! Also returns dd = aa*(x1-x2)
11607
! If imode=/=0 it uses dd as input as value of sqrt(b^2-4*a*c)
11608
!*******************************************************************
11610
,intent(out) :: x1,x2
11612
,intent(inout) :: dd
11614
,intent(in) :: aa,bb,cc
11615
integer ,intent(in) :: imode
11621
if (aa.eq.CZRO) then
11622
if (bb.eq.CZRO) then
11623
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop solabc: ' &
11624
,'no solutions, returning 0'
11633
elseif (cc.eq.CZRO) then
11638
if (imode.eq.0) dd = sqrt(bb*bb - 4*aa*cc)
11655
subroutine solabc_rcc( x1,x2 ,aa,bb,cc )
11656
!*******************************************************************
11658
!*******************************************************************
11659
intent(out) :: x1,x2
11660
intent(in ) :: aa,bb,cc
11662
:: x1,x2,bb,cc ,t1,t2
11664
:: aa,xx,yy,pp,qq,uu,vv,pq1,pq2,uv1,uv2,dd,xd1,xd2,yd1,yd2 &
11665
,gg,hh,rx1,rx2,ix1,ix2
11666
if (aa.eq.RZRO) then
11667
if (bb.eq.CZRO) then
11668
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop solabc: ' &
11669
,'no solutions, returning 0'
11676
elseif (cc.eq.CZRO) then
11680
t1 = cc/aa ;xx= areal(t1) ;yy= aimag(t1)
11681
t2 = bb/(aa*2) ;pp=-areal(t2) ;uu=-aimag(t2)
11682
t2 = sqrt(t2*t2-t1) ;qq= areal(t2) ;vv= aimag(t2)
11683
pq1=pp+qq ;uv1=uu+vv
11684
pq2=pp-qq ;uv2=uu-vv
11685
dd=pq1*pq1+uv1*uv1 ;xd1=xx/dd ;yd1=yy/dd
11686
dd=pq2*pq2+uv2*uv2 ;xd2=xx/dd ;yd2=yy/dd
11687
if (abs(pq1).gt.abs(pq2)) then
11689
gg=xd1*pq1 ;hh=yd1*uv1
11691
if (abs(rx2).lt.neglig(prcpar)*max(abs(gg),abs(hh))) rx2 = 0
11694
gg=xd2*pq2 ;hh=yd2*uv2
11696
if (abs(rx1).lt.neglig(prcpar)*max(abs(gg),abs(hh))) rx1 = 0
11698
if (abs(uv1).gt.abs(uv2)) then
11700
gg=yd1*pq1 ;hh=xd1*uv1
11702
if (abs(ix2).lt.neglig(prcpar)*max(abs(gg),abs(hh))) ix2 = 0
11705
gg=yd2*pq2 ;hh=xd2*uv2
11707
if (abs(ix1).lt.neglig(prcpar)*max(abs(gg),abs(hh))) ix1 = 0
11709
x1 = acmplx(rx1,ix1)
11710
x2 = acmplx(rx2,ix2)
11715
subroutine rfun(rr,dd ,qq)
11716
!*******************************************************************
11717
! Returns rr such that qq = rr + 1/rr and Im(rr) has the same
11719
! If Im(qq) is zero, then Im(rr) is negative or zero.
11720
! If Im(rr) is zero, then |rr| > 1/|rr| .
11721
! Also returns dd = rr - 1/rr .
11722
!*******************************************************************
11724
,intent(out) :: rr,dd
11743
if (aa.eq.RZRO) then
11744
if (bb.le.RZRO) then
11762
subroutine rfun0(rr ,dd,qq)
11763
!*******************************************************************
11764
! Like rfun, but now dd is input, which may get a minus sign
11765
!*******************************************************************
11769
,intent(inout) :: dd
11787
if (aa.eq.RZRO) then
11788
if (bb.le.RZRO) then
11807
function eta3_r( aa,sa ,bb,sb ,cc,sc ) result(rslt)
11808
!*******************************************************************
11809
! 2*pi*imag times the result of
11810
! theta(-Im(a))*theta(-Im(b))*theta( Im(c))
11811
! - theta( Im(a))*theta( Im(b))*theta(-Im(c))
11812
! where a,b,c are interpreted as a+i|eps|sa, b+i|eps|sb, c+i|eps|sc
11813
!*******************************************************************
11815
,intent(in) :: aa,bb,cc
11817
,intent(in) :: sa,sb,sc
11825
if (ima.eq.RZRO) ima = sa
11826
if (imb.eq.RZRO) imb = sb
11827
if (imc.eq.RZRO) imc = sc
11831
if (ima.eq.imb.and.ima.ne.imc) then
11832
rslt = acmplx(0,imc*TWOPI)
11838
function eta3_0( aa ,bb ,cc ) result(rslt)
11839
!*******************************************************************
11840
! 2*pi*imag times the result of
11841
! theta(-Im(a))*theta(-Im(b))*theta( Im(c))
11842
! - theta( Im(a))*theta( Im(b))*theta(-Im(c))
11843
! where a,b,c are interpreted as a+i|eps|sa, b+i|eps|sb, c+i|eps|sc
11844
!*******************************************************************
11846
,intent(in) :: aa,bb,cc
11854
if (ima.eq.imb.and.ima.ne.imc) then
11855
rslt = acmplx(0,imc*TWOPI)
11861
function eta5_0( aa ,b1,c1 ,b2,c2 ) result(rslt)
11862
!*******************************************************************
11863
! eta3(aa,b1,c1) - eta3(aa,b2,c2)
11864
!*******************************************************************
11866
,intent(in) :: aa,b1,c1 ,b2,c2
11870
:: imaa,imb1,imc1,imb2,imc2
11876
if (imaa.eq.imb1) then
11877
if (imaa.eq.imb2) then
11878
if (imc1.eq.imc2) then
11880
elseif (imaa.ne.imc1) then
11881
rslt = acmplx(0, imc1*TWOPI)
11883
rslt = acmplx(0,-imc2*TWOPI)
11885
elseif (imaa.ne.imc1) then
11886
rslt = acmplx(0, imc1*TWOPI)
11890
elseif (imaa.eq.imb2.and.imaa.ne.imc2) then
11891
rslt = acmplx(0,-imc2*TWOPI)
11897
function eta2_r( aa,sa ,bb,sb ) result(rslt)
11898
!*******************************************************************
11899
! The same as eta3, but with c=a*b, so that
11900
! eta(a,b) = log(a*b) - log(a) - log(b)
11901
!*******************************************************************
11903
,intent(in) :: aa,bb
11905
,intent(in) :: sa,sb
11909
:: rea,reb,ima,imb,imab
11910
rea = areal(aa) ;ima = aimag(aa)
11911
reb = areal(bb) ;imb = aimag(bb)
11912
imab = rea*imb + reb*ima
11913
if (ima .eq.RZRO) ima = sa
11914
if (imb .eq.RZRO) imb = sb
11915
if (imab.eq.RZRO) imab = sign(rea,sb) + sign(reb,sa)
11919
if (ima.eq.imb.and.ima.ne.imab) then
11920
rslt = acmplx(0,imab*TWOPI)
11926
function eta2_0( aa ,bb ) result(rslt)
11927
!*******************************************************************
11928
!*******************************************************************
11930
,intent(in) :: aa,bb
11934
:: rea,reb,ima,imb,imab
11935
rea = areal(aa) ;ima = aimag(aa)
11936
reb = areal(bb) ;imb = aimag(bb)
11943
if (ima.eq.imb.and.ima.ne.imab) then
11944
rslt = acmplx(0,imab*TWOPI)
11951
function kallen( p1,p2,p3 ) result(rslt)
11952
!*******************************************************************
11953
! p1^2 + p2^2 + p3^2 - 2*p1*p2 - 2*p2*p3 - 2*p3*p1
11954
!*******************************************************************
11956
,intent(in) :: p1,p2,p3
11961
y1=p2*p3 ;b1=areal(y1)
11962
y2=p3*p1 ;b2=areal(y2)
11963
y3=p1*p2 ;b3=areal(y3)
11964
if (b1.le.RZRO) then ;rslt = (p1-p2-p3)**2 - 4*y1
11965
elseif (b2.le.RZRO) then ;rslt = (p2-p3-p1)**2 - 4*y2
11966
elseif (b3.le.RZRO) then ;rslt = (p3-p1-p2)**2 - 4*y3
11967
elseif (b1.le.b2.and.b1.le.b3) then ;rslt = (p1-p2-p3)**2 - 4*y1
11968
elseif (b2.le.b3.and.b2.le.b1) then ;rslt = (p2-p3-p1)**2 - 4*y2
11969
else ;rslt = (p3-p1-p2)**2 - 4*y3
11974
function sgnIm_c(zz) result(rslt)
11975
!*******************************************************************
11976
!*******************************************************************
11983
if (imz.ge.RZRO) then ;rslt= 1
11988
function sgnIm_ci(zz,ii) result(rslt)
11989
!*******************************************************************
11990
!*******************************************************************
11993
integer ,intent(in) :: ii
11998
if (imz.gt.RZRO) then ;rslt= 1
11999
elseif (imz.lt.RZRO) then ;rslt=-1
12000
else ;rslt= sign(1,ii)
12004
function sgnRe_c(zz) result(rslt)
12005
!*******************************************************************
12006
!*******************************************************************
12013
if (rez.ge.RZRO) then ;rslt= 1
12018
function sgnRe_r(rez) result(rslt)
12019
!*******************************************************************
12020
!*******************************************************************
12024
if (rez.ge.RZRO) then ;rslt= 1
12029
function sgnRe_ri(rez,ii) result(rslt)
12030
!*******************************************************************
12031
!*******************************************************************
12034
integer ,intent(in) :: ii
12036
if (rez.gt.RZRO) then ;rslt= 1
12037
elseif (rez.lt.RZRO) then ;rslt=-1
12038
else ;rslt=sign(1,ii)
12045
module avh_olo_qp_olog
12046
!***********************************************************************
12047
! Provides the functions
12048
! olog(x,n) = log(x) + n*pi*imag
12049
! olog2(x,n) = olog(x,n)/(x-1)
12050
! In the vicinity of x=1,n=0, the logarithm of complex argument is
12051
! evaluated with a series expansion.
12052
!***********************************************************************
12054
use avh_olo_qp_prec
12055
use avh_olo_qp_print
12056
use avh_olo_qp_auxfun
12059
public :: update_olog,olog,olog2
12062
,allocatable,save :: thrs(:,:)
12063
integer,allocatable,save :: ntrm(:,:)
12064
integer,parameter :: nStp=6
12067
module procedure log_c,log_r
12070
module procedure log2_c,log2_r
12075
subroutine update_olog
12076
!***********************************************************************
12077
!***********************************************************************
12078
use avh_olo_qp_arrays
12081
integer :: nn,mm,ii,jj
12082
! real(kind(1d0)) :: xx(6) !DEBUG
12083
if (allocated(thrs)) then
12084
call shift2( thrs ,prcpar )
12085
call shift2( ntrm ,prcpar )
12087
allocate(thrs(1:nStp,1:1))
12088
allocate(ntrm(1:nStp,1:1))
12089
if (prcpar.ne.1) then
12090
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop update_olog'
12094
if (prcpar.gt.1) then ;nn=ntrm(nStp,prcpar-1)-1
12101
tt = (EPSN*mm)**(tt/(mm-1))
12103
! expansion from x=1+d with |d|=1/1000
12104
if (1000*tt.gt.RONE) exit
12106
ntrm(nStp,prcpar) = nn
12107
thrs(nStp,prcpar) = tt
12108
nn = max(1,nint(nn*1d0/nStp))
12110
ntrm(ii,prcpar) = ntrm(ii+1,prcpar)-nn
12111
if (ntrm(ii,prcpar).le.1) then
12113
ntrm(jj,prcpar) = ntrm(ii,prcpar)
12114
thrs(jj,prcpar) = 0
12118
mm = 2*ntrm(ii,prcpar)-1
12120
tt = (EPSN*mm)**(tt/(mm-1))
12121
thrs(ii,prcpar) = 2*tt/(1-tt)
12123
! do ii=lbound(thrs,2),ubound(thrs,2) !DEBUG
12124
! do jj=1,nStp !DEBUG
12125
! xx(jj) = thrs(jj,ii) !DEBUG
12127
! write(*,'(99e10.3)') xx(:) !DEBUG
12128
! write(*,'(99i10)' ) ntrm(:,ii) !DEBUG
12133
function log_c(xx,iph) result(rslt)
12134
!***********************************************************************
12135
!***********************************************************************
12138
integer ,intent(in) :: iph
12143
integer :: nn,ii,iyy
12149
if (abs(imx).le.EPSN*abs(rex)) then
12150
if (rex.ge.RZRO) then
12151
rslt = log_r( rex, iyy )
12153
rslt = log_r(-rex, iyy+sgnRe(imx) )
12158
if (mod(iyy,2).eq.0) then
12159
yy = acmplx(rex,imx)
12161
yy = acmplx(-rex,-imx)
12162
iyy = iyy+sgnRe(imx)
12166
rslt = log(yy) + IPI*iyy
12172
if (aa.ge.thrs(6,prcpar)) then
12175
elseif (aa.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12176
elseif (aa.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12177
elseif (aa.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12178
elseif (aa.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12179
elseif (aa.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12180
else ;nn=ntrm(1,prcpar)
12188
rslt = aa/ii + z2*rslt
12194
function log_r(xx,iph) result(rslt)
12195
!***********************************************************************
12196
!***********************************************************************
12199
integer ,intent(in) :: iph
12206
if (xx.eq.RZRO) then
12207
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop log_r: ' &
12208
,'xx =',trim(myprint(xx)),', returning 0'
12211
elseif (xx.gt.RZRO) then ;rr= xx ;jj= iph
12212
else ;rr=-xx ;jj= iph+1 ! log(-1)=i*pi
12215
rslt = log(rr) + IPI*jj
12219
function log2_c(xx,iph) result(rslt)
12220
!***********************************************************************
12221
!***********************************************************************
12224
integer ,intent(in) :: iph
12229
integer :: nn,ii,jj
12234
if (abs(imx).le.EPSN*abs(rex)) then
12235
if (rex.ge.RZRO) then
12236
rslt = log2_r( rex, iph )
12238
rslt = log2_r(-rex, iph+sgnRe(imx) )
12243
if (mod(iph,2).eq.0) then ;yy= xx ;jj=iph
12244
else ;yy=-xx ;jj=iph+sgnRe(imx)
12248
rslt = ( log(yy) + IPI*jj )/(yy-1)
12254
if (aa.ge.thrs(6,prcpar)) then
12257
elseif (aa.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12258
elseif (aa.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12259
elseif (aa.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12260
elseif (aa.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12261
elseif (aa.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12262
else ;nn=ntrm(1,prcpar)
12270
rslt = aa/ii + z2*rslt
12276
function log2_r(xx,iph) result(rslt)
12277
!***********************************************************************
12278
!***********************************************************************
12281
integer ,intent(in) :: iph
12287
! include 'avh_olo_qp_real.h90'
12291
if (xx.eq.RZRO) then
12292
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop log2_r: ' &
12293
,'xx =',trim(myprint(xx)),', returning 0'
12296
elseif (xx.gt.RZRO) then ;rr= xx ;jj=iph
12297
else ;rr=-xx ;jj=iph+1 ! log(-1)=i*pi
12300
yy=rr ;if (mod(jj,2).ne.0) yy=-rr
12302
if (abs(yy-1).le.10*EPSN) then
12304
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop log2_r: ' &
12305
,'rr,jj =',trim(myprint(rr)),jj,', putting jj to 0'
12307
rslt = 1 - (yy-1)/2
12311
rslt = ( log(rr) + IPI*jj )/(yy-1)
12317
module avh_olo_qp_dilog
12318
!***********************************************************************
12320
! dilog(xx,iph) = - | dt ----------
12322
! with zz = 1 - xx*exp(imag*pi*iph) [pi, NOT 2*pi]
12324
! dilog(x1,i1,x2,i2) = ( dilog(x1,i1)-dilog(x2,i2) )/( x1-x2 )
12326
! Arguments xx,x1,x2, may be all real or all complex,
12327
! arguments iph,i1,i2 must be all integer.
12328
!***********************************************************************
12330
use avh_olo_qp_prec
12331
use avh_olo_qp_print
12332
use avh_olo_qp_auxfun
12333
use avh_olo_qp_arrays
12336
public :: update_dilog,dilog
12339
,allocatable,save :: coeff(:)
12341
,allocatable,save :: thrs(:,:)
12342
integer,allocatable,save :: ntrm(:,:)
12343
integer,parameter :: nStp=6
12346
,allocatable :: bern(:),fact(:)
12349
module procedure dilog_c,dilog_r,dilog2_c,dilog2_r
12354
subroutine update_dilog
12355
!***********************************************************************
12356
!***********************************************************************
12359
integer :: nn,ii,jj
12360
logical :: highestSoFar
12361
! real(kind(1d0)) :: xx(6) !DEBUG
12363
if (allocated(thrs)) then
12364
call shift2( thrs ,prcpar )
12365
call shift2( ntrm ,prcpar )
12367
allocate(thrs(1:nStp,1:1))
12368
allocate(ntrm(1:nStp,1:1))
12369
if (prcpar.ne.1) then
12370
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop update_dilog'
12375
highestSoFar = prcpar.eq.ubound(ntrm,2)
12376
if (highestSoFar) then
12377
if (allocated(coeff)) deallocate(coeff)
12378
allocate(coeff(0:-1)) ! allocate at size=0
12381
if (prcpar.gt.1) then ;nn=ntrm(nStp,prcpar-1)-1
12387
if (nn.gt.ubound(coeff,1)) call update_coeff( 2*nn )
12389
tt = (EPSN/abs(coeff(nn)))**(tt/(2*nn))
12390
! expansion parameter is smaller than 1.05
12391
if (100*tt.gt.105*RONE) exit
12394
if (highestSoFar) call resize( coeff ,0,nn )
12396
ntrm(nStp,prcpar) = nn
12397
thrs(nStp,prcpar) = tt
12398
nn = max(1,nint(nn*1d0/nStp))
12400
ntrm(ii,prcpar) = ntrm(ii+1,prcpar)-nn
12401
if (ntrm(ii,prcpar).le.2) then
12403
ntrm(jj,prcpar) = max(2,ntrm(ii,prcpar))
12404
thrs(jj,prcpar) = 0
12408
jj = ntrm(ii,prcpar)
12410
tt = (EPSN/abs(coeff(jj)))**(tt/(2*jj))
12411
thrs(ii,prcpar) = tt
12414
if (allocated(bern)) deallocate(bern)
12415
if (allocated(fact)) deallocate(fact)
12417
! do ii=lbound(thrs,2),ubound(thrs,2) !DEBUG
12418
! do jj=1,nStp !DEBUG
12419
! xx(jj) = thrs(jj,ii) !DEBUG
12421
! write(*,'(99e10.3)') xx(:) !DEBUG
12422
! write(*,'(99i10)' ) ntrm(:,ii) !DEBUG
12427
subroutine update_coeff( ncf )
12428
!*******************************************************************
12430
! coeff(n)=bern(2*n)/(2*n+1)
12431
! bern(n)=bernoulli(n)/n!
12433
! DO NOT SKIP THE ODD bern IN THE RECURSIVE LOOP
12434
! DO NOT PUT THE ODD bern TO ZERO
12435
!*******************************************************************
12436
integer ,intent(in) :: ncf
12437
integer :: ii,jj,nbern,nold
12439
if (allocated(bern)) then ;nold=ubound(bern,1)
12445
call enlarge( bern ,1,nbern )
12446
call enlarge( fact ,0,nbern+1 )
12447
call enlarge( coeff ,0,ncf )
12450
do ii=nold+1,nbern+1
12451
fact(ii) = fact(ii-1)*ii
12455
bern(ii) = -1/fact(ii+1)
12457
bern(ii) = bern(ii) - bern(jj)/fact(ii+1-jj)
12462
coeff(0) =-coeff(0)/4
12463
do ii=nold+2,nbern,2
12464
coeff(ii/2) = bern(ii)/(ii+1)
12470
function dilog_c(xx,iph) result(rslt)
12471
!*******************************************************************
12472
!*******************************************************************
12475
integer ,intent(in) :: iph
12477
:: rslt ,yy,lyy,loy,zz,z2
12480
integer :: ii,jj,ntwo,odd,nn
12481
logical :: r_gt_1 , y_lt_h
12486
if (abs(imx).le.EPSN*abs(rex)) then
12487
if (rex.ge.RZRO) then
12488
rslt = dilog_r( rex, iph )
12490
rslt = dilog_r(-rex, iph+sgnRe(imx) )
12495
if (rex.gt.RZRO) then ;yy= xx ;jj=iph
12496
else ;yy=-xx ;jj=iph+sgnRe(imx)
12502
r_gt_1 = (rex*rex+imx*imx.gt.RONE)
12504
if (odd.ne.0) yy = -yy
12514
y_lt_h = (2*areal(yy).lt.RONE)
12515
if (y_lt_h) then ;zz=-loy
12520
! if (az.gt.thrs(6,prcpar)) ERROR az to big
12521
if (az.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12522
elseif (az.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12523
elseif (az.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12524
elseif (az.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12525
elseif (az.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12526
else ;nn=ntrm(1,prcpar)
12531
rslt = coeff(ii-1) + z2*rslt
12533
rslt = zz*( 1 + zz*( coeff(0) + zz*rslt ) )
12536
rslt = 4*PISQo24 - rslt - loy*(lyy+IPI*(ntwo+odd))
12538
rslt = rslt - loy*IPI*ntwo
12541
if (r_gt_1) rslt = -rslt - (lyy+IPI*(ntwo+odd))**2/2
12546
function dilog_r(xx,iph) result(rslt)
12547
!*******************************************************************
12548
!*******************************************************************
12551
integer ,intent(in) :: iph
12555
:: yy,lyy,loy,zz,z2,liox,az
12556
integer :: jj,ii,ntwo,odd,nn
12557
logical :: r_gt_1 , y_lt_h
12559
if (xx.eq.RZRO) then
12562
elseif (xx.gt.RZRO) then ;yy= xx ;jj=iph
12563
else ;yy=-xx ;jj=iph+1 ! log(-1)=i*pi
12569
if (yy.eq.RONE.and.odd.eq.0) then
12570
if (ntwo.ne.0) then
12571
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog_r: ' &
12572
,'|x|,iph = ',trim(myprint(yy)),',',jj,', returning 0'
12578
r_gt_1 = (yy.gt.RONE)
12580
if (odd.ne.0) yy = -yy
12588
loy = log(1-yy) ! log(1-yy) is always real
12590
y_lt_h = (2*yy.lt.RONE)
12592
zz = -loy ! log(1-yy) is real
12594
zz = -lyy ! yy>0.5 => log(yy) is real
12598
! if (az.gt.thrs(6,prcpar)) ERROR az to big
12599
if (az.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12600
elseif (az.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12601
elseif (az.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12602
elseif (az.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12603
elseif (az.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12604
else ;nn=ntrm(1,prcpar)
12609
liox = coeff(ii-1) + z2*liox
12611
liox = zz*( 1 + zz*( coeff(0) + zz*liox ) )
12613
rslt = acmplx(liox)
12616
rslt = 4*PISQo24 - rslt - acmplx(loy*lyy,loy*ONEPI*(ntwo+odd))
12618
rslt = rslt + acmplx( 0 ,-loy*ONEPI*ntwo )
12621
if (r_gt_1) rslt = -rslt - acmplx(lyy,ONEPI*(ntwo+odd))**2/2
12625
function dilog2_c( x1,i1 ,x2,i2 ) result(rslt)
12626
!*******************************************************************
12627
!*******************************************************************
12628
use avh_olo_qp_olog
12630
,intent(in) :: x1,x2
12631
integer ,intent(in) :: i1,i2
12633
:: rslt ,y1,y2 ,ff,gg,logr1,logr2,logo1,logo2,r1,r2,rr
12635
:: eps ,re1,im1,re2,im2,a1,a2,aa,ao1,ao2
12636
integer :: j1,j2,ii,nn,oo
12637
integer,parameter :: pp(-1:1,-1:1)=&
12638
reshape((/-2,-2,2 ,-2,0,2 ,-2,2,2/),(/3,3/))
12640
re1=areal(x1) ;re2=areal(x2)
12641
im1=aimag(x1) ;im2=aimag(x2)
12643
if (abs(im1).le.EPSN*abs(re1).and.abs(im2).le.EPSN*abs(re2)) then
12644
if (re1.ge.RZRO) then
12645
if (re2.ge.RZRO) then
12646
rslt = dilog2_r( re1,i1 , re2,i2 )
12648
rslt = dilog2_r( re1,i1 ,-re2,i2+sgnRe(im2) )
12650
elseif (re2.ge.RZRO) then
12651
rslt = dilog2_r(-re1,i1+sgnRe(im1) , re2,i2 )
12653
rslt = dilog2_r(-re1,i1+sgnRe(im1) ,-re2,i2+sgnRe(im2) )
12658
if (re1.ge.RZRO) then ;r1= x1 ;j1=i1
12659
else ;r1=-x1 ;j1=i1+sgnRe(im1,1)
12661
if (re2.ge.RZRO) then ;r2= x2 ;j2=i2
12662
else ;r2=-x2 ;j2=i2+sgnRe(im2,1)
12665
a1=abs(r1) ;a2=abs(r2)
12672
oo=mod(j1,2) ;nn=j1-oo ;y1=r1 ;if (oo.ne.0) y1=-y1
12673
oo=mod(j2,2) ;nn=j2-oo ;y2=r2 ;if (oo.ne.0) y2=-y2
12679
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_c: ' &
12680
,'j1,j2,r1-r2',j1,j2,',',trim(myprint(r1-r2)),', returning 0'
12682
! write(*,*) 'dilog2_c j1=/=j2,r1=r2' !DEBUG
12685
rslt = ( dilog_c(r1,j1)-dilog_c(r2,j2) )/(y1-y2)
12686
! write(*,*) 'dilog2_c j1=/=j2' !DEBUG
12691
if (a1.lt.eps) then
12692
if (a2.lt.eps) then
12693
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_c: ' &
12694
,'r1,r2 =',trim(myprint(r1)),',',trim(myprint(r2)),', returning 0'
12696
! write(*,*) 'dilog2_c r1<eps,r2<eps' !DEBUG
12699
rslt = (dilog_c(r2,j2)-4*PISQo24)/y2
12700
! write(*,*) 'dilog2_c r1<eps' !DEBUG
12705
logr1=log(r1) ;logr2=log(r2)
12707
ao1=abs(1-y1) ;ao2=abs(1-y2)
12708
if (10*ao1.lt.RONE.or.10*ao2.lt.RONE) then
12710
if (10*aa.gt.RONE) then
12711
rslt = (dilog_c(r1,j1)-dilog_c(r2,j2))/(y1-y2)
12712
! write(*,*) 'dilog2_c ||1-y1|/|1-y2|-1|>0.1' !DEBUG
12714
elseif (oo.eq.0.and.ao1.lt.eps) then
12715
if (nn.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_c: ' &
12716
,'r1,oo,nn =',trim(myprint(r1)),',',oo,nn,', putting nn=0'
12717
if (ao2.lt.eps) then
12719
! write(*,*) 'dilog2_c |1-y1|' !DEBUG
12722
y1=1-eps ;nn=0 ;logr1=0 ;r1=1-eps
12724
elseif (oo.eq.0.and.ao2.lt.eps) then
12725
if (nn.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_c: ' &
12726
,'r2,oo,nn =',trim(myprint(r2)),',',oo,nn,', putting nn=0'
12727
y2=1-eps ;nn=0 ;logr2=0 ;r2=1-eps
12730
aa = abs((logr1+oo*IPI)/(logr2+oo*IPI)-1)
12731
if (10*aa.gt.RONE) then
12732
rslt = (dilog_c(r1,j1)-dilog_c(r2,j2))/(y1-y2)
12733
! write(*,*) 'dilog2_c |logr1/logr2-1|>0.1',logr1,logr2 !DEBUG
12735
elseif (aa.lt.eps) then
12737
if (a1.gt.RONE) ii = ii + (nn+pp(oo,sgnIm(y2)))
12738
if (a2.gt.RONE) ii = ii - (nn+pp(oo,sgnIm(y2)))
12740
if (ii.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_c: ' &
12741
,'r1,r2,nn =',trim(myprint(r1)),',',trim(myprint(r2)),',',nn &
12743
rslt = -olog2(y2,0)
12744
! write(*,*) 'dilog2_c |logr1/lorg2|<eps' !DEBUG
12749
if (a1.gt.RONE) then
12750
y1=1/y1 ;logr1=-logr1
12751
y2=1/y2 ;logr2=-logr2
12755
ff=y1/y2 ;ff=-olog2(ff,0)/y2
12756
gg=(1-y1)/(1-y2) ;gg=-olog2(gg,0)/(1-y2)
12758
if (2*areal(y1).ge.RONE) then
12759
! write(*,*) 'dilog2_c re>1/2' !DEBUG
12760
rslt = ff*sumterms_c(-logr1,-logr2) - nn*IPI*gg
12762
! write(*,*) 'dilog2_c re<1/2' !DEBUG
12765
rslt = gg*( sumterms_c(-logo1,-logo2) - (nn+oo)*IPI - logr2 ) + ff*logo1
12768
if (a1.gt.RONE) then !implies also r2>1
12769
! write(*,*) 'dilog2_c r1>1,r2>1' !DEBUG
12770
rslt = y1*y2*( rslt - ff*((logr1+logr2)/2 + (nn+oo)*IPI) )
12771
elseif (a2.gt.RONE.and.nn.ne.0) then
12772
! write(*,*) 'dilog2_c r1<1,r2>1',oo,sgnIm(y2)!DEBUG
12773
rslt = rslt - 12*nn*( nn + pp(oo,sgnIm(y2)) )*PISQo24/(y1-y2)
12779
function dilog2_r( x1,i1 ,x2,i2 ) result(rslt)
12780
!*******************************************************************
12781
!*******************************************************************
12782
use avh_olo_qp_olog
12784
,intent(in) :: x1,x2
12785
integer ,intent(in) :: i1,i2
12789
:: y1,y2 ,ff,gg,logr1,logr2,logo1,logo2
12791
:: eps,r1,r2,rr,ro1,ro2
12792
integer :: j1,j2,ii,nn,oo
12794
if (x1.ge.RZRO) then ;r1= x1 ;j1=i1
12795
else ;r1=-x1 ;j1=i1+1 ! log(-1)=i*pi
12797
if (x2.ge.RZRO) then ;r2= x2 ;j2=i2
12798
else ;r2=-x2 ;j2=i2+1 ! log(-1)=i*pi
12806
oo=mod(j1,2) ;nn=j1-oo ;y1=r1 ;if (oo.ne.0) y1=-y1
12807
oo=mod(j2,2) ;nn=j2-oo ;y2=r2 ;if (oo.ne.0) y2=-y2
12813
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_r: ' &
12814
,'j1,j2,r1-r2',j1,j2,',',trim(myprint(r1-r2)),', returning 0'
12816
! write(*,*) 'dilog2_r j1=/=j2,r1=r2' !DEBUG
12819
rslt = ( dilog_r(r1,j1)-dilog_r(r2,j2) )/(y1-y2)
12820
! write(*,*) 'dilog2_r j1=/=j2' !DEBUG
12825
if (r1.lt.eps) then
12826
if (r2.lt.eps) then
12827
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_r: ' &
12828
,'r1,r2 =',trim(myprint(r1)),',',trim(myprint(r2)),', returning 0'
12830
! write(*,*) 'dilog2_r r1<eps,r2<eps' !DEBUG
12833
rslt = (dilog_r(r2,j2)-4*PISQo24)/y2
12834
! write(*,*) 'dilog2_r r1<eps' !DEBUG
12839
logr1=log(r1) ;logr2=log(r2)
12841
ro1=abs(1-y1) ;ro2=abs(1-y2)
12842
if (10*ro1.lt.RONE.or.10*ro2.lt.RONE) then
12844
if (10*rr.gt.RONE) then
12845
rslt = (dilog_r(r1,j1)-dilog_r(r2,j2))/(y1-y2)
12846
! write(*,*) 'dilog2_r ||1-y1|/|1-y2|-1|>0.1' !DEBUG
12848
elseif (oo.eq.0.and.ro1.lt.eps) then
12849
if (nn.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_r: ' &
12850
,'r1,oo,nn =',trim(myprint(r1)),',',oo,nn,', putting nn=0'
12851
if (ro2.lt.eps) then
12853
! write(*,*) 'dilog2_r |1-y1|' !DEBUG
12856
y1=1-eps ;nn=0 ;logr1=0 ;r1=1-eps
12858
elseif (oo.eq.0.and.ro2.lt.eps) then
12859
if (nn.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_r: ' &
12860
,'r2,oo,nn =',trim(myprint(r2)),',',oo,nn,', putting nn=0'
12861
y2=1-eps ;nn=0 ;logr2=0 ;r2=1-eps
12864
rr = abs((logr1+oo*IPI)/(logr2+oo*IPI)-1)
12865
if (10*rr.gt.RONE) then
12866
rslt = (dilog_r(r1,j1)-dilog_r(r2,j2))/(y1-y2)
12867
! write(*,*) 'dilog2_r |logr1/logr2-1|>0.1',logr1,logr2 !DEBUG
12869
elseif (rr.lt.eps) then
12871
if (r1.gt.RONE) ii = ii + (nn+2*oo)
12872
if (r2.gt.RONE) ii = ii - (nn+2*oo)
12874
if (ii.ne.0.and.eunit.gt.0) write(eunit,*) 'ERROR in OneLOop dilog2_r: ' &
12875
,'r1,r2,nn =',trim(myprint(r1)),',',trim(myprint(r2)),',',nn &
12877
rslt = -olog2(y2,0)
12878
! write(*,*) 'dilog2_r |logr1/lorg2|<eps' !DEBUG
12883
if (r1.gt.RONE) then
12884
y1=1/y1 ;logr1=-logr1
12885
y2=1/y2 ;logr2=-logr2
12889
ff=y1/y2 ;ff=-olog2(ff,0)/y2
12890
gg=(1-y1)/(1-y2) ;gg=-olog2(gg,0)/(1-y2)
12892
if (2*y1.ge.RONE) then
12893
! write(*,*) 'dilog2_r re>1/2' !DEBUG
12894
rslt = ff*sumterms_r(-logr1,-logr2) - nn*IPI*gg
12896
! write(*,*) 'dilog2_r re<1/2' !DEBUG
12899
rslt = gg*( sumterms_r(-logo1,-logo2) - (nn+oo)*IPI - logr2 ) + ff*logo1
12902
if (r1.gt.RONE) then !implies also r2>1
12903
! write(*,*) 'dilog2_r r1>1,r2>1' !DEBUG
12904
rslt = y1*y2*( rslt - ff*((logr1+logr2)/2 + (nn+oo)*IPI) )
12905
elseif (r2.gt.RONE.and.nn.ne.0) then
12906
! write(*,*) 'dilog2_r r1<1,r2>1' !DEBUG
12907
rslt = rslt - 12*nn*PISQo24*(nn+2*oo)/(y1-y2)
12913
function sumterms_c( z1,z2 ) result(rslt)
12914
!***********************************************************************
12915
! ( f(z1)-f(z2) )/( z1-z2 ), where
12916
! f(z)= z + c0*z^2 + c1*z^3 + c2*z^5 + c3*z^7 + ...
12917
!***********************************************************************
12919
,intent(in) :: z1,z2
12925
az = max(abs(z1),abs(z2))
12926
if (az.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12927
elseif (az.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12928
elseif (az.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12929
elseif (az.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12930
elseif (az.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12931
else ;nn=ntrm(1,prcpar)
12933
! calculates all z(i)=(z1^i-z2^i)/(z1-z2) numerically stable
12938
! zz(ii) = z1*zz(ii-1) + yy
12945
rslt = rslt + coeff(0)*zz
12949
rslt = rslt + coeff(ii)*zz
12956
function sumterms_r( z1,z2 ) result(rslt)
12957
!***********************************************************************
12958
! ( f(z1)-f(z2) )/( z1-z2 ), where
12959
! f(z)= z + c0*z^2 + c1*z^3 + c2*z^5 + c3*z^7 + ...
12960
!***********************************************************************
12962
,intent(in) :: z1,z2
12968
az = max(abs(z1),abs(z2))
12969
if (az.ge.thrs(5,prcpar)) then ;nn=ntrm(6,prcpar)
12970
elseif (az.ge.thrs(4,prcpar)) then ;nn=ntrm(5,prcpar)
12971
elseif (az.ge.thrs(3,prcpar)) then ;nn=ntrm(4,prcpar)
12972
elseif (az.ge.thrs(2,prcpar)) then ;nn=ntrm(3,prcpar)
12973
elseif (az.ge.thrs(1,prcpar)) then ;nn=ntrm(2,prcpar)
12974
else ;nn=ntrm(1,prcpar)
12981
rslt = rslt + coeff(0)*zz
12985
rslt = rslt + coeff(ii)*zz
12994
module avh_olo_qp_bnlog
12995
!***********************************************************************
12997
! bnlog(n,x) = (n+1) | dt t^n ln(1-t/x)
12999
!***********************************************************************
13001
use avh_olo_qp_prec
13002
use avh_olo_qp_auxfun
13003
use avh_olo_qp_arrays
13004
use avh_olo_qp_olog
13005
use avh_olo_qp_print
13008
public :: update_bnlog,bnlog
13011
,allocatable,save :: coeff(:,:)
13013
,allocatable,save :: thrs(:,:,:)
13014
integer,allocatable,save :: ntrm(:,:,:)
13015
integer,parameter :: nStp=6
13016
integer,parameter :: rank=4
13017
integer,parameter :: aCoef(0:rank,0:rank)=reshape((/ &
13018
1, 0, 0, 0, 0 & ! 1
13019
, 1, 2, 0, 0, 0 & ! 1/2,1
13020
, 2, 3, 6, 0, 0 & ! 1/3,1/2,1
13021
, 3, 4, 6,12, 0 & ! 1/4,1/3,1/2,1
13022
,12,15,20,30,60 & ! 1/5,1/4,1/3,1/2,1
13023
/),(/rank+1,rank+1/))
13026
module procedure bnlog_c,bnlog_r
13032
subroutine update_bnlog
13033
!***********************************************************************
13034
!***********************************************************************
13037
integer :: nn,ii,jj,n1,nmax,irank
13038
logical :: highestSoFar
13039
! real(kind(1d0)) :: xx(6) !DEBUG
13041
if (allocated(thrs)) then
13042
call shift3( thrs ,prcpar )
13043
call shift3( ntrm ,prcpar )
13045
allocate(thrs(1:nStp,0:rank,1:1))
13046
allocate(ntrm(1:nStp,0:rank,1:1))
13047
if (prcpar.ne.1) then
13048
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop update_bnlog'
13053
highestSoFar = prcpar.eq.ubound(ntrm,3)
13055
if (highestSoFar) then
13056
if (allocated(coeff)) deallocate(coeff)
13057
allocate(coeff(0:-1,0:2)) ! allocate at size=0
13066
if (prcpar.gt.1) then ;nn=ntrm(nStp,irank,prcpar-1)-1
13072
if (highestSoFar.and.nn.gt.ubound(coeff,1)) call update_coeff( 2*nn )
13074
tt = (EPSN*abs(coeff(n1,irank)/coeff(nn,irank)))**(tt/(nn-n1))
13075
if (8*(irank+1)*tt.gt.RONE) exit
13078
if (nn.gt.nmax) nmax=nn
13080
ntrm(nStp,irank,prcpar) = nn
13081
thrs(nStp,irank,prcpar) = tt
13082
nn = max(1,nint(nn*1d0/nStp))
13084
ntrm(ii,irank,prcpar) = ntrm(ii+1,irank,prcpar)-nn
13085
if (ntrm(ii,irank,prcpar).le.n1) then
13087
ntrm(jj,irank,prcpar) = max(n1,ntrm(ii,irank,prcpar))
13088
thrs(jj,irank,prcpar) = 0
13092
jj = ntrm(ii,irank,prcpar)
13094
tt = (EPSN*abs(coeff(n1,irank)/coeff(jj,irank)))**(tt/(jj-n1))
13095
thrs(ii,irank,prcpar) = tt
13098
enddo!irank=1,nrank
13100
if (highestSoFar) call resize( coeff ,2,nmax ,0,rank )
13102
! do ii=lbound(thrs,3),ubound(thrs,3) !DEBUG
13103
! do irank=0,rank !DEBUG
13104
! do jj=1,nStp !DEBUG
13105
! xx(jj) = thrs(jj,irank,ii) !DEBUG
13107
! write(*,'(i2,99e10.3)') irank,xx(:) !DEBUG
13108
! write(*,'(2x,99i10)' ) ntrm(:,irank,ii) !DEBUG
13114
subroutine update_coeff( ncf )
13115
!*******************************************************************
13116
! Coefficients of the expansion of
13117
! f(n,x) = -int( t^n*log(1-t*x) ,t=0..1 )
13118
! in terms of log(1-x)
13119
!*******************************************************************
13120
integer ,intent(in) :: ncf
13125
call enlarge( coeff ,2,ncf ,0,rank )
13133
do ii=1,rank ;tt(ii)=1 ;enddo
13136
coeff(ii,0) = (ii-1)/fact
13138
do jj=1,rank ;tt(jj)=tt(jj)*(jj+1) ;enddo
13139
coeff(ii,1) = coeff(ii,0)*(1-tt(1))
13141
coeff(ii,2) = coeff(ii,0)*(1-2*tt(1)+tt(2))
13143
coeff(ii,3) = coeff(ii,0)*(1-3*tt(1)+3*tt(2)-tt(3))
13145
coeff(ii,4) = coeff(ii,0)*(1-4*tt(1)+6*tt(2)-4*tt(3)+tt(4))
13146
! if (ii.eq.n+1) cycle
13147
! coeff(ii,n) = coeff(ii,0)
13148
! * ( 1 - binom(n,1)*tt(1) + binom(n,2)*tt(2)...)
13154
function bnlog_c( irank ,xx ) result(rslt)
13155
!*******************************************************************
13156
!*******************************************************************
13157
integer ,intent(in) :: irank
13169
if (abs(imx).le.EPSN*abs(rex)) then
13170
rslt = bnlog_r( irank ,rex ,sgnRe(imx,1) )
13174
if (abs(xx-1).le.EPSN*10) then
13178
rslt = rslt - aa/ii
13183
yy = olog(1-1/xx,0)
13185
if (aa.ge.thrs(6,irank,prcpar)) then
13187
rslt = aCoef(irank,irank)
13190
rslt = aCoef(ii-1,irank) + xx*rslt
13193
rslt = omx*yy - rslt/aCoef(irank,irank)
13194
! if (irank.eq.0) then
13195
! rslt = (1-xx)*yy - 1
13196
! elseif (irank.eq.1) then
13197
! rslt = (1-xx)*(1+xx)*yy - (1+xx*2)/2
13198
! elseif (irank.eq.2) then
13199
! rslt = (1-xx)*(1+xx*(1+xx))*yy - (2+xx*(3+xx*6))/6
13200
! elseif (irank.eq.3) then
13201
! rslt = (1-xx)*(1+xx*(1+xx*(1+xx)))*yy &
13202
! - (3+xx*(4+xx*(6+xx*12)))/12
13203
! elseif (irank.eq.4) then
13204
! rslt = (1-xx)*(1+xx*(1+xx*(1+xx*(1+xx))))*yy &
13205
! - (12+xx*(15+xx*(20+xx*(30+xx*60))))/60
13208
elseif (aa.ge.thrs(5,irank,prcpar)) then ;nn=ntrm(6,irank,prcpar)
13209
elseif (aa.ge.thrs(4,irank,prcpar)) then ;nn=ntrm(5,irank,prcpar)
13210
elseif (aa.ge.thrs(3,irank,prcpar)) then ;nn=ntrm(4,irank,prcpar)
13211
elseif (aa.ge.thrs(2,irank,prcpar)) then ;nn=ntrm(3,irank,prcpar)
13212
elseif (aa.ge.thrs(1,irank,prcpar)) then ;nn=ntrm(2,irank,prcpar)
13213
else ;nn=ntrm(1,irank,prcpar)
13216
rslt = coeff(nn,irank)
13217
do ii=nn-1,2+irank,-1
13218
rslt = coeff(ii,irank) + yy*rslt
13220
rslt = -(irank+1)*rslt*yy*(yy*xx)**(irank+1)
13223
if (abs(aimag(rslt)).le.EPSN*abs(aa)) rslt = acmplx(aa)
13228
function bnlog_r( irank ,xx ,sgn ) result(rslt)
13229
!*******************************************************************
13230
!*******************************************************************
13231
integer ,intent(in) :: irank
13234
integer ,intent(in) :: sgn
13242
if (abs(xx).eq.RZRO) then
13243
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop bnlog_r: ' &
13244
,'argument xx=',trim(myprint(xx,8)),', returning 0'
13247
elseif (abs(xx-1).le.EPSN*10) then
13251
rslt = rslt - aa/ii
13257
y_lt_0 = (yy.lt.RZRO)
13260
aa = sqrt(yy*yy+ONEPI*ONEPI)
13270
omx = (1-xx)*omx ! (1-x^{rank+1})
13272
if (aa.ge.thrs(6,irank,prcpar)) then
13273
rslt = aCoef(irank,irank)
13275
rslt = aCoef(ii-1,irank) + xx*rslt
13277
rslt = omx*yy - rslt/aCoef(irank,irank)
13278
! if (irank.eq.0) then
13279
! rslt = omx*yy - 1
13280
! elseif (irank.eq.1) then
13281
! rslt = omx*yy - (1+xx*2)/2
13282
! elseif (irank.eq.2) then
13283
! rslt = omx*yy - (2+xx*(3+xx*6))/6
13284
! elseif (irank.eq.3) then
13285
! rslt = omx*yy - (3+xx*(4+xx*(6+xx*12)))/12
13286
! elseif (irank.eq.4) then
13287
! rslt = omx*yy - (12+xx*(15+xx*(20+xx*(30+xx*60))))/60
13289
if (y_lt_0) rslt = rslt + sgn*omx*IPI
13291
elseif (aa.ge.thrs(5,irank,prcpar)) then ;nn=ntrm(6,irank,prcpar)
13292
elseif (aa.ge.thrs(4,irank,prcpar)) then ;nn=ntrm(5,irank,prcpar)
13293
elseif (aa.ge.thrs(3,irank,prcpar)) then ;nn=ntrm(4,irank,prcpar)
13294
elseif (aa.ge.thrs(2,irank,prcpar)) then ;nn=ntrm(3,irank,prcpar)
13295
elseif (aa.ge.thrs(1,irank,prcpar)) then ;nn=ntrm(2,irank,prcpar)
13296
else ;nn=ntrm(1,irank,prcpar)
13299
aa = coeff(nn,irank)
13300
do ii=nn-1,2+irank,-1
13301
aa = coeff(ii,irank) + yy*aa
13303
rslt = -(irank+1)*aa*yy*(yy*xx)**(irank+1)
13304
if (y_lt_0) rslt = rslt + sgn*omx*IPI
13311
module avh_olo_qp_qmplx
13313
use avh_olo_qp_prec
13314
use avh_olo_qp_auxfun
13315
use avh_olo_qp_olog
13316
use avh_olo_qp_dilog
13320
public :: qmplx_type,qonv,directly,sheet,logc,logc2,li2c,li2c2
13321
public :: operator (*) ,operator (/)
13330
module procedure qonv_cr,qonv_ci,qonv_c,qonv_i
13333
interface operator (*)
13334
module procedure prduct_qq,prduct_qr
13336
interface operator (/)
13337
module procedure ratio_qq,ratio_qr
13343
function qonv_cr(xx,sgn) result(rslt)
13344
!*******************************************************************
13345
! zz=rslt%c ,iz=rslt%p
13346
! Determine zz,iz such that xx = zz*exp(iz*imag*pi) and Re(zz)
13347
! is positive. If Im(x)=0 and Re(x)<0 then iz becomes the
13349
!*******************************************************************
13354
type(qmplx_type) :: rslt
13358
if (xre.ge.RZRO) then
13363
if (xim.eq.RZRO) then
13365
rslt%p = sgnRe(sgn)
13368
rslt%p = sgnRe(xim) ! xim = -Im(rslt%c)
13373
function qonv_ci(xx,sgn) result(rslt)
13374
!*******************************************************************
13375
! zz=rslt%c ,iz=rslt%p
13376
! Determine zz,iz such that xx = zz*exp(iz*imag*pi) and Re(zz)
13377
! is positive. If Im(x)=0 and Re(x)<0 then iz becomes the
13379
!*******************************************************************
13382
integer ,intent(in) :: sgn
13383
type(qmplx_type) :: rslt
13387
if (xre.ge.RZRO) then
13392
if (xim.eq.RZRO) then
13394
rslt%p = sign(1,sgn)
13397
rslt%p = sgnRe(xim) ! xim = -Im(rslt%c)
13402
function qonv_c(xx) result(rslt)
13403
!*******************************************************************
13404
! zz=rslt%c ,iz=rslt%p
13405
! Determine zz,iz such that xx = zz*exp(iz*imag*pi) and Re(zz)
13406
! is positive. If Im(x)=0 and Re(x)<0 then iz=1
13407
!*******************************************************************
13410
type(qmplx_type) :: rslt
13414
if (xre.ge.RZRO) then
13419
if (xim.eq.RZRO) then
13420
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop qonv_c: ' &
13421
,'negative input with undefined sign for the imaginary part, ' &
13427
rslt%p = sgnRe(xim) ! xim = -Im(rslt%c)
13432
function qonv_i(xx) result(rslt)
13433
!*******************************************************************
13434
! zz=rslt%c ,iz=rslt%p
13435
! Determine zz,iz such that xx = zz*exp(iz*imag*pi) and Re(zz)
13436
! is positive. If Im(x)=0 and Re(x)<0 then iz=1
13437
!*******************************************************************
13438
integer ,intent(in) :: xx
13439
type(qmplx_type) :: rslt
13444
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop qonv_i: ' &
13445
,'negative input with undefined sign for the imaginary part, ' &
13452
function directly(xx,ix) result(rslt)
13453
!*******************************************************************
13454
!*******************************************************************
13457
integer ,intent(in) :: ix
13458
type(qmplx_type) :: rslt
13464
function sheet(xx) result(ii)
13465
!*******************************************************************
13466
! Returns the number of the Riemann-sheet (times 2) for the complex
13467
! number xx*exp(ix*imag*pi) . The real part of xx is assumed to be
13468
! positive or zero. Examples:
13469
! xx=1+imag, ix=-1 -> ii= 0
13470
! xx=1+imag, ix= 1 -> ii= 2
13471
! xx=1-imag, ix=-1 -> ii=-2
13472
! xx=1-imag, ix= 1 -> ii= 0
13473
! xx=1 , ix= 1 -> ii= 0 convention that log(-1)=pi on
13474
! xx=1 , ix=-1 -> ii=-2 the principal Riemann-sheet
13475
!*******************************************************************
13476
type(qmplx_type) ,intent(in) :: xx
13483
if (xim.le.RZRO) then ! also xim=0 <==> log(-1)=pi, not -pi
13484
if (jj.eq.-1) ii = ii-2
13486
if (jj.eq. 1) ii = ii+2
13491
function prduct_qq(yy,xx) result(zz)
13492
!*******************************************************************
13493
! Return the product zz of yy and xx
13494
! keeping track of (the multiple of pi of) the phase %p such that
13495
! the real part of zz%c remains positive
13496
!*******************************************************************
13497
type(qmplx_type) ,intent(in) :: yy,xx
13498
type(qmplx_type) :: zz
13501
if (areal(zz%c).lt.RZRO) then
13502
zz%p = zz%p + sgnIm(xx%c)
13507
function prduct_qr(yy,xx) result(zz)
13508
!*******************************************************************
13509
! Return the product zz of yy and xx
13510
! keeping track of (the multiple of pi of) the phase %p such that
13511
! the real part of zz%c remains positive
13512
!*******************************************************************
13513
type(qmplx_type) ,intent(in) :: yy
13516
type(qmplx_type) :: zz
13517
zz%c = yy%c*abs(xx)
13521
function ratio_qq(yy,xx) result(zz)
13522
!*******************************************************************
13523
! Return the ratio zz of yy and xx
13524
! keeping track of (the multiple of pi of) the phase %p such that
13525
! the real part of zz%c remains positive
13526
!*******************************************************************
13527
type(qmplx_type) ,intent(in) :: yy,xx
13528
type(qmplx_type) :: zz
13531
if (areal(zz%c).lt.RZRO) then
13532
zz%p = zz%p - sgnIm(xx%c)
13537
function ratio_qr(yy,xx) result(zz)
13538
!*******************************************************************
13539
!*******************************************************************
13540
type(qmplx_type) ,intent(in) :: yy
13543
type(qmplx_type) :: zz
13544
zz%c = yy%c/abs(xx)
13549
function logc(xx) result(rslt)
13550
!*******************************************************************
13552
!*******************************************************************
13553
type(qmplx_type) ,intent(in) :: xx
13556
! rslt = olog(acmplx(xx%c),xx%p)
13557
rslt = olog(xx%c,xx%p)
13560
function logc2(xx) result(rslt)
13561
!*******************************************************************
13563
!*******************************************************************
13564
type(qmplx_type) ,intent(in) :: xx
13567
! rslt = -olog2(acmplx(xx%c),xx%p)
13568
rslt = -olog2(xx%c,xx%p)
13571
function li2c(xx) result(rslt)
13572
!*******************************************************************
13573
! /1 ln(1-(1-xx)*t)
13574
! - | dt --------------
13576
!*******************************************************************
13577
type(qmplx_type) ,intent(in) :: xx
13580
! rslt = dilog(acmplx(xx%c),xx%p)
13581
rslt = dilog(xx%c,xx%p)
13584
function li2c2(xx,yy) result(rslt)
13585
!*******************************************************************
13586
! ( li2(xx) - li2(yy) )/(xx-yy)
13587
!*******************************************************************
13588
type(qmplx_type) ,intent(in) :: xx,yy
13591
! rslt = dilog( acmplx(xx%c),xx%p ,acmplx(yy%c),yy%p )
13592
! write(*,*) 'li2c2 x:',xx%c,xx%p !DEBUG
13593
! write(*,*) 'li2c2 y:',yy%c,yy%p !DEBUG
13594
rslt = dilog( xx%c,xx%p ,yy%c,yy%p )
13595
! write(*,*) 'li2c2 out:',rslt !DEBUG
13602
module avh_olo_qp_bub
13604
use avh_olo_qp_prec
13605
use avh_olo_qp_auxfun
13606
use avh_olo_qp_bnlog
13607
use avh_olo_qp_qmplx
13610
public :: tadp ,tadpn ,bub0 ,bub1 ,bub11 ,bub111 ,bub1111
13614
subroutine tadp( rslt ,mm ,amm ,rmu2 )
13615
!*******************************************************************
13616
! The 1-loop scalar 1-point function.
13617
!*******************************************************************
13619
,intent(out) :: rslt(0:2)
13623
,intent(in) :: amm,rmu2
13626
if (amm.eq.RZRO.or.mm.eq.CZRO) then
13631
rslt(0) = mm - mm*logc( qonv(mm/rmu2,-1) )
13636
subroutine tadpn( rslt ,rank ,mm ,amm ,rmu2 )
13637
!*******************************************************************
13638
! The 1-loop tensor 1-point functions.
13641
! rslt(:,2) = A0000 etc.
13642
! For input rank only rslt(:,0:rank/2) is filled.
13643
!*******************************************************************
13645
,intent(out) :: rslt(0:,0:)
13649
,intent(in) :: amm,rmu2
13650
integer ,intent(in) :: rank
13662
if (amm.eq.RZRO.or.mm.eq.CZRO) then
13666
rslt(0,0) = mm - mm*logc( qonv(mm/rmu2,-1) )
13670
aa = aa*mm/(2*(ii+1))
13671
bb = bb + RONE/(ii+1)
13672
rslt(1,ii) = aa*( rslt(1,0) )
13673
rslt(0,ii) = aa*( rslt(0,0) + mm*bb )
13679
!*******************************************************************
13680
! Return the Passarino-Veltman functions
13683
! ------ | -------------------- = b0
13684
! i*pi^2 / [q^2-m0][(q+p)^2-m1]
13686
! C / d^(Dim)q q^mu
13687
! ------ | -------------------- = p^mu b1
13688
! i*pi^2 / [q^2-m0][(q+p)^2-m1]
13690
! C / d^(Dim)q q^mu q^nu
13691
! ------ | -------------------- = g^{mu,nu} b00 + p^mu p^nu b11
13692
! i*pi^2 / [q^2-m0][(q+p)^2-m1]
13696
! Based on the formulas from
13697
! A. Denner, M. Dittmaier, Nucl.Phys. B734 (2006) 62-115
13698
!*******************************************************************
13700
subroutine bub0( b0 &
13701
,pp,m0i,m1i ,app,am0i,am1i ,rmu2 )
13703
,intent(out) :: b0(0:2)
13705
,intent(in) :: pp,m0i,m1i
13707
,intent(in) :: app,am0i,am1i,rmu2
13709
:: m0,m1,a0(0:2,0:1),lna,x1,x2,lambda
13714
maxm = max(am0i,am1i)
13715
if (maxm.eq.RZRO) then
13716
if (app.eq.RZRO) then
13717
b0(0)=0 ;b0(1)=0 ;b0(2)=0
13722
if (am1i.ge.maxm) then
13733
if (app.eq.RZRO) then
13734
if (abs(m0-m1).le.am1*EPSN*10) then
13735
lna = -logc(qonv(m1/rmu2,-1))
13738
lna = -logc(qonv(m1/rmu2,-1))
13739
x1 = (m1-am1*IEPS)/(m1-m0)
13740
b0(0) = lna - bnlog(0,x1)
13742
elseif (am0.eq.RZRO) then
13743
if (abs(pp-m1).le.am1*EPSN*10) then
13744
lna = -logc(qonv(m1/rmu2,-1))
13745
b0(0) = ( lna + 2 )
13747
lna = -logc(qonv((m1-pp)/rmu2,-1))
13748
x1 = (pp-m1+am1*IEPS)/pp
13749
b0(0) = ( lna-bnlog(0,x1) + 1 )
13752
lna = -logc(qonv(m0/rmu2,-1))
13753
call solabc( x1,x2 ,lambda ,pp ,(m1-m0)-pp ,m0-am0*IEPS ,0 )
13754
b0(0) = ( lna - bnlog(0,x1) - bnlog(0,x2) )
13759
subroutine bub1( b1,b0 &
13760
,pp,m0i,m1i ,app,am0i,am1i ,rmu2 )
13762
,intent(out) :: b1(0:2),b0(0:2)
13764
,intent(in) :: pp,m0i,m1i
13766
,intent(in) :: app,am0i,am1i,rmu2
13768
:: m0,m1,a0(0:2,0:1),lna,x1,x2,lambda
13774
maxm = max(am0i,am1i)
13775
if (maxm.eq.RZRO) then
13776
if (app.eq.RZRO) then
13777
b0(0)=0 ;b0(1)=0 ;b0(2)=0
13778
b1(0)=0 ;b1(1)=0 ;b1(2)=0
13783
if (am1i.ge.maxm) then
13798
if (app.eq.RZRO) then
13799
if (abs(m0-m1).le.am1*EPSN*10) then
13800
lna = -logc(qonv(m1/rmu2,-1))
13804
lna = -logc(qonv(m1/rmu2,-1))
13805
x1 = (m1-am1*IEPS)/(m1-m0)
13806
b0(0) = lna - bnlog(0,x1)
13807
b1(0) =-( lna - bnlog(1,x1) )/2
13812
b1(0) =-b0(0)-b1(0)
13814
elseif (am0.eq.RZRO) then
13815
if (abs(pp-m1).le.am1*EPSN*10) then
13816
lna = -logc(qonv(m1/rmu2,-1))
13817
b0(0) = ( lna + 2 )
13818
b1(0) =-( lna*2 + 2 )/4
13820
lna = -logc(qonv((m1-pp)/rmu2,-1))
13821
x1 = (pp-m1+am1*IEPS)/pp
13822
b0(0) = ( lna-bnlog(0,x1) + 1 )
13823
b1(0) =-( (lna-bnlog(1,x1))*2 + 1 )/4
13827
b1(0) =-b0(0)-b1(0)
13830
lna = -logc(qonv(m0/rmu2,-1))
13831
call solabc( x1,x2 ,lambda ,pp ,(m1-m0)-pp ,m0-am0*IEPS ,0 )
13832
b0(0) = ( lna - bnlog(0,x1) - bnlog(0,x2) )
13833
b1(0) =-( lna - bnlog(1,x1) - bnlog(1,x2) )/2
13836
b1(0) =-b0(0)-b1(0)
13842
subroutine bub11( b11,b00,b1,b0 &
13843
,pp,m0i,m1i ,app,am0i,am1i ,rmu2 )
13845
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
13847
,intent(in) :: pp,m0i,m1i
13849
,intent(in) :: app,am0i,am1i,rmu2
13851
:: m0,m1,a0(0:2,0:1),lna,x1,x2,lambda
13857
maxm = max(am0i,am1i)
13858
if (maxm.eq.RZRO) then
13859
if (app.eq.RZRO) then
13860
b0(0)=0 ;b0(1)=0 ;b0(2)=0
13861
b1(0)=0 ;b1(1)=0 ;b1(2)=0
13862
b00(0)=0 ;b00(1)=0 ;b00(2)=0
13863
b11(0)=0 ;b11(1)=0 ;b11(2)=0
13868
if (am1i.ge.maxm) then
13885
if (app.eq.RZRO) then
13886
if (abs(m0-m1).le.am1*EPSN*10) then
13887
lna = -logc(qonv(m1/rmu2,-1))
13892
lna = -logc(qonv(m1/rmu2,-1))
13893
x1 = (m1-am1*IEPS)/(m1-m0)
13894
b0(0) = lna - bnlog(0,x1)
13895
b1(0) =-( lna - bnlog(1,x1) )/2
13896
b11(0) = ( lna - bnlog(2,x1) )/3
13901
b11(0) = b11(0)+2*b1(0)+b0(0)
13902
b1(0) =-b0(0)-b1(0)
13904
elseif (am0.eq.RZRO) then
13905
if (abs(pp-m1).le.am1*EPSN*10) then
13906
lna = -logc(qonv(m1/rmu2,-1))
13907
b0(0) = ( lna + 2 )
13908
b1(0) =-( lna*2 + 2 )/4
13909
b11(0) = ( lna*3 + 2 )/9
13911
lna = -logc(qonv((m1-pp)/rmu2,-1))
13912
x1 = (pp-m1+am1*IEPS)/pp
13913
b0(0) = ( lna-bnlog(0,x1) + 1 )
13914
b1(0) =-( (lna-bnlog(1,x1))*2 + 1 )/4
13915
b11(0) = ( (lna-bnlog(2,x1))*3 + 1 )/9
13919
b11(0) = b11(0)+2*b1(0)+b0(0)
13920
b1(0) =-b0(0)-b1(0)
13923
lna = -logc(qonv(m0/rmu2,-1))
13924
call solabc( x1,x2 ,lambda ,pp ,(m1-m0)-pp ,m0-am0*IEPS ,0 )
13925
b0(0) = ( lna - bnlog(0,x1) - bnlog(0,x2) )
13926
b1(0) =-( lna - bnlog(1,x1) - bnlog(1,x2) )/2
13927
b11(0) = ( lna - bnlog(2,x1) - bnlog(2,x2) )/3
13930
b11(0) = b11(0)+2*b1(0)+b0(0)
13931
b1(0) =-b0(0)-b1(0)
13936
call tadpn( a0 ,rank ,m1 ,am1 ,rmu2 )
13940
b00(1) = ( a0(1,0) - x1*b1(1) + x2*b0(1) )/6
13941
b00(0) = ( a0(0,0) - x1*b1(0) + x2*b0(0) + 4*b00(1) )/6
13944
subroutine bub111( b111,b001,b11,b00,b1,b0 &
13945
,pp,m0i,m1i ,app,am0i,am1i ,rmu2 )
13947
,intent(out) :: b111(0:2),b001(0:2),b11(0:2),b00(0:2),b1(0:2),b0(0:2)
13949
,intent(in) :: pp,m0i,m1i
13951
,intent(in) :: app,am0i,am1i,rmu2
13953
:: m0,m1,a0(0:2,0:1),lna,x1,x2,lambda
13959
maxm = max(am0i,am1i)
13960
if (maxm.eq.RZRO) then
13961
if (app.eq.RZRO) then
13962
b0(0)=0 ;b0(1)=0 ;b0(2)=0
13963
b1(0)=0 ;b1(1)=0 ;b1(2)=0
13964
b00(0)=0 ;b00(1)=0 ;b00(2)=0
13965
b11(0)=0 ;b11(1)=0 ;b11(2)=0
13966
b001(0)=0 ;b001(1)=0 ;b001(2)=0
13967
b111(0)=0 ;b111(1)=0 ;b111(2)=0
13972
if (am1i.ge.maxm) then
13991
if (app.eq.RZRO) then
13992
if (abs(m0-m1).le.am1*EPSN*10) then
13993
lna = -logc(qonv(m1/rmu2,-1))
13999
lna = -logc(qonv(m1/rmu2,-1))
14000
x1 = (m1-am1*IEPS)/(m1-m0)
14001
b0(0) = lna - bnlog(0,x1)
14002
b1(0) =-( lna - bnlog(1,x1) )/2
14003
b11(0) = ( lna - bnlog(2,x1) )/3
14004
b111(0) =-( lna - bnlog(3,x1) )/4
14009
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14010
b11(0) = b11(0)+2*b1(0)+b0(0)
14011
b1(0) =-b0(0)-b1(0)
14013
elseif (am0.eq.RZRO) then
14014
if (abs(pp-m1).le.am1*EPSN*10) then
14015
lna = -logc(qonv(m1/rmu2,-1))
14016
b0(0) = ( lna + 2 )
14017
b1(0) =-( lna*2 + 2 )/4
14018
b11(0) = ( lna*3 + 2 )/9
14019
b111(0) =-( lna*4 + 2 )/16
14021
lna = -logc(qonv((m1-pp)/rmu2,-1))
14022
x1 = (pp-m1+am1*IEPS)/pp
14023
b0(0) = ( lna-bnlog(0,x1) + 1 )
14024
b1(0) =-( (lna-bnlog(1,x1))*2 + 1 )/4
14025
b11(0) = ( (lna-bnlog(2,x1))*3 + 1 )/9
14026
b111(0) =-( (lna-bnlog(3,x1))*4 + 1 )/16
14030
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14031
b11(0) = b11(0)+2*b1(0)+b0(0)
14032
b1(0) =-b0(0)-b1(0)
14035
lna = -logc(qonv(m0/rmu2,-1))
14036
call solabc( x1,x2 ,lambda ,pp ,(m1-m0)-pp ,m0-am0*IEPS ,0 )
14037
b0(0) = ( lna - bnlog(0,x1) - bnlog(0,x2) )
14038
b1(0) =-( lna - bnlog(1,x1) - bnlog(1,x2) )/2
14039
b11(0) = ( lna - bnlog(2,x1) - bnlog(2,x2) )/3
14040
b111(0) =-( lna - bnlog(3,x1) - bnlog(3,x2) )/4
14043
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14044
b11(0) = b11(0)+2*b1(0)+b0(0)
14045
b1(0) =-b0(0)-b1(0)
14051
call tadpn( a0 ,rank ,m1 ,am1 ,rmu2 )
14055
b00(1) = ( a0(1,0) - x1*b1(1) + x2*b0(1) )/6
14056
b00(0) = ( a0(0,0) - x1*b1(0) + x2*b0(0) + 4*b00(1) )/6
14058
b001(1) = (-a0(1,0) - x1*b11(1) + x2*b1(1) )/8
14059
b001(0) = (-a0(0,0) - x1*b11(0) + x2*b1(0) + 4*b001(1) )/8
14062
subroutine bub1111( b1111,b0011,b0000,b111,b001,b11,b00,b1,b0 &
14063
,pp,m0i,m1i ,app,am0i,am1i ,rmu2 )
14065
,intent(out) :: b1111(0:2),b0011(0:2),b0000(0:2) &
14066
,b111(0:2),b001(0:2),b11(0:2),b00(0:2),b1(0:2),b0(0:2)
14068
,intent(in) :: pp,m0i,m1i
14070
,intent(in) :: app,am0i,am1i,rmu2
14072
:: m0,m1,a0(0:2,0:1),lna,x1,x2,lambda
14078
maxm = max(am0i,am1i)
14079
if (maxm.eq.RZRO) then
14080
if (app.eq.RZRO) then
14081
b0(0)=0 ;b0(1)=0 ;b0(2)=0
14082
b1(0)=0 ;b1(1)=0 ;b1(2)=0
14083
b00(0)=0 ;b00(1)=0 ;b00(2)=0
14084
b11(0)=0 ;b11(1)=0 ;b11(2)=0
14085
b001(0)=0 ;b001(1)=0 ;b001(2)=0
14086
b111(0)=0 ;b111(1)=0 ;b111(2)=0
14087
b0000(0)=0 ;b0000(1)=0 ;b0000(2)=0
14088
b0011(0)=0 ;b0011(1)=0 ;b0011(2)=0
14089
b1111(0)=0 ;b1111(1)=0 ;b1111(2)=0
14094
if (am1i.ge.maxm) then
14115
if (app.eq.RZRO) then
14116
if (abs(m0-m1).le.am1*EPSN*10) then
14117
lna = -logc(qonv(m1/rmu2,-1))
14124
lna = -logc(qonv(m1/rmu2,-1))
14125
x1 = (m1-am1*IEPS)/(m1-m0)
14126
b0(0) = lna - bnlog(0,x1)
14127
b1(0) =-( lna - bnlog(1,x1) )/2
14128
b11(0) = ( lna - bnlog(2,x1) )/3
14129
b111(0) =-( lna - bnlog(3,x1) )/4
14130
b1111(0) = ( lna - bnlog(4,x1) )/5
14135
b1111(0) =-b1111(0)-4*b111(0)-6*b11(0)-4*b1(0)-b0(0)
14136
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14137
b11(0) = b11(0)+2*b1(0)+b0(0)
14138
b1(0) =-b0(0)-b1(0)
14140
elseif (am0.eq.RZRO) then
14141
if (abs(pp-m1).le.am1*EPSN*10) then
14142
lna = -logc(qonv(m1/rmu2,-1))
14143
b0(0) = ( lna + 2 )
14144
b1(0) =-( lna*2 + 2 )/4
14145
b11(0) = ( lna*3 + 2 )/9
14146
b111(0) =-( lna*4 + 2 )/16
14147
b1111(0) = ( lna*5 + 2 )/25
14149
lna = -logc(qonv((m1-pp)/rmu2,-1))
14150
x1 = (pp-m1+am1*IEPS)/pp
14151
b0(0) = ( lna-bnlog(0,x1) + 1 )
14152
b1(0) =-( (lna-bnlog(1,x1))*2 + 1 )/4
14153
b11(0) = ( (lna-bnlog(2,x1))*3 + 1 )/9
14154
b111(0) =-( (lna-bnlog(3,x1))*4 + 1 )/16
14155
b1111(0) = ( (lna-bnlog(4,x1))*5 + 1 )/25
14159
b1111(0) =-b1111(0)-4*b111(0)-6*b11(0)-4*b1(0)-b0(0)
14160
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14161
b11(0) = b11(0)+2*b1(0)+b0(0)
14162
b1(0) =-b0(0)-b1(0)
14165
lna = -logc(qonv(m0/rmu2,-1))
14166
call solabc( x1,x2 ,lambda ,pp ,(m1-m0)-pp ,m0-am0*IEPS ,0 )
14167
b0(0) = ( lna - bnlog(0,x1) - bnlog(0,x2) )
14168
b1(0) =-( lna - bnlog(1,x1) - bnlog(1,x2) )/2
14169
b11(0) = ( lna - bnlog(2,x1) - bnlog(2,x2) )/3
14170
b111(0) =-( lna - bnlog(3,x1) - bnlog(3,x2) )/4
14171
b1111(0) = ( lna - bnlog(4,x1) - bnlog(4,x2) )/5
14174
b1111(0) =-b1111(0)-4*b111(0)-6*b11(0)-4*b1(0)-b0(0)
14175
b111(0) =-b111(0)-3*b11(0)-3*b1(0)-b0(0)
14176
b11(0) = b11(0)+2*b1(0)+b0(0)
14177
b1(0) =-b0(0)-b1(0)
14184
call tadpn( a0 ,rank ,m1 ,am1 ,rmu2 )
14188
b00(1) = ( a0(1,0) - x1*b1(1) + x2*b0(1) )/6
14189
b00(0) = ( a0(0,0) - x1*b1(0) + x2*b0(0) + 4*b00(1) )/6
14191
b001(1) = (-a0(1,0) - x1*b11(1) + x2*b1(1) )/8
14192
b001(0) = (-a0(0,0) - x1*b11(0) + x2*b1(0) + 4*b001(1) )/8
14194
b0000(1) = ( a0(1,1) - x1*b001(1) + x2*b00(1) )/10
14195
b0000(0) = ( a0(0,1) - x1*b001(0) + x2*b00(0) + 4*b0000(1) )/10
14197
b0011(1) = ( a0(1,0) - x1*b111(1) + x2*b11(1) )/10
14198
b0011(0) = ( a0(0,0) - x1*b111(0) + x2*b11(0) + 4*b0011(1) )/10
14204
module avh_olo_qp_tri
14206
use avh_olo_qp_prec
14207
use avh_olo_qp_auxfun
14208
use avh_olo_qp_qmplx
14211
public :: tria0,tria1,tria2,tria3,tria4,trif0,trif1,trif2,trif3 &
14213
,permtable,casetable,base
14214
integer ,parameter :: permtable(3,0:7)=reshape((/ &
14215
1,2,3 &! 0, 0 masses non-zero, no permutation
14216
,1,2,3 &! 1, 1 mass non-zero, no permutation
14217
,3,1,2 &! 2, 1 mass non-zero, 1 cyclic permutation
14218
,1,2,3 &! 3, 2 masses non-zero, no permutation
14219
,2,3,1 &! 4, 1 mass non-zero, 2 cyclic permutations
14220
,2,3,1 &! 5, 2 masses non-zero, 2 cyclic permutations
14221
,3,1,2 &! 6, 2 masses non-zero, 1 cyclic permutation
14222
,1,2,3 &! 7, 3 masses non-zero, no permutation
14223
/) ,(/3,8/)) ! 0,1,2,3,4,5,6,7
14224
integer ,parameter :: casetable(0:7)=(/0,1,1,2,1,2,2,3/)
14225
integer ,parameter :: base(3)=(/4,2,1/)
14229
subroutine tria4( rslt ,cpp,cm2,cm3 ,rmu2 )
14230
!*******************************************************************
14233
! ------ | ----------------------------------
14234
! i*pi^2 / q^2 [(q+k1)^2-m2] [(q+k1+k2)^2-m3]
14236
! with k1^2=m2, k2^2=pp, (k1+k2)^2=m3.
14237
! m2,m3 should NOT be identically 0d0.
14238
!*******************************************************************
14240
,intent(out) :: rslt(0:2)
14242
,intent(in) :: cm2,cm3,cpp
14244
,intent(in) :: rmu2
14245
type(qmplx_type) :: q23,qm3,q32
14247
:: sm2,sm3,k23,r23,d23,cc
14251
k23 = (cm2+cm3-cpp)/(sm2*sm3)
14252
call rfun( r23,d23, k23 )
14253
if (r23.eq.-CONE) then
14254
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop tria4: ' &
14255
,'threshold singularity, returning 0'
14256
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14260
qm3 = qonv(cm3/rmu2,-1)
14261
q32 = qonv(sm3)/qonv(sm2)
14264
cc = logc2(q23) * r23/(1+r23)/(sm2*sm3)
14266
rslt(0) = cc*( logc(qm3) - logc(q23) ) &
14267
- li2c2(q32*q23,q32/q23) / cm2 &
14268
+ li2c2(q23*q23,qonv(1)) * r23/(sm2*sm3)
14272
subroutine tria3( rslt ,cp2,cp3,cm3 ,rmu2 )
14273
!*******************************************************************
14276
! ------ | -----------------------------
14277
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3]
14279
! with p2=k2^2, p3=(k1+k2)^2.
14280
! mm should NOT be identically 0d0,
14281
! and p2 NOR p3 should be identical to mm.
14282
!*******************************************************************
14284
,intent(out) :: rslt(0:2)
14286
,intent(in) :: cp2,cp3,cm3
14288
,intent(in) :: rmu2
14289
type(qmplx_type) :: q13,q23,qm3,x1,x2
14301
rslt(1) = -logc2( q23/q13 )/r13
14302
rslt(0) = -li2c2( x1,x2 )/cm3 &
14303
- rslt(1)*( logc(x1*x2)+logc(qm3/rmu2) )
14307
subroutine tria2( rslt ,cp3,cm3 ,rmu2 )
14308
!*******************************************************************
14311
! ------ | -----------------------------
14312
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3]
14314
! with k1^2 = 0 , k2^2 = m3 and (k1+k2)^2 = p3.
14315
! mm should NOT be identically 0d0,
14316
! and pp should NOT be identical to mm.
14317
!*******************************************************************
14319
,intent(out) :: rslt(0:2)
14321
,intent(in) :: cp3,cm3
14323
,intent(in) :: rmu2
14324
type(qmplx_type) :: q13,qm3,qxx
14326
:: r13,logm,z2,z1,z0,cc
14331
logm = logc( qm3/rmu2 )
14336
z0 = PISQo24 + z1*z1/2 - li2c(qxx)
14339
rslt(1) = cc*(z1 - z2*logm)
14340
rslt(0) = cc*(z0 + (z2*logm/2-z1)*logm)
14344
subroutine tria1( rslt ,cm3 ,rmu2 )
14345
!*******************************************************************
14348
! ------ | -----------------------------
14349
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3]
14351
! with k1^2 = (k1+k2)^2 = m3.
14352
! mm should NOT be identically 0d0.
14353
!*******************************************************************
14355
,intent(out) :: rslt(0:2)
14359
,intent(in) :: rmu2
14366
rslt(0) = zm*( 2 + logc(qonv(cm3/rmu2,-1)) )
14370
subroutine tria0( rslt ,cp ,ap ,rmu2 )
14371
!*******************************************************************
14374
! ------ | ------------------------
14375
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2
14377
! with Dim = 4-2*eps
14378
! C = pi^eps * mu^(2*eps) * exp(gamma_Euler*eps)
14380
! input: p1 = k1^2, p2 = k2^2, p3 = k3^2
14381
! output: rslt(0) = eps^0 -coefficient
14382
! rslt(1) = eps^(-1)-coefficient
14383
! rslt(2) = eps^(-2)-coefficient
14385
! If any of these numbers is IDENTICALLY 0d0, the corresponding
14386
! IR-singular case is returned.
14387
!*******************************************************************
14388
use avh_olo_qp_olog
14390
,intent(out) :: rslt(0:2)
14392
,intent(in) :: cp(3)
14394
,intent(in) :: ap(3),rmu2
14396
:: pp(3),rp1,rp2,rp3
14399
integer :: icase,i1,i2,i3
14406
if (ap(1).gt.RZRO) icase = icase + base(1)
14407
if (ap(2).gt.RZRO) icase = icase + base(2)
14408
if (ap(3).gt.RZRO) icase = icase + base(3)
14409
rp1 = pp(permtable(1,icase))
14410
rp2 = pp(permtable(2,icase))
14411
rp3 = pp(permtable(3,icase))
14412
icase = casetable( icase)
14414
i1=0 ;if (-rp1.lt.RZRO) i1=-1
14415
i2=0 ;if (-rp2.lt.RZRO) i2=-1
14416
i3=0 ;if (-rp3.lt.RZRO) i3=-1
14418
if (icase.eq.0) then
14419
! 0 masses non-zero
14420
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop tria0: ' &
14421
,'all external masses equal zero, returning 0'
14422
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14423
elseif (icase.eq.1) then
14425
log3 = olog( abs(rp3/rmu2) ,i3 )
14427
rslt(1) = -log3/rp3
14428
rslt(0) = ( log3**2/2 - 2*PISQo24 )/rp3
14429
elseif (icase.eq.2) then
14430
! 2 masses non-zero
14431
log2 = olog( abs(rp2/rmu2) ,i2 )
14432
log3 = olog( abs(rp3/rmu2) ,i3 )
14434
rslt(1) = -olog2( abs(rp3/rp2) ,i3-i2 )/rp2
14435
rslt(0) = -rslt(1)*(log3+log2)/2
14436
elseif (icase.eq.3) then
14437
! 3 masses non-zero
14438
call trif0( rslt ,cp(1),cp(2),cp(3) )
14443
subroutine trif0( rslt ,p1,p2,p3 )
14444
!*******************************************************************
14445
! Finite 1-loop scalar 3-point function with all internal masses
14446
! equal zero. Obtained from the formulas for 4-point functions in
14447
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
14448
! by sending one internal mass to infinity.
14449
!*******************************************************************
14451
,intent(out) :: rslt(0:2)
14453
,intent(in) :: p1,p2,p3
14454
type(qmplx_type) :: q23,q24,q34,qx1,qx2
14456
:: r23,r24,r34,aa,bb,cc,dd,x1,x2
14465
bb = r24 + r34 - r23
14468
dd = mysqrt( bb*bb - 4*aa*cc , -areal(aa)*hh )
14469
call solabc( x1,x2,dd ,aa,bb,cc ,1 )
14479
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14481
rslt(0) = li2c2( qx1*q34 ,qx2*q34 )*r34 &
14482
+ li2c2( qx1*q24 ,qx2*q24 )*r24 &
14483
- logc2( qx1/qx2 )*logc( qx1*qx2 )/(x2*2) &
14484
- logc2( qx1/qx2 )*logc( q23 )/x2
14486
rslt(0) = rslt(0)/aa
14490
subroutine trif1( rslt ,p1i,p2i,p3i ,m3i )
14491
!*******************************************************************
14492
! Finite 1-loop scalar 3-point function with one internal masses
14493
! non-zero. Obtained from the formulas for 4-point functions in
14494
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
14495
! by sending one internal mass to infinity.
14496
!*******************************************************************
14498
,intent(out) :: rslt(0:2)
14500
,intent(in) :: p1i,p2i,p3i ,m3i
14501
type(qmplx_type) :: q23,q24,q34,qm4,qx1,qx2,qss
14503
:: p2,p3,p4,p12,p23,m4,sm2,sm3,sm4 &
14504
,aa,bb,cc,dd,x1,x2,r23,r24,r34
14507
logical :: r24Not0,r34Not0
14525
r23 = ( -p2 -p2 *IEPS )/(sm2*sm3)
14526
r24 = ( m4-p23-p23*IEPS )/(sm2*sm4)
14527
r34 = ( m4-p3 -p3 *IEPS )/(sm3*sm4)
14529
r24Not0 = (abs(areal(r24))+abs(aimag(r24)).ge.neglig(prcpar))
14530
r34Not0 = (abs(areal(r34))+abs(aimag(r34)).ge.neglig(prcpar))
14534
if (aa.eq.CZRO) then
14535
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop trif1: ' &
14536
,'threshold singularity, returning 0'
14537
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14541
bb = r24/sm3 + r34/sm2 - r23/sm4
14544
! dd = mysqrt( bb*bb - 4*aa*cc , -areal(aa)*hh )
14545
call solabc( x1,x2,dd ,aa,bb,cc ,0 )
14549
qx1 = qonv(x1 ,1) ! x1 SHOULD HAVE im. part
14550
qx2 = qonv(x2 ,1) ! x2 SHOULD HAVE im. part
14556
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14558
rslt(0) = -logc2( qx1/qx2 )*logc( qx1*qx2/(qm4*qm4) )/(x2*2) &
14559
-li2c2( qx1*qm4 ,qx2*qm4 )*sm4
14563
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r34*sm3
14568
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r24*sm2
14571
rslt(0) = rslt(0) - logc2( qx1/qx2 )*logc( q23*(mhh*mhh) )/x2
14573
rslt(0) = rslt(0)/(aa*sm2*sm3*sm4)
14577
subroutine trif2( rslt ,p1i,p2i,p3i ,m2i,m3i )
14578
!*******************************************************************
14579
! Finite 1-loop scalar 3-point function with two internal masses
14580
! non-zero. Obtained from the formulas for 4-point functions in
14581
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
14582
! by sending one internal mass to infinity.
14583
!*******************************************************************
14585
,intent(out) :: rslt(0:2)
14587
,intent(in) :: p1i,p2i,p3i ,m2i,m3i
14588
type(qmplx_type) :: q23,q34,q24,qm2,qm3,qm4,qx1,qx2,qss,qy1,qy2
14590
:: p2,p3,p23,m2,m4,sm2,sm3,sm4,aa,bb,cc,dd,x1,x2 &
14591
,r23,k24,r34,r24,d24
14592
logical :: r23Not0,r34Not0
14607
sm3 = abs(sm2) !mysqrt(m3)
14610
r23 = ( m2-p2 -p2 *IEPS )/(sm2*sm3) ! p2
14611
k24 = ( m2+m4-p23-p23*IEPS )/(sm2*sm4) ! p2+p3
14612
r34 = ( m4-p3 -p3 *IEPS )/(sm3*sm4) ! p3
14614
r23Not0 = (abs(areal(r23))+abs(aimag(r23)).ge.neglig(prcpar))
14615
r34Not0 = (abs(areal(r34))+abs(aimag(r34)).ge.neglig(prcpar))
14617
call rfun( r24,d24 ,k24 )
14621
if (aa.eq.CZRO) then
14622
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop trif2: ' &
14623
,'threshold singularity, returning 0'
14624
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14628
bb = -d24/sm3 + r34/sm2 - r23/sm4
14629
cc = (sm4/sm2 - r24)/(sm3*sm4)
14630
! hh = areal(r23 - r24*r34)
14631
! dd = mysqrt( bb*bb - 4*aa*cc , -areal(aa)*hh )
14632
call solabc(x1,x2,dd ,aa,bb,cc ,0)
14636
qx1 = qonv(x1 ,1 ) ! x1 SHOULD HAVE im. part
14637
qx2 = qonv(x2 ,1 ) ! x2 SHOULD HAVE im. part
14645
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14650
rslt(0) = li2c2( qy1*qm2 ,qy2*qm2 )/r24*sm2
14652
if (x2.ne.CZRO) then ! better to put a threshold on cc
14653
rslt(0) = rslt(0) + ( logc2( qy1/qy2 )*logc( qy1*qy2/(qm2*qm2) ) &
14654
-logc2( qx1/qx2 )*logc( qx1*qx2/(qm4*qm4) ) )/(x2*2)
14657
rslt(0) = rslt(0) - li2c2( qx1*qm4 ,qx2*qm4 )*sm4
14661
rslt(0) = rslt(0) - li2c2( qx1*qss ,qx2*qss )*r23*sm3/r24
14666
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r34*sm3
14669
rslt(0) = rslt(0)/(aa*sm2*sm3*sm4)
14673
subroutine trif3( rslt ,p1i,p2i,p3i ,m1i,m2i,m3i )
14674
!*******************************************************************
14675
! Finite 1-loop scalar 3-point function with all internal masses
14676
! non-zero. Obtained from the formulas for 4-point functions in
14677
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
14678
! by sending one internal mass to infinity.
14679
!*******************************************************************
14681
,intent(out) :: rslt(0:2)
14683
,intent(in) :: p1i,p2i,p3i,m1i,m2i,m3i
14684
type(qmplx_type) :: q12,q13,q23,qm1,qm2,qm3,qx1,qx2,qz1,qz2,qtt
14686
:: p1,p2,p3,m1,m2,m3,sm1,sm2,sm3,aa,bb,cc,dd,x1,x2 &
14687
,k12,k13,k23,r12,r13,r23,d12,d13,d23
14694
if (h2.ge.h1.and.h2.ge.h3) then
14695
p1=p3i ;p2=p1i ;p3=p2i ;m1=m3i ;m2=m1i ;m3=m2i
14697
p1=p1i ;p2=p2i ;p3=p3i ;m1=m1i ;m2=m2i ;m3=m3i
14707
if (m1+m2.ne.p1) k12 = ( m1+m2-p1-p1*IEPS )/(sm1*sm2) ! p1
14708
if (m1+m3.ne.p3) k13 = ( m1+m3-p3-p3*IEPS )/(sm1*sm3) ! p1+p2 => p12
14709
if (m2+m3.ne.p2) k23 = ( m2+m3-p2-p2*IEPS )/(sm2*sm3) ! p2
14711
call rfun( r12,d12 ,k12 )
14712
call rfun( r13,d13 ,k13 )
14713
call rfun( r23,d23 ,k23 )
14715
aa = sm2/sm3 - k23 + r13*(k12 - sm2/sm1)
14717
if (aa.eq.CZRO) then
14718
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop trif3: ' &
14719
,'threshold singularity, returning 0'
14720
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14724
bb = d13/sm2 + k12/sm3 - k23/sm1
14725
cc = ( sm1/sm3 - 1/r13 )/(sm1*sm2)
14726
! hh = areal( (r13-sm1/sm3)/(sm1*sm2) )
14727
! dd = mysqrt( bb*bb - 4*aa*cc , -areal(aa)*hh )
14728
call solabc( x1,x2,dd ,aa,bb,cc ,0 )
14732
qx1 = qonv(x1 ,1) ! x1 SHOULD HAVE im. part
14733
qx2 = qonv(x2 ,1) ! x2 SHOULD HAVE im. part
14741
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14745
rslt(0) = rslt(0) + ( li2c2( qz1*q12 ,qz2*q12 )*r12 &
14746
+li2c2( qz1/q12 ,qz2/q12 )/r12 )*sm2
14750
rslt(0) = rslt(0) - ( li2c2( qz1*q23 ,qz2*q23 )*r23 &
14751
+li2c2( qz1/q23 ,qz2/q23 )/r23 )*r13*sm2
14754
rslt(0) = rslt(0) + li2c2( qz1*qm3 ,qz2*qm3 )*r13*sm3 &
14755
- li2c2( qx1*qm1 ,qx2*qm1 )*sm1
14756
if (x2.ne.CZRO) then
14757
rslt(0) = rslt(0) + ( logc2( qz1/qz2 )*logc( qz1*qz2/(qm3*qm3) ) &
14758
-logc2( qx1/qx2 )*logc( qx1*qx2/(qm1*qm1) ) )/(x2*2)
14761
rslt(0) = rslt(0)/(aa*sm1*sm2*sm3)
14765
subroutine trif3HV( rslt ,pp,mm ,ap ,smax ,lam )
14766
!*******************************************************************
14767
! Finite 1-loop scalar 3-point function with all internal masses
14768
! non-zero. Based on the fomula of 't Hooft & Veltman
14769
!*******************************************************************
14771
,intent(out) :: rslt(0:2)
14773
,intent(in) :: pp(3),mm(3)
14775
,intent(in) :: ap(3),smax
14777
,optional ,intent(in) :: lam
14779
:: p1,p2,p3,m1,m2,m3,slam,yy
14782
type(qmplx_type) :: qm1,qm2,qm3
14784
:: a12,a23,a31,thrs,a1,a2,a3
14786
! Order squared momenta, first one smallest
14787
if (ap(1).le.ap(2).and.ap(1).le.ap(3)) then
14788
if (ap(2).le.ap(3)) then
14789
a1=ap(1) ;a2=ap(2) ;a3=ap(3)
14790
p1=pp(1) ;p2=pp(2) ;p3=pp(3)
14791
m1=mm(1) ;m2=mm(2) ;m3=mm(3)
14793
a1=ap(1) ;a2=ap(3) ;a3=ap(2)
14794
p1=pp(1) ;p2=pp(3) ;p3=pp(2)
14795
m1=mm(2) ;m2=mm(1) ;m3=mm(3)
14797
elseif (ap(2).le.ap(3).and.ap(2).le.ap(1)) then
14798
if (ap(3).le.ap(1)) then
14799
a1=ap(2) ;a2=ap(3) ;a3=ap(1)
14800
p1=pp(2) ;p2=pp(3) ;p3=pp(1)
14801
m1=mm(2) ;m2=mm(3) ;m3=mm(1)
14803
a1=ap(2) ;a2=ap(1) ;a3=ap(3)
14804
p1=pp(2) ;p2=pp(1) ;p3=pp(3)
14805
m1=mm(3) ;m2=mm(2) ;m3=mm(1)
14808
if (ap(1).le.ap(2)) then
14809
a1=ap(3) ;a2=ap(1) ;a3=ap(2)
14810
p1=pp(3) ;p2=pp(1) ;p3=pp(2)
14811
m1=mm(3) ;m2=mm(1) ;m3=mm(2)
14813
a1=ap(3) ;a2=ap(2) ;a3=ap(1)
14814
p1=pp(3) ;p2=pp(2) ;p3=pp(1)
14815
m1=mm(1) ;m2=mm(3) ;m3=mm(2)
14819
! Need to cut out negligible squared momenta
14820
thrs = smax*neglig(prcpar)
14822
! Add infinitesimal imaginary parts to masses
14823
m1 = m1 - abs(areal(m1))*IEPS
14824
m2 = m2 - abs(areal(m2))*IEPS
14825
m3 = m3 - abs(areal(m3))*IEPS
14827
if (a1.gt.thrs) then ! 3 non-zero squared momenta
14828
if (present(lam)) then ;slam=lam
14829
else ;slam=kallen(p1,p2,p3)
14831
if (slam.eq.CZRO) then
14832
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop trif3HV: ' &
14833
,'threshold singularity, returning 0'
14834
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14837
slam = mysqrt( slam ,1 )
14838
sm1=mysqrt(m1,-1) ;sm2=mysqrt(m2,-1) ;sm3=mysqrt(m3,-1)
14839
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14840
rslt(0) = s3fun( p1,sm1,sm2 , (m2-m3)+p2 ,p3-p1-p2 ,p2 ,slam ) &
14841
- s3fun( p3,sm1,sm3 ,-(m1-m2)+p3-p2 ,p2-p1-p3 ,p1 ,slam ) &
14842
+ s3fun( p2,sm2,sm3 ,-(m1-m2)+p3-p2 ,p1+p2-p3 ,p1 ,slam )
14843
rslt(0) = -rslt(0)/slam
14845
elseif (a2.gt.thrs) then ! 2 non-zero squared momenta
14847
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop trif3HV: ' &
14848
,'threshold singularity, returning 0'
14849
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14852
sm1=mysqrt(m1,-1) ;sm2=mysqrt(m2,-1) ;sm3=mysqrt(m3,-1)
14853
yy = ( (m1-m2)-p3+p2 )/( p2-p3 )
14854
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14855
rslt(0) = s3fun( p3,sm1,sm3 ,yy ) - s3fun( p2,sm2,sm3 ,yy )
14856
rslt(0) = rslt(0)/(p2-p3)
14858
elseif (a3.gt.thrs) then ! 1 non-zero squared momentum
14859
sm1=mysqrt(m1,-1) ;sm3=mysqrt(m3,-1)
14860
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14861
yy = -( (m1-m2)-p3 )/p3
14862
rslt(0) = s3fun( p3,sm1,sm3 ,yy ) - s2fun( m2-m3 ,m3 ,yy )
14863
rslt(0) = -rslt(0)/p3
14865
else ! all squared momenta zero
14866
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
14867
a12=abs(m1-m2) ;a23=abs(m2-m3) ;a31=abs(m3-m1)
14868
if (a12.ge.a23.and.a12.ge.a31) then
14869
if (a12.eq.RZRO) then ;rslt(0)=-1/(2*m3) ;else
14870
qm1=qonv(m1) ;qm2=qonv(m2) ;qm3=qonv(m3)
14871
rslt(0) = ( logc2(qm3/qm1) - logc2(qm3/qm2) )/(m1-m2)
14873
elseif (a23.ge.a12.and.a23.ge.a31) then
14874
if (a23.eq.RZRO) then ;rslt(0)=-1/(2*m1) ;else
14875
qm1=qonv(m1) ;qm2=qonv(m2) ;qm3=qonv(m3)
14876
rslt(0) = ( logc2(qm1/qm2) - logc2(qm1/qm3) )/(m2-m3)
14879
if (a31.eq.RZRO) then ;rslt(0)=-1/(2*m2) ;else
14880
qm1=qonv(m1) ;qm2=qonv(m2) ;qm3=qonv(m3)
14881
rslt(0) = ( logc2(qm2/qm3) - logc2(qm2/qm1) )/(m3-m1)
14888
function s3fun( aa,s1,s2 ,t1,t2,t3,t4 ) result(rslt)
14889
!***************************************************************
14890
! int( ( ln(a*y^2+b*y+c) - ln(a*y0^2+b*y0+c) )/(y-y0) ,y=0..1 )
14891
! with b=s1^2-s2^2-aa and c=s2^2
14892
! and with y0 in terms of t1,t2,t3,t4 defined at the "present"
14894
! t4 should be sqrt(lambda(aa,t2,t3))
14895
!***************************************************************
14897
,intent(in) :: aa,s1,s2,t1
14899
,optional,intent(in) :: t2,t3
14901
,optional,intent(inout) :: t4
14903
:: rslt ,cc,bb,dd,y0,y1,y2,zz,hh,alpha
14906
type(qmplx_type) :: q1,q2
14908
bb = (s1+s2)*(s1-s2)-aa
14910
dd = (aa-(s1+s2)**2)*(aa-(s1-s2)**2)
14911
dd = sqrt( dd )!+ sign(abs(dd),areal(aa))*IEPS )
14912
call solabc( y1,y2 ,dd ,aa,bb,cc ,1 )
14914
if (present(t4)) then
14915
call solabc( alpha,hh ,t4 ,aa,t2,t3 ,1 )
14916
y0 = -(t1+bb*alpha)/t4
14923
rslt = li2c(qonv(-y1)/q1) - li2c(qonv(1-y1)/q1) &
14924
+ li2c(qonv(-y2)/q2) - li2c(qonv(1-y2)/q2)
14925
! Take some care about the imaginary part of a*y0^2+b*y0+c=a*(y0-y1)*(y0-y2)
14927
rez=areal(zz) ;arez=abs(rez) ;aimz=abs(aimag(zz))
14928
if (arez*EPSN*EPSN.le.aimz*neglig(prcpar).and.aimz.le.arez*neglig(prcpar)) then
14929
! Here, the value of Imz is just numerical noise due to cancellations.
14930
! Realize that |Imz|~eps^2 indicates there were no such cancellations,
14931
! so the lower limit is needed in in the if-statement!
14936
hh = eta3(-y1,-y2,cc/aa) - eta3(y0-y1,y0-y2,zz)
14937
if (areal(aa).lt.RZRO.and.aimag(zz).lt.RZRO) hh = hh - 2*IPI
14938
if (hh.ne.CZRO) rslt = rslt + hh*logc(qonv((y0-1)/y0,1))
14942
function s2fun( aa,bb ,y0 ) result(rslt)
14943
!**************************************************
14944
! int( ( ln(a*y+b) - ln(a*y0+b) )/(y-y0) ,y=0..1 )
14945
!**************************************************
14947
,intent(in) :: aa,bb,y0
14950
type(qmplx_type) :: q1
14953
rslt = li2c(qonv(-y1,-1)/q1) - li2c(qonv(1-y1,-1)/q1)
14954
! aa may have imaginary part, so theta(-aa)*theta(-Im(y0-y1)) is not
14955
! sufficient and need the following:
14956
hh = eta5( aa ,-y1,bb ,y0-y1,aa*(y0-y1) )
14957
if (hh.ne.CZRO) rslt = rslt + hh*logc(qonv((y0-1)/y0,1))
14966
module avh_olo_qp_box
14968
use avh_olo_qp_prec
14969
use avh_olo_qp_auxfun
14970
use avh_olo_qp_qmplx
14973
public :: box00,box03,box05,box06,box07,box08,box09,box10,box11,box12 &
14974
,box13,box14,box15,box16,boxf1,boxf2,boxf3,boxf5,boxf4 &
14975
,permtable,casetable,base
14976
integer ,parameter :: permtable(6,0:15)=reshape((/ &
14977
1,2,3,4 ,5,6 &! 0, 0 masses non-zero, no perm
14978
,1,2,3,4 ,5,6 &! 1, 1 mass non-zero, no perm
14979
,4,1,2,3 ,6,5 &! 2, 1 mass non-zero, 1 cyclic perm
14980
,1,2,3,4 ,5,6 &! 3, 2 neighbour masses non-zero, no perm
14981
,3,4,1,2 ,5,6 &! 4, 1 mass non-zero, 2 cyclic perm's
14982
,1,2,3,4 ,5,6 &! 5, 2 opposite masses non-zero, no perm
14983
,4,1,2,3 ,6,5 &! 6, 2 neighbour masses non-zero, 1 cyclic perm
14984
,1,2,3,4 ,5,6 &! 7, 3 masses non-zero, no perm
14985
,2,3,4,1 ,6,5 &! 8, 1 mass non-zero, 3 cyclic perm's
14986
,2,3,4,1 ,6,5 &! 9, 2 neighbour masses non-zero, 3 cyclic perm's
14987
,4,1,2,3 ,6,5 &!10, 2 opposite masses non-zero, 1 cyclic perm
14988
,2,3,4,1 ,6,5 &!11, 3 masses non-zero, 3 cyclic perm's
14989
,3,4,1,2 ,5,6 &!12, 2 neighbour masses non-zero, 2 cyclic perm's
14990
,3,4,1,2 ,5,6 &!13, 3 masses non-zero, 2 cyclic perm's
14991
,4,1,2,3 ,6,5 &!14, 3 masses non-zero, 1 cyclic perm
14992
,1,2,3,4 ,5,6 &!15, 4 masses non-zero, no perm
14993
/),(/6,16/)) ! 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
14994
integer ,parameter :: casetable(0:15)= &
14995
(/0,1,1,2,1,5,2,3,1,2, 5, 3, 2, 3, 3, 4/)
14996
integer ,parameter :: base(4)=(/8,4,2,1/)
14999
subroutine box16( rslt ,p2,p3,p12,p23 ,m2,m3,m4 ,rmu )
15000
!*******************************************************************
15004
! ------ | ------------------------------------------------------
15005
! i*pi^2 / q^2 [(q+k1)^2-m2] [(q+k1+k2)^2-m3] [(q+k1+k2+k3)^2-m4]
15007
! with k1^2=m2, k2^2=p2, k3^2=p3, (k1+k2+k3)^2=m4
15008
! m2,m4 should NOT be identically 0d0
15009
!*******************************************************************
15011
,intent(out) :: rslt(0:2)
15013
,intent(in) :: p2,p3,p12,p23 ,m2,m3,m4
15017
:: cp2,cp3,cp12,cp23,cm2,cm3,cm4,sm1,sm2,sm3,sm4 &
15018
,r13,r23,r24,r34,d23,d24,d34,log24,cc
15019
type(qmplx_type) :: q13,q23,q24,q34,qss,qy1,qy2,qz1,qz2
15021
if (abs(m2).gt.abs(m4)) then
15022
cm2=m2 ;cm4=m4 ;cp2=p2 ;cp3=p3
15024
cm2=m4 ;cm4=m2 ;cp2=p3 ;cp3=p2
15026
cm3=m3 ;cp12=p12 ;cp23=p23
15028
if (cp12.eq.cm3) then
15029
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box16: ' &
15030
,'p12=m3, returning 0'
15031
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15040
r13 = (cm3-cp12)/(sm1*sm3)
15041
call rfun( r23,d23 ,(cm2+cm3-cp2 )/(sm2*sm3) )
15042
call rfun( r24,d24 ,(cm2+cm4-cp23)/(sm2*sm4) )
15043
call rfun( r34,d34 ,(cm3+cm4-cp3 )/(sm3*sm4) )
15049
if (r24.eq.-CONE) then
15050
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box16: ' &
15051
,'threshold singularity, returning 0'
15052
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15065
qss = (qss*qss)/q24
15067
cc = 1/( sm2*sm4*(cp12-cm3) )
15068
log24 = logc2(q24)*r24/(1+r24)
15071
rslt(0) = log24*logc(qss) + li2c2(q24*q24,qonv(1))*r24 &
15072
- li2c2(qy1,qy2)*r23*r34 - li2c2(qz1,qz2)*r23/r34
15073
rslt(1) = cc*rslt(1)
15074
rslt(0) = cc*rslt(0)
15078
subroutine box15( rslt ,p2,p3,p12,p23 ,m2,m4 ,rmu )
15079
!*******************************************************************
15083
! ------ | -------------------------------------------------
15084
! i*pi^2 / q^2 [(q+k1)^2-m2] (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15086
! with k1^2=m2, k2^2=p2, k3^2=p3, (k1+k2+k3)^2=m4
15087
! m2,m4 should NOT be identically 0d0
15088
!*******************************************************************
15090
,intent(out) :: rslt(0:2)
15092
,intent(in) :: p2,p3,p12,p23 ,m2,m4
15096
:: cp2,cp3,cp12,cp23,cm2,cm4,sm1,sm2,sm3,sm4 &
15097
,r13,r23,r24,r34,d24,log24,cc
15098
type(qmplx_type) :: q13,q23,q24,q34,qss,qz1,qz2
15100
if (abs(m2-p2).gt.abs(m4-p3)) then
15101
cm2=m2 ;cm4=m4 ;cp2=p2 ;cp3=p3
15103
cm2=m4 ;cm4=m2 ;cp2=p3 ;cp3=p2
15107
if (cp12.eq.CZRO) then
15108
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box15: ' &
15109
,'p12=0, returning 0'
15110
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15118
r13 = ( -cp12)/(sm1*sm3)
15119
r23 = (cm2 -cp2 )/(sm2*sm3)
15120
r34 = ( cm4-cp3 )/(sm3*sm4)
15121
call rfun( r24,d24 ,(cm2+cm4-cp23)/(sm2*sm4) )
15123
if (r24.eq.-CONE) then
15124
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box15: ' &
15125
,'threshold singularity, returning 0'
15126
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15136
qss = (qss*qss)/q24
15138
cc = r24/(sm2*sm4*cp12)
15139
log24 = logc2(q24)/(1+r24)
15142
rslt(0) = log24 * logc(qss) + li2c2(q24*q24,qonv(1))
15143
if (r34.ne.CZRO) then
15147
rslt(0) = rslt(0) - li2c2(qz1,qz2)*r34/(r23*r24)
15149
rslt(1) = cc*rslt(1)
15150
rslt(0) = cc*rslt(0)
15154
subroutine box14( rslt ,cp12,cp23 ,cm2,cm4 ,rmu )
15155
!*******************************************************************
15159
! ------ | -------------------------------------------------
15160
! i*pi^2 / q^2 [(q+k1)^2-m2] (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15162
! with k1^2=m2, k2^2=m2, k3^2=m4, (k1+k2+k3)^2=m4
15163
! m2,m4 should NOT be identically 0d0
15164
!*******************************************************************
15166
,intent(out) :: rslt(0:2)
15168
,intent(in) :: cp12,cp23,cm2,cm4
15172
:: sm2,sm4,r24,d24,cc
15174
if (cp12.eq.CZRO) then
15175
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box14: ' &
15176
,'p12=0, returning 0'
15177
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15183
call rfun( r24,d24 ,(cm2+cm4-cp23)/(sm2*sm4) )
15185
if (r24.eq.-CONE) then
15186
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box14: ' &
15187
,'threshold singularity, returning 0'
15188
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15192
cc = -2*logc2(qonv(r24,-1))*r24/(1+r24)/(sm2*sm4*cp12)
15196
rslt(0) = -cc*logc(qonv(-cp12/(rmu*rmu),-1))
15200
subroutine box13( rslt ,p2,p3,p4,p12,p23 ,m3,m4 ,rmu )
15201
!*******************************************************************
15205
! ------ | -------------------------------------------------
15206
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3] [(q+k1+k2+k3)^2-m4]
15208
! with k1^2=0, k2^2=p2, k3^2=p3, (k1+k2+k3)^2=p4
15209
! m3,m4 should NOT be identically 0d0
15210
! p4 should NOT be identical to m4
15211
! p2 should NOT be identical to m3
15212
!*******************************************************************
15214
,intent(out) :: rslt(0:2)
15216
,intent(in) :: p2,p3,p4,p12,p23,m3,m4
15220
:: cp2,cp3,cp4,cp12,cp23,cm3,cm4,sm3,sm4,sm1,sm2 &
15221
,r13,r14,r23,r24,r34,d34,cc,logd,li2d,loge,li2f,li2b,li2e
15222
type(qmplx_type) :: q13,q14,q23,q24,q34,qy1,qy2
15226
if (p12.eq.m3) then
15227
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box13: ' &
15228
,'p12=m3, returning 0'
15229
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15232
if (p23.eq.m4) then
15233
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box13: ' &
15234
,'p23=m4, returning 0'
15235
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15239
h1 = abs((m3-p12)*(m4-p23))
15240
h2 = abs((m3-p2 )*(m4-p4 ))
15242
cp2=p2 ;cp3=p3 ;cp4=p4 ;cp12=p12 ;cp23=p23 ;cm3=m3 ;cm4=m4
15244
cp2=p12 ;cp3=p3 ;cp4=p23 ;cp12=p2 ;cp23=p4 ;cm3=m3 ;cm4=m4
15252
r13 = (cm3-cp12)/(sm1*sm3)
15253
r14 = (cm4-cp4 )/(sm1*sm4)
15254
r23 = (cm3-cp2 )/(sm2*sm3)
15255
r24 = (cm4-cp23)/(sm2*sm4)
15256
call rfun( r34,d34 ,(cm3+cm4-cp3)/(sm3*sm4) )
15264
qy1 = q14*q23/q13/q24
15265
logd = logc2(qy1 )/(r13*r24)
15266
li2d = li2c2(qy1,qonv(1))/(r13*r24)
15271
li2f = li2c2( qy1*q34,qy2*q34 )*r34/(r14*r24)
15272
li2b = li2c2( qy1/q34,qy2/q34 )/(r34*r14*r24)
15273
li2e = li2c2( q14/q24,q13/q23 )/(r23*r24)
15277
rslt(0) = li2f + li2b + 2*li2e - 2*li2d - 2*logd*loge
15278
cc = sm1*sm2*sm3*sm4
15279
rslt(1) = rslt(1)/cc
15280
rslt(0) = rslt(0)/cc
15284
subroutine box12( rslt ,cp3,cp4,cp12,cp23 ,cm3,cm4 ,rmu )
15285
!*******************************************************************
15289
! ------ | -------------------------------------------------
15290
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3] [(q+k1+k2+k3)^2-m4]
15292
! with k1^2=0, k2^2=m3, k3^2=p3, (k1+k2+k3)^2=p4
15293
! m3,m4 should NOT be indentiallcy 0d0
15294
! p4 should NOT be identical to m4
15295
!*******************************************************************
15297
,intent(out) :: rslt(0:2)
15299
,intent(in) :: cp3,cp4,cp12,cp23,cm3,cm4
15303
:: sm3,sm4,sm1,sm2,r13,r14,r24,r34,d34,cc &
15304
,log13,log14,log24,log34,li2f,li2b,li2d
15305
type(qmplx_type) :: q13,q14,q24,q34,qyy
15307
if (cp12.eq.cm3) then
15308
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box12: ' &
15309
,'p12=m3, returning 0'
15310
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15313
if (cp23.eq.cm4) then
15314
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box12: ' &
15315
,'p23=m4, returning 0'
15316
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15325
r13 = (cm3-cp12)/(sm1*sm3)
15326
r14 = (cm4-cp4 )/(sm1*sm4)
15327
r24 = (cm4-cp23)/(sm2*sm4)
15328
call rfun( r34,d34 ,(cm3+cm4-cp3)/(sm3*sm4) )
15341
li2f = li2c(qyy*q34)
15342
li2b = li2c(qyy/q34)
15343
li2d = li2c(q14/q24)
15346
rslt(2) = rslt(2)/2
15347
rslt(1) = log14 - log24 - log13
15348
rslt(0) = 2*log13*log24 - log14*log14 - log34*log34 &
15349
- 2*li2d - li2f - li2b - 3*PISQo24
15350
cc = (cm3-cp12)*(cm4-cp23) ! = sm1*sm2*sm3*sm4*r13*r24
15351
rslt(2) = rslt(2)/cc
15352
rslt(1) = rslt(1)/cc
15353
rslt(0) = rslt(0)/cc
15357
subroutine box11( rslt ,cp3,cp12,cp23 ,cm3,cm4 ,rmu )
15358
!*******************************************************************
15362
! ------ | -------------------------------------------------
15363
! i*pi^2 / q^2 (q+k1)^2 [(q+k1+k2)^2-m3] [(q+k1+k2+k3)^2-m4]
15365
! with k1^2=0, k2^2=m3, k3^2=p3, (k1+k2+k3)^2=m4
15366
! m3,m4 should NOT be indentiallcy 0d0
15367
!*******************************************************************
15369
,intent(out) :: rslt(0:2)
15371
,intent(in) :: cp3,cp12,cp23,cm3,cm4
15375
:: sm3,sm4,sm1,sm2,r13,r24,r34,d34 &
15376
,cc,log13,log24,log34
15378
if (cp12.eq.cm3) then
15379
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box11: ' &
15380
,'p12=m3, returning 0'
15381
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15384
if (cp23.eq.cm4) then
15385
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box11: ' &
15386
,'p23=m4, returning 0'
15387
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15396
r13 = (cm3-cp12)/(sm1*sm3)
15397
r24 = (cm4-cp23)/(sm2*sm4)
15398
call rfun( r34,d34 ,(cm3+cm4-cp3 )/(sm3*sm4) )
15400
log13 = logc(qonv(r13,-1))
15401
log24 = logc(qonv(r24,-1))
15402
log34 = logc(qonv(r34,-1))
15405
rslt(1) = -log13-log24
15406
rslt(0) = 2*log13*log24 - log34*log34 - 14*PISQo24
15407
cc = (cm3-cp12)*(cm4-cp23) ! = sm1*sm2*sm3*sm4*r13*r24
15408
rslt(2) = rslt(2)/cc
15409
rslt(1) = rslt(1)/cc
15410
rslt(0) = rslt(0)/cc
15414
subroutine box10( rslt ,p2,p3,p4,p12,p23 ,m4 ,rmu )
15415
!*******************************************************************
15419
! ------ | --------------------------------------------
15420
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15422
! with k1^2=0, k2^2=p2, k3^2=p3, (k1+k2+k3)^2=p4
15423
! m4 should NOT be identically 0d0
15424
! p2 should NOT be identically 0d0
15425
! p4 should NOT be identical to m4
15426
!*******************************************************************
15428
,intent(out) :: rslt(0:2)
15430
,intent(in) :: p2,p3,p4,p12,p23,m4
15434
:: cp2,cp3,cp4,cp12,cp23,cm4,r13,r14,r23,r24,r34,z1,z0
15435
type(qmplx_type) :: q13,q14,q23,q24,q34,qm4,qxx,qx1,qx2
15439
if (p12.eq.CZRO) then
15440
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box10: ' &
15441
,'p12=0, returning 0'
15442
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15445
if (p23.eq.m4) then
15446
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box10: ' &
15447
,'p23=mm, returning 0'
15448
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15452
h1 = abs(p12*(m4-p23))
15453
h2 = abs( p2*(m4-p4 ))
15455
cp2=p2 ;cp3=p3 ;cp4=p4 ;cp12=p12 ;cp23=p23 ;cm4=m4
15457
cp2=p12 ;cp3=p3 ;cp4=p23 ;cp12=p2 ;cp23=p4 ;cm4=m4
15472
if (r34.ne.CZRO) then
15476
z0 = -li2c2(qx1,qx2)*r34/(2*cm4*r23)
15484
z1 = -logc2(qxx)/r24
15485
z0 = z0 - li2c2(qx1,qx2)/r14
15486
z0 = z0 + li2c2(qxx,qonv(1))/r24
15487
z0 = z0 + z1*( logc(qm4/q24) - logc(qm4/(rmu*rmu))/2 )
15491
rslt(0) = -2*z0/r13
15495
subroutine box09( rslt ,cp2,cp3,cp12,cp23 ,cm4 ,rmu )
15496
!*******************************************************************
15500
! ------ | --------------------------------------------
15501
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15503
! with k1^2=0, k2^2=p2, k3^2=p3, (k1+k2+k3)^2=m4
15504
! m4 should NOT be identically 0d0
15505
! p2 should NOT be identically 0d0
15506
!*******************************************************************
15508
,intent(out) :: rslt(0:2)
15510
,intent(in) :: cp2,cp3,cp12,cp23,cm4
15514
:: logm,log12,log23,li12,li23,z2,z1,z0,cc &
15516
type(qmplx_type) :: q13,q23,q24,q34,qm4,qxx
15518
if (cp12.eq.CZRO) then
15519
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box09: ' &
15520
,'p12=0, returning 0'
15521
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15524
if (cp23.eq.cm4) then
15525
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box09: ' &
15526
,'p23=mm, returning 0'
15527
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15541
logm = logc(qm4/(rmu*rmu))
15548
li23 = li2c(qxx*q34/q23)
15552
z1 = -log12 - log23
15553
z0 = li23 + 2*li12 + z1*z1 + PISQo24
15556
rslt(1) = cc*(z1 - z2*logm)
15557
rslt(0) = cc*(z0 + (z2*logm/2-z1)*logm)
15561
subroutine box08( rslt ,cp3,cp4,cp12,cp23 ,cm4 ,rmu )
15562
!*******************************************************************
15566
! ------ | --------------------------------------------
15567
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15569
! with k1^2=k2^2=0, k3^2=p3, (k1+k2+k3)^2=p4
15570
! mm should NOT be identically 0d0
15571
! p3 NOR p4 should be identically m4
15572
!*******************************************************************
15574
,intent(out) :: rslt(0:2)
15576
,intent(in) :: cp3,cp4,cp12,cp23,cm4
15579
type(qmplx_type) :: q13,q14,q24,q34,qm4,qxx,qx1,qx2,qx3
15581
:: r13,r14,r24,r34,z1,z0,cc
15585
if (cp12.eq.CZRO) then
15586
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box08: ' &
15587
,'p12=0, returning 0'
15588
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15591
if (cp23.eq.cm4) then
15592
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box08: ' &
15593
,'p23=mm, returning 0'
15594
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15612
z1 = logc(qx1*qx2/qx3)
15613
z0 = 2*( logc(q24/rmu2)*logc(qx3) - (li2c(qx1)+li2c(qx2)) )
15618
z0 = z0 - logc(qx1)**2 - logc(qx2)**2 &
15619
+ logc(qxx)**2/2 + li2c(qm4/qxx/rmu2)
15624
rslt(0) = cc*( z0 - 6*PISQo24 )
15628
subroutine box07( rslt ,cp4,cp12,cp23 ,cm4 ,rmu )
15629
!*******************************************************************
15633
! ------ | --------------------------------------------
15634
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15636
! with k1^2=k2^2=0, k3^2=m4, (k1+k2+k3)^2=p4
15637
! m3 should NOT be identically 0d0
15638
! p4 should NOT be identically m4
15639
!*******************************************************************
15641
,intent(out) :: rslt(0:2)
15643
,intent(in) :: cp4,cp12,cp23,cm4
15646
type(qmplx_type) :: q13,q14,q24,qm4
15648
:: r13,r14,r24,logm,log12,log23,log4,li423 &
15651
if (cp12.eq.CZRO) then
15652
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box07: ' &
15653
,'p12=0, returning 0'
15654
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15657
if (cp23.eq.cm4) then
15658
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box07: ' &
15659
,'p23=mm, returning 0'
15660
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15672
logm = logc(qm4/(rmu*rmu))
15673
log12 = logc(q13/qm4)
15674
log23 = logc(q24/qm4)
15675
log4 = logc(q14/qm4)
15676
li423 = li2c(q14/q24)
15680
z1 = -2*log23 - log12 + log4
15681
z0 = 2*(log12*log23 - li423) - log4*log4 - 13*PISQo24
15684
rslt(1) = cc*(z1 - z2*logm)
15685
rslt(0) = cc*(z0 + (z2*logm/2-z1)*logm)
15689
subroutine box06( rslt ,cp12,cp23 ,cm4 ,rmu )
15690
!*******************************************************************
15694
! ------ | --------------------------------------------
15695
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 [(q+k1+k2+k3)^2-m4]
15697
! with k1^2=k2^2=0, k3^2=(k1+k2+k3)^2=m4
15698
! m3 should NOT be identically 0d0
15699
!*******************************************************************
15701
,intent(out) :: rslt(0:2)
15703
,intent(in) :: cp12,cp23,cm4
15706
type(qmplx_type) :: q13,q24,qm4
15708
:: r13,r24,logm,log1,log2,z2,z1,z0,cc
15710
if (cp12.eq.CZRO) then
15711
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box06: ' &
15712
,'p12=0, returning 0'
15713
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15716
if (cp23.eq.cm4) then
15717
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop box06: ' &
15718
,'p23=mm, returning 0'
15719
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
15729
logm = logc(qm4/(rmu*rmu))
15730
log1 = logc(q13/qm4)
15731
log2 = logc(q24/qm4)
15734
z1 = -2*log2 - log1
15735
z0 = 2*(log2*log1 - 8*PISQo24)
15738
rslt(1) = cc*(z1 - z2*logm)
15739
rslt(0) = cc*(z0 + (z2*logm/2-z1)*logm)
15743
subroutine box03( rslt ,p2,p4,p5,p6 ,rmu )
15744
!*******************************************************************
15748
! ------ | ---------------------------------------
15749
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 (q+k1+k2+k3)^2
15752
!*******************************************************************
15754
,intent(out) :: rslt(0:2)
15756
,intent(in) :: p2,p4,p5,p6
15759
type(qmplx_type) :: q2,q4,q5,q6,q26,q54,qy
15773
logy = logc2(qy)/(p5*p6)
15775
rslt(0) = li2c2(q6/q4,q2/q5)/(p4*p5) &
15776
+ li2c2(q54,q26)/(p4*p6) &
15777
- li2c2(qonv(1),qy)/(p5*p6) &
15778
- logy*logc(q54*q2*q6/(rmu2*rmu2))/2
15780
rslt(1) = 2*rslt(1)
15781
rslt(0) = 2*rslt(0)
15785
subroutine box05( rslt ,p2,p3,p4,p5,p6 ,rmu )
15786
!*******************************************************************
15790
! ------ | ---------------------------------------
15791
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 (q+k1+k2+k3)^2
15794
!*******************************************************************
15796
,intent(out) :: rslt(0:2)
15798
,intent(in) :: p2,p3,p4,p5,p6
15801
type(qmplx_type) ::q2,q3,q4,q5,q6 ,q25,q64,qy,qz
15816
qz = q64*q2*q5*q6*q6/q3/q3/(rmu2*rmu2)
15818
logy = logc2(qy)/(p5*p6)
15821
rslt(0) = li2c2(q64,q25)/(p4*p5) &
15822
- li2c2(qonv(1),qy)/(p5*p6) &
15824
rslt(0) = 2*rslt(0)
15828
subroutine box00( rslt ,cp ,api ,rmu )
15829
!*******************************************************************
15832
! ------ | ---------------------------------------
15833
! i*pi^2 / q^2 (q+k1)^2 (q+k1+k2)^2 (q+k1+k2+k3)^2
15835
! with Dim = 4-2*eps
15836
! C = pi^eps * mu^(2*eps) * exp(gamma_Euler*eps)
15838
! input: p1 = k1^2, p2 = k2^2, p3 = k3^2, p4 = (k1+k2+k3)^2,
15839
! p12 = (k1+k2)^2, p23 = (k2+k3)^2
15840
! output: rslt(0) = eps^0 -coefficient
15841
! rslt(1) = eps^(-1)-coefficient
15842
! rslt(2) = eps^(-2)-coefficient
15844
! If any of these numbers is IDENTICALLY 0d0, the corresponding
15845
! IR-singular case is returned.
15846
!*******************************************************************
15847
use avh_olo_qp_olog
15848
use avh_olo_qp_dilog
15850
,intent(out) :: rslt(0:2)
15852
,intent(in) :: cp(6)
15854
,intent(in) :: api(6),rmu
15856
:: log3,log4,log5,log6,li24,li25,li26 &
15859
:: rp1,rp2,rp3,rp4,rp5,rp6,pp(6),ap(6),gg,ff,hh,arg,rmu2
15860
integer :: icase,sf,sgn,i3,i4,i5,i6
15861
integer ,parameter :: base(4)=(/8,4,2,1/)
15867
if (ff.ge.gg.and.ff.ge.hh) then
15868
pp(1)=areal(cp(1)) ;ap(1)=api(1)
15869
pp(2)=areal(cp(2)) ;ap(2)=api(2)
15870
pp(3)=areal(cp(3)) ;ap(3)=api(3)
15871
pp(4)=areal(cp(4)) ;ap(4)=api(4)
15872
pp(5)=areal(cp(5)) ;ap(5)=api(5)
15873
pp(6)=areal(cp(6)) ;ap(6)=api(6)
15874
elseif (gg.ge.ff.and.gg.ge.hh) then
15875
pp(1)=areal(cp(1)) ;ap(1)=api(1)
15876
pp(2)=areal(cp(6)) ;ap(2)=api(6)
15877
pp(3)=areal(cp(3)) ;ap(3)=api(3)
15878
pp(4)=areal(cp(5)) ;ap(4)=api(5)
15879
pp(5)=areal(cp(4)) ;ap(5)=api(4)
15880
pp(6)=areal(cp(2)) ;ap(6)=api(2)
15882
pp(1)=areal(cp(5)) ;ap(1)=api(5)
15883
pp(2)=areal(cp(2)) ;ap(2)=api(2)
15884
pp(3)=areal(cp(6)) ;ap(3)=api(6)
15885
pp(4)=areal(cp(4)) ;ap(4)=api(4)
15886
pp(5)=areal(cp(1)) ;ap(5)=api(1)
15887
pp(6)=areal(cp(3)) ;ap(6)=api(3)
15891
if (ap(1).gt.RZRO) icase = icase + base(1)
15892
if (ap(2).gt.RZRO) icase = icase + base(2)
15893
if (ap(3).gt.RZRO) icase = icase + base(3)
15894
if (ap(4).gt.RZRO) icase = icase + base(4)
15895
rp1 = pp(permtable(1,icase))
15896
rp2 = pp(permtable(2,icase))
15897
rp3 = pp(permtable(3,icase))
15898
rp4 = pp(permtable(4,icase))
15899
rp5 = pp(permtable(5,icase))
15900
rp6 = pp(permtable(6,icase))
15901
icase = casetable( icase)
15903
i3=0 ;if (-rp3.lt.RZRO) i3=-1
15904
i4=0 ;if (-rp4.lt.RZRO) i4=-1
15905
i5=0 ;if (-rp5.lt.RZRO) i5=-1
15906
i6=0 ;if (-rp6.lt.RZRO) i6=-1
15908
if (icase.eq.0) then
15909
! 0 masses non-zero
15910
gg = 1/( rp5 * rp6 )
15911
log5 = olog(abs(rp5/rmu2),i5)
15912
log6 = olog(abs(rp6/rmu2),i6)
15914
rslt(1) = gg*(-2*(log5 + log6) )
15915
rslt(0) = gg*( log5**2 + log6**2 - olog(abs(rp5/rp6),i5-i6)**2 - 32*PISQo24 )
15916
elseif (icase.eq.1) then
15918
gg = 1/( rp5 * rp6 )
15919
ff = gg*( rp5 + rp6 - rp4 )
15920
log4 = olog(abs(rp4/rmu2),i4)
15921
log5 = olog(abs(rp5/rmu2),i5)
15922
log6 = olog(abs(rp6/rmu2),i6)
15926
if (arg.lt.RZRO) sgn = sf
15927
li24 = dilog(abs(arg),sgn)
15930
if (arg.lt.RZRO) sgn = sf
15931
li25 = dilog(abs(arg),sgn)
15934
if (arg.lt.RZRO) sgn = sf
15935
li26 = dilog(abs(arg),sgn)
15937
rslt(1) = gg*( 2*(log4-log5-log6) )
15938
rslt(0) = gg*( log5**2 + log6**2 - log4**2 - 12*PISQo24 &
15939
+ 2*(li25 + li26 - li24) )
15940
elseif (icase.eq.2) then
15941
! 2 neighbour masses non-zero
15942
gg = 1/( rp5 * rp6 )
15943
ff = gg*( rp5 + rp6 - rp4 )
15944
log3 = olog(abs(rp3/rmu2),i3)
15945
log4 = olog(abs(rp4/rmu2),i4)
15946
log5 = olog(abs(rp5/rmu2),i5)
15947
log6 = olog(abs(rp6/rmu2),i6)
15948
li254 = dilog( abs(rp4/rp5) ,i4-i5 )
15949
li263 = dilog( abs(rp3/rp6) ,i3-i6 )
15953
if (arg.lt.RZRO) sgn = sf
15954
li24 = dilog(abs(arg),sgn)
15957
if (arg.lt.RZRO) sgn = sf
15958
li25 = dilog(abs(arg),sgn)
15961
if (arg.lt.RZRO) sgn = sf
15962
li26 = dilog(abs(arg),sgn)
15964
rslt(1) = gg*( log4 + log3 - log5 - 2*log6 )
15965
rslt(0) = gg*( log5**2 + log6**2 - log3**2 - log4**2 &
15966
+ (log3 + log4 - log5)**2/2 &
15967
- 2*PISQo24 + 2*(li254 - li263 + li25 + li26 - li24) )
15968
elseif (icase.eq.5) then
15969
! 2 opposite masses non-zero
15970
call box03( rslt ,acmplx(rp2),acmplx(rp4) &
15971
,acmplx(rp5),acmplx(rp6) ,rmu )
15972
elseif (icase.eq.3) then
15973
! 3 masses non-zero
15974
call box05( rslt ,acmplx(rp2),acmplx(rp3) &
15975
,acmplx(rp4),acmplx(rp5) &
15976
,acmplx(rp6) ,rmu )
15977
elseif (icase.eq.4) then
15978
! 4 masses non-zero
15979
call boxf0( rslt ,acmplx(rp1),acmplx(rp2) &
15980
,acmplx(rp3),acmplx(rp4) &
15981
,acmplx(rp5),acmplx(rp6) )
15986
subroutine boxf0( rslt ,p1,p2,p3,p4,p12,p23 )
15987
!*******************************************************************
15988
! Finite 1-loop scalar 4-point function with all internal masses
15989
! equal zero. Based on the formulas from
15990
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
15991
!*******************************************************************
15993
,intent(out) :: rslt(0:2)
15995
,intent(in) :: p1,p2,p3,p4,p12,p23
15996
type(qmplx_type) :: q12,q13,q14,q23,q24,q34,qx1,qx2,qss
15998
:: aa,bb,cc,dd,x1,x2,ss,r12,r13,r14,r23,r24,r34
16004
r14 = -p4 ! p1+p2+p3
16011
if (r13.eq.CZRO.or.aa.eq.CZRO) then
16012
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf0: ' &
16013
,'threshold singularity, returning 0'
16014
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16018
bb = r13*r24 + r12*r34 - r14*r23
16021
dd = mysqrt( bb*bb - 4*aa*cc , -areal(aa)*hh )
16022
call solabc(x1,x2,dd ,aa,bb,cc ,1)
16026
qx1 = qonv(x1 , hh)
16027
qx2 = qonv(x2 ,-hh)
16035
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16038
rslt(0) = rslt(0) + li2c2(qx1*qss,qx2*qss) * r34/r13
16041
rslt(0) = rslt(0) + li2c2(qx1*qss,qx2*qss) * r24/r12
16043
ss = -logc2(qx1/qx2) / x2
16044
rslt(0) = rslt(0) + ss*( logc(qx1*qx2)/2 - logc(q12*q13/q14/q23) )
16046
rslt(0) = -rslt(0) / aa
16050
subroutine boxf1( rslt ,p1,p2,p3,p4,p12,p23 ,m4 )
16051
!*******************************************************************
16052
! Finite 1-loop scalar 4-point function with one internal mass
16053
! non-zero. Based on the formulas from
16054
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
16055
!*******************************************************************
16057
,intent(out) :: rslt(0:2)
16059
,intent(in) :: p1,p2,p3,p4,p12,p23 ,m4
16060
type(qmplx_type) :: qx1,qx2,qss,q12,q13,q14,q23,q24,q34
16062
:: smm,sm4,aa,bb,cc,dd,x1,x2,r12,r13,r14,r23,r24,r34
16063
logical :: r12zero,r13zero,r14zero
16068
r12 = ( m4-p4 -p4 *IEPS )/(smm*sm4)
16069
r13 = ( m4-p23-p23*IEPS )/(smm*sm4)
16070
r14 = ( m4-p3 -p3 *IEPS )/(smm*sm4)
16071
r23 = ( -p1 -p1 *IEPS )/(smm*smm)
16072
r24 = ( -p12-p12*IEPS )/(smm*smm)
16073
r34 = ( -p2 -p2 *IEPS )/(smm*smm)
16075
r12zero=(abs(areal(r12))+abs(aimag(r12)).lt.neglig(prcpar))
16076
r13zero=(abs(areal(r13))+abs(aimag(r13)).lt.neglig(prcpar))
16077
r14zero=(abs(areal(r14))+abs(aimag(r14)).lt.neglig(prcpar))
16081
if (aa.eq.CZRO) then
16082
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf1: ' &
16083
,'threshold singularity, returning 0'
16084
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16088
bb = r13*r24 + r12*r34 - r14*r23
16090
call solabc(x1,x2,dd ,aa,bb,cc ,0)
16103
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16105
if (r12zero.and.r13zero) then
16106
qss = qx1*qx2*q34*q24/q23
16108
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16112
qss = qx1*qx2*qss*qss
16113
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16116
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r34/r13
16120
qss = qx1*qx2*qss*qss
16121
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16124
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r24/r12
16126
if (.not.r12zero.and..not.r13zero) then
16127
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( q12*q13/q23 )/x2
16131
if (.not.r14zero) then
16132
rslt(0) = rslt(0) - li2c2( qx1*q14 ,qx2*q14 )*r14
16135
rslt(0) = -rslt(0)/(aa*smm*smm*smm*sm4)
16139
subroutine boxf5( rslt ,p1,p2,p3,p4,p12,p23, m2,m4 )
16140
!*******************************************************************
16141
! Finite 1-loop scalar 4-point function with two opposite internal
16142
! masses non-zero. Based on the formulas from
16143
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
16144
!*******************************************************************
16146
,intent(out) :: rslt(0:2)
16148
,intent(in) :: p1,p2,p3,p4,p12,p23,m2,m4
16149
call boxf2( rslt ,p12,p2,p23,p4,p1,p3 ,m2,m4 )
16153
subroutine boxf2( rslt ,p1,p2,p3,p4,p12,p23 ,m3,m4 )
16154
!*******************************************************************
16155
! Finite 1-loop scalar 4-point function with two adjacent internal
16156
! masses non-zero. Based on the formulas from
16157
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
16158
!*******************************************************************
16160
,intent(out) :: rslt(0:2)
16162
,intent(in) :: p1,p2,p3,p4,p12,p23,m3,m4
16163
type(qmplx_type) :: qx1,qx2,qss,q12,q13,q14,q23,q24,q34
16165
:: smm,sm3,sm4,aa,bb,cc,dd,x1,x2 &
16166
,r12,r13,r14,r23,r24,r34,d14,k14
16167
logical :: r12zero,r13zero,r24zero,r34zero
16174
r12 = ( m4-p4 -p4 *IEPS )/(smm*sm4)
16175
r13 = ( m4-p23-p23*IEPS )/(smm*sm4)
16176
k14 = ( m3+m4-p3 -p3 *IEPS )/(sm3*sm4)
16177
r23 = ( -p1 -p1 *IEPS )/(smm*smm)
16178
r24 = ( m3-p12-p12*IEPS )/(smm*sm3)
16179
r34 = ( m3-p2 -p2 *IEPS )/(smm*sm3)
16181
r12zero = (abs(areal(r12))+abs(aimag(r12)).lt.neglig(prcpar))
16182
r13zero = (abs(areal(r13))+abs(aimag(r13)).lt.neglig(prcpar))
16183
r24zero = (abs(areal(r24))+abs(aimag(r24)).lt.neglig(prcpar))
16184
r34zero = (abs(areal(r34))+abs(aimag(r34)).lt.neglig(prcpar))
16186
if (r12zero.and.r24zero) then
16187
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf2: ' &
16188
,'m4=p4 and m3=p12, returning 0'
16189
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16192
if (r13zero.and.r34zero) then
16193
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf2: ' &
16194
,'m4=p23 and m3=p2, returning 0'
16195
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16199
call rfun( r14,d14 ,k14 )
16203
if (aa.eq.CZRO) then
16204
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf2: ' &
16205
,'threshold singularity, returning 0'
16206
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16210
bb = r13*r24 + r12*r34 - k14*r23
16212
call solabc(x1,x2,dd ,aa,bb,cc ,0)
16225
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16227
rslt(0) = rslt(0) - li2c2( qx1*q14 ,qx2*q14 )*r14
16228
rslt(0) = rslt(0) - li2c2( qx1/q14 ,qx2/q14 )/r14
16230
if (r12zero.and.r13zero) then
16231
qss = qx1*qx2*q34*q24/q23
16233
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16237
qss = qx1*qx2*qss*qss
16238
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16239
elseif (.not.r34zero) then
16241
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r34/r13
16245
qss = qx1*qx2*qss*qss
16246
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( qss )/(x2*2)
16247
elseif (.not.r24zero) then
16249
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r24/r12
16251
if (.not.r12zero.and..not.r13zero) then
16252
rslt(0) = rslt(0) + logc2( qx1/qx2 )*logc( q12*q13/q23 )/x2
16256
rslt(0) = -rslt(0)/(aa*smm*smm*sm3*sm4)
16260
subroutine boxf3( rslt ,pp ,mm )
16261
!*******************************************************************
16262
! Finite 1-loop scalar 4-point function with three internal masses
16264
!*******************************************************************
16266
,intent(out) :: rslt(0:2)
16268
,intent(in) :: pp(6),mm(4)
16270
integer ,parameter :: ip(6)=(/4,5,2,6,3,1/)
16271
integer ,parameter :: im(4)=(/4,1,3,2/)
16272
integer ,parameter :: ic(4,6)=reshape((/1,2,3,4 ,2,3,4,1 ,3,4,1,2 &
16273
,4,1,2,3 ,5,6,5,6 ,6,5,6,5/),(/4,6/))
16275
if (mm(1).eq.CZRO) then ;j=3
16276
elseif (mm(2).eq.CZRO) then ;j=4
16277
elseif (mm(3).eq.CZRO) then ;j=1
16280
call boxf33( rslt ,pp(ic(j,ip(1))) ,pp(ic(j,ip(2))) ,pp(ic(j,ip(3))) &
16281
,pp(ic(j,ip(4))) ,pp(ic(j,ip(5))) ,pp(ic(j,ip(6))) &
16282
,mm(ic(j,im(1))) ,mm(ic(j,im(2))) ,mm(ic(j,im(4))) )
16285
subroutine boxf33( rslt ,p1,p2,p3,p4,p12,p23, m1,m2,m4 )
16286
!*******************************************************************
16287
! Finite 1-loop scalar 4-point function with three internal masses
16288
! non-zero, and m3=0. Based on the formulas from
16289
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
16290
!*******************************************************************
16292
,intent(out) :: rslt(0:2)
16294
,intent(in) :: p1,p2,p3,p4,p12,p23,m1,m2,m4
16295
type(qmplx_type) :: qx1,qx2,qss,q12,q13,q14,q23,q24,q34,qy1,qy2
16297
:: sm1,sm2,sm3,sm4 ,aa,bb,cc,dd,x1,x2 &
16298
,r12,r13,r14,r23,r24,r34,d12,d14,d24,k12,k14,k24
16299
logical ::r13zero,r23zero,r34zero
16306
k12 = ( m1+m2-p1 -p1 *IEPS )/(sm1*sm2) ! p1
16307
r13 = ( m1 -p12-p12*IEPS )/(sm1*sm3) ! p1+p2
16308
k14 = ( m1+m4-p4 -p4 *IEPS )/(sm1*sm4) ! p1+p2+p3
16309
r23 = ( m2 -p2 -p2 *IEPS )/(sm2*sm3) ! p2
16310
k24 = ( m2+m4-p23-p23*IEPS )/(sm2*sm4) ! p2+p3
16311
r34 = ( m4-p3 -p3 *IEPS )/(sm3*sm4) ! p3
16313
r13zero = (abs(areal(r13))+abs(aimag(r13)).lt.neglig(prcpar))
16314
r23zero = (abs(areal(r23))+abs(aimag(r23)).lt.neglig(prcpar))
16315
r34zero = (abs(areal(r34))+abs(aimag(r34)).lt.neglig(prcpar))
16319
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf33: ' &
16320
,'m4=p4 and m3=p12, returning 0'
16321
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16323
elseif (r34zero) then
16324
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf33: ' &
16325
,'m2=p1 and m3=p12, returning 0'
16326
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16331
call rfun( r12,d12 ,k12 )
16332
call rfun( r14,d14 ,k14 )
16333
call rfun( r24,d24 ,k24 )
16337
if (aa.eq.CZRO) then
16338
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf33: ' &
16339
,'threshold singularity, returning 0'
16340
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16344
bb = -r13*d24 + k12*r34 - k14*r23
16345
cc = k12*r13 + r24*r34 - k14*r24*r13 - r23
16346
call solabc(x1,x2,dd ,aa,bb,cc ,0)
16350
qx1 = qonv(x1 ,1 ) ! x1 SHOULD HAVE im. part
16351
qx2 = qonv(x2 ,1 ) ! x2 SHOULD HAVE im. part
16359
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16363
rslt(0) = rslt(0) + li2c2( qy1*q12 ,qy2*q12 )/r24*r12
16364
rslt(0) = rslt(0) + li2c2( qy1/q12 ,qy2/q12 )/r24/r12
16365
rslt(0) = rslt(0) - li2c2( qx1*q14 ,qx2*q14 )*r14
16366
rslt(0) = rslt(0) - li2c2( qx1/q14 ,qx2/q14 )/r14
16368
if (.not.r13zero) then
16369
if (.not.r23zero) then
16371
rslt(0) = rslt(0) - li2c2( qx1*qss ,qx2*qss )*r23/(r13*r24)
16373
if (.not.r34zero) then
16375
rslt(0) = rslt(0) + li2c2( qx1*qss ,qx2*qss )*r34/r13
16378
rslt(0) = rslt(0) - logc2( qx1/qx2 )*logc( q23/q24/q34 )/x2
16381
rslt(0) = -rslt(0)/(aa*sm1*sm2*sm3*sm4)
16385
subroutine boxf4( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
16386
!*******************************************************************
16387
! Finite 1-loop scalar 4-point function with all internal masses
16388
! non-zero. Based on the formulas from
16389
! A. Denner, U. Nierste, R. Scharf, Nucl.Phys.B367(1991)637-656
16390
!*******************************************************************
16392
,intent(out) :: rslt(0:2)
16394
,intent(in) :: p1,p2,p3,p4,p12,p23,m1,m2,m3,m4
16395
type(qmplx_type) :: q12,q13,q14,q23,q24,q34,qx1,qx2,qy1,qy2,qtt
16397
:: sm1,sm2,sm3,sm4 ,aa,bb,cc,dd,x1,x2,tt &
16398
,k12,k13,k14,k23,k24,k34 &
16399
,r12,r13,r14,r23,r24,r34 &
16400
,d12,d13,d14,d23,d24,d34
16409
k12 = ( m1+m2-p1 -p1 *IEPS)/(sm1*sm2) ! p1
16410
k13 = ( m1+m3-p12-p12*IEPS)/(sm1*sm3) ! p1+p2
16411
k14 = ( m1+m4-p4 -p4 *IEPS)/(sm1*sm4) ! p1+p2+p3
16412
k23 = ( m2+m3-p2 -p2 *IEPS)/(sm2*sm3) ! p2
16413
k24 = ( m2+m4-p23-p23*IEPS)/(sm2*sm4) ! p2+p3
16414
k34 = ( m3+m4-p3 -p3 *IEPS)/(sm3*sm4) ! p3
16416
call rfun( r12,d12 ,k12 )
16417
call rfun( r13,d13 ,k13 )
16418
call rfun( r14,d14 ,k14 )
16419
call rfun( r23,d23 ,k23 )
16420
call rfun( r24,d24 ,k24 )
16421
call rfun( r34,d34 ,k34 )
16423
aa = k34/r24 + r13*k12 - k14*r13/r24 - k23
16425
if (aa.eq.CZRO) then
16426
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxf4: ' &
16427
,'threshold singularity, returning 0'
16428
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16432
bb = d13*d24 + k12*k34 - k14*k23
16433
cc = k12/r13 + r24*k34 - k14*r24/r13 - k23
16434
call solabc(x1,x2,dd ,aa,bb,cc ,0)
16436
h1 = areal(k23 - r13*k12 - r24*k34 + r13*r24*k14)
16437
h2 = h1*areal(aa)*areal(x1)
16438
h1 = h1*areal(aa)*areal(x2)
16440
qx1 = qonv(-x1,-h1) ! x1 should have im. part
16441
qx2 = qonv(-x2,-h2) ! x2 should have im. part
16449
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16453
rslt(0) = rslt(0) + ( li2c2( qy1*q12 ,qy2*q12 )*r12 &
16454
+ li2c2( qy1/q12 ,qy2/q12 )/r12 )/r24
16456
qtt = qonv(tt,-areal(r24) )
16459
rslt(0) = rslt(0) - ( li2c2( qy1*q23 ,qy2*q23 )*r23 &
16460
+ li2c2( qy1/q23 ,qy2/q23 )/r23 )*tt
16463
rslt(0) = rslt(0) + ( li2c2( qy1*q34 ,qy2*q34 )*r34 &
16464
+ li2c2( qy1/q34 ,qy2/q34 )/r34 )*r13
16466
rslt(0) = rslt(0) - ( li2c2( qx1*q14 ,qx2*q14 )*r14 &
16467
+ li2c2( qx1/q14 ,qx2/q14 )/r14 )
16469
rslt(0) = -rslt(0)/(aa*sm1*sm2*sm3*sm4)
16475
module avh_olo_qp_boxc
16477
use avh_olo_qp_prec
16478
use avh_olo_qp_auxfun
16479
use avh_olo_qp_qmplx
16486
subroutine boxc( rslt ,pp_in ,mm_in ,ap_in ,smax )
16487
!*******************************************************************
16488
! Finite 1-loop scalar 4-point function for complex internal masses
16489
! Based on the formulas from
16490
! Dao Thi Nhung and Le Duc Ninh, arXiv:0902.0325 [hep-ph]
16491
! G. 't Hooft and M.J.G. Veltman, Nucl.Phys.B153:365-401,1979
16492
!*******************************************************************
16493
use avh_olo_qp_box ,only: base,casetable,ll=>permtable
16495
,intent(out) :: rslt(0:2)
16497
,intent(in) :: pp_in(6),mm_in(4)
16499
,intent(in) :: ap_in(6),smax
16503
:: ap(6),aptmp(6),rem,imm,hh
16505
:: a,b,c,d,e,f,g,h,j,k,dpe,epk,x1,x2,sdnt,o1,j1,e1 &
16506
,dek,dpf,def,dpk,abc,bgj,jph,cph
16507
integer :: icase,jcase,ii
16509
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
16511
hh = neglig(prcpar)*smax
16513
if (ap_in(ii).ge.hh) then ;ap(ii)=ap_in(ii)
16519
if (ap(ii).eq.RZRO) then ;pp(ii)=0
16520
else ;pp(ii)=pp_in(ii)
16523
if (ap(5).eq.RZRO) then
16524
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxc: ' &
16525
,' |s| too small, putting it by hand'
16527
pp(5) = acmplx(sign(hh,areal(pp_in(5))))
16531
if (ap(6).eq.RZRO) then
16532
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxc: ' &
16533
,' |t| too small, putting it by hand'
16535
pp(6) = acmplx(sign(hh,areal(pp_in(6))))
16541
rem = areal(mm_in(ii))
16542
imm = aimag(mm_in(ii))
16544
if (abs(imm).lt.hh) imm = -hh
16545
mm(ii) = acmplx(rem,imm)
16550
if (ap(ii).gt.RZRO) icase = icase + base(ii)
16553
if (icase.lt.15) then
16554
! at least one exernal mass equal zero
16555
jcase = casetable(icase)
16556
if (jcase.eq.0.or.jcase.eq.1.or.jcase.eq.5) then
16557
! two opposite masses equal zero
16558
a = pp(ll(5,icase)) - pp(ll(1,icase))
16559
c = pp(ll(4,icase)) - pp(ll(5,icase)) - pp(ll(3,icase))
16560
g = pp(ll(2,icase))
16561
h = pp(ll(6,icase)) - pp(ll(2,icase)) - pp(ll(3,icase))
16562
d = (mm(ll(3,icase)) - mm(ll(4,icase))) - pp(ll(3,icase))
16563
e = (mm(ll(1,icase)) - mm(ll(3,icase))) + pp(ll(3,icase)) - pp(ll(4,icase))
16564
f = mm(ll(4,icase))
16565
k = (mm(ll(2,icase)) - mm(ll(3,icase))) - pp(ll(6,icase)) + pp(ll(3,icase))
16566
dpe = (mm(ll(1,icase)) - mm(ll(4,icase))) - pp(ll(4,icase))
16567
dpk = (mm(ll(2,icase)) - mm(ll(4,icase))) - pp(ll(6,icase))
16568
dpf = mm(ll(3,icase)) - pp(ll(3,icase))
16569
rslt(0) = t13fun( a,c,g,h ,d,e,f,k ,dpe,dpk,dpf )
16571
a = pp(ll(3,icase))
16572
b = pp(ll(2,icase))
16573
c = pp(ll(6,icase)) - pp(ll(2,icase)) - pp(ll(3,icase))
16574
h = pp(ll(4,icase)) - pp(ll(5,icase)) - pp(ll(6,icase)) + pp(ll(2,icase))
16575
j = pp(ll(5,icase)) - pp(ll(1,icase)) - pp(ll(2,icase))
16576
d = (mm(ll(3,icase)) - mm(ll(4,icase))) - pp(ll(3,icase))
16577
e = (mm(ll(2,icase)) - mm(ll(3,icase))) - pp(ll(6,icase)) + pp(ll(3,icase))
16578
k = (mm(ll(1,icase)) - mm(ll(2,icase))) + pp(ll(6,icase)) - pp(ll(4,icase))
16579
f = mm(ll(4,icase))
16580
cph = pp(ll(4,icase)) - pp(ll(5,icase)) - pp(ll(3,icase))
16581
dpe = (mm(ll(2,icase)) - mm(ll(4,icase))) - pp(ll(6,icase))
16582
epk = (mm(ll(1,icase)) - mm(ll(3,icase))) + pp(ll(3,icase)) - pp(ll(4,icase))
16583
dek = (mm(ll(1,icase)) - mm(ll(4,icase))) - pp(ll(4,icase))
16584
dpf = mm(ll(3,icase)) - pp(ll(3,icase))
16585
rslt(0) = tfun( a,b ,c ,h,j ,d,e ,f ,k ,dpe,dpf ) &
16586
- tfun( a,b+j,cph,h,j ,d,epk,f ,k ,dek,dpf )
16589
! no extenal mass equal zero
16590
if (areal((pp(5)-pp(1)-pp(2))**2-4*pp(1)*pp(2)).gt.RZRO)then ;icase=0 !12, no permutation
16591
elseif(areal((pp(6)-pp(2)-pp(3))**2-4*pp(2)*pp(3)).gt.RZRO)then ;icase=8 !23, 1 cyclic permutation
16592
elseif(areal((pp(4)-pp(5)-pp(3))**2-4*pp(5)*pp(3)).gt.RZRO)then ;icase=4 !34, 2 cyclic permutations
16593
elseif(areal((pp(4)-pp(1)-pp(6))**2-4*pp(1)*pp(6)).gt.RZRO)then ;icase=2 !41, 3 cyclic permutations
16595
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxc: ' &
16596
,'no positive lambda, returning 0'
16599
a = pp(ll(3,icase))
16600
b = pp(ll(2,icase))
16601
g = pp(ll(1,icase))
16602
c = pp(ll(6,icase)) - pp(ll(2,icase)) - pp(ll(3,icase))
16603
h = pp(ll(4,icase)) - pp(ll(5,icase)) - pp(ll(6,icase)) + pp(ll(2,icase))
16604
j = pp(ll(5,icase)) - pp(ll(1,icase)) - pp(ll(2,icase))
16605
d = (mm(ll(3,icase)) - mm(ll(4,icase))) - pp(ll(3,icase))
16606
e = (mm(ll(2,icase)) - mm(ll(3,icase))) - pp(ll(6,icase)) + pp(ll(3,icase))
16607
k = (mm(ll(1,icase)) - mm(ll(2,icase))) + pp(ll(6,icase)) - pp(ll(4,icase))
16608
f = mm(ll(4,icase))
16609
abc = pp(ll(6,icase))
16610
bgj = pp(ll(5,icase))
16611
jph = pp(ll(4,icase)) - pp(ll(1,icase)) - pp(ll(6,icase))
16612
cph = pp(ll(4,icase)) - pp(ll(5,icase)) - pp(ll(3,icase))
16613
dpe = (mm(ll(2,icase)) - mm(ll(4,icase))) - pp(ll(6,icase))
16614
epk = (mm(ll(1,icase)) - mm(ll(3,icase))) + pp(ll(3,icase)) - pp(ll(4,icase))
16615
dek = (mm(ll(1,icase)) - mm(ll(4,icase))) - pp(ll(4,icase))
16616
dpf = mm(ll(3,icase)) - pp(ll(3,icase))
16617
def = mm(ll(2,icase)) - pp(ll(6,icase))
16618
call solabc( x1,x2 ,sdnt ,g,j,b ,0 )
16619
if (aimag(sdnt).ne.RZRO) then
16620
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop boxc: ' &
16621
,'no real solution for alpha, returning 0'
16624
!BAD if (abs(areal(x1)).gt.abs(areal(x2))) then
16625
if (abs(areal(x1)).lt.abs(areal(x2))) then !BETTER
16633
rslt(0) = -tfun( abc,g ,jph,c+2*b+(h+j)*x1, j1 ,dpe,k ,f,e1 ,dek,def ) &
16634
+ o1*tfun( a ,bgj,cph,c+h*x1 , o1*j1,d ,epk,f,e1 ,dek,dpf ) &
16635
+ x1*tfun( a ,b ,c ,c+h*x1 ,-j1*x1,d ,e ,f,e1 ,dpe,dpf )
16640
function t13fun( aa,cc,gg,hh ,dd,ee,ff,jj ,dpe,dpj,dpf ) result(rslt)
16641
!*******************************************************************
16643
! | dx | dy -----------------------------------------------------
16644
! /0 /0 (gy^2 + hxy + dx + jy + f)*(ax^2 + cxy + dx + ey + f)
16646
! jj should have negative imaginary part
16647
!*******************************************************************
16649
,intent(in) :: aa,cc,gg,hh ,dd,ee,ff,jj ,dpe,dpj,dpf
16651
:: rslt ,kk,ll,nn,y1,y2,sdnt
16655
ll = aa*dd + hh*ee - dd*gg - cc*jj
16656
nn = dd*(ee - jj) + (hh - cc)*(ff-IEPS*abs(areal(ff)))
16657
call solabc( y1,y2 ,sdnt ,kk,ll,nn ,0 )
16659
rslt = - s3fun( y1,y2 ,CZRO,CONE ,aa ,ee+cc,dpf ) &
16660
+ s3fun( y1,y2 ,CZRO,CONE ,gg ,jj+hh,dpf ) &
16661
- s3fun( y1,y2 ,CZRO,CONE ,gg+hh,dpj ,ff ) &
16662
+ s3fun( y1,y2 ,CZRO,CONE ,aa+cc,dpe ,ff )
16668
function t1fun( aa,cc,gg,hh ,dd,ee,ff,jj ,dpe ) result(rslt)
16669
!*******************************************************************
16671
! | dx | dy ----------------------------------------------
16672
! /0 /0 (g*x + h*x + j)*(a*x^2 + c*xy + d*x + e*y + f)
16674
! jj should have negative imaginary part
16675
!*******************************************************************
16677
,intent(in) :: aa,cc,gg,hh ,dd,ee,ff,jj,dpe
16679
::rslt ,kk,ll,nn,y1,y2,sdnt
16683
ll = hh*dd - cc*jj - ee*gg
16684
nn = hh*(ff-IEPS*abs(areal(ff))) - ee*jj
16685
call solabc( y1,y2 ,sdnt ,kk,ll,nn ,0 )
16687
rslt = - s3fun( y1,y2 ,CZRO,CONE ,aa+cc,dpe ,ff ) &
16688
+ s3fun( y1,y2 ,CZRO,CONE ,CZRO ,gg+hh,jj ) &
16689
- s3fun( y1,y2 ,CZRO,CONE ,CZRO ,gg ,jj ) &
16690
+ s3fun( y1,y2 ,CZRO,CONE ,aa ,dd ,ff )
16696
function tfun( aa,bb,cc ,gin,hin ,dd,ee,ff ,jin ,dpe ,dpf ) result(rslt)
16697
!*******************************************************************
16699
! | dx | dy ------------------------------------------------------
16700
! /0 /0 (g*x + h*x + j)*(a*x^2 + b*y^2 + c*xy + d*x + e*y + f)
16701
!*******************************************************************
16703
,intent(in) :: aa,bb,cc ,gin,hin ,dd,ee,ff ,jin ,dpe ,dpf
16705
:: rslt ,gg,hh,jj,zz(2),beta,tmpa(2),tmpb(2) &
16706
,tmpc(2),kiz(2),ll,nn,kk,y1,y2,yy(2,2),sdnt
16708
:: ab1,ab2,ac1,ac2,abab,acac,abac,det,ap1,ap2 &
16709
,apab,apac,x1(2,2),x2(2,2),xmin
16710
integer :: iz,iy,izmin,sj
16711
logical :: pp(2,2),p1,p2
16719
if (bb.eq.CZRO) then
16720
rslt = -sj*t1fun( aa,cc,gg,hh ,dd,ee,ff,jj ,dpe )
16722
elseif (aa.eq.CZRO) then
16723
rslt = -sj*t1fun( bb+cc,-cc,-gg-hh,gg, -dpe-2*(bb+cc),dd+cc &
16724
,dpe+bb+cc+ff,gg+hh+jj ,-ee-2*bb-cc )
16728
call solabc( zz(1),zz(2) ,sdnt ,bb,cc,aa ,0 )
16729
if (abs(zz(1)).gt.abs(zz(2))) then
16737
tmpa(iz) = gg + beta*hh
16738
tmpb(iz) = cc + 2*beta*bb
16739
tmpc(iz) = dd + beta*ee
16740
kiz(iz) = bb*tmpa(iz) - hh*tmpb(iz)
16741
ll = ee*tmpa(iz) - hh*tmpc(iz) - jj*tmpb(iz)
16742
nn = (ff-IEPS*abs(areal(ff)))*tmpa(iz) - jj*tmpc(iz)
16743
call solabc( yy(iz,1),yy(iz,2) ,sdnt ,kiz(iz),ll,nn ,0 )
16744
if (abs(aimag(beta)).ne.RZRO) then
16747
ac1 = ab1+1 !areal(1-beta)
16748
ac2 = ab2 !aimag(1-beta)
16749
abab = ab1*ab1 + ab2*ab2
16750
acac = ac1*ac1 + ac2*ac2
16751
abac = ab1*ac1 + ab2*ac2
16752
det = abab*acac - abac*abac
16754
ap1 = areal(yy(iz,iy))
16755
ap2 = aimag(yy(iz,iy))
16756
apab = ap1*ab1 + ap2*ab2
16757
apac = ap1*ac1 + ap2*ac2
16758
x1(iz,iy) = ( acac*apab - abac*apac )/det
16759
x2(iz,iy) = (-abac*apab + abab*apac )/det
16772
if ( x1(iz,iy).ge.RZRO.and.x2(iz,iy).ge.RZRO &
16773
.and.x1(iz,iy)+x2(iz,iy).le.RONE ) then
16775
if (x1(iz,iy).lt.xmin) then
16779
if (x2(iz,iy).lt.xmin) then
16784
pp(iz,iy) = .false.
16789
if (iz.eq.3) iz = 1
16798
rslt = s3fun( y1,y2 ,beta ,CONE ,CZRO ,hh ,gg+jj ) &
16799
- s3fun( y1,y2 ,CZRO ,CONE-beta ,CZRO ,gg+hh, jj ) &
16800
+ s3fun( y1,y2 ,CZRO , -beta ,CZRO ,gg , jj ) &
16801
- s3fun( y1,y2 ,beta ,CONE ,bb ,cc+ee,aa+dpf ) &
16802
+ s3fun( y1,y2 ,CZRO ,CONE-beta ,aa+bb+cc,dpe ,ff ) &
16803
- s3fun( y1,y2 ,CZRO , -beta ,aa ,dd ,ff )
16805
sdnt = plnr( y1,y2 ,p1,p2, tmpa(iz),tmpb(iz),tmpc(iz) )
16806
if (aimag(beta).le.RZRO) then ;rslt = rslt + sdnt
16807
else ;rslt = rslt - sdnt
16814
function s3fun( y1i,y2i ,dd,ee ,aa,bb,cin ) result(rslt)
16815
!*******************************************************************
16817
! ( S3(y1i) - S3(y2i) )/( y1i - y2i )
16819
! /1 ee * ln( aa*x^2 + bb*x + cc )
16820
! S3(y) = | dx -----------------------------
16823
! y1i,y2i should have a non-zero imaginary part
16824
!*******************************************************************
16826
,intent(in) :: y1i,y2i ,dd,ee ,aa,bb,cin
16828
:: rslt ,y1,y2,fy1y2,z1,z2,tmp,cc
16830
::rea,reb,rez1,rez2,imz1,imz2,simc,hh
16833
if (ee.eq.CZRO) then
16842
if (simc.lt.10*neglig(prcpar)*min(rea,reb)) cc = 0
16845
if (simc.eq.RZRO) then
16847
if (simc.eq.RZRO) simc = -1
16853
if (aimag(y1).eq.RZRO) then
16854
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop s3fun: ' &
16855
,'y1 has zero imaginary part'
16857
if (aimag(y2).eq.RZRO) then
16858
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop s3fun: ' &
16859
,'y2 has zero imaginary part'
16861
fy1y2 = r0fun( y1,y2 )
16863
if (aa.ne.CZRO) then
16865
! call solabc( z1,z2 ,tmp ,aa,bb,cc ,0 )
16866
call solabc_rcc( z1,z2 ,areal(aa),bb,cc )
16870
imz1 = aimag(z1) ! sign(Im(a*z1*z2)) = simc
16872
hh = abs(EPSN2*rez1)
16873
! if (abs(imz1).lt.EPSN*hh) imz1 = simc*rea*sgnRe(rez2)*hh
16874
if (imz1.eq.RZRO) imz1 = simc*rea*sgnRe(rez2)*hh
16875
hh = abs(EPSN2*rez2)
16876
! if (abs(imz2).lt.EPSN*hh) imz2 = simc*rea*sgnRe(rez1)*hh
16877
if (imz2.eq.RZRO) imz2 = simc*rea*sgnRe(rez1)*hh
16878
z1 = acmplx( rez1,imz1)
16879
z2 = acmplx( rez2,imz2)
16880
rslt = fy1y2 * ( logc(qonv(aa,simc)) &
16881
+ eta3( -z1,-imz1,-z2,-imz2,CZRO,simc*rea ) ) &
16882
+ r1fun( z1,y1,y2,fy1y2 ) &
16883
+ r1fun( z2,y1,y2,fy1y2 )
16885
elseif (bb.ne.CZRO) then
16887
z1 = -cc/bb ! - i|eps|Re(b)
16891
if (abs(imz1).eq.RZRO) then
16892
imz1 = -simc*reb*abs(EPSN2*rez1/reb)
16893
z1 = acmplx( rez1,imz1)
16895
rslt = fy1y2 * ( logc(qonv(bb,simc)) &
16896
+ eta3(bb,simc ,-z1,-imz1 ,cc,simc) ) &
16897
+ r1fun( z1,y1,y2,fy1y2 )
16899
elseif (cc.ne.CZRO) then
16901
rslt = logc( qonv(cc,simc) )*fy1y2
16903
else!if (aa=bb=cc=0)
16905
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop s3fun: ' &
16906
,'cc equal zero, returning 0'
16915
function r1fun( zz,y1,y2,fy1y2 ) result(rslt)
16916
!*******************************************************************
16917
! calculates ( R1(y1,z) - R1(y2,z) )/( y1 - y2 )
16919
! / / 1-y \ / 1-z \ \
16920
! R1(y,z) = ln(y-z) * | log |-----| - log |-----| |
16921
! \ \ -y / \ -z / /
16924
! - Li2 |1 - ----| + Li2 |1 - ----|
16927
! / 1-y1 \ / 1-y2 \
16928
! log |------| - log |------|
16929
! input fy1y2 should be equal to \ -y1 / \ -y2 /
16930
! ---------------------------
16932
!*******************************************************************
16934
,intent(in) :: y1,y2,zz,fy1y2
16937
type(qmplx_type) :: q1z,q2z,qq
16939
:: h12,hz1,hz2,hzz,hoz
16940
logical :: zzsmall,ozsmall
16954
if (hzz.lt.hz1.and.hzz.lt.hz2.and.hzz.lt.hoz) then ! |z| < |y1-z|,|y2-z|
16956
rslt = fy1y2*logc( q1z ) &
16957
- ( logc(q1z*q2z)/2 + logc(qonv((y2-1)/y2)) &
16958
- logc(qonv(oz)) )*logc2(q1z/q2z)/(y2-zz)
16959
elseif (hoz.lt.hz1.and.hoz.lt.hz2) then ! |1-z| < |y1-z|,|y2-z|
16961
rslt = fy1y2*logc( q1z ) &
16962
- (-logc(q1z*q2z)/2 + logc(qonv((y2-1)/y2)) &
16963
+ logc(qonv(-zz)) )*logc2(q1z/q2z)/(y2-zz)
16964
elseif (h12.le.hz2.and.hz2.le.hz1) then ! |y1-y2| < |y2-z| < |y1-z|
16965
rslt = fy1y2*logc( q1z ) - r0fun( y2,zz )*logc2( q1z/q2z )
16966
elseif (h12.le.hz1.and.hz1.le.hz2) then ! |y1-y2| < |y2-z| < |y1-z|
16967
rslt = fy1y2*logc( q2z ) - r0fun( y1,zz )*logc2( q2z/q1z )
16968
else!if(hz1.lt.h12.or.hz2.lt.h12) then ! |y2-z|,|y1-z| < |y1-y2|
16970
if (hz1.ne.RZRO) rslt = rslt + (y1-zz)*logc( q1z )*r0fun( y1,zz )
16971
if (hz2.ne.RZRO) rslt = rslt - (y2-zz)*logc( q2z )*r0fun( y2,zz )
16972
rslt = rslt/(y1-y2)
16975
if (zzsmall) then ! |z| < |y1-z|,|y2-z|
16977
rslt = rslt + ( li2c( qq/q1z ) - li2c( qq/q2z ) )/(y1-y2)
16980
rslt = rslt + li2c2( q1z/qq ,q2z/qq )/zz
16983
if (ozsmall) then ! |1-z| < |y1-z|,|y2-z|
16985
rslt = rslt - ( li2c( qq/q1z ) - li2c( qq/q2z ) )/(y1-y2)
16988
rslt = rslt + li2c2( q1z/qq ,q2z/qq )/oz
16993
function r0fun( y1,y2 ) result(rslt)
16994
!*******************************************************************
16995
! / 1-y1 \ / 1-y2 \
16996
! log |------| - log |------|
16998
! ---------------------------
17001
! y1,y2 should have non-zero imaginary parts
17002
!*******************************************************************
17004
,intent(in) :: y1,y2
17009
rslt = logc2( qonv(-y2)/qonv(-y1) )/y1 &
17010
+ logc2( qonv(oy2)/qonv(oy1) )/oy1
17014
function plnr( y1,y2 ,p1,p2 ,aa,bb,cc ) result(rslt)
17015
!*******************************************************************
17017
! p1*log |--------| - p2*log |--------|
17018
! \ b*y1+c / \ b*y2+c /
17019
! 2*pi*imag* -------------------------------------
17022
! p1,p2 are logical, to be interpreted as 0,1 in the formula above
17023
!*******************************************************************
17025
,intent(in) :: y1,y2 ,aa,bb,cc
17026
logical ,intent(in) :: p1,p2
17029
type(qmplx_type) :: q1,q2
17034
if (aimag(xx).eq.RZRO) then
17035
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop plnr: ' &
17036
,'aa/x1 has zero imaginary part'
17043
if (aimag(xx).eq.RZRO) then
17044
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop plnr: ' &
17045
,'aa/x2 has zero imaginary part'
17051
rslt = logc2( q2/q1 ) * 2*IPI*bb/x2
17053
rslt = logc( q1 ) * 2*IPI/(y1-y2)
17056
rslt = logc( q2 ) * 2*IPI/(y2-y1) ! minus sign
17068
use avh_olo_qp_print
17069
use avh_olo_qp_prec
17073
public :: olo_unit ,olo_scale ,olo_onshell ,olo_setting
17074
public :: olo_precision
17075
public :: olo_a0 ,olo_b0 ,olo_b11 ,olo_c0 ,olo_d0
17076
public :: olo_an ,olo_bn
17078
public :: olo_get_scale ,olo_get_onshell ,olo_get_precision
17080
integer ,public ,parameter :: olo_kind=kindr2
17083
,save :: onshellthrs
17084
logical,save :: nonzerothrs = .false.
17089
character(99) ,parameter :: warnonshell=&
17090
'it seems you forgot to put some input explicitly on shell. ' &
17091
//'You may call olo_onshell to cure this.'
17093
logical ,save :: initz=.true.
17096
module procedure a0_r,a0rr,a0_c,a0cr
17099
module procedure an_r,anrr,an_c,ancr
17102
module procedure b0rr,b0rrr,b0rc,b0rcr,b0cc,b0ccr
17105
module procedure b11rr,b11rrr,b11rc,b11rcr,b11cc,b11ccr
17108
module procedure bnrr,bnrrr,bnrc,bnrcr,bncc,bnccr
17111
module procedure c0rr,c0rrr,c0rc,c0rcr,c0cc,c0ccr
17114
module procedure d0rr,d0rrr,d0rc,d0rcr,d0cc,d0ccr
17118
module procedure a0_r,a0rr,a0_c,a0cr
17119
module procedure an_r,anrr,an_c,ancr
17120
module procedure b0rr,b0rrr,b0rc,b0rcr,b0cc,b0ccr
17121
module procedure b11rr,b11rrr,b11rc,b11rcr,b11cc,b11ccr
17122
module procedure bnrr,bnrrr,bnrc,bnrcr,bncc,bnccr
17123
module procedure c0rr,c0rrr,c0rc,c0rcr,c0cc,c0ccr
17124
module procedure d0rr,d0rrr,d0rc,d0rcr,d0cc,d0ccr
17130
subroutine init( ndec )
17131
!*******************************************************************
17132
!*******************************************************************
17133
use avh_olo_version
17134
integer,optional,intent(in) :: ndec
17140
if (present(ndec)) then
17141
call olo_precision( ndec )
17143
call olo_precision( 15 )
17148
if (.not.nonzerothrs) onshellthrs = neglig(prcpar)
17153
recursive subroutine olo_precision( ndec )
17154
!*******************************************************************
17155
!*******************************************************************
17156
use avh_olo_qp_olog ,only: update_olog
17157
use avh_olo_qp_dilog ,only: update_dilog
17158
use avh_olo_qp_bnlog ,only: update_bnlog
17159
integer ,intent(in) :: ndec
17164
call set_precision( newprc )
17170
if (.not.nonzerothrs) onshellthrs = neglig(prcpar)
17175
subroutine olo_unit( val ,message )
17176
!*******************************************************************
17177
!*******************************************************************
17178
integer ,intent(in) :: val
17179
character(*),intent(in),optional :: message
17180
if (initz) call init
17181
if (present(message)) then ;call set_unit( message ,val )
17182
else ;call set_unit( 'all' ,val )
17187
subroutine olo_scale( val )
17188
!*******************************************************************
17189
!*******************************************************************
17190
real(kind(1d0)) ,intent(in) :: val
17191
if (initz) call init
17192
muscale = convert(val)
17196
subroutine olo_onshell( thrs )
17197
!*******************************************************************
17198
!*******************************************************************
17199
real(kind(1d0)) ,intent(in) :: thrs
17200
if (initz) call init
17201
nonzerothrs = .true.
17202
onshellthrs = convert(thrs)
17206
function olo_get_precision() result(rslt)
17207
!*******************************************************************
17208
!*******************************************************************
17209
use avh_olo_qp_prec ,only: ndecim,prcpar
17211
if (initz) call init
17212
rslt = ndecim(prcpar)
17215
function olo_get_scale() result(rslt)
17216
!*******************************************************************
17217
!*******************************************************************
17218
real(kind(1d0)) :: rslt
17219
if (initz) call init
17220
rslt = adble(muscale)
17223
function olo_get_onshell() result(rslt)
17224
!*******************************************************************
17225
!*******************************************************************
17226
real(kind(1d0)) :: rslt
17227
if (initz) call init
17228
rslt = adble(onshellthrs)
17232
subroutine olo_setting( iunit )
17233
!*******************************************************************
17234
!*******************************************************************
17235
integer,optional,intent(in) :: iunit
17237
if (initz) call init
17239
if (present(iunit)) nunit = iunit
17240
if (nunit.le.0) return
17242
write(nunit,*) 'MESSAGE from OneLOop: real kind parameter =',trim(myprint(kindr2))
17243
write(nunit,*) 'MESSAGE from OneLOop: number of decimals =',trim(myprint(ndecim(prcpar)))
17245
if (nonzerothrs) then
17246
write(nunit,*) 'MESSAGE from OneLOop: on-shell threshold =',trim(myprint(onshellthrs,12))
17248
write(nunit,*) 'MESSAGE from OneLOop: on-shell threshold is not set'
17251
write(nunit,*) 'MESSAGE from OneLOop: default scale (mu, not mu^2) =',trim(myprint(muscale,12))
17256
!*******************************************************************
17259
! rslt = ------ | --------
17260
! i*pi^2 / (q^2-mm)
17262
! with Dim = 4-2*eps
17263
! C = pi^eps * mu^(2*eps) * exp(gamma_Euler*eps)
17265
! input: mm = mass squared
17266
! output: rslt(0) = eps^0 -coefficient
17267
! rslt(1) = eps^(-1)-coefficient
17268
! rslt(2) = eps^(-2)-coefficient
17270
! Check the comments in subroutine olo_onshell to find out how
17271
! this routine decides when to return IR-divergent cases.
17272
!*******************************************************************
17274
subroutine a0_c( rslt ,mm )
17276
use avh_olo_qp_bub ,only: tadp
17279
,intent(out) :: rslt(0:2)
17286
:: am,hh,mulocal,mulocal2
17287
character(25+99) ,parameter :: warning=&
17288
'WARNING from OneLOop a0: '//warnonshell
17289
if (initz) call init
17295
mulocal2 = mulocal*mulocal
17297
if (nonzerothrs) then
17299
if (am.lt.hh) am = 0
17300
elseif (wunit.gt.0) then
17301
hh = onshellthrs*max(am,mulocal2)
17302
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17306
call tadp( rslt ,ss ,am ,mulocal2 )
17308
if (punit.gt.0) then
17309
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17310
write(punit,*) 'muscale:',trim(myprint(mulocal))
17311
write(punit,*) ' mm:',trim(myprint(mm))
17312
write(punit,*) 'a0(2):',trim(myprint(rslt(2)))
17313
write(punit,*) 'a0(1):',trim(myprint(rslt(1)))
17314
write(punit,*) 'a0(0):',trim(myprint(rslt(0)))
17318
subroutine a0cr( rslt ,mm ,rmu )
17320
use avh_olo_qp_bub ,only: tadp
17323
,intent(out) :: rslt(0:2)
17332
:: am,hh,mulocal,mulocal2
17333
character(25+99) ,parameter :: warning=&
17334
'WARNING from OneLOop a0: '//warnonshell
17335
if (initz) call init
17341
mulocal2 = mulocal*mulocal
17343
if (nonzerothrs) then
17345
if (am.lt.hh) am = 0
17346
elseif (wunit.gt.0) then
17347
hh = onshellthrs*max(am,mulocal2)
17348
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17352
call tadp( rslt ,ss ,am ,mulocal2 )
17354
if (punit.gt.0) then
17355
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17356
write(punit,*) 'muscale:',trim(myprint(mulocal))
17357
write(punit,*) ' mm:',trim(myprint(mm))
17358
write(punit,*) 'a0(2):',trim(myprint(rslt(2)))
17359
write(punit,*) 'a0(1):',trim(myprint(rslt(1)))
17360
write(punit,*) 'a0(0):',trim(myprint(rslt(0)))
17364
subroutine a0_r( rslt ,mm )
17366
use avh_olo_qp_bub ,only: tadp
17369
,intent(out) :: rslt(0:2)
17376
:: am,hh,mulocal,mulocal2
17377
character(25+99) ,parameter :: warning=&
17378
'WARNING from OneLOop a0: '//warnonshell
17379
if (initz) call init
17385
mulocal2 = mulocal*mulocal
17387
if (nonzerothrs) then
17389
if (am.lt.hh) am = 0
17390
elseif (wunit.gt.0) then
17391
hh = onshellthrs*max(am,mulocal2)
17392
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17396
call tadp( rslt ,ss ,am ,mulocal2 )
17398
if (punit.gt.0) then
17399
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17400
write(punit,*) 'muscale:',trim(myprint(mulocal))
17401
write(punit,*) ' mm:',trim(myprint(mm))
17402
write(punit,*) 'a0(2):',trim(myprint(rslt(2)))
17403
write(punit,*) 'a0(1):',trim(myprint(rslt(1)))
17404
write(punit,*) 'a0(0):',trim(myprint(rslt(0)))
17408
subroutine a0rr( rslt ,mm ,rmu )
17410
use avh_olo_qp_bub ,only: tadp
17413
,intent(out) :: rslt(0:2)
17422
:: am,hh,mulocal,mulocal2
17423
character(25+99) ,parameter :: warning=&
17424
'WARNING from OneLOop a0: '//warnonshell
17425
if (initz) call init
17431
mulocal2 = mulocal*mulocal
17433
if (nonzerothrs) then
17435
if (am.lt.hh) am = 0
17436
elseif (wunit.gt.0) then
17437
hh = onshellthrs*max(am,mulocal2)
17438
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17442
call tadp( rslt ,ss ,am ,mulocal2 )
17444
if (punit.gt.0) then
17445
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17446
write(punit,*) 'muscale:',trim(myprint(mulocal))
17447
write(punit,*) ' mm:',trim(myprint(mm))
17448
write(punit,*) 'a0(2):',trim(myprint(rslt(2)))
17449
write(punit,*) 'a0(1):',trim(myprint(rslt(1)))
17450
write(punit,*) 'a0(0):',trim(myprint(rslt(0)))
17455
subroutine an_c( rslt ,rank ,mm )
17457
use avh_olo_qp_bub ,only: tadpn
17460
,intent(out) :: rslt(0:,0:)
17463
integer,intent(in) :: rank
17468
:: am,hh,mulocal,mulocal2
17470
character(25+99) ,parameter :: warning=&
17471
'WARNING from OneLOop An: '//warnonshell
17472
if (initz) call init
17478
mulocal2 = mulocal*mulocal
17480
if (nonzerothrs) then
17482
if (am.lt.hh) am = 0
17483
elseif (wunit.gt.0) then
17484
hh = onshellthrs*max(am,mulocal2)
17485
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17489
call tadpn( rslt ,rank ,ss ,am ,mulocal2 )
17491
if (punit.gt.0) then
17492
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17493
write(punit,*) 'muscale:',trim(myprint(mulocal))
17494
write(punit,*) ' mm:',trim(myprint(mm))
17496
write(punit,*) 'A(2,',trim(myprint(ii)),'):',trim(myprint(rslt(2,ii)))
17497
write(punit,*) 'A(1,',trim(myprint(ii)),'):',trim(myprint(rslt(1,ii)))
17498
write(punit,*) 'A(0,',trim(myprint(ii)),'):',trim(myprint(rslt(0,ii)))
17503
subroutine ancr( rslt ,rank ,mm ,rmu )
17505
use avh_olo_qp_bub ,only: tadpn
17508
,intent(out) :: rslt(0:,0:)
17513
integer,intent(in) :: rank
17518
:: am,hh,mulocal,mulocal2
17520
character(25+99) ,parameter :: warning=&
17521
'WARNING from OneLOop An: '//warnonshell
17522
if (initz) call init
17528
mulocal2 = mulocal*mulocal
17530
if (nonzerothrs) then
17532
if (am.lt.hh) am = 0
17533
elseif (wunit.gt.0) then
17534
hh = onshellthrs*max(am,mulocal2)
17535
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17539
call tadpn( rslt ,rank ,ss ,am ,mulocal2 )
17541
if (punit.gt.0) then
17542
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17543
write(punit,*) 'muscale:',trim(myprint(mulocal))
17544
write(punit,*) ' mm:',trim(myprint(mm))
17546
write(punit,*) 'A(2,',trim(myprint(ii)),'):',trim(myprint(rslt(2,ii)))
17547
write(punit,*) 'A(1,',trim(myprint(ii)),'):',trim(myprint(rslt(1,ii)))
17548
write(punit,*) 'A(0,',trim(myprint(ii)),'):',trim(myprint(rslt(0,ii)))
17553
subroutine an_r( rslt ,rank ,mm )
17555
use avh_olo_qp_bub ,only: tadpn
17558
,intent(out) :: rslt(0:,0:)
17561
integer,intent(in) :: rank
17566
:: am,hh,mulocal,mulocal2
17568
character(25+99) ,parameter :: warning=&
17569
'WARNING from OneLOop An: '//warnonshell
17570
if (initz) call init
17576
mulocal2 = mulocal*mulocal
17578
if (nonzerothrs) then
17580
if (am.lt.hh) am = 0
17581
elseif (wunit.gt.0) then
17582
hh = onshellthrs*max(am,mulocal2)
17583
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17587
call tadpn( rslt ,rank ,ss ,am ,mulocal2 )
17589
if (punit.gt.0) then
17590
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17591
write(punit,*) 'muscale:',trim(myprint(mulocal))
17592
write(punit,*) ' mm:',trim(myprint(mm))
17594
write(punit,*) 'A(2,',trim(myprint(ii)),'):',trim(myprint(rslt(2,ii)))
17595
write(punit,*) 'A(1,',trim(myprint(ii)),'):',trim(myprint(rslt(1,ii)))
17596
write(punit,*) 'A(0,',trim(myprint(ii)),'):',trim(myprint(rslt(0,ii)))
17601
subroutine anrr( rslt ,rank ,mm ,rmu )
17603
use avh_olo_qp_bub ,only: tadpn
17606
,intent(out) :: rslt(0:,0:)
17611
integer,intent(in) :: rank
17616
:: am,hh,mulocal,mulocal2
17618
character(25+99) ,parameter :: warning=&
17619
'WARNING from OneLOop An: '//warnonshell
17620
if (initz) call init
17626
mulocal2 = mulocal*mulocal
17628
if (nonzerothrs) then
17630
if (am.lt.hh) am = 0
17631
elseif (wunit.gt.0) then
17632
hh = onshellthrs*max(am,mulocal2)
17633
if (RZRO.lt.am.and.am.lt.hh) write(wunit,*) warning
17637
call tadpn( rslt ,rank ,ss ,am ,mulocal2 )
17639
if (punit.gt.0) then
17640
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17641
write(punit,*) 'muscale:',trim(myprint(mulocal))
17642
write(punit,*) ' mm:',trim(myprint(mm))
17644
write(punit,*) 'A(2,',trim(myprint(ii)),'):',trim(myprint(rslt(2,ii)))
17645
write(punit,*) 'A(1,',trim(myprint(ii)),'):',trim(myprint(rslt(1,ii)))
17646
write(punit,*) 'A(0,',trim(myprint(ii)),'):',trim(myprint(rslt(0,ii)))
17652
!*******************************************************************
17655
! rslt = ------ | --------------------
17656
! i*pi^2 / [q^2-m1][(q+k)^2-m2]
17658
! with Dim = 4-2*eps
17659
! C = pi^eps * mu^(2*eps) * exp(gamma_Euler*eps)
17661
! input: pp = k^2, m1,m2 = mass squared
17662
! output: rslt(0) = eps^0 -coefficient
17663
! rslt(1) = eps^(-1)-coefficient
17664
! rslt(2) = eps^(-2)-coefficient
17666
! Check the comments in subroutine olo_onshell to find out how
17667
! this routine decides when to return IR-divergent cases.
17668
!*******************************************************************
17670
subroutine b0cc( rslt ,pp,m1,m2 )
17672
use avh_olo_qp_bub ,only: bub0
17675
,intent(out) :: rslt(0:2)
17679
,intent(in) :: m1,m2
17684
:: app,am1,am2,hh,mulocal,mulocal2
17685
character(25+99) ,parameter :: warning=&
17686
'WARNING from OneLOop b0: '//warnonshell
17687
if (initz) call init
17693
if (aimag(ss).ne.RZRO) then
17694
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17695
,'ss has non-zero imaginary part, putting it to zero.'
17702
if (hh.gt.RZRO) then
17703
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17704
,'r1 has positive imaginary part, switching its sign.'
17705
r1 = acmplx( am1 ,-hh )
17707
am1 = abs(am1) + abs(hh)
17711
if (hh.gt.RZRO) then
17712
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17713
,'r2 has positive imaginary part, switching its sign.'
17714
r2 = acmplx( am2 ,-hh )
17716
am2 = abs(am2) + abs(hh)
17720
mulocal2 = mulocal*mulocal
17722
if (nonzerothrs) then
17724
if (app.lt.hh) app = 0
17725
if (am1.lt.hh) am1 = 0
17726
if (am2.lt.hh) am2 = 0
17727
elseif (wunit.gt.0) then
17728
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
17729
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
17730
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
17731
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
17734
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
17736
if (punit.gt.0) then
17737
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17738
write(punit,*) 'muscale:',trim(myprint(mulocal))
17739
write(punit,*) ' pp:',trim(myprint(pp))
17740
write(punit,*) ' m1:',trim(myprint(m1))
17741
write(punit,*) ' m2:',trim(myprint(m2))
17742
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
17743
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
17744
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
17748
subroutine b0ccr( rslt ,pp,m1,m2 ,rmu )
17750
use avh_olo_qp_bub ,only: bub0
17753
,intent(out) :: rslt(0:2)
17757
,intent(in) :: m1,m2
17764
:: app,am1,am2,hh,mulocal,mulocal2
17765
character(25+99) ,parameter :: warning=&
17766
'WARNING from OneLOop b0: '//warnonshell
17767
if (initz) call init
17773
if (aimag(ss).ne.RZRO) then
17774
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17775
,'ss has non-zero imaginary part, putting it to zero.'
17782
if (hh.gt.RZRO) then
17783
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17784
,'r1 has positive imaginary part, switching its sign.'
17785
r1 = acmplx( am1 ,-hh )
17787
am1 = abs(am1) + abs(hh)
17791
if (hh.gt.RZRO) then
17792
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17793
,'r2 has positive imaginary part, switching its sign.'
17794
r2 = acmplx( am2 ,-hh )
17796
am2 = abs(am2) + abs(hh)
17800
mulocal2 = mulocal*mulocal
17802
if (nonzerothrs) then
17804
if (app.lt.hh) app = 0
17805
if (am1.lt.hh) am1 = 0
17806
if (am2.lt.hh) am2 = 0
17807
elseif (wunit.gt.0) then
17808
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
17809
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
17810
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
17811
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
17814
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
17816
if (punit.gt.0) then
17817
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17818
write(punit,*) 'muscale:',trim(myprint(mulocal))
17819
write(punit,*) ' pp:',trim(myprint(pp))
17820
write(punit,*) ' m1:',trim(myprint(m1))
17821
write(punit,*) ' m2:',trim(myprint(m2))
17822
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
17823
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
17824
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
17828
subroutine b0rc( rslt ,pp ,m1,m2 )
17830
use avh_olo_qp_bub ,only: bub0
17833
,intent(out) :: rslt(0:2)
17837
,intent(in) :: m1,m2
17842
:: app,am1,am2,hh,mulocal,mulocal2
17843
character(25+99) ,parameter :: warning=&
17844
'WARNING from OneLOop b0: '//warnonshell
17845
if (initz) call init
17854
if (hh.gt.RZRO) then
17855
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17856
,'r1 has positive imaginary part, switching its sign.'
17857
r1 = acmplx( am1 ,-hh )
17859
am1 = abs(am1) + abs(hh)
17863
if (hh.gt.RZRO) then
17864
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17865
,'r2 has positive imaginary part, switching its sign.'
17866
r2 = acmplx( am2 ,-hh )
17868
am2 = abs(am2) + abs(hh)
17872
mulocal2 = mulocal*mulocal
17874
if (nonzerothrs) then
17876
if (app.lt.hh) app = 0
17877
if (am1.lt.hh) am1 = 0
17878
if (am2.lt.hh) am2 = 0
17879
elseif (wunit.gt.0) then
17880
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
17881
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
17882
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
17883
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
17886
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
17888
if (punit.gt.0) then
17889
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17890
write(punit,*) 'muscale:',trim(myprint(mulocal))
17891
write(punit,*) ' pp:',trim(myprint(pp))
17892
write(punit,*) ' m1:',trim(myprint(m1))
17893
write(punit,*) ' m2:',trim(myprint(m2))
17894
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
17895
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
17896
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
17900
subroutine b0rcr( rslt ,pp,m1,m2 ,rmu )
17902
use avh_olo_qp_bub ,only: bub0
17905
,intent(out) :: rslt(0:2)
17909
,intent(in) :: m1,m2
17916
:: app,am1,am2,hh,mulocal,mulocal2
17917
character(25+99) ,parameter :: warning=&
17918
'WARNING from OneLOop b0: '//warnonshell
17919
if (initz) call init
17928
if (hh.gt.RZRO) then
17929
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17930
,'r1 has positive imaginary part, switching its sign.'
17931
r1 = acmplx( am1 ,-hh )
17933
am1 = abs(am1) + abs(hh)
17937
if (hh.gt.RZRO) then
17938
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b0: ' &
17939
,'r2 has positive imaginary part, switching its sign.'
17940
r2 = acmplx( am2 ,-hh )
17942
am2 = abs(am2) + abs(hh)
17946
mulocal2 = mulocal*mulocal
17948
if (nonzerothrs) then
17950
if (app.lt.hh) app = 0
17951
if (am1.lt.hh) am1 = 0
17952
if (am2.lt.hh) am2 = 0
17953
elseif (wunit.gt.0) then
17954
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
17955
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
17956
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
17957
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
17960
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
17962
if (punit.gt.0) then
17963
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
17964
write(punit,*) 'muscale:',trim(myprint(mulocal))
17965
write(punit,*) ' pp:',trim(myprint(pp))
17966
write(punit,*) ' m1:',trim(myprint(m1))
17967
write(punit,*) ' m2:',trim(myprint(m2))
17968
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
17969
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
17970
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
17974
subroutine b0rr( rslt ,pp ,m1,m2 )
17976
use avh_olo_qp_bub ,only: bub0
17979
,intent(out) :: rslt(0:2)
17983
,intent(in) :: m1,m2
17988
:: app,am1,am2,hh,mulocal,mulocal2
17989
character(25+99) ,parameter :: warning=&
17990
'WARNING from OneLOop b0: '//warnonshell
17991
if (initz) call init
18003
mulocal2 = mulocal*mulocal
18005
if (nonzerothrs) then
18007
if (app.lt.hh) app = 0
18008
if (am1.lt.hh) am1 = 0
18009
if (am2.lt.hh) am2 = 0
18010
elseif (wunit.gt.0) then
18011
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18012
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18013
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18014
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18017
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18019
if (punit.gt.0) then
18020
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18021
write(punit,*) 'muscale:',trim(myprint(mulocal))
18022
write(punit,*) ' pp:',trim(myprint(pp))
18023
write(punit,*) ' m1:',trim(myprint(m1))
18024
write(punit,*) ' m2:',trim(myprint(m2))
18025
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
18026
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
18027
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
18031
subroutine b0rrr( rslt ,pp ,m1,m2 ,rmu )
18033
use avh_olo_qp_bub ,only: bub0
18036
,intent(out) :: rslt(0:2)
18040
,intent(in) :: m1,m2
18047
:: app,am1,am2,hh,mulocal,mulocal2
18048
character(25+99) ,parameter :: warning=&
18049
'WARNING from OneLOop b0: '//warnonshell
18050
if (initz) call init
18062
mulocal2 = mulocal*mulocal
18064
if (nonzerothrs) then
18066
if (app.lt.hh) app = 0
18067
if (am1.lt.hh) am1 = 0
18068
if (am2.lt.hh) am2 = 0
18069
elseif (wunit.gt.0) then
18070
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18071
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18072
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18073
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18076
call bub0( rslt ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18078
if (punit.gt.0) then
18079
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18080
write(punit,*) 'muscale:',trim(myprint(mulocal))
18081
write(punit,*) ' pp:',trim(myprint(pp))
18082
write(punit,*) ' m1:',trim(myprint(m1))
18083
write(punit,*) ' m2:',trim(myprint(m2))
18084
write(punit,*) 'b0(2):',trim(myprint(rslt(2)))
18085
write(punit,*) 'b0(1):',trim(myprint(rslt(1)))
18086
write(punit,*) 'b0(0):',trim(myprint(rslt(0)))
18091
!*******************************************************************
18092
! Return the Papparino-Veltman functions b11,b00,b1,b0 , for
18095
! ------ | -------------------- = b0
18096
! i*pi^2 / [q^2-m1][(q+p)^2-m2]
18098
! C / d^(Dim)q q^mu
18099
! ------ | -------------------- = p^mu b1
18100
! i*pi^2 / [q^2-m1][(q+p)^2-m2]
18102
! C / d^(Dim)q q^mu q^nu
18103
! ------ | -------------------- = g^{mu,nu} b00 + p^mu p^nu b11
18104
! i*pi^2 / [q^2-m1][(q+p)^2-m2]
18106
! Check the comments in subroutine olo_onshell to find out how
18107
! this routine decides when to return IR-divergent cases.
18108
!*******************************************************************
18110
subroutine b11cc( b11,b00,b1,b0 ,pp,m1,m2 )
18112
use avh_olo_qp_bub ,only: bub11
18115
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18119
,intent(in) :: m1,m2
18124
:: app,am1,am2,hh,mulocal,mulocal2
18125
character(26+99) ,parameter :: warning=&
18126
'WARNING from OneLOop b11: '//warnonshell
18127
if (initz) call init
18133
if (aimag(ss).ne.RZRO) then
18134
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18135
,'ss has non-zero imaginary part, putting it to zero.'
18142
if (hh.gt.RZRO) then
18143
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18144
,'r1 has positive imaginary part, switching its sign.'
18145
r1 = acmplx( am1 ,-hh )
18147
am1 = abs(am1) + abs(hh)
18151
if (hh.gt.RZRO) then
18152
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18153
,'r2 has positive imaginary part, switching its sign.'
18154
r2 = acmplx( am2 ,-hh )
18156
am2 = abs(am2) + abs(hh)
18160
mulocal2 = mulocal*mulocal
18162
if (nonzerothrs) then
18164
if (app.lt.hh) app = 0
18165
if (am1.lt.hh) am1 = 0
18166
if (am2.lt.hh) am2 = 0
18167
elseif (wunit.gt.0) then
18168
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18169
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18170
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18171
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18174
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18176
if (punit.gt.0) then
18177
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18178
write(punit,*) 'muscale:',trim(myprint(mulocal))
18179
write(punit,*) ' pp:',trim(myprint(pp))
18180
write(punit,*) ' m1:',trim(myprint(m1))
18181
write(punit,*) ' m2:',trim(myprint(m2))
18182
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18183
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18184
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18185
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18186
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18187
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18188
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18189
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18190
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18191
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18192
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18193
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18197
subroutine b11ccr( b11,b00,b1,b0 ,pp,m1,m2 ,rmu )
18199
use avh_olo_qp_bub ,only: bub11
18202
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18206
,intent(in) :: m1,m2
18213
:: app,am1,am2,hh,mulocal,mulocal2
18214
character(26+99) ,parameter :: warning=&
18215
'WARNING from OneLOop b11: '//warnonshell
18216
if (initz) call init
18222
if (aimag(ss).ne.RZRO) then
18223
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18224
,'ss has non-zero imaginary part, putting it to zero.'
18231
if (hh.gt.RZRO) then
18232
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18233
,'r1 has positive imaginary part, switching its sign.'
18234
r1 = acmplx( am1 ,-hh )
18236
am1 = abs(am1) + abs(hh)
18240
if (hh.gt.RZRO) then
18241
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18242
,'r2 has positive imaginary part, switching its sign.'
18243
r2 = acmplx( am2 ,-hh )
18245
am2 = abs(am2) + abs(hh)
18249
mulocal2 = mulocal*mulocal
18251
if (nonzerothrs) then
18253
if (app.lt.hh) app = 0
18254
if (am1.lt.hh) am1 = 0
18255
if (am2.lt.hh) am2 = 0
18256
elseif (wunit.gt.0) then
18257
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18258
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18259
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18260
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18263
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18265
if (punit.gt.0) then
18266
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18267
write(punit,*) 'muscale:',trim(myprint(mulocal))
18268
write(punit,*) ' pp:',trim(myprint(pp))
18269
write(punit,*) ' m1:',trim(myprint(m1))
18270
write(punit,*) ' m2:',trim(myprint(m2))
18271
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18272
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18273
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18274
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18275
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18276
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18277
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18278
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18279
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18280
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18281
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18282
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18286
subroutine b11rc( b11,b00,b1,b0 ,pp,m1,m2 )
18288
use avh_olo_qp_bub ,only: bub11
18291
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18295
,intent(in) :: m1,m2
18300
:: app,am1,am2,hh,mulocal,mulocal2
18301
character(26+99) ,parameter :: warning=&
18302
'WARNING from OneLOop b11: '//warnonshell
18303
if (initz) call init
18312
if (hh.gt.RZRO) then
18313
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18314
,'r1 has positive imaginary part, switching its sign.'
18315
r1 = acmplx( am1 ,-hh )
18317
am1 = abs(am1) + abs(hh)
18321
if (hh.gt.RZRO) then
18322
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18323
,'r2 has positive imaginary part, switching its sign.'
18324
r2 = acmplx( am2 ,-hh )
18326
am2 = abs(am2) + abs(hh)
18330
mulocal2 = mulocal*mulocal
18332
if (nonzerothrs) then
18334
if (app.lt.hh) app = 0
18335
if (am1.lt.hh) am1 = 0
18336
if (am2.lt.hh) am2 = 0
18337
elseif (wunit.gt.0) then
18338
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18339
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18340
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18341
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18344
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18346
if (punit.gt.0) then
18347
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18348
write(punit,*) 'muscale:',trim(myprint(mulocal))
18349
write(punit,*) ' pp:',trim(myprint(pp))
18350
write(punit,*) ' m1:',trim(myprint(m1))
18351
write(punit,*) ' m2:',trim(myprint(m2))
18352
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18353
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18354
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18355
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18356
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18357
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18358
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18359
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18360
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18361
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18362
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18363
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18367
subroutine b11rcr( b11,b00,b1,b0 ,pp,m1,m2 ,rmu )
18369
use avh_olo_qp_bub ,only: bub11
18372
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18376
,intent(in) :: m1,m2
18383
:: app,am1,am2,hh,mulocal,mulocal2
18384
character(26+99) ,parameter :: warning=&
18385
'WARNING from OneLOop b11: '//warnonshell
18386
if (initz) call init
18395
if (hh.gt.RZRO) then
18396
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18397
,'r1 has positive imaginary part, switching its sign.'
18398
r1 = acmplx( am1 ,-hh )
18400
am1 = abs(am1) + abs(hh)
18404
if (hh.gt.RZRO) then
18405
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop b11: ' &
18406
,'r2 has positive imaginary part, switching its sign.'
18407
r2 = acmplx( am2 ,-hh )
18409
am2 = abs(am2) + abs(hh)
18413
mulocal2 = mulocal*mulocal
18415
if (nonzerothrs) then
18417
if (app.lt.hh) app = 0
18418
if (am1.lt.hh) am1 = 0
18419
if (am2.lt.hh) am2 = 0
18420
elseif (wunit.gt.0) then
18421
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18422
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18423
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18424
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18427
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18429
if (punit.gt.0) then
18430
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18431
write(punit,*) 'muscale:',trim(myprint(mulocal))
18432
write(punit,*) ' pp:',trim(myprint(pp))
18433
write(punit,*) ' m1:',trim(myprint(m1))
18434
write(punit,*) ' m2:',trim(myprint(m2))
18435
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18436
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18437
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18438
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18439
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18440
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18441
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18442
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18443
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18444
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18445
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18446
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18450
subroutine b11rr( b11,b00,b1,b0 ,pp,m1,m2 )
18452
use avh_olo_qp_bub ,only: bub11
18455
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18459
,intent(in) :: m1,m2
18464
:: app,am1,am2,hh,mulocal,mulocal2
18465
character(26+99) ,parameter :: warning=&
18466
'WARNING from OneLOop b11: '//warnonshell
18467
if (initz) call init
18479
mulocal2 = mulocal*mulocal
18481
if (nonzerothrs) then
18483
if (app.lt.hh) app = 0
18484
if (am1.lt.hh) am1 = 0
18485
if (am2.lt.hh) am2 = 0
18486
elseif (wunit.gt.0) then
18487
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18488
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18489
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18490
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18493
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18495
if (punit.gt.0) then
18496
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18497
write(punit,*) 'muscale:',trim(myprint(mulocal))
18498
write(punit,*) ' pp:',trim(myprint(pp))
18499
write(punit,*) ' m1:',trim(myprint(m1))
18500
write(punit,*) ' m2:',trim(myprint(m2))
18501
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18502
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18503
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18504
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18505
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18506
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18507
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18508
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18509
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18510
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18511
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18512
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18516
subroutine b11rrr( b11,b00,b1,b0 ,pp,m1,m2 ,rmu )
18518
use avh_olo_qp_bub ,only: bub11
18521
,intent(out) :: b11(0:2),b00(0:2),b1(0:2),b0(0:2)
18525
,intent(in) :: m1,m2
18532
:: app,am1,am2,hh,mulocal,mulocal2
18533
character(26+99) ,parameter :: warning=&
18534
'WARNING from OneLOop b11: '//warnonshell
18535
if (initz) call init
18547
mulocal2 = mulocal*mulocal
18549
if (nonzerothrs) then
18551
if (app.lt.hh) app = 0
18552
if (am1.lt.hh) am1 = 0
18553
if (am2.lt.hh) am2 = 0
18554
elseif (wunit.gt.0) then
18555
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18556
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18557
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18558
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18561
call bub11( b11,b00,b1,b0 ,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18563
if (punit.gt.0) then
18564
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18565
write(punit,*) 'muscale:',trim(myprint(mulocal))
18566
write(punit,*) ' pp:',trim(myprint(pp))
18567
write(punit,*) ' m1:',trim(myprint(m1))
18568
write(punit,*) ' m2:',trim(myprint(m2))
18569
write(punit,*) 'b11(2):',trim(myprint(b11(2)))
18570
write(punit,*) 'b11(1):',trim(myprint(b11(1)))
18571
write(punit,*) 'b11(0):',trim(myprint(b11(0)))
18572
write(punit,*) 'b00(2):',trim(myprint(b00(2)))
18573
write(punit,*) 'b00(1):',trim(myprint(b00(1)))
18574
write(punit,*) 'b00(0):',trim(myprint(b00(0)))
18575
write(punit,*) ' b1(2):',trim(myprint(b1(2) ))
18576
write(punit,*) ' b1(1):',trim(myprint(b1(1) ))
18577
write(punit,*) ' b1(0):',trim(myprint(b1(0) ))
18578
write(punit,*) ' b0(2):',trim(myprint(b0(2) ))
18579
write(punit,*) ' b0(1):',trim(myprint(b0(1) ))
18580
write(punit,*) ' b0(0):',trim(myprint(b0(0) ))
18585
subroutine bncc( rslt ,rank ,pp,m1,m2 )
18587
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
18590
,intent(out) :: rslt(0:,0:)
18594
,intent(in) :: m1,m2
18595
integer,intent(in) :: rank
18600
:: app,am1,am2,hh,mulocal,mulocal2
18601
character(26+99) ,parameter :: warning=&
18602
'WARNING from OneLOop bn: '//warnonshell
18603
if (initz) call init
18609
if (aimag(ss).ne.RZRO) then
18610
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18611
,'ss has non-zero imaginary part, putting it to zero.'
18618
if (hh.gt.RZRO) then
18619
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18620
,'r1 has positive imaginary part, switching its sign.'
18621
r1 = acmplx( am1 ,-hh )
18623
am1 = abs(am1) + abs(hh)
18627
if (hh.gt.RZRO) then
18628
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18629
,'r2 has positive imaginary part, switching its sign.'
18630
r2 = acmplx( am2 ,-hh )
18632
am2 = abs(am2) + abs(hh)
18636
mulocal2 = mulocal*mulocal
18638
if (nonzerothrs) then
18640
if (app.lt.hh) app = 0
18641
if (am1.lt.hh) am1 = 0
18642
if (am2.lt.hh) am2 = 0
18643
elseif (wunit.gt.0) then
18644
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18645
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18646
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18647
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18650
if (rank.eq.0) then
18651
call bub0( rslt(:,0) &
18652
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18653
elseif (rank.eq.1) then
18654
call bub1( rslt(:,1),rslt(:,0) &
18655
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18656
elseif (rank.eq.2) then
18657
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18658
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18659
elseif (rank.eq.3) then
18660
call bub111( rslt(:,5),rslt(:,4) &
18661
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18662
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18663
elseif (rank.eq.4) then
18664
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
18665
,rslt(:,5),rslt(:,4) &
18666
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18667
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18669
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18670
,'rank=',rank,' not implemented'
18673
if (punit.gt.0) then
18674
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18675
write(punit,*) 'muscale:',trim(myprint(mulocal))
18676
write(punit,*) 'pp:',trim(myprint(pp))
18677
write(punit,*) 'm1:',trim(myprint(m1))
18678
write(punit,*) 'm2:',trim(myprint(m2))
18679
if (rank.ge.0) then
18680
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
18681
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
18682
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
18683
if (rank.ge.1) then
18684
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
18685
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
18686
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
18687
if (rank.ge.2) then
18688
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
18689
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
18690
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
18691
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
18692
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
18693
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
18694
if (rank.ge.3) then
18695
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
18696
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
18697
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
18698
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
18699
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
18700
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
18701
if (rank.ge.4) then
18702
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
18703
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
18704
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
18705
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
18706
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
18707
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
18708
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
18709
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
18710
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
18711
endif;endif;endif;endif;endif
18715
subroutine bnccr( rslt ,rank ,pp,m1,m2 ,rmu )
18717
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
18720
,intent(out) :: rslt(0:,0:)
18724
,intent(in) :: m1,m2
18727
integer,intent(in) :: rank
18732
:: app,am1,am2,hh,mulocal,mulocal2
18733
character(26+99) ,parameter :: warning=&
18734
'WARNING from OneLOop bn: '//warnonshell
18735
if (initz) call init
18741
if (aimag(ss).ne.RZRO) then
18742
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18743
,'ss has non-zero imaginary part, putting it to zero.'
18750
if (hh.gt.RZRO) then
18751
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18752
,'r1 has positive imaginary part, switching its sign.'
18753
r1 = acmplx( am1 ,-hh )
18755
am1 = abs(am1) + abs(hh)
18759
if (hh.gt.RZRO) then
18760
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18761
,'r2 has positive imaginary part, switching its sign.'
18762
r2 = acmplx( am2 ,-hh )
18764
am2 = abs(am2) + abs(hh)
18768
mulocal2 = mulocal*mulocal
18770
if (nonzerothrs) then
18772
if (app.lt.hh) app = 0
18773
if (am1.lt.hh) am1 = 0
18774
if (am2.lt.hh) am2 = 0
18775
elseif (wunit.gt.0) then
18776
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18777
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18778
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18779
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18782
if (rank.eq.0) then
18783
call bub0( rslt(:,0) &
18784
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18785
elseif (rank.eq.1) then
18786
call bub1( rslt(:,1),rslt(:,0) &
18787
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18788
elseif (rank.eq.2) then
18789
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18790
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18791
elseif (rank.eq.3) then
18792
call bub111( rslt(:,5),rslt(:,4) &
18793
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18794
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18795
elseif (rank.eq.4) then
18796
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
18797
,rslt(:,5),rslt(:,4) &
18798
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18799
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18801
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18802
,'rank=',rank,' not implemented'
18805
if (punit.gt.0) then
18806
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18807
write(punit,*) 'muscale:',trim(myprint(mulocal))
18808
write(punit,*) 'pp:',trim(myprint(pp))
18809
write(punit,*) 'm1:',trim(myprint(m1))
18810
write(punit,*) 'm2:',trim(myprint(m2))
18811
if (rank.ge.0) then
18812
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
18813
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
18814
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
18815
if (rank.ge.1) then
18816
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
18817
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
18818
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
18819
if (rank.ge.2) then
18820
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
18821
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
18822
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
18823
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
18824
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
18825
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
18826
if (rank.ge.3) then
18827
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
18828
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
18829
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
18830
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
18831
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
18832
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
18833
if (rank.ge.4) then
18834
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
18835
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
18836
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
18837
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
18838
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
18839
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
18840
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
18841
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
18842
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
18843
endif;endif;endif;endif;endif
18847
subroutine bnrc( rslt ,rank ,pp,m1,m2 )
18849
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
18852
,intent(out) :: rslt(0:,0:)
18856
,intent(in) :: m1,m2
18857
integer,intent(in) :: rank
18862
:: app,am1,am2,hh,mulocal,mulocal2
18863
character(26+99) ,parameter :: warning=&
18864
'WARNING from OneLOop bn: '//warnonshell
18865
if (initz) call init
18874
if (hh.gt.RZRO) then
18875
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18876
,'r1 has positive imaginary part, switching its sign.'
18877
r1 = acmplx( am1 ,-hh )
18879
am1 = abs(am1) + abs(hh)
18883
if (hh.gt.RZRO) then
18884
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18885
,'r2 has positive imaginary part, switching its sign.'
18886
r2 = acmplx( am2 ,-hh )
18888
am2 = abs(am2) + abs(hh)
18892
mulocal2 = mulocal*mulocal
18894
if (nonzerothrs) then
18896
if (app.lt.hh) app = 0
18897
if (am1.lt.hh) am1 = 0
18898
if (am2.lt.hh) am2 = 0
18899
elseif (wunit.gt.0) then
18900
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
18901
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
18902
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
18903
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
18906
if (rank.eq.0) then
18907
call bub0( rslt(:,0) &
18908
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18909
elseif (rank.eq.1) then
18910
call bub1( rslt(:,1),rslt(:,0) &
18911
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18912
elseif (rank.eq.2) then
18913
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18914
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18915
elseif (rank.eq.3) then
18916
call bub111( rslt(:,5),rslt(:,4) &
18917
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18918
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18919
elseif (rank.eq.4) then
18920
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
18921
,rslt(:,5),rslt(:,4) &
18922
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
18923
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
18925
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
18926
,'rank=',rank,' not implemented'
18929
if (punit.gt.0) then
18930
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
18931
write(punit,*) 'muscale:',trim(myprint(mulocal))
18932
write(punit,*) 'pp:',trim(myprint(pp))
18933
write(punit,*) 'm1:',trim(myprint(m1))
18934
write(punit,*) 'm2:',trim(myprint(m2))
18935
if (rank.ge.0) then
18936
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
18937
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
18938
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
18939
if (rank.ge.1) then
18940
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
18941
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
18942
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
18943
if (rank.ge.2) then
18944
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
18945
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
18946
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
18947
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
18948
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
18949
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
18950
if (rank.ge.3) then
18951
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
18952
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
18953
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
18954
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
18955
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
18956
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
18957
if (rank.ge.4) then
18958
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
18959
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
18960
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
18961
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
18962
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
18963
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
18964
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
18965
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
18966
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
18967
endif;endif;endif;endif;endif
18971
subroutine bnrcr( rslt ,rank ,pp,m1,m2 ,rmu )
18973
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
18976
,intent(out) :: rslt(0:,0:)
18980
,intent(in) :: m1,m2
18983
integer,intent(in) :: rank
18988
:: app,am1,am2,hh,mulocal,mulocal2
18989
character(26+99) ,parameter :: warning=&
18990
'WARNING from OneLOop bn: '//warnonshell
18991
if (initz) call init
19000
if (hh.gt.RZRO) then
19001
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
19002
,'r1 has positive imaginary part, switching its sign.'
19003
r1 = acmplx( am1 ,-hh )
19005
am1 = abs(am1) + abs(hh)
19009
if (hh.gt.RZRO) then
19010
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
19011
,'r2 has positive imaginary part, switching its sign.'
19012
r2 = acmplx( am2 ,-hh )
19014
am2 = abs(am2) + abs(hh)
19018
mulocal2 = mulocal*mulocal
19020
if (nonzerothrs) then
19022
if (app.lt.hh) app = 0
19023
if (am1.lt.hh) am1 = 0
19024
if (am2.lt.hh) am2 = 0
19025
elseif (wunit.gt.0) then
19026
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
19027
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
19028
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
19029
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
19032
if (rank.eq.0) then
19033
call bub0( rslt(:,0) &
19034
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19035
elseif (rank.eq.1) then
19036
call bub1( rslt(:,1),rslt(:,0) &
19037
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19038
elseif (rank.eq.2) then
19039
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19040
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19041
elseif (rank.eq.3) then
19042
call bub111( rslt(:,5),rslt(:,4) &
19043
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19044
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19045
elseif (rank.eq.4) then
19046
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
19047
,rslt(:,5),rslt(:,4) &
19048
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19049
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19051
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
19052
,'rank=',rank,' not implemented'
19055
if (punit.gt.0) then
19056
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19057
write(punit,*) 'muscale:',trim(myprint(mulocal))
19058
write(punit,*) 'pp:',trim(myprint(pp))
19059
write(punit,*) 'm1:',trim(myprint(m1))
19060
write(punit,*) 'm2:',trim(myprint(m2))
19061
if (rank.ge.0) then
19062
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
19063
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
19064
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
19065
if (rank.ge.1) then
19066
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
19067
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
19068
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
19069
if (rank.ge.2) then
19070
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
19071
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
19072
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
19073
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
19074
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
19075
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
19076
if (rank.ge.3) then
19077
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
19078
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
19079
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
19080
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
19081
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
19082
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
19083
if (rank.ge.4) then
19084
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
19085
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
19086
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
19087
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
19088
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
19089
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
19090
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
19091
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
19092
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
19093
endif;endif;endif;endif;endif
19097
subroutine bnrr( rslt ,rank ,pp,m1,m2 )
19099
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
19102
,intent(out) :: rslt(0:,0:)
19106
,intent(in) :: m1,m2
19107
integer,intent(in) :: rank
19112
:: app,am1,am2,hh,mulocal,mulocal2
19113
character(26+99) ,parameter :: warning=&
19114
'WARNING from OneLOop bn: '//warnonshell
19115
if (initz) call init
19127
mulocal2 = mulocal*mulocal
19129
if (nonzerothrs) then
19131
if (app.lt.hh) app = 0
19132
if (am1.lt.hh) am1 = 0
19133
if (am2.lt.hh) am2 = 0
19134
elseif (wunit.gt.0) then
19135
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
19136
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
19137
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
19138
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
19141
if (rank.eq.0) then
19142
call bub0( rslt(:,0) &
19143
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19144
elseif (rank.eq.1) then
19145
call bub1( rslt(:,1),rslt(:,0) &
19146
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19147
elseif (rank.eq.2) then
19148
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19149
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19150
elseif (rank.eq.3) then
19151
call bub111( rslt(:,5),rslt(:,4) &
19152
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19153
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19154
elseif (rank.eq.4) then
19155
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
19156
,rslt(:,5),rslt(:,4) &
19157
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19158
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19160
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
19161
,'rank=',rank,' not implemented'
19164
if (punit.gt.0) then
19165
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19166
write(punit,*) 'muscale:',trim(myprint(mulocal))
19167
write(punit,*) 'pp:',trim(myprint(pp))
19168
write(punit,*) 'm1:',trim(myprint(m1))
19169
write(punit,*) 'm2:',trim(myprint(m2))
19170
if (rank.ge.0) then
19171
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
19172
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
19173
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
19174
if (rank.ge.1) then
19175
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
19176
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
19177
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
19178
if (rank.ge.2) then
19179
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
19180
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
19181
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
19182
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
19183
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
19184
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
19185
if (rank.ge.3) then
19186
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
19187
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
19188
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
19189
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
19190
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
19191
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
19192
if (rank.ge.4) then
19193
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
19194
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
19195
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
19196
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
19197
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
19198
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
19199
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
19200
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
19201
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
19202
endif;endif;endif;endif;endif
19206
subroutine bnrrr( rslt ,rank ,pp,m1,m2 ,rmu )
19208
use avh_olo_qp_bub ,only: bub0,bub1,bub11,bub111,bub1111
19211
,intent(out) :: rslt(0:,0:)
19215
,intent(in) :: m1,m2
19218
integer,intent(in) :: rank
19223
:: app,am1,am2,hh,mulocal,mulocal2
19224
character(26+99) ,parameter :: warning=&
19225
'WARNING from OneLOop bn: '//warnonshell
19226
if (initz) call init
19238
mulocal2 = mulocal*mulocal
19240
if (nonzerothrs) then
19242
if (app.lt.hh) app = 0
19243
if (am1.lt.hh) am1 = 0
19244
if (am2.lt.hh) am2 = 0
19245
elseif (wunit.gt.0) then
19246
hh = onshellthrs*max(app,max(am1,max(am2,mulocal2)))
19247
if (RZRO.lt.app.and.app.lt.hh) write(wunit,*) warning
19248
if (RZRO.lt.am1.and.am1.lt.hh) write(wunit,*) warning
19249
if (RZRO.lt.am2.and.am2.lt.hh) write(wunit,*) warning
19252
if (rank.eq.0) then
19253
call bub0( rslt(:,0) &
19254
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19255
elseif (rank.eq.1) then
19256
call bub1( rslt(:,1),rslt(:,0) &
19257
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19258
elseif (rank.eq.2) then
19259
call bub11( rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19260
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19261
elseif (rank.eq.3) then
19262
call bub111( rslt(:,5),rslt(:,4) &
19263
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19264
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19265
elseif (rank.eq.4) then
19266
call bub1111( rslt(:,8),rslt(:,7),rslt(:,6) &
19267
,rslt(:,5),rslt(:,4) &
19268
,rslt(:,3),rslt(:,2),rslt(:,1),rslt(:,0) &
19269
,ss,r1,r2 ,app,am1,am2 ,mulocal2 )
19271
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop Bn: ' &
19272
,'rank=',rank,' not implemented'
19275
if (punit.gt.0) then
19276
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19277
write(punit,*) 'muscale:',trim(myprint(mulocal))
19278
write(punit,*) 'pp:',trim(myprint(pp))
19279
write(punit,*) 'm1:',trim(myprint(m1))
19280
write(punit,*) 'm2:',trim(myprint(m2))
19281
if (rank.ge.0) then
19282
write(punit,*) 'b0(2):',trim(myprint(rslt(2,0) ))
19283
write(punit,*) 'b0(1):',trim(myprint(rslt(1,0) ))
19284
write(punit,*) 'b0(0):',trim(myprint(rslt(0,0) ))
19285
if (rank.ge.1) then
19286
write(punit,*) 'b1(2):',trim(myprint(rslt(2,1) ))
19287
write(punit,*) 'b1(1):',trim(myprint(rslt(1,1) ))
19288
write(punit,*) 'b1(0):',trim(myprint(rslt(0,1) ))
19289
if (rank.ge.2) then
19290
write(punit,*) 'b00(2):',trim(myprint(rslt(2,2)))
19291
write(punit,*) 'b00(1):',trim(myprint(rslt(1,2)))
19292
write(punit,*) 'b00(0):',trim(myprint(rslt(0,2)))
19293
write(punit,*) 'b11(2):',trim(myprint(rslt(2,3)))
19294
write(punit,*) 'b11(1):',trim(myprint(rslt(1,3)))
19295
write(punit,*) 'b11(0):',trim(myprint(rslt(0,3)))
19296
if (rank.ge.3) then
19297
write(punit,*) 'b001(2):',trim(myprint(rslt(2,4)))
19298
write(punit,*) 'b001(1):',trim(myprint(rslt(1,4)))
19299
write(punit,*) 'b001(0):',trim(myprint(rslt(0,4)))
19300
write(punit,*) 'b111(2):',trim(myprint(rslt(2,5)))
19301
write(punit,*) 'b111(1):',trim(myprint(rslt(1,5)))
19302
write(punit,*) 'b111(0):',trim(myprint(rslt(0,5)))
19303
if (rank.ge.4) then
19304
write(punit,*) 'b0000(2):',trim(myprint(rslt(2,6)))
19305
write(punit,*) 'b0000(1):',trim(myprint(rslt(1,6)))
19306
write(punit,*) 'b0000(0):',trim(myprint(rslt(0,6)))
19307
write(punit,*) 'b0011(2):',trim(myprint(rslt(2,7)))
19308
write(punit,*) 'b0011(1):',trim(myprint(rslt(1,7)))
19309
write(punit,*) 'b0011(0):',trim(myprint(rslt(0,7)))
19310
write(punit,*) 'b1111(2):',trim(myprint(rslt(2,8)))
19311
write(punit,*) 'b1111(1):',trim(myprint(rslt(1,8)))
19312
write(punit,*) 'b1111(0):',trim(myprint(rslt(0,8)))
19313
endif;endif;endif;endif;endif
19318
!*******************************************************************
19321
! ------ | ---------------------------------------
19322
! i*pi^2 / [q^2-m1] [(q+k1)^2-m2] [(q+k1+k2)^2-m3]
19324
! with Dim = 4-2*eps
19325
! C = pi^eps * mu^(2*eps)
19326
! * GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
19328
! input: p1=k1^2, p2=k2^2, p3=(k1+k2)^2, m1,m2,m3=squared masses
19329
! output: rslt(0) = eps^0 -coefficient
19330
! rslt(1) = eps^(-1)-coefficient
19331
! rslt(2) = eps^(-2)-coefficient
19333
! Check the comments in subroutine olo_onshell to find out how
19334
! this routine decides when to return IR-divergent cases.
19335
!*******************************************************************
19337
subroutine c0cc( rslt ,p1,p2,p3 ,m1,m2,m3 )
19339
use avh_olo_qp_auxfun ,only: kallen
19342
,intent(out) :: rslt(0:2)
19344
,intent(in) :: p1,p2,p3
19346
,intent(in) :: m1,m2,m3
19353
:: ss(3),rr(3),lambda
19355
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
19357
:: mulocal,mulocal2
19358
integer :: icase,ii
19359
character(25+99) ,parameter :: warning=&
19360
'WARNING from OneLOop c0: '//warnonshell
19361
if (initz) call init
19371
ap(ii) = areal(pp(ii))
19372
if (aimag(pp(ii)).ne.RZRO) then
19373
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19374
,'momentum with non-zero imaginary part, putting it to zero.'
19375
pp(ii) = acmplx( ap(ii) )
19377
ap(ii) = abs(ap(ii))
19378
if (ap(ii).gt.smax) smax = ap(ii)
19382
am(ii) = areal(mm(ii))
19384
if (hh.gt.RZRO) then
19385
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19386
,'mass-squared has positive imaginary part, switching its sign.'
19387
mm(ii) = acmplx( am(ii) ,-hh )
19389
am(ii) = abs(am(ii)) + abs(hh)
19390
if (am(ii).gt.smax) smax = am(ii)
19395
mulocal2 = mulocal*mulocal
19397
if (smax.eq.RZRO) then
19398
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19399
,'all input equal zero, returning 0'
19400
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
19404
if (mulocal2.gt.smax) smax = mulocal2
19406
if (nonzerothrs) then
19409
if (ap(ii).lt.hh) ap(ii) = 0
19410
if (am(ii).lt.hh) am(ii) = 0
19413
hh = onshellthrs*smax
19414
if (wunit.gt.0) then
19416
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
19417
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
19424
if (am(ii).gt.RZRO) icase = icase + base(ii)
19426
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
19427
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
19428
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
19429
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
19430
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
19431
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
19432
icase = casetable(icase)
19434
s1r2 = abs(ss(1)-rr(2))
19435
s2r3 = abs(ss(2)-rr(3))
19436
s3r3 = abs(ss(3)-rr(3))
19437
if (nonzerothrs) then
19438
if (s1r2.lt.hh) s1r2 = 0
19439
if (s2r3.lt.hh) s2r3 = 0
19440
if (s3r3.lt.hh) s3r3 = 0
19441
elseif (wunit.gt.0) then
19442
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
19443
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
19444
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
19447
if (icase.eq.3) then
19448
! 3 non-zero internal masses
19449
lambda = kallen( ss(1),ss(2),ss(3) )
19450
if (areal(lambda).lt.RZRO) then
19451
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
19453
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
19455
elseif (icase.eq.2) then
19456
! 2 non-zero internal masses
19457
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
19458
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
19460
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
19462
elseif (icase.eq.1) then
19463
! 1 non-zero internal mass
19464
if (as(1).ne.RZRO) then
19465
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
19466
elseif (s2r3.ne.RZRO) then
19467
if (s3r3.ne.RZRO) then
19468
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
19470
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
19472
elseif (s3r3.ne.RZRO) then
19473
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
19475
call tria1( rslt ,rr(3) ,mulocal2 )
19478
! 0 non-zero internal masses
19479
call tria0( rslt ,ss ,as ,mulocal2 )
19481
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
19482
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
19484
if (punit.gt.0) then
19485
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19486
write(punit,*) 'muscale:',trim(myprint(mulocal))
19487
write(punit,*) ' p1:',trim(myprint(p1))
19488
write(punit,*) ' p2:',trim(myprint(p2))
19489
write(punit,*) ' p3:',trim(myprint(p3))
19490
write(punit,*) ' m1:',trim(myprint(m1))
19491
write(punit,*) ' m2:',trim(myprint(m2))
19492
write(punit,*) ' m3:',trim(myprint(m3))
19493
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
19494
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
19495
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
19499
subroutine c0ccr( rslt ,p1,p2,p3 ,m1,m2,m3 ,rmu )
19501
use avh_olo_qp_auxfun ,only: kallen
19504
,intent(out) :: rslt(0:2)
19506
,intent(in) :: p1,p2,p3
19508
,intent(in) :: m1,m2,m3
19517
:: ss(3),rr(3),lambda
19519
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
19521
:: mulocal,mulocal2
19522
integer :: icase,ii
19523
character(25+99) ,parameter :: warning=&
19524
'WARNING from OneLOop c0: '//warnonshell
19525
if (initz) call init
19535
ap(ii) = areal(pp(ii))
19536
if (aimag(pp(ii)).ne.RZRO) then
19537
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19538
,'momentum with non-zero imaginary part, putting it to zero.'
19539
pp(ii) = acmplx( ap(ii) )
19541
ap(ii) = abs(ap(ii))
19542
if (ap(ii).gt.smax) smax = ap(ii)
19546
am(ii) = areal(mm(ii))
19548
if (hh.gt.RZRO) then
19549
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19550
,'mass-squared has positive imaginary part, switching its sign.'
19551
mm(ii) = acmplx( am(ii) ,-hh )
19553
am(ii) = abs(am(ii)) + abs(hh)
19554
if (am(ii).gt.smax) smax = am(ii)
19559
mulocal2 = mulocal*mulocal
19561
if (smax.eq.RZRO) then
19562
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19563
,'all input equal zero, returning 0'
19564
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
19568
if (mulocal2.gt.smax) smax = mulocal2
19570
if (nonzerothrs) then
19573
if (ap(ii).lt.hh) ap(ii) = 0
19574
if (am(ii).lt.hh) am(ii) = 0
19577
hh = onshellthrs*smax
19578
if (wunit.gt.0) then
19580
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
19581
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
19588
if (am(ii).gt.RZRO) icase = icase + base(ii)
19590
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
19591
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
19592
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
19593
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
19594
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
19595
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
19596
icase = casetable(icase)
19598
s1r2 = abs(ss(1)-rr(2))
19599
s2r3 = abs(ss(2)-rr(3))
19600
s3r3 = abs(ss(3)-rr(3))
19601
if (nonzerothrs) then
19602
if (s1r2.lt.hh) s1r2 = 0
19603
if (s2r3.lt.hh) s2r3 = 0
19604
if (s3r3.lt.hh) s3r3 = 0
19605
elseif (wunit.gt.0) then
19606
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
19607
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
19608
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
19611
if (icase.eq.3) then
19612
! 3 non-zero internal masses
19613
lambda = kallen( ss(1),ss(2),ss(3) )
19614
if (areal(lambda).lt.RZRO) then
19615
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
19617
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
19619
elseif (icase.eq.2) then
19620
! 2 non-zero internal masses
19621
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
19622
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
19624
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
19626
elseif (icase.eq.1) then
19627
! 1 non-zero internal mass
19628
if (as(1).ne.RZRO) then
19629
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
19630
elseif (s2r3.ne.RZRO) then
19631
if (s3r3.ne.RZRO) then
19632
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
19634
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
19636
elseif (s3r3.ne.RZRO) then
19637
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
19639
call tria1( rslt ,rr(3) ,mulocal2 )
19642
! 0 non-zero internal masses
19643
call tria0( rslt ,ss ,as ,mulocal2 )
19645
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
19646
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
19648
if (punit.gt.0) then
19649
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19650
write(punit,*) 'muscale:',trim(myprint(mulocal))
19651
write(punit,*) ' p1:',trim(myprint(p1))
19652
write(punit,*) ' p2:',trim(myprint(p2))
19653
write(punit,*) ' p3:',trim(myprint(p3))
19654
write(punit,*) ' m1:',trim(myprint(m1))
19655
write(punit,*) ' m2:',trim(myprint(m2))
19656
write(punit,*) ' m3:',trim(myprint(m3))
19657
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
19658
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
19659
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
19663
subroutine c0rc( rslt ,p1,p2,p3 ,m1,m2,m3 )
19665
use avh_olo_qp_auxfun ,only: kallen
19668
,intent(out) :: rslt(0:2)
19670
,intent(in) :: p1,p2,p3
19672
,intent(in) :: m1,m2,m3
19679
:: ss(3),rr(3),lambda
19681
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
19683
:: mulocal,mulocal2
19684
integer :: icase,ii
19685
character(25+99) ,parameter :: warning=&
19686
'WARNING from OneLOop c0: '//warnonshell
19687
if (initz) call init
19697
ap(ii) = abs(pp(ii))
19698
if (ap(ii).gt.smax) smax = ap(ii)
19702
am(ii) = areal(mm(ii))
19704
if (hh.gt.RZRO) then
19705
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19706
,'mass-squared has positive imaginary part, switching its sign.'
19707
mm(ii) = acmplx( am(ii) ,-hh )
19709
am(ii) = abs(am(ii)) + abs(hh)
19710
if (am(ii).gt.smax) smax = am(ii)
19715
mulocal2 = mulocal*mulocal
19717
if (smax.eq.RZRO) then
19718
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19719
,'all input equal zero, returning 0'
19720
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
19724
if (mulocal2.gt.smax) smax = mulocal2
19726
if (nonzerothrs) then
19729
if (ap(ii).lt.hh) ap(ii) = 0
19730
if (am(ii).lt.hh) am(ii) = 0
19733
hh = onshellthrs*smax
19734
if (wunit.gt.0) then
19736
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
19737
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
19744
if (am(ii).gt.RZRO) icase = icase + base(ii)
19746
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
19747
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
19748
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
19749
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
19750
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
19751
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
19752
icase = casetable(icase)
19754
s1r2 = abs(ss(1)-rr(2))
19755
s2r3 = abs(ss(2)-rr(3))
19756
s3r3 = abs(ss(3)-rr(3))
19757
if (nonzerothrs) then
19758
if (s1r2.lt.hh) s1r2 = 0
19759
if (s2r3.lt.hh) s2r3 = 0
19760
if (s3r3.lt.hh) s3r3 = 0
19761
elseif (wunit.gt.0) then
19762
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
19763
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
19764
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
19767
if (icase.eq.3) then
19768
! 3 non-zero internal masses
19769
lambda = kallen( ss(1),ss(2),ss(3) )
19770
if (areal(lambda).lt.RZRO) then
19771
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
19773
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
19775
elseif (icase.eq.2) then
19776
! 2 non-zero internal masses
19777
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
19778
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
19780
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
19782
elseif (icase.eq.1) then
19783
! 1 non-zero internal mass
19784
if (as(1).ne.RZRO) then
19785
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
19786
elseif (s2r3.ne.RZRO) then
19787
if (s3r3.ne.RZRO) then
19788
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
19790
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
19792
elseif (s3r3.ne.RZRO) then
19793
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
19795
call tria1( rslt ,rr(3) ,mulocal2 )
19798
! 0 non-zero internal masses
19799
call tria0( rslt ,ss ,as ,mulocal2 )
19801
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
19802
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
19804
if (punit.gt.0) then
19805
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19806
write(punit,*) 'muscale:',trim(myprint(mulocal))
19807
write(punit,*) ' p1:',trim(myprint(p1))
19808
write(punit,*) ' p2:',trim(myprint(p2))
19809
write(punit,*) ' p3:',trim(myprint(p3))
19810
write(punit,*) ' m1:',trim(myprint(m1))
19811
write(punit,*) ' m2:',trim(myprint(m2))
19812
write(punit,*) ' m3:',trim(myprint(m3))
19813
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
19814
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
19815
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
19819
subroutine c0rcr( rslt ,p1,p2,p3 ,m1,m2,m3 ,rmu )
19821
use avh_olo_qp_auxfun ,only: kallen
19824
,intent(out) :: rslt(0:2)
19826
,intent(in) :: p1,p2,p3
19828
,intent(in) :: m1,m2,m3
19837
:: ss(3),rr(3),lambda
19839
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
19841
:: mulocal,mulocal2
19842
integer :: icase,ii
19843
character(25+99) ,parameter :: warning=&
19844
'WARNING from OneLOop c0: '//warnonshell
19845
if (initz) call init
19855
ap(ii) = abs(pp(ii))
19856
if (ap(ii).gt.smax) smax = ap(ii)
19860
am(ii) = areal(mm(ii))
19862
if (hh.gt.RZRO) then
19863
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19864
,'mass-squared has positive imaginary part, switching its sign.'
19865
mm(ii) = acmplx( am(ii) ,-hh )
19867
am(ii) = abs(am(ii)) + abs(hh)
19868
if (am(ii).gt.smax) smax = am(ii)
19873
mulocal2 = mulocal*mulocal
19875
if (smax.eq.RZRO) then
19876
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
19877
,'all input equal zero, returning 0'
19878
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
19882
if (mulocal2.gt.smax) smax = mulocal2
19884
if (nonzerothrs) then
19887
if (ap(ii).lt.hh) ap(ii) = 0
19888
if (am(ii).lt.hh) am(ii) = 0
19891
hh = onshellthrs*smax
19892
if (wunit.gt.0) then
19894
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
19895
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
19902
if (am(ii).gt.RZRO) icase = icase + base(ii)
19904
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
19905
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
19906
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
19907
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
19908
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
19909
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
19910
icase = casetable(icase)
19912
s1r2 = abs(ss(1)-rr(2))
19913
s2r3 = abs(ss(2)-rr(3))
19914
s3r3 = abs(ss(3)-rr(3))
19915
if (nonzerothrs) then
19916
if (s1r2.lt.hh) s1r2 = 0
19917
if (s2r3.lt.hh) s2r3 = 0
19918
if (s3r3.lt.hh) s3r3 = 0
19919
elseif (wunit.gt.0) then
19920
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
19921
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
19922
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
19925
if (icase.eq.3) then
19926
! 3 non-zero internal masses
19927
lambda = kallen( ss(1),ss(2),ss(3) )
19928
if (areal(lambda).lt.RZRO) then
19929
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
19931
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
19933
elseif (icase.eq.2) then
19934
! 2 non-zero internal masses
19935
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
19936
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
19938
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
19940
elseif (icase.eq.1) then
19941
! 1 non-zero internal mass
19942
if (as(1).ne.RZRO) then
19943
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
19944
elseif (s2r3.ne.RZRO) then
19945
if (s3r3.ne.RZRO) then
19946
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
19948
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
19950
elseif (s3r3.ne.RZRO) then
19951
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
19953
call tria1( rslt ,rr(3) ,mulocal2 )
19956
! 0 non-zero internal masses
19957
call tria0( rslt ,ss ,as ,mulocal2 )
19959
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
19960
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
19962
if (punit.gt.0) then
19963
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
19964
write(punit,*) 'muscale:',trim(myprint(mulocal))
19965
write(punit,*) ' p1:',trim(myprint(p1))
19966
write(punit,*) ' p2:',trim(myprint(p2))
19967
write(punit,*) ' p3:',trim(myprint(p3))
19968
write(punit,*) ' m1:',trim(myprint(m1))
19969
write(punit,*) ' m2:',trim(myprint(m2))
19970
write(punit,*) ' m3:',trim(myprint(m3))
19971
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
19972
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
19973
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
19977
subroutine c0rr( rslt ,p1,p2,p3 ,m1,m2,m3 )
19979
use avh_olo_qp_auxfun ,only: kallen
19982
,intent(out) :: rslt(0:2)
19984
,intent(in) :: p1,p2,p3
19986
,intent(in) :: m1,m2,m3
19993
:: ss(3),rr(3),lambda
19995
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
19997
:: mulocal,mulocal2
19998
integer :: icase,ii
19999
character(25+99) ,parameter :: warning=&
20000
'WARNING from OneLOop c0: '//warnonshell
20001
if (initz) call init
20011
ap(ii) = abs(pp(ii))
20012
if (ap(ii).gt.smax) smax = ap(ii)
20016
am(ii) = abs(mm(ii))
20017
if (am(ii).gt.smax) smax = am(ii)
20022
mulocal2 = mulocal*mulocal
20024
if (smax.eq.RZRO) then
20025
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
20026
,'all input equal zero, returning 0'
20027
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
20031
if (mulocal2.gt.smax) smax = mulocal2
20033
if (nonzerothrs) then
20036
if (ap(ii).lt.hh) ap(ii) = 0
20037
if (am(ii).lt.hh) am(ii) = 0
20040
hh = onshellthrs*smax
20041
if (wunit.gt.0) then
20043
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
20044
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
20051
if (am(ii).gt.RZRO) icase = icase + base(ii)
20053
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
20054
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
20055
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
20056
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
20057
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
20058
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
20059
icase = casetable(icase)
20061
s1r2 = abs(ss(1)-rr(2))
20062
s2r3 = abs(ss(2)-rr(3))
20063
s3r3 = abs(ss(3)-rr(3))
20064
if (nonzerothrs) then
20065
if (s1r2.lt.hh) s1r2 = 0
20066
if (s2r3.lt.hh) s2r3 = 0
20067
if (s3r3.lt.hh) s3r3 = 0
20068
elseif (wunit.gt.0) then
20069
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
20070
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
20071
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
20074
if (icase.eq.3) then
20075
! 3 non-zero internal masses
20076
lambda = kallen( ss(1),ss(2),ss(3) )
20077
if (areal(lambda).lt.RZRO) then
20078
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
20080
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
20082
elseif (icase.eq.2) then
20083
! 2 non-zero internal masses
20084
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
20085
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
20087
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
20089
elseif (icase.eq.1) then
20090
! 1 non-zero internal mass
20091
if (as(1).ne.RZRO) then
20092
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
20093
elseif (s2r3.ne.RZRO) then
20094
if (s3r3.ne.RZRO) then
20095
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
20097
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
20099
elseif (s3r3.ne.RZRO) then
20100
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
20102
call tria1( rslt ,rr(3) ,mulocal2 )
20105
! 0 non-zero internal masses
20106
call tria0( rslt ,ss ,as ,mulocal2 )
20108
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
20109
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
20111
if (punit.gt.0) then
20112
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
20113
write(punit,*) 'muscale:',trim(myprint(mulocal))
20114
write(punit,*) ' p1:',trim(myprint(p1))
20115
write(punit,*) ' p2:',trim(myprint(p2))
20116
write(punit,*) ' p3:',trim(myprint(p3))
20117
write(punit,*) ' m1:',trim(myprint(m1))
20118
write(punit,*) ' m2:',trim(myprint(m2))
20119
write(punit,*) ' m3:',trim(myprint(m3))
20120
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
20121
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
20122
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
20126
subroutine c0rrr( rslt ,p1,p2,p3 ,m1,m2,m3 ,rmu )
20128
use avh_olo_qp_auxfun ,only: kallen
20131
,intent(out) :: rslt(0:2)
20133
,intent(in) :: p1,p2,p3
20135
,intent(in) :: m1,m2,m3
20144
:: ss(3),rr(3),lambda
20146
:: smax,ap(3),am(3),as(3),ar(3),hh,s1r2,s2r3,s3r3
20148
:: mulocal,mulocal2
20149
integer :: icase,ii
20150
character(25+99) ,parameter :: warning=&
20151
'WARNING from OneLOop c0: '//warnonshell
20152
if (initz) call init
20162
ap(ii) = abs(pp(ii))
20163
if (ap(ii).gt.smax) smax = ap(ii)
20167
am(ii) = abs(mm(ii))
20168
if (am(ii).gt.smax) smax = am(ii)
20173
mulocal2 = mulocal*mulocal
20175
if (smax.eq.RZRO) then
20176
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop c0: ' &
20177
,'all input equal zero, returning 0'
20178
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
20182
if (mulocal2.gt.smax) smax = mulocal2
20184
if (nonzerothrs) then
20187
if (ap(ii).lt.hh) ap(ii) = 0
20188
if (am(ii).lt.hh) am(ii) = 0
20191
hh = onshellthrs*smax
20192
if (wunit.gt.0) then
20194
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
20195
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
20202
if (am(ii).gt.RZRO) icase = icase + base(ii)
20204
ss(1)=pp(permtable(1,icase)) ;as(1)=ap(permtable(1,icase))
20205
ss(2)=pp(permtable(2,icase)) ;as(2)=ap(permtable(2,icase))
20206
ss(3)=pp(permtable(3,icase)) ;as(3)=ap(permtable(3,icase))
20207
rr(1)=mm(permtable(1,icase)) ;ar(1)=am(permtable(1,icase))
20208
rr(2)=mm(permtable(2,icase)) ;ar(2)=am(permtable(2,icase))
20209
rr(3)=mm(permtable(3,icase)) ;ar(3)=am(permtable(3,icase))
20210
icase = casetable(icase)
20212
s1r2 = abs(ss(1)-rr(2))
20213
s2r3 = abs(ss(2)-rr(3))
20214
s3r3 = abs(ss(3)-rr(3))
20215
if (nonzerothrs) then
20216
if (s1r2.lt.hh) s1r2 = 0
20217
if (s2r3.lt.hh) s2r3 = 0
20218
if (s3r3.lt.hh) s3r3 = 0
20219
elseif (wunit.gt.0) then
20220
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
20221
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
20222
if (RZRO.lt.s3r3.and.s3r3.lt.hh) write(wunit,*) warning
20225
if (icase.eq.3) then
20226
! 3 non-zero internal masses
20227
lambda = kallen( ss(1),ss(2),ss(3) )
20228
if (areal(lambda).lt.RZRO) then
20229
call trif3HV( rslt ,ss,rr ,as ,smax ,lambda )
20231
call trif3( rslt ,ss(1),ss(2),ss(3) ,rr(1),rr(2),rr(3) )
20233
elseif (icase.eq.2) then
20234
! 2 non-zero internal masses
20235
if (s1r2.ne.RZRO.or.s3r3.ne.RZRO) then
20236
call trif2( rslt ,ss(1),ss(2),ss(3) ,rr(2),rr(3) )
20238
call tria4( rslt ,ss(2) ,rr(2),rr(3) ,mulocal2 )
20240
elseif (icase.eq.1) then
20241
! 1 non-zero internal mass
20242
if (as(1).ne.RZRO) then
20243
call trif1( rslt ,ss(1),ss(2),ss(3), rr(3) )
20244
elseif (s2r3.ne.RZRO) then
20245
if (s3r3.ne.RZRO) then
20246
call tria3( rslt ,ss(2),ss(3) ,rr(3) ,mulocal2 )
20248
call tria2( rslt ,ss(2) ,rr(3) ,mulocal2 )
20250
elseif (s3r3.ne.RZRO) then
20251
call tria2( rslt ,ss(3) ,rr(3) ,mulocal2 )
20253
call tria1( rslt ,rr(3) ,mulocal2 )
20256
! 0 non-zero internal masses
20257
call tria0( rslt ,ss ,as ,mulocal2 )
20259
! exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
20260
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
20262
if (punit.gt.0) then
20263
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
20264
write(punit,*) 'muscale:',trim(myprint(mulocal))
20265
write(punit,*) ' p1:',trim(myprint(p1))
20266
write(punit,*) ' p2:',trim(myprint(p2))
20267
write(punit,*) ' p3:',trim(myprint(p3))
20268
write(punit,*) ' m1:',trim(myprint(m1))
20269
write(punit,*) ' m2:',trim(myprint(m2))
20270
write(punit,*) ' m3:',trim(myprint(m3))
20271
write(punit,*) 'c0(2):',trim(myprint(rslt(2)))
20272
write(punit,*) 'c0(1):',trim(myprint(rslt(1)))
20273
write(punit,*) 'c0(0):',trim(myprint(rslt(0)))
20278
!*******************************************************************
20282
! ------ | --------------------------------------------------------
20283
! i*pi^2 / [q^2-m1][(q+k1)^2-m2][(q+k1+k2)^2-m3][(q+k1+k2+k3)^2-m4]
20285
! with Dim = 4-2*eps
20286
! C = pi^eps * mu^(2*eps)
20287
! * GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
20289
! input: p1=k1^2, p2=k2^2, p3=k3^2, p4=(k1+k2+k3)^2,
20290
! p12=(k1+k2)^2, p23=(k2+k3)^2,
20291
! m1,m2,m3,m4=squared masses
20292
! output: rslt(0) = eps^0 -coefficient
20293
! rslt(1) = eps^(-1)-coefficient
20294
! rslt(2) = eps^(-2)-coefficient
20296
! Check the comments in avh_olo_qp_onshell to find out how this
20297
! routines decides when to return IR-divergent cases.
20298
!*******************************************************************
20300
subroutine d0cc( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
20302
use avh_olo_qp_boxc
20305
,intent(out) :: rslt(0:2)
20307
,intent(in) :: p1,p2,p3,p4,p12,p23
20309
,intent(in) :: m1,m2,m3,m4
20318
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
20320
:: mulocal,mulocal2,small,hh,min13,min24,min56
20321
integer :: icase,ii,jj
20323
integer ,parameter :: lp(6,3)=&
20324
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
20325
integer ,parameter :: lm(4,3)=&
20326
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
20327
character(25+99) ,parameter :: warning=&
20328
'WARNING from OneLOop d0: '//warnonshell
20329
if (initz) call init
20343
ap(ii) = areal(pp(ii))
20344
if (aimag(pp(ii)).ne.RZRO) then
20345
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20346
,'momentum with non-zero imaginary part, putting it to zero.'
20347
pp(ii) = acmplx( ap(ii) ,0 )
20349
ap(ii) = abs(ap(ii))
20350
if (ap(ii).gt.smax) smax = ap(ii)
20354
am(ii) = areal(mm(ii))
20356
if (hh.gt.RZRO) then
20357
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20358
,'mass-squared has positive imaginary part, switching its sign.'
20359
mm(ii) = acmplx( am(ii) ,-hh )
20361
am(ii) = abs(am(ii)) + abs(hh)
20362
if (am(ii).gt.smax) smax = am(ii)
20368
if (hh.gt.small) small=hh
20370
small = small*neglig(prcpar)
20374
mulocal2 = mulocal*mulocal
20376
if (smax.eq.RZRO) then
20377
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20378
,'all input equal zero, returning 0'
20379
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
20383
if (mulocal2.gt.smax) smax = mulocal2
20385
if (nonzerothrs) then
20388
if (ap(ii).lt.hh) ap(ii) = 0
20389
if (am(ii).lt.hh) am(ii) = 0
20392
hh = onshellthrs*smax
20393
if (wunit.gt.0) then
20395
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
20396
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
20402
min56 = min(ap(5),ap(6))
20403
if (min56.lt.hh) then
20404
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20405
,'input does not seem to represent hard kinematics, '&
20406
,'trying to permutate'
20407
min13=min(ap(1),ap(3))
20408
min24=min(ap(2),ap(4))
20409
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
20410
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
20412
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20413
,'no permutation helps, errors might follow'
20419
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
20421
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
20422
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
20423
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
20424
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
20425
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
20426
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
20427
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
20428
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
20429
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
20430
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
20431
icase = casetable(icase)
20433
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
20434
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
20435
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
20436
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
20437
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
20438
if (nonzerothrs) then
20439
if (s1r2.lt.hh) s1r2 = 0
20440
if (s2r2.lt.hh) s2r2 = 0
20441
if (s2r3.lt.hh) s2r3 = 0
20442
if (s3r4.lt.hh) s3r4 = 0
20443
if (s4r4.lt.hh) s4r4 = 0
20444
elseif (wunit.gt.0) then
20445
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
20446
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
20447
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
20448
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
20449
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
20452
if (icase.eq.4) then
20453
!4 non-zero internal masses
20454
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
20455
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
20456
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
20457
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
20458
.or.( areal(ss(1)).ge.-small &
20459
.and.areal(ss(2)).ge.-small &
20460
.and.areal(ss(3)).ge.-small &
20461
.and.areal(ss(4)).ge.-small) )
20463
call boxc( rslt ,ss,rr ,as ,smax )
20465
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
20467
elseif (icase.eq.3) then
20468
!3 non-zero internal masses
20469
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
20470
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
20471
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
20472
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
20473
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
20474
.or.( areal(ss(1)).ge.-small &
20475
.and.areal(ss(2)).ge.-small &
20476
.and.areal(ss(3)).ge.-small &
20477
.and.areal(ss(4)).ge.-small) )
20479
call boxc( rslt ,ss,rr ,as ,smax )
20481
call boxf3( rslt, ss,rr )
20484
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
20486
elseif (icase.eq.5) then
20487
!2 non-zero internal masses, opposite case
20488
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
20489
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
20490
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
20492
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20494
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
20495
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20497
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20499
elseif (icase.eq.2) then
20500
!2 non-zero internal masses, adjacent case
20501
if (as(1).ne.RZRO) then
20502
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
20503
elseif (s2r3.ne.RZRO) then
20504
if (s4r4.ne.RZRO) then
20505
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20507
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
20509
elseif (s4r4.ne.RZRO) then
20510
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20512
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20514
elseif (icase.eq.1) then
20515
!1 non-zero internal mass
20516
if (as(1).ne.RZRO) then
20517
if (as(2).ne.RZRO) then
20518
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
20520
if (s3r4.ne.RZRO) then
20521
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20523
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20526
elseif (as(2).ne.RZRO) then
20527
if (s4r4.ne.RZRO) then
20528
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20530
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20533
if (s3r4.ne.RZRO) then
20534
if (s4r4.ne.RZRO) then
20535
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20537
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20539
elseif (s4r4.ne.RZRO) then
20540
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20542
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
20546
!0 non-zero internal mass
20547
call box00( rslt ,ss ,as ,mulocal )
20549
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
20550
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
20552
if (punit.gt.0) then
20553
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
20554
write(punit,*) 'muscale:',trim(myprint(mulocal))
20555
write(punit,*) ' p1:',trim(myprint(p1))
20556
write(punit,*) ' p2:',trim(myprint(p2))
20557
write(punit,*) ' p3:',trim(myprint(p3))
20558
write(punit,*) ' p4:',trim(myprint(p4))
20559
write(punit,*) 'p12:',trim(myprint(p12))
20560
write(punit,*) 'p23:',trim(myprint(p23))
20561
write(punit,*) ' m1:',trim(myprint(m1))
20562
write(punit,*) ' m2:',trim(myprint(m2))
20563
write(punit,*) ' m3:',trim(myprint(m3))
20564
write(punit,*) ' m4:',trim(myprint(m4))
20565
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
20566
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
20567
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
20571
subroutine d0ccr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
20573
use avh_olo_qp_boxc
20576
,intent(out) :: rslt(0:2)
20578
,intent(in) :: p1,p2,p3,p4,p12,p23
20580
,intent(in) :: m1,m2,m3,m4
20591
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
20593
:: mulocal,mulocal2,small,hh,min13,min24,min56
20594
integer :: icase,ii,jj
20596
integer ,parameter :: lp(6,3)=&
20597
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
20598
integer ,parameter :: lm(4,3)=&
20599
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
20600
character(25+99) ,parameter :: warning=&
20601
'WARNING from OneLOop d0: '//warnonshell
20602
if (initz) call init
20616
ap(ii) = areal(pp(ii))
20617
if (aimag(pp(ii)).ne.RZRO) then
20618
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20619
,'momentum with non-zero imaginary part, putting it to zero.'
20620
pp(ii) = acmplx( ap(ii) ,0 )
20622
ap(ii) = abs(ap(ii))
20623
if (ap(ii).gt.smax) smax = ap(ii)
20627
am(ii) = areal(mm(ii))
20629
if (hh.gt.RZRO) then
20630
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20631
,'mass-squared has positive imaginary part, switching its sign.'
20632
mm(ii) = acmplx( am(ii) ,-hh )
20634
am(ii) = abs(am(ii)) + abs(hh)
20635
if (am(ii).gt.smax) smax = am(ii)
20641
if (hh.gt.small) small=hh
20643
small = small*neglig(prcpar)
20647
mulocal2 = mulocal*mulocal
20649
if (smax.eq.RZRO) then
20650
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20651
,'all input equal zero, returning 0'
20652
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
20656
if (mulocal2.gt.smax) smax = mulocal2
20658
if (nonzerothrs) then
20661
if (ap(ii).lt.hh) ap(ii) = 0
20662
if (am(ii).lt.hh) am(ii) = 0
20665
hh = onshellthrs*smax
20666
if (wunit.gt.0) then
20668
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
20669
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
20675
min56 = min(ap(5),ap(6))
20676
if (min56.lt.hh) then
20677
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20678
,'input does not seem to represent hard kinematics, '&
20679
,'trying to permutate'
20680
min13=min(ap(1),ap(3))
20681
min24=min(ap(2),ap(4))
20682
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
20683
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
20685
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20686
,'no permutation helps, errors might follow'
20692
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
20694
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
20695
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
20696
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
20697
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
20698
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
20699
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
20700
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
20701
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
20702
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
20703
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
20704
icase = casetable(icase)
20706
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
20707
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
20708
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
20709
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
20710
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
20711
if (nonzerothrs) then
20712
if (s1r2.lt.hh) s1r2 = 0
20713
if (s2r2.lt.hh) s2r2 = 0
20714
if (s2r3.lt.hh) s2r3 = 0
20715
if (s3r4.lt.hh) s3r4 = 0
20716
if (s4r4.lt.hh) s4r4 = 0
20717
elseif (wunit.gt.0) then
20718
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
20719
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
20720
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
20721
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
20722
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
20725
if (icase.eq.4) then
20726
!4 non-zero internal masses
20727
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
20728
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
20729
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
20730
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
20731
.or.( areal(ss(1)).ge.-small &
20732
.and.areal(ss(2)).ge.-small &
20733
.and.areal(ss(3)).ge.-small &
20734
.and.areal(ss(4)).ge.-small) )
20736
call boxc( rslt ,ss,rr ,as ,smax )
20738
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
20740
elseif (icase.eq.3) then
20741
!3 non-zero internal masses
20742
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
20743
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
20744
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
20745
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
20746
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
20747
.or.( areal(ss(1)).ge.-small &
20748
.and.areal(ss(2)).ge.-small &
20749
.and.areal(ss(3)).ge.-small &
20750
.and.areal(ss(4)).ge.-small) )
20752
call boxc( rslt ,ss,rr ,as ,smax )
20754
call boxf3( rslt, ss,rr )
20757
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
20759
elseif (icase.eq.5) then
20760
!2 non-zero internal masses, opposite case
20761
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
20762
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
20763
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
20765
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20767
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
20768
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20770
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
20772
elseif (icase.eq.2) then
20773
!2 non-zero internal masses, adjacent case
20774
if (as(1).ne.RZRO) then
20775
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
20776
elseif (s2r3.ne.RZRO) then
20777
if (s4r4.ne.RZRO) then
20778
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20780
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
20782
elseif (s4r4.ne.RZRO) then
20783
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20785
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
20787
elseif (icase.eq.1) then
20788
!1 non-zero internal mass
20789
if (as(1).ne.RZRO) then
20790
if (as(2).ne.RZRO) then
20791
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
20793
if (s3r4.ne.RZRO) then
20794
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20796
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20799
elseif (as(2).ne.RZRO) then
20800
if (s4r4.ne.RZRO) then
20801
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20803
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20806
if (s3r4.ne.RZRO) then
20807
if (s4r4.ne.RZRO) then
20808
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20810
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
20812
elseif (s4r4.ne.RZRO) then
20813
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
20815
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
20819
!0 non-zero internal mass
20820
call box00( rslt ,ss ,as ,mulocal )
20822
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
20823
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
20825
if (punit.gt.0) then
20826
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
20827
write(punit,*) 'muscale:',trim(myprint(mulocal))
20828
write(punit,*) ' p1:',trim(myprint(p1))
20829
write(punit,*) ' p2:',trim(myprint(p2))
20830
write(punit,*) ' p3:',trim(myprint(p3))
20831
write(punit,*) ' p4:',trim(myprint(p4))
20832
write(punit,*) 'p12:',trim(myprint(p12))
20833
write(punit,*) 'p23:',trim(myprint(p23))
20834
write(punit,*) ' m1:',trim(myprint(m1))
20835
write(punit,*) ' m2:',trim(myprint(m2))
20836
write(punit,*) ' m3:',trim(myprint(m3))
20837
write(punit,*) ' m4:',trim(myprint(m4))
20838
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
20839
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
20840
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
20844
subroutine d0rc( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
20846
use avh_olo_qp_boxc
20849
,intent(out) :: rslt(0:2)
20851
,intent(in) :: p1,p2,p3,p4,p12,p23
20853
,intent(in) :: m1,m2,m3,m4
20862
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
20864
:: mulocal,mulocal2,small,hh,min13,min24,min56
20865
integer :: icase,ii,jj
20867
integer ,parameter :: lp(6,3)=&
20868
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
20869
integer ,parameter :: lm(4,3)=&
20870
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
20871
character(25+99) ,parameter :: warning=&
20872
'WARNING from OneLOop d0: '//warnonshell
20873
if (initz) call init
20887
ap(ii) = abs(pp(ii))
20888
if (ap(ii).gt.smax) smax = ap(ii)
20892
am(ii) = areal(mm(ii))
20894
if (hh.gt.RZRO) then
20895
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20896
,'mass-squared has positive imaginary part, switching its sign.'
20897
mm(ii) = acmplx( am(ii) ,-hh )
20899
am(ii) = abs(am(ii)) + abs(hh)
20900
if (am(ii).gt.smax) smax = am(ii)
20906
if (hh.gt.small) small=hh
20908
small = small*neglig(prcpar)
20912
mulocal2 = mulocal*mulocal
20914
if (smax.eq.RZRO) then
20915
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
20916
,'all input equal zero, returning 0'
20917
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
20921
if (mulocal2.gt.smax) smax = mulocal2
20923
if (nonzerothrs) then
20926
if (ap(ii).lt.hh) ap(ii) = 0
20927
if (am(ii).lt.hh) am(ii) = 0
20930
hh = onshellthrs*smax
20931
if (wunit.gt.0) then
20933
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
20934
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
20940
min56 = min(ap(5),ap(6))
20941
if (min56.lt.hh) then
20942
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20943
,'input does not seem to represent hard kinematics, '&
20944
,'trying to permutate'
20945
min13=min(ap(1),ap(3))
20946
min24=min(ap(2),ap(4))
20947
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
20948
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
20950
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
20951
,'no permutation helps, errors might follow'
20957
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
20959
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
20960
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
20961
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
20962
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
20963
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
20964
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
20965
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
20966
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
20967
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
20968
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
20969
icase = casetable(icase)
20971
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
20972
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
20973
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
20974
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
20975
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
20976
if (nonzerothrs) then
20977
if (s1r2.lt.hh) s1r2 = 0
20978
if (s2r2.lt.hh) s2r2 = 0
20979
if (s2r3.lt.hh) s2r3 = 0
20980
if (s3r4.lt.hh) s3r4 = 0
20981
if (s4r4.lt.hh) s4r4 = 0
20982
elseif (wunit.gt.0) then
20983
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
20984
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
20985
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
20986
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
20987
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
20990
if (icase.eq.4) then
20991
!4 non-zero internal masses
20992
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
20993
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
20994
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
20995
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
20996
.or.( areal(ss(1)).ge.-small &
20997
.and.areal(ss(2)).ge.-small &
20998
.and.areal(ss(3)).ge.-small &
20999
.and.areal(ss(4)).ge.-small) )
21001
call boxc( rslt ,ss,rr ,as ,smax )
21003
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
21005
elseif (icase.eq.3) then
21006
!3 non-zero internal masses
21007
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21008
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
21009
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
21010
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
21011
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
21012
.or.( areal(ss(1)).ge.-small &
21013
.and.areal(ss(2)).ge.-small &
21014
.and.areal(ss(3)).ge.-small &
21015
.and.areal(ss(4)).ge.-small) )
21017
call boxc( rslt ,ss,rr ,as ,smax )
21019
call boxf3( rslt, ss,rr )
21022
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
21024
elseif (icase.eq.5) then
21025
!2 non-zero internal masses, opposite case
21026
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21027
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21028
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
21030
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21032
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21033
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21035
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21037
elseif (icase.eq.2) then
21038
!2 non-zero internal masses, adjacent case
21039
if (as(1).ne.RZRO) then
21040
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
21041
elseif (s2r3.ne.RZRO) then
21042
if (s4r4.ne.RZRO) then
21043
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21045
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
21047
elseif (s4r4.ne.RZRO) then
21048
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21050
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21052
elseif (icase.eq.1) then
21053
!1 non-zero internal mass
21054
if (as(1).ne.RZRO) then
21055
if (as(2).ne.RZRO) then
21056
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
21058
if (s3r4.ne.RZRO) then
21059
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21061
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21064
elseif (as(2).ne.RZRO) then
21065
if (s4r4.ne.RZRO) then
21066
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21068
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21071
if (s3r4.ne.RZRO) then
21072
if (s4r4.ne.RZRO) then
21073
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21075
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21077
elseif (s4r4.ne.RZRO) then
21078
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21080
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
21084
!0 non-zero internal mass
21085
call box00( rslt ,ss ,as ,mulocal )
21087
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
21088
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
21090
if (punit.gt.0) then
21091
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
21092
write(punit,*) 'muscale:',trim(myprint(mulocal))
21093
write(punit,*) ' p1:',trim(myprint(p1))
21094
write(punit,*) ' p2:',trim(myprint(p2))
21095
write(punit,*) ' p3:',trim(myprint(p3))
21096
write(punit,*) ' p4:',trim(myprint(p4))
21097
write(punit,*) 'p12:',trim(myprint(p12))
21098
write(punit,*) 'p23:',trim(myprint(p23))
21099
write(punit,*) ' m1:',trim(myprint(m1))
21100
write(punit,*) ' m2:',trim(myprint(m2))
21101
write(punit,*) ' m3:',trim(myprint(m3))
21102
write(punit,*) ' m4:',trim(myprint(m4))
21103
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
21104
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
21105
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
21109
subroutine d0rcr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
21111
use avh_olo_qp_boxc
21114
,intent(out) :: rslt(0:2)
21116
,intent(in) :: p1,p2,p3,p4,p12,p23
21118
,intent(in) :: m1,m2,m3,m4
21129
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
21131
:: mulocal,mulocal2,small,hh,min13,min24,min56
21132
integer :: icase,ii,jj
21134
integer ,parameter :: lp(6,3)=&
21135
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
21136
integer ,parameter :: lm(4,3)=&
21137
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
21138
character(25+99) ,parameter :: warning=&
21139
'WARNING from OneLOop d0: '//warnonshell
21140
if (initz) call init
21154
ap(ii) = abs(pp(ii))
21155
if (ap(ii).gt.smax) smax = ap(ii)
21159
am(ii) = areal(mm(ii))
21161
if (hh.gt.RZRO) then
21162
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
21163
,'mass-squared has positive imaginary part, switching its sign.'
21164
mm(ii) = acmplx( am(ii) ,-hh )
21166
am(ii) = abs(am(ii)) + abs(hh)
21167
if (am(ii).gt.smax) smax = am(ii)
21173
if (hh.gt.small) small=hh
21175
small = small*neglig(prcpar)
21179
mulocal2 = mulocal*mulocal
21181
if (smax.eq.RZRO) then
21182
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
21183
,'all input equal zero, returning 0'
21184
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
21188
if (mulocal2.gt.smax) smax = mulocal2
21190
if (nonzerothrs) then
21193
if (ap(ii).lt.hh) ap(ii) = 0
21194
if (am(ii).lt.hh) am(ii) = 0
21197
hh = onshellthrs*smax
21198
if (wunit.gt.0) then
21200
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
21201
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
21207
min56 = min(ap(5),ap(6))
21208
if (min56.lt.hh) then
21209
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
21210
,'input does not seem to represent hard kinematics, '&
21211
,'trying to permutate'
21212
min13=min(ap(1),ap(3))
21213
min24=min(ap(2),ap(4))
21214
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
21215
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
21217
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
21218
,'no permutation helps, errors might follow'
21224
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
21226
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
21227
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
21228
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
21229
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
21230
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
21231
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
21232
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
21233
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
21234
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
21235
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
21236
icase = casetable(icase)
21238
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
21239
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
21240
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
21241
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
21242
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
21243
if (nonzerothrs) then
21244
if (s1r2.lt.hh) s1r2 = 0
21245
if (s2r2.lt.hh) s2r2 = 0
21246
if (s2r3.lt.hh) s2r3 = 0
21247
if (s3r4.lt.hh) s3r4 = 0
21248
if (s4r4.lt.hh) s4r4 = 0
21249
elseif (wunit.gt.0) then
21250
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
21251
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
21252
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
21253
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
21254
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
21257
if (icase.eq.4) then
21258
!4 non-zero internal masses
21259
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
21260
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
21261
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
21262
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
21263
.or.( areal(ss(1)).ge.-small &
21264
.and.areal(ss(2)).ge.-small &
21265
.and.areal(ss(3)).ge.-small &
21266
.and.areal(ss(4)).ge.-small) )
21268
call boxc( rslt ,ss,rr ,as ,smax )
21270
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
21272
elseif (icase.eq.3) then
21273
!3 non-zero internal masses
21274
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21275
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
21276
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
21277
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
21278
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
21279
.or.( areal(ss(1)).ge.-small &
21280
.and.areal(ss(2)).ge.-small &
21281
.and.areal(ss(3)).ge.-small &
21282
.and.areal(ss(4)).ge.-small) )
21284
call boxc( rslt ,ss,rr ,as ,smax )
21286
call boxf3( rslt, ss,rr )
21289
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
21291
elseif (icase.eq.5) then
21292
!2 non-zero internal masses, opposite case
21293
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21294
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21295
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
21297
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21299
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21300
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21302
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21304
elseif (icase.eq.2) then
21305
!2 non-zero internal masses, adjacent case
21306
if (as(1).ne.RZRO) then
21307
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
21308
elseif (s2r3.ne.RZRO) then
21309
if (s4r4.ne.RZRO) then
21310
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21312
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
21314
elseif (s4r4.ne.RZRO) then
21315
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21317
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21319
elseif (icase.eq.1) then
21320
!1 non-zero internal mass
21321
if (as(1).ne.RZRO) then
21322
if (as(2).ne.RZRO) then
21323
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
21325
if (s3r4.ne.RZRO) then
21326
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21328
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21331
elseif (as(2).ne.RZRO) then
21332
if (s4r4.ne.RZRO) then
21333
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21335
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21338
if (s3r4.ne.RZRO) then
21339
if (s4r4.ne.RZRO) then
21340
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21342
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21344
elseif (s4r4.ne.RZRO) then
21345
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21347
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
21351
!0 non-zero internal mass
21352
call box00( rslt ,ss ,as ,mulocal )
21354
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
21355
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
21357
if (punit.gt.0) then
21358
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
21359
write(punit,*) 'muscale:',trim(myprint(mulocal))
21360
write(punit,*) ' p1:',trim(myprint(p1))
21361
write(punit,*) ' p2:',trim(myprint(p2))
21362
write(punit,*) ' p3:',trim(myprint(p3))
21363
write(punit,*) ' p4:',trim(myprint(p4))
21364
write(punit,*) 'p12:',trim(myprint(p12))
21365
write(punit,*) 'p23:',trim(myprint(p23))
21366
write(punit,*) ' m1:',trim(myprint(m1))
21367
write(punit,*) ' m2:',trim(myprint(m2))
21368
write(punit,*) ' m3:',trim(myprint(m3))
21369
write(punit,*) ' m4:',trim(myprint(m4))
21370
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
21371
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
21372
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
21376
subroutine d0rr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 )
21378
use avh_olo_qp_boxc
21381
,intent(out) :: rslt(0:2)
21383
,intent(in) :: p1,p2,p3,p4,p12,p23
21385
,intent(in) :: m1,m2,m3,m4
21394
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
21396
:: mulocal,mulocal2,small,hh,min13,min24,min56
21397
integer :: icase,ii,jj
21399
integer ,parameter :: lp(6,3)=&
21400
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
21401
integer ,parameter :: lm(4,3)=&
21402
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
21403
character(25+99) ,parameter :: warning=&
21404
'WARNING from OneLOop d0: '//warnonshell
21405
if (initz) call init
21419
ap(ii) = abs(pp(ii))
21420
if (ap(ii).gt.smax) smax = ap(ii)
21424
am(ii) = abs(mm(ii))
21425
if (am(ii).gt.smax) smax = am(ii)
21431
if (hh.gt.small) small=hh
21433
small = small*neglig(prcpar)
21437
mulocal2 = mulocal*mulocal
21439
if (smax.eq.RZRO) then
21440
if (eunit.gt.0) write(eunit,*) 'ERROR in OneLOop d0: ' &
21441
,'all input equal zero, returning 0'
21442
rslt(0)=0 ;rslt(1)=0 ;rslt(2)=0
21446
if (mulocal2.gt.smax) smax = mulocal2
21448
if (nonzerothrs) then
21451
if (ap(ii).lt.hh) ap(ii) = 0
21452
if (am(ii).lt.hh) am(ii) = 0
21455
hh = onshellthrs*smax
21456
if (wunit.gt.0) then
21458
if (RZRO.lt.ap(ii).and.ap(ii).lt.hh) write(wunit,*) warning
21459
if (RZRO.lt.am(ii).and.am(ii).lt.hh) write(wunit,*) warning
21465
min56 = min(ap(5),ap(6))
21466
if (min56.lt.hh) then
21467
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
21468
,'input does not seem to represent hard kinematics, '&
21469
,'trying to permutate'
21470
min13=min(ap(1),ap(3))
21471
min24=min(ap(2),ap(4))
21472
if (min13.gt.min24.and.min13.gt.min56) then ;jj=2
21473
elseif (min24.gt.min13.and.min24.gt.min56) then ;jj=3
21475
if (wunit.gt.0) write(wunit,*) 'WARNING from OneLOop d0: ' &
21476
,'no permutation helps, errors might follow'
21482
if (am(lm(ii,jj)).gt.RZRO) icase = icase + base(ii)
21484
ss(1)=pp(lp(permtable(1,icase),jj)) ;as(1)=ap(lp(permtable(1,icase),jj))
21485
ss(2)=pp(lp(permtable(2,icase),jj)) ;as(2)=ap(lp(permtable(2,icase),jj))
21486
ss(3)=pp(lp(permtable(3,icase),jj)) ;as(3)=ap(lp(permtable(3,icase),jj))
21487
ss(4)=pp(lp(permtable(4,icase),jj)) ;as(4)=ap(lp(permtable(4,icase),jj))
21488
ss(5)=pp(lp(permtable(5,icase),jj)) ;as(5)=ap(lp(permtable(5,icase),jj))
21489
ss(6)=pp(lp(permtable(6,icase),jj)) ;as(6)=ap(lp(permtable(6,icase),jj))
21490
rr(1)=mm(lm(permtable(1,icase),jj)) ;ar(1)=am(lm(permtable(1,icase),jj))
21491
rr(2)=mm(lm(permtable(2,icase),jj)) ;ar(2)=am(lm(permtable(2,icase),jj))
21492
rr(3)=mm(lm(permtable(3,icase),jj)) ;ar(3)=am(lm(permtable(3,icase),jj))
21493
rr(4)=mm(lm(permtable(4,icase),jj)) ;ar(4)=am(lm(permtable(4,icase),jj))
21494
icase = casetable(icase)
21496
s1r2 = abs(areal(ss(1)-rr(2))) + abs(aimag(ss(1)-rr(2)))
21497
s2r2 = abs(areal(ss(2)-rr(2))) + abs(aimag(ss(2)-rr(2)))
21498
s2r3 = abs(areal(ss(2)-rr(3))) + abs(aimag(ss(2)-rr(3)))
21499
s3r4 = abs(areal(ss(3)-rr(4))) + abs(aimag(ss(3)-rr(4)))
21500
s4r4 = abs(areal(ss(4)-rr(4))) + abs(aimag(ss(4)-rr(4)))
21501
if (nonzerothrs) then
21502
if (s1r2.lt.hh) s1r2 = 0
21503
if (s2r2.lt.hh) s2r2 = 0
21504
if (s2r3.lt.hh) s2r3 = 0
21505
if (s3r4.lt.hh) s3r4 = 0
21506
if (s4r4.lt.hh) s4r4 = 0
21507
elseif (wunit.gt.0) then
21508
if (RZRO.lt.s1r2.and.s1r2.lt.hh) write(wunit,*) warning
21509
if (RZRO.lt.s2r2.and.s2r2.lt.hh) write(wunit,*) warning
21510
if (RZRO.lt.s2r3.and.s2r3.lt.hh) write(wunit,*) warning
21511
if (RZRO.lt.s3r4.and.s3r4.lt.hh) write(wunit,*) warning
21512
if (RZRO.lt.s4r4.and.s4r4.lt.hh) write(wunit,*) warning
21515
if (icase.eq.4) then
21516
!4 non-zero internal masses
21517
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
21518
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
21519
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
21520
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
21521
.or.( areal(ss(1)).ge.-small &
21522
.and.areal(ss(2)).ge.-small &
21523
.and.areal(ss(3)).ge.-small &
21524
.and.areal(ss(4)).ge.-small) )
21526
call boxc( rslt ,ss,rr ,as ,smax )
21528
call boxf4( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(1),rr(2),rr(3),rr(4) )
21530
elseif (icase.eq.3) then
21531
!3 non-zero internal masses
21532
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21533
useboxc = ( (ar(1).ne.RZRO.and.aimag(rr(1)).ne.RZRO) &
21534
.or.(ar(2).ne.RZRO.and.aimag(rr(2)).ne.RZRO) &
21535
.or.(ar(3).ne.RZRO.and.aimag(rr(3)).ne.RZRO) &
21536
.or.(ar(4).ne.RZRO.and.aimag(rr(4)).ne.RZRO) &
21537
.or.( areal(ss(1)).ge.-small &
21538
.and.areal(ss(2)).ge.-small &
21539
.and.areal(ss(3)).ge.-small &
21540
.and.areal(ss(4)).ge.-small) )
21542
call boxc( rslt ,ss,rr ,as ,smax )
21544
call boxf3( rslt, ss,rr )
21547
call box16( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(3),rr(4) ,mulocal )
21549
elseif (icase.eq.5) then
21550
!2 non-zero internal masses, opposite case
21551
if (s1r2.ne.RZRO.or.s4r4.ne.RZRO) then
21552
if (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21553
call boxf5( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(2),rr(4) )
21555
call box15( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21557
elseif (s2r2.ne.RZRO.or.s3r4.ne.RZRO) then
21558
call box15( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21560
call box14( rslt ,ss(5),ss(6) ,rr(2),rr(4) ,mulocal )
21562
elseif (icase.eq.2) then
21563
!2 non-zero internal masses, adjacent case
21564
if (as(1).ne.RZRO) then
21565
call boxf2( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) )
21566
elseif (s2r3.ne.RZRO) then
21567
if (s4r4.ne.RZRO) then
21568
call box13( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21570
call box12( rslt ,ss(3),ss(2),ss(6),ss(5) ,rr(4),rr(3) ,mulocal )
21572
elseif (s4r4.ne.RZRO) then
21573
call box12( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21575
call box11( rslt ,ss(3),ss(5),ss(6) ,rr(3),rr(4) ,mulocal )
21577
elseif (icase.eq.1) then
21578
!1 non-zero internal mass
21579
if (as(1).ne.RZRO) then
21580
if (as(2).ne.RZRO) then
21581
call boxf1( rslt ,ss(1),ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) )
21583
if (s3r4.ne.RZRO) then
21584
call box10( rslt ,ss(1),ss(4),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21586
call box09( rslt ,ss(1),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21589
elseif (as(2).ne.RZRO) then
21590
if (s4r4.ne.RZRO) then
21591
call box10( rslt ,ss(2),ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21593
call box09( rslt ,ss(2),ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21596
if (s3r4.ne.RZRO) then
21597
if (s4r4.ne.RZRO) then
21598
call box08( rslt ,ss(3),ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21600
call box07( rslt ,ss(3),ss(5),ss(6) ,rr(4) ,mulocal )
21602
elseif (s4r4.ne.RZRO) then
21603
call box07( rslt ,ss(4),ss(5),ss(6) ,rr(4) ,mulocal )
21605
call box06( rslt ,ss(5),ss(6) ,rr(4) ,mulocal )
21609
!0 non-zero internal mass
21610
call box00( rslt ,ss ,as ,mulocal )
21612
!exp(eps*gamma_EULER) -> GAMMA(1-2*eps)/GAMMA(1-eps)^2/GAMMA(1+eps)
21613
rslt(0) = rslt(0) + 2*PISQo24*rslt(2)
21615
if (punit.gt.0) then
21616
if (nonzerothrs) write(punit,*) 'onshell:',trim(myprint(onshellthrs))
21617
write(punit,*) 'muscale:',trim(myprint(mulocal))
21618
write(punit,*) ' p1:',trim(myprint(p1))
21619
write(punit,*) ' p2:',trim(myprint(p2))
21620
write(punit,*) ' p3:',trim(myprint(p3))
21621
write(punit,*) ' p4:',trim(myprint(p4))
21622
write(punit,*) 'p12:',trim(myprint(p12))
21623
write(punit,*) 'p23:',trim(myprint(p23))
21624
write(punit,*) ' m1:',trim(myprint(m1))
21625
write(punit,*) ' m2:',trim(myprint(m2))
21626
write(punit,*) ' m3:',trim(myprint(m3))
21627
write(punit,*) ' m4:',trim(myprint(m4))
21628
write(punit,*) 'd0(2):',trim(myprint(rslt(2)))
21629
write(punit,*) 'd0(1):',trim(myprint(rslt(1)))
21630
write(punit,*) 'd0(0):',trim(myprint(rslt(0)))
21634
subroutine d0rrr( rslt ,p1,p2,p3,p4,p12,p23 ,m1,m2,m3,m4 ,rmu )
21636
use avh_olo_qp_boxc
21639
,intent(out) :: rslt(0:2)
21641
,intent(in) :: p1,p2,p3,p4,p12,p23
21643
,intent(in) :: m1,m2,m3,m4
21654
:: smax,ap(6),am(4),as(6),ar(4),s1r2,s2r2,s2r3,s3r4,s4r4
21656
:: mulocal,mulocal2,small,hh,min13,min24,min56
21657
integer :: icase,ii,jj
21659
integer ,parameter :: lp(6,3)=&
21660
reshape((/1,2,3,4,5,6 ,5,2,6,4,1,3 ,1,6,3,5,4,2/),(/6,3/))
21661
integer ,parameter :: lm(4,3)=&
21662
reshape((/1,2,3,4 ,1,3,2,4 ,1,2,4,3 /),(/4,3/))
21663
character(25+99) ,parameter :: warning=&
21664
'WARNING from OneLOop d0: '//warnonshell
21665
if (initz) call init
21679
ap(ii) = abs(pp(ii))
21680
if (ap(ii).gt.smax) smax = ap(ii)
21684
am(ii) = abs(mm(ii))
21685
if (am(ii).gt.smax) smax = am(ii)
21691
if (hh.gt.small) small=hh
21693
small = small*neglig(prcpar)
9408
21697
mulocal2 = mulocal*mulocal