Naive n-body extension
This commit is contained in:
parent
53e18beed4
commit
fe46a8e44b
|
|
@ -11,6 +11,7 @@ struct Hamiltonian{T}
|
||||||
K_mixed::Union{CuTensor{Complex{T}},Nothing}
|
K_mixed::Union{CuTensor{Complex{T}},Nothing}
|
||||||
K_partial_1::Union{Tuple,Nothing}
|
K_partial_1::Union{Tuple,Nothing}
|
||||||
K_partial_2::Union{Tuple,Nothing}
|
K_partial_2::Union{Tuple,Nothing}
|
||||||
|
K_partial_c::Union{Tuple,Nothing}
|
||||||
Vs::Union{Array{Complex{T}},CuArray{Complex{T}}}
|
Vs::Union{Array{Complex{T}},CuArray{Complex{T}}}
|
||||||
hermitian::Bool
|
hermitian::Bool
|
||||||
mode::Hamiltonian_backend
|
mode::Hamiltonian_backend
|
||||||
|
|
@ -20,7 +21,7 @@ struct Hamiltonian{T}
|
||||||
k = -s.N÷2:s.N÷2-1
|
k = -s.N÷2:s.N÷2-1
|
||||||
hermitian = ϕ == 0.0
|
hermitian = ϕ == 0.0
|
||||||
K_partial = (exp(-im * convert(T, ϕ)) * im / sqrt(2 * s.μ)) .* ∂_1DOF.(Ref(s), k, k')
|
K_partial = (exp(-im * convert(T, ϕ)) * im / sqrt(2 * s.μ)) .* ∂_1DOF.(Ref(s), k, k')
|
||||||
K_partial_1, K_partial_2 = sym_reduce(s, K_partial)
|
K_partial_1, K_partial_2, K_partial_c = sym_reduce(s, K_partial)
|
||||||
Vs = calculate_Vs(s, V_twobody, convert(T, ϕ), n_image)
|
Vs = calculate_Vs(s, V_twobody, convert(T, ϕ), n_image)
|
||||||
if mode == gpu_cutensor
|
if mode == gpu_cutensor
|
||||||
K_diag = CuTensor(CuArray(K_partial * K_partial), ['a', 'A'])
|
K_diag = CuTensor(CuArray(K_partial * K_partial), ['a', 'A'])
|
||||||
|
|
@ -30,7 +31,7 @@ struct Hamiltonian{T}
|
||||||
K_diag = nothing
|
K_diag = nothing
|
||||||
K_mixed = nothing
|
K_mixed = nothing
|
||||||
end
|
end
|
||||||
return new{T}(s, K_partial, K_diag, K_mixed, K_partial_1, K_partial_2, Vs, hermitian, mode)
|
return new{T}(s, K_partial, K_diag, K_mixed, K_partial_1, K_partial_2, K_partial_c, Vs, hermitian, mode)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -62,8 +63,14 @@ function LinearAlgebra.mul!(out::Array{Complex{T}}, H::Hamiltonian{T}, v::Array{
|
||||||
end
|
end
|
||||||
nconList_v[i2] = 2
|
nconList_v[i2] = 2
|
||||||
|
|
||||||
tensor1 = coord1 == 1 ? H.K_partial_1[dim] : H.K_partial
|
if coord1 == 1 && coord2 == 1
|
||||||
tensor2 = coord2 == 1 ? H.K_partial_2[dim] : H.K_partial
|
tensor1 = H.K_partial_1[dim]
|
||||||
|
tensor2 = H.K_partial_2[dim]
|
||||||
|
else
|
||||||
|
tensor1 = coord1 == 1 ? H.K_partial_c[dim] : H.K_partial
|
||||||
|
tensor2 = coord2 == 1 ? H.K_partial_c[dim] : H.K_partial
|
||||||
|
end
|
||||||
|
|
||||||
v_new = @ncon((tensor1, tensor2, v), (nconList_1, nconList_2, nconList_v))
|
v_new = @ncon((tensor1, tensor2, v), (nconList_1, nconList_2, nconList_v))
|
||||||
|
|
||||||
out = axpy!(1, v_new, out)
|
out = axpy!(1, v_new, out)
|
||||||
|
|
|
||||||
14
irrep.jl
14
irrep.jl
|
|
@ -49,6 +49,10 @@ function sym_reduce(s, K_partial)
|
||||||
K_partial_y1 = kron(kron(I, K_partial), I)
|
K_partial_y1 = kron(kron(I, K_partial), I)
|
||||||
K_partial_z1 = kron(kron(I, I), K_partial)
|
K_partial_z1 = kron(kron(I, I), K_partial)
|
||||||
|
|
||||||
|
K_partial_x1 = K_partial_x1[s.unique_i, :]
|
||||||
|
K_partial_y1 = K_partial_y1[s.unique_i, :]
|
||||||
|
K_partial_z1 = K_partial_z1[s.unique_i, :]
|
||||||
|
|
||||||
K_partial_x2 = kron(kron(K_partial, I), I)
|
K_partial_x2 = kron(kron(K_partial, I), I)
|
||||||
K_partial_y2 = kron(kron(I, K_partial), I)
|
K_partial_y2 = kron(kron(I, K_partial), I)
|
||||||
K_partial_z2 = kron(kron(I, I), K_partial)
|
K_partial_z2 = kron(kron(I, I), K_partial)
|
||||||
|
|
@ -61,13 +65,13 @@ function sym_reduce(s, K_partial)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
K_partial_x1 = K_partial_x1[s.unique_i, :]
|
|
||||||
K_partial_y1 = K_partial_y1[s.unique_i, :]
|
|
||||||
K_partial_z1 = K_partial_z1[s.unique_i, :]
|
|
||||||
|
|
||||||
K_partial_x2 = K_partial_x2[:, s.unique_i]
|
K_partial_x2 = K_partial_x2[:, s.unique_i]
|
||||||
K_partial_y2 = K_partial_y2[:, s.unique_i]
|
K_partial_y2 = K_partial_y2[:, s.unique_i]
|
||||||
K_partial_z2 = K_partial_z2[:, s.unique_i]
|
K_partial_z2 = K_partial_z2[:, s.unique_i]
|
||||||
|
|
||||||
return (K_partial_x1, K_partial_y1, K_partial_z1), (K_partial_x2, K_partial_y2, K_partial_z2)
|
K_partial_xc = K_partial_x2[s.unique_i, :]
|
||||||
|
K_partial_yc = K_partial_y2[s.unique_i, :]
|
||||||
|
K_partial_zc = K_partial_z2[s.unique_i, :]
|
||||||
|
|
||||||
|
return (K_partial_x1, K_partial_y1, K_partial_z1), (K_partial_x2, K_partial_y2, K_partial_z2), (K_partial_xc, K_partial_yc, K_partial_zc)
|
||||||
end
|
end
|
||||||
|
|
@ -8,8 +8,8 @@ function V_test(r2)
|
||||||
return -4*exp(-r2/4)
|
return -4*exp(-r2/4)
|
||||||
end
|
end
|
||||||
|
|
||||||
n = 2
|
n = 3
|
||||||
N = 16
|
N = 8
|
||||||
println("\n$n-body system with N=$N")
|
println("\n$n-body system with N=$N")
|
||||||
|
|
||||||
for L::T in [16]
|
for L::T in [16]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue