]>
Commit | Line | Data |
---|---|---|
4e9e3152 | 1 | real*8 function alphasPDF(Q) |
2 | implicit none | |
3 | integer nset | |
4 | real*8 Q,a | |
5 | call getnset(nset) | |
6 | call evolveAs(nset,Q,a) | |
7 | alphasPDF=a | |
8 | return | |
9 | end | |
10 | * | |
11 | real*8 function alphasPDFM(nset,Q) | |
12 | implicit none | |
13 | integer nset | |
14 | real*8 Q,a | |
15 | call evolveAs(nset,Q,a) | |
16 | alphasPDFM=a | |
17 | return | |
18 | end | |
19 | * | |
20 | subroutine GetQmass(nnf,mass) | |
21 | implicit none | |
22 | real*8 mass | |
23 | integer nnf,order,nset | |
24 | nset = 1 | |
25 | call GetQmassM(nset,nnf,mass) | |
26 | return | |
27 | entry GetOrderAs(order) | |
28 | nset = 1 | |
29 | call GetOrderAsM(nset,order) | |
30 | return | |
31 | end | |
32 | ||
33 | ||
34 | subroutine evolveAs(nset,Q,alphas) | |
35 | implicit none | |
36 | include 'parmsetup.inc' | |
37 | integer iset,imem | |
38 | common/SET/iset,imem | |
39 | integer nset | |
40 | character*16 s1,s2,s3 | |
41 | real*8 Q,alphas,alfas0,scale0 | |
42 | real*8 Q0(nmxset) | |
43 | real*8 AlfasQ(nmxset) | |
44 | real*8 b0,b1,b2,L,As,mass | |
45 | double precision CtLhALPI,CtLhAlphaNew | |
46 | parameter (b0=1.2202,b1=0.4897,b2=0.1913) | |
47 | integer n | |
48 | integer order | |
49 | integer EvlOrd(nmxset) | |
50 | integer parm(nmxset) | |
51 | integer Etype(nmxset) | |
52 | integer Method(nmxset) | |
53 | integer nnf,naf | |
54 | real*8 cmass,bmass,tmass | |
55 | common/masses_LHA/cmass,bmass,tmass | |
56 | save EvlOrd,parm,Etype,alfasQ,Q0,Method | |
57 | ||
58 | call setnset(nset) | |
59 | c | |
60 | if (method(nset).eq.0) then | |
61 | if ((Etype(nset).eq.1).or.(Etype(nset).eq.2)) then | |
62 | L=log(Q/Q0(nset)) | |
63 | As=alfasQ(nset) | |
64 | if (Etype(nset).eq.2) call GetParmPDF(nset,parm,As) | |
65 | c print *,Etype,parm,As | |
66 | if (EvlOrd(nset).eq.0) L=b0*L | |
67 | if (EvlOrd(nset).eq.1) L=(b0+As*b1)*L | |
68 | if (EvlOrd(nset).eq.2) L=(b0+As*b1+As**2*b2)*L | |
69 | . -0.5*As**2*b0*b1/2d0*L**2 | |
70 | alphas=As/(1.0+As*L) | |
71 | endif | |
72 | endif | |
73 | if (method(nset).eq.1) then | |
74 | call alfasevolve(nset,alphas,Q) | |
75 | elseif (method(nset).eq.2) then | |
76 | call alphamrs(5,alphas,Q) | |
77 | elseif (method(nset).eq.3) then | |
78 | alphas = 3.1415926535898d0*CtLhALPI(Q) | |
79 | elseif (method(nset).eq.4) then | |
80 | alphas = CtLhAlphaNew(Q) | |
81 | elseif (method(nset).eq.5) then | |
82 | call alphamrs(3,alphas,Q) | |
83 | elseif (method(nset).eq.6) then | |
84 | call alphamrs(4,alphas,Q) | |
85 | elseif (method(nset).eq.7) then | |
86 | call alphacteq5f34(3,alphas,Q) | |
87 | elseif (method(nset).eq.8) then | |
88 | call alphacteq5f34(4,alphas,Q) | |
89 | endif | |
90 | return | |
91 | * | |
92 | entry GetQmassM(nset,nnf,mass) | |
93 | n=abs(nnf) | |
94 | mass=0d0 | |
95 | if (n.eq.4) mass=cmass | |
96 | if (n.eq.5) mass=bmass | |
97 | if (n.eq.6) mass=tmass | |
98 | return | |
99 | ||
100 | entry GetNactive(naf,q) | |
101 | c compute nnfn = number of active flavors at scale q. | |
102 | n = 3 | |
103 | if(q .ge. cmass) n = 4 | |
104 | if(q .ge. bmass) n = n + 1 | |
105 | if(q .ge. tmass) n = n + 1 | |
106 | naf = n | |
107 | return | |
108 | ||
109 | entry GetAlfas(nset,alfas0,scale0) | |
110 | scale0=Q0(nset) | |
111 | alfas0=alfasQ(nset) | |
112 | if (Etype(nset).eq.2) call GetParmPDF(nset,parm(nset),alfas0) | |
113 | return | |
114 | * | |
115 | entry GetOrderAsM(nset,order) | |
116 | order=EvlOrd(nset) | |
117 | return | |
118 | * | |
119 | entry InitAlphasPDF(nset) | |
120 | Etype(nset)=-1 | |
121 | EvlOrd(nset)=-1 | |
122 | read(1,*) s1,s2,s3 | |
123 | if (index(s2,'lo').eq.1) EvlOrd(nset)=0 | |
124 | if (index(s2,'nlo').eq.1) EvlOrd(nset)=1 | |
125 | if (index(s2,'nnlo').eq.1) EvlOrd(nset)=2 | |
126 | if (EvlOrd(nset).lt.0) then | |
127 | write(*,*) 'File description error:' | |
128 | write(*,*) 'Unknown alpha_s evolution order ',s2 | |
129 | stop | |
130 | endif | |
131 | if (index(s1,'Fixed').eq.1) then | |
132 | Etype(nset)=1 | |
133 | parm(nset)=-1 | |
134 | read(1,*) alfasQ(nset),Q0(nset),cmass,bmass,tmass | |
135 | endif | |
136 | if (index(s1,'Variable').eq.1) then | |
137 | Etype(nset)=2 | |
138 | alfasQ(nset)=0d0 | |
139 | read(1,*) parm(nset),Q0(nset),cmass,bmass,tmass | |
140 | endif | |
141 | if (Etype(nset).lt.0) then | |
142 | write(*,*) 'File description error:' | |
143 | write(*,*) 'Unknown alpha_s evolution method ',s1 | |
144 | stop | |
145 | endif | |
146 | Method(nset)=-1 | |
147 | if (index(s3,'Internal').eq.1) Method(nset)=0 | |
148 | if (index(s3,'EvolCode').eq.1) Method(nset)=1 | |
149 | if (index(s3,'MRSTalfa').eq.1) Method(nset)=2 | |
150 | if (index(s3,'CTEQalfa').eq.1) Method(nset)=3 | |
151 | if (index(s3,'CTEQABalfa').eq.1) Method(nset)=4 | |
152 | if (index(s3,'MRST3alfa').eq.1) Method(nset)=5 | |
153 | if (index(s3,'MRST4alfa').eq.1) Method(nset)=6 | |
154 | if (index(s3,'CTEQ5F3alfa').eq.1) Method(nset)=7 | |
155 | if (index(s3,'CTEQ5F4alfa').eq.1) Method(nset)=8 | |
156 | if (Method(nset).lt.0) then | |
157 | write(*,*) 'File description error:' | |
158 | write(*,*) 'Unknown alpha_s method ',s3 | |
159 | stop | |
160 | endif | |
161 | c print *,'alpha_s evolution method = ',method | |
162 | return | |
163 | end | |
164 | ||
165 | subroutine alphamrs(nflav,alpha,Q) | |
166 | IMPLICIT real*8 (a-h,o-z) | |
167 | common/SET/iset,imem | |
168 | common/masses_LHA/cmass,bmass,tmass | |
169 | dimension parms(31) | |
170 | DATA PI/3.14159/ | |
171 | DATA TOL/.0005/ | |
172 | data memold/-1/ | |
173 | integer nset | |
174 | save alambda,memold | |
175 | c | |
176 | c print *,'calling alphamrs with ',nflav,Q | |
177 | call getnset(nset) | |
178 | c | |
179 | c | |
180 | c alambda=0.323 | |
181 | c alambda=0.3342 | |
182 | c -- find alambda corresponding to alphas given in first parameter | |
183 | call getnmem(nset,imem) | |
184 | if(imem.ne.memold) then | |
185 | call listPDF(nset,imem,parms) | |
186 | alphas = parms(1) | |
187 | c print *,alphas | |
188 | memold=imem | |
189 | qz2=8315. | |
190 | qz = dsqrt(qz2) | |
191 | alambda = 0.3000 | |
192 | astep = 0.010 | |
193 | tol2 = 0.0000001 | |
194 | idir = +1 | |
195 | 10 continue | |
196 | alambda = alambda + idir*astep | |
197 | call mrslambda(nflav,alpha,qz,alambda) | |
198 | ||
199 | if(idir*(alphas-alpha).gt.0.0) then | |
200 | go to 20 | |
201 | else | |
202 | astep = 0.5*astep | |
203 | idir = -1*idir | |
204 | go to 20 | |
205 | endif | |
206 | 20 continue | |
207 | if(abs(alpha-alphas).gt.tol2) go to 10 | |
208 | endif | |
209 | c - alambda found -- save it !!!! | |
210 | c - next call mrslambda to get alphas at q with the correct alambda | |
211 | call mrslambda(nflav,alpha,q,alambda) | |
212 | RETURN | |
213 | END | |
214 | * | |
215 | subroutine rgras(alpha,Q2) | |
216 | IMPLICIT real*8 (a-h,o-z) | |
217 | real*8 mc,mb,mt | |
218 | include 'parmsetup.inc' | |
219 | character*16 name(nmxset) | |
220 | integer nmem(nmxset),ndef(nmxset),mem | |
221 | common/NAME/name,nmem,ndef,mem | |
222 | q=dsqrt(q2) | |
223 | call getnset(nset) | |
224 | nflav=5 | |
225 | if(name(nset).eq.'QCDNUM_MRST3') nflav=3 | |
226 | if(name(nset).eq.'QCDNUM_MRST4') nflav=4 | |
227 | call alphamrs(nflav,alpha,Q) | |
228 | return | |
229 | end | |
230 | * | |
231 | * new vewrsion of mrslambda 13/5/2004 - includes lo, nlo, and nnlo with flags | |
232 | * | |
233 | subroutine mrslambda(nflav,alpha,Q,alambda) | |
234 | IMPLICIT REAL*8(A-H,O-Z) | |
235 | DATA PI/3.14159/ | |
236 | DATA TOL/.0005/ | |
237 | c The value of Lambda required corresponds to nflav=4 | |
238 | c iord=0 gives leading order, iord=1 gives NLO, iord=2 gives NNLO | |
239 | qsdt=8.18 !! This is the value of 4m_c^2 | |
240 | qsct=74.0 !! This is the value of 4m_b^2 | |
241 | c print *,'calling mrslambda with ',nflav,Q,alambda | |
242 | al2=alambda*alambda | |
243 | q2=q*q | |
244 | t=dlog(q2/al2) | |
245 | c | |
246 | c next line to be replaced by a getiord in the final version | |
247 | c iord=1 | |
248 | c | |
249 | call getnset(nset) | |
250 | call GetOrderAsM(nset,iord) | |
251 | ITH=0 | |
252 | TT=T | |
253 | qsdtt=qsdt/4. | |
254 | qsctt=qsct/4. | |
255 | AL=ALAMBDA | |
256 | AL2=AL*AL | |
257 | FLAV=4. | |
258 | if(nflav.eq.3) flav=3. | |
259 | QS=AL2*dEXP(T) | |
260 | ||
261 | if(qs.lt.0.5d0) then !! running stops below 0.5 | |
262 | qs=0.5d0 | |
263 | t=dlog(qs/al2) | |
264 | tt=t | |
265 | endif | |
266 | ||
267 | c if(QS.lt.QSDTT.and.nflav.eq.4) then | |
268 | c flav=3. | |
269 | c go to 11 | |
270 | c endif | |
271 | ||
272 | ||
273 | IF(QS.gt.QSCTT.and.nflav.gt.4) GO TO 12 | |
274 | IF(QS.lt.QSDTT.and.nflav.gt.3) GO TO 312 | |
275 | 11 CONTINUE | |
276 | B0=11-2.*FLAV/3. | |
277 | X1=4.*PI/B0 | |
278 | IF(IORD.eq.0) then | |
279 | ALPHA=X1/T | |
280 | ELSE | |
281 | if(iord.gt.1) then | |
282 | alpha=qwikalf(t,iord,flav) | |
283 | go to 51 | |
284 | endif | |
285 | B1=102.-38.*FLAV/3. | |
286 | X2=B1/B0**2 | |
287 | AS2=X1/T*(1.-X2*dLOG(T)/T) | |
288 | 5 AS=AS2 | |
289 | F=-T+X1/AS-X2*dLOG(X1/AS+X2) | |
290 | FP=-X1/AS**2*(1.-X2/(X1/AS+X2)) | |
291 | AS2=AS-F/FP | |
292 | DEL=ABS(F/FP/AS) | |
293 | IF((DEL-TOL).GT.0.) go to 5 | |
294 | ALPHA=AS2 | |
295 | 51 continue | |
296 | ENDIF | |
297 | IF(ITH.EQ.0) RETURN | |
298 | GO TO (13,14,15) ITH | |
299 | c GO TO 5 | |
300 | 12 ITH=1 | |
301 | T=dLOG(QSCTT/AL2) | |
302 | GO TO 11 | |
303 | 13 ALFQC4=ALPHA | |
304 | FLAV=5. | |
305 | ITH=2 | |
306 | ||
307 | GO TO 11 | |
308 | 14 ALFQC5=ALPHA | |
309 | ITH=3 | |
310 | T=TT | |
311 | GO TO 11 | |
312 | 15 ALFQS5=ALPHA | |
313 | ALFINV=1./ALFQS5+1./ALFQC4-1./ALFQC5 | |
314 | ALPHA=1./ALFINV | |
315 | RETURN | |
316 | ||
317 | 311 CONTINUE | |
318 | B0=11-2.*FLAV/3. | |
319 | X1=4.*PI/B0 | |
320 | IF(IORD.eq.0) then | |
321 | ALPHA=X1/T | |
322 | ||
323 | ELSE | |
324 | if(iord.gt.1) then | |
325 | alpha=qwikalf(t,iord,flav) | |
326 | go to 351 | |
327 | endif | |
328 | B1=102.-38.*FLAV/3. | |
329 | X2=B1/B0**2 | |
330 | AS2=X1/T*(1.-X2*dLOG(T)/T) | |
331 | 35 AS=AS2 | |
332 | F=-T+X1/AS-X2*dLOG(X1/AS+X2) | |
333 | FP=-X1/AS**2*(1.-X2/(X1/AS+X2)) | |
334 | AS2=AS-F/FP | |
335 | DEL=ABS(F/FP/AS) | |
336 | IF((DEL-TOL).GT.0.) go to 35 | |
337 | ALPHA=AS2 | |
338 | ||
339 | 351 continue | |
340 | endif | |
341 | IF(ITH.EQ.0) RETURN | |
342 | GO TO (313,314,315) ITH | |
343 | 312 ITH=1 | |
344 | T=dLOG(QSDTT/AL2) | |
345 | GO TO 311 | |
346 | 313 ALFQC4=ALPHA | |
347 | FLAV=3. | |
348 | ITH=2 | |
349 | GO TO 311 | |
350 | 314 ALFQC3=ALPHA | |
351 | ITH=3 | |
352 | T=TT | |
353 | GO TO 311 | |
354 | 315 ALFQS3=ALPHA | |
355 | ALFINV=1./ALFQS3+1./ALFQC4-1./ALFQC3 | |
356 | ALPHA=1./ALFINV | |
357 | RETURN | |
358 | END | |
359 | ||
360 | ||
361 | ||
362 | double precision function qwikalf(t,iord,flav) | |
363 | implicit real*8(a-h,o-z) | |
364 | dimension z3(6),z4(6),z5(6),zz3(6),zz4(6),zz5(6) | |
365 | data z3/ -.161667E+01,0.954244E+01, | |
366 | .0.768623E+01,0.101523E+00,-.360127E-02,0.457867E-04/ | |
367 | data z4/ -.172239E+01,0.831185E+01, | |
368 | .0.721463E+01,0.835531E-01,-.285436E-02,0.349129E-04/ | |
369 | data z5/ -.872190E+00,0.572816E+01, | |
370 | .0.716119E+01,0.195884E-01,-.300199E-03,0.151741E-05/ | |
371 | data zz3/-.155611E+02,0.168406E+02, | |
372 | .0.603014E+01,0.257682E+00,-.970217E-02,0.127628E-03/ | |
373 | data zz4/-.106762E+02,0.118497E+02,0.664964E+01, | |
374 | .0.112996E+00,-.317551E-02,0.302434E-04/ | |
375 | data zz5/-.531860E+01,0.708503E+01,0.698352E+01, | |
376 | .0.274170E-01,-.426894E-03,0.217591E-05/ | |
377 | ||
378 | data pi/3.14159/ | |
379 | nfm2=flav-2. | |
380 | x=dsqrt(t) | |
381 | x2=x*x | |
382 | x3=x*x2 | |
383 | x4=x*x3 | |
384 | x5=x*x4 | |
385 | go to (1,2) iord | |
386 | 1 go to (3,4,5) nfm2 | |
387 | 3 y=z3(1)+z3(2)*x+z3(3)*x2+z3(4)*x3+z3(5)*x4+z3(6)*x5 | |
388 | go to 10 | |
389 | 4 y=z4(1)+z4(2)*x+z4(3)*x2+z4(4)*x3+z4(5)*x4+z4(6)*x5 | |
390 | go to 10 | |
391 | 5 y=z5(1)+z5(2)*x+z5(3)*x2+z5(4)*x3+z5(5)*x4+z5(6)*x5 | |
392 | go to 10 | |
393 | 2 go to (6,7,8) nfm2 | |
394 | 6 y=zz3(1)+zz3(2)*x+zz3(3)*x2+zz3(4)*x3+zz3(5)*x4+zz3(6)*x5 | |
395 | go to 10 | |
396 | 7 y=zz4(1)+zz4(2)*x+zz4(3)*x2+zz4(4)*x3+zz4(5)*x4+zz4(6)*x5 | |
397 | go to 10 | |
398 | 8 y=zz5(1)+zz5(2)*x+zz5(3)*x2+zz5(4)*x3+zz5(5)*x4+zz5(6)*x5 | |
399 | go to 10 | |
400 | 10 qwikalf=4.*pi/y | |
401 | return | |
402 | end | |
403 | c===================================================================== | |
404 | c next is alphas routine from PDFLIB | |
405 | c | |
406 | c DOUBLE PRECISION FUNCTION ALPHAS2(SCALE,qcdl5) | |
407 | subroutine aspdflib(alphas2,SCALE,iord,qcdl5) | |
408 | implicit real*8 (a-h,o-z) | |
409 | double precision | |
410 | + NF | |
411 | c CHARACTER*20 PARM(NCHDIM) | |
412 | c double precision | |
413 | c + VAL(NCHDIM) | |
414 | c DATA XMC/1.5D0/,XMB/4.75D0/,XMT/100.D0/ | |
415 | DATA XMC/1.43D0/,XMB/4.30D0/,XMT/100.D0/ | |
416 | DATA ZEROD/0.D0/,PONED/0.001D0/,ONED/1.D0/,TWOD/2.D0/ | |
417 | ||
418 | c QCDL5=0.165d0 | |
419 | ||
420 | c print *,qcdl5,iord | |
421 | LO = 1 | |
422 | if(iord.ne.0) LO = 2 | |
423 | c if(LO.eq.1) then | |
424 | c print *,'Calculating ALPHA_S at Leading Order',LO | |
425 | c else | |
426 | c print *,'Calculating ALPHA_S at Next to Leading Order',LO | |
427 | c endif | |
428 | ||
429 | TMAS = 180.0d0 | |
430 | ||
431 | ||
432 | ALPHAS2 = ZEROD | |
433 | C. | |
434 | PI=4.0D0*ATAN(ONED) | |
435 | B6 = (33.D0-2.D0*6.D0)/PI/12.D0 | |
436 | BP6 = (153.D0 - 19.D0*6.D0) / PI / TWOD / (33.D0 - 2.D0*6.D0) | |
437 | B5 = (33.D0-2.D0*5.D0)/PI/12.D0 | |
438 | BP5 = (153.D0 - 19.D0*5.D0) / PI / TWOD / (33.D0 - 2.D0*5.D0) | |
439 | B4 = (33.D0-2.D0*4.D0)/PI/12.D0 | |
440 | BP4 = (153.D0 - 19.D0*4.D0) / PI / TWOD / (33.D0 - 2.D0*4.D0) | |
441 | B3 = (33.D0-2.D0*3.D0)/PI/12.D0 | |
442 | BP3 = (153.D0 - 19.D0*3.D0) / PI / TWOD / (33.D0 - 2.D0*3.D0) | |
443 | XLC = TWOD * LOG( XMC/QCDL5) | |
444 | XLB = TWOD * LOG( XMB/QCDL5) | |
445 | XLT = TWOD * LOG( XMT/QCDL5 * TMAS/XMT) | |
446 | XLLC = LOG( XLC) | |
447 | XLLB = LOG( XLB) | |
448 | XLLT = LOG( XLT) | |
449 | C65 = ONED/( ONED/(B5 * XLT) - XLLT*BP5/(B5 * XLT)**2 ) | |
450 | + - ONED/( ONED/(B6 * XLT) - XLLT*BP6/(B6 * XLT)**2 ) | |
451 | C45 = ONED/( ONED/(B5 * XLB) - XLLB*BP5/(B5 * XLB)**2 ) | |
452 | + - ONED/( ONED/(B4 * XLB) - XLLB*BP4/(B4 * XLB)**2 ) | |
453 | C35 = ONED/( ONED/(B4 * XLC) - XLLC*BP4/(B4 * XLC)**2 ) | |
454 | + - ONED/( ONED/(B3 * XLC) - XLLC*BP3/(B3 * XLC)**2 ) + C45 | |
455 | C | |
456 | Q = SCALE | |
457 | XLQ = TWOD * LOG( Q/QCDL5 ) | |
458 | XLLQ = LOG( XLQ ) | |
459 | ||
460 | c IF ( NF .LT. ZEROD) THEN | |
461 | IF ( Q .GT. XMT * TMAS/XMT) THEN | |
462 | NF = 6.D0 | |
463 | ELSEIF ( Q .GT. XMB ) THEN | |
464 | NF = 5.D0 | |
465 | ELSEIF ( Q .GT. XMC ) THEN | |
466 | NF = 4.D0 | |
467 | ELSE | |
468 | NF = 3.D0 | |
469 | ENDIF | |
470 | c ENDIF | |
471 | c print *,nf | |
472 | IF(NF .GT. 6.D0) NF = 6.D0 | |
473 | IF ( NF .EQ. 6.D0 ) THEN | |
474 | ALF = ONED/(ONED/(ONED/(B6*XLQ)- BP6/(B6*XLQ)**2*XLLQ) + C65) | |
475 | IF (LO.EQ.1) ALF = ONED/B6/XLQ | |
476 | ELSEIF ( NF .EQ. 5.D0 ) THEN | |
477 | ALF = ONED/(B5 * XLQ) - BP5/(B5 * XLQ)**2 * XLLQ | |
478 | IF (LO.EQ.1) ALF = ONED/B5/XLQ | |
479 | ELSEIF ( NF .EQ. 4.D0 ) THEN | |
480 | ALF = ONED/(ONED/(ONED/(B4*XLQ)- BP4/(B4*XLQ)**2*XLLQ) + C45) | |
481 | IF (LO.EQ.1) ALF = ONED/B4/XLQ | |
482 | ELSEIF ( NF .EQ. 3.D0 ) THEN | |
483 | ALF = ONED/(ONED/(ONED/(B3*XLQ)- BP3/(B3*XLQ)**2*XLLQ) + C35) | |
484 | IF (LO.EQ.1) ALF = ONED/B3/XLQ | |
485 | ELSE | |
486 | WRITE(*,*)'Error in Alphas2' | |
487 | STOP | |
488 | ENDIF | |
489 | ALPHAS2 = ALF | |
490 | RETURN | |
491 | END | |
492 | c ======================================================================== | |
493 | SUBROUTINE CtLhAlphaNewSET(MC,MB,MT,Q0,ALPHA0,IORDER,IMODE) | |
494 | c call to set quark masses for alpha_s, and choose lambda or its | |
495 | c equivalent to make alpha_s take the value alpha0 at scale Q0. | |
496 | ||
497 | IMPLICIT NONE | |
498 | DOUBLE PRECISION MC, MB, MT, Q0, ALPHA0 | |
499 | INTEGER IORDER, IMODE | |
500 | ||
501 | DOUBLE PRECISION UDSCBT, QQ0, AALPHA0 | |
502 | INTEGER IIORDER, IIMODE | |
503 | COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER | |
504 | COMMON /ALSCALE/ QQ0, AALPHA0 | |
505 | ||
506 | double precision Adummy | |
507 | integer Nfl, Idummy | |
508 | common / QCDtable / Adummy, Nfl, Idummy | |
509 | ||
510 | if((imode .lt. 1) .or. (imode .gt. 3)) then | |
511 | print *,'CtLhAlphaNewSET: fatal imode=',imode | |
512 | stop | |
513 | endif | |
514 | ||
515 | IIMODE = IMODE | |
516 | QQ0 = Q0 | |
517 | AALPHA0 = ALPHA0 | |
518 | IIORDER = IORDER | |
519 | ||
520 | UDSCBT(1) = .005D0 | |
521 | UDSCBT(2) = .010D0 | |
522 | UDSCBT(3) = .300D0 | |
523 | UDSCBT(4) = MC | |
524 | UDSCBT(5) = MB | |
525 | UDSCBT(6) = MT | |
526 | ||
527 | c set artificial quark masses, if necessary, in alpha_s to enforce | |
528 | c the requested maximum number of flavors... | |
529 | if(Nfl .le. 5) UDSCBT(6) = 6.d99 | |
530 | if(Nfl .le. 4) UDSCBT(5) = 5.d99 | |
531 | if(Nfl .le. 3) UDSCBT(4) = 4.d99 | |
532 | if(Nfl .le. 2) UDSCBT(3) = 3.d99 | |
533 | if(Nfl .le. 1) UDSCBT(2) = 2.d99 | |
534 | if(Nfl .le. 0) UDSCBT(1) = 1.d99 | |
535 | ||
536 | c print *,'CtLhAlphaNewSET: imode=',imode,' Nfl=',Nfl !*** temporary *** | |
537 | c print *,'CtLhAlphaNewSET: mc,mb,mt=', mc, mb, mt !*** temporary *** | |
538 | c print *,'CtLhAlphaNewSET: Q0, alpha0=',Q0, alpha0 !*** temporary *** | |
539 | ||
540 | ||
541 | RETURN | |
542 | END | |
543 | ||
544 | FUNCTION CtLhAlphaNew(Q) | |
545 | IMPLICIT NONE | |
546 | DOUBLE PRECISION CtLhAlphaNew, Q | |
547 | ||
548 | DOUBLE PRECISION Q2, CtLhQALPHAS, UDSCBT | |
549 | integer nf,ier | |
550 | ||
551 | INTEGER IIMODE, IIORDER | |
552 | COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER | |
553 | ||
554 | if((iimode .ge. 1) .and. (iimode .le. 3)) then | |
555 | Q2=Q*Q | |
556 | nf=6 | |
557 | if (Q2.lt. UDSCBT(6)**2) nf=5 | |
558 | if (Q2.lt. UDSCBT(5)**2) nf=4 | |
559 | if (Q2.lt. UDSCBT(4)**2) nf=3 | |
560 | if (Q2.lt. UDSCBT(3)**2) nf=2 | |
561 | if (Q2.lt. UDSCBT(2)**2) nf=1 | |
562 | if (Q2.lt. UDSCBT(1)**2) nf=0 | |
563 | ||
564 | c external maximum number of flavors -- typically, nfmax=5 so | |
565 | c top quark is not a parton even at large Q... | |
566 | ||
567 | CtLhAlphaNew=CtLhQALPHAS(Q2,nf,ier) | |
568 | if(ier .ne. 0) then | |
569 | print *,'warning in CtLhAlphaNew, Q=',Q,' nf=',nf, | |
570 | & ' ier=',ier,' CtLhAlphaNew=',CtLhAlphaNew | |
571 | endif | |
572 | ||
573 | else | |
574 | print *,'CtLhAlphaNew: undefined mode=',iimode | |
575 | stop | |
576 | endif | |
577 | ||
578 | ||
579 | return | |
580 | end | |
581 | ||
582 | FUNCTION CtLhQALPHAS(QQ2,NF,IERR) | |
583 | IMPLICIT DOUBLE PRECISION (A-H,O-Z) | |
584 | ||
585 | COMMON /ALSCALE/ Q0, ALPHA0 | |
586 | COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER | |
587 | ||
588 | Q02 = Q0**2 | |
589 | ALP0 = ALPHA0 | |
590 | IOR = IIORDER | |
591 | ||
592 | NFFF = NF | |
593 | CtLhQALPHAS = CtLhA0TOA1(QQ2,Q02,ALP0,IOR,NFFF,IERR) | |
594 | ||
595 | RETURN | |
596 | END | |
597 | ||
598 | FUNCTION CtLhA0TOA1(QSU,QS0,AS0,IORD,NFF,IERR) | |
599 | IMPLICIT DOUBLE PRECISION (A-H,O-Z) | |
600 | ||
601 | COMMON /QMASSES/ UDSCBT(6), IIMODE, IIORDER | |
602 | ||
603 | QS1 = QSU | |
604 | ||
605 | QMU0 = SQRT(QS0) | |
606 | QMU1 = SQRT(QS1) | |
607 | ||
608 | DO I = 1, 6 | |
609 | IF(QMU0.GE.UDSCBT(I)) NF0 = I | |
610 | IF(QMU1.GE.UDSCBT(I)) NF1 = I | |
611 | ENDDO | |
612 | ||
613 | IF(NF1.LT.NF0) THEN | |
614 | IST = -1 | |
615 | JST = 0 | |
616 | ELSE | |
617 | IST = 1 | |
618 | JST = 1 | |
619 | ENDIF | |
620 | ||
621 | ALFA0 = AS0 | |
622 | Q00 = QS0 | |
623 | ||
624 | IERR = 0 | |
625 | DO 50 NF = NF0,NF1,IST | |
626 | ||
627 | IF(NF.NE.NF1) THEN | |
628 | Q21 = UDSCBT(NF+JST)**2 | |
629 | ELSE | |
630 | Q21 = QS1 | |
631 | ENDIF | |
632 | IMODE = IIMODE | |
633 | ALFA1 = CtLhALPHAR(Q21,Q00,ALFA0,NF,IORD,IMODE,JERR) | |
634 | IERR = IERR + JERR !IERR is sum of all errors | |
635 | ALFA0 = ALFA1 | |
636 | Q00 = Q21 | |
637 | ||
638 | 50 CONTINUE | |
639 | ||
640 | CtLhA0TOA1 = ALFA0 | |
641 | NFF = NF1 | |
642 | ||
643 | RETURN | |
644 | END | |
645 | ||
646 | FUNCTION CtLhALPHAR(QSQ,QS0,AS0,NF,IORD,IMODE,IERR) | |
647 | C calculate ALPHAS FROM RGE GIVEN AS0 AT QS0. | |
648 | C | |
649 | C IORD=1: LEADING ORDER DEFINED BY | |
650 | C Q*d(alpha)/d(Q) = c1*alpha**2 | |
651 | C | |
652 | C IORD=2,IMODE=1: QCD NUM CHOICE DEFINED BY | |
653 | C Q*d(alpha)/d(Q) = c1*alpha**2 + c2*alpha**3 | |
654 | C | |
655 | C IORD=2,IMODE=2: AD HOC ALTERNATIVE DEFINED BY | |
656 | C Q*d(alpha)/d(Q) = c1*alpha**2 / (1 - (c2/c1)*alpha) | |
657 | C | |
658 | C IORD=2,IMODE=3: TRADITIONAL CTEQ CHOICE DEFINED BY | |
659 | C ALPHA = c3*(1 - c4*log(L)/L)/L, WHERE L=log((Q/lambda)**2) | |
660 | C | |
661 | C c1 = -beta0/(2*pi) where beta0 = 11. - (2./3.)*nf | |
662 | C c2 = -beta1/(8*pi**2) where beta1 = 102. - (38./3.)*nf | |
663 | C | |
664 | C c3 = -2/c1 | |
665 | C c4 = -2*c2/c1**2 | |
666 | C | |
667 | C | |
668 | IMPLICIT DOUBLE PRECISION (A-H,O-Z) | |
669 | ||
670 | ||
671 | DATA PI / 3.14159265358979d0 / | |
672 | ||
673 | BET0 = 11.d0 -(2*NF)/3.d0 | |
674 | BET1 = 102.d0 - (38*NF)/3.d0 | |
675 | B0 = BET0/(4.d0*PI) | |
676 | B1 = BET1/(4.d0*PI*BET0) | |
677 | IERR = 0 | |
678 | ||
679 | TERM0 = 1.d0/AS0+B0*LOG(QSQ/QS0) | |
680 | IF(TERM0.LE.0.) THEN | |
681 | CtLhALPHAR = 100. | |
682 | IERR = 1 | |
683 | PRINT *,'CtLhALPHAR WARNING: RETURN 100.' | |
684 | RETURN | |
685 | ENDIF | |
686 | ALFA0 = 1.d0/TERM0 | |
687 | ||
688 | C ORDER=1 IS LEADING ORDER, WHICH IS SAME FOR ALL IMODE. | |
689 | IF(IORD.EQ.1) THEN | |
690 | CtLhALPHAR = ALFA0 | |
691 | RETURN | |
692 | ELSEIF(IORD.NE.2) THEN | |
693 | PRINT *,'FATAL ERROR: UNDEFINED ORDER IN CtLhALPHAR' | |
694 | STOP | |
695 | ENDIF | |
696 | ||
697 | ||
698 | C QCD NUM CHOICE: Q*d(alpha)/d(Q) = c1*alpha**2 + c2*alpha**3 | |
699 | IF(IMODE .EQ. 1) THEN | |
700 | ||
701 | c use Newton's method to solve the equation, instead of the | |
702 | c simple iterative method used in qcdnum (jcp 9/01) | |
703 | DO ITER = 1, 20 | |
704 | ARG = (1.d0/ALFA0+B1)/(1.d0/AS0+B1) | |
705 | IF(ARG.LE.0.) THEN | |
706 | CtLhALPHAR = 10. | |
707 | IERR = 1 | |
708 | PRINT *,'CtLhALPHAR WARNING: RETURN 10.' | |
709 | RETURN | |
710 | ENDIF | |
711 | ||
712 | TERM = TERM0 + B1*LOG(ARG) - 1.d0/ALFA0 | |
713 | ALFA1 = ALFA0/(1.d0 + ALFA0*(1.d0 + B1*ALFA0)*TERM) | |
714 | ||
715 | IF(ABS(ALFA1-ALFA0).LT.1.E-12) GOTO 20 | |
716 | ALFA0 = ALFA1 | |
717 | ENDDO | |
718 | ||
719 | CtLhALPHAR = 10. | |
720 | IERR = 1 | |
721 | RETURN | |
722 | ||
723 | 20 CONTINUE | |
724 | CtLhALPHAR = ALFA1 | |
725 | RETURN | |
726 | ||
727 | C AD HOC ALTERNATIVE: Q*d(alpha)/d(Q) = c1*alpha**2 / (1 - (c2/c1)*alpha) | |
728 | ELSEIF(IMODE .EQ. 2) THEN | |
729 | ||
730 | c first get a good starting point, to be sure Newton's method doesn't go | |
731 | c to the wrong root. | |
732 | BEST = 9.d99 | |
733 | DO ITRY = 0, 20 | |
734 | IF(ITRY.NE.0) ALFA0 = (1./B1)*(ITRY-0.5D0)/20.D0 | |
735 | F = -1.d0/ALFA0 + TERM0 - B1*LOG(ALFA0/AS0) | |
736 | IF(ABS(F) .LT. BEST) THEN | |
737 | BEST = ABS(F) | |
738 | ALBST = ALFA0 | |
739 | ENDIF | |
740 | ENDDO | |
741 | ||
742 | ALFA0 = ALBST | |
743 | DO ITER=1, 20 | |
744 | F = -1.d0/ALFA0 + TERM0 - B1*LOG(ALFA0/AS0) | |
745 | ALFA1 = ALFA0/(1.d0 + ALFA0*F/(1.d0 - B1*ALFA0)) | |
746 | IF(ABS(ALFA1-ALFA0) .LT. 1.E-12) GOTO 30 | |
747 | ALFA0 = ALFA1 | |
748 | ENDDO | |
749 | ||
750 | CtLhALPHAR = 10. | |
751 | IERR = 1 | |
752 | RETURN | |
753 | ||
754 | 30 CONTINUE | |
755 | CtLhALPHAR = ALFA1 | |
756 | RETURN | |
757 | ||
758 | C TRADITIONAL CTEQ CHOICE: ALPHA = c3*(1 - c4*log(L)/L)/L, WHERE L=log((Q/lambda)**2) | |
759 | ELSEIF(IMODE .EQ. 3) THEN | |
760 | ||
761 | Z = -LOG(B0*AS0) | |
762 | TMP = BET1/BET0**2 | |
763 | ||
764 | DO ITER = 1, 20 | |
765 | F = EXP(Z) - (1.D0 - TMP*Z*EXP(-Z))/(B0*AS0) | |
766 | FPRI = EXP(Z) + TMP*(1.D0-Z)*EXP(-Z)/(B0*AS0) | |
767 | ZNEW = Z - F/FPRI | |
768 | IF(ABS(Z-ZNEW) .LT. 1.E-10) GOTO 40 | |
769 | Z = ZNEW | |
770 | ENDDO | |
771 | ||
772 | CtLhALPHAR = 10. | |
773 | IERR = 1 | |
774 | RETURN | |
775 | ||
776 | 40 CONTINUE | |
777 | XLAMSQ = QS0 * EXP(-EXP(ZNEW)) | |
778 | XL = LOG(QSQ/XLAMSQ) | |
779 | ||
780 | c return a fixed value if no solution... | |
781 | IF(XL .LE. 0.D0) THEN | |
782 | CtLhALPHAR = 10.D0 | |
783 | IERR = 1 | |
784 | RETURN | |
785 | ENDIF | |
786 | ||
787 | CtLhALPHAR = (1.d0 - TMP*LOG(XL)/XL)/(B0*XL) | |
788 | ||
789 | c place a cutoff if comes out very large... | |
790 | if(CtLhALPHAR .gt. 10.d0) then | |
791 | CtLhALPHAR = 10.d0 | |
792 | IERR = 1 | |
793 | endif | |
794 | ||
795 | RETURN | |
796 | ||
797 | ELSE | |
798 | PRINT *,'FATAL UNDEFINED IMODE=',IMODE | |
799 | STOP | |
800 | ENDIF | |
801 | ||
802 | RETURN | |
803 | END | |
804 | ||
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 / | |
809 | ||
810 | q = amu | |
811 | alpha = CtLhAlphaNew(q) | |
812 | CtLhalpinew = alpha/pi | |
813 | ||
814 | RETURN | |
815 | END | |
816 | ||
817 | subroutine CTEQ6NewAlpha(nset,mem) | |
818 | IMPLICIT DOUBLE PRECISION (A-H, O-Z) | |
819 | common / QCDtable / Alambda, Nfl, Iorder | |
820 | dimension parms(2) | |
821 | ||
822 | q0 = 91.188d0 | |
823 | c call GetLam4M(nset,mem,alpha0) | |
824 | c call GetLam5M(nset,mem,ximode) | |
825 | call listPDF(nset,mem,parms) | |
826 | alpha0 = parms(1) | |
827 | ximode = parms(2) | |
828 | imode = int(ximode) | |
829 | iiorder = iorder | |
830 | ||
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 ********************************************************** | |
838 | ||
839 | call GetQmass(4,cmass) | |
840 | call GetQmass(5,bmass) | |
841 | call GetQmass(6,tmass) | |
842 | c write(6,*) 'CTEQ6NewAlpha: mc, mb, mt=', | |
843 | c & cmass, bmass, tmass | |
844 | call CtLhAlphaNewSET(XMC,XMB,XMT,Q0,ALPHA0,IIORDER,IMODE) | |
845 | RETURN | |
846 | END | |
847 | ||
848 | c================================================= | |
849 | subroutine getnset(nset) | |
850 | integer iset,nset | |
851 | save iset | |
852 | nset = iset | |
853 | c print *,'getting nset:',nset | |
854 | return | |
855 | c | |
856 | entry setnset(nset) | |
857 | iset = nset | |
858 | c print *,'setting nset:',nset | |
859 | return | |
860 | end | |
861 | c================================================= | |
862 | subroutine getnmem(nset,nmem) | |
863 | include 'parmsetup.inc' | |
864 | integer nmem,nset,member(nmxset) | |
865 | save member | |
866 | nmem = member(nset) | |
867 | return | |
868 | c | |
869 | entry setnmem(nset,nmem) | |
870 | member(nset) = nmem | |
871 | return | |
872 | end | |
873 | c================================================= | |
874 | subroutine alphacteq5f34(nflav,alphas,q) | |
875 | IMPLICIT DOUBLE PRECISION (A-H, O-Z) | |
876 | parameter(pi=3.14159265358979323846d0) | |
877 | ||
878 | alphas = pi*CtLhALPI34(nflav,q) | |
879 | return | |
880 | end | |
881 | c=============================================== | |
882 | FUNCTION CtLhALPI34 (nflav,AMU) | |
883 | IMPLICIT DOUBLE PRECISION (A-H, O-Z) | |
884 | COMMON / LhCtCWZPRM / ALAM(0:9), AMHAT(0:9), AMN, NHQ | |
885 | COMMON / LhCtQCDPAR_LHA / AL, NF, NORDER, SET | |
886 | LOGICAL SET | |
887 | PARAMETER (D0 = 0.D0, D1 = 1.D0, BIG = 1.0D15) | |
888 | DATA IW1, IW2 / 2*0 / | |
889 | IF(.NOT.SET) CALL CtLhLAMCWZ | |
890 | NEFF = LhCtNFL(AMU) | |
891 | cccccc | |
892 | if(neff.gt.nflav) neff=nflav | |
893 | cccccc | |
894 | ALM = ALAM(NEFF) | |
895 | if(neff.eq.3) alm = 0.395 | |
896 | if(neff.eq.4) alm = 0.309 | |
897 | CtLhALPI34 = CtLhALPQCD (NORDER, NEFF, AMU/ALM, IRT) | |
898 | IF (IRT .EQ. 1) THEN | |
899 | CALL CtLhWARNR (IW1, 'AMU < ALAM in CtLhALPI34', 'AMU', AMU, | |
900 | > ALM, BIG, 1) | |
901 | ELSEIF (IRT .EQ. 2) THEN | |
902 | CALL CtLhWARNR(IW2,'CtLhALPI34 > 3; Be aware!','CtLhALPI34', | |
903 | > CtLhALPI34, D0, D1, 0) | |
904 | ENDIF | |
905 | RETURN | |
906 | END |