Parity symmetry reduction
This commit is contained in:
parent
4fa01f80e1
commit
e3b06b8bcd
19
ho_basis.jl
19
ho_basis.jl
|
|
@ -35,7 +35,7 @@ function get_2p_basis(E_max)
|
||||||
l2s = Int[]
|
l2s = Int[]
|
||||||
|
|
||||||
# E = 2*n1 + l1 + 2*n2 + l2
|
# E = 2*n1 + l1 + 2*n2 + l2
|
||||||
for E in 0 : E_max
|
for E in E_max : -2 : 0 # same parity states only
|
||||||
for n1 in 0 : E ÷ 2
|
for n1 in 0 : E ÷ 2
|
||||||
for n2 in 0 : (E - 2*n1) ÷ 2
|
for n2 in 0 : (E - 2*n1) ÷ 2
|
||||||
for l1 in 0 : (E - 2*n1 - 2*n2)
|
for l1 in 0 : (E - 2*n1 - 2*n2)
|
||||||
|
|
@ -83,21 +83,17 @@ function sp_V_matrix(V_l, ns, ls; mask=trues(length(ns),length(ns)), dtype=Float
|
||||||
end
|
end
|
||||||
|
|
||||||
function Moshinsky_transform(Es, n1s, l1s, n2s, l2s, Λ)
|
function Moshinsky_transform(Es, n1s, l1s, n2s, l2s, Λ)
|
||||||
Emax = maximum(Es)
|
NQMAX = maximum(Es)
|
||||||
|
@assert all(mod.(Es, 2) .== mod(NQMAX, 2)) "Can only admit basis states with same parity"
|
||||||
|
|
||||||
LMIN = Λ
|
LMIN = Λ
|
||||||
LMAX = Λ
|
LMAX = Λ
|
||||||
CO = 1/sqrt(2)
|
CO = 1/sqrt(2)
|
||||||
SI = 1/sqrt(2)
|
SI = 1/sqrt(2)
|
||||||
|
|
||||||
BRACs = Vector{Array{Float64}}(undef, 2) # two arrays for both parities
|
# dimensions BRAC(0:LMAX,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:LMAX,0:(NQMAX-LMIN)/2,LMIN:LMAX)
|
||||||
|
BRAC = zeros(Float64, 1 + LMAX, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + LMAX, 1 + (NQMAX-LMIN) ÷ 2, 1 + LMAX-LMIN)
|
||||||
for parity in 1:2
|
@ccall "../OSBRACKETS/allosbrac.so".allosbrac_(NQMAX::Ref{Int32},LMIN::Ref{Int32},LMAX::Ref{Int32},CO::Ref{Float64},SI::Ref{Float64},BRAC::Ptr{Array{Float64}})::Cvoid
|
||||||
NQMAX = Emax - mod1(Emax, 2) + parity
|
|
||||||
# dimensions BRAC(0:LMAX,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:(NQMAX-LMIN)/2,0:LMAX,0:(NQMAX-LMIN)/2,LMIN:LMAX)
|
|
||||||
BRACs[parity] = zeros(Float64, 1 + LMAX, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + (NQMAX - LMIN) ÷ 2, 1 + LMAX, 1 + (NQMAX-LMIN) ÷ 2, 1 + LMAX-LMIN)
|
|
||||||
@ccall "../OSBRACKETS/allosbrac.so".allosbrac_(NQMAX::Ref{Int32},LMIN::Ref{Int32},LMAX::Ref{Int32},CO::Ref{Float64},SI::Ref{Float64},BRACs[parity]::Ptr{Array{Float64}})::Cvoid
|
|
||||||
end
|
|
||||||
|
|
||||||
mat = zeros(length(Es), length(Es))
|
mat = zeros(length(Es), length(Es))
|
||||||
|
|
||||||
|
|
@ -107,8 +103,7 @@ function Moshinsky_transform(Es, n1s, l1s, n2s, l2s, Λ)
|
||||||
(Elhs, N, L, n, l) = s[i, :]
|
(Elhs, N, L, n, l) = s[i, :]
|
||||||
(Erhs, n1, l1, n2, l2) = s[j, :]
|
(Erhs, n1, l1, n2, l2) = s[j, :]
|
||||||
if Elhs == Erhs && triangle_ineq(L, l, Λ) && triangle_ineq(l1, l2, Λ)
|
if Elhs == Erhs && triangle_ineq(L, l, Λ) && triangle_ineq(l1, l2, Λ)
|
||||||
parity = mod1(Elhs, 2)
|
mat[i, j] = (-1)^(n1 + n2 + N + n) * pick_Moshinsky_brakcet(BRAC, n1, l1, n2, l2, N, L, n, l, Λ)
|
||||||
mat[i, j] = (-1)^(n1 + n2 + N + n) * pick_Moshinsky_brakcet(BRACs[parity], n1, l1, n2, l2, N, L, n, l, Λ)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue