LCOV - code coverage report
Current view: top level - src - qs_local_rho_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 77 83 92.8 %
Date: 2024-11-21 06:45:46 Functions: 7 9 77.8 %

          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             : MODULE qs_local_rho_types
       9             : 
      10             :    USE kinds,                           ONLY: dp
      11             :    USE mathconstants,                   ONLY: fourpi,&
      12             :                                               pi
      13             :    USE memory_utilities,                ONLY: reallocate
      14             :    USE qs_grid_atom,                    ONLY: grid_atom_type
      15             :    USE qs_harmonics_atom,               ONLY: harmonics_atom_type
      16             :    USE qs_rho0_types,                   ONLY: deallocate_rho0_atom,&
      17             :                                               deallocate_rho0_mpole,&
      18             :                                               rho0_atom_type,&
      19             :                                               rho0_mpole_type
      20             :    USE qs_rho_atom_types,               ONLY: deallocate_rho_atom_set,&
      21             :                                               rho_atom_type
      22             : #include "./base/base_uses.f90"
      23             : 
      24             :    IMPLICIT NONE
      25             : 
      26             :    PRIVATE
      27             : 
      28             : ! *** Global parameters (only in this module)
      29             : 
      30             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_local_rho_types'
      31             : 
      32             : ! *** Define rhoz and local_rho types ***
      33             : 
      34             : ! **************************************************************************************************
      35             :    TYPE rhoz_type
      36             :       REAL(dp)                             ::  one_atom = -1.0_dp
      37             :       REAL(dp), DIMENSION(:), POINTER      ::  r_coef => NULL()
      38             :       REAL(dp), DIMENSION(:), POINTER      ::  dr_coef => NULL()
      39             :       REAL(dp), DIMENSION(:), POINTER      ::  vr_coef => NULL()
      40             :    END TYPE rhoz_type
      41             : 
      42             : ! **************************************************************************************************
      43             :    TYPE local_rho_type
      44             :       TYPE(rho_atom_type), DIMENSION(:), POINTER            :: rho_atom_set => NULL()
      45             :       TYPE(rho0_mpole_type), POINTER                        :: rho0_mpole => NULL()
      46             :       TYPE(rho0_atom_type), DIMENSION(:), POINTER           :: rho0_atom_set => NULL()
      47             :       TYPE(rhoz_type), DIMENSION(:), POINTER                :: rhoz_set => NULL()
      48             :       REAL(dp)                                              :: rhoz_tot = -1.0_dp
      49             :    END TYPE local_rho_type
      50             : 
      51             : ! Public Types
      52             :    PUBLIC :: local_rho_type, rhoz_type
      53             : 
      54             : ! Public Subroutine
      55             :    PUBLIC :: allocate_rhoz, calculate_rhoz, &
      56             :              get_local_rho, local_rho_set_create, &
      57             :              local_rho_set_release, set_local_rho
      58             : 
      59             : CONTAINS
      60             : 
      61             : ! **************************************************************************************************
      62             : !> \brief ...
      63             : !> \param rhoz_set ...
      64             : !> \param nkind ...
      65             : ! **************************************************************************************************
      66        1790 :    SUBROUTINE allocate_rhoz(rhoz_set, nkind)
      67             : 
      68             :       TYPE(rhoz_type), DIMENSION(:), POINTER             :: rhoz_set
      69             :       INTEGER                                            :: nkind
      70             : 
      71             :       INTEGER                                            :: ikind
      72             : 
      73        1790 :       IF (ASSOCIATED(rhoz_set)) THEN
      74           0 :          CALL deallocate_rhoz(rhoz_set)
      75             :       END IF
      76             : 
      77        9112 :       ALLOCATE (rhoz_set(nkind))
      78             : 
      79        5532 :       DO ikind = 1, nkind
      80        3742 :          NULLIFY (rhoz_set(ikind)%r_coef)
      81        3742 :          NULLIFY (rhoz_set(ikind)%dr_coef)
      82        5532 :          NULLIFY (rhoz_set(ikind)%vr_coef)
      83             :       END DO
      84             : 
      85        1790 :    END SUBROUTINE allocate_rhoz
      86             : 
      87             : ! **************************************************************************************************
      88             : !> \brief ...
      89             : !> \param rhoz ...
      90             : !> \param grid_atom ...
      91             : !> \param alpha ...
      92             : !> \param zeff ...
      93             : !> \param natom ...
      94             : !> \param rhoz_tot ...
      95             : !> \param harmonics ...
      96             : ! **************************************************************************************************
      97        3742 :    SUBROUTINE calculate_rhoz(rhoz, grid_atom, alpha, zeff, natom, rhoz_tot, harmonics)
      98             : 
      99             :       TYPE(rhoz_type)                                    :: rhoz
     100             :       TYPE(grid_atom_type)                               :: grid_atom
     101             :       REAL(dp), INTENT(IN)                               :: alpha
     102             :       REAL(dp)                                           :: zeff
     103             :       INTEGER                                            :: natom
     104             :       REAL(dp), INTENT(INOUT)                            :: rhoz_tot
     105             :       TYPE(harmonics_atom_type)                          :: harmonics
     106             : 
     107             :       INTEGER                                            :: ir, na, nr
     108             :       REAL(dp)                                           :: c1, c2, c3, prefactor1, prefactor2, &
     109             :                                                             prefactor3, sum
     110             : 
     111        3742 :       nr = grid_atom%nr
     112        3742 :       na = grid_atom%ng_sphere
     113        3742 :       CALL reallocate(rhoz%r_coef, 1, nr)
     114        3742 :       CALL reallocate(rhoz%dr_coef, 1, nr)
     115        3742 :       CALL reallocate(rhoz%vr_coef, 1, nr)
     116             : 
     117        3742 :       c1 = alpha/pi
     118        3742 :       c2 = c1*c1*c1*fourpi
     119        3742 :       c3 = SQRT(alpha)
     120        3742 :       prefactor1 = zeff*SQRT(c2)
     121        3742 :       prefactor2 = -2.0_dp*alpha
     122        3742 :       prefactor3 = -zeff*SQRT(fourpi)
     123             : 
     124        3742 :       sum = 0.0_dp
     125      195762 :       DO ir = 1, nr
     126      192020 :          c1 = -alpha*grid_atom%rad2(ir)
     127      192020 :          rhoz%r_coef(ir) = -EXP(c1)*prefactor1
     128      192020 :          IF (ABS(rhoz%r_coef(ir)) < 1.0E-30_dp) THEN
     129      119282 :             rhoz%r_coef(ir) = 0.0_dp
     130      119282 :             rhoz%dr_coef(ir) = 0.0_dp
     131             :          ELSE
     132       72738 :             rhoz%dr_coef(ir) = prefactor2*rhoz%r_coef(ir)
     133             :          END IF
     134      192020 :          rhoz%vr_coef(ir) = prefactor3*erf(grid_atom%rad(ir)*c3)/grid_atom%rad(ir)
     135      195762 :          sum = sum + rhoz%r_coef(ir)*grid_atom%wr(ir)
     136             :       END DO
     137        3742 :       rhoz%one_atom = sum*harmonics%slm_int(1)
     138        3742 :       rhoz_tot = rhoz_tot + natom*rhoz%one_atom
     139             : 
     140        3742 :    END SUBROUTINE calculate_rhoz
     141             : 
     142             : ! **************************************************************************************************
     143             : !> \brief ...
     144             : !> \param rhoz_set ...
     145             : ! **************************************************************************************************
     146        1790 :    SUBROUTINE deallocate_rhoz(rhoz_set)
     147             : 
     148             :       TYPE(rhoz_type), DIMENSION(:), POINTER             :: rhoz_set
     149             : 
     150             :       INTEGER                                            :: ikind, nkind
     151             : 
     152        1790 :       nkind = SIZE(rhoz_set)
     153             : 
     154        5532 :       DO ikind = 1, nkind
     155        3742 :          DEALLOCATE (rhoz_set(ikind)%r_coef)
     156        3742 :          DEALLOCATE (rhoz_set(ikind)%dr_coef)
     157        5532 :          DEALLOCATE (rhoz_set(ikind)%vr_coef)
     158             :       END DO
     159             : 
     160        1790 :       DEALLOCATE (rhoz_set)
     161             : 
     162        1790 :    END SUBROUTINE deallocate_rhoz
     163             : 
     164             : ! **************************************************************************************************
     165             : !> \brief ...
     166             : !> \param local_rho_set ...
     167             : !> \param rho_atom_set ...
     168             : !> \param rho0_atom_set ...
     169             : !> \param rho0_mpole ...
     170             : !> \param rhoz_set ...
     171             : ! **************************************************************************************************
     172      201894 :    SUBROUTINE get_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set)
     173             : 
     174             :       TYPE(local_rho_type), POINTER                      :: local_rho_set
     175             :       TYPE(rho_atom_type), DIMENSION(:), OPTIONAL, &
     176             :          POINTER                                         :: rho_atom_set
     177             :       TYPE(rho0_atom_type), DIMENSION(:), OPTIONAL, &
     178             :          POINTER                                         :: rho0_atom_set
     179             :       TYPE(rho0_mpole_type), OPTIONAL, POINTER           :: rho0_mpole
     180             :       TYPE(rhoz_type), DIMENSION(:), OPTIONAL, POINTER   :: rhoz_set
     181             : 
     182      201894 :       IF (PRESENT(rho_atom_set)) rho_atom_set => local_rho_set%rho_atom_set
     183      201894 :       IF (PRESENT(rho0_atom_set)) rho0_atom_set => local_rho_set%rho0_atom_set
     184      201894 :       IF (PRESENT(rho0_mpole)) rho0_mpole => local_rho_set%rho0_mpole
     185      201894 :       IF (PRESENT(rhoz_set)) rhoz_set => local_rho_set%rhoz_set
     186             : 
     187      201894 :    END SUBROUTINE get_local_rho
     188             : 
     189             : ! **************************************************************************************************
     190             : !> \brief ...
     191             : !> \param local_rho_set ...
     192             : ! **************************************************************************************************
     193        8382 :    SUBROUTINE local_rho_set_create(local_rho_set)
     194             : 
     195             :       TYPE(local_rho_type), POINTER                      :: local_rho_set
     196             : 
     197        8382 :       ALLOCATE (local_rho_set)
     198             : 
     199             :       NULLIFY (local_rho_set%rho_atom_set)
     200             :       NULLIFY (local_rho_set%rho0_atom_set)
     201             :       NULLIFY (local_rho_set%rho0_mpole)
     202             :       NULLIFY (local_rho_set%rhoz_set)
     203             : 
     204        8382 :       local_rho_set%rhoz_tot = 0.0_dp
     205             : 
     206        8382 :    END SUBROUTINE local_rho_set_create
     207             : 
     208             : ! **************************************************************************************************
     209             : !> \brief ...
     210             : !> \param local_rho_set ...
     211             : ! **************************************************************************************************
     212        8382 :    SUBROUTINE local_rho_set_release(local_rho_set)
     213             : 
     214             :       TYPE(local_rho_type), POINTER                      :: local_rho_set
     215             : 
     216        8382 :       IF (ASSOCIATED(local_rho_set)) THEN
     217        8382 :          IF (ASSOCIATED(local_rho_set%rho_atom_set)) THEN
     218        2616 :             CALL deallocate_rho_atom_set(local_rho_set%rho_atom_set)
     219             :          END IF
     220             : 
     221        8382 :          IF (ASSOCIATED(local_rho_set%rho0_atom_set)) THEN
     222        1790 :             CALL deallocate_rho0_atom(local_rho_set%rho0_atom_set)
     223             :          END IF
     224             : 
     225        8382 :          IF (ASSOCIATED(local_rho_set%rho0_mpole)) THEN
     226        1790 :             CALL deallocate_rho0_mpole(local_rho_set%rho0_mpole)
     227             :          END IF
     228             : 
     229        8382 :          IF (ASSOCIATED(local_rho_set%rhoz_set)) THEN
     230        1790 :             CALL deallocate_rhoz(local_rho_set%rhoz_set)
     231             :          END IF
     232             : 
     233        8382 :          DEALLOCATE (local_rho_set)
     234             :       END IF
     235             : 
     236        8382 :    END SUBROUTINE local_rho_set_release
     237             : 
     238             : ! **************************************************************************************************
     239             : !> \brief ...
     240             : !> \param local_rho_set ...
     241             : !> \param rho_atom_set ...
     242             : !> \param rho0_atom_set ...
     243             : !> \param rho0_mpole ...
     244             : !> \param rhoz_set ...
     245             : ! **************************************************************************************************
     246        2710 :    SUBROUTINE set_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, &
     247             :                             rhoz_set)
     248             : 
     249             :       TYPE(local_rho_type), POINTER                      :: local_rho_set
     250             :       TYPE(rho_atom_type), DIMENSION(:), OPTIONAL, &
     251             :          POINTER                                         :: rho_atom_set
     252             :       TYPE(rho0_atom_type), DIMENSION(:), OPTIONAL, &
     253             :          POINTER                                         :: rho0_atom_set
     254             :       TYPE(rho0_mpole_type), OPTIONAL, POINTER           :: rho0_mpole
     255             :       TYPE(rhoz_type), DIMENSION(:), OPTIONAL, POINTER   :: rhoz_set
     256             : 
     257        2710 :       IF (PRESENT(rho_atom_set)) THEN
     258         920 :          IF (ASSOCIATED(local_rho_set%rho_atom_set)) THEN
     259           0 :             CALL deallocate_rho_atom_set(local_rho_set%rho_atom_set)
     260             :          END IF
     261         920 :          local_rho_set%rho_atom_set => rho_atom_set
     262             :       END IF
     263             : 
     264        2710 :       IF (PRESENT(rho0_atom_set)) THEN
     265        1790 :          IF (ASSOCIATED(local_rho_set%rho0_atom_set)) THEN
     266           0 :             CALL deallocate_rho0_atom(local_rho_set%rho0_atom_set)
     267             :          END IF
     268        1790 :          local_rho_set%rho0_atom_set => rho0_atom_set
     269             :       END IF
     270             : 
     271        2710 :       IF (PRESENT(rho0_mpole)) THEN
     272        1790 :          IF (ASSOCIATED(local_rho_set%rho0_mpole)) THEN
     273           0 :             CALL deallocate_rho0_mpole(local_rho_set%rho0_mpole)
     274             :          END IF
     275        1790 :          local_rho_set%rho0_mpole => rho0_mpole
     276             :       END IF
     277             : 
     278        2710 :       IF (PRESENT(rhoz_set)) THEN
     279        1790 :          IF (ASSOCIATED(local_rho_set%rhoz_set)) THEN
     280           0 :             CALL deallocate_rhoz(local_rho_set%rhoz_set)
     281             :          END IF
     282        1790 :          local_rho_set%rhoz_set => rhoz_set
     283             :       END IF
     284             : 
     285        2710 :    END SUBROUTINE set_local_rho
     286             : 
     287           0 : END MODULE qs_local_rho_types
     288             : 

Generated by: LCOV version 1.15