Commit f2a9fd49 authored by Fernando Pérez Panadero's avatar Fernando Pérez Panadero
Browse files

Version compatible with v1.1 of ferflow

parent 4c74d51a
Showing with 26 additions and 23 deletions
+26 -23
......@@ -131,7 +131,7 @@ end
Randomizes the SU2fund / SU3fund fermion field. If the argument t is present, it only randomizes that time-slice.
"""
function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,2}}}, lp::SpaceParm{4,6,BC_PERIODIC,D}, t::Int64 = 0) where {T,D}
function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,N}}}, lp::SpaceParm{4,6,BC_PERIODIC,D}, t::Int64 = 0) where {T,D,N}
@timeit "Randomize pseudofermion field" begin
p = ntuple(i->CUDA.randn(Complex{T}, lp.bsz, 3, lp.rsz),4) # complex generation not suported for Julia 1.5.4
......@@ -143,7 +143,7 @@ function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,2}}}, lp::SpaceParm{4
return nothing
end
function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,2}}}, lp::Union{SpaceParm{4,6,BC_SF_ORBI,D},SpaceParm{4,6,BC_SF_AFWB,D},SpaceParm{4,6,BC_OPEN,D}}, t::Int64 = 0) where {T,D}
function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,N}}}, lp::Union{SpaceParm{4,6,BC_SF_ORBI,D},SpaceParm{4,6,BC_SF_AFWB,D},SpaceParm{4,6,BC_OPEN,D}}, t::Int64 = 0) where {T,D,N}
@timeit "Randomize pseudofermion field" begin
p = ntuple(i->CUDA.randn(Complex{T}, lp.bsz, 3, lp.rsz),4) # complex generation not suported for Julia 1.5.4
......@@ -156,20 +156,20 @@ function pfrandomize!(f::AbstractArray{Spinor{4, SU3fund{T,2}}}, lp::Union{Space
return nothing
end
function krnl_assign_pf_su3!(f::AbstractArray{Spinor{4, SU3fund{T,2}}}, p , lp::SpaceParm, t::Int64) where {T}
function krnl_assign_pf_su3!(f::AbstractArray{Spinor{4, SU3fund{T,N}}}, p, lp::SpaceParm, t::Int64) where {T,N}
@inbounds begin
b = Int64(CUDA.threadIdx().x)
r = Int64(CUDA.blockIdx().x)
if t == 0
f[b,r] = Spinor(map(x->SU3fund{Float64,2}(Series{Complex{T},2}((x[b,1,r],zero(T))),
Series{Complex{T},2}((x[b,2,r],zero(T))),
Series{Complex{T},2}((x[b,3,r],zero(T)))),p))
f[b,r] = Spinor(map(x->SU3fund{Float64,N}(Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,1,r],N)),
Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,2,r],N)),
Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,2,r],N))),p))
elseif point_time((b,r),lp) == t
f[b,r] = Spinor(map(x->SU3fund{Float64,2}(Series{Complex{T},2}((x[b,1,r],zero(T))),
Series{Complex{T},2}((x[b,2,r],zero(T))),
Series{Complex{T},2}((x[b,3,r],zero(T)))),p))
f[b,r] = Spinor(map(x->SU3fund{Float64,N}(Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,1,r],N)),
Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,2,r],N)),
Series{Complex{T},N}(ntuple(i -> (i==1)*x[b,2,r],N))),p))
else
f[b,r] = 0.0*f[b,r]
end
......
......@@ -86,7 +86,10 @@ struct SU3fund{T,N}
t3::Series{Complex{T},N}
end
Base.zero(::Type{SU3fund{T,1}}) where T <: AbstractFloat = SU3fund{T,1}(zero(T),zero(T),zero(T))
Base.zero(::Type{SU3fund{T,2}}) where T <: AbstractFloat = SU3fund{T,2}(Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))),Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))),Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))))
# Base.zero(::Type{SU3fund{T,2}}) where T <: AbstractFloat = SU3fund{T,2}(Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))),Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))),Series{Complex{T},2}((zero(Complex{T}),zero(Complex{T}))))
Base.zero(::Type{SU3fund{T,N}}) where {T <: AbstractFloat,N} = SU3fund{T,N}(Series{Complex{T},N}(ntuple(i -> zero(Complex{T}),N)),
Series{Complex{T},N}(ntuple(i -> zero(Complex{T}),N)),
Series{Complex{T},N}(ntuple(i -> zero(Complex{T}),N)))
Random.rand(rng::AbstractRNG, ::Random.SamplerType{SU3fund{T,1}}) where T <: AbstractFloat = SU3fund{T,1}(complex(randn(rng,T),randn(rng,T)),
complex(randn(rng,T),randn(rng,T)),
complex(randn(rng,T),randn(rng,T)))
......
......@@ -33,7 +33,7 @@ end
Solves the linear equation `Ax = si`
"""
function CG!(si, U, A, dpar::DiracParam, lp::SpaceParm, dws::DiracWorkspace{T}, maxiter::Int64 = 10, tol=1.0) where {T}
function CG!(si, U, A, dpar::DiracParam{T,R,N} where R, lp::SpaceParm, dws::DiracWorkspace{T}, maxiter::Int64 = 10, tol=1.0) where {T,N}
dws.sr .= si
dws.sp .= si
......@@ -44,7 +44,7 @@ function CG!(si, U, A, dpar::DiracParam, lp::SpaceParm, dws::DiracWorkspace{T},
tol = abs((tol*norm).c[1])
iterations = 0
sumf = scalar_field(Series{Complex{T},2}, lp)
sumf = scalar_field(Series{Complex{T},N}, lp)
niter = 0
for i in 1:maxiter
......
......@@ -18,7 +18,7 @@ Saves the fermionic progapator in pro for a source at point `y` with color `c` a
by a random source in spin and color at t = `time`. Returns the number of iterations.
"""
function propagator!(pro, U, dpar::DiracParam{T,SU3fund{T,2}}, dws::DiracWorkspace, lp::SpaceParm, maxiter::Int64, tol::Float64, y::NTuple{4,Int64}, c::Int64, s::Int64) where {T}
function propagator!(pro, U, dpar::DiracParam{T,SU3fund{T,N},N}, dws::DiracWorkspace, lp::SpaceParm, maxiter::Int64, tol::Float64, y::NTuple{4,Int64}, c::Int64, s::Int64) where {T,N}
function krnlg5!(src)
b=Int64(CUDA.threadIdx().x)
......@@ -29,9 +29,9 @@ function propagator!(pro, U, dpar::DiracParam{T,SU3fund{T,2}}, dws::DiracWorkspa
@timeit "Propagator computation" begin
fill!(dws.sp,zero(Spinor{4,SU3fund{T,2}}))
fill!(dws.sp,zero(Spinor{4,SU3fund{T,N}}))
CUDA.@allowscalar dws.sp[point_index(CartesianIndex{lp.ndim}(y),lp)...] = Spinor{4,SU3fund{Float64,2}}(ntuple(i -> (i==s)*SU3fund{T,2}(ntuple(j -> (j==c)*Series{Complex{T},2}((complex(1.0,0.0),0.0)),3)...),4))
CUDA.@allowscalar dws.sp[point_index(CartesianIndex{lp.ndim}(y),lp)...] = Spinor{4,SU3fund{Float64,N}}(ntuple(i -> (i==s)*SU3fund{T,N}(ntuple(j -> (j==c)*Series{Complex{T},N}((complex(1.0,0.0),zeros(T,N-1)...)),3)...),4))
CUDA.@sync begin
CUDA.@cuda threads=lp.bsz blocks=lp.rsz krnlg5!(dws.sp)
......@@ -45,7 +45,7 @@ function propagator!(pro, U, dpar::DiracParam{T,SU3fund{T,2}}, dws::DiracWorkspa
return niter
end
function propagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::SpaceParm, maxiter::Int64, tol::Float64, time::Int64) where {T}
function propagator!(pro, U, dpar::DiracParam{T,SU3fund{T,N},N}, dws::DiracWorkspace, lp::SpaceParm, maxiter::Int64, tol::Float64, time::Int64) where {T,N}
function krnlg5!(src)
b=Int64(CUDA.threadIdx().x)
......@@ -55,7 +55,7 @@ function propagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::Space
end
@timeit "Propagator computation" begin
fill!(dws.sp,zero(Spinor{4,SU3fund{T,2}}))
fill!(dws.sp,zero(Spinor{4,SU3fund{T,N}}))
pfrandomize!(dws.sp,lp,time)
......@@ -79,7 +79,7 @@ Saves the propagator from the t=0 boundary to the bulk for the SF boundary condi
For the propagator from T to the bulk, use the function Tbndpropagator(U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64). Returns the number of iterations.
"""
function bndpropagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64) where {T,D}
function bndpropagator!(pro, U, dpar::DiracParam{T,SU3fund{T,N},N}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64) where {T,D,N}
function krnlg5!(src)
b=Int64(CUDA.threadIdx().x)
......@@ -94,7 +94,7 @@ function bndpropagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::Sp
if (point_time((b,r),lp) == 2)
bd4, rd4 = dw((b,r), 4, lp)
src[b,r] = gdagpmul(Pgamma{4,1},U[bd4,4,rd4],Spinor{4,SU3fund{Float64,2}}(ntuple(i -> (i==s)*SU3fund{T,2}(ntuple(j -> (j==c)*Series{Complex{Float64},2}((complex(1.0,0.0),0.0)),3)...),4)))/2
src[b,r] = gdagpmul(Pgamma{4,1},U[bd4,4,rd4],Spinor{4,SU3fund{Float64,N}}(ntuple(i -> (i==s)*SU3fund{T,N}(ntuple(j -> (j==c)*Series{Complex{Float64},N}(ntuple(k -> (k==1)*complex(1.0,0.0),N)),3)...),4)))/2
end
return nothing
......@@ -102,7 +102,7 @@ function bndpropagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::Sp
@timeit "Propagator computation" begin
SF_bndfix!(pro,lp)
fill!(dws.sp,zero(Spinor{4,SU3fund{T,2}}))
fill!(dws.sp,zero(Spinor{4,SU3fund{T,N}}))
CUDA.@sync begin
CUDA.@cuda threads=lp.bsz blocks=lp.rsz krnl_assign_bndsrc!(dws.sp, U, lp, c, s)
......@@ -128,7 +128,7 @@ Returns the propagator from the t=T boundary to the bulk for the SF boundary con
For the propagator from t=0 to the bulk, use the function bndpropagator(U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64). Returns the number of iterations.
"""
function Tbndpropagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64) where {T,D}
function Tbndpropagator!(pro, U, dpar::DiracParam{T,SU3fund{T,N},N}, dws::DiracWorkspace, lp::SpaceParm{4,6,1,D}, maxiter::Int64, tol::Float64, c::Int64, s::Int64) where {T,D,N}
function krnlg5!(src)
b=Int64(CUDA.threadIdx().x)
......@@ -142,14 +142,14 @@ function Tbndpropagator!(pro, U, dpar::DiracParam{T}, dws::DiracWorkspace, lp::S
r=Int64(CUDA.blockIdx().x)
if (point_time((b,r),lp) == lp.iL[end])
src[b,r] = gpmul(Pgamma{4,-1},U[b,4,r],Spinor{4,SU3fund{Float64,2}}(ntuple(i -> (i==s)*SU3fund{T,2}(ntuple(j -> (j==c)*Series{Complex{T},2}((complex(1.0,0.0),0.0)),3)...),4)))/2
src[b,r] = gpmul(Pgamma{4,-1},U[b,4,r],Spinor{4,SU3fund{Float64,N}}(ntuple(i -> (i==s)*SU3fund{T,N}(ntuple(j -> (j==c)*Series{Complex{T},N}(ntuple(k -> (k==1)*complex(1.0,0.0),N)),3)...),4)))/2
end
return nothing
end
@timeit "Propagator computation" begin
fill!(dws.sp,zero(Spinor{4,SU3fund{T,2}}))
fill!(dws.sp,zero(Spinor{4,SU3fund{T,N}}))
CUDA.@sync begin
CUDA.@cuda threads=lp.bsz blocks=lp.rsz krnl_assign_bndsrc!(dws.sp, U, lp, c, s)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment