1 real*8 function alphasPDF(Q)
6 call evolveAs(nset,Q,a)
11 real*8 function alphasPDFM(nset,Q)
15 call evolveAs(nset,Q,a)
20 subroutine GetQmass(nnf,mass)
23 real*8 Q,alphas,alfas0,scale0,mass
26 call GetQmassM(nset,nnf,mass)
28 entry GetOrderAs(order)
30 call GetOrderAsM(nset,order)
35 subroutine evolveAs(nset,Q,alphas)
37 include 'parmsetup.inc'
42 real*8 Q,alphas,alfas0,scale0,Mc,Mb,Mt
45 real*8 b0,b1,b2,L,As,mass
46 double precision CtLhALPI,CtLhAlphaNew
47 parameter (b0=1.2202,b1=0.4897,b2=0.1913)
50 integer EvlOrd(nmxset)
53 integer Method(nmxset)
54 integer nnf,naf,nf(nmxset)
55 real*8 cmass,bmass,tmass
56 common/masses_LHA/cmass,bmass,tmass
57 save EvlOrd,parm,Etype,alfasQ,Q0,Method
59 c equivalence (Mc,Massc)
60 c equivalence (Mb,Massb)
61 c equivalence (Mt,Masst)
65 if (method(nset).eq.0) then
66 if ((Etype(nset).eq.1).or.(Etype(nset).eq.2)) then
69 if (Etype(nset).eq.2) call GetParmPDF(nset,parm,As)
70 c print *,Etype,parm,As
71 if (EvlOrd(nset).eq.0) L=b0*L
72 if (EvlOrd(nset).eq.1) L=(b0+As*b1)*L
73 if (EvlOrd(nset).eq.2) L=(b0+As*b1+As**2*b2)*L
74 . -0.5*As**2*b0*b1/2d0*L**2
78 if (method(nset).eq.1) then
79 call alfasevolve(nset,alphas,Q)
80 elseif (method(nset).eq.2) then
81 call alphamrs(5,alphas,Q)
82 elseif (method(nset).eq.3) then
83 alphas = 3.1415926535898d0*CtLhALPI(Q)
84 elseif (method(nset).eq.4) then
85 alphas = CtLhAlphaNew(Q)
86 elseif (method(nset).eq.5) then
87 call alphamrs(3,alphas,Q)
88 elseif (method(nset).eq.6) then
89 call alphamrs(4,alphas,Q)
93 entry GetQmassM(nset,nnf,mass)
96 if (n.eq.4) mass=cmass
97 if (n.eq.5) mass=bmass
98 if (n.eq.6) mass=tmass
101 entry GetNactive(naf,q)
102 c compute nnfn = number of active flavors at scale q.
104 if(q .ge. cmass) n = 4
105 if(q .ge. bmass) n = n + 1
106 if(q .ge. tmass) n = n + 1
110 entry GetAlfas(nset,alfas0,scale0)
113 if (Etype(nset).eq.2) call GetParmPDF(nset,parm(nset),alfas0)
116 entry GetOrderAsM(nset,order)
120 entry InitAlphasPDF(nset)
124 if (index(s2,'lo').eq.1) EvlOrd(nset)=0
125 if (index(s2,'nlo').eq.1) EvlOrd(nset)=1
126 if (index(s2,'nnlo').eq.1) EvlOrd(nset)=2
127 if (EvlOrd(nset).lt.0) then
128 write(*,*) 'File description error:'
129 write(*,*) 'Unknown alpha_s evolution order ',s2
132 if (index(s1,'Fixed').eq.1) then
135 read(1,*) alfasQ(nset),Q0(nset),cmass,bmass,tmass
137 if (index(s1,'Variable').eq.1) then
140 read(1,*) parm(nset),Q0(nset),cmass,bmass,tmass
142 if (Etype(nset).lt.0) then
143 write(*,*) 'File description error:'
144 write(*,*) 'Unknown alpha_s evolution method ',s1
148 if (index(s3,'Internal').eq.1) Method(nset)=0
149 if (index(s3,'EvolCode').eq.1) Method(nset)=1
150 if (index(s3,'MRSTalfa').eq.1) Method(nset)=2
151 if (index(s3,'CTEQalfa').eq.1) Method(nset)=3
152 if (index(s3,'CTEQABalfa').eq.1) Method(nset)=4
153 if (index(s3,'MRST3alfa').eq.1) Method(nset)=5
154 if (index(s3,'MRST4alfa').eq.1) Method(nset)=6
155 if (Method(nset).lt.0) then
156 write(*,*) 'File description error:'
157 write(*,*) 'Unknown alpha_s method ',s3
160 c print *,'alpha_s evolution method = ',method
164 subroutine alphamrs(nflav,alpha,Q)
165 IMPLICIT real*8 (a-h,o-z)
167 common/masses_LHA/cmass,bmass,tmass
175 c print *,'calling alphamrs with ',nflav,Q
181 c -- find alambda corresponding to alphas given in first parameter
182 call getnmem(nset,imem)
183 if(imem.ne.memold) then
184 call listPDF(nset,imem,parms)
195 alambda = alambda + idir*astep
196 call mrslambda(nflav,alpha,qz,alambda)
198 if(idir*(alphas-alpha).gt.0.0) then
206 if(abs(alpha-alphas).gt.tol2) go to 10
208 c - alambda found -- save it !!!!
209 c - next call mrslambda to get alphas at q with the correct alambda
210 call mrslambda(nflav,alpha,q,alambda)
214 subroutine rgras(alpha,Q2)
215 IMPLICIT real*8 (a-h,o-z)
217 include 'parmsetup.inc'
218 character*16 name(nmxset)
219 integer nmem(nmxset),ndef(nmxset),mem
220 common/NAME/name,nmem,ndef,mem
224 if(name(nset).eq.'QCDNUM_MRST3') nflav=3
225 if(name(nset).eq.'QCDNUM_MRST4') nflav=4
226 call alphamrs(nflav,alpha,Q)
230 * new vewrsion of mrslambda 13/5/2004 - includes lo, nlo, and nnlo with flags
232 subroutine mrslambda(nflav,alpha,Q,alambda)
233 IMPLICIT REAL*8(A-H,O-Z)
236 c The value of Lambda required corresponds to nflav=4
237 c iord=0 gives leading order, iord=1 gives NLO, iord=2 gives NNLO
238 qsdt=8.18 !! This is the value of 4m_c^2
239 qsct=74.0 !! This is the value of 4m_b^2
240 c print *,'calling mrslambda with ',nflav,Q,alambda
245 c next line to be replaced by a getiord in the final version
249 call GetOrderAsM(nset,iord)
257 if(nflav.eq.3) flav=3.
260 if(qs.lt.0.5d0) then !! running stops below 0.5
266 c if(QS.lt.QSDTT.and.nflav.eq.4) then
272 IF(QS.gt.QSCTT.and.nflav.gt.4) GO TO 12
273 IF(QS.lt.QSDTT.and.nflav.gt.3) GO TO 312
281 alpha=qwikalf(t,iord,flav)
286 AS2=X1/T*(1.-X2*dLOG(T)/T)
288 F=-T+X1/AS-X2*dLOG(X1/AS+X2)
289 FP=-X1/AS**2*(1.-X2/(X1/AS+X2))
292 IF((DEL-TOL).GT.0.) go to 5
312 ALFINV=1./ALFQS5+1./ALFQC4-1./ALFQC5
324 alpha=qwikalf(t,iord,flav)
329 AS2=X1/T*(1.-X2*dLOG(T)/T)
331 F=-T+X1/AS-X2*dLOG(X1/AS+X2)
332 FP=-X1/AS**2*(1.-X2/(X1/AS+X2))
335 IF((DEL-TOL).GT.0.) go to 35
341 GO TO (313,314,315) ITH
354 ALFINV=1./ALFQS3+1./ALFQC4-1./ALFQC3
361 double precision function qwikalf(t,iord,flav)
362 implicit real*8(a-h,o-z)
363 dimension z3(6),z4(6),z5(6),zz3(6),zz4(6),zz5(6)
364 data z3/ -.161667E+01,0.954244E+01,
365 .0.768623E+01,0.101523E+00,-.360127E-02,0.457867E-04/
366 data z4/ -.172239E+01,0.831185E+01,
367 .0.721463E+01,0.835531E-01,-.285436E-02,0.349129E-04/
368 data z5/ -.872190E+00,0.572816E+01,
369 .0.716119E+01,0.195884E-01,-.300199E-03,0.151741E-05/
370 data zz3/-.155611E+02,0.168406E+02,
371 .0.603014E+01,0.257682E+00,-.970217E-02,0.127628E-03/
372 data zz4/-.106762E+02,0.118497E+02,0.664964E+01,
373 .0.112996E+00,-.317551E-02,0.302434E-04/
374 data zz5/-.531860E+01,0.708503E+01,0.698352E+01,
375 .0.274170E-01,-.426894E-03,0.217591E-05/
386 3 y=z3(1)+z3(2)*x+z3(3)*x2+z3(4)*x3+z3(5)*x4+z3(6)*x5
388 4 y=z4(1)+z4(2)*x+z4(3)*x2+z4(4)*x3+z4(5)*x4+z4(6)*x5
390 5 y=z5(1)+z5(2)*x+z5(3)*x2+z5(4)*x3+z5(5)*x4+z5(6)*x5
393 6 y=zz3(1)+zz3(2)*x+zz3(3)*x2+zz3(4)*x3+zz3(5)*x4+zz3(6)*x5
395 7 y=zz4(1)+zz4(2)*x+zz4(3)*x2+zz4(4)*x3+zz4(5)*x4+zz4(6)*x5
397 8 y=zz5(1)+zz5(2)*x+zz5(3)*x2+zz5(4)*x3+zz5(5)*x4+zz5(6)*x5
402 c=====================================================================
403 c next is alphas routine from PDFLIB
405 c DOUBLE PRECISION FUNCTION ALPHAS2(SCALE,qcdl5)
406 subroutine aspdflib(alphas2,SCALE,iord,qcdl5)
407 implicit real*8 (a-h,o-z)
410 c CHARACTER*20 PARM(NCHDIM)
413 c DATA XMC/1.5D0/,XMB/4.75D0/,XMT/100.D0/
414 DATA XMC/1.43D0/,XMB/4.30D0/,XMT/100.D0/
415 DATA ZEROD/0.D0/,PONED/0.001D0/,ONED/1.D0/,TWOD/2.D0/
423 c print *,'Calculating ALPHA_S at Leading Order',LO
425 c print *,'Calculating ALPHA_S at Next to Leading Order',LO
434 B6 = (33.D0-2.D0*6.D0)/PI/12.D0
435 BP6 = (153.D0 - 19.D0*6.D0) / PI / TWOD / (33.D0 - 2.D0*6.D0)
436 B5 = (33.D0-2.D0*5.D0)/PI/12.D0
437 BP5 = (153.D0 - 19.D0*5.D0) / PI / TWOD / (33.D0 - 2.D0*5.D0)
438 B4 = (33.D0-2.D0*4.D0)/PI/12.D0
439 BP4 = (153.D0 - 19.D0*4.D0) / PI / TWOD / (33.D0 - 2.D0*4.D0)
440 B3 = (33.D0-2.D0*3.D0)/PI/12.D0
441 BP3 = (153.D0 - 19.D0*3.D0) / PI / TWOD / (33.D0 - 2.D0*3.D0)
442 XLC = TWOD * LOG( XMC/QCDL5)
443 XLB = TWOD * LOG( XMB/QCDL5)
444 XLT = TWOD * LOG( XMT/QCDL5 * TMAS/XMT)
448 C65 = ONED/( ONED/(B5 * XLT) - XLLT*BP5/(B5 * XLT)**2 )
449 + - ONED/( ONED/(B6 * XLT) - XLLT*BP6/(B6 * XLT)**2 )
450 C45 = ONED/( ONED/(B5 * XLB) - XLLB*BP5/(B5 * XLB)**2 )
451 + - ONED/( ONED/(B4 * XLB) - XLLB*BP4/(B4 * XLB)**2 )
452 C35 = ONED/( ONED/(B4 * XLC) - XLLC*BP4/(B4 * XLC)**2 )
453 + - ONED/( ONED/(B3 * XLC) - XLLC*BP3/(B3 * XLC)**2 ) + C45
456 XLQ = TWOD * LOG( Q/QCDL5 )
461 c IF ( NF .LT. ZEROD) THEN
462 IF ( Q .GT. XMT * TMAS/XMT) THEN
464 ELSEIF ( Q .GT. XMB ) THEN
466 ELSEIF ( Q .GT. XMC ) THEN
473 IF(NF .GT. 6.D0) NF = 6.D0
474 IF ( NF .EQ. 6.D0 ) THEN
475 ALF = ONED/(ONED/(ONED/(B6*XLQ)- BP6/(B6*XLQ)**2*XLLQ) + C65)
476 IF (LO.EQ.1) ALF = ONED/B6/XLQ
477 ELSEIF ( NF .EQ. 5.D0 ) THEN
478 ALF = ONED/(B5 * XLQ) - BP5/(B5 * XLQ)**2 * XLLQ
479 IF (LO.EQ.1) ALF = ONED/B5/XLQ
480 ELSEIF ( NF .EQ. 4.D0 ) THEN
481 ALF = ONED/(ONED/(ONED/(B4*XLQ)- BP4/(B4*XLQ)**2*XLLQ) + C45)
482 IF (LO.EQ.1) ALF = ONED/B4/XLQ
483 ELSEIF ( NF .EQ. 3.D0 ) THEN
484 ALF = ONED/(ONED/(ONED/(B3*XLQ)- BP3/(B3*XLQ)**2*XLLQ) + C35)
485 IF (LO.EQ.1) ALF = ONED/B3/XLQ
487 WRITE(*,*)'Error in Alphas2'
493 c ========================================================================
494 SUBROUTINE CtLhAlphaNewSET(MC,MB,MT,Q0,ALPHA0,IORDER,IMODE)
495 c call to set quark masses for alpha_s, and choose lambda or its
496 c equivalent to make alpha_s take the value alpha0 at scale Q0.
499 DOUBLE PRECISION MC, MB, MT, Q0, ALPHA0
500 INTEGER IORDER, IMODE
502 DOUBLE PRECISION UDSCBT, QQ0, AALPHA0
503 INTEGER IIORDER, IIMODE
504 COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER
505 COMMON /ALSCALE/ QQ0, AALPHA0
507 double precision Adummy
509 common / QCDtable / Adummy, Nfl, Idummy
511 if((imode .lt. 1) .or. (imode .gt. 3)) then
512 print *,'CtLhAlphaNewSET: fatal imode=',imode
528 c set artificial quark masses, if necessary, in alpha_s to enforce
529 c the requested maximum number of flavors...
530 if(Nfl .le. 5) UDSCBT(6) = 6.d99
531 if(Nfl .le. 4) UDSCBT(5) = 5.d99
532 if(Nfl .le. 3) UDSCBT(4) = 4.d99
533 if(Nfl .le. 2) UDSCBT(3) = 3.d99
534 if(Nfl .le. 1) UDSCBT(2) = 2.d99
535 if(Nfl .le. 0) UDSCBT(1) = 1.d99
537 c print *,'CtLhAlphaNewSET: imode=',imode,' Nfl=',Nfl !*** temporary ***
538 c print *,'CtLhAlphaNewSET: mc,mb,mt=', mc, mb, mt !*** temporary ***
539 c print *,'CtLhAlphaNewSET: Q0, alpha0=',Q0, alpha0 !*** temporary ***
545 FUNCTION CtLhAlphaNew(Q)
547 DOUBLE PRECISION CtLhAlphaNew, Q
549 DOUBLE PRECISION Q2, CtLhQALPHAS, UDSCBT
552 INTEGER IIMODE, IIORDER
553 COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER
555 if((iimode .ge. 1) .and. (iimode .le. 3)) then
558 if (Q2.lt. UDSCBT(6)**2) nf=5
559 if (Q2.lt. UDSCBT(5)**2) nf=4
560 if (Q2.lt. UDSCBT(4)**2) nf=3
561 if (Q2.lt. UDSCBT(3)**2) nf=2
562 if (Q2.lt. UDSCBT(2)**2) nf=1
563 if (Q2.lt. UDSCBT(1)**2) nf=0
565 c external maximum number of flavors -- typically, nfmax=5 so
566 c top quark is not a parton even at large Q...
568 CtLhAlphaNew=CtLhQALPHAS(Q2,nf,ier)
570 print *,'warning in CtLhAlphaNew, Q=',Q,' nf=',nf,
571 & ' ier=',ier,' CtLhAlphaNew=',CtLhAlphaNew
575 print *,'CtLhAlphaNew: undefined mode=',iimode
583 FUNCTION CtLhQALPHAS(QQ2,NF,IERR)
584 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
586 COMMON /ALSCALE/ Q0, ALPHA0
587 COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER
594 CtLhQALPHAS = CtLhA0TOA1(QQ2,Q02,ALP0,IOR,NFFF,IERR)
599 FUNCTION CtLhA0TOA1(QSU,QS0,AS0,IORD,NFF,IERR)
600 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
602 COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER
610 IF(QMU0.GE.UDSCBT(I)) NF0 = I
611 IF(QMU1.GE.UDSCBT(I)) NF1 = I
626 DO 50 NF = NF0,NF1,IST
629 Q21 = UDSCBT(NF+JST)**2
634 ALFA1 = CtLhALPHAR(Q21,Q00,ALFA0,NF,IORD,IMODE,JERR)
635 IERR = IERR + JERR !IERR is sum of all errors
647 FUNCTION CtLhALPHAR(QSQ,QS0,AS0,NF,IORD,IMODE,IERR)
648 C calculate ALPHAS FROM RGE GIVEN AS0 AT QS0.
650 C IORD=1: LEADING ORDER DEFINED BY
651 C Q*d(alpha)/d(Q) = c1*alpha**2
653 C IORD=2,IMODE=1: QCD NUM CHOICE DEFINED BY
654 C Q*d(alpha)/d(Q) = c1*alpha**2 + c2*alpha**3
656 C IORD=2,IMODE=2: AD HOC ALTERNATIVE DEFINED BY
657 C Q*d(alpha)/d(Q) = c1*alpha**2 / (1 - (c2/c1)*alpha)
659 C IORD=2,IMODE=3: TRADITIONAL CTEQ CHOICE DEFINED BY
660 C ALPHA = c3*(1 - c4*log(L)/L)/L, WHERE L=log((Q/lambda)**2)
662 C c1 = -beta0/(2*pi) where beta0 = 11. - (2./3.)*nf
663 C c2 = -beta1/(8*pi**2) where beta1 = 102. - (38./3.)*nf
669 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
672 DATA PI / 3.14159265358979d0 /
674 BET0 = 11.d0 -(2*NF)/3.d0
675 BET1 = 102.d0 - (38*NF)/3.d0
677 B1 = BET1/(4.d0*PI*BET0)
680 TERM0 = 1.d0/AS0+B0*LOG(QSQ/QS0)
684 PRINT *,'CtLhALPHAR WARNING: RETURN 100.'
689 C ORDER=1 IS LEADING ORDER, WHICH IS SAME FOR ALL IMODE.
693 ELSEIF(IORD.NE.2) THEN
694 PRINT *,'FATAL ERROR: UNDEFINED ORDER IN CtLhALPHAR'
699 C QCD NUM CHOICE: Q*d(alpha)/d(Q) = c1*alpha**2 + c2*alpha**3
700 IF(IMODE .EQ. 1) THEN
702 c use Newton's method to solve the equation, instead of the
703 c simple iterative method used in qcdnum (jcp 9/01)
705 ARG = (1.d0/ALFA0+B1)/(1.d0/AS0+B1)
709 PRINT *,'CtLhALPHAR WARNING: RETURN 10.'
713 TERM = TERM0 + B1*LOG(ARG) - 1.d0/ALFA0
714 ALFA1 = ALFA0/(1.d0 + ALFA0*(1.d0 + B1*ALFA0)*TERM)
716 IF(ABS(ALFA1-ALFA0).LT.1.E-12) GOTO 20
728 C AD HOC ALTERNATIVE: Q*d(alpha)/d(Q) = c1*alpha**2 / (1 - (c2/c1)*alpha)
729 ELSEIF(IMODE .EQ. 2) THEN
731 c first get a good starting point, to be sure Newton's method doesn't go
735 IF(ITRY.NE.0) ALFA0 = (1./B1)*(ITRY-0.5D0)/20.D0
736 F = -1.d0/ALFA0 + TERM0 - B1*LOG(ALFA0/AS0)
737 IF(ABS(F) .LT. BEST) THEN
745 F = -1.d0/ALFA0 + TERM0 - B1*LOG(ALFA0/AS0)
746 ALFA1 = ALFA0/(1.d0 + ALFA0*F/(1.d0 - B1*ALFA0))
747 IF(ABS(ALFA1-ALFA0) .LT. 1.E-12) GOTO 30
759 C TRADITIONAL CTEQ CHOICE: ALPHA = c3*(1 - c4*log(L)/L)/L, WHERE L=log((Q/lambda)**2)
760 ELSEIF(IMODE .EQ. 3) THEN
766 F = EXP(Z) - (1.D0 - TMP*Z*EXP(-Z))/(B0*AS0)
767 FPRI = EXP(Z) + TMP*(1.D0-Z)*EXP(-Z)/(B0*AS0)
769 IF(ABS(Z-ZNEW) .LT. 1.E-10) GOTO 40
778 XLAMSQ = QS0 * EXP(-EXP(ZNEW))
781 c return a fixed value if no solution...
782 IF(XL .LE. 0.D0) THEN
788 CtLhALPHAR = (1.d0 - TMP*LOG(XL)/XL)/(B0*XL)
790 c place a cutoff if comes out very large...
791 if(CtLhALPHAR .gt. 10.d0) then
799 PRINT *,'FATAL UNDEFINED IMODE=',IMODE
805 FUNCTION CtLhALPInew (AMU)
806 C Returns effective g**2/(4pi**2) = alpha/pi.
807 IMPLICIT DOUBLE PRECISION (A-H, O-Z)
808 data pi / 3.14159265358979d0 /
811 alpha = CtLhAlphaNew(q)
812 CtLhalpinew = alpha/pi
817 subroutine CTEQ6NewAlpha(nset,mem)
818 IMPLICIT DOUBLE PRECISION (A-H, O-Z)
819 common / QCDtable / Alambda, Nfl, Iorder
823 c call GetLam4M(nset,mem,alpha0)
824 c call GetLam5M(nset,mem,ximode)
825 call listPDF(nset,mem,parms)
831 c **********************************************************
832 c the input data file should probably specify a very large
833 c value for xmt, because we never allow top quark as a parton
834 c in the PDF fitting, so there are never more than 5 active
835 c flavors. Presume it is most consistent therefore to
836 c also keep top quark loop out of running of alpha.
837 c **********************************************************
839 call GetQmass(4,cmass)
840 call GetQmass(5,bmass)
841 call GetQmass(6,tmass)
843 write(6,*) 'CTEQ6NewAlpha: mc, mb, mt=',
844 & cmass, bmass, tmass
846 call CtLhAlphaNewSET(XMC,XMB,XMT,Q0,ALPHA0,IIORDER,IMODE)
851 c=================================================
852 subroutine getnset(nset)
856 c print *,'getting nset:',nset
861 c print *,'setting nset:',nset
864 c=================================================
865 subroutine getnmem(nset,nmem)
866 include 'parmsetup.inc'
867 integer nmem,nset,member(nmxset)
872 entry setnmem(nset,nmem)
876 c=================================================