mirror of
https://igit.ific.uv.es/alramos/latticegpu.jl.git
synced 2025-07-02 14:59:26 +02:00
SF boundary conditions for Wilson action conserve energy
This commit is contained in:
parent
74e22502e3
commit
ee1776c665
6 changed files with 136 additions and 49 deletions
|
@ -95,18 +95,22 @@ function krnl_impr!(plx, U::AbstractArray{T}, c0, c1, lp::SpaceParm{N,M,BC_PERIO
|
|||
return nothing
|
||||
end
|
||||
|
||||
function krnl_plaq!(plx, U::AbstractArray{T}, lp::SpaceParm{N,M,BC_PERIODIC,D}) where {T,N,M,D}
|
||||
function krnl_plaq!(plx, U::AbstractArray{T}, Ubnd::T, cG, lp::SpaceParm{N,M,B,D}) where {T,N,M,B,D}
|
||||
|
||||
b, r = CUDA.threadIdx().x, CUDA.blockIdx().x
|
||||
it = point_time((b, r), lp)
|
||||
|
||||
ITBND = (it == 1) || (it == lp.iL[end])
|
||||
SFBC = ((B == BC_SF_AFWB) || (B == BC_SF_ORBI) )
|
||||
|
||||
Ush = @cuStaticSharedMem(T, (D,2))
|
||||
|
||||
S = zero(eltype(plx))
|
||||
for id1 in 1:N-1
|
||||
for id1 in N:-1:1
|
||||
bu1, ru1 = up((b, r), id1, lp)
|
||||
Ush[b,1] = U[b,id1,r]
|
||||
|
||||
for id2 = id1+1:N
|
||||
for id2 = 1:id1-1
|
||||
bu2, ru2 = up((b, r), id2, lp)
|
||||
Ush[b,2] = U[b,id2,r]
|
||||
sync_threads()
|
||||
|
@ -114,15 +118,23 @@ function krnl_plaq!(plx, U::AbstractArray{T}, lp::SpaceParm{N,M,BC_PERIODIC,D})
|
|||
if ru1 == r
|
||||
gt1 = Ush[bu1,2]
|
||||
else
|
||||
gt1 = U[bu1,id2,ru1]
|
||||
if SFBC && (it == lp.iL[end]) && (id1 == N)
|
||||
gt1 = Ubnd
|
||||
else
|
||||
gt1 = U[bu1,id2,ru1]
|
||||
end
|
||||
end
|
||||
if ru2 == r
|
||||
gt2 = Ush[bu2,1]
|
||||
else
|
||||
gt2 = U[bu2,id1,ru2]
|
||||
end
|
||||
|
||||
S += tr(Ush[b,1]*gt1 / (Ush[b,2]*gt2))
|
||||
|
||||
if ITBND && SFBC && (id1 == N)
|
||||
S += cG*tr(Ush[b,1]*gt1 / (Ush[b,2]*gt2))
|
||||
else
|
||||
S += tr(Ush[b,1]*gt1 / (Ush[b,2]*gt2))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -132,9 +144,13 @@ function krnl_plaq!(plx, U::AbstractArray{T}, lp::SpaceParm{N,M,BC_PERIODIC,D})
|
|||
return nothing
|
||||
end
|
||||
|
||||
function krnl_force_wilson_pln!(frc1, frc2, U::AbstractArray{T}, ipl, lp::SpaceParm{N,M,BC_PERIODIC,D}) where {T,N,M,D}
|
||||
function krnl_force_wilson_pln!(frc1, frc2, U::AbstractArray{T}, Ubnd::T, cG, ipl, lp::SpaceParm{N,M,B,D}) where {T,N,M,B,D}
|
||||
|
||||
b, r = CUDA.threadIdx().x, CUDA.blockIdx().x
|
||||
it = point_time((b, r), lp)
|
||||
|
||||
ITBND = (it == 1) || (it == lp.iL[end])
|
||||
SFBC = ((B == BC_SF_AFWB) || (B == BC_SF_ORBI) )
|
||||
|
||||
Ush = @cuStaticSharedMem(T, (D,2))
|
||||
|
||||
|
@ -155,20 +171,39 @@ function krnl_force_wilson_pln!(frc1, frc2, U::AbstractArray{T}, ipl, lp::SpaceP
|
|||
if ru1 == r
|
||||
gt1 = Ush[bu1,2]
|
||||
else
|
||||
gt1 = U[bu1,id2,ru1]
|
||||
if SFBC && (it == lp.iL[end]) && (id1 == N)
|
||||
gt1 = Ubnd
|
||||
else
|
||||
gt1 = U[bu1,id2,ru1]
|
||||
end
|
||||
end
|
||||
|
||||
g1 = gt1/gt2
|
||||
g2 = Ush[b,2]\Ush[b,1]
|
||||
|
||||
X = projalg(Ush[b,1]*g1/Ush[b,2])
|
||||
|
||||
frc1[b ,id1, r ] -= X
|
||||
frc1[b ,id2, r ] += X
|
||||
frc2[bu1,id2,ru1] -= projalg(g1*g2)
|
||||
frc2[bu2,id1,ru2] += projalg(g2*g1)
|
||||
|
||||
if SFBC && (it == 1) && (id1 == N)
|
||||
X = cG*projalg(Ush[b,1]*g1/Ush[b,2])
|
||||
|
||||
frc1[b ,id1, r ] -= X
|
||||
frc2[bu1,id2,ru1] -= cG*projalg(g1*g2)
|
||||
frc2[bu2,id1,ru2] += cG*projalg(g2*g1)
|
||||
elseif SFBC && (it == lp.iL[end]) && (id1 == N)
|
||||
X = cG*projalg(Ush[b,1]*g1/Ush[b,2])
|
||||
|
||||
frc1[b ,id1, r ] -= X
|
||||
frc1[b ,id2, r ] += X
|
||||
frc2[bu2,id1,ru2] += cG*projalg(g2*g1)
|
||||
else
|
||||
X = projalg(Ush[b,1]*g1/Ush[b,2])
|
||||
|
||||
frc1[b ,id1, r ] -= X
|
||||
frc1[b ,id2, r ] += X
|
||||
frc2[bu1,id2,ru1] -= projalg(g1*g2)
|
||||
frc2[bu2,id1,ru2] += projalg(g2*g1)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
return nothing
|
||||
end
|
||||
|
||||
|
@ -308,31 +343,33 @@ end
|
|||
Computes the force deriving from the Wilson plaquette action, without
|
||||
the prefactor 1/g0^2, and assign it to the workspace force `ymws.frc1`
|
||||
"""
|
||||
function force_gauge(ymws::YMworkspace, U, c0, lp::SpaceParm)
|
||||
function force_gauge(ymws::YMworkspace, U, c0, cG, gp::GaugeParm, lp::SpaceParm)
|
||||
|
||||
if abs(c0-1) < 1.0E-10
|
||||
@timeit "Wilson gauge force" begin
|
||||
force_wilson_pln!(ymws.frc1, ymws.frc2, U, lp::SpaceParm)
|
||||
force_pln!(ymws.frc1, ymws.frc2, U, gp.Ubnd, cG, lp::SpaceParm)
|
||||
end
|
||||
else
|
||||
@timeit "Improved gauge force" begin
|
||||
force_wilson_pln!(ymws.frc1, ymws.frc2, U, lp::SpaceParm, c0)
|
||||
force_pln!(ymws.frc1, ymws.frc2, U, nothing, nothing, lp::SpaceParm, c0)
|
||||
end
|
||||
end
|
||||
return nothing
|
||||
end
|
||||
|
||||
force_wilson(ymws::YMworkspace, U, lp::SpaceParm) = force_gauge(ymws, U, 1, lp)
|
||||
force_gauge(ymws::YMworkspace, U, c0, gp, lp) = force_gauge(ymws, U, c0, gp.cG[1], gp, lp)
|
||||
force_wilson(ymws::YMworkspace, U, gp::GaugeParm, lp::SpaceParm) = force_gauge(ymws, U, 1, gp, lp)
|
||||
force_wilson(ymws::YMworkspace, U, cG, gp::GaugeParm, lp::SpaceParm) = force_gauge(ymws, U, 1, gp.cG[1], gp, lp)
|
||||
|
||||
|
||||
function force_wilson_pln!(frc1, ftmp, U, lp::SpaceParm, c0=1)
|
||||
function force_pln!(frc1, ftmp, U, Ubnd, cG, lp::SpaceParm, c0=1)
|
||||
|
||||
fill!(frc1, zero(eltype(frc1)))
|
||||
fill!(ftmp, zero(eltype(ftmp)))
|
||||
if c0 == 1
|
||||
for i in 1:lp.npls
|
||||
CUDA.@sync begin
|
||||
CUDA.@cuda threads=lp.bsz blocks=lp.rsz krnl_force_wilson_pln!(frc1,ftmp,U,i,lp)
|
||||
CUDA.@cuda threads=lp.bsz blocks=lp.rsz krnl_force_wilson_pln!(frc1,ftmp,U, Ubnd, cG,i,lp)
|
||||
end
|
||||
end
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue