w90_readwrite_read_fermi_energy Subroutine

public subroutine w90_readwrite_read_fermi_energy(settings, found_fermi_energy, fermi_energy_list, error, comm)

Uses

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

Read Fermi energy ("fermi_energy") and/or ranges ("fermi_energy_min", "fermi_energy_max" and "fermi_energy_step") used to setup fermi_energy_list tabulation _max and _step are only sought if _min found and are optional

Arguments

Type IntentOptional Attributes Name
type(settings_type), intent(inout) :: settings
logical, intent(out) :: found_fermi_energy
real(kind=dp), intent(out), allocatable :: fermi_energy_list(:)
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~w90_readwrite_read_fermi_energy~~CallsGraph proc~w90_readwrite_read_fermi_energy w90_readwrite_read_fermi_energy proc~set_error_alloc set_error_alloc proc~w90_readwrite_read_fermi_energy->proc~set_error_alloc proc~set_error_input set_error_input proc~w90_readwrite_read_fermi_energy->proc~set_error_input proc~w90_readwrite_get_keyword w90_readwrite_get_keyword proc~w90_readwrite_read_fermi_energy->proc~w90_readwrite_get_keyword proc~comms_sync_error comms_sync_error proc~set_error_alloc->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_alloc->proc~set_base_error proc~set_error_input->proc~comms_sync_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~set_error_fatal->proc~comms_sync_error proc~set_error_fatal->proc~set_base_error

Called by

proc~~w90_readwrite_read_fermi_energy~~CalledByGraph proc~w90_readwrite_read_fermi_energy w90_readwrite_read_fermi_energy proc~w90_postw90_readwrite_read w90_postw90_readwrite_read proc~w90_postw90_readwrite_read->proc~w90_readwrite_read_fermi_energy proc~w90_wannier90_readwrite_read w90_wannier90_readwrite_read proc~w90_wannier90_readwrite_read->proc~w90_readwrite_read_fermi_energy proc~w90_input_reader~2 w90_input_reader proc~w90_input_reader~2->proc~w90_wannier90_readwrite_read proc~w90_input_setopt w90_input_setopt proc~w90_input_setopt->proc~w90_wannier90_readwrite_read program~postw90 postw90 program~postw90->proc~w90_postw90_readwrite_read proc~w90_input_reader w90_input_reader proc~w90_input_reader->proc~w90_input_reader~2 proc~w90_input_setopt_f w90_input_setopt_f proc~w90_input_setopt_f->proc~w90_input_setopt program~wannier wannier program~wannier->proc~w90_input_reader~2

Source Code

  subroutine w90_readwrite_read_fermi_energy(settings, found_fermi_energy, fermi_energy_list, &
                                             error, comm)
    !! Read Fermi energy ("fermi_energy") and/or ranges ("fermi_energy_min", "fermi_energy_max" and
    !! "fermi_energy_step") used to setup fermi_energy_list tabulation
    !! _max and _step are only sought if _min found and are optional
    use w90_error, only: w90_error_type, set_error_input, set_error_alloc
    implicit none

    ! arguments
    logical, intent(out) :: found_fermi_energy ! flags that E_F provided
    real(kind=dp), allocatable, intent(out) :: fermi_energy_list(:)
    type(settings_type), intent(inout) :: settings
    type(w90_comm_type), intent(in) :: comm
    type(w90_error_type), allocatable, intent(out) :: error

    ! local variables
    integer :: i, ierr, n
    logical :: found, fermi_energy_scan
    real(kind=dp) :: fermi_energy
    real(kind=dp) :: fermi_energy_max
    real(kind=dp) :: fermi_energy_min
    real(kind=dp) :: fermi_energy_step

    found_fermi_energy = .false.
    fermi_energy_scan = .false.
    n = 1
    fermi_energy = 0.0_dp
    fermi_energy_min = fermi_energy
    fermi_energy_step = 0.0_dp

    call w90_readwrite_get_keyword(settings, 'fermi_energy', found_fermi_energy, error, comm, &
                                   r_value=fermi_energy)
    if (allocated(error)) return
    if (found_fermi_energy) then
      n = 1
      fermi_energy_step = 0.0_dp
      fermi_energy_min = fermi_energy
    end if

    call w90_readwrite_get_keyword(settings, 'fermi_energy_min', fermi_energy_scan, error, comm, &
                                   r_value=fermi_energy_min)
    if (allocated(error)) return
    if (fermi_energy_scan) then
      if (found_fermi_energy) then
        call set_error_input(error, &
                             'Error: Cannot specify both fermi_energy and fermi_energy_min', comm)
        return
      end if

      call w90_readwrite_get_keyword(settings, 'fermi_energy_max', found, error, comm, &
                                     r_value=fermi_energy_max)
      if (allocated(error)) return
      if (.not. found) then
        fermi_energy_max = fermi_energy_min + 1.0_dp !default
      else if (found .and. fermi_energy_max <= fermi_energy_min) then
        call set_error_input(error, &
                             'Error: fermi_energy_max must be larger than fermi_energy_min', comm)
        return
      end if

      call w90_readwrite_get_keyword(settings, 'fermi_energy_step', found, error, comm, &
                                     r_value=fermi_energy_step)
      if (allocated(error)) return
      if (.not. found) then
        fermi_energy_step = 0.01_dp !default
      else if (found .and. fermi_energy_step <= 0.0_dp) then
        call set_error_input(error, 'Error: fermi_energy_step must be positive', comm)
        return
      end if

      n = nint(abs((fermi_energy_max - fermi_energy_min)/fermi_energy_step)) + 1
      fermi_energy_step = (fermi_energy_max - fermi_energy_min)/real(n - 1, dp)
    end if

    allocate (fermi_energy_list(n), stat=ierr)
    if (ierr /= 0) then
      call set_error_alloc(error, &
                           'Error allocating fermi_energy_list in w90_readwrite_read_fermi_energy', comm)
      return
    end if
    do i = 1, n
      fermi_energy_list(i) = fermi_energy_min + (i - 1)*fermi_energy_step
    end do
  end subroutine w90_readwrite_read_fermi_energy