LCOV - code coverage report
Current view: top level - src - tblite_interface.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:5064cfc) Lines: 88.5 % 1175 1040
Test Date: 2026-03-04 06:45:10 Functions: 100.0 % 19 19

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

Generated by: LCOV version 2.0-1