kmesh_bvectors_perm Subroutine

private subroutine kmesh_bvectors_perm(bvec, bref, num_kpt, num_bvec, perm, invperm, revind, error, comm)

Obtain possible permutation in ordering of b-vectors at different kpoints

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: bvec(:,:,:)
real(kind=dp), intent(in) :: bref(:,:)
integer, intent(in) :: num_kpt
integer, intent(in) :: num_bvec
integer, intent(inout) :: perm(:,:)
integer, intent(inout) :: invperm(:,:)
integer, intent(inout) :: revind(:,:)
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~kmesh_bvectors_perm~~CallsGraph proc~kmesh_bvectors_perm kmesh_bvectors_perm proc~set_error_fatal set_error_fatal proc~kmesh_bvectors_perm->proc~set_error_fatal proc~comms_sync_error comms_sync_error proc~set_error_fatal->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_fatal->proc~set_base_error

Called by

proc~~kmesh_bvectors_perm~~CalledByGraph proc~kmesh_bvectors_perm kmesh_bvectors_perm proc~kmesh_get kmesh_get proc~kmesh_get->proc~kmesh_bvectors_perm proc~w90_create_kmesh w90_create_kmesh proc~w90_create_kmesh->proc~kmesh_get program~postw90 postw90 program~postw90->proc~kmesh_get proc~w90_get_gkpb~2 w90_get_gkpb proc~w90_get_gkpb~2->proc~w90_create_kmesh proc~w90_get_nnkp~2 w90_get_nnkp proc~w90_get_nnkp~2->proc~w90_create_kmesh proc~w90_get_nn~2 w90_get_nn proc~w90_get_nn~2->proc~w90_create_kmesh proc~write_kmesh write_kmesh proc~write_kmesh->proc~w90_create_kmesh proc~w90_get_gkpb w90_get_gkpb proc~w90_get_gkpb->proc~w90_get_gkpb~2 proc~w90_get_nn w90_get_nn proc~w90_get_nn->proc~w90_get_nn~2 proc~w90_get_nnkp w90_get_nnkp proc~w90_get_nnkp->proc~w90_get_nnkp~2 program~wannier wannier program~wannier->proc~w90_get_nn~2 program~wannier->proc~write_kmesh

Source Code

  subroutine kmesh_bvectors_perm(bvec, bref, num_kpt, num_bvec, perm, invperm, revind, error, comm)
    !================================================
    !
    !!  Obtain possible permutation in ordering of b-vectors at different kpoints
    !
    !================================================
    implicit none

    ! arguments
    real(kind=dp), intent(in) :: bvec(:, :, :) ! set of bvecs for each k, possibly permuted, size (3,num_bvec,num_kpt)
    real(kind=dp), intent(in) :: bref(:, :) ! reference vector ordering, size (3,num_bvec)
    integer, intent(in) :: num_kpt, num_bvec
    integer, intent(inout) :: perm(:, :) ! assumed allocated
    integer, intent(inout) :: invperm(:, :) ! assumed allocated
    integer, intent(inout) :: revind(:, :)
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm

    ! local variables
    real(kind=dp), parameter :: tol = 1d-7 ! this should not be smaller than the k-point precision in the .win file
    integer :: ik, n, m
    logical :: found, found2

    do ik = 1, num_kpt
      do n = 1, num_bvec
        found = .false.
        found2 = .false.
        do m = 1, num_bvec
          if (all(abs(bvec(:, m, ik) - bref(:, n)) < tol)) then
            found = .true.
            perm(n, ik) = m
            invperm(m, ik) = n ! inverse mapping, used in postw90
            cycle
          end if
          if (all(abs(bvec(:, m, ik) + bref(:, n)) < tol)) then
            found2 = .true.
            revind(n, ik) = m
            cycle
          end if
        end do
        if (.not. found .or. .not. found2) then
          call set_error_fatal(error, &
                               'Unable to identify bk-vector permutation (kmesh_bvectors_perm); consider k-point precision', &
                               comm)
          return
        end if
      end do
    end do

  end subroutine kmesh_bvectors_perm