DVR-jl/irrep.jl

75 lines
2.3 KiB
Julia

using DelimitedFiles, LinearAlgebra, StatsBase
function calculate_all_data(N::Int)
ks = -N÷2:N÷2-1
lattice = hcat((collect.(Iterators.product(ks, ks, ks)))...)
unique_i = collect(1:N^3)
multiplicity = fill(1, length(unique_i))
unique_point = transpose(lattice)
return unique_i, unique_point, multiplicity
end
function calculate_A1_data(N::Int)
rotations = readdlm("rotations.mat", ',', Int, '\n')
rotations = reshape(rotations, (24, 3, 3))
ks = -N÷2:N÷2-1
lattice = hcat((collect.(Iterators.product(ks, ks, ks)))...)
labels = reshape(collect(1:N^3), (N, N, N))
for r in 1:24
rotated_lattice = Matrix(rotations[r, :, :]) * lattice
for index in 1:N^3
rotated_lattice_point = rotated_lattice[:, index]
(i, j, k) = mod1.(rotated_lattice_point .+ (N÷2 + 1), N)
old_label = max(labels[index], labels[i, j, k])
new_label = min(labels[index], labels[i, j, k])
if old_label != new_label
for o in findall(isequal(old_label), labels)
labels[o] = new_label
end
end
end
end
unique_i = unique(labels)
multiplicity = countmap(labels)
unique_point = transpose(lattice[unique_i, :])
return unique_i, unique_point, multiplicity
end
function sym_reduce(s, K_partial)
I = one(K_partial)
K_partial_x = kron(kron(K_partial, I), I)
K_partial_y = kron(kron(I, K_partial), I)
K_partial_z = kron(kron(I, I), K_partial)
# for s in 1:N^3
# if labels[s] != s
# for mat in (K_partial_x, K_partial_y, K_partial_z)
# mat[labels[s], :] += mat[s, :]
# mat[s, :] = 0
# mat[:, labels[s]] += mat[:, s]
# mat[:, s] = 0
# end
# end
# end
for i in s.unique_i
K_partial_x[i, :] *= s.multiplicity[i]
K_partial_x[:, i] *= s.multiplicity[i]
K_partial_y[i, :] *= s.multiplicity[i]
K_partial_y[:, i] *= s.multiplicity[i]
K_partial_z[i, :] *= s.multiplicity[i]
K_partial_z[:, i] *= s.multiplicity[i]
end
K_partial_x = K_partial_x[s.unique_i, s.unique_i]
K_partial_y = K_partial_y[s.unique_i, s.unique_i]
K_partial_z = K_partial_z[s.unique_i, s.unique_i]
return K_partial_x, K_partial_y, K_partial_z
end