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.
206 lines
6.2 KiB
206 lines
6.2 KiB
************************************************************************
|
|
* This is the file avh_oni_func.f of the package *
|
|
* *
|
|
* Oneloop with Numerical Integration *
|
|
* *
|
|
* for the evaluation of 1-loop scalar 1-, 2-, 3- and 4-point functions *
|
|
* *
|
|
* author: Andreas van Hameren <hamerenREMOVETHIS@ifj.edu.pl> *
|
|
* date: 15-12-2010 *
|
|
************************************************************************
|
|
* *
|
|
* Have a look at the file avh_oni_hello.f for more information. *
|
|
* *
|
|
************************************************************************
|
|
|
|
|
|
subroutine avh_oni_conv(zz,iz ,xx,sgn)
|
|
* ********************************************************************
|
|
* * Determine zz,iz such that xx = zz*exp(iz*imag*pi) and Re(zz)
|
|
* * is positive. If Im(x)=0 and Re(x)<0 then iz becomes the
|
|
* * sign of sgn .
|
|
* ********************************************************************
|
|
implicit none
|
|
double complex zz,xx
|
|
double precision sgn
|
|
integer iz
|
|
double precision
|
|
& xre,xim
|
|
xre = dreal(xx)
|
|
if (xre.ge.0d0) then
|
|
zz = xx
|
|
iz = 0
|
|
else
|
|
xim = dimag(xx)
|
|
if (xim.eq.0d0) then
|
|
zz = dcmplx(-xre,0d0)
|
|
iz = idnint(dsign(1d0,sgn))
|
|
else
|
|
zz = -xx
|
|
iz = idnint(dsign(1d0,xim)) ! xim = -Im(zz)
|
|
endif
|
|
endif
|
|
end
|
|
|
|
|
|
subroutine avh_oni_rat(zz,iz ,yy,iy ,xx,ix)
|
|
* ********************************************************************
|
|
* * Return the ratio zz of yy and xx
|
|
* * keeping track of (the multiple of pi of) the phase iz such that
|
|
* * the real part of zz remains positive
|
|
* ********************************************************************
|
|
implicit none
|
|
double complex zz,yy,xx
|
|
integer iz,iy,ix
|
|
zz = yy/xx
|
|
iz = iy-ix
|
|
if (dreal(zz).lt.0d0) then
|
|
iz = iz - idnint(dsign(1d0,dimag(xx)))
|
|
zz = -zz
|
|
endif
|
|
end
|
|
|
|
|
|
function avh_oni_logc(xx,iph)
|
|
* ********************************************************************
|
|
* * Returns log( |Re(xx)| + imag*Im(xx) ) + imag*pi*iph
|
|
* ********************************************************************
|
|
implicit none
|
|
double complex xx ,avh_oni_logc
|
|
double precision
|
|
& pi ,avh_oni_pi
|
|
integer iph
|
|
&,init ,avh_oni_un_get
|
|
data init/0/
|
|
save init,pi
|
|
*
|
|
if (init.eq.0) then
|
|
init = 1
|
|
pi = avh_oni_pi()
|
|
endif
|
|
*
|
|
if (xx.eq.dcmplx(0d0)) then
|
|
if (avh_oni_un_get().gt.0) write(avh_oni_un_get(),*)
|
|
& 'ERROR in avh_oni_logc: xx =',xx
|
|
avh_oni_logc = dcmplx(0d0)
|
|
else
|
|
avh_oni_logc = cdlog( dcmplx(dabs(dreal(xx)),dimag(xx)) ) !CDLOGyes
|
|
& + dcmplx(0d0,iph*pi)
|
|
endif
|
|
end
|
|
|
|
|
|
function avh_oni_loga2(xx,iph)
|
|
* ********************************************************************
|
|
* * log(xx)/(1-xx) with xx = log|xx| + imag*pi*iph
|
|
* ********************************************************************
|
|
implicit none
|
|
double complex avh_oni_loga2
|
|
&,avh_oni_loga
|
|
double precision xx,omx
|
|
&,thrs,avh_oni_prec
|
|
integer iph
|
|
&,init ,avh_oni_un_get
|
|
data init/0/
|
|
save init,thrs
|
|
*
|
|
if (init.eq.0) then
|
|
init = 1
|
|
thrs = 1d1*avh_oni_prec()
|
|
endif
|
|
*
|
|
if (iph.eq.iph/2*2) then
|
|
omx = 1d0-dabs(xx)
|
|
else
|
|
omx = 1d0+dabs(xx)
|
|
endif
|
|
*
|
|
if (iph.ne.0) then
|
|
if (omx.eq.0d0) then
|
|
if (avh_oni_un_get().gt.0) write(avh_oni_un_get(),*)
|
|
& 'ERROR in avh_oni_loga2: 1-xx,iph=',omx,iph
|
|
avh_oni_loga2 = dcmplx(0d0)
|
|
else
|
|
avh_oni_loga2 = avh_oni_loga(xx,iph)/dcmplx(omx)
|
|
endif
|
|
else
|
|
if (dabs(omx).lt.thrs) then
|
|
avh_oni_loga2 = dcmplx(-1d0-omx/2d0)
|
|
else
|
|
avh_oni_loga2 = avh_oni_loga(xx,iph)/dcmplx(omx)
|
|
endif
|
|
endif
|
|
end
|
|
|
|
|
|
function avh_oni_loga(xx,iph)
|
|
* ********************************************************************
|
|
* * log( |xx|*exp(imag*pi*iph) ) = log|xx| + imag*pi*iph
|
|
* ********************************************************************
|
|
implicit none
|
|
double complex avh_oni_loga
|
|
double precision xx
|
|
&,rr,pi ,avh_oni_pi
|
|
integer iph
|
|
&,init ,avh_oni_un_get
|
|
data init/0/
|
|
save init,pi
|
|
*
|
|
if (init.eq.0) then
|
|
init = 1
|
|
pi = avh_oni_pi()
|
|
endif
|
|
*
|
|
rr = dabs(xx)
|
|
if (rr.eq.0d0.and.avh_oni_un_get().gt.0) write(avh_oni_un_get(),*)
|
|
& 'ERROR in avh_oni_loga: |xx|=',rr
|
|
avh_oni_loga = dcmplx(dlog(rr),iph*pi)
|
|
end
|
|
|
|
|
|
function avh_oni_pi()
|
|
* ********************************************************************
|
|
* * the number pi=3.14...
|
|
* ********************************************************************
|
|
implicit none
|
|
double precision avh_oni_pi
|
|
&,pi
|
|
integer
|
|
& init
|
|
data init/0/
|
|
save init,pi
|
|
*
|
|
if (init.eq.0) then
|
|
init = 1
|
|
pi = 4*datan(1d0)
|
|
endif
|
|
avh_oni_pi = pi
|
|
end
|
|
|
|
|
|
function avh_oni_prec()
|
|
* ********************************************************************
|
|
* * the smallest number prec satisfying 1+prec = dexp(dlog(1+prec))
|
|
* ********************************************************************
|
|
implicit none
|
|
double precision avh_oni_prec
|
|
&,prec,xx,yy
|
|
integer
|
|
& init ,avh_oni_un_get
|
|
data init/0/
|
|
save init,prec
|
|
*
|
|
if (init.eq.0) then
|
|
init = 1
|
|
xx = 1d0
|
|
yy = xx
|
|
do while (xx.eq.yy)
|
|
prec = xx
|
|
xx = xx/2
|
|
yy = -1d0+dexp(dlog(1d0+xx))
|
|
enddo
|
|
if (avh_oni_un_get().gt.0) write(avh_oni_un_get(),*)
|
|
& 'MESSAGE from avh_oni_prec: precision set to',prec
|
|
endif
|
|
avh_oni_prec = prec
|
|
end
|