84 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_xtb_hab_force'
86 INTEGER :: atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, iset, &
87 j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, maxder, n1, n2, na, natom, natorb_a, &
88 natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, nsb, nseta, nsetb, sgfa, sgfb, &
90 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
91 INTEGER,
DIMENSION(25) :: laoa, laob, naoa, naob
92 INTEGER,
DIMENSION(3) :: cell
93 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
95 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
96 LOGICAL :: defined, diagblock, found, use_virial
97 REAL(kind=
dp) :: dfp, dhij, dr, drk, drx, f0, fhua, fhub, &
98 fhud, foab, hij, rcova, rcovab, rcovb, &
100 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cnumbers
101 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dfblock, dhuckel, huckel, owork
102 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: oint, sint
103 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: kijab
104 REAL(kind=
dp),
DIMENSION(3) :: fdik, fdika, fdikb, force_ab, rij, rik
105 REAL(kind=
dp),
DIMENSION(5) :: dpia, dpib, kpolya, kpolyb, pia, pib
106 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
107 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
108 scon_a, scon_b, zeta, zetb
112 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_s
113 TYPE(
dcnum_type),
ALLOCATABLE,
DIMENSION(:) :: dcnum
119 DIMENSION(:),
POINTER :: nl_iterator
124 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
129 CALL timeset(routinen, handle)
134 NULLIFY (matrix_h, matrix_s, atomic_kind_set, qs_kind_set, sab_orb)
137 atomic_kind_set=atomic_kind_set, &
138 qs_kind_set=qs_kind_set, &
139 dft_control=dft_control, &
143 cpassert(dft_control%qs_control%xtb_control%gfn_type == 1)
145 nkind =
SIZE(atomic_kind_set)
146 xtb_control => dft_control%qs_control%xtb_control
147 nimg = dft_control%nimages
149 maxder =
ncoset(nderivatives)
151 NULLIFY (particle_set)
152 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
153 natom =
SIZE(particle_set)
155 atom_of_kind=atom_of_kind, kind_of=kind_of)
163 ALLOCATE (basis_set_list(nkind))
169 CALL create_sab_matrix(ks_env, matrix_s,
"xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
174 ALLOCATE (matrix_h(1, img)%matrix)
175 CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
176 name=
"HAMILTONIAN MATRIX")
186 CALL gfn1_huckel(qs_env, cnumbers, huckel, dhuckel, .true.)
195 iatom=iatom, jatom=jatom, r=rij, cell=cell)
196 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
198 IF (.NOT. defined .OR. natorb_a < 1) cycle
199 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
201 IF (.NOT. defined .OR. natorb_b < 1) cycle
203 dr = sqrt(sum(rij(:)**2))
207 nshell=nsa, kpoly=kpolya)
209 nshell=nsb, kpoly=kpolyb)
212 icol = max(iatom, jatom)
213 irow = min(iatom, jatom)
214 NULLIFY (sblock, fblock)
216 row=irow, col=icol, block=sblock, found=found)
219 row=irow, col=icol, block=fblock, found=found)
224 row=irow, col=icol, block=pblock, found=found)
225 cpassert(
ASSOCIATED(pblock))
227 NULLIFY (dsblocks(i)%block)
229 row=irow, col=icol, block=dsblocks(i)%block, found=found)
234 basis_set_a => basis_set_list(ikind)%gto_basis_set
235 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
236 basis_set_b => basis_set_list(jkind)%gto_basis_set
237 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
238 atom_a = atom_of_kind(iatom)
239 atom_b = atom_of_kind(jatom)
241 first_sgfa => basis_set_a%first_sgf
242 la_max => basis_set_a%lmax
243 la_min => basis_set_a%lmin
244 npgfa => basis_set_a%npgf
245 nseta = basis_set_a%nset
246 nsgfa => basis_set_a%nsgf_set
247 rpgfa => basis_set_a%pgf_radius
248 set_radius_a => basis_set_a%set_radius
249 scon_a => basis_set_a%scon
250 zeta => basis_set_a%zet
252 first_sgfb => basis_set_b%first_sgf
253 lb_max => basis_set_b%lmax
254 lb_min => basis_set_b%lmin
255 npgfb => basis_set_b%npgf
256 nsetb = basis_set_b%nset
257 nsgfb => basis_set_b%nsgf_set
258 rpgfb => basis_set_b%pgf_radius
259 set_radius_b => basis_set_b%set_radius
260 scon_b => basis_set_b%scon
261 zetb => basis_set_b%zet
264 ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
265 ALLOCATE (sint(natorb_a, natorb_b, maxder))
269 ncoa = npgfa(iset)*
ncoset(la_max(iset))
270 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
271 sgfa = first_sgfa(1, iset)
273 IF (set_radius_a(iset) + set_radius_b(jset) < dr) cycle
274 ncob = npgfb(jset)*
ncoset(lb_max(jset))
275 n2 = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
276 sgfb = first_sgfb(1, jset)
277 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
278 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
279 rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
282 CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
283 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
284 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.false.)
289 IF (iatom <= jatom)
THEN
290 sblock(:, :) = sblock(:, :) + sint(:, :, 1)
292 sblock(:, :) = sblock(:, :) + transpose(sint(:, :, 1))
295 IF (iatom <= jatom)
THEN
296 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
298 dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - transpose(sint(:, :, i))
303 rcovab = rcova + rcovb
304 rrab = sqrt(dr/rcovab)
305 pia(1:nsa) = 1._dp + kpolya(1:nsa)*rrab
306 pib(1:nsb) = 1._dp + kpolyb(1:nsb)*rrab
307 IF (dr > 1.e-6_dp)
THEN
308 drx = 0.5_dp/rrab/rcovab
312 dpia(1:nsa) = drx*kpolya(1:nsa)
313 dpib(1:nsb) = drx*kpolyb(1:nsb)
317 IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .true.
324 fblock(i, i) = fblock(i, i) + huckel(na, iatom)
331 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
332 IF (iatom <= jatom)
THEN
333 fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
335 fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
342 IF (irow == iatom) f0 = -1.0_dp
351 fhud = fhud + pblock(i, i)*dhuckel(na, iatom)
360 hij = 0.5_dp*pia(na)*pib(nb)
361 IF (iatom <= jatom)
THEN
362 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*dhuckel(na, iatom)
363 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*dhuckel(nb, jatom)
365 fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*dhuckel(na, iatom)
366 fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*dhuckel(nb, jatom)
370 IF (iatom /= jatom)
THEN
376 atom_a = atom_of_kind(iatom)
377 DO i = 1, dcnum(iatom)%neighbors
378 katom = dcnum(iatom)%nlist(i)
379 kkind = kind_of(katom)
380 atom_c = atom_of_kind(katom)
381 rik = dcnum(iatom)%rik(:, i)
382 drk = sqrt(sum(rik(:)**2))
383 IF (drk > 1.e-3_dp)
THEN
384 fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
385 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
386 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
387 fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
388 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
389 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
393 atom_b = atom_of_kind(jatom)
394 DO i = 1, dcnum(jatom)%neighbors
395 katom = dcnum(jatom)%nlist(i)
396 kkind = kind_of(katom)
397 atom_c = atom_of_kind(katom)
398 rik = dcnum(jatom)%rik(:, i)
399 drk = sqrt(sum(rik(:)**2))
400 IF (drk > 1.e-3_dp)
THEN
401 fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
402 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
403 force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
412 ALLOCATE (dfblock(n1, n2))
420 dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
421 IF (iatom <= jatom)
THEN
422 dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
424 dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
428 dfp = f0*sum(dfblock(:, :)*pblock(:, :))
430 foab = 2.0_dp*dfp*rij(ir)/dr
438 hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
439 IF (iatom <= jatom)
THEN
440 foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
442 foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
451 atom_a = atom_of_kind(iatom)
452 atom_b = atom_of_kind(jatom)
453 IF (irow == iatom) force_ab = -force_ab
454 force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
455 force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
457 DEALLOCATE (oint, owork, sint)
462 DO i = 1,
SIZE(matrix_h, 1)
475 DEALLOCATE (huckel, dhuckel)
479 DEALLOCATE (basis_set_list)
481 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.
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, zatom, 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_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_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.