Test QCDNUM evolution options
We can use QCDNUM.evolfg
to evolve the PDF set for all flavours, or QCDNUM.evsgns
to evolve an arbitrary set of singlet/non-singlet pdfs. The latter may offer potential for external parallelisation, but first we must verify that we can use it to recreate expected results.
We do this by recreating the example.f
demo using QCDNUM.evsgns
. This is based on the testsgns.f
test job.
using QCDNUM
using Printf
Let's start by defining some inputs
xmin = Float64.([1.0e-5, 0.2, 0.4, 0.6, 0.75])
iwt = Int32.([1, 2, 4, 8, 16])
nxsubg = 5
nxin = 100
iosp = 3
qq = Float64.([2e0, 1e4])
wt = Float64.([1e0, 1e0])
nqin = 60
itype = 1
as0 = 0.364
r20 = 2.0
q2c = 3.0
q2b = 25.0
q2t = 1e11
q0 = 2.0
def = Float64.([0., 0., 0., 0., 0.,-1., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 0., 0.,-1., 0., 0., 0., 1., 0., 0., 0., 0.,
0., 0., 0.,-1., 0., 0., 0., 0., 0., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.,-1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.,-1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
-1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,
1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. ])
isns = Int32.([1, 2, 2, 2, 2, 2, -1, -2, -2, -2, -2, -2])
nfix = 6
aar = 1.0
bbr = 0.0;
Now we can state our input PDF function:
function func1(ipdf, x)::Float64
i = ipdf[]
xb = x[]
adbar = 0.1939875
f = 0
if (i == 0)
ag = 1.7
f = ag * xb^-0.1 * (1.0-xb)^5.0
end
if (i == 1)
ad = 3.064320
f = ad * xb^0.8 * (1.0-xb)^4.0
end
if (i == 2)
au = 5.107200
f = au * xb^0.8 * (1.0-xb)^3.0
end
if (i == 3)
f = 0.0
end
if (i == 4)
f = adbar * xb^-0.1 * (1.0-xb)^6.0
end
if (i == 5)
f = adbar * xb^-0.1 * (1.0-xb)^6.0 * (1.0-xb)
end
if (i == 6)
xdbar = adbar * xb^-0.1 * (1.0-xb)^6.0
xubar = adbar * xb^-0.1 * (1.0-xb)^6.0 * (1.0-xb)
f = 0.2 * (xdbar + xubar)
end
if (i == 7)
f = 0.0
end
if (i == 8)
xdbar = adbar * xb^-0.1 * (1.0-xb)^6.0
xubar = adbar * xb^-0.1 * (1.0-xb)^6.0 * (1.0-xb)
f = 0.2 * (xdbar + xubar)
end
if (i == 9)
f = 0.0
end
if (i == 10)
xdbar = adbar * xb^-0.1 * (1.0-xb)^6.0
xubar = adbar * xb^-0.1 * (1.0-xb)^6.0 * (1.0-xb)
f = 0.2 * (xdbar + xubar)
end
if (i == 11)
f = 0.0
end
if (i == 12)
xdbar = adbar * xb^-0.1 * (1.0-xb)^6.0
xubar = adbar * xb^-0.1 * (1.0-xb)^6.0 * (1.0-xb)
f = 0.2 * (xdbar + xubar)
end
return f
end
wrapped_func1 = WrappedPDF(func1);
We can also make a function that passes an input PDF that is an output of another PDF. This will be useful later on.
function func2(ipdf, x)::Float64
i = ipdf[]
xb = x[]
f = 0.0
if (i == -1)
iset = Int(QCDNUM.qstore("read", 1))
iq0 = Int(QCDNUM.qstore("read", 2))
else
iset = Int(QCDNUM.qstore("read", 1))
iq0 = Int(QCDNUM.qstore("read", 2))
ix = QCDNUM.ixfrmx(xb)
f = QCDNUM.bvalij(iset, i, ix, iq0, 1)
end
return f
end
wrapped_func2 = WrappedPDF(func2);
Now we can set up QCDNUM and print a summary of our inputs.
QCDNUM.qcinit(-6, " ")
nx = QCDNUM.gxmake(xmin, iwt, nxsubg, nxin, iosp) # make x grid
nq = QCDNUM.gqmake(qq, wt, 2, nqin) # make qq grid
nw = QCDNUM.fillwt(itype) # fill weight tables
QCDNUM.setord(3) # NLO in pQCD
QCDNUM.setalf(as0, r20) # alpha and scale
iqc = QCDNUM.iqfrmq(q2c)
iqb = QCDNUM.iqfrmq(q2b)
iqt = QCDNUM.iqfrmq(q2t)
QCDNUM.setcbt(nfix, iqc, iqb, iqt) # FFNS and thresholds
QCDNUM.setabr(aar, bbr) # Relationship between mu_F^2 and mu_R^2
iq0 = QCDNUM.iqfrmq(q0)
1
Print summary
@printf("xmin = %0.2e, \t subgrids = %i\n", xmin[1], nxsubg)
@printf("qmin = %0.2e, \t qmax = %0.2e\n", qq[1], qq[2])
@printf("nfix = %i, \t\t q2c, b, t = %0.2e, %0.2e, %0.2e\n", nfix, q2c, q2b, q2t)
@printf("alpha = %0.2e, \t r20 = %0.2e\n", as0, r20)
@printf("aar = %0.2e, \t bbr = %0.2e\n", aar, bbr)
@printf("q20 = %0.2e\n", q0)
xmin = 1.00e-05, subgrids = 5
qmin = 2.00e+00, qmax = 1.00e+04
nfix = 6, q2c, b, t = 3.00e+00, 2.50e+01, 1.00e+11
alpha = 3.64e-01, r20 = 2.00e+00
aar = 1.00e+00, bbr = 0.00e+00
q20 = 2.00e+00
Evolve with QCDNUM.evolfg
iset1 = 1
jtype = 10*iset1+itype
eps = QCDNUM.evolfg(jtype, wrapped_func1, def, iq0)
QCDNUM.qstore("write", 1, float(iset1))
QCDNUM.qstore("write", 2, float(iq0))
Evolve with QCDNUM.evsgns
iset2 = 2
jtype = 10*iset2+itype
QCDNUM.setint("edbg", 0) # turn off debug
eps = QCDNUM.evsgns(jtype, wrapped_func2, isns, 12, iq0);
Now we can compare the results from each case, by first defining a useful function
function compare(jset1, jset2, id, jq, ixmin)
nx, xmi, xma, nq, qmi, qma, iord = QCDNUM.grpars()
if (jq == 0)
iq1 = 1
iq2 = nq
jxmin = 0
else
iq1 = jq
iq2 = jq
jxmin = ixmin
end
dif = 0.0
for iq in [iq1, iq2]
for ix in 1:nx
val1 = QCDNUM.bvalij(jset1, id, ix, iq, 1)
val2 = QCDNUM.bvalij(jset2, id, ix, iq, 1)
difi = val1-val2
dif = max(difi, abs(difi))
if (ix < jxmin)
println("(2I3,2F10.4,E13.3,2X,3I3)")
end
end
end
if (jxmin == 0)
@printf("id = %i, \t dif = %0.5e\n", id, dif)
end
end
for id in 0:12
compare(iset1, iset2, id, 0, 1)
end
id = 0, dif = 0.00000e+00
id = 1, dif = 0.00000e+00
id = 2, dif = 0.00000e+00
id = 3, dif = 0.00000e+00
id = 4, dif = 0.00000e+00
id = 5, dif = 0.00000e+00
id = 6, dif = 0.00000e+00
id = 7, dif = 0.00000e+00
id = 8, dif = 0.00000e+00
id = 9, dif = 0.00000e+00
id = 10, dif = 0.00000e+00
id = 11, dif = 0.00000e+00
id = 12, dif = 0.00000e+00
This page was generated using Literate.jl.