function apply_2D_point_group(ilut_list) result(trans_wf)
! apply the point group symmetries of a 2D square lattice
integer(n_int), intent(inout) :: ilut_list(:, :)
integer(n_int), allocatable :: trans_wf(:, :, :)
integer :: i, j
real(dp) :: rot_angle
character(4) :: mir_axis
integer :: sort_ind(size(ilut_list, 2))
integer :: matrix(size(ilut_list, 2), size(ilut_list, 2))
real(dp) :: signI(lenof_sign), signJ(lenof_sign)
allocate(trans_wf(0:niftot, size(ilut_list, 2), 9))
trans_wf = 0_n_int
rot_angle = 0.0_dp
do i = 1, 4
trans_wf(:, :, i) = apply_rotation_wf(ilut_list, rot_angle)
rot_angle = rot_angle + 90.0_dp
end do
mir_axis = 'xydo'
do i = 5, 8
trans_wf(:, :, i) = apply_mirror_wf(ilut_list, mir_axis(i - 4:i - 4), sort_ind)
end do
trans_wf(:, :, 9) = apply_inversion_wf(ilut_list)
end function apply_2D_point_group