You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

310 lines
9.0 KiB

subroutine pvCtensor(q1,q2,m1s,m2s,m3s,
. FC0,FC1,FC2,FC3,FC4,FC5,FC6)
implicit none
C q1,q2 are the momenta in the propagators
C m1s,m2s,m3s are the squares of the masses in the propagators
include 'lib/TensorReduction/Include/types.f'
include 'lib/TensorReduction/Include/TRconstants.f'
include 'lib/TensorReduction/Include/pvCnames.f'
include 'lib/TensorReduction/Include/pvCv.f'
include 'lib/TensorReduction/Include/TRydef.f'
include 'lib/TensorReduction/Include/TRmaxindex.f'
include 'lib/TensorReduction/Include/pvRespectmaxcindex.f'
include 'lib/TensorReduction/Include/pvrecurflags.f'
include 'lib/TensorReduction/Include/TRbadpoint.f'
include 'lib/TensorReduction/Include/pvforcerecalc.f'
include 'lib/TensorReduction/Include/pvverbose.f'
include 'lib/TensorReduction/Include/pvCitry.f'
include 'lib/TensorReduction/Include/TRmetric.f'
complex(dp):: FC0(-2:0),FC1(y1max,-2:0),FC2(y2max,-2:0),
. FC3(y3max,-2:0),FC4(y4max,-2:0),FC5(y5max,-2:0),FC6(y6max,-2:0),
. FC7(y7max,-2:0)
real(dp):: p1Dp1,p2Dp2,p3Dp3,q1(4),q2(4)
real(dp):: m1s,m2s,m3s,
. pvSPK,
. pvSPKK,pvSDDP,
. pvSPKKK,pvSPPKK,
. pvSDDPP,pvSDDPK,pvSDDDD,
. pvSDDDDP,pvSDDPPP,pvSDDPPK,pvSPPPKK,pvSPPPPK,
. pvSDDDDDD,pvSDDDDPP,pvSDDDDPK,pvSDDPPPP,pvSDDPPPK,pvSDDPPKK,
. pvSDDPKKK,pvSPPPPPK,pvSPPPPKK,pvSPPPKKK
real(dp)::q1save(4),q2save(4)
integer:: n1,n2,n3,n4,n5,n6,n7,ep,C0i,pvCcache,itry
logical:: failed
common/q12save/q1save,q2save
logical,save:: first=.true.
!$omp threadprivate(first,/q12save/)
c--- value of itry specifies which calculation to use for tensor coefficients:
c--- itry=0 regular PV recursion
c--- itry=1 small G recursion
c--- itry=2 small G and small Y recursion
itry=0 ! Regular PV recursion is the default
doGsing =.false.
doGYsing=.false.
doPsing =.false.
doPFsing=.false.
if (first) then
first=.false.
call pvarraysetup
endif
pvrespectmaxcindex=.true.
q1save(:)=q1(:)
q2save(:)=q2(:)
c p1(nu)=q1(nu)
c p2(nu)=q2(nu)-q1(nu)
p1Dp1=q1(4)**2-q1(1)**2-q1(2)**2-q1(3)**2
p3Dp3=q2(4)**2-q2(1)**2-q2(2)**2-q2(3)**2
p2Dp2=p1Dp1+p3Dp3
. -two*(q1(4)*q2(4)-q1(1)*q2(1)-q1(2)*q2(2)-q1(3)*q2(3))
c--- point from which to continue
11 continue
pvforcerecalc=.false.
if (itry .eq. 1) then
doGsing=.true.
pvforcerecalc=.true.
elseif (itry .eq. 2) then
doGsing=.false.
doGYsing=.true.
pvforcerecalc=.true.
elseif (itry .eq. 3) then
c--- cannot compute point: set flag
pvbadpoint=.true.
if (pvverbose) write(6,*) 'flag: badpoint set in pvCtensor'
return
endif
C0i=pvCcache(p1Dp1,p2Dp2,p3Dp3,m1s,m2s,m3s)
c write(6,*) 'C cache for ',p1Dp1,p2Dp2,p3Dp3,m1s,m2s,m3s
c do n1=1,Ncc
c write(6,'(i4,2f28.16)') n1,Cv(C0i+n1,0)
c enddo
c write(6,*)
do ep=-2,0
FC0(ep)=Cv(C0i+cc0,ep)
enddo
do ep=-2,0
do n1=1,4
FC1(n1,ep)=+Cv(C0i+cc1,ep)*q1(n1)+Cv(C0i+cc2,ep)*q2(n1)
enddo
enddo
do ep=-2,0
do n1=1,4
do n2=n1,4
FC2(y2(n1,n2),ep)=
. +q1(n1)*q1(n2)*Cv(C0i+cc11,ep)
. +q2(n1)*q2(n2)*Cv(C0i+cc22,ep)
. +pvSPK(n1,n2,q1,q2)*Cv(C0i+cc12,ep)
. +g(n1,n2)*Cv(C0i+cc00,ep)
enddo
enddo
enddo
if ((maxcindex .eq. 2) .and. (pvRespectmaxcindex)) then
if (pvCitry(C0i) .eq. -1) then
call pvCcheck(2,q1,q2,m1s,m2s,m3s,
& FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
if (failed) then
c write(6,*) 'recursion in pvCtensor'
itry=itry+1
goto 11
endif
pvCitry(C0i)=itry
c if (itry .gt. 0) then
c write(6,*) 'pvCtensor success: itry=',itry
c endif
endif
return
endif
do ep=-2,0
do n1=1,4
do n2=n1,4
do n3=n2,4
FC3(y3(n1,n2,n3),ep)=
. +q1(n1)*q1(n2)*q1(n3)*Cv(C0i+cc111,ep)
. +q2(n1)*q2(n2)*q2(n3)*Cv(C0i+cc222,ep)
. +pvSPKK(n1,n2,n3,q2,q1)*Cv(C0i+cc112,ep)
. +pvSPKK(n1,n2,n3,q1,q2)*Cv(C0i+cc122,ep)
. +pvSDDP(n1,n2,n3,q1)*Cv(C0i+cc001,ep)
. +pvSDDP(n1,n2,n3,q2)*Cv(C0i+cc002,ep)
enddo
enddo
enddo
enddo
c--- This code can be used to check that the calculated tensor (e.g.
c--- by one of the recursion methods) satisfies the usual PV relations
c call PVchecktri(q1,q2,m1s,m2s,m3s,FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
c---
if ((maxcindex .eq. 3) .and. (pvRespectmaxcindex)) then
call pvCcheck(3,q1,q2,m1s,m2s,m3s,
& FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
if (failed) then
c write(6,*) 'recursion in pvCtensor'
itry=itry+1
goto 11
endif
return
endif
do ep=-2,0
do n1=1,4
do n2=n1,4
do n3=n2,4
do n4=n3,4
FC4(y4(n1,n2,n3,n4),ep)=
. +q1(n1)*q1(n2)*q1(n3)*q1(n4)*Cv(C0i+cc1111,ep)
. +q2(n1)*q2(n2)*q2(n3)*q2(n4)*Cv(C0i+cc2222,ep)
. +pvSPKKK(n1,n2,n3,n4,q2,q1)*Cv(C0i+cc1112,ep)
. +pvSPKKK(n1,n2,n3,n4,q1,q2)*Cv(C0i+cc1222,ep)
. +pvSPPKK(n1,n2,n3,n4,q1,q2)*Cv(C0i+cc1122,ep)
. +pvSDDPP(n1,n2,n3,n4,q1)*Cv(C0i+cc0011,ep)
. +pvSDDPP(n1,n2,n3,n4,q2)*Cv(C0i+cc0022,ep)
. +pvSDDPK(n1,n2,n3,n4,q1,q2)*Cv(C0i+cc0012,ep)
. +pvSDDDD(n1,n2,n3,n4)*Cv(C0i+cc0000,ep)
enddo
enddo
enddo
enddo
enddo
if ((maxcindex .eq. 4) .and. (pvRespectmaxcindex)) then
call pvCcheck(4,q1,q2,m1s,m2s,m3s,
& FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
if (failed) then
c write(6,*) 'recursion in pvCtensor'
itry=itry+1
goto 11
endif
return
endif
do ep=-2,0
do n1=1,4
do n2=n1,4
do n3=n2,4
do n4=n3,4
do n5=n4,4
FC5(y5(n1,n2,n3,n4,n5),ep)=
. +Cv(C0i+cc00001,ep)*pvSDDDDP(n1,n2,n3,n4,n5,q1)
. +Cv(C0i+cc00002,ep)*pvSDDDDP(n1,n2,n3,n4,n5,q2)
. +Cv(C0i+cc00111,ep)*pvSDDPPP(n1,n2,n3,n4,n5,q1)
. +Cv(C0i+cc00112,ep)*pvSDDPPK(n1,n2,n3,n4,n5,q1,q2)
. +Cv(C0i+cc00122,ep)*pvSDDPPK(n1,n2,n3,n4,n5,q2,q1)
. +Cv(C0i+cc00222,ep)*pvSDDPPP(n1,n2,n3,n4,n5,q2)
. +Cv(C0i+cc11111,ep)*q1(n1)*q1(n2)*q1(n3)*q1(n4)*q1(n5)
. +Cv(C0i+cc11112,ep)*pvSPPPPK(n1,n2,n3,n4,n5,q1,q2)
. +Cv(C0i+cc11122,ep)*pvSPPPKK(n1,n2,n3,n4,n5,q1,q2)
. +Cv(C0i+cc11222,ep)*pvSPPPKK(n1,n2,n3,n4,n5,q2,q1)
. +Cv(C0i+cc12222,ep)*pvSPPPPK(n1,n2,n3,n4,n5,q2,q1)
. +Cv(C0i+cc22222,ep)*q2(n1)*q2(n2)*q2(n3)*q2(n4)*q2(n5)
enddo
enddo
enddo
enddo
enddo
enddo
if ((maxcindex .eq. 5) .and. (pvRespectmaxcindex)) then
call pvCcheck(5,q1,q2,m1s,m2s,m3s,
& FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
if (failed) then
c write(6,*) 'recursion in pvCtensor'
itry=itry+1
goto 11
endif
return
endif
do ep=-2,0
do n1=1,4
do n2=n1,4
do n3=n2,4
do n4=n3,4
do n5=n4,4
do n6=n5,4
FC6(y6(n1,n2,n3,n4,n5,n6),ep)=
. +Cv(C0i+cc000000,ep)*pvSDDDDDD(n1,n2,n3,n4,n5,n6)
. +Cv(C0i+cc000011,ep)*pvSDDDDPP(n1,n2,n3,n4,n5,n6,q1)
. +Cv(C0i+cc000012,ep)*pvSDDDDPK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc000022,ep)*pvSDDDDPP(n1,n2,n3,n4,n5,n6,q2)
. +Cv(C0i+cc001111,ep)*pvSDDPPPP(n1,n2,n3,n4,n5,n6,q1)
. +Cv(C0i+cc001112,ep)*pvSDDPPPK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc001122,ep)*pvSDDPPKK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc001222,ep)*pvSDDPKKK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc002222,ep)*pvSDDPPPP(n1,n2,n3,n4,n5,n6,q2)
. +Cv(C0i+cc111111,ep)*q1(n1)*q1(n2)*q1(n3)*q1(n4)*q1(n5)*q1(n6)
. +Cv(C0i+cc111112,ep)*pvSPPPPPK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc111122,ep)*pvSPPPPKK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc111222,ep)*pvSPPPKKK(n1,n2,n3,n4,n5,n6,q1,q2)
. +Cv(C0i+cc112222,ep)*pvSPPPPKK(n1,n2,n3,n4,n5,n6,q2,q1)
. +Cv(C0i+cc122222,ep)*pvSPPPPPK(n1,n2,n3,n4,n5,n6,q2,q1)
. +Cv(C0i+cc222222,ep)*q2(n1)*q2(n2)*q2(n3)*q2(n4)*q2(n5)*q2(n6)
enddo
enddo
enddo
enddo
enddo
enddo
enddo
if ((maxcindex .eq. 6) .and. (pvRespectmaxcindex)) then
if (pvCitry(C0i) .eq. -1) then
call pvCcheck(6,q1,q2,m1s,m2s,m3s,
& FC0,FC1,FC2,FC3,FC4,FC5,FC6,failed)
if (failed) then
c write(6,*) 'recursion in pvCtensor'
itry=itry+1
goto 11
endif
pvCitry(C0i)=itry
c if (itry .gt. 0) then
c write(6,*) 'pvCtensor success: itry=',itry
c endif
endif
return
endif
do ep=-2,0
do n1=1,4
do n2=n1,4
do n3=n2,4
do n4=n3,4
do n5=n4,4
do n6=n5,4
do n7=n6,4
c--- crude implementation of FC7 (used for checking only)
include 'lib/TensorReduction/Include/pvFC7.f'
enddo
enddo
enddo
enddo
enddo
enddo
enddo
enddo
return
end