LCOV - code coverage report
Current view: top level - src/xc - xc_lyp_adiabatic.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 301 303 99.3 %
Date: 2024-11-21 06:45:46 Functions: 6 6 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 Calculates the density_scaled Lyp functional when used in adiabatic hybrids.
      10             : !>      The energy is given as
      11             : !>
      12             : !>        Ec = 2*lambda*Ec(rho/lambda) + lambda^2*d/dlambda(Ec(rho/lambda)),
      13             : !>
      14             : !>      where rho/lambda is the scaled density
      15             : !> \par History
      16             : !>      1.2008 created [mguidon]
      17             : !> \author Manuel Guidon
      18             : ! **************************************************************************************************
      19             : MODULE xc_lyp_adiabatic
      20             :    USE bibliography,                    ONLY: Lee1988,&
      21             :                                               cite_reference
      22             :    USE input_section_types,             ONLY: section_vals_type,&
      23             :                                               section_vals_val_get
      24             :    USE kinds,                           ONLY: dp
      25             :    USE mathconstants,                   ONLY: pi
      26             :    USE xc_derivative_desc,              ONLY: deriv_norm_drho,&
      27             :                                               deriv_norm_drhoa,&
      28             :                                               deriv_norm_drhob,&
      29             :                                               deriv_rho,&
      30             :                                               deriv_rhoa,&
      31             :                                               deriv_rhob
      32             :    USE xc_derivative_set_types,         ONLY: xc_derivative_set_type,&
      33             :                                               xc_dset_get_derivative
      34             :    USE xc_derivative_types,             ONLY: xc_derivative_get,&
      35             :                                               xc_derivative_type
      36             :    USE xc_rho_cflags_types,             ONLY: xc_rho_cflags_type
      37             :    USE xc_rho_set_types,                ONLY: xc_rho_set_get,&
      38             :                                               xc_rho_set_type
      39             : #include "../base/base_uses.f90"
      40             : 
      41             :    IMPLICIT NONE
      42             :    PRIVATE
      43             : 
      44             :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      45             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_lyp_adiabatic'
      46             :    REAL(kind=dp), PARAMETER, PRIVATE :: a = 0.04918_dp, b = 0.132_dp, &
      47             :                                         c = 0.2533_dp, d = 0.349_dp
      48             : 
      49             :    PUBLIC :: lyp_adiabatic_lda_info, lyp_adiabatic_lsd_info, lyp_adiabatic_lda_eval, lyp_adiabatic_lsd_eval
      50             : 
      51             : CONTAINS
      52             : 
      53             : ! **************************************************************************************************
      54             : !> \brief return various information on the functional
      55             : !> \param reference string with the reference of the actual functional
      56             : !> \param shortform string with the shortform of the functional name
      57             : !> \param needs the components needed by this functional are set to
      58             : !>        true (does not set the unneeded components to false)
      59             : !> \param max_deriv ...
      60             : !> \par History
      61             : !>      01.2008 created [mguidon]
      62             : !> \author Manuel Guidon
      63             : ! **************************************************************************************************
      64         109 :    SUBROUTINE lyp_adiabatic_lda_info(reference, shortform, needs, max_deriv)
      65             :       CHARACTER(LEN=*), INTENT(OUT), OPTIONAL            :: reference, shortform
      66             :       TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL  :: needs
      67             :       INTEGER, INTENT(out), OPTIONAL                     :: max_deriv
      68             : 
      69         109 :       IF (PRESENT(reference)) THEN
      70           1 :          reference = "C. Lee, W. Yang, R.G. Parr, Phys. Rev. B, 37, 785 (1988) {LDA version}"
      71             :       END IF
      72         109 :       IF (PRESENT(shortform)) THEN
      73           1 :          shortform = "Lee-Yang-Parr correlation energy functional (LDA)"
      74             :       END IF
      75         109 :       IF (PRESENT(needs)) THEN
      76         108 :          needs%rho = .TRUE.
      77         108 :          needs%rho_1_3 = .TRUE.
      78         108 :          needs%norm_drho = .TRUE.
      79             :       END IF
      80         109 :       IF (PRESENT(max_deriv)) max_deriv = 1
      81             : 
      82         109 :    END SUBROUTINE lyp_adiabatic_lda_info
      83             : 
      84             : ! **************************************************************************************************
      85             : !> \brief return various information on the functional
      86             : !> \param reference string with the reference of the actual functional
      87             : !> \param shortform string with the shortform of the functional name
      88             : !> \param needs the components needed by this functional are set to
      89             : !>        true (does not set the unneeded components to false)
      90             : !> \param max_deriv ...
      91             : !> \par History
      92             : !>      01.2008 created [mguidon]
      93             : !> \author Manuel Guidon
      94             : ! **************************************************************************************************
      95         125 :    SUBROUTINE lyp_adiabatic_lsd_info(reference, shortform, needs, max_deriv)
      96             :       CHARACTER(LEN=*), INTENT(OUT), OPTIONAL            :: reference, shortform
      97             :       TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL  :: needs
      98             :       INTEGER, INTENT(out), OPTIONAL                     :: max_deriv
      99             : 
     100         125 :       IF (PRESENT(reference)) THEN
     101           1 :          reference = "C. Lee, W. Yang, R.G. Parr, Phys. Rev. B, 37, 785 (1988) {LSD version}"
     102             :       END IF
     103         125 :       IF (PRESENT(shortform)) THEN
     104           1 :          shortform = "Lee-Yang-Parr correlation energy functional (LSD)"
     105             :       END IF
     106         125 :       IF (PRESENT(needs)) THEN
     107         124 :          needs%rho_spin = .TRUE.
     108         124 :          needs%norm_drho_spin = .TRUE.
     109         124 :          needs%norm_drho = .TRUE.
     110             :       END IF
     111         125 :       IF (PRESENT(max_deriv)) max_deriv = 1
     112         125 :    END SUBROUTINE lyp_adiabatic_lsd_info
     113             : 
     114             : ! **************************************************************************************************
     115             : !> \brief ...
     116             : !> \param rho_set ...
     117             : !> \param deriv_set ...
     118             : !> \param grad_deriv ...
     119             : !> \param lyp_adiabatic_params ...
     120             : !> \par History
     121             : !>      01.2008 created [mguidon]
     122             : !> \author Manuel Guidon
     123             : ! **************************************************************************************************
     124         312 :    SUBROUTINE lyp_adiabatic_lda_eval(rho_set, deriv_set, grad_deriv, lyp_adiabatic_params)
     125             :       TYPE(xc_rho_set_type), INTENT(IN)                  :: rho_set
     126             :       TYPE(xc_derivative_set_type), INTENT(IN)           :: deriv_set
     127             :       INTEGER, INTENT(in)                                :: grad_deriv
     128             :       TYPE(section_vals_type), POINTER                   :: lyp_adiabatic_params
     129             : 
     130             :       CHARACTER(len=*), PARAMETER :: routineN = 'lyp_adiabatic_lda_eval'
     131             : 
     132             :       INTEGER                                            :: handle, npoints
     133             :       INTEGER, DIMENSION(2, 3)                           :: bo
     134             :       REAL(kind=dp)                                      :: epsilon_norm_drho, epsilon_rho, lambda
     135             :       REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), &
     136         104 :          POINTER                                         :: dummy, e_0, e_ndrho, e_rho, norm_drho, &
     137         104 :                                                             rho, rho_1_3
     138             :       TYPE(xc_derivative_type), POINTER                  :: deriv
     139             : 
     140         104 :       CALL timeset(routineN, handle)
     141             : 
     142         104 :       CALL section_vals_val_get(lyp_adiabatic_params, "LAMBDA", r_val=lambda)
     143         104 :       CALL cite_reference(Lee1988)
     144             : 
     145             :       CALL xc_rho_set_get(rho_set, rho_1_3=rho_1_3, rho=rho, &
     146             :                           norm_drho=norm_drho, local_bounds=bo, rho_cutoff=epsilon_rho, &
     147         104 :                           drho_cutoff=epsilon_norm_drho)
     148         104 :       npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
     149             : 
     150         104 :       dummy => rho
     151             : 
     152         104 :       e_0 => dummy
     153         104 :       e_rho => dummy
     154         104 :       e_ndrho => dummy
     155             : 
     156         104 :       IF (grad_deriv >= 0) THEN
     157             :          deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
     158         104 :                                          allocate_deriv=.TRUE.)
     159         104 :          CALL xc_derivative_get(deriv, deriv_data=e_0)
     160             :       END IF
     161         104 :       IF (grad_deriv >= 1 .OR. grad_deriv == -1) THEN
     162             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
     163          66 :                                          allocate_deriv=.TRUE.)
     164          66 :          CALL xc_derivative_get(deriv, deriv_data=e_rho)
     165             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
     166          66 :                                          allocate_deriv=.TRUE.)
     167          66 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
     168             :       END IF
     169         104 :       IF (grad_deriv > 1 .OR. grad_deriv < -1) THEN
     170           0 :          CPABORT("derivatives bigger than 1 not implemented")
     171             :       END IF
     172             : 
     173             : !$OMP     PARALLEL DEFAULT(NONE) &
     174             : !$OMP              SHARED(rho, norm_drho, e_0, e_rho, e_ndrho) &
     175             : !$OMP              SHARED(grad_deriv, npoints) &
     176         104 : !$OMP              SHARED(epsilon_rho, lambda)
     177             : 
     178             :       CALL lyp_adiabatic_lda_calc(rho=rho, norm_drho=norm_drho, &
     179             :                                   e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, &
     180             :                                   grad_deriv=grad_deriv, &
     181             :                                   npoints=npoints, epsilon_rho=epsilon_rho, lambda=lambda)
     182             : 
     183             : !$OMP     END PARALLEL
     184             : 
     185         104 :       NULLIFY (dummy)
     186             : 
     187         104 :       CALL timestop(handle)
     188         104 :    END SUBROUTINE lyp_adiabatic_lda_eval
     189             : 
     190             : ! **************************************************************************************************
     191             : !> \brief ...
     192             : !> \param rho ...
     193             : !> \param norm_drho ...
     194             : !> \param e_0 ...
     195             : !> \param e_rho ...
     196             : !> \param e_ndrho ...
     197             : !> \param grad_deriv ...
     198             : !> \param npoints ...
     199             : !> \param epsilon_rho ...
     200             : !> \param lambda ...
     201             : !> \par History
     202             : !>      01.2008 created [mguidon]
     203             : !> \author Manuel Guidon
     204             : ! **************************************************************************************************
     205         104 :    SUBROUTINE lyp_adiabatic_lda_calc(rho, norm_drho, &
     206         104 :                                      e_0, e_rho, e_ndrho, &
     207             :                                      grad_deriv, npoints, epsilon_rho, lambda)
     208             :       INTEGER, INTENT(in)                                :: npoints, grad_deriv
     209             :       REAL(kind=dp), DIMENSION(1:npoints), INTENT(inout) :: e_ndrho, e_rho, e_0
     210             :       REAL(kind=dp), DIMENSION(1:npoints), INTENT(in)    :: norm_drho, rho
     211             :       REAL(kind=dp), INTENT(in)                          :: epsilon_rho, lambda
     212             : 
     213             :       INTEGER                                            :: ii
     214             :       REAL(kind=dp) :: cf, my_ndrho, my_rho, t10, t107, t11, t117, t12, t122, t125, t13, t14, t15, &
     215             :          t153, t16, t17, t180, t189, t19, t195, t2, t20, t25, t28, t29, t3, t34, t36, t37, t38, &
     216             :          t4, t40, t41, t42, t43, t45, t46, t47, t50, t51, t52, t57, t58, t59, t6, t63, t65, t7, &
     217             :          t71, t77, t78, t87, t9, t94
     218             : 
     219         104 :       cf = 0.3_dp*(3._dp*pi*pi)**(2._dp/3._dp)
     220             : 
     221             : !$OMP     DO
     222             : 
     223             :       DO ii = 1, npoints
     224     4224064 :          my_rho = rho(ii)
     225     4224064 :          IF (my_rho > epsilon_rho) THEN
     226     1289946 :             IF (grad_deriv >= 0) THEN
     227     1289946 :                my_ndrho = norm_drho(ii)
     228     1289946 :                t2 = d*lambda
     229     1289946 :                t3 = my_rho**(0.1e1_dp/0.3e1_dp)
     230     1289946 :                t4 = 0.1e1_dp/t3
     231     1289946 :                t6 = 0.10e1_dp + t2*t4
     232     1289946 :                t7 = 0.1e1_dp/t6
     233     1289946 :                t9 = a*b
     234     1289946 :                t10 = t9*my_rho
     235     1289946 :                t11 = c*lambda
     236     1289946 :                t12 = t11*t4
     237     1289946 :                t13 = EXP(-t12)
     238     1289946 :                t14 = t13*t7
     239     1289946 :                t15 = my_ndrho**2
     240     1289946 :                t16 = my_rho**2
     241     1289946 :                t17 = t3**2
     242     1289946 :                t19 = 0.1e1_dp/t17/t16
     243     1289946 :                t20 = t15*t19
     244     1289946 :                t25 = 0.30e1_dp + 0.70e1_dp*t12 + 0.70e1_dp*t2*t4*t7
     245     1289946 :                t28 = Cf - 0.1388888889e-1_dp*t20*t25
     246     1289946 :                t29 = t14*t28
     247     1289946 :                t34 = lambda**2
     248     1289946 :                t36 = t6**2
     249     1289946 :                t37 = 0.1e1_dp/t36
     250     1289946 :                t38 = t37*d
     251     1289946 :                t40 = t9*t17
     252     1289946 :                t41 = c*t13
     253     1289946 :                t42 = t7*t28
     254     1289946 :                t43 = t41*t42
     255     1289946 :                t45 = t13*t37
     256     1289946 :                t46 = t28*d
     257     1289946 :                t47 = t45*t46
     258     1289946 :                t50 = 0.1e1_dp/t17/my_rho
     259     1289946 :                t51 = t9*t50
     260     1289946 :                t52 = c*t4
     261     1289946 :                t57 = d**2
     262     1289946 :                t58 = t57*lambda
     263     1289946 :                t59 = 0.1e1_dp/t17
     264     1289946 :                t63 = 0.70e1_dp*t52 + 0.70e1_dp*d*t4*t7 - 0.70e1_dp*t58*t59*t37
     265     1289946 :                t65 = t14*t15*t63
     266             : 
     267             :                e_0(ii) = e_0(ii) + 0.20e1_dp*lambda*(-a*my_rho*t7 - t10*t29) + t34*(a*t17 &
     268             :                                                                       *t38 + t40*t43 + t40*t47 + 0.13888888888888888889e-1_dp*t51* &
     269     1289946 :                                                                                     t65)
     270             : 
     271             :             END IF
     272     1289946 :             IF (grad_deriv >= 1) THEN
     273      419495 :                t71 = a*t4
     274      419495 :                t77 = lambda*t13
     275      419495 :                t78 = t77*t42
     276      419495 :                t87 = t16*my_rho
     277      419495 :                t94 = 0.1e1_dp/t3/my_rho
     278             :                t107 = 0.37037037037037037037e-1_dp*t15/t17/t87*t25 - 0.1388888889e-1_dp &
     279             :                       *t20*(-0.2333333333e1_dp*t11*t94 - 0.2333333333e1_dp*t2 &
     280      419495 :                             *t94*t7 + 0.23333333333333333333e1_dp*t57*t34*t50*t37)
     281      419495 :                t117 = 0.1e1_dp/t36/t6
     282      419495 :                t122 = t9*t4
     283      419495 :                t125 = c**2
     284      419495 :                t153 = 0.1e1_dp/t87
     285      419495 :                t180 = 0.1e1_dp/t16
     286             :                t189 = 0.2e1_dp/0.3e1_dp*t71*t38 + 0.2e1_dp/0.3e1_dp*a*t59*t117* &
     287             :                       t57*lambda + 0.2e1_dp/0.3e1_dp*t122*t43 + t9*t59*t125*t78 &
     288             :                       /0.3e1_dp + 0.2e1_dp/0.3e1_dp*t9*t59*c*t45*t46*lambda + t40 &
     289             :                       *t41*t7*t107 + 0.2e1_dp/0.3e1_dp*t122*t47 + 0.2e1_dp/0.3e1_dp* &
     290             :                       t9*t59*t13*t117*t28*t58 + t40*t45*t107*d - 0.2314814815e-1_dp &
     291             :                       *t9*t19*t65 + 0.46296296296296296297e-2_dp*t9*t153 &
     292             :                       *c*t77*t7*t15*t63 + 0.46296296296296296297e-2_dp*t9*t153 &
     293             :                       *t13*t37*t15*t63*d*lambda + 0.13888888888888888889e-1_dp &
     294             :                       *t51*t14*t15*(-0.2333333333e1_dp*c*t94 - 0.2333333333e1_dp* &
     295             :                                     d*t94*t7 + 0.70000000000000000000e1_dp*t57*t50*t37*lambda &
     296      419495 :                                     - 0.4666666667e1_dp*t57*d*t34*t180*t117)
     297             : 
     298             :                e_rho(ii) = e_rho(ii) + 0.20e1_dp*lambda*(-a*t7 - t71*t38*lambda/0.3e1_dp - t9* &
     299             :                                                          t29 - t9*t52*t78/0.3e1_dp - t9*t4*t13*t37*t28*t2/0.3e1_dp &
     300      419495 :                                                          - t10*t14*t107) + t34*t189
     301      419495 :                t195 = t14*my_ndrho*t25
     302             : 
     303             :                e_ndrho(ii) = e_ndrho(ii) + 0.55555555555555555556e-1_dp*lambda*a*b*t50*t195 + t34 &
     304             :                              *(-0.2777777778e-1_dp*t9*t180*c*t195 - 0.2777777778e-1_dp*t9 &
     305             :                                *t180*t13*t37*my_ndrho*t25*d + 0.27777777777777777778e-1_dp* &
     306      419495 :                                t51*t14*my_ndrho*t63)
     307             : 
     308             :             END IF
     309             :          END IF
     310             :       END DO
     311             : 
     312             : !$OMP     END DO
     313             : 
     314         104 :    END SUBROUTINE lyp_adiabatic_lda_calc
     315             : 
     316             : ! **************************************************************************************************
     317             : !> \brief ...
     318             : !> \param rho_set ...
     319             : !> \param deriv_set ...
     320             : !> \param grad_deriv ...
     321             : !> \param lyp_adiabatic_params ...
     322             : !> \par History
     323             : !>      01.2008 created [fawzi]
     324             : !> \author Manuel Guidon
     325             : ! **************************************************************************************************
     326         360 :    SUBROUTINE lyp_adiabatic_lsd_eval(rho_set, deriv_set, grad_deriv, lyp_adiabatic_params)
     327             :       TYPE(xc_rho_set_type)                              :: rho_set
     328             :       TYPE(xc_derivative_set_type), INTENT(IN)           :: deriv_set
     329             :       INTEGER, INTENT(in)                                :: grad_deriv
     330             :       TYPE(section_vals_type), POINTER                   :: lyp_adiabatic_params
     331             : 
     332             :       CHARACTER(len=*), PARAMETER :: routineN = 'lyp_adiabatic_lsd_eval'
     333             : 
     334             :       INTEGER                                            :: handle, npoints
     335             :       INTEGER, DIMENSION(2, 3)                           :: bo
     336             :       REAL(kind=dp)                                      :: epsilon_rho, lambda
     337         120 :       REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: dummy, e_0, e_ndr, e_ndr_ndr, &
     338         120 :          e_ndr_ra, e_ndr_rb, e_ndra, e_ndra_ndra, e_ndra_ra, e_ndra_rb, e_ndrb, e_ndrb_ndrb, &
     339         120 :          e_ndrb_ra, e_ndrb_rb, e_ra, e_ra_ra, e_ra_rb, e_rb, e_rb_rb, norm_drho, norm_drhoa, &
     340         120 :          norm_drhob, rhoa, rhob
     341             :       TYPE(xc_derivative_type), POINTER                  :: deriv
     342             : 
     343         120 :       CALL timeset(routineN, handle)
     344         120 :       NULLIFY (deriv)
     345             : 
     346         120 :       CALL section_vals_val_get(lyp_adiabatic_params, "LAMBDA", r_val=lambda)
     347         120 :       CALL cite_reference(Lee1988)
     348             : 
     349             :       CALL xc_rho_set_get(rho_set, &
     350             :                           rhoa=rhoa, rhob=rhob, norm_drhoa=norm_drhoa, &
     351             :                           norm_drhob=norm_drhob, norm_drho=norm_drho, &
     352             :                           rho_cutoff=epsilon_rho, &
     353         120 :                           local_bounds=bo)
     354         120 :       npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
     355             : 
     356         120 :       dummy => rhoa
     357         120 :       e_0 => dummy
     358         120 :       e_ra => dummy
     359         120 :       e_rb => dummy
     360         120 :       e_ndra_ra => dummy
     361         120 :       e_ndra_rb => dummy
     362         120 :       e_ndrb_ra => dummy
     363         120 :       e_ndrb_rb => dummy
     364         120 :       e_ndr_ndr => dummy
     365         120 :       e_ndra_ndra => dummy
     366         120 :       e_ndrb_ndrb => dummy
     367         120 :       e_ndr => dummy
     368         120 :       e_ndra => dummy
     369         120 :       e_ndrb => dummy
     370         120 :       e_ra_ra => dummy
     371         120 :       e_ra_rb => dummy
     372         120 :       e_rb_rb => dummy
     373         120 :       e_ndr_ra => dummy
     374         120 :       e_ndr_rb => dummy
     375             : 
     376         120 :       IF (grad_deriv >= 0) THEN
     377             :          deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
     378         120 :                                          allocate_deriv=.TRUE.)
     379         120 :          CALL xc_derivative_get(deriv, deriv_data=e_0)
     380             :       END IF
     381         120 :       IF (grad_deriv == 1 .OR. grad_deriv == -1) THEN
     382             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
     383          76 :                                          allocate_deriv=.TRUE.)
     384          76 :          CALL xc_derivative_get(deriv, deriv_data=e_ra)
     385             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
     386          76 :                                          allocate_deriv=.TRUE.)
     387          76 :          CALL xc_derivative_get(deriv, deriv_data=e_rb)
     388             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
     389          76 :                                          allocate_deriv=.TRUE.)
     390          76 :          CALL xc_derivative_get(deriv, deriv_data=e_ndr)
     391             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
     392          76 :                                          allocate_deriv=.TRUE.)
     393          76 :          CALL xc_derivative_get(deriv, deriv_data=e_ndra)
     394             :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
     395          76 :                                          allocate_deriv=.TRUE.)
     396          76 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrb)
     397             :       END IF
     398         120 :       IF (grad_deriv > 1 .OR. grad_deriv < -1) THEN
     399           0 :          CPABORT("derivatives bigger than 1 not implemented")
     400             :       END IF
     401             : 
     402             : !$OMP     PARALLEL DEFAULT(NONE) &
     403             : !$OMP              SHARED(rhoa, rhob, norm_drho, norm_drhoa, norm_drhob) &
     404             : !$OMP              SHARED(e_0, e_ra, e_rb, e_ndr, e_ndra, e_ndrb) &
     405             : !$OMP              SHARED(grad_deriv, npoints) &
     406         120 : !$OMP              SHARED(epsilon_rho, lambda)
     407             : 
     408             :       CALL lyp_adiabatic_lsd_calc( &
     409             :          rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, norm_drhoa=norm_drhoa, &
     410             :          norm_drhob=norm_drhob, e_0=e_0, e_ra=e_ra, e_rb=e_rb, &
     411             :          e_ndr=e_ndr, &
     412             :          e_ndra=e_ndra, e_ndrb=e_ndrb, &
     413             :          grad_deriv=grad_deriv, npoints=npoints, &
     414             :          epsilon_rho=epsilon_rho, lambda=lambda)
     415             : 
     416             : !$OMP     END PARALLEL
     417             : 
     418         120 :       CALL timestop(handle)
     419         120 :    END SUBROUTINE lyp_adiabatic_lsd_eval
     420             : 
     421             : ! **************************************************************************************************
     422             : !> \brief ...
     423             : !> \param rhoa ...
     424             : !> \param rhob ...
     425             : !> \param norm_drho ...
     426             : !> \param norm_drhoa ...
     427             : !> \param norm_drhob ...
     428             : !> \param e_0 ...
     429             : !> \param e_ra ...
     430             : !> \param e_rb ...
     431             : !> \param e_ndr ...
     432             : !> \param e_ndra ...
     433             : !> \param e_ndrb ...
     434             : !> \param grad_deriv ...
     435             : !> \param npoints ...
     436             : !> \param epsilon_rho ...
     437             : !> \param lambda ...
     438             : !> \par History
     439             : !>      08.2008 created [mguidon]
     440             : !> \author Manuel Guidon
     441             : ! **************************************************************************************************
     442         120 :    SUBROUTINE lyp_adiabatic_lsd_calc(rhoa, rhob, norm_drho, norm_drhoa, norm_drhob, &
     443             :                                      e_0, e_ra, e_rb, &
     444             :                                      e_ndr, &
     445             :                                      e_ndra, e_ndrb, &
     446             :                                      grad_deriv, npoints, epsilon_rho, lambda)
     447             :       REAL(kind=dp), DIMENSION(*), INTENT(in)            :: rhoa, rhob, norm_drho, norm_drhoa, &
     448             :                                                             norm_drhob
     449             :       REAL(kind=dp), DIMENSION(*), INTENT(inout)         :: e_0, e_ra, e_rb, e_ndr, e_ndra, e_ndrb
     450             :       INTEGER, INTENT(in)                                :: grad_deriv, npoints
     451             :       REAL(kind=dp), INTENT(in)                          :: epsilon_rho, lambda
     452             : 
     453             :       INTEGER                                            :: ii
     454             :       REAL(KIND=dp) :: cf, my_ndrho, my_ndrhoa, my_ndrhob, my_rhoa, my_rhob, t1, t10, t100, t102, &
     455             :          t103, t106, t108, t113, t115, t118, t119, t124, t125, t128, t129, t132, t135, t138, t14, &
     456             :          t140, t141, t143, t145, t146, t15, t151, t153, t157, t16, t162, t165, t169, t17, t171, &
     457             :          t174, t179, t18, t183, t186, t187, t188, t19, t194, t196, t199, t2, t200, t202, t21, &
     458             :          t212, t216, t220, t222, t223, t225, t23, t231, t237, t24, t246, t25, t250, t259, t26, &
     459             :          t266, t27, t270, t273, t276, t28, t280, t285, t288, t294, t3, t30, t300, t307, t31, t316, &
     460             :          t32, t325, t348, t351, t355, t362, t387, t39, t394, t4, t41, t42
     461             :       REAL(KIND=dp) :: t421, t46, t47, t48, t49, t5, t51, t55, t58, t6, t62, t63, t65, t67, t7, &
     462             :          t73, t74, t76, t77, t78, t80, t83, t84, t85, t86, t87, t9, t90, t91, t94, t95, t96, t97
     463             : 
     464         120 :       cf = 0.3_dp*(3._dp*pi*pi)**(2._dp/3._dp)
     465             : 
     466         120 : !$OMP     DO
     467             : 
     468             :       DO ii = 1, npoints
     469     4873920 :          my_rhoa = MAX(rhoa(ii), 0.0_dp)
     470     4873920 :          my_rhob = MAX(rhob(ii), 0.0_dp)
     471     4873920 :          IF (my_rhoa + my_rhob > epsilon_rho) THEN
     472     4862520 :             my_ndrhoa = norm_drhoa(ii)
     473     4862520 :             my_ndrhob = norm_drhob(ii)
     474     4862520 :             my_ndrho = norm_drho(ii)
     475     4862520 :             IF (grad_deriv >= 0) THEN
     476     4862520 :                t1 = a*my_rhoa
     477     4862520 :                t2 = my_rhoa + my_rhob
     478     4862520 :                t3 = 0.1e1_dp/t2
     479     4862520 :                t4 = my_rhob*t3
     480     4862520 :                t5 = d*lambda
     481     4862520 :                t6 = t2**(0.1e1_dp/0.3e1_dp)
     482     4862520 :                t7 = 0.1e1_dp/t6
     483     4862520 :                t9 = 0.10e1_dp + t5*t7
     484     4862520 :                t10 = 0.1e1_dp/t9
     485     4862520 :                t14 = a*b
     486     4862520 :                t15 = c*lambda
     487     4862520 :                t16 = t15*t7
     488     4862520 :                t17 = EXP(-t16)
     489     4862520 :                t18 = t14*t17
     490     4862520 :                t19 = t2**2
     491     4862520 :                t21 = t6**2
     492     4862520 :                t23 = 0.1e1_dp/t21/t19/t2
     493     4862520 :                t24 = t10*t23
     494     4862520 :                t25 = my_rhoa*my_rhob
     495     4862520 :                t26 = my_rhoa**2
     496     4862520 :                t27 = my_rhoa**(0.1e1_dp/0.3e1_dp)
     497     4862520 :                t28 = t27**2
     498     4862520 :                t30 = my_rhob**2
     499     4862520 :                t31 = my_rhob**(0.1e1_dp/0.3e1_dp)
     500     4862520 :                t32 = t31**2
     501     4862520 :                t39 = t5*t7*t10
     502             :                t41 = 0.26111111111111111111e1_dp - 0.3888888889e0_dp*t16 - 0.3888888889e0_dp &
     503     4862520 :                      *t39
     504     4862520 :                t42 = my_ndrho**2
     505             :                t46 = 0.25000000000000000000e1_dp - 0.5555555556e-1_dp*t16 - 0.5555555556e-1_dp &
     506     4862520 :                      *t39
     507     4862520 :                t47 = my_ndrhoa**2
     508     4862520 :                t48 = my_ndrhob**2
     509     4862520 :                t49 = t47 + t48
     510     4862520 :                t51 = t16 + t39 - 0.110e2_dp
     511     4862520 :                t55 = my_rhoa*t3*t47 + t4*t48
     512             :                t58 = 0.12699208415745595798e2_dp*Cf*(t28*t26 + t32*t30) + t41 &
     513     4862520 :                      *t42 - t46*t49 - 0.1111111111e0_dp*t51*t55
     514     4862520 :                t62 = 0.66666666666666666667e0_dp*t19
     515     4862520 :                t63 = t62 - t26
     516     4862520 :                t65 = t62 - t30
     517     4862520 :                t67 = t25*t58 - 0.6666666667e0_dp*t19*t42 + t63*t48 + t65*t47
     518     4862520 :                t73 = lambda**2
     519     4862520 :                t74 = t1*my_rhob
     520     4862520 :                t76 = 0.1e1_dp/t6/t2
     521     4862520 :                t77 = t9**2
     522     4862520 :                t78 = 0.1e1_dp/t77
     523     4862520 :                t80 = t76*t78*d
     524     4862520 :                t83 = t14*c
     525     4862520 :                t84 = t19**2
     526     4862520 :                t85 = 0.1e1_dp/t84
     527     4862520 :                t86 = t85*t17
     528     4862520 :                t87 = t10*t67
     529     4862520 :                t90 = t78*t85
     530     4862520 :                t91 = t67*d
     531     4862520 :                t94 = t17*t10
     532     4862520 :                t95 = t14*t94
     533     4862520 :                t96 = t23*my_rhoa
     534     4862520 :                t97 = c*t7
     535     4862520 :                t100 = d*t7*t10
     536     4862520 :                t102 = d**2
     537     4862520 :                t103 = t102*lambda
     538     4862520 :                t106 = t103/t21*t78
     539             :                t108 = -0.3888888889e0_dp*t97 - 0.3888888889e0_dp*t100 + 0.38888888888888888889e0_dp &
     540     4862520 :                       *t106
     541             :                t113 = -0.5555555556e-1_dp*t97 - 0.5555555556e-1_dp*t100 + 0.55555555555555555556e-1_dp &
     542     4862520 :                       *t106
     543     4862520 :                t115 = t97 + t100 - t106
     544     4862520 :                t118 = t108*t42 - t113*t49 - 0.1111111111e0_dp*t115*t55
     545     4862520 :                t119 = my_rhob*t118
     546             : 
     547             :                e_0(ii) = e_0(ii) + 0.20e1_dp*lambda*(-0.40e1_dp*t1*t4*t10 - t18*t24*t67) &
     548             :                          + t73*(0.40e1_dp*t74*t80 + t83*t86*t87 + t18*t90*t91 - &
     549     4862520 :                                 t95*t96*t119)
     550             : 
     551             :             END IF
     552     4862520 :             IF (grad_deriv == 1 .OR. grad_deriv == -1) THEN
     553     1398312 :                t124 = a*my_rhob
     554     1398312 :                t125 = t3*t10
     555     1398312 :                t128 = 0.1e1_dp/t19
     556     1398312 :                t129 = my_rhob*t128
     557     1398312 :                t132 = 0.40e1_dp*t1*t129*t10
     558     1398312 :                t135 = 0.1e1_dp/t6/t19*t78
     559     1398312 :                t138 = 0.1333333333e1_dp*t74*t135*t5
     560     1398312 :                t140 = t84*t2
     561     1398312 :                t141 = 0.1e1_dp/t140
     562     1398312 :                t143 = t141*t17*t87
     563     1398312 :                t145 = t14*t15*t143/0.3e1_dp
     564     1398312 :                t146 = t17*t78
     565     1398312 :                t151 = t14*t146*t141*t67*t5/0.3e1_dp
     566     1398312 :                t153 = 0.1e1_dp/t21/t84
     567     1398312 :                t157 = 0.11e2_dp/0.3e1_dp*t18*t10*t153*t67
     568     1398312 :                t162 = t15*t76
     569     1398312 :                t165 = t5*t76*t10
     570     1398312 :                t169 = 0.1e1_dp/t21/t2
     571     1398312 :                t171 = t102*t73*t169*t78
     572             :                t174 = (0.12962962962962962963e0_dp*t162 + 0.12962962962962962963e0_dp &
     573     1398312 :                        *t165 - 0.1296296296e0_dp*t171)*t42
     574             :                t179 = (0.18518518518518518519e-1_dp*t162 + 0.18518518518518518519e-1_dp &
     575     1398312 :                        *t165 - 0.1851851852e-1_dp*t171)*t49
     576             :                t183 = 0.1111111111e0_dp*(-t162/0.3e1_dp - t165/0.3e1_dp + t171/0.3e1_dp) &
     577     1398312 :                       *t55
     578     1398312 :                t186 = my_rhoa*t128*t47
     579     1398312 :                t187 = t129*t48
     580     1398312 :                t188 = t3*t47 - t186 - t187
     581     1398312 :                t194 = 0.1333333333e1_dp*t2*t42
     582     1398312 :                t196 = 0.13333333333333333333e1_dp*my_rhob
     583     1398312 :                t199 = 0.13333333333333333333e1_dp*my_rhoa
     584     1398312 :                t200 = t199 + t196
     585             :                t202 = my_rhob*t58 + t25*(0.33864555775321588795e2_dp*Cf*t28*my_rhoa &
     586             :                                          + t174 - t179 - t183 - 0.1111111111e0_dp*t51*t188) - t194 + (-0.6666666667e0_dp &
     587     1398312 :                                                                                                      *my_rhoa + t196)*t48 + t200*t47
     588     1398312 :                t212 = 0.5333333333e1_dp*t74*t135*d
     589     1398312 :                t216 = 0.1e1_dp/t77/t9
     590     1398312 :                t220 = 0.26666666666666666667e1_dp*t74/t21/t19*t216*t103
     591     1398312 :                t222 = 4*t83*t143
     592     1398312 :                t223 = c**2
     593     1398312 :                t225 = 0.1e1_dp/t6/t140
     594     1398312 :                t231 = t14*t223*t225*lambda*t17*t87/0.3e1_dp
     595     1398312 :                t237 = 0.2e1_dp/0.3e1_dp*t14*c*t225*t146*t91*lambda
     596     1398312 :                t246 = 0.2e1_dp/0.3e1_dp*t14*t17*t216*t225*t67*t103
     597     1398312 :                t250 = 4*t18*t78*t141*t91
     598     1398312 :                t259 = t14*t15*t141*t94*t25*t118/0.3e1_dp
     599     1398312 :                t266 = t14*t146*t141*t25*t118*d*lambda/0.3e1_dp
     600     1398312 :                t270 = 0.11e2_dp/0.3e1_dp*t95*t153*my_rhoa*t119
     601     1398312 :                t273 = c*t76
     602     1398312 :                t276 = d*t76*t10
     603     1398312 :                t280 = t102*t169*t78*lambda
     604     1398312 :                t285 = t102*d*t73*t128*t216
     605             :                t288 = (0.12962962962962962963e0_dp*t273 + 0.12962962962962962963e0_dp &
     606             :                        *t276 - 0.3888888889e0_dp*t280 + 0.25925925925925925926e0_dp*t285) &
     607     1398312 :                       *t42
     608             :                t294 = (0.18518518518518518519e-1_dp*t273 + 0.18518518518518518519e-1_dp &
     609             :                        *t276 - 0.5555555556e-1_dp*t280 + 0.37037037037037037037e-1_dp*t285) &
     610     1398312 :                       *t49
     611             :                t300 = 0.1111111111e0_dp*(-t273/0.3e1_dp - t276/0.3e1_dp + t280 - 0.2e1_dp &
     612     1398312 :                                          /0.3e1_dp*t285)*t55
     613             :                t307 = 0.40e1_dp*t124*t80 - t212 + t220 - t222 + t231 + t237 + t83 &
     614             :                       *t86*t10*t202 + t246 - t250 + t18*t90*t202*d - t259 - &
     615             :                       t266 + t270 - t18*t24*t119 - t95*t96*my_rhob*(t288 - t294 - &
     616     1398312 :                                                                     t300 - 0.1111111111e0_dp*t115*t188)
     617             : 
     618             :                e_ra(ii) = e_ra(ii) + 0.20e1_dp*lambda*(-0.40e1_dp*t124*t125 + t132 - t138 - t145 &
     619     1398312 :                                                        - t151 + t157 - t18*t24*t202) + t73*t307
     620             : 
     621     1398312 :                t316 = -t186 + t3*t48 - t187
     622             :                t325 = my_rhoa*t58 + t25*(0.33864555775321588795e2_dp*Cf*t32*my_rhob &
     623             :                                          + t174 - t179 - t183 - 0.1111111111e0_dp*t51*t316) - t194 + t200 &
     624     1398312 :                       *t48 + (t199 - 0.6666666667e0_dp*my_rhob)*t47
     625             :                t348 = 0.40e1_dp*t1*t80 - t212 + t220 - t222 + t231 + t237 + t83* &
     626             :                       t86*t10*t325 + t246 - t250 + t18*t90*t325*d - t259 - t266 &
     627             :                       + t270 - t18*t24*my_rhoa*t118 - t95*t96*my_rhob*(t288 - t294 &
     628     1398312 :                                                                        - t300 - 0.1111111111e0_dp*t115*t316)
     629             : 
     630             :                e_rb(ii) = e_rb(ii) + 0.20e1_dp*lambda*(-0.40e1_dp*t1*t125 + t132 - t138 - t145 - &
     631     1398312 :                                                        t151 + t157 - t18*t24*t325) + t73*t348
     632             : 
     633     1398312 :                t351 = lambda*a*b
     634     1398312 :                t355 = t3*my_ndrhoa
     635             :                t362 = t25*(-REAL(2*t46*my_ndrhoa, dp) - 0.2222222222e0_dp*t51*my_rhoa &
     636     1398312 :                            *t355) + REAL(2*t65*my_ndrhoa, dp)
     637             : 
     638             :                e_ndra(ii) = e_ndra(ii) - 0.20e1_dp*t351*t94*t23*t362 + t73*(t83*t86*t10* &
     639             :                                                                             t362 + t18*t90*t362*d - t95*t96*my_rhob*(-REAL(2*t113* &
     640     1398312 :                                                                               my_ndrhoa, dp) - 0.2222222222e0_dp*t115*my_rhoa*t355))
     641             : 
     642     1398312 :                t387 = t3*my_ndrhob
     643             :                t394 = t25*(-REAL(2*t46*my_ndrhob, dp) - 0.2222222222e0_dp*t51*my_rhob &
     644     1398312 :                            *t387) + REAL(2*t63*my_ndrhob, dp)
     645             : 
     646             :                e_ndrb(ii) = e_ndrb(ii) - 0.20e1_dp*t351*t94*t23*t394 + t73*(t83*t86*t10* &
     647             :                                                                             t394 + t18*t90*t394*d - t95*t96*my_rhob*(-REAL(2*t113* &
     648     1398312 :                                                                               my_ndrhob, dp) - 0.2222222222e0_dp*t115*my_rhob*t387))
     649             : 
     650     1398312 :                t421 = REAL(2*t25*t41*my_ndrho, dp) - 0.1333333333e1_dp*REAL(t19, dp)*REAL(my_ndrho, dp)
     651             : 
     652             :                e_ndr(ii) = e_ndr(ii) - 0.20e1_dp*t351*t94*t23*t421 + t73*(t83*t86*t10*t421 &
     653     1398312 :                                                                        + t18*t90*t421*d - REAL(2*t95*t96*my_rhob*t108*my_ndrho, dp))
     654             : 
     655             :             END IF
     656             :          END IF
     657             :       END DO
     658             : 
     659             : !$OMP     END DO
     660             : 
     661         120 :    END SUBROUTINE lyp_adiabatic_lsd_calc
     662             : 
     663             : END MODULE xc_lyp_adiabatic

Generated by: LCOV version 1.15