LCOV - code coverage report
Current view: top level - src/xc - xc_lyp.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 96.8 % 468 453
Test Date: 2026-11-04 00:58:17 Functions: 100.0 % 6 6

            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 calculates the lyp correlation functional
      10              : !> \par History
      11              : !>      11.2003 created [fawzi]
      12              : !> \author fawzi
      13              : ! **************************************************************************************************
      14              : MODULE xc_lyp
      15              :    USE bibliography,                    ONLY: Lee1988,&
      16              :                                               cite_reference
      17              :    USE input_section_types,             ONLY: section_vals_type,&
      18              :                                               section_vals_val_get
      19              :    USE kinds,                           ONLY: dp
      20              :    USE mathconstants,                   ONLY: pi
      21              :    USE xc_derivative_desc,              ONLY: deriv_norm_drho,&
      22              :                                               deriv_norm_drhoa,&
      23              :                                               deriv_norm_drhob,&
      24              :                                               deriv_rho,&
      25              :                                               deriv_rhoa,&
      26              :                                               deriv_rhob
      27              :    USE xc_derivative_set_types,         ONLY: xc_derivative_set_type,&
      28              :                                               xc_dset_get_derivative
      29              :    USE xc_derivative_types,             ONLY: xc_derivative_get,&
      30              :                                               xc_derivative_type
      31              :    USE xc_rho_cflags_types,             ONLY: xc_rho_cflags_type
      32              :    USE xc_rho_set_types,                ONLY: xc_rho_set_get,&
      33              :                                               xc_rho_set_type
      34              : #include "../base/base_uses.f90"
      35              : 
      36              :    IMPLICIT NONE
      37              :    PRIVATE
      38              : 
      39              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      40              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_lyp'
      41              :    REAL(kind=dp), PARAMETER, PRIVATE :: a = 0.04918_dp, b = 0.132_dp, &
      42              :                                         c = 0.2533_dp, d = 0.349_dp
      43              : 
      44              :    PUBLIC :: lyp_lda_info, lyp_lsd_info, lyp_lda_eval, lyp_lsd_eval
      45              : CONTAINS
      46              : 
      47              : ! **************************************************************************************************
      48              : !> \brief return various information on the functional
      49              : !> \param reference string with the reference of the actual functional
      50              : !> \param shortform string with the shortform of the functional name
      51              : !> \param needs the components needed by this functional are set to
      52              : !>        true (does not set the unneeded components to false)
      53              : !> \param max_deriv ...
      54              : !> \par History
      55              : !>      11.2003 created [fawzi]
      56              : !> \author fawzi
      57              : ! **************************************************************************************************
      58         8620 :    SUBROUTINE lyp_lda_info(reference, shortform, needs, max_deriv)
      59              :       CHARACTER(LEN=*), INTENT(OUT), OPTIONAL            :: reference, shortform
      60              :       TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL  :: needs
      61              :       INTEGER, INTENT(out), OPTIONAL                     :: max_deriv
      62              : 
      63         8620 :       IF (PRESENT(reference)) THEN
      64          105 :          reference = "C. Lee, W. Yang, R.G. Parr, Phys. Rev. B, 37, 785 (1988) {LDA version}"
      65              :       END IF
      66         8620 :       IF (PRESENT(shortform)) THEN
      67          105 :          shortform = "Lee-Yang-Parr correlation energy functional (LDA)"
      68              :       END IF
      69         8620 :       IF (PRESENT(needs)) THEN
      70         8515 :          needs%rho = .TRUE.
      71         8515 :          needs%rho_1_3 = .TRUE.
      72         8515 :          needs%norm_drho = .TRUE.
      73              :       END IF
      74         8620 :       IF (PRESENT(max_deriv)) max_deriv = 3
      75              : 
      76         8620 :    END SUBROUTINE lyp_lda_info
      77              : 
      78              : ! **************************************************************************************************
      79              : !> \brief return various information on the functional
      80              : !> \param reference string with the reference of the actual functional
      81              : !> \param shortform string with the shortform of the functional name
      82              : !> \param needs the components needed by this functional are set to
      83              : !>        true (does not set the unneeded components to false)
      84              : !> \param max_deriv ...
      85              : !> \par History
      86              : !>      11.2003 created [fawzi]
      87              : !> \author fawzi
      88              : ! **************************************************************************************************
      89         2826 :    SUBROUTINE lyp_lsd_info(reference, shortform, needs, max_deriv)
      90              :       CHARACTER(LEN=*), INTENT(OUT), OPTIONAL            :: reference, shortform
      91              :       TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL  :: needs
      92              :       INTEGER, INTENT(out), OPTIONAL                     :: max_deriv
      93              : 
      94         2826 :       IF (PRESENT(reference)) THEN
      95           40 :          reference = "C. Lee, W. Yang, R.G. Parr, Phys. Rev. B, 37, 785 (1988) {LSD version}"
      96              :       END IF
      97         2826 :       IF (PRESENT(shortform)) THEN
      98           40 :          shortform = "Lee-Yang-Parr correlation energy functional (LSD)"
      99              :       END IF
     100         2826 :       IF (PRESENT(needs)) THEN
     101         2786 :          needs%rho_spin = .TRUE.
     102         2786 :          needs%norm_drho_spin = .TRUE.
     103         2786 :          needs%norm_drho = .TRUE.
     104              :       END IF
     105         2826 :       IF (PRESENT(max_deriv)) max_deriv = 2
     106              : 
     107         2826 :    END SUBROUTINE lyp_lsd_info
     108              : 
     109              : ! **************************************************************************************************
     110              : !> \brief evaluates the lyp correlation functional for lda
     111              : !> \param rho_set the density where you want to evaluate the functional
     112              : !> \param deriv_set place where to store the functional derivatives (they are
     113              : !>        added to the derivatives)
     114              : !> \param grad_deriv maximum degree of the derivative that should be evaluated
     115              : !> \param lyp_params input parameters (scaling)
     116              : !> \par History
     117              : !>      11.2003 created [fawzi]
     118              : !>      01.2007 added scaling [Manuel Guidon]
     119              : !> \author fawzi
     120              : ! **************************************************************************************************
     121        24831 :    SUBROUTINE lyp_lda_eval(rho_set, deriv_set, grad_deriv, lyp_params)
     122              :       TYPE(xc_rho_set_type), INTENT(IN)                  :: rho_set
     123              :       TYPE(xc_derivative_set_type), INTENT(IN)           :: deriv_set
     124              :       INTEGER, INTENT(in)                                :: grad_deriv
     125              :       TYPE(section_vals_type), POINTER                   :: lyp_params
     126              : 
     127              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'lyp_lda_eval'
     128              : 
     129              :       INTEGER                                            :: handle, npoints
     130              :       INTEGER, DIMENSION(2, 3)                           :: bo
     131              :       REAL(kind=dp)                                      :: epsilon_norm_drho, epsilon_rho, sc
     132         8277 :       REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: dummy, e_0, e_ndrho, &
     133         8277 :          e_ndrho_ndrho, e_ndrho_ndrho_rho, e_ndrho_rho, e_ndrho_rho_rho, e_rho, e_rho_rho, &
     134         8277 :          e_rho_rho_rho, norm_drho, rho, rho_1_3
     135              :       TYPE(xc_derivative_type), POINTER                  :: deriv
     136              : 
     137         8277 :       CALL timeset(routineN, handle)
     138              : 
     139         8277 :       CALL section_vals_val_get(lyp_params, "scale_c", r_val=sc)
     140         8277 :       CALL cite_reference(Lee1988)
     141              : 
     142              :       CALL xc_rho_set_get(rho_set, rho_1_3=rho_1_3, rho=rho, &
     143              :                           norm_drho=norm_drho, local_bounds=bo, rho_cutoff=epsilon_rho, &
     144         8277 :                           drho_cutoff=epsilon_norm_drho)
     145         8277 :       npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
     146              : 
     147         8277 :       dummy => rho
     148              : 
     149         8277 :       e_0 => dummy
     150         8277 :       e_rho => dummy
     151         8277 :       e_ndrho => dummy
     152         8277 :       e_rho_rho => dummy
     153         8277 :       e_ndrho_rho => dummy
     154         8277 :       e_ndrho_ndrho => dummy
     155         8277 :       e_rho_rho_rho => dummy
     156         8277 :       e_ndrho_rho_rho => dummy
     157         8277 :       e_ndrho_ndrho_rho => dummy
     158              : 
     159              :       deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
     160         8277 :                                       allocate_deriv=.TRUE.)
     161         8277 :       CALL xc_derivative_get(deriv, deriv_data=e_0)
     162         8277 :       IF (grad_deriv >= 1) THEN
     163              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
     164         8059 :                                          allocate_deriv=.TRUE.)
     165         8059 :          CALL xc_derivative_get(deriv, deriv_data=e_rho)
     166              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
     167         8059 :                                          allocate_deriv=.TRUE.)
     168         8059 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
     169              :       END IF
     170         8277 :       IF (grad_deriv >= 2) THEN
     171              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
     172          276 :                                          allocate_deriv=.TRUE.)
     173          276 :          CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
     174              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rho], &
     175          276 :                                          allocate_deriv=.TRUE.)
     176          276 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho)
     177              :          deriv => xc_dset_get_derivative(deriv_set, &
     178          276 :                                          [deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.)
     179          276 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
     180              :       END IF
     181         8277 :       IF (grad_deriv >= 3) THEN
     182              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
     183            0 :                                          allocate_deriv=.TRUE.)
     184            0 :          CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
     185              :          deriv => xc_dset_get_derivative(deriv_set, &
     186            0 :                                          [deriv_norm_drho, deriv_rho, deriv_rho], allocate_deriv=.TRUE.)
     187            0 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho_rho)
     188              :          deriv => xc_dset_get_derivative(deriv_set, &
     189            0 :                                          [deriv_norm_drho, deriv_norm_drho, deriv_rho], allocate_deriv=.TRUE.)
     190            0 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho_rho)
     191              : !FM        deriv => xc_dset_get_derivative(deriv_set,&
     192              : !FM             [deriv_norm_drho, deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.,&
     193              : !FM
     194              : !FM        call xc_derivative_get(deriv,deriv_data=e_ndrho_ndrho_ndrho)
     195              :       END IF
     196         8277 :       IF (grad_deriv > 3) THEN
     197            0 :          CPABORT("derivatives bigger than 3 not implemented")
     198              :       END IF
     199              : 
     200              : !$OMP   PARALLEL DEFAULT(NONE) &
     201              : !$OMP            SHARED(rho, rho_1_3, norm_drho, e_0, e_rho, e_ndrho) &
     202              : !$OMP            SHARED(e_rho_rho, e_ndrho_rho, e_ndrho_ndrho) &
     203              : !$OMP            SHARED(e_rho_rho_rho, e_ndrho_rho_rho) &
     204              : !$OMP            SHARED(e_ndrho_ndrho_rho, grad_deriv, npoints) &
     205         8277 : !$OMP            SHARED(epsilon_rho,  sc)
     206              : 
     207              :       CALL lyp_lda_calc(rho=rho, rho_1_3=rho_1_3, norm_drho=norm_drho, &
     208              :                         e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, e_rho_rho=e_rho_rho, &
     209              :                         e_ndrho_rho=e_ndrho_rho, e_ndrho_ndrho=e_ndrho_ndrho, &
     210              :                         e_rho_rho_rho=e_rho_rho_rho, e_ndrho_rho_rho=e_ndrho_rho_rho, &
     211              :                         e_ndrho_ndrho_rho=e_ndrho_ndrho_rho, &
     212              :                         grad_deriv=grad_deriv, &
     213              :                         npoints=npoints, epsilon_rho=epsilon_rho, sc=sc)
     214              : 
     215              : !$OMP   END PARALLEL
     216              : 
     217         8277 :       CALL timestop(handle)
     218         8277 :    END SUBROUTINE lyp_lda_eval
     219              : 
     220              : ! **************************************************************************************************
     221              : !> \brief evaluates the lyp correlation functional for lda
     222              : !> \param rho the density where you want to evaluate the functional
     223              : !> \param rho_1_3 ...
     224              : !> \param norm_drho ...
     225              : !> \param e_0 ...
     226              : !> \param e_rho ...
     227              : !> \param e_ndrho ...
     228              : !> \param e_rho_rho ...
     229              : !> \param e_ndrho_rho ...
     230              : !> \param e_ndrho_ndrho ...
     231              : !> \param e_rho_rho_rho ...
     232              : !> \param e_ndrho_rho_rho ...
     233              : !> \param e_ndrho_ndrho_rho ...
     234              : !> \param grad_deriv maximum degree of the derivative that should be evaluated
     235              : !> \param npoints ...
     236              : !> \param epsilon_rho ...
     237              : !> \param sc scaling-parameter for correlation
     238              : !> \par History
     239              : !>      11.2003 created [fawzi]
     240              : !>      01.2007 added scaling [Manuel Guidon]
     241              : !> \author fawzi
     242              : ! **************************************************************************************************
     243         8277 :    SUBROUTINE lyp_lda_calc(rho, rho_1_3, norm_drho, &
     244         8277 :                            e_0, e_rho, e_ndrho, e_rho_rho, e_ndrho_rho, &
     245         8277 :                            e_ndrho_ndrho, e_rho_rho_rho, e_ndrho_rho_rho, e_ndrho_ndrho_rho, &
     246              :                            grad_deriv, npoints, epsilon_rho, sc)
     247              :       INTEGER, INTENT(in)                                :: npoints, grad_deriv
     248              :       REAL(kind=dp), DIMENSION(1:npoints), INTENT(inout) :: e_ndrho_ndrho_rho, e_ndrho_rho_rho, &
     249              :                                                             e_rho_rho_rho, e_ndrho_ndrho, &
     250              :                                                             e_ndrho_rho, e_rho_rho, e_ndrho, &
     251              :                                                             e_rho, e_0
     252              :       REAL(kind=dp), DIMENSION(1:npoints), INTENT(in)    :: norm_drho, rho_1_3, rho
     253              :       REAL(kind=dp), INTENT(in)                          :: epsilon_rho, sc
     254              : 
     255              :       INTEGER                                            :: ii
     256              :       REAL(kind=dp) :: cf, epsilon_rho13, my_ndrho, my_rho, my_rho_1_3, t1, t102, t103, t105, &
     257              :          t106, t11, t112, t123, t124, t127, t128, t13, t133, t134, t14, t161, t165, t166, t173, &
     258              :          t176, t184, t185, t189, t192, t193, t196, t199, t2, t200, t201, t202, t203, t215, t22, &
     259              :          t227, t228, t231, t245, t246, t248, t26, t265, t278, t279, t3, t332, t37, t38, t39, t4, &
     260              :          t40, t41, t44, t45, t48, t5, t52, t6, t61, t62, t69, t7, t70, t77, t78, t80, t87, t88, &
     261              :          t89, t93, t94, t95, t98, t99
     262              : 
     263         8277 :       epsilon_rho13 = epsilon_rho**(1.0_dp/3.0_dp)
     264         8277 :       cf = 0.3_dp*(3._dp*pi*pi)**(2._dp/3._dp)
     265         7783 :       SELECT CASE (grad_deriv)
     266              :       CASE (1)
     267          494 : !$OMP      DO
     268              :          DO ii = 1, npoints
     269    390747348 :             my_rho = rho(ii)
     270    390747348 :             IF (my_rho > epsilon_rho) THEN
     271    375880352 :                my_rho_1_3 = rho_1_3(ii)
     272    375880352 :                my_ndrho = norm_drho(ii)
     273    375880352 :                t1 = my_rho_1_3**2
     274    375880352 :                t2 = t1*my_rho
     275    375880352 :                t3 = 0.1e1_dp/t2
     276    375880352 :                t4 = a*t3
     277    375880352 :                t5 = my_rho**2
     278    375880352 :                t6 = t5*my_rho
     279    375880352 :                t7 = my_rho_1_3*t6
     280    375880352 :                t11 = 0.1e1_dp/my_rho_1_3
     281    375880352 :                t13 = EXP(-c*t11)
     282    375880352 :                t14 = b*t13
     283    375880352 :                t22 = my_ndrho**2
     284    375880352 :                t26 = my_rho_1_3*t22
     285              :                t37 = -0.72e2_dp*t7 - 0.72e2_dp*t6*d - 0.72e2_dp*t14* &
     286              :                      t7*cf - 0.72e2_dp*t14*t6*cf*d + 0.3e1_dp*t14&
     287              :                     & *t1*t22 + 0.10e2_dp*t14*t26*d + 0.7e1_dp*t14 &
     288    375880352 :                     &*t26*c + 0.7e1_dp*t14*t22*c*d
     289    375880352 :                t38 = my_rho_1_3 + d
     290    375880352 :                t39 = t38**2
     291    375880352 :                t40 = 0.1e1_dp/t39
     292    375880352 :                t41 = t37*t40
     293              : 
     294              :                e_0(ii) = e_0(ii) &
     295    375880352 :                          + (t4*t41/0.72e2_dp)*sc
     296    375880352 :                t44 = 0.1e1_dp/t1/t5
     297    375880352 :                t45 = a*t44
     298    375880352 :                t48 = my_rho_1_3*t5
     299    375880352 :                t52 = b*c
     300    375880352 :                t61 = t13*cf
     301    375880352 :                t62 = t61*d
     302    375880352 :                t69 = 0.1e1_dp/t1
     303    375880352 :                t70 = t69*t13
     304    375880352 :                t77 = 0.1e1_dp/my_rho
     305    375880352 :                t78 = t52*t77
     306    375880352 :                t80 = t13*t22*d
     307    375880352 :                t87 = c**2
     308    375880352 :                t88 = b*t87
     309    375880352 :                t89 = t77*t13
     310    375880352 :                t93 = my_rho_1_3*my_rho
     311    375880352 :                t94 = 0.1e1_dp/t93
     312    375880352 :                t95 = t88*t94
     313              :                t98 = -0.240e3_dp*t48 - 0.216e3_dp*t5*d - 0.24e2_dp*t52&
     314              :                     & *t5*t13*cf - 0.240e3_dp*t14*t48*cf - &
     315              :                      0.24e2_dp*t52*t2*t62 - 0.216e3_dp*t14*t5*cf &
     316              :                     &*d + 0.10e2_dp/0.3e1_dp*t52*t70*t22 + 0.2e1_dp* &
     317              :                      t14*t11*t22 + 0.10e2_dp/0.3e1_dp*t78*t80 + &
     318              :                      0.10e2_dp/0.3e1_dp*t14*t69*t22*d + 0.7e1_dp/ &
     319              :                      0.3e1_dp*t88*t89*t22 + 0.7e1_dp/0.3e1_dp*t95* &
     320    375880352 :                      t80
     321    375880352 :                t99 = t98*t40
     322    375880352 :                t102 = 0.1e1_dp/t48
     323    375880352 :                t103 = a*t102
     324    375880352 :                t105 = 0.1e1_dp/t39/t38
     325    375880352 :                t106 = t37*t105
     326              : 
     327              :                e_rho(ii) = e_rho(ii) &
     328              :                      - (0.5e1_dp/0.216e3_dp*t45*t41 - t4*t99/0.72e2_dp&
     329    375880352 :                     & + t103*t106/0.108e3_dp)*sc
     330              : 
     331    375880352 :                t112 = my_rho_1_3*my_ndrho
     332              :                t123 = 0.6e1_dp*t14*t1*my_ndrho + 0.20e2_dp*t14*t112 &
     333              :                      &*d + 0.14e2_dp*t14*t112*c + 0.14e2_dp*t14* &
     334    375880352 :                       my_ndrho*c*d
     335    375880352 :                t124 = t123*t40
     336              : 
     337              :                e_ndrho(ii) = e_ndrho(ii) &
     338    375880352 :                              + (t4*t124/0.72e2_dp)*sc
     339              :             END IF
     340              :          END DO
     341              : !$OMP      END DO
     342              :       CASE default
     343         8277 : !$OMP      DO
     344              :          DO ii = 1, npoints
     345     30840674 :             my_rho = rho(ii)
     346     30840674 :             IF (my_rho > epsilon_rho) THEN
     347     26338552 :                my_rho_1_3 = rho_1_3(ii)
     348     26338552 :                my_ndrho = norm_drho(ii)
     349     26338552 :                t1 = my_rho_1_3**2
     350     26338552 :                t2 = t1*my_rho
     351     26338552 :                t3 = 0.1e1_dp/t2
     352     26338552 :                t4 = a*t3
     353     26338552 :                t5 = my_rho**2
     354     26338552 :                t6 = t5*my_rho
     355     26338552 :                t7 = my_rho_1_3*t6
     356     26338552 :                t11 = 0.1e1_dp/my_rho_1_3
     357     26338552 :                t13 = EXP(-c*t11)
     358     26338552 :                t14 = b*t13
     359     26338552 :                t22 = my_ndrho**2
     360     26338552 :                t26 = my_rho_1_3*t22
     361              :                t37 = -0.72e2_dp*t7 - 0.72e2_dp*t6*d - 0.72e2_dp*t14* &
     362              :                      t7*cf - 0.72e2_dp*t14*t6*cf*d + 0.3e1_dp*t14&
     363              :                     & *t1*t22 + 0.10e2_dp*t14*t26*d + 0.7e1_dp*t14 &
     364     26338552 :                     &*t26*c + 0.7e1_dp*t14*t22*c*d
     365     26338552 :                t38 = my_rho_1_3 + d
     366     26338552 :                t39 = t38**2
     367     26338552 :                t40 = 0.1e1_dp/t39
     368     26338552 :                t41 = t37*t40
     369              : 
     370              :                e_0(ii) = e_0(ii) &
     371     26338552 :                          + (t4*t41/0.72e2_dp)*sc
     372              : 
     373     26338552 :                IF (grad_deriv > 0) THEN
     374      2297800 :                   t44 = 0.1e1_dp/t1/t5
     375      2297800 :                   t45 = a*t44
     376      2297800 :                   t48 = my_rho_1_3*t5
     377      2297800 :                   t52 = b*c
     378      2297800 :                   t61 = t13*cf
     379      2297800 :                   t62 = t61*d
     380      2297800 :                   t69 = 0.1e1_dp/t1
     381      2297800 :                   t70 = t69*t13
     382      2297800 :                   t77 = 0.1e1_dp/my_rho
     383      2297800 :                   t78 = t52*t77
     384      2297800 :                   t80 = t13*t22*d
     385      2297800 :                   t87 = c**2
     386      2297800 :                   t88 = b*t87
     387      2297800 :                   t89 = t77*t13
     388      2297800 :                   t93 = my_rho_1_3*my_rho
     389      2297800 :                   t94 = 0.1e1_dp/t93
     390      2297800 :                   t95 = t88*t94
     391              :                   t98 = -0.240e3_dp*t48 - 0.216e3_dp*t5*d - 0.24e2_dp*t52&
     392              :                        & *t5*t13*cf - 0.240e3_dp*t14*t48*cf - &
     393              :                         0.24e2_dp*t52*t2*t62 - 0.216e3_dp*t14*t5*cf &
     394              :                        &*d + 0.10e2_dp/0.3e1_dp*t52*t70*t22 + 0.2e1_dp* &
     395              :                         t14*t11*t22 + 0.10e2_dp/0.3e1_dp*t78*t80 + &
     396              :                         0.10e2_dp/0.3e1_dp*t14*t69*t22*d + 0.7e1_dp/ &
     397              :                         0.3e1_dp*t88*t89*t22 + 0.7e1_dp/0.3e1_dp*t95* &
     398      2297800 :                         t80
     399      2297800 :                   t99 = t98*t40
     400      2297800 :                   t102 = 0.1e1_dp/t48
     401      2297800 :                   t103 = a*t102
     402      2297800 :                   t105 = 0.1e1_dp/t39/t38
     403      2297800 :                   t106 = t37*t105
     404      2297800 :                   t112 = my_rho_1_3*my_ndrho
     405              :                   t123 = 0.6e1_dp*t14*t1*my_ndrho + 0.20e2_dp*t14*t112 &
     406              :                         &*d + 0.14e2_dp*t14*t112*c + 0.14e2_dp*t14* &
     407      2297800 :                          my_ndrho*c*d
     408      2297800 :                   t124 = t123*t40
     409              : 
     410              :                   e_rho(ii) = e_rho(ii) &
     411              :                        - (0.5e1_dp/0.216e3_dp*t45*t41 - t4*t99/0.72e2_dp&
     412      2297800 :                        & + t103*t106/0.108e3_dp)*sc
     413              :                   e_ndrho(ii) = e_ndrho(ii) &
     414      2297800 :                                 + (t4*t124/0.72e2_dp)*sc
     415              : 
     416      2297800 :                   IF (grad_deriv > 1) THEN
     417      2297800 :                      t127 = 0.1e1_dp/t1/t6
     418      2297800 :                      t128 = a*t127
     419      2297800 :                      t133 = 0.1e1_dp/t7
     420      2297800 :                      t134 = a*t133
     421      2297800 :                      t161 = t3*t13
     422      2297800 :                      t165 = 0.1e1_dp/t5
     423      2297800 :                      t166 = t165*t13
     424      2297800 :                      t173 = t52*t165
     425      2297800 :                      t176 = t88*t102
     426      2297800 :                      t184 = b*t87*c
     427      2297800 :                      t185 = t102*t13
     428      2297800 :                      t189 = t184*t44
     429              :                      t192 = -0.560e3_dp*t93 - 0.432e3_dp*my_rho*d - 0.128e3_dp&
     430              :                            & *t52*my_rho*t13*cf - 0.8e1_dp*t88*t1*t13* &
     431              :                             cf - 0.560e3_dp*t14*t93*cf - 0.112e3_dp*t52*t1&
     432              :                            & *t62 - 0.8e1_dp*t88*my_rho_1_3*t62 - 0.432e3_dp* &
     433              :                             t14*my_rho*cf*d - 0.14e2_dp/0.9e1_dp*t52* &
     434              :                             t161*t22 - 0.11e2_dp/0.9e1_dp*t88*t166*t22 - &
     435              :                             0.2e1_dp/0.3e1_dp*t14*t94*t22 - 0.20e2_dp/ &
     436              :                             0.9e1_dp*t173*t80 - 0.2e1_dp*t176*t80 - &
     437              :                             0.20e2_dp/0.9e1_dp*t14*t3*t22*d + 0.7e1_dp/ &
     438              :                             0.9e1_dp*t184*t185*t22 + 0.7e1_dp/0.9e1_dp* &
     439      2297800 :                             t189*t80
     440      2297800 :                      t193 = t192*t40
     441      2297800 :                      t196 = t98*t105
     442      2297800 :                      t199 = 0.1e1_dp/t6
     443      2297800 :                      t200 = a*t199
     444      2297800 :                      t201 = t39**2
     445      2297800 :                      t202 = 0.1e1_dp/t201
     446      2297800 :                      t203 = t37*t202
     447      2297800 :                      t215 = t13*my_ndrho*d
     448              :                      t227 = 0.20e2_dp/0.3e1_dp*t52*t70*my_ndrho + 0.4e1_dp* &
     449              :                             t14*t11*my_ndrho + 0.20e2_dp/0.3e1_dp*t78*t215&
     450              :                           & + 0.20e2_dp/0.3e1_dp*t14*t69*my_ndrho*d + &
     451              :                             0.14e2_dp/0.3e1_dp*t88*t89*my_ndrho + 0.14e2_dp &
     452      2297800 :                           &/0.3e1_dp*t95*t215
     453      2297800 :                      t228 = t227*t40
     454      2297800 :                      t231 = t123*t105
     455              :                      t245 = 0.6e1_dp*t14*t1 + 0.20e2_dp*t14*my_rho_1_3*d + &
     456              :                             0.14e2_dp*t14*my_rho_1_3*c + 0.14e2_dp*t14*c* &
     457      2297800 :                             d
     458      2297800 :                      t246 = t245*t40
     459              : 
     460              :                      e_rho_rho(ii) = e_rho_rho(ii) &
     461              :                                      + (0.5e1_dp/0.81e2_dp*t128*t41 - 0.5e1_dp/0.108e3_dp&
     462              :                                        & *t45*t99 + t134*t106/0.27e2_dp + t4*t193/ &
     463              :                                         0.72e2_dp - t103*t196/0.54e2_dp + t200*t203/ &
     464      2297800 :                                         0.108e3_dp)*sc
     465              :                      e_ndrho_rho(ii) = e_ndrho_rho(ii) &
     466              :                                        - (0.5e1_dp/0.216e3_dp*t45*t124 - t4*t228/ &
     467      2297800 :                                           0.72e2_dp + t103*t231/0.108e3_dp)*sc
     468              :                      e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) &
     469      2297800 :                                          + (t4*t246/0.72e2_dp)*sc
     470              : 
     471      2297800 :                      IF (grad_deriv > 2) THEN
     472            0 :                         t248 = t5**2
     473            0 :                         t265 = 0.1e1_dp/t248
     474            0 :                         t278 = t87**2
     475            0 :                         t279 = b*t278
     476              :                         t332 = -0.432e3_dp*d - 0.2240e4_dp/0.3e1_dp*my_rho_1_3 - &
     477              :                                0.74e2_dp/0.27e2_dp*t184*t127*t80 + 0.100e3_dp/ &
     478              :                                0.27e2_dp*t14*t44*t22*d + 0.7e1_dp/0.27e2_dp* &
     479              :                                t279*t127*t13*t22 - 0.8e1_dp/0.3e1_dp*t184* &
     480              :                                t70*cf - 0.2240e4_dp/0.3e1_dp*t14*my_rho_1_3* &
     481              :                                cf - 0.48e2_dp*t88*t11*t13*cf - 0.944e3_dp/ &
     482              :                                0.3e1_dp*t52*t61 - 0.40e2_dp*t88*t69*t62 - &
     483              :                                0.656e3_dp/0.3e1_dp*t52*t11*t62 + 0.7e1_dp/ &
     484              :                                0.27e2_dp*t279*t265*t80 + 0.64e2_dp/0.27e2_dp* &
     485              :                                t52*t44*t13*t22 - 0.8e1_dp/0.3e1_dp*t184*t77&
     486              :                               & *t62 - 0.432e3_dp*t14*cf*d + 0.52e2_dp/ &
     487              :                                0.27e2_dp*t88*t199*t13*t22 - 0.20e2_dp/ &
     488              :                                0.9e1_dp*t184*t133*t13*t22 + 0.8e1_dp/0.9e1_dp&
     489              :                               & *t14*t102*t22 + 0.100e3_dp/0.27e2_dp*t52*t199&
     490            0 :                               & *t80 + 0.106e3_dp/0.27e2_dp*t88*t133*t80
     491              : 
     492              :                         e_rho_rho_rho(ii) = e_rho_rho_rho(ii) &
     493              :                              - (0.55e2_dp/0.243e3_dp*a/t1/t248*t41 - 0.5e1_dp &
     494              :                              &/0.27e2_dp*t128*t99 + 0.40e2_dp/0.243e3_dp*a/ &
     495              :                                my_rho_1_3/t248*t106 + 0.5e1_dp/0.72e2_dp*t45* &
     496              :                                t193 - t134*t196/0.9e1_dp + 0.7e1_dp/0.108e3_dp* &
     497              :                                a*t265*t203 - t4*t332*t40/0.72e2_dp + t103* &
     498              :                                t192*t105/0.36e2_dp - t200*t98*t202/0.36e2_dp &
     499            0 :                              &+ t128*t37/t201/t38/0.81e2_dp)*sc
     500              :                         e_ndrho_rho_rho(ii) = e_ndrho_rho_rho(ii) &
     501              :                              + (0.5e1_dp/0.81e2_dp*t128*t124 - 0.5e1_dp/ &
     502              :                                0.108e3_dp*t45*t228 + t134*t231/0.27e2_dp + t4*&
     503              :                              & (-0.28e2_dp/0.9e1_dp*t52*t161*my_ndrho - &
     504              :                                0.22e2_dp/0.9e1_dp*t88*t166*my_ndrho - 0.4e1_dp &
     505              :                              &/0.3e1_dp*t14*t94*my_ndrho - 0.40e2_dp/0.9e1_dp &
     506              :                              &*t173*t215 - 0.4e1_dp*t176*t215 - 0.40e2_dp/ &
     507              :                                0.9e1_dp*t14*t3*my_ndrho*d + 0.14e2_dp/ &
     508              :                                0.9e1_dp*t184*t185*my_ndrho + 0.14e2_dp/0.9e1_dp&
     509              :                              & *t189*t215)*t40/0.72e2_dp - t103*t227*t105/ &
     510            0 :                                0.54e2_dp + t200*t123*t202/0.108e3_dp)*sc
     511              :                         e_ndrho_ndrho_rho(ii) = e_ndrho_ndrho_rho(ii) &
     512              :                              - (0.5e1_dp/0.216e3_dp*t45*t246 - t4*(0.20e2_dp/ &
     513              :                                0.3e1_dp*t52*t70 + 0.4e1_dp*t14*t11 + 0.20e2_dp &
     514              :                              &/0.3e1_dp*t52*t89*d + 0.20e2_dp/0.3e1_dp*t14* &
     515              :                                t69*d + 0.14e2_dp/0.3e1_dp*t88*t89 + 0.14e2_dp/ &
     516              :                                0.3e1_dp*t88*t94*t13*d)*t40/0.72e2_dp + t103&
     517            0 :                              & *t245*t105/0.108e3_dp)*sc
     518              :                      END IF
     519              :                   END IF
     520              :                END IF
     521              :             END IF
     522              :          END DO
     523              : 
     524              : !$OMP      END DO
     525              : 
     526              :       END SELECT
     527         8277 :    END SUBROUTINE lyp_lda_calc
     528              : 
     529              : ! **************************************************************************************************
     530              : !> \brief evaluates the becke 88 exchange functional for lsd
     531              : !> \param rho_set ...
     532              : !> \param deriv_set ...
     533              : !> \param grad_deriv ...
     534              : !> \param lyp_params input parameter (scaling)
     535              : !> \par History
     536              : !>      11.2003 created [fawzi]
     537              : !>      01.2007 added scaling [Manuel Guidon]
     538              : !> \author fawzi
     539              : ! **************************************************************************************************
     540         9120 :    SUBROUTINE lyp_lsd_eval(rho_set, deriv_set, grad_deriv, lyp_params)
     541              :       TYPE(xc_rho_set_type), INTENT(IN)                  :: rho_set
     542              :       TYPE(xc_derivative_set_type), INTENT(IN)           :: deriv_set
     543              :       INTEGER, INTENT(in)                                :: grad_deriv
     544              :       TYPE(section_vals_type), POINTER                   :: lyp_params
     545              : 
     546              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'lyp_lsd_eval'
     547              : 
     548              :       INTEGER                                            :: handle, npoints
     549              :       INTEGER, DIMENSION(2, 3)                           :: bo
     550              :       REAL(kind=dp)                                      :: epsilon_drho, epsilon_rho, sc
     551         3040 :       REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: dummy, e_0, e_ndr, e_ndr_ndr, &
     552         3040 :          e_ndr_ra, e_ndr_rb, e_ndra, e_ndra_ndra, e_ndra_ra, e_ndra_rb, e_ndrb, e_ndrb_ndrb, &
     553         3040 :          e_ndrb_ra, e_ndrb_rb, e_ra, e_ra_ra, e_ra_rb, e_rb, e_rb_rb, norm_drho, norm_drhoa, &
     554         3040 :          norm_drhob, rhoa, rhob
     555              :       TYPE(xc_derivative_type), POINTER                  :: deriv
     556              : 
     557         3040 :       CALL timeset(routineN, handle)
     558         3040 :       NULLIFY (deriv)
     559              : 
     560         3040 :       CALL section_vals_val_get(lyp_params, "scale_c", r_val=sc)
     561         3040 :       CALL cite_reference(Lee1988)
     562              : 
     563              :       CALL xc_rho_set_get(rho_set, &
     564              :                           rhoa=rhoa, rhob=rhob, norm_drhoa=norm_drhoa, &
     565              :                           norm_drhob=norm_drhob, norm_drho=norm_drho, &
     566              :                           rho_cutoff=epsilon_rho, &
     567         3040 :                           drho_cutoff=epsilon_drho, local_bounds=bo)
     568         3040 :       npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
     569              : 
     570         3040 :       dummy => rhoa
     571         3040 :       e_0 => dummy
     572         3040 :       e_ra => dummy
     573         3040 :       e_rb => dummy
     574         3040 :       e_ndra_ra => dummy
     575         3040 :       e_ndra_rb => dummy
     576         3040 :       e_ndrb_ra => dummy
     577         3040 :       e_ndrb_rb => dummy
     578         3040 :       e_ndr_ndr => dummy
     579         3040 :       e_ndra_ndra => dummy
     580         3040 :       e_ndrb_ndrb => dummy
     581         3040 :       e_ndr => dummy
     582         3040 :       e_ndra => dummy
     583         3040 :       e_ndrb => dummy
     584         3040 :       e_ra_ra => dummy
     585         3040 :       e_ra_rb => dummy
     586         3040 :       e_rb_rb => dummy
     587         3040 :       e_ndr_ra => dummy
     588         3040 :       e_ndr_rb => dummy
     589              : 
     590              :       deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
     591         3040 :                                       allocate_deriv=.TRUE.)
     592         3040 :       CALL xc_derivative_get(deriv, deriv_data=e_0)
     593         3040 :       IF (grad_deriv >= 1) THEN
     594              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
     595         2956 :                                          allocate_deriv=.TRUE.)
     596         2956 :          CALL xc_derivative_get(deriv, deriv_data=e_ra)
     597              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
     598         2956 :                                          allocate_deriv=.TRUE.)
     599         2956 :          CALL xc_derivative_get(deriv, deriv_data=e_rb)
     600              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
     601         2956 :                                          allocate_deriv=.TRUE.)
     602         2956 :          CALL xc_derivative_get(deriv, deriv_data=e_ndr)
     603              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
     604         2956 :                                          allocate_deriv=.TRUE.)
     605         2956 :          CALL xc_derivative_get(deriv, deriv_data=e_ndra)
     606              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
     607         2956 :                                          allocate_deriv=.TRUE.)
     608         2956 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrb)
     609              :       END IF
     610         3040 :       IF (grad_deriv >= 2) THEN
     611              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
     612            4 :                                          allocate_deriv=.TRUE.)
     613            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ra_ra)
     614              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
     615            4 :                                          allocate_deriv=.TRUE.)
     616            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ra_rb)
     617              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
     618            4 :                                          allocate_deriv=.TRUE.)
     619            4 :          CALL xc_derivative_get(deriv, deriv_data=e_rb_rb)
     620              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhoa], &
     621            4 :                                          allocate_deriv=.TRUE.)
     622            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndr_ra)
     623              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhob], &
     624            4 :                                          allocate_deriv=.TRUE.)
     625            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndr_rb)
     626              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhoa], &
     627            4 :                                          allocate_deriv=.TRUE.)
     628            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndra_ra)
     629              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhob], &
     630            4 :                                          allocate_deriv=.TRUE.)
     631            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndra_rb)
     632              :          deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhob], &
     633            4 :                                          allocate_deriv=.TRUE.)
     634            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrb_rb)
     635              :          deriv => xc_dset_get_derivative(deriv_set, &
     636            4 :                                          [deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.)
     637            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndr_ndr)
     638              :          deriv => xc_dset_get_derivative(deriv_set, &
     639            4 :                                          [deriv_norm_drhoa, deriv_norm_drhoa], allocate_deriv=.TRUE.)
     640            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndra_ndra)
     641              :          deriv => xc_dset_get_derivative(deriv_set, &
     642            4 :                                          [deriv_norm_drhob, deriv_norm_drhob], allocate_deriv=.TRUE.)
     643            4 :          CALL xc_derivative_get(deriv, deriv_data=e_ndrb_ndrb)
     644              :       END IF
     645              : 
     646              : !$OMP   PARALLEL DEFAULT(NONE) &
     647              : !$OMP            SHARED(rhoa, rhob, norm_drho, norm_drhoa, norm_drhob) &
     648              : !$OMP            SHARED(e_0, e_ra, e_rb, e_ndra_ra, e_ndra_rb, e_ndrb_ra) &
     649              : !$OMP            SHARED(e_ndrb_rb, e_ndr_ndr, e_ndra_ndra, e_ndrb_ndrb) &
     650              : !$OMP            SHARED(e_ndr, e_ndra, e_ndrb, e_ra_ra, e_ra_rb, e_rb_rb) &
     651              : !$OMP            SHARED(e_ndr_ra, e_ndr_rb, grad_deriv) &
     652         3040 : !$OMP            SHARED(npoints, epsilon_rho, sc)
     653              : 
     654              :       CALL lyp_lsd_calc( &
     655              :            rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, norm_drhoa=norm_drhoa, &
     656              :            norm_drhob=norm_drhob, e_0=e_0, e_ra=e_ra, e_rb=e_rb, &
     657              :              e_ndra_ra=e_ndra_ra, e_ndra_rb=e_ndra_rb, e_ndrb_ra&
     658              :            &=e_ndrb_ra, e_ndrb_rb=e_ndrb_rb, e_ndr_ndr=e_ndr_ndr, &
     659              :            e_ndra_ndra=e_ndra_ndra, e_ndrb_ndrb=e_ndrb_ndrb, e_ndr=e_ndr, &
     660              :            e_ndra=e_ndra, e_ndrb=e_ndrb, e_ra_ra=e_ra_ra, &
     661              :            e_ra_rb=e_ra_rb, e_rb_rb=e_rb_rb, e_ndr_ra=e_ndr_ra, &
     662              :            e_ndr_rb=e_ndr_rb, &
     663              :            grad_deriv=grad_deriv, npoints=npoints, &
     664              :            epsilon_rho=epsilon_rho, sc=sc)
     665              : 
     666              : !$OMP   END PARALLEL
     667              : 
     668         3040 :       CALL timestop(handle)
     669         3040 :    END SUBROUTINE lyp_lsd_eval
     670              : 
     671              : ! **************************************************************************************************
     672              : !> \brief low level calculation of the becke 88 exchange functional for lsd
     673              : !> \param rhoa alpha spin density
     674              : !> \param rhob beta spin density
     675              : !> \param norm_drho || grad rhoa + grad rhob ||
     676              : !> \param norm_drhoa || grad rhoa ||
     677              : !> \param norm_drhob || grad rhob ||
     678              : !> \param e_0 adds to it the local value of the functional
     679              : !> \param e_ra e_*: derivative of the functional wrt. to the variables
     680              : !>        named where the * is.
     681              : !> \param e_rb ...
     682              : !> \param e_ndra_ra ...
     683              : !> \param e_ndra_rb ...
     684              : !> \param e_ndrb_ra ...
     685              : !> \param e_ndrb_rb ...
     686              : !> \param e_ndr_ndr ...
     687              : !> \param e_ndra_ndra ...
     688              : !> \param e_ndrb_ndrb ...
     689              : !> \param e_ndr ...
     690              : !> \param e_ndra ...
     691              : !> \param e_ndrb ...
     692              : !> \param e_ra_ra ...
     693              : !> \param e_ra_rb ...
     694              : !> \param e_rb_rb ...
     695              : !> \param e_ndr_ra ...
     696              : !> \param e_ndr_rb ...
     697              : !> \param grad_deriv ...
     698              : !> \param npoints ...
     699              : !> \param epsilon_rho ...
     700              : !> \param sc scaling parameter for correlation
     701              : !> \par History
     702              : !>      01.2004 created [fawzi]
     703              : !> \author fawzi
     704              : ! **************************************************************************************************
     705         3040 :    SUBROUTINE lyp_lsd_calc(rhoa, rhob, norm_drho, norm_drhoa, norm_drhob, &
     706              :                            e_0, e_ra, e_rb, e_ndra_ra, e_ndra_rb, e_ndrb_ra, e_ndrb_rb, e_ndr_ndr, &
     707              :                            e_ndra_ndra, e_ndrb_ndrb, e_ndr, &
     708              :                            e_ndra, e_ndrb, e_ra_ra, e_ra_rb, e_rb_rb, e_ndr_ra, e_ndr_rb, &
     709              :                            grad_deriv, npoints, epsilon_rho, sc)
     710              :       REAL(kind=dp), DIMENSION(*), INTENT(in)            :: rhoa, rhob, norm_drho, norm_drhoa, &
     711              :                                                             norm_drhob
     712              :       REAL(kind=dp), DIMENSION(*), INTENT(inout) :: e_0, e_ra, e_rb, e_ndra_ra, e_ndra_rb, &
     713              :          e_ndrb_ra, e_ndrb_rb, e_ndr_ndr, e_ndra_ndra, e_ndrb_ndrb, e_ndr, e_ndra, e_ndrb, &
     714              :          e_ra_ra, e_ra_rb, e_rb_rb, e_ndr_ra, e_ndr_rb
     715              :       INTEGER, INTENT(in)                                :: grad_deriv, npoints
     716              :       REAL(kind=dp), INTENT(in)                          :: epsilon_rho, sc
     717              : 
     718              :       INTEGER                                            :: ii
     719              :       REAL(kind=dp) :: cf, my_ndrho, my_ndrhoa, my_ndrhob, my_rho, my_rhoa, my_rhob, t1, t100, &
     720              :          t101, t102, t103, t104, t107, t108, t109, t112, t115, t118, t12, t120, t124, t129, t13, &
     721              :          t130, t132, t135, t138, t14, t140, t142, t145, t15, t153, t155, t159, t16, t164, t168, &
     722              :          t17, t171, t176, t18, t181, t182, t185, t189, t194, t195, t198, t2, t20, t202, t205, &
     723              :          t206, t21, t210, t214, t215, t218, t22, t222, t228, t23, t232, t236, t238, t24, t243, &
     724              :          t249, t25, t252, t253, t255, t257, t26, t260, t265, t268, t27, t270, t29, t3, t30, t304, &
     725              :          t31, t310, t313, t316, t319, t322, t326, t329, t332, t334, t341, t35
     726              :       REAL(kind=dp) :: t354, t356, t360, t363, t37, t373, t376, t381, t39, t391, t4, t40, t408, &
     727              :          t41, t415, t419, t422, t430, t44, t445, t449, t45, t452, t46, t467, t47, t48, t483, t487, &
     728              :          t49, t490, t5, t50, t505, t515, t519, t52, t520, t54, t56, t57, t6, t61, t62, t64, t66, &
     729              :          t7, t72, t75, t78, t8, t82, t85, t86, t87, t88, t90, t92, t94, t95, t98, t99
     730              : 
     731         3040 :       cf = 0.3_dp*(3._dp*pi*pi)**(2._dp/3._dp)
     732              : 
     733         3040 : !$OMP   DO
     734              : 
     735              :       DO ii = 1, npoints
     736     54792107 :          my_rhoa = MAX(rhoa(ii), 0.0_dp)
     737     54792107 :          my_rhob = MAX(rhob(ii), 0.0_dp)
     738     54792107 :          my_rho = my_rhoa + my_rhob
     739     54792107 :          IF (my_rho > epsilon_rho) THEN
     740     53280490 :             my_ndrho = norm_drho(ii)
     741     53280490 :             my_ndrhoa = norm_drhoa(ii)
     742     53280490 :             my_ndrhob = norm_drhob(ii)
     743              : 
     744     53280490 :             t1 = my_rho**(0.1e1_dp/0.3e1_dp)
     745     53280490 :             t2 = 0.1e1_dp/t1
     746     53280490 :             t3 = d*t2
     747     53280490 :             t4 = 0.1e1_dp + t3
     748     53280490 :             t5 = 0.1e1_dp/t4
     749     53280490 :             t6 = a*t5
     750     53280490 :             t7 = my_rhoa*my_rhob
     751     53280490 :             t8 = 0.1e1_dp/my_rho
     752     53280490 :             t12 = a*b
     753     53280490 :             t13 = c*t2
     754     53280490 :             t14 = EXP(-t13)
     755     53280490 :             t15 = t12*t14
     756     53280490 :             t16 = my_rho**2
     757     53280490 :             t17 = t16*my_rho
     758     53280490 :             t18 = t1**2
     759     53280490 :             t20 = 0.1e1_dp/t18/t17
     760     53280490 :             t21 = t5*t20
     761     53280490 :             t22 = 2**(0.1e1_dp/0.3e1_dp)
     762     53280490 :             t23 = t22**2
     763     53280490 :             t24 = t23*cf
     764     53280490 :             t25 = my_rhoa**2
     765     53280490 :             t26 = my_rhoa**(0.1e1_dp/0.3e1_dp)
     766     53280490 :             t27 = t26**2
     767     53280490 :             t29 = my_rhob**2
     768     53280490 :             t30 = my_rhob**(0.1e1_dp/0.3e1_dp)
     769     53280490 :             t31 = t30**2
     770     53280490 :             t35 = 0.8e1_dp*t24*(t27*t25 + t31*t29)
     771     53280490 :             t37 = t3*t5
     772              :             t39 = 0.47e2_dp/0.18e2_dp - 0.7e1_dp/0.18e2_dp*t13 - &
     773     53280490 :                   0.7e1_dp/0.18e2_dp*t37
     774     53280490 :             t40 = my_ndrho**2
     775     53280490 :             t41 = t39*t40
     776     53280490 :             t44 = 0.5e1_dp/0.2e1_dp - t13/0.18e2_dp - t37/0.18e2_dp
     777     53280490 :             t45 = my_ndrhoa**2
     778     53280490 :             t46 = my_ndrhob**2
     779     53280490 :             t47 = t45 + t46
     780     53280490 :             t48 = t44*t47
     781     53280490 :             t49 = t13 + t37 - 0.11e2_dp
     782     53280490 :             t50 = my_rhoa*t8
     783     53280490 :             t52 = my_rhob*t8
     784     53280490 :             t54 = t50*t45 + t52*t46
     785     53280490 :             t56 = t49*t54/0.9e1_dp
     786     53280490 :             t57 = t35 + t41 - t48 - t56
     787     53280490 :             t61 = 0.2e1_dp/0.3e1_dp*t16
     788     53280490 :             t62 = t61 - t25
     789     53280490 :             t64 = t61 - t29
     790              :             t66 = t7*t57 - 0.2e1_dp/0.3e1_dp*t16*t40 + t62*t46 + &
     791     53280490 :                   t64*t45
     792              : 
     793              :             IF (my_rho > epsilon_rho) THEN
     794              :                e_0(ii) = e_0(ii) &
     795     53280490 :                          - (0.4e1_dp*t6*t7*t8 + t15*t21*t66)*sc
     796              :             END IF
     797              :             !--------
     798              : 
     799     53280490 :             IF (grad_deriv /= 0) THEN
     800     47408114 :                t72 = t27*my_rhoa
     801     47408114 :                t75 = t49*t8
     802     47408114 :                t78 = 0.64e2_dp/0.3e1_dp*t24*t72 - t75*t45/0.9e1_dp
     803     47408114 :                t82 = my_rhob*t57 + t7*t78 - 0.2e1_dp*my_rhoa*t46
     804     47408114 :                t85 = t4**2
     805     47408114 :                t86 = 0.1e1_dp/t85
     806     47408114 :                t87 = a*t86
     807     47408114 :                t88 = t87*my_rhoa
     808     47408114 :                t90 = 0.1e1_dp/t1/t16
     809     47408114 :                t92 = my_rhob*t90*d
     810     47408114 :                t94 = 0.4e1_dp/0.3e1_dp*t88*t92
     811     47408114 :                t95 = 0.1e1_dp/t16
     812     47408114 :                t98 = 0.4e1_dp*t6*t7*t95
     813     47408114 :                t99 = t12*c
     814     47408114 :                t100 = t16**2
     815     47408114 :                t101 = t100*my_rho
     816     47408114 :                t102 = 0.1e1_dp/t101
     817     47408114 :                t103 = t102*t14
     818     47408114 :                t104 = t5*t66
     819     47408114 :                t107 = t99*t103*t104/0.3e1_dp
     820     47408114 :                t108 = t86*t102
     821     47408114 :                t109 = t66*d
     822     47408114 :                t112 = t15*t108*t109/0.3e1_dp
     823     47408114 :                t115 = t5/t18/t100
     824     47408114 :                t118 = 0.11e2_dp/0.3e1_dp*t15*t115*t66
     825     47408114 :                t120 = 0.1e1_dp/t1/my_rho
     826     47408114 :                t124 = d**2
     827     47408114 :                t129 = c*t120 + d*t120*t5 - t124/t18/my_rho*t86
     828     47408114 :                t130 = 0.7e1_dp/0.54e2_dp*t129
     829     47408114 :                t132 = t129/0.54e2_dp
     830     47408114 :                t135 = -t129/0.3e1_dp
     831     47408114 :                t138 = my_rhoa*t95
     832     47408114 :                t140 = my_rhob*t95
     833     47408114 :                t142 = -t138*t45 - t140*t46
     834              :                t145 = t130*t40 - t132*t47 - t135*t54/0.9e1_dp - t49* &
     835     47408114 :                       t142/0.9e1_dp
     836              :                t153 = t7*t145 - 0.4e1_dp/0.3e1_dp*my_rho*t40 + &
     837              :                       0.4e1_dp/0.3e1_dp*my_rho*t46 + 0.4e1_dp/0.3e1_dp&
     838     47408114 :                      & *my_rho*t45
     839     47408114 :                t155 = t15*t21*t153
     840              : 
     841              :                e_ra(ii) = e_ra(ii) &
     842              :                           - (0.4e1_dp*t6*t52 + t15*t21*t82 + t94 - t98 + &
     843     47408114 :                              t107 + t112 - t118 + t155)*sc
     844              : 
     845     47408114 :                t159 = t31*my_rhob
     846     47408114 :                t164 = 0.64e2_dp/0.3e1_dp*t24*t159 - t75*t46/0.9e1_dp
     847     47408114 :                t168 = my_rhoa*t57 + t7*t164 - 0.2e1_dp*my_rhob*t45
     848              : 
     849              :                e_rb(ii) = e_rb(ii) &
     850              :                           - (0.4e1_dp*t6*t50 + t15*t21*t168 + t94 - t98 + &
     851     47408114 :                              t107 + t112 - t118 + t155)*sc
     852              : 
     853     47408114 :                t171 = t39*my_ndrho
     854     47408114 :                t176 = 0.2e1_dp*t7*t171 - 0.4e1_dp/0.3e1_dp*t16*my_ndrho
     855              : 
     856              :                e_ndr(ii) = e_ndr(ii) &
     857     47408114 :                            - (t15*t21*t176)*sc
     858              : 
     859     47408114 :                t181 = t49*my_rhoa
     860     47408114 :                t182 = t8*my_ndrhoa
     861     47408114 :                t185 = -0.2e1_dp*t44*my_ndrhoa - 0.2e1_dp/0.9e1_dp*t181*t182
     862     47408114 :                t189 = t7*t185 + 0.2e1_dp*t64*my_ndrhoa
     863              : 
     864              :                e_ndra(ii) = e_ndra(ii) &
     865     47408114 :                             - (t15*t21*t189)*sc
     866              : 
     867     47408114 :                t194 = t49*my_rhob
     868     47408114 :                t195 = t8*my_ndrhob
     869     47408114 :                t198 = -0.2e1_dp*t44*my_ndrhob - 0.2e1_dp/0.9e1_dp*t194*t195
     870     47408114 :                t202 = t7*t198 + 0.2e1_dp*t62*my_ndrhob
     871              : 
     872              :                e_ndrb(ii) = e_ndrb(ii) &
     873     47408114 :                             - (t15*t21*t202)*sc
     874              : 
     875     47408114 :                IF (grad_deriv > 1) THEN
     876        79625 :                   t205 = t100*t16
     877        79625 :                   t206 = 0.1e1_dp/t205
     878        79625 :                   t210 = 0.26e2_dp/0.9e1_dp*t99*t206*t14*t104
     879        79625 :                   t214 = 0.2e1_dp/0.3e1_dp*t99*t103*t5*t153
     880        79625 :                   t215 = c**2
     881        79625 :                   t218 = 0.1e1_dp/t1/t205
     882        79625 :                   t222 = t12*t215*t218*t14*t104/0.9e1_dp
     883        79625 :                   t228 = 0.2e1_dp/0.9e1_dp*t12*c*t218*t14*t86*t109
     884        79625 :                   t232 = 0.26e2_dp/0.9e1_dp*t15*t86*t206*t109
     885        79625 :                   t236 = 0.2e1_dp/0.3e1_dp*t15*t108*t153*d
     886        79625 :                   t238 = 0.1e1_dp/t85/t4
     887        79625 :                   t243 = 0.2e1_dp/0.9e1_dp*t15*t238*t218*t66*t124
     888        79625 :                   t249 = 0.154e3_dp/0.9e1_dp*t15*t5/t18/t101*t66
     889        79625 :                   t252 = 0.22e2_dp/0.3e1_dp*t15*t115*t153
     890        79625 :                   t253 = t6*t140
     891        79625 :                   t255 = t87*t92
     892        79625 :                   t257 = c*t90
     893        79625 :                   t260 = d*t90*t5
     894        79625 :                   t265 = t124/t18/t16*t86
     895        79625 :                   t268 = 0.1e1_dp/t17
     896        79625 :                   t270 = t124*d*t268*t238
     897              :                   t304 = t15*t21*(t7*((-0.14e2_dp/0.81e2_dp*t257 - &
     898              :                          0.14e2_dp/0.81e2_dp*t260 + 0.7e1_dp/0.27e2_dp* &
     899              :                          t265 - 0.7e1_dp/0.81e2_dp*t270)*t40 - (-0.2e1_dp/ &
     900              :                          0.81e2_dp*t257 - 0.2e1_dp/0.81e2_dp*t260 + t265/ &
     901              :                          0.27e2_dp - t270/0.81e2_dp)*t47 - (0.4e1_dp/ &
     902              :                          0.9e1_dp*t257 + 0.4e1_dp/0.9e1_dp*t260 - 0.2e1_dp &
     903              :                        &/0.3e1_dp*t265 + 0.2e1_dp/0.9e1_dp*t270)*t54/ &
     904              :                          0.9e1_dp - 0.2e1_dp/0.9e1_dp*t135*t142 - t49*&
     905              :                        & (0.2e1_dp*my_rhoa*t268*t45 + 0.2e1_dp*my_rhob* &
     906              :                          t268*t46)/0.9e1_dp) - 0.4e1_dp/0.3e1_dp*t40 + &
     907        79625 :                          0.4e1_dp/0.3e1_dp*t46 + 0.4e1_dp/0.3e1_dp*t45)
     908        79625 :                   t310 = 0.40e2_dp/0.9e1_dp*t88*my_rhob/t1/t17*d
     909        79625 :                   t313 = my_rhob*t20
     910        79625 :                   t316 = 0.8e1_dp/0.9e1_dp*a*t238*my_rhoa*t313*t124
     911        79625 :                   t319 = 0.8e1_dp*t6*t7*t268
     912        79625 :                   t322 = t99*t103*t5*t82
     913        79625 :                   t326 = t15*t108*t82*d
     914        79625 :                   t329 = t15*t115*t82
     915        79625 :                   t332 = t135*t8
     916        79625 :                   t334 = t49*t95
     917              :                   t341 = t15*t21*(my_rhob*t145 + t7*(-t332*t45/ &
     918        79625 :                                                      0.9e1_dp + t334*t45/0.9e1_dp))
     919              : 
     920              :                   e_ra_ra(ii) = e_ra_ra(ii) &
     921              :                        + (t210 - t214 - t222 - t228 + t232 - t236 - t243 - t249 + &
     922              :                          t252 + 0.8e1_dp*t253 - 0.8e1_dp/0.3e1_dp*t255 - &
     923              :                          t304 + t310 - t316 - t319 - 0.2e1_dp/0.3e1_dp*t322 - &
     924              :                          0.2e1_dp/0.3e1_dp*t326 + 0.22e2_dp/0.3e1_dp*t329&
     925              :                        & - 0.2e1_dp*t341 - t15*t21*(0.2e1_dp*my_rhob* &
     926              :                          t78 + 0.320e3_dp/0.9e1_dp*t72*my_rhob*t24 - &
     927        79625 :                          0.2e1_dp*t46))*sc
     928              : 
     929        79625 :                   t354 = t99*t103*t5*t168
     930        79625 :                   t356 = t6*t138
     931        79625 :                   t360 = t87*my_rhoa*t90*d
     932        79625 :                   t363 = t15*t115*t168
     933              :                   t373 = t15*t21*(my_rhoa*t145 + t7*(-t332*t46/ &
     934        79625 :                                                      0.9e1_dp + t334*t46/0.9e1_dp))
     935        79625 :                   t376 = t15*t108*t168*d
     936              : 
     937              :                   e_rb_rb(ii) = e_rb_rb(ii) &
     938              :                                 + (t210 - t214 - t222 - t228 + t232 - t236 - t243 - t249 + &
     939              :                                    t252 - t304 + t310 - t316 - t319 + 0.8e1_dp*t356 - &
     940              :                                    0.8e1_dp/0.3e1_dp*t360 + 0.22e2_dp/0.3e1_dp* &
     941              :                                    t363 - 0.2e1_dp*t373 - 0.2e1_dp/0.3e1_dp*t354 - &
     942              :                                    0.2e1_dp/0.3e1_dp*t376 - t15*t21*(0.2e1_dp* &
     943              :                                                                      my_rhoa*t164 + 0.320e3_dp/0.9e1_dp*my_rhoa* &
     944        79625 :                                                                      t159*t24 - 0.2e1_dp*t45))*sc
     945              : 
     946              :                   t381 = -t354/0.3e1_dp + 0.4e1_dp*t356 - 0.4e1_dp/0.3e1_dp&
     947              :                         & *t360 + 0.11e2_dp/0.3e1_dp*t363 - t373 - t341 - &
     948              :                          t376/0.3e1_dp + t310 - 0.4e1_dp*t6*t8 + 0.4e1_dp* &
     949        79625 :                          t253 + t210 - t214 - t222
     950              :                   t391 = -t228 + t232 - t236 - t243 - t249 + t252 - 0.4e1_dp/ &
     951              :                          0.3e1_dp*t255 - t304 - t316 - t319 - t322/0.3e1_dp - &
     952              :                          t326/0.3e1_dp + 0.11e2_dp/0.3e1_dp*t329 - t15* &
     953              :                          t21*(t35 + t41 - t48 - t56 + my_rhob*t164 + my_rhoa &
     954        79625 :                              &*t78)
     955              : 
     956              :                   e_ra_rb(ii) = e_ra_rb(ii) &
     957        79625 :                                 + (t381 + t391)*sc
     958              : 
     959        79625 :                   t408 = t12*t14*t5
     960        79625 :                   t415 = t99*t103*t5*t176/0.3e1_dp
     961        79625 :                   t419 = t15*t108*t176*d/0.3e1_dp
     962        79625 :                   t422 = 0.11e2_dp/0.3e1_dp*t15*t115*t176
     963              :                   t430 = t15*t21*(0.2e1_dp*t7*t130*my_ndrho - 0.8e1_dp &
     964        79625 :                        &/0.3e1_dp*my_rho*my_ndrho)
     965              : 
     966              :                   e_ndr_ra(ii) = e_ndr_ra(ii) &
     967              :                                  - (0.2e1_dp*t408*t313*t171 + t415 + t419 - t422 + &
     968        79625 :                                     t430)*sc
     969              :                   e_ndr_rb(ii) = e_ndr_rb(ii) &
     970              :                                  - (0.2e1_dp*t408*t20*my_rhoa*t171 + t415 + t419 - &
     971        79625 :                                     t422 + t430)*sc
     972              : 
     973        79625 :                   t445 = t99*t103*t5*t189/0.3e1_dp
     974        79625 :                   t449 = t15*t108*t189*d/0.3e1_dp
     975        79625 :                   t452 = 0.11e2_dp/0.3e1_dp*t15*t115*t189
     976              :                   t467 = t15*t21*(t7*(-0.2e1_dp*t132*my_ndrhoa - &
     977              :                                       0.2e1_dp/0.9e1_dp*t135*my_rhoa*t182 + 0.2e1_dp/ &
     978              :                                       0.9e1_dp*t181*t95*my_ndrhoa) + 0.8e1_dp/0.3e1_dp&
     979        79625 :                                  & *my_rho*my_ndrhoa)
     980              : 
     981              :                   e_ndra_ra(ii) = e_ndra_ra(ii) &
     982              :                                   - (t15*t21*(my_rhob*t185 - 0.2e1_dp/0.9e1_dp*t7&
     983        79625 :                                              & *t75*my_ndrhoa) + t445 + t449 - t452 + t467)*sc
     984              :                   e_ndra_rb(ii) = e_ndra_rb(ii) &
     985              :                                   - (t15*t21*(my_rhoa*t185 - 0.4e1_dp*my_rhob* &
     986        79625 :                                               my_ndrhoa) + t445 + t449 - t452 + t467)*sc
     987              : 
     988        79625 :                   t483 = t99*t103*t5*t202/0.3e1_dp
     989        79625 :                   t487 = t15*t108*t202*d/0.3e1_dp
     990        79625 :                   t490 = 0.11e2_dp/0.3e1_dp*t15*t115*t202
     991              :                   t505 = t15*t21*(t7*(-0.2e1_dp*t132*my_ndrhob - &
     992              :                                       0.2e1_dp/0.9e1_dp*t135*my_rhob*t195 + 0.2e1_dp/ &
     993              :                                       0.9e1_dp*t194*t95*my_ndrhob) + 0.8e1_dp/0.3e1_dp&
     994        79625 :                                  & *my_rho*my_ndrhob)
     995              : 
     996              :                   e_ndrb_ra(ii) = e_ndrb_ra(ii) &
     997              :                                   - (t15*t21*(my_rhob*t198 - 0.4e1_dp*my_rhoa* &
     998        79625 :                                               my_ndrhob) + t483 + t487 - t490 + t505)*sc
     999              :                   e_ndrb_rb(ii) = e_ndrb_rb(ii) &
    1000              :                                   - (t15*t21*(my_rhoa*t198 - 0.2e1_dp/0.9e1_dp*t7&
    1001        79625 :                                              & *t75*my_ndrhob) + t483 + t487 - t490 + t505)*sc
    1002              : 
    1003        79625 :                   t515 = 0.4e1_dp/0.3e1_dp*t16
    1004              : 
    1005              :                   e_ndr_ndr(ii) = e_ndr_ndr(ii) &
    1006        79625 :                                   - (t15*t21*(0.2e1_dp*t7*t39 - t515))*sc
    1007              : 
    1008        79625 :                   t519 = t13/0.9e1_dp
    1009        79625 :                   t520 = t37/0.9e1_dp
    1010              : 
    1011              :                   e_ndra_ndra(ii) = e_ndra_ndra(ii) &
    1012              :                        - (t15*t21*(t7*(-0.5e1_dp + t519 + t520 - 0.2e1_dp &
    1013        79625 :                        &/0.9e1_dp*t181*t8) + t515 - 0.2e1_dp*t29))*sc
    1014              : 
    1015              :                   e_ndrb_ndrb(ii) = e_ndrb_ndrb(ii) &
    1016              :                        - (t15*t21*(t7*(-0.5e1_dp + t519 + t520 - 0.2e1_dp &
    1017        79625 :                        &/0.9e1_dp*t194*t8) + t515 - 0.2e1_dp*t25))*sc
    1018              :                END IF
    1019              :             END IF
    1020              :          END IF
    1021              :       END DO
    1022              : !$OMP  END DO
    1023              : 
    1024         3040 :    END SUBROUTINE lyp_lsd_calc
    1025              : 
    1026              : END MODULE xc_lyp
        

Generated by: LCOV version 2.0-1