4 subroutine ZEUSevolve(x,Q,pdf)
5 implicit double precision (a-h,o-z)
6 include 'parmsetup.inc'
8 character*16 name(nmxset)
9 integer nmem(nmxset),ndef(nmxset),mem
10 common/NAME/name,nmem,ndef,mem
11 integer nset,iset,isetlast
14 real*8 mc,mc2,mb,mb2,mt,mt2
15 real*8 f(-6:6),pdf(-6:6)
18 DIMENSION QSP(NSTARTP)
19 DATA QSP/10.,20.,30.,40.,50.,80.,100./
26 ! print *,'iset=',iset,' now calling get_pdfqcd'
27 if(iset.ne.isetlast) then
33 UCENT=QPDFXQ('UPVAL',X,Q2,IFAIL)
34 DCENT=QPDFXQ('DNVAL',X,Q2,IFAIL)
35 GCENT=QPDFXQ('GLUON',X,Q2,IFAIL)
36 UBCEN=QPDFXQ('UB',X,Q2,IFAIL)
37 DBCEN=QPDFXQ('DB',X,Q2,IFAIL)
38 STCEN=QPDFXQ('SB',X,Q2,IFAIL)
40 CHCEN=QPDFXQ('CB',X,Q2,IFAIL)
45 BTCEN=QPDFXQ('BB',X,Q2,IFAIL)
65 !=======================================================================
66 entry ZEUSalfa(alfas,Q)
72 alfas=QALFAS(Q2,Qlam,nf,iflag)
73 ! print *,q2,alfas,qlam,nf,iflag
76 !=======================================================================
78 read(1,*) gridname,nx,xmin,xmax,nq,qmin,qmax
81 !=======================================================================
82 entry ZEUSinit(nset,Eorder,Q2fit)
84 if(name(nset).eq.'QCDNUM_ZEUS_TR') then
87 else if(name(nset).eq.'QCDNUM_ZEUS_FF') then
90 else if(name(nset).eq.'QCDNUM_ZEUS_ZM') then
94 print *,'name/scheme not recognized'
97 !--try 3 way logic ffn/zm-vfn/rt-vfn
108 ! IVFN=0 IS ZM-VFN, 1 IS FFN,2 IS RT-VFN, 3 IS NOT ALLOWED
111 WRITE(*,*)'IVFN=3 SO STOP',IVFN
117 !--qcdnum initialisation
125 call getQmassM(nset,4,mc)
127 call getQmassM(nset,5,mb)
129 call getQmassM(nset,6,mt)
143 !--this merely defines nact where we startevolution
147 CALL QNRSET('MCSTF',SQRT(Q2C))
148 CALL QNRSET('MBSTF',SQRT(Q2B))
149 CALL QNRSET('MCALF',SQRT(Q2C))
150 CALL QNRSET('MBALF',SQRT(Q2B))
153 CALL QTHRES(1D10,2D10)
154 ! CALL QTHRES(1D6,2D6)
160 CALL GRQINP(QSP(I),1)
165 ! qcdnum grid not my grid
167 ! CALL GRXLIM(120,97D-8)
170 ! CALL GRQLIM(61,29D-2,200D3)
171 CALL GRQLIM(nq,qmin,qmax)
173 !-- Get final grid definitions and grid indices of Q0, Q2C and Q2B
175 CALL GRGIVE(NXGRI,XMI,XMA,NQGRI,QMI,QMA)
176 ! WRITE(*,*)'NX,XL,XH,NQ,QL,QH',NXGRI,XMI,XMA,NQGRI,QMI,QMA
180 !-- Allow for heavy weights
183 CALL QNLSET('WTF2C',.TRUE.)
184 CALL QNLSET('WTF2B',.TRUE.)
185 CALL QNLSET('CLOWQ',.FALSE.)
186 CALL QNLSET('WTFLC',.TRUE.)
187 CALL QNLSET('WTFLB',.TRUE.)
190 !-- Compute weights and dump, or read in
193 ! OPEN(UNIT=24,FILE='weights.dat',FORM='UNFORMATTED',
194 ! . STATUS='UNKNOWN')
195 ! CALL QNREAD(24,ISTOP,IERR)
199 ! OPEN(UNIT=24,FILE='weights.dat',FORM='UNFORMATTED',
200 ! . STATUS='UNKNOWN')
206 if (index(gridname,'none').eq.1) then
210 open(unit=2,status='old',file=gridname, &
211 & form='unformatted',err=1)
212 call QNREAD(2,1,qnerr)
215 write(*,*) 'Grid file problem: ',gridname
217 write(*,*) 'Grid file does not exist'
218 write(*,*) 'Calculating and creating grid file'
220 open(unit=2,status='unknown',file=gridname, &
221 & form='unformatted')
225 write(*,*) 'Existing grid file is inconsistent'
227 & write(*,*) 'Defined grid different'
229 & write(*,*) 'Heavy quark weight table different'
231 & write(*,*) 'Charm mass different'
233 & write(*,*) 'Bottom mass different'
239 !-- Apply cuts to grid
240 !--taking away the s cut at 600d0
241 CALL GRCUTS(-1D0,-1D0,-1D0,-1D0)
246 !-- Choose renormalisation and factorisation scales
249 CALL QNRSET('AAAR2',1D0)
250 CALL QNRSET('BBBR2',0D0)
251 ! factorisation (light)
252 CALL QNRSET('AAM2L',1D0)
253 CALL QNRSET('BBM2L',0D0)
254 ! factorisation (heavy)
255 CALL QNRSET('AAM2H',1D0)
256 CALL QNRSET('BBM2H',0D0)
261 ! -- only need call to listPDF here to get alphas
262 call listPDF(nset,imem,xval)
266 CALL QNRSET('ALFQ0',ZM*ZM)
267 CALL QNRSET('ALFAS',AS)
271 ! WRITE(*,*)'ALPHAS AT Mz2',ALPHAS
273 !-- Book non-singlet distributions
275 CALL QNBOOK(2,'UPLUS')
276 CALL QNBOOK(3,'DPLUS')
277 CALL QNBOOK(4,'SPLUS')
278 CALL QNBOOK(5,'CPLUS')
279 CALL QNBOOK(6,'BPLUS')
280 CALL QNBOOK(7,'UPVAL')
281 CALL QNBOOK(8,'DNVAL')
283 !-- Book linear combinations for proton for f = 3,4,5 flavours
285 !--define some quark pdfs
292 CALL QNLINC(17,'UB',3,PWGT)
294 CALL QNLINC(17,'UB',4,PWGT)
296 CALL QNLINC(17,'UB',5,PWGT)
301 CALL QNLINC(18,'SB',3,PWGT)
303 CALL QNLINC(18,'SB',4,PWGT)
305 CALL QNLINC(18,'SB',5,PWGT)
307 CALL QNLINC(19,'CB',3,PWGT)
311 CALL QNLINC(19,'CB',4,PWGT)
313 CALL QNLINC(19,'CB',5,PWGT)
320 CALL QNLINC(20,'DB',3,PWGT)
322 CALL QNLINC(20,'DB',4,PWGT)
324 CALL QNLINC(20,'DB',5,PWGT)
326 CALL QNLINC(21,'BB',3,PWGT)
327 CALL QNLINC(21,'BB',4,PWGT)
331 CALL QNLINC(21,'BB',5,PWGT)
336 !=======================================================================
345 call getnmem(nset,imem)
346 call listPDF(nset,imem,xval)
379 CALL QNRSET('ALFAS',AS)
380 !-- Input quark distributions at Q2 = Q02 GeV2
381 !-- WRITE IN ACTUAL VALUES TO SAVE USING dgamma
382 ! UN=2./AREA(UA-1,UB,UE,UC)
383 ! DN=1./AREA(DA-1,DB,DE,DC)
386 ! UBDBN=DLN/AREA(DLA-1,DLB,DLE,DLC)
387 ! call grgive(nxgri,xxmin,xxmax,nqgri,qqmin,qqmax)
391 UPVAL=UN*FF_LHA(Xx,UA,UB,UE,UC)
394 DNVAL=DN*FF_LHA(Xx,DA,DB,DE,DC)
397 SEA=SN*FF_LHA(Xx,SA,SB,SE,SC)
399 ! GN=(1-UN*AREA(UA,UB,UE,UC)-
400 ! . DN*AREA(DA,DB,DE,DC)-
401 ! . SN*AREA(SA,SB,SE,SC))/AREA(GA,GB,GE,GC)
403 GLUON=GN*FF_LHA(Xx,GA,GB,GE,GC)
407 ! UMD=UBDBN*FF_LHA(X,DLA,DLB,DLE,DLC)
408 UMD=DLN*FF_LHA(Xx,DLA,DLB,DLE,DLC)
409 SINGL=UPVAL+DNVAL+SEA
411 ! print *,un,dn,sn,gn,dln
415 USEA=(SEA-SSEA-CSEA)/2.-UMD
416 DSEA=(SEA-SSEA-CSEA)/2.+UMD
417 UPLUS=UPVAL+USEA-1./NACT*SINGL
418 DPLUS=DNVAL+DSEA-1./NACT*SINGL
419 SPLUS=SSEA-1./NACT*SINGL
422 CALL QNPSET('GLUON',IX,IQ0,GLUON)
423 CALL QNPSET('SINGL',IX,IQ0,SINGL)
424 CALL QNPSET('UPLUS',IX,IQ0,UPLUS)
425 CALL QNPSET('DPLUS',IX,IQ0,DPLUS)
426 CALL QNPSET('SPLUS',IX,IQ0,SPLUS)
427 CALL QNPSET('UPVAL',IX,IQ0,UPVAL)
428 CALL QNPSET('DNVAL',IX,IQ0,DNVAL)
430 !--THINGS ARE FINE FOR HEAVY SO DO IT
433 !-- Evolve over whole grid
435 CALL EVOLSG(IQ0,1,NQGRI)
436 CALL EVPLUS('UPLUS',IQ0,1,NQGRI)
437 CALL EVPLUS('DPLUS',IQ0,1,NQGRI)
438 CALL EVPLUS('SPLUS',IQ0,1,NQGRI)
439 CALL EVOLNM('UPVAL',IQ0,1,NQGRI)
440 CALL EVOLNM('DNVAL',IQ0,1,NQGRI)
444 !-- Evolve gluon, singlet and valence over whole grid
446 CALL EVOLSG(IQ0,1,NQGRI)
447 CALL EVOLNM('UPVAL',IQ0,1,NQGRI)
448 CALL EVOLNM('DNVAL',IQ0,1,NQGRI)
450 !-- Be more careful with plus distributions
453 !--THINGS ARE ALSO FINE IF 1Q0 IS BELOW 1QC THEN CLEARLY CSEA=0. IS OK
454 !--SITUATION CD BE 1<Q0<Q2C<Q2B ETC
455 !--GO DOWN QO TO 1 UP Q0 TO Q2C
456 CALL EVPLUS('UPLUS',IQ0,1,IQC)
457 CALL EVPLUS('DPLUS',IQ0,1,IQC)
458 CALL EVPLUS('SPLUS',IQ0,1,IQC)
459 !--DEAL WITH CHARM THRESH
461 CALL QADDSI('UPLUS',IQC,FACTOR)
462 CALL QADDSI('DPLUS',IQC,FACTOR)
463 CALL QADDSI('SPLUS',IQC,FACTOR)
466 CALL QADDSI('CPLUS',IQC,FACTOR)
468 CALL EVPLUS('UPLUS',IQC,IQC,IQB)
469 CALL EVPLUS('DPLUS',IQC,IQC,IQB)
470 CALL EVPLUS('SPLUS',IQC,IQC,IQB)
471 CALL EVPLUS('CPLUS',IQC,IQC,IQB)
473 ELSEIF(NACT.EQ.4)THEN
475 !--NOW WE NEED A RETHINK OF THE INITIAL CONDITIONS
476 !--FIRST DEAL WITH CPLUS TRUNING ON AT IQC
477 !--AND GOING UP TO IQB (MIDDLE AGAIN)
480 CALL QADDSI('CPLUS',IQC,FACTOR)
481 CALL EVPLUS('CPLUS',IQC,IQC,IQB)
482 !--REDIFINE THE PLUS DUSTNS TAKING INTO ACCOUNT CPLUS
486 !--NOW YOU NEED A DO LOOP AGAIN
489 UPVAL=UN*FF_LHA(Xx,UA,UB,UE,UC)
491 DNVAL=DN*FF_LHA(Xx,DA,DB,DE,DC)
492 SEA=SN*FF_LHA(Xx,SA,SB,SE,SC)
493 SINGL=UPVAL+DNVAL+SEA
494 UMD=DLN*FF_LHA(Xx,DLA,DLB,DLE,DLC)
496 CSEA=QPDFIJ('CPLUS',IX,IQ0,IFL) + 1./NACT*SINGL
497 USEA=(SEA-SSEA-CSEA)/2.-UMD
498 DSEA=(SEA-SSEA-CSEA)/2.+UMD
499 UPLUS=UPVAL+USEA-1./NACT*SINGL
500 DPLUS=DNVAL+DSEA-1./NACT*SINGL
501 SPLUS=SSEA-1./NACT*SINGL
502 CALL QNPSET('UPLUS',IX,IQ0,UPLUS)
503 CALL QNPSET('DPLUS',IX,IQ0,DPLUS)
504 CALL QNPSET('SPLUS',IX,IQ0,SPLUS)
506 !-NOW DO MIDDLE FOR UPLUS,DPLUS,SPLUS
507 CALL EVPLUS('UPLUS',IQ0,IQC,IQB)
508 CALL EVPLUS('DPLUS',IQ0,IQC,IQB)
509 CALL EVPLUS('SPLUS',IQ0,IQC,IQB)
510 !--THEN GO DOWN IQC TO 1
513 CALL QADDSI('UPLUS',IQC,FACTOR)
514 CALL QADDSI('DPLUS',IQC,FACTOR)
515 CALL QADDSI('SPLUS',IQC,FACTOR)
516 CALL EVPLUS('UPLUS',IQC,1,IQC)
517 CALL EVPLUS('DPLUS',IQC,1,IQC)
519 CALL EVPLUS('SPLUS',IQC,1,IQC)
523 !--THEN DEAL WITH B THRESHOLD FOR ALL4
525 CALL QADDSI('UPLUS',IQB,FACTOR)
526 CALL QADDSI('DPLUS',IQB,FACTOR)
527 CALL QADDSI('SPLUS',IQB,FACTOR)
528 CALL QADDSI('CPLUS',IQB,FACTOR)
531 CALL EVPLUS('UPLUS',IQB,IQB,NQGRI)
532 CALL EVPLUS('DPLUS',IQB,IQB,NQGRI)
533 CALL EVPLUS('SPLUS',IQB,IQB,NQGRI)
534 CALL EVPLUS('CPLUS',IQB,IQB,NQGRI)
536 !C--THEN DEAL WITH B TURNING ON AT IQB AND GO UP
539 CALL QADDSI('BPLUS',IQB,FACTOR)
540 CALL EVPLUS('BPLUS',IQB,IQB,NQGRI)
544 call save_pdfqcd(iset)
549 !-----------------------------------------------------------------------
550 ! DOUBLE PRECISION FUNCTION AREA(A,B,E,C)
551 !-----------------------------------------------------------------------
553 ! IMPLICIT DOUBLE PRECISION (A-H,O-Z)
555 ! IF (A.LE.-0.99.OR.B.LE.-0.99) THEN
560 ! AR1=(DGAMMA_LHA(A+1)*DGAMMA_LHA(B+1))/DGAMMA_LHA(A+B+2)
561 ! AR2=E*(DGAMMA_LHA(A+1.5)*DGAMMA_LHA(B+1))/DGAMMA_LHA(A+B+2.5)
562 ! AR3=C*(DGAMMA_LHA(A+2)*DGAMMA_LHA(B+1))/DGAMMA_LHA(A+B+3)
565 ! IF (AREA.LE.1D-6) AREA=1D-6
570 !-----------------------------------------------------------------------
571 DOUBLE PRECISION FUNCTION FF_LHA(X,A,B,E,C)
572 !-----------------------------------------------------------------------
574 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
576 FF_LHA=X**A*(1D0-X)**B*(1+E*SQRT(X)+C*X)
580 !-----------------------------------------------------------------------
581 SUBROUTINE DVZERO (A,N)
583 ! CERN PROGLIB# F121 VZERO .VERSION KERNFOR 4.40 940929
584 ! ORIG. 01/07/71, modif. 24/05/87 to set integer zero
585 ! modif. 25/05/94 to depend on QINTZERO
587 implicit real*8 (a-h,o-z)