mirror of https://gitlab.com/QEF/q-e.git
- 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:
parent
2a83455012
commit
e3061676f1
|
@ -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
|
||||
|
|
|
@ -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.'/ &
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue