- Few additions to implement the possibility to add external forces to ions

git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@5062 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
cavazzon 2008-07-22 16:48:11 +00:00
parent 2a83455012
commit e3061676f1
4 changed files with 100 additions and 5 deletions

View File

@ -302,7 +302,10 @@ MODULE control_flags
! in CP controls the printing of wave function projections
! on atomic states
LOGICAL, PUBLIC :: tqr=.FALSE. ! if true the Q are in real space
!
! ... Esternal Forces on Ions
!
LOGICAL, PUBLIC :: textfor = .FALSE.
!
! ... end of module-scope declarations

View File

@ -40,6 +40,7 @@
REAL(DP) :: ENTROPY ! Ensamble DFT
REAL(DP) :: EGRAND ! Ensamble DFT
REAL(DP) :: VAVE ! Ensamble DFT
REAL(DP) :: EEXTFOR ! Energy of the external forces
END TYPE
REAL(DP) :: EHTE = 0.0_DP
@ -64,6 +65,7 @@
REAL(DP) :: ENTROPY = 0.0_DP
REAL(DP) :: EGRAND = 0.0_DP
REAL(DP) :: VAVE = 0.0_DP ! average potential
REAL(DP) :: EEXTFOR = 0.0_DP ! Energy of the external forces
REAL(DP) :: enthal = 0.0_DP, ekincm
@ -75,6 +77,8 @@
PUBLIC :: atot, entropy, egrand, enthal, vave
PUBLIC :: eextfor
CONTAINS
! ---------------------------------------------------------------------------- !
@ -130,11 +134,12 @@
! ---------------------------------------------------------------------------- !
SUBROUTINE print_energies( tsic, iprsta, edft, sic_alpha, sic_epsilon )
SUBROUTINE print_energies( tsic, iprsta, edft, sic_alpha, sic_epsilon, textfor )
LOGICAL, INTENT(IN) :: tsic
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
INTEGER, OPTIONAL, INTENT(IN) :: iprsta
REAL(DP), OPTIONAL, INTENT(IN) :: sic_alpha, sic_epsilon
LOGICAL, OPTIONAL, INTENT(IN) :: textfor
IF( PRESENT ( edft ) ) THEN
WRITE( stdout, * )
@ -178,6 +183,10 @@
WRITE( stdout, 15 ) self_exc, sic_alpha
END IF
!
IF( PRESENT( textfor ) ) THEN
IF( textfor ) WRITE( stdout, 16 ) eextfor
END IF
!
1 FORMAT(6X,' total energy = ',F18.10,' Hartree a.u.')
2 FORMAT(6X,' kinetic energy = ',F18.10,' Hartree a.u.')
3 FORMAT(6X,' electrostatic energy = ',F18.10,' Hartree a.u.')
@ -193,6 +202,7 @@
13 FORMAT(6X,' emass kinetic energy = ',F18.10,' Hartree a.u.')
14 FORMAT(6X,' hartree sic_ehte = ',F18.10,' Hartree a.u.', 1X, 'corr. factor = ',F6.3)
15 FORMAT(6X,' sic exchange-correla energy = ',F18.10,' Hartree a.u.', 1X, 'corr. factor = ',F6.3)
16 FORMAT(6X,' external force energy = ',F18.10,' Hartree a.u.')
100 format(//' total energy = ',f14.5,' Hartree a.u.'/ &
& ' kinetic energy = ',f14.5,' Hartree a.u.'/ &

View File

@ -1446,15 +1446,16 @@ MODULE input_parameters
!
REAL(DP), ALLOCATABLE :: pos(:,:)
!
! ... workaround for IBM xlf bug, compiler can't manage large
! array initialization
!
! ION_VELOCITIES
!
REAL(DP), ALLOCATABLE :: rd_vel(:,:) ! unsorted velocities from input
INTEGER, ALLOCATABLE :: sp_vel(:)
LOGICAL :: tavel = .FALSE.
!
! ATOMIC_FORCES
!
REAL(DP), ALLOCATABLE :: rd_for(:,:) ! external forces applied to single atoms
!
! KPOINTS
@ -1601,6 +1602,7 @@ CONTAINS
IF ( ALLOCATED( na_inp ) ) DEALLOCATE( na_inp )
IF ( ALLOCATED( rd_vel ) ) DEALLOCATE( rd_vel )
IF ( ALLOCATED( sp_vel ) ) DEALLOCATE( sp_vel )
IF ( ALLOCATED( rd_for ) ) DEALLOCATE( rd_for )
!
ALLOCATE( rd_pos( 3, nat ) )
ALLOCATE( sp_pos( nat) )
@ -1609,6 +1611,7 @@ CONTAINS
ALLOCATE( na_inp( ntyp) )
ALLOCATE( rd_vel( 3, nat ) )
ALLOCATE( sp_vel( nat) )
ALLOCATE( rd_for( 3, nat ) )
!
rd_pos = 0.0_DP
sp_pos = 0
@ -1617,6 +1620,7 @@ CONTAINS
na_inp = 0
rd_vel = 0.0_DP
sp_vel = 0
rd_for = 0.0_DP
!
RETURN
!
@ -1703,6 +1707,7 @@ CONTAINS
IF ( ALLOCATED( na_inp ) ) DEALLOCATE( na_inp )
IF ( ALLOCATED( rd_vel ) ) DEALLOCATE( rd_vel )
IF ( ALLOCATED( sp_vel ) ) DEALLOCATE( sp_vel )
IF ( ALLOCATED( rd_for ) ) DEALLOCATE( rd_for )
!
IF ( ALLOCATED( pos ) ) DEALLOCATE( pos )
IF ( ALLOCATED( climbing ) ) DEALLOCATE( climbing )

View File

@ -184,6 +184,10 @@ MODULE read_cards_module
!
CALL card_atomic_positions( input_line, prog )
!
ELSE IF ( TRIM(card) == 'ATOMIC_FORCES' ) THEN
!
CALL card_atomic_forces( input_line, prog )
!
ELSE IF ( TRIM(card) == 'SETNFI' ) THEN
!
CALL card_setnfi( input_line )
@ -726,6 +730,79 @@ MODULE read_cards_module
! BEGIN manual
!----------------------------------------------------------------------
!
! ATOMIC_FORCES
!
! read external forces (in atomic units) from standard input
!
! Syntax:
!
! ATOMIC_FORCES
! label Fx(1) Fy(1) Fz(1)
! .....
! label Fx(n) Fy(n) Fz(n)
!
! Example:
!
! ???
!
! Where:
!
! label (character(len=4)) atomic label
! Fx(:), Fy(:) and Fz(:) (REAL) x, y and z component of the external force
! acting on the ions whose coordinate are given
! in the same line in card ATOMIC_POSITION
!
!----------------------------------------------------------------------
! END manual
!------------------------------------------------------------------------
!
SUBROUTINE card_atomic_forces( input_line, prog )
!
IMPLICIT NONE
!
CHARACTER(LEN=256) :: input_line
CHARACTER(LEN=2) :: prog
INTEGER :: ia, k, nfield
LOGICAL, SAVE :: tread = .FALSE.
CHARACTER(LEN=4) :: lb
!
!
IF( tread ) THEN
CALL errore( ' card_atomic_forces ', ' two occurrence ', 2 )
END IF
!
IF( .NOT. taspc ) THEN
CALL errore( ' card_atomic_forces ', &
& ' ATOMIC_SPECIES must be present before ', 2 )
END IF
!
rd_for = 0.0_DP
!
DO ia = 1, nat
!
CALL read_line( input_line )
CALL field_count( nfield, input_line )
IF ( nfield == 4 ) THEN
READ(input_line,*) lb, ( rd_for(k,ia), k = 1, 3 )
ELSE IF( nfield == 3 ) THEN
READ(input_line,*) ( rd_for(k,ia), k = 1, 3 )
ELSE
CALL errore( ' iosys ', ' wrong entries in ATOMIC_FORCES ', ia )
END IF
!
END DO
!
tread = .TRUE.
!
RETURN
!
END SUBROUTINE card_atomic_forces
!
!
!------------------------------------------------------------------------
! BEGIN manual
!----------------------------------------------------------------------
!
! K_POINTS
!
! use the specified set of k points