subroutine analyze_wavefunction_symmetry()
! driver routine to analyze the symmetry of a part of the
! wavefunction.
integer :: sym_orbs(nBasis / 2), orig_orbs(nBasis / 2)
integer :: i, transformed_states(nel, n_symmetry_states)
real(dp) :: transformed_weights(n_symmetry_states)
integer(n_int) :: transformed_states_ilut(0:niftot, n_symmetry_states)
! i have the original list of the orbitals and the
! corresponding k- or r-vectors.
call init_symmetry_states()
if (iProcIndex == root) then
print *, "Analyze the symmetry of the FCIQMC wavefunction: "
if (t_symmetry_rotation) then
print *, "applying rotation of ", symmetry_rotation_angle, " degrees"
end if
if (t_symmetry_mirror) then
print *, "mirror wf. along ", symmertry_mirror_axis, "-axis"
end if
if (t_symmetry_inversion) then
print *, "apply inversion symmetry"
end if
if (t_read_symmetry_states) then
print *, "using the ", n_symmetry_states, " read-in states: "
do i = 1, n_symmetry_states
print *, symmetry_states(:, i)
end do
end if
if (t_pop_symmetry_states) then
print *, "using the ", n_symmetry_states, " highest occupied states"
do i = 1, n_symmetry_states
print *, symmetry_states(:, i)
end do
end if
! first check if everything is setup correctly..
print *, "brr:"
do i = 1, nBasis
print *, brr(i)
end do
print *, "i, lat%ind, lat%get_sym, lat%get_k_vec"
do i = 1, nBasis / 2
print *, i, lat%get_site_index(i), lat%get_sym(i), lat%get_k_vec(i)
end do
call writebasis(stdout, g1, nBasis, arr, brr)
! i need to apply the chosen symmetry to the vectors and determine,
! which orbital maps into which
! the flag if we actually apply is within the functions.
! ROTATION:
orig_orbs = get_spatial(brr(1:nBasis:2))
sym_orbs = apply_rotation(orig_orbs, symmetry_rotation_angle)
print *, "orig orbs -> sym_orbs: "
do i = 1, nBasis / 2
print *, orig_orbs(i), " -> ", sym_orbs(i)
end do
! i can ofc apply multiple symmetries
! MIRROR
sym_orbs = apply_mirror(sym_orbs, symmertry_mirror_axis)
! INVERSION
sym_orbs = apply_inversion(sym_orbs)
! now i have the mapping between the original and the
! symmetry transformed orbitals
call transform_states(orig_orbs, sym_orbs, n_symmetry_states, &
symmetry_states, symmetry_weights, symmetry_states_ilut, transformed_states, &
transformed_weights, transformed_states_ilut)
call compare_states(n_symmetry_states, symmetry_states_ilut, transformed_states_ilut)
end if
end subroutine analyze_wavefunction_symmetry