29 lines
930 B
Fortran
29 lines
930 B
Fortran
FUNCTION rf(x,y,z)
|
|
REAL rf,x,y,z,ERRTOL,TINY,BIG,THIRD,C1,C2,C3,C4
|
|
PARAMETER (ERRTOL=.08,TINY=1.5e-38,BIG=3.E37,THIRD=1./3.,
|
|
*C1=1./24.,C2=.1,C3=3./44.,C4=1./14.)
|
|
REAL alamb,ave,delx,dely,delz,e2,e3,sqrtx,sqrty,sqrtz,xt,yt,zt
|
|
if(min(x,y,z).lt.0..or.min(x+y,x+z,y+z).lt.TINY.or.max(x,y,
|
|
*z).gt.BIG)pause 'invalid arguments in rf'
|
|
xt=x
|
|
yt=y
|
|
zt=z
|
|
1 continue
|
|
sqrtx=sqrt(xt)
|
|
sqrty=sqrt(yt)
|
|
sqrtz=sqrt(zt)
|
|
alamb=sqrtx*(sqrty+sqrtz)+sqrty*sqrtz
|
|
xt=.25*(xt+alamb)
|
|
yt=.25*(yt+alamb)
|
|
zt=.25*(zt+alamb)
|
|
ave=THIRD*(xt+yt+zt)
|
|
delx=(ave-xt)/ave
|
|
dely=(ave-yt)/ave
|
|
delz=(ave-zt)/ave
|
|
if(max(abs(delx),abs(dely),abs(delz)).gt.ERRTOL)goto 1
|
|
e2=delx*dely-delz**2
|
|
e3=delx*dely*delz
|
|
rf=(1.+(C1*e2-C2-C3*e3)*e2+C4*e3)/sqrt(ave)
|
|
return
|
|
END
|