SF boundary conditions for Wilson action conserve energy

This commit is contained in:
Alberto Ramos 2021-10-24 16:47:41 +02:00
parent 74e22502e3
commit ee1776c665
6 changed files with 136 additions and 49 deletions

View file

@ -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