LCOV - code coverage report
Current view: top level - src - qs_harris_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:5c1df3d) Lines: 98.9 % 90 89
Test Date: 2026-09-14 06:34:43 Functions: 41.7 % 12 5

            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 Types needed for a for a Harris model calculation
      10              : !> \par History
      11              : !>       2024.07 created
      12              : !> \author JGH
      13              : ! **************************************************************************************************
      14              : MODULE qs_harris_types
      15              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      16              :                                               get_atomic_kind_set
      17              :    USE basis_set_types,                 ONLY: get_gto_basis_set,&
      18              :                                               gto_basis_set_type
      19              :    USE distribution_1d_types,           ONLY: distribution_1d_type
      20              :    USE kinds,                           ONLY: default_string_length,&
      21              :                                               dp
      22              :    USE pw_types,                        ONLY: pw_r3d_rs_type
      23              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      24              :                                               qs_kind_type
      25              : #include "./base/base_uses.f90"
      26              : 
      27              :    IMPLICIT NONE
      28              : 
      29              :    PRIVATE
      30              : 
      31              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_harris_types'
      32              : 
      33              : ! *****************************************************************************
      34              :    TYPE rho_vec_type
      35              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)       :: rvecs
      36              :    END TYPE rho_vec_type
      37              : 
      38              :    TYPE harris_rhoin_type
      39              :       CHARACTER(LEN=default_string_length)             :: basis_type = "NDef"
      40              :       TYPE(rho_vec_type), ALLOCATABLE, DIMENSION(:, :) :: rhovec
      41              :       TYPE(rho_vec_type), ALLOCATABLE, DIMENSION(:, :) :: intvec
      42              :       INTEGER                                          :: nspin = 0
      43              :       INTEGER                                          :: nbas = 0
      44              :       INTEGER, ALLOCATABLE, DIMENSION(:, :)            :: basptr
      45              :       LOGICAL                                          :: frozen = .FALSE.
      46              :    END TYPE harris_rhoin_type
      47              : 
      48              :    TYPE harris_energy_type
      49              :       REAL(KIND=dp)                                    :: eharris = 0.0_dp
      50              :       REAL(KIND=dp)                                    :: eband = 0.0_dp
      51              :       REAL(KIND=dp)                                    :: exc_correction = 0.0_dp
      52              :       REAL(KIND=dp)                                    :: eh_correction = 0.0_dp
      53              :       REAL(KIND=dp)                                    :: ewald_correction = 0.0_dp
      54              :       REAL(KIND=dp)                                    :: dispersion = 0.0_dp
      55              :       REAL(KIND=dp)                                    :: trial_dm = 0.0_dp
      56              :       REAL(KIND=dp)                                    :: direct_harris = 0.0_dp
      57              :       REAL(KIND=dp)                                    :: direct_difference = 0.0_dp
      58              :    END TYPE harris_energy_type
      59              : 
      60              : ! *****************************************************************************
      61              : !> \brief Contains information on the Harris method
      62              : !> \par History
      63              : !>       07.2024 created
      64              : !> \author JGH
      65              : ! *****************************************************************************
      66              :    TYPE harris_type
      67              :       INTEGER                                          :: energy_functional = 0
      68              :       INTEGER                                          :: density_source = 0
      69              :       INTEGER                                          :: orbital_basis = 0
      70              :       CHARACTER(LEN=default_string_length)             :: density_filename = ""
      71              :       INTEGER                                          :: fit_max_iter = 50
      72              :       INTEGER                                          :: fit_max_backtrack = 20
      73              :       INTEGER                                          :: fit_method = 0
      74              :       REAL(KIND=dp)                                    :: fit_eps = 1.0E-3_dp
      75              :       REAL(KIND=dp)                                    :: fit_step_size = 1.0_dp
      76              :       REAL(KIND=dp)                                    :: fit_temperature = 0.0_dp
      77              :       REAL(KIND=dp)                                    :: fit_relative_entropy_weight = 1.0E-3_dp
      78              :       LOGICAL                                          :: density_fit_ready = .FALSE.
      79              :       LOGICAL                                          :: density_target_ready = .FALSE.
      80              :       LOGICAL                                          :: direct_density_matrix_energy = .FALSE.
      81              :       !
      82              :       TYPE(harris_energy_type)                         :: energy
      83              :       !
      84              :       TYPE(harris_rhoin_type)                          :: rhoin
      85              :       !
      86              :       TYPE(pw_r3d_rs_type)                             :: vh_rspace = pw_r3d_rs_type()
      87              :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER      :: vxc_rspace => Null()
      88              :       TYPE(pw_r3d_rs_type)                             :: density_fit_rspace = pw_r3d_rs_type()
      89              :       TYPE(pw_r3d_rs_type)                             :: density_target_rspace = pw_r3d_rs_type()
      90              : 
      91              :       !
      92              :       LOGICAL                                          :: debug_forces = .FALSE.
      93              :       LOGICAL                                          :: debug_stress = .FALSE.
      94              :    END TYPE harris_type
      95              : ! **************************************************************************************************
      96              : 
      97              :    PUBLIC :: harris_type, harris_energy_type, harris_env_release, &
      98              :              harris_print_direct_energy, harris_print_energy, harris_rhoin_type, harris_rhoin_init
      99              : 
     100              : ! **************************************************************************************************
     101              : 
     102              : CONTAINS
     103              : 
     104              : ! **************************************************************************************************
     105              : 
     106              : ! **************************************************************************************************
     107              : !> \brief ...
     108              : !> \param iounit ...
     109              : !> \param energy ...
     110              : ! **************************************************************************************************
     111           56 :    SUBROUTINE harris_print_energy(iounit, energy)
     112              :       INTEGER, INTENT(IN)                                :: iounit
     113              :       TYPE(harris_energy_type)                           :: energy
     114              : 
     115           56 :       IF (iounit > 0) THEN
     116           28 :          WRITE (UNIT=iounit, FMT="(/,(T2,A))") "HARRIS MODEL ENERGY INFORMATION"
     117              :          WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
     118           28 :             "Harris model energy:                           ", energy%eharris, &
     119           28 :             "Band energy:                                   ", energy%eband, &
     120           28 :             "Hartree correction energy:                     ", energy%eh_correction, &
     121           28 :             "XC correction energy:                          ", energy%exc_correction, &
     122           28 :             "Ewald sum correction energy:                   ", energy%ewald_correction, &
     123           56 :             "Dispersion energy (pair potential):            ", energy%dispersion
     124              :       END IF
     125              : 
     126           56 :    END SUBROUTINE harris_print_energy
     127              : 
     128              : ! **************************************************************************************************
     129              : !> \brief Prints the two direct fitted-density-matrix energy evaluations.
     130              : !> \param iounit Output unit
     131              : !> \param energy Harris energy data
     132              : ! **************************************************************************************************
     133            8 :    SUBROUTINE harris_print_direct_energy(iounit, energy)
     134              :       INTEGER, INTENT(IN)                                :: iounit
     135              :       TYPE(harris_energy_type), INTENT(IN)               :: energy
     136              : 
     137            8 :       IF (iounit > 0) THEN
     138            4 :          WRITE (UNIT=iounit, FMT="(/,(T2,A))") "HARRIS DIRECT DENSITY MATRIX ENERGY INFORMATION"
     139              :          WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
     140            4 :             "Consistent trial-DM energy:                   ", energy%trial_dm, &
     141            4 :             "Harris-like fitted-DM/cube energy:            ", energy%direct_harris, &
     142            8 :             "Trial-DM minus Harris-like energy:            ", energy%direct_difference
     143              :       END IF
     144              : 
     145            8 :    END SUBROUTINE harris_print_direct_energy
     146              : 
     147              : ! **************************************************************************************************
     148              : !> \brief ...
     149              : !> \param rhoin ...
     150              : !> \param basis_type ...
     151              : !> \param qs_kind_set ...
     152              : !> \param atomic_kind_set ...
     153              : !> \param local_particles ...
     154              : !> \param nspin ...
     155              : ! **************************************************************************************************
     156            8 :    SUBROUTINE harris_rhoin_init(rhoin, basis_type, qs_kind_set, atomic_kind_set, &
     157              :                                 local_particles, nspin)
     158              :       TYPE(harris_rhoin_type)                            :: rhoin
     159              :       CHARACTER(LEN=*)                                   :: basis_type
     160              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     161              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     162              :       TYPE(distribution_1d_type), POINTER                :: local_particles
     163              :       INTEGER, INTENT(IN)                                :: nspin
     164              : 
     165              :       INTEGER                                            :: iatom, ikind, iptr, ispin, natom, nkind, &
     166              :                                                             nparticle_local, nsgf
     167            8 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, kind_of, nbasf
     168              :       TYPE(gto_basis_set_type), POINTER                  :: basis_set
     169              :       TYPE(qs_kind_type), POINTER                        :: qs_kind
     170              : 
     171            8 :       CALL harris_rhoin_release(rhoin)
     172              : 
     173            8 :       rhoin%basis_type = basis_type
     174            8 :       rhoin%nspin = nspin
     175              : 
     176              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
     177            8 :                                atom_of_kind=atom_of_kind, kind_of=kind_of)
     178            8 :       natom = SIZE(atom_of_kind)
     179            8 :       nkind = SIZE(qs_kind_set)
     180              : 
     181           24 :       ALLOCATE (nbasf(nkind))
     182           30 :       DO ikind = 1, nkind
     183           22 :          qs_kind => qs_kind_set(ikind)
     184           22 :          CALL get_qs_kind(qs_kind, basis_set=basis_set, basis_type=basis_type)
     185           22 :          CALL get_gto_basis_set(basis_set, nsgf=nsgf)
     186           30 :          nbasf(ikind) = nsgf
     187              :       END DO
     188              : 
     189           24 :       ALLOCATE (rhoin%basptr(natom, 2))
     190            8 :       iptr = 1
     191           44 :       DO iatom = 1, natom
     192           36 :          ikind = kind_of(iatom)
     193           36 :          rhoin%basptr(iatom, 1) = iptr
     194           36 :          iptr = iptr + nbasf(ikind)
     195           44 :          rhoin%basptr(iatom, 2) = iptr - 1
     196              :       END DO
     197            8 :       rhoin%nbas = iptr - 1
     198              : 
     199           70 :       ALLOCATE (rhoin%rhovec(nkind, nspin))
     200           18 :       DO ispin = 1, nspin
     201           46 :          DO ikind = 1, nkind
     202           28 :             nsgf = nbasf(ikind)
     203           28 :             nparticle_local = local_particles%n_el(ikind)
     204          114 :             ALLOCATE (rhoin%rhovec(ikind, ispin)%rvecs(nsgf, nparticle_local))
     205              :          END DO
     206              :       END DO
     207              : 
     208           62 :       ALLOCATE (rhoin%intvec(nkind, nspin))
     209           18 :       DO ispin = 1, nspin
     210           46 :          DO ikind = 1, nkind
     211           28 :             nsgf = nbasf(ikind)
     212           28 :             nparticle_local = local_particles%n_el(ikind)
     213          114 :             ALLOCATE (rhoin%intvec(ikind, ispin)%rvecs(nsgf, nparticle_local))
     214              :          END DO
     215              :       END DO
     216              : 
     217            8 :       DEALLOCATE (nbasf)
     218              : 
     219           16 :    END SUBROUTINE harris_rhoin_init
     220              : 
     221              : ! **************************************************************************************************
     222              : !> \brief ...
     223              : !> \param harris_env ...
     224              : ! **************************************************************************************************
     225         9094 :    SUBROUTINE harris_env_release(harris_env)
     226              :       TYPE(harris_type), POINTER                         :: harris_env
     227              : 
     228              :       INTEGER                                            :: iab
     229              : 
     230         9094 :       IF (ASSOCIATED(harris_env)) THEN
     231              :          !
     232         9094 :          CALL harris_rhoin_release(harris_env%rhoin)
     233              :          !
     234         9094 :          IF (ASSOCIATED(harris_env%vh_rspace%pw_grid)) THEN
     235           28 :             CALL harris_env%vh_rspace%release()
     236              :          END IF
     237         9094 :          IF (ASSOCIATED(harris_env%density_fit_rspace%pw_grid)) THEN
     238           16 :             CALL harris_env%density_fit_rspace%release()
     239              :          END IF
     240         9094 :          IF (ASSOCIATED(harris_env%density_target_rspace%pw_grid)) THEN
     241           12 :             CALL harris_env%density_target_rspace%release()
     242              :          END IF
     243         9094 :          IF (ASSOCIATED(harris_env%vxc_rspace)) THEN
     244           58 :             DO iab = 1, SIZE(harris_env%vxc_rspace)
     245           58 :                CALL harris_env%vxc_rspace(iab)%release()
     246              :             END DO
     247           28 :             DEALLOCATE (harris_env%vxc_rspace)
     248              :          END IF
     249              :          !
     250         9094 :          DEALLOCATE (harris_env)
     251              :       END IF
     252              : 
     253         9094 :       NULLIFY (harris_env)
     254              : 
     255         9094 :    END SUBROUTINE harris_env_release
     256              : 
     257              : ! **************************************************************************************************
     258              : !> \brief ...
     259              : !> \param rhoin ...
     260              : ! **************************************************************************************************
     261         9102 :    SUBROUTINE harris_rhoin_release(rhoin)
     262              :       TYPE(harris_rhoin_type)                            :: rhoin
     263              : 
     264              :       INTEGER                                            :: i, j
     265              : 
     266         9102 :       IF (ALLOCATED(rhoin%rhovec)) THEN
     267           18 :          DO i = 1, SIZE(rhoin%rhovec, 2)
     268           46 :             DO j = 1, SIZE(rhoin%rhovec, 1)
     269           38 :                IF (ALLOCATED(rhoin%rhovec(j, i)%rvecs)) THEN
     270           28 :                   DEALLOCATE (rhoin%rhovec(j, i)%rvecs)
     271              :                END IF
     272              :             END DO
     273              :          END DO
     274           36 :          DEALLOCATE (rhoin%rhovec)
     275              :       END IF
     276         9102 :       IF (ALLOCATED(rhoin%intvec)) THEN
     277           18 :          DO i = 1, SIZE(rhoin%intvec, 2)
     278           46 :             DO j = 1, SIZE(rhoin%intvec, 1)
     279           38 :                IF (ALLOCATED(rhoin%intvec(j, i)%rvecs)) THEN
     280           28 :                   DEALLOCATE (rhoin%intvec(j, i)%rvecs)
     281              :                END IF
     282              :             END DO
     283              :          END DO
     284           36 :          DEALLOCATE (rhoin%intvec)
     285              :       END IF
     286         9102 :       IF (ALLOCATED(rhoin%basptr)) THEN
     287            8 :          DEALLOCATE (rhoin%basptr)
     288              :       END IF
     289         9102 :       rhoin%basis_type = "NDef"
     290         9102 :       rhoin%nspin = 0
     291         9102 :       rhoin%nbas = 0
     292         9102 :       rhoin%frozen = .FALSE.
     293              : 
     294         9102 :    END SUBROUTINE harris_rhoin_release
     295              : 
     296            0 : END MODULE qs_harris_types
        

Generated by: LCOV version 2.0-1