Some "cosmetic" modifications to string method dynamics.

C.S.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@1209 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
sbraccia 2004-09-02 13:19:46 +00:00
parent 4f42fdc639
commit 5c7e567708
2 changed files with 134 additions and 28 deletions

View File

@ -150,7 +150,7 @@ MODULE path_base
! !
! ... mode dependent time step ! ... mode dependent time step
! !
FORALL( mode = 1 : ( Nft - 1 ) ) FORALL( mode = 1 : num_of_modes )
! !
ds_(mode) = ds ds_(mode) = ds
! !
@ -586,7 +586,7 @@ MODULE path_base
SUBROUTINE compute_fourier_sin_and_cos() SUBROUTINE compute_fourier_sin_and_cos()
!------------------------------------------------------------------------ !------------------------------------------------------------------------
! !
USE path_variables, ONLY : Nft, ft_sin, ft_cos USE path_variables, ONLY : Nft, num_of_modes, ft_sin, ft_cos
! !
IMPLICIT NONE IMPLICIT NONE
! !
@ -598,7 +598,7 @@ MODULE path_base
! !
DO j = 0, Nft DO j = 0, Nft
! !
DO n = 1, ( Nft - 1 ) DO n = 1, num_of_modes
! !
x = pi_over_Nft * REAL( n * j ) x = pi_over_Nft * REAL( n * j )
! !
@ -618,7 +618,7 @@ MODULE path_base
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
! !
USE path_variables, ONLY : dim, path_length, pos, ft_pos, & USE path_variables, ONLY : dim, path_length, pos, ft_pos, &
num_of_images, num_of_modes, Nft_smooth num_of_images, num_of_modes, Nft, Nft_smooth
USE basic_algebra_routines USE basic_algebra_routines
! !
IMPLICIT NONE IMPLICIT NONE
@ -638,12 +638,11 @@ MODULE path_base
! !
r_h(:) = pos(:,1) r_h(:) = pos(:,1)
! !
DO i = 1, ( num_of_images - 1 ) DO i = 1, Nft
! !
DO j = 0, ( Nft_smooth - 1 ) DO j = 0, ( Nft_smooth - 1 )
! !
x = REAL( Nft_smooth * ( i - 1 ) + j ) / & x = REAL( Nft_smooth * ( i - 1 ) + j ) / REAL( Nft_smooth * Nft )
REAL( Nft_smooth * ( num_of_images - 1 ) )
! !
r_n(:) = pos(:,1) + x * delta_pos(:) r_n(:) = pos(:,1) + x * delta_pos(:)
! !
@ -678,13 +677,13 @@ MODULE path_base
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
! !
USE path_variables, ONLY : num_of_images, num_of_modes, path_length, & USE path_variables, ONLY : num_of_images, num_of_modes, path_length, &
dim, pos, ft_pos, pos_star, Nft_smooth dim, pos, ft_pos, pos_star, Nft, Nft_smooth
USE basic_algebra_routines USE basic_algebra_routines
! !
IMPLICIT NONE IMPLICIT NONE
! !
INTEGER :: i, j, n, image INTEGER :: i, j, n, image
REAL (KIND=DP) :: x, ds REAL (KIND=DP) :: x, arc_length, scale
REAL (KIND=DP), ALLOCATABLE :: r_h(:), r_n(:), delta_pos(:) REAL (KIND=DP), ALLOCATABLE :: r_h(:), r_n(:), delta_pos(:)
! !
! !
@ -696,16 +695,17 @@ MODULE path_base
! !
delta_pos(:) = ( pos(:,num_of_images) - pos(:,1) ) delta_pos(:) = ( pos(:,num_of_images) - pos(:,1) )
! !
ds = 0.D0 arc_length = 0.D0
!
scale = path_length / REAL( Nft )
! !
r_h(:) = pos(:,1) r_h(:) = pos(:,1)
! !
DO i = 1, ( num_of_images - 1 ) DO i = 1, Nft
! !
DO j = 0, ( Nft_smooth - 1 ) DO j = 0, ( Nft_smooth - 1 )
! !
x = REAL( Nft_smooth * ( i - 1 ) + j ) / & x = REAL( Nft_smooth * ( i - 1 ) + j ) / REAL( Nft_smooth * Nft )
REAL( Nft_smooth * ( num_of_images - 1 ) )
! !
r_n(:) = pos(:,1) + x * delta_pos(:) r_n(:) = pos(:,1) + x * delta_pos(:)
! !
@ -715,9 +715,9 @@ MODULE path_base
! !
END DO END DO
! !
ds = ds + norm( r_n - r_h ) arc_length = arc_length + norm( r_n - r_h )
! !
IF ( ds > image * path_length / ( num_of_images - 1 ) ) THEN IF ( arc_length > REAL( image ) * scale ) THEN
! !
image = image + 1 image = image + 1
! !
@ -1067,6 +1067,87 @@ MODULE path_base
! !
END FUNCTION path_tangent END FUNCTION path_tangent
! !
!-----------------------------------------------------------------------
SUBROUTINE find_saddle()
!-----------------------------------------------------------------------
!
! ... the transition state configuration and the forward activation
! ... energy are computed here
!
USE control_flags, ONLY : lneb, lsmd
USE path_variables, ONLY : dim, num_of_images, num_of_modes, Nft, &
Nft_smooth, pes, ft_pes, pos, ft_pos, &
activation_energy, Emax_index
USE path_io_routines, ONLY : write_ts_config
!
IMPLICIT NONE
!
INTEGER :: i, j, n
REAL (KIND=DP) :: E, delta_E, x, x_ts
REAL (KIND=DP), ALLOCATABLE :: pos_ts(:)
!
!
IF ( lneb ) THEN
!
activation_energy = ( pes(Emax_index) - pes(1) ) * au
!
ELSE IF ( lsmd ) THEN
!
ALLOCATE( pos_ts( dim ) )
!
delta_E = pes(num_of_images) - pes(1)
!
activation_energy = 0.D0
!
x_ts = 0.D0
!
DO i = 1, Nft
!
DO j = 0, ( Nft_smooth - 1 )
!
x = REAL( Nft_smooth * ( i - 1 ) + j ) / REAL( Nft_smooth * Nft )
!
E = x * delta_E
!
DO n = 1, num_of_modes
!
E = E + ft_pes(n) * SIN( REAL( n ) * pi * x )
!
END DO
!
E = E * au
!
IF ( E > activation_energy ) THEN
!
activation_energy = E
!
x_ts = x
!
END IF
!
END DO
!
END DO
!
pos_ts(:) = pos(:,1) + &
x_ts * ( pos(:,num_of_images) - pos(:,1) )
!
DO n = 1, num_of_modes
!
pos_ts(:) = pos_ts(:) + ft_pos(:,n) * SIN( REAL( n ) * pi * x_ts )
!
END DO
!
CALL write_ts_config( pos_ts )
!
DEALLOCATE( pos_ts )
!
END IF
!
RETURN
!
END SUBROUTINE find_saddle
!
!------------------------------------------------------------------------ !------------------------------------------------------------------------
SUBROUTINE born_oppenheimer_pes( stat ) SUBROUTINE born_oppenheimer_pes( stat )
!------------------------------------------------------------------------ !------------------------------------------------------------------------
@ -1233,6 +1314,11 @@ MODULE path_base
! !
END IF END IF
! !
! ... the transition state configuration and the forward activation
! ... energy are computed here
!
CALL find_saddle()
!
! ... the error is computed here ! ... the error is computed here
! !
CALL compute_error( err_max ) CALL compute_error( err_max )
@ -1246,8 +1332,7 @@ MODULE path_base
! !
END IF END IF
! !
! ... information is written on the files ( activation energy is ! ... information is written on the files
! ... computed in this routine )
! !
CALL write_dat_files() CALL write_dat_files()
! !

View File

@ -23,7 +23,8 @@ MODULE path_io_routines
PRIVATE PRIVATE
! !
PUBLIC :: io_path_start, io_path_stop PUBLIC :: io_path_start, io_path_stop
PUBLIC :: read_restart, write_restart, write_dat_files, write_output PUBLIC :: read_restart
PUBLIC :: write_restart, write_dat_files, write_output, write_ts_config
! !
CONTAINS CONTAINS
! !
@ -735,7 +736,7 @@ MODULE path_io_routines
USE path_variables, ONLY : pos, grad_pes, pes, num_of_images, & USE path_variables, ONLY : pos, grad_pes, pes, num_of_images, &
activation_energy, path_length, react_coord activation_energy, path_length, react_coord
USE path_variables, ONLY : tangent, dim, Emax_index, error USE path_variables, ONLY : tangent, dim, Emax_index, error
USE path_variables, ONLY : Nft, Nft_smooth, ft_pes USE path_variables, ONLY : num_of_modes, Nft, Nft_smooth, ft_pes
USE io_files, ONLY : iundat, iunint, iunxyz, iunaxsf, & USE io_files, ONLY : iundat, iunint, iunxyz, iunaxsf, &
dat_file, int_file, xyz_file, axsf_file dat_file, int_file, xyz_file, axsf_file
USE io_global, ONLY : meta_ionode USE io_global, ONLY : meta_ionode
@ -776,10 +777,6 @@ MODULE path_io_routines
ALLOCATE( d( num_of_images - 1 ) ) ALLOCATE( d( num_of_images - 1 ) )
ALLOCATE( F( num_of_images ) ) ALLOCATE( F( num_of_images ) )
! !
! ... the forward activation energy is computed here
!
activation_energy = ( pes(Emax_index) - pes(1) ) * au
!
F = 0.D0 F = 0.D0
! !
DO image = 2, ( num_of_images - 1 ) DO image = 2, ( num_of_images - 1 )
@ -861,10 +858,6 @@ MODULE path_io_routines
! !
END DO END DO
! !
! ... the forward activation energy is computed here
!
activation_energy = 0.D0
!
delta_E = pes(num_of_images) - pes(1) delta_E = pes(num_of_images) - pes(1)
! !
DO i = 1, ( num_of_images - 1 ) DO i = 1, ( num_of_images - 1 )
@ -876,7 +869,7 @@ MODULE path_io_routines
! !
E = x * delta_E E = x * delta_E
! !
DO n = 1, ( Nft - 1 ) DO n = 1, num_of_modes
! !
E = E + ft_pes(n) * SIN( REAL( n ) * pi * x ) E = E + ft_pes(n) * SIN( REAL( n ) * pi * x )
! !
@ -1049,4 +1042,32 @@ MODULE path_io_routines
! !
END SUBROUTINE write_output END SUBROUTINE write_output
! !
!-----------------------------------------------------------------------
SUBROUTINE write_ts_config( pos_ts )
!-----------------------------------------------------------------------
!
USE io_files, ONLY : iunpath
USE path_variables, ONLY : dim
USE ions_base, ONLY : nat, ityp, atm
!
IMPLICIT NONE
!
REAL (KIND=DP), INTENT(IN) :: pos_ts(3,nat)
!
INTEGER :: na
!
!
WRITE( iunpath, '(/,5X,"transition-state coordinates (bohr)",/)' )
!
DO na = 1, nat
!
WRITE( iunpath,'(A3,3X,3F14.9)') &
atm(ityp(na)), pos_ts(:,na)
!
END DO
!
RETURN
!
END SUBROUTINE write_ts_config
!
END MODULE path_io_routines END MODULE path_io_routines