82 REAL(kind=
dp),
INTENT(OUT) :: evdw
83 LOGICAL,
INTENT(IN) :: calculate_forces
84 INTEGER,
INTENT(IN) :: unit_nr
85 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: atevdw
87 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calculate_dispersion_d3_pairpot'
89 INTEGER :: atom_a, atom_b, atom_c, atom_d, handle, hashb, hashc, i, ia, iat, iatom, icx, &
90 icy, icz, idmp, ikind, ilist, imol, jatom, jkind, katom, kkind, kstart, latom, lkind, &
91 max_elem, maxc, mepos, na, natom, nb, nc, nkind, num_pe, za, zb, zc
92 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
93 INTEGER,
DIMENSION(3) :: cell_b, cell_c, ncell, periodic
94 INTEGER,
DIMENSION(:),
POINTER :: atom_list
95 LOGICAL :: atenergy, atex, debugall, domol, exclude_pair, floating_a, floating_b, &
96 floating_c, ghost_a, ghost_b, ghost_c, is000, use_virial
97 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: dodisp, exclude
98 REAL(kind=
dp) :: a1, a2, alp6, alp8, ang, c6, c8, c9, cc6ab, cc6bc, cc6ca, cnum, dc6a, dc6b, &
99 dc8a, dc8b, dcc6aba, dcc6abb, dcc6bcb, dcc6bcc, dcc6caa, dcc6cac, de6, de8, de91, de921, &
100 de922, dea, dfdab6, dfdab8, dfdabc, dr, drk, e6, e6tot, e8, e8tot, e9, e9tot, elrc6, &
101 elrc8, elrc9, eps_cn, esrb, f0ab,
fac, fac0, fdab6, fdab8, fdabc, gsrb, kgc8, nab, nabc, &
102 r0, r0ab, r2ab, r2abc, r2bc, r2ca, r6, r8, rabc, rc2, rcc, rcut, rs6, rs8, s1, s2, s3, &
103 s6, s8, s8i, s9, srbe, ssrb, t1srb, t2srb
104 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: atom2mol, c6d2, cnkind, cnumbers, &
106 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rcpbc
107 REAL(kind=
dp),
DIMENSION(3) :: fdij, fdik, ra, rab, rb, rb0, rbc, rc, &
108 rc0, rca, rij, rik, sab_max
109 REAL(kind=
dp),
DIMENSION(3, 3) :: pv_virial_thread
110 REAL(kind=
dp),
DIMENSION(:),
POINTER :: atener
114 TYPE(
dcnum_type),
ALLOCATABLE,
DIMENSION(:) :: dcnum
118 DIMENSION(:),
POINTER :: nl_iterator
124 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
127 CALL timeset(routinen, handle)
131 NULLIFY (atomic_kind_set, qs_kind_set, sab_vdw)
133 CALL get_qs_env(qs_env=qs_env, nkind=nkind, natom=natom, atomic_kind_set=atomic_kind_set, &
134 qs_kind_set=qs_kind_set, cell=cell, virial=virial, para_env=para_env, atprop=atprop)
136 debugall = dispersion_env%verbose
139 atenergy = atprop%energy
142 atener => atprop%atevdw
146 IF (
PRESENT(atevdw))
THEN
150 NULLIFY (particle_set)
151 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
152 natom =
SIZE(particle_set)
157 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
158 pv_virial_thread(:, :) = 0._dp
160 ALLOCATE (dodisp(nkind), exclude(nkind), atomnumber(nkind), c6d2(nkind), radd2(nkind))
163 CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp_a, ghost=ghost_a, floating=floating_a)
164 dodisp(ikind) = disp_a%defined
165 exclude(ikind) = ghost_a .OR. floating_a
166 atomnumber(ikind) = za
167 c6d2(ikind) = disp_a%c6
168 radd2(ikind) = disp_a%vdw_radii
171 ALLOCATE (rcpbc(3, natom))
173 rcpbc(:, iatom) =
pbc(particle_set(iatom)%r(:), cell)
176 rcut = 2._dp*dispersion_env%rc_disp
179 maxc =
SIZE(dispersion_env%c6ab, 3)
180 max_elem =
SIZE(dispersion_env%c6ab, 1)
181 alp6 = dispersion_env%alp
183 s6 = dispersion_env%s6
184 s8 = dispersion_env%s8
185 s9 = dispersion_env%s6
186 rs6 = dispersion_env%sr6
188 a1 = dispersion_env%a1
189 a2 = dispersion_env%a2
190 eps_cn = dispersion_env%eps_cn
195 domol = dispersion_env%domol
197 kgc8 = dispersion_env%kgc8
199 CALL get_qs_env(qs_env=qs_env, molecule_set=molecule_set)
200 ALLOCATE (atom2mol(natom))
201 DO imol = 1,
SIZE(molecule_set)
202 DO iat = molecule_set(imol)%first_atom, molecule_set(imol)%last_atom
215 ssrb = dispersion_env%srb_params(1)
216 gsrb = dispersion_env%srb_params(2)
217 t1srb = dispersion_env%srb_params(3)
218 t2srb = dispersion_env%srb_params(4)
220 IF (unit_nr > 0)
THEN
221 WRITE (unit_nr, *)
" Scaling parameter (s6) ", s6
222 WRITE (unit_nr, *)
" Scaling parameter (s8) ", s8
224 WRITE (unit_nr, *)
" Zero Damping parameter (sr6)", rs6
225 WRITE (unit_nr, *)
" Zero Damping parameter (sr8)", rs8
227 WRITE (unit_nr, *)
" BJ Damping parameter (a1) ", a1
228 WRITE (unit_nr, *)
" BJ Damping parameter (a2) ", a2
230 WRITE (unit_nr, *)
" Cutoff coordination numbers", eps_cn
231 IF (dispersion_env%lrc)
THEN
232 WRITE (unit_nr, *)
" Apply a long range correction"
234 IF (dispersion_env%srb)
THEN
235 WRITE (unit_nr, *)
" Apply a short range bond correction"
236 WRITE (unit_nr, *)
" SRB parameters (s,g,t1,t2) ", ssrb, gsrb, t1srb, t2srb
239 WRITE (unit_nr, *)
" Inter-molecule scaling parameter (s8) ", kgc8
243 NULLIFY (particle_set)
244 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
245 natom =
SIZE(particle_set)
246 ALLOCATE (cnumbers(natom))
249 IF (calculate_forces .OR. debugall)
THEN
250 ALLOCATE (dcnum(natom))
251 dcnum(:)%neighbors = 0
253 ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
259 CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, exclude, atomnumber, &
262 CALL para_env%sum(cnumbers)
265 IF (calculate_forces .OR. debugall)
THEN
267 IF (unit_nr > 0 .AND.
SIZE(dcnum) > 0)
THEN
269 WRITE (unit_nr, *)
" ATOM Coordination Neighbors"
271 WRITE (unit_nr,
"(I6,F20.10,I12)") i, cnumbers(i), dcnum(i)%neighbors
279 IF (dispersion_env%doabc)
THEN
280 rcc = 2._dp*dispersion_env%rc_disp
281 CALL get_cell(cell=cell, periodic=periodic)
285 ncell(:) = (int(sab_max(:)) + 1)*periodic(:)
286 IF (unit_nr > 0)
THEN
287 WRITE (unit_nr, *)
" Calculate C9 Terms"
288 WRITE (unit_nr,
"(A,T20,I3,A,I3)")
" Search in cells ", -ncell(1),
":", ncell(1)
289 WRITE (unit_nr,
"(T20,I3,A,I3)") - ncell(2),
":", ncell(2)
290 WRITE (unit_nr,
"(T20,I3,A,I3)") - ncell(3),
":", ncell(3)
293 IF (dispersion_env%c9cnst)
THEN
294 IF (unit_nr > 0)
WRITE (unit_nr, *)
" Use reference coordination numbers for C9 term"
295 ALLOCATE (cnumfix(natom))
299 ikind = kind_of(iatom)
301 cnumfix(iatom) = dispersion_env%cn(za)
304 IF (
ASSOCIATED(dispersion_env%cnkind))
THEN
305 DO i = 1,
SIZE(dispersion_env%cnkind)
306 ikind = dispersion_env%cnkind(i)%kind
307 cnum = dispersion_env%cnkind(i)%cnum
308 cpassert(ikind <= nkind)
310 CALL get_atomic_kind(atomic_kind_set(ikind), natom=na, atom_list=atom_list)
312 iatom = atom_list(ia)
313 cnumfix(iatom) = cnum
317 IF (
ASSOCIATED(dispersion_env%cnlist))
THEN
318 DO i = 1,
SIZE(dispersion_env%cnlist)
319 DO ilist = 1, dispersion_env%cnlist(i)%natom
320 iatom = dispersion_env%cnlist(i)%atom(ilist)
321 cnumfix(iatom) = dispersion_env%cnlist(i)%cnum
325 IF (unit_nr > 0)
THEN
327 IF (abs(cnumbers(i) - cnumfix(i)) > 0.5_dp)
THEN
328 WRITE (unit_nr,
"(A,T20,A,I6,T41,2F10.3)")
" Difference in CN ",
"Atom:", &
329 i, cnumbers(i), cnumfix(i)
337 sab_vdw => dispersion_env%sab_vdw
344 CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rij)
346 IF (exclude(ikind) .OR. exclude(jkind)) cycle
348 IF (.NOT. (dodisp(ikind) .AND. dodisp(jkind))) cycle
350 za = atomnumber(ikind)
351 zb = atomnumber(jkind)
353 dr = sqrt(sum(rij(:)**2))
357 IF (iatom == jatom)
fac = 0.5_dp
358 IF (disp_a%type ==
dftd3_pp .AND. dr > 0.001_dp)
THEN
359 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
361 exclude=exclude_pair)
362 IF (exclude_pair) cycle
365 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
366 cnumbers(iatom), cnumbers(jatom), dispersion_env%k3, c6, dc6a, dc6b)
367 c8 = 3.0d0*c6*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
368 dc8a = 3.0d0*dc6a*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
369 dc8b = 3.0d0*dc6b*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
374 IF (atom2mol(iatom) /= atom2mol(jatom))
THEN
381 CALL damping_d3(dr, dispersion_env%r0ab(za, zb), rs6, alp6, rcut, fdab6, dfdab6)
382 CALL damping_d3(dr, dispersion_env%r0ab(za, zb), rs8, alp8, rcut, fdab8, dfdab8)
383 e6 = s6*
fac*c6*fdab6/r6
384 e8 = s8i*
fac*c8*fdab8/r8
385 ELSE IF (idmp == 2)
THEN
387 r0ab = sqrt(3.0d0*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb))
389 fdab6 = 1.0_dp/(r6 + f0ab**6)
390 fdab8 = 1.0_dp/(r8 + f0ab**8)
392 e8 = s8i*
fac*c8*fdab8
394 cpabort(
"Unknown DFT-D3 damping function:")
396 IF (dispersion_env%srb .AND. dr < 30.0d0)
THEN
397 srbe = ssrb*(real((za*zb), kind=
dp))**t1srb*exp(-gsrb*dr*dispersion_env%r0ab(za, zb)**t2srb)
403 evdw = evdw - e6 - e8
407 atener(iatom) = atener(iatom) - 0.5_dp*(e6 + e8 + srbe)
408 atener(jatom) = atener(jatom) - 0.5_dp*(e6 + e8 + srbe)
411 atevdw(iatom) = atevdw(iatom) - 0.5_dp*(e6 + e8 + srbe)
412 atevdw(jatom) = atevdw(jatom) - 0.5_dp*(e6 + e8 + srbe)
414 IF (calculate_forces)
THEN
418 de6 = -s6*c6/r6*(dfdab6 - 6._dp*fdab6/dr)
419 de8 = -s8i*c8/r8*(dfdab8 - 8._dp*fdab8/dr)
420 ELSE IF (idmp == 2)
THEN
422 de6 = s6*c6*fdab6*fdab6*6.0_dp*dr**5
423 de8 = s8i*c8*fdab8*fdab8*8.0_dp*dr**7
425 cpabort(
"Unknown DFT-D3 damping function:")
427 fdij(:) = (de6 + de8)*rij(:)/dr*
fac
428 IF (dispersion_env%srb .AND. dr < 30.0d0)
THEN
429 fdij(:) = fdij(:) + srbe*gsrb*dispersion_env%r0ab(za, zb)**t2srb*rij(:)/dr
431 atom_a = atom_of_kind(iatom)
432 atom_b = atom_of_kind(jatom)
433 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdij(:)
434 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) + fdij(:)
441 dc6a = -s6*
fac*dc6a*fdab6/r6
442 dc6b = -s6*
fac*dc6b*fdab6/r6
443 dc8a = -s8i*
fac*dc8a*fdab8/r8
444 dc8b = -s8i*
fac*dc8b*fdab8/r8
445 ELSE IF (idmp == 2)
THEN
447 dc6a = -s6*
fac*dc6a*fdab6
448 dc6b = -s6*
fac*dc6b*fdab6
449 dc8a = -s8i*
fac*dc8a*fdab8
450 dc8b = -s8i*
fac*dc8b*fdab8
452 cpabort(
"Unknown DFT-D3 damping function:")
454 DO i = 1, dcnum(iatom)%neighbors
455 katom = dcnum(iatom)%nlist(i)
456 kkind = kind_of(katom)
457 rik = dcnum(iatom)%rik(:, i)
458 drk = sqrt(sum(rik(:)**2))
459 fdik(:) = (dc6a + dc8a)*dcnum(iatom)%dvals(i)*rik(:)/drk
460 atom_c = atom_of_kind(katom)
461 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
462 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdik(:)
467 DO i = 1, dcnum(jatom)%neighbors
468 katom = dcnum(jatom)%nlist(i)
469 kkind = kind_of(katom)
470 rik = dcnum(jatom)%rik(:, i)
471 drk = sqrt(sum(rik(:)**2))
472 fdik(:) = (dc6b + dc8b)*dcnum(jatom)%dvals(i)*rik(:)/drk
473 atom_c = atom_of_kind(katom)
474 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
475 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdik(:)
481 IF (dispersion_env%doabc)
THEN
484 is000 = (all(cell_b == 0))
485 rb0(:) = matmul(cell%hmat, cell_b)
486 ra(:) =
pbc(particle_set(iatom)%r(:), cell)
487 rb(:) =
pbc(particle_set(jatom)%r(:), cell) + rb0
488 r2ab = sum((ra - rb)**2)
489 DO icx = -ncell(1), ncell(1)
490 DO icy = -ncell(2), ncell(2)
491 DO icz = -ncell(3), ncell(3)
496 IF (is000 .AND. (all(cell_c == 0)))
THEN
498 kstart = max(jatom + 1, iatom + 1)
508 IF (hashc == hashb) cycle
509 IF (all(cell_c == 0)) cycle
514 rc0 = matmul(cell%hmat, cell_c)
515 DO katom = kstart, natom
516 kkind = kind_of(katom)
517 IF (exclude(kkind) .OR. .NOT. dodisp(kkind)) cycle
518 rc(:) = rcpbc(:, katom) + rc0(:)
519 r2bc = sum((rb - rc)**2)
520 IF (r2bc >= rc2) cycle
521 r2ca = sum((rc - ra)**2)
522 IF (r2ca >= rc2) cycle
523 r2abc = r2ab*r2bc*r2ca
524 IF (r2abc <= 0.001_dp) cycle
525 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
528 IF (exclude_pair) cycle
531 IF (r2abc <= 0.01*rc2*rc2*rc2)
THEN
532 kkind = kind_of(katom)
533 atom_c = atom_of_kind(katom)
534 zc = atomnumber(kkind)
537 IF (iatom == jatom .OR. iatom == katom .OR. jatom == katom)
fac = 0.5_dp
538 IF (iatom == jatom .AND. iatom == katom)
fac = 1._dp/3._dp
541 IF (dispersion_env%c9cnst)
THEN
542 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
543 cnumfix(iatom), cnumfix(jatom), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
544 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
545 cnumfix(jatom), cnumfix(katom), dispersion_env%k3, cc6bc, dcc6bcb, dcc6bcc)
546 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
547 cnumfix(katom), cnumfix(iatom), dispersion_env%k3, cc6ca, dcc6cac, dcc6caa)
549 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
550 cnumbers(iatom), cnumbers(jatom), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
551 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
552 cnumbers(jatom), cnumbers(katom), dispersion_env%k3, cc6bc, dcc6bcb, dcc6bcc)
553 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
554 cnumbers(katom), cnumbers(iatom), dispersion_env%k3, cc6ca, dcc6cac, dcc6caa)
556 c9 = -sqrt(cc6ab*cc6bc*cc6ca)
557 rabc = r2abc**(1._dp/6._dp)
558 r0 = (dispersion_env%r0ab(za, zb)*dispersion_env%r0ab(zb, zc)* &
559 dispersion_env%r0ab(zc, za))**(1._dp/3._dp)
562 CALL damping_d3(rabc, r0, 4._dp/3._dp, 16.0_dp, rcut, fdabc, dfdabc)
563 s1 = r2ab + r2bc - r2ca
564 s2 = r2ab + r2ca - r2bc
565 s3 = r2ca + r2bc - r2ab
566 ang = 0.375_dp*s1*s2*s3/r2abc + 1.0_dp
568 e9 = s9*
fac*fdabc*c9*ang/r2abc**1.50d0
572 atener(iatom) = atener(iatom) - e9/3._dp
573 atener(jatom) = atener(jatom) - e9/3._dp
574 atener(katom) = atener(katom) - e9/3._dp
577 atevdw(iatom) = atevdw(iatom) - e9/3._dp
578 atevdw(jatom) = atevdw(jatom) - e9/3._dp
579 atevdw(katom) = atevdw(katom) - e9/3._dp
582 IF (calculate_forces)
THEN
583 rab = rb - ra; rbc = rc - rb; rca = ra - rc
584 de91 = s9*
fac*dfdabc*c9*ang/r2abc**1.50d0
585 de91 = -de91/3._dp*rabc + 3._dp*e9
586 dea = s9*
fac*fdabc*c9/r2abc**2.50d0*0.75_dp
587 fdij(:) = de91*rab(:)/r2ab
588 fdij(:) = fdij(:) + dea*s1*s2*s3*rab(:)/r2ab
589 fdij(:) = fdij(:) - dea*(s2*s3 + s1*s3 - s1*s2)*rab(:)
590 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdij(:)
591 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) + fdij(:)
595 fdij(:) = de91*rbc(:)/r2bc
596 fdij(:) = fdij(:) + dea*s1*s2*s3*rbc(:)/r2bc
597 fdij(:) = fdij(:) - dea*(s2*s3 - s1*s3 + s1*s2)*rbc(:)
598 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdij(:)
599 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdij(:)
603 fdij(:) = de91*rca(:)/r2ca
604 fdij(:) = fdij(:) + dea*s1*s2*s3*rca(:)/r2ca
605 fdij(:) = fdij(:) - dea*(-s2*s3 + s1*s3 + s1*s2)*rca(:)
606 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdij(:)
607 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) + fdij(:)
612 IF (.NOT. dispersion_env%c9cnst)
THEN
616 de91 = 0.5_dp*e9/cc6ab
619 DO i = 1, dcnum(iatom)%neighbors
620 latom = dcnum(iatom)%nlist(i)
621 lkind = kind_of(latom)
622 rik(1) = dcnum(iatom)%rik(1, i)
623 rik(2) = dcnum(iatom)%rik(2, i)
624 rik(3) = dcnum(iatom)%rik(3, i)
625 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
626 fdik(:) = -de921*dcnum(iatom)%dvals(i)*rik(:)/drk
627 atom_d = atom_of_kind(latom)
628 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
629 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
634 DO i = 1, dcnum(jatom)%neighbors
635 latom = dcnum(jatom)%nlist(i)
636 lkind = kind_of(latom)
637 rik(1) = dcnum(jatom)%rik(1, i)
638 rik(2) = dcnum(jatom)%rik(2, i)
639 rik(3) = dcnum(jatom)%rik(3, i)
640 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
641 fdik(:) = -de922*dcnum(jatom)%dvals(i)*rik(:)/drk
642 atom_d = atom_of_kind(latom)
643 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
644 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
650 de91 = 0.5_dp*e9/cc6bc
653 DO i = 1, dcnum(jatom)%neighbors
654 latom = dcnum(jatom)%nlist(i)
655 lkind = kind_of(latom)
656 rik(1) = dcnum(jatom)%rik(1, i)
657 rik(2) = dcnum(jatom)%rik(2, i)
658 rik(3) = dcnum(jatom)%rik(3, i)
659 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
660 fdik(:) = -de921*dcnum(jatom)%dvals(i)*rik(:)/drk
661 atom_d = atom_of_kind(latom)
662 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
663 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
668 DO i = 1, dcnum(katom)%neighbors
669 latom = dcnum(katom)%nlist(i)
670 lkind = kind_of(latom)
671 rik(1) = dcnum(katom)%rik(1, i)
672 rik(2) = dcnum(katom)%rik(2, i)
673 rik(3) = dcnum(katom)%rik(3, i)
674 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
675 fdik(:) = -de922*dcnum(katom)%dvals(i)*rik(:)/drk
676 atom_d = atom_of_kind(latom)
677 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdik(:)
678 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
684 de91 = 0.5_dp*e9/cc6ca
687 DO i = 1, dcnum(katom)%neighbors
688 latom = dcnum(katom)%nlist(i)
689 lkind = kind_of(latom)
690 rik(1) = dcnum(katom)%rik(1, i)
691 rik(2) = dcnum(katom)%rik(2, i)
692 rik(3) = dcnum(katom)%rik(3, i)
693 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
694 fdik(:) = -de921*dcnum(katom)%dvals(i)*rik(:)/drk
695 atom_d = atom_of_kind(latom)
696 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdik(:)
697 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
702 DO i = 1, dcnum(iatom)%neighbors
703 latom = dcnum(iatom)%nlist(i)
704 lkind = kind_of(latom)
705 rik(1) = dcnum(iatom)%rik(1, i)
706 rik(2) = dcnum(iatom)%rik(2, i)
707 rik(3) = dcnum(iatom)%rik(3, i)
708 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
709 fdik(:) = -de922*dcnum(iatom)%dvals(i)*rik(:)/drk
710 atom_d = atom_of_kind(latom)
711 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
712 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
732 virial%pv_virial = virial%pv_virial + pv_virial_thread
740 IF (dispersion_env%lrc)
THEN
741 ALLOCATE (cnkind(nkind))
746 cnkind(ikind) = dispersion_env%cn(za)
749 IF (
ASSOCIATED(dispersion_env%cnkind))
THEN
750 DO i = 1,
SIZE(dispersion_env%cnkind)
751 ikind = dispersion_env%cnkind(i)%kind
752 cnkind(ikind) = dispersion_env%cnkind(i)%cnum
757 CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp_a, ghost=ghost_a, floating=floating_a)
758 IF (.NOT. disp_a%defined .OR. ghost_a .OR. floating_a) cycle
761 CALL get_qs_kind(qs_kind_set(jkind), dispersion=disp_b, ghost=ghost_b, floating=floating_b)
762 IF (.NOT. disp_b%defined .OR. ghost_b .OR. floating_b) cycle
763 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
765 exclude=exclude_pair)
766 IF (exclude_pair) cycle
768 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
769 cnkind(ikind), cnkind(jkind), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
770 elrc6 = elrc6 - s6*
twopi*real(na*nb, kind=
dp)*cc6ab/(3._dp*rcut**3*cell%deth)
771 c8 = 3.0d0*cc6ab*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
772 elrc8 = elrc8 - s8*
twopi*real(na*nb, kind=
dp)*c8/(5._dp*rcut**5*cell%deth)
773 IF (dispersion_env%doabc)
THEN
776 CALL get_qs_kind(qs_kind_set(kkind), dispersion=disp_c, ghost=ghost_c, floating=floating_c)
777 IF (.NOT. disp_c%defined .OR. ghost_c .OR. floating_c) cycle
778 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
781 IF (exclude_pair) cycle
783 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
784 cnkind(ikind), cnkind(jkind), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
785 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
786 cnkind(kkind), cnkind(ikind), dispersion_env%k3, cc6ca, dcc6aba, dcc6abb)
787 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
788 cnkind(jkind), cnkind(kkind), dispersion_env%k3, cc6bc, dcc6aba, dcc6abb)
789 c9 = -sqrt(cc6ab*cc6bc*cc6ca)
790 elrc9 = elrc9 - s9*64._dp*
twopi*real(na*nb*nc, kind=
dp)*c9/(6._dp*rcut**3*cell%deth**2)
796 IF (para_env%is_source())
THEN
798 virial%pv_virial(i, i) = virial%pv_virial(i, i) + (elrc6 + elrc8 + 2._dp*elrc9)
805 DEALLOCATE (cnumbers)
806 IF (dispersion_env%doabc .AND. dispersion_env%c9cnst)
THEN
809 IF (calculate_forces .OR. debugall)
THEN
811 DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
820 CALL para_env%sum(e6tot)
821 CALL para_env%sum(e8tot)
822 CALL para_env%sum(e9tot)
823 CALL para_env%sum(evdw)
824 CALL para_env%sum(nab)
825 CALL para_env%sum(nabc)
826 e6tot = e6tot + elrc6
827 e8tot = e8tot + elrc8
828 e9tot = e9tot + elrc9
830 evdw = evdw + (elrc6 + elrc8 + elrc9)
831 IF (unit_nr > 0)
THEN
832 WRITE (unit_nr,
"(A,F20.0)")
" E6 vdW terms :", nab
833 WRITE (unit_nr, *)
" E6 vdW energy [au/kcal] :", e6tot, e6tot*
kcalmol
834 WRITE (unit_nr, *)
" E8 vdW energy [au/kcal] :", e8tot, e8tot*
kcalmol
835 WRITE (unit_nr, *)
" %E8 on total vdW energy :", e8tot/evdw*100._dp
836 WRITE (unit_nr,
"(A,F20.0)")
" E9 vdW terms :", nabc
837 WRITE (unit_nr, *)
" E9 vdW energy [au/kcal] :", e9tot, e9tot*
kcalmol
838 WRITE (unit_nr, *)
" %E9 on total vdW energy :", e9tot/evdw*100._dp
839 IF (dispersion_env%lrc)
THEN
840 WRITE (unit_nr, *)
" E LRC C6 [au/kcal] :", elrc6, elrc6*
kcalmol
841 WRITE (unit_nr, *)
" E LRC C8 [au/kcal] :", elrc8, elrc8*
kcalmol
842 WRITE (unit_nr, *)
" E LRC C9 [au/kcal] :", elrc9, elrc9*
kcalmol
846 evdw = evdw/para_env%num_pe
848 DEALLOCATE (dodisp, exclude, atomnumber, rcpbc, radd2, c6d2)
851 DEALLOCATE (atom2mol)
854 CALL timestop(handle)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.