17 USE mctc_env,
ONLY: error_type
18 USE mctc_io,
ONLY: structure_type, new
19 USE mctc_io_symbols,
ONLY: symbol_to_number
20 USE tblite_basis_type,
ONLY: get_cutoff
21 USE tblite_container,
ONLY: container_cache
22 USE tblite_integral_multipole,
ONLY: multipole_cgto, multipole_grad_cgto, maxl, msao
23 USE tblite_scf_info,
ONLY: scf_info, atom_resolved, shell_resolved, &
24 orbital_resolved, not_used
25 USE tblite_scf_potential,
ONLY: potential_type, new_potential
26 USE tblite_wavefunction_type,
ONLY: wavefunction_type, new_wavefunction
27 USE tblite_xtb_calculator,
ONLY: xtb_calculator, new_xtb_calculator
28 USE tblite_xtb_gfn1,
ONLY: new_gfn1_calculator
29 USE tblite_xtb_gfn2,
ONLY: new_gfn2_calculator
30 USE tblite_xtb_h0,
ONLY: get_selfenergy, get_hamiltonian, get_occupation, &
31 get_hamiltonian_gradient, tb_hamiltonian
32 USE tblite_xtb_ipea1,
ONLY: new_ipea1_calculator
86#include "./base/base_uses.f90"
91 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tblite_interface'
93 INTEGER,
PARAMETER :: dip_n = 3
94 INTEGER,
PARAMETER :: quad_n = 6
115 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tblite_init_geometry'
119 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
120 INTEGER :: iatom, natom
121 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: xyz
122 INTEGER :: handle, ikind
123 INTEGER,
DIMENSION(3) :: periodic
124 LOGICAL,
DIMENSION(3) :: lperiod
126 CALL timeset(routinen, handle)
129 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, cell=cell, qs_kind_set=qs_kind_set)
132 natom =
SIZE(particle_set)
133 ALLOCATE (xyz(3, natom))
135 ALLOCATE (tb%el_num(natom))
138 xyz(:, iatom) = particle_set(iatom)%r(:)
139 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
140 CALL get_qs_kind(qs_kind_set(ikind), zatom=tb%el_num(iatom))
141 IF (tb%el_num(iatom) < 1 .OR. tb%el_num(iatom) > 85)
THEN
142 cpabort(
"only elements 1-85 are supported by tblite")
147 CALL get_cell(cell=cell, periodic=periodic)
148 lperiod(1) = periodic(1) == 1
149 lperiod(2) = periodic(2) == 1
150 lperiod(3) = periodic(3) == 1
153 CALL new(tb%mol, tb%el_num, xyz, lattice=cell%hmat, periodic=lperiod)
157 CALL timestop(handle)
162 cpabort(
"Built without TBLITE")
175 LOGICAL,
INTENT(in) :: do_grad
179 INTEGER,
PARAMETER :: nspin = 1
181 TYPE(scf_info) :: info
183 info = tb%calc%variable_info()
184 IF (info%charge > shell_resolved) cpabort(
"tblite: no support for orbital resolved charge")
185 IF (info%dipole > atom_resolved) cpabort(
"tblite: no support for shell resolved dipole moment")
186 IF (info%quadrupole > atom_resolved) &
187 cpabort(
"tblite: no support shell resolved quadrupole moment")
189 CALL new_wavefunction(tb%wfn, tb%mol%nat, tb%calc%bas%nsh, tb%calc%bas%nao, nspin, 0.0_dp)
191 CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
194 ALLOCATE (tb%e_hal(tb%mol%nat), tb%e_rep(tb%mol%nat), tb%e_disp(tb%mol%nat))
195 ALLOCATE (tb%e_scd(tb%mol%nat), tb%e_es(tb%mol%nat))
196 ALLOCATE (tb%selfenergy(tb%calc%bas%nsh))
198 IF (
ALLOCATED(tb%calc%ncoord))
ALLOCATE (tb%cn(tb%mol%nat))
200 IF (do_grad)
ALLOCATE (tb%grad(3, tb%mol%nat))
202 IF (
ALLOCATED(tb%grad))
THEN
203 IF (
ALLOCATED(tb%calc%ncoord))
THEN
204 ALLOCATE (tb%dcndr(3, tb%mol%nat, tb%mol%nat), tb%dcndL(3, 3, tb%mol%nat))
206 ALLOCATE (tb%dsedcn(tb%calc%bas%nsh))
212 cpabort(
"Built without TBLITE")
229 TYPE(error_type),
ALLOCATABLE :: error
233 cpabort(
"Unknown xtb type")
235 CALL new_gfn1_calculator(tb%calc, tb%mol, error)
237 CALL new_gfn2_calculator(tb%calc, tb%mol, error)
239 CALL new_ipea1_calculator(tb%calc, tb%mol, error)
245 cpabort(
"Built without TBLITE")
260 TYPE(container_cache) :: hcache, rcache
265 IF (
ALLOCATED(tb%grad))
THEN
270 IF (
ALLOCATED(tb%calc%halogen))
THEN
271 CALL tb%calc%halogen%update(tb%mol, hcache)
272 IF (
ALLOCATED(tb%grad))
THEN
273 CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal, &
276 CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal)
280 IF (
ALLOCATED(tb%calc%repulsion))
THEN
281 CALL tb%calc%repulsion%update(tb%mol, rcache)
282 IF (
ALLOCATED(tb%grad))
THEN
283 CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep, &
286 CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep)
290 IF (
ALLOCATED(tb%calc%dispersion))
THEN
291 CALL tb%calc%dispersion%update(tb%mol, tb%dcache)
292 IF (
ALLOCATED(tb%grad))
THEN
293 CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp, &
296 CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp)
300 CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
301 IF (
ALLOCATED(tb%calc%coulomb))
THEN
302 CALL tb%calc%coulomb%update(tb%mol, tb%cache)
305 IF (
ALLOCATED(tb%grad))
THEN
306 IF (
ALLOCATED(tb%calc%ncoord))
THEN
307 CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn, tb%dcndr, tb%dcndL)
309 CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
310 & tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
312 IF (
ALLOCATED(tb%calc%ncoord))
THEN
313 CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn)
315 CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
316 & tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
321 cpabort(
"Built without TBLITE")
344 NULLIFY (scf_section, logger)
350 energy%repulsive = sum(tb%e_rep)
351 energy%el_stat = sum(tb%e_es)
352 energy%dispersion = sum(tb%e_disp)
353 energy%dispersion_sc = sum(tb%e_scd)
354 energy%xtb_xb_inter = sum(tb%e_hal)
356 energy%total = energy%core + energy%repulsive + energy%el_stat + energy%dispersion &
357 + energy%dispersion_sc + energy%xtb_xb_inter + energy%kTS &
358 + energy%efield + energy%qmmm_el
363 WRITE (unit=iounit, fmt=
"(/,(T9,A,T60,F20.10))") &
364 "Repulsive pair potential energy: ", energy%repulsive, &
365 "Zeroth order Hamiltonian energy: ", energy%core, &
366 "Electrostatic energy: ", energy%el_stat, &
367 "Non-self consistent dispersion energy: ", energy%dispersion
368 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
369 "Self-consistent dispersion energy: ", energy%dispersion_sc
370 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
371 "Correction for halogen bonding: ", energy%xtb_xb_inter
372 IF (abs(energy%efield) > 1.e-12_dp)
THEN
373 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
374 "Electric field interaction energy: ", energy%efield
376 IF (qs_env%qmmm)
THEN
377 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
378 "QM/MM Electrostatic energy: ", energy%qmmm_el
382 "PRINT%DETAILED_ENERGY")
388 cpabort(
"Built without TBLITE")
405 CHARACTER(len=2),
INTENT(IN) :: element_symbol
407 INTEGER,
DIMENSION(5),
INTENT(out) :: occ
411 CHARACTER(LEN=default_string_length) :: sng
412 INTEGER :: ang, i_type, id_atom, ind_ao, ipgf, ish, &
413 ishell, ityp, maxl, mprim, natorb, &
420 CALL symbol_to_number(i_type, element_symbol)
421 DO id_atom = 1, tb%mol%nat
422 IF (i_type == tb%el_num(id_atom))
EXIT
425 param%symbol = element_symbol
426 param%defined = .true.
427 ityp = tb%mol%id(id_atom)
430 nset = tb%calc%bas%nsh_id(ityp)
434 mprim = max(mprim, tb%calc%bas%cgto(ishell, ityp)%nprim)
441 gto_basis_set%name = element_symbol//
"_STO-"//trim(sng)//
"G"
442 gto_basis_set%nset = nset
446 CALL reallocate(gto_basis_set%nshell, 1, nset)
447 CALL reallocate(gto_basis_set%n, 1, 1, 1, nset)
448 CALL reallocate(gto_basis_set%l, 1, 1, 1, nset)
449 CALL reallocate(gto_basis_set%zet, 1, mprim, 1, nset)
450 CALL reallocate(gto_basis_set%gcc, 1, mprim, 1, 1, 1, nset)
455 ang = tb%calc%bas%cgto(ishell, ityp)%ang
456 natorb = natorb + (2*ang + 1)
457 param%lval(ishell) = ang
458 maxl = max(ang, maxl)
459 gto_basis_set%lmax(ishell) = ang
460 gto_basis_set%lmin(ishell) = ang
461 gto_basis_set%npgf(ishell) = tb%calc%bas%cgto(ishell, ityp)%nprim
462 gto_basis_set%nshell(ishell) = nshell
463 gto_basis_set%n(1, ishell) = ang + 1
464 gto_basis_set%l(1, ishell) = ang
465 DO ipgf = 1, gto_basis_set%npgf(ishell)
466 gto_basis_set%gcc(ipgf, 1, ishell) = tb%calc%bas%cgto(ishell, ityp)%coeff(ipgf)
467 gto_basis_set%zet(ipgf, ishell) = tb%calc%bas%cgto(ishell, ityp)%alpha(ipgf)
469 DO ipgf = 1, (2*ang + 1)
471 param%lao(ind_ao) = ang
472 param%nao(ind_ao) = ishell
480 param%rcut = get_cutoff(tb%calc%bas)
481 param%natorb = natorb
486 DO ish = 1, min(tb%calc%bas%nsh_at(id_atom), 5)
487 occ(ish) = nint(tb%calc%h0%refocc(ish, ityp))
488 param%occupation(ish) = occ(ish)
490 param%zeff = sum(occ)
493 gto_basis_set%norm_type = 3
497 mark_used(gto_basis_set)
498 mark_used(element_symbol)
501 cpabort(
"Built without TBLITE")
514 LOGICAL,
INTENT(IN) :: calculate_forces
518 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_tblite_matrices'
520 INTEGER :: handle, maxder, nderivatives, nimg, img, nkind, i, ic, iw, &
521 iatom, jatom, ikind, jkind, iset, jset, n1, n2, icol, irow, &
522 ishell, jshell, ia, ib, sgfa, sgfb, atom_a, atom_b, &
523 ldsab, nseta, nsetb, natorb_a, natorb_b
524 LOGICAL :: found, norml1, norml2, use_arnoldi, use_virial
525 REAL(kind=
dp) :: dr, rr
526 INTEGER,
DIMENSION(3) :: cell
527 REAL(kind=
dp) :: hij, shpoly
528 REAL(kind=
dp),
DIMENSION(2) :: condnum
529 REAL(kind=
dp),
DIMENSION(3) :: rij
530 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
531 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: owork
532 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: oint, sint, hint
533 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min
534 INTEGER,
DIMENSION(:),
POINTER :: npgfa, npgfb, nsgfa, nsgfb
535 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
536 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
537 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rpgfb, zeta, zetb, scon_a, scon_b
538 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: sblock, fblock
544 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_s, matrix_p, matrix_w
551 DIMENSION(:),
POINTER :: nl_iterator
554 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
557 TYPE(tb_hamiltonian),
POINTER :: h0
560 CALL timeset(routinen, handle)
562 NULLIFY (ks_env, energy, atomic_kind_set, qs_kind_set)
563 NULLIFY (matrix_h, matrix_s, atprop, dft_control)
564 NULLIFY (sab_orb, rho, tb)
569 atomic_kind_set=atomic_kind_set, &
570 qs_kind_set=qs_kind_set, &
571 matrix_h_kp=matrix_h, &
572 matrix_s_kp=matrix_s, &
574 dft_control=dft_control, &
576 rho=rho, tb_tblite=tb)
579 nkind =
SIZE(atomic_kind_set)
581 IF (calculate_forces) nderivatives = 1
582 maxder =
ncoset(nderivatives)
583 nimg = dft_control%nimages
589 IF (calculate_forces)
THEN
590 NULLIFY (force, matrix_w)
592 matrix_w_kp=matrix_w, &
593 virial=virial, force=force)
595 IF (
SIZE(matrix_p, 1) == 2)
THEN
597 CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, &
598 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
599 CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
600 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
603 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
609 ALLOCATE (basis_set_list(nkind))
614 CALL create_sab_matrix(ks_env, matrix_s,
"OVERLAP MATRIX", basis_set_list, basis_set_list, &
621 ALLOCATE (matrix_h(1, img)%matrix)
622 CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
623 name=
"HAMILTONIAN MATRIX")
632 iatom=iatom, jatom=jatom, r=rij, cell=cell)
634 icol = max(iatom, jatom)
635 irow = min(iatom, jatom)
636 IF (icol == jatom)
THEN
648 row=irow, col=icol, block=sblock, found=found)
652 row=irow, col=icol, block=fblock, found=found)
657 basis_set_a => basis_set_list(ikind)%gto_basis_set
658 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
659 basis_set_b => basis_set_list(jkind)%gto_basis_set
660 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
661 atom_a = atom_of_kind(icol)
662 atom_b = atom_of_kind(irow)
664 first_sgfa => basis_set_a%first_sgf
665 la_max => basis_set_a%lmax
666 la_min => basis_set_a%lmin
667 npgfa => basis_set_a%npgf
668 nseta = basis_set_a%nset
669 nsgfa => basis_set_a%nsgf_set
670 rpgfa => basis_set_a%pgf_radius
671 set_radius_a => basis_set_a%set_radius
672 scon_a => basis_set_a%scon
673 zeta => basis_set_a%zet
675 first_sgfb => basis_set_b%first_sgf
676 lb_max => basis_set_b%lmax
677 lb_min => basis_set_b%lmin
678 npgfb => basis_set_b%npgf
679 nsetb = basis_set_b%nset
680 nsgfb => basis_set_b%nsgf_set
681 rpgfb => basis_set_b%pgf_radius
682 set_radius_b => basis_set_b%set_radius
683 scon_b => basis_set_b%scon
684 zetb => basis_set_b%zet
687 ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
690 natorb_a = natorb_a + (2*basis_set_a%l(1, iset) + 1)
694 natorb_b = natorb_b + (2*basis_set_b%l(1, iset) + 1)
696 ALLOCATE (sint(natorb_a, natorb_b, maxder))
698 ALLOCATE (hint(natorb_a, natorb_b, maxder))
703 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
704 sgfa = first_sgfa(1, iset)
706 IF (set_radius_a(iset) + set_radius_b(jset) < dr) cycle
707 n2 = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
708 sgfb = first_sgfb(1, jset)
709 IF (calculate_forces)
THEN
710 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
711 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
712 rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
714 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
715 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
716 rij, sab=oint(:, :, 1))
719 CALL contraction(oint(:, :, 1), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
720 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
721 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, 1), sgfa, sgfb, trans=.false.)
722 IF (calculate_forces)
THEN
724 CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
725 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
726 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.false.)
733 IF (icol <= irow)
THEN
734 sblock(:, :) = sblock(:, :) + sint(:, :, 1)
736 sblock(:, :) = sblock(:, :) + transpose(sint(:, :, 1))
740 IF (icol == irow .AND. dr < 0.001_dp)
THEN
743 DO ishell = 1, icol - 1
744 n1 = n1 + tb%calc%bas%nsh_at(ishell)
747 sgfa = first_sgfa(1, iset)
748 hij = tb%selfenergy(n1 + iset)
749 DO ia = sgfa, sgfa + nsgfa(iset) - 1
750 hint(ia, ia, 1) = hij
755 rr = sqrt(dr/(h0%rad(jkind) + h0%rad(ikind)))
757 DO ishell = 1, icol - 1
758 n1 = n1 + tb%calc%bas%nsh_at(ishell)
761 sgfa = first_sgfa(1, iset)
763 DO jshell = 1, irow - 1
764 n2 = n2 + tb%calc%bas%nsh_at(jshell)
767 sgfb = first_sgfb(1, jset)
768 shpoly = (1.0_dp + h0%shpoly(iset, ikind)*rr) &
769 *(1.0_dp + h0%shpoly(jset, jkind)*rr)
770 hij = 0.5_dp*(tb%selfenergy(n1 + iset) + tb%selfenergy(n2 + jset)) &
771 *h0%hscale(iset, jset, ikind, jkind)*shpoly
772 DO ia = sgfa, sgfa + nsgfa(iset) - 1
773 DO ib = sgfb, sgfb + nsgfb(jset) - 1
774 hint(ia, ib, 1) = hij*sint(ia, ib, 1)
782 IF (icol <= irow)
THEN
783 fblock(:, :) = fblock(:, :) + hint(:, :, 1)
785 fblock(:, :) = fblock(:, :) + transpose(hint(:, :, 1))
788 DEALLOCATE (oint, owork, sint, hint)
793 DO i = 1,
SIZE(matrix_s, 1)
801 IF (dft_control%qs_control%xtb_control%tblite_method ==
gfn2xtb) &
807 IF (.NOT. calculate_forces)
THEN
809 "DFT%PRINT%OVERLAP_CONDITION") .NE. 0)
THEN
813 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%DIAGONALIZATION", l_val=norml2)
814 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%ARNOLDI", l_val=use_arnoldi)
815 CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env)
816 CALL overlap_condnum(matrix_s, condnum, iw, norml1, norml2, use_arnoldi, blacs_env)
820 DEALLOCATE (basis_set_list)
822 CALL timestop(handle)
826 mark_used(calculate_forces)
827 cpabort(
"Built without TBLITE")
845 LOGICAL,
INTENT(IN) :: calculate_forces
846 LOGICAL,
INTENT(IN) :: use_rho
850 INTEGER :: iatom, ikind, is, ns, atom_a, ii, im
851 INTEGER :: nimg, nkind, nsgf, natorb, na
852 INTEGER :: n_atom, max_orb, max_shell
853 LOGICAL :: do_dipole, do_quadrupole
854 REAL(kind=
dp) :: norm
855 INTEGER,
DIMENSION(5) :: occ
856 INTEGER,
DIMENSION(25) :: lao
857 INTEGER,
DIMENSION(25) :: nao
858 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ch_atom, ch_shell, ch_ref, ch_orb
859 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, ao_dip, ao_quad
862 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, matrix_p
867 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
872 IF (calculate_forces) cpabort(
"tblite: forces not yet available")
876 do_quadrupole = .false.
879 NULLIFY (particle_set, qs_kind_set, atomic_kind_set)
880 CALL get_qs_env(qs_env=qs_env, scf_env=scf_env, particle_set=particle_set, qs_kind_set=qs_kind_set, &
881 atomic_kind_set=atomic_kind_set, matrix_s_kp=matrix_s, rho=rho, para_env=para_env)
885 IF (
ASSOCIATED(tb%dipbra)) do_dipole = .true.
886 IF (
ASSOCIATED(tb%quadbra)) do_quadrupole = .true.
888 matrix_p => scf_env%p_mix_new
890 n_atom =
SIZE(particle_set)
891 nkind =
SIZE(atomic_kind_set)
892 nimg = dft_control%nimages
894 ALLOCATE (aocg(nsgf, n_atom))
896 IF (do_dipole)
ALLOCATE (ao_dip(n_atom, dip_n))
897 IF (do_quadrupole)
ALLOCATE (ao_quad(n_atom, quad_n))
901 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
903 max_orb = max(max_orb, natorb)
906 max_shell = max(max_shell, tb%calc%bas%nsh_at(is))
908 ALLOCATE (ch_atom(n_atom, 1), ch_shell(n_atom, max_shell))
909 ALLOCATE (ch_orb(max_orb, n_atom), ch_ref(max_orb, n_atom))
915 CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
916 IF (do_dipole .OR. do_quadrupole)
THEN
917 cpabort(
"missing contraction with density matrix for multiple k-points")
920 NULLIFY (p_matrix, s_matrix)
921 p_matrix => matrix_p(:, 1)
922 s_matrix => matrix_s(1, 1)%matrix
923 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
926 CALL contract_dens(p_matrix, tb%dipbra(im)%matrix, tb%dipket(im)%matrix, ao_dip(:, im), para_env)
929 IF (do_quadrupole)
THEN
931 CALL contract_dens(p_matrix, tb%quadbra(im)%matrix, tb%quadket(im)%matrix, ao_quad(:, im), para_env)
938 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
941 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
945 ch_ref(is, atom_a) = tb%calc%h0%refocc(nao(is), ikind)/norm
946 ch_orb(is, atom_a) = aocg(is, atom_a) - ch_ref(is, atom_a)
947 ch_shell(atom_a, ns) = ch_orb(is, atom_a) + ch_shell(atom_a, ns)
949 ch_atom(atom_a, 1) = sum(ch_orb(:, atom_a))
955 IF (dft_control%qs_control%do_ls_scf)
THEN
958 CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
959 ch_shell, para_env, scf_env%iter_count)
967 ii = tb%calc%bas%ish_at(iatom)
968 DO is = 1, tb%calc%bas%nsh_at(iatom)
969 tb%wfn%qsh(ii + is, 1) = -ch_shell(iatom, is)
971 tb%wfn%qat(iatom, 1) = -ch_atom(iatom, 1)
977 tb%wfn%dpat(im, iatom, 1) = -ao_dip(iatom, im)
982 IF (do_quadrupole)
THEN
985 tb%wfn%qpat(im, iatom, 1) = -ao_quad(iatom, im)
991 IF (
ALLOCATED(tb%calc%coulomb))
THEN
992 CALL tb%calc%coulomb%get_potential(tb%mol, tb%cache, tb%wfn, tb%pot)
994 IF (
ALLOCATED(tb%calc%dispersion))
THEN
995 CALL tb%calc%dispersion%get_potential(tb%mol, tb%dcache, tb%wfn, tb%pot)
998 IF (
ALLOCATED(tb%calc%coulomb))
THEN
999 CALL tb%calc%coulomb%get_energy(tb%mol, tb%cache, tb%wfn, tb%e_es)
1001 IF (
ALLOCATED(tb%calc%dispersion))
THEN
1002 CALL tb%calc%dispersion%get_energy(tb%mol, tb%dcache, tb%wfn, tb%e_scd)
1005 DEALLOCATE (ch_atom, ch_shell, ch_orb, ch_ref)
1010 mark_used(dft_control)
1011 mark_used(calculate_forces)
1013 cpabort(
"Built without TBLITE")
1030 LOGICAL,
INTENT(IN) :: calculate_forces
1032#if defined(__TBLITE)
1034 INTEGER :: ikind, jkind, iatom, jatom, icol, irow
1035 INTEGER :: ic, is, nimg, ni, nj, i, j
1036 INTEGER :: la, lb, za, zb
1038 INTEGER,
DIMENSION(3) :: cellind
1039 INTEGER,
DIMENSION(25) :: naoa, naob
1040 REAL(kind=
dp),
DIMENSION(3) :: rij
1041 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, sum_shell
1042 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ashift, bshift
1043 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ksblock, sblock
1044 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1045 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: dip_ket1, dip_ket2, dip_ket3, &
1046 dip_bra1, dip_bra2, dip_bra3
1047 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: quad_ket1, quad_ket2, quad_ket3, &
1048 quad_ket4, quad_ket5, quad_ket6, &
1049 quad_bra1, quad_bra2, quad_bra3, &
1050 quad_bra4, quad_bra5, quad_bra6
1054 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
1055 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
1058 DIMENSION(:),
POINTER :: nl_iterator
1061 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1064 IF (calculate_forces) cpabort(
"tblite: forces not yet available")
1066 nimg = dft_control%nimages
1068 NULLIFY (matrix_s, ks_matrix, n_list, qs_kind_set)
1069 CALL get_qs_env(qs_env=qs_env, sab_orb=n_list, matrix_s_kp=matrix_s, matrix_ks_kp=ks_matrix, qs_kind_set=qs_kind_set)
1072 ALLOCATE (sum_shell(tb%mol%nat))
1074 DO j = 1, tb%mol%nat
1076 i = i + tb%calc%bas%nsh_at(j)
1081 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
1088 ikind = kind_of(irow)
1089 jkind = kind_of(icol)
1092 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1093 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1097 ni =
SIZE(sblock, 1)
1098 ALLOCATE (ashift(ni, ni))
1101 la = naoa(i) + sum_shell(irow)
1102 ashift(i, i) = tb%pot%vsh(la, 1)
1105 nj =
SIZE(sblock, 2)
1106 ALLOCATE (bshift(nj, nj))
1109 lb = naob(j) + sum_shell(icol)
1110 bshift(j, j) = tb%pot%vsh(lb, 1)
1113 DO is = 1,
SIZE(ks_matrix, 1)
1116 row=irow, col=icol, block=ksblock, found=found)
1118 ksblock = ksblock - 0.5_dp*(matmul(ashift, sblock) &
1119 + matmul(sblock, bshift))
1120 ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
1121 + tb%pot%vat(icol, 1))*sblock
1123 DEALLOCATE (ashift, bshift)
1127 IF (
ASSOCIATED(tb%dipbra))
THEN
1132 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1134 row=irow, col=icol, block=dip_bra1, found=found)
1137 row=irow, col=icol, block=dip_bra2, found=found)
1140 row=irow, col=icol, block=dip_bra3, found=found)
1142 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1144 row=irow, col=icol, block=dip_ket1, found=found)
1147 row=irow, col=icol, block=dip_ket2, found=found)
1150 row=irow, col=icol, block=dip_ket3, found=found)
1153 DO is = 1,
SIZE(ks_matrix, 1)
1156 row=irow, col=icol, block=ksblock, found=found)
1158 ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
1159 + dip_ket2*tb%pot%vdp(2, irow, 1) &
1160 + dip_ket3*tb%pot%vdp(3, irow, 1) &
1161 + dip_bra1*tb%pot%vdp(1, icol, 1) &
1162 + dip_bra2*tb%pot%vdp(2, icol, 1) &
1163 + dip_bra3*tb%pot%vdp(3, icol, 1))
1169 IF (
ASSOCIATED(tb%quadbra))
THEN
1174 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1176 row=irow, col=icol, block=quad_bra1, found=found)
1179 row=irow, col=icol, block=quad_bra2, found=found)
1182 row=irow, col=icol, block=quad_bra3, found=found)
1185 row=irow, col=icol, block=quad_bra4, found=found)
1188 row=irow, col=icol, block=quad_bra5, found=found)
1191 row=irow, col=icol, block=quad_bra6, found=found)
1194 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1196 row=irow, col=icol, block=quad_ket1, found=found)
1199 row=irow, col=icol, block=quad_ket2, found=found)
1202 row=irow, col=icol, block=quad_ket3, found=found)
1205 row=irow, col=icol, block=quad_ket4, found=found)
1208 row=irow, col=icol, block=quad_ket5, found=found)
1211 row=irow, col=icol, block=quad_ket6, found=found)
1214 DO is = 1,
SIZE(ks_matrix, 1)
1217 row=irow, col=icol, block=ksblock, found=found)
1220 ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
1221 + quad_ket2*tb%pot%vqp(2, irow, 1) &
1222 + quad_ket3*tb%pot%vqp(3, irow, 1) &
1223 + quad_ket4*tb%pot%vqp(4, irow, 1) &
1224 + quad_ket5*tb%pot%vqp(5, irow, 1) &
1225 + quad_ket6*tb%pot%vqp(6, irow, 1) &
1226 + quad_bra1*tb%pot%vqp(1, icol, 1) &
1227 + quad_bra2*tb%pot%vqp(2, icol, 1) &
1228 + quad_bra3*tb%pot%vqp(3, icol, 1) &
1229 + quad_bra4*tb%pot%vqp(4, icol, 1) &
1230 + quad_bra5*tb%pot%vqp(5, icol, 1) &
1231 + quad_bra6*tb%pot%vqp(6, icol, 1))
1238 cpabort(
"GFN methods with k-points not tested")
1240 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
1241 NULLIFY (cell_to_index)
1247 iatom=iatom, jatom=jatom, r=rij, cell=cellind)
1249 icol = max(iatom, jatom)
1250 irow = min(iatom, jatom)
1252 IF (icol == jatom)
THEN
1259 ic = cell_to_index(cellind(1), cellind(2), cellind(3))
1264 row=irow, col=icol, block=sblock, found=found)
1268 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1269 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1273 ni =
SIZE(sblock, 1)
1274 ALLOCATE (ashift(ni, ni))
1277 la = naoa(i) + sum_shell(irow)
1278 ashift(i, i) = tb%pot%vsh(la, 1)
1281 nj =
SIZE(sblock, 2)
1282 ALLOCATE (bshift(nj, nj))
1285 lb = naob(j) + sum_shell(icol)
1286 bshift(j, j) = tb%pot%vsh(lb, 1)
1289 DO is = 1,
SIZE(ks_matrix, 1)
1292 row=irow, col=icol, block=ksblock, found=found)
1294 ksblock = ksblock - 0.5_dp*(matmul(ashift, sblock) &
1295 + matmul(sblock, bshift))
1296 ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
1297 + tb%pot%vat(icol, 1))*sblock
1302 IF (
ASSOCIATED(tb%dipbra))
THEN
1306 iatom=iatom, jatom=jatom, cell=cellind)
1307 icol = max(iatom, jatom)
1308 irow = min(iatom, jatom)
1310 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1312 row=irow, col=icol, block=dip_bra1, found=found)
1315 row=irow, col=icol, block=dip_bra2, found=found)
1318 row=irow, col=icol, block=dip_bra3, found=found)
1320 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1322 row=irow, col=icol, block=dip_ket1, found=found)
1325 row=irow, col=icol, block=dip_ket2, found=found)
1328 row=irow, col=icol, block=dip_ket3, found=found)
1331 DO is = 1,
SIZE(ks_matrix, 1)
1334 row=irow, col=icol, block=ksblock, found=found)
1336 ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
1337 + dip_ket2*tb%pot%vdp(2, irow, 1) &
1338 + dip_ket3*tb%pot%vdp(3, irow, 1) &
1339 + dip_bra1*tb%pot%vdp(1, icol, 1) &
1340 + dip_bra2*tb%pot%vdp(2, icol, 1) &
1341 + dip_bra3*tb%pot%vdp(3, icol, 1))
1347 IF (
ASSOCIATED(tb%quadbra))
THEN
1351 iatom=iatom, jatom=jatom, cell=cellind)
1352 icol = max(iatom, jatom)
1353 irow = min(iatom, jatom)
1355 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1357 row=irow, col=icol, block=quad_bra1, found=found)
1360 row=irow, col=icol, block=quad_bra2, found=found)
1363 row=irow, col=icol, block=quad_bra3, found=found)
1366 row=irow, col=icol, block=quad_bra4, found=found)
1369 row=irow, col=icol, block=quad_bra5, found=found)
1372 row=irow, col=icol, block=quad_bra6, found=found)
1375 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1377 row=irow, col=icol, block=quad_ket1, found=found)
1380 row=irow, col=icol, block=quad_ket2, found=found)
1383 row=irow, col=icol, block=quad_ket3, found=found)
1386 row=irow, col=icol, block=quad_ket4, found=found)
1389 row=irow, col=icol, block=quad_ket5, found=found)
1392 row=irow, col=icol, block=quad_ket6, found=found)
1395 DO is = 1,
SIZE(ks_matrix, 1)
1398 row=irow, col=icol, block=ksblock, found=found)
1401 ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
1402 + quad_ket2*tb%pot%vqp(2, irow, 1) &
1403 + quad_ket3*tb%pot%vqp(3, irow, 1) &
1404 + quad_ket4*tb%pot%vqp(4, irow, 1) &
1405 + quad_ket5*tb%pot%vqp(5, irow, 1) &
1406 + quad_ket6*tb%pot%vqp(6, irow, 1) &
1407 + quad_bra1*tb%pot%vqp(1, icol, 1) &
1408 + quad_bra2*tb%pot%vqp(2, icol, 1) &
1409 + quad_bra3*tb%pot%vqp(3, icol, 1) &
1410 + quad_bra4*tb%pot%vqp(4, icol, 1) &
1411 + quad_bra5*tb%pot%vqp(5, icol, 1) &
1412 + quad_bra6*tb%pot%vqp(6, icol, 1))
1423 mark_used(dft_control)
1424 mark_used(calculate_forces)
1425 cpabort(
"Built without TBLITE")
1440#if defined(__TBLITE)
1442 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tb_get_multipole'
1444 INTEGER :: ikind, jkind, iatom, jatom, icol, irow, iset, jset, ityp, jtyp
1445 INTEGER :: nkind, natom, handle, nimg, i, inda, indb
1446 INTEGER :: atom_a, atom_b, nseta, nsetb, ia, ib, ij
1449 REAL(kind=
dp),
DIMENSION(3) :: rij
1450 INTEGER,
DIMENSION(:),
POINTER :: la_max, lb_max
1451 INTEGER,
DIMENSION(:),
POINTER :: nsgfa, nsgfb
1452 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
1453 INTEGER,
ALLOCATABLE :: atom_of_kind(:)
1454 REAL(kind=
dp),
ALLOCATABLE :: stmp(:)
1455 REAL(kind=
dp),
ALLOCATABLE :: dtmp(:, :), qtmp(:, :), dtmpj(:, :), qtmpj(:, :)
1456 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: dip_ket1, dip_ket2, dip_ket3, &
1457 dip_bra1, dip_bra2, dip_bra3
1458 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: quad_ket1, quad_ket2, quad_ket3, &
1459 quad_ket4, quad_ket5, quad_ket6, &
1460 quad_bra1, quad_bra2, quad_bra3, &
1461 quad_bra4, quad_bra5, quad_bra6
1464 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
1470 DIMENSION(:),
POINTER :: nl_iterator
1472 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1474 CALL timeset(routinen, handle)
1477 NULLIFY (atomic_kind_set, qs_kind_set, sab_orb, particle_set)
1478 NULLIFY (dft_control, matrix_s)
1479 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
1480 qs_kind_set=qs_kind_set, &
1482 particle_set=particle_set, &
1483 dft_control=dft_control, &
1484 matrix_s_kp=matrix_s)
1485 natom =
SIZE(particle_set)
1486 nkind =
SIZE(atomic_kind_set)
1487 nimg = dft_control%nimages
1492 ALLOCATE (basis_set_list(nkind))
1495 ALLOCATE (stmp(msao(tb%calc%bas%maxl)**2))
1496 ALLOCATE (dtmp(dip_n, msao(tb%calc%bas%maxl)**2))
1497 ALLOCATE (qtmp(quad_n, msao(tb%calc%bas%maxl)**2))
1498 ALLOCATE (dtmpj(dip_n, msao(tb%calc%bas%maxl)**2))
1499 ALLOCATE (qtmpj(quad_n, msao(tb%calc%bas%maxl)**2))
1507 ALLOCATE (tb%dipbra(i)%matrix)
1508 ALLOCATE (tb%dipket(i)%matrix)
1509 CALL dbcsr_create(tb%dipbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
1510 name=
"DIPOLE BRAMATRIX")
1511 CALL dbcsr_create(tb%dipket(i)%matrix, template=matrix_s(1, 1)%matrix, &
1512 name=
"DIPOLE KETMATRIX")
1517 ALLOCATE (tb%quadbra(i)%matrix)
1518 ALLOCATE (tb%quadket(i)%matrix)
1519 CALL dbcsr_create(tb%quadbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
1520 name=
"QUADRUPOLE BRAMATRIX")
1521 CALL dbcsr_create(tb%quadket(i)%matrix, template=matrix_s(1, 1)%matrix, &
1522 name=
"QUADRUPOLE KETMATRIX")
1531 iatom=iatom, jatom=jatom, r=rij)
1533 r2 = norm2(rij(:))**2
1535 icol = max(iatom, jatom)
1536 irow = min(iatom, jatom)
1538 IF (icol == jatom)
THEN
1545 ityp = tb%mol%id(icol)
1546 jtyp = tb%mol%id(irow)
1548 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1550 row=irow, col=icol, block=dip_bra1, found=found)
1553 row=irow, col=icol, block=dip_bra2, found=found)
1556 row=irow, col=icol, block=dip_bra3, found=found)
1559 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1561 row=irow, col=icol, block=dip_ket1, found=found)
1564 row=irow, col=icol, block=dip_ket2, found=found)
1567 row=irow, col=icol, block=dip_ket3, found=found)
1570 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1572 row=irow, col=icol, block=quad_bra1, found=found)
1575 row=irow, col=icol, block=quad_bra2, found=found)
1578 row=irow, col=icol, block=quad_bra3, found=found)
1581 row=irow, col=icol, block=quad_bra4, found=found)
1584 row=irow, col=icol, block=quad_bra5, found=found)
1587 row=irow, col=icol, block=quad_bra6, found=found)
1590 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1592 row=irow, col=icol, block=quad_ket1, found=found)
1595 row=irow, col=icol, block=quad_ket2, found=found)
1598 row=irow, col=icol, block=quad_ket3, found=found)
1601 row=irow, col=icol, block=quad_ket4, found=found)
1604 row=irow, col=icol, block=quad_ket5, found=found)
1607 row=irow, col=icol, block=quad_ket6, found=found)
1611 basis_set_a => basis_set_list(ikind)%gto_basis_set
1612 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
1613 basis_set_b => basis_set_list(jkind)%gto_basis_set
1614 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
1615 atom_a = atom_of_kind(icol)
1616 atom_b = atom_of_kind(irow)
1618 first_sgfa => basis_set_a%first_sgf
1619 la_max => basis_set_a%lmax
1620 nseta = basis_set_a%nset
1621 nsgfa => basis_set_a%nsgf_set
1623 first_sgfb => basis_set_b%first_sgf
1624 lb_max => basis_set_b%lmax
1625 nsetb = basis_set_b%nset
1626 nsgfb => basis_set_b%nsgf_set
1629 IF (icol == irow)
THEN
1632 CALL multipole_cgto(tb%calc%bas%cgto(jset, ityp), tb%calc%bas%cgto(iset, ityp), &
1633 & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
1635 DO inda = 1, nsgfa(iset)
1636 ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
1637 DO indb = 1, nsgfb(jset)
1638 ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
1639 ij = indb + nsgfb(jset)*(inda - 1)
1641 dip_ket1(ib, ia) = dtmp(1, ij)
1642 dip_ket2(ib, ia) = dtmp(2, ij)
1643 dip_ket3(ib, ia) = dtmp(3, ij)
1645 quad_ket1(ib, ia) = qtmp(1, ij)
1646 quad_ket2(ib, ia) = qtmp(2, ij)
1647 quad_ket3(ib, ia) = qtmp(3, ij)
1648 quad_ket4(ib, ia) = qtmp(4, ij)
1649 quad_ket5(ib, ia) = qtmp(5, ij)
1650 quad_ket6(ib, ia) = qtmp(6, ij)
1652 dip_bra1(ib, ia) = dtmp(1, ij)
1653 dip_bra2(ib, ia) = dtmp(2, ij)
1654 dip_bra3(ib, ia) = dtmp(3, ij)
1656 quad_bra1(ib, ia) = qtmp(1, ij)
1657 quad_bra2(ib, ia) = qtmp(2, ij)
1658 quad_bra3(ib, ia) = qtmp(3, ij)
1659 quad_bra4(ib, ia) = qtmp(4, ij)
1660 quad_bra5(ib, ia) = qtmp(5, ij)
1661 quad_bra6(ib, ia) = qtmp(6, ij)
1669 CALL multipole_cgto(tb%calc%bas%cgto(jset, jtyp), tb%calc%bas%cgto(iset, ityp), &
1670 & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
1671 CALL multipole_cgto(tb%calc%bas%cgto(iset, ityp), tb%calc%bas%cgto(jset, jtyp), &
1672 & r2, rij, tb%calc%bas%intcut, stmp, dtmpj, qtmpj)
1674 DO inda = 1, nsgfa(iset)
1675 ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
1676 DO indb = 1, nsgfb(jset)
1677 ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
1679 ij = indb + nsgfb(jset)*(inda - 1)
1681 dip_bra1(ib, ia) = dtmp(1, ij)
1682 dip_bra2(ib, ia) = dtmp(2, ij)
1683 dip_bra3(ib, ia) = dtmp(3, ij)
1685 quad_bra1(ib, ia) = qtmp(1, ij)
1686 quad_bra2(ib, ia) = qtmp(2, ij)
1687 quad_bra3(ib, ia) = qtmp(3, ij)
1688 quad_bra4(ib, ia) = qtmp(4, ij)
1689 quad_bra5(ib, ia) = qtmp(5, ij)
1690 quad_bra6(ib, ia) = qtmp(6, ij)
1692 ij = inda + nsgfa(iset)*(indb - 1)
1694 dip_ket1(ib, ia) = dtmpj(1, ij)
1695 dip_ket2(ib, ia) = dtmpj(2, ij)
1696 dip_ket3(ib, ia) = dtmpj(3, ij)
1698 quad_ket1(ib, ia) = qtmpj(1, ij)
1699 quad_ket2(ib, ia) = qtmpj(2, ij)
1700 quad_ket3(ib, ia) = qtmpj(3, ij)
1701 quad_ket4(ib, ia) = qtmpj(4, ij)
1702 quad_ket5(ib, ia) = qtmpj(5, ij)
1703 quad_ket6(ib, ia) = qtmpj(6, ij)
1721 DEALLOCATE (basis_set_list)
1723 CALL timestop(handle)
1728 cpabort(
"Built without TBLITE")
1744 SUBROUTINE contract_dens(p_matrix, bra_mat, ket_mat, output, para_env)
1746 TYPE(
dbcsr_type),
POINTER :: bra_mat, ket_mat
1747 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: output
1750 CHARACTER(len=*),
PARAMETER :: routinen =
'contract_dens'
1752 INTEGER :: handle, i, iblock_col, iblock_row, &
1755 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: bra, ket, p_block
1758 CALL timeset(routinen, handle)
1760 nspin =
SIZE(p_matrix)
1765 NULLIFY (p_block, bra, ket)
1769 row=iblock_row, col=iblock_col, block=p_block, found=found)
1770 IF (.NOT. found) cycle
1772 row=iblock_row, col=iblock_col, block=ket, found=found)
1773 IF (.NOT. found) cpabort(
"missing block")
1775 IF (.NOT. (
ASSOCIATED(bra) .AND.
ASSOCIATED(p_block))) cycle
1776 DO j = 1,
SIZE(p_block, 1)
1777 DO i = 1,
SIZE(p_block, 2)
1778 output(iblock_row) = output(iblock_row) + p_block(j, i)*ket(j, i)
1781 IF (iblock_col /= iblock_row)
THEN
1782 DO j = 1,
SIZE(p_block, 1)
1783 DO i = 1,
SIZE(p_block, 2)
1784 output(iblock_col) = output(iblock_col) + p_block(j, i)*bra(j, i)
1792 CALL para_env%sum(output)
1793 CALL timestop(handle)
1795 END SUBROUTINE contract_dens
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 process_gto_basis(gto_basis_set, do_ortho, nset, maxl)
...
subroutine, public allocate_gto_basis_set(gto_basis_set)
...
subroutine, public write_gto_basis_set(gto_basis_set, output_unit, header)
Write a Gaussian-type orbital (GTO) basis set data set to the output unit.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_print(matrix, variable_name, unit_nr)
Prints given matrix in matlab format (only present blocks).
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.
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 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...
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.
Utility routines for the memory handling.
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
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.
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, tb_tblite)
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, 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.
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, npgf_seg)
Get attributes of an atomic kind set.
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_pp, 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)
...
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 integer_to_string(inumber, string)
Converts an integer number to a string. The WRITE statement will return an error message,...
subroutine, public tb_set_calculator(tb, typ)
...
subroutine, public tb_init_ham(tb)
...
subroutine, public tb_update_charges(qs_env, dft_control, tb, calculate_forces, use_rho)
...
subroutine, public tb_init_geometry(qs_env, tb)
...
subroutine, public tb_ham_add_coulomb(qs_env, tb, dft_control, calculate_forces)
...
subroutine, public build_tblite_matrices(qs_env, calculate_forces)
...
subroutine, public tb_get_energy(qs_env, tb, energy)
...
subroutine, public tb_get_multipole(qs_env, tb)
...
subroutine, public tb_init_wf(tb, do_grad)
...
subroutine, public tb_get_basis(tb, gto_basis_set, element_symbol, param, occ)
...
subroutine, public allocate_tblite_type(tb_tblite)
...
subroutine, public deallocate_tblite_type(tb_tblite)
...
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, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
Provides all information about an atomic kind.
type for the atomic properties
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.