! checks wether an error has occurred on one of the porecesses in the execution pool
subroutine psb_errcomm(ictxt, err)
  use psb_error_mod, psb_protect_name => psb_errcomm
  use psb_penv_mod
  integer, intent(in)   :: ictxt
  integer, intent(inout):: err
  integer :: temp(2)
  ! Cannot use psb_amx or otherwise we have a recursion in module usage
#if !defined(SERIAL_MPI)
  call psb_amx(ictxt, err)
#endif    
end subroutine psb_errcomm
! handles the occurence of an error in a serial routine
subroutine psb_serror()
  use psb_const_mod
  use psb_error_mod
  implicit none 
  integer                 ::  err_c
  character(len=20)       ::  r_name
  character(len=40)       ::  a_e_d
  integer                 ::  i_e_d(5)

  if(psb_get_errstatus() > 0) then
    if(psb_get_errverbosity() > 1) then

      do while (psb_get_numerr() > izero)
        write(psb_err_unit,'(50("="))')
        call psb_errpop(err_c, r_name, i_e_d, a_e_d)
        call psb_errmsg(err_c, r_name, i_e_d, a_e_d)
        !            write(psb_err_unit,'(50("="))')
      end do

    else

      call psb_errpop(err_c, r_name, i_e_d, a_e_d)
      call psb_errmsg(err_c, r_name, i_e_d, a_e_d)
      do while (psb_get_numerr() > 0)
        call psb_errpop(err_c, r_name, i_e_d, a_e_d)
      end do
    end if
  end if
#if defined(HAVE_FLUSH_STMT)
  flush(0) 
#endif


end subroutine psb_serror


! handles the occurence of an error in a parallel routine
subroutine psb_perror(ictxt)
  use psb_const_mod
  use psb_error_mod
  use psb_penv_mod
  implicit none 
  integer, intent(in)     :: ictxt
  integer                 :: err_c
  character(len=20)       :: r_name
  character(len=40)       :: a_e_d
  integer                 :: i_e_d(5)
  integer                 :: iam, np

#if defined(SERIAL_MPI)
  iam = -1
#else        
  call psb_info(ictxt,iam,np)
#endif
  
  
  if(psb_get_errstatus() > 0) then
    if(psb_get_errverbosity() > 1) then

      do while (psb_get_numerr() > izero)
        write(psb_err_unit,'(50("="))')
        call psb_errpop(err_c, r_name, i_e_d, a_e_d)
        call psb_errmsg(err_c, r_name, i_e_d, a_e_d,iam)
        !            write(psb_err_unit,'(50("="))')
      end do
#if defined(HAVE_FLUSH_STMT)
      flush(0) 
#endif
#if defined(SERIAL_MPI)
      stop 
#else        
      call psb_abort(ictxt,-1)
#endif
    else

      call psb_errpop(err_c, r_name, i_e_d, a_e_d)
      call psb_errmsg(err_c, r_name, i_e_d, a_e_d,iam)
      do while (psb_get_numerr() > 0)
        call psb_errpop(err_c, r_name, i_e_d, a_e_d)
      end do
#if defined(HAVE_FLUSH_STMT)
      flush(0) 
#endif
#if defined(SERIAL_MPI)
      stop 
#else        
      call psb_abort(ictxt,-1)
#endif
    end if
  end if

  if(psb_get_errstatus() > izero) then
#if defined(SERIAL_MPI)
    stop 
#else        
    call psb_abort(ictxt,err_c)
#endif
  end if


end subroutine psb_perror