42 USE dbcsr_api,
ONLY: &
43 dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_dot, dbcsr_finalize, dbcsr_get_block_p, &
44 dbcsr_multiply, dbcsr_p_type, dbcsr_type
47 ewald_environment_type
62 pair_potential_p_type,&
65 pair_potential_pp_type,&
68 pair_potential_single_type
94 neighbor_list_iterator_p_type,&
96 neighbor_list_set_p_type
109 #include "./base/base_uses.f90"
114 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: coord
115 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rab
116 INTEGER,
DIMENSION(:),
POINTER :: katom
121 CHARACTER(len=*),
PARAMETER,
PRIVATE :: modulen =
'xtb_matrices'
135 TYPE(qs_environment_type),
POINTER :: qs_env
136 TYPE(mp_para_env_type),
POINTER :: para_env
137 LOGICAL,
INTENT(IN) :: calculate_forces
139 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_xtb_matrices'
141 INTEGER :: after, atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, &
142 iset, iw, j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, lmaxa, lmaxb, maxder, maxs, &
143 n1, n2, na, natom, natorb_a, natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, &
144 nsb, nseta, nsetb, nshell, sgfa, sgfb, za, zat, zb
145 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
146 INTEGER,
DIMENSION(25) :: laoa, laob, lval, naoa, naob
147 INTEGER,
DIMENSION(3) :: cell
148 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
150 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
151 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
152 LOGICAL :: defined, diagblock, do_nonbonded, floating_a, found, ghost_a, norml1, norml2, &
153 omit_headers, use_arnoldi, use_virial, xb_inter
154 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: floating, ghost
155 REAL(kind=
dp) :: alphaa, alphab, derepij, dfp, dhij, dr, drk, drx, ena, enb, enonbonded, &
156 erep, erepij, etaa, etab, exb, f0, f1, fen, fhua, fhub, fhud, foab, hij, k2sh, kab, kcnd, &
157 kcnp, kcns, kd, ken, kf, kg, kia, kjb, kp, ks, ksp, kx2, kxr, rcova, rcovab, rcovb, rrab, &
159 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cnumbers, kx
160 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dfblock, huckel, kcnlk, owork, rcab
161 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: oint, sint
162 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: kijab
163 REAL(kind=
dp),
DIMENSION(0:3) :: kl
164 REAL(kind=
dp),
DIMENSION(2) :: condnum
165 REAL(kind=
dp),
DIMENSION(3) :: fdik, fdika, fdikb, force_ab, force_rr, &
167 REAL(kind=
dp),
DIMENSION(5) :: dpia, dpib, hena, henb, kappaa, kappab, &
168 kpolya, kpolyb, pia, pib
169 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
170 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
171 scon_a, scon_b, wblock, zeta, zetb
172 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
173 TYPE(atprop_type),
POINTER :: atprop
174 TYPE(block_p_type),
DIMENSION(2:4) :: dsblocks
175 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
176 TYPE(cp_logger_type),
POINTER :: logger
177 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, matrix_s, matrix_w
178 TYPE(dcnum_type),
ALLOCATABLE,
DIMENSION(:) :: dcnum
179 TYPE(dft_control_type),
POINTER :: dft_control
180 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: basis_set_list
181 TYPE(gto_basis_set_type),
POINTER :: basis_set_a, basis_set_b
182 TYPE(kpoint_type),
POINTER :: kpoints
184 DIMENSION(:) :: neighbor_atoms
185 TYPE(neighbor_list_iterator_p_type), &
186 DIMENSION(:),
POINTER :: nl_iterator
187 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
188 POINTER :: sab_orb, sab_xb, sab_xtb_nonbond
189 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
190 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
191 TYPE(qs_energy_type),
POINTER :: energy
192 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
193 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
194 TYPE(qs_ks_env_type),
POINTER :: ks_env
195 TYPE(qs_rho_type),
POINTER :: rho
196 TYPE(virial_type),
POINTER :: virial
197 TYPE(xtb_atom_type),
POINTER :: xtb_atom_a, xtb_atom_b
198 TYPE(xtb_control_type),
POINTER :: xtb_control
202 CALL timeset(routinen, handle)
204 NULLIFY (logger, virial, atprop)
207 NULLIFY (matrix_h, matrix_s, matrix_p, matrix_w, atomic_kind_set, &
208 qs_kind_set, sab_orb, ks_env)
213 atomic_kind_set=atomic_kind_set, &
214 qs_kind_set=qs_kind_set, &
215 matrix_h_kp=matrix_h, &
216 matrix_s_kp=matrix_s, &
218 dft_control=dft_control, &
221 nkind =
SIZE(atomic_kind_set)
222 xtb_control => dft_control%qs_control%xtb_control
223 xb_inter = xtb_control%xb_interaction
224 do_nonbonded = xtb_control%do_nonbonded
225 nimg = dft_control%nimages
227 IF (calculate_forces) nderivatives = 1
228 IF (dft_control%tddfpt2_control%enabled) nderivatives = 1
229 maxder =
ncoset(nderivatives)
231 IF (xb_inter) energy%xtb_xb_inter = 0.0_dp
232 IF (do_nonbonded) energy%xtb_nonbonded = 0.0_dp
238 ksp = xtb_control%ksp
239 k2sh = xtb_control%k2sh
242 kcns = xtb_control%kcns
243 kcnp = xtb_control%kcnp
244 kcnd = xtb_control%kcnd
245 ken = xtb_control%ken
246 kxr = xtb_control%kxr
247 kx2 = xtb_control%kx2
249 NULLIFY (particle_set)
250 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
251 natom =
SIZE(particle_set)
253 CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type=
"ORB")
255 IF (calculate_forces)
THEN
256 NULLIFY (rho, force, matrix_w)
258 rho=rho, matrix_w_kp=matrix_w, &
259 virial=virial, force=force)
262 IF (
SIZE(matrix_p, 1) == 2)
THEN
264 CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, &
265 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
266 CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
267 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
270 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
273 IF (atprop%energy)
THEN
277 NULLIFY (cell_to_index)
279 CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
284 ALLOCATE (basis_set_list(nkind))
289 CALL create_sab_matrix(ks_env, matrix_s,
"xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
296 ALLOCATE (matrix_h(1, img)%matrix)
297 CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
298 name=
"HAMILTONIAN MATRIX")
306 ALLOCATE (cnumbers(natom))
308 IF (calculate_forces)
THEN
309 ALLOCATE (dcnum(natom))
310 dcnum(:)%neighbors = 0
312 ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
318 ALLOCATE (ghost(nkind), floating(nkind), atomnumber(nkind))
321 CALL get_qs_kind(qs_kind_set(ikind), ghost=ghost_a, floating=floating_a)
322 ghost(ikind) = ghost_a
323 floating(ikind) = floating_a
324 atomnumber(ikind) = za
326 CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
327 CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
328 calculate_forces, .false.)
329 DEALLOCATE (ghost, floating, atomnumber)
330 CALL para_env%sum(cnumbers)
331 IF (calculate_forces)
THEN
338 ALLOCATE (kcnlk(0:3, nkind))
342 kcnlk(0:3, ikind) = 0.0_dp
343 ELSEIF (early3d(za))
THEN
344 kcnlk(0, ikind) = kcns
345 kcnlk(1, ikind) = kcnp
346 kcnlk(2, ikind) = 0.005_dp
347 kcnlk(3, ikind) = 0.0_dp
349 kcnlk(0, ikind) = kcns
350 kcnlk(1, ikind) = kcnp
351 kcnlk(2, ikind) = kcnd
352 kcnlk(3, ikind) = 0.0_dp
355 ALLOCATE (huckel(5, natom))
358 ikind = kind_of(iatom)
359 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
361 huckel(:, iatom) = 0.0_dp
363 huckel(i, iatom) = hena(i)*(1._dp + kcnlk(lval(i), ikind)*cnumbers(iatom))
372 ALLOCATE (kijab(maxs, maxs, nkind, nkind))
375 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
377 IF (.NOT. defined .OR. natorb_a < 1) cycle
380 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
382 IF (.NOT. defined .OR. natorb_b < 1) cycle
385 fen = 1.0_dp + ken*(ena - enb)**2
396 IF (zb == 1 .AND. nb == 2) kjb = k2sh
397 IF (za == 1 .AND. na == 2) kia = k2sh
398 IF ((zb == 1 .AND. nb == 2) .OR. (za == 1 .AND. na == 2))
THEN
399 kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)
401 IF ((la == 0 .AND. lb == 1) .OR. (la == 1 .AND. lb == 0))
THEN
402 kijab(i, j, ikind, jkind) = ksp*kab*fen
404 kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)*kab*fen
414 ALLOCATE (neighbor_atoms(nkind))
416 NULLIFY (neighbor_atoms(ikind)%coord)
417 NULLIFY (neighbor_atoms(ikind)%rab)
418 NULLIFY (neighbor_atoms(ikind)%katom)
420 IF (zat == 17 .OR. zat == 35 .OR. zat == 53 .OR. zat == 85)
THEN
421 ALLOCATE (neighbor_atoms(ikind)%coord(3, na))
422 neighbor_atoms(ikind)%coord(1:3, 1:na) = 0.0_dp
423 ALLOCATE (neighbor_atoms(ikind)%rab(na))
424 neighbor_atoms(ikind)%rab(1:na) = huge(0.0_dp)
425 ALLOCATE (neighbor_atoms(ikind)%katom(na))
426 neighbor_atoms(ikind)%katom(1:na) = 0
432 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
436 ALLOCATE (rcab(nkind, nkind))
438 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
441 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
443 rcab(ikind, jkind) = kxr*(rcova + rcovb)
457 iatom=iatom, jatom=jatom, r=rij, cell=cell)
458 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
460 IF (.NOT. defined .OR. natorb_a < 1) cycle
461 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
463 IF (.NOT. defined .OR. natorb_b < 1) cycle
465 dr = sqrt(sum(rij(:)**2))
468 IF (xb_inter .AND. (dr > 1.e-3_dp))
THEN
469 IF (
ASSOCIATED(neighbor_atoms(ikind)%rab))
THEN
470 atom_a = atom_of_kind(iatom)
471 IF (dr < neighbor_atoms(ikind)%rab(atom_a))
THEN
472 neighbor_atoms(ikind)%rab(atom_a) = dr
473 neighbor_atoms(ikind)%coord(1:3, atom_a) = rij(1:3)
474 neighbor_atoms(ikind)%katom(atom_a) = jatom
477 IF (
ASSOCIATED(neighbor_atoms(jkind)%rab))
THEN
478 atom_b = atom_of_kind(jatom)
479 IF (dr < neighbor_atoms(jkind)%rab(atom_b))
THEN
480 neighbor_atoms(jkind)%rab(atom_b) = dr
481 neighbor_atoms(jkind)%coord(1:3, atom_b) = -rij(1:3)
482 neighbor_atoms(jkind)%katom(atom_b) = iatom
489 lmax=lmaxa, nshell=nsa, alpha=alphaa, zneff=zneffa, kpoly=kpolya, &
490 kappa=kappaa, hen=hena)
492 lmax=lmaxb, nshell=nsb, alpha=alphab, zneff=zneffb, kpoly=kpolyb, &
493 kappa=kappab, hen=henb)
498 ic = cell_to_index(cell(1), cell(2), cell(3))
502 icol = max(iatom, jatom)
503 irow = min(iatom, jatom)
504 NULLIFY (sblock, fblock)
505 CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
506 row=irow, col=icol, block=sblock, found=found)
508 CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
509 row=irow, col=icol, block=fblock, found=found)
512 IF (calculate_forces)
THEN
514 CALL dbcsr_get_block_p(matrix=matrix_p(1, ic)%matrix, &
515 row=irow, col=icol, block=pblock, found=found)
516 cpassert(
ASSOCIATED(pblock))
518 CALL dbcsr_get_block_p(matrix=matrix_w(1, ic)%matrix, &
519 row=irow, col=icol, block=wblock, found=found)
520 cpassert(
ASSOCIATED(wblock))
522 NULLIFY (dsblocks(i)%block)
523 CALL dbcsr_get_block_p(matrix=matrix_s(i, ic)%matrix, &
524 row=irow, col=icol, block=dsblocks(i)%block, found=found)
530 basis_set_a => basis_set_list(ikind)%gto_basis_set
531 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
532 basis_set_b => basis_set_list(jkind)%gto_basis_set
533 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
534 atom_a = atom_of_kind(iatom)
535 atom_b = atom_of_kind(jatom)
537 first_sgfa => basis_set_a%first_sgf
538 la_max => basis_set_a%lmax
539 la_min => basis_set_a%lmin
540 npgfa => basis_set_a%npgf
541 nseta = basis_set_a%nset
542 nsgfa => basis_set_a%nsgf_set
543 rpgfa => basis_set_a%pgf_radius
544 set_radius_a => basis_set_a%set_radius
545 scon_a => basis_set_a%scon
546 zeta => basis_set_a%zet
548 first_sgfb => basis_set_b%first_sgf
549 lb_max => basis_set_b%lmax
550 lb_min => basis_set_b%lmin
551 npgfb => basis_set_b%npgf
552 nsetb = basis_set_b%nset
553 nsgfb => basis_set_b%nsgf_set
554 rpgfb => basis_set_b%pgf_radius
555 set_radius_b => basis_set_b%set_radius
556 scon_b => basis_set_b%scon
557 zetb => basis_set_b%zet
559 ldsab = get_memory_usage(qs_kind_set,
"ORB",
"ORB")
560 ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
561 ALLOCATE (sint(natorb_a, natorb_b, maxder))
565 ncoa = npgfa(iset)*
ncoset(la_max(iset))
566 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
567 sgfa = first_sgfa(1, iset)
569 IF (set_radius_a(iset) + set_radius_b(jset) < dr) cycle
570 ncob = npgfb(jset)*
ncoset(lb_max(jset))
571 n2 = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
572 sgfb = first_sgfb(1, jset)
573 IF (calculate_forces)
THEN
574 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
575 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
576 rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
578 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
579 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
580 rij, sab=oint(:, :, 1))
583 CALL contraction(oint(:, :, 1), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
584 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
585 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, 1), sgfa, sgfb, trans=.false.)
586 IF (calculate_forces)
THEN
588 CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
589 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
590 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.false.)
596 IF (calculate_forces)
THEN
598 IF (iatom <= jatom)
THEN
599 force_ab(i) = sum(sint(:, :, i + 1)*wblock(:, :))
601 force_ab(i) = sum(sint(:, :, i + 1)*transpose(wblock(:, :)))
605 force(ikind)%overlap(:, atom_a) = force(ikind)%overlap(:, atom_a) - f1*force_ab(:)
606 force(jkind)%overlap(:, atom_b) = force(jkind)%overlap(:, atom_b) + f1*force_ab(:)
607 IF (use_virial .AND. dr > 1.e-3_dp)
THEN
608 IF (iatom == jatom) f1 = 1.0_dp
610 IF (atprop%stress)
THEN
617 IF (iatom <= jatom)
THEN
618 sblock(:, :) = sblock(:, :) + sint(:, :, 1)
620 sblock(:, :) = sblock(:, :) + transpose(sint(:, :, 1))
622 IF (calculate_forces)
THEN
624 IF (iatom <= jatom)
THEN
625 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
627 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - transpose(sint(:, :, i))
633 rcovab = rcova + rcovb
634 rrab = sqrt(dr/rcovab)
636 pia(i) = 1._dp + kpolya(i)*rrab
639 pib(i) = 1._dp + kpolyb(i)*rrab
641 IF (calculate_forces)
THEN
642 IF (dr > 1.e-6_dp)
THEN
643 drx = 0.5_dp/rrab/rcovab
647 dpia(1:nsa) = drx*kpolya(1:nsa)
648 dpib(1:nsb) = drx*kpolyb(1:nsb)
653 IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .true.
660 fblock(i, i) = fblock(i, i) + huckel(na, iatom)
667 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
668 IF (iatom <= jatom)
THEN
669 fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
671 fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
676 IF (calculate_forces)
THEN
678 IF (irow == iatom) f0 = -1.0_dp
687 fhud = fhud + pblock(i, i)*kcnlk(la, ikind)*hena(na)
696 hij = 0.5_dp*pia(na)*pib(nb)
697 IF (iatom <= jatom)
THEN
698 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(la, ikind)*hena(na)
699 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(lb, jkind)*henb(nb)
701 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(la, ikind)*hena(na)
702 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(lb, jkind)*henb(nb)
706 IF (iatom /= jatom)
THEN
712 atom_a = atom_of_kind(iatom)
713 DO i = 1, dcnum(iatom)%neighbors
714 katom = dcnum(iatom)%nlist(i)
715 kkind = kind_of(katom)
716 atom_c = atom_of_kind(katom)
717 rik = dcnum(iatom)%rik(:, i)
718 drk = sqrt(sum(rik(:)**2))
719 IF (drk > 1.e-3_dp)
THEN
720 fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
721 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
722 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
723 fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
724 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
725 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
729 IF (atprop%stress)
THEN
737 atom_b = atom_of_kind(jatom)
738 DO i = 1, dcnum(jatom)%neighbors
739 katom = dcnum(jatom)%nlist(i)
740 kkind = kind_of(katom)
741 atom_c = atom_of_kind(katom)
742 rik = dcnum(jatom)%rik(:, i)
743 drk = sqrt(sum(rik(:)**2))
744 IF (drk > 1.e-3_dp)
THEN
745 fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
746 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
747 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
750 IF (atprop%stress)
THEN
763 ALLOCATE (dfblock(n1, n2))
771 dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
772 IF (iatom <= jatom)
THEN
773 dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
775 dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
779 dfp = f0*sum(dfblock(:, :)*pblock(:, :))
781 foab = 2.0_dp*dfp*rij(ir)/dr
789 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
790 IF (iatom <= jatom)
THEN
791 foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
793 foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
803 IF (calculate_forces)
THEN
804 atom_a = atom_of_kind(iatom)
805 atom_b = atom_of_kind(jatom)
806 IF (irow == iatom) force_ab = -force_ab
807 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
808 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
811 IF (iatom == jatom) f1 = 0.5_dp
813 IF (atprop%stress)
THEN
820 DEALLOCATE (oint, owork, sint)
823 IF (dr > 0.001_dp)
THEN
824 erepij = zneffa*zneffb/dr*exp(-sqrt(alphaa*alphab)*dr**kf)
826 IF (atprop%energy)
THEN
827 atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*erepij
828 atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*erepij
830 IF (calculate_forces .AND. (iatom /= jatom .OR. dr > 0.001_dp))
THEN
831 derepij = -(1.0_dp/dr + sqrt(alphaa*alphab)*kf*dr**(kf - 1.0_dp))*erepij
832 force_rr(1) = derepij*rij(1)/dr
833 force_rr(2) = derepij*rij(2)/dr
834 force_rr(3) = derepij*rij(3)/dr
835 atom_a = atom_of_kind(iatom)
836 atom_b = atom_of_kind(jatom)
837 force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
838 force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
841 IF (iatom == jatom) f1 = 0.5_dp
843 IF (atprop%stress)
THEN
854 DO i = 1,
SIZE(matrix_h, 1)
856 CALL dbcsr_finalize(matrix_h(i, img)%matrix)
857 CALL dbcsr_finalize(matrix_s(i, img)%matrix)
863 CALL xb_neighbors(neighbor_atoms, para_env)
864 CALL xb_interaction(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
865 calculate_forces, use_virial, force, virial, atprop)
869 IF (do_nonbonded)
THEN
871 NULLIFY (sab_xtb_nonbond)
872 CALL get_qs_env(qs_env=qs_env, sab_xtb_nonbond=sab_xtb_nonbond)
873 CALL nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
874 atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
877 erep = erep + exb + enonbonded
879 CALL para_env%sum(exb)
880 energy%xtb_xb_inter = exb
882 IF (do_nonbonded)
THEN
883 CALL para_env%sum(enonbonded)
884 energy%xtb_nonbonded = enonbonded
886 CALL para_env%sum(erep)
887 energy%repulsive = erep
890 DEALLOCATE (cnumbers)
891 IF (calculate_forces)
THEN
893 DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
903 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
905 qs_env%input,
"DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN"),
cp_p_file))
THEN
909 after = min(max(after, 1), 16)
912 output_unit=iw, omit_headers=omit_headers)
918 qs_env%input,
"DFT%PRINT%AO_MATRICES/OVERLAP"),
cp_p_file))
THEN
922 after = min(max(after, 1), 16)
925 output_unit=iw, omit_headers=omit_headers)
927 qs_env%input,
"DFT%PRINT%AO_MATRICES/DERIVATIVES"),
cp_p_file))
THEN
928 DO i = 2,
SIZE(matrix_s, 1)
930 output_unit=iw, omit_headers=omit_headers)
938 IF (.NOT. calculate_forces)
THEN
940 "DFT%PRINT%OVERLAP_CONDITION") .NE. 0)
THEN
944 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%DIAGONALIZATION", l_val=norml2)
945 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%ARNOLDI", l_val=use_arnoldi)
946 CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env)
947 CALL overlap_condnum(matrix_s, condnum, iw, norml1, norml2, use_arnoldi, blacs_env)
951 DEALLOCATE (basis_set_list)
952 IF (calculate_forces)
THEN
953 IF (
SIZE(matrix_p, 1) == 2)
THEN
955 CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, alpha_scalar=1.0_dp, &
963 IF (
ASSOCIATED(neighbor_atoms(ikind)%coord))
THEN
964 DEALLOCATE (neighbor_atoms(ikind)%coord)
966 IF (
ASSOCIATED(neighbor_atoms(ikind)%rab))
THEN
967 DEALLOCATE (neighbor_atoms(ikind)%rab)
969 IF (
ASSOCIATED(neighbor_atoms(ikind)%katom))
THEN
970 DEALLOCATE (neighbor_atoms(ikind)%katom)
973 DEALLOCATE (neighbor_atoms)
974 DEALLOCATE (kx, rcab)
977 CALL timestop(handle)
988 TYPE(qs_environment_type),
POINTER :: qs_env
989 TYPE(dbcsr_type),
POINTER :: p_matrix
991 CHARACTER(LEN=*),
PARAMETER :: routinen =
'xtb_hab_force'
993 INTEGER :: atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, iset, &
994 j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, lmaxa, lmaxb, maxder, maxs, n1, n2, &
995 na, natom, natorb_a, natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, nsb, &
996 nseta, nsetb, nshell, sgfa, sgfb, za, zb
997 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
998 INTEGER,
DIMENSION(25) :: laoa, laob, lval, naoa, naob
999 INTEGER,
DIMENSION(3) :: cell
1000 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
1002 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
1003 LOGICAL :: defined, diagblock, floating_a, found, &
1005 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: floating, ghost
1006 REAL(kind=
dp) :: alphaa, alphab, dfp, dhij, dr, drk, drx, ena, enb, etaa, etab, f0, fen, &
1007 fhua, fhub, fhud, foab, hij, k2sh, kab, kcnd, kcnp, kcns, kd, ken, kf, kg, kia, kjb, kp, &
1008 ks, ksp, kx2, kxr, rcova, rcovab, rcovb, rrab, zneffa, zneffb
1009 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cnumbers
1010 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dfblock, huckel, kcnlk, owork
1011 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: oint, sint
1012 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: kijab
1013 REAL(kind=
dp),
DIMENSION(0:3) :: kl
1014 REAL(kind=
dp),
DIMENSION(3) :: fdik, fdika, fdikb, force_ab, rij, rik
1015 REAL(kind=
dp),
DIMENSION(5) :: dpia, dpib, hena, henb, kappaa, kappab, &
1016 kpolya, kpolyb, pia, pib
1017 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
1018 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
1019 scon_a, scon_b, zeta, zetb
1020 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1021 TYPE(block_p_type),
DIMENSION(2:4) :: dsblocks
1022 TYPE(cp_logger_type),
POINTER :: logger
1023 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_s
1024 TYPE(dcnum_type),
ALLOCATABLE,
DIMENSION(:) :: dcnum
1025 TYPE(dft_control_type),
POINTER :: dft_control
1026 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: basis_set_list
1027 TYPE(gto_basis_set_type),
POINTER :: basis_set_a, basis_set_b
1028 TYPE(mp_para_env_type),
POINTER :: para_env
1029 TYPE(neighbor_list_iterator_p_type), &
1030 DIMENSION(:),
POINTER :: nl_iterator
1031 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1033 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1034 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
1035 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
1036 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1037 TYPE(qs_ks_env_type),
POINTER :: ks_env
1038 TYPE(xtb_atom_type),
POINTER :: xtb_atom_a, xtb_atom_b
1039 TYPE(xtb_control_type),
POINTER :: xtb_control
1041 CALL timeset(routinen, handle)
1046 NULLIFY (matrix_h, matrix_s, atomic_kind_set, qs_kind_set, sab_orb)
1049 atomic_kind_set=atomic_kind_set, &
1050 qs_kind_set=qs_kind_set, &
1051 dft_control=dft_control, &
1052 para_env=para_env, &
1055 nkind =
SIZE(atomic_kind_set)
1056 xtb_control => dft_control%qs_control%xtb_control
1057 nimg = dft_control%nimages
1059 maxder =
ncoset(nderivatives)
1065 ksp = xtb_control%ksp
1066 k2sh = xtb_control%k2sh
1069 kcns = xtb_control%kcns
1070 kcnp = xtb_control%kcnp
1071 kcnd = xtb_control%kcnd
1072 ken = xtb_control%ken
1073 kxr = xtb_control%kxr
1074 kx2 = xtb_control%kx2
1076 NULLIFY (particle_set)
1077 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
1078 natom =
SIZE(particle_set)
1080 CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type=
"ORB")
1084 use_virial = .false.
1088 ALLOCATE (basis_set_list(nkind))
1092 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env)
1094 CALL create_sab_matrix(ks_env, matrix_s,
"xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
1099 ALLOCATE (matrix_h(1, img)%matrix)
1100 CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
1101 name=
"HAMILTONIAN MATRIX")
1108 ALLOCATE (cnumbers(natom))
1110 ALLOCATE (dcnum(natom))
1111 dcnum(:)%neighbors = 0
1113 ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
1116 ALLOCATE (ghost(nkind), floating(nkind), atomnumber(nkind))
1119 CALL get_qs_kind(qs_kind_set(ikind), ghost=ghost_a, floating=floating_a)
1120 ghost(ikind) = ghost_a
1121 floating(ikind) = floating_a
1122 atomnumber(ikind) = za
1124 CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
1125 CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
1127 DEALLOCATE (ghost, floating, atomnumber)
1128 CALL para_env%sum(cnumbers)
1134 ALLOCATE (kcnlk(0:3, nkind))
1138 kcnlk(0:3, ikind) = 0.0_dp
1139 ELSEIF (early3d(za))
THEN
1140 kcnlk(0, ikind) = kcns
1141 kcnlk(1, ikind) = kcnp
1142 kcnlk(2, ikind) = 0.005_dp
1143 kcnlk(3, ikind) = 0.0_dp
1145 kcnlk(0, ikind) = kcns
1146 kcnlk(1, ikind) = kcnp
1147 kcnlk(2, ikind) = kcnd
1148 kcnlk(3, ikind) = 0.0_dp
1151 ALLOCATE (huckel(5, natom))
1154 ikind = kind_of(iatom)
1155 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1157 huckel(:, iatom) = 0.0_dp
1159 huckel(i, iatom) = hena(i)*(1._dp + kcnlk(lval(i), ikind)*cnumbers(iatom))
1168 ALLOCATE (kijab(maxs, maxs, nkind, nkind))
1171 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1173 IF (.NOT. defined .OR. natorb_a < 1) cycle
1176 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1178 IF (.NOT. defined .OR. natorb_b < 1) cycle
1181 fen = 1.0_dp + ken*(ena - enb)**2
1192 IF (zb == 1 .AND. nb == 2) kjb = k2sh
1193 IF (za == 1 .AND. na == 2) kia = k2sh
1194 IF ((zb == 1 .AND. nb == 2) .OR. (za == 1 .AND. na == 2))
THEN
1195 kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)
1197 IF ((la == 0 .AND. lb == 1) .OR. (la == 1 .AND. lb == 0))
THEN
1198 kijab(i, j, ikind, jkind) = ksp*kab*fen
1200 kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)*kab*fen
1212 iatom=iatom, jatom=jatom, r=rij, cell=cell)
1213 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1215 IF (.NOT. defined .OR. natorb_a < 1) cycle
1216 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1218 IF (.NOT. defined .OR. natorb_b < 1) cycle
1220 dr = sqrt(sum(rij(:)**2))
1223 CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, rcov=rcova, eta=etaa, &
1224 lmax=lmaxa, nshell=nsa, alpha=alphaa, zneff=zneffa, kpoly=kpolya, &
1225 kappa=kappaa, hen=hena)
1226 CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, rcov=rcovb, eta=etab, &
1227 lmax=lmaxb, nshell=nsb, alpha=alphab, zneff=zneffb, kpoly=kpolyb, &
1228 kappa=kappab, hen=henb)
1232 icol = max(iatom, jatom)
1233 irow = min(iatom, jatom)
1234 NULLIFY (sblock, fblock)
1235 CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
1236 row=irow, col=icol, block=sblock, found=found)
1238 CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
1239 row=irow, col=icol, block=fblock, found=found)
1243 CALL dbcsr_get_block_p(matrix=p_matrix, &
1244 row=irow, col=icol, block=pblock, found=found)
1245 cpassert(
ASSOCIATED(pblock))
1247 NULLIFY (dsblocks(i)%block)
1248 CALL dbcsr_get_block_p(matrix=matrix_s(i, ic)%matrix, &
1249 row=irow, col=icol, block=dsblocks(i)%block, found=found)
1254 basis_set_a => basis_set_list(ikind)%gto_basis_set
1255 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
1256 basis_set_b => basis_set_list(jkind)%gto_basis_set
1257 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
1258 atom_a = atom_of_kind(iatom)
1259 atom_b = atom_of_kind(jatom)
1261 first_sgfa => basis_set_a%first_sgf
1262 la_max => basis_set_a%lmax
1263 la_min => basis_set_a%lmin
1264 npgfa => basis_set_a%npgf
1265 nseta = basis_set_a%nset
1266 nsgfa => basis_set_a%nsgf_set
1267 rpgfa => basis_set_a%pgf_radius
1268 set_radius_a => basis_set_a%set_radius
1269 scon_a => basis_set_a%scon
1270 zeta => basis_set_a%zet
1272 first_sgfb => basis_set_b%first_sgf
1273 lb_max => basis_set_b%lmax
1274 lb_min => basis_set_b%lmin
1275 npgfb => basis_set_b%npgf
1276 nsetb = basis_set_b%nset
1277 nsgfb => basis_set_b%nsgf_set
1278 rpgfb => basis_set_b%pgf_radius
1279 set_radius_b => basis_set_b%set_radius
1280 scon_b => basis_set_b%scon
1281 zetb => basis_set_b%zet
1283 ldsab = get_memory_usage(qs_kind_set,
"ORB",
"ORB")
1284 ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
1285 ALLOCATE (sint(natorb_a, natorb_b, maxder))
1289 ncoa = npgfa(iset)*
ncoset(la_max(iset))
1290 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
1291 sgfa = first_sgfa(1, iset)
1293 IF (set_radius_a(iset) + set_radius_b(jset) < dr) cycle
1294 ncob = npgfb(jset)*
ncoset(lb_max(jset))
1295 n2 = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
1296 sgfb = first_sgfb(1, jset)
1297 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1298 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
1299 rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
1302 CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
1303 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
1304 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.false.)
1309 IF (iatom <= jatom)
THEN
1310 sblock(:, :) = sblock(:, :) + sint(:, :, 1)
1312 sblock(:, :) = sblock(:, :) + transpose(sint(:, :, 1))
1315 IF (iatom <= jatom)
THEN
1316 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
1318 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - transpose(sint(:, :, i))
1323 rcovab = rcova + rcovb
1324 rrab = sqrt(dr/rcovab)
1326 pia(i) = 1._dp + kpolya(i)*rrab
1329 pib(i) = 1._dp + kpolyb(i)*rrab
1331 IF (dr > 1.e-6_dp)
THEN
1332 drx = 0.5_dp/rrab/rcovab
1336 dpia(1:nsa) = drx*kpolya(1:nsa)
1337 dpib(1:nsb) = drx*kpolyb(1:nsb)
1341 IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .true.
1348 fblock(i, i) = fblock(i, i) + huckel(na, iatom)
1355 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
1356 IF (iatom <= jatom)
THEN
1357 fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1359 fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1366 IF (irow == iatom) f0 = -1.0_dp
1375 fhud = fhud + pblock(i, i)*kcnlk(la, ikind)*hena(na)
1384 hij = 0.5_dp*pia(na)*pib(nb)
1385 IF (iatom <= jatom)
THEN
1386 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(la, ikind)*hena(na)
1387 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(lb, jkind)*henb(nb)
1389 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(la, ikind)*hena(na)
1390 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(lb, jkind)*henb(nb)
1394 IF (iatom /= jatom)
THEN
1400 atom_a = atom_of_kind(iatom)
1401 DO i = 1, dcnum(iatom)%neighbors
1402 katom = dcnum(iatom)%nlist(i)
1403 kkind = kind_of(katom)
1404 atom_c = atom_of_kind(katom)
1405 rik = dcnum(iatom)%rik(:, i)
1406 drk = sqrt(sum(rik(:)**2))
1407 IF (drk > 1.e-3_dp)
THEN
1408 fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
1409 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
1410 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
1411 fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
1412 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
1413 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
1417 atom_b = atom_of_kind(jatom)
1418 DO i = 1, dcnum(jatom)%neighbors
1419 katom = dcnum(jatom)%nlist(i)
1420 kkind = kind_of(katom)
1421 atom_c = atom_of_kind(katom)
1422 rik = dcnum(jatom)%rik(:, i)
1423 drk = sqrt(sum(rik(:)**2))
1424 IF (drk > 1.e-3_dp)
THEN
1425 fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
1426 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
1427 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
1434 n1 =
SIZE(fblock, 1)
1435 n2 =
SIZE(fblock, 2)
1436 ALLOCATE (dfblock(n1, n2))
1444 dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
1445 IF (iatom <= jatom)
THEN
1446 dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1448 dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1452 dfp = f0*sum(dfblock(:, :)*pblock(:, :))
1454 foab = 2.0_dp*dfp*rij(ir)/dr
1462 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
1463 IF (iatom <= jatom)
THEN
1464 foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
1466 foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
1472 DEALLOCATE (dfblock)
1475 atom_a = atom_of_kind(iatom)
1476 atom_b = atom_of_kind(jatom)
1477 IF (irow == iatom) force_ab = -force_ab
1478 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
1479 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
1481 DEALLOCATE (oint, owork, sint)
1486 DO i = 1,
SIZE(matrix_h, 1)
1488 CALL dbcsr_finalize(matrix_h(i, img)%matrix)
1489 CALL dbcsr_finalize(matrix_s(i, img)%matrix)
1496 DEALLOCATE (cnumbers)
1498 DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
1507 DEALLOCATE (basis_set_list)
1509 CALL timestop(handle)
1521 TYPE(qs_environment_type),
POINTER :: qs_env
1522 LOGICAL,
INTENT(in) :: calculate_forces, just_energy
1523 TYPE(dbcsr_p_type),
DIMENSION(:),
OPTIONAL, &
1524 POINTER :: ext_ks_matrix
1526 CHARACTER(len=*),
PARAMETER :: routinen =
'build_xtb_ks_matrix'
1528 INTEGER :: atom_a, handle, iatom, ikind, img, &
1529 iounit, is, ispin, na, natom, natorb, &
1530 nimg, nkind, ns, nsgf, nspins
1531 INTEGER,
DIMENSION(25) :: lao
1532 INTEGER,
DIMENSION(5) :: occ
1533 LOGICAL :: do_efield, pass_check
1534 REAL(kind=
dp) :: achrg, chmax, pc_ener, qmmm_el
1535 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge
1536 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, charges
1537 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1538 TYPE(cp_logger_type),
POINTER :: logger
1539 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_p1, mo_derivs, p_matrix
1540 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix, matrix_h, matrix_p, matrix_s
1541 TYPE(dbcsr_type),
POINTER :: mo_coeff, s_matrix
1542 TYPE(dft_control_type),
POINTER :: dft_control
1543 TYPE(mp_para_env_type),
POINTER :: para_env
1544 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1545 TYPE(qs_energy_type),
POINTER :: energy
1546 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1547 TYPE(qs_ks_env_type),
POINTER :: ks_env
1548 TYPE(qs_rho_type),
POINTER :: rho
1549 TYPE(qs_scf_env_type),
POINTER :: scf_env
1550 TYPE(section_vals_type),
POINTER :: scf_section
1551 TYPE(xtb_atom_type),
POINTER :: xtb_kind
1553 CALL timeset(routinen, handle)
1555 NULLIFY (dft_control, logger, scf_section, matrix_p, particle_set, ks_env, &
1556 ks_matrix, rho, energy)
1557 cpassert(
ASSOCIATED(qs_env))
1563 dft_control=dft_control, &
1564 atomic_kind_set=atomic_kind_set, &
1565 qs_kind_set=qs_kind_set, &
1566 matrix_h_kp=matrix_h, &
1567 para_env=para_env, &
1569 matrix_ks_kp=ks_matrix, &
1573 IF (
PRESENT(ext_ks_matrix))
THEN
1576 ns =
SIZE(ext_ks_matrix)
1577 ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
1580 energy%hartree = 0.0_dp
1581 energy%qmmm_el = 0.0_dp
1582 energy%efield = 0.0_dp
1585 nspins = dft_control%nspins
1586 nimg = dft_control%nimages
1587 cpassert(
ASSOCIATED(matrix_h))
1588 cpassert(
ASSOCIATED(rho))
1589 cpassert(
SIZE(ks_matrix) > 0)
1591 DO ispin = 1, nspins
1594 CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
1598 IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
1599 dft_control%apply_efield_field)
THEN
1605 IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield)
THEN
1607 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
1609 natom =
SIZE(particle_set)
1610 ALLOCATE (mcharge(natom), charges(natom, 5))
1612 nkind =
SIZE(atomic_kind_set)
1614 ALLOCATE (aocg(nsgf, natom))
1617 CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
1619 p_matrix => matrix_p(:, 1)
1620 s_matrix => matrix_s(1, 1)%matrix
1621 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1625 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1628 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1629 charges(atom_a, :) = real(occ(:), kind=
dp)
1632 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1638 IF (dft_control%qs_control%do_ls_scf)
THEN
1641 CALL get_qs_env(qs_env=qs_env, scf_env=scf_env)
1642 CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
1643 charges, para_env, scf_env%iter_count)
1647 mcharge(iatom) = sum(charges(iatom, :))
1651 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
1653 calculate_forces, just_energy)
1657 CALL efield_tb_matrix(qs_env, ks_matrix, rho, mcharge, energy, calculate_forces, just_energy)
1660 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
1661 IF (dft_control%qs_control%xtb_control%check_atomic_charges)
THEN
1665 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1668 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1669 achrg = mcharge(atom_a)
1670 IF (abs(achrg) > chmax)
THEN
1671 IF (iounit > 0)
THEN
1672 WRITE (iounit,
"(A,A,I3,I6,A,F4.2,A,F6.2)")
" Charge outside chemical range:", &
1673 " Kind Atom=", ikind, atom_a,
" Limit=", chmax,
" Charge=", achrg
1675 pass_check = .false.
1679 IF (.NOT. pass_check)
THEN
1680 CALL cp_warn(__location__,
"Atomic charges outside chemical range were detected."// &
1681 " Switch-off CHECK_ATOMIC_CHARGES keyword in the &xTB section"// &
1682 " if you want to force to continue the calculation.")
1683 cpabort(
"xTB Charges")
1688 IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield)
THEN
1689 DEALLOCATE (mcharge, charges)
1692 IF (qs_env%qmmm)
THEN
1693 cpassert(
SIZE(ks_matrix, 2) == 1)
1694 DO ispin = 1, nspins
1696 CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1700 CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1701 matrix_p1(ispin)%matrix, qmmm_el)
1702 energy%qmmm_el = energy%qmmm_el + qmmm_el
1704 pc_ener = qs_env%ks_qmmm_env%pc_ener
1705 energy%qmmm_el = energy%qmmm_el + pc_ener
1708 energy%total = energy%core + energy%hartree + energy%efield + energy%qmmm_el + &
1709 energy%repulsive + energy%dispersion + energy%dftb3
1712 extension=
".scfLog")
1713 IF (iounit > 0)
THEN
1714 WRITE (unit=iounit, fmt=
"(/,(T9,A,T60,F20.10))") &
1715 "Repulsive pair potential energy: ", energy%repulsive, &
1716 "Zeroth order Hamiltonian energy: ", energy%core, &
1717 "Charge fluctuation energy: ", energy%hartree, &
1718 "London dispersion energy: ", energy%dispersion
1719 IF (dft_control%qs_control%xtb_control%xb_interaction) &
1720 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
1721 "Correction for halogen bonding: ", energy%xtb_xb_inter
1722 IF (dft_control%qs_control%xtb_control%do_nonbonded) &
1723 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
1724 "Correction for nonbonded interactions: ", energy%xtb_nonbonded
1725 IF (abs(energy%efield) > 1.e-12_dp)
THEN
1726 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
1727 "Electric field interaction energy: ", energy%efield
1729 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
1730 "DFTB3 3rd Order Energy Correction ", energy%dftb3
1731 IF (qs_env%qmmm)
THEN
1732 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
1733 "QM/MM Electrostatic energy: ", energy%qmmm_el
1737 "PRINT%DETAILED_ENERGY")
1739 IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy)
THEN
1740 cpassert(
SIZE(ks_matrix, 2) == 1)
1742 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mo_array
1743 CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
1744 DO ispin = 1,
SIZE(mo_derivs)
1745 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
1746 IF (.NOT. mo_array(ispin)%use_mo_coeff_b)
THEN
1749 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
1750 0.0_dp, mo_derivs(ispin)%matrix)
1755 CALL timestop(handle)
1768 SUBROUTINE xb_neighbors(neighbor_atoms, para_env)
1770 INTENT(INOUT) :: neighbor_atoms
1771 TYPE(mp_para_env_type),
POINTER :: para_env
1773 INTEGER :: iatom, ikind, natom, nkind
1774 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: matom
1775 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: dmloc
1776 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: coord
1778 nkind =
SIZE(neighbor_atoms)
1780 IF (
ASSOCIATED(neighbor_atoms(ikind)%rab))
THEN
1781 natom =
SIZE(neighbor_atoms(ikind)%rab)
1782 ALLOCATE (dmloc(2*natom), matom(natom), coord(3, natom))
1785 dmloc(2*iatom - 1) = neighbor_atoms(ikind)%rab(iatom)
1786 dmloc(2*iatom) = real(para_env%mepos, kind=dp)
1788 CALL para_env%minloc(dmloc)
1792 neighbor_atoms(ikind)%rab(iatom) = dmloc(2*iatom - 1)
1793 IF (nint(dmloc(2*iatom)) == para_env%mepos)
THEN
1794 coord(1:3, iatom) = neighbor_atoms(ikind)%coord(1:3, iatom)
1795 matom(iatom) = neighbor_atoms(ikind)%katom(iatom)
1798 CALL para_env%sum(coord)
1799 neighbor_atoms(ikind)%coord(1:3, :) = coord(1:3, :)
1800 CALL para_env%sum(matom)
1801 neighbor_atoms(ikind)%katom(:) = matom(:)
1802 DEALLOCATE (dmloc, matom, coord)
1806 END SUBROUTINE xb_neighbors
1825 SUBROUTINE nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
1826 atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
1827 REAL(dp),
INTENT(INOUT) :: enonbonded
1828 TYPE(qs_force_type),
DIMENSION(:),
INTENT(INOUT), &
1830 TYPE(qs_environment_type),
POINTER :: qs_env
1831 TYPE(xtb_control_type),
POINTER :: xtb_control
1832 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1833 INTENT(IN),
POINTER :: sab_xtb_nonbond
1834 TYPE(atomic_kind_type),
DIMENSION(:),
INTENT(IN), &
1835 POINTER :: atomic_kind_set
1836 LOGICAL,
INTENT(IN) :: calculate_forces, use_virial
1837 TYPE(virial_type),
INTENT(IN),
POINTER :: virial
1838 TYPE(atprop_type),
INTENT(IN),
POINTER :: atprop
1839 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind
1841 CHARACTER(len=*),
PARAMETER :: routinen =
'nonbonded_correction'
1843 CHARACTER(LEN=default_string_length) :: def_error, this_error
1844 INTEGER :: atom_i, atom_j, handle, iatom, ikind, &
1845 jatom, jkind, kk, ntype
1846 INTEGER,
DIMENSION(3) :: cell
1848 REAL(kind=dp) :: dedf, dr, dx, energy_cutoff, err, fval, &
1850 REAL(kind=dp),
DIMENSION(3) :: fij, rij
1851 TYPE(ewald_environment_type),
POINTER :: ewald_env
1852 TYPE(neighbor_list_iterator_p_type), &
1853 DIMENSION(:),
POINTER :: nl_iterator
1854 TYPE(pair_potential_p_type),
POINTER :: nonbonded
1855 TYPE(pair_potential_pp_type),
POINTER :: potparm
1856 TYPE(pair_potential_single_type),
POINTER :: pot
1857 TYPE(section_vals_type),
POINTER :: nonbonded_section
1859 CALL timeset(routinen, handle)
1864 nonbonded => xtb_control%nonbonded
1865 do_ewald = xtb_control%do_ewald
1866 CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
1868 ntype =
SIZE(atomic_kind_set)
1869 CALL pair_potential_pp_create(potparm, ntype)
1871 CALL force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
1873 CALL init_genpot(potparm, ntype)
1877 energy_cutoff = 0._dp
1879 CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_nonbond)
1880 DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
1881 CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
1882 iatom=iatom, jatom=jatom, r=rij, cell=cell)
1883 pot => potparm%pot(ikind, jkind)%pot
1884 dr = sqrt(rij(1)**2 + rij(2)**2 + rij(3)**2)
1885 rcut = sqrt(pot%rcutsq)
1886 IF (dr <= rcut .AND. dr > 1.e-3_dp)
THEN
1888 IF (ikind == jkind) fval = 0.5_dp
1890 enonbonded = enonbonded + fval*ener_pot(pot, dr, energy_cutoff)
1891 IF (atprop%energy)
THEN
1892 atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
1893 atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
1897 IF (calculate_forces)
THEN
1901 CALL cp_warn(__location__,
"Generic potential with type > 1 not implemented.")
1905 IF ((pot%set(kk)%rmin /= not_initialized) .AND. (dr < pot%set(kk)%rmin)) cycle
1907 IF ((pot%set(kk)%rmax /= not_initialized) .AND. (dr >= pot%set(kk)%rmax)) cycle
1909 IF (dr <= rcut .AND. dr > 1.e-3_dp)
THEN
1911 NULLIFY (nonbonded_section)
1912 nonbonded_section => section_vals_get_subs_vals(qs_env%input,
"DFT%QS%xTB%NONBONDED")
1913 CALL section_vals_val_get(nonbonded_section,
"DX", r_val=dx)
1914 CALL section_vals_val_get(nonbonded_section,
"ERROR_LIMIT", r_val=lerr)
1916 dedf = fval*evalfd(pot%set(kk)%gp%myid, 1, pot%set(kk)%gp%values, dx, err)
1917 IF (abs(err) > lerr)
THEN
1918 WRITE (this_error,
"(A,G12.6,A)")
"(", err,
")"
1919 WRITE (def_error,
"(A,G12.6,A)")
"(", lerr,
")"
1920 CALL compress(this_error, .true.)
1921 CALL compress(def_error, .true.)
1922 CALL cp_warn(__location__, &
1923 'ASSERTION (cond) failed at line '//cp_to_string(__line__)// &
1924 ' Error '//trim(this_error)//
' in computing numerical derivatives larger then'// &
1925 trim(def_error)//
' .')
1928 atom_i = atom_of_kind(iatom)
1929 atom_j = atom_of_kind(jatom)
1931 fij(1:3) = dedf*rij(1:3)/pot%set(kk)%gp%values(1)
1933 force(ikind)%repulsive(:, atom_i) = force(ikind)%repulsive(:, atom_i) - fij(:)
1934 force(jkind)%repulsive(:, atom_j) = force(jkind)%repulsive(:, atom_j) + fij(:)
1936 IF (use_virial)
THEN
1937 CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
1938 IF (atprop%stress)
THEN
1939 CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
1940 CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
1948 CALL neighbor_list_iterator_release(nl_iterator)
1951 IF (
ASSOCIATED(potparm))
THEN
1952 CALL pair_potential_pp_release(potparm)
1955 CALL timestop(handle)
1957 END SUBROUTINE nonbonded_correction
1966 SUBROUTINE force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
1969 TYPE(atomic_kind_type),
DIMENSION(:),
INTENT(IN), &
1970 POINTER :: atomic_kind_set
1971 TYPE(pair_potential_p_type),
INTENT(IN),
POINTER :: nonbonded
1972 TYPE(pair_potential_pp_type),
INTENT(INOUT), &
1974 TYPE(ewald_environment_type),
INTENT(IN),
POINTER :: ewald_env
1975 LOGICAL,
INTENT(IN) :: do_ewald
1977 CHARACTER(LEN=default_string_length) :: name_atm_a, name_atm_a_local, &
1978 name_atm_b, name_atm_b_local
1979 INTEGER :: ikind, ingp, iw, jkind
1981 REAL(kind=dp) :: ewald_rcut
1982 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1983 TYPE(cp_logger_type),
POINTER :: logger
1984 TYPE(pair_potential_single_type),
POINTER :: pot
1986 NULLIFY (pot, logger)
1988 logger => cp_get_default_logger()
1989 iw = cp_logger_get_default_io_unit(logger)
1991 DO ikind = 1,
SIZE(atomic_kind_set)
1992 atomic_kind => atomic_kind_set(ikind)
1993 CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_a_local)
1994 DO jkind = ikind,
SIZE(atomic_kind_set)
1995 atomic_kind => atomic_kind_set(jkind)
1996 CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_b_local)
1998 name_atm_a = name_atm_a_local
1999 name_atm_b = name_atm_b_local
2002 pot => potparm%pot(ikind, jkind)%pot
2003 IF (
ASSOCIATED(nonbonded))
THEN
2004 DO ingp = 1,
SIZE(nonbonded%pot)
2005 IF ((trim(nonbonded%pot(ingp)%pot%at1) ==
"*") .OR. &
2006 (trim(nonbonded%pot(ingp)%pot%at2) ==
"*")) cycle
2011 IF ((((name_atm_a) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
2012 ((name_atm_b) == (nonbonded%pot(ingp)%pot%at2))) .OR. &
2013 (((name_atm_b) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
2014 ((name_atm_a) == (nonbonded%pot(ingp)%pot%at2))))
THEN
2015 CALL pair_potential_single_copy(nonbonded%pot(ingp)%pot, pot)
2018 CALL cp_warn(__location__, &
2019 "Multiple NONBONDED declaration: "//trim(name_atm_a)// &
2020 " and "//trim(name_atm_b)//
" OVERWRITING! ")
2026 IF (.NOT. found)
THEN
2027 CALL pair_potential_single_clean(pot)
2035 CALL ewald_env_get(ewald_env, rcut=ewald_rcut)
2036 pot%rcutsq = max(pot%rcutsq, ewald_rcut*ewald_rcut)
2040 END SUBROUTINE force_field_pack_nonbond_pot_correction
2061 SUBROUTINE xb_interaction(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
2062 calculate_forces, use_virial, force, virial, atprop)
2063 REAL(dp),
INTENT(INOUT) :: exb
2065 INTENT(IN) :: neighbor_atoms
2066 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind, kind_of
2067 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2069 REAL(dp),
DIMENSION(:),
INTENT(IN) :: kx
2070 REAL(dp),
INTENT(IN) :: kx2
2071 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: rcab
2072 LOGICAL,
INTENT(IN) :: calculate_forces, use_virial
2073 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
2074 TYPE(virial_type),
POINTER :: virial
2075 TYPE(atprop_type),
POINTER :: atprop
2077 INTEGER :: atom_a, atom_b, atom_c, iatom, ikind, &
2078 jatom, jkind, katom, kkind
2079 INTEGER,
DIMENSION(3) :: cell
2080 REAL(kind=dp) :: alp, aterm, cosa, daterm, ddab, ddax, &
2081 ddbx, ddr, ddr12, ddr6, deval, dr, &
2082 drab, drax, drbx, eval, xy
2083 REAL(kind=dp),
DIMENSION(3) :: fia, fij, fja, ria, rij, rja
2084 TYPE(neighbor_list_iterator_p_type), &
2085 DIMENSION(:),
POINTER :: nl_iterator
2090 CALL neighbor_list_iterator_create(nl_iterator, sab_xb)
2091 DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
2092 CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
2093 iatom=iatom, jatom=jatom, r=rij, cell=cell)
2096 atom_a = atom_of_kind(iatom)
2097 katom = neighbor_atoms(ikind)%katom(atom_a)
2098 IF (katom == 0) cycle
2099 dr = sqrt(rij(1)**2 + rij(2)**2 + rij(3)**2)
2100 ddr = rcab(ikind, jkind)/dr
2103 eval = kx(ikind)*(ddr12 - kx2*ddr6)/(1.0_dp + ddr12)
2105 ria(1:3) = neighbor_atoms(ikind)%coord(1:3, atom_a)
2106 rja(1:3) = rij(1:3) - ria(1:3)
2107 drax = ria(1)**2 + ria(2)**2 + ria(3)**2
2109 drab = rja(1)**2 + rja(2)**2 + rja(3)**2
2110 xy = sqrt(drbx*drax)
2112 cosa = (drbx + drax - drab)/xy
2113 aterm = (0.5_dp - 0.25_dp*cosa)**alp
2115 exb = exb + aterm*eval
2116 IF (atprop%energy)
THEN
2117 atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*aterm*eval
2118 atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*aterm*eval
2121 IF (calculate_forces)
THEN
2122 kkind = kind_of(katom)
2123 atom_b = atom_of_kind(jatom)
2124 atom_c = atom_of_kind(katom)
2126 deval = 6.0_dp*kx(ikind)*ddr6*(kx2*ddr12 + 2.0_dp*ddr6 - kx2)/(1.0_dp + ddr12)**2
2127 deval = -rcab(ikind, jkind)*deval/(dr*dr)/ddr
2128 fij(1:3) = aterm*deval*rij(1:3)/dr
2129 force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:)
2130 force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:)
2131 IF (use_virial)
THEN
2132 CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
2133 IF (atprop%stress)
THEN
2134 CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
2135 CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
2142 daterm = -0.25_dp*alp*(0.5_dp - 0.25_dp*cosa)**(alp - 1.0_dp)
2143 ddbx = 0.5_dp*(drab - drax + drbx)/xy/drbx
2144 ddax = 0.5_dp*(drab + drax - drbx)/xy/drax
2146 fij(1:3) = 2.0_dp*daterm*ddbx*rij(1:3)*eval
2147 fia(1:3) = 2.0_dp*daterm*ddax*ria(1:3)*eval
2148 fja(1:3) = 2.0_dp*daterm*ddab*rja(1:3)*eval
2149 force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:) - fia(:)
2150 force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:) + fja(:)
2151 force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fia(:) - fja(:)
2152 IF (use_virial)
THEN
2153 CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
2154 CALL virial_pair_force(virial%pv_virial, -1._dp, fia, ria)
2155 CALL virial_pair_force(virial%pv_virial, -1._dp, fja, rja)
2156 IF (atprop%stress)
THEN
2157 CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
2158 CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
2159 CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fia, ria)
2160 CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fia, ria)
2161 CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fja, rja)
2162 CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fja, rja)
2167 CALL neighbor_list_iterator_release(nl_iterator)
2169 END SUBROUTINE xb_interaction
2176 FUNCTION metal(z)
RESULT(ismetal)
2183 CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
2194 FUNCTION early3d(z)
RESULT(isearly3d)
2196 LOGICAL :: isearly3d
2199 IF (z >= 21 .AND. z <= 24) isearly3d = .true.
2201 END FUNCTION early3d
subroutine uppercase(string)
...
Set of routines to: Contract integrals over primitive Gaussians Decontract (density) matrices Trace m...
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Holds information on atomic properties.
subroutine, public atprop_array_init(atarray, natom)
...
collect pointers to a block of reals
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Calculation of electric field contributions in TB.
subroutine, public efield_tb_matrix(qs_env, ks_matrix, rho, mcharge, energy, calculate_forces, just_energy)
...
subroutine, public ewald_env_get(ewald_env, ewald_type, alpha, eps_pol, epsilon, gmax, ns_max, o_spline, group, para_env, poisson_section, precs, rcut, do_multipoles, max_multipole, do_ipol, max_ipol_iter, interaction_cutoffs, cell_hmat)
Purpose: Get the EWALD environment.
This public domain function parser module is intended for applications where a set of mathematical ex...
real(kind=rn) function, public evalfd(id_fun, ipar, vals, h, err)
Evaluates derivatives.
subroutine, public finalizef()
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
subroutine, public pair_potential_pp_release(potparm)
Release Data-structure that constains potential parameters.
subroutine, public pair_potential_single_copy(potparm_source, potparm_dest)
Copy two potential parameter type.
subroutine, public pair_potential_single_clean(potparm)
Cleans the potential parameter type.
real(kind=dp), parameter, public not_initialized
subroutine, public pair_potential_pp_create(potparm, nkinds)
Data-structure that constains potential parameters.
real(kind=dp) function, public ener_pot(pot, r, energy_cutoff)
Evaluates the nonbond potential energy for the implemented FF kinds.
subroutine, public init_genpot(potparm, ntype)
Initialize genpot.
Define the data structure for the particle information.
subroutine, public charge_mixing(mixing_method, mixing_store, charges, para_env, iter_count)
Driver for the charge mixing, calls the proper routine given the requested method.
Calculation of overlap matrix condition numbers.
subroutine, public overlap_condnum(matrixkp_s, condnum, iunit, norml1, norml2, use_arnoldi, blacs_env)
Calculation of the overlap matrix Condition Number.
Calculation of dispersion using pair potentials.
subroutine, public dcnum_distribute(dcnum, para_env)
...
subroutine, public d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, calculate_forces, debugall)
...
Definition of disperson types for DFT calculations.
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_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, 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, rhs)
Get the QUICKSTEP environment.
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr)
Get attributes of an atomic kind set.
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
Calculation of overlap matrix, its derivatives and forces.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
module that contains the definitions of the scf types
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
pure subroutine, public virial_pair_force(pv_virial, f0, force, rab)
Computes the contribution to the stress tensor from two-body pair-wise forces.
Calculation of Coulomb contributions in xTB.
subroutine, public build_xtb_coulomb(qs_env, ks_matrix, rho, charges, mcharge, energy, calculate_forces, just_energy)
...
Calculation of Overlap and Hamiltonian matrices in xTB Reference: Stefan Grimme, Christoph Bannwarth,...
subroutine, public build_xtb_matrices(qs_env, para_env, calculate_forces)
...
subroutine, public xtb_hab_force(qs_env, p_matrix)
...
subroutine, public build_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
...
real(kind=dp) function, public xtb_set_kab(za, zb, xtb_control)
...
Definition of the xTB parameter types.
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, occupation, electronegativity, chmax)
...