!
! Copyright (C) 2001-2009 Quantum ESPRESSO group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!----------------------------------------------------------------------------
SUBROUTINE stop_run( exit_status )
  !----------------------------------------------------------------------------
  !! Close all files and synchronize processes before stopping:
  !
  !! * exit_status = 0: successfull execution, remove temporary files;
  !! * exit_status =-1: code stopped by user request;
  !! * exit_status = 1: convergence not achieved.
  !
  !! Do not remove temporary files needed for restart.
  !
  USE io_global,          ONLY : ionode
  USE mp_global,          ONLY : mp_global_end
  USE environment,        ONLY : environment_end
  USE io_files,           ONLY : iuntmp, seqopn
  !
  IMPLICIT NONE
  !
  INTEGER, INTENT(IN) :: exit_status
  LOGICAL             :: exst, opnd, lflag
  !
  lflag = ( exit_status == 0 ) 
  IF ( lflag ) THEN
     ! 
     ! ... remove files needed only to restart
     !
     CALL seqopn( iuntmp, 'restart', 'UNFORMATTED', exst )
     CLOSE( UNIT = iuntmp, STATUS = 'DELETE' )
     !
     IF ( ionode ) THEN
        CALL seqopn( iuntmp, 'update', 'FORMATTED', exst )
        CLOSE( UNIT = iuntmp, STATUS = 'DELETE' )
        CALL seqopn( iuntmp, 'para', 'FORMATTED', exst )
        CLOSE( UNIT = iuntmp, STATUS = 'DELETE' )
     ENDIF
     !
  ENDIF
  !
  CALL close_files( lflag )
  !
  CALL print_clock_pw()
  !
  CALL clean_pw( .TRUE. )
  !
  CALL environment_end( 'PWSCF' )
  !
  CALL mp_global_end()
  !
END SUBROUTINE stop_run
!
!-----------------------------------------
SUBROUTINE do_stop( exit_status )
  !---------------------------------------
  !! Stop the run.
  !
  IMPLICIT NONE
  !
  INTEGER, INTENT(IN) :: exit_status
  !
  IF ( exit_status == -1 ) THEN
     ! -1 is not an acceptable value for stop in fortran;
     ! convert it to 255
     STOP 255
  ELSEIF ( exit_status == 0 ) THEN
     STOP
  ELSEIF ( exit_status == 1 ) THEN
     STOP 1
  ELSEIF ( exit_status == 2 ) THEN
     STOP 2
  ELSEIF ( exit_status == 3 ) THEN
     STOP 3
  ELSEIF ( exit_status == 4 ) THEN
     STOP 4
  ELSEIF ( exit_status == 130) THEN
     STOP
  ELSEIF ( exit_status == 131) THEN
     STOP
  ELSEIF ( exit_status == 255 ) THEN
     STOP 255
  ELSEIF ( exit_status == 254 ) THEN
     STOP 254
  ELSE
     ! unimplemented value
     STOP 128
  ENDIF
  !
END SUBROUTINE do_stop
!
!----------------------------------------------------------------------------
SUBROUTINE closefile()
  !----------------------------------------------------------------------------
  !! Close all files and synchronize processes before stopping.  
  !! Called by "sigcatch" when it receives a signal.
  !
  USE io_global,  ONLY :  stdout
  !
  WRITE( stdout,'(5X,"Signal Received, stopping ... ")')
  !
  CALL stop_run( 255 )
  !
  RETURN
  !
END SUBROUTINE closefile
