LCOV - code coverage report
Current view: top level - src - xc_adiabatic_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 86.4 % 44 38
Test Date: 2025-07-25 12:55:17 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Contains some functions used in the context of adiabatic hybrid functionals
      10              : !> \par History
      11              : !>      01.2008 created [Manuel Guidon]
      12              : !> \author Manuel Guidon
      13              : ! **************************************************************************************************
      14              : MODULE xc_adiabatic_methods
      15              : 
      16              :    USE input_constants,                 ONLY: do_potential_coulomb
      17              :    USE kinds,                           ONLY: dp
      18              :    USE mathconstants,                   ONLY: oorootpi
      19              :    USE qs_energy_types,                 ONLY: qs_energy_type
      20              :    USE qs_environment_types,            ONLY: get_qs_env,&
      21              :                                               qs_environment_type
      22              :    USE qs_mo_types,                     ONLY: get_mo_set,&
      23              :                                               mo_set_type
      24              : #include "./base/base_uses.f90"
      25              : 
      26              :    IMPLICIT NONE
      27              :    PRIVATE
      28              : 
      29              :    PUBLIC :: rescale_MCY3_pade
      30              : 
      31              : CONTAINS
      32              : 
      33              : ! **************************************************************************************************
      34              : !> \brief - Calculates rescaling factors for XC potentials and energy expression
      35              : !> \param qs_env ...
      36              : !> \param hf_energy Array of size 2 containing the two HF energies (Ex^{HF} and Ex^{HF,LR}
      37              : !> \param energy QS energy type
      38              : !> \param adiabatic_lambda , adiabatic_omega: Parameters for adiabatic connection
      39              : !> \param adiabatic_omega ...
      40              : !> \param scale_dEx1 scaling coefficient for xc-potentials to be calculated
      41              : !> \param scale_ddW0 scaling coefficient for xc-potentials to be calculated
      42              : !> \param scale_dDFA scaling coefficient for xc-potentials to be calculated
      43              : !> \param scale_dEx2 scaling coefficient for xc-potentials to be calculated
      44              : !> \param total_energy_xc will contain the full xc energy
      45              : !> \par History
      46              : !>      09.2007 created [Manuel Guidon]
      47              : !> \author Manuel Guidon
      48              : !> \note
      49              : !>      - Model for adiabatic connection:
      50              : !>
      51              : !>         W_lambda = a + b*lambda/(1+c*lambda)
      52              : !>         Exc = a + b*(c-log(1+c)/c^2)
      53              : !>         a = Ex^{HF}
      54              : !>         b = -c1*2*omega/sqrt(PI)*nelectron
      55              : !>         c = -1/lambda - b/(Ex^{HF}-W_lambda^{BLYP} + c2*W_lambda^{B88,LR}-c3*W_lambda^{HF,LR}
      56              : ! **************************************************************************************************
      57           44 :    SUBROUTINE rescale_MCY3_pade(qs_env, hf_energy, energy, adiabatic_lambda, &
      58              :                                 adiabatic_omega, scale_dEx1, scale_ddW0, scale_dDFA, &
      59              :                                 scale_dEx2, total_energy_xc)
      60              : 
      61              :       TYPE(qs_environment_type), POINTER                 :: qs_env
      62              :       REAL(dp), INTENT(INOUT)                            :: hf_energy(*)
      63              :       TYPE(qs_energy_type), POINTER                      :: energy
      64              :       REAL(dp), INTENT(IN)                               :: adiabatic_lambda, adiabatic_omega
      65              :       REAL(dp), INTENT(INOUT)                            :: scale_dEx1, scale_ddW0, scale_dDFA, &
      66              :                                                             scale_dEx2, total_energy_xc
      67              : 
      68              :       INTEGER                                            :: nelec_a, nelec_b, nelectron, nspins
      69              :       LOGICAL                                            :: do_swap_hf
      70              :       REAL(dp) :: a, b, c, c1, da_dDFA, da_ddW0, da_dEx1, da_dEx2, db_dDFA, db_ddW0, db_dEx1, &
      71              :          db_dEx2, dc_dDFA, dc_ddW0, dc_dEx1, dc_dEx2, dExc_da, dExc_db, dExc_dc, dfa_energy, &
      72              :          swap_value
      73           44 :       TYPE(mo_set_type), DIMENSION(:), POINTER           :: mos
      74              : 
      75           44 :       do_swap_hf = .FALSE.
      76              :       !! Assume the first HF section is the Coulomb one
      77           44 :       IF (qs_env%x_data(1, 1)%potential_parameter%potential_type /= do_potential_coulomb) do_swap_hf = .TRUE.
      78              : 
      79              :       IF (do_swap_hf) THEN
      80            0 :          swap_value = hf_energy(1)
      81            0 :          hf_energy(1) = hf_energy(2)
      82            0 :          hf_energy(2) = swap_value
      83              :       END IF
      84              : 
      85           44 :       c1 = 0.23163_dp
      86              : 
      87           44 :       CALL get_qs_env(qs_env=qs_env, mos=mos)
      88           44 :       CALL get_mo_set(mo_set=mos(1), nelectron=nelec_a)
      89           44 :       nspins = SIZE(mos)
      90           44 :       IF (nspins == 2) THEN
      91           26 :          CALL get_mo_set(mo_set=mos(2), nelectron=nelec_b)
      92              :       ELSE
      93           18 :          nelec_b = 0
      94              :       END IF
      95           44 :       nelectron = nelec_a + nelec_b
      96           44 :       dfa_energy = energy%exc + energy%exc1
      97           44 :       a = hf_energy(1)
      98           44 :       b = -c1*2.0_dp*adiabatic_omega*oorootpi*nelectron !-0.23163_dp*2.0_dp*0.2_dp*oorootpi*nelectron
      99           44 :       c = -1.0_dp/adiabatic_lambda - b/(hf_energy(1) - dfa_energy - hf_energy(2))
     100              : 
     101           44 :       dExc_da = 1.0_dp
     102           44 :       dExc_db = 1.0_dp/c - (LOG(ABS(1.0_dp + c))/(c*c))
     103           44 :       dExc_dc = -b/(c*c*c*(1.0_dp + c))*(2.0_dp*c + c*c - 2.0_dp*LOG(ABS(1.0_dp + c)) - 2.0_dp*LOG(ABS(1.0_dp + c))*c)
     104              : 
     105           44 :       da_dEx1 = 1.0_dp
     106           44 :       da_ddW0 = 0.0_dp
     107           44 :       da_dDFA = 0.0_dp
     108           44 :       da_dEx2 = 0.0_dp
     109              : 
     110           44 :       db_dEx1 = 0.0_dp
     111           44 :       db_ddW0 = 1.0_dp
     112           44 :       db_dDFA = 0.0_dp
     113           44 :       db_dEx2 = 0.0_dp
     114              : 
     115           44 :       dc_dEx1 = b/(hf_energy(1) - dfa_energy - hf_energy(2))**2
     116           44 :       dc_ddW0 = -1.0_dp/(hf_energy(1) - dfa_energy - hf_energy(2))
     117           44 :       dc_dDFA = -dc_dEx1
     118           44 :       dc_dEx2 = -dc_dEx1
     119              : 
     120           44 :       scale_dEx1 = dExc_da*da_dEx1 + dExc_db*db_dEx1 + dExc_dc*dc_dEx1
     121           44 :       scale_ddW0 = dExc_da*da_ddW0 + dExc_db*db_ddW0 + dExc_dc*dc_ddW0
     122           44 :       scale_dDFA = dExc_da*da_dDFA + dExc_db*db_dDFA + dExc_dc*dc_dDFA
     123           44 :       scale_dEx2 = dExc_da*da_dEx2 + dExc_db*db_dEx2 + dExc_dc*dc_dEx2
     124              : 
     125           44 :       total_energy_xc = a + b/(c*c)*(c - LOG(ABS(1.0_dp + c)))
     126           44 :       IF (do_swap_hf) THEN
     127            0 :          swap_value = scale_dEx1
     128            0 :          scale_dEx1 = scale_dEx2
     129            0 :          scale_dEx2 = swap_value
     130              :       END IF
     131           88 :    END SUBROUTINE rescale_MCY3_pade
     132              : 
     133              : END MODULE xc_adiabatic_methods
        

Generated by: LCOV version 2.0-1