prterr Subroutine

public subroutine prterr(error, ie, istdout, istderr, comm)

Uses

  • proc~~prterr~~UsesGraph proc~prterr prterr module~w90_comms w90_comms proc~prterr->module~w90_comms module~w90_error_base w90_error_base proc~prterr->module~w90_error_base module~w90_comms->module~w90_error_base module~w90_constants w90_constants module~w90_comms->module~w90_constants

Arguments

Type IntentOptional Attributes Name
type(w90_error_type), intent(inout), allocatable :: error
integer, intent(inout) :: ie
integer, intent(in) :: istdout
integer, intent(in) :: istderr
type(w90_comm_type), intent(in) :: comm

Calls

proc~~prterr~~CallsGraph proc~prterr prterr interface~comms_no_sync_bcast comms_no_sync_bcast proc~prterr->interface~comms_no_sync_bcast interface~comms_no_sync_recv comms_no_sync_recv proc~prterr->interface~comms_no_sync_recv interface~comms_no_sync_send comms_no_sync_send proc~prterr->interface~comms_no_sync_send proc~mpirank mpirank proc~prterr->proc~mpirank proc~mpisize mpisize proc~prterr->proc~mpisize proc~comms_no_sync_bcast_char comms_no_sync_bcast_char interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_char proc~comms_no_sync_bcast_cmplx comms_no_sync_bcast_cmplx interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_cmplx proc~comms_no_sync_bcast_int comms_no_sync_bcast_int interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_int proc~comms_no_sync_bcast_logical comms_no_sync_bcast_logical interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_logical proc~comms_no_sync_bcast_real comms_no_sync_bcast_real interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_real proc~comms_no_sync_recv_char comms_no_sync_recv_char interface~comms_no_sync_recv->proc~comms_no_sync_recv_char proc~comms_no_sync_recv_cmplx comms_no_sync_recv_cmplx interface~comms_no_sync_recv->proc~comms_no_sync_recv_cmplx proc~comms_no_sync_recv_int comms_no_sync_recv_int interface~comms_no_sync_recv->proc~comms_no_sync_recv_int proc~comms_no_sync_recv_logical comms_no_sync_recv_logical interface~comms_no_sync_recv->proc~comms_no_sync_recv_logical proc~comms_no_sync_recv_real comms_no_sync_recv_real interface~comms_no_sync_recv->proc~comms_no_sync_recv_real proc~comms_no_sync_send_char comms_no_sync_send_char interface~comms_no_sync_send->proc~comms_no_sync_send_char proc~comms_no_sync_send_cmplx comms_no_sync_send_cmplx interface~comms_no_sync_send->proc~comms_no_sync_send_cmplx proc~comms_no_sync_send_int comms_no_sync_send_int interface~comms_no_sync_send->proc~comms_no_sync_send_int proc~comms_no_sync_send_logical comms_no_sync_send_logical interface~comms_no_sync_send->proc~comms_no_sync_send_logical proc~comms_no_sync_send_real comms_no_sync_send_real interface~comms_no_sync_send->proc~comms_no_sync_send_real

Called by

proc~~prterr~~CalledByGraph proc~prterr prterr proc~input_reader_special input_reader_special proc~input_reader_special->proc~prterr proc~overlaps overlaps proc~overlaps->proc~prterr proc~print_error_halt print_error_halt proc~print_error_halt->proc~prterr proc~read_chkpt read_chkpt proc~read_chkpt->proc~prterr proc~read_eigvals read_eigvals proc~read_eigvals->proc~prterr proc~set_kpoint_distribution set_kpoint_distribution proc~set_kpoint_distribution->proc~prterr proc~w90_create_kmesh w90_create_kmesh proc~w90_create_kmesh->proc~prterr proc~w90_disentangle~2 w90_disentangle proc~w90_disentangle~2->proc~prterr proc~w90_distribute_kpts w90_distribute_kpts proc~w90_distribute_kpts->proc~prterr proc~w90_get_excl_bands~2 w90_get_excl_bands proc~w90_get_excl_bands~2->proc~prterr proc~w90_get_proj~2 w90_get_proj proc~w90_get_proj~2->proc~prterr proc~w90_input_reader~2 w90_input_reader proc~w90_input_reader~2->proc~prterr proc~w90_input_setopt w90_input_setopt proc~w90_input_setopt->proc~prterr proc~w90_plot w90_plot proc~w90_plot->proc~prterr proc~w90_print_info~2 w90_print_info proc~w90_print_info~2->proc~prterr proc~w90_project_overlap~2 w90_project_overlap proc~w90_project_overlap~2->proc~prterr proc~w90_transport w90_transport proc~w90_transport->proc~prterr proc~w90_wannierise~2 w90_wannierise proc~w90_wannierise~2->proc~prterr proc~write_chkpt write_chkpt proc~write_chkpt->proc~prterr proc~write_kmesh write_kmesh proc~write_kmesh->proc~prterr proc~write_kmesh->proc~w90_create_kmesh program~wannier wannier program~wannier->proc~prterr program~wannier->proc~input_reader_special program~wannier->proc~overlaps program~wannier->proc~read_chkpt program~wannier->proc~read_eigvals program~wannier->proc~set_kpoint_distribution program~wannier->proc~w90_disentangle~2 program~wannier->proc~w90_distribute_kpts program~wannier->proc~w90_input_reader~2 program~wannier->proc~w90_plot program~wannier->proc~w90_print_info~2 program~wannier->proc~w90_project_overlap~2 program~wannier->proc~w90_transport program~wannier->proc~w90_wannierise~2 program~wannier->proc~write_chkpt program~wannier->proc~write_kmesh proc~w90_get_nn~2 w90_get_nn program~wannier->proc~w90_get_nn~2 proc~w90_disentangle w90_disentangle proc~w90_disentangle->proc~w90_disentangle~2 proc~w90_get_excl_bands w90_get_excl_bands proc~w90_get_excl_bands->proc~w90_get_excl_bands~2 proc~w90_get_gkpb~2 w90_get_gkpb proc~w90_get_gkpb~2->proc~w90_create_kmesh proc~w90_get_nnkp~2 w90_get_nnkp proc~w90_get_nnkp~2->proc~w90_create_kmesh proc~w90_get_nn~2->proc~w90_create_kmesh proc~w90_get_proj w90_get_proj proc~w90_get_proj->proc~w90_get_proj~2 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 proc~w90_print_info w90_print_info proc~w90_print_info->proc~w90_print_info~2 proc~w90_project_overlap w90_project_overlap proc~w90_project_overlap->proc~w90_project_overlap~2 proc~w90_wannierise w90_wannierise proc~w90_wannierise->proc~w90_wannierise~2 program~postw90 postw90 program~postw90->proc~print_error_halt proc~w90_get_gkpb w90_get_gkpb proc~w90_get_gkpb->proc~w90_get_gkpb~2 proc~w90_get_nn w90_get_nn proc~w90_get_nn->proc~w90_get_nn~2 proc~w90_get_nnkp w90_get_nnkp proc~w90_get_nnkp->proc~w90_get_nnkp~2

Source Code

  subroutine prterr(error, ie, istdout, istderr, comm)
    use w90_comms, only: comms_no_sync_bcast, comms_no_sync_send, comms_no_sync_recv, &
                         w90_comm_type, mpirank, mpisize
    use w90_error_base, only: code_deactivated, code_remote, w90_error_type

    ! arguments
    integer, intent(inout) :: ie ! global error value to be returned
    integer, intent(in) :: istderr, istdout
    type(w90_comm_type), intent(in) :: comm
    type(w90_error_type), allocatable, intent(inout) :: error

    ! local variables
    type(w90_error_type), allocatable :: le ! unchecked error state for calls made in this routine
    integer :: je ! error value on remote ranks
    integer :: j ! rank index
    integer :: failrank ! lowest rank reporting an error
    character(len=128) :: mesg ! only print 128 chars of error

    ie = 0
    mesg = 'not set'

    if (mpirank(comm) == 0) then
      ! currently this printout will list only the lowest failing rank, not all failing ranks
      do j = mpisize(comm) - 1, 1, -1
        call comms_no_sync_recv(je, 1, j, le, comm)

        if (je /= code_remote .and. je /= 0) then
          failrank = j
          ie = je
          call comms_no_sync_recv(mesg, 128, j, le, comm)
        end if
      end do
      ! if the error is on rank0
      if (error%code /= code_remote .and. error%code /= 0) then
        failrank = 0
        ie = error%code
        mesg = error%message
      end if

      write (istdout, *) 'Exiting.......'
      write (istdout, '(1x,a)') trim(mesg)
      write (istdout, '(1x,a,i0,a)') '(rank: ', failrank, ')'

      write (istderr, *) 'Exiting.......'
      write (istderr, '(1x,a)') trim(mesg)
      write (istderr, '(1x,a,i0,a)') '(rank: ', failrank, ')'
      !write (istderr, '(1x,a)') 'error encountered; check .wout log'

    else ! non 0 ranks
      je = error%code
      call comms_no_sync_send(je, 1, 0, le, comm)
      if (je /= code_remote .and. je /= 0) then
        ie = je ! also set failed status on non 0 ranks
        mesg = error%message
        call comms_no_sync_send(mesg, 128, 0, le, comm)
      end if
    end if

    ! Every rank must report the same failure. A non-root rank whose own error is
    ! code_remote (the error originated elsewhere) leaves ie at 0 above and would
    ! otherwise return "success" to a library caller while root returns the failure.
    call comms_no_sync_bcast(ie, 1, le, comm)

    flush (istdout)
    flush (istderr)

    error%code = code_deactivated
    deallocate (error) ! else allocated error trips uncaught error mechanism (ifdef W90DEV, see io.F90)
  end subroutine prterr