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)
264 IF (calculate_forces .OR. debugall)
THEN
266 IF (unit_nr > 0 .AND.
SIZE(dcnum) > 0)
THEN
268 WRITE (unit_nr, *)
" ATOM Coordination Neighbors"
270 WRITE (unit_nr,
"(I6,F20.10,I12)") i, cnumbers(i), dcnum(i)%neighbors
278 IF (dispersion_env%doabc)
THEN
279 rcc = 2._dp*dispersion_env%rc_disp
280 CALL get_cell(cell=cell, periodic=periodic)
284 ncell(:) = (int(sab_max(:)) + 1)*periodic(:)
285 IF (unit_nr > 0)
THEN
286 WRITE (unit_nr, *)
" Calculate C9 Terms"
287 WRITE (unit_nr,
"(A,T20,I3,A,I3)")
" Search in cells ", -ncell(1),
":", ncell(1)
288 WRITE (unit_nr,
"(T20,I3,A,I3)") - ncell(2),
":", ncell(2)
289 WRITE (unit_nr,
"(T20,I3,A,I3)") - ncell(3),
":", ncell(3)
292 IF (dispersion_env%c9cnst)
THEN
293 IF (unit_nr > 0)
WRITE (unit_nr, *)
" Use reference coordination numbers for C9 term"
294 ALLOCATE (cnumfix(natom))
298 ikind = kind_of(iatom)
300 cnumfix(iatom) = dispersion_env%cn(za)
303 IF (
ASSOCIATED(dispersion_env%cnkind))
THEN
304 DO i = 1,
SIZE(dispersion_env%cnkind)
305 ikind = dispersion_env%cnkind(i)%kind
306 cnum = dispersion_env%cnkind(i)%cnum
307 cpassert(ikind <= nkind)
309 CALL get_atomic_kind(atomic_kind_set(ikind), natom=na, atom_list=atom_list)
311 iatom = atom_list(ia)
312 cnumfix(iatom) = cnum
316 IF (
ASSOCIATED(dispersion_env%cnlist))
THEN
317 DO i = 1,
SIZE(dispersion_env%cnlist)
318 DO ilist = 1, dispersion_env%cnlist(i)%natom
319 iatom = dispersion_env%cnlist(i)%atom(ilist)
320 cnumfix(iatom) = dispersion_env%cnlist(i)%cnum
324 IF (unit_nr > 0)
THEN
326 IF (abs(cnumbers(i) - cnumfix(i)) > 0.5_dp)
THEN
327 WRITE (unit_nr,
"(A,T20,A,I6,T41,2F10.3)")
" Difference in CN ",
"Atom:", &
328 i, cnumbers(i), cnumfix(i)
336 sab_vdw => dispersion_env%sab_vdw
343 CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rij)
345 IF (exclude(ikind) .OR. exclude(jkind)) cycle
347 IF (.NOT. (dodisp(ikind) .AND. dodisp(jkind))) cycle
349 za = atomnumber(ikind)
350 zb = atomnumber(jkind)
352 dr = sqrt(sum(rij(:)**2))
356 IF (iatom == jatom)
fac = 0.5_dp
357 IF (disp_a%type ==
dftd3_pp .AND. dr > 0.001_dp)
THEN
358 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
360 exclude=exclude_pair)
361 IF (exclude_pair) cycle
364 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
365 cnumbers(iatom), cnumbers(jatom), dispersion_env%k3, c6, dc6a, dc6b)
366 c8 = 3.0d0*c6*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
367 dc8a = 3.0d0*dc6a*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
368 dc8b = 3.0d0*dc6b*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
373 IF (atom2mol(iatom) /= atom2mol(jatom))
THEN
380 CALL damping_d3(dr, dispersion_env%r0ab(za, zb), rs6, alp6, rcut, fdab6, dfdab6)
381 CALL damping_d3(dr, dispersion_env%r0ab(za, zb), rs8, alp8, rcut, fdab8, dfdab8)
382 e6 = s6*
fac*c6*fdab6/r6
383 e8 = s8i*
fac*c8*fdab8/r8
384 ELSE IF (idmp == 2)
THEN
386 r0ab = sqrt(3.0d0*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb))
388 fdab6 = 1.0_dp/(r6 + f0ab**6)
389 fdab8 = 1.0_dp/(r8 + f0ab**8)
391 e8 = s8i*
fac*c8*fdab8
393 cpabort(
"Unknown DFT-D3 damping function:")
395 IF (dispersion_env%srb .AND. dr .LT. 30.0d0)
THEN
396 srbe = ssrb*(real((za*zb), kind=
dp))**t1srb*exp(-gsrb*dr*dispersion_env%r0ab(za, zb)**t2srb)
402 evdw = evdw - e6 - e8
406 atener(iatom) = atener(iatom) - 0.5_dp*(e6 + e8 + srbe)
407 atener(jatom) = atener(jatom) - 0.5_dp*(e6 + e8 + srbe)
410 atevdw(iatom) = atevdw(iatom) - 0.5_dp*(e6 + e8 + srbe)
411 atevdw(jatom) = atevdw(jatom) - 0.5_dp*(e6 + e8 + srbe)
413 IF (calculate_forces)
THEN
417 de6 = -s6*c6/r6*(dfdab6 - 6._dp*fdab6/dr)
418 de8 = -s8i*c8/r8*(dfdab8 - 8._dp*fdab8/dr)
419 ELSE IF (idmp == 2)
THEN
421 de6 = s6*c6*fdab6*fdab6*6.0_dp*dr**5
422 de8 = s8i*c8*fdab8*fdab8*8.0_dp*dr**7
424 cpabort(
"Unknown DFT-D3 damping function:")
426 fdij(:) = (de6 + de8)*rij(:)/dr*
fac
427 IF (dispersion_env%srb .AND. dr .LT. 30.0d0)
THEN
428 fdij(:) = fdij(:) + srbe*gsrb*dispersion_env%r0ab(za, zb)**t2srb*rij(:)/dr
430 atom_a = atom_of_kind(iatom)
431 atom_b = atom_of_kind(jatom)
432 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdij(:)
433 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) + fdij(:)
440 dc6a = -s6*
fac*dc6a*fdab6/r6
441 dc6b = -s6*
fac*dc6b*fdab6/r6
442 dc8a = -s8i*
fac*dc8a*fdab8/r8
443 dc8b = -s8i*
fac*dc8b*fdab8/r8
444 ELSE IF (idmp == 2)
THEN
446 dc6a = -s6*
fac*dc6a*fdab6
447 dc6b = -s6*
fac*dc6b*fdab6
448 dc8a = -s8i*
fac*dc8a*fdab8
449 dc8b = -s8i*
fac*dc8b*fdab8
451 cpabort(
"Unknown DFT-D3 damping function:")
453 DO i = 1, dcnum(iatom)%neighbors
454 katom = dcnum(iatom)%nlist(i)
455 kkind = kind_of(katom)
456 rik = dcnum(iatom)%rik(:, i)
457 drk = sqrt(sum(rik(:)**2))
458 fdik(:) = (dc6a + dc8a)*dcnum(iatom)%dvals(i)*rik(:)/drk
459 atom_c = atom_of_kind(katom)
460 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
461 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdik(:)
466 DO i = 1, dcnum(jatom)%neighbors
467 katom = dcnum(jatom)%nlist(i)
468 kkind = kind_of(katom)
469 rik = dcnum(jatom)%rik(:, i)
470 drk = sqrt(sum(rik(:)**2))
471 fdik(:) = (dc6b + dc8b)*dcnum(jatom)%dvals(i)*rik(:)/drk
472 atom_c = atom_of_kind(katom)
473 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
474 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdik(:)
480 IF (dispersion_env%doabc)
THEN
483 is000 = (all(cell_b == 0))
484 rb0(:) = matmul(cell%hmat, cell_b)
485 ra(:) =
pbc(particle_set(iatom)%r(:), cell)
486 rb(:) =
pbc(particle_set(jatom)%r(:), cell) + rb0
487 r2ab = sum((ra - rb)**2)
488 DO icx = -ncell(1), ncell(1)
489 DO icy = -ncell(2), ncell(2)
490 DO icz = -ncell(3), ncell(3)
495 IF (is000 .AND. (all(cell_c == 0)))
THEN
497 kstart = max(jatom + 1, iatom + 1)
507 IF (hashc == hashb) cycle
508 IF (all(cell_c == 0)) cycle
513 rc0 = matmul(cell%hmat, cell_c)
514 DO katom = kstart, natom
515 kkind = kind_of(katom)
516 IF (exclude(kkind) .OR. .NOT. dodisp(kkind)) cycle
517 rc(:) = rcpbc(:, katom) + rc0(:)
518 r2bc = sum((rb - rc)**2)
519 IF (r2bc >= rc2) cycle
520 r2ca = sum((rc - ra)**2)
521 IF (r2ca >= rc2) cycle
522 r2abc = r2ab*r2bc*r2ca
523 IF (r2abc <= 0.001_dp) cycle
524 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
527 IF (exclude_pair) cycle
530 IF (r2abc <= 0.01*rc2*rc2*rc2)
THEN
531 kkind = kind_of(katom)
532 atom_c = atom_of_kind(katom)
533 zc = atomnumber(kkind)
536 IF (iatom == jatom .OR. iatom == katom .OR. jatom == katom)
fac = 0.5_dp
537 IF (iatom == jatom .AND. iatom == katom)
fac = 1._dp/3._dp
540 IF (dispersion_env%c9cnst)
THEN
541 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
542 cnumfix(iatom), cnumfix(jatom), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
543 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
544 cnumfix(jatom), cnumfix(katom), dispersion_env%k3, cc6bc, dcc6bcb, dcc6bcc)
545 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
546 cnumfix(katom), cnumfix(iatom), dispersion_env%k3, cc6ca, dcc6cac, dcc6caa)
548 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
549 cnumbers(iatom), cnumbers(jatom), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
550 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
551 cnumbers(jatom), cnumbers(katom), dispersion_env%k3, cc6bc, dcc6bcb, dcc6bcc)
552 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
553 cnumbers(katom), cnumbers(iatom), dispersion_env%k3, cc6ca, dcc6cac, dcc6caa)
555 c9 = -sqrt(cc6ab*cc6bc*cc6ca)
556 rabc = r2abc**(1._dp/6._dp)
557 r0 = (dispersion_env%r0ab(za, zb)*dispersion_env%r0ab(zb, zc)* &
558 dispersion_env%r0ab(zc, za))**(1._dp/3._dp)
561 CALL damping_d3(rabc, r0, 4._dp/3._dp, 16.0_dp, rcut, fdabc, dfdabc)
562 s1 = r2ab + r2bc - r2ca
563 s2 = r2ab + r2ca - r2bc
564 s3 = r2ca + r2bc - r2ab
565 ang = 0.375_dp*s1*s2*s3/r2abc + 1.0_dp
567 e9 = s9*
fac*fdabc*c9*ang/r2abc**1.50d0
571 atener(iatom) = atener(iatom) - e9/3._dp
572 atener(jatom) = atener(jatom) - e9/3._dp
573 atener(katom) = atener(katom) - e9/3._dp
576 atevdw(iatom) = atevdw(iatom) - e9/3._dp
577 atevdw(jatom) = atevdw(jatom) - e9/3._dp
578 atevdw(katom) = atevdw(katom) - e9/3._dp
581 IF (calculate_forces)
THEN
582 rab = rb - ra; rbc = rc - rb; rca = ra - rc
583 de91 = s9*
fac*dfdabc*c9*ang/r2abc**1.50d0
584 de91 = -de91/3._dp*rabc + 3._dp*e9
585 dea = s9*
fac*fdabc*c9/r2abc**2.50d0*0.75_dp
586 fdij(:) = de91*rab(:)/r2ab
587 fdij(:) = fdij(:) + dea*s1*s2*s3*rab(:)/r2ab
588 fdij(:) = fdij(:) - dea*(s2*s3 + s1*s3 - s1*s2)*rab(:)
589 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdij(:)
590 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) + fdij(:)
594 fdij(:) = de91*rbc(:)/r2bc
595 fdij(:) = fdij(:) + dea*s1*s2*s3*rbc(:)/r2bc
596 fdij(:) = fdij(:) - dea*(s2*s3 - s1*s3 + s1*s2)*rbc(:)
597 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdij(:)
598 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) + fdij(:)
602 fdij(:) = de91*rca(:)/r2ca
603 fdij(:) = fdij(:) + dea*s1*s2*s3*rca(:)/r2ca
604 fdij(:) = fdij(:) - dea*(-s2*s3 + s1*s3 + s1*s2)*rca(:)
605 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdij(:)
606 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) + fdij(:)
611 IF (.NOT. dispersion_env%c9cnst)
THEN
615 de91 = 0.5_dp*e9/cc6ab
618 DO i = 1, dcnum(iatom)%neighbors
619 latom = dcnum(iatom)%nlist(i)
620 lkind = kind_of(latom)
621 rik(1) = dcnum(iatom)%rik(1, i)
622 rik(2) = dcnum(iatom)%rik(2, i)
623 rik(3) = dcnum(iatom)%rik(3, i)
624 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
625 fdik(:) = -de921*dcnum(iatom)%dvals(i)*rik(:)/drk
626 atom_d = atom_of_kind(latom)
627 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
628 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
633 DO i = 1, dcnum(jatom)%neighbors
634 latom = dcnum(jatom)%nlist(i)
635 lkind = kind_of(latom)
636 rik(1) = dcnum(jatom)%rik(1, i)
637 rik(2) = dcnum(jatom)%rik(2, i)
638 rik(3) = dcnum(jatom)%rik(3, i)
639 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
640 fdik(:) = -de922*dcnum(jatom)%dvals(i)*rik(:)/drk
641 atom_d = atom_of_kind(latom)
642 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
643 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
649 de91 = 0.5_dp*e9/cc6bc
652 DO i = 1, dcnum(jatom)%neighbors
653 latom = dcnum(jatom)%nlist(i)
654 lkind = kind_of(latom)
655 rik(1) = dcnum(jatom)%rik(1, i)
656 rik(2) = dcnum(jatom)%rik(2, i)
657 rik(3) = dcnum(jatom)%rik(3, i)
658 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
659 fdik(:) = -de921*dcnum(jatom)%dvals(i)*rik(:)/drk
660 atom_d = atom_of_kind(latom)
661 force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) - fdik(:)
662 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
667 DO i = 1, dcnum(katom)%neighbors
668 latom = dcnum(katom)%nlist(i)
669 lkind = kind_of(latom)
670 rik(1) = dcnum(katom)%rik(1, i)
671 rik(2) = dcnum(katom)%rik(2, i)
672 rik(3) = dcnum(katom)%rik(3, i)
673 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
674 fdik(:) = -de922*dcnum(katom)%dvals(i)*rik(:)/drk
675 atom_d = atom_of_kind(latom)
676 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdik(:)
677 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
683 de91 = 0.5_dp*e9/cc6ca
686 DO i = 1, dcnum(katom)%neighbors
687 latom = dcnum(katom)%nlist(i)
688 lkind = kind_of(latom)
689 rik(1) = dcnum(katom)%rik(1, i)
690 rik(2) = dcnum(katom)%rik(2, i)
691 rik(3) = dcnum(katom)%rik(3, i)
692 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
693 fdik(:) = -de921*dcnum(katom)%dvals(i)*rik(:)/drk
694 atom_d = atom_of_kind(latom)
695 force(kkind)%dispersion(:, atom_c) = force(kkind)%dispersion(:, atom_c) - fdik(:)
696 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
701 DO i = 1, dcnum(iatom)%neighbors
702 latom = dcnum(iatom)%nlist(i)
703 lkind = kind_of(latom)
704 rik(1) = dcnum(iatom)%rik(1, i)
705 rik(2) = dcnum(iatom)%rik(2, i)
706 rik(3) = dcnum(iatom)%rik(3, i)
707 drk = sqrt(rik(1)*rik(1) + rik(2)*rik(2) + rik(3)*rik(3))
708 fdik(:) = -de922*dcnum(iatom)%dvals(i)*rik(:)/drk
709 atom_d = atom_of_kind(latom)
710 force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdik(:)
711 force(lkind)%dispersion(:, atom_d) = force(lkind)%dispersion(:, atom_d) + fdik(:)
731 virial%pv_virial = virial%pv_virial + pv_virial_thread
739 IF (dispersion_env%lrc)
THEN
740 ALLOCATE (cnkind(nkind))
745 cnkind(ikind) = dispersion_env%cn(za)
748 IF (
ASSOCIATED(dispersion_env%cnkind))
THEN
749 DO i = 1,
SIZE(dispersion_env%cnkind)
750 ikind = dispersion_env%cnkind(i)%kind
751 cnkind(ikind) = dispersion_env%cnkind(i)%cnum
756 CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp_a, ghost=ghost_a, floating=floating_a)
757 IF (.NOT. disp_a%defined .OR. ghost_a .OR. floating_a) cycle
760 CALL get_qs_kind(qs_kind_set(jkind), dispersion=disp_b, ghost=ghost_b, floating=floating_b)
761 IF (.NOT. disp_b%defined .OR. ghost_b .OR. floating_b) cycle
762 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
764 exclude=exclude_pair)
765 IF (exclude_pair) cycle
767 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
768 cnkind(ikind), cnkind(jkind), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
769 elrc6 = elrc6 - s6*
twopi*real(na*nb, kind=
dp)*cc6ab/(3._dp*rcut**3*cell%deth)
770 c8 = 3.0d0*cc6ab*dispersion_env%r2r4(za)*dispersion_env%r2r4(zb)
771 elrc8 = elrc8 - s8*
twopi*real(na*nb, kind=
dp)*c8/(5._dp*rcut**5*cell%deth)
772 IF (dispersion_env%doabc)
THEN
775 CALL get_qs_kind(qs_kind_set(kkind), dispersion=disp_c, ghost=ghost_c, floating=floating_c)
776 IF (.NOT. disp_c%defined .OR. ghost_c .OR. floating_c) cycle
777 IF (dispersion_env%nd3_exclude_pair > 0)
THEN
780 IF (exclude_pair) cycle
782 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, za, zb, &
783 cnkind(ikind), cnkind(jkind), dispersion_env%k3, cc6ab, dcc6aba, dcc6abb)
784 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zc, za, &
785 cnkind(kkind), cnkind(ikind), dispersion_env%k3, cc6ca, dcc6aba, dcc6abb)
786 CALL getc6(maxc, max_elem, dispersion_env%c6ab, dispersion_env%maxci, zb, zc, &
787 cnkind(jkind), cnkind(kkind), dispersion_env%k3, cc6bc, dcc6aba, dcc6abb)
788 c9 = -sqrt(cc6ab*cc6bc*cc6ca)
789 elrc9 = elrc9 - s9*64._dp*
twopi*real(na*nb*nc, kind=
dp)*c9/(6._dp*rcut**3*cell%deth**2)
795 IF (para_env%is_source())
THEN
797 virial%pv_virial(i, i) = virial%pv_virial(i, i) + (elrc6 + elrc8 + 2._dp*elrc9)
804 DEALLOCATE (cnumbers)
805 IF (dispersion_env%doabc .AND. dispersion_env%c9cnst)
THEN
808 IF (calculate_forces .OR. debugall)
THEN
810 DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
818 IF (para_env%is_source())
THEN
819 evdw = evdw + (elrc6 + elrc8 + elrc9)
822 CALL para_env%sum(e6tot)
823 CALL para_env%sum(e8tot)
824 CALL para_env%sum(e9tot)
825 CALL para_env%sum(nab)
826 CALL para_env%sum(nabc)
827 e6tot = e6tot + elrc6
828 e8tot = e8tot + elrc8
829 e9tot = e9tot + elrc9
830 IF (unit_nr > 0)
THEN
831 WRITE (unit_nr,
"(A,F20.0)")
" E6 vdW terms :", nab
832 WRITE (unit_nr, *)
" E6 vdW energy [au/kcal] :", e6tot, e6tot*
kcalmol
833 WRITE (unit_nr, *)
" E8 vdW energy [au/kcal] :", e8tot, e8tot*
kcalmol
834 WRITE (unit_nr, *)
" %E8 on total vdW energy :", e8tot/evdw*100._dp
835 WRITE (unit_nr,
"(A,F20.0)")
" E9 vdW terms :", nabc
836 WRITE (unit_nr, *)
" E9 vdW energy [au/kcal] :", e9tot, e9tot*
kcalmol
837 WRITE (unit_nr, *)
" %E9 on total vdW energy :", e9tot/evdw*100._dp
838 IF (dispersion_env%lrc)
THEN
839 WRITE (unit_nr, *)
" E LRC C6 [au/kcal] :", elrc6, elrc6*
kcalmol
840 WRITE (unit_nr, *)
" E LRC C8 [au/kcal] :", elrc8, elrc8*
kcalmol
841 WRITE (unit_nr, *)
" E LRC C9 [au/kcal] :", elrc9, elrc9*
kcalmol
845 DEALLOCATE (dodisp, exclude, atomnumber, rcpbc, radd2, c6d2)
848 DEALLOCATE (atom2mol)
851 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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.