internal_test_convergence Subroutine

public subroutine internal_test_convergence(history, delta_womegai, dis_conv_tol, iter, dis_conv_window, dis_converged, error, comm)

Uses

  • proc~~internal_test_convergence~2~~UsesGraph proc~internal_test_convergence~2 internal_test_convergence module~w90_constants w90_constants proc~internal_test_convergence~2->module~w90_constants module~w90_error w90_error proc~internal_test_convergence~2->module~w90_error module~w90_types w90_types proc~internal_test_convergence~2->module~w90_types 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_types->module~w90_constants module~w90_comms->module~w90_constants module~w90_comms->module~w90_error_base

Check if we have converged

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(inout) :: history(:)
real(kind=dp), intent(in) :: delta_womegai
real(kind=dp), intent(in) :: dis_conv_tol
integer, intent(in) :: iter
integer, intent(in) :: dis_conv_window
logical, intent(inout) :: dis_converged
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~internal_test_convergence~2~~CallsGraph proc~internal_test_convergence~2 internal_test_convergence proc~set_error_alloc set_error_alloc proc~internal_test_convergence~2->proc~set_error_alloc proc~set_error_dealloc set_error_dealloc proc~internal_test_convergence~2->proc~set_error_dealloc 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_dealloc->proc~comms_sync_error proc~set_error_dealloc->proc~set_base_error

Called by

proc~~internal_test_convergence~2~~CalledByGraph proc~internal_test_convergence~2 internal_test_convergence proc~dis_extract dis_extract proc~dis_extract->proc~internal_test_convergence~2 proc~dis_extract_gamma dis_extract_gamma proc~dis_extract_gamma->proc~internal_test_convergence~2 proc~dis_main dis_main proc~dis_main->proc~dis_extract proc~dis_main->proc~dis_extract_gamma proc~w90_disentangle~2 w90_disentangle proc~w90_disentangle~2->proc~dis_main proc~w90_disentangle w90_disentangle proc~w90_disentangle->proc~w90_disentangle~2 program~wannier wannier program~wannier->proc~w90_disentangle~2

Source Code

  subroutine internal_test_convergence(history, delta_womegai, dis_conv_tol, iter, &
                                       dis_conv_window, dis_converged, error, comm)
    !================================================!
    !
    !! Check if we have converged
    !
    !================================================!
    use w90_constants, only: dp
    use w90_error
    use w90_types, only: timer_list_type

    implicit none

    ! arguments
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm

    integer, intent(in) :: iter, dis_conv_window

    real(kind=dp), intent(inout) :: history(:)
    real(kind=dp), intent(in) :: delta_womegai, dis_conv_tol

    logical, intent(inout) :: dis_converged

    ! local variables
    integer :: ierr
    real(kind=dp), allocatable :: temp_hist(:)

    allocate (temp_hist(dis_conv_window), stat=ierr)
    if (ierr /= 0) then
      call set_error_alloc(error, 'Error allocating temp_hist in dis_extract: test_convergence', comm)
      return
    end if

    if (iter .le. dis_conv_window) then
      history(iter) = delta_womegai
    else
      temp_hist = eoshift(history, 1, delta_womegai)
      history = temp_hist
    end if

    dis_converged = .false.
    if (iter .ge. dis_conv_window) then
      dis_converged = all(abs(history) .lt. dis_conv_tol)
    end if

    deallocate (temp_hist, stat=ierr)
    if (ierr /= 0) then
      call set_error_dealloc(error, 'Error deallocating temp_hist in dis_extract: test_convergence', comm)
      return
    end if

    return
    !================================================!
  end subroutine internal_test_convergence