LCOV - code coverage report
Current view: top level - src - qs_rho0_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 95.0 % 180 171
Test Date: 2025-12-04 06:27:48 Functions: 75.0 % 16 12

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : ! **************************************************************************************************
       8              : MODULE qs_rho0_types
       9              : 
      10              :    USE cp_units,                        ONLY: cp_unit_from_cp2k
      11              :    USE kinds,                           ONLY: dp
      12              :    USE mathconstants,                   ONLY: fourpi,&
      13              :                                               pi,&
      14              :                                               rootpi
      15              :    USE memory_utilities,                ONLY: reallocate
      16              :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      17              :                                               pw_r3d_rs_type
      18              :    USE qs_grid_atom,                    ONLY: grid_atom_type
      19              :    USE qs_rho_atom_types,               ONLY: rho_atom_coeff
      20              :    USE whittaker,                       ONLY: whittaker_c0a,&
      21              :                                               whittaker_ci
      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_rho0_types'
      31              : 
      32              : ! *** Define multipole type ***
      33              : 
      34              : ! **************************************************************************************************
      35              :    TYPE mpole_rho_atom
      36              :       REAL(dp), DIMENSION(:), POINTER             ::  Qlm_h => NULL(), &
      37              :                                                      Qlm_s => NULL(), &
      38              :                                                      Qlm_tot => NULL(), &
      39              :                                                      Qlm_car => NULL()
      40              :       REAL(dp)                                    ::  Qlm_z = -1.0_dp
      41              :       REAL(dp), DIMENSION(2)                      ::  Q0 = -1.0_dp
      42              :    END TYPE mpole_rho_atom
      43              : 
      44              : ! **************************************************************************************************
      45              :    TYPE mpole_gau_overlap
      46              :       REAL(dp), DIMENSION(:, :, :), POINTER         :: Qlm_gg => NULL()
      47              :       REAL(dp), DIMENSION(:, :), POINTER           :: g0_h => NULL(), vg0_h => NULL()
      48              :       REAL(dp)                                    :: rpgf0_h = -1.0_dp, rpgf0_s = -1.0_dp
      49              :    END TYPE mpole_gau_overlap
      50              : 
      51              : ! **************************************************************************************************
      52              :    TYPE rho0_mpole_type
      53              :       TYPE(mpole_rho_atom), DIMENSION(:), POINTER  :: mp_rho => NULL()
      54              :       TYPE(mpole_gau_overlap), DIMENSION(:), &
      55              :          POINTER   :: mp_gau => NULL()
      56              :       REAL(dp)                                    :: zet0_h = -1.0_dp, &
      57              :                                                      total_rho0_h = -1.0_dp
      58              :       REAL(dp)                                    :: max_rpgf0_s = -1.0_dp
      59              :       REAL(dp), DIMENSION(:), POINTER             :: norm_g0l_h => NULL()
      60              :       INTEGER, DIMENSION(:), POINTER             :: lmax0_kind => NULL()
      61              :       INTEGER                                     :: lmax_0 = -1, igrid_zet0_s = -1
      62              :       TYPE(pw_r3d_rs_type), POINTER                    :: rho0_s_rs => NULL()
      63              :       TYPE(pw_c1d_gs_type), POINTER ::              rho0_s_gs => NULL()
      64              : 
      65              :       ! CNEO nuclear charge density related stuff.
      66              :       ! These are put here because it is preferred that function rho0_s_grid_create
      67              :       ! can initialize PW for both rho0 and nuclear rho1s. This is akin to the behavior
      68              :       ! that init_rho0 also initializes data structures for CNEO nuclear charge densities,
      69              :       ! such that code modifications are mimimal for places where init_rho0 and
      70              :       ! rho0_s_grid_create are called.
      71              :       LOGICAL    :: do_cneo = .FALSE.              ! if CNEO potential is used
      72              :       REAL(dp)   :: tot_rhoz_cneo_s = 0.0_dp       ! soft nuclear charge on the local grid
      73              :       TYPE(pw_r3d_rs_type), POINTER :: rhoz_cneo_s_rs => Null() ! soft nuclear charge density, r-space
      74              :       TYPE(pw_c1d_gs_type), POINTER :: rhoz_cneo_s_gs => Null() ! soft nuclear charge density, g-space
      75              :    END TYPE rho0_mpole_type
      76              : 
      77              : ! **************************************************************************************************
      78              :    TYPE rho0_atom_type
      79              :       TYPE(rho_atom_coeff), POINTER               :: rho0_rad_h => NULL(), &
      80              :                                                      vrho0_rad_h => NULL()
      81              :    END TYPE rho0_atom_type
      82              : 
      83              : ! Public Types
      84              : 
      85              :    PUBLIC :: mpole_rho_atom, mpole_gau_overlap, &
      86              :              rho0_atom_type, rho0_mpole_type
      87              : 
      88              : ! Public Subroutine
      89              : 
      90              :    PUBLIC :: allocate_multipoles, allocate_rho0_mpole, &
      91              :              allocate_rho0_atom, allocate_rho0_atom_rad, &
      92              :              deallocate_rho0_atom, deallocate_rho0_mpole, &
      93              :              calculate_g0, get_rho0_mpole, initialize_mpole_rho, &
      94              :              write_rho0_info
      95              : 
      96              : CONTAINS
      97              : 
      98              : ! **************************************************************************************************
      99              : !> \brief ...
     100              : !> \param mp_rho ...
     101              : !> \param natom ...
     102              : !> \param mp_gau ...
     103              : !> \param nkind ...
     104              : ! **************************************************************************************************
     105         2168 :    SUBROUTINE allocate_multipoles(mp_rho, natom, mp_gau, nkind)
     106              : 
     107              :       TYPE(mpole_rho_atom), DIMENSION(:), POINTER        :: mp_rho
     108              :       INTEGER, INTENT(IN)                                :: natom
     109              :       TYPE(mpole_gau_overlap), DIMENSION(:), POINTER     :: mp_gau
     110              :       INTEGER, INTENT(IN)                                :: nkind
     111              : 
     112              :       INTEGER                                            :: iat, ikind
     113              : 
     114         2168 :       IF (ASSOCIATED(mp_rho)) THEN
     115            0 :          CALL deallocate_mpole_rho(mp_rho)
     116              :       END IF
     117              : 
     118        17888 :       ALLOCATE (mp_rho(natom))
     119              : 
     120         9216 :       DO iat = 1, natom
     121         7048 :          NULLIFY (mp_rho(iat)%Qlm_h)
     122         7048 :          NULLIFY (mp_rho(iat)%Qlm_s)
     123         7048 :          NULLIFY (mp_rho(iat)%Qlm_tot)
     124         9216 :          NULLIFY (mp_rho(iat)%Qlm_car)
     125              :       END DO
     126              : 
     127         2168 :       IF (ASSOCIATED(mp_gau)) THEN
     128            0 :          CALL deallocate_mpole_gau(mp_gau)
     129              :       END IF
     130              : 
     131        10784 :       ALLOCATE (mp_gau(nkind))
     132              : 
     133         6448 :       DO ikind = 1, nkind
     134         4280 :          NULLIFY (mp_gau(ikind)%Qlm_gg)
     135         4280 :          NULLIFY (mp_gau(ikind)%g0_h)
     136         4280 :          NULLIFY (mp_gau(ikind)%vg0_h)
     137         4280 :          mp_gau(ikind)%rpgf0_h = 0.0_dp
     138         6448 :          mp_gau(ikind)%rpgf0_s = 0.0_dp
     139              :       END DO
     140              : 
     141         2168 :    END SUBROUTINE allocate_multipoles
     142              : 
     143              : ! **************************************************************************************************
     144              : !> \brief ...
     145              : !> \param rho0_set ...
     146              : !> \param natom ...
     147              : ! **************************************************************************************************
     148         2168 :    SUBROUTINE allocate_rho0_atom(rho0_set, natom)
     149              : 
     150              :       TYPE(rho0_atom_type), DIMENSION(:), POINTER        :: rho0_set
     151              :       INTEGER, INTENT(IN)                                :: natom
     152              : 
     153              :       INTEGER                                            :: iat
     154              : 
     155         2168 :       IF (ASSOCIATED(rho0_set)) THEN
     156            0 :          CALL deallocate_rho0_atom(rho0_set)
     157              :       END IF
     158              : 
     159        13552 :       ALLOCATE (rho0_set(natom))
     160              : 
     161         9216 :       DO iat = 1, natom
     162         7048 :          NULLIFY (rho0_set(iat)%rho0_rad_h)
     163         9216 :          NULLIFY (rho0_set(iat)%vrho0_rad_h)
     164              :       END DO
     165              : 
     166         2168 :    END SUBROUTINE allocate_rho0_atom
     167              : 
     168              : ! **************************************************************************************************
     169              : !> \brief ...
     170              : !> \param rho0_atom ...
     171              : !> \param nr ...
     172              : !> \param nchannels ...
     173              : ! **************************************************************************************************
     174         7048 :    SUBROUTINE allocate_rho0_atom_rad(rho0_atom, nr, nchannels)
     175              : 
     176              :       TYPE(rho0_atom_type), INTENT(OUT)                  :: rho0_atom
     177              :       INTEGER, INTENT(IN)                                :: nr, nchannels
     178              : 
     179         7048 :       ALLOCATE (rho0_atom%rho0_rad_h)
     180              : 
     181              :       NULLIFY (rho0_atom%rho0_rad_h%r_coef)
     182        28192 :       ALLOCATE (rho0_atom%rho0_rad_h%r_coef(1:nr, 1:nchannels))
     183      2760816 :       rho0_atom%rho0_rad_h%r_coef = 0.0_dp
     184              : 
     185         7048 :       ALLOCATE (rho0_atom%vrho0_rad_h)
     186              : 
     187              :       NULLIFY (rho0_atom%vrho0_rad_h%r_coef)
     188        28192 :       ALLOCATE (rho0_atom%vrho0_rad_h%r_coef(1:nr, 1:nchannels))
     189      2760816 :       rho0_atom%vrho0_rad_h%r_coef = 0.0_dp
     190              : 
     191         7048 :    END SUBROUTINE allocate_rho0_atom_rad
     192              : 
     193              : ! **************************************************************************************************
     194              : !> \brief ...
     195              : !> \param rho0 ...
     196              : ! **************************************************************************************************
     197         2168 :    SUBROUTINE allocate_rho0_mpole(rho0)
     198              : 
     199              :       TYPE(rho0_mpole_type), POINTER                     :: rho0
     200              : 
     201         2168 :       IF (ASSOCIATED(rho0)) THEN
     202            0 :          CALL deallocate_rho0_mpole(rho0)
     203              :       END IF
     204              : 
     205         2168 :       ALLOCATE (rho0)
     206              : 
     207              :       NULLIFY (rho0%mp_rho)
     208              :       NULLIFY (rho0%mp_gau)
     209              :       NULLIFY (rho0%norm_g0l_h)
     210              :       NULLIFY (rho0%lmax0_kind)
     211              :       NULLIFY (rho0%rho0_s_rs)
     212              :       NULLIFY (rho0%rho0_s_gs)
     213              : 
     214         2168 :    END SUBROUTINE allocate_rho0_mpole
     215              : 
     216              : ! **************************************************************************************************
     217              : !> \brief ...
     218              : !> \param rho0_mpole ...
     219              : !> \param grid_atom ...
     220              : !> \param ik ...
     221              : ! **************************************************************************************************
     222         4280 :    SUBROUTINE calculate_g0(rho0_mpole, grid_atom, ik)
     223              : 
     224              :       TYPE(rho0_mpole_type), POINTER                     :: rho0_mpole
     225              :       TYPE(grid_atom_type), POINTER                      :: grid_atom
     226              :       INTEGER, INTENT(IN)                                :: ik
     227              : 
     228              :       INTEGER                                            :: ir, l, lmax, nr
     229              :       REAL(dp)                                           :: c1, prefactor, root_z_h, z_h
     230         4280 :       REAL(dp), ALLOCATABLE, DIMENSION(:)                :: erf_z_h, gexp, gh_tmp, int1, int2
     231              : 
     232         4280 :       nr = grid_atom%nr
     233         4280 :       lmax = rho0_mpole%lmax0_kind(ik)
     234         4280 :       z_h = rho0_mpole%zet0_h
     235         4280 :       root_z_h = SQRT(z_h)
     236              : 
     237              : !   Allocate g0
     238         4280 :       CALL reallocate(rho0_mpole%mp_gau(ik)%g0_h, 1, nr, 0, lmax)
     239         4280 :       CALL reallocate(rho0_mpole%mp_gau(ik)%vg0_h, 1, nr, 0, lmax)
     240              : 
     241        29960 :       ALLOCATE (gexp(nr), gh_tmp(nr), erf_z_h(nr), int1(nr), int2(nr))
     242              : 
     243       223200 :       gh_tmp(1:nr) = EXP(-z_h*grid_atom%rad2(1:nr))
     244              : 
     245       223200 :       DO ir = 1, nr
     246       223200 :          erf_z_h(ir) = erf(grid_atom%rad(ir)*root_z_h)
     247              :       END DO
     248              : 
     249       223200 :       DO ir = 1, nr
     250       223200 :          IF (gh_tmp(ir) < 1.0E-30_dp) gh_tmp(ir) = 0.0_dp
     251              :       END DO
     252              : 
     253       223200 :       gexp(1:nr) = gh_tmp(1:nr)
     254              :       rho0_mpole%mp_gau(ik)%g0_h(1:nr, 0) = gh_tmp(1:nr)* &
     255       223200 :                                             rho0_mpole%norm_g0l_h(0)
     256         4280 :       CALL whittaker_c0a(int1, grid_atom%rad, gh_tmp, erf_z_h, z_h, 0, 0, nr)
     257         4280 :       CALL whittaker_ci(int2, grid_atom%rad, gh_tmp, z_h, 0, nr)
     258              : 
     259         4280 :       prefactor = fourpi*rho0_mpole%norm_g0l_h(0)
     260              : 
     261         4280 :       c1 = SQRT(pi*pi*pi/(z_h*z_h*z_h))*rho0_mpole%norm_g0l_h(0)
     262              : 
     263       223200 :       DO ir = 1, nr
     264       223200 :          rho0_mpole%mp_gau(ik)%vg0_h(ir, 0) = c1*erf_z_h(ir)*grid_atom%oorad2l(ir, 1)
     265              :       END DO
     266              : 
     267        11724 :       DO l = 1, lmax
     268       388604 :          gh_tmp(1:nr) = gh_tmp(1:nr)*grid_atom%rad(1:nr)
     269              :          rho0_mpole%mp_gau(ik)%g0_h(1:nr, l) = gh_tmp(1:nr)* &
     270       388604 :                                                rho0_mpole%norm_g0l_h(l)
     271              : 
     272         7444 :          prefactor = fourpi/(2.0_dp*l + 1.0_dp)*rho0_mpole%norm_g0l_h(l)
     273         7444 :          CALL whittaker_c0a(int1, grid_atom%rad, gexp, erf_z_h, z_h, l, l, nr)
     274       392884 :          DO ir = 1, nr
     275              :             rho0_mpole%mp_gau(ik)%vg0_h(ir, l) = prefactor*(int1(ir) + &
     276       388604 :                                                             int2(ir)*grid_atom%rad2l(ir, l))
     277              :          END DO
     278              : 
     279              :       END DO ! l
     280              : 
     281         4280 :       DEALLOCATE (gexp, erf_z_h, gh_tmp, int1, int2)
     282         4280 :    END SUBROUTINE calculate_g0
     283              : 
     284              : ! **************************************************************************************************
     285              : !> \brief ...
     286              : !> \param mp_gau ...
     287              : ! **************************************************************************************************
     288         2168 :    SUBROUTINE deallocate_mpole_gau(mp_gau)
     289              : 
     290              :       TYPE(mpole_gau_overlap), DIMENSION(:), POINTER     :: mp_gau
     291              : 
     292              :       INTEGER                                            :: ikind, nkind
     293              : 
     294         2168 :       nkind = SIZE(mp_gau)
     295              : 
     296         6448 :       DO ikind = 1, nkind
     297              : 
     298         4280 :          IF (ASSOCIATED(mp_gau(ikind)%Qlm_gg)) THEN
     299         3926 :             DEALLOCATE (mp_gau(ikind)%Qlm_gg)
     300              :          END IF
     301              : 
     302         4280 :          DEALLOCATE (mp_gau(ikind)%g0_h)
     303              : 
     304         6448 :          DEALLOCATE (mp_gau(ikind)%vg0_h)
     305              :       END DO
     306              : 
     307         2168 :       DEALLOCATE (mp_gau)
     308              : 
     309         2168 :    END SUBROUTINE deallocate_mpole_gau
     310              : 
     311              : ! **************************************************************************************************
     312              : !> \brief ...
     313              : !> \param mp_rho ...
     314              : ! **************************************************************************************************
     315         2168 :    SUBROUTINE deallocate_mpole_rho(mp_rho)
     316              : 
     317              :       TYPE(mpole_rho_atom), DIMENSION(:), POINTER        :: mp_rho
     318              : 
     319              :       INTEGER                                            :: iat, natom
     320              : 
     321         2168 :       natom = SIZE(mp_rho)
     322              : 
     323         9216 :       DO iat = 1, natom
     324         7048 :          DEALLOCATE (mp_rho(iat)%Qlm_h)
     325         7048 :          DEALLOCATE (mp_rho(iat)%Qlm_s)
     326         7048 :          DEALLOCATE (mp_rho(iat)%Qlm_tot)
     327         9216 :          DEALLOCATE (mp_rho(iat)%Qlm_car)
     328              :       END DO
     329              : 
     330         2168 :       DEALLOCATE (mp_rho)
     331              : 
     332         2168 :    END SUBROUTINE deallocate_mpole_rho
     333              : 
     334              : ! **************************************************************************************************
     335              : !> \brief ...
     336              : !> \param rho0_atom_set ...
     337              : ! **************************************************************************************************
     338         2168 :    SUBROUTINE deallocate_rho0_atom(rho0_atom_set)
     339              : 
     340              :       TYPE(rho0_atom_type), DIMENSION(:), POINTER        :: rho0_atom_set
     341              : 
     342              :       INTEGER                                            :: iat, natom
     343              : 
     344         2168 :       IF (ASSOCIATED(rho0_atom_set)) THEN
     345              : 
     346         2168 :          natom = SIZE(rho0_atom_set)
     347              : 
     348         9216 :          DO iat = 1, natom
     349         7048 :             IF (ASSOCIATED(rho0_atom_set(iat)%rho0_rad_h)) THEN
     350         7048 :                DEALLOCATE (rho0_atom_set(iat)%rho0_rad_h%r_coef)
     351         7048 :                DEALLOCATE (rho0_atom_set(iat)%rho0_rad_h)
     352              :             END IF
     353         9216 :             IF (ASSOCIATED(rho0_atom_set(iat)%vrho0_rad_h)) THEN
     354         7048 :                DEALLOCATE (rho0_atom_set(iat)%vrho0_rad_h%r_coef)
     355         7048 :                DEALLOCATE (rho0_atom_set(iat)%vrho0_rad_h)
     356              :             END IF
     357              :          END DO
     358              : 
     359         2168 :          DEALLOCATE (rho0_atom_set)
     360              :       ELSE
     361              :          CALL cp_abort(__LOCATION__, &
     362              :                        "The pointer rho0_atom_set is not associated and "// &
     363            0 :                        "cannot be deallocated")
     364              :       END IF
     365              : 
     366         2168 :    END SUBROUTINE deallocate_rho0_atom
     367              : ! **************************************************************************************************
     368              : !> \brief ...
     369              : !> \param rho0 ...
     370              : ! **************************************************************************************************
     371         2168 :    SUBROUTINE deallocate_rho0_mpole(rho0)
     372              : 
     373              :       TYPE(rho0_mpole_type), POINTER                     :: rho0
     374              : 
     375         2168 :       IF (ASSOCIATED(rho0)) THEN
     376              : 
     377         2168 :          IF (ASSOCIATED(rho0%mp_gau)) CALL deallocate_mpole_gau(rho0%mp_gau)
     378              : 
     379         2168 :          IF (ASSOCIATED(rho0%mp_rho)) CALL deallocate_mpole_rho(rho0%mp_rho)
     380              : 
     381         2168 :          IF (ASSOCIATED(rho0%lmax0_kind)) THEN
     382         2168 :             DEALLOCATE (rho0%lmax0_kind)
     383              :          END IF
     384              : 
     385         2168 :          IF (ASSOCIATED(rho0%norm_g0l_h)) THEN
     386         2168 :             DEALLOCATE (rho0%norm_g0l_h)
     387              :          END IF
     388              : 
     389         2168 :          IF (ASSOCIATED(rho0%rho0_s_rs)) THEN
     390         2168 :             CALL rho0%rho0_s_rs%release()
     391         2168 :             DEALLOCATE (rho0%rho0_s_rs)
     392              :          END IF
     393              : 
     394         2168 :          IF (ASSOCIATED(rho0%rho0_s_gs)) THEN
     395         2168 :             CALL rho0%rho0_s_gs%release()
     396         2168 :             DEALLOCATE (rho0%rho0_s_gs)
     397              :          END IF
     398              : 
     399         2168 :          IF (ASSOCIATED(rho0%rhoz_cneo_s_rs)) THEN
     400            8 :             CALL rho0%rhoz_cneo_s_rs%release()
     401            8 :             DEALLOCATE (rho0%rhoz_cneo_s_rs)
     402              :          END IF
     403              : 
     404         2168 :          IF (ASSOCIATED(rho0%rhoz_cneo_s_gs)) THEN
     405            8 :             CALL rho0%rhoz_cneo_s_gs%release()
     406            8 :             DEALLOCATE (rho0%rhoz_cneo_s_gs)
     407              :          END IF
     408              : 
     409         2168 :          DEALLOCATE (rho0)
     410              :       ELSE
     411              :          CALL cp_abort(__LOCATION__, &
     412              :                        "The pointer rho0 is not associated and "// &
     413            0 :                        "cannot be deallocated")
     414              :       END IF
     415              : 
     416         2168 :    END SUBROUTINE deallocate_rho0_mpole
     417              : 
     418              : ! **************************************************************************************************
     419              : !> \brief ...
     420              : !> \param rho0_mpole ...
     421              : !> \param g0_h ...
     422              : !> \param vg0_h ...
     423              : !> \param iat ...
     424              : !> \param ikind ...
     425              : !> \param lmax_0 ...
     426              : !> \param l0_ikind ...
     427              : !> \param mp_gau_ikind ...
     428              : !> \param mp_rho ...
     429              : !> \param norm_g0l_h ...
     430              : !> \param Qlm_gg ...
     431              : !> \param Qlm_car ...
     432              : !> \param Qlm_tot ...
     433              : !> \param zet0_h ...
     434              : !> \param igrid_zet0_s ...
     435              : !> \param rpgf0_h ...
     436              : !> \param rpgf0_s ...
     437              : !> \param max_rpgf0_s ...
     438              : !> \param rho0_s_rs ...
     439              : !> \param rho0_s_gs ...
     440              : !> \param rhoz_cneo_s_rs ...
     441              : !> \param rhoz_cneo_s_gs ...
     442              : ! **************************************************************************************************
     443       247486 :    SUBROUTINE get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, &
     444              :                              mp_gau_ikind, mp_rho, norm_g0l_h, &
     445              :                              Qlm_gg, Qlm_car, Qlm_tot, &
     446              :                              zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, &
     447              :                              max_rpgf0_s, rho0_s_rs, rho0_s_gs, &
     448              :                              rhoz_cneo_s_rs, rhoz_cneo_s_gs)
     449              : 
     450              :       TYPE(rho0_mpole_type), POINTER                     :: rho0_mpole
     451              :       REAL(dp), DIMENSION(:, :), OPTIONAL, POINTER       :: g0_h, vg0_h
     452              :       INTEGER, INTENT(IN), OPTIONAL                      :: iat, ikind
     453              :       INTEGER, INTENT(OUT), OPTIONAL                     :: lmax_0, l0_ikind
     454              :       TYPE(mpole_gau_overlap), OPTIONAL, POINTER         :: mp_gau_ikind
     455              :       TYPE(mpole_rho_atom), DIMENSION(:), OPTIONAL, &
     456              :          POINTER                                         :: mp_rho
     457              :       REAL(dp), DIMENSION(:), OPTIONAL, POINTER          :: norm_g0l_h
     458              :       REAL(dp), DIMENSION(:, :, :), OPTIONAL, POINTER    :: Qlm_gg
     459              :       REAL(dp), DIMENSION(:), OPTIONAL, POINTER          :: Qlm_car, Qlm_tot
     460              :       REAL(dp), INTENT(OUT), OPTIONAL                    :: zet0_h
     461              :       INTEGER, INTENT(OUT), OPTIONAL                     :: igrid_zet0_s
     462              :       REAL(dp), INTENT(OUT), OPTIONAL                    :: rpgf0_h, rpgf0_s, max_rpgf0_s
     463              :       TYPE(pw_r3d_rs_type), OPTIONAL, POINTER            :: rho0_s_rs
     464              :       TYPE(pw_c1d_gs_type), OPTIONAL, POINTER            :: rho0_s_gs
     465              :       TYPE(pw_r3d_rs_type), OPTIONAL, POINTER            :: rhoz_cneo_s_rs
     466              :       TYPE(pw_c1d_gs_type), OPTIONAL, POINTER            :: rhoz_cneo_s_gs
     467              : 
     468       247486 :       IF (ASSOCIATED(rho0_mpole)) THEN
     469              : 
     470       247486 :          IF (PRESENT(lmax_0)) lmax_0 = rho0_mpole%lmax_0
     471       247486 :          IF (PRESENT(mp_rho)) mp_rho => rho0_mpole%mp_rho
     472       247486 :          IF (PRESENT(norm_g0l_h)) norm_g0l_h => rho0_mpole%norm_g0l_h
     473       247486 :          IF (PRESENT(zet0_h)) zet0_h = rho0_mpole%zet0_h
     474       247486 :          IF (PRESENT(igrid_zet0_s)) igrid_zet0_s = rho0_mpole%igrid_zet0_s
     475       247486 :          IF (PRESENT(max_rpgf0_s)) max_rpgf0_s = rho0_mpole%max_rpgf0_s
     476       247486 :          IF (PRESENT(rho0_s_rs)) rho0_s_rs => rho0_mpole%rho0_s_rs
     477       247486 :          IF (PRESENT(rho0_s_gs)) rho0_s_gs => rho0_mpole%rho0_s_gs
     478       247486 :          IF (PRESENT(rhoz_cneo_s_rs)) rhoz_cneo_s_rs => rho0_mpole%rhoz_cneo_s_rs
     479       247486 :          IF (PRESENT(rhoz_cneo_s_gs)) rhoz_cneo_s_gs => rho0_mpole%rhoz_cneo_s_gs
     480              : 
     481       247486 :          IF (PRESENT(ikind)) THEN
     482       139280 :             IF (PRESENT(l0_ikind)) l0_ikind = rho0_mpole%lmax0_kind(ikind)
     483       139280 :             IF (PRESENT(mp_gau_ikind)) mp_gau_ikind => rho0_mpole%mp_gau(ikind)
     484       139280 :             IF (PRESENT(g0_h)) g0_h => rho0_mpole%mp_gau(ikind)%g0_h
     485       139280 :             IF (PRESENT(vg0_h)) vg0_h => rho0_mpole%mp_gau(ikind)%vg0_h
     486       139280 :             IF (PRESENT(Qlm_gg)) Qlm_gg => rho0_mpole%mp_gau(ikind)%Qlm_gg
     487       139280 :             IF (PRESENT(rpgf0_h)) rpgf0_h = rho0_mpole%mp_gau(ikind)%rpgf0_h
     488       139280 :             IF (PRESENT(rpgf0_s)) rpgf0_s = rho0_mpole%mp_gau(ikind)%rpgf0_s
     489              :          END IF
     490       247486 :          IF (PRESENT(iat)) THEN
     491        53820 :             IF (PRESENT(Qlm_car)) Qlm_car => rho0_mpole%mp_rho(iat)%Qlm_car
     492        53820 :             IF (PRESENT(Qlm_tot)) Qlm_tot => rho0_mpole%mp_rho(iat)%Qlm_tot
     493              :          END IF
     494              : 
     495              :       ELSE
     496            0 :          CPABORT("The pointer rho0_mpole is not associated")
     497              :       END IF
     498              : 
     499       247486 :    END SUBROUTINE get_rho0_mpole
     500              : 
     501              : ! **************************************************************************************************
     502              : !> \brief ...
     503              : !> \param mp_rho ...
     504              : !> \param nchan_s ...
     505              : !> \param nchan_c ...
     506              : !> \param zeff ...
     507              : ! **************************************************************************************************
     508         7048 :    SUBROUTINE initialize_mpole_rho(mp_rho, nchan_s, nchan_c, zeff)
     509              : 
     510              :       TYPE(mpole_rho_atom)                               :: mp_rho
     511              :       INTEGER, INTENT(IN)                                :: nchan_s, nchan_c
     512              :       REAL(KIND=dp), INTENT(IN)                          :: zeff
     513              : 
     514         7048 :       CALL reallocate(mp_rho%Qlm_h, 1, nchan_s)
     515         7048 :       CALL reallocate(mp_rho%Qlm_s, 1, nchan_s)
     516         7048 :       CALL reallocate(mp_rho%Qlm_tot, 1, nchan_s)
     517         7048 :       CALL reallocate(mp_rho%Qlm_car, 1, nchan_c)
     518              : 
     519        60176 :       mp_rho%Qlm_h = 0.0_dp
     520        60176 :       mp_rho%Qlm_s = 0.0_dp
     521        60176 :       mp_rho%Qlm_tot = 0.0_dp
     522        66804 :       mp_rho%Qlm_car = 0.0_dp
     523         7048 :       mp_rho%Qlm_z = -2.0_dp*rootpi*Zeff
     524        21144 :       mp_rho%Q0 = 0.0_dp
     525              : 
     526         7048 :    END SUBROUTINE initialize_mpole_rho
     527              : 
     528              : ! **************************************************************************************************
     529              : !> \brief ...
     530              : !> \param rho0_mpole ...
     531              : !> \param unit_str ...
     532              : !> \param output_unit ...
     533              : ! **************************************************************************************************
     534            1 :    SUBROUTINE write_rho0_info(rho0_mpole, unit_str, output_unit)
     535              : 
     536              :       TYPE(rho0_mpole_type), POINTER                     :: rho0_mpole
     537              :       CHARACTER(LEN=*), INTENT(IN)                       :: unit_str
     538              :       INTEGER, INTENT(in)                                :: output_unit
     539              : 
     540              :       INTEGER                                            :: ikind, l, nkind
     541              :       REAL(dp)                                           :: conv
     542              : 
     543            1 :       IF (ASSOCIATED(rho0_mpole)) THEN
     544            1 :          conv = cp_unit_from_cp2k(1.0_dp, TRIM(unit_str))
     545              : 
     546              :          WRITE (UNIT=output_unit, FMT="(/,T5,A,/)") &
     547            1 :             "*** Compensation density charges data set ***"
     548              :          WRITE (UNIT=output_unit, FMT="(T2,A,T35,f16.10)") &
     549            1 :             "- Rho0 exponent :", rho0_mpole%zet0_h
     550              :          WRITE (UNIT=output_unit, FMT="(T2,A,T35,I5)") &
     551            1 :             "- Global max l :", rho0_mpole%lmax_0
     552              : 
     553              :          WRITE (UNIT=output_unit, FMT="(T2,A)") &
     554            1 :             "- Normalization constants for g0"
     555            2 :          DO l = 0, rho0_mpole%lmax_0
     556              :             WRITE (UNIT=output_unit, FMT="(T20,A,T31,I2,T38,A,f15.5)") &
     557            2 :                "ang. mom.= ", l, " hard= ", rho0_mpole%norm_g0l_h(l)
     558              :          END DO
     559              : 
     560            1 :          nkind = SIZE(rho0_mpole%lmax0_kind, 1)
     561            2 :          DO ikind = 1, nkind
     562              :             WRITE (UNIT=output_unit, FMT="(/,T2,A,T55,I2)") &
     563              :                "- rho0 max L and radii in "//TRIM(unit_str)// &
     564            1 :                " for the atom kind :", ikind
     565              : 
     566              :             WRITE (UNIT=output_unit, FMT="(T2,T20,A,T55,I5)") &
     567            1 :                "=> l max  :", rho0_mpole%lmax0_kind(ikind)
     568              : 
     569              :             WRITE (UNIT=output_unit, FMT="(T2,T20,A,T55,f20.10)") &
     570            1 :                "=> max radius of g0: ", &
     571            3 :                rho0_mpole%mp_gau(ikind)%rpgf0_h*conv
     572              :          END DO ! ikind
     573              : 
     574              :       ELSE
     575              :          WRITE (UNIT=output_unit, FMT="(/,T5,A,/)") &
     576            0 :             ' WARNING: I cannot print rho0, it is not associated'
     577              :       END IF
     578              : 
     579            1 :    END SUBROUTINE write_rho0_info
     580            0 : END MODULE qs_rho0_types
        

Generated by: LCOV version 2.0-1