w90_wannier90_readwrite_read_global_kmesh Subroutine

private subroutine w90_wannier90_readwrite_read_global_kmesh(settings, global_kmesh_set, kmesh, recip_lattice, error, comm)

Uses

  • proc~~w90_wannier90_readwrite_read_global_kmesh~~UsesGraph proc~w90_wannier90_readwrite_read_global_kmesh w90_wannier90_readwrite_read_global_kmesh module~w90_comms w90_comms proc~w90_wannier90_readwrite_read_global_kmesh->module~w90_comms module~w90_error w90_error proc~w90_wannier90_readwrite_read_global_kmesh->module~w90_error module~w90_constants w90_constants module~w90_comms->module~w90_constants module~w90_error_base w90_error_base module~w90_comms->module~w90_error_base module~w90_error->module~w90_comms module~w90_error->module~w90_error_base

Arguments

Type IntentOptional Attributes Name
type(settings_type), intent(inout) :: settings
logical, intent(inout) :: global_kmesh_set
type(kmesh_spacing_type), intent(out) :: kmesh
real(kind=dp), intent(in) :: recip_lattice(3,3)
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~w90_wannier90_readwrite_read_global_kmesh~~CallsGraph proc~w90_wannier90_readwrite_read_global_kmesh w90_wannier90_readwrite_read_global_kmesh proc~set_error_input set_error_input proc~w90_wannier90_readwrite_read_global_kmesh->proc~set_error_input proc~w90_readwrite_get_keyword w90_readwrite_get_keyword proc~w90_wannier90_readwrite_read_global_kmesh->proc~w90_readwrite_get_keyword proc~w90_readwrite_get_keyword_vector w90_readwrite_get_keyword_vector proc~w90_wannier90_readwrite_read_global_kmesh->proc~w90_readwrite_get_keyword_vector proc~w90_readwrite_get_vector_length w90_readwrite_get_vector_length proc~w90_wannier90_readwrite_read_global_kmesh->proc~w90_readwrite_get_vector_length proc~w90_readwrite_set_kmesh w90_readwrite_set_kmesh proc~w90_wannier90_readwrite_read_global_kmesh->proc~w90_readwrite_set_kmesh proc~comms_sync_error comms_sync_error proc~set_error_input->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_input->proc~set_base_error proc~w90_readwrite_get_keyword->proc~set_error_input proc~set_error_fatal set_error_fatal proc~w90_readwrite_get_keyword->proc~set_error_fatal proc~w90_readwrite_get_keyword_vector->proc~set_error_input proc~w90_readwrite_get_keyword_vector->proc~set_error_fatal proc~w90_readwrite_get_vector_length->proc~set_error_input proc~w90_readwrite_get_vector_length->proc~set_error_fatal proc~set_error_fatal->proc~comms_sync_error proc~set_error_fatal->proc~set_base_error

Called by

proc~~w90_wannier90_readwrite_read_global_kmesh~~CalledByGraph proc~w90_wannier90_readwrite_read_global_kmesh w90_wannier90_readwrite_read_global_kmesh proc~w90_postw90_readwrite_read w90_postw90_readwrite_read proc~w90_postw90_readwrite_read->proc~w90_wannier90_readwrite_read_global_kmesh proc~w90_postw90_readwrite_readall w90_postw90_readwrite_readall proc~w90_postw90_readwrite_readall->proc~w90_wannier90_readwrite_read_global_kmesh program~postw90 postw90 program~postw90->proc~w90_postw90_readwrite_read

Source Code

  subroutine w90_wannier90_readwrite_read_global_kmesh(settings, global_kmesh_set, kmesh, &
                                                       recip_lattice, error, comm)
    !================================================!

    use w90_error, only: w90_error_type
    use w90_comms, only: w90_comm_type

    implicit none

    type(kmesh_spacing_type), intent(out) :: kmesh

    logical, intent(inout) :: global_kmesh_set
    real(kind=dp), intent(in) :: recip_lattice(3, 3)
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm
    type(settings_type), intent(inout) :: settings

    integer :: i
    logical :: found

    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
    ! k meshes
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
    ! [GP-begin, Apr13, 2012]
    ! Global interpolation k-mesh; this is overridden by "local" meshes of a given submodule
    ! This bit of code must appear *before* all other codes for the local interpolation meshes,
    ! BUT *after* having calculated the reciprocal-space vectors.
    global_kmesh_set = .false.
    kmesh%spacing = -1._dp
    kmesh%mesh = 0
    call w90_readwrite_get_keyword(settings, 'kmesh_spacing', found, error, comm, &
                                   r_value=kmesh%spacing)
    if (allocated(error)) return
    if (found) then
      if (kmesh%spacing .le. 0._dp) then
        call set_error_input(error, 'Error: kmesh_spacing must be greater than zero', comm)
        return
      end if
      global_kmesh_set = .true.

      call w90_readwrite_set_kmesh(kmesh%spacing, recip_lattice, kmesh%mesh)
    end if
    call w90_readwrite_get_vector_length(settings, 'kmesh', found, i, error, comm)
    if (allocated(error)) return
    if (found) then
      if (global_kmesh_set) then
        call set_error_input(error, 'Error: cannot set both kmesh and kmesh_spacing', comm)
        return
      end if
      if (i .eq. 1) then
        global_kmesh_set = .true.
        call w90_readwrite_get_keyword_vector(settings, 'kmesh', found, 1, error, comm, &
                                              i_value=kmesh%mesh)
        if (allocated(error)) return
        kmesh%mesh(2) = kmesh%mesh(1)
        kmesh%mesh(3) = kmesh%mesh(1)
      elseif (i .eq. 3) then
        global_kmesh_set = .true.
        call w90_readwrite_get_keyword_vector(settings, 'kmesh', found, 3, error, comm, &
                                              i_value=kmesh%mesh)
        if (allocated(error)) return
      else
        call set_error_input(error, 'Error: kmesh must be provided as either one integer or a vector of three integers', comm)
        return
      end if
      if (any(kmesh%mesh <= 0)) then
        call set_error_input(error, 'Error: kmesh elements must be greater than zero', comm)
        return
      end if
    end if
    ! [GP-end]
  end subroutine w90_wannier90_readwrite_read_global_kmesh