* V. Guzey, July 2010, JLab * Nuclear IMPACT-PARAMETER-DEPENDENT parton distributions * in the leading twist theory of nuclear shadowing * L. Frankfurt, V. Guzey and M. Strikman, Phys. Rept. (in preparation) * Suggested abbreviation: FGS10 * For the nucleus of Ca-40 * FOR ANY GIVEN VALUE OF BJORKEN X (10^{-5} < X < 0.95), * Q^2 (4 < Q^2 < 16,000) GEV^2 AND IMPACT PARAMETER B (0 < b < 10 fm), * THE CODE GIVES THE RATIOS OF NUCLEAR TO FREE * NUCLEON NEXT-TO-LEADING ORDER (NLO) DISTRIBUTION FUNCTIONS AND ALSO * THE RATIO OF THE NUCLEAR TO NUCLEON * NLO INCLUSIVE STRUCTURE FUNCTIONS F_2. * THE WORD "NUCLEON" MEANS (Z*proton+N*neutron)/A * FOR THE FREE PROTON NLO DISTRIBUTON FUNCTION, CTEQ5M PARAMETRIZATION IS USED. * NUCLEAR SHADOWING FOR THE VALENCE QUARKS IS GIVEN BY THE PARAMETRIZAION * BY ESKOLA AND COLLABORATORS * (K.J. Eskola, V.J. Kolhinen and P.V. Ruuskanen, Nucl. Phys. B 535 (1998) 351; * K.J. Eskola, V.J. Kolhinen and C.A. Salgado, Eur. Phys. J. C 9 (1999) 61.) * **** HOW TO USE THIS CODE *** * THE MAIN SOUBROUTINE IS CALLED ''LT_IMPACT(bb,xbj,Q2,uv,dv,ubar,dbar,sbar,cbar,glue,f2)'' * WHEN THE USER SPECIFIES THE VALUES OF BJORKEN X (xbj), Q^2 (Q2), and impact param. bb (b), * THE SUBROUTINE OUTPUTS THE FOLLOWING RATIOS AT THE GIVEN X AND Q^2: * * U_VAL(NUCLEUS)/[T_A(b)*(Z*U_VAL+N*D_VAL)] .... uv (valence u-quark ratios) * D_VAL(NUCLEUS)/[T_A(b)*(Z*D_VAL+N*U_VAL)] .... dv (valence d-quark ratios) * U_BAR(NUCLEUS)/[T_A(b)*(Z*U_BAR+N*D_BAR)] .... ubar (anti u-quark ratios) * D_BAR(NUCLEUS)/[T_A(b)*(Z*D_BAR+N*U_BAR)] .... dbar (anti d-quark ratios) * S_BAR(NUCLEUS)/[T_A(b)*A*S_BAR] .... sbar (anti s-quark ratios) * C_BAR(NUCLEUS)/[T_A(b)A*C_BAR] .... cbar (anti c-quark ratios) * GLUE(NUCLEUS)/T_A(b)*A*GLUE] .... glue (gluon ratios) * F_2(NUCLEUS)/[T_A(b)*(Z*F_2p+N*F_2n)] .... f2 (F_2 ratios) * where T_A(b) is the nuclear optical density, T_A(b)=\int dz \rho_A(b,z) * T_A(b) is normalized to unity: \int d^2b T_A(b)=1 * Note that T_A(b) is calculated separametely by subroutine TA_ca40(bb,TT) * [TT=T_A(b)] which uses date file TA_ca40.dat * **** WHAT DOES THE CODE DO? * THE CODE READS THE DATA FILE (QCDEvolution_XXproton_2009_IMPACT_modelX.dat) AND * INTERPOLATES BETWEEN THE X, Q^2 and b GRID POINTS OF THE DATA FILE * (subroutine polin3) USING THE LINEAR INTERPOLATION (subroutine linear). * THE DATA FILE CONTAINS 90 GRID POINTS IN X, 7 GRID POINTS IN Q^2 * (ACTUALLY, IN LOG(Q^2)/LOG(4.)), and 20 points in b. * Note that b_min=0.0.414 fm and b_max=7.059 fm * The results are flat in b for small b. Hence, b=0 fm is equivalent to b=b_min implicit double precision (a-h,o-z) b_min=0.414 b_max=7.059 Q2_min=4.0 bb=0.0 Q2=4.0 xbj=0.0001 if (bb.lt.b_min) bb=b_min call TA_ca40(bb,TT) call LT_IMPACT(bb,xbj,Q2,uv,dv,ubar,dbar,sbar,cbar, >glue,f2) write(6,7)TT,ubar,glue,cbar,f2 7 format(9f8.5) stop end subroutine TA_ca40(bb,TT) implicit double precision (a-h,o-z) integer iread_t dimension bb_array(20),TT_array(20) data iread_t/0/ if (iread_t.eq.0) then NB=20 open(11,file='TA_ca40.dat',status='unknown') do ib=1,NB read(11,*) bb_array(ib),TT_array(ib) enddo close(11) endif iread_t=1 call linear(NB,bb_array,TT_array,bb,TT) return end subroutine LT_IMPACT(bb,xbj,Q2,uv,dv,ubar,dbar,sbar,cbar, >glue,f2) implicit double precision (a-h,o-z) integer iread dimension x1a(90),x2a(7),ya1(90,7,20),ya2(90,7,20), >ya3(90,7,20),ya4(90,7,20),ya5(90,7,20),ya6(90,7,20) >,ya7(90,7,20),ya8(90,7,20),res(8) common/fgs03/x1a,x2a,ya1,ya2,ya3,ya4, >ya5,ya6,ya7,ya8 data iread/0/ if (iread.eq.0) then open(1,file= >'QCDEvolution_ca40proton_2009_IMPACT_model2.dat', >status='unknown') do k=1,20 do j=1,7 read(1,*)x2a(j) do i=1,90 read(1,*)x1a(i),ya1(i,j,k),ya2(i,j,k), >ya3(i,j,k),ya4(i,j,k),ya5(i,j,k) >,ya6(i,j,k),ya7(i,j,k),ya8(i,j,k) enddo enddo enddo close(1) endif iread=1 call polin3(bb,xbj,q2,res) dv=res(1) uv=res(2) ubar=res(3) dbar=res(4) sbar=res(5) cbar=res(6) glue=res(7) f2=res(8) return end subroutine polin3(bb,x1,x2,res) implicit double precision (a-h,o-z) integer j,k,iparton,NMAX,MMAX,NB dimension x1a(90),x2a(7), > B(100),C(100),D(100),res(8) dimension yntmp1(7),ymtmp1(90),yntmp2(7), >ymtmp2(90),yntmp3(7),ymtmp3(90),yntmp4(7), >ymtmp4(90),yntmp5(7),ymtmp5(90),yntmp6(7), >ymtmp6(90),yntmp7(7),ymtmp7(90),yntmp8(7), >ymtmp8(90) dimension ya1(90,7,20),ya2(90,7,20), >ya3(90,7,20),ya4(90,7,20),ya5(90,7,20),ya6(90,7,20) >,ya7(90,7,20),ya8(90,7,20) dimension Bold(20),wBold(20),b1a(20),res1a(20),res2a(20), >res3a(20),res4a(20),res5a(20),res6a(20),res7a(20),res8a(20) parameter(NMAX=7,MMAX=90,NB=20) common/fgs03/x1a,x2a,ya1,ya2,ya3,ya4, >ya5,ya6,ya7,ya8 x2a(1)=1. x2a(2)=2. x2a(3)=3. x2a(4)=4. x2a(5)=5. x2a(6)=6. x2a(7)=7. call GAUSAB(Bold,wBold,0.,50.,NB) do ib=1,NB b1a(ib)=Bold(ib)**0.5 c print*,b1a(ib) enddo do ib=1,20 do j=1,90 do k=1,7 yntmp1(k)=ya1(j,k,ib) yntmp2(k)=ya2(j,k,ib) yntmp3(k)=ya3(j,k,ib) yntmp4(k)=ya4(j,k,ib) yntmp5(k)=ya5(j,k,ib) yntmp6(k)=ya6(j,k,ib) yntmp7(k)=ya7(j,k,ib) yntmp8(k)=ya8(j,k,ib) enddo x2d=Log(x2)/Log(4.) call linear(NMAX,x2a,yntmp1,x2d,ymtmp1(j)) call linear(NMAX,x2a,yntmp2,x2d,ymtmp2(j)) call linear(NMAX,x2a,yntmp3,x2d,ymtmp3(j)) call linear(NMAX,x2a,yntmp4,x2d,ymtmp4(j)) call linear(NMAX,x2a,yntmp5,x2d,ymtmp5(j)) call linear(NMAX,x2a,yntmp6,x2d,ymtmp6(j)) call linear(NMAX,x2a,yntmp7,x2d,ymtmp7(j)) call linear(NMAX,x2a,yntmp8,x2d,ymtmp8(j)) enddo call linear(MMAX,x1a,ymtmp1,x1,res1a(ib)) call linear(MMAX,x1a,ymtmp2,x1,res2a(ib)) call linear(MMAX,x1a,ymtmp3,x1,res3a(ib)) call linear(MMAX,x1a,ymtmp4,x1,res4a(ib)) call linear(MMAX,x1a,ymtmp5,x1,res5a(ib)) call linear(MMAX,x1a,ymtmp6,x1,res6a(ib)) call linear(MMAX,x1a,ymtmp7,x1,res7a(ib)) call linear(MMAX,x1a,ymtmp8,x1,res8a(ib)) c print*,b1a(ib),bb,res3a(ib) enddo call linear(NB,b1a,res1a,bb,res(1)) call linear(NB,b1a,res2a,bb,res(2)) call linear(NB,b1a,res3a,bb,res(3)) call linear(NB,b1a,res4a,bb,res(4)) call linear(NB,b1a,res5a,bb,res(5)) call linear(NB,b1a,res6a,bb,res(6)) call linear(NB,b1a,res7a,bb,res(7)) call linear(NB,b1a,res8a,bb,res(8)) return end C Linear interpolation C Vadim Guzey, 06/10/2003 subroutine linear(n,xa,ya,x,y) implicit double precision (a-h,o-z) integer n,ns,i dimension xa(n),ya(n) C just in case there is some rounding error y=0.0 C Later added by T. Teckentrup ns=0 dif=abs(x-xa(1)) do i=1,n-1 C Finding the closest index i dift=abs(x-xa(i)) if (dift.le.dif) then ns=i dif=dift endif enddo C x could be greater or smaller than xa(i) if (x.gt.xa(ns)) then y1=ya(ns) y2=ya(ns+1) x1=xa(ns) x2=xa(ns+1) y=((y1-y2)*x+(y2*x1-y1*x2))/(x1-x2) else y1=ya(ns-1) y2=ya(ns) x1=xa(ns-1) x2=xa(ns) y=((y1-y2)*x+(y2*x1-y1*x2))/(x1-x2) endif return end C Integration SUBROUTINE GAUSAB( X, W, A, B, NPT ) C======================================================================= C /b C Gaussian quadratures for | f(x)dx. NPT must be even & <100. C /a C C======================================================================= REAL*8 X(1), W(1) REAL*8 XX, WW, C1, C2 COMMON / GAUSCM / XX(100), WW(100) C----------------------------------------------------------------------- NPT2 = NPT/2 IF( A .EQ. 0. .AND. B .GT. .5E20 ) THEN CALL GAUS(NPT,1) DO 5 N = 1, NPT X(N) = XX(N) W(N) = WW(N) 5 CONTINUE RETURN END IF CALL GAUS(NPT,0) C1 = (B-A)/2. C2 = (B+A)/2. DO 10 N = 1, NPT2 M = NPT2 + 1 - N X(N) = - XX(M)*C1 + C2 W(N) = WW(M)*C1 10 CONTINUE DO 20 N = NPT2+1, NPT M = N - NPT2 X(N) = XX(M)*C1 + C2 W(N) = WW(M)*C1 20 CONTINUE RETURN END C======================================================================= SUBROUTINE GAUS(NN,ITYPE) C C STANDARD SETTINGS ARE: IALF=IBTA=0,0