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