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 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
|
!
! 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 .
!
! Uncomment next line to print compilation info. BEWARE: may occasionally
! give compilation errors due to lines too long if paths are very long
!#define __HAVE_CONFIG_INFO
!
!==-----------------------------------------------------------------------==!
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, nnode
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, nyfft
USE global_version, ONLY: version_number
USE fox_init_module, ONLY: fox_init
USE command_line_options, ONLY : nmany_
#if defined(__HDF5)
USE qeh5_base_module, ONLY: initialize_hdf5, finalize_hdf5
#endif
IMPLICIT NONE
! ... title of the simulation
CHARACTER(LEN=75) :: title
SAVE
PRIVATE
PUBLIC :: environment_start
PUBLIC :: environment_end
PUBLIC :: opening_message
PUBLIC :: compilation_info
PUBLIC :: parallel_info
!==-----------------------------------------------------------------------==!
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
! ... The Intel compiler allocates a lot of stack space
! ... Stack limit is often small, thus causing SIGSEGV and crash
! ... One may use "ulimit -s unlimited" but it doesn't always work
! ... The following call does the same and always works
!
#if defined(__INTEL_COMPILER)
CALL remove_stack_limit ( )
#endif
! ... 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)
! ... for compatibility with PWSCF
#if defined(__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
!#define DEBUG
#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 )
CALL compilation_info ( )
#if defined(__MPI)
CALL parallel_info ( code )
#else
CALL serial_info()
#endif
CALL fox_init()
#if defined(__HDF5)
CALL initialize_hdf5()
#endif
END SUBROUTINE environment_start
!==-----------------------------------------------------------------------==!
SUBROUTINE environment_end( code )
CHARACTER(LEN=*), INTENT(IN) :: code
#if defined(_HDF5)
CALL finalize_hdf5()
#endif
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('-'),'=')
FLUSH(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,"""P. Giannozzi et al., J. Phys.:Condens. Matter 29 ",&
& "465901 (2017);", &
&/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 ( code )
!
CHARACTER(LEN=*), INTENT(IN) :: code
#if defined(_OPENMP)
INTEGER, EXTERNAL :: omp_get_max_threads
!
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 !defined(__GFORTRAN__) || ((__GNUC__>4) || ((__GNUC__==4) && (__GNUC_MINOR__>=8)))
WRITE( stdout, '(/5X,"MPI processes distributed on ",&
&I5," nodes")' ) nnode
#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 ( nyfft > 1 ) WRITE( stdout, &
'(5X,"wavefunctions fft division: Y-proc x Z-proc = ",2I7)' ) &
nyfft, nproc_bgrp / nyfft
IF ( ntask_groups > 1 ) WRITE( stdout, &
'(5X,"wavefunctions fft division: task group distribution",/,34X,"#TG x Z-proc = ",2I7)' ) &
ntask_groups, nproc_bgrp / ntask_groups
IF ( nmany_ > 1) WRITE( stdout, '(5X,"FFT bands division: nmany = ",I7)' ) nmany_
!
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
!==-----------------------------------------------------------------------==!
SUBROUTINE compilation_info ( )
!
! code borrowed by WanT - prints architecture / compilation details
!
#if defined(__HAVE_CONFIG_INFO)
#include "configure.h"
! #include "build_date.h"
!
!WRITE( stdout, "(2x,' BUILT :',4x,a)" ) TRIM( ADJUSTL( &
!__CONF_BUILD_DATE ))
WRITE( stdout, * )
! note: if any preprocessed variables __CONF_* exceeds 128 characters,
! the compilation may give error because the line exceeds 132 characters
WRITE( stdout, "(2x,' ARCH :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_ARCH))
WRITE( stdout, "(2x,' CC :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_CC))
WRITE( stdout, "(2x,' CPP :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_CPP))
WRITE( stdout, "(2x,' F90 :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_MPIF90))
WRITE( stdout, "(2x,' F77 :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_F77))
WRITE( stdout, "(2x,' DFLAGS :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_DFLAGS))
WRITE( stdout, "(2x,' BLAS LIBS :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_BLAS_LIBS))
WRITE( stdout, "(2x,' LAPACK LIBS :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_LAPACK_LIBS))
WRITE( stdout, "(2x,' FFT LIBS :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_FFT_LIBS))
WRITE( stdout, "(2x,' MASS LIBS :',4x,a)" ) TRIM( ADJUSTL( &
__CONF_MASS_LIBS))
!
#endif
END SUBROUTINE compilation_info
!==-----------------------------------------------------------------------==!
END MODULE environment
!==-----------------------------------------------------------------------==!
|