PROGRAM MAKEMRS98 * This is an interface to the MRS98 parton distribution routine * that produces a smoothed table in the standard form. * D. E. Soper and P. Anandam. 17 June 1998. * Lambda values corrected, 5 December 1002, DES. DOUBLE PRECISION X,LX,LXMIN,LXMAX,DELTALX DOUBLE PRECISION MU,LMU,LMUMIN,LMUMAX,DELTALMU INTEGER ISET DOUBLE PRECISION UPV,DNV,USEA,DSEA,STR,CHM,BOT,GLU CHARACTER*100 HEADER DOUBLE PRECISION LAMBDA(5) INTEGER LAMBDAFLAVORS DOUBLE PRECISION XMIN,XMAX INTEGER NX DOUBLE PRECISION MUMIN,MUMAX INTEGER NMU CHARACTER*20 FILENAME(5) CHARACTER*20 NAME(5) INTEGER I,N,M DOUBLE PRECISION PTN(-2:6, 64, 64) DOUBLE PRECISION A, B, ANGL DOUBLE PRECISION AP, BP, CP, TG, PT DATA FILENAME /'mrst98_1.ptn', 'mrst98_2.ptn', $ 'mrst98_3.ptn', 'mrst98_4.ptn', 'mrst98_5.ptn'/ DATA NAME /'MRST(1)','MRST(2)','MRST(3)','MRST(4)','MRST(5)'/ DATA LAMBDA /0.220D0,0.220D0,0.220D0,0.165D0,0.289D0/ LAMBDAFLAVORS = 5 XMIN = 0.1000000000D-04 XMAX = 0.9500000000D0 NX = 32 MUMIN = DSQRT(1.25D0) MUMAX = DSQRT(1D7) NMU = 32 DO ISET=1,5 WRITE(*,*) 'Making ',FILENAME(ISET) OPEN(UNIT = 99, FILE = FILENAME(ISET), STATUS = 'UNKNOWN') HEADER = '! ' // NAME(ISET)(1:7) // $ ' distribution generated by DES, 5 December 2002' WRITE(99,*)HEADER WRITE(99,*)'!' WRITE(99,*)'PARTON DATA' WRITE(99,*)' VERSION = 110496' WRITE(99,103)LAMBDA(ISET) 103 FORMAT(' LAMBDA',' = ',G20.10) WRITE(99,104)LAMBDAFLAVORS 104 FORMAT('NFL_LAMBDA',' = ',I10) WRITE(99,105)XMIN 105 FORMAT(' XMIN',' = ',G20.10) WRITE(99,106)XMAX 106 FORMAT(' XMAX',' = ',G20.10) WRITE(99,107)NX 107 FORMAT(' N_XPOINTS',' = ',I10) WRITE(99,108)MUMIN 108 FORMAT(' MUMIN',' = ',G20.10) WRITE(99,109)MUMAX 109 FORMAT(' MUMAX',' = ',G20.10) WRITE(99,110)NMU 110 FORMAT('N_MUPOINTS',' = ',I10) * Calculate lattice info. LXMIN = DLOG(XMIN/(1.0D0 - XMIN)) LXMAX = DLOG(XMAX/(1.0D0 - XMAX)) DELTALX = (LXMAX - LXMIN)/(NX-1) LMUMIN = DLOG(MUMIN) LMUMAX = DLOG(MUMAX) DELTALMU = (LMUMAX - LMUMIN)/(NMU-1) LX = LXMIN - DELTALX DO N=1,NX LX = LX + DELTALX X = DEXP(LX)/(1.0D0+DEXP(LX)) LMU = LMUMIN - DELTALMU DO M=1,NMU LMU = LMU + DELTALMU MU = DEXP(LMU) CALL MRS98(X,MU,ISET,UPV,DNV,USEA,DSEA,STR,CHM,BOT,GLU) PTN(-2,N,M) = DBLE(DSEA)/X PTN(-1,N,M) = DBLE(USEA)/X PTN(0,N,M) = DBLE(GLU)/X PTN(1,N,M) = DBLE(UPV+USEA)/X PTN(2,N,M) = DBLE(DNV+DSEA)/X PTN(3,N,M) = DBLE(STR)/X PTN(4,N,M) = DBLE(CHM)/X PTN(5,N,M) = DBLE(BOT)/X PTN(6,N,M) = 0D0 * MRS98 sometimes returns negative values for the parton distributions. * We check for that and set those values to zero. DO I = -2, 6 IF (PTN(I,N,M).LT.0D0) THEN PTN(I,N,M) = 0D0 ENDIF ENDDO DO I = -2, 6 PTN(I,N,M) = DLOG(1.0D-16 + PTN(I,N,M)) ENDDO ENDDO ENDDO * Smooth out the distributions DO I = -2, 6 DO M = 1, NMU DO N = 2, NX * The distributions should be monotonically decreasing functions in x IF (PTN(I,N-1,M).LT.PTN(I,N,M)) $ PTN(I,N,M) = PTN(I,N-1,M) ENDDO ENDDO ENDDO DO I = -2, 6 DO M = 1, NMU DO N = 2, NX * The distributions shouldn't fall to zero too sharply IF ( (PTN(I,N,M).LT.DLOG(1D-14)) . AND. $ (PTN(I,N-1,M).GT.DLOG(1D-10)) ) $ PTN(I,N,M) = (PTN(I,N-1,M)+PTN(I,N,M)) / 2D0 ENDDO ENDDO ENDDO * Check for smoothness by looking at angles DO I = -2, 6 DO M = 1, NMU DO N = 2, NX-1 IF (PTN(I,N+1,M).GT.DLOG(1D-14)) THEN A = PTN(I,N,M) - PTN(I,N-1,M) B = PTN(I,N+1,M) - PTN(I,N,M) ANGL = DATAN((B-A)/(1D0+B*A))/3.1415D0*180D0 IF (ANGL.LT.-20D0) THEN TG = DTAN( DSIGN(20D0 / 180D0 * 3.14159D0,ANGL)) AP = - TG BP = TG*PTN(I,N+1,M) + TG*PTN(I,N-1,M) + 2D0 CP = TG - TG*PTN(I,N+1,M)*PTN(I,N-1,M) $ - PTN(I,N+1,M) - PTN(I,N-1,M) PT = (-BP + DSQRT(BP**2-4D0*AP*CP)) $ /(2*AP) PTN(I,N,M) = PT ENDIF IF (ANGL.GT.15D0) THEN PT = (PTN(I,N+1,M) + PTN(I,N-1,M))/2D0 PTN(I,N,M) = PT ENDIF ENDIF ENDDO ENDDO ENDDO * The smoothed parton distributions are written out Do N = 1, Nx Do M = 1, Nmu Write(99,'(9g13.5)') (Ptn(I,N,M), I=-2,6) Enddo Enddo CLOSE(99) ENDDO STOP END subroutine mrs98(x,q,mode,upv,dnv,usea,dsea,str,chm,bot,glu) C****************************************************************C C C C This is a package for the new MRS 1998 parton C C distributions. The format is similar to the previous C C (1996) MRS-R series. C C C C As before, x times the parton distribution is returned, C C q is the scale in GeV, MSbar factorization is assumed, C C and Lambda(MSbar,nf=4) is given below for each set. C C C C TEMPORARY NAMING SCHEME: C C C C mode set comment L(4)/MeV a_s(M_Z) grid#1 C C ---- --- ------- -------- ------- ------ C C C C 1 FT08A central gluon, a_s 300 0.1175 0.00561 C C 2 FT09A higher gluon 300 0.1175 0.00510 C C 3 FT11A lower gluon 300 0.1175 0.00408 C C 4 FT24A lower a_s 229 0.1125 0.00586 C C 5 FT23A higher a_s 383 0.1225 0.00410 C C C C C C The corresponding grid files are called ft08a.dat etc. C C C C The reference is: C C A.D. Martin, R.G. Roberts, W.J. Stirling, R.S Thorne C C Univ. Durham preprint DTP/98/??, hep-ph/??????? (1998) C C C C Comments to : W.J.Stirling@durham.ac.uk C C C C C C****************************************************************C implicit real*8(a-h,o-z) data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ q2=q*q if(q2.lt.qsqmin.or.q2.gt.qsqmax) print 99 if(x.lt.xmin.or.x.gt.xmax) print 98 if(mode.eq.1) then call mrs981(x,q2,upv,dnv,usea,dsea,str,chm,bot,glu) elseif(mode.eq.2) then call mrs982(x,q2,upv,dnv,usea,dsea,str,chm,bot,glu) elseif(mode.eq.3) then call mrs983(x,q2,upv,dnv,usea,dsea,str,chm,bot,glu) elseif(mode.eq.4) then call mrs984(x,q2,upv,dnv,usea,dsea,str,chm,bot,glu) elseif(mode.eq.5) then call mrs985(x,q2,upv,dnv,usea,dsea,str,chm,bot,glu) endif 99 format(' WARNING: Q^2 VALUE IS OUT OF RANGE ') 98 format(' WARNING: X VALUE IS OUT OF RANGE ') return end subroutine mrs981(x,qsq,upv,dnv,usea,dsea,str,chm,bot,glu) implicit real*8(a-h,o-z) parameter(nx=49,nq=37,ntenth=23,np=8) real*8 f(np,nx,nq+1),qq(nq),xx(nx),g(np),n0(np) data xx/1d-5,2d-5,4d-5,6d-5,8d-5, . 1d-4,2d-4,4d-4,6d-4,8d-4, . 1d-3,2d-3,4d-3,6d-3,8d-3, . 1d-2,1.4d-2,2d-2,3d-2,4d-2,6d-2,8d-2, . .1d0,.125d0,.15d0,.175d0,.2d0,.225d0,.25d0,.275d0, . .3d0,.325d0,.35d0,.375d0,.4d0,.425d0,.45d0,.475d0, . .5d0,.525d0,.55d0,.575d0,.6d0,.65d0,.7d0,.75d0, . .8d0,.9d0,1d0/ data qq/1.25d0,1.5d0,2d0,2.5d0,3.2d0,4d0,5d0,6.4d0,8d0,1d1, . 1.2d1,1.8d1,2.6d1,4d1,6.4d1,1d2, . 1.6d2,2.4d2,4d2,6.4d2,1d3,1.8d3,3.2d3,5.6d3,1d4, . 1.8d4,3.2d4,5.6d4,1d5,1.8d5,3.2d5,5.6d5,1d6, . 1.8d6,3.2d6,5.6d6,1d7/ data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ data n0/3,4,5,9,9,9,9,9/ data init/0/ save xsave=x q2save=qsq if(init.ne.0) goto 10 open(unit=1,file='ft08a.dat',status='old') do 20 n=1,nx-1 do 20 m=1,nq read(1,50)f(1,n,m),f(2,n,m),f(3,n,m),f(4,n,m), . f(5,n,m),f(7,n,m),f(6,n,m),f(8,n,m) c notation: 1=uval 2=val 3=glue 4=usea 5=chm 6=str 7=btm 8=dsea do 25 i=1,np 25 f(i,n,m)=f(i,n,m)/(1d0-xx(n))**n0(i) 20 continue do 31 j=1,ntenth-1 xx(j)=dlog10(xx(j)/xx(ntenth))+xx(ntenth) do 31 i=1,8 if(i.eq.5.or.i.eq.7) goto 31 do 30 k=1,nq 30 f(i,j,k)=dlog10(f(i,j,k)/f(i,ntenth,k))+f(i,ntenth,k) 31 continue 50 format(8f10.5) do 40 i=1,np do 40 m=1,nq 40 f(i,nx,m)=0d0 init=1 10 continue if(x.lt.xmin) x=xmin if(x.gt.xmax) x=xmax if(qsq.lt.qsqmin) qsq=qsqmin if(qsq.gt.qsqmax) qsq=qsqmax xxx=x if(x.lt.xx(ntenth)) xxx=dlog10(x/xx(ntenth))+xx(ntenth) n=0 70 n=n+1 if(xxx.gt.xx(n+1)) goto 70 a=(xxx-xx(n))/(xx(n+1)-xx(n)) m=0 80 m=m+1 if(qsq.gt.qq(m+1)) goto 80 b=(qsq-qq(m))/(qq(m+1)-qq(m)) do 60 i=1,np g(i)= (1d0-a)*(1d0-b)*f(i,n,m) + (1d0-a)*b*f(i,n,m+1) . + a*(1d0-b)*f(i,n+1,m) + a*b*f(i,n+1,m+1) if(n.ge.ntenth) goto 65 if(i.eq.5.or.i.eq.7) goto 65 fac=(1d0-b)*f(i,ntenth,m)+b*f(i,ntenth,m+1) g(i)=fac*10d0**(g(i)-fac) 65 continue g(i)=g(i)*(1d0-x)**n0(i) 60 continue upv=g(1) dnv=g(2) usea=g(4) dsea=g(8) str=g(6) chm=g(5) glu=g(3) bot=g(7) x=xsave qsq=q2save return end subroutine mrs982(x,qsq,upv,dnv,usea,dsea,str,chm,bot,glu) implicit real*8(a-h,o-z) parameter(nx=49,nq=37,ntenth=23,np=8) real*8 f(np,nx,nq+1),qq(nq),xx(nx),g(np),n0(np) data xx/1d-5,2d-5,4d-5,6d-5,8d-5, . 1d-4,2d-4,4d-4,6d-4,8d-4, . 1d-3,2d-3,4d-3,6d-3,8d-3, . 1d-2,1.4d-2,2d-2,3d-2,4d-2,6d-2,8d-2, . .1d0,.125d0,.15d0,.175d0,.2d0,.225d0,.25d0,.275d0, . .3d0,.325d0,.35d0,.375d0,.4d0,.425d0,.45d0,.475d0, . .5d0,.525d0,.55d0,.575d0,.6d0,.65d0,.7d0,.75d0, . .8d0,.9d0,1d0/ data qq/1.25d0,1.5d0,2d0,2.5d0,3.2d0,4d0,5d0,6.4d0,8d0,1d1, . 1.2d1,1.8d1,2.6d1,4d1,6.4d1,1d2, . 1.6d2,2.4d2,4d2,6.4d2,1d3,1.8d3,3.2d3,5.6d3,1d4, . 1.8d4,3.2d4,5.6d4,1d5,1.8d5,3.2d5,5.6d5,1d6, . 1.8d6,3.2d6,5.6d6,1d7/ data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ data n0/3,4,5,9,9,9,9,9/ data init/0/ save xsave=x q2save=qsq if(init.ne.0) goto 10 open(unit=1,file='ft09a.dat',status='old') do 20 n=1,nx-1 do 20 m=1,nq read(1,50)f(1,n,m),f(2,n,m),f(3,n,m),f(4,n,m), . f(5,n,m),f(7,n,m),f(6,n,m),f(8,n,m) c notation: 1=uval 2=val 3=glue 4=usea 5=chm 6=str 7=btm 8=dsea do 25 i=1,np 25 f(i,n,m)=f(i,n,m)/(1d0-xx(n))**n0(i) 20 continue do 31 j=1,ntenth-1 xx(j)=dlog10(xx(j)/xx(ntenth))+xx(ntenth) do 31 i=1,8 if(i.eq.5.or.i.eq.7) goto 31 do 30 k=1,nq 30 f(i,j,k)=dlog10(f(i,j,k)/f(i,ntenth,k))+f(i,ntenth,k) 31 continue 50 format(8f10.5) do 40 i=1,np do 40 m=1,nq 40 f(i,nx,m)=0d0 init=1 10 continue if(x.lt.xmin) x=xmin if(x.gt.xmax) x=xmax if(qsq.lt.qsqmin) qsq=qsqmin if(qsq.gt.qsqmax) qsq=qsqmax xxx=x if(x.lt.xx(ntenth)) xxx=dlog10(x/xx(ntenth))+xx(ntenth) n=0 70 n=n+1 if(xxx.gt.xx(n+1)) goto 70 a=(xxx-xx(n))/(xx(n+1)-xx(n)) m=0 80 m=m+1 if(qsq.gt.qq(m+1)) goto 80 b=(qsq-qq(m))/(qq(m+1)-qq(m)) do 60 i=1,np g(i)= (1d0-a)*(1d0-b)*f(i,n,m) + (1d0-a)*b*f(i,n,m+1) . + a*(1d0-b)*f(i,n+1,m) + a*b*f(i,n+1,m+1) if(n.ge.ntenth) goto 65 if(i.eq.5.or.i.eq.7) goto 65 fac=(1d0-b)*f(i,ntenth,m)+b*f(i,ntenth,m+1) g(i)=fac*10d0**(g(i)-fac) 65 continue g(i)=g(i)*(1d0-x)**n0(i) 60 continue upv=g(1) dnv=g(2) usea=g(4) dsea=g(8) str=g(6) chm=g(5) glu=g(3) bot=g(7) x=xsave qsq=q2save return end subroutine mrs983(x,qsq,upv,dnv,usea,dsea,str,chm,bot,glu) implicit real*8(a-h,o-z) parameter(nx=49,nq=37,ntenth=23,np=8) real*8 f(np,nx,nq+1),qq(nq),xx(nx),g(np),n0(np) data xx/1d-5,2d-5,4d-5,6d-5,8d-5, . 1d-4,2d-4,4d-4,6d-4,8d-4, . 1d-3,2d-3,4d-3,6d-3,8d-3, . 1d-2,1.4d-2,2d-2,3d-2,4d-2,6d-2,8d-2, . .1d0,.125d0,.15d0,.175d0,.2d0,.225d0,.25d0,.275d0, . .3d0,.325d0,.35d0,.375d0,.4d0,.425d0,.45d0,.475d0, . .5d0,.525d0,.55d0,.575d0,.6d0,.65d0,.7d0,.75d0, . .8d0,.9d0,1d0/ data qq/1.25d0,1.5d0,2d0,2.5d0,3.2d0,4d0,5d0,6.4d0,8d0,1d1, . 1.2d1,1.8d1,2.6d1,4d1,6.4d1,1d2, . 1.6d2,2.4d2,4d2,6.4d2,1d3,1.8d3,3.2d3,5.6d3,1d4, . 1.8d4,3.2d4,5.6d4,1d5,1.8d5,3.2d5,5.6d5,1d6, . 1.8d6,3.2d6,5.6d6,1d7/ data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ data n0/3,4,5,9,9,9,9,9/ data init/0/ save xsave=x q2save=qsq if(init.ne.0) goto 10 open(unit=1,file='ft11a.dat',status='old') do 20 n=1,nx-1 do 20 m=1,nq read(1,50)f(1,n,m),f(2,n,m),f(3,n,m),f(4,n,m), . f(5,n,m),f(7,n,m),f(6,n,m),f(8,n,m) c notation: 1=uval 2=val 3=glue 4=usea 5=chm 6=str 7=btm 8=dsea do 25 i=1,np 25 f(i,n,m)=f(i,n,m)/(1d0-xx(n))**n0(i) 20 continue do 31 j=1,ntenth-1 xx(j)=dlog10(xx(j)/xx(ntenth))+xx(ntenth) do 31 i=1,8 if(i.eq.5.or.i.eq.7) goto 31 do 30 k=1,nq 30 f(i,j,k)=dlog10(f(i,j,k)/f(i,ntenth,k))+f(i,ntenth,k) 31 continue 50 format(8f10.5) do 40 i=1,np do 40 m=1,nq 40 f(i,nx,m)=0d0 init=1 10 continue if(x.lt.xmin) x=xmin if(x.gt.xmax) x=xmax if(qsq.lt.qsqmin) qsq=qsqmin if(qsq.gt.qsqmax) qsq=qsqmax xxx=x if(x.lt.xx(ntenth)) xxx=dlog10(x/xx(ntenth))+xx(ntenth) n=0 70 n=n+1 if(xxx.gt.xx(n+1)) goto 70 a=(xxx-xx(n))/(xx(n+1)-xx(n)) m=0 80 m=m+1 if(qsq.gt.qq(m+1)) goto 80 b=(qsq-qq(m))/(qq(m+1)-qq(m)) do 60 i=1,np g(i)= (1d0-a)*(1d0-b)*f(i,n,m) + (1d0-a)*b*f(i,n,m+1) . + a*(1d0-b)*f(i,n+1,m) + a*b*f(i,n+1,m+1) if(n.ge.ntenth) goto 65 if(i.eq.5.or.i.eq.7) goto 65 fac=(1d0-b)*f(i,ntenth,m)+b*f(i,ntenth,m+1) g(i)=fac*10d0**(g(i)-fac) 65 continue g(i)=g(i)*(1d0-x)**n0(i) 60 continue upv=g(1) dnv=g(2) usea=g(4) dsea=g(8) str=g(6) chm=g(5) glu=g(3) bot=g(7) x=xsave qsq=q2save return end subroutine mrs984(x,qsq,upv,dnv,usea,dsea,str,chm,bot,glu) implicit real*8(a-h,o-z) parameter(nx=49,nq=37,ntenth=23,np=8) real*8 f(np,nx,nq+1),qq(nq),xx(nx),g(np),n0(np) data xx/1d-5,2d-5,4d-5,6d-5,8d-5, . 1d-4,2d-4,4d-4,6d-4,8d-4, . 1d-3,2d-3,4d-3,6d-3,8d-3, . 1d-2,1.4d-2,2d-2,3d-2,4d-2,6d-2,8d-2, . .1d0,.125d0,.15d0,.175d0,.2d0,.225d0,.25d0,.275d0, . .3d0,.325d0,.35d0,.375d0,.4d0,.425d0,.45d0,.475d0, . .5d0,.525d0,.55d0,.575d0,.6d0,.65d0,.7d0,.75d0, . .8d0,.9d0,1d0/ data qq/1.25d0,1.5d0,2d0,2.5d0,3.2d0,4d0,5d0,6.4d0,8d0,1d1, . 1.2d1,1.8d1,2.6d1,4d1,6.4d1,1d2, . 1.6d2,2.4d2,4d2,6.4d2,1d3,1.8d3,3.2d3,5.6d3,1d4, . 1.8d4,3.2d4,5.6d4,1d5,1.8d5,3.2d5,5.6d5,1d6, . 1.8d6,3.2d6,5.6d6,1d7/ data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ data n0/3,4,5,9,9,9,9,9/ data init/0/ save xsave=x q2save=qsq if(init.ne.0) goto 10 open(unit=1,file='ft24a.dat',status='old') do 20 n=1,nx-1 do 20 m=1,nq read(1,50)f(1,n,m),f(2,n,m),f(3,n,m),f(4,n,m), . f(5,n,m),f(7,n,m),f(6,n,m),f(8,n,m) c notation: 1=uval 2=val 3=glue 4=usea 5=chm 6=str 7=btm 8=dsea do 25 i=1,np 25 f(i,n,m)=f(i,n,m)/(1d0-xx(n))**n0(i) 20 continue do 31 j=1,ntenth-1 xx(j)=dlog10(xx(j)/xx(ntenth))+xx(ntenth) do 31 i=1,8 if(i.eq.5.or.i.eq.7) goto 31 do 30 k=1,nq 30 f(i,j,k)=dlog10(f(i,j,k)/f(i,ntenth,k))+f(i,ntenth,k) 31 continue 50 format(8f10.5) do 40 i=1,np do 40 m=1,nq 40 f(i,nx,m)=0d0 init=1 10 continue if(x.lt.xmin) x=xmin if(x.gt.xmax) x=xmax if(qsq.lt.qsqmin) qsq=qsqmin if(qsq.gt.qsqmax) qsq=qsqmax xxx=x if(x.lt.xx(ntenth)) xxx=dlog10(x/xx(ntenth))+xx(ntenth) n=0 70 n=n+1 if(xxx.gt.xx(n+1)) goto 70 a=(xxx-xx(n))/(xx(n+1)-xx(n)) m=0 80 m=m+1 if(qsq.gt.qq(m+1)) goto 80 b=(qsq-qq(m))/(qq(m+1)-qq(m)) do 60 i=1,np g(i)= (1d0-a)*(1d0-b)*f(i,n,m) + (1d0-a)*b*f(i,n,m+1) . + a*(1d0-b)*f(i,n+1,m) + a*b*f(i,n+1,m+1) if(n.ge.ntenth) goto 65 if(i.eq.5.or.i.eq.7) goto 65 fac=(1d0-b)*f(i,ntenth,m)+b*f(i,ntenth,m+1) g(i)=fac*10d0**(g(i)-fac) 65 continue g(i)=g(i)*(1d0-x)**n0(i) 60 continue upv=g(1) dnv=g(2) usea=g(4) dsea=g(8) str=g(6) chm=g(5) glu=g(3) bot=g(7) x=xsave qsq=q2save return end subroutine mrs985(x,qsq,upv,dnv,usea,dsea,str,chm,bot,glu) implicit real*8(a-h,o-z) parameter(nx=49,nq=37,ntenth=23,np=8) real*8 f(np,nx,nq+1),qq(nq),xx(nx),g(np),n0(np) data xx/1d-5,2d-5,4d-5,6d-5,8d-5, . 1d-4,2d-4,4d-4,6d-4,8d-4, . 1d-3,2d-3,4d-3,6d-3,8d-3, . 1d-2,1.4d-2,2d-2,3d-2,4d-2,6d-2,8d-2, . .1d0,.125d0,.15d0,.175d0,.2d0,.225d0,.25d0,.275d0, . .3d0,.325d0,.35d0,.375d0,.4d0,.425d0,.45d0,.475d0, . .5d0,.525d0,.55d0,.575d0,.6d0,.65d0,.7d0,.75d0, . .8d0,.9d0,1d0/ data qq/1.25d0,1.5d0,2d0,2.5d0,3.2d0,4d0,5d0,6.4d0,8d0,1d1, . 1.2d1,1.8d1,2.6d1,4d1,6.4d1,1d2, . 1.6d2,2.4d2,4d2,6.4d2,1d3,1.8d3,3.2d3,5.6d3,1d4, . 1.8d4,3.2d4,5.6d4,1d5,1.8d5,3.2d5,5.6d5,1d6, . 1.8d6,3.2d6,5.6d6,1d7/ data xmin,xmax,qsqmin,qsqmax/1d-5,1d0,1.25d0,1d7/ data n0/3,4,5,9,9,9,9,9/ data init/0/ save xsave=x q2save=qsq if(init.ne.0) goto 10 open(unit=1,file='ft23a.dat',status='old') do 20 n=1,nx-1 do 20 m=1,nq read(1,50)f(1,n,m),f(2,n,m),f(3,n,m),f(4,n,m), . f(5,n,m),f(7,n,m),f(6,n,m),f(8,n,m) c notation: 1=uval 2=val 3=glue 4=usea 5=chm 6=str 7=btm 8=dsea do 25 i=1,np 25 f(i,n,m)=f(i,n,m)/(1d0-xx(n))**n0(i) 20 continue do 31 j=1,ntenth-1 xx(j)=dlog10(xx(j)/xx(ntenth))+xx(ntenth) do 31 i=1,8 if(i.eq.5.or.i.eq.7) goto 31 do 30 k=1,nq 30 f(i,j,k)=dlog10(f(i,j,k)/f(i,ntenth,k))+f(i,ntenth,k) 31 continue 50 format(8f10.5) do 40 i=1,np do 40 m=1,nq 40 f(i,nx,m)=0d0 init=1 10 continue if(x.lt.xmin) x=xmin if(x.gt.xmax) x=xmax if(qsq.lt.qsqmin) qsq=qsqmin if(qsq.gt.qsqmax) qsq=qsqmax xxx=x if(x.lt.xx(ntenth)) xxx=dlog10(x/xx(ntenth))+xx(ntenth) n=0 70 n=n+1 if(xxx.gt.xx(n+1)) goto 70 a=(xxx-xx(n))/(xx(n+1)-xx(n)) m=0 80 m=m+1 if(qsq.gt.qq(m+1)) goto 80 b=(qsq-qq(m))/(qq(m+1)-qq(m)) do 60 i=1,np g(i)= (1d0-a)*(1d0-b)*f(i,n,m) + (1d0-a)*b*f(i,n,m+1) . + a*(1d0-b)*f(i,n+1,m) + a*b*f(i,n+1,m+1) if(n.ge.ntenth) goto 65 if(i.eq.5.or.i.eq.7) goto 65 fac=(1d0-b)*f(i,ntenth,m)+b*f(i,ntenth,m+1) g(i)=fac*10d0**(g(i)-fac) 65 continue g(i)=g(i)*(1d0-x)**n0(i) 60 continue upv=g(1) dnv=g(2) usea=g(4) dsea=g(8) str=g(6) chm=g(5) glu=g(3) bot=g(7) x=xsave qsq=q2save return end