1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
|
!
! Copyright (C) 2002-2011 Quantum ESPRESSO groups
! 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 .
!
!
!==-----------------------------------------------------------------------==!
MODULE environment
!==-----------------------------------------------------------------------==!
USE kinds, ONLY: DP
USE io_files, ONLY: crash_file, nd_nmbr
USE io_global, ONLY: stdout, meta_ionode
USE mp_world, ONLY: nproc
USE mp_images, ONLY: me_image, my_image_id, root_image, nimage, &
nproc_image
USE mp_pools, ONLY: npool
USE mp_bands, ONLY: ntask_groups, nproc_bgrp, nbgrp
USE global_version, ONLY: version_number, svn_revision
IMPLICIT NONE
! ... title of the simulation
CHARACTER(LEN=75) :: title
SAVE
PRIVATE
PUBLIC :: environment_start
PUBLIC :: environment_end
!==-----------------------------------------------------------------------==!
CONTAINS
!==-----------------------------------------------------------------------==!
SUBROUTINE environment_start( code )
CHARACTER(LEN=*), INTENT(IN) :: code
LOGICAL :: exst, debug = .false.
CHARACTER(LEN=80) :: code_version, uname
CHARACTER(LEN=6), EXTERNAL :: int_to_char
INTEGER :: ios, crashunit
INTEGER, EXTERNAL :: find_free_unit
! ... Intel compilers v .ge.8 allocate a lot of stack space
! ... Stack limit is often small, thus causing SIGSEGV and crash
CALL remove_stack_limit ( )
! ... use ".FALSE." to disable all clocks except the total cpu time clock
! ... use ".TRUE." to enable clocks
CALL init_clocks( .TRUE. )
CALL start_clock( TRIM(code) )
code_version = TRIM (code) // " v." // TRIM (version_number)
IF ( TRIM (svn_revision) /= "unknown" ) code_version = &
TRIM (code_version) // " (svn rev. " // TRIM (svn_revision) // ")"
! ... for compatibility with PWSCF
#ifdef __MPI
nd_nmbr = TRIM ( int_to_char( me_image+1 ))
#else
nd_nmbr = ' '
#endif
IF( meta_ionode ) THEN
! ... search for file CRASH and delete it
INQUIRE( FILE=TRIM(crash_file), EXIST=exst )
IF( exst ) THEN
crashunit = find_free_unit()
OPEN( UNIT=crashunit, FILE=TRIM(crash_file), STATUS='OLD',IOSTAT=ios )
IF (ios==0) THEN
CLOSE( UNIT=crashunit, STATUS='DELETE', IOSTAT=ios )
ELSE
WRITE(stdout,'(5x,"Remark: CRASH file could not be deleted")')
END IF
END IF
ELSE
! ... one processor per image (other than meta_ionode)
! ... or, for debugging purposes, all processors,
! ... open their own standard output file
#if defined(DEBUG)
debug = .true.
#endif
IF (me_image == root_image .OR. debug ) THEN
uname = 'out.' // trim(int_to_char( my_image_id )) // '_' // &
trim(int_to_char( me_image))
OPEN ( unit = stdout, file = TRIM(uname),status='unknown')
ELSE
#if defined(_WIN32)
OPEN ( unit = stdout, file='NUL:', status='unknown' )
#else
OPEN ( unit = stdout, file='/dev/null', status='unknown' )
#endif
END IF
END IF
!
CALL opening_message( code_version )
#ifdef __MPI
CALL parallel_info ( )
#else
CALL serial_info()
#endif
END SUBROUTINE environment_start
!==-----------------------------------------------------------------------==!
SUBROUTINE environment_end( code )
CHARACTER(LEN=*), INTENT(IN) :: code
IF ( meta_ionode ) WRITE( stdout, * )
CALL stop_clock( TRIM(code) )
CALL print_clock( TRIM(code) )
CALL closing_message( )
IF( meta_ionode ) THEN
WRITE( stdout,'(A)') ' JOB DONE.'
WRITE( stdout,3335)
END IF
3335 FORMAT('=',78('-'),'=')
CALL flush_unit(stdout)
RETURN
END SUBROUTINE environment_end
!==-----------------------------------------------------------------------==!
SUBROUTINE opening_message( code_version )
CHARACTER(LEN=*), INTENT(IN) :: code_version
CHARACTER(LEN=9) :: cdate, ctime
CALL date_and_tim( cdate, ctime )
!
WRITE( stdout, '(/5X,"Program ",A," starts on ",A9," at ",A9)' ) &
TRIM(code_version), cdate, ctime
!
WRITE( stdout, '(/5X,"This program is part of the open-source Quantum ",&
& "ESPRESSO suite", &
&/5X,"for quantum simulation of materials; please cite", &
&/9X,"""P. Giannozzi et al., J. Phys.:Condens. Matter 21 ",&
& "395502 (2009);", &
&/9X," URL http://www.quantum-espresso.org"", ", &
&/5X,"in publications or presentations arising from this work. More details at",&
&/5x,"http://www.quantum-espresso.org/quote")' )
RETURN
END SUBROUTINE opening_message
!==-----------------------------------------------------------------------==!
SUBROUTINE closing_message( )
CHARACTER(LEN=9) :: cdate, ctime
CHARACTER(LEN=80) :: time_str
CALL date_and_tim( cdate, ctime )
time_str = 'This run was terminated on: ' // ctime // ' ' // cdate
IF( meta_ionode ) THEN
WRITE( stdout,*)
WRITE( stdout,3334) time_str
WRITE( stdout,3335)
END IF
3334 FORMAT(3X,A60,/)
3335 FORMAT('=',78('-'),'=')
RETURN
END SUBROUTINE closing_message
!==-----------------------------------------------------------------------==!
SUBROUTINE parallel_info ( )
!
#if defined(__OPENMP)
INTEGER, EXTERNAL :: omp_get_max_threads
#endif
!
#if defined(__OPENMP)
WRITE( stdout, '(/5X,"Parallel version (MPI & OpenMP), running on ",&
&I7," processor cores")' ) nproc * omp_get_max_threads()
!
WRITE( stdout, '(5X,"Number of MPI processes: ",I7)' ) nproc
!
WRITE( stdout, '(5X,"Threads/MPI process: ",I7)' ) &
omp_get_max_threads()
#else
WRITE( stdout, '(/5X,"Parallel version (MPI), running on ",&
&I5," processors")' ) nproc
#endif
!
IF ( nimage > 1 ) WRITE( stdout, &
'(5X,"path-images division: nimage = ",I7)' ) nimage
IF ( npool > 1 ) WRITE( stdout, &
'(5X,"K-points division: npool = ",I7)' ) npool
IF ( nbgrp > 1 ) WRITE( stdout, &
'(5X,"band groups division: nbgrp = ",I7)' ) nbgrp
IF ( nproc_bgrp > 1 ) WRITE( stdout, &
'(5X,"R & G space division: proc/nbgrp/npool/nimage = ",I7)' ) nproc_bgrp
IF ( ntask_groups > 1 ) WRITE( stdout, &
'(5X,"wavefunctions fft division: fft and procs/group = ",2I7)' ) &
ntask_groups, nproc_bgrp / ntask_groups
!
END SUBROUTINE parallel_info
!==-----------------------------------------------------------------------==!
SUBROUTINE serial_info ( )
!
#if defined(__OPENMP)
INTEGER, EXTERNAL :: omp_get_max_threads
#endif
!
#if defined(__OPENMP)
WRITE( stdout, '(/5X,"Serial multi-threaded version, running on ",&
&I4," processor cores")' ) omp_get_max_threads()
!
#else
WRITE( stdout, '(/5X,"Serial version")' )
#endif
!
END SUBROUTINE serial_info
!==-----------------------------------------------------------------------==!
END MODULE environment
!==-----------------------------------------------------------------------==!
|