LCOV - code coverage report
Current view: top level - src - xtb_ehess.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b8e0b09) Lines: 145 153 94.8 %
Date: 2024-08-31 06:31:37 Functions: 2 2 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief Calculation of Coulomb Hessian contributions in xTB
      10             : !> \author JGH
      11             : ! **************************************************************************************************
      12             : MODULE xtb_ehess
      13             :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      14             :                                               get_atomic_kind_set
      15             :    USE cell_types,                      ONLY: cell_type,&
      16             :                                               get_cell,&
      17             :                                               pbc
      18             :    USE cp_control_types,                ONLY: dft_control_type,&
      19             :                                               xtb_control_type
      20             :    USE cp_dbcsr_api,                    ONLY: dbcsr_get_block_p,&
      21             :                                               dbcsr_iterator_blocks_left,&
      22             :                                               dbcsr_iterator_next_block,&
      23             :                                               dbcsr_iterator_start,&
      24             :                                               dbcsr_iterator_stop,&
      25             :                                               dbcsr_iterator_type,&
      26             :                                               dbcsr_p_type
      27             :    USE distribution_1d_types,           ONLY: distribution_1d_type
      28             :    USE ewald_environment_types,         ONLY: ewald_env_get,&
      29             :                                               ewald_environment_type
      30             :    USE ewald_methods_tb,                ONLY: tb_ewald_overlap,&
      31             :                                               tb_spme_evaluate
      32             :    USE ewald_pw_types,                  ONLY: ewald_pw_type
      33             :    USE kinds,                           ONLY: dp
      34             :    USE mathconstants,                   ONLY: oorootpi,&
      35             :                                               pi
      36             :    USE message_passing,                 ONLY: mp_para_env_type
      37             :    USE particle_types,                  ONLY: particle_type
      38             :    USE pw_poisson_types,                ONLY: do_ewald_ewald,&
      39             :                                               do_ewald_none,&
      40             :                                               do_ewald_pme,&
      41             :                                               do_ewald_spme
      42             :    USE qs_environment_types,            ONLY: get_qs_env,&
      43             :                                               qs_environment_type
      44             :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      45             :                                               qs_kind_type
      46             :    USE qs_neighbor_list_types,          ONLY: get_iterator_info,&
      47             :                                               neighbor_list_iterate,&
      48             :                                               neighbor_list_iterator_create,&
      49             :                                               neighbor_list_iterator_p_type,&
      50             :                                               neighbor_list_iterator_release,&
      51             :                                               neighbor_list_set_p_type
      52             :    USE virial_types,                    ONLY: virial_type
      53             :    USE xtb_coulomb,                     ONLY: gamma_rab_sr
      54             :    USE xtb_types,                       ONLY: get_xtb_atom_param,&
      55             :                                               xtb_atom_type
      56             : #include "./base/base_uses.f90"
      57             : 
      58             :    IMPLICIT NONE
      59             : 
      60             :    PRIVATE
      61             : 
      62             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_ehess'
      63             : 
      64             :    PUBLIC :: xtb_coulomb_hessian
      65             : 
      66             : CONTAINS
      67             : 
      68             : ! **************************************************************************************************
      69             : !> \brief ...
      70             : !> \param qs_env ...
      71             : !> \param ks_matrix ...
      72             : !> \param charges1 ...
      73             : !> \param mcharge1 ...
      74             : !> \param mcharge ...
      75             : ! **************************************************************************************************
      76         134 :    SUBROUTINE xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge)
      77             : 
      78             :       TYPE(qs_environment_type), POINTER                 :: qs_env
      79             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: ks_matrix
      80             :       REAL(dp), DIMENSION(:, :)                          :: charges1
      81             :       REAL(dp), DIMENSION(:)                             :: mcharge1, mcharge
      82             : 
      83             :       CHARACTER(len=*), PARAMETER :: routineN = 'xtb_coulomb_hessian'
      84             : 
      85             :       INTEGER :: blk, ewald_type, handle, i, ia, iatom, icol, ikind, irow, is, j, jatom, jkind, &
      86             :          la, lb, lmaxa, lmaxb, natom, natorb_a, natorb_b, ni, nj, nkind, nmat, za, zb
      87         134 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: kind_of
      88             :       INTEGER, DIMENSION(25)                             :: laoa, laob
      89             :       INTEGER, DIMENSION(3)                              :: cellind, periodic
      90             :       LOGICAL                                            :: defined, do_ewald, found
      91             :       REAL(KIND=dp)                                      :: alpha, deth, dr, etaa, etab, gmij, kg, &
      92             :                                                             rcut, rcuta, rcutb
      93         134 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: xgamma
      94         134 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: gammab, gcij, gmcharge
      95         134 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: gchrg
      96             :       REAL(KIND=dp), DIMENSION(3)                        :: rij
      97             :       REAL(KIND=dp), DIMENSION(5)                        :: kappaa, kappab
      98         134 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: ksblock, sblock
      99         134 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     100             :       TYPE(cell_type), POINTER                           :: cell
     101             :       TYPE(dbcsr_iterator_type)                          :: iter
     102         134 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_s
     103             :       TYPE(dft_control_type), POINTER                    :: dft_control
     104             :       TYPE(distribution_1d_type), POINTER                :: local_particles
     105             :       TYPE(ewald_environment_type), POINTER              :: ewald_env
     106             :       TYPE(ewald_pw_type), POINTER                       :: ewald_pw
     107             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     108             :       TYPE(neighbor_list_iterator_p_type), &
     109         134 :          DIMENSION(:), POINTER                           :: nl_iterator
     110             :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     111         134 :          POINTER                                         :: n_list
     112         134 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     113         134 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     114             :       TYPE(virial_type), POINTER                         :: virial
     115             :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b, xtb_kind
     116             :       TYPE(xtb_control_type), POINTER                    :: xtb_control
     117             : 
     118         134 :       CALL timeset(routineN, handle)
     119             : 
     120             :       CALL get_qs_env(qs_env, &
     121             :                       matrix_s_kp=matrix_s, &
     122             :                       qs_kind_set=qs_kind_set, &
     123             :                       particle_set=particle_set, &
     124             :                       cell=cell, &
     125         134 :                       dft_control=dft_control)
     126             : 
     127         134 :       xtb_control => dft_control%qs_control%xtb_control
     128             : 
     129         134 :       IF (dft_control%nimages /= 1) THEN
     130           0 :          CPABORT("No kpoints allowed in xTB response calculation")
     131             :       END IF
     132             : 
     133         134 :       CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
     134         134 :       nmat = 1
     135         402 :       ALLOCATE (gchrg(natom, 5, nmat))
     136       10708 :       gchrg = 0._dp
     137         402 :       ALLOCATE (gmcharge(natom, nmat))
     138        2222 :       gmcharge = 0._dp
     139             : 
     140             :       ! short range contribution (gamma)
     141             :       ! loop over all atom pairs (sab_xtbe)
     142         134 :       kg = xtb_control%kg
     143         134 :       NULLIFY (n_list)
     144         134 :       IF (xtb_control%old_coulomb_damping) THEN
     145           0 :          CALL get_qs_env(qs_env=qs_env, sab_orb=n_list)
     146             :       ELSE
     147         134 :          CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
     148             :       END IF
     149         134 :       CALL neighbor_list_iterator_create(nl_iterator, n_list)
     150      197967 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     151             :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     152      197833 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cellind)
     153      197833 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     154      197833 :          CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
     155      197833 :          IF (.NOT. defined .OR. natorb_a < 1) CYCLE
     156      197833 :          CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     157      197833 :          CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
     158      197833 :          IF (.NOT. defined .OR. natorb_b < 1) CYCLE
     159             :          ! atomic parameters
     160      197833 :          CALL get_xtb_atom_param(xtb_atom_a, eta=etaa, lmax=lmaxa, kappa=kappaa, rcut=rcuta)
     161      197833 :          CALL get_xtb_atom_param(xtb_atom_b, eta=etab, lmax=lmaxb, kappa=kappab, rcut=rcutb)
     162             :          ! gamma matrix
     163      197833 :          ni = lmaxa + 1
     164      197833 :          nj = lmaxb + 1
     165      791332 :          ALLOCATE (gammab(ni, nj))
     166      197833 :          rcut = rcuta + rcutb
     167      791332 :          dr = SQRT(SUM(rij(:)**2))
     168      197833 :          CALL gamma_rab_sr(gammab, dr, ni, kappaa, etaa, nj, kappab, etab, kg, rcut)
     169     2010292 :          gchrg(iatom, 1:ni, 1) = gchrg(iatom, 1:ni, 1) + MATMUL(gammab, charges1(jatom, 1:nj))
     170      197833 :          IF (iatom /= jatom) THEN
     171     2288907 :             gchrg(jatom, 1:nj, 1) = gchrg(jatom, 1:nj, 1) + MATMUL(charges1(iatom, 1:ni), gammab)
     172             :          END IF
     173      791332 :          DEALLOCATE (gammab)
     174             :       END DO
     175         134 :       CALL neighbor_list_iterator_release(nl_iterator)
     176             : 
     177             :       ! 1/R contribution
     178             : 
     179         134 :       IF (xtb_control%coulomb_lr) THEN
     180         134 :          do_ewald = xtb_control%do_ewald
     181         134 :          IF (do_ewald) THEN
     182             :             ! Ewald sum
     183          54 :             NULLIFY (ewald_env, ewald_pw)
     184          54 :             NULLIFY (virial)
     185             :             CALL get_qs_env(qs_env=qs_env, &
     186          54 :                             ewald_env=ewald_env, ewald_pw=ewald_pw)
     187          54 :             CALL get_cell(cell=cell, periodic=periodic, deth=deth)
     188          54 :             CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type)
     189          54 :             CALL get_qs_env(qs_env=qs_env, sab_tbe=n_list)
     190          54 :             CALL tb_ewald_overlap(gmcharge, mcharge1, alpha, n_list, virial, .FALSE.)
     191           0 :             SELECT CASE (ewald_type)
     192             :             CASE DEFAULT
     193           0 :                CPABORT("Invalid Ewald type")
     194             :             CASE (do_ewald_none)
     195           0 :                CPABORT("Not allowed with DFTB")
     196             :             CASE (do_ewald_ewald)
     197           0 :                CPABORT("Standard Ewald not implemented in DFTB")
     198             :             CASE (do_ewald_pme)
     199           0 :                CPABORT("PME not implemented in DFTB")
     200             :             CASE (do_ewald_spme)
     201             :                CALL tb_spme_evaluate(ewald_env, ewald_pw, particle_set, cell, &
     202          54 :                                      gmcharge, mcharge1, .FALSE., virial, .FALSE.)
     203             :             END SELECT
     204             :          ELSE
     205             :             ! direct sum
     206             :             CALL get_qs_env(qs_env=qs_env, &
     207          80 :                             local_particles=local_particles)
     208         280 :             DO ikind = 1, SIZE(local_particles%n_el)
     209         420 :                DO ia = 1, local_particles%n_el(ikind)
     210         140 :                   iatom = local_particles%list(ikind)%array(ia)
     211         520 :                   DO jatom = 1, iatom - 1
     212         720 :                      rij = particle_set(iatom)%r - particle_set(jatom)%r
     213         720 :                      rij = pbc(rij, cell)
     214         720 :                      dr = SQRT(SUM(rij(:)**2))
     215         320 :                      IF (dr > 1.e-6_dp) THEN
     216         180 :                         gmcharge(iatom, 1) = gmcharge(iatom, 1) + mcharge1(jatom)/dr
     217         180 :                         gmcharge(jatom, 1) = gmcharge(jatom, 1) + mcharge1(iatom)/dr
     218             :                      END IF
     219             :                   END DO
     220             :                END DO
     221             :             END DO
     222             :          END IF
     223             :       END IF
     224             : 
     225             :       ! global sum of gamma*p arrays
     226         134 :       CALL get_qs_env(qs_env=qs_env, para_env=para_env)
     227         134 :       CALL para_env%sum(gmcharge(:, 1))
     228         134 :       CALL para_env%sum(gchrg(:, :, 1))
     229             : 
     230         134 :       IF (xtb_control%coulomb_lr) THEN
     231         134 :          IF (do_ewald) THEN
     232             :             ! add self charge interaction and background charge contribution
     233        1728 :             gmcharge(:, 1) = gmcharge(:, 1) - 2._dp*alpha*oorootpi*mcharge1(:)
     234         102 :             IF (ANY(periodic(:) == 1)) THEN
     235        1648 :                gmcharge(:, 1) = gmcharge(:, 1) - pi/alpha**2/deth
     236             :             END IF
     237             :          END IF
     238             :       END IF
     239             : 
     240         134 :       CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
     241         134 :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
     242             : 
     243             :       ! no k-points; all matrices have been transformed to periodic bsf
     244         134 :       CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
     245       37680 :       DO WHILE (dbcsr_iterator_blocks_left(iter))
     246       37546 :          CALL dbcsr_iterator_next_block(iter, irow, icol, sblock, blk)
     247       37546 :          ikind = kind_of(irow)
     248       37546 :          jkind = kind_of(icol)
     249             : 
     250             :          ! atomic parameters
     251       37546 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     252       37546 :          CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     253       37546 :          CALL get_xtb_atom_param(xtb_atom_a, z=za, lao=laoa)
     254       37546 :          CALL get_xtb_atom_param(xtb_atom_b, z=zb, lao=laob)
     255             : 
     256       37546 :          ni = SIZE(sblock, 1)
     257       37546 :          nj = SIZE(sblock, 2)
     258      150184 :          ALLOCATE (gcij(ni, nj))
     259      154096 :          DO i = 1, ni
     260      420500 :             DO j = 1, nj
     261      266404 :                la = laoa(i) + 1
     262      266404 :                lb = laob(j) + 1
     263      382954 :                gcij(i, j) = gchrg(irow, la, 1) + gchrg(icol, lb, 1)
     264             :             END DO
     265             :          END DO
     266       37546 :          gmij = gmcharge(irow, 1) + gmcharge(icol, 1)
     267       75092 :          DO is = 1, SIZE(ks_matrix)
     268       37546 :             NULLIFY (ksblock)
     269             :             CALL dbcsr_get_block_p(matrix=ks_matrix(is)%matrix, &
     270       37546 :                                    row=irow, col=icol, block=ksblock, found=found)
     271       37546 :             CPASSERT(found)
     272      737190 :             ksblock = ksblock - gcij*sblock
     273      812282 :             ksblock = ksblock - gmij*sblock
     274             :          END DO
     275      112772 :          DEALLOCATE (gcij)
     276             :       END DO
     277         134 :       CALL dbcsr_iterator_stop(iter)
     278             : 
     279         134 :       IF (xtb_control%tb3_interaction) THEN
     280         134 :          CALL get_qs_env(qs_env, nkind=nkind)
     281         402 :          ALLOCATE (xgamma(nkind))
     282         466 :          DO ikind = 1, nkind
     283         332 :             CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
     284         466 :             CALL get_xtb_atom_param(xtb_kind, xgamma=xgamma(ikind))
     285             :          END DO
     286             :          ! Diagonal 3rd order correction (DFTB3)
     287         134 :          CALL dftb3_diagonal_hessian(qs_env, ks_matrix, mcharge, mcharge1, xgamma)
     288         134 :          DEALLOCATE (xgamma)
     289             :       END IF
     290             : 
     291         134 :       IF (qs_env%qmmm .AND. qs_env%qmmm_periodic) THEN
     292           0 :          CPABORT("QMMM not available in xTB response calculations")
     293             :       END IF
     294             : 
     295         134 :       DEALLOCATE (gmcharge, gchrg)
     296             : 
     297         134 :       CALL timestop(handle)
     298             : 
     299         402 :    END SUBROUTINE xtb_coulomb_hessian
     300             : 
     301             : ! **************************************************************************************************
     302             : !> \brief ...
     303             : !> \param qs_env ...
     304             : !> \param ks_matrix ...
     305             : !> \param mcharge ...
     306             : !> \param mcharge1 ...
     307             : !> \param xgamma ...
     308             : ! **************************************************************************************************
     309         134 :    SUBROUTINE dftb3_diagonal_hessian(qs_env, ks_matrix, mcharge, mcharge1, xgamma)
     310             : 
     311             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     312             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: ks_matrix
     313             :       REAL(dp), DIMENSION(:)                             :: mcharge, mcharge1, xgamma
     314             : 
     315             :       CHARACTER(len=*), PARAMETER :: routineN = 'dftb3_diagonal_hessian'
     316             : 
     317             :       INTEGER                                            :: blk, handle, icol, ikind, irow, is, jkind
     318         134 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: kind_of
     319             :       LOGICAL                                            :: found
     320             :       REAL(KIND=dp)                                      :: gmij, ui, uj
     321         134 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: ksblock, sblock
     322         134 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     323             :       TYPE(dbcsr_iterator_type)                          :: iter
     324         134 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_s
     325         134 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     326             : 
     327         134 :       CALL timeset(routineN, handle)
     328             : 
     329         134 :       CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
     330         134 :       CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
     331         134 :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
     332             :       ! no k-points; all matrices have been transformed to periodic bsf
     333         134 :       CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
     334       37680 :       DO WHILE (dbcsr_iterator_blocks_left(iter))
     335       37546 :          CALL dbcsr_iterator_next_block(iter, irow, icol, sblock, blk)
     336       37546 :          ikind = kind_of(irow)
     337       37546 :          ui = xgamma(ikind)
     338       37546 :          jkind = kind_of(icol)
     339       37546 :          uj = xgamma(jkind)
     340       37546 :          gmij = ui*mcharge(irow)*mcharge1(irow) + uj*mcharge(icol)*mcharge1(icol)
     341       75226 :          DO is = 1, SIZE(ks_matrix)
     342       37546 :             NULLIFY (ksblock)
     343             :             CALL dbcsr_get_block_p(matrix=ks_matrix(is)%matrix, &
     344       37546 :                                    row=irow, col=icol, block=ksblock, found=found)
     345       37546 :             CPASSERT(found)
     346      812282 :             ksblock = ksblock + gmij*sblock
     347             :          END DO
     348             :       END DO
     349         134 :       CALL dbcsr_iterator_stop(iter)
     350             : 
     351         134 :       CALL timestop(handle)
     352             : 
     353         268 :    END SUBROUTINE dftb3_diagonal_hessian
     354             : 
     355      391031 : END MODULE xtb_ehess
     356             : 

Generated by: LCOV version 1.15