LCOV - code coverage report
Current view: top level - src - qs_dispersion_s_dftd3.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 84.5 % 84 71
Test Date: 2026-11-04 00:58:17 Functions: 50.0 % 2 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              : MODULE qs_dispersion_s_dftd3
       9              : 
      10              :    USE input_constants, ONLY: vdw_pairpot_dftd3, &
      11              :                               vdw_pairpot_dftd3bj
      12              :    USE kinds, ONLY: default_string_length, &
      13              :                     dp
      14              :    USE message_passing, ONLY: mp_para_env_type
      15              :    USE qs_dispersion_cnum, ONLY: setr0ab
      16              : 
      17              : #if defined(__S_DFTD3)
      18              :    USE dftd3_data_r4r2, ONLY: get_r4r2_val
      19              :    USE dftd3_data_vdwrad, ONLY: get_vdw_rad
      20              :    USE dftd3_param, ONLY: d3_param, &
      21              :                           get_rational_damping, &
      22              :                           get_zero_damping
      23              :    USE dftd3_reference, ONLY: init_reference_c6, &
      24              :                               get_c6, &
      25              :                               reference_cn, &
      26              :                               number_of_references
      27              :    USE mctc_data, ONLY: get_covalent_rad
      28              :    USE mctc_env, ONLY: error_type
      29              : #endif
      30              : 
      31              : #include "./base/base_uses.f90"
      32              : 
      33              :    IMPLICIT NONE
      34              : 
      35              :    PRIVATE
      36              : 
      37              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_s_dftd3'
      38              : 
      39              :    PUBLIC :: dftd3_param_from_library, dftd3_functional_supported
      40              : 
      41              : CONTAINS
      42              : 
      43              : ! **************************************************************************************************
      44              : !> \brief Check if a functional is supported by the s-dftd3 library
      45              : !> \param pp_type ...
      46              : !> \param ref_functional ...
      47              : !> \param found ...
      48              : ! **************************************************************************************************
      49            0 :    SUBROUTINE dftd3_functional_supported(pp_type, ref_functional, found)
      50              :       INTEGER, INTENT(IN)                                :: pp_type
      51              :       CHARACTER(LEN=*), INTENT(IN)                       :: ref_functional
      52              :       LOGICAL, INTENT(OUT)                               :: found
      53              : 
      54              : #if defined(__S_DFTD3)
      55              : 
      56              :       CHARACTER(LEN=default_string_length)               :: func_name
      57              :       TYPE(d3_param)                                     :: d3params
      58              :       TYPE(error_type), ALLOCATABLE                      :: lib_error
      59              : 
      60            0 :       ALLOCATE (lib_error)
      61            0 :       func_name = ref_functional
      62              :       d3params = d3_param()
      63            0 :       found = .TRUE.
      64              : 
      65            0 :       SELECT CASE (pp_type)
      66              :       CASE (vdw_pairpot_dftd3)
      67            0 :          CALL get_zero_damping(d3params, func_name, lib_error)
      68              :       CASE (vdw_pairpot_dftd3bj)
      69            0 :          CALL get_rational_damping(d3params, func_name, lib_error)
      70              :       CASE DEFAULT
      71            0 :          d3params = d3_param()
      72              :       END SELECT
      73              : 
      74            0 :       found = .NOT. ALLOCATED(lib_error)
      75              : 
      76              : #else
      77              :       MARK_USED(pp_type)
      78              :       MARK_USED(ref_functional)
      79              :       found = .FALSE.
      80              : #endif
      81              : 
      82            0 :    END SUBROUTINE dftd3_functional_supported
      83              : 
      84              : ! **************************************************************************************************
      85              : !> \brief ...
      86              : !> \param c6ab ...
      87              : !> \param maxci ...
      88              : !> \param r0ab ...
      89              : !> \param rcov ...
      90              : !> \param r2r4 ...
      91              : !> \param pp_type ...
      92              : !> \param ref_functional ...
      93              : !> \param s6 ...
      94              : !> \param s8 ...
      95              : !> \param a1 ...
      96              : !> \param a2 ...
      97              : !> \param sr6 ...
      98              : !> \param sr8 ...
      99              : !> \param para_env ...
     100              : !> \param error ...
     101              : !> \param calc_scaling ...
     102              : ! **************************************************************************************************
     103           52 :    SUBROUTINE dftd3_param_from_library(c6ab, maxci, r0ab, rcov, r2r4, &
     104              :                                        pp_type, ref_functional, &
     105              :                                        s6, s8, a1, a2, sr6, sr8, &
     106              :                                        para_env, error, calc_scaling)
     107              : 
     108              :       REAL(KIND=dp), DIMENSION(:, :, :, :, :), &
     109              :          INTENT(INOUT)                                   :: c6ab
     110              :       INTEGER, DIMENSION(:), INTENT(INOUT)               :: maxci
     111              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: r0ab
     112              :       REAL(KIND=dp), DIMENSION(:), INTENT(INOUT)         :: rcov, r2r4
     113              :       INTEGER, INTENT(IN)                                :: pp_type
     114              :       CHARACTER(LEN=*), INTENT(IN)                       :: ref_functional
     115              :       REAL(KIND=dp), INTENT(INOUT)                       :: s6, s8, a1, a2, sr6, sr8
     116              :       TYPE(mp_para_env_type), INTENT(IN), POINTER        :: para_env
     117              :       CHARACTER(LEN=*), INTENT(OUT), OPTIONAL            :: error
     118              :       LOGICAL, INTENT(IN), OPTIONAL                      :: calc_scaling
     119              : 
     120              : #if defined(__S_DFTD3)
     121              : 
     122              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'dftd3_param_from_library'
     123              : 
     124              :       CHARACTER(LEN=default_string_length)               :: func_name
     125              :       INTEGER                                            :: handle, i, iz, jref, jz, nelem, nref
     126              :       LOGICAL                                            :: do_calc_scaling
     127              :       REAL(KIND=dp)                                      :: c6_val, r4r2, rcov_val
     128              :       REAL(KIND=dp), DIMENSION(94)                       :: r2r4_tmp, rcov_tmp
     129              :       TYPE(d3_param)                                     :: d3params
     130           52 :       TYPE(error_type), ALLOCATABLE                      :: lib_error
     131              : 
     132           52 :       CALL timeset(routineN, handle)
     133              : 
     134           52 :       CALL init_reference_c6()
     135              : 
     136           52 :       nref = 7
     137           52 :       nelem = MIN(94, SIZE(maxci))
     138              : 
     139         5408 :       maxci(:) = 0
     140         4940 :       DO iz = 1, nelem
     141         4940 :          maxci(iz) = number_of_references(iz)
     142              :       END DO
     143              : 
     144           52 :       IF (para_env%is_source()) THEN
     145         2470 :          DO iz = 1, nelem
     146         2444 :             rcov_val = get_covalent_rad(iz)
     147         2444 :             rcov_tmp(iz) = rcov_val
     148              : 
     149         2444 :             r4r2 = get_r4r2_val(iz)
     150         2470 :             r2r4_tmp(iz) = r4r2
     151              :          END DO
     152              : 
     153       278538 :          r0ab = 0.0_dp
     154         2470 :          DO iz = 1, nelem
     155       232206 :             DO jz = 1, nelem
     156       232180 :                IF (r2r4_tmp(iz) > 0.0_dp .AND. r2r4_tmp(jz) > 0.0_dp) THEN
     157       229736 :                   r0ab(iz, jz) = get_vdw_rad(iz, jz)
     158              :                END IF
     159              :             END DO
     160              :          END DO
     161              : 
     162     40945736 :          c6ab = 0.0_dp
     163          208 :          DO jref = 1, nref
     164        17316 :             DO jz = 1, nelem
     165       137046 :                DO i = 1, nref
     166     11393928 :                   DO iz = 1, nelem
     167     11257064 :                      c6_val = get_c6(i, jref, iz, jz)
     168     11257064 :                      c6ab(iz, jz, i, jref, 1) = c6_val
     169     11257064 :                      c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
     170     11376820 :                      c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
     171              :                   END DO
     172              :                END DO
     173              :             END DO
     174              :          END DO
     175              :       END IF
     176              : 
     177           52 :       CALL para_env%bcast(r2r4_tmp)
     178      1114100 :       CALL para_env%bcast(r0ab)
     179           52 :       CALL para_env%bcast(rcov_tmp)
     180              : 
     181           52 :       IF (.NOT. para_env%is_source()) THEN
     182     40945736 :          c6ab = 0.0_dp
     183          208 :          DO jref = 1, nref
     184        17316 :             DO jz = 1, nelem
     185       137046 :                DO i = 1, nref
     186     11393928 :                   DO iz = 1, nelem
     187     11257064 :                      c6_val = get_c6(i, jref, iz, jz)
     188     11257064 :                      c6ab(iz, jz, i, jref, 1) = c6_val
     189     11257064 :                      c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
     190     11376820 :                      c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
     191              :                   END DO
     192              :                END DO
     193              :             END DO
     194              :          END DO
     195              :       END IF
     196              : 
     197         4940 :       r2r4(:nelem) = r2r4_tmp(:nelem)
     198         4940 :       rcov(:nelem) = rcov_tmp(:nelem)
     199              : 
     200           52 :       func_name = ref_functional
     201           52 :       d3params = d3_param()
     202              : 
     203           52 :       IF (para_env%is_source()) THEN
     204           36 :          SELECT CASE (pp_type)
     205              :          CASE (vdw_pairpot_dftd3)
     206           10 :             CALL get_zero_damping(d3params, func_name, lib_error)
     207              :          CASE (vdw_pairpot_dftd3bj)
     208           16 :             CALL get_rational_damping(d3params, func_name, lib_error)
     209              :          CASE DEFAULT
     210           26 :             d3params = d3_param()
     211              :          END SELECT
     212           26 :          IF (ALLOCATED(lib_error)) THEN
     213            0 :             IF (PRESENT(error)) THEN
     214            0 :                error = "Functional '"//TRIM(ref_functional)//"' not found in s-dftd3 library"
     215              :             END IF
     216            0 :             RETURN
     217              :          END IF
     218              :       END IF
     219              : 
     220           52 :       CALL para_env%bcast(func_name)
     221           52 :       CALL para_env%bcast(d3params%s6)
     222           52 :       CALL para_env%bcast(d3params%s8)
     223           52 :       CALL para_env%bcast(d3params%a1)
     224           52 :       CALL para_env%bcast(d3params%a2)
     225           52 :       CALL para_env%bcast(d3params%rs6)
     226           52 :       CALL para_env%bcast(d3params%rs8)
     227              : 
     228           52 :       IF (PRESENT(error)) error = ""
     229              : 
     230           52 :       do_calc_scaling = .TRUE.
     231           52 :       IF (PRESENT(calc_scaling)) do_calc_scaling = calc_scaling
     232              : 
     233           52 :       sr8 = d3params%rs8
     234           52 :       IF (do_calc_scaling) THEN
     235           50 :          s6 = d3params%s6
     236           50 :          s8 = d3params%s8
     237           50 :          a1 = d3params%a1
     238           50 :          a2 = d3params%a2
     239           50 :          sr6 = d3params%rs6
     240              :       END IF
     241              : 
     242           52 :       CALL timestop(handle)
     243              : 
     244              : #else
     245              :       MARK_USED(c6ab)
     246              :       MARK_USED(maxci)
     247              :       MARK_USED(r0ab)
     248              :       MARK_USED(rcov)
     249              :       MARK_USED(r2r4)
     250              :       MARK_USED(pp_type)
     251              :       MARK_USED(ref_functional)
     252              :       MARK_USED(s6)
     253              :       MARK_USED(s8)
     254              :       MARK_USED(a1)
     255              :       MARK_USED(a2)
     256              :       MARK_USED(sr6)
     257              :       MARK_USED(sr8)
     258              :       MARK_USED(para_env)
     259              :       MARK_USED(error)
     260              :       MARK_USED(calc_scaling)
     261              :       CPABORT("s-dftd3 library not compiled in")
     262              : #endif
     263              : 
     264          156 :    END SUBROUTINE dftd3_param_from_library
     265              : 
     266              : END MODULE qs_dispersion_s_dftd3
        

Generated by: LCOV version 2.0-1