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
| Type | Intent | Optional | 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 |
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