1!
2! Copyright (C) 2001-2011 Quantum ESPRESSO group
3! This file is distributed under the terms of the
4! GNU General Public License. See the file `License'
5! in the root directory of the present distribution,
6! or http://www.gnu.org/copyleft/gpl.txt .
7!
8!----------------------------------------------------------------------------
9! TB
10! included gate related forces
11!----------------------------------------------------------------------------
12!
13!----------------------------------------------------------------------------
14SUBROUTINE forces()
15  !----------------------------------------------------------------------------
16  !! This routine is a driver routine which computes the forces
17  !! acting on the atoms. The complete expression of the forces
18  !! contains four parts which are computed by different routines:
19  !
20  !! a) force_lc: local contribution to the forces;
21  !! b) force_cc: contribution due to NLCC;
22  !! c) force_ew: contribution due to the electrostatic ewald term;
23  !! d) force_us: contribution due to the non-local potential;
24  !! e) force_corr: correction term for incomplete self-consistency;
25  !! f) force_hub: contribution due to the Hubbard term;
26  !! g) force_london: semi-empirical correction for dispersion forces;
27  !! h) force_d3: Grimme-D3 (DFT-D3) correction to dispersion forces.
28  !
29  USE kinds,             ONLY : DP
30  USE io_global,         ONLY : stdout
31  USE cell_base,         ONLY : at, bg, alat, omega
32  USE ions_base,         ONLY : nat, ntyp => nsp, ityp, tau, zv, amass, extfor, atm
33  USE fft_base,          ONLY : dfftp
34  USE gvect,             ONLY : ngm, gstart, ngl, igtongl, g, gg, gcutm
35  USE lsda_mod,          ONLY : nspin
36  USE symme,             ONLY : symvector
37  USE vlocal,            ONLY : strf, vloc
38  USE force_mod,         ONLY : force, lforce, sumfor
39  USE scf,               ONLY : rho
40  USE ions_base,         ONLY : if_pos
41  USE ldaU,              ONLY : lda_plus_u, U_projection
42  USE extfield,          ONLY : tefield, forcefield, gate, forcegate, relaxz
43  USE control_flags,     ONLY : gamma_only, remove_rigid_rot, textfor,  &
44                                iverbosity, llondon, ldftd3, lxdm, ts_vdw
45  USE plugin_flags
46  USE bp,                ONLY : lelfield, gdir, l3dstring, efield_cart, &
47                                efield_cry,efield
48  USE uspp,              ONLY : okvan
49  USE martyna_tuckerman, ONLY : do_comp_mt, wg_corr_force
50  USE london_module,     ONLY : force_london
51  USE dftd3_api,         ONLY : get_atomic_number, dftd3_calc
52  USE dftd3_qe,          ONLY : dftd3_pbc_gdisp, dftd3
53
54  USE xdm_module,        ONLY : force_xdm
55  USE tsvdw_module,      ONLY : FtsvdW
56  USE esm,               ONLY : do_comp_esm, esm_bc, esm_force_ew
57  USE qmmm,              ONLY : qmmm_mode
58  !
59  IMPLICIT NONE
60  !
61  REAL(DP), ALLOCATABLE :: forcenl(:,:),         &
62                           forcelc(:,:),         &
63                           forcecc(:,:),         &
64                           forceion(:,:),        &
65                           force_disp(:,:),      &
66                           force_d3(:,:),        &
67                           force_disp_xdm(:,:),  &
68                           force_mt(:,:),        &
69                           forcescc(:,:),        &
70                           forces_bp_efield(:,:),&
71                           forceh(:,:)
72  ! nonlocal, local, core-correction, ewald, scf correction terms, and hubbard
73  !
74  ! aux is used to store a possible additional density
75  ! now defined in real space
76  !
77  COMPLEX(DP), ALLOCATABLE :: auxg(:), auxr(:)
78  !
79  REAL(DP) :: sumscf, sum_mm
80  REAL(DP), PARAMETER :: eps = 1.e-12_dp
81  INTEGER  :: ipol, na
82  ! counter on polarization
83  ! counter on atoms
84  !
85  REAL(DP) :: latvecs(3,3)
86  INTEGER :: atnum(1:nat)
87  REAL(DP) :: stress_dftd3(3,3)
88  !
89  !
90  CALL start_clock( 'forces' )
91  !
92  ALLOCATE( forcenl(3,nat), forcelc(3,nat), forcecc(3,nat), &
93            forceh(3,nat), forceion(3,nat), forcescc(3,nat) )
94  !
95  forcescc(:,:) = 0.D0
96  forceh(:,:)   = 0.D0
97  force(:,:)    = 0.D0
98  !
99  ! ... The nonlocal contribution is computed here
100  !
101  CALL force_us( forcenl )
102  !
103  ! ... The local contribution
104  !
105  CALL force_lc( nat, tau, ityp, alat, omega, ngm, ngl, igtongl,       &
106                 g, rho%of_r(:,1), dfftp%nl, gstart, gamma_only, vloc, &
107                 forcelc )
108  !
109  ! ... The NLCC contribution
110  !
111  CALL force_cc( forcecc )
112  !
113  ! ... The Hubbard contribution
114  !     (included by force_us if using beta as local projectors)
115  !
116  IF ( lda_plus_u .AND. U_projection.NE.'pseudo' ) CALL force_hub( forceh )
117  !
118  ! ... The ionic contribution is computed here
119  !
120  IF( do_comp_esm ) THEN
121     CALL esm_force_ew( forceion )
122  ELSE
123     CALL force_ew( alat, nat, ntyp, ityp, zv, at, bg, tau, omega, g, &
124                    gg, ngm, gstart, gamma_only, gcutm, strf, forceion )
125  ENDIF
126  !
127  ! ... the semi-empirical dispersion correction
128  !
129  IF ( llondon ) THEN
130    !
131    ALLOCATE( force_disp(3,nat) )
132    force_disp(:,:) = 0.0_DP
133    force_disp = force_london( alat , nat , ityp , at , bg , tau )
134    !
135  ENDIF
136  !
137  ! ... The Grimme-D3 dispersion correction
138  !
139  IF ( ldftd3 ) THEN
140    !
141    ALLOCATE( force_d3(3, nat) )
142    force_d3(:,:) = 0.0_DP
143    latvecs(:,:) = at(:,:)*alat
144    tau(:,:) = tau(:,:)*alat
145    atnum(:) = get_atomic_number(atm(ityp(:)))
146    CALL dftd3_pbc_gdisp( dftd3, tau, atnum, latvecs, &
147                          force_d3, stress_dftd3 )
148    force_d3 = -2.d0*force_d3
149    tau(:,:) = tau(:,:)/alat
150  ENDIF
151  !
152  !
153  IF (lxdm) THEN
154     ALLOCATE( force_disp_xdm(3,nat) )
155     force_disp_xdm = 0._dp
156     force_disp_xdm = force_xdm(nat)
157  ENDIF
158  !
159  ! ... The SCF contribution
160  !
161  CALL force_corr( forcescc )
162  !
163  IF (do_comp_mt) THEN
164    !
165    ALLOCATE( force_mt(3,nat) )
166    CALL wg_corr_force( .TRUE., omega, nat, ntyp, ityp, ngm, g, tau, zv, strf, &
167                        rho%of_g(:,1), force_mt )
168  ENDIF
169  !
170  ! ... call void routine for user define/ plugin patches on internal forces
171  !
172  CALL plugin_int_forces()
173  !
174  ! ... Berry's phase electric field terms
175  !
176  IF (lelfield) THEN
177     ALLOCATE( forces_bp_efield(3,nat) )
178     forces_bp_efield(:,:) = 0.d0
179     IF (.NOT.l3dstring) THEN
180        IF (okvan) CALL forces_us_efield( forces_bp_efield, gdir, efield )
181        CALL forces_ion_efield( forces_bp_efield, gdir, efield )
182     ELSE
183        IF (okvan) THEN
184           DO ipol = 1, 3
185              CALL forces_us_efield( forces_bp_efield, ipol, efield_cry(ipol) )
186           ENDDO
187        ENDIF
188        DO ipol = 1, 3
189           CALL forces_ion_efield( forces_bp_efield, ipol, efield_cart(ipol) )
190        ENDDO
191     ENDIF
192  ENDIF
193  !
194  ! ... here we sum all the contributions and compute the total force acting
195  ! ... on the crystal
196  !
197  DO ipol = 1, 3
198     !
199     sumfor = 0.D0
200     !
201     DO na = 1, nat
202        !
203        force(ipol,na) = force(ipol,na)    + &
204                         forcenl(ipol,na)  + &
205                         forceion(ipol,na) + &
206                         forcelc(ipol,na)  + &
207                         forcecc(ipol,na)  + &
208                         forceh(ipol,na)   + &
209                         forcescc(ipol,na)
210        !
211        IF ( llondon )  force(ipol,na) = force(ipol,na) + force_disp(ipol,na)
212        IF ( ldftd3 )   force(ipol,na) = force(ipol,na) + force_d3(ipol,na)
213        IF ( lxdm )     force(ipol,na) = force(ipol,na) + force_disp_xdm(ipol,na)
214        ! factor 2 converts from Ha to Ry a.u.
215        IF ( ts_vdw )   force(ipol,na) = force(ipol,na) + 2.0_dp*FtsvdW(ipol,na)
216        IF ( tefield )  force(ipol,na) = force(ipol,na) + forcefield(ipol,na)
217        IF ( gate )     force(ipol,na) = force(ipol,na) + forcegate(ipol,na) ! TB
218        IF (lelfield)   force(ipol,na) = force(ipol,na) + forces_bp_efield(ipol,na)
219        IF (do_comp_mt) force(ipol,na) = force(ipol,na) + force_mt(ipol,na)
220        !
221        sumfor = sumfor + force(ipol,na)
222        !
223     ENDDO
224     !
225     !TB
226     IF ((gate.AND.relaxz).AND.(ipol==3)) WRITE( stdout, '("Total force in z direction = 0 disabled")')
227     !
228     IF ( (do_comp_esm .AND. ( esm_bc /= 'pbc' )).OR.(gate.AND.relaxz) ) THEN
229        !
230        ! ... impose total force along xy = 0
231        !
232        DO na = 1, nat
233           IF ( ipol /= 3) force(ipol,na) = force(ipol,na)  &
234                                            - sumfor / DBLE( nat )
235        ENDDO
236        !
237     ELSEIF ( qmmm_mode < 0 ) THEN
238        !
239        ! ... impose total force = 0 except in a QM-MM calculation
240        !
241        DO na = 1, nat
242           force(ipol,na) = force(ipol,na) - sumfor / DBLE( nat )
243        ENDDO
244        !
245     ENDIF
246     !
247  ENDDO
248  !
249  ! ... resymmetrize (should not be needed, but ...)
250  !
251  CALL symvector( nat, force )
252  !
253  IF ( remove_rigid_rot ) &
254     CALL remove_tot_torque( nat, tau, amass(ityp(:)), force  )
255  !
256  IF( textfor ) force(:,:) = force(:,:) + extfor(:,:)
257  !
258  ! ... call void routine for user define/ plugin patches on external forces
259  !
260  CALL plugin_ext_forces()
261  !
262  ! ... write on output the forces
263  !
264  WRITE( stdout, '(/,5x,"Forces acting on atoms (cartesian axes, Ry/au):", / )')
265  DO na = 1, nat
266     WRITE( stdout, 9035) na, ityp(na), force(:,na)
267  ENDDO
268  !
269  ! ... forces on fixed coordinates are set to zero ( C.S. 15/10/2003 )
270  !
271  force(:,:)    = force(:,:)    * DBLE( if_pos )
272  forcescc(:,:) = forcescc(:,:) * DBLE( if_pos )
273  !
274  IF ( iverbosity > 0 ) THEN
275     IF ( do_comp_mt ) THEN
276        WRITE( stdout, '(5x,"The Martyna-Tuckerman correction term to forces")')
277        DO na = 1, nat
278           WRITE( stdout, 9035) na, ityp(na), ( force_mt(ipol,na), ipol = 1, 3 )
279        ENDDO
280     END IF
281     !
282     WRITE( stdout, '(5x,"The non-local contrib.  to forces")')
283     DO na = 1, nat
284        WRITE( stdout, 9035) na, ityp(na), ( forcenl(ipol,na), ipol = 1, 3 )
285     ENDDO
286     WRITE( stdout, '(5x,"The ionic contribution  to forces")')
287     DO na = 1, nat
288        WRITE( stdout, 9035) na, ityp(na), ( forceion(ipol,na), ipol = 1, 3 )
289     ENDDO
290     WRITE( stdout, '(5x,"The local contribution  to forces")')
291     DO na = 1, nat
292        WRITE( stdout, 9035) na, ityp(na), ( forcelc(ipol,na), ipol = 1, 3 )
293     ENDDO
294     WRITE( stdout, '(5x,"The core correction contribution to forces")')
295     DO na = 1, nat
296        WRITE( stdout, 9035) na, ityp(na), ( forcecc(ipol,na), ipol = 1, 3 )
297     ENDDO
298     WRITE( stdout, '(5x,"The Hubbard contrib.    to forces")')
299     DO na = 1, nat
300        WRITE( stdout, 9035) na, ityp(na), ( forceh(ipol,na), ipol = 1, 3 )
301     ENDDO
302     WRITE( stdout, '(5x,"The SCF correction term to forces")')
303     DO na = 1, nat
304        WRITE( stdout, 9035) na, ityp(na), ( forcescc(ipol,na), ipol = 1, 3 )
305     ENDDO
306     !
307     IF ( llondon) THEN
308        WRITE( stdout, '(/,5x,"Dispersion contribution to forces:")')
309        DO na = 1, nat
310           WRITE( stdout, 9035) na, ityp(na), (force_disp(ipol,na), ipol = 1, 3)
311        ENDDO
312     END IF
313     !
314     IF ( ldftd3 ) THEN
315        WRITE( stdout, '(/,5x,"DFT-D3 dispersion contribution to forces:")')
316        DO na = 1, nat
317           WRITE( stdout, 9035) na, ityp(na), (force_d3(ipol,na), ipol = 1, 3)
318        ENDDO
319     END IF
320     !
321     IF (lxdm) THEN
322        WRITE( stdout, '(/,5x,"XDM contribution to forces:")')
323        DO na = 1, nat
324           WRITE( stdout, 9035) na, ityp(na), (force_disp_xdm(ipol,na), ipol = 1, 3)
325        ENDDO
326     END IF
327     !
328     IF ( ts_vdw) THEN
329        WRITE( stdout, '(/,5x,"TS-VDW contribution to forces:")')
330        DO na = 1, nat
331           WRITE( stdout, 9035) na, ityp(na), (2.0d0*FtsvdW(ipol,na), ipol=1,3)
332        ENDDO
333     END IF
334     !
335     ! TB gate forces
336     IF ( gate ) THEN
337        WRITE( stdout, '(/,5x,"Gate contribution to forces:")')
338        DO na = 1, nat
339           WRITE( stdout, 9035) na, ityp(na), (forcegate(ipol,na), ipol = 1, 3)
340        ENDDO
341     END IF
342     !
343  END IF
344  !
345  sumfor = 0.D0
346  sumscf = 0.D0
347  !
348  DO na = 1, nat
349     !
350     sumfor = sumfor + force(1,na)**2 + force(2,na)**2 + force(3,na)**2
351     sumscf = sumscf + forcescc(1,na)**2 + forcescc(2,na)**2+ forcescc(3,na)**2
352     !
353  ENDDO
354  !
355  sumfor = SQRT( sumfor )
356  sumscf = SQRT( sumscf )
357  !
358  WRITE( stdout, '(/5x,"Total force = ",F12.6,5X, &
359              &  "Total SCF correction = ",F12.6)') sumfor, sumscf
360  !
361  IF ( llondon .AND. iverbosity > 0 ) THEN
362     !
363     sum_mm = 0.D0
364     DO na = 1, nat
365        sum_mm = sum_mm + &
366                 force_disp(1,na)**2 + force_disp(2,na)**2 + force_disp(3,na)**2
367     ENDDO
368     sum_mm = SQRT( sum_mm )
369     WRITE ( stdout, '(/,5x, "Total Dispersion Force = ",F12.6)') sum_mm
370     !
371  END IF
372  !
373  IF ( ldftd3 .AND. iverbosity > 0 ) THEN
374     !
375     sum_mm = 0.D0
376     DO na = 1, nat
377        sum_mm = sum_mm + &
378                 force_d3(1,na)**2 + force_d3(2,na)**2 + force_d3(3,na)**2
379     ENDDO
380     sum_mm = SQRT( sum_mm )
381     WRITE ( stdout, '(/,5x, "DFT-D3 dispersion Force = ",F12.6)') sum_mm
382     !
383  END IF
384  !
385  IF ( lxdm .AND. iverbosity > 0 ) THEN
386     !
387     sum_mm = 0.D0
388     DO na = 1, nat
389        sum_mm = sum_mm + &
390                 force_disp_xdm(1,na)**2 + force_disp_xdm(2,na)**2 + force_disp_xdm(3,na)**2
391     ENDDO
392     sum_mm = SQRT( sum_mm )
393     WRITE ( stdout, '(/,5x, "Total XDM Force = ",F12.6)') sum_mm
394     !
395  END IF
396  !
397  DEALLOCATE( forcenl, forcelc, forcecc, forceh, forceion, forcescc )
398  IF ( llondon  ) DEALLOCATE( force_disp       )
399  IF ( ldftd3   ) DEALLOCATE( force_d3         )
400  IF ( lxdm     ) DEALLOCATE( force_disp_xdm   )
401  IF ( lelfield ) DEALLOCATE( forces_bp_efield )
402  !
403  lforce = .TRUE.
404  !
405  CALL stop_clock( 'forces' )
406  !
407  IF ( ( sumfor < 10.D0*sumscf ) .AND. ( sumfor > nat*eps ) ) &
408  WRITE( stdout,'(5x,"SCF correction compared to forces is large: ", &
409                   &  "reduce conv_thr to get better values")')
410  !
411  IF(ALLOCATED(force_mt))   DEALLOCATE( force_mt )
412
413  RETURN
414  !
4159035 FORMAT(5X,'atom ',I4,' type ',I2,'   force = ',3F14.8)
416  !
417END SUBROUTINE forces
418