LCOV - code coverage report
Current view: top level - src - tblite_interface.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 0.0 % 137 0
Test Date: 2025-12-04 06:27:48 Functions: 0.0 % 19 0

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief interface to tblite
      10              : !> \author JVP
      11              : !> \history creation 09.2024
      12              : ! **************************************************************************************************
      13              : 
      14              : MODULE tblite_interface
      15              : 
      16              : #if defined(__TBLITE)
      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
      33              : #endif
      34              :    USE ai_contraction, ONLY: block_add, &
      35              :                              contraction
      36              :    USE ai_overlap, ONLY: overlap_ab
      37              :    USE atomic_kind_types, ONLY: atomic_kind_type, get_atomic_kind, get_atomic_kind_set
      38              :    USE atprop_types, ONLY: atprop_type
      39              :    USE basis_set_types, ONLY: gto_basis_set_type, gto_basis_set_p_type, &
      40              :                               & allocate_gto_basis_set, write_gto_basis_set, process_gto_basis
      41              :    USE cell_types, ONLY: cell_type, get_cell
      42              :    USE cp_blacs_env, ONLY: cp_blacs_env_type
      43              :    USE cp_control_types, ONLY: dft_control_type
      44              :    USE cp_dbcsr_api, ONLY: dbcsr_type, dbcsr_p_type, dbcsr_create, dbcsr_add, &
      45              :                            dbcsr_get_block_p, dbcsr_finalize, &
      46              :                            dbcsr_iterator_type, dbcsr_iterator_blocks_left, &
      47              :                            dbcsr_iterator_start, dbcsr_iterator_stop, &
      48              :                            dbcsr_iterator_next_block
      49              :    USE cp_dbcsr_contrib, ONLY: dbcsr_print
      50              :    USE cp_dbcsr_cp2k_link, ONLY: cp_dbcsr_alloc_block_from_nbl
      51              :    USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set
      52              :    USE cp_log_handling, ONLY: cp_get_default_logger, &
      53              :                               cp_logger_type, cp_logger_get_default_io_unit
      54              :    USE cp_output_handling, ONLY: cp_print_key_should_output, &
      55              :                                  cp_print_key_unit_nr, cp_print_key_finished_output
      56              :    USE input_constants, ONLY: gfn1xtb, gfn2xtb, ipea1xtb
      57              :    USE input_section_types, ONLY: section_vals_val_get
      58              :    USE kinds, ONLY: dp, default_string_length
      59              :    USE kpoint_types, ONLY: get_kpoint_info, kpoint_type
      60              :    USE memory_utilities, ONLY: reallocate
      61              :    USE message_passing, ONLY: mp_para_env_type
      62              :    USE mulliken, ONLY: ao_charges
      63              :    USE orbital_pointers, ONLY: ncoset
      64              :    USE particle_types, ONLY: particle_type
      65              :    USE qs_charge_mixing, ONLY: charge_mixing
      66              :    USE qs_condnum, ONLY: overlap_condnum
      67              :    USE qs_energy_types, ONLY: qs_energy_type
      68              :    USE qs_environment_types, ONLY: get_qs_env, qs_environment_type
      69              :    USE qs_force_types, ONLY: qs_force_type
      70              :    USE qs_integral_utils, ONLY: basis_set_list_setup, get_memory_usage
      71              :    USE qs_kind_types, ONLY: get_qs_kind, qs_kind_type, get_qs_kind_set
      72              :    USE qs_ks_types, ONLY: qs_ks_env_type, set_ks_env
      73              :    USE qs_neighbor_list_types, ONLY: neighbor_list_iterator_create, neighbor_list_iterate, &
      74              :                                      get_iterator_info, neighbor_list_set_p_type, &
      75              :                                      neighbor_list_iterator_p_type, neighbor_list_iterator_release
      76              :    USE qs_overlap, ONLY: create_sab_matrix
      77              :    USE qs_rho_types, ONLY: qs_rho_get, qs_rho_type
      78              :    USE qs_scf_types, ONLY: qs_scf_env_type
      79              :    USE input_section_types, ONLY: section_vals_get_subs_vals, section_vals_type
      80              :    USE string_utilities, ONLY: integer_to_string
      81              :    USE tblite_types, ONLY: tblite_type, deallocate_tblite_type, allocate_tblite_type
      82              :    USE virial_types, ONLY: virial_type
      83              :    USE xtb_types, ONLY: get_xtb_atom_param, xtb_atom_type
      84              :    USE xtb_types, ONLY: xtb_atom_type
      85              : 
      86              : #include "./base/base_uses.f90"
      87              :    IMPLICIT NONE
      88              : 
      89              :    PRIVATE
      90              : 
      91              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tblite_interface'
      92              : 
      93              :    INTEGER, PARAMETER                                 :: dip_n = 3
      94              :    INTEGER, PARAMETER                                 :: quad_n = 6
      95              :    REAL(KIND=dp), PARAMETER                           :: same_atom = 0.00001_dp
      96              : 
      97              :    PUBLIC :: tb_set_calculator, tb_init_geometry, tb_init_wf
      98              :    PUBLIC :: tb_get_basis, build_tblite_matrices
      99              :    PUBLIC :: tb_get_energy, tb_update_charges, tb_ham_add_coulomb
     100              :    PUBLIC :: tb_get_multipole
     101              :    PUBLIC :: tb_derive_dH_diag, tb_derive_dH_off
     102              : 
     103              : CONTAINS
     104              : 
     105              : ! **************************************************************************************************
     106              : !> \brief intialize geometry objects ...
     107              : !> \param qs_env ...
     108              : !> \param tb ...
     109              : ! **************************************************************************************************
     110            0 :    SUBROUTINE tb_init_geometry(qs_env, tb)
     111              : 
     112              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     113              :       TYPE(tblite_type), POINTER                         :: tb
     114              : 
     115              : #if defined(__TBLITE)
     116              : 
     117              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tblite_init_geometry'
     118              : 
     119              :       TYPE(cell_type), POINTER                           :: cell
     120              :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     121              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     122              :       INTEGER                                            :: iatom, natom
     123              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: xyz
     124              :       INTEGER                                            :: handle, ikind
     125              :       INTEGER, DIMENSION(3)                              :: periodic
     126              :       LOGICAL, DIMENSION(3)                              :: lperiod
     127              : 
     128              :       CALL timeset(routineN, handle)
     129              : 
     130              :       !get info from environment vaiarable
     131              :       CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, cell=cell, qs_kind_set=qs_kind_set)
     132              : 
     133              :       !get information about particles
     134              :       natom = SIZE(particle_set)
     135              :       ALLOCATE (xyz(3, natom))
     136              :       CALL allocate_tblite_type(tb)
     137              :       ALLOCATE (tb%el_num(natom))
     138              :       tb%el_num = -9
     139              :       DO iatom = 1, natom
     140              :          xyz(:, iatom) = particle_set(iatom)%r(:)
     141              :          CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
     142              :          CALL get_qs_kind(qs_kind_set(ikind), zatom=tb%el_num(iatom))
     143              :          IF (tb%el_num(iatom) < 1 .OR. tb%el_num(iatom) > 85) THEN
     144              :             CPABORT("only elements 1-85 are supported by tblite")
     145              :          END IF
     146              :       END DO
     147              : 
     148              :       !get information about cell / lattice
     149              :       CALL get_cell(cell=cell, periodic=periodic)
     150              :       lperiod(1) = periodic(1) == 1
     151              :       lperiod(2) = periodic(2) == 1
     152              :       lperiod(3) = periodic(3) == 1
     153              : 
     154              :       !prepare for the call to the dispersion function
     155              :       CALL new(tb%mol, tb%el_num, xyz, lattice=cell%hmat, periodic=lperiod)
     156              : 
     157              :       DEALLOCATE (xyz)
     158              : 
     159              :       CALL timestop(handle)
     160              : 
     161              : #else
     162              :       MARK_USED(qs_env)
     163              :       MARK_USED(tb)
     164            0 :       CPABORT("Built without TBLITE")
     165              : #endif
     166              : 
     167            0 :    END SUBROUTINE tb_init_geometry
     168              : 
     169              : ! **************************************************************************************************
     170              : !> \brief updating coordinates...
     171              : !> \param qs_env ...
     172              : !> \param tb ...
     173              : ! **************************************************************************************************
     174            0 :    SUBROUTINE tb_update_geometry(qs_env, tb)
     175              : 
     176              :       TYPE(qs_environment_type)                          :: qs_env
     177              :       TYPE(tblite_type)                                  :: tb
     178              : 
     179              : #if defined(__TBLITE)
     180              : 
     181              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tblite_update_geometry'
     182              : 
     183              :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     184              :       INTEGER                                            :: iatom, natom
     185              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: xyz
     186              :       INTEGER                                            :: handle
     187              : 
     188              :       CALL timeset(routineN, handle)
     189              : 
     190              :       !get info from environment vaiarable
     191              :       CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
     192              : 
     193              :       !get information about particles
     194              :       natom = SIZE(particle_set)
     195              :       ALLOCATE (xyz(3, natom))
     196              :       DO iatom = 1, natom
     197              :          xyz(:, iatom) = particle_set(iatom)%r(:)
     198              :       END DO
     199              :       tb%mol%xyz(:, :) = xyz
     200              : 
     201              :       DEALLOCATE (xyz)
     202              : 
     203              :       CALL timestop(handle)
     204              : 
     205              : #else
     206              :       MARK_USED(qs_env)
     207              :       MARK_USED(tb)
     208            0 :       CPABORT("Built without TBLITE")
     209              : #endif
     210              : 
     211            0 :    END SUBROUTINE tb_update_geometry
     212              : 
     213              : ! **************************************************************************************************
     214              : !> \brief initialize wavefunction ...
     215              : !> \param tb ...
     216              : ! **************************************************************************************************
     217            0 :    SUBROUTINE tb_init_wf(tb)
     218              : 
     219              :       TYPE(tblite_type), POINTER                         :: tb
     220              : 
     221              : #if defined(__TBLITE)
     222              : 
     223              :       INTEGER, PARAMETER                                 :: nSpin = 1 !number of spin channels
     224              : 
     225              :       TYPE(scf_info)                                     :: info
     226              : 
     227              :       info = tb%calc%variable_info()
     228              :       IF (info%charge > shell_resolved) CPABORT("tblite: no support for orbital resolved charge")
     229              :       IF (info%dipole > atom_resolved) CPABORT("tblite: no support for shell resolved dipole moment")
     230              :       IF (info%quadrupole > atom_resolved) &
     231              :          CPABORT("tblite: no support shell resolved quadrupole moment")
     232              : 
     233              :       CALL new_wavefunction(tb%wfn, tb%mol%nat, tb%calc%bas%nsh, tb%calc%bas%nao, nSpin, 0.0_dp)
     234              : 
     235              :       CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
     236              : 
     237              :       !allocate quantities later required
     238              :       ALLOCATE (tb%e_hal(tb%mol%nat), tb%e_rep(tb%mol%nat), tb%e_disp(tb%mol%nat))
     239              :       ALLOCATE (tb%e_scd(tb%mol%nat), tb%e_es(tb%mol%nat))
     240              :       ALLOCATE (tb%selfenergy(tb%calc%bas%nsh))
     241              :       IF (ALLOCATED(tb%calc%ncoord)) ALLOCATE (tb%cn(tb%mol%nat))
     242              : 
     243              : #else
     244              :       MARK_USED(tb)
     245            0 :       CPABORT("Built without TBLITE")
     246              : #endif
     247              : 
     248            0 :    END SUBROUTINE tb_init_wf
     249              : 
     250              : ! **************************************************************************************************
     251              : !> \brief ...
     252              : !> \param tb ...
     253              : !> \param typ ...
     254              : ! **************************************************************************************************
     255            0 :    SUBROUTINE tb_set_calculator(tb, typ)
     256              : 
     257              :       TYPE(tblite_type), POINTER                         :: tb
     258              :       INTEGER                                            :: typ
     259              : 
     260              : #if defined(__TBLITE)
     261              : 
     262              :       TYPE(error_type), ALLOCATABLE                      :: error
     263              : 
     264              :       SELECT CASE (typ)
     265              :       CASE default
     266              :          CPABORT("Unknown xtb type")
     267              :       CASE (gfn1xtb)
     268              :          CALL new_gfn1_calculator(tb%calc, tb%mol, error)
     269              :       CASE (gfn2xtb)
     270              :          CALL new_gfn2_calculator(tb%calc, tb%mol, error)
     271              :       CASE (ipea1xtb)
     272              :          CALL new_ipea1_calculator(tb%calc, tb%mol, error)
     273              :       END SELECT
     274              : 
     275              : #else
     276              :       MARK_USED(tb)
     277              :       MARK_USED(typ)
     278            0 :       CPABORT("Built without TBLITE")
     279              : #endif
     280              : 
     281            0 :    END SUBROUTINE tb_set_calculator
     282              : 
     283              : ! **************************************************************************************************
     284              : !> \brief ...
     285              : !> \param qs_env ...
     286              : !> \param tb ...
     287              : !> \param para_env ...
     288              : ! **************************************************************************************************
     289            0 :    SUBROUTINE tb_init_ham(qs_env, tb, para_env)
     290              : 
     291              :       TYPE(qs_environment_type)                          :: qs_env
     292              :       TYPE(tblite_type)                                  :: tb
     293              :       TYPE(mp_para_env_type)                             :: para_env
     294              : 
     295              : #if defined(__TBLITE)
     296              : 
     297              :       TYPE(container_cache)                              :: hcache, rcache
     298              : 
     299              :       tb%e_hal = 0.0_dp
     300              :       tb%e_rep = 0.0_dp
     301              :       tb%e_disp = 0.0_dp
     302              :       IF (ALLOCATED(tb%grad)) THEN
     303              :          tb%grad = 0.0_dp
     304              :          CALL tb_zero_force(qs_env)
     305              :       END IF
     306              :       tb%sigma = 0.0_dp
     307              : 
     308              :       IF (ALLOCATED(tb%calc%halogen)) THEN
     309              :          CALL tb%calc%halogen%update(tb%mol, hcache)
     310              :          IF (ALLOCATED(tb%grad)) THEN
     311              :             tb%grad = 0.0_dp
     312              :             CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal, &
     313              :             & tb%grad, tb%sigma)
     314              :             CALL tb_grad2force(qs_env, tb, para_env, 0)
     315              :          ELSE
     316              :             CALL tb%calc%halogen%get_engrad(tb%mol, hcache, tb%e_hal)
     317              :          END IF
     318              :       END IF
     319              : 
     320              :       IF (ALLOCATED(tb%calc%repulsion)) THEN
     321              :          CALL tb%calc%repulsion%update(tb%mol, rcache)
     322              :          IF (ALLOCATED(tb%grad)) THEN
     323              :             tb%grad = 0.0_dp
     324              :             CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep, &
     325              :             & tb%grad, tb%sigma)
     326              :             CALL tb_grad2force(qs_env, tb, para_env, 1)
     327              :          ELSE
     328              :             CALL tb%calc%repulsion%get_engrad(tb%mol, rcache, tb%e_rep)
     329              :          END IF
     330              :       END IF
     331              : 
     332              :       IF (ALLOCATED(tb%calc%dispersion)) THEN
     333              :          CALL tb%calc%dispersion%update(tb%mol, tb%dcache)
     334              :          IF (ALLOCATED(tb%grad)) THEN
     335              :             tb%grad = 0.0_dp
     336              :             CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp, &
     337              :             & tb%grad, tb%sigma)
     338              :             CALL tb_grad2force(qs_env, tb, para_env, 2)
     339              :          ELSE
     340              :             CALL tb%calc%dispersion%get_engrad(tb%mol, tb%dcache, tb%e_disp)
     341              :          END IF
     342              :       END IF
     343              : 
     344              :       CALL new_potential(tb%pot, tb%mol, tb%calc%bas, tb%wfn%nspin)
     345              :       IF (ALLOCATED(tb%calc%coulomb)) THEN
     346              :          CALL tb%calc%coulomb%update(tb%mol, tb%cache)
     347              :       END IF
     348              : 
     349              :       IF (ALLOCATED(tb%grad)) THEN
     350              :          IF (ALLOCATED(tb%calc%ncoord)) THEN
     351              :             CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn, tb%dcndr, tb%dcndL)
     352              :          END IF
     353              :          CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
     354              :          &  tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
     355              :       ELSE
     356              :          IF (ALLOCATED(tb%calc%ncoord)) THEN
     357              :             CALL tb%calc%ncoord%get_cn(tb%mol, tb%cn)
     358              :          END IF
     359              :          CALL get_selfenergy(tb%calc%h0, tb%mol%id, tb%calc%bas%ish_at, &
     360              :          &  tb%calc%bas%nsh_id, cn=tb%cn, selfenergy=tb%selfenergy, dsedcn=tb%dsedcn)
     361              :       END IF
     362              : 
     363              : #else
     364              :       MARK_USED(qs_env)
     365              :       MARK_USED(tb)
     366              :       MARK_USED(para_env)
     367            0 :       CPABORT("Built without TBLITE")
     368              : #endif
     369              : 
     370            0 :    END SUBROUTINE tb_init_ham
     371              : 
     372              : ! **************************************************************************************************
     373              : !> \brief ...
     374              : !> \param qs_env ...
     375              : !> \param tb ...
     376              : !> \param energy ...
     377              : ! **************************************************************************************************
     378            0 :    SUBROUTINE tb_get_energy(qs_env, tb, energy)
     379              : 
     380              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     381              :       TYPE(tblite_type), POINTER                         :: tb
     382              :       TYPE(qs_energy_type), POINTER                      :: energy
     383              : 
     384              : #if defined(__TBLITE)
     385              : 
     386              :       INTEGER                                            :: iounit
     387              :       TYPE(cp_logger_type), POINTER                      :: logger
     388              :       TYPE(section_vals_type), POINTER                   :: scf_section
     389              : 
     390              :       NULLIFY (scf_section, logger)
     391              : 
     392              :       logger => cp_get_default_logger()
     393              :       iounit = cp_logger_get_default_io_unit(logger)
     394              :       scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
     395              : 
     396              :       energy%repulsive = SUM(tb%e_rep)
     397              :       energy%el_stat = SUM(tb%e_es)
     398              :       energy%dispersion = SUM(tb%e_disp)
     399              :       energy%dispersion_sc = SUM(tb%e_scd)
     400              :       energy%xtb_xb_inter = SUM(tb%e_hal)
     401              : 
     402              :       energy%total = energy%core + energy%repulsive + energy%el_stat + energy%dispersion &
     403              :                      + energy%dispersion_sc + energy%xtb_xb_inter + energy%kTS &
     404              :                      + energy%efield + energy%qmmm_el
     405              : 
     406              :       iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
     407              :                                     extension=".scfLog")
     408              :       IF (iounit > 0) THEN
     409              :          WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
     410              :             "Repulsive pair potential energy:               ", energy%repulsive, &
     411              :             "Zeroth order Hamiltonian energy:               ", energy%core, &
     412              :             "Electrostatic energy:                          ", energy%el_stat, &
     413              :             "Self-consistent dispersion energy:             ", energy%dispersion_sc, &
     414              :             "Non-self consistent dispersion energy:         ", energy%dispersion
     415              :          WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
     416              :             "Correction for halogen bonding:                ", energy%xtb_xb_inter
     417              :          IF (ABS(energy%efield) > 1.e-12_dp) THEN
     418              :             WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
     419              :                "Electric field interaction energy:             ", energy%efield
     420              :          END IF
     421              :          IF (qs_env%qmmm) THEN
     422              :             WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
     423              :                "QM/MM Electrostatic energy:                    ", energy%qmmm_el
     424              :          END IF
     425              :       END IF
     426              :       CALL cp_print_key_finished_output(iounit, logger, scf_section, &
     427              :                                         "PRINT%DETAILED_ENERGY")
     428              : 
     429              : #else
     430              :       MARK_USED(qs_env)
     431              :       MARK_USED(tb)
     432              :       MARK_USED(energy)
     433            0 :       CPABORT("Built without TBLITE")
     434              : #endif
     435              : 
     436            0 :    END SUBROUTINE tb_get_energy
     437              : 
     438              : ! **************************************************************************************************
     439              : !> \brief ...
     440              : !> \param tb ...
     441              : !> \param gto_basis_set ...
     442              : !> \param element_symbol ...
     443              : !> \param param ...
     444              : !> \param occ ...
     445              : ! **************************************************************************************************
     446            0 :    SUBROUTINE tb_get_basis(tb, gto_basis_set, element_symbol, param, occ)
     447              : 
     448              :       TYPE(tblite_type), POINTER                         :: tb
     449              :       TYPE(gto_basis_set_type), POINTER                  :: gto_basis_set
     450              :       CHARACTER(len=2), INTENT(IN)                       :: element_symbol
     451              :       TYPE(xtb_atom_type), POINTER                       :: param
     452              :       INTEGER, DIMENSION(5), INTENT(out)                 :: occ
     453              : 
     454              : #if defined(__TBLITE)
     455              : 
     456              :       CHARACTER(LEN=default_string_length)               :: sng
     457              :       INTEGER                                            :: ang, i_type, id_atom, ind_ao, ipgf, iSH, &
     458              :                                                             ishell, ityp, maxl, mprim, natorb, &
     459              :                                                             nset, nshell
     460              :       LOGICAL                                            :: do_ortho
     461              : 
     462              :       CALL allocate_gto_basis_set(gto_basis_set)
     463              : 
     464              :       !identifying element in the bas data
     465              :       CALL symbol_to_number(i_type, element_symbol)
     466              :       DO id_atom = 1, tb%mol%nat
     467              :          IF (i_type == tb%el_num(id_atom)) EXIT
     468              :       END DO
     469              :       param%z = i_type
     470              :       param%symbol = element_symbol
     471              :       param%defined = .TRUE.
     472              :       ityp = tb%mol%id(id_atom)
     473              : 
     474              :       !getting size information
     475              :       nset = tb%calc%bas%nsh_id(ityp)
     476              :       nshell = 1
     477              :       mprim = 0
     478              :       DO ishell = 1, nset
     479              :          mprim = MAX(mprim, tb%calc%bas%cgto(ishell, ityp)%nprim)
     480              :       END DO
     481              :       param%nshell = nset
     482              :       natorb = 0
     483              : 
     484              :       !write basis set information
     485              :       CALL integer_to_string(mprim, sng)
     486              :       gto_basis_set%name = element_symbol//"_STO-"//TRIM(sng)//"G"
     487              :       gto_basis_set%nset = nset
     488              :       CALL reallocate(gto_basis_set%lmax, 1, nset)
     489              :       CALL reallocate(gto_basis_set%lmin, 1, nset)
     490              :       CALL reallocate(gto_basis_set%npgf, 1, nset)
     491              :       CALL reallocate(gto_basis_set%nshell, 1, nset)
     492              :       CALL reallocate(gto_basis_set%n, 1, 1, 1, nset)
     493              :       CALL reallocate(gto_basis_set%l, 1, 1, 1, nset)
     494              :       CALL reallocate(gto_basis_set%zet, 1, mprim, 1, nset)
     495              :       CALL reallocate(gto_basis_set%gcc, 1, mprim, 1, 1, 1, nset)
     496              : 
     497              :       ind_ao = 0
     498              :       maxl = 0
     499              :       DO ishell = 1, nset
     500              :          ang = tb%calc%bas%cgto(ishell, ityp)%ang
     501              :          natorb = natorb + (2*ang + 1)
     502              :          param%lval(ishell) = ang
     503              :          maxl = MAX(ang, maxl)
     504              :          gto_basis_set%lmax(ishell) = ang
     505              :          gto_basis_set%lmin(ishell) = ang
     506              :          gto_basis_set%npgf(ishell) = tb%calc%bas%cgto(ishell, ityp)%nprim
     507              :          gto_basis_set%nshell(ishell) = nshell
     508              :          gto_basis_set%n(1, ishell) = ang + 1
     509              :          gto_basis_set%l(1, ishell) = ang
     510              :          DO ipgf = 1, gto_basis_set%npgf(ishell)
     511              :             gto_basis_set%gcc(ipgf, 1, ishell) = tb%calc%bas%cgto(ishell, ityp)%coeff(ipgf)
     512              :             gto_basis_set%zet(ipgf, ishell) = tb%calc%bas%cgto(ishell, ityp)%alpha(ipgf)
     513              :          END DO
     514              :          DO ipgf = 1, (2*ang + 1)
     515              :             ind_ao = ind_ao + 1
     516              :             param%lao(ind_ao) = ang
     517              :             param%nao(ind_ao) = ishell
     518              :          END DO
     519              :       END DO
     520              : 
     521              :       do_ortho = .FALSE.
     522              :       CALL process_gto_basis(gto_basis_set, do_ortho, nset, maxl)
     523              : 
     524              :       !setting additional values in parameter
     525              :       param%rcut = get_cutoff(tb%calc%bas)
     526              :       param%natorb = natorb
     527              :       param%lmax = maxl !max angular momentum
     528              : 
     529              :       !getting occupation
     530              :       occ = 0
     531              :       DO iSh = 1, MIN(tb%calc%bas%nsh_at(id_atom), 5)
     532              :          occ(iSh) = NINT(tb%calc%h0%refocc(iSh, ityp))
     533              :          param%occupation(iSh) = occ(iSh)
     534              :       END DO
     535              :       param%zeff = SUM(occ) !effective core charge
     536              : 
     537              :       !set normalization process
     538              :       gto_basis_set%norm_type = 3
     539              : 
     540              : #else
     541            0 :       occ = 0
     542              :       MARK_USED(tb)
     543              :       MARK_USED(gto_basis_set)
     544              :       MARK_USED(element_symbol)
     545              :       MARK_USED(param)
     546            0 :       CPABORT("Built without TBLITE")
     547              : #endif
     548              : 
     549            0 :    END SUBROUTINE tb_get_basis
     550              : 
     551              : ! **************************************************************************************************
     552              : !> \brief ...
     553              : !> \param qs_env ...
     554              : !> \param calculate_forces ...
     555              : ! **************************************************************************************************
     556            0 :    SUBROUTINE build_tblite_matrices(qs_env, calculate_forces)
     557              : 
     558              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     559              :       LOGICAL, INTENT(IN)                                :: calculate_forces
     560              : 
     561              : #if defined(__TBLITE)
     562              : 
     563              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'build_tblite_matrices'
     564              : 
     565              :       INTEGER                                            :: handle, maxder, nderivatives, nimg, img, nkind, i, ic, iw, &
     566              :                                                             iatom, jatom, ikind, jkind, iset, jset, n1, n2, icol, irow, &
     567              :                                                             ia, ib, sgfa, sgfb, atom_a, atom_b, &
     568              :                                                             ldsab, nseta, nsetb, natorb_a, natorb_b, sgfa0
     569              :       LOGICAL                                            :: found, norml1, norml2, use_arnoldi
     570              :       REAL(KIND=dp)                                      :: dr, rr
     571              :       INTEGER, DIMENSION(3)                              :: cell
     572              :       REAL(KIND=dp)                                      :: hij, shpoly
     573              :       REAL(KIND=dp), DIMENSION(2)                        :: condnum
     574              :       REAL(KIND=dp), DIMENSION(3)                        :: rij
     575              :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind
     576              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: owork
     577              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: oint, sint, hint
     578              :       INTEGER, DIMENSION(:), POINTER                     :: la_max, la_min, lb_max, lb_min
     579              :       INTEGER, DIMENSION(:), POINTER                     :: npgfa, npgfb, nsgfa, nsgfb
     580              :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa, first_sgfb
     581              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: set_radius_a, set_radius_b
     582              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: rpgfa, rpgfb, zeta, zetb, scon_a, scon_b
     583              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: sblock, fblock
     584              : 
     585              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER         :: atomic_kind_set
     586              :       TYPE(atprop_type), POINTER                            :: atprop
     587              :       TYPE(cp_blacs_env_type), POINTER                      :: blacs_env
     588              :       TYPE(cp_logger_type), POINTER                         :: logger
     589              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER          :: matrix_h, matrix_s, matrix_p, matrix_w
     590              :       TYPE(dft_control_type), POINTER                       :: dft_control
     591              :       TYPE(qs_force_type), DIMENSION(:), POINTER            :: force
     592              :       TYPE(gto_basis_set_type), POINTER                     :: basis_set_a, basis_set_b
     593              :       TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER     :: basis_set_list
     594              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), POINTER :: sab_orb
     595              :       TYPE(neighbor_list_iterator_p_type), &
     596              :          DIMENSION(:), POINTER                              :: nl_iterator
     597              :       TYPE(mp_para_env_type), POINTER                       :: para_env
     598              :       TYPE(qs_energy_type), POINTER                         :: energy
     599              :       TYPE(qs_ks_env_type), POINTER                         :: ks_env
     600              :       TYPE(qs_kind_type), DIMENSION(:), POINTER             :: qs_kind_set
     601              :       TYPE(qs_rho_type), POINTER                            :: rho
     602              :       TYPE(tblite_type), POINTER                            :: tb
     603              :       TYPE(tb_hamiltonian), POINTER                         :: h0
     604              :       TYPE(virial_type), POINTER                            :: virial
     605              : 
     606              :       CALL timeset(routineN, handle)
     607              : 
     608              :       NULLIFY (ks_env, energy, atomic_kind_set, qs_kind_set)
     609              :       NULLIFY (matrix_h, matrix_s, atprop, dft_control)
     610              :       NULLIFY (sab_orb, rho, tb)
     611              : 
     612              :       CALL get_qs_env(qs_env=qs_env, &
     613              :                       ks_env=ks_env, para_env=para_env, &
     614              :                       energy=energy, &
     615              :                       atomic_kind_set=atomic_kind_set, &
     616              :                       qs_kind_set=qs_kind_set, &
     617              :                       matrix_h_kp=matrix_h, &
     618              :                       matrix_s_kp=matrix_s, &
     619              :                       atprop=atprop, &
     620              :                       dft_control=dft_control, &
     621              :                       sab_orb=sab_orb, &
     622              :                       rho=rho, tb_tblite=tb)
     623              :       h0 => tb%calc%h0
     624              : 
     625              :       !update geometry (required for debug / geometry optimization)
     626              :       CALL tb_update_geometry(qs_env, tb)
     627              : 
     628              :       nkind = SIZE(atomic_kind_set)
     629              :       nderivatives = 0
     630              :       IF (calculate_forces) THEN
     631              :          nderivatives = 1
     632              :          IF (ALLOCATED(tb%grad)) DEALLOCATE (tb%grad)
     633              :          ALLOCATE (tb%grad(3, tb%mol%nat))
     634              :          IF (ALLOCATED(tb%dsedcn)) DEALLOCATE (tb%dsedcn)
     635              :          ALLOCATE (tb%dsedcn(tb%calc%bas%nsh))
     636              :          IF (ALLOCATED(tb%calc%ncoord)) THEN
     637              :             IF (ALLOCATED(tb%dcndr)) DEALLOCATE (tb%dcndr)
     638              :             ALLOCATE (tb%dcndr(3, tb%mol%nat, tb%mol%nat))
     639              :             IF (ALLOCATED(tb%dcndL)) DEALLOCATE (tb%dcndL)
     640              :             ALLOCATE (tb%dcndL(3, 3, tb%mol%nat))
     641              :          END IF
     642              :       END IF
     643              :       maxder = ncoset(nderivatives)
     644              :       nimg = dft_control%nimages
     645              : 
     646              :       !intialise hamiltonian
     647              :       CALL tb_init_ham(qs_env, tb, para_env)
     648              : 
     649              :       ! get density matrtix
     650              :       CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
     651              : 
     652              :       ! set up matrices for force calculations
     653              :       IF (calculate_forces) THEN
     654              :          NULLIFY (force, matrix_w, virial)
     655              :          CALL get_qs_env(qs_env=qs_env, &
     656              :                          matrix_w_kp=matrix_w, &
     657              :                          virial=virial, force=force)
     658              : 
     659              :          IF (SIZE(matrix_p, 1) == 2) THEN
     660              :             DO img = 1, nimg
     661              :                CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, &
     662              :                               alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
     663              :                CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
     664              :                               alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
     665              :             END DO
     666              :          END IF
     667              :          tb%use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
     668              :       END IF
     669              : 
     670              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
     671              : 
     672              :       ! set up basis set lists
     673              :       ALLOCATE (basis_set_list(nkind))
     674              :       CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
     675              : 
     676              :       ! allocate overlap matrix
     677              :       CALL dbcsr_allocate_matrix_set(matrix_s, maxder, nimg)
     678              :       CALL create_sab_matrix(ks_env, matrix_s, "OVERLAP MATRIX", basis_set_list, basis_set_list, &
     679              :                              sab_orb, .TRUE.)
     680              :       CALL set_ks_env(ks_env, matrix_s_kp=matrix_s)
     681              : 
     682              :       ! initialize H matrix
     683              :       CALL dbcsr_allocate_matrix_set(matrix_h, 1, nimg)
     684              :       DO img = 1, nimg
     685              :          ALLOCATE (matrix_h(1, img)%matrix)
     686              :          CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
     687              :                            name="HAMILTONIAN MATRIX")
     688              :          CALL cp_dbcsr_alloc_block_from_nbl(matrix_h(1, img)%matrix, sab_orb)
     689              :       END DO
     690              :       CALL set_ks_env(ks_env, matrix_h_kp=matrix_h)
     691              : 
     692              :       ! loop over all atom pairs with a non-zero overlap (sab_orb)
     693              :       NULLIFY (nl_iterator)
     694              :       CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
     695              :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     696              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     697              :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     698              : 
     699              :          icol = MAX(iatom, jatom)
     700              :          irow = MIN(iatom, jatom)
     701              :          IF (icol == jatom) THEN
     702              :             rij = -rij
     703              :             i = ikind
     704              :             ikind = jkind
     705              :             jkind = i
     706              :          END IF
     707              : 
     708              :          dr = NORM2(rij(:))
     709              : 
     710              :          ic = 1
     711              :          NULLIFY (sblock)
     712              :          CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
     713              :                                 row=irow, col=icol, BLOCK=sblock, found=found)
     714              :          CPASSERT(found)
     715              :          NULLIFY (fblock)
     716              :          CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
     717              :                                 row=irow, col=icol, BLOCK=fblock, found=found)
     718              :          CPASSERT(found)
     719              : 
     720              :          ! --------- Overlap
     721              :          !get basis information
     722              :          basis_set_a => basis_set_list(ikind)%gto_basis_set
     723              :          IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
     724              :          basis_set_b => basis_set_list(jkind)%gto_basis_set
     725              :          IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
     726              :          atom_a = atom_of_kind(icol)
     727              :          atom_b = atom_of_kind(irow)
     728              :          ! basis a
     729              :          first_sgfa => basis_set_a%first_sgf
     730              :          la_max => basis_set_a%lmax
     731              :          la_min => basis_set_a%lmin
     732              :          npgfa => basis_set_a%npgf
     733              :          nseta = basis_set_a%nset
     734              :          nsgfa => basis_set_a%nsgf_set
     735              :          rpgfa => basis_set_a%pgf_radius
     736              :          set_radius_a => basis_set_a%set_radius
     737              :          scon_a => basis_set_a%scon
     738              :          zeta => basis_set_a%zet
     739              :          ! basis b
     740              :          first_sgfb => basis_set_b%first_sgf
     741              :          lb_max => basis_set_b%lmax
     742              :          lb_min => basis_set_b%lmin
     743              :          npgfb => basis_set_b%npgf
     744              :          nsetb = basis_set_b%nset
     745              :          nsgfb => basis_set_b%nsgf_set
     746              :          rpgfb => basis_set_b%pgf_radius
     747              :          set_radius_b => basis_set_b%set_radius
     748              :          scon_b => basis_set_b%scon
     749              :          zetb => basis_set_b%zet
     750              : 
     751              :          ldsab = get_memory_usage(qs_kind_set, "ORB", "ORB")
     752              :          ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
     753              :          natorb_a = 0
     754              :          DO iset = 1, nseta
     755              :             natorb_a = natorb_a + (2*basis_set_a%l(1, iset) + 1)
     756              :          END DO
     757              :          natorb_b = 0
     758              :          DO iset = 1, nsetb
     759              :             natorb_b = natorb_b + (2*basis_set_b%l(1, iset) + 1)
     760              :          END DO
     761              :          ALLOCATE (sint(natorb_a, natorb_b, maxder))
     762              :          sint = 0.0_dp
     763              :          ALLOCATE (hint(natorb_a, natorb_b, maxder))
     764              :          hint = 0.0_dp
     765              : 
     766              :          !----------------- overlap integrals
     767              :          DO iset = 1, nseta
     768              :             n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
     769              :             sgfa = first_sgfa(1, iset)
     770              :             DO jset = 1, nsetb
     771              :                IF (set_radius_a(iset) + set_radius_b(jset) < dr) CYCLE
     772              :                n2 = npgfb(jset)*(ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1))
     773              :                sgfb = first_sgfb(1, jset)
     774              :                IF (calculate_forces) THEN
     775              :                   CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
     776              :                                   lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
     777              :                                   rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
     778              :                ELSE
     779              :                   CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
     780              :                                   lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
     781              :                                   rij, sab=oint(:, :, 1))
     782              :                END IF
     783              :                ! Contraction
     784              :                CALL contraction(oint(:, :, 1), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
     785              :                                 cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
     786              :                CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, 1), sgfa, sgfb, trans=.FALSE.)
     787              :                IF (calculate_forces) THEN
     788              :                   DO i = 2, 4
     789              :                      CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
     790              :                                       cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
     791              :                      CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.FALSE.)
     792              :                   END DO
     793              :                END IF
     794              :             END DO
     795              :          END DO
     796              : 
     797              :          ! update S matrix
     798              :          IF (icol <= irow) THEN
     799              :             sblock(:, :) = sblock(:, :) + sint(:, :, 1)
     800              :          ELSE
     801              :             sblock(:, :) = sblock(:, :) + TRANSPOSE(sint(:, :, 1))
     802              :          END IF
     803              : 
     804              :          ! --------- Hamiltonian
     805              :          IF (icol == irow .AND. dr < same_atom) THEN
     806              :             !get diagonal F matrix from selfenergy
     807              :             n1 = tb%calc%bas%ish_at(icol)
     808              :             DO iset = 1, nseta
     809              :                sgfa = first_sgfa(1, iset)
     810              :                hij = tb%selfenergy(n1 + iset)
     811              :                DO ia = sgfa, sgfa + nsgfa(iset) - 1
     812              :                   hint(ia, ia, 1) = hij
     813              :                END DO
     814              :             END DO
     815              :          ELSE
     816              :             !get off-diagonal F matrix
     817              :             rr = SQRT(dr/(h0%rad(jkind) + h0%rad(ikind)))
     818              :             n1 = tb%calc%bas%ish_at(icol)
     819              :             sgfa0 = 1
     820              :             DO iset = 1, nseta
     821              :                sgfa = first_sgfa(1, iset)
     822              :                sgfa0 = sgfa0 + tb%calc%bas%cgto(iset, tb%mol%id(icol))%nprim
     823              :                n2 = tb%calc%bas%ish_at(irow)
     824              :                DO jset = 1, nsetb
     825              :                   sgfb = first_sgfb(1, jset)
     826              :                   shpoly = (1.0_dp + h0%shpoly(iset, ikind)*rr) &
     827              :                            *(1.0_dp + h0%shpoly(jset, jkind)*rr)
     828              :                   hij = 0.5_dp*(tb%selfenergy(n1 + iset) + tb%selfenergy(n2 + jset)) &
     829              :                         *h0%hscale(iset, jset, ikind, jkind)*shpoly
     830              :                   DO ia = sgfa, sgfa + nsgfa(iset) - 1
     831              :                      DO ib = sgfb, sgfb + nsgfb(jset) - 1
     832              :                         hint(ia, ib, 1) = hij*sint(ia, ib, 1)
     833              :                      END DO
     834              :                   END DO
     835              :                END DO
     836              :             END DO
     837              :          END IF
     838              : 
     839              :          ! update F matrix
     840              :          IF (icol <= irow) THEN
     841              :             fblock(:, :) = fblock(:, :) + hint(:, :, 1)
     842              :          ELSE
     843              :             fblock(:, :) = fblock(:, :) + TRANSPOSE(hint(:, :, 1))
     844              :          END IF
     845              : 
     846              :          DEALLOCATE (oint, owork, sint, hint)
     847              : 
     848              :       END DO
     849              :       CALL neighbor_list_iterator_release(nl_iterator)
     850              : 
     851              :       DO img = 1, nimg
     852              :          DO i = 1, SIZE(matrix_s, 1)
     853              :             CALL dbcsr_finalize(matrix_s(i, img)%matrix)
     854              :          END DO
     855              :          DO i = 1, SIZE(matrix_h, 1)
     856              :             CALL dbcsr_finalize(matrix_h(i, img)%matrix)
     857              :          END DO
     858              :       END DO
     859              : 
     860              :       !compute multipole moments for gfn2
     861              :       IF (dft_control%qs_control%xtb_control%tblite_method == gfn2xtb) &
     862              :          CALL tb_get_multipole(qs_env, tb)
     863              : 
     864              :       ! output overlap information
     865              :       NULLIFY (logger)
     866              :       logger => cp_get_default_logger()
     867              :       IF (.NOT. calculate_forces) THEN
     868              :          IF (cp_print_key_should_output(logger%iter_info, qs_env%input, &
     869              :                                         "DFT%PRINT%OVERLAP_CONDITION") /= 0) THEN
     870              :             iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%OVERLAP_CONDITION", &
     871              :                                       extension=".Log")
     872              :             CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%1-NORM", l_val=norml1)
     873              :             CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%DIAGONALIZATION", l_val=norml2)
     874              :             CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%ARNOLDI", l_val=use_arnoldi)
     875              :             CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env)
     876              :             CALL overlap_condnum(matrix_s, condnum, iw, norml1, norml2, use_arnoldi, blacs_env)
     877              :          END IF
     878              :       END IF
     879              : 
     880              :       DEALLOCATE (basis_set_list)
     881              : 
     882              :       CALL timestop(handle)
     883              : 
     884              : #else
     885              :       MARK_USED(qs_env)
     886              :       MARK_USED(calculate_forces)
     887            0 :       CPABORT("Built without TBLITE")
     888              : #endif
     889              : 
     890            0 :    END SUBROUTINE build_tblite_matrices
     891              : 
     892              : ! **************************************************************************************************
     893              : !> \brief ...
     894              : !> \param qs_env ...
     895              : !> \param dft_control ...
     896              : !> \param tb ...
     897              : !> \param calculate_forces ...
     898              : !> \param use_rho ...
     899              : ! **************************************************************************************************
     900            0 :    SUBROUTINE tb_update_charges(qs_env, dft_control, tb, calculate_forces, use_rho)
     901              : 
     902              :       TYPE(qs_environment_type), POINTER                                 :: qs_env
     903              :       TYPE(dft_control_type), POINTER                                    :: dft_control
     904              :       TYPE(tblite_type), POINTER                                         :: tb
     905              :       LOGICAL, INTENT(IN)                                                :: calculate_forces
     906              :       LOGICAL, INTENT(IN)                                                :: use_rho
     907              : 
     908              : #if defined(__TBLITE)
     909              : 
     910              :       INTEGER                                            :: iatom, ikind, is, ns, atom_a, ii, im
     911              :       INTEGER                                            :: nimg, nkind, nsgf, natorb, na
     912              :       INTEGER                                            :: n_atom, max_orb, max_shell
     913              :       LOGICAL                                            :: do_dipole, do_quadrupole
     914              :       REAL(KIND=dp)                                      :: norm
     915              :       INTEGER, DIMENSION(5)                              :: occ
     916              :       INTEGER, DIMENSION(25)                             :: lao
     917              :       INTEGER, DIMENSION(25)                             :: nao
     918              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: ch_atom, ch_shell, ch_ref, ch_orb
     919              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: aocg, ao_dip, ao_quad
     920              : 
     921              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     922              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_s, matrix_p
     923              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: p_matrix
     924              :       TYPE(dbcsr_type), POINTER                          :: s_matrix
     925              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     926              :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     927              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     928              :       TYPE(qs_rho_type), POINTER                         :: rho
     929              :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     930              :       TYPE(xtb_atom_type), POINTER                       :: xtb_kind
     931              : 
     932              :       ! also compute multipoles needed by GFN2
     933              :       do_dipole = .FALSE.
     934              :       do_quadrupole = .FALSE.
     935              : 
     936              :       ! compute mulliken charges required for charge update
     937              :       NULLIFY (particle_set, qs_kind_set, atomic_kind_set)
     938              :       CALL get_qs_env(qs_env=qs_env, scf_env=scf_env, particle_set=particle_set, qs_kind_set=qs_kind_set, &
     939              :                       atomic_kind_set=atomic_kind_set, matrix_s_kp=matrix_s, rho=rho, para_env=para_env)
     940              :       NULLIFY (matrix_p)
     941              :       IF (use_rho) THEN
     942              :          CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
     943              :          IF (ASSOCIATED(tb%dipbra)) do_dipole = .TRUE.
     944              :          IF (ASSOCIATED(tb%quadbra)) do_quadrupole = .TRUE.
     945              :       ELSE
     946              :          matrix_p => scf_env%p_mix_new
     947              :       END IF
     948              :       n_atom = SIZE(particle_set)
     949              :       nkind = SIZE(atomic_kind_set)
     950              :       nimg = dft_control%nimages
     951              :       CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
     952              :       ALLOCATE (aocg(nsgf, n_atom))
     953              :       aocg = 0.0_dp
     954              :       IF (do_dipole) ALLOCATE (ao_dip(n_atom, dip_n))
     955              :       IF (do_quadrupole) ALLOCATE (ao_quad(n_atom, quad_n))
     956              :       max_orb = 0
     957              :       max_shell = 0
     958              :       DO ikind = 1, nkind
     959              :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
     960              :          CALL get_xtb_atom_param(xtb_kind, natorb=natorb)
     961              :          max_orb = MAX(max_orb, natorb)
     962              :       END DO
     963              :       DO is = 1, n_atom
     964              :          max_shell = MAX(max_shell, tb%calc%bas%nsh_at(is))
     965              :       END DO
     966              :       ALLOCATE (ch_atom(n_atom, 1), ch_shell(n_atom, max_shell))
     967              :       ALLOCATE (ch_orb(max_orb, n_atom), ch_ref(max_orb, n_atom))
     968              :       ch_atom = 0.0_dp
     969              :       ch_shell = 0.0_dp
     970              :       ch_orb = 0.0_dp
     971              :       ch_ref = 0.0_dp
     972              :       IF (nimg > 1) THEN
     973              :          CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
     974              :          IF (do_dipole .OR. do_quadrupole) THEN
     975              :             CPABORT("missing contraction with density matrix for multiple k-points")
     976              :          END IF
     977              :       ELSE
     978              :          NULLIFY (p_matrix, s_matrix)
     979              :          p_matrix => matrix_p(:, 1)
     980              :          s_matrix => matrix_s(1, 1)%matrix
     981              :          CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
     982              :          IF (do_dipole) THEN
     983              :             DO im = 1, dip_n
     984              :                CALL contract_dens(p_matrix, tb%dipbra(im)%matrix, tb%dipket(im)%matrix, ao_dip(:, im), para_env)
     985              :             END DO
     986              :          END IF
     987              :          IF (do_quadrupole) THEN
     988              :             DO im = 1, quad_n
     989              :                CALL contract_dens(p_matrix, tb%quadbra(im)%matrix, tb%quadket(im)%matrix, ao_quad(:, im), para_env)
     990              :             END DO
     991              :          END IF
     992              :       END IF
     993              :       NULLIFY (xtb_kind)
     994              :       DO ikind = 1, nkind
     995              :          CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
     996              :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
     997              :          CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, nao=nao, occupation=occ)
     998              :          DO iatom = 1, na
     999              :             atom_a = atomic_kind_set(ikind)%atom_list(iatom)
    1000              :             DO is = 1, natorb
    1001              :                ns = lao(is) + 1
    1002              :                norm = 2*lao(is) + 1
    1003              :                ch_ref(is, atom_a) = tb%calc%h0%refocc(nao(is), ikind)/norm
    1004              :                ch_orb(is, atom_a) = aocg(is, atom_a) - ch_ref(is, atom_a)
    1005              :                ch_shell(atom_a, ns) = ch_orb(is, atom_a) + ch_shell(atom_a, ns)
    1006              :             END DO
    1007              :             ch_atom(atom_a, 1) = SUM(ch_orb(:, atom_a))
    1008              :          END DO
    1009              :       END DO
    1010              :       DEALLOCATE (aocg)
    1011              : 
    1012              :       ! charge mixing
    1013              :       IF (dft_control%qs_control%do_ls_scf) THEN
    1014              :          !
    1015              :       ELSE
    1016              :          CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
    1017              :                             ch_shell, para_env, scf_env%iter_count)
    1018              :       END IF
    1019              : 
    1020              :       !setting new wave function
    1021              :       CALL tb%pot%reset
    1022              :       tb%e_es = 0.0_dp
    1023              :       tb%e_scd = 0.0_dp
    1024              :       DO iatom = 1, n_atom
    1025              :          ii = tb%calc%bas%ish_at(iatom)
    1026              :          DO is = 1, tb%calc%bas%nsh_at(iatom)
    1027              :             tb%wfn%qsh(ii + is, 1) = -ch_shell(iatom, is)
    1028              :          END DO
    1029              :          tb%wfn%qat(iatom, 1) = -ch_atom(iatom, 1)
    1030              :       END DO
    1031              : 
    1032              :       IF (do_dipole) THEN
    1033              :          DO iatom = 1, n_atom
    1034              :             DO im = 1, dip_n
    1035              :                tb%wfn%dpat(im, iatom, 1) = -ao_dip(iatom, im)
    1036              :             END DO
    1037              :          END DO
    1038              :          DEALLOCATE (ao_dip)
    1039              :       END IF
    1040              :       IF (do_quadrupole) THEN
    1041              :          DO iatom = 1, n_atom
    1042              :             DO im = 1, quad_n
    1043              :                tb%wfn%qpat(im, iatom, 1) = -ao_quad(iatom, im)
    1044              :             END DO
    1045              :          END DO
    1046              :          DEALLOCATE (ao_quad)
    1047              :       END IF
    1048              : 
    1049              :       IF (ALLOCATED(tb%calc%coulomb)) THEN
    1050              :          CALL tb%calc%coulomb%get_potential(tb%mol, tb%cache, tb%wfn, tb%pot)
    1051              :          CALL tb%calc%coulomb%get_energy(tb%mol, tb%cache, tb%wfn, tb%e_es)
    1052              :       END IF
    1053              :       IF (ALLOCATED(tb%calc%dispersion)) THEN
    1054              :          CALL tb%calc%dispersion%get_potential(tb%mol, tb%dcache, tb%wfn, tb%pot)
    1055              :          CALL tb%calc%dispersion%get_energy(tb%mol, tb%dcache, tb%wfn, tb%e_scd)
    1056              :       END IF
    1057              : 
    1058              :       IF (calculate_forces) THEN
    1059              :          IF (ALLOCATED(tb%calc%coulomb)) THEN
    1060              :             tb%grad = 0.0_dp
    1061              :             CALL tb%calc%coulomb%get_gradient(tb%mol, tb%cache, tb%wfn, tb%grad, tb%sigma)
    1062              :             CALL tb_grad2force(qs_env, tb, para_env, 3)
    1063              :          END IF
    1064              : 
    1065              :          IF (ALLOCATED(tb%calc%dispersion)) THEN
    1066              :             tb%grad = 0.0_dp
    1067              :             CALL tb%calc%dispersion%get_gradient(tb%mol, tb%dcache, tb%wfn, tb%grad, tb%sigma)
    1068              :             CALL tb_grad2force(qs_env, tb, para_env, 2)
    1069              :          END IF
    1070              :       END IF
    1071              : 
    1072              :       DEALLOCATE (ch_atom, ch_shell, ch_orb, ch_ref)
    1073              : 
    1074              : #else
    1075              :       MARK_USED(qs_env)
    1076              :       MARK_USED(tb)
    1077              :       MARK_USED(dft_control)
    1078              :       MARK_USED(calculate_forces)
    1079              :       MARK_USED(use_rho)
    1080            0 :       CPABORT("Built without TBLITE")
    1081              : #endif
    1082              : 
    1083            0 :    END SUBROUTINE tb_update_charges
    1084              : 
    1085              : ! **************************************************************************************************
    1086              : !> \brief ...
    1087              : !> \param qs_env ...
    1088              : !> \param tb ...
    1089              : !> \param dft_control ...
    1090              : ! **************************************************************************************************
    1091            0 :    SUBROUTINE tb_ham_add_coulomb(qs_env, tb, dft_control)
    1092              : 
    1093              :       TYPE(qs_environment_type), POINTER                       :: qs_env
    1094              :       TYPE(tblite_type), POINTER                               :: tb
    1095              :       TYPE(dft_control_type), POINTER                          :: dft_control
    1096              : 
    1097              : #if defined(__TBLITE)
    1098              : 
    1099              :       INTEGER                                            :: ikind, jkind, iatom, jatom, icol, irow
    1100              :       INTEGER                                            :: ic, is, nimg, ni, nj, i, j
    1101              :       INTEGER                                            :: la, lb, za, zb
    1102              :       LOGICAL                                            :: found
    1103              :       INTEGER, DIMENSION(3)                              :: cellind
    1104              :       INTEGER, DIMENSION(25)                             :: naoa, naob
    1105              :       REAL(KIND=dp), DIMENSION(3)                        :: rij
    1106              :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: kind_of, sum_shell
    1107              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: ashift, bshift
    1108              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: ksblock, sblock
    1109              :       INTEGER, DIMENSION(:, :, :), POINTER               :: cell_to_index
    1110              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: dip_ket1, dip_ket2, dip_ket3, &
    1111              :                                                             dip_bra1, dip_bra2, dip_bra3
    1112              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: quad_ket1, quad_ket2, quad_ket3, &
    1113              :                                                             quad_ket4, quad_ket5, quad_ket6, &
    1114              :                                                             quad_bra1, quad_bra2, quad_bra3, &
    1115              :                                                             quad_bra4, quad_bra5, quad_bra6
    1116              : 
    1117              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
    1118              :       TYPE(dbcsr_iterator_type)                          :: iter
    1119              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_s
    1120              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: ks_matrix
    1121              :       TYPE(kpoint_type), POINTER                         :: kpoints
    1122              :       TYPE(neighbor_list_iterator_p_type), &
    1123              :          DIMENSION(:), POINTER                           :: nl_iterator
    1124              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
    1125              :          POINTER                                         :: n_list
    1126              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
    1127              :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b
    1128              : 
    1129              :       nimg = dft_control%nimages
    1130              : 
    1131              :       NULLIFY (matrix_s, ks_matrix, n_list, qs_kind_set)
    1132              :       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)
    1133              : 
    1134              :       !creating sum of shell lists
    1135              :       ALLOCATE (sum_shell(tb%mol%nat))
    1136              :       i = 0
    1137              :       DO j = 1, tb%mol%nat
    1138              :          sum_shell(j) = i
    1139              :          i = i + tb%calc%bas%nsh_at(j)
    1140              :       END DO
    1141              : 
    1142              :       IF (nimg == 1) THEN
    1143              :          ! no k-points; all matrices have been transformed to periodic bsf
    1144              :          CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
    1145              :          CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
    1146              :                                   kind_of=kind_of)
    1147              :          CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
    1148              :          DO WHILE (dbcsr_iterator_blocks_left(iter))
    1149              :             CALL dbcsr_iterator_next_block(iter, irow, icol, sblock)
    1150              : 
    1151              :             ikind = kind_of(irow)
    1152              :             jkind = kind_of(icol)
    1153              : 
    1154              :             ! atomic parameters
    1155              :             CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
    1156              :             CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
    1157              :             CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa)
    1158              :             CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob)
    1159              : 
    1160              :             ni = SIZE(sblock, 1)
    1161              :             ALLOCATE (ashift(ni, ni))
    1162              :             ashift = 0.0_dp
    1163              :             DO i = 1, ni
    1164              :                la = naoa(i) + sum_shell(irow)
    1165              :                ashift(i, i) = tb%pot%vsh(la, 1)
    1166              :             END DO
    1167              : 
    1168              :             nj = SIZE(sblock, 2)
    1169              :             ALLOCATE (bshift(nj, nj))
    1170              :             bshift = 0.0_dp
    1171              :             DO j = 1, nj
    1172              :                lb = naob(j) + sum_shell(icol)
    1173              :                bshift(j, j) = tb%pot%vsh(lb, 1)
    1174              :             END DO
    1175              : 
    1176              :             DO is = 1, SIZE(ks_matrix, 1)
    1177              :                NULLIFY (ksblock)
    1178              :                CALL dbcsr_get_block_p(matrix=ks_matrix(is, 1)%matrix, &
    1179              :                                       row=irow, col=icol, block=ksblock, found=found)
    1180              :                CPASSERT(found)
    1181              :                ksblock = ksblock - 0.5_dp*(MATMUL(ashift, sblock) &
    1182              :                                            + MATMUL(sblock, bshift))
    1183              :                ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
    1184              :                                            + tb%pot%vat(icol, 1))*sblock
    1185              :             END DO
    1186              :             DEALLOCATE (ashift, bshift)
    1187              :          END DO
    1188              :          CALL dbcsr_iterator_stop(iter)
    1189              : 
    1190              :          IF (ASSOCIATED(tb%dipbra)) THEN
    1191              :             CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
    1192              :             DO WHILE (dbcsr_iterator_blocks_left(iter))
    1193              :                CALL dbcsr_iterator_next_block(iter, irow, icol, sblock)
    1194              : 
    1195              :                NULLIFY (dip_bra1, dip_bra2, dip_bra3)
    1196              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(1)%matrix, &
    1197              :                                       row=irow, col=icol, BLOCK=dip_bra1, found=found)
    1198              :                CPASSERT(found)
    1199              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(2)%matrix, &
    1200              :                                       row=irow, col=icol, BLOCK=dip_bra2, found=found)
    1201              :                CPASSERT(found)
    1202              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(3)%matrix, &
    1203              :                                       row=irow, col=icol, BLOCK=dip_bra3, found=found)
    1204              :                CPASSERT(found)
    1205              :                NULLIFY (dip_ket1, dip_ket2, dip_ket3)
    1206              :                CALL dbcsr_get_block_p(matrix=tb%dipket(1)%matrix, &
    1207              :                                       row=irow, col=icol, BLOCK=dip_ket1, found=found)
    1208              :                CPASSERT(found)
    1209              :                CALL dbcsr_get_block_p(matrix=tb%dipket(2)%matrix, &
    1210              :                                       row=irow, col=icol, BLOCK=dip_ket2, found=found)
    1211              :                CPASSERT(found)
    1212              :                CALL dbcsr_get_block_p(matrix=tb%dipket(3)%matrix, &
    1213              :                                       row=irow, col=icol, BLOCK=dip_ket3, found=found)
    1214              :                CPASSERT(found)
    1215              : 
    1216              :                DO is = 1, SIZE(ks_matrix, 1)
    1217              :                   NULLIFY (ksblock)
    1218              :                   CALL dbcsr_get_block_p(matrix=ks_matrix(is, 1)%matrix, &
    1219              :                                          row=irow, col=icol, block=ksblock, found=found)
    1220              :                   CPASSERT(found)
    1221              :                   ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
    1222              :                                               + dip_ket2*tb%pot%vdp(2, irow, 1) &
    1223              :                                               + dip_ket3*tb%pot%vdp(3, irow, 1) &
    1224              :                                               + dip_bra1*tb%pot%vdp(1, icol, 1) &
    1225              :                                               + dip_bra2*tb%pot%vdp(2, icol, 1) &
    1226              :                                               + dip_bra3*tb%pot%vdp(3, icol, 1))
    1227              :                END DO
    1228              :             END DO
    1229              :             CALL dbcsr_iterator_stop(iter)
    1230              :          END IF
    1231              : 
    1232              :          IF (ASSOCIATED(tb%quadbra)) THEN
    1233              :             CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
    1234              :             DO WHILE (dbcsr_iterator_blocks_left(iter))
    1235              :                CALL dbcsr_iterator_next_block(iter, irow, icol, sblock)
    1236              : 
    1237              :                NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
    1238              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(1)%matrix, &
    1239              :                                       row=irow, col=icol, BLOCK=quad_bra1, found=found)
    1240              :                CPASSERT(found)
    1241              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(2)%matrix, &
    1242              :                                       row=irow, col=icol, BLOCK=quad_bra2, found=found)
    1243              :                CPASSERT(found)
    1244              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(3)%matrix, &
    1245              :                                       row=irow, col=icol, BLOCK=quad_bra3, found=found)
    1246              :                CPASSERT(found)
    1247              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(4)%matrix, &
    1248              :                                       row=irow, col=icol, BLOCK=quad_bra4, found=found)
    1249              :                CPASSERT(found)
    1250              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(5)%matrix, &
    1251              :                                       row=irow, col=icol, BLOCK=quad_bra5, found=found)
    1252              :                CPASSERT(found)
    1253              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(6)%matrix, &
    1254              :                                       row=irow, col=icol, BLOCK=quad_bra6, found=found)
    1255              :                CPASSERT(found)
    1256              : 
    1257              :                NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
    1258              :                CALL dbcsr_get_block_p(matrix=tb%quadket(1)%matrix, &
    1259              :                                       row=irow, col=icol, BLOCK=quad_ket1, found=found)
    1260              :                CPASSERT(found)
    1261              :                CALL dbcsr_get_block_p(matrix=tb%quadket(2)%matrix, &
    1262              :                                       row=irow, col=icol, BLOCK=quad_ket2, found=found)
    1263              :                CPASSERT(found)
    1264              :                CALL dbcsr_get_block_p(matrix=tb%quadket(3)%matrix, &
    1265              :                                       row=irow, col=icol, BLOCK=quad_ket3, found=found)
    1266              :                CPASSERT(found)
    1267              :                CALL dbcsr_get_block_p(matrix=tb%quadket(4)%matrix, &
    1268              :                                       row=irow, col=icol, BLOCK=quad_ket4, found=found)
    1269              :                CPASSERT(found)
    1270              :                CALL dbcsr_get_block_p(matrix=tb%quadket(5)%matrix, &
    1271              :                                       row=irow, col=icol, BLOCK=quad_ket5, found=found)
    1272              :                CPASSERT(found)
    1273              :                CALL dbcsr_get_block_p(matrix=tb%quadket(6)%matrix, &
    1274              :                                       row=irow, col=icol, BLOCK=quad_ket6, found=found)
    1275              :                CPASSERT(found)
    1276              : 
    1277              :                DO is = 1, SIZE(ks_matrix, 1)
    1278              :                   NULLIFY (ksblock)
    1279              :                   CALL dbcsr_get_block_p(matrix=ks_matrix(is, 1)%matrix, &
    1280              :                                          row=irow, col=icol, block=ksblock, found=found)
    1281              :                   CPASSERT(found)
    1282              : 
    1283              :                   ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
    1284              :                                               + quad_ket2*tb%pot%vqp(2, irow, 1) &
    1285              :                                               + quad_ket3*tb%pot%vqp(3, irow, 1) &
    1286              :                                               + quad_ket4*tb%pot%vqp(4, irow, 1) &
    1287              :                                               + quad_ket5*tb%pot%vqp(5, irow, 1) &
    1288              :                                               + quad_ket6*tb%pot%vqp(6, irow, 1) &
    1289              :                                               + quad_bra1*tb%pot%vqp(1, icol, 1) &
    1290              :                                               + quad_bra2*tb%pot%vqp(2, icol, 1) &
    1291              :                                               + quad_bra3*tb%pot%vqp(3, icol, 1) &
    1292              :                                               + quad_bra4*tb%pot%vqp(4, icol, 1) &
    1293              :                                               + quad_bra5*tb%pot%vqp(5, icol, 1) &
    1294              :                                               + quad_bra6*tb%pot%vqp(6, icol, 1))
    1295              :                END DO
    1296              :             END DO
    1297              :             CALL dbcsr_iterator_stop(iter)
    1298              :          END IF
    1299              : 
    1300              :       ELSE
    1301              :          CPABORT("GFN methods with k-points not tested")
    1302              :          NULLIFY (kpoints)
    1303              :          CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
    1304              :          NULLIFY (cell_to_index)
    1305              :          CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
    1306              : 
    1307              :          NULLIFY (nl_iterator)
    1308              :          CALL neighbor_list_iterator_create(nl_iterator, n_list)
    1309              :          DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    1310              :             CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
    1311              :                                    iatom=iatom, jatom=jatom, r=rij, cell=cellind)
    1312              : 
    1313              :             icol = MAX(iatom, jatom)
    1314              :             irow = MIN(iatom, jatom)
    1315              : 
    1316              :             IF (icol == jatom) THEN
    1317              :                rij = -rij
    1318              :                i = ikind
    1319              :                ikind = jkind
    1320              :                jkind = i
    1321              :             END IF
    1322              : 
    1323              :             ic = cell_to_index(cellind(1), cellind(2), cellind(3))
    1324              :             CPASSERT(ic > 0)
    1325              : 
    1326              :             NULLIFY (sblock)
    1327              :             CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
    1328              :                                    row=irow, col=icol, block=sblock, found=found)
    1329              :             CPASSERT(found)
    1330              : 
    1331              :             ! atomic parameters
    1332              :             CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
    1333              :             CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
    1334              :             CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa)
    1335              :             CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob)
    1336              : 
    1337              :             ni = SIZE(sblock, 1)
    1338              :             ALLOCATE (ashift(ni, ni))
    1339              :             ashift = 0.0_dp
    1340              :             DO i = 1, ni
    1341              :                la = naoa(i) + sum_shell(irow)
    1342              :                ashift(i, i) = tb%pot%vsh(la, 1)
    1343              :             END DO
    1344              : 
    1345              :             nj = SIZE(sblock, 2)
    1346              :             ALLOCATE (bshift(nj, nj))
    1347              :             bshift = 0.0_dp
    1348              :             DO j = 1, nj
    1349              :                lb = naob(j) + sum_shell(icol)
    1350              :                bshift(j, j) = tb%pot%vsh(lb, 1)
    1351              :             END DO
    1352              : 
    1353              :             DO is = 1, SIZE(ks_matrix, 1)
    1354              :                NULLIFY (ksblock)
    1355              :                CALL dbcsr_get_block_p(matrix=ks_matrix(is, ic)%matrix, &
    1356              :                                       row=irow, col=icol, block=ksblock, found=found)
    1357              :                CPASSERT(found)
    1358              :                ksblock = ksblock - 0.5_dp*(MATMUL(ashift, sblock) &
    1359              :                                            + MATMUL(sblock, bshift))
    1360              :                ksblock = ksblock - 0.5_dp*(tb%pot%vat(irow, 1) &
    1361              :                                            + tb%pot%vat(icol, 1))*sblock
    1362              :             END DO
    1363              :          END DO
    1364              :          CALL neighbor_list_iterator_release(nl_iterator)
    1365              : 
    1366              :          IF (ASSOCIATED(tb%dipbra)) THEN
    1367              :             NULLIFY (nl_iterator)
    1368              :             CALL neighbor_list_iterator_create(nl_iterator, n_list)
    1369              :             DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    1370              :                CALL get_iterator_info(nl_iterator, &
    1371              :                                       iatom=iatom, jatom=jatom, cell=cellind)
    1372              :                icol = MAX(iatom, jatom)
    1373              :                irow = MIN(iatom, jatom)
    1374              : 
    1375              :                NULLIFY (dip_bra1, dip_bra2, dip_bra3)
    1376              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(1)%matrix, &
    1377              :                                       row=irow, col=icol, BLOCK=dip_bra1, found=found)
    1378              :                CPASSERT(found)
    1379              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(2)%matrix, &
    1380              :                                       row=irow, col=icol, BLOCK=dip_bra2, found=found)
    1381              :                CPASSERT(found)
    1382              :                CALL dbcsr_get_block_p(matrix=tb%dipbra(3)%matrix, &
    1383              :                                       row=irow, col=icol, BLOCK=dip_bra3, found=found)
    1384              :                CPASSERT(found)
    1385              :                NULLIFY (dip_ket1, dip_ket2, dip_ket3)
    1386              :                CALL dbcsr_get_block_p(matrix=tb%dipket(1)%matrix, &
    1387              :                                       row=irow, col=icol, BLOCK=dip_ket1, found=found)
    1388              :                CPASSERT(found)
    1389              :                CALL dbcsr_get_block_p(matrix=tb%dipket(2)%matrix, &
    1390              :                                       row=irow, col=icol, BLOCK=dip_ket2, found=found)
    1391              :                CPASSERT(found)
    1392              :                CALL dbcsr_get_block_p(matrix=tb%dipket(3)%matrix, &
    1393              :                                       row=irow, col=icol, BLOCK=dip_ket3, found=found)
    1394              :                CPASSERT(found)
    1395              : 
    1396              :                DO is = 1, SIZE(ks_matrix, 1)
    1397              :                   NULLIFY (ksblock)
    1398              :                   CALL dbcsr_get_block_p(matrix=ks_matrix(is, 1)%matrix, &
    1399              :                                          row=irow, col=icol, block=ksblock, found=found)
    1400              :                   CPASSERT(found)
    1401              :                   ksblock = ksblock - 0.5_dp*(dip_ket1*tb%pot%vdp(1, irow, 1) &
    1402              :                                               + dip_ket2*tb%pot%vdp(2, irow, 1) &
    1403              :                                               + dip_ket3*tb%pot%vdp(3, irow, 1) &
    1404              :                                               + dip_bra1*tb%pot%vdp(1, icol, 1) &
    1405              :                                               + dip_bra2*tb%pot%vdp(2, icol, 1) &
    1406              :                                               + dip_bra3*tb%pot%vdp(3, icol, 1))
    1407              :                END DO
    1408              :             END DO
    1409              :             CALL neighbor_list_iterator_release(nl_iterator)
    1410              :          END IF
    1411              : 
    1412              :          IF (ASSOCIATED(tb%quadbra)) THEN
    1413              :             NULLIFY (nl_iterator)
    1414              :             CALL neighbor_list_iterator_create(nl_iterator, n_list)
    1415              :             DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    1416              :                CALL get_iterator_info(nl_iterator, &
    1417              :                                       iatom=iatom, jatom=jatom, cell=cellind)
    1418              :                icol = MAX(iatom, jatom)
    1419              :                irow = MIN(iatom, jatom)
    1420              : 
    1421              :                NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
    1422              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(1)%matrix, &
    1423              :                                       row=irow, col=icol, BLOCK=quad_bra1, found=found)
    1424              :                CPASSERT(found)
    1425              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(2)%matrix, &
    1426              :                                       row=irow, col=icol, BLOCK=quad_bra2, found=found)
    1427              :                CPASSERT(found)
    1428              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(3)%matrix, &
    1429              :                                       row=irow, col=icol, BLOCK=quad_bra3, found=found)
    1430              :                CPASSERT(found)
    1431              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(4)%matrix, &
    1432              :                                       row=irow, col=icol, BLOCK=quad_bra4, found=found)
    1433              :                CPASSERT(found)
    1434              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(5)%matrix, &
    1435              :                                       row=irow, col=icol, BLOCK=quad_bra5, found=found)
    1436              :                CPASSERT(found)
    1437              :                CALL dbcsr_get_block_p(matrix=tb%quadbra(6)%matrix, &
    1438              :                                       row=irow, col=icol, BLOCK=quad_bra6, found=found)
    1439              :                CPASSERT(found)
    1440              : 
    1441              :                NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
    1442              :                CALL dbcsr_get_block_p(matrix=tb%quadket(1)%matrix, &
    1443              :                                       row=irow, col=icol, BLOCK=quad_ket1, found=found)
    1444              :                CPASSERT(found)
    1445              :                CALL dbcsr_get_block_p(matrix=tb%quadket(2)%matrix, &
    1446              :                                       row=irow, col=icol, BLOCK=quad_ket2, found=found)
    1447              :                CPASSERT(found)
    1448              :                CALL dbcsr_get_block_p(matrix=tb%quadket(3)%matrix, &
    1449              :                                       row=irow, col=icol, BLOCK=quad_ket3, found=found)
    1450              :                CPASSERT(found)
    1451              :                CALL dbcsr_get_block_p(matrix=tb%quadket(4)%matrix, &
    1452              :                                       row=irow, col=icol, BLOCK=quad_ket4, found=found)
    1453              :                CPASSERT(found)
    1454              :                CALL dbcsr_get_block_p(matrix=tb%quadket(5)%matrix, &
    1455              :                                       row=irow, col=icol, BLOCK=quad_ket5, found=found)
    1456              :                CPASSERT(found)
    1457              :                CALL dbcsr_get_block_p(matrix=tb%quadket(6)%matrix, &
    1458              :                                       row=irow, col=icol, BLOCK=quad_ket6, found=found)
    1459              :                CPASSERT(found)
    1460              : 
    1461              :                DO is = 1, SIZE(ks_matrix, 1)
    1462              :                   NULLIFY (ksblock)
    1463              :                   CALL dbcsr_get_block_p(matrix=ks_matrix(is, 1)%matrix, &
    1464              :                                          row=irow, col=icol, block=ksblock, found=found)
    1465              :                   CPASSERT(found)
    1466              : 
    1467              :                   ksblock = ksblock - 0.5_dp*(quad_ket1*tb%pot%vqp(1, irow, 1) &
    1468              :                                               + quad_ket2*tb%pot%vqp(2, irow, 1) &
    1469              :                                               + quad_ket3*tb%pot%vqp(3, irow, 1) &
    1470              :                                               + quad_ket4*tb%pot%vqp(4, irow, 1) &
    1471              :                                               + quad_ket5*tb%pot%vqp(5, irow, 1) &
    1472              :                                               + quad_ket6*tb%pot%vqp(6, irow, 1) &
    1473              :                                               + quad_bra1*tb%pot%vqp(1, icol, 1) &
    1474              :                                               + quad_bra2*tb%pot%vqp(2, icol, 1) &
    1475              :                                               + quad_bra3*tb%pot%vqp(3, icol, 1) &
    1476              :                                               + quad_bra4*tb%pot%vqp(4, icol, 1) &
    1477              :                                               + quad_bra5*tb%pot%vqp(5, icol, 1) &
    1478              :                                               + quad_bra6*tb%pot%vqp(6, icol, 1))
    1479              :                END DO
    1480              :             END DO
    1481              :             CALL neighbor_list_iterator_release(nl_iterator)
    1482              :          END IF
    1483              : 
    1484              :       END IF
    1485              : 
    1486              : #else
    1487              :       MARK_USED(qs_env)
    1488              :       MARK_USED(tb)
    1489              :       MARK_USED(dft_control)
    1490            0 :       CPABORT("Built without TBLITE")
    1491              : #endif
    1492              : 
    1493            0 :    END SUBROUTINE tb_ham_add_coulomb
    1494              : 
    1495              : ! **************************************************************************************************
    1496              : !> \brief ...
    1497              : !> \param qs_env ...
    1498              : !> \param tb ...
    1499              : ! **************************************************************************************************
    1500            0 :    SUBROUTINE tb_get_multipole(qs_env, tb)
    1501              : 
    1502              :       TYPE(qs_environment_type), POINTER                       :: qs_env
    1503              :       TYPE(tblite_type), POINTER                               :: tb
    1504              : 
    1505              : #if defined(__TBLITE)
    1506              : 
    1507              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tb_get_multipole'
    1508              : 
    1509              :       INTEGER                                     :: ikind, jkind, iatom, jatom, icol, irow, iset, jset, ityp, jtyp
    1510              :       INTEGER                                     :: nkind, natom, handle, nimg, i, inda, indb
    1511              :       INTEGER                                     :: atom_a, atom_b, nseta, nsetb, ia, ib, ij
    1512              :       LOGICAL                                     :: found
    1513              :       REAL(KIND=dp)                               :: r2
    1514              :       REAL(KIND=dp), DIMENSION(3)                 :: rij
    1515              :       INTEGER, DIMENSION(:), POINTER              :: la_max, lb_max
    1516              :       INTEGER, DIMENSION(:), POINTER              :: nsgfa, nsgfb
    1517              :       INTEGER, DIMENSION(:, :), POINTER           :: first_sgfa, first_sgfb
    1518              :       INTEGER, ALLOCATABLE                        :: atom_of_kind(:)
    1519              :       REAL(KIND=dp), ALLOCATABLE                  :: stmp(:)
    1520              :       REAL(KIND=dp), ALLOCATABLE                  :: dtmp(:, :), qtmp(:, :), dtmpj(:, :), qtmpj(:, :)
    1521              :       REAL(KIND=dp), DIMENSION(:, :), POINTER     :: dip_ket1, dip_ket2, dip_ket3, &
    1522              :                                                      dip_bra1, dip_bra2, dip_bra3
    1523              :       REAL(KIND=dp), DIMENSION(:, :), POINTER     :: quad_ket1, quad_ket2, quad_ket3, &
    1524              :                                                      quad_ket4, quad_ket5, quad_ket6, &
    1525              :                                                      quad_bra1, quad_bra2, quad_bra3, &
    1526              :                                                      quad_bra4, quad_bra5, quad_bra6
    1527              : 
    1528              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER         :: atomic_kind_set
    1529              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER          :: matrix_s
    1530              :       TYPE(dft_control_type), POINTER                       :: dft_control
    1531              :       TYPE(gto_basis_set_type), POINTER                     :: basis_set_a, basis_set_b
    1532              :       TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER     :: basis_set_list
    1533              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), POINTER :: sab_orb
    1534              :       TYPE(neighbor_list_iterator_p_type), &
    1535              :          DIMENSION(:), POINTER                              :: nl_iterator
    1536              :       TYPE(particle_type), DIMENSION(:), POINTER            :: particle_set
    1537              :       TYPE(qs_kind_type), DIMENSION(:), POINTER             :: qs_kind_set
    1538              : 
    1539              :       CALL timeset(routineN, handle)
    1540              : 
    1541              :       !get info from environment vaiarable
    1542              :       NULLIFY (atomic_kind_set, qs_kind_set, sab_orb, particle_set)
    1543              :       NULLIFY (dft_control, matrix_s)
    1544              :       CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
    1545              :                       qs_kind_set=qs_kind_set, &
    1546              :                       sab_orb=sab_orb, &
    1547              :                       particle_set=particle_set, &
    1548              :                       dft_control=dft_control, &
    1549              :                       matrix_s_kp=matrix_s)
    1550              :       natom = SIZE(particle_set)
    1551              :       nkind = SIZE(atomic_kind_set)
    1552              :       nimg = dft_control%nimages
    1553              : 
    1554              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
    1555              : 
    1556              :       !set up basis set lists
    1557              :       ALLOCATE (basis_set_list(nkind))
    1558              :       CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
    1559              : 
    1560              :       ALLOCATE (stmp(msao(tb%calc%bas%maxl)**2))
    1561              :       ALLOCATE (dtmp(dip_n, msao(tb%calc%bas%maxl)**2))
    1562              :       ALLOCATE (qtmp(quad_n, msao(tb%calc%bas%maxl)**2))
    1563              :       ALLOCATE (dtmpj(dip_n, msao(tb%calc%bas%maxl)**2))
    1564              :       ALLOCATE (qtmpj(quad_n, msao(tb%calc%bas%maxl)**2))
    1565              : 
    1566              :       ! allocate dipole/quadrupole moment matrix elemnts
    1567              :       CALL dbcsr_allocate_matrix_set(tb%dipbra, dip_n)
    1568              :       CALL dbcsr_allocate_matrix_set(tb%dipket, dip_n)
    1569              :       CALL dbcsr_allocate_matrix_set(tb%quadbra, quad_n)
    1570              :       CALL dbcsr_allocate_matrix_set(tb%quadket, quad_n)
    1571              :       DO i = 1, dip_n
    1572              :          ALLOCATE (tb%dipbra(i)%matrix)
    1573              :          ALLOCATE (tb%dipket(i)%matrix)
    1574              :          CALL dbcsr_create(tb%dipbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
    1575              :                            name="DIPOLE BRAMATRIX")
    1576              :          CALL dbcsr_create(tb%dipket(i)%matrix, template=matrix_s(1, 1)%matrix, &
    1577              :                            name="DIPOLE KETMATRIX")
    1578              :          CALL cp_dbcsr_alloc_block_from_nbl(tb%dipbra(i)%matrix, sab_orb)
    1579              :          CALL cp_dbcsr_alloc_block_from_nbl(tb%dipket(i)%matrix, sab_orb)
    1580              :       END DO
    1581              :       DO i = 1, quad_n
    1582              :          ALLOCATE (tb%quadbra(i)%matrix)
    1583              :          ALLOCATE (tb%quadket(i)%matrix)
    1584              :          CALL dbcsr_create(tb%quadbra(i)%matrix, template=matrix_s(1, 1)%matrix, &
    1585              :                            name="QUADRUPOLE BRAMATRIX")
    1586              :          CALL dbcsr_create(tb%quadket(i)%matrix, template=matrix_s(1, 1)%matrix, &
    1587              :                            name="QUADRUPOLE KETMATRIX")
    1588              :          CALL cp_dbcsr_alloc_block_from_nbl(tb%quadbra(i)%matrix, sab_orb)
    1589              :          CALL cp_dbcsr_alloc_block_from_nbl(tb%quadket(i)%matrix, sab_orb)
    1590              :       END DO
    1591              : 
    1592              :       !loop over all atom pairs with a non-zero overlap (sab_orb)
    1593              :       NULLIFY (nl_iterator)
    1594              :       CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
    1595              :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    1596              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
    1597              :                                 iatom=iatom, jatom=jatom, r=rij)
    1598              : 
    1599              :          r2 = NORM2(rij(:))**2
    1600              : 
    1601              :          icol = MAX(iatom, jatom)
    1602              :          irow = MIN(iatom, jatom)
    1603              : 
    1604              :          IF (icol == jatom) THEN
    1605              :             rij = -rij
    1606              :             i = ikind
    1607              :             ikind = jkind
    1608              :             jkind = i
    1609              :          END IF
    1610              : 
    1611              :          ityp = tb%mol%id(icol)
    1612              :          jtyp = tb%mol%id(irow)
    1613              : 
    1614              :          NULLIFY (dip_bra1, dip_bra2, dip_bra3)
    1615              :          CALL dbcsr_get_block_p(matrix=tb%dipbra(1)%matrix, &
    1616              :                                 row=irow, col=icol, BLOCK=dip_bra1, found=found)
    1617              :          CPASSERT(found)
    1618              :          CALL dbcsr_get_block_p(matrix=tb%dipbra(2)%matrix, &
    1619              :                                 row=irow, col=icol, BLOCK=dip_bra2, found=found)
    1620              :          CPASSERT(found)
    1621              :          CALL dbcsr_get_block_p(matrix=tb%dipbra(3)%matrix, &
    1622              :                                 row=irow, col=icol, BLOCK=dip_bra3, found=found)
    1623              :          CPASSERT(found)
    1624              : 
    1625              :          NULLIFY (dip_ket1, dip_ket2, dip_ket3)
    1626              :          CALL dbcsr_get_block_p(matrix=tb%dipket(1)%matrix, &
    1627              :                                 row=irow, col=icol, BLOCK=dip_ket1, found=found)
    1628              :          CPASSERT(found)
    1629              :          CALL dbcsr_get_block_p(matrix=tb%dipket(2)%matrix, &
    1630              :                                 row=irow, col=icol, BLOCK=dip_ket2, found=found)
    1631              :          CPASSERT(found)
    1632              :          CALL dbcsr_get_block_p(matrix=tb%dipket(3)%matrix, &
    1633              :                                 row=irow, col=icol, BLOCK=dip_ket3, found=found)
    1634              :          CPASSERT(found)
    1635              : 
    1636              :          NULLIFY (quad_bra1, quad_bra2, quad_bra3, quad_bra4, quad_bra5, quad_bra6)
    1637              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(1)%matrix, &
    1638              :                                 row=irow, col=icol, BLOCK=quad_bra1, found=found)
    1639              :          CPASSERT(found)
    1640              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(2)%matrix, &
    1641              :                                 row=irow, col=icol, BLOCK=quad_bra2, found=found)
    1642              :          CPASSERT(found)
    1643              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(3)%matrix, &
    1644              :                                 row=irow, col=icol, BLOCK=quad_bra3, found=found)
    1645              :          CPASSERT(found)
    1646              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(4)%matrix, &
    1647              :                                 row=irow, col=icol, BLOCK=quad_bra4, found=found)
    1648              :          CPASSERT(found)
    1649              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(5)%matrix, &
    1650              :                                 row=irow, col=icol, BLOCK=quad_bra5, found=found)
    1651              :          CPASSERT(found)
    1652              :          CALL dbcsr_get_block_p(matrix=tb%quadbra(6)%matrix, &
    1653              :                                 row=irow, col=icol, BLOCK=quad_bra6, found=found)
    1654              :          CPASSERT(found)
    1655              : 
    1656              :          NULLIFY (quad_ket1, quad_ket2, quad_ket3, quad_ket4, quad_ket5, quad_ket6)
    1657              :          CALL dbcsr_get_block_p(matrix=tb%quadket(1)%matrix, &
    1658              :                                 row=irow, col=icol, BLOCK=quad_ket1, found=found)
    1659              :          CPASSERT(found)
    1660              :          CALL dbcsr_get_block_p(matrix=tb%quadket(2)%matrix, &
    1661              :                                 row=irow, col=icol, BLOCK=quad_ket2, found=found)
    1662              :          CPASSERT(found)
    1663              :          CALL dbcsr_get_block_p(matrix=tb%quadket(3)%matrix, &
    1664              :                                 row=irow, col=icol, BLOCK=quad_ket3, found=found)
    1665              :          CPASSERT(found)
    1666              :          CALL dbcsr_get_block_p(matrix=tb%quadket(4)%matrix, &
    1667              :                                 row=irow, col=icol, BLOCK=quad_ket4, found=found)
    1668              :          CPASSERT(found)
    1669              :          CALL dbcsr_get_block_p(matrix=tb%quadket(5)%matrix, &
    1670              :                                 row=irow, col=icol, BLOCK=quad_ket5, found=found)
    1671              :          CPASSERT(found)
    1672              :          CALL dbcsr_get_block_p(matrix=tb%quadket(6)%matrix, &
    1673              :                                 row=irow, col=icol, BLOCK=quad_ket6, found=found)
    1674              :          CPASSERT(found)
    1675              : 
    1676              :          !get basis information
    1677              :          basis_set_a => basis_set_list(ikind)%gto_basis_set
    1678              :          IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
    1679              :          basis_set_b => basis_set_list(jkind)%gto_basis_set
    1680              :          IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
    1681              :          atom_a = atom_of_kind(icol)
    1682              :          atom_b = atom_of_kind(irow)
    1683              :          ! basis a
    1684              :          first_sgfa => basis_set_a%first_sgf
    1685              :          la_max => basis_set_a%lmax
    1686              :          nseta = basis_set_a%nset
    1687              :          nsgfa => basis_set_a%nsgf_set
    1688              :          ! basis b
    1689              :          first_sgfb => basis_set_b%first_sgf
    1690              :          lb_max => basis_set_b%lmax
    1691              :          nsetb = basis_set_b%nset
    1692              :          nsgfb => basis_set_b%nsgf_set
    1693              : 
    1694              :          ! --------- Hamiltonian
    1695              :          IF (icol == irow) THEN
    1696              :             DO iset = 1, nseta
    1697              :                DO jset = 1, nsetb
    1698              :                   CALL multipole_cgto(tb%calc%bas%cgto(jset, ityp), tb%calc%bas%cgto(iset, ityp), &
    1699              :                        & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
    1700              : 
    1701              :                   DO inda = 1, nsgfa(iset)
    1702              :                      ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
    1703              :                      DO indb = 1, nsgfb(jset)
    1704              :                         ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
    1705              :                         ij = indb + nsgfb(jset)*(inda - 1)
    1706              : 
    1707              :                         dip_ket1(ib, ia) = dtmp(1, ij)
    1708              :                         dip_ket2(ib, ia) = dtmp(2, ij)
    1709              :                         dip_ket3(ib, ia) = dtmp(3, ij)
    1710              : 
    1711              :                         quad_ket1(ib, ia) = qtmp(1, ij)
    1712              :                         quad_ket2(ib, ia) = qtmp(2, ij)
    1713              :                         quad_ket3(ib, ia) = qtmp(3, ij)
    1714              :                         quad_ket4(ib, ia) = qtmp(4, ij)
    1715              :                         quad_ket5(ib, ia) = qtmp(5, ij)
    1716              :                         quad_ket6(ib, ia) = qtmp(6, ij)
    1717              : 
    1718              :                         dip_bra1(ib, ia) = dtmp(1, ij)
    1719              :                         dip_bra2(ib, ia) = dtmp(2, ij)
    1720              :                         dip_bra3(ib, ia) = dtmp(3, ij)
    1721              : 
    1722              :                         quad_bra1(ib, ia) = qtmp(1, ij)
    1723              :                         quad_bra2(ib, ia) = qtmp(2, ij)
    1724              :                         quad_bra3(ib, ia) = qtmp(3, ij)
    1725              :                         quad_bra4(ib, ia) = qtmp(4, ij)
    1726              :                         quad_bra5(ib, ia) = qtmp(5, ij)
    1727              :                         quad_bra6(ib, ia) = qtmp(6, ij)
    1728              :                      END DO
    1729              :                   END DO
    1730              :                END DO
    1731              :             END DO
    1732              :          ELSE
    1733              :             DO iset = 1, nseta
    1734              :                DO jset = 1, nsetb
    1735              :                   CALL multipole_cgto(tb%calc%bas%cgto(jset, jtyp), tb%calc%bas%cgto(iset, ityp), &
    1736              :                       & r2, -rij, tb%calc%bas%intcut, stmp, dtmp, qtmp)
    1737              :                   CALL multipole_cgto(tb%calc%bas%cgto(iset, ityp), tb%calc%bas%cgto(jset, jtyp), &
    1738              :                       & r2, rij, tb%calc%bas%intcut, stmp, dtmpj, qtmpj)
    1739              : 
    1740              :                   DO inda = 1, nsgfa(iset)
    1741              :                      ia = first_sgfa(1, iset) - first_sgfa(1, 1) + inda
    1742              :                      DO indb = 1, nsgfb(jset)
    1743              :                         ib = first_sgfb(1, jset) - first_sgfb(1, 1) + indb
    1744              : 
    1745              :                         ij = indb + nsgfb(jset)*(inda - 1)
    1746              : 
    1747              :                         dip_bra1(ib, ia) = dtmp(1, ij)
    1748              :                         dip_bra2(ib, ia) = dtmp(2, ij)
    1749              :                         dip_bra3(ib, ia) = dtmp(3, ij)
    1750              : 
    1751              :                         quad_bra1(ib, ia) = qtmp(1, ij)
    1752              :                         quad_bra2(ib, ia) = qtmp(2, ij)
    1753              :                         quad_bra3(ib, ia) = qtmp(3, ij)
    1754              :                         quad_bra4(ib, ia) = qtmp(4, ij)
    1755              :                         quad_bra5(ib, ia) = qtmp(5, ij)
    1756              :                         quad_bra6(ib, ia) = qtmp(6, ij)
    1757              : 
    1758              :                         ij = inda + nsgfa(iset)*(indb - 1)
    1759              : 
    1760              :                         dip_ket1(ib, ia) = dtmpj(1, ij)
    1761              :                         dip_ket2(ib, ia) = dtmpj(2, ij)
    1762              :                         dip_ket3(ib, ia) = dtmpj(3, ij)
    1763              : 
    1764              :                         quad_ket1(ib, ia) = qtmpj(1, ij)
    1765              :                         quad_ket2(ib, ia) = qtmpj(2, ij)
    1766              :                         quad_ket3(ib, ia) = qtmpj(3, ij)
    1767              :                         quad_ket4(ib, ia) = qtmpj(4, ij)
    1768              :                         quad_ket5(ib, ia) = qtmpj(5, ij)
    1769              :                         quad_ket6(ib, ia) = qtmpj(6, ij)
    1770              :                      END DO
    1771              :                   END DO
    1772              :                END DO
    1773              :             END DO
    1774              :          END IF
    1775              :       END DO
    1776              :       CALL neighbor_list_iterator_release(nl_iterator)
    1777              : 
    1778              :       DO i = 1, dip_n
    1779              :          CALL dbcsr_finalize(tb%dipbra(i)%matrix)
    1780              :          CALL dbcsr_finalize(tb%dipket(i)%matrix)
    1781              :       END DO
    1782              :       DO i = 1, quad_n
    1783              :          CALL dbcsr_finalize(tb%quadbra(i)%matrix)
    1784              :          CALL dbcsr_finalize(tb%quadket(i)%matrix)
    1785              :       END DO
    1786              : 
    1787              :       DEALLOCATE (basis_set_list)
    1788              : 
    1789              :       CALL timestop(handle)
    1790              : 
    1791              : #else
    1792              :       MARK_USED(qs_env)
    1793              :       MARK_USED(tb)
    1794            0 :       CPABORT("Built without TBLITE")
    1795              : #endif
    1796              : 
    1797            0 :    END SUBROUTINE tb_get_multipole
    1798              : 
    1799              : ! **************************************************************************************************
    1800              : !> \brief compute the mulliken properties (AO resolved)
    1801              : !> \param p_matrix ...
    1802              : !> \param bra_mat ...
    1803              : !> \param ket_mat ...
    1804              : !> \param output ...
    1805              : !> \param para_env ...
    1806              : !> \par History
    1807              : !>      adapted from ao_charges_2
    1808              : !> \note
    1809              : ! **************************************************************************************************
    1810            0 :    SUBROUTINE contract_dens(p_matrix, bra_mat, ket_mat, output, para_env)
    1811              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: p_matrix
    1812              :       TYPE(dbcsr_type), POINTER                          :: bra_mat, ket_mat
    1813              :       REAL(KIND=dp), DIMENSION(:), INTENT(INOUT)         :: output
    1814              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1815              : 
    1816              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'contract_dens'
    1817              : 
    1818              :       INTEGER                                            :: handle, i, iblock_col, iblock_row, &
    1819              :                                                             ispin, j, nspin
    1820              :       LOGICAL                                            :: found
    1821            0 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: bra, ket, p_block
    1822              :       TYPE(dbcsr_iterator_type)                          :: iter
    1823              : 
    1824            0 :       CALL timeset(routineN, handle)
    1825              : 
    1826            0 :       nspin = SIZE(p_matrix)
    1827            0 :       output = 0.0_dp
    1828            0 :       DO ispin = 1, nspin
    1829            0 :          CALL dbcsr_iterator_start(iter, bra_mat)
    1830            0 :          DO WHILE (dbcsr_iterator_blocks_left(iter))
    1831            0 :             NULLIFY (p_block, bra, ket)
    1832              : 
    1833            0 :             CALL dbcsr_iterator_next_block(iter, iblock_row, iblock_col, bra)
    1834              :             CALL dbcsr_get_block_p(matrix=p_matrix(ispin)%matrix, &
    1835            0 :                                    row=iblock_row, col=iblock_col, BLOCK=p_block, found=found)
    1836            0 :             IF (.NOT. found) CYCLE
    1837              :             CALL dbcsr_get_block_p(matrix=ket_mat, &
    1838            0 :                                    row=iblock_row, col=iblock_col, BLOCK=ket, found=found)
    1839            0 :             IF (.NOT. found) CPABORT("missing block")
    1840              : 
    1841            0 :             IF (.NOT. (ASSOCIATED(bra) .AND. ASSOCIATED(p_block))) CYCLE
    1842            0 :             DO j = 1, SIZE(p_block, 1)
    1843            0 :                DO i = 1, SIZE(p_block, 2)
    1844            0 :                   output(iblock_row) = output(iblock_row) + p_block(j, i)*ket(j, i)
    1845              :                END DO
    1846              :             END DO
    1847            0 :             IF (iblock_col /= iblock_row) THEN
    1848            0 :                DO j = 1, SIZE(p_block, 1)
    1849            0 :                   DO i = 1, SIZE(p_block, 2)
    1850            0 :                      output(iblock_col) = output(iblock_col) + p_block(j, i)*bra(j, i)
    1851              :                   END DO
    1852              :                END DO
    1853              :             END IF
    1854              :          END DO
    1855            0 :          CALL dbcsr_iterator_stop(iter)
    1856              :       END DO
    1857              : 
    1858            0 :       CALL para_env%sum(output)
    1859            0 :       CALL timestop(handle)
    1860              : 
    1861            0 :    END SUBROUTINE contract_dens
    1862              : 
    1863              : ! **************************************************************************************************
    1864              : !> \brief save gradient to force
    1865              : !> \param qs_env ...
    1866              : !> \param tb ...
    1867              : !> \param para_env ...
    1868              : !> \param ityp ...
    1869              : !> \note
    1870              : ! **************************************************************************************************
    1871            0 :    SUBROUTINE tb_grad2force(qs_env, tb, para_env, ityp)
    1872              : 
    1873              :       TYPE(qs_environment_type)                          :: qs_env
    1874              :       TYPE(tblite_type)                                  :: tb
    1875              :       TYPE(mp_para_env_type)                             :: para_env
    1876              :       INTEGER                                            :: ityp
    1877              : 
    1878              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'tb_grad2force'
    1879              : 
    1880              :       INTEGER                                            :: atoma, handle, iatom, ikind, natom
    1881            0 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, kind_of
    1882            0 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
    1883            0 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
    1884            0 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
    1885              : 
    1886            0 :       CALL timeset(routineN, handle)
    1887              : 
    1888            0 :       NULLIFY (force, atomic_kind_set)
    1889              :       CALL get_qs_env(qs_env=qs_env, force=force, particle_set=particle_set, &
    1890            0 :                       atomic_kind_set=atomic_kind_set)
    1891              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
    1892            0 :                                atom_of_kind=atom_of_kind, kind_of=kind_of)
    1893              : 
    1894            0 :       natom = SIZE(particle_set)
    1895              : 
    1896            0 :       SELECT CASE (ityp)
    1897              :       CASE DEFAULT
    1898            0 :          CPABORT("unknown force type")
    1899              :       CASE (0)
    1900            0 :          DO iatom = 1, natom
    1901            0 :             ikind = kind_of(iatom)
    1902            0 :             atoma = atom_of_kind(iatom)
    1903              :             force(ikind)%all_potential(:, atoma) = &
    1904            0 :                force(ikind)%all_potential(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1905              :          END DO
    1906              :       CASE (1)
    1907            0 :          DO iatom = 1, natom
    1908            0 :             ikind = kind_of(iatom)
    1909            0 :             atoma = atom_of_kind(iatom)
    1910              :             force(ikind)%repulsive(:, atoma) = &
    1911            0 :                force(ikind)%repulsive(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1912              :          END DO
    1913              :       CASE (2)
    1914            0 :          DO iatom = 1, natom
    1915            0 :             ikind = kind_of(iatom)
    1916            0 :             atoma = atom_of_kind(iatom)
    1917              :             force(ikind)%dispersion(:, atoma) = &
    1918            0 :                force(ikind)%dispersion(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1919              :          END DO
    1920              :       CASE (3)
    1921            0 :          DO iatom = 1, natom
    1922            0 :             ikind = kind_of(iatom)
    1923            0 :             atoma = atom_of_kind(iatom)
    1924              :             force(ikind)%rho_elec(:, atoma) = &
    1925            0 :                force(ikind)%rho_elec(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1926              :          END DO
    1927              :       CASE (4)
    1928            0 :          DO iatom = 1, natom
    1929            0 :             ikind = kind_of(iatom)
    1930            0 :             atoma = atom_of_kind(iatom)
    1931              :             force(ikind)%overlap(:, atoma) = &
    1932            0 :                force(ikind)%overlap(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1933              :          END DO
    1934              :       CASE (5)
    1935            0 :          DO iatom = 1, natom
    1936            0 :             ikind = kind_of(iatom)
    1937            0 :             atoma = atom_of_kind(iatom)
    1938              :             force(ikind)%efield(:, atoma) = &
    1939            0 :                force(ikind)%efield(:, atoma) + tb%grad(:, iatom)/para_env%num_pe
    1940              :          END DO
    1941              :       END SELECT
    1942              : 
    1943            0 :       CALL timestop(handle)
    1944              : 
    1945            0 :    END SUBROUTINE tb_grad2force
    1946              : 
    1947              : ! **************************************************************************************************
    1948              : !> \brief set gradient to zero
    1949              : !> \param qs_env ...
    1950              : !> \note
    1951              : ! **************************************************************************************************
    1952            0 :    SUBROUTINE tb_zero_force(qs_env)
    1953              : 
    1954              :       TYPE(qs_environment_type)                          :: qs_env
    1955              : 
    1956              :       INTEGER                                            :: iatom, ikind, natom
    1957            0 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: kind_of
    1958            0 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
    1959            0 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
    1960            0 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
    1961              : 
    1962            0 :       NULLIFY (force, atomic_kind_set)
    1963              :       CALL get_qs_env(qs_env=qs_env, force=force, particle_set=particle_set, &
    1964            0 :                       atomic_kind_set=atomic_kind_set)
    1965              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
    1966            0 :                                kind_of=kind_of)
    1967              : 
    1968            0 :       natom = SIZE(particle_set)
    1969              : 
    1970            0 :       DO iatom = 1, natom
    1971            0 :          ikind = kind_of(iatom)
    1972            0 :          force(ikind)%all_potential = 0.0_dp
    1973            0 :          force(ikind)%repulsive = 0.0_dp
    1974            0 :          force(ikind)%dispersion = 0.0_dp
    1975            0 :          force(ikind)%rho_elec = 0.0_dp
    1976            0 :          force(ikind)%overlap = 0.0_dp
    1977            0 :          force(ikind)%efield = 0.0_dp
    1978              :       END DO
    1979              : 
    1980            0 :    END SUBROUTINE tb_zero_force
    1981              : 
    1982              : ! **************************************************************************************************
    1983              : !> \brief compute the derivative of the energy
    1984              : !> \param qs_env ...
    1985              : !> \param use_rho ...
    1986              : !> \param nimg ...
    1987              : ! **************************************************************************************************
    1988            0 :    SUBROUTINE tb_derive_dH_diag(qs_env, use_rho, nimg)
    1989              : 
    1990              :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1991              :       LOGICAL, INTENT(IN)                                :: use_rho
    1992              :       INTEGER, INTENT(IN)                                :: nimg
    1993              : 
    1994              : #if defined(__TBLITE)
    1995              :       INTEGER                                            :: i, iatom, ic, ikind, ind, is, ish, &
    1996              :                                                             jatom, jkind
    1997              :       INTEGER, DIMENSION(3)                              :: cellind
    1998              :       INTEGER, DIMENSION(:, :, :), POINTER               :: cell_to_index
    1999              :       LOGICAL                                            :: found
    2000              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: dE
    2001              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: pblock
    2002              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_p
    2003              :       TYPE(kpoint_type), POINTER                         :: kpoints
    2004              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    2005              :       TYPE(neighbor_list_iterator_p_type), &
    2006              :          DIMENSION(:), POINTER                           :: nl_iterator
    2007              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
    2008              :          POINTER                                         :: sab_orb
    2009              :       TYPE(qs_rho_type), POINTER                         :: rho
    2010              :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
    2011              :       TYPE(tblite_type), POINTER                         :: tb
    2012              : 
    2013              :       ! compute mulliken charges required for charge update
    2014              :       NULLIFY (scf_env, rho, tb, sab_orb, para_env, kpoints)
    2015              :       CALL get_qs_env(qs_env=qs_env, scf_env=scf_env, rho=rho, tb_tblite=tb, &
    2016              :                       sab_orb=sab_orb, para_env=para_env, kpoints=kpoints)
    2017              : 
    2018              :       NULLIFY (cell_to_index)
    2019              :       IF (nimg > 1) THEN
    2020              :          CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
    2021              :       END IF
    2022              : 
    2023              :       NULLIFY (matrix_p)
    2024              :       IF (use_rho) THEN
    2025              :          CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
    2026              :       ELSE
    2027              :          matrix_p => scf_env%p_mix_new
    2028              :       END IF
    2029              : 
    2030              :       ALLOCATE (dE(tb%mol%nat))
    2031              : 
    2032              :       dE = 0.0_dp
    2033              :       ! loop over all atom pairs with a non-zero overlap (sab_orb)
    2034              :       NULLIFY (nl_iterator)
    2035              :       CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
    2036              :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    2037              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
    2038              :                                 iatom=iatom, jatom=jatom, cell=cellind)
    2039              : 
    2040              :          IF (iatom /= jatom) CYCLE
    2041              : 
    2042              :          IF (ikind /= jkind) CPABORT("Type wrong")
    2043              : 
    2044              :          is = tb%calc%bas%ish_at(iatom)
    2045              : 
    2046              :          IF (nimg == 1) THEN
    2047              :             ic = 1
    2048              :          ELSE
    2049              :             ic = cell_to_index(cellind(1), cellind(2), cellind(3))
    2050              :             CPASSERT(ic > 0)
    2051              :          END IF
    2052              : 
    2053              :          IF (cellind(1) /= 0) CYCLE
    2054              :          IF (cellind(2) /= 0) CYCLE
    2055              :          IF (cellind(3) /= 0) CYCLE
    2056              : 
    2057              :          CALL dbcsr_get_block_p(matrix=matrix_p(1, ic)%matrix, &
    2058              :                                 row=iatom, col=jatom, BLOCK=pblock, found=found)
    2059              : 
    2060              :          IF (.NOT. found) CPABORT("block not found")
    2061              : 
    2062              :          ind = 0
    2063              :          DO ish = 1, tb%calc%bas%nsh_id(ikind)
    2064              :             DO i = 1, msao(tb%calc%bas%cgto(ish, ikind)%ang)
    2065              :                ind = ind + 1
    2066              :                dE(iatom) = dE(iatom) + tb%dsedcn(is + ish)*pblock(ind, ind)
    2067              :             END DO
    2068              :          END DO
    2069              :       END DO
    2070              :       CALL neighbor_list_iterator_release(nl_iterator)
    2071              :       CALL para_env%sum(dE)
    2072              : 
    2073              :       tb%grad = 0.0_dp
    2074              :       CALL tb_add_grad(tb%grad, tb%dcndr, dE, tb%mol%nat)
    2075              :       IF (tb%use_virial) CALL tb_add_sig(tb%sigma, tb%dcndL, dE, tb%mol%nat)
    2076              :       CALL tb_grad2force(qs_env, tb, para_env, 4)
    2077              :       DEALLOCATE (dE)
    2078              : 
    2079              : #else
    2080              :       MARK_USED(qs_env)
    2081              :       MARK_USED(use_rho)
    2082              :       MARK_USED(nimg)
    2083            0 :       CPABORT("Built without TBLITE")
    2084              : #endif
    2085              : 
    2086            0 :    END SUBROUTINE tb_derive_dH_diag
    2087              : 
    2088              : ! **************************************************************************************************
    2089              : !> \brief compute the derivative of the energy
    2090              : !> \param qs_env ...
    2091              : !> \param use_rho ...
    2092              : !> \param nimg ...
    2093              : ! **************************************************************************************************
    2094            0 :    SUBROUTINE tb_derive_dH_off(qs_env, use_rho, nimg)
    2095              : 
    2096              :       TYPE(qs_environment_type), POINTER                 :: qs_env
    2097              :       LOGICAL, INTENT(IN)                                :: use_rho
    2098              :       INTEGER, INTENT(IN)                                :: nimg
    2099              : 
    2100              : #if defined(__TBLITE)
    2101              :       INTEGER                                            :: i, ij, iatom, ic, icol, ikind, ni, nj, nkind, nel, &
    2102              :                                                             sgfi, sgfj, ityp, jatom, jkind, jrow, jtyp, iset, jset, &
    2103              :                                                             nseti, nsetj, ia, ib, inda, indb
    2104              :       INTEGER, DIMENSION(3)                              :: cellind
    2105              :       INTEGER, DIMENSION(:), POINTER                     :: nsgfa, nsgfb
    2106              :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa, first_sgfb
    2107              :       INTEGER, DIMENSION(:, :, :), POINTER               :: cell_to_index
    2108              :       LOGICAL                                            :: found
    2109              :       REAL(KIND=dp)                                      :: r2, dr, itemp, jtemp, rr, hij, shpoly, dshpoly, idHdc, jdHdc, &
    2110              :                                                             scal, hp, i_a_shift, j_a_shift, ishift, jshift
    2111              :       REAL(KIND=dp), DIMENSION(3)                        :: rij, dgrad
    2112              :       REAL(KIND=dp), DIMENSION(3, 3)                     :: hsigma
    2113              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: dE, t_ov, idip, jdip, iquad, jquad
    2114              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: t_dip, t_quad, t_d_ov
    2115              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: t_i_dip, t_i_quad, t_j_dip, t_j_quad
    2116              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: pblock, wblock
    2117              : 
    2118              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
    2119              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_p, matrix_w
    2120              :       TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER  :: basis_set_list
    2121              :       TYPE(gto_basis_set_type), POINTER            :: basis_set_a, basis_set_b
    2122              :       TYPE(kpoint_type), POINTER                         :: kpoints
    2123              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    2124              :       TYPE(neighbor_list_iterator_p_type), &
    2125              :          DIMENSION(:), POINTER                           :: nl_iterator
    2126              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
    2127              :          POINTER                                         :: sab_orb
    2128              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
    2129              :       TYPE(qs_rho_type), POINTER                         :: rho
    2130              :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
    2131              :       TYPE(tb_hamiltonian), POINTER                      :: h0
    2132              :       TYPE(tblite_type), POINTER                         :: tb
    2133              : 
    2134              :       ! compute mulliken charges required for charge update
    2135              :       NULLIFY (scf_env, rho, tb, sab_orb, para_env, kpoints, matrix_w)
    2136              :       CALL get_qs_env(qs_env=qs_env, &
    2137              :                       atomic_kind_set=atomic_kind_set, &
    2138              :                       scf_env=scf_env, &
    2139              :                       rho=rho, &
    2140              :                       tb_tblite=tb, &
    2141              :                       sab_orb=sab_orb, &
    2142              :                       para_env=para_env, &
    2143              :                       qs_kind_set=qs_kind_set, &
    2144              :                       kpoints=kpoints, &
    2145              :                       matrix_w_kp=matrix_w)
    2146              : 
    2147              :       NULLIFY (cell_to_index)
    2148              :       IF (nimg > 1) THEN
    2149              :          CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
    2150              :       END IF
    2151              : 
    2152              :       h0 => tb%calc%h0
    2153              : 
    2154              :       NULLIFY (matrix_p)
    2155              :       IF (use_rho) THEN
    2156              :          CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
    2157              :       ELSE
    2158              :          matrix_p => scf_env%p_mix_new
    2159              :       END IF
    2160              : 
    2161              :       ! set up basis set lists
    2162              :       nkind = SIZE(atomic_kind_set)
    2163              :       ALLOCATE (basis_set_list(nkind))
    2164              :       CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
    2165              : 
    2166              :       ALLOCATE (dE(tb%mol%nat))
    2167              : 
    2168              :       nel = msao(tb%calc%bas%maxl)**2
    2169              :       ALLOCATE (t_ov(nel))
    2170              :       ALLOCATE (t_d_ov(3, nel))
    2171              :       ALLOCATE (t_dip(dip_n, nel))
    2172              :       ALLOCATE (t_i_dip(3, dip_n, nel), t_j_dip(3, dip_n, nel))
    2173              :       ALLOCATE (t_quad(quad_n, nel))
    2174              :       ALLOCATE (t_i_quad(3, quad_n, nel), t_j_quad(3, quad_n, nel))
    2175              : 
    2176              :       ALLOCATE (idip(dip_n), jdip(dip_n))
    2177              :       ALLOCATE (iquad(quad_n), jquad(quad_n))
    2178              : 
    2179              :       dE = 0.0_dp
    2180              :       tb%grad = 0.0_dp
    2181              :       hsigma = 0.0_dp
    2182              :       ! loop over all atom pairs with a non-zero overlap (sab_orb)
    2183              :       NULLIFY (nl_iterator)
    2184              :       CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
    2185              :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
    2186              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
    2187              :                                 iatom=iatom, jatom=jatom, r=rij, cell=cellind)
    2188              : 
    2189              :          icol = MAX(iatom, jatom)
    2190              :          jrow = MIN(iatom, jatom)
    2191              : 
    2192              :          IF (icol == jatom) THEN
    2193              :             rij = -rij
    2194              :             i = ikind
    2195              :             ikind = jkind
    2196              :             jkind = i
    2197              :          END IF
    2198              : 
    2199              :          ityp = tb%mol%id(icol)
    2200              :          jtyp = tb%mol%id(jrow)
    2201              : 
    2202              :          r2 = DOT_PRODUCT(rij, rij)
    2203              :          dr = SQRT(r2)
    2204              :          IF (icol == jrow .AND. dr < same_atom) CYCLE
    2205              :          rr = SQRT(dr/(h0%rad(ikind) + h0%rad(jkind)))
    2206              : 
    2207              :          !get basis information
    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
    2218              : 
    2219              :          IF (nimg == 1) THEN
    2220              :             ic = 1
    2221              :          ELSE
    2222              :             ic = cell_to_index(cellind(1), cellind(2), cellind(3))
    2223              :             CPASSERT(ic > 0)
    2224              :          END IF
    2225              : 
    2226              :          NULLIFY (pblock)
    2227              :          CALL dbcsr_get_block_p(matrix=matrix_p(1, ic)%matrix, &
    2228              :                                 row=jrow, col=icol, BLOCK=pblock, found=found)
    2229              :          IF (.NOT. found) CPABORT("pblock not found")
    2230              : 
    2231              :          NULLIFY (wblock)
    2232              :          CALL dbcsr_get_block_p(matrix=matrix_w(1, ic)%matrix, &
    2233              :                                 row=jrow, col=icol, block=wblock, found=found)
    2234              :          CPASSERT(found)
    2235              : 
    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)
    2242              : 
    2243              :          ni = tb%calc%bas%ish_at(icol)
    2244              :          DO iset = 1, nseti
    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)
    2248              :             DO jset = 1, nsetj
    2249              :                sgfj = first_sgfb(1, jset)
    2250              :                jshift = j_a_shift + tb%pot%vsh(nj + jset, 1)
    2251              : 
    2252              :                !get integrals and derivatives
    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)
    2256              : 
    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) &
    2261              :                          *0.5_dp/r2
    2262              :                scal = h0%hscale(iset, jset, ikind, jkind)
    2263              :                hij = 0.5_dp*(tb%selfenergy(ni + iset) + tb%selfenergy(nj + jset))*scal
    2264              : 
    2265              :                idHdc = tb%dsedcn(ni + iset)*shpoly*scal
    2266              :                jdHdc = tb%dsedcn(nj + jset)*shpoly*scal
    2267              : 
    2268              :                itemp = 0.0_dp
    2269              :                jtemp = 0.0_dp
    2270              :                dgrad = 0.0_dp
    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
    2275              : 
    2276              :                      ij = inda + nsgfa(iset)*(indb - 1)
    2277              : 
    2278              :                      itemp = itemp + idHdc*pblock(ib, ia)*t_ov(ij)
    2279              :                      jtemp = jtemp + jdHdc*pblock(ib, ia)*t_ov(ij)
    2280              : 
    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))
    2292              : 
    2293              :                   END DO
    2294              :                END DO
    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) THEN
    2300              :                   IF (icol == jrow) THEN
    2301              :                      DO ia = 1, 3
    2302              :                         DO ib = 1, 3
    2303              :                            hsigma(ia, ib) = hsigma(ia, ib) + 0.25_dp*(rij(ia)*dgrad(ib) + rij(ib)*dgrad(ia))
    2304              :                         END DO
    2305              :                      END DO
    2306              :                   ELSE
    2307              :                      DO ia = 1, 3
    2308              :                         DO ib = 1, 3
    2309              :                            hsigma(ia, ib) = hsigma(ia, ib) + 0.50_dp*(rij(ia)*dgrad(ib) + rij(ib)*dgrad(ia))
    2310              :                         END DO
    2311              :                      END DO
    2312              :                   END IF
    2313              :                END IF
    2314              :             END DO
    2315              :          END DO
    2316              :       END DO
    2317              :       CALL neighbor_list_iterator_release(nl_iterator)
    2318              : 
    2319              :       CALL para_env%sum(hsigma)
    2320              :       CALL para_env%sum(dE)
    2321              :       CALL para_env%sum(tb%grad)
    2322              : 
    2323              :       CALL tb_add_grad(tb%grad, tb%dcndr, dE, tb%mol%nat)
    2324              :       CALL tb_grad2force(qs_env, tb, para_env, 4)
    2325              : 
    2326              :       tb%sigma = tb%sigma + hsigma
    2327              :       IF (tb%use_virial) CALL tb_add_sig(tb%sigma, tb%dcndL, dE, tb%mol%nat)
    2328              : 
    2329              :       DEALLOCATE (dE)
    2330              :       DEALLOCATE (basis_set_list)
    2331              :       DEALLOCATE (t_ov, t_d_ov)
    2332              :       DEALLOCATE (t_dip, t_i_dip, t_j_dip)
    2333              :       DEALLOCATE (t_quad, t_i_quad, t_j_quad)
    2334              :       DEALLOCATE (idip, jdip, iquad, jquad)
    2335              : 
    2336              :       IF (tb%use_virial) CALL tb_add_stress(qs_env, tb, para_env)
    2337              : 
    2338              : #else
    2339              :       MARK_USED(qs_env)
    2340              :       MARK_USED(use_rho)
    2341              :       MARK_USED(nimg)
    2342            0 :       CPABORT("Built without TBLITE")
    2343              : #endif
    2344              : 
    2345            0 :    END SUBROUTINE tb_derive_dH_off
    2346              : 
    2347              : ! **************************************************************************************************
    2348              : !> \brief save stress tensor
    2349              : !> \param qs_env ...
    2350              : !> \param tb ...
    2351              : !> \param para_env ...
    2352              : ! **************************************************************************************************
    2353            0 :    SUBROUTINE tb_add_stress(qs_env, tb, para_env)
    2354              : 
    2355              :       TYPE(qs_environment_type)                          :: qs_env
    2356              :       TYPE(tblite_type)                                  :: tb
    2357              :       TYPE(mp_para_env_type)                             :: para_env
    2358              : 
    2359              :       TYPE(cell_type), POINTER                           :: cell
    2360              :       TYPE(virial_type), POINTER                         :: virial
    2361              : 
    2362            0 :       NULLIFY (virial, cell)
    2363            0 :       CALL get_qs_env(qs_env=qs_env, virial=virial, cell=cell)
    2364              : 
    2365            0 :       virial%pv_virial = virial%pv_virial - tb%sigma/para_env%num_pe
    2366              : 
    2367            0 :    END SUBROUTINE tb_add_stress
    2368              : 
    2369              : ! **************************************************************************************************
    2370              : !> \brief add contrib. to gradient
    2371              : !> \param grad ...
    2372              : !> \param deriv ...
    2373              : !> \param dE ...
    2374              : !> \param natom ...
    2375              : ! **************************************************************************************************
    2376            0 :    SUBROUTINE tb_add_grad(grad, deriv, dE, natom)
    2377              : 
    2378              :       REAL(KIND=dp), DIMENSION(:, :)                     :: grad
    2379              :       REAL(KIND=dp), DIMENSION(:, :, :)                  :: deriv
    2380              :       REAL(KIND=dp), DIMENSION(:)                        :: dE
    2381              :       INTEGER                                            :: natom
    2382              : 
    2383              :       INTEGER                                            :: i, j
    2384              : 
    2385            0 :       DO i = 1, natom
    2386            0 :          DO j = 1, natom
    2387            0 :             grad(:, i) = grad(:, i) + deriv(:, i, j)*dE(j)
    2388              :          END DO
    2389              :       END DO
    2390              : 
    2391            0 :    END SUBROUTINE tb_add_grad
    2392              : 
    2393              : ! **************************************************************************************************
    2394              : !> \brief add contrib. to sigma
    2395              : !> \param sig ...
    2396              : !> \param deriv ...
    2397              : !> \param dE ...
    2398              : !> \param natom ...
    2399              : ! **************************************************************************************************
    2400            0 :    SUBROUTINE tb_add_sig(sig, deriv, dE, natom)
    2401              : 
    2402              :       REAL(KIND=dp), DIMENSION(:, :)                     :: sig
    2403              :       REAL(KIND=dp), DIMENSION(:, :, :)                  :: deriv
    2404              :       REAL(KIND=dp), DIMENSION(:)                        :: dE
    2405              :       INTEGER                                            :: natom
    2406              : 
    2407              :       INTEGER                                            :: i, j
    2408              : 
    2409            0 :       DO i = 1, 3
    2410            0 :          DO j = 1, natom
    2411            0 :             sig(:, i) = sig(:, i) + deriv(:, i, j)*dE(j)
    2412              :          END DO
    2413              :       END DO
    2414              : 
    2415            0 :    END SUBROUTINE tb_add_sig
    2416              : 
    2417              : END MODULE tblite_interface
    2418              : 
        

Generated by: LCOV version 2.0-1