Misc changes and cleanup of I/O

- Honor the disk_io='none' und 'nowf' options also when a run is interrupted
- 'nowf' does what it promises but saves the charge density
- previous 'nowf' replaced by new 'minimal' option
- punch.f90 says more of what is written there
- documentation aligned to new behavior
This commit is contained in:
Paolo Giannozzi 2023-10-20 14:25:25 +02:00
parent 04a00b34dc
commit d6e206a64f
8 changed files with 91 additions and 73 deletions

View File

@ -2,7 +2,8 @@ New in development version:
* Experimental support for pseudopotentials in PSML format
Incompatible changes in development version:
* None known
* Small changes in options "iprint" and "disk_io" of PWscf
* More pseudopotential-related code restructured and moved to upflib/
Fixed in development version:
* Incorrect PP_SEMILOCAL field written for old-style pseudopotentials.

View File

@ -361,8 +361,13 @@ input_description -distribution {Quantum ESPRESSO} -package PWscf -program pw.x
}
opt -val 'nowf' {
save to disk only the xml data file,
never save wavefunctions and charge density
save to disk only the xml data file and the charge density
at convergence, never save wavefunctions. Restarting from
an interrupted calculation is not possible with this option.
}
opt -val 'minimal' {
save to disk only the xml data file at convergence
}
opt -val 'none' {

View File

@ -35,7 +35,6 @@ SUBROUTINE beef_energies( )
USE io_global, ONLY : stdout, ionode
USE xc_lib, ONLY : xclib_dft_is
USE control_flags, ONLY : io_level
USE ener, ONLY : vtxc, etxc
USE scf, ONLY : rho, rho_core, rhog_core, v
!
@ -106,7 +105,6 @@ SUBROUTINE beef_print( )
!-------------------------------------------------------------------------
USE io_global, ONLY : stdout, ionode
USE control_flags, ONLY : io_level
implicit none
integer :: i

View File

@ -31,15 +31,22 @@ SUBROUTINE close_files( lflag )
!
LOGICAL, INTENT(IN) :: lflag
!
CHARACTER(LEN=6) :: close_option
LOGICAL :: opnd
!
! ... delete buffers
! ... 1) at convergence, unless high disk I/O is required
! ... 2) always, if minimal disk I/O is required
!
IF ( (lflag .AND. io_level == 0) .OR. (io_level < 0) ) THEN
close_option = 'DELETE'
ELSE
close_option = 'KEEP'
END IF
!
! ... close buffer/file containing wavefunctions
!
IF ( lflag .AND. (io_level <= 0) ) THEN
CALL close_buffer ( iunwfc, 'DELETE' )
ELSE
CALL close_buffer ( iunwfc, 'KEEP' )
END IF
CALL close_buffer ( iunwfc, close_option )
!
! ... close files associated with the EXX calculation
!
@ -50,35 +57,19 @@ SUBROUTINE close_files( lflag )
! ... iunhub as above, only for wfcs * S having an associated Hubbard U
!
IF ( lda_plus_u .AND. (Hubbard_projectors /= 'pseudo') ) THEN
IF ( io_level < 0 ) THEN
CALL close_buffer( iunhub, 'DELETE' )
ELSE
CALL close_buffer( iunhub, 'KEEP' )
END IF
CALL close_buffer( iunhub, close_option )
END IF
!
IF ( use_wannier .OR. one_atom_occupations ) THEN
IF ( io_level < 0 ) THEN
CALL close_buffer( iunsat,'DELETE' )
ELSE
CALL close_buffer( iunsat,'KEEP' )
END IF
CALL close_buffer( iunsat, close_option )
END IF
!
! ... close unit for electric field if needed
!
IF ( lelfield ) THEN
!
IF ( io_level < 0 ) THEN
CALL close_buffer( iunefield, 'DELETE' )
CALL close_buffer( iunefieldm,'DELETE' )
CALL close_buffer( iunefieldp,'DELETE' )
ELSE
CALL close_buffer( iunefield, 'KEEP' )
CALL close_buffer( iunefieldm,'KEEP' )
CALL close_buffer( iunefieldp,'KEEP' )
ENDIF
!
CALL close_buffer( iunefield, close_option )
CALL close_buffer( iunefieldm, close_option )
CALL close_buffer( iunefieldp, close_option )
END IF
#if defined (__OSCDFT)
IF (use_oscdft) CALL oscdft_close_files(oscdft_ctx)
@ -86,7 +77,6 @@ SUBROUTINE close_files( lflag )
!
CALL mp_barrier( intra_image_comm )
!
!
RETURN
!
END SUBROUTINE close_files

View File

@ -1187,14 +1187,14 @@ SUBROUTINE electrons_scf ( printout, exxen )
!
10 FLUSH( stdout )
!
! ... exiting: write (unless disabled) the charge density to file
! ... (also write ldaU ns coefficients and PAW becsum)
! ... exiting: unless disabled by user (disk_io='minimal' or 'none'),
! ... write charge density (also ldaU ns coefficients and PAW becsum)
!
IF ( io_level > -1 ) CALL write_scf( rho, nspin )
IF ( io_level > -2 ) CALL write_scf( rho, nspin )
!
! ... delete mixing info if converged, keep it if not
! ... keep mixing info if no converged achieved, delete it otherwise
!
IF ( conv_elec ) THEN
IF ( conv_elec .or. io_level < 0 ) THEN
CALL close_mix_file( iunmix, 'delete' )
ELSE
CALL close_mix_file( iunmix, 'keep' )

View File

@ -1063,10 +1063,14 @@ SUBROUTINE control_iosys()
!
io_level = -1
!
CASE ( 'none' )
CASE ( 'minimal' )
!
io_level = -2
!
CASE ( 'none' )
!
io_level = -3
!
CASE DEFAULT
!
! In the scf case, it is usually convenient to write to RAM;

View File

@ -1,5 +1,5 @@
!
! Copyright (C) 2001-2016 Quantum ESPRESSO group
! Copyright (C) 2001-2023 Quantum ESPRESSO Foundation
! 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,
@ -11,20 +11,21 @@ SUBROUTINE punch( what )
!! This routine is called at the end of the run to save on a file
!! the information needed for further processing (phonon etc.).
!
!! * what = 'all' : write xml data file and, if io_level > -1, charge
!! density and wavefunctions. For final data.
!! * what = 'config' : write xml data file and charge density; also,
!! for nks=1, wavefunctions in plain binary format
!! (see why in comments below). For intermediate
!! or incomplete results
!! * what = 'all' : write xml data file and, for normal or high I/O options,
!! tha charge density and wavefunctions.
!! Used for writing final data.
!! * what = 'config' : write xml data file and, for low I/O options,
!! the charge density; also, for nks=1, wavefunctions
!! in plain binary format (see comments below for reason)
!! Used for writing intermediate or incomplete results.
!! * what = 'config-only' : write xml data file only
!! Used for saving restart information.
!! * what = 'config-init' : write xml data file only excluding final results
!! (for dry run, can be called at early stages).
!! Used for dry run, at the start of calculation.
!
USE io_global, ONLY : stdout, ionode
USE io_files, ONLY : iunpun, iunwfc, nwordwfc, diropn, &
tmp_dir, prefix, restart_dir, xmlfile, &
create_directory
USE io_files, ONLY : iunwfc, nwordwfc, diropn, tmp_dir, prefix, &
restart_dir, xmlfile, create_directory
USE control_flags, ONLY : io_level, lscf, lxdm
USE klist, ONLY : nks
USE io_files, ONLY : psfile, pseudo_dir, molfile
@ -47,7 +48,7 @@ SUBROUTINE punch( what )
IMPLICIT NONE
!
CHARACTER(LEN=*), INTENT(IN) :: what
!! see main comment
!! what is what? see main comment
!
! ... local variables
!
@ -56,11 +57,14 @@ SUBROUTINE punch( what )
INTEGER :: cp_status, nt, isolV
!
!
WRITE( stdout, '(/,5X,"Writing ",A," to output data dir ",A)' ) &
TRIM ( what ), TRIM ( restart_dir ( ) )
iunpun = 4
!
! ...New-style I/O with xml schema and (optionally) hdf5 binaries
IF ( io_level < -2 ) THEN
!! disk_io='none': no I/O at all, do not write anything
CALL infomsg('punch',"Nothing written, as per user request (disk_io='none')")
RETURN
ELSE
WRITE( stdout, '(/,5X,"Writing ",A," to output data dir ",A," :")' ) &
TRIM ( what ), TRIM ( restart_dir ( ) )
END IF
!
! ... create the main restart directory (if needed)
!
@ -71,27 +75,38 @@ SUBROUTINE punch( what )
wf_collect = ( TRIM(what) == 'all' )
only_init = ( TRIM(what) == 'config-init' )
CALL pw_write_schema( only_init, wf_collect )
WRITE( stdout, '(5X,"XML data file")', ADVANCE ='NO' )
!
IF ( TRIM(what) == 'all' .AND. io_level < 0 ) RETURN
! ... nothing left to do for 'minimal' I/O option: return
!
! ... charge density - also writes rho%ns if lda+U and rho%bec if PAW
! ... do not overwrite the scf charge density with a non-scf one
! ... (except in the 'force theorem' calculation of MAE where the
! ... charge density differs from the one read from disk)
IF ( io_level < -1 ) RETURN
!
IF (TRIM(what) == 'all' .OR. TRIM(what) == 'config' ) THEN
IF ( lscf .OR. lforcet ) CALL write_scf( rho, nspin )
ENDIF
!
! ... correlation functions of 3D-RISM.
! ... do not overwrite them, in case of non-scf
!
IF ( lrism3d ) THEN
IF (TRIM(what) == 'all' .OR. TRIM(what) == 'config' ) THEN
IF ( lscf ) CALL rism3d_write_to_restart()
!
! ... charge density - also writes rho%ns if lda+U and rho%bec if PAW
! ... do not overwrite the scf charge density with a non-scf one
! ... (except in the 'force theorem' calculation of MAE where the
! ... charge density differs from the one read from disk)
!
IF ( lscf .OR. lforcet ) THEN
CALL write_scf( rho, nspin )
WRITE( stdout, '(", charge density")', ADVANCE ='NO' )
END IF
!
! ... correlation functions of 3D-RISM.
! ... do not overwrite them, in case of non-scf
!
IF ( lrism3d .AND. lscf ) THEN
CALL rism3d_write_to_restart()
WRITE( stdout, '(", RISM restart")', ADVANCE ='NO' )
END IF
!
END IF
!
! ... nothing left to do for 'nowf' I/O option: return
!
IF ( io_level < 0 ) RETURN
!
IF (TRIM(what) == 'all') THEN
!
! ... copy xml file one level up (FIXME: why?),
@ -110,6 +125,7 @@ SUBROUTINE punch( what )
IF ( TRIM(cp_source) /= TRIM(cp_dest) ) &
cp_status = f_copy(cp_source, cp_dest)
ENDDO
WRITE( stdout, '(", pseudopotentials")', ADVANCE ='NO' )
!
IF ( lrism3d ) THEN
!
@ -119,19 +135,22 @@ SUBROUTINE punch( what )
IF ( TRIM(cp_source) /= TRIM(cp_dest) ) &
cp_status = f_copy(cp_source, cp_dest)
ENDDO
WRITE( stdout, '(", RISM molfiles")', ADVANCE ='NO' )
!
ENDIF
!
! write XDM dispersion data (coefficients and vdw radii) to xdm.dat
IF (lxdm) THEN
CALL write_xdmdat()
WRITE( stdout, '(", XDM data")', ADVANCE ='NO' )
ENDIF
ENDIF
!
! ... wavefunctions in "collected" format - also G- and k+G-vectors
!
CALL write_collected_wfc( )
WRITE( stdout, '(", collected wavefunctions")', ADVANCE ='NO' )
!
! ... if allocated, deallocate variables containing info on ionic steps
!
CALL qexsd_reset_steps()
@ -141,14 +160,16 @@ SUBROUTINE punch( what )
! ... here we are stopping an incomplete calculations - wavefunctions are
! ... stored in buffers and saved when buffers are closed. For 1 k-point
! ... however there is no buffer: wavefunctions must be saved to file here
! ... (if disk_io='low' no file is open, must be opened and closed here)
!
IF (io_level < 1) CALL diropn( iunwfc, 'wfc', 2*nwordwfc, exst )
CALL using_evc(0)
CALL davcio ( evc, 2*nwordwfc, iunwfc, nks, 1 )
IF (io_level < 1) CLOSE ( UNIT=iunwfc, STATUS='keep' )
CALL infomsg('punch','wavefunctions written to file')
WRITE( stdout, '(" distributed wavefunctions")', ADVANCE ='NO' )
!
ENDIF
WRITE( stdout, *)
!
! ... FIXME: for electron-phonon calculations - data should be read from xml file!
!

View File

@ -45,7 +45,6 @@ SUBROUTINE run_pwscf( exit_status )
USE control_flags, ONLY : conv_elec, gamma_only, ethr, lscf, treinit_gvecs
USE control_flags, ONLY : conv_ions, istep, nstep, restart, lmd, lbfgs,&
lensemb, lforce=>tprnfor, tstress
USE control_flags, ONLY : io_level
USE cellmd, ONLY : lmovecell
USE command_line_options, ONLY : command_line
USE force_mod, ONLY : sigma, force
@ -352,7 +351,7 @@ SUBROUTINE run_pwscf( exit_status )
!
CALL qexsd_set_status( exit_status )
IF ( lensemb ) CALL beef_energies( )
IF ( io_level > -2 ) CALL punch( 'all' )
CALL punch( 'all' )
!
CALL qmmm_shutdown()
!