LCOV - code coverage report
Current view: top level - src - tblite_ks_matrix.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:71c3ab0) Lines: 78.7 % 47 37
Test Date: 2026-07-25 06:35:44 Functions: 100.0 % 1 1

            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 tblite matrix build
      10              : !> \author JVP
      11              : !> \history creation 09.2024
      12              : ! **************************************************************************************************
      13              : 
      14              : MODULE tblite_ks_matrix
      15              : 
      16              :    USE cp_control_types,                ONLY: dft_control_type
      17              :    USE cp_dbcsr_api,                    ONLY: dbcsr_add,&
      18              :                                               dbcsr_copy,&
      19              :                                               dbcsr_multiply,&
      20              :                                               dbcsr_p_type,&
      21              :                                               dbcsr_type
      22              :    USE cp_dbcsr_contrib,                ONLY: dbcsr_dot
      23              :    USE kinds,                           ONLY: dp
      24              :    USE message_passing,                 ONLY: mp_para_env_type
      25              :    USE qs_energy_types,                 ONLY: qs_energy_type
      26              :    USE qs_environment_types,            ONLY: get_qs_env,&
      27              :                                               qs_environment_type
      28              :    USE qs_ks_types,                     ONLY: qs_ks_env_type
      29              :    USE qs_mo_types,                     ONLY: get_mo_set,&
      30              :                                               mo_set_type
      31              :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      32              :                                               qs_rho_type
      33              :    USE tblite_interface,                ONLY: tb_derive_dH_off,&
      34              :                                               tb_ham_add_coulomb,&
      35              :                                               tb_update_charges
      36              : #include "./base/base_uses.f90"
      37              : 
      38              :    IMPLICIT NONE
      39              : 
      40              :    PRIVATE
      41              : 
      42              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tblite_ks_matrix'
      43              : 
      44              :    PUBLIC :: build_tblite_ks_matrix
      45              : 
      46              : CONTAINS
      47              : 
      48              : ! **************************************************************************************************
      49              : !> \brief ...
      50              : !> \param qs_env ...
      51              : !> \param calculate_forces ...
      52              : !> \param just_energy ...
      53              : !> \param ext_ks_matrix ...
      54              : ! **************************************************************************************************
      55        29306 :    SUBROUTINE build_tblite_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
      56              :       TYPE(qs_environment_type), POINTER                 :: qs_env
      57              :       LOGICAL, INTENT(in)                                :: calculate_forces, just_energy
      58              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
      59              :          POINTER                                         :: ext_ks_matrix
      60              : 
      61              :       CHARACTER(len=*), PARAMETER :: routineN = 'build_tblite_ks_matrix'
      62              : 
      63              :       INTEGER                                            :: handle, img, ispin, nimg, ns, nspins
      64              :       LOGICAL                                            :: do_efield, force_use_rho
      65              :       REAL(KIND=dp)                                      :: pc_ener, qmmm_el
      66        29306 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: matrix_p1, mo_derivs
      67        29306 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: ks_matrix, matrix_h
      68              :       TYPE(dbcsr_type), POINTER                          :: mo_coeff
      69              :       TYPE(dft_control_type), POINTER                    :: dft_control
      70              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      71              :       TYPE(qs_energy_type), POINTER                      :: energy
      72              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
      73              :       TYPE(qs_rho_type), POINTER                         :: rho
      74              : 
      75        29306 :       CALL timeset(routineN, handle)
      76              : 
      77        29306 :       NULLIFY (dft_control, ks_env, ks_matrix, rho, energy)
      78        29306 :       CPASSERT(ASSOCIATED(qs_env))
      79              : 
      80              :       CALL get_qs_env(qs_env, &
      81              :                       dft_control=dft_control, &
      82              :                       matrix_h_kp=matrix_h, &
      83              :                       para_env=para_env, &
      84              :                       ks_env=ks_env, &
      85              :                       matrix_ks_kp=ks_matrix, &
      86              :                       rho=rho, &
      87        29306 :                       energy=energy)
      88              : 
      89        29306 :       IF (PRESENT(ext_ks_matrix)) THEN
      90              :          ! remap pointer to allow for non-kpoint external ks matrix
      91              :          ! ext_ks_matrix is used in linear response code
      92            2 :          ns = SIZE(ext_ks_matrix)
      93            2 :          ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
      94              :       END IF
      95              : 
      96        29306 :       energy%qmmm_el = 0.0_dp
      97              : 
      98        29306 :       nspins = dft_control%nspins
      99        29306 :       nimg = dft_control%nimages
     100        29306 :       CPASSERT(ASSOCIATED(matrix_h))
     101        29306 :       CPASSERT(ASSOCIATED(rho))
     102        87918 :       CPASSERT(SIZE(ks_matrix) > 0)
     103              : 
     104        61578 :       DO ispin = 1, nspins
     105       664836 :          DO img = 1, nimg
     106              :             ! copy the core matrix into the fock matrix
     107       635530 :             CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
     108              :          END DO
     109              :       END DO
     110              : 
     111        29306 :       IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
     112              :           dft_control%apply_efield_field) THEN
     113            0 :          do_efield = .TRUE.
     114            0 :          CPABORT("Not implemented yet. Use CP2K routines for GFN1")
     115              :       ELSE
     116        29306 :          do_efield = .FALSE.
     117              :       END IF
     118              : 
     119        29306 :       force_use_rho = .NOT. (calculate_forces .AND. nspins > 1)
     120        29306 :       CALL tb_update_charges(qs_env, dft_control, qs_env%tb_tblite, calculate_forces, force_use_rho)
     121              : 
     122        29306 :       CALL tb_ham_add_coulomb(qs_env, qs_env%tb_tblite, dft_control)
     123              : 
     124        29306 :       IF (qs_env%qmmm) THEN
     125            0 :          CPASSERT(SIZE(ks_matrix, 2) == 1)
     126            0 :          DO ispin = 1, nspins
     127              :             ! If QM/MM sumup the 1el Hamiltonian
     128              :             CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
     129            0 :                            1.0_dp, 1.0_dp)
     130            0 :             CALL qs_rho_get(rho, rho_ao=matrix_p1)
     131              :             ! Compute QM/MM Energy
     132              :             CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
     133            0 :                            matrix_p1(ispin)%matrix, qmmm_el)
     134            0 :             energy%qmmm_el = energy%qmmm_el + qmmm_el
     135              :          END DO
     136            0 :          pc_ener = qs_env%ks_qmmm_env%pc_ener
     137            0 :          energy%qmmm_el = energy%qmmm_el + pc_ener
     138              :       END IF
     139              : 
     140        29306 :       IF (calculate_forces) THEN
     141          152 :          CALL tb_derive_dH_off(qs_env, force_use_rho, nimg)
     142              :       END IF
     143              : 
     144              :       ! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
     145        29306 :       IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
     146           68 :          CPASSERT(SIZE(ks_matrix, 2) == 1)
     147              :          BLOCK
     148           68 :             TYPE(mo_set_type), DIMENSION(:), POINTER         :: mo_array
     149           68 :             CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
     150          146 :             DO ispin = 1, SIZE(mo_derivs)
     151           78 :                CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
     152           78 :                CPASSERT(mo_array(ispin)%use_mo_coeff_b)
     153              :                CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
     154          146 :                                    0.0_dp, mo_derivs(ispin)%matrix)
     155              :             END DO
     156              :          END BLOCK
     157              :       END IF
     158              : 
     159        29306 :       CALL timestop(handle)
     160              : 
     161        29306 :    END SUBROUTINE build_tblite_ks_matrix
     162              : 
     163              : END MODULE tblite_ks_matrix
        

Generated by: LCOV version 2.0-1