From 5e399e3a0bbe18f8a73b50122124799fa3e2449b Mon Sep 17 00:00:00 2001 From: sbraccia Date: Tue, 20 Sep 2005 15:17:18 +0000 Subject: [PATCH] First experimental version of the Laio-Parrinello metadynamics. This implementation is compatible with both PWscf and CP. Examples and documentation will follow. C.S. git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@2199 c92efa57-630b-4861-b058-cf58834340f0 --- CPV/compute_fes_grads.f90 | 109 +++---- CPV/cprstart.f90 | 15 +- CPV/input.f90 | 138 ++++++--- CPV/stop_run.f90 | 6 +- Modules/coarsegrained_vars.f90 | 180 ++++++++++-- Modules/input_parameters.f90 | 30 +- Modules/io_files.f90 | 8 +- Modules/read_namelists.f90 | 501 +++++++++++++++++---------------- PW/compute_fes_grads.f90 | 98 +++---- PW/input.f90 | 51 ++-- PW/pwscf.f90 | 35 +-- PW/stop_run.f90 | 18 +- 12 files changed, 698 insertions(+), 491 deletions(-) diff --git a/CPV/compute_fes_grads.f90 b/CPV/compute_fes_grads.f90 index 38b6f7001..fefb4e2a7 100644 --- a/CPV/compute_fes_grads.f90 +++ b/CPV/compute_fes_grads.f90 @@ -16,7 +16,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) trane, ampre, nbeg, tfor, taurdr, ndr USE cg_module, ONLY : tcg USE coarsegrained_vars, ONLY : new_target, to_target, dfe_acc, & - max_shake_iter, max_fe_iter, to_new_target + shake_nstep, fe_nstep, to_new_target USE path_variables, ONLY : pos, pes, grad_pes, frozen, & num_of_images, istep_path, suspended_image USE constraints_module, ONLY : lagrange, target, init_constraint, & @@ -233,7 +233,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) to_target(:) = new_target(:) - target(:) ! nfi = 1 - nomore = max_shake_iter + nomore = shake_nstep tcg = .FALSE. tfor = .TRUE. ! @@ -244,7 +244,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) ! ... and finally the free energy gradients are computed ! nfi = 1 - nomore = max_fe_iter + nomore = fe_nstep ! to_new_target = .FALSE. ! @@ -312,7 +312,6 @@ SUBROUTINE metadyn() ! USE kinds, ONLY : DP USE constraints_module, ONLY : nconstr, target, lagrange - USE cell_base, ONLY : at, alat USE cp_main_variables, ONLY : nfi USE control_flags, ONLY : program_name, nomore, ldamped, tconvthrs, & trane, ampre, nbeg, tfor, taurdr, ndr @@ -320,16 +319,12 @@ SUBROUTINE metadyn() USE ions_base, ONLY : nat, nsp, ityp, if_pos, & sort_tau, tau_srt, ind_srt USE io_global, ONLY : stdout - USE io_files, ONLY : prefix, iunaxsf, scradir - USE constants, ONLY : bohr_radius_angs - USE coarsegrained_vars, ONLY : max_fe_iter, max_shake_iter, fe_grad, & + USE io_files, ONLY : iunmeta, iunaxsf, scradir + USE coarsegrained_vars, ONLY : fe_nstep, shake_nstep, fe_grad, & new_target, to_target, to_new_target, & fe_step, dfe_acc, metadyn_history, & - max_metadyn_iter, A, sigma - USE coarsegrained_vars, ONLY : allocate_coarsegrained_vars, & - deallocate_coarsegrained_vars + max_metadyn_iter, starting_metadyn_iter USE coarsegrained_base, ONLY : add_gaussians - USE parser, ONLY : delete_if_present USE io_global, ONLY : ionode USE xml_io_base, ONLY : check_restartfile USE basic_algebra_routines @@ -344,42 +339,6 @@ SUBROUTINE metadyn() ! ALLOCATE( tau( 3, nat ), fion( 3, nat ) ) ! - CALL allocate_coarsegrained_vars( nconstr, max_metadyn_iter ) - ! - IF ( ionode ) THEN - ! - OPEN( UNIT = iunaxsf, FILE = TRIM( prefix ) // ".axsf", & - STATUS = "UNKNOWN", ACTION = "WRITE" ) - ! - WRITE( UNIT = iunaxsf, FMT = '(" ANIMSTEPS ",I3)' ) max_metadyn_iter - WRITE( UNIT = iunaxsf, FMT = '(" CRYSTAL ")' ) - WRITE( UNIT = iunaxsf, FMT = '(" PRIMVEC ")' ) - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,1) * alat * bohr_radius_angs, & - at(2,1) * alat * bohr_radius_angs, & - at(3,1) * alat * bohr_radius_angs - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,2) * alat * bohr_radius_angs, & - at(2,2) * alat * bohr_radius_angs, & - at(3,2) * alat * bohr_radius_angs - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,3) * alat * bohr_radius_angs, & - at(2,3) * alat * bohr_radius_angs, & - at(3,3) * alat * bohr_radius_angs - ! - END IF - ! - CALL delete_if_present( TRIM( prefix ) // '.metadyn' ) - ! - IF ( ionode ) THEN - ! - OPEN( UNIT = 999, FILE = TRIM( prefix ) // '.metadyn', STATUS = 'NEW' ) - ! - WRITE( 999, '(2(2X,I5))' ) nconstr, max_metadyn_iter - WRITE( 999, '(2(2X,F12.8))' ) A, sigma - ! - END IF - ! ! ... first the wfc are taken to the ground state ! taurdr = .TRUE. @@ -410,14 +369,39 @@ SUBROUTINE metadyn() ! tfor = .TRUE. ! - DO iter = 1, max_metadyn_iter + iter = starting_metadyn_iter + ! + metadyn_loop: DO + ! + IF ( iter > 0 ) THEN + ! + CALL add_gaussians( iter ) + ! + ! ... the system is "adiabatically" moved to the new target + ! + new_target(:) = target(:) - fe_step * fe_grad(:) / norm( fe_grad ) + ! + to_target(:) = new_target(:) - target(:) + ! + nfi = 0 + nomore = shake_nstep + ! + tconvthrs%active = .FALSE. + ! + to_new_target = .TRUE. + ! + CALL cprmain( tau, fion, etot ) + ! + END IF + ! + iter = iter + 1 ! metadyn_history(:,iter) = target(:) ! IF ( ionode ) CALL write_config( iter ) ! nfi = 0 - nomore = max_fe_iter + nomore = fe_nstep ! tconvthrs%active = .TRUE. ! @@ -442,42 +426,23 @@ SUBROUTINE metadyn() END IF ! IF ( ionode ) & - WRITE( 999, '(I4,5(2X,F12.8))' ) iter, target(:), etot, fe_grad(:) + WRITE( iunmeta, '(I4,5(2X,F12.8))' ) iter, target(:), etot, fe_grad(:) ! - CALL add_gaussians( iter ) + IF ( iter >= max_metadyn_iter ) EXIT metadyn_loop ! - new_target(:) = target(:) - fe_step * fe_grad(:) / norm( fe_grad ) - ! - ! ... the system is "adiabatically" moved to the new target - ! - to_target(:) = new_target(:) - target(:) - ! - nfi = 0 - nomore = max_shake_iter - ! - tconvthrs%active = .FALSE. - ! - to_new_target = .TRUE. - ! - CALL cprmain( tau, fion, etot ) - ! - IF ( ionode ) CALL flush_unit( 999 ) - ! - END DO + END DO metadyn_loop ! IF ( ionode ) THEN ! CALL write_config( iter ) ! CLOSE( UNIT = iunaxsf ) - CLOSE( UNIT = 999 ) + CLOSE( UNIT = iunmeta ) ! END IF ! DEALLOCATE( tau, fion ) ! - CALL deallocate_coarsegrained_vars() - ! RETURN ! END SUBROUTINE metadyn diff --git a/CPV/cprstart.f90 b/CPV/cprstart.f90 index 7094011a6..6b340b2b2 100644 --- a/CPV/cprstart.f90 +++ b/CPV/cprstart.f90 @@ -70,12 +70,13 @@ PROGRAM main !---------------------------------------------------------------------------- ! - USE input, ONLY : read_input_file, iosys_pseudo, iosys - USE io_global, ONLY : io_global_start, io_global_getionode - USE mp_global, ONLY : mp_global_start - USE mp, ONLY : mp_end, mp_start, mp_env - USE control_flags, ONLY : lneb, lsmd, lmetadyn, program_name - USE environment, ONLY : environment_start + USE input, ONLY : read_input_file, iosys_pseudo, iosys + USE io_global, ONLY : io_global_start, io_global_getionode + USE mp_global, ONLY : mp_global_start + USE mp, ONLY : mp_end, mp_start, mp_env + USE control_flags, ONLY : lneb, lsmd, lmetadyn, program_name + USE coarsegrained_base, ONLY : metadyn_init + USE environment, ONLY : environment_start ! IMPLICIT NONE ! @@ -127,6 +128,8 @@ PROGRAM main CALL smd_loop( 1 ) ! ELSE IF ( lmetadyn ) THEN + ! + CALL metadyn_init() ! CALL metadyn() ! diff --git a/CPV/input.f90 b/CPV/input.f90 index 27fb0f765..dcb94896c 100644 --- a/CPV/input.f90 +++ b/CPV/input.f90 @@ -207,7 +207,8 @@ MODULE input tchi2_ => tchi2, & tatomicwfc_ => tatomicwfc, & printwfc_ => printwfc, & - tortho_ => tortho + tortho_ => tortho, & + nstep_ => nstep USE control_flags, ONLY : t_diis_simple_ => t_diis_simple, & t_diis_ => t_diis, & tsde_ => tsde, & @@ -258,6 +259,12 @@ MODULE input USE cp_electronic_mass, ONLY : emass_ => emass, & emaec_ => emass_cutoff ! + USE coarsegrained_vars, ONLY : fe_nstep_ => fe_nstep, & + shake_nstep_ => shake_nstep, & + fe_step_ => fe_step, & + g_amplitude_ => g_amplitude, & + g_sigma_ => g_sigma + ! USE input_parameters, ONLY: & electron_dynamics, electron_damping, diis_rot, electron_temperature, & ion_dynamics, ekin_conv_thr, etot_conv_thr, forc_conv_thr, ion_maxstep,& @@ -271,8 +278,12 @@ MODULE input ampre, nstep, restart_mode, ion_positions, startingwfc, printwfc, & orthogonalization, electron_velocities, nat, if_pos, phase_space ! + USE input_parameters, ONLY : g_amplitude, g_sigma, fe_step, fe_nstep, & + shake_nstep + ! IMPLICIT NONE ! + ! IF ( .NOT. has_been_read ) & CALL errore( 'iosys ', 'input file has not been read yet!', 1 ) ! @@ -368,46 +379,85 @@ MODULE input trane_ = .FALSE. ampre_ = ampre taurdr_ = .FALSE. + ! SELECT CASE ( TRIM( restart_mode ) ) - CASE ('from_scratch') - nbeg_ = -1 - nomore_ = nstep - trane_ = ( startingwfc == 'random' ) - IF ( ampre_ == 0.d0 ) ampre_ = 0.02 - CASE ('reset_counters') - nbeg_ = 0 - nomore_ = nstep - CASE ('restart') - nbeg_ = 1 - nomore_ = nstep - CASE ('auto') - if( auto_check(ndr, ' ') ) then - write(*,*) 'AuTOPILOT: Auto Check detects restart.xml' - write(*,*) ' adjusting restart mode to RESTART' - restart_mode = 'restart' - nbeg_ = 1 - ! Also handle NSTEPS adjustment so that - ! nomore does not include past nfi in cpr.f90 - restart_p = .TRUE. - nomore_ = nstep - if ( ion_positions == 'from_input' ) then - taurdr_ = .TRUE. - nbeg_ = -1 - end if - else - write(*,*) 'AUTOPILOT: Auto Check did not detect restart.xml' - write(*,*) ' adjusting restart mode to FROM_SCRATCH' - restart_mode = 'from_scratch' - nbeg_ = -2 - if ( ion_positions == 'from_input' ) nbeg_ = -1 - nomore_ = nstep - trane_ = ( startingwfc == 'random' ) - if ( ampre_ == 0.d0 ) ampre_ = 0.02 - end IF + ! + CASE( 'from_scratch' ) + ! + nbeg_ = -1 + nomore_ = nstep + nstep_ = nstep + trane_ = ( startingwfc == 'random' ) + ! + IF ( ampre_ == 0.D0 ) ampre_ = 0.02D0 + ! + CASE( 'reset_counters' ) + ! + nbeg_ = 0 + nomore_ = nstep + nstep_ = nstep + ! + CASE( 'restart' ) + ! + nbeg_ = 1 + nomore_ = nstep + nstep_ = nstep + ! + CASE( 'auto' ) + ! + IF ( auto_check( ndr, ' ' ) ) THEN + ! + WRITE( stdout, '("autopilot: Auto Check detects restart.xml")' ) + WRITE( stdout, '(" adjusting restart_mode to restart")' ) + ! + restart_mode = 'restart' + ! + nbeg_ = 1 + ! + ! ... Also handle NSTEPS adjustment so that + ! ... nomore does not include past nfi in cpr.f90 + ! + restart_p = .TRUE. + nomore_ = nstep + nstep_ = nstep + ! + IF ( ion_positions == 'from_input' ) THEN + ! + taurdr_ = .TRUE. + nbeg_ = -1 + ! + END IF + ! + ELSE + ! + WRITE( stdout, & + '("autopilot: Auto Check did not detect restart.xml")' ) + ! + WRITE( stdout, & + '(" adjusting restart_mode to from_scratch")' ) + ! + restart_mode = 'from_scratch' + ! + nbeg_ = -2 + ! + IF ( ion_positions == 'from_input' ) nbeg_ = -1 + ! + nomore_ = nstep + nstep_ = nstep + ! + trane_ = ( startingwfc == 'random' ) + ! + IF ( ampre_ == 0.d0 ) ampre_ = 0.02D0 + ! + END IF + ! CASE DEFAULT - CALL errore(' iosys ',' unknown restart_mode '//TRIM(restart_mode), 1 ) + ! + CALL errore( 'iosys ', & + 'unknown restart_mode ' // TRIM( restart_mode ), 1 ) + ! END SELECT - + ! ! ... Starting/Restarting Atomic positions ! SELECT CASE ( TRIM(ion_positions) ) @@ -516,7 +566,17 @@ MODULE input CASE DEFAULT CALL errore(' control_flags ',' unknown electron_temperature '//TRIM(electron_temperature), 1 ) END SELECT - + + ! + ! ... meta-dynamics + ! + + fe_nstep_ = fe_nstep + shake_nstep_ = shake_nstep + fe_step_ = fe_step + g_amplitude_ = g_amplitude + g_sigma_ = g_sigma + SELECT CASE( TRIM( phase_space ) ) CASE( 'full' ) ! diff --git a/CPV/stop_run.f90 b/CPV/stop_run.f90 index de12204db..52f827577 100644 --- a/CPV/stop_run.f90 +++ b/CPV/stop_run.f90 @@ -13,13 +13,15 @@ SUBROUTINE stop_run( flag ) ! ... Close all files and synchronize processes before stopping. ! USE io_global, ONLY : stdout, ionode - USE control_flags, ONLY : lpath, lneb, lsmd, lconstrain + USE control_flags, ONLY : lpath, lneb, lsmd, lconstrain, & + lcoarsegrained USE io_files, ONLY : prefix USE environment, ONLY : environment_end USE input_parameters, ONLY : deallocate_input_parameters USE path_variables, ONLY : path_deallocation USE path_io_routines, ONLY : io_path_stop USE constraints_module, ONLY : deallocate_constraint + USE coarsegrained_vars, ONLY : deallocate_coarsegrained_vars USE mp, ONLY : mp_barrier, mp_end ! IMPLICIT NONE @@ -45,6 +47,8 @@ SUBROUTINE stop_run( flag ) ! IF ( lconstrain ) CALL deallocate_constraint() ! + IF ( lcoarsegrained ) CALL deallocate_coarsegrained_vars() + ! IF ( lneb ) THEN ! CALL path_deallocation( 'neb' ) diff --git a/Modules/coarsegrained_vars.f90 b/Modules/coarsegrained_vars.f90 index da1b2909a..fd35b7f30 100644 --- a/Modules/coarsegrained_vars.f90 +++ b/Modules/coarsegrained_vars.f90 @@ -15,12 +15,8 @@ MODULE coarsegrained_vars ! SAVE ! - ! INTEGER, PARAMETER :: max_fe_iter = 50 - ! INTEGER, PARAMETER :: max_shake_iter = 5 - INTEGER, PARAMETER :: max_fe_iter = 200 - INTEGER, PARAMETER :: max_shake_iter = 20 - ! - REAL(DP), PARAMETER :: fe_step = 0.4D0 + INTEGER :: fe_nstep + INTEGER :: shake_nstep ! REAL(DP), ALLOCATABLE :: dfe_acc(:) REAL(DP), ALLOCATABLE :: fe_grad(:) @@ -31,16 +27,19 @@ MODULE coarsegrained_vars ! ! ... Laio-Parrinello meta-dynamics ! - INTEGER, PARAMETER :: max_metadyn_iter = 500 + REAL(DP) :: fe_step + ! + INTEGER :: max_metadyn_iter ! REAL(DP), ALLOCATABLE :: metadyn_history(:,:) ! - ! REAL(DP), PARAMETER :: A = 0.01D0 - REAL(DP), PARAMETER :: A = 0.005D0 - REAL(DP), PARAMETER :: sigma = 0.4D0 + REAL(DP) :: g_amplitude + REAL(DP) :: g_sigma ! - REAL(DP), PARAMETER :: sigma_sq = sigma**2 - REAL(DP), PARAMETER :: two_sigma_sq = 2.D0 * sigma_sq + REAL(DP) :: g_sigma_sq + REAL(DP) :: two_g_sigma_sq + ! + INTEGER :: starting_metadyn_iter ! CONTAINS ! @@ -91,7 +90,7 @@ MODULE coarsegrained_base ! PRIVATE ! - PUBLIC :: set_target, add_gaussians + PUBLIC :: set_target, add_gaussians, metadyn_init ! CONTAINS ! @@ -99,13 +98,13 @@ MODULE coarsegrained_base SUBROUTINE set_target() !------------------------------------------------------------------------ ! - USE coarsegrained_vars, ONLY : to_target, to_new_target, max_shake_iter + USE coarsegrained_vars, ONLY : to_target, to_new_target, shake_nstep USE constraints_module, ONLY : target ! ! IF ( to_new_target ) THEN ! - target(:) = target(:) + to_target(:) / DBLE( max_shake_iter ) + target(:) = target(:) + to_target(:) / DBLE( shake_nstep ) ! END IF ! @@ -114,12 +113,155 @@ MODULE coarsegrained_base END SUBROUTINE set_target ! !------------------------------------------------------------------------ + SUBROUTINE metadyn_init() + !------------------------------------------------------------------------ + ! + USE kinds, ONLY : DP + USE input_parameters, ONLY : restart_mode + USE constraints_module, ONLY : nconstr, target + USE control_flags, ONLY : nstep + USE constants, ONLY : bohr_radius_angs + USE cell_base, ONLY : at, alat + USE coarsegrained_vars, ONLY : allocate_coarsegrained_vars, fe_grad, & + g_amplitude, g_sigma, g_sigma_sq, two_g_sigma_sq, & + max_metadyn_iter, metadyn_history, & + starting_metadyn_iter + USE parser, ONLY : delete_if_present + USE io_files, ONLY : prefix, iunaxsf, iunmeta + USE io_global, ONLY : stdout, ionode, ionode_id + USE mp, ONLY : mp_bcast + ! + IMPLICIT NONE + ! + INTEGER :: idum, i + REAL(DP) :: rdum + LOGICAL :: lstop, file_exists + ! + ! + g_sigma_sq = g_sigma**2 + two_g_sigma_sq = 2.D0 * g_sigma_sq + ! + IF ( nstep < 1 ) CALL errore( 'metadyn_init', 'nstep < 1', 1 ) + ! + max_metadyn_iter = nstep + ! + CALL allocate_coarsegrained_vars( nconstr, max_metadyn_iter ) + ! + IF ( restart_mode == 'from_scratch' ) THEN + ! + IF ( ionode ) THEN + ! + OPEN( UNIT = iunaxsf, & + FILE = TRIM( prefix ) // ".axsf", STATUS = 'UNKNOWN' ) + ! + WRITE( UNIT = iunaxsf, FMT = '(" ANIMSTEPS ",I3)' ) max_metadyn_iter + WRITE( UNIT = iunaxsf, FMT = '(" CRYSTAL ")' ) + WRITE( UNIT = iunaxsf, FMT = '(" PRIMVEC ")' ) + WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & + at(1,1) * alat * bohr_radius_angs, & + at(2,1) * alat * bohr_radius_angs, & + at(3,1) * alat * bohr_radius_angs + WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & + at(1,2) * alat * bohr_radius_angs, & + at(2,2) * alat * bohr_radius_angs, & + at(3,2) * alat * bohr_radius_angs + WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & + at(1,3) * alat * bohr_radius_angs, & + at(2,3) * alat * bohr_radius_angs, & + at(3,3) * alat * bohr_radius_angs + ! + END IF + ! + CALL delete_if_present( TRIM( prefix ) // '.metadyn' ) + ! + IF ( ionode ) THEN + ! + OPEN( UNIT = iunmeta, & + FILE = TRIM( prefix ) // '.metadyn', STATUS = 'NEW' ) + ! + WRITE( iunmeta, '(2(2X,I5))' ) nconstr, max_metadyn_iter + WRITE( iunmeta, '(2(2X,F12.8))' ) g_amplitude, g_sigma + ! + END IF + ! + starting_metadyn_iter = 0 + ! + ELSE + ! + IF ( ionode ) & + INQUIRE( FILE = TRIM( prefix ) // '.metadyn', EXIST = file_exists ) + ! + CALL mp_bcast( file_exists, ionode_id ) + ! + IF ( .NOT. file_exists ) & + CALL errore( 'metadyn_init', 'restart file ' // & + & TRIM( prefix ) // '.metadyn does not exist', 1 ) + ! + IF ( ionode ) THEN + ! + OPEN( UNIT = iunaxsf, FILE = TRIM( prefix ) // ".axsf", & + STATUS = 'UNKNOWN', ACTION = 'WRITE', POSITION = 'APPEND' ) + ! + OPEN( UNIT = iunmeta, FILE = TRIM( prefix ) // '.metadyn', & + ACTION = 'READ', STATUS = 'UNKNOWN' ) + ! + ! ... first we look for the number of performed iterations + ! + READ( iunmeta, * ) nconstr, starting_metadyn_iter + READ( iunmeta, * ) + ! + IF ( starting_metadyn_iter >= max_metadyn_iter ) THEN + ! + WRITE( stdout, '(/,5X,"Simulation already completed",/)' ) + ! + CLOSE( UNIT = iunmeta, STATUS = 'KEEP' ) + ! + lstop = .TRUE. + ! + ELSE + ! + lstop = .FALSE. + ! + DO i = 1, starting_metadyn_iter + ! + READ( iunmeta, * ) & + idum, metadyn_history(:,i), rdum, fe_grad(:) + ! + END DO + ! + target(:) = metadyn_history(:,starting_metadyn_iter) + ! + CLOSE( UNIT = iunmeta, STATUS = 'KEEP' ) + ! + OPEN( UNIT = iunmeta, FILE = TRIM( prefix ) // '.metadyn', & + STATUS = 'UNKNOWN', ACTION = 'WRITE', POSITION = 'APPEND' ) + ! + END IF + ! + END IF + ! + CALL mp_bcast( lstop, ionode_id ) + ! + IF ( lstop ) CALL stop_run( .FALSE. ) + ! + CALL mp_bcast( starting_metadyn_iter, ionode_id ) + CALL mp_bcast( metadyn_history, ionode_id ) + CALL mp_bcast( target, ionode_id ) + CALL mp_bcast( fe_grad, ionode_id ) + ! + END IF + ! + RETURN + ! + END SUBROUTINE metadyn_init + ! + !------------------------------------------------------------------------ SUBROUTINE add_gaussians( iter ) !------------------------------------------------------------------------ ! USE constraints_module, ONLY : nconstr USE coarsegrained_vars, ONLY : metadyn_history, fe_grad, dfe_acc - USE coarsegrained_vars, ONLY : A, sigma_sq, two_sigma_sq + USE coarsegrained_vars, ONLY : g_amplitude, g_sigma_sq, two_g_sigma_sq USE basic_algebra_routines ! IMPLICIT NONE @@ -132,6 +274,8 @@ MODULE coarsegrained_base ! ! ... history dependent term ! + IF ( iter == 1 ) RETURN + ! ALLOCATE( delta( nconstr ) ) ! dfe_acc = 0.D0 @@ -141,11 +285,11 @@ MODULE coarsegrained_base delta = metadyn_history(:,i) - metadyn_history(:,iter) ! dfe_acc(:) = dfe_acc(:) + delta(:) * & - EXP( - ( delta(:) .dot. delta(:) ) / two_sigma_sq ) + EXP( - ( delta(:) .dot. delta(:) ) / two_g_sigma_sq ) ! END DO ! - fe_grad(:) = fe_grad(:) + A / sigma_sq * dfe_acc(:) + fe_grad(:) = fe_grad(:) + g_amplitude / g_sigma_sq * dfe_acc(:) ! DEALLOCATE( delta ) ! diff --git a/Modules/input_parameters.f90 b/Modules/input_parameters.f90 index 54ec37edc..31b07d2ae 100644 --- a/Modules/input_parameters.f90 +++ b/Modules/input_parameters.f90 @@ -1144,22 +1144,34 @@ MODULE input_parameters REAL (DP) :: smd_ene_fin = 1.D0 ! REAL (DP) :: smd_spal = 1.D0 + + ! + ! ... variable for meta-dynamics + ! + + INTEGER :: fe_nstep = 50 + INTEGER :: shake_nstep = 5 + REAL(DP) :: fe_step = 0.4D0 + REAL(DP) :: g_amplitude = 0.01D0 + REAL(DP) :: g_sigma = 0.4D0 NAMELIST / ions / phase_space, ion_dynamics, ion_radius, ion_damping, & ion_positions, ion_velocities, ion_temperature, & - tempw, fnosep, nhpcl, nhptyp, ndega, tranp, amprp, greasp, & - tolp, ion_nstepe, ion_maxstep, upscale, delta_t, & - pot_extrapolation, wfc_extrapolation, nraise, & - num_of_images, CI_scheme, opt_scheme, use_masses, & - first_last_opt, use_multistep, write_save, damp, & - temp_req, ds, k_max, k_min, path_thr, fixed_tan, & - init_num_of_images, free_energy, use_freezing, & - use_fourier, trust_radius_max, trust_radius_min, & + tempw, fnosep, nhpcl, nhptyp, ndega, tranp, amprp, & + greasp, tolp, ion_nstepe, ion_maxstep, upscale, & + delta_t, pot_extrapolation, wfc_extrapolation, & + nraise, num_of_images, CI_scheme, opt_scheme, & + use_masses, first_last_opt, use_multistep, & + write_save, damp, temp_req, ds, k_max, k_min, & + path_thr, fixed_tan, init_num_of_images, & + free_energy, use_freezing, use_fourier, & + trust_radius_max, trust_radius_min, & trust_radius_ini, w_1, w_2, bfgs_ndim, sic_rloc, & smd_polm, smd_kwnp, smd_linr, smd_stcd, smd_stcd1, & smd_stcd2, smd_stcd3, smd_codf, smd_forf, smd_smwf, & smd_lmfreq, smd_tol, smd_maxlm, smd_smcp, smd_smopt, & - smd_smlm, smd_ene_ini, smd_ene_fin + smd_smlm, smd_ene_ini, smd_ene_fin, & + fe_step, fe_nstep, shake_nstep, g_amplitude, g_sigma !=----------------------------------------------------------------------------=! ! CELL Namelist Input Parameters diff --git a/Modules/io_files.f90 b/Modules/io_files.f90 index fa06da366..6c3851709 100644 --- a/Modules/io_files.f90 +++ b/Modules/io_files.f90 @@ -1,5 +1,5 @@ ! -! Copyright (C) 2002-2004 FPMD & PWSCF groups +! Copyright (C) 2002-2005 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, @@ -108,17 +108,21 @@ MODULE io_files INTEGER :: iunaxsf = 25 ! unit for saving coordinates ( axsf format ) INTEGER :: iunbroy = 26 ! unit for saving broyden's history ! + ! ... meta-dynamics + ! + INTEGER :: iunmeta = 99 ! unit for saving meta-dynamics history + ! ! ... Y. Kanai combined smd/cp method ! INTEGER :: smwout = 20 ! base value to compute index for replica files ! INTEGER :: vib_out = 20 ! output of phrozen phonon vibrational calculation INTEGER :: vib_mass = 21 ! isotope masses used for the dynamical matrix - ! !... finite electric field (Umari) ! INTEGER :: iunefield = 31 ! unit to store wavefunction for calculatin electric field operator + ! !=----------------------------------------------------------------------------=! END MODULE io_files !=----------------------------------------------------------------------------=! diff --git a/Modules/read_namelists.f90 b/Modules/read_namelists.f90 index b97fca106..47866d251 100644 --- a/Modules/read_namelists.f90 +++ b/Modules/read_namelists.f90 @@ -15,13 +15,15 @@ MODULE read_namelists_module ! USE kinds, ONLY : DP USE constants, ONLY : factem, kb_au, au_kb, k_boltzman_au, angstrom_au, & - uma_au, pi + uma_au, pi, e2 USE input_parameters ! IMPLICIT NONE + ! SAVE ! PRIVATE + ! REAL(DP), PARAMETER :: sm_not_set = -20.D0 ! PUBLIC :: read_namelists, sm_not_set @@ -413,6 +415,14 @@ MODULE read_namelists_module smd_ene_ini = 1.D0 smd_ene_fin = 1.D0 ! + ! ... meta-dynamics defaults + ! + fe_step = 0.4D0 + fe_nstep = 50 + shake_nstep = 5 + g_amplitude = 0.01D0 + g_sigma = 0.4D0 + ! RETURN ! END SUBROUTINE @@ -570,37 +580,37 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( title, ionode_id ) - CALL mp_bcast( calculation, ionode_id ) - CALL mp_bcast( verbosity, ionode_id ) - CALL mp_bcast( restart_mode, ionode_id ) - CALL mp_bcast( nstep, ionode_id ) - CALL mp_bcast( iprint, ionode_id ) - CALL mp_bcast( isave, ionode_id ) - CALL mp_bcast( tstress, ionode_id ) - CALL mp_bcast( tprnfor, ionode_id ) - CALL mp_bcast( dt, ionode_id ) - CALL mp_bcast( ndr, ionode_id ) - CALL mp_bcast( ndw, ionode_id ) - CALL mp_bcast( outdir, ionode_id ) - CALL mp_bcast( scradir, ionode_id ) - CALL mp_bcast( prefix, ionode_id ) - CALL mp_bcast( max_seconds, ionode_id ) + CALL mp_bcast( title, ionode_id ) + CALL mp_bcast( calculation, ionode_id ) + CALL mp_bcast( verbosity, ionode_id ) + CALL mp_bcast( restart_mode, ionode_id ) + CALL mp_bcast( nstep, ionode_id ) + CALL mp_bcast( iprint, ionode_id ) + CALL mp_bcast( isave, ionode_id ) + CALL mp_bcast( tstress, ionode_id ) + CALL mp_bcast( tprnfor, ionode_id ) + CALL mp_bcast( dt, ionode_id ) + CALL mp_bcast( ndr, ionode_id ) + CALL mp_bcast( ndw, ionode_id ) + CALL mp_bcast( outdir, ionode_id ) + CALL mp_bcast( scradir, ionode_id ) + CALL mp_bcast( prefix, ionode_id ) + CALL mp_bcast( max_seconds, ionode_id ) CALL mp_bcast( ekin_conv_thr, ionode_id ) CALL mp_bcast( etot_conv_thr, ionode_id ) CALL mp_bcast( forc_conv_thr, ionode_id ) - CALL mp_bcast( pseudo_dir, ionode_id ) - CALL mp_bcast( refg, ionode_id ) - CALL mp_bcast( disk_io, ionode_id ) - CALL mp_bcast( tefield, ionode_id ) - CALL mp_bcast( dipfield, ionode_id ) - CALL mp_bcast( lberry, ionode_id ) - CALL mp_bcast( gdir, ionode_id ) - CALL mp_bcast( nppstr, ionode_id ) - CALL mp_bcast( wf_collect, ionode_id ) - CALL mp_bcast( printwfc, ionode_id ) - CALL mp_bcast( lelfield, ionode_id ) - CALL mp_bcast( nberrycic, ionode_id ) + CALL mp_bcast( pseudo_dir, ionode_id ) + CALL mp_bcast( refg, ionode_id ) + CALL mp_bcast( disk_io, ionode_id ) + CALL mp_bcast( tefield, ionode_id ) + CALL mp_bcast( dipfield, ionode_id ) + CALL mp_bcast( lberry, ionode_id ) + CALL mp_bcast( gdir, ionode_id ) + CALL mp_bcast( nppstr, ionode_id ) + CALL mp_bcast( wf_collect, ionode_id ) + CALL mp_bcast( printwfc, ionode_id ) + CALL mp_bcast( lelfield, ionode_id ) + CALL mp_bcast( nberrycic, ionode_id ) ! RETURN @@ -623,62 +633,62 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( ibrav, ionode_id ) - CALL mp_bcast( celldm, ionode_id ) - CALL mp_bcast( a, ionode_id ) - CALL mp_bcast( b, ionode_id ) - CALL mp_bcast( c, ionode_id ) - CALL mp_bcast( cosab, ionode_id ) - CALL mp_bcast( cosac, ionode_id ) - CALL mp_bcast( cosbc, ionode_id ) - CALL mp_bcast( nat, ionode_id ) - CALL mp_bcast( ntyp, ionode_id ) - CALL mp_bcast( nbnd, ionode_id ) - CALL mp_bcast( nelec, ionode_id ) - CALL mp_bcast( ecutwfc, ionode_id ) - CALL mp_bcast( ecutrho, ionode_id ) - CALL mp_bcast( nr1, ionode_id ) - CALL mp_bcast( nr2, ionode_id ) - CALL mp_bcast( nr3, ionode_id ) - CALL mp_bcast( nr1s, ionode_id ) - CALL mp_bcast( nr2s, ionode_id ) - CALL mp_bcast( nr3s, ionode_id ) - CALL mp_bcast( nr1b, ionode_id ) - CALL mp_bcast( nr2b, ionode_id ) - CALL mp_bcast( nr3b, ionode_id ) - CALL mp_bcast( occupations, ionode_id ) - CALL mp_bcast( smearing, ionode_id ) - CALL mp_bcast( degauss, ionode_id ) - CALL mp_bcast( nelup, ionode_id ) - CALL mp_bcast( neldw, ionode_id ) - CALL mp_bcast( nspin, ionode_id ) - CALL mp_bcast( nosym, ionode_id ) - CALL mp_bcast( ecfixed, ionode_id ) - CALL mp_bcast( qcutz, ionode_id ) - CALL mp_bcast( q2sigma, ionode_id ) - CALL mp_bcast( xc_type, ionode_id ) + CALL mp_bcast( ibrav, ionode_id ) + CALL mp_bcast( celldm, ionode_id ) + CALL mp_bcast( a, ionode_id ) + CALL mp_bcast( b, ionode_id ) + CALL mp_bcast( c, ionode_id ) + CALL mp_bcast( cosab, ionode_id ) + CALL mp_bcast( cosac, ionode_id ) + CALL mp_bcast( cosbc, ionode_id ) + CALL mp_bcast( nat, ionode_id ) + CALL mp_bcast( ntyp, ionode_id ) + CALL mp_bcast( nbnd, ionode_id ) + CALL mp_bcast( nelec, ionode_id ) + CALL mp_bcast( ecutwfc, ionode_id ) + CALL mp_bcast( ecutrho, ionode_id ) + CALL mp_bcast( nr1, ionode_id ) + CALL mp_bcast( nr2, ionode_id ) + CALL mp_bcast( nr3, ionode_id ) + CALL mp_bcast( nr1s, ionode_id ) + CALL mp_bcast( nr2s, ionode_id ) + CALL mp_bcast( nr3s, ionode_id ) + CALL mp_bcast( nr1b, ionode_id ) + CALL mp_bcast( nr2b, ionode_id ) + CALL mp_bcast( nr3b, ionode_id ) + CALL mp_bcast( occupations, ionode_id ) + CALL mp_bcast( smearing, ionode_id ) + CALL mp_bcast( degauss, ionode_id ) + CALL mp_bcast( nelup, ionode_id ) + CALL mp_bcast( neldw, ionode_id ) + CALL mp_bcast( nspin, ionode_id ) + CALL mp_bcast( nosym, ionode_id ) + CALL mp_bcast( ecfixed, ionode_id ) + CALL mp_bcast( qcutz, ionode_id ) + CALL mp_bcast( q2sigma, ionode_id ) + CALL mp_bcast( xc_type, ionode_id ) CALL mp_bcast( starting_magnetization, ionode_id ) CALL mp_bcast( starting_ns_eigenvalue, ionode_id ) - CALL mp_bcast( U_projection_type, ionode_id ) - CALL mp_bcast( lda_plus_U, ionode_id ) - CALL mp_bcast( Hubbard_U, ionode_id ) - CALL mp_bcast( Hubbard_alpha, ionode_id ) - CALL mp_bcast( edir, ionode_id ) - CALL mp_bcast( emaxpos, ionode_id ) - CALL mp_bcast( eopreg, ionode_id ) - CALL mp_bcast( eamp, ionode_id ) + CALL mp_bcast( U_projection_type, ionode_id ) + CALL mp_bcast( lda_plus_U, ionode_id ) + CALL mp_bcast( Hubbard_U, ionode_id ) + CALL mp_bcast( Hubbard_alpha, ionode_id ) + CALL mp_bcast( edir, ionode_id ) + CALL mp_bcast( emaxpos, ionode_id ) + CALL mp_bcast( eopreg, ionode_id ) + CALL mp_bcast( eamp, ionode_id ) ! ! ... non collinear broadcast ! - CALL mp_bcast( lspinorb, ionode_id ) - CALL mp_bcast( noncolin, ionode_id ) - CALL mp_bcast( angle1, ionode_id ) - CALL mp_bcast( angle2, ionode_id ) - CALL mp_bcast( report, ionode_id ) + CALL mp_bcast( lspinorb, ionode_id ) + CALL mp_bcast( noncolin, ionode_id ) + CALL mp_bcast( angle1, ionode_id ) + CALL mp_bcast( angle2, ionode_id ) + CALL mp_bcast( report, ionode_id ) CALL mp_bcast( constrained_magnetization, ionode_id ) - CALL mp_bcast( B_field, ionode_id ) - CALL mp_bcast( fixed_magnetization, ionode_id ) - CALL mp_bcast( lambda, ionode_id ) + CALL mp_bcast( B_field, ionode_id ) + CALL mp_bcast( fixed_magnetization, ionode_id ) + CALL mp_bcast( lambda, ionode_id ) ! RETURN ! @@ -700,59 +710,60 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( emass, ionode_id ) - CALL mp_bcast( emass_cutoff, ionode_id ) - CALL mp_bcast( orthogonalization, ionode_id ) - CALL mp_bcast( electron_maxstep, ionode_id ) - CALL mp_bcast( ortho_eps, ionode_id ) - CALL mp_bcast( ortho_max, ionode_id ) - CALL mp_bcast( electron_dynamics, ionode_id ) - CALL mp_bcast( electron_damping, ionode_id ) - CALL mp_bcast( electron_velocities, ionode_id ) + CALL mp_bcast( emass, ionode_id ) + CALL mp_bcast( emass_cutoff, ionode_id ) + CALL mp_bcast( orthogonalization, ionode_id ) + CALL mp_bcast( electron_maxstep, ionode_id ) + CALL mp_bcast( ortho_eps, ionode_id ) + CALL mp_bcast( ortho_max, ionode_id ) + CALL mp_bcast( electron_dynamics, ionode_id ) + CALL mp_bcast( electron_damping, ionode_id ) + CALL mp_bcast( electron_velocities, ionode_id ) CALL mp_bcast( electron_temperature, ionode_id ) - CALL mp_bcast( conv_thr, ionode_id ) - CALL mp_bcast( ekincw, ionode_id ) - CALL mp_bcast( fnosee, ionode_id ) - CALL mp_bcast( startingwfc, ionode_id ) - CALL mp_bcast( ampre, ionode_id ) - CALL mp_bcast( grease, ionode_id ) - CALL mp_bcast( startingpot, ionode_id ) - CALL mp_bcast( empty_states_nbnd, ionode_id ) + CALL mp_bcast( conv_thr, ionode_id ) + CALL mp_bcast( ekincw, ionode_id ) + CALL mp_bcast( fnosee, ionode_id ) + CALL mp_bcast( startingwfc, ionode_id ) + CALL mp_bcast( ampre, ionode_id ) + CALL mp_bcast( grease, ionode_id ) + CALL mp_bcast( startingpot, ionode_id ) + CALL mp_bcast( empty_states_nbnd, ionode_id ) CALL mp_bcast( empty_states_maxstep, ionode_id ) - CALL mp_bcast( empty_states_delt, ionode_id ) - CALL mp_bcast( empty_states_emass, ionode_id ) - CALL mp_bcast( empty_states_ethr, ionode_id ) - CALL mp_bcast( diis_size, ionode_id ) - CALL mp_bcast( diis_nreset, ionode_id ) - CALL mp_bcast( diis_hcut, ionode_id ) - CALL mp_bcast( diis_wthr, ionode_id ) - CALL mp_bcast( diis_delt, ionode_id ) - CALL mp_bcast( diis_maxstep, ionode_id ) - CALL mp_bcast( diis_rot, ionode_id ) - CALL mp_bcast( diis_fthr, ionode_id ) - CALL mp_bcast( diis_temp, ionode_id ) - CALL mp_bcast( diis_achmix, ionode_id ) - CALL mp_bcast( diis_g0chmix, ionode_id ) - CALL mp_bcast( diis_g1chmix, ionode_id ) - CALL mp_bcast( diis_nchmix, ionode_id ) - CALL mp_bcast( diis_nrot, ionode_id ) - CALL mp_bcast( diis_rothr, ionode_id ) - CALL mp_bcast( diis_ethr, ionode_id ) - CALL mp_bcast( diis_chguess, ionode_id ) - CALL mp_bcast( mixing_fixed_ns, ionode_id ) - CALL mp_bcast( mixing_mode, ionode_id ) - CALL mp_bcast( mixing_beta, ionode_id ) - CALL mp_bcast( mixing_ndim, ionode_id ) - CALL mp_bcast( diagonalization, ionode_id ) - CALL mp_bcast( diago_thr_init, ionode_id ) - CALL mp_bcast( diago_cg_maxiter, ionode_id ) - CALL mp_bcast( diago_david_ndim, ionode_id ) - CALL mp_bcast( diago_diis_ndim, ionode_id ) - CALL mp_bcast( sic, ionode_id ) - CALL mp_bcast( sic_epsilon , ionode_id ) - CALL mp_bcast( force_pairing , ionode_id ) + CALL mp_bcast( empty_states_delt, ionode_id ) + CALL mp_bcast( empty_states_emass, ionode_id ) + CALL mp_bcast( empty_states_ethr, ionode_id ) + CALL mp_bcast( diis_size, ionode_id ) + CALL mp_bcast( diis_nreset, ionode_id ) + CALL mp_bcast( diis_hcut, ionode_id ) + CALL mp_bcast( diis_wthr, ionode_id ) + CALL mp_bcast( diis_delt, ionode_id ) + CALL mp_bcast( diis_maxstep, ionode_id ) + CALL mp_bcast( diis_rot, ionode_id ) + CALL mp_bcast( diis_fthr, ionode_id ) + CALL mp_bcast( diis_temp, ionode_id ) + CALL mp_bcast( diis_achmix, ionode_id ) + CALL mp_bcast( diis_g0chmix, ionode_id ) + CALL mp_bcast( diis_g1chmix, ionode_id ) + CALL mp_bcast( diis_nchmix, ionode_id ) + CALL mp_bcast( diis_nrot, ionode_id ) + CALL mp_bcast( diis_rothr, ionode_id ) + CALL mp_bcast( diis_ethr, ionode_id ) + CALL mp_bcast( diis_chguess, ionode_id ) + CALL mp_bcast( mixing_fixed_ns, ionode_id ) + CALL mp_bcast( mixing_mode, ionode_id ) + CALL mp_bcast( mixing_beta, ionode_id ) + CALL mp_bcast( mixing_ndim, ionode_id ) + CALL mp_bcast( diagonalization, ionode_id ) + CALL mp_bcast( diago_thr_init, ionode_id ) + CALL mp_bcast( diago_cg_maxiter, ionode_id ) + CALL mp_bcast( diago_david_ndim, ionode_id ) + CALL mp_bcast( diago_diis_ndim, ionode_id ) + CALL mp_bcast( sic, ionode_id ) + CALL mp_bcast( sic_epsilon , ionode_id ) + CALL mp_bcast( force_pairing , ionode_id ) ! - !***ensemble-DFT + ! ... ensemble-DFT + ! CALL mp_bcast( fermi_energy, ionode_id ) CALL mp_bcast( n_inner, ionode_id ) CALL mp_bcast( rotation_dynamics, ionode_id ) @@ -761,15 +772,18 @@ MODULE read_namelists_module CALL mp_bcast( occmass, ionode_id ) CALL mp_bcast( rotation_damping, ionode_id ) CALL mp_bcast( occupation_damping, ionode_id ) - !*** GRADIENTE CONIUGATO - CALL mp_bcast( tcg, ionode_id ) - CALL mp_bcast( maxiter, ionode_id ) - CALL mp_bcast( etresh, ionode_id ) - CALL mp_bcast( passop, ionode_id ) - - !***** CAMPO ELETTRICO - CALL mp_bcast( epol, ionode_id ) - CALL mp_bcast( efield, ionode_id ) + ! + ! ... conjugate gradient + ! + CALL mp_bcast( tcg, ionode_id ) + CALL mp_bcast( maxiter, ionode_id ) + CALL mp_bcast( etresh, ionode_id ) + CALL mp_bcast( passop, ionode_id ) + ! + ! ... electric field + ! + CALL mp_bcast( epol, ionode_id ) + CALL mp_bcast( efield, ionode_id ) ! RETURN ! @@ -791,83 +805,89 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( phase_space, ionode_id ) - CALL mp_bcast( ion_dynamics, ionode_id ) - CALL mp_bcast( ion_radius, ionode_id ) - CALL mp_bcast( ion_damping, ionode_id ) - CALL mp_bcast( ion_positions, ionode_id ) - CALL mp_bcast( ion_velocities, ionode_id ) - CALL mp_bcast( ion_temperature, ionode_id ) - CALL mp_bcast( tempw, ionode_id ) - CALL mp_bcast( fnosep, ionode_id ) - CALL mp_bcast( nhpcl, ionode_id ) - CALL mp_bcast( nhptyp, ionode_id ) - CALL mp_bcast( ndega, ionode_id ) - CALL mp_bcast( tranp, ionode_id ) - CALL mp_bcast( amprp, ionode_id ) - CALL mp_bcast( greasp, ionode_id ) - CALL mp_bcast( tolp, ionode_id ) - CALL mp_bcast( ion_nstepe, ionode_id ) - CALL mp_bcast( ion_maxstep, ionode_id ) - CALL mp_bcast( delta_t, ionode_id ) - CALL mp_bcast( nraise, ionode_id ) - CALL mp_bcast( upscale, ionode_id ) + CALL mp_bcast( phase_space, ionode_id ) + CALL mp_bcast( ion_dynamics, ionode_id ) + CALL mp_bcast( ion_radius, ionode_id ) + CALL mp_bcast( ion_damping, ionode_id ) + CALL mp_bcast( ion_positions, ionode_id ) + CALL mp_bcast( ion_velocities, ionode_id ) + CALL mp_bcast( ion_temperature, ionode_id ) + CALL mp_bcast( tempw, ionode_id ) + CALL mp_bcast( fnosep, ionode_id ) + CALL mp_bcast( nhpcl, ionode_id ) + CALL mp_bcast( nhptyp, ionode_id ) + CALL mp_bcast( ndega, ionode_id ) + CALL mp_bcast( tranp, ionode_id ) + CALL mp_bcast( amprp, ionode_id ) + CALL mp_bcast( greasp, ionode_id ) + CALL mp_bcast( tolp, ionode_id ) + CALL mp_bcast( ion_nstepe, ionode_id ) + CALL mp_bcast( ion_maxstep, ionode_id ) + CALL mp_bcast( delta_t, ionode_id ) + CALL mp_bcast( nraise, ionode_id ) + CALL mp_bcast( upscale, ionode_id ) CALL mp_bcast( pot_extrapolation, ionode_id ) CALL mp_bcast( wfc_extrapolation, ionode_id ) ! ! ... "path" variables broadcast ! - CALL mp_bcast( num_of_images, ionode_id ) - CALL mp_bcast( first_last_opt, ionode_id ) - CALL mp_bcast( use_masses, ionode_id ) + CALL mp_bcast( num_of_images, ionode_id ) + CALL mp_bcast( first_last_opt, ionode_id ) + CALL mp_bcast( use_masses, ionode_id ) CALL mp_bcast( init_num_of_images, ionode_id ) - CALL mp_bcast( use_multistep, ionode_id ) - CALL mp_bcast( use_fourier, ionode_id ) - CALL mp_bcast( use_freezing, ionode_id ) - CALL mp_bcast( fixed_tan, ionode_id ) - CALL mp_bcast( free_energy, ionode_id ) - CALL mp_bcast( write_save, ionode_id ) - CALL mp_bcast( CI_scheme, ionode_id ) - CALL mp_bcast( opt_scheme, ionode_id ) - CALL mp_bcast( damp, ionode_id ) - CALL mp_bcast( temp_req, ionode_id ) - CALL mp_bcast( ds, ionode_id ) - CALL mp_bcast( k_max, ionode_id ) - CALL mp_bcast( k_min, ionode_id ) - CALL mp_bcast( path_thr, ionode_id ) + CALL mp_bcast( use_multistep, ionode_id ) + CALL mp_bcast( use_fourier, ionode_id ) + CALL mp_bcast( use_freezing, ionode_id ) + CALL mp_bcast( fixed_tan, ionode_id ) + CALL mp_bcast( free_energy, ionode_id ) + CALL mp_bcast( write_save, ionode_id ) + CALL mp_bcast( CI_scheme, ionode_id ) + CALL mp_bcast( opt_scheme, ionode_id ) + CALL mp_bcast( damp, ionode_id ) + CALL mp_bcast( temp_req, ionode_id ) + CALL mp_bcast( ds, ionode_id ) + CALL mp_bcast( k_max, ionode_id ) + CALL mp_bcast( k_min, ionode_id ) + CALL mp_bcast( path_thr, ionode_id ) ! ! ... BFGS ! - CALL mp_bcast( bfgs_ndim, ionode_id ) + CALL mp_bcast( bfgs_ndim, ionode_id ) CALL mp_bcast( trust_radius_max, ionode_id ) CALL mp_bcast( trust_radius_min, ionode_id ) CALL mp_bcast( trust_radius_ini, ionode_id ) - CALL mp_bcast( w_1, ionode_id ) - CALL mp_bcast( w_2, ionode_id ) + CALL mp_bcast( w_1, ionode_id ) + CALL mp_bcast( w_2, ionode_id ) ! CALL mp_bcast( sic_rloc, ionode_id ) ! ! ... SMD broadcast (Y.K. 15/04/2004) ! - CALL mp_bcast( smd_polm, ionode_id ) - CALL mp_bcast( smd_kwnp, ionode_id ) - CALL mp_bcast( smd_linr, ionode_id ) - CALL mp_bcast( smd_stcd, ionode_id ) - CALL mp_bcast( smd_stcd2, ionode_id ) - CALL mp_bcast( smd_stcd2, ionode_id ) - CALL mp_bcast( smd_stcd3, ionode_id ) - CALL mp_bcast( smd_codf, ionode_id ) - CALL mp_bcast( smd_forf, ionode_id ) - CALL mp_bcast( smd_smwf, ionode_id ) - CALL mp_bcast( smd_lmfreq, ionode_id ) - CALL mp_bcast( smd_tol, ionode_id ) - CALL mp_bcast( smd_maxlm, ionode_id) - CALL mp_bcast( smd_smcp, ionode_id ) - CALL mp_bcast( smd_smopt, ionode_id ) - CALL mp_bcast( smd_smlm, ionode_id) + CALL mp_bcast( smd_polm, ionode_id ) + CALL mp_bcast( smd_kwnp, ionode_id ) + CALL mp_bcast( smd_linr, ionode_id ) + CALL mp_bcast( smd_stcd, ionode_id ) + CALL mp_bcast( smd_stcd2, ionode_id ) + CALL mp_bcast( smd_stcd2, ionode_id ) + CALL mp_bcast( smd_stcd3, ionode_id ) + CALL mp_bcast( smd_codf, ionode_id ) + CALL mp_bcast( smd_forf, ionode_id ) + CALL mp_bcast( smd_smwf, ionode_id ) + CALL mp_bcast( smd_lmfreq, ionode_id ) + CALL mp_bcast( smd_tol, ionode_id ) + CALL mp_bcast( smd_maxlm, ionode_id ) + CALL mp_bcast( smd_smcp, ionode_id ) + CALL mp_bcast( smd_smopt, ionode_id ) + CALL mp_bcast( smd_smlm, ionode_id ) CALL mp_bcast( smd_ene_ini, ionode_id ) CALL mp_bcast( smd_ene_fin, ionode_id ) - + ! + CALL mp_bcast( fe_step, ionode_id ) + CALL mp_bcast( fe_nstep, ionode_id ) + CALL mp_bcast( shake_nstep, ionode_id ) + CALL mp_bcast( g_amplitude, ionode_id ) + CALL mp_bcast( g_sigma, ionode_id ) + ! RETURN ! END SUBROUTINE @@ -888,19 +908,19 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( cell_parameters, ionode_id ) - CALL mp_bcast( cell_dynamics, ionode_id ) - CALL mp_bcast( cell_velocities, ionode_id ) - CALL mp_bcast( cell_dofree, ionode_id ) - CALL mp_bcast( press, ionode_id ) - CALL mp_bcast( wmass, ionode_id ) + CALL mp_bcast( cell_parameters, ionode_id ) + CALL mp_bcast( cell_dynamics, ionode_id ) + CALL mp_bcast( cell_velocities, ionode_id ) + CALL mp_bcast( cell_dofree, ionode_id ) + CALL mp_bcast( press, ionode_id ) + CALL mp_bcast( wmass, ionode_id ) CALL mp_bcast( cell_temperature, ionode_id ) - CALL mp_bcast( temph, ionode_id ) - CALL mp_bcast( fnoseh, ionode_id ) - CALL mp_bcast( greash, ionode_id ) - CALL mp_bcast( cell_factor, ionode_id ) - CALL mp_bcast( cell_nstepe, ionode_id ) - CALL mp_bcast( cell_damping, ionode_id ) + CALL mp_bcast( temph, ionode_id ) + CALL mp_bcast( fnoseh, ionode_id ) + CALL mp_bcast( greash, ionode_id ) + CALL mp_bcast( cell_factor, ionode_id ) + CALL mp_bcast( cell_nstepe, ionode_id ) + CALL mp_bcast( cell_damping, ionode_id ) ! RETURN ! @@ -923,7 +943,7 @@ MODULE read_namelists_module ! ! CALL mp_bcast( modenum, ionode_id ) - CALL mp_bcast( xqq, ionode_id ) + CALL mp_bcast( xqq, ionode_id ) ! RETURN ! @@ -946,7 +966,7 @@ MODULE read_namelists_module ! ! CALL mp_bcast( b_length, ionode_id ) - CALL mp_bcast( lcart, ionode_id ) + CALL mp_bcast( lcart, ionode_id ) ! RETURN ! @@ -969,29 +989,29 @@ MODULE read_namelists_module IMPLICIT NONE ! ! - CALL mp_bcast( wf_efield, ionode_id ) - CALL mp_bcast( wf_switch, ionode_id ) - CALL mp_bcast( sw_len, ionode_id ) - CALL mp_bcast( efx0, ionode_id ) - CALL mp_bcast( efy0, ionode_id ) - CALL mp_bcast( efz0, ionode_id ) - CALL mp_bcast( efx1, ionode_id ) - CALL mp_bcast( efy1, ionode_id ) - CALL mp_bcast( efz1, ionode_id ) - CALL mp_bcast( wfsd, ionode_id ) - CALL mp_bcast( wfdt, ionode_id ) - CALL mp_bcast( maxwfdt, ionode_id ) - CALL mp_bcast( wf_q, ionode_id ) + CALL mp_bcast( wf_efield, ionode_id ) + CALL mp_bcast( wf_switch, ionode_id ) + CALL mp_bcast( sw_len, ionode_id ) + CALL mp_bcast( efx0, ionode_id ) + CALL mp_bcast( efy0, ionode_id ) + CALL mp_bcast( efz0, ionode_id ) + CALL mp_bcast( efx1, ionode_id ) + CALL mp_bcast( efy1, ionode_id ) + CALL mp_bcast( efz1, ionode_id ) + CALL mp_bcast( wfsd, ionode_id ) + CALL mp_bcast( wfdt, ionode_id ) + CALL mp_bcast( maxwfdt, ionode_id ) + CALL mp_bcast( wf_q, ionode_id ) CALL mp_bcast( wf_friction, ionode_id ) - CALL mp_bcast( nit, ionode_id ) - CALL mp_bcast( nsd, ionode_id ) - CALL mp_bcast( nsteps, ionode_id ) - CALL mp_bcast( tolw, ionode_id ) - CALL mp_bcast( adapt, ionode_id ) - CALL mp_bcast( calwf, ionode_id ) - CALL mp_bcast( nwf, ionode_id ) - CALL mp_bcast( wffort, ionode_id ) - CALL mp_bcast( writev, ionode_id ) + CALL mp_bcast( nit, ionode_id ) + CALL mp_bcast( nsd, ionode_id ) + CALL mp_bcast( nsteps, ionode_id ) + CALL mp_bcast( tolw, ionode_id ) + CALL mp_bcast( adapt, ionode_id ) + CALL mp_bcast( calwf, ionode_id ) + CALL mp_bcast( nwf, ionode_id ) + CALL mp_bcast( wffort, ionode_id ) + CALL mp_bcast( writev, ionode_id ) ! RETURN ! @@ -1376,25 +1396,25 @@ MODULE read_namelists_module ! ... SMD checking ( Y.K. 15/04/2004 ) ! IF ( smd_polm .AND. smd_linr ) & - CALL infomsg ( sub_name,' smd_polm & smd_linr both true ', -1) + CALL infomsg( sub_name,' smd_polm & smd_linr both true ', -1) ! IF ( smd_polm .AND. smd_kwnp < 3 ) & - CALL infomsg ( sub_name,' smd_kwnp < 3 for smd_polm ', -1) + CALL infomsg( sub_name,' smd_kwnp < 3 for smd_polm ', -1) ! IF ( smd_stcd .AND. (smd_stcd1==0 .OR. smd_stcd2==0 .OR. smd_stcd3==0) ) & - CALL infomsg ( sub_name,' smd_stcd not specified ', -1) + CALL infomsg( sub_name,' smd_stcd not specified ', -1) ! IF( smd_smcp .AND. (smd_smopt .OR. smd_smlm) ) & - CALL infomsg ( sub_name,' SMCP ? ', -1) + CALL infomsg( sub_name,' smcp ? ', -1) ! IF( smd_smopt .AND. (smd_smcp .OR. smd_smlm) ) & - CALL infomsg ( sub_name,' SMOPT ? ', -1) + CALL infomsg( sub_name,' smopt ? ', -1) ! IF( smd_smlm .AND. (smd_smcp .OR. smd_smopt) ) & - CALL infomsg ( sub_name,' SMLM ? ', -1) + CALL infomsg( sub_name,' smlm ? ', -1) ! IF (sic /= 'none' .and. sic_rloc == 0.d0) & - CALL errore( sub_name, ' invalid sic_rloc with sic activated ', 1) + CALL errore( sub_name, ' invalid sic_rloc with sic activated ', 1 ) ! RETURN ! @@ -1649,6 +1669,9 @@ MODULE read_namelists_module ( nelup == neldw .OR. nelup == neldw+1 ) ) force_pairing = .TRUE. END IF ! + IF ( calculation == 'metadyn' .AND. & + prog == 'CP' ) g_amplitude = g_amplitude / e2 + ! RETURN ! END SUBROUTINE diff --git a/PW/compute_fes_grads.f90 b/PW/compute_fes_grads.f90 index a7a4c5eac..f4b4b886b 100644 --- a/PW/compute_fes_grads.f90 +++ b/PW/compute_fes_grads.f90 @@ -17,7 +17,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) USE basis, ONLY : startingwfc_ => startingwfc, & startingpot_ => startingpot USE coarsegrained_vars, ONLY : new_target, to_target, to_new_target, & - dfe_acc, max_shake_iter, max_fe_iter + dfe_acc, shake_nstep, fe_nstep USE path_variables, ONLY : pos, pes, grad_pes, frozen, & num_of_images, istep_path, suspended_image USE constraints_module, ONLY : lagrange, target, init_constraint, & @@ -270,7 +270,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) ! to_new_target = .TRUE. ! - DO iter = 1, max_shake_iter + DO iter = 1, shake_nstep ! istep = iter ! @@ -290,7 +290,7 @@ SUBROUTINE compute_fes_grads( N_in, N_fin, stat ) ! to_new_target = .FALSE. ! - DO iter = 1, max_fe_iter + DO iter = 1, fe_nstep ! istep = iter ! @@ -406,18 +406,12 @@ SUBROUTINE metadyn() ! USE kinds, ONLY : DP USE constraints_module, ONLY : nconstr, target - USE control_flags, ONLY : istep, ldamped - USE cell_base, ONLY : at, alat USE ener, ONLY : etot - USE io_files, ONLY : prefix, iunaxsf, tmp_dir - USE constants, ONLY : bohr_radius_angs + USE io_files, ONLY : iunaxsf, iunmeta USE coarsegrained_vars, ONLY : fe_grad, new_target, to_target, & to_new_target, fe_step, metadyn_history, & - max_metadyn_iter, A, sigma - USE coarsegrained_vars, ONLY : allocate_coarsegrained_vars, & - deallocate_coarsegrained_vars + max_metadyn_iter, starting_metadyn_iter USE coarsegrained_base, ONLY : add_gaussians - USE parser, ONLY : delete_if_present USE io_global, ONLY : ionode USE basic_algebra_routines ! @@ -426,43 +420,21 @@ SUBROUTINE metadyn() INTEGER :: iter ! ! - CALL allocate_coarsegrained_vars( nconstr, max_metadyn_iter ) + iter = starting_metadyn_iter ! - IF ( ionode ) THEN + metadyn_loop: DO ! - OPEN( UNIT = iunaxsf, FILE = TRIM( prefix ) // ".axsf", & - STATUS = "UNKNOWN", ACTION = "WRITE" ) + iter = iter + 1 ! - WRITE( UNIT = iunaxsf, FMT = '(" ANIMSTEPS ",I3)' ) max_metadyn_iter - WRITE( UNIT = iunaxsf, FMT = '(" CRYSTAL ")' ) - WRITE( UNIT = iunaxsf, FMT = '(" PRIMVEC ")' ) - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,1) * alat * bohr_radius_angs, & - at(2,1) * alat * bohr_radius_angs, & - at(3,1) * alat * bohr_radius_angs - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,2) * alat * bohr_radius_angs, & - at(2,2) * alat * bohr_radius_angs, & - at(3,2) * alat * bohr_radius_angs - WRITE( UNIT = iunaxsf, FMT = '(3F14.10)' ) & - at(1,3) * alat * bohr_radius_angs, & - at(2,3) * alat * bohr_radius_angs, & - at(3,3) * alat * bohr_radius_angs - ! - END IF - ! - CALL delete_if_present( TRIM( prefix ) // '.metadyn' ) - ! - IF ( ionode ) THEN - ! - OPEN( UNIT = 999, FILE = TRIM( prefix ) // '.metadyn', STATUS = 'NEW' ) - ! - WRITE( 999, '(2(2X,I5))' ) nconstr, max_metadyn_iter - WRITE( 999, '(2(2X,F12.8))' ) A, sigma - ! - END IF - ! - DO iter = 1, max_metadyn_iter + IF ( iter > 1 ) THEN + ! + CALL add_gaussians( iter ) + ! + new_target(:) = target(:) - fe_step * fe_grad(:) / norm( fe_grad ) + ! + CALL move_to_target() + ! + END IF ! metadyn_history(:,iter) = target(:) ! @@ -471,29 +443,23 @@ SUBROUTINE metadyn() CALL free_energy_grad( iter ) ! IF ( ionode ) & - WRITE( 999, '(I4,5(2X,F12.8))' ) iter, target(:), etot, fe_grad(:) + WRITE( iunmeta, '(I4,5(2X,F12.8))' ) iter, target(:), etot, fe_grad(:) ! - CALL add_gaussians( iter ) + IF ( ionode ) CALL flush_unit( iunmeta ) ! - new_target(:) = target(:) - fe_step * fe_grad(:) / norm( fe_grad ) + IF ( iter >= max_metadyn_iter ) EXIT metadyn_loop ! - CALL move_to_target() - ! - IF ( ionode ) CALL flush_unit( 999 ) - ! - END DO + END DO metadyn_loop ! IF ( ionode ) THEN ! CALL write_config( iter ) ! CLOSE( UNIT = iunaxsf ) - CLOSE( UNIT = 999 ) + CLOSE( UNIT = iunmeta ) ! END IF ! - CALL deallocate_coarsegrained_vars() - ! RETURN ! CONTAINS @@ -503,9 +469,12 @@ SUBROUTINE metadyn() !------------------------------------------------------------------------ ! USE constants, ONLY : e2 - USE coarsegrained_vars, ONLY : max_fe_iter, dfe_acc + USE control_flags, ONLY : istep, ldamped + USE coarsegrained_vars, ONLY : fe_nstep, dfe_acc USE constraints_module, ONLY : lagrange USE control_flags, ONLY : istep, conv_ions + USE io_files, ONLY : tmp_dir, prefix + USE parser, ONLY : delete_if_present ! IMPLICIT NONE ! @@ -523,13 +492,13 @@ SUBROUTINE metadyn() ! to_new_target = .FALSE. ! - DO i = 1, max_fe_iter + DO i = 1, fe_nstep ! istep = istep + 1 ! CALL electronic_scf( lfirst, stat ) ! - IF ( .NOT. stat ) RETURN + IF ( .NOT. stat ) CALL stop_run( stat ) ! CALL move_ions() ! @@ -561,7 +530,10 @@ SUBROUTINE metadyn() SUBROUTINE move_to_target() !------------------------------------------------------------------------ ! - USE coarsegrained_vars, ONLY : max_shake_iter + USE coarsegrained_vars, ONLY : shake_nstep + USE control_flags, ONLY : istep + USE io_files, ONLY : tmp_dir, prefix + USE parser, ONLY : delete_if_present ! INTEGER :: i LOGICAL :: stat @@ -573,13 +545,13 @@ SUBROUTINE metadyn() ! to_new_target = .TRUE. ! - DO i = 1, max_shake_iter + DO i = 1, shake_nstep ! istep = i ! CALL electronic_scf( .FALSE., stat ) ! - IF ( .NOT. stat ) RETURN + IF ( .NOT. stat ) CALL stop_run( stat ) ! CALL move_ions() ! @@ -648,8 +620,6 @@ SUBROUTINE electronic_scf( lfirst, stat ) WRITE( UNIT = iunpath, & FMT = '(/,5X,"WARNING : scf convergence NOT achieved",/)' ) ! - RETURN - ! END IF ! CALL forces() diff --git a/PW/input.f90 b/PW/input.f90 index 120ad40b3..f7197b4fb 100644 --- a/PW/input.f90 +++ b/PW/input.f90 @@ -21,7 +21,8 @@ SUBROUTINE iosys() ! ... independent input parser ! ! - USE constants, ONLY : AU, eV_to_kelvin + USE kinds, ONLY : DP + USE constants, ONLY : au, eV_to_kelvin USE mp_global, ONLY : npool, nproc_pool ! USE io_global, ONLY : stdout, ionode @@ -181,6 +182,12 @@ SUBROUTINE iosys() w_1_ => w_1, & w_2_ => w_2 ! + USE coarsegrained_vars, ONLY : fe_nstep_ => fe_nstep, & + shake_nstep_ => shake_nstep, & + fe_step_ => fe_step, & + g_amplitude_ => g_amplitude, & + g_sigma_ => g_sigma + ! USE check_stop, ONLY : check_stop_init ! ! CONTROL namelist @@ -230,9 +237,10 @@ SUBROUTINE iosys() use_masses, use_multistep, first_last_opt, & damp, init_num_of_images, temp_req, k_max, & k_min, ds, use_fourier, use_freezing, & - fixed_tan, free_energy, write_save, & + fixed_tan, free_energy, write_save, w_1, w_2, & trust_radius_max, trust_radius_min, bfgs_ndim, & - trust_radius_ini, w_1, w_2 + trust_radius_ini, g_amplitude, g_sigma, fe_step,& + fe_nstep, shake_nstep ! ! CELL namelist ! @@ -253,16 +261,13 @@ SUBROUTINE iosys() ! USE read_namelists_module, ONLY : read_namelists, sm_not_set ! - USE kinds, ONLY : DP - ! IMPLICIT NONE ! ! ... local variables ! - INTEGER :: unit = 5, & - i, ia, ios, is, image, nt - LOGICAL :: ltest - REAL(DP) :: theta, phi + INTEGER :: unit = 5, i, ia, ios, is, image, nt + LOGICAL :: ltest + REAL(DP) :: theta, phi ! ! CALL getenv( 'HOME', pseudo_dir ) @@ -1153,15 +1158,16 @@ SUBROUTINE iosys() report_ = report lambda_ = lambda ! - Hubbard_U_( 1 : ntyp ) = hubbard_u( 1 : ntyp ) - Hubbard_alpha_( 1 : ntyp ) = hubbard_alpha( 1 : ntyp ) - lda_plus_u_ = lda_plus_u - nspin_ = nspin - starting_magnetization_ = starting_magnetization - starting_ns = starting_ns_eigenvalue - U_projection = U_projection_type - nosym_ = nosym - nbnd_ = nbnd + Hubbard_U_(1:ntyp) = hubbard_u(1:ntyp) + Hubbard_alpha_(1:ntyp) = hubbard_alpha(1:ntyp) + lda_plus_u_ = lda_plus_u + nspin_ = nspin + starting_magnetization_ = starting_magnetization + starting_ns = starting_ns_eigenvalue + U_projection = U_projection_type + nosym_ = nosym + nbnd_ = nbnd + ! #if defined (EXX) ! lexx_ = lexx @@ -1169,6 +1175,7 @@ SUBROUTINE iosys() nqx2_ = nqx2 nqx3_ = nqx3 yukawa_ = yukawa + ! #endif ! startingwfc_ = startingwfc @@ -1221,6 +1228,14 @@ SUBROUTINE iosys() w_1_ = w_1 w_2_ = w_2 ! + ! ... meta-dynamics + ! + fe_nstep_ = fe_nstep + shake_nstep_ = shake_nstep + fe_step_ = fe_step + g_amplitude_ = g_amplitude + g_sigma_ = g_sigma + ! ! ... read following cards ! ALLOCATE( ityp( nat_ ) ) diff --git a/PW/pwscf.f90 b/PW/pwscf.f90 index 0524a9b92..08b7a202c 100644 --- a/PW/pwscf.f90 +++ b/PW/pwscf.f90 @@ -11,18 +11,19 @@ PROGRAM pwscf ! ! ... Plane Wave Self-Consistent Field code ! - USE io_global, ONLY : stdout - USE parameters, ONLY : ntypx, npk, lmaxx, nchix, ndmx, nqfx, nbrx - USE global_version, ONLY : version_number - USE wvfct, ONLY : gamma_only - USE noncollin_module, ONLY : noncolin - USE control_flags, ONLY : nstep, istep, conv_elec, conv_ions, & - lpath, lmetadyn - USE io_files, ONLY : nd_nmbr, iunpath, tmp_dir - USE path_variables, ONLY : conv_path - USE path_base, ONLY : initialize_path, search_mep - USE path_io_routines, ONLY : io_path_start, io_path_stop - USE io_global, ONLY : ionode + USE io_global, ONLY : stdout + USE parameters, ONLY : ntypx, npk, lmaxx, nchix, ndmx, nqfx, nbrx + USE global_version, ONLY : version_number + USE wvfct, ONLY : gamma_only + USE noncollin_module, ONLY : noncolin + USE control_flags, ONLY : nstep, istep, conv_elec, conv_ions, & + lpath, lmetadyn + USE io_files, ONLY : nd_nmbr, iunpath, tmp_dir + USE path_variables, ONLY : conv_path + USE path_base, ONLY : initialize_path, search_mep + USE coarsegrained_base, ONLY : metadyn_init + USE path_io_routines, ONLY : io_path_start, io_path_stop + USE io_global, ONLY : ionode ! IMPLICIT NONE ! @@ -89,6 +90,8 @@ PROGRAM pwscf ! ! ... meta-dynamics ! + CALL metadyn_init() + ! CALL metadyn() ! ELSE @@ -117,12 +120,12 @@ PROGRAM pwscf ! END DO main_loop ! - CALL punch() - ! - CALL stop_run( conv_ions ) - ! END IF ! + CALL punch() + ! + CALL stop_run( conv_ions ) + ! END IF ! STOP diff --git a/PW/stop_run.f90 b/PW/stop_run.f90 index d206100c9..f1a23bd4a 100644 --- a/PW/stop_run.f90 +++ b/PW/stop_run.f90 @@ -15,12 +15,14 @@ SUBROUTINE stop_run( flag ) ! ... or during execution with flag = .FALSE. (does not remove 'restart') ! USE io_global, ONLY : stdout, ionode - USE control_flags, ONLY : lpath, lneb, lsmd, twfcollect, lconstrain + USE control_flags, ONLY : lpath, lneb, lsmd, twfcollect, lconstrain, & + lcoarsegrained USE io_files, ONLY : prefix, iunwfc, iunigk, iunres, iunefield USE input_parameters, ONLY : deallocate_input_parameters USE path_variables, ONLY : path_deallocation USE path_io_routines, ONLY : io_path_stop USE constraints_module, ONLY : deallocate_constraint + USE coarsegrained_vars, ONLY : deallocate_coarsegrained_vars USE mp, ONLY : mp_barrier, mp_end USE bp, ONLY : lelfield ! @@ -59,22 +61,22 @@ SUBROUTINE stop_run( flag ) CALL seqopn( 4, 'md', 'FORMATTED', exst ) CLOSE( UNIT = 4, STATUS = 'DELETE' ) ! - !CALL seqopn( 4, 'para', 'FORMATTED', exst ) - !CLOSE( UNIT = 4, STATUS = 'DELETE' ) + CALL seqopn( 4, 'para', 'FORMATTED', exst ) + CLOSE( UNIT = 4, STATUS = 'DELETE' ) ! CALL seqopn( 4, 'BLOCK', 'FORMATTED', exst ) CLOSE( UNIT = 4, STATUS = 'DELETE' ) ! END IF - ! close unit for electric field if needed - IF( lelfield) CLOSE( UNIT = iunefield, STATUS = 'KEEP' ) - + ! + ! ... close unit for electric field if needed + ! + IF ( lelfield ) CLOSE( UNIT = iunefield, STATUS = 'KEEP' ) ! ! ... iunigk is kept open during the execution - close and remove ! CLOSE( UNIT = iunigk, STATUS = 'DELETE' ) ! - CALL print_clock_pw() ! CALL mp_barrier() @@ -94,6 +96,8 @@ SUBROUTINE stop_run( flag ) ! IF ( lconstrain ) CALL deallocate_constraint() ! + IF ( lcoarsegrained ) CALL deallocate_coarsegrained_vars() + ! IF ( lneb ) THEN ! CALL path_deallocation( 'neb' )