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
116 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tblite_init_geometry'
120 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
121 INTEGER :: iatom, natom
122 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: xyz
123 INTEGER :: handle, ikind
124 INTEGER,
DIMENSION(3) :: periodic
125 LOGICAL,
DIMENSION(3) :: lperiod
127 CALL timeset(routinen, handle)
130 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, cell=cell, qs_kind_set=qs_kind_set)
133 natom =
SIZE(particle_set)
134 ALLOCATE (xyz(3, natom))
136 ALLOCATE (tb%el_num(natom))
139 xyz(:, iatom) = particle_set(iatom)%r(:)
140 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
141 CALL get_qs_kind(qs_kind_set(ikind), zatom=tb%el_num(iatom))
142 IF (tb%el_num(iatom) < 1 .OR. tb%el_num(iatom) > 85)
THEN
143 cpabort(
"only elements 1-85 are supported by tblite")
148 CALL get_cell(cell=cell, periodic=periodic)
149 lperiod(1) = periodic(1) == 1
150 lperiod(2) = periodic(2) == 1
151 lperiod(3) = periodic(3) == 1
154 CALL new(tb%mol, tb%el_num, xyz, lattice=cell%hmat, periodic=lperiod)
158 CALL timestop(handle)
163 cpabort(
"Built without TBLITE")
173 SUBROUTINE tb_update_geometry(qs_env, tb)
180 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tblite_update_geometry'
183 INTEGER :: iatom, natom
184 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: xyz
187 CALL timeset(routinen, handle)
190 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
193 natom =
SIZE(particle_set)
194 ALLOCATE (xyz(3, natom))
196 xyz(:, iatom) = particle_set(iatom)%r(:)
198 tb%mol%xyz(:, :) = xyz
202 CALL timestop(handle)
207 cpabort(
"Built without TBLITE")
210 END SUBROUTINE tb_update_geometry
222 INTEGER,
PARAMETER :: nspin = 1
224 TYPE(scf_info) :: info
226 info = tb%calc%variable_info()
227 IF (info%charge > shell_resolved) cpabort(
"tblite: no support for orbital resolved charge")
228 IF (info%dipole > atom_resolved) cpabort(
"tblite: no support for shell resolved dipole moment")
229 IF (info%quadrupole > atom_resolved) &
230 cpabort(
"tblite: no support shell resolved quadrupole moment")
232 CALL new_wavefunction(tb%wfn, tb%mol%nat, tb%calc%bas%nsh, tb%calc%bas%nao, nspin, 0.0_dp)
234 CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
237 ALLOCATE (tb%e_hal(tb%mol%nat), tb%e_rep(tb%mol%nat), tb%e_disp(tb%mol%nat))
238 ALLOCATE (tb%e_scd(tb%mol%nat), tb%e_es(tb%mol%nat))
239 ALLOCATE (tb%selfenergy(tb%calc%bas%nsh))
240 IF (
ALLOCATED(tb%calc%ncoord))
ALLOCATE (tb%cn(tb%mol%nat))
244 cpabort(
"Built without TBLITE")
261 TYPE(error_type),
ALLOCATABLE :: error
265 cpabort(
"Unknown xtb type")
267 CALL new_gfn1_calculator(tb%calc, tb%mol, error)
269 CALL new_gfn2_calculator(tb%calc, tb%mol, error)
271 CALL new_ipea1_calculator(tb%calc, tb%mol, error)
277 cpabort(
"Built without TBLITE")
288 SUBROUTINE tb_init_ham(qs_env, tb, para_env)
296 TYPE(container_cache) :: hcache, rcache
301 IF (
ALLOCATED(tb%grad))
THEN
303 CALL tb_zero_force(qs_env)
307 IF (
ALLOCATED(tb%calc%halogen))
THEN
308 CALL tb%calc%halogen%update(tb%mol, hcache)
309 IF (
ALLOCATED(tb%grad))
THEN
311 CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal, &
313 CALL tb_grad2force(qs_env, tb, para_env, 0)
315 CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal)
319 IF (
ALLOCATED(tb%calc%repulsion))
THEN
320 CALL tb%calc%repulsion%update(tb%mol, rcache)
321 IF (
ALLOCATED(tb%grad))
THEN
323 CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep, &
325 CALL tb_grad2force(qs_env, tb, para_env, 1)
327 CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep)
331 IF (
ALLOCATED(tb%calc%dispersion))
THEN
332 CALL tb%calc%dispersion%update(tb%mol, tb%dcache)
333 IF (
ALLOCATED(tb%grad))
THEN
335 CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp, &
337 CALL tb_grad2force(qs_env, tb, para_env, 2)
339 CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp)
343 CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
344 IF (
ALLOCATED(tb%calc%coulomb))
THEN
345 CALL tb%calc%coulomb%update(tb%mol, tb%cache)
348 IF (
ALLOCATED(tb%grad))
THEN
349 IF (
ALLOCATED(tb%calc%ncoord))
THEN
350 CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn, tb%dcndr, tb%dcndL)
352 CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
353 & tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
355 IF (
ALLOCATED(tb%calc%ncoord))
THEN
356 CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn)
358 CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
359 & tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
366 cpabort(
"Built without TBLITE")
369 END SUBROUTINE tb_init_ham
389 NULLIFY (scf_section, logger)
395 energy%repulsive = sum(tb%e_rep)
396 energy%el_stat = sum(tb%e_es)
397 energy%dispersion = sum(tb%e_disp)
398 energy%dispersion_sc = sum(tb%e_scd)
399 energy%xtb_xb_inter = sum(tb%e_hal)
401 energy%total = energy%core + energy%repulsive + energy%el_stat + energy%dispersion &
402 + energy%dispersion_sc + energy%xtb_xb_inter + energy%kTS &
403 + energy%efield + energy%qmmm_el
408 WRITE (unit=iounit, fmt=
"(/,(T9,A,T60,F20.10))") &
409 "Repulsive pair potential energy: ", energy%repulsive, &
410 "Zeroth order Hamiltonian energy: ", energy%core, &
411 "Electrostatic energy: ", energy%el_stat, &
412 "Self-consistent dispersion energy: ", energy%dispersion_sc, &
413 "Non-self consistent dispersion energy: ", energy%dispersion
414 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
415 "Correction for halogen bonding: ", energy%xtb_xb_inter
416 IF (abs(energy%efield) > 1.e-12_dp)
THEN
417 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
418 "Electric field interaction energy: ", energy%efield
420 IF (qs_env%qmmm)
THEN
421 WRITE (unit=iounit, fmt=
"(T9,A,T60,F20.10)") &
422 "QM/MM Electrostatic energy: ", energy%qmmm_el
426 "PRINT%DETAILED_ENERGY")
432 cpabort(
"Built without TBLITE")
449 CHARACTER(len=2),
INTENT(IN) :: element_symbol
451 INTEGER,
DIMENSION(5),
INTENT(out) :: occ
455 CHARACTER(LEN=default_string_length) :: sng
456 INTEGER :: ang, i_type, id_atom, ind_ao, ipgf, ish, &
457 ishell, ityp, maxl, mprim, natorb, &
464 CALL symbol_to_number(i_type, element_symbol)
465 DO id_atom = 1, tb%mol%nat
466 IF (i_type == tb%el_num(id_atom))
EXIT
469 param%symbol = element_symbol
470 param%defined = .true.
471 ityp = tb%mol%id(id_atom)
474 nset = tb%calc%bas%nsh_id(ityp)
478 mprim = max(mprim, tb%calc%bas%cgto(ishell, ityp)%nprim)
485 gto_basis_set%name = element_symbol//
"_STO-"//trim(sng)//
"G"
486 gto_basis_set%nset = nset
490 CALL reallocate(gto_basis_set%nshell, 1, nset)
491 CALL reallocate(gto_basis_set%n, 1, 1, 1, nset)
492 CALL reallocate(gto_basis_set%l, 1, 1, 1, nset)
493 CALL reallocate(gto_basis_set%zet, 1, mprim, 1, nset)
494 CALL reallocate(gto_basis_set%gcc, 1, mprim, 1, 1, 1, nset)
499 ang = tb%calc%bas%cgto(ishell, ityp)%ang
500 natorb = natorb + (2*ang + 1)
501 param%lval(ishell) = ang
502 maxl = max(ang, maxl)
503 gto_basis_set%lmax(ishell) = ang
504 gto_basis_set%lmin(ishell) = ang
505 gto_basis_set%npgf(ishell) = tb%calc%bas%cgto(ishell, ityp)%nprim
506 gto_basis_set%nshell(ishell) = nshell
507 gto_basis_set%n(1, ishell) = ang + 1
508 gto_basis_set%l(1, ishell) = ang
509 DO ipgf = 1, gto_basis_set%npgf(ishell)
510 gto_basis_set%gcc(ipgf, 1, ishell) = tb%calc%bas%cgto(ishell, ityp)%coeff(ipgf)
511 gto_basis_set%zet(ipgf, ishell) = tb%calc%bas%cgto(ishell, ityp)%alpha(ipgf)
513 DO ipgf = 1, (2*ang + 1)
515 param%lao(ind_ao) = ang
516 param%nao(ind_ao) = ishell
524 param%rcut = get_cutoff(tb%calc%bas)
525 param%natorb = natorb
530 DO ish = 1, min(tb%calc%bas%nsh_at(id_atom), 5)
531 occ(ish) = nint(tb%calc%h0%refocc(ish, ityp))
532 param%occupation(ish) = occ(ish)
534 param%zeff = sum(occ)
537 gto_basis_set%norm_type = 3
541 mark_used(gto_basis_set)
542 mark_used(element_symbol)
545 cpabort(
"Built without TBLITE")
558 LOGICAL,
INTENT(IN) :: calculate_forces
562 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_tblite_matrices'
564 INTEGER :: handle, maxder, nderivatives, nimg, img, nkind, i, ic, iw, &
565 iatom, jatom, ikind, jkind, iset, jset, n1, n2, icol, irow, &
566 ia, ib, sgfa, sgfb, atom_a, atom_b, &
567 ldsab, nseta, nsetb, natorb_a, natorb_b, sgfa0
568 LOGICAL :: found, norml1, norml2, use_arnoldi
569 REAL(kind=
dp) :: dr, rr
570 INTEGER,
DIMENSION(3) :: cell
571 REAL(kind=
dp) :: hij, shpoly
572 REAL(kind=
dp),
DIMENSION(2) :: condnum
573 REAL(kind=
dp),
DIMENSION(3) :: rij
574 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
575 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: owork
576 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: oint, sint, hint
577 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min
578 INTEGER,
DIMENSION(:),
POINTER :: npgfa, npgfb, nsgfa, nsgfb
579 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
580 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
581 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rpgfb, zeta, zetb, scon_a, scon_b
582 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: sblock, fblock
588 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_s, matrix_p, matrix_w
595 DIMENSION(:),
POINTER :: nl_iterator
599 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
602 TYPE(tb_hamiltonian),
POINTER :: h0
605 CALL timeset(routinen, handle)
607 NULLIFY (ks_env, energy, atomic_kind_set, qs_kind_set)
608 NULLIFY (matrix_h, matrix_s, atprop, dft_control)
609 NULLIFY (sab_orb, rho, tb)
612 ks_env=ks_env, para_env=para_env, &
614 atomic_kind_set=atomic_kind_set, &
615 qs_kind_set=qs_kind_set, &
616 matrix_h_kp=matrix_h, &
617 matrix_s_kp=matrix_s, &
619 dft_control=dft_control, &
621 rho=rho, tb_tblite=tb)
625 CALL tb_update_geometry(qs_env, tb)
627 nkind =
SIZE(atomic_kind_set)
629 IF (calculate_forces)
THEN
631 IF (
ALLOCATED(tb%grad))
DEALLOCATE (tb%grad)
632 ALLOCATE (tb%grad(3, tb%mol%nat))
633 IF (
ALLOCATED(tb%dsedcn))
DEALLOCATE (tb%dsedcn)
634 ALLOCATE (tb%dsedcn(tb%calc%bas%nsh))
635 IF (
ALLOCATED(tb%calc%ncoord))
THEN
636 IF (
ALLOCATED(tb%dcndr))
DEALLOCATE (tb%dcndr)
637 ALLOCATE (tb%dcndr(3, tb%mol%nat, tb%mol%nat))
638 IF (
ALLOCATED(tb%dcndL))
DEALLOCATE (tb%dcndL)
639 ALLOCATE (tb%dcndL(3, 3, tb%mol%nat))
642 maxder =
ncoset(nderivatives)
643 nimg = dft_control%nimages
646 CALL tb_init_ham(qs_env, tb, para_env)
652 IF (calculate_forces)
THEN
653 NULLIFY (force, matrix_w, virial)
655 matrix_w_kp=matrix_w, &
656 virial=virial, force=force)
658 IF (
SIZE(matrix_p, 1) == 2)
THEN
660 CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, &
661 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
662 CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
663 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
666 tb%use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
672 ALLOCATE (basis_set_list(nkind))
677 CALL create_sab_matrix(ks_env, matrix_s,
"OVERLAP MATRIX", basis_set_list, basis_set_list, &
684 ALLOCATE (matrix_h(1, img)%matrix)
685 CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
686 name=
"HAMILTONIAN MATRIX")
692 NULLIFY (nl_iterator)
696 iatom=iatom, jatom=jatom, r=rij, cell=cell)
698 icol = max(iatom, jatom)
699 irow = min(iatom, jatom)
700 IF (icol == jatom)
THEN
712 row=irow, col=icol, block=sblock, found=found)
716 row=irow, col=icol, block=fblock, found=found)
721 basis_set_a => basis_set_list(ikind)%gto_basis_set
722 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
723 basis_set_b => basis_set_list(jkind)%gto_basis_set
724 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
725 atom_a = atom_of_kind(icol)
726 atom_b = atom_of_kind(irow)
728 first_sgfa => basis_set_a%first_sgf
729 la_max => basis_set_a%lmax
730 la_min => basis_set_a%lmin
731 npgfa => basis_set_a%npgf
732 nseta = basis_set_a%nset
733 nsgfa => basis_set_a%nsgf_set
734 rpgfa => basis_set_a%pgf_radius
735 set_radius_a => basis_set_a%set_radius
736 scon_a => basis_set_a%scon
737 zeta => basis_set_a%zet
739 first_sgfb => basis_set_b%first_sgf
740 lb_max => basis_set_b%lmax
741 lb_min => basis_set_b%lmin
742 npgfb => basis_set_b%npgf
743 nsetb = basis_set_b%nset
744 nsgfb => basis_set_b%nsgf_set
745 rpgfb => basis_set_b%pgf_radius
746 set_radius_b => basis_set_b%set_radius
747 scon_b => basis_set_b%scon
748 zetb => basis_set_b%zet
751 ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
754 natorb_a = natorb_a + (2*basis_set_a%l(1, iset) + 1)
758 natorb_b = natorb_b + (2*basis_set_b%l(1, iset) + 1)
760 ALLOCATE (sint(natorb_a, natorb_b, maxder))
762 ALLOCATE (hint(natorb_a, natorb_b, maxder))
767 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
768 sgfa = first_sgfa(1, iset)
770 IF (set_radius_a(iset) + set_radius_b(jset) < dr) cycle
771 n2 = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
772 sgfb = first_sgfb(1, jset)
773 IF (calculate_forces)
THEN
774 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
775 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
776 rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
778 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
779 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
780 rij, sab=oint(:, :, 1))
783 CALL contraction(oint(:, :, 1), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
784 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
785 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, 1), sgfa, sgfb, trans=.false.)
786 IF (calculate_forces)
THEN
788 CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
789 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.false.)
790 CALL block_add(
"IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.false.)
797 IF (icol <= irow)
THEN
798 sblock(:, :) = sblock(:, :) + sint(:, :, 1)
800 sblock(:, :) = sblock(:, :) + transpose(sint(:, :, 1))
804 IF (icol == irow .AND. dr < 0.001_dp)
THEN
806 n1 = tb%calc%bas%ish_at(icol)
808 sgfa = first_sgfa(1, iset)
809 hij = tb%selfenergy(n1 + iset)
810 DO ia = sgfa, sgfa + nsgfa(iset) - 1
811 hint(ia, ia, 1) = hij
816 rr = sqrt(dr/(h0%rad(jkind) + h0%rad(ikind)))
817 n1 = tb%calc%bas%ish_at(icol)
820 sgfa = first_sgfa(1, iset)
821 sgfa0 = sgfa0 + tb%calc%bas%cgto(iset, tb%mol%id(icol))%nprim
822 n2 = tb%calc%bas%ish_at(irow)
824 sgfb = first_sgfb(1, jset)
825 shpoly = (1.0_dp + h0%shpoly(iset, ikind)*rr) &
826 *(1.0_dp + h0%shpoly(jset, jkind)*rr)
827 hij = 0.5_dp*(tb%selfenergy(n1 + iset) + tb%selfenergy(n2 + jset)) &
828 *h0%hscale(iset, jset, ikind, jkind)*shpoly
829 DO ia = sgfa, sgfa + nsgfa(iset) - 1
830 DO ib = sgfb, sgfb + nsgfb(jset) - 1
831 hint(ia, ib, 1) = hij*sint(ia, ib, 1)
839 IF (icol <= irow)
THEN
840 fblock(:, :) = fblock(:, :) + hint(:, :, 1)
842 fblock(:, :) = fblock(:, :) + transpose(hint(:, :, 1))
845 DEALLOCATE (oint, owork, sint, hint)
851 DO i = 1,
SIZE(matrix_s, 1)
854 DO i = 1,
SIZE(matrix_h, 1)
860 IF (dft_control%qs_control%xtb_control%tblite_method ==
gfn2xtb) &
866 IF (.NOT. calculate_forces)
THEN
868 "DFT%PRINT%OVERLAP_CONDITION") .NE. 0)
THEN
872 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%DIAGONALIZATION", l_val=norml2)
873 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%OVERLAP_CONDITION%ARNOLDI", l_val=use_arnoldi)
874 CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env)
875 CALL overlap_condnum(matrix_s, condnum, iw, norml1, norml2, use_arnoldi, blacs_env)
879 DEALLOCATE (basis_set_list)
881 CALL timestop(handle)
885 mark_used(calculate_forces)
886 cpabort(
"Built without TBLITE")
904 LOGICAL,
INTENT(IN) :: calculate_forces
905 LOGICAL,
INTENT(IN) :: use_rho
909 INTEGER :: iatom, ikind, is, ns, atom_a, ii, im
910 INTEGER :: nimg, nkind, nsgf, natorb, na
911 INTEGER :: n_atom, max_orb, max_shell
912 LOGICAL :: do_dipole, do_quadrupole
913 REAL(kind=
dp) :: norm
914 INTEGER,
DIMENSION(5) :: occ
915 INTEGER,
DIMENSION(25) :: lao
916 INTEGER,
DIMENSION(25) :: nao
917 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ch_atom, ch_shell, ch_ref, ch_orb
918 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, ao_dip, ao_quad
921 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, matrix_p
926 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
933 do_quadrupole = .false.
936 NULLIFY (particle_set, qs_kind_set, atomic_kind_set)
937 CALL get_qs_env(qs_env=qs_env, scf_env=scf_env, particle_set=particle_set, qs_kind_set=qs_kind_set, &
938 atomic_kind_set=atomic_kind_set, matrix_s_kp=matrix_s, rho=rho, para_env=para_env)
942 IF (
ASSOCIATED(tb%dipbra)) do_dipole = .true.
943 IF (
ASSOCIATED(tb%quadbra)) do_quadrupole = .true.
945 matrix_p => scf_env%p_mix_new
947 n_atom =
SIZE(particle_set)
948 nkind =
SIZE(atomic_kind_set)
949 nimg = dft_control%nimages
951 ALLOCATE (aocg(nsgf, n_atom))
953 IF (do_dipole)
ALLOCATE (ao_dip(n_atom, dip_n))
954 IF (do_quadrupole)
ALLOCATE (ao_quad(n_atom, quad_n))
958 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
960 max_orb = max(max_orb, natorb)
963 max_shell = max(max_shell, tb%calc%bas%nsh_at(is))
965 ALLOCATE (ch_atom(n_atom, 1), ch_shell(n_atom, max_shell))
966 ALLOCATE (ch_orb(max_orb, n_atom), ch_ref(max_orb, n_atom))
972 CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
973 IF (do_dipole .OR. do_quadrupole)
THEN
974 cpabort(
"missing contraction with density matrix for multiple k-points")
977 NULLIFY (p_matrix, s_matrix)
978 p_matrix => matrix_p(:, 1)
979 s_matrix => matrix_s(1, 1)%matrix
980 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
983 CALL contract_dens(p_matrix, tb%dipbra(im)%matrix, tb%dipket(im)%matrix, ao_dip(:, im), para_env)
986 IF (do_quadrupole)
THEN
988 CALL contract_dens(p_matrix, tb%quadbra(im)%matrix, tb%quadket(im)%matrix, ao_quad(:, im), para_env)
995 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
998 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1001 norm = 2*lao(is) + 1
1002 ch_ref(is, atom_a) = tb%calc%h0%refocc(nao(is), ikind)/norm
1003 ch_orb(is, atom_a) = aocg(is, atom_a) - ch_ref(is, atom_a)
1004 ch_shell(atom_a, ns) = ch_orb(is, atom_a) + ch_shell(atom_a, ns)
1006 ch_atom(atom_a, 1) = sum(ch_orb(:, atom_a))
1012 IF (dft_control%qs_control%do_ls_scf)
THEN
1015 CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
1016 ch_shell, para_env, scf_env%iter_count)
1023 DO iatom = 1, n_atom
1024 ii = tb%calc%bas%ish_at(iatom)
1025 DO is = 1, tb%calc%bas%nsh_at(iatom)
1026 tb%wfn%qsh(ii + is, 1) = -ch_shell(iatom, is)
1028 tb%wfn%qat(iatom, 1) = -ch_atom(iatom, 1)
1032 DO iatom = 1, n_atom
1034 tb%wfn%dpat(im, iatom, 1) = -ao_dip(iatom, im)
1039 IF (do_quadrupole)
THEN
1040 DO iatom = 1, n_atom
1042 tb%wfn%qpat(im, iatom, 1) = -ao_quad(iatom, im)
1045 DEALLOCATE (ao_quad)
1048 IF (
ALLOCATED(tb%calc%coulomb))
THEN
1049 CALL tb%calc%coulomb%get_potential(tb%mol, tb%cache, tb%wfn, tb%pot)
1050 CALL tb%calc%coulomb%get_energy(tb%mol, tb%cache, tb%wfn, tb%e_es)
1052 IF (
ALLOCATED(tb%calc%dispersion))
THEN
1053 CALL tb%calc%dispersion%get_potential(tb%mol, tb%dcache, tb%wfn, tb%pot)
1054 CALL tb%calc%dispersion%get_energy(tb%mol, tb%dcache, tb%wfn, tb%e_scd)
1057 IF (calculate_forces)
THEN
1058 IF (
ALLOCATED(tb%calc%coulomb))
THEN
1060 CALL tb%calc%coulomb%get_gradient(tb%mol, tb%cache, tb%wfn, tb%grad, tb%sigma)
1061 CALL tb_grad2force(qs_env, tb, para_env, 3)
1064 IF (
ALLOCATED(tb%calc%dispersion))
THEN
1066 CALL tb%calc%dispersion%get_gradient(tb%mol, tb%dcache, tb%wfn, tb%grad, tb%sigma)
1067 CALL tb_grad2force(qs_env, tb, para_env, 2)
1071 DEALLOCATE (ch_atom, ch_shell, ch_orb, ch_ref)
1076 mark_used(dft_control)
1077 mark_used(calculate_forces)
1079 cpabort(
"Built without TBLITE")
1096#if defined(__TBLITE)
1098 INTEGER :: ikind, jkind, iatom, jatom, icol, irow
1099 INTEGER :: ic, is, nimg, ni, nj, i, j
1100 INTEGER :: la, lb, za, zb
1102 INTEGER,
DIMENSION(3) :: cellind
1103 INTEGER,
DIMENSION(25) :: naoa, naob
1104 REAL(kind=
dp),
DIMENSION(3) :: rij
1105 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, sum_shell
1106 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ashift, bshift
1107 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ksblock, sblock
1108 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1109 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: dip_ket1, dip_ket2, dip_ket3, &
1110 dip_bra1, dip_bra2, dip_bra3
1111 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: quad_ket1, quad_ket2, quad_ket3, &
1112 quad_ket4, quad_ket5, quad_ket6, &
1113 quad_bra1, quad_bra2, quad_bra3, &
1114 quad_bra4, quad_bra5, quad_bra6
1118 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
1119 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
1122 DIMENSION(:),
POINTER :: nl_iterator
1125 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1128 nimg = dft_control%nimages
1130 NULLIFY (matrix_s, ks_matrix, n_list, qs_kind_set)
1131 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)
1134 ALLOCATE (sum_shell(tb%mol%nat))
1136 DO j = 1, tb%mol%nat
1138 i = i + tb%calc%bas%nsh_at(j)
1143 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
1150 ikind = kind_of(irow)
1151 jkind = kind_of(icol)
1154 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1155 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1159 ni =
SIZE(sblock, 1)
1160 ALLOCATE (ashift(ni, ni))
1163 la = naoa(i) + sum_shell(irow)
1164 ashift(i, i) = tb%pot%vsh(la, 1)
1167 nj =
SIZE(sblock, 2)
1168 ALLOCATE (bshift(nj, nj))
1171 lb = naob(j) + sum_shell(icol)
1172 bshift(j, j) = tb%pot%vsh(lb, 1)
1175 DO is = 1,
SIZE(ks_matrix, 1)
1178 row=irow, col=icol, block=ksblock, found=found)
1180 ksblock = ksblock - 0.5_dp*(matmul(ashift, sblock) &
1181 + matmul(sblock, bshift))
1182 ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
1183 + tb%pot%vat(icol, 1))*sblock
1185 DEALLOCATE (ashift, bshift)
1189 IF (
ASSOCIATED(tb%dipbra))
THEN
1194 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1196 row=irow, col=icol, block=dip_bra1, found=found)
1199 row=irow, col=icol, block=dip_bra2, found=found)
1202 row=irow, col=icol, block=dip_bra3, found=found)
1204 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1206 row=irow, col=icol, block=dip_ket1, found=found)
1209 row=irow, col=icol, block=dip_ket2, found=found)
1212 row=irow, col=icol, block=dip_ket3, found=found)
1215 DO is = 1,
SIZE(ks_matrix, 1)
1218 row=irow, col=icol, block=ksblock, found=found)
1220 ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
1221 + dip_ket2*tb%pot%vdp(2, irow, 1) &
1222 + dip_ket3*tb%pot%vdp(3, irow, 1) &
1223 + dip_bra1*tb%pot%vdp(1, icol, 1) &
1224 + dip_bra2*tb%pot%vdp(2, icol, 1) &
1225 + dip_bra3*tb%pot%vdp(3, icol, 1))
1231 IF (
ASSOCIATED(tb%quadbra))
THEN
1236 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1238 row=irow, col=icol, block=quad_bra1, found=found)
1241 row=irow, col=icol, block=quad_bra2, found=found)
1244 row=irow, col=icol, block=quad_bra3, found=found)
1247 row=irow, col=icol, block=quad_bra4, found=found)
1250 row=irow, col=icol, block=quad_bra5, found=found)
1253 row=irow, col=icol, block=quad_bra6, found=found)
1256 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1258 row=irow, col=icol, block=quad_ket1, found=found)
1261 row=irow, col=icol, block=quad_ket2, found=found)
1264 row=irow, col=icol, block=quad_ket3, found=found)
1267 row=irow, col=icol, block=quad_ket4, found=found)
1270 row=irow, col=icol, block=quad_ket5, found=found)
1273 row=irow, col=icol, block=quad_ket6, found=found)
1276 DO is = 1,
SIZE(ks_matrix, 1)
1279 row=irow, col=icol, block=ksblock, found=found)
1282 ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
1283 + quad_ket2*tb%pot%vqp(2, irow, 1) &
1284 + quad_ket3*tb%pot%vqp(3, irow, 1) &
1285 + quad_ket4*tb%pot%vqp(4, irow, 1) &
1286 + quad_ket5*tb%pot%vqp(5, irow, 1) &
1287 + quad_ket6*tb%pot%vqp(6, irow, 1) &
1288 + quad_bra1*tb%pot%vqp(1, icol, 1) &
1289 + quad_bra2*tb%pot%vqp(2, icol, 1) &
1290 + quad_bra3*tb%pot%vqp(3, icol, 1) &
1291 + quad_bra4*tb%pot%vqp(4, icol, 1) &
1292 + quad_bra5*tb%pot%vqp(5, icol, 1) &
1293 + quad_bra6*tb%pot%vqp(6, icol, 1))
1300 cpabort(
"GFN methods with k-points not tested")
1302 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
1303 NULLIFY (cell_to_index)
1306 NULLIFY (nl_iterator)
1310 iatom=iatom, jatom=jatom, r=rij, cell=cellind)
1312 icol = max(iatom, jatom)
1313 irow = min(iatom, jatom)
1315 IF (icol == jatom)
THEN
1322 ic = cell_to_index(cellind(1), cellind(2), cellind(3))
1327 row=irow, col=icol, block=sblock, found=found)
1331 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1332 CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1336 ni =
SIZE(sblock, 1)
1337 ALLOCATE (ashift(ni, ni))
1340 la = naoa(i) + sum_shell(irow)
1341 ashift(i, i) = tb%pot%vsh(la, 1)
1344 nj =
SIZE(sblock, 2)
1345 ALLOCATE (bshift(nj, nj))
1348 lb = naob(j) + sum_shell(icol)
1349 bshift(j, j) = tb%pot%vsh(lb, 1)
1352 DO is = 1,
SIZE(ks_matrix, 1)
1355 row=irow, col=icol, block=ksblock, found=found)
1357 ksblock = ksblock - 0.5_dp*(matmul(ashift, sblock) &
1358 + matmul(sblock, bshift))
1359 ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
1360 + tb%pot%vat(icol, 1))*sblock
1365 IF (
ASSOCIATED(tb%dipbra))
THEN
1366 NULLIFY (nl_iterator)
1370 iatom=iatom, jatom=jatom, cell=cellind)
1371 icol = max(iatom, jatom)
1372 irow = min(iatom, jatom)
1374 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1376 row=irow, col=icol, block=dip_bra1, found=found)
1379 row=irow, col=icol, block=dip_bra2, found=found)
1382 row=irow, col=icol, block=dip_bra3, found=found)
1384 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1386 row=irow, col=icol, block=dip_ket1, found=found)
1389 row=irow, col=icol, block=dip_ket2, found=found)
1392 row=irow, col=icol, block=dip_ket3, found=found)
1395 DO is = 1,
SIZE(ks_matrix, 1)
1398 row=irow, col=icol, block=ksblock, found=found)
1400 ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
1401 + dip_ket2*tb%pot%vdp(2, irow, 1) &
1402 + dip_ket3*tb%pot%vdp(3, irow, 1) &
1403 + dip_bra1*tb%pot%vdp(1, icol, 1) &
1404 + dip_bra2*tb%pot%vdp(2, icol, 1) &
1405 + dip_bra3*tb%pot%vdp(3, icol, 1))
1411 IF (
ASSOCIATED(tb%quadbra))
THEN
1412 NULLIFY (nl_iterator)
1416 iatom=iatom, jatom=jatom, cell=cellind)
1417 icol = max(iatom, jatom)
1418 irow = min(iatom, jatom)
1420 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1422 row=irow, col=icol, block=quad_bra1, found=found)
1425 row=irow, col=icol, block=quad_bra2, found=found)
1428 row=irow, col=icol, block=quad_bra3, found=found)
1431 row=irow, col=icol, block=quad_bra4, found=found)
1434 row=irow, col=icol, block=quad_bra5, found=found)
1437 row=irow, col=icol, block=quad_bra6, found=found)
1440 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1442 row=irow, col=icol, block=quad_ket1, found=found)
1445 row=irow, col=icol, block=quad_ket2, found=found)
1448 row=irow, col=icol, block=quad_ket3, found=found)
1451 row=irow, col=icol, block=quad_ket4, found=found)
1454 row=irow, col=icol, block=quad_ket5, found=found)
1457 row=irow, col=icol, block=quad_ket6, found=found)
1460 DO is = 1,
SIZE(ks_matrix, 1)
1463 row=irow, col=icol, block=ksblock, found=found)
1466 ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
1467 + quad_ket2*tb%pot%vqp(2, irow, 1) &
1468 + quad_ket3*tb%pot%vqp(3, irow, 1) &
1469 + quad_ket4*tb%pot%vqp(4, irow, 1) &
1470 + quad_ket5*tb%pot%vqp(5, irow, 1) &
1471 + quad_ket6*tb%pot%vqp(6, irow, 1) &
1472 + quad_bra1*tb%pot%vqp(1, icol, 1) &
1473 + quad_bra2*tb%pot%vqp(2, icol, 1) &
1474 + quad_bra3*tb%pot%vqp(3, icol, 1) &
1475 + quad_bra4*tb%pot%vqp(4, icol, 1) &
1476 + quad_bra5*tb%pot%vqp(5, icol, 1) &
1477 + quad_bra6*tb%pot%vqp(6, icol, 1))
1488 mark_used(dft_control)
1489 cpabort(
"Built without TBLITE")
1504#if defined(__TBLITE)
1506 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tb_get_multipole'
1508 INTEGER :: ikind, jkind, iatom, jatom, icol, irow, iset, jset, ityp, jtyp
1509 INTEGER :: nkind, natom, handle, nimg, i, inda, indb
1510 INTEGER :: atom_a, atom_b, nseta, nsetb, ia, ib, ij
1513 REAL(kind=
dp),
DIMENSION(3) :: rij
1514 INTEGER,
DIMENSION(:),
POINTER :: la_max, lb_max
1515 INTEGER,
DIMENSION(:),
POINTER :: nsgfa, nsgfb
1516 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
1517 INTEGER,
ALLOCATABLE :: atom_of_kind(:)
1518 REAL(kind=
dp),
ALLOCATABLE :: stmp(:)
1519 REAL(kind=
dp),
ALLOCATABLE :: dtmp(:, :), qtmp(:, :), dtmpj(:, :), qtmpj(:, :)
1520 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: dip_ket1, dip_ket2, dip_ket3, &
1521 dip_bra1, dip_bra2, dip_bra3
1522 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: quad_ket1, quad_ket2, quad_ket3, &
1523 quad_ket4, quad_ket5, quad_ket6, &
1524 quad_bra1, quad_bra2, quad_bra3, &
1525 quad_bra4, quad_bra5, quad_bra6
1528 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
1534 DIMENSION(:),
POINTER :: nl_iterator
1536 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1538 CALL timeset(routinen, handle)
1541 NULLIFY (atomic_kind_set, qs_kind_set, sab_orb, particle_set)
1542 NULLIFY (dft_control, matrix_s)
1543 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
1544 qs_kind_set=qs_kind_set, &
1546 particle_set=particle_set, &
1547 dft_control=dft_control, &
1548 matrix_s_kp=matrix_s)
1549 natom =
SIZE(particle_set)
1550 nkind =
SIZE(atomic_kind_set)
1551 nimg = dft_control%nimages
1556 ALLOCATE (basis_set_list(nkind))
1559 ALLOCATE (stmp(msao(tb%calc%bas%maxl)**2))
1560 ALLOCATE (dtmp(dip_n, msao(tb%calc%bas%maxl)**2))
1561 ALLOCATE (qtmp(quad_n, msao(tb%calc%bas%maxl)**2))
1562 ALLOCATE (dtmpj(dip_n, msao(tb%calc%bas%maxl)**2))
1563 ALLOCATE (qtmpj(quad_n, msao(tb%calc%bas%maxl)**2))
1571 ALLOCATE (tb%dipbra(i)%matrix)
1572 ALLOCATE (tb%dipket(i)%matrix)
1573 CALL dbcsr_create(tb%dipbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
1574 name=
"DIPOLE BRAMATRIX")
1575 CALL dbcsr_create(tb%dipket(i)%matrix, template=matrix_s(1, 1)%matrix, &
1576 name=
"DIPOLE KETMATRIX")
1581 ALLOCATE (tb%quadbra(i)%matrix)
1582 ALLOCATE (tb%quadket(i)%matrix)
1583 CALL dbcsr_create(tb%quadbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
1584 name=
"QUADRUPOLE BRAMATRIX")
1585 CALL dbcsr_create(tb%quadket(i)%matrix, template=matrix_s(1, 1)%matrix, &
1586 name=
"QUADRUPOLE KETMATRIX")
1592 NULLIFY (nl_iterator)
1596 iatom=iatom, jatom=jatom, r=rij)
1598 r2 = norm2(rij(:))**2
1600 icol = max(iatom, jatom)
1601 irow = min(iatom, jatom)
1603 IF (icol == jatom)
THEN
1610 ityp = tb%mol%id(icol)
1611 jtyp = tb%mol%id(irow)
1613 NULLIFY (dip_bra1, dip_bra2, dip_bra3)
1615 row=irow, col=icol, block=dip_bra1, found=found)
1618 row=irow, col=icol, block=dip_bra2, found=found)
1621 row=irow, col=icol, block=dip_bra3, found=found)
1624 NULLIFY (dip_ket1, dip_ket2, dip_ket3)
1626 row=irow, col=icol, block=dip_ket1, found=found)
1629 row=irow, col=icol, block=dip_ket2, found=found)
1632 row=irow, col=icol, block=dip_ket3, found=found)
1635 NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
1637 row=irow, col=icol, block=quad_bra1, found=found)
1640 row=irow, col=icol, block=quad_bra2, found=found)
1643 row=irow, col=icol, block=quad_bra3, found=found)
1646 row=irow, col=icol, block=quad_bra4, found=found)
1649 row=irow, col=icol, block=quad_bra5, found=found)
1652 row=irow, col=icol, block=quad_bra6, found=found)
1655 NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
1657 row=irow, col=icol, block=quad_ket1, found=found)
1660 row=irow, col=icol, block=quad_ket2, found=found)
1663 row=irow, col=icol, block=quad_ket3, found=found)
1666 row=irow, col=icol, block=quad_ket4, found=found)
1669 row=irow, col=icol, block=quad_ket5, found=found)
1672 row=irow, col=icol, block=quad_ket6, found=found)
1676 basis_set_a => basis_set_list(ikind)%gto_basis_set
1677 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
1678 basis_set_b => basis_set_list(jkind)%gto_basis_set
1679 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
1680 atom_a = atom_of_kind(icol)
1681 atom_b = atom_of_kind(irow)
1683 first_sgfa => basis_set_a%first_sgf
1684 la_max => basis_set_a%lmax
1685 nseta = basis_set_a%nset
1686 nsgfa => basis_set_a%nsgf_set
1688 first_sgfb => basis_set_b%first_sgf
1689 lb_max => basis_set_b%lmax
1690 nsetb = basis_set_b%nset
1691 nsgfb => basis_set_b%nsgf_set
1694 IF (icol == irow)
THEN
1697 CALL multipole_cgto(tb%calc%bas%cgto(jset, ityp), tb%calc%bas%cgto(iset, ityp), &
1698 & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
1700 DO inda = 1, nsgfa(iset)
1701 ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
1702 DO indb = 1, nsgfb(jset)
1703 ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
1704 ij = indb + nsgfb(jset)*(inda - 1)
1706 dip_ket1(ib, ia) = dtmp(1, ij)
1707 dip_ket2(ib, ia) = dtmp(2, ij)
1708 dip_ket3(ib, ia) = dtmp(3, ij)
1710 quad_ket1(ib, ia) = qtmp(1, ij)
1711 quad_ket2(ib, ia) = qtmp(2, ij)
1712 quad_ket3(ib, ia) = qtmp(3, ij)
1713 quad_ket4(ib, ia) = qtmp(4, ij)
1714 quad_ket5(ib, ia) = qtmp(5, ij)
1715 quad_ket6(ib, ia) = qtmp(6, ij)
1717 dip_bra1(ib, ia) = dtmp(1, ij)
1718 dip_bra2(ib, ia) = dtmp(2, ij)
1719 dip_bra3(ib, ia) = dtmp(3, ij)
1721 quad_bra1(ib, ia) = qtmp(1, ij)
1722 quad_bra2(ib, ia) = qtmp(2, ij)
1723 quad_bra3(ib, ia) = qtmp(3, ij)
1724 quad_bra4(ib, ia) = qtmp(4, ij)
1725 quad_bra5(ib, ia) = qtmp(5, ij)
1726 quad_bra6(ib, ia) = qtmp(6, ij)
1734 CALL multipole_cgto(tb%calc%bas%cgto(jset, jtyp), tb%calc%bas%cgto(iset, ityp), &
1735 & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
1736 CALL multipole_cgto(tb%calc%bas%cgto(iset, ityp), tb%calc%bas%cgto(jset, jtyp), &
1737 & r2, rij, tb%calc%bas%intcut, stmp, dtmpj, qtmpj)
1739 DO inda = 1, nsgfa(iset)
1740 ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
1741 DO indb = 1, nsgfb(jset)
1742 ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
1744 ij = indb + nsgfb(jset)*(inda - 1)
1746 dip_bra1(ib, ia) = dtmp(1, ij)
1747 dip_bra2(ib, ia) = dtmp(2, ij)
1748 dip_bra3(ib, ia) = dtmp(3, ij)
1750 quad_bra1(ib, ia) = qtmp(1, ij)
1751 quad_bra2(ib, ia) = qtmp(2, ij)
1752 quad_bra3(ib, ia) = qtmp(3, ij)
1753 quad_bra4(ib, ia) = qtmp(4, ij)
1754 quad_bra5(ib, ia) = qtmp(5, ij)
1755 quad_bra6(ib, ia) = qtmp(6, ij)
1757 ij = inda + nsgfa(iset)*(indb - 1)
1759 dip_ket1(ib, ia) = dtmpj(1, ij)
1760 dip_ket2(ib, ia) = dtmpj(2, ij)
1761 dip_ket3(ib, ia) = dtmpj(3, ij)
1763 quad_ket1(ib, ia) = qtmpj(1, ij)
1764 quad_ket2(ib, ia) = qtmpj(2, ij)
1765 quad_ket3(ib, ia) = qtmpj(3, ij)
1766 quad_ket4(ib, ia) = qtmpj(4, ij)
1767 quad_ket5(ib, ia) = qtmpj(5, ij)
1768 quad_ket6(ib, ia) = qtmpj(6, ij)
1786 DEALLOCATE (basis_set_list)
1788 CALL timestop(handle)
1793 cpabort(
"Built without TBLITE")
1809 SUBROUTINE contract_dens(p_matrix, bra_mat, ket_mat, output, para_env)
1811 TYPE(
dbcsr_type),
POINTER :: bra_mat, ket_mat
1812 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: output
1815 CHARACTER(len=*),
PARAMETER :: routinen =
'contract_dens'
1817 INTEGER :: handle, i, iblock_col, iblock_row, &
1820 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: bra, ket, p_block
1823 CALL timeset(routinen, handle)
1825 nspin =
SIZE(p_matrix)
1830 NULLIFY (p_block, bra, ket)
1834 row=iblock_row, col=iblock_col, block=p_block, found=found)
1835 IF (.NOT. found) cycle
1837 row=iblock_row, col=iblock_col, block=ket, found=found)
1838 IF (.NOT. found) cpabort(
"missing block")
1840 IF (.NOT. (
ASSOCIATED(bra) .AND.
ASSOCIATED(p_block))) cycle
1841 DO j = 1,
SIZE(p_block, 1)
1842 DO i = 1,
SIZE(p_block, 2)
1843 output(iblock_row) = output(iblock_row) + p_block(j, i)*ket(j, i)
1846 IF (iblock_col /= iblock_row)
THEN
1847 DO j = 1,
SIZE(p_block, 1)
1848 DO i = 1,
SIZE(p_block, 2)
1849 output(iblock_col) = output(iblock_col) + p_block(j, i)*bra(j, i)
1857 CALL para_env%sum(output)
1858 CALL timestop(handle)
1860 END SUBROUTINE contract_dens
1870 SUBROUTINE tb_grad2force(qs_env, tb, para_env, ityp)
1877 CHARACTER(len=*),
PARAMETER :: routinen =
'tb_grad2force'
1879 INTEGER :: atoma, handle, iatom, ikind, natom
1880 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
1885 CALL timeset(routinen, handle)
1887 NULLIFY (force, atomic_kind_set)
1888 CALL get_qs_env(qs_env=qs_env, force=force, particle_set=particle_set, &
1889 atomic_kind_set=atomic_kind_set)
1891 atom_of_kind=atom_of_kind, kind_of=kind_of)
1893 natom =
SIZE(particle_set)
1897 cpabort(
"unknown force type")
1900 ikind = kind_of(iatom)
1901 atoma = atom_of_kind(iatom)
1902 force(ikind)%all_potential(:, atoma) = &
1903 force(ikind)%all_potential(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1907 ikind = kind_of(iatom)
1908 atoma = atom_of_kind(iatom)
1909 force(ikind)%repulsive(:, atoma) = &
1910 force(ikind)%repulsive(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1914 ikind = kind_of(iatom)
1915 atoma = atom_of_kind(iatom)
1916 force(ikind)%dispersion(:, atoma) = &
1917 force(ikind)%dispersion(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1921 ikind = kind_of(iatom)
1922 atoma = atom_of_kind(iatom)
1923 force(ikind)%rho_elec(:, atoma) = &
1924 force(ikind)%rho_elec(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1928 ikind = kind_of(iatom)
1929 atoma = atom_of_kind(iatom)
1930 force(ikind)%overlap(:, atoma) = &
1931 force(ikind)%overlap(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1935 ikind = kind_of(iatom)
1936 atoma = atom_of_kind(iatom)
1937 force(ikind)%efield(:, atoma) = &
1938 force(ikind)%efield(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
1942 CALL timestop(handle)
1944 END SUBROUTINE tb_grad2force
1951 SUBROUTINE tb_zero_force(qs_env)
1955 INTEGER :: iatom, ikind, natom
1956 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
1961 NULLIFY (force, atomic_kind_set)
1962 CALL get_qs_env(qs_env=qs_env, force=force, particle_set=particle_set, &
1963 atomic_kind_set=atomic_kind_set)
1967 natom =
SIZE(particle_set)
1970 ikind = kind_of(iatom)
1971 force(ikind)%all_potential = 0.0_dp
1972 force(ikind)%repulsive = 0.0_dp
1973 force(ikind)%dispersion = 0.0_dp
1974 force(ikind)%rho_elec = 0.0_dp
1975 force(ikind)%overlap = 0.0_dp
1976 force(ikind)%efield = 0.0_dp
1979 END SUBROUTINE tb_zero_force
1990 LOGICAL,
INTENT(IN) :: use_rho
1991 INTEGER,
INTENT(IN) :: nimg
1993#if defined(__TBLITE)
1994 INTEGER :: i, iatom, ic, ikind, ind, is, ish, &
1996 INTEGER,
DIMENSION(3) :: cellind
1997 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1999 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: de
2000 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pblock
2001 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p
2005 DIMENSION(:),
POINTER :: nl_iterator
2013 NULLIFY (scf_env, rho, tb, sab_orb, para_env, kpoints)
2014 CALL get_qs_env(qs_env=qs_env, scf_env=scf_env, rho=rho, tb_tblite=tb, &
2015 sab_orb=sab_orb, para_env=para_env, kpoints=kpoints)
2017 NULLIFY (cell_to_index)
2026 matrix_p => scf_env%p_mix_new
2029 ALLOCATE (de(tb%mol%nat))
2033 NULLIFY (nl_iterator)
2037 iatom=iatom, jatom=jatom, cell=cellind)
2039 IF (iatom /= jatom) cycle
2041 IF (ikind /= jkind) cpabort(
"Type wrong")
2043 is = tb%calc%bas%ish_at(iatom)
2048 ic = cell_to_index(cellind(1), cellind(2), cellind(3))
2052 IF (cellind(1) /= 0) cycle
2053 IF (cellind(2) /= 0) cycle
2054 IF (cellind(3) /= 0) cycle
2057 row=iatom, col=jatom, block=pblock, found=found)
2059 IF (.NOT. found) cpabort(
"block not found")
2062 DO ish = 1, tb%calc%bas%nsh_id(ikind)
2063 DO i = 1, msao(tb%calc%bas%cgto(ish, ikind)%ang)
2065 de(iatom) = de(iatom) + tb%dsedcn(is + ish)*pblock(ind, ind)
2070 CALL para_env%sum(de)
2073 CALL tb_add_grad(tb%grad, tb%dcndr, de, tb%mol%nat)
2074 IF (tb%use_virial)
CALL tb_add_sig(tb%sigma, tb%dcndL, de, tb%mol%nat)
2075 CALL tb_grad2force(qs_env, tb, para_env, 4)
2082 cpabort(
"Built without TBLITE")
2096 LOGICAL,
INTENT(IN) :: use_rho
2097 INTEGER,
INTENT(IN) :: nimg
2099#if defined(__TBLITE)
2100 INTEGER :: i, ij, iatom, ic, icol, ikind, ni, nj, nkind, nel, &
2101 sgfi, sgfj, ityp, jatom, jkind, jrow, jtyp, iset, jset, &
2102 nseti, nsetj, ia, ib, inda, indb
2103 INTEGER,
DIMENSION(3) :: cellind
2104 INTEGER,
DIMENSION(:),
POINTER :: nsgfa, nsgfb
2105 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
2106 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2108 REAL(kind=
dp) :: r2, itemp, jtemp, rr, hij, shpoly, dshpoly, idhdc, jdhdc, &
2109 scal, hp, i_a_shift, j_a_shift, ishift, jshift
2110 REAL(kind=
dp),
DIMENSION(3) :: rij, dgrad
2111 REAL(kind=
dp),
DIMENSION(3, 3) :: hsigma
2112 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: de, t_ov, idip, jdip, iquad, jquad
2113 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: t_dip, t_quad, t_d_ov
2114 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: t_i_dip, t_i_quad, t_j_dip, t_j_quad
2115 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pblock, wblock
2118 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_w
2124 DIMENSION(:),
POINTER :: nl_iterator
2127 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2130 TYPE(tb_hamiltonian),
POINTER :: h0
2134 NULLIFY (scf_env, rho, tb, sab_orb, para_env, kpoints, matrix_w)
2136 atomic_kind_set=atomic_kind_set, &
2141 para_env=para_env, &
2142 qs_kind_set=qs_kind_set, &
2144 matrix_w_kp=matrix_w)
2146 NULLIFY (cell_to_index)
2157 matrix_p => scf_env%p_mix_new
2161 nkind =
SIZE(atomic_kind_set)
2162 ALLOCATE (basis_set_list(nkind))
2165 ALLOCATE (de(tb%mol%nat))
2167 nel = msao(tb%calc%bas%maxl)**2
2168 ALLOCATE (t_ov(nel))
2169 ALLOCATE (t_d_ov(3, nel))
2170 ALLOCATE (t_dip(dip_n, nel))
2171 ALLOCATE (t_i_dip(3, dip_n, nel), t_j_dip(3, dip_n, nel))
2172 ALLOCATE (t_quad(quad_n, nel))
2173 ALLOCATE (t_i_quad(3, quad_n, nel), t_j_quad(3, quad_n, nel))
2175 ALLOCATE (idip(dip_n), jdip(dip_n))
2176 ALLOCATE (iquad(quad_n), jquad(quad_n))
2182 NULLIFY (nl_iterator)
2186 iatom=iatom, jatom=jatom, r=rij, cell=cellind)
2188 IF (iatom == jatom) cycle
2190 icol = max(iatom, jatom)
2191 jrow = min(iatom, jatom)
2193 IF (icol == jatom)
THEN
2200 ityp = tb%mol%id(icol)
2201 jtyp = tb%mol%id(jrow)
2204 rr = sqrt(r2/(h0%rad(ikind) + h0%rad(jkind)))
2208 basis_set_a => basis_set_list(ikind)%gto_basis_set
2209 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
2210 first_sgfa => basis_set_a%first_sgf
2211 nsgfa => basis_set_a%nsgf_set
2212 nseti = basis_set_a%nset
2213 basis_set_b => basis_set_list(jkind)%gto_basis_set
2214 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
2215 first_sgfb => basis_set_b%first_sgf
2216 nsgfb => basis_set_b%nsgf_set
2217 nsetj = basis_set_b%nset
2222 ic = cell_to_index(cellind(1), cellind(2), cellind(3))
2228 row=jrow, col=icol, block=pblock, found=found)
2229 IF (.NOT. found) cpabort(
"pblock not found")
2233 row=jrow, col=icol, block=wblock, found=found)
2236 i_a_shift = tb%pot%vat(icol, 1)
2237 j_a_shift = tb%pot%vat(jrow, 1)
2238 idip(:) = tb%pot%vdp(:, icol, 1)
2239 jdip(:) = tb%pot%vdp(:, jrow, 1)
2240 iquad(:) = tb%pot%vqp(:, icol, 1)
2241 jquad(:) = tb%pot%vqp(:, jrow, 1)
2243 ni = tb%calc%bas%ish_at(icol)
2245 sgfi = first_sgfa(1, iset)
2246 ishift = i_a_shift + tb%pot%vsh(ni + iset, 1)
2247 nj = tb%calc%bas%ish_at(jrow)
2249 sgfj = first_sgfb(1, jset)
2250 jshift = j_a_shift + tb%pot%vsh(nj + jset, 1)
2253 CALL multipole_grad_cgto(tb%calc%bas%cgto(iset, ityp), tb%calc%bas%cgto(jset, jtyp), &
2254 & r2, rij, tb%calc%bas%intcut, t_ov, t_dip, t_quad, t_d_ov, t_i_dip, t_i_quad, &
2255 & t_j_dip, t_j_quad)
2257 shpoly = (1.0_dp + h0%shpoly(iset, ikind)*rr) &
2258 *(1.0_dp + h0%shpoly(jset, jkind)*rr)
2259 dshpoly = ((1.0_dp + h0%shpoly(iset, ikind)*rr)*h0%shpoly(jset, jkind)*rr &
2260 + (1.0_dp + h0%shpoly(jset, jkind)*rr)*h0%shpoly(iset, ikind)*rr) &
2262 scal = h0%hscale(iset, jset, ikind, jkind)
2263 hij = 0.5_dp*(tb%selfenergy(ni + iset) + tb%selfenergy(nj + jset))*scal
2265 idhdc = tb%dsedcn(ni + iset)*shpoly*scal
2266 jdhdc = tb%dsedcn(nj + jset)*shpoly*scal
2271 DO inda = 1, nsgfa(iset)
2272 ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
2273 DO indb = 1, nsgfb(jset)
2274 ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
2276 ij = inda + nsgfa(iset)*(indb - 1)
2278 itemp = itemp + idhdc*pblock(ib, ia)*t_ov(ij)
2279 jtemp = jtemp + jdhdc*pblock(ib, ia)*t_ov(ij)
2281 hp = 2*hij*pblock(ib, ia)
2282 dgrad(:) = dgrad(:) &
2283 - (ishift + jshift)*pblock(ib, ia)*t_d_ov(:, ij) &
2284 - 2*wblock(ib, ia)*t_d_ov(:, ij) &
2285 + hp*shpoly*t_d_ov(:, ij) &
2286 + hp*dshpoly*t_ov(ij)*rij &
2287 - pblock(ib, ia)*( &
2288 matmul(t_i_dip(:, :, ij), idip) &
2289 + matmul(t_j_dip(:, :, ij), jdip) &
2290 + matmul(t_i_quad(:, :, ij), iquad) &
2291 + matmul(t_j_quad(:, :, ij), jquad))
2295 de(icol) = de(icol) + itemp
2296 de(jrow) = de(jrow) + jtemp
2297 tb%grad(:, icol) = tb%grad(:, icol) - dgrad
2298 tb%grad(:, jrow) = tb%grad(:, jrow) + dgrad
2299 IF ((tb%use_virial) .AND. (icol == jrow))
THEN
2302 hsigma(ia, ib) = hsigma(ia, ib) + 0.25_dp*(rij(ia)*dgrad(ib) + rij(ib)*dgrad(ia))
2308 hsigma(ia, ib) = hsigma(ia, ib) + 0.50_dp*(rij(ia)*dgrad(ib) + rij(ib)*dgrad(ia))
2317 CALL para_env%sum(hsigma)
2318 tb%sigma = tb%sigma + hsigma
2320 CALL para_env%sum(de)
2321 CALL para_env%sum(tb%grad)
2322 CALL tb_add_grad(tb%grad, tb%dcndr, de, tb%mol%nat)
2323 IF (tb%use_virial)
CALL tb_add_sig(tb%sigma, tb%dcndL, de, tb%mol%nat)
2324 CALL tb_grad2force(qs_env, tb, para_env, 4)
2327 DEALLOCATE (basis_set_list)
2329 DEALLOCATE (t_ov, t_d_ov)
2330 DEALLOCATE (t_dip, t_i_dip, t_j_dip)
2331 DEALLOCATE (t_quad, t_i_quad, t_j_quad)
2332 DEALLOCATE (idip, jdip, iquad, jquad)
2334 IF (tb%use_virial)
CALL tb_add_stress(qs_env, tb, para_env)
2340 cpabort(
"Built without TBLITE")
2351 SUBROUTINE tb_add_stress(qs_env, tb, para_env)
2360 CALL get_qs_env(qs_env=qs_env, virial=virial)
2362 virial%pv_virial = virial%pv_virial - tb%sigma/para_env%num_pe
2364 END SUBROUTINE tb_add_stress
2373 SUBROUTINE tb_add_grad(grad, deriv, dE, natom)
2375 REAL(kind=
dp),
DIMENSION(:, :) :: grad
2376 REAL(kind=
dp),
DIMENSION(:, :, :) :: deriv
2377 REAL(kind=
dp),
DIMENSION(:) :: de
2384 grad(:, i) = grad(:, i) + deriv(:, i, j)*de(j)
2388 END SUBROUTINE tb_add_grad
2397 SUBROUTINE tb_add_sig(sig, deriv, dE, natom)
2399 REAL(kind=
dp),
DIMENSION(:, :) :: sig
2400 REAL(kind=
dp),
DIMENSION(:, :, :) :: deriv
2401 REAL(kind=
dp),
DIMENSION(:) :: de
2408 sig(:, i) = sig(:, i) + deriv(:, i, j)*de(j)
2412 END SUBROUTINE tb_add_sig
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, do_rixs, 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_ham_add_coulomb(qs_env, tb, dft_control)
...
subroutine, public tb_init_wf(tb)
initialize wavefunction ...
subroutine, public tb_derive_dh_diag(qs_env, use_rho, nimg)
compute the derivative of the energy
subroutine, public tb_update_charges(qs_env, dft_control, tb, calculate_forces, use_rho)
...
subroutine, public tb_init_geometry(qs_env, tb)
intialize geometry objects ...
subroutine, public build_tblite_matrices(qs_env, calculate_forces)
...
subroutine, public tb_get_energy(qs_env, tb, energy)
...
subroutine, public tb_derive_dh_off(qs_env, use_rho, nimg)
compute the derivative of the energy
subroutine, public tb_get_multipole(qs_env, tb)
...
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.