Check if we have converged
| Type | Intent | Optional | 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 |
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