blob: 35fe21b5438fcdcf488c0962cd9acbce5f98ba02 [file] [log] [blame]
!-----------------------------------------------------------------------
!
! MODULE: utils_module
!> @brief
!> This module contains utility subroutines for handling file
!> open/close, errors, command line reading, and program termination.
!
!-----------------------------------------------------------------------
MODULE utils_module
USE global_module, ONLY: i_knd, ifile, ofile
USE dealloc_module
USE plib_module, ONLY: iproc, root, pend, plock_omp, nthreads
USE control_module, ONLY: swp_typ
IMPLICIT NONE
PUBLIC
CONTAINS
SUBROUTINE cmdarg ( ierr, error )
!-----------------------------------------------------------------------
!
! Read the command line for the input and output file names.
!
!-----------------------------------------------------------------------
CHARACTER(LEN=64), INTENT(OUT) :: error
INTEGER(i_knd), INTENT(OUT) :: ierr
!_______________________________________________________________________
!
! Local variables
!_______________________________________________________________________
CHARACTER(LEN=64) :: arg
INTEGER(i_knd) :: narg, n
!_______________________________________________________________________
!
! Return if not root. Loop over the first two command line arguments
! to get i/o file names.
!_______________________________________________________________________
IF ( iproc /= root ) RETURN
ierr = 0
error = ''
narg = COMMAND_ARGUMENT_COUNT ( )
IF ( narg /= 2 ) THEN
ierr = 1
error = '***ERROR: CMDARG: Missing command line entry'
RETURN
END IF
DO n = 1, 2
CALL GET_COMMAND_ARGUMENT ( n, arg )
arg = ADJUSTL( arg )
IF ( arg(1:1)=='-' .OR. arg(1:1)=='<' .OR. arg(1:1)=='>' ) THEN
ierr = 1
error = '***ERROR: CMDARG: Bad command line entry, arg:'
WRITE( error, '(A,A,I2)') TRIM( error ), ' ', n
ELSE IF ( n == 1 ) THEN
ifile = arg
ELSE IF ( n == 2 ) THEN
ofile = arg
END IF
END DO
!_______________________________________________________________________
!_______________________________________________________________________
END SUBROUTINE cmdarg
SUBROUTINE open_file ( funit, fname, fstat, faction, ierr, error )
!-----------------------------------------------------------------------
!
! Open a file.
!
!-----------------------------------------------------------------------
CHARACTER(LEN=*), INTENT(IN) :: fstat, faction
CHARACTER(LEN=*), INTENT(IN) :: fname
CHARACTER(LEN=64), INTENT(OUT) :: error
INTEGER(i_knd), INTENT(IN) :: funit
INTEGER(i_knd), INTENT(OUT) :: ierr
!_______________________________________________________________________
!
! Local variables.
!_______________________________________________________________________
CHARACTER(LEN=64) :: tname
!_______________________________________________________________________
!
! Return if not root. Open the file with specified unit, name, status,
! action.
!_______________________________________________________________________
ierr = 0
error = ''
IF ( iproc /= root ) RETURN
tname = TRIM( fname )
OPEN( UNIT=funit, FILE=tname, STATUS=fstat, ACCESS='SEQUENTIAL', &
ACTION=faction, IOSTAT=ierr )
IF ( ierr /= 0 ) THEN
error = '***ERROR: OPEN_FILE: Unable to open file, unit:'
WRITE( error, '(A,A,I2)') TRIM( error ), ' ', funit
END IF
!_______________________________________________________________________
!_______________________________________________________________________
END SUBROUTINE open_file
SUBROUTINE close_file ( funit, ierr, error )
!-----------------------------------------------------------------------
!
! Close a file.
!
!-----------------------------------------------------------------------
CHARACTER(LEN=64), INTENT(OUT) :: error
INTEGER(i_knd), INTENT(IN) :: funit
INTEGER(i_knd), INTENT(OUT) :: ierr
!_______________________________________________________________________
!
! Close the file of specified unit number.
!_______________________________________________________________________
ierr = 0
error = ''
IF ( iproc /= root ) RETURN
CLOSE( UNIT=funit, IOSTAT=ierr )
IF ( ierr /= 0 ) THEN
error = '***ERROR: CLOSE_FILE: Unable to close file, unit:'
WRITE( error, '(A,A,I2)') TRIM( error ), ' ', funit
END IF
!_______________________________________________________________________
!_______________________________________________________________________
END SUBROUTINE close_file
SUBROUTINE print_error ( funit, error )
!-----------------------------------------------------------------------
!
! Print an error message to standard out or to file.
!
!-----------------------------------------------------------------------
CHARACTER(LEN=*), INTENT(IN) :: error
INTEGER(i_knd), INTENT(IN) :: funit
!_______________________________________________________________________
!
! Print the error message.
!_______________________________________________________________________
IF ( iproc /= root ) RETURN
WRITE( *, 101 ) error
IF ( funit > 0 ) WRITE( funit, 101 ) error
!_______________________________________________________________________
101 FORMAT( 3X, A, / )
!_______________________________________________________________________
!_______________________________________________________________________
END SUBROUTINE print_error
SUBROUTINE stop_run ( flg1, flg2, flg3, flg4 )
!-----------------------------------------------------------------------
!
! Safely end program execution.
!
!-----------------------------------------------------------------------
INTEGER(i_knd), INTENT(IN) :: flg1, flg2, flg3, flg4
!_______________________________________________________________________
!
! Local Variables
!_______________________________________________________________________
!_______________________________________________________________________
!
! Deallocate if necessary. Depends on flg1, 0/1=no/yes deallocate.
!_______________________________________________________________________
IF ( flg1 > 0 ) CALL plock_omp ( 'destroy', nthreads )
IF ( flg2 > 0 ) CALL dealloc_input ( flg2 )
IF ( flg3 > 0 ) CALL dealloc_solve ( swp_typ, flg3 )
IF ( iproc == root ) THEN
IF ( flg4 == 0 ) THEN
WRITE( *, '(1X,A)') 'Aww SNAP. Program failed. Try again.'
ELSE IF ( flg4 == 1 ) THEN
WRITE( *, '(1X,A)') 'Success! Done in a SNAP!'
ELSE IF ( flg4 == 2 ) THEN
WRITE( *, '(1X,A)') 'Oh SNAP. That did not converge. But ' // &
'take a look at the Timing Summary anyway!'
END IF
END IF
CALL pend
CALL EXIT ( 0 )
!STOP
!_______________________________________________________________________
!_______________________________________________________________________
END SUBROUTINE stop_run
END MODULE utils_module