mirror of
https://igit.ific.uv.es/alramos/latticegpu.jl.git
synced 2025-07-01 06:19:28 +02:00
Non-seg-fault HMC. Energy not conserved.
This commit is contained in:
parent
5bb4f28c8b
commit
f296fd9768
8 changed files with 172 additions and 40 deletions
36
src/YM/YM.jl
36
src/YM/YM.jl
|
@ -12,14 +12,46 @@
|
|||
|
||||
module YM
|
||||
|
||||
using CUDA, Random, StructArrays
|
||||
using ..Space
|
||||
using ..Groups
|
||||
|
||||
struct GaugeParm
|
||||
beta::Float64
|
||||
cG::Tuple{Float64,Float64}
|
||||
ng::Int32
|
||||
end
|
||||
export GaugeParm
|
||||
|
||||
include("YMact.jl")
|
||||
export krnl_plaq!
|
||||
include("YMfields.jl")
|
||||
export field, randomn!, zero!, norm2
|
||||
|
||||
struct YMworkspace
|
||||
frc1
|
||||
frc2
|
||||
mom
|
||||
U1
|
||||
cm # complex of volume
|
||||
function YMworkspace(::Type{T}, lp::SpaceParm) where {T <: Union{Group,Algebra}}
|
||||
|
||||
if (T == SU2)
|
||||
f1 = field(SU2alg, lp)
|
||||
f2 = field(SU2alg, lp)
|
||||
mm = field(SU2alg, lp)
|
||||
u1 = field(SU2, lp)
|
||||
cs = zeros(ComplexF64,lp.iL...)
|
||||
rs = zeros(Float64, lp.iL...)
|
||||
return new(f1, f2, mm, u1, replace_storage(CuArray, cs))
|
||||
end
|
||||
return nothing
|
||||
end
|
||||
end
|
||||
export YMworkspace
|
||||
|
||||
include("YMact.jl")
|
||||
export krnl_plaq!, force0_wilson!
|
||||
|
||||
include("YMhmc.jl")
|
||||
export gauge_action, hamiltonian, HMC!, OMF4!
|
||||
|
||||
end
|
||||
|
|
|
@ -11,12 +11,12 @@
|
|||
|
||||
function krnl_plaq!(plx, U, ipl, lp::SpaceParm)
|
||||
|
||||
id1, id2 = lp.plidx(ipl)
|
||||
id1, id2 = lp.plidx[ipl]
|
||||
X = map2latt((CUDA.threadIdx().x,CUDA.threadIdx().y,CUDA.threadIdx().z),
|
||||
(CUDA.blockIdx().x,CUDA.blockIdx().y,CUDA.blockIdx().z))
|
||||
Xu1 = up(X, id1)
|
||||
Xu2 = up(X, id2)
|
||||
|
||||
Xu1 = up(X, id1, lp)
|
||||
Xu2 = up(X, id2, lp)
|
||||
|
||||
plx[X] = tr(U[X, id1]*U[Xu1, id2] / (U[X, id2]*U[Xu2, id1]))
|
||||
|
||||
return nothing
|
||||
|
@ -27,15 +27,51 @@ function krnl_plaq!(plx, U, lp::SpaceParm)
|
|||
X = map2latt((CUDA.threadIdx().x,CUDA.threadIdx().y,CUDA.threadIdx().z),
|
||||
(CUDA.blockIdx().x,CUDA.blockIdx().y,CUDA.blockIdx().z))
|
||||
|
||||
plx[X] = 0.0
|
||||
plx[X] = complex(0.0)
|
||||
for ipl in 1:lp.npls
|
||||
id1, id2 = lp.plidx(ipl)
|
||||
Xu1 = up(X, id1)
|
||||
Xu2 = up(X, id2)
|
||||
id1, id2 = lp.plidx[ipl]
|
||||
Xu1 = up(X, id1, lp)
|
||||
Xu2 = up(X, id2, lp)
|
||||
|
||||
plx[X] += tr(U[X, id1]*U[Xu1, id2] / (U[X, id2]*U[Xu2, id1]))
|
||||
end
|
||||
plx[X] = plx[X]/lp.npls
|
||||
|
||||
return nothing
|
||||
end
|
||||
|
||||
function krnl_force_wilson_pln!(frc1, frc2, U, ipl, lp::SpaceParm, gp::GaugeParm)
|
||||
|
||||
X = map2latt((CUDA.threadIdx().x,CUDA.threadIdx().y,CUDA.threadIdx().z),
|
||||
(CUDA.blockIdx().x,CUDA.blockIdx().y,CUDA.blockIdx().z))
|
||||
|
||||
id1, id2 = lp.plidx[ipl]
|
||||
Xu1 = up(X, id1, lp)
|
||||
Xu2 = up(X, id2, lp)
|
||||
|
||||
a = U[Xu1,id2]/U[Xu2,id1]
|
||||
b = U[X ,id2]\U[X ,id1]
|
||||
|
||||
F1 = projalg(U[X,id1]*a/U[X,id2])
|
||||
F2 = projalg(a*b)
|
||||
F3 = projalg(b*a)
|
||||
|
||||
frc1[X ,id1] -= F1
|
||||
frc1[X ,id2] += F1
|
||||
frc2[Xu1,id2] -= F2
|
||||
frc2[Xu2,id1] += F3
|
||||
|
||||
return nothing
|
||||
end
|
||||
|
||||
function force0_wilson!(frc1, frc2, U, lp::SpaceParm, gp::GaugeParm, kp::KernelParm)
|
||||
|
||||
zero!(frc1)
|
||||
zero!(frc2)
|
||||
for ipl in 1:lp.npls
|
||||
CUDA.@sync begin
|
||||
CUDA.@cuda threads=kp.threads blocks=kp.blocks krnl_force_wilson_pln!(frc1,frc2,U,ipl,lp,gp)
|
||||
end
|
||||
end
|
||||
|
||||
return nothing
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue