LCOV - code coverage report
Current view: top level - src - qs_rho_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 71.3 % 675 481
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 9 9

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief methods of the rho structure (defined in qs_rho_types)
      10              : !> \par History
      11              : !>      08.2002 created [fawzi]
      12              : !>      08.2014 kpoints [JGH]
      13              : !> \author Fawzi Mohamed
      14              : ! **************************************************************************************************
      15              : MODULE qs_rho_methods
      16              :    USE admm_types,                      ONLY: get_admm_env
      17              :    USE atomic_kind_types,               ONLY: atomic_kind_type
      18              :    USE cp_control_types,                ONLY: dft_control_type
      19              :    USE cp_dbcsr_api,                    ONLY: &
      20              :         dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_p_type, dbcsr_scale, dbcsr_set, dbcsr_type, &
      21              :         dbcsr_type_antisymmetric, dbcsr_type_symmetric
      22              :    USE cp_dbcsr_cp2k_link,              ONLY: cp_dbcsr_alloc_block_from_nbl
      23              :    USE cp_dbcsr_operations,             ONLY: dbcsr_allocate_matrix_set,&
      24              :                                               dbcsr_deallocate_matrix_set
      25              :    USE cp_log_handling,                 ONLY: cp_to_string
      26              :    USE kinds,                           ONLY: default_string_length,&
      27              :                                               dp
      28              :    USE kpoint_types,                    ONLY: get_kpoint_info,&
      29              :                                               kpoint_type
      30              :    USE lri_environment_methods,         ONLY: calculate_lri_densities
      31              :    USE lri_environment_types,           ONLY: lri_density_type,&
      32              :                                               lri_environment_type
      33              :    USE message_passing,                 ONLY: mp_para_env_type
      34              :    USE pw_env_types,                    ONLY: pw_env_get,&
      35              :                                               pw_env_type
      36              :    USE pw_methods,                      ONLY: pw_axpy,&
      37              :                                               pw_copy,&
      38              :                                               pw_scale,&
      39              :                                               pw_zero
      40              :    USE pw_pool_types,                   ONLY: pw_pool_type
      41              :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      42              :                                               pw_r3d_rs_type
      43              :    USE qs_collocate_density,            ONLY: calculate_drho_elec,&
      44              :                                               calculate_rho_elec
      45              :    USE qs_environment_types,            ONLY: get_qs_env,&
      46              :                                               qs_environment_type,&
      47              :                                               set_qs_env
      48              :    USE qs_harris_types,                 ONLY: harris_type
      49              :    USE qs_harris_utils,                 ONLY: calculate_harris_density
      50              :    USE qs_kind_types,                   ONLY: qs_kind_type
      51              :    USE qs_ks_types,                     ONLY: get_ks_env,&
      52              :                                               qs_ks_env_type
      53              :    USE qs_local_rho_types,              ONLY: local_rho_type
      54              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      55              :    USE qs_oce_types,                    ONLY: oce_matrix_type
      56              :    USE qs_rho_atom_methods,             ONLY: calculate_rho_atom_coeff
      57              :    USE qs_rho_atom_types,               ONLY: rho_atom_type
      58              :    USE qs_rho_types,                    ONLY: qs_rho_clear,&
      59              :                                               qs_rho_get,&
      60              :                                               qs_rho_set,&
      61              :                                               qs_rho_type
      62              :    USE ri_environment_methods,          ONLY: calculate_ri_densities
      63              :    USE task_list_types,                 ONLY: task_list_type
      64              : #include "./base/base_uses.f90"
      65              : 
      66              :    IMPLICIT NONE
      67              :    PRIVATE
      68              : 
      69              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      70              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_rho_methods'
      71              : 
      72              :    PUBLIC :: qs_rho_update_rho, qs_rho_update_tddfpt, &
      73              :              qs_rho_rebuild, qs_rho_copy, qs_rho_scale_and_add, &
      74              :              qs_rho_scale_and_add_b
      75              :    PUBLIC :: duplicate_rho_type, allocate_rho_ao_imag_from_real
      76              : 
      77              : CONTAINS
      78              : 
      79              : ! **************************************************************************************************
      80              : !> \brief rebuilds rho (if necessary allocating and initializing it)
      81              : !> \param rho the rho type to rebuild (defaults to qs_env%rho)
      82              : !> \param qs_env the environment to which rho belongs
      83              : !> \param rebuild_ao if it is necessary to rebuild rho_ao. Defaults to true.
      84              : !> \param rebuild_grids if it in necessary to rebuild rho_r and rho_g.
      85              : !>        Defaults to false.
      86              : !> \param admm (use aux_fit basis)
      87              : !> \param pw_env_external external plane wave environment
      88              : !> \par History
      89              : !>      11.2002 created replacing qs_rho_create and qs_env_rebuild_rho[fawzi]
      90              : !> \author Fawzi Mohamed
      91              : !> \note
      92              : !>      needs updated  pw pools, s, s_mstruct and h in qs_env.
      93              : !>      The use of p to keep the structure of h (needed for the forces)
      94              : !>      is ugly and should be removed.
      95              : !>      Change so that it does not allocate a subcomponent if it is not
      96              : !>      associated and not requested?
      97              : ! **************************************************************************************************
      98        54608 :    SUBROUTINE qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
      99              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho
     100              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     101              :       LOGICAL, INTENT(in), OPTIONAL                      :: rebuild_ao, rebuild_grids, admm
     102              :       TYPE(pw_env_type), OPTIONAL, POINTER               :: pw_env_external
     103              : 
     104              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'qs_rho_rebuild'
     105              : 
     106              :       CHARACTER(LEN=default_string_length)               :: headline
     107              :       INTEGER                                            :: handle, i, ic, j, nimg, nspins
     108              :       LOGICAL                                            :: do_kpoints, my_admm, my_rebuild_ao, &
     109              :                                                             my_rebuild_grids, rho_ao_is_complex
     110        27304 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_r
     111        27304 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_s_kp, rho_ao_im_kp, rho_ao_kp
     112              :       TYPE(dbcsr_type), POINTER                          :: refmatrix, tmatrix
     113              :       TYPE(dft_control_type), POINTER                    :: dft_control
     114              :       TYPE(kpoint_type), POINTER                         :: kpoints
     115              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     116        27304 :          POINTER                                         :: sab_orb
     117        27304 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g, tau_g
     118        27304 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g
     119              :       TYPE(pw_env_type), POINTER                         :: pw_env
     120              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     121        27304 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r, tau_r
     122        27304 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r
     123              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_r_sccs
     124              : 
     125        27304 :       CALL timeset(routineN, handle)
     126              : 
     127        27304 :       NULLIFY (pw_env, auxbas_pw_pool, matrix_s_kp, dft_control)
     128        27304 :       NULLIFY (tot_rho_r, rho_ao_kp, rho_r, rho_g, drho_r, drho_g, tau_r, tau_g, rho_ao_im_kp)
     129        27304 :       NULLIFY (rho_r_sccs)
     130        27304 :       NULLIFY (sab_orb)
     131        27304 :       my_rebuild_ao = .TRUE.
     132        27304 :       my_rebuild_grids = .TRUE.
     133        27304 :       my_admm = .FALSE.
     134        27304 :       IF (PRESENT(rebuild_ao)) my_rebuild_ao = rebuild_ao
     135        27304 :       IF (PRESENT(rebuild_grids)) my_rebuild_grids = rebuild_grids
     136        27304 :       IF (PRESENT(admm)) my_admm = admm
     137              : 
     138              :       CALL get_qs_env(qs_env, &
     139              :                       kpoints=kpoints, &
     140              :                       do_kpoints=do_kpoints, &
     141              :                       pw_env=pw_env, &
     142        27304 :                       dft_control=dft_control)
     143        27304 :       IF (PRESENT(pw_env_external)) &
     144          792 :          pw_env => pw_env_external
     145              : 
     146        27304 :       nimg = dft_control%nimages
     147              : 
     148        27304 :       IF (my_admm) THEN
     149         1868 :          CALL get_admm_env(qs_env%admm_env, sab_aux_fit=sab_orb, matrix_s_aux_fit_kp=matrix_s_kp)
     150              :       ELSE
     151        25436 :          CALL get_qs_env(qs_env, matrix_s_kp=matrix_s_kp)
     152              : 
     153        25436 :          IF (do_kpoints) THEN
     154          928 :             CALL get_kpoint_info(kpoints, sab_nl=sab_orb)
     155              :          ELSE
     156        24508 :             CALL get_qs_env(qs_env, sab_orb=sab_orb)
     157              :          END IF
     158              :       END IF
     159        27304 :       refmatrix => matrix_s_kp(1, 1)%matrix
     160              : 
     161        27304 :       CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
     162        27304 :       nspins = dft_control%nspins
     163              : 
     164              :       CALL qs_rho_get(rho, &
     165              :                       tot_rho_r=tot_rho_r, &
     166              :                       rho_ao_kp=rho_ao_kp, &
     167              :                       rho_ao_im_kp=rho_ao_im_kp, &
     168              :                       rho_r=rho_r, &
     169              :                       rho_g=rho_g, &
     170              :                       drho_r=drho_r, &
     171              :                       drho_g=drho_g, &
     172              :                       tau_r=tau_r, &
     173              :                       tau_g=tau_g, &
     174              :                       rho_r_sccs=rho_r_sccs, &
     175        27304 :                       complex_rho_ao=rho_ao_is_complex)
     176              : 
     177        27304 :       IF (.NOT. ASSOCIATED(tot_rho_r)) THEN
     178        35706 :          ALLOCATE (tot_rho_r(nspins))
     179        26133 :          tot_rho_r = 0.0_dp
     180        11902 :          CALL qs_rho_set(rho, tot_rho_r=tot_rho_r)
     181              :       END IF
     182              : 
     183              :       ! rho_ao
     184        27304 :       IF (my_rebuild_ao .OR. (.NOT. ASSOCIATED(rho_ao_kp))) THEN
     185        25780 :          IF (ASSOCIATED(rho_ao_kp)) &
     186        15392 :             CALL dbcsr_deallocate_matrix_set(rho_ao_kp)
     187              :          ! Create a new density matrix set
     188        25780 :          CALL dbcsr_allocate_matrix_set(rho_ao_kp, nspins, nimg)
     189        25780 :          CALL qs_rho_set(rho, rho_ao_kp=rho_ao_kp)
     190        55012 :          DO i = 1, nspins
     191       186862 :             DO ic = 1, nimg
     192       131850 :                IF (nspins > 1) THEN
     193        27536 :                   IF (i == 1) THEN
     194        13768 :                      headline = "DENSITY MATRIX FOR ALPHA SPIN"
     195              :                   ELSE
     196        13768 :                      headline = "DENSITY MATRIX FOR BETA SPIN"
     197              :                   END IF
     198              :                ELSE
     199       104314 :                   headline = "DENSITY MATRIX"
     200              :                END IF
     201       131850 :                ALLOCATE (rho_ao_kp(i, ic)%matrix)
     202       131850 :                tmatrix => rho_ao_kp(i, ic)%matrix
     203              :                CALL dbcsr_create(matrix=tmatrix, template=refmatrix, name=TRIM(headline), &
     204       131850 :                                  matrix_type=dbcsr_type_symmetric)
     205       131850 :                CALL cp_dbcsr_alloc_block_from_nbl(tmatrix, sab_orb)
     206       161082 :                CALL dbcsr_set(tmatrix, 0.0_dp)
     207              :             END DO
     208              :          END DO
     209        25780 :          IF (rho_ao_is_complex) THEN
     210          328 :             IF (ASSOCIATED(rho_ao_im_kp)) THEN
     211          328 :                CALL dbcsr_deallocate_matrix_set(rho_ao_im_kp)
     212              :             END IF
     213          328 :             CALL dbcsr_allocate_matrix_set(rho_ao_im_kp, nspins, nimg)
     214          328 :             CALL qs_rho_set(rho, rho_ao_im_kp=rho_ao_im_kp)
     215          720 :             DO i = 1, nspins
     216         1112 :                DO ic = 1, nimg
     217          392 :                   IF (nspins > 1) THEN
     218          128 :                      IF (i == 1) THEN
     219           64 :                         headline = "IMAGINARY PART OF DENSITY MATRIX FOR ALPHA SPIN"
     220              :                      ELSE
     221           64 :                         headline = "IMAGINARY PART OF DENSITY MATRIX FOR BETA SPIN"
     222              :                      END IF
     223              :                   ELSE
     224          264 :                      headline = "IMAGINARY PART OF DENSITY MATRIX"
     225              :                   END IF
     226          392 :                   ALLOCATE (rho_ao_im_kp(i, ic)%matrix)
     227          392 :                   tmatrix => rho_ao_im_kp(i, ic)%matrix
     228              :                   CALL dbcsr_create(matrix=tmatrix, template=refmatrix, name=TRIM(headline), &
     229          392 :                                     matrix_type=dbcsr_type_antisymmetric)
     230          392 :                   CALL cp_dbcsr_alloc_block_from_nbl(tmatrix, sab_orb)
     231          784 :                   CALL dbcsr_set(tmatrix, 0.0_dp)
     232              :                END DO
     233              :             END DO
     234              :          END IF
     235              :       END IF
     236              : 
     237              :       ! rho_r
     238        27304 :       IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(rho_r)) THEN
     239        27304 :          IF (ASSOCIATED(rho_r)) THEN
     240        32055 :             DO i = 1, SIZE(rho_r)
     241        32055 :                CALL rho_r(i)%release()
     242              :             END DO
     243        15402 :             DEALLOCATE (rho_r)
     244              :          END IF
     245       112796 :          ALLOCATE (rho_r(nspins))
     246        27304 :          CALL qs_rho_set(rho, rho_r=rho_r)
     247        58188 :          DO i = 1, nspins
     248        58188 :             CALL auxbas_pw_pool%create_pw(rho_r(i))
     249              :          END DO
     250              :       END IF
     251              : 
     252              :       ! rho_g
     253        27304 :       IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(rho_g)) THEN
     254        27304 :          IF (ASSOCIATED(rho_g)) THEN
     255        32055 :             DO i = 1, SIZE(rho_g)
     256        32055 :                CALL rho_g(i)%release()
     257              :             END DO
     258        15402 :             DEALLOCATE (rho_g)
     259              :          END IF
     260       112796 :          ALLOCATE (rho_g(nspins))
     261        27304 :          CALL qs_rho_set(rho, rho_g=rho_g)
     262        58188 :          DO i = 1, nspins
     263        58188 :             CALL auxbas_pw_pool%create_pw(rho_g(i))
     264              :          END DO
     265              :       END IF
     266              : 
     267              :       ! SCCS
     268        27304 :       IF (dft_control%do_sccs) THEN
     269           12 :          IF (my_rebuild_grids .OR. (.NOT. ASSOCIATED(rho_r_sccs))) THEN
     270           12 :             IF (ASSOCIATED(rho_r_sccs)) THEN
     271            2 :                CALL rho_r_sccs%release()
     272            2 :                DEALLOCATE (rho_r_sccs)
     273              :             END IF
     274           12 :             ALLOCATE (rho_r_sccs)
     275           12 :             CALL qs_rho_set(rho, rho_r_sccs=rho_r_sccs)
     276           12 :             CALL auxbas_pw_pool%create_pw(rho_r_sccs)
     277           12 :             CALL pw_zero(rho_r_sccs)
     278              :          END IF
     279              :       END IF
     280              : 
     281              :       ! allocate drho_r and drho_g if xc_deriv_collocate
     282        27304 :       IF (dft_control%drho_by_collocation) THEN
     283              :          ! drho_r
     284            0 :          IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(drho_r)) THEN
     285            0 :             IF (ASSOCIATED(drho_r)) THEN
     286            0 :                DO j = 1, SIZE(drho_r, 2)
     287            0 :                   DO i = 1, SIZE(drho_r, 1)
     288            0 :                      CALL drho_r(i, j)%release()
     289              :                   END DO
     290              :                END DO
     291            0 :                DEALLOCATE (drho_r)
     292              :             END IF
     293            0 :             ALLOCATE (drho_r(3, nspins))
     294            0 :             CALL qs_rho_set(rho, drho_r=drho_r)
     295            0 :             DO j = 1, nspins
     296            0 :                DO i = 1, 3
     297            0 :                   CALL auxbas_pw_pool%create_pw(drho_r(i, j))
     298              :                END DO
     299              :             END DO
     300              :          END IF
     301              :          ! drho_g
     302            0 :          IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(drho_g)) THEN
     303            0 :             IF (ASSOCIATED(drho_g)) THEN
     304            0 :                DO j = 1, SIZE(drho_g, 2)
     305            0 :                   DO i = 1, SIZE(drho_r, 1)
     306            0 :                      CALL drho_g(i, j)%release()
     307              :                   END DO
     308              :                END DO
     309            0 :                DEALLOCATE (drho_g)
     310              :             END IF
     311            0 :             ALLOCATE (drho_g(3, nspins))
     312            0 :             CALL qs_rho_set(rho, drho_g=drho_g)
     313            0 :             DO j = 1, nspins
     314            0 :                DO i = 1, 3
     315            0 :                   CALL auxbas_pw_pool%create_pw(drho_g(i, j))
     316              :                END DO
     317              :             END DO
     318              :          END IF
     319              :       END IF
     320              : 
     321              :       ! allocate tau_r and tau_g if use_kinetic_energy_density
     322        27304 :       IF (dft_control%use_kinetic_energy_density) THEN
     323              :          ! tau_r
     324          404 :          IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(tau_r)) THEN
     325          404 :             IF (ASSOCIATED(tau_r)) THEN
     326          222 :                DO i = 1, SIZE(tau_r)
     327          222 :                   CALL tau_r(i)%release()
     328              :                END DO
     329          108 :                DEALLOCATE (tau_r)
     330              :             END IF
     331         1666 :             ALLOCATE (tau_r(nspins))
     332          404 :             CALL qs_rho_set(rho, tau_r=tau_r)
     333          858 :             DO i = 1, nspins
     334          858 :                CALL auxbas_pw_pool%create_pw(tau_r(i))
     335              :             END DO
     336              :          END IF
     337              : 
     338              :          ! tau_g
     339          404 :          IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(tau_g)) THEN
     340          404 :             IF (ASSOCIATED(tau_g)) THEN
     341          222 :                DO i = 1, SIZE(tau_g)
     342          222 :                   CALL tau_g(i)%release()
     343              :                END DO
     344          108 :                DEALLOCATE (tau_g)
     345              :             END IF
     346         1666 :             ALLOCATE (tau_g(nspins))
     347          404 :             CALL qs_rho_set(rho, tau_g=tau_g)
     348          858 :             DO i = 1, nspins
     349          858 :                CALL auxbas_pw_pool%create_pw(tau_g(i))
     350              :             END DO
     351              :          END IF
     352              :       END IF ! use_kinetic_energy_density
     353              : 
     354        27304 :       CALL timestop(handle)
     355              : 
     356        27304 :    END SUBROUTINE qs_rho_rebuild
     357              : 
     358              : ! **************************************************************************************************
     359              : !> \brief updates rho_r and rho_g to the rho%rho_ao.
     360              : !>      if use_kinetic_energy_density also computes tau_r and tau_g
     361              : !>      this works for all ground state and ground state response methods
     362              : !> \param rho_struct the rho structure that should be updated
     363              : !> \param qs_env the qs_env rho_struct refers to
     364              : !>        the integrated charge in r space
     365              : !> \param rho_xc_external ...
     366              : !> \param local_rho_set ...
     367              : !> \param task_list_external external task list
     368              : !> \param task_list_external_soft external task list (soft_version)
     369              : !> \param pw_env_external    external plane wave environment
     370              : !> \param para_env_external  external MPI environment
     371              : !> \par History
     372              : !>      08.2002 created [fawzi]
     373              : !> \author Fawzi Mohamed
     374              : ! **************************************************************************************************
     375       218729 :    SUBROUTINE qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, &
     376              :                                 task_list_external, task_list_external_soft, &
     377              :                                 pw_env_external, para_env_external)
     378              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho_struct
     379              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     380              :       TYPE(qs_rho_type), OPTIONAL, POINTER               :: rho_xc_external
     381              :       TYPE(local_rho_type), OPTIONAL, POINTER            :: local_rho_set
     382              :       TYPE(task_list_type), OPTIONAL, POINTER            :: task_list_external, &
     383              :                                                             task_list_external_soft
     384              :       TYPE(pw_env_type), OPTIONAL, POINTER               :: pw_env_external
     385              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_external
     386              : 
     387       218729 :       INTEGER, DIMENSION(:, :, :), POINTER               :: cell_to_index
     388       218729 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     389       218729 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao
     390       218729 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao_kp
     391              :       TYPE(dft_control_type), POINTER                    :: dft_control
     392              :       TYPE(harris_type), POINTER                         :: harris_env
     393              :       TYPE(kpoint_type), POINTER                         :: kpoints
     394              :       TYPE(lri_density_type), POINTER                    :: lri_density
     395              :       TYPE(lri_environment_type), POINTER                :: lri_env
     396              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     397              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
     398              : 
     399              :       CALL get_qs_env(qs_env, dft_control=dft_control, &
     400              :                       atomic_kind_set=atomic_kind_set, &
     401       218729 :                       para_env=para_env)
     402       218729 :       IF (PRESENT(para_env_external)) para_env => para_env_external
     403              : 
     404       218729 :       IF (qs_env%harris_method) THEN
     405           42 :          CALL get_qs_env(qs_env, harris_env=harris_env)
     406           42 :          CALL calculate_harris_density(qs_env, harris_env%rhoin, rho_struct)
     407           42 :          CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     408              : 
     409              :       ELSEIF (dft_control%qs_control%semi_empirical .OR. &
     410       218687 :               dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
     411              : 
     412        81076 :          CALL qs_rho_set(rho_struct, rho_r_valid=.FALSE., rho_g_valid=.FALSE.)
     413              : 
     414       137611 :       ELSEIF (dft_control%qs_control%lrigpw) THEN
     415          600 :          CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
     416          600 :          CPASSERT(.NOT. dft_control%drho_by_collocation)
     417          600 :          CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     418          600 :          CALL get_qs_env(qs_env, ks_env=ks_env)
     419          600 :          CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
     420          600 :          CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
     421          600 :          CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density)
     422              :          CALL calculate_lri_densities(lri_env, lri_density, qs_env, rho_ao_kp, cell_to_index, &
     423              :                                       lri_rho_struct=rho_struct, &
     424              :                                       atomic_kind_set=atomic_kind_set, &
     425              :                                       para_env=para_env, &
     426          600 :                                       response_density=.FALSE.)
     427          600 :          CALL set_qs_env(qs_env, lri_density=lri_density)
     428          600 :          CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     429              : 
     430       137011 :       ELSEIF (dft_control%qs_control%rigpw) THEN
     431            0 :          CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
     432            0 :          CPASSERT(.NOT. dft_control%drho_by_collocation)
     433            0 :          CALL get_qs_env(qs_env, lri_env=lri_env)
     434            0 :          CALL qs_rho_get(rho_struct, rho_ao=rho_ao)
     435              :          CALL calculate_ri_densities(lri_env, qs_env, rho_ao, &
     436              :                                      lri_rho_struct=rho_struct, &
     437              :                                      atomic_kind_set=atomic_kind_set, &
     438            0 :                                      para_env=para_env)
     439            0 :          CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     440              : 
     441              :       ELSE
     442              :          CALL qs_rho_update_rho_low(rho_struct=rho_struct, qs_env=qs_env, &
     443              :                                     rho_xc_external=rho_xc_external, &
     444              :                                     local_rho_set=local_rho_set, &
     445              :                                     task_list_external=task_list_external, &
     446              :                                     task_list_external_soft=task_list_external_soft, &
     447              :                                     pw_env_external=pw_env_external, &
     448       137011 :                                     para_env_external=para_env_external)
     449              : 
     450              :       END IF
     451              : 
     452       218729 :    END SUBROUTINE qs_rho_update_rho
     453              : 
     454              : ! **************************************************************************************************
     455              : !> \brief updates rho_r and rho_g to the rho%rho_ao.
     456              : !>      if use_kinetic_energy_density also computes tau_r and tau_g
     457              : !> \param rho_struct the rho structure that should be updated
     458              : !> \param qs_env the qs_env rho_struct refers to
     459              : !>        the integrated charge in r space
     460              : !> \param rho_xc_external rho structure for GAPW_XC
     461              : !> \param local_rho_set ...
     462              : !> \param pw_env_external    external plane wave environment
     463              : !> \param task_list_external external task list (use for default and GAPW)
     464              : !> \param task_list_external_soft external task list (soft density for GAPW_XC)
     465              : !> \param para_env_external ...
     466              : !> \par History
     467              : !>      08.2002 created [fawzi]
     468              : !> \author Fawzi Mohamed
     469              : ! **************************************************************************************************
     470       137011 :    SUBROUTINE qs_rho_update_rho_low(rho_struct, qs_env, rho_xc_external, &
     471              :                                     local_rho_set, pw_env_external, &
     472              :                                     task_list_external, task_list_external_soft, &
     473              :                                     para_env_external)
     474              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho_struct
     475              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     476              :       TYPE(qs_rho_type), OPTIONAL, POINTER               :: rho_xc_external
     477              :       TYPE(local_rho_type), OPTIONAL, POINTER            :: local_rho_set
     478              :       TYPE(pw_env_type), OPTIONAL, POINTER               :: pw_env_external
     479              :       TYPE(task_list_type), OPTIONAL, POINTER            :: task_list_external, &
     480              :                                                             task_list_external_soft
     481              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_external
     482              : 
     483              :       CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_update_rho_low'
     484              : 
     485              :       INTEGER                                            :: handle, img, ispin, nimg, nspins
     486              :       LOGICAL                                            :: gapw, gapw_xc
     487              :       REAL(KIND=dp)                                      :: dum
     488       137011 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_r, tot_rho_r_xc
     489       137011 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     490       137011 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao
     491       137011 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao_kp, rho_xc_ao
     492              :       TYPE(dft_control_type), POINTER                    :: dft_control
     493              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     494              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     495       137011 :          POINTER                                         :: sab
     496              :       TYPE(oce_matrix_type), POINTER                     :: oce
     497       137011 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g, rho_xc_g, tau_g, tau_xc_g
     498       137011 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g, drho_xc_g
     499              :       TYPE(pw_env_type), POINTER                         :: pw_env
     500       137011 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r, rho_xc_r, tau_r, tau_xc_r
     501       137011 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r, drho_xc_r
     502       137011 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     503              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
     504              :       TYPE(qs_rho_type), POINTER                         :: rho_xc
     505       137011 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom_set
     506              :       TYPE(task_list_type), POINTER                      :: task_list
     507              : 
     508       137011 :       CALL timeset(routineN, handle)
     509              : 
     510       137011 :       NULLIFY (dft_control, rho_xc, ks_env, rho_ao, rho_r, rho_g, drho_r, drho_g, tau_r, tau_g)
     511       137011 :       NULLIFY (rho_xc_ao, rho_xc_g, rho_xc_r, drho_xc_g, tau_xc_r, tau_xc_g, tot_rho_r, tot_rho_r_xc)
     512       137011 :       NULLIFY (para_env, pw_env, atomic_kind_set)
     513              : 
     514              :       CALL get_qs_env(qs_env, &
     515              :                       ks_env=ks_env, &
     516              :                       dft_control=dft_control, &
     517       137011 :                       atomic_kind_set=atomic_kind_set)
     518              : 
     519              :       CALL qs_rho_get(rho_struct, &
     520              :                       rho_r=rho_r, &
     521              :                       rho_g=rho_g, &
     522              :                       tot_rho_r=tot_rho_r, &
     523              :                       drho_r=drho_r, &
     524              :                       drho_g=drho_g, &
     525              :                       tau_r=tau_r, &
     526       137011 :                       tau_g=tau_g)
     527              : 
     528              :       CALL get_qs_env(qs_env, task_list=task_list, &
     529       137011 :                       para_env=para_env, pw_env=pw_env)
     530       137011 :       IF (PRESENT(pw_env_external)) pw_env => pw_env_external
     531       137011 :       IF (PRESENT(task_list_external)) task_list => task_list_external
     532       137011 :       IF (PRESENT(para_env_external)) para_env => para_env_external
     533              : 
     534       137011 :       nspins = dft_control%nspins
     535       137011 :       nimg = dft_control%nimages
     536       137011 :       gapw = dft_control%qs_control%gapw
     537       137011 :       gapw_xc = dft_control%qs_control%gapw_xc
     538              : 
     539       137011 :       CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     540       301905 :       DO ispin = 1, nspins
     541       164894 :          rho_ao => rho_ao_kp(ispin, :)
     542              :          CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
     543              :                                  rho=rho_r(ispin), &
     544              :                                  rho_gspace=rho_g(ispin), &
     545              :                                  total_rho=tot_rho_r(ispin), &
     546              :                                  ks_env=ks_env, soft_valid=gapw, &
     547              :                                  task_list_external=task_list_external, &
     548       301905 :                                  pw_env_external=pw_env_external)
     549              :       END DO
     550       137011 :       CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     551              : 
     552       137011 :       IF (gapw_xc) THEN
     553         4330 :          IF (PRESENT(rho_xc_external)) THEN
     554          668 :             rho_xc => rho_xc_external
     555              :          ELSE
     556         3662 :             CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
     557              :          END IF
     558              :          CALL qs_rho_get(rho_xc, &
     559              :                          rho_ao_kp=rho_xc_ao, &
     560              :                          rho_r=rho_xc_r, &
     561              :                          rho_g=rho_xc_g, &
     562         4330 :                          tot_rho_r=tot_rho_r_xc)
     563              :          ! copy rho_ao into rho_xc_ao
     564         9078 :          DO ispin = 1, nspins
     565        15854 :             DO img = 1, nimg
     566        11524 :                CALL dbcsr_copy(rho_xc_ao(ispin, img)%matrix, rho_ao_kp(ispin, img)%matrix)
     567              :             END DO
     568              :          END DO
     569         9078 :          DO ispin = 1, nspins
     570         4748 :             rho_ao => rho_xc_ao(ispin, :)
     571              :             CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
     572              :                                     rho=rho_xc_r(ispin), &
     573              :                                     rho_gspace=rho_xc_g(ispin), &
     574              :                                     total_rho=tot_rho_r_xc(ispin), &
     575              :                                     ks_env=ks_env, soft_valid=gapw_xc, &
     576              :                                     task_list_external=task_list_external_soft, &
     577         9078 :                                     pw_env_external=pw_env_external)
     578              :          END DO
     579         4330 :          CALL qs_rho_set(rho_xc, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     580              :       END IF
     581              : 
     582              :       ! GAPW o GAPW_XC require the calculation of hard and soft local densities
     583       137011 :       IF (gapw .OR. gapw_xc) THEN
     584              :          CALL get_qs_env(qs_env=qs_env, &
     585              :                          rho_atom_set=rho_atom_set, &
     586              :                          qs_kind_set=qs_kind_set, &
     587        23006 :                          oce=oce, sab_orb=sab)
     588        23006 :          IF (PRESENT(local_rho_set)) rho_atom_set => local_rho_set%rho_atom_set
     589        23006 :          CPASSERT(ASSOCIATED(rho_atom_set))
     590        23006 :          CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     591        23006 :          CALL calculate_rho_atom_coeff(qs_env, rho_ao_kp, rho_atom_set, qs_kind_set, oce, sab, para_env)
     592              :       END IF
     593              : 
     594       137011 :       IF (.NOT. gapw_xc) THEN
     595              :          ! if needed compute also the gradient of the density
     596       132681 :          IF (dft_control%drho_by_collocation) THEN
     597            0 :             CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     598            0 :             CPASSERT(.NOT. PRESENT(task_list_external))
     599            0 :             DO ispin = 1, nspins
     600            0 :                rho_ao => rho_ao_kp(ispin, :)
     601              :                CALL calculate_drho_elec(matrix_p_kp=rho_ao, &
     602              :                                         drho=drho_r(:, ispin), &
     603              :                                         drho_gspace=drho_g(:, ispin), &
     604            0 :                                         qs_env=qs_env, soft_valid=gapw)
     605              :             END DO
     606            0 :             CALL qs_rho_set(rho_struct, drho_r_valid=.TRUE., drho_g_valid=.TRUE.)
     607              :          END IF
     608              :          ! if needed compute also the kinetic energy density
     609       132681 :          IF (dft_control%use_kinetic_energy_density) THEN
     610         3958 :             CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     611         8536 :             DO ispin = 1, nspins
     612         4578 :                rho_ao => rho_ao_kp(ispin, :)
     613              :                CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
     614              :                                        rho=tau_r(ispin), &
     615              :                                        rho_gspace=tau_g(ispin), &
     616              :                                        total_rho=dum, & ! presumably not meaningful
     617              :                                        ks_env=ks_env, soft_valid=gapw, &
     618              :                                        compute_tau=.TRUE., &
     619              :                                        task_list_external=task_list_external, &
     620         8536 :                                        pw_env_external=pw_env_external)
     621              :             END DO
     622         3958 :             CALL qs_rho_set(rho_struct, tau_r_valid=.TRUE., tau_g_valid=.TRUE.)
     623              :          END IF
     624              :       ELSE
     625              :          CALL qs_rho_get(rho_xc, &
     626              :                          drho_r=drho_xc_r, &
     627              :                          drho_g=drho_xc_g, &
     628              :                          tau_r=tau_xc_r, &
     629         4330 :                          tau_g=tau_xc_g)
     630              :          ! if needed compute also the gradient of the density
     631         4330 :          IF (dft_control%drho_by_collocation) THEN
     632            0 :             CPASSERT(.NOT. PRESENT(task_list_external))
     633            0 :             DO ispin = 1, nspins
     634            0 :                rho_ao => rho_xc_ao(ispin, :)
     635              :                CALL calculate_drho_elec(matrix_p_kp=rho_ao, &
     636              :                                         drho=drho_xc_r(:, ispin), &
     637              :                                         drho_gspace=drho_xc_g(:, ispin), &
     638            0 :                                         qs_env=qs_env, soft_valid=gapw_xc)
     639              :             END DO
     640            0 :             CALL qs_rho_set(rho_xc, drho_r_valid=.TRUE., drho_g_valid=.TRUE.)
     641              :          END IF
     642              :          ! if needed compute also the kinetic energy density
     643         4330 :          IF (dft_control%use_kinetic_energy_density) THEN
     644          616 :             DO ispin = 1, nspins
     645          308 :                rho_ao => rho_xc_ao(ispin, :)
     646              :                CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
     647              :                                        rho=tau_xc_r(ispin), &
     648              :                                        rho_gspace=tau_xc_g(ispin), &
     649              :                                        ks_env=ks_env, soft_valid=gapw_xc, &
     650              :                                        compute_tau=.TRUE., &
     651              :                                        task_list_external=task_list_external_soft, &
     652          616 :                                        pw_env_external=pw_env_external)
     653              :             END DO
     654          308 :             CALL qs_rho_set(rho_xc, tau_r_valid=.TRUE., tau_g_valid=.TRUE.)
     655              :          END IF
     656              :       END IF
     657              : 
     658       137011 :       CALL timestop(handle)
     659              : 
     660       137011 :    END SUBROUTINE qs_rho_update_rho_low
     661              : 
     662              : ! **************************************************************************************************
     663              : !> \brief updates rho_r and rho_g to the rho%rho_ao.
     664              : !>      if use_kinetic_energy_density also computes tau_r and tau_g
     665              : !> \param rho_struct the rho structure that should be updated
     666              : !> \param qs_env the qs_env rho_struct refers to
     667              : !>        the integrated charge in r space
     668              : !> \param pw_env_external    external plane wave environment
     669              : !> \param task_list_external external task list
     670              : !> \param para_env_external ...
     671              : !> \param tddfpt_lri_env ...
     672              : !> \param tddfpt_lri_density ...
     673              : !> \par History
     674              : !>      08.2002 created [fawzi]
     675              : !> \author Fawzi Mohamed
     676              : ! **************************************************************************************************
     677          172 :    SUBROUTINE qs_rho_update_tddfpt(rho_struct, qs_env, pw_env_external, task_list_external, &
     678              :                                    para_env_external, tddfpt_lri_env, tddfpt_lri_density)
     679              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho_struct
     680              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     681              :       TYPE(pw_env_type), OPTIONAL, POINTER               :: pw_env_external
     682              :       TYPE(task_list_type), OPTIONAL, POINTER            :: task_list_external
     683              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_external
     684              :       TYPE(lri_environment_type), OPTIONAL, POINTER      :: tddfpt_lri_env
     685              :       TYPE(lri_density_type), OPTIONAL, POINTER          :: tddfpt_lri_density
     686              : 
     687              :       CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_update_tddfpt'
     688              : 
     689              :       INTEGER                                            :: handle, ispin, nspins
     690          172 :       INTEGER, DIMENSION(:, :, :), POINTER               :: cell_to_index
     691              :       LOGICAL                                            :: lri_response
     692          172 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_r
     693          172 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     694          172 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao
     695          172 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao_kp
     696              :       TYPE(dft_control_type), POINTER                    :: dft_control
     697              :       TYPE(kpoint_type), POINTER                         :: kpoints
     698              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     699          172 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
     700              :       TYPE(pw_env_type), POINTER                         :: pw_env
     701          172 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r
     702              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
     703              :       TYPE(task_list_type), POINTER                      :: task_list
     704              : 
     705          172 :       CALL timeset(routineN, handle)
     706              : 
     707              :       CALL get_qs_env(qs_env, &
     708              :                       ks_env=ks_env, &
     709              :                       dft_control=dft_control, &
     710              :                       atomic_kind_set=atomic_kind_set, &
     711              :                       task_list=task_list, &
     712              :                       para_env=para_env, &
     713          172 :                       pw_env=pw_env)
     714          172 :       IF (PRESENT(pw_env_external)) pw_env => pw_env_external
     715          172 :       IF (PRESENT(task_list_external)) task_list => task_list_external
     716          172 :       IF (PRESENT(para_env_external)) para_env => para_env_external
     717              : 
     718              :       CALL qs_rho_get(rho_struct, &
     719              :                       rho_r=rho_r, &
     720              :                       rho_g=rho_g, &
     721          172 :                       tot_rho_r=tot_rho_r)
     722              : 
     723          172 :       nspins = dft_control%nspins
     724              : 
     725          172 :       lri_response = PRESENT(tddfpt_lri_env)
     726          172 :       IF (lri_response) THEN
     727          172 :          CPASSERT(PRESENT(tddfpt_lri_density))
     728              :       END IF
     729              : 
     730          172 :       CPASSERT(.NOT. dft_control%drho_by_collocation)
     731          172 :       CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
     732          172 :       CPASSERT(.NOT. dft_control%qs_control%gapw)
     733          172 :       CPASSERT(.NOT. dft_control%qs_control%gapw_xc)
     734              : 
     735          172 :       IF (lri_response) THEN
     736          172 :          CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
     737          172 :          CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
     738          172 :          CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     739              :          CALL calculate_lri_densities(tddfpt_lri_env, tddfpt_lri_density, qs_env, rho_ao_kp, cell_to_index, &
     740              :                                       lri_rho_struct=rho_struct, &
     741              :                                       atomic_kind_set=atomic_kind_set, &
     742              :                                       para_env=para_env, &
     743          172 :                                       response_density=lri_response)
     744          172 :          CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     745              :       ELSE
     746            0 :          CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
     747            0 :          DO ispin = 1, nspins
     748            0 :             rho_ao => rho_ao_kp(ispin, :)
     749              :             CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
     750              :                                     rho=rho_r(ispin), &
     751              :                                     rho_gspace=rho_g(ispin), &
     752              :                                     total_rho=tot_rho_r(ispin), &
     753              :                                     ks_env=ks_env, &
     754              :                                     task_list_external=task_list_external, &
     755            0 :                                     pw_env_external=pw_env_external)
     756              :          END DO
     757            0 :          CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
     758              :       END IF
     759              : 
     760          172 :       CALL timestop(handle)
     761              : 
     762          172 :    END SUBROUTINE qs_rho_update_tddfpt
     763              : 
     764              : ! **************************************************************************************************
     765              : !> \brief Allocate a density structure and fill it with data from an input structure
     766              : !>        SIZE(rho_input) == mspin == 1  direct copy
     767              : !>        SIZE(rho_input) == mspin == 2  direct copy of alpha and beta spin
     768              : !>        SIZE(rho_input) == 1 AND mspin == 2  copy rho/2 into alpha and beta spin
     769              : !> \param rho_input ...
     770              : !> \param rho_output ...
     771              : !> \param auxbas_pw_pool ...
     772              : !> \param mspin ...
     773              : ! **************************************************************************************************
     774        26328 :    SUBROUTINE qs_rho_copy(rho_input, rho_output, auxbas_pw_pool, mspin)
     775              : 
     776              :       TYPE(qs_rho_type), INTENT(IN)                      :: rho_input
     777              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho_output
     778              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     779              :       INTEGER, INTENT(IN)                                :: mspin
     780              : 
     781              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'qs_rho_copy'
     782              : 
     783              :       INTEGER                                            :: handle, i, j, nspins
     784              :       LOGICAL :: complex_rho_ao, drho_g_valid_in, drho_r_valid_in, rho_g_valid_in, rho_r_valid_in, &
     785              :          soft_valid_in, tau_g_valid_in, tau_r_valid_in
     786              :       REAL(KIND=dp)                                      :: ospin
     787        13164 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_g_in, tot_rho_g_out, &
     788        13164 :                                                             tot_rho_r_in, tot_rho_r_out
     789        13164 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao_im_in, rho_ao_im_out, rho_ao_in, &
     790        13164 :                                                             rho_ao_out
     791        13164 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao_kp_in
     792        13164 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g_in, rho_g_out, tau_g_in, tau_g_out
     793        13164 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g_in, drho_g_out
     794        13164 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r_in, rho_r_out, tau_r_in, tau_r_out
     795        13164 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r_in, drho_r_out
     796              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_r_sccs_in, rho_r_sccs_out
     797              : 
     798        13164 :       CALL timeset(routineN, handle)
     799              : 
     800        13164 :       CPASSERT(mspin == 1 .OR. mspin == 2)
     801        13164 :       ospin = 1._dp/REAL(mspin, KIND=dp)
     802              : 
     803        13164 :       CALL qs_rho_clear(rho_output)
     804              : 
     805        13164 :       NULLIFY (rho_ao_in, rho_ao_kp_in, rho_ao_im_in, rho_r_in, rho_g_in, drho_r_in, &
     806        13164 :                drho_g_in, tau_r_in, tau_g_in, tot_rho_r_in, tot_rho_g_in, rho_r_sccs_in)
     807              : 
     808              :       CALL qs_rho_get(rho_input, &
     809              :                       rho_ao=rho_ao_in, &
     810              :                       rho_ao_kp=rho_ao_kp_in, &
     811              :                       rho_ao_im=rho_ao_im_in, &
     812              :                       rho_r=rho_r_in, &
     813              :                       rho_g=rho_g_in, &
     814              :                       drho_r=drho_r_in, &
     815              :                       drho_g=drho_g_in, &
     816              :                       tau_r=tau_r_in, &
     817              :                       tau_g=tau_g_in, &
     818              :                       tot_rho_r=tot_rho_r_in, &
     819              :                       tot_rho_g=tot_rho_g_in, &
     820              :                       rho_g_valid=rho_g_valid_in, &
     821              :                       rho_r_valid=rho_r_valid_in, &
     822              :                       drho_g_valid=drho_g_valid_in, &
     823              :                       drho_r_valid=drho_r_valid_in, &
     824              :                       tau_r_valid=tau_r_valid_in, &
     825              :                       tau_g_valid=tau_g_valid_in, &
     826              :                       rho_r_sccs=rho_r_sccs_in, &
     827              :                       soft_valid=soft_valid_in, &
     828        13164 :                       complex_rho_ao=complex_rho_ao)
     829              : 
     830        13164 :       NULLIFY (rho_ao_out, rho_ao_im_out, rho_r_out, rho_g_out, drho_r_out, &
     831        13164 :                drho_g_out, tau_r_out, tau_g_out, tot_rho_r_out, tot_rho_g_out, rho_r_sccs_out)
     832              :       ! rho_ao
     833        13164 :       IF (ASSOCIATED(rho_ao_in)) THEN
     834        13164 :          nspins = SIZE(rho_ao_in)
     835        13164 :          CPASSERT(mspin >= nspins)
     836        13164 :          CALL dbcsr_allocate_matrix_set(rho_ao_out, mspin)
     837        13164 :          CALL qs_rho_set(rho_output, rho_ao=rho_ao_out)
     838        13164 :          IF (mspin > nspins) THEN
     839         2772 :             DO i = 1, mspin
     840         1848 :                ALLOCATE (rho_ao_out(i)%matrix)
     841         1848 :                CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(1)%matrix, name="RHO copy")
     842         2772 :                CALL dbcsr_scale(rho_ao_out(i)%matrix, ospin)
     843              :             END DO
     844              :          ELSE
     845        26592 :             DO i = 1, nspins
     846        14352 :                ALLOCATE (rho_ao_out(i)%matrix)
     847        26592 :                CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(i)%matrix, name="RHO copy")
     848              :             END DO
     849              :          END IF
     850              :       END IF
     851              : 
     852              :       ! rho_ao_kp
     853              :       ! only for non-kp, we could probably just copy this pointer, should work also for non-kp?
     854              :       !IF (ASSOCIATED(rho_ao_kp_in)) THEN
     855              :       !   CPABORT("Copy not available")
     856              :       !END IF
     857              : 
     858              :       ! rho_ao_im
     859        13164 :       IF (ASSOCIATED(rho_ao_im_in)) THEN
     860            0 :          nspins = SIZE(rho_ao_im_in)
     861            0 :          CPASSERT(mspin >= nspins)
     862            0 :          CALL dbcsr_allocate_matrix_set(rho_ao_im_out, mspin)
     863            0 :          CALL qs_rho_set(rho_output, rho_ao_im=rho_ao_im_out)
     864            0 :          IF (mspin > nspins) THEN
     865            0 :             DO i = 1, mspin
     866            0 :                ALLOCATE (rho_ao_im_out(i)%matrix)
     867            0 :                CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(1)%matrix, name="RHO copy")
     868            0 :                CALL dbcsr_scale(rho_ao_im_out(i)%matrix, ospin)
     869              :             END DO
     870              :          ELSE
     871            0 :             DO i = 1, nspins
     872            0 :                ALLOCATE (rho_ao_im_out(i)%matrix)
     873            0 :                CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(i)%matrix, name="RHO copy")
     874              :             END DO
     875              :          END IF
     876              :       END IF
     877              : 
     878              :       ! rho_r
     879        13164 :       IF (ASSOCIATED(rho_r_in)) THEN
     880        13164 :          nspins = SIZE(rho_r_in)
     881        13164 :          CPASSERT(mspin >= nspins)
     882        55692 :          ALLOCATE (rho_r_out(mspin))
     883        13164 :          CALL qs_rho_set(rho_output, rho_r=rho_r_out)
     884        13164 :          IF (mspin > nspins) THEN
     885         2772 :             DO i = 1, mspin
     886         1848 :                CALL auxbas_pw_pool%create_pw(rho_r_out(i))
     887         1848 :                CALL pw_copy(rho_r_in(1), rho_r_out(i))
     888         2772 :                CALL pw_scale(rho_r_out(i), ospin)
     889              :             END DO
     890              :          ELSE
     891        26592 :             DO i = 1, nspins
     892        14352 :                CALL auxbas_pw_pool%create_pw(rho_r_out(i))
     893        26592 :                CALL pw_copy(rho_r_in(i), rho_r_out(i))
     894              :             END DO
     895              :          END IF
     896              :       END IF
     897              : 
     898              :       ! rho_g
     899        13164 :       IF (ASSOCIATED(rho_g_in)) THEN
     900        13164 :          nspins = SIZE(rho_g_in)
     901        13164 :          CPASSERT(mspin >= nspins)
     902        55692 :          ALLOCATE (rho_g_out(mspin))
     903        13164 :          CALL qs_rho_set(rho_output, rho_g=rho_g_out)
     904        13164 :          IF (mspin > nspins) THEN
     905         2772 :             DO i = 1, mspin
     906         1848 :                CALL auxbas_pw_pool%create_pw(rho_g_out(i))
     907         1848 :                CALL pw_copy(rho_g_in(1), rho_g_out(i))
     908         2772 :                CALL pw_scale(rho_g_out(i), ospin)
     909              :             END DO
     910              :          ELSE
     911        26592 :             DO i = 1, nspins
     912        14352 :                CALL auxbas_pw_pool%create_pw(rho_g_out(i))
     913        26592 :                CALL pw_copy(rho_g_in(i), rho_g_out(i))
     914              :             END DO
     915              :          END IF
     916              :       END IF
     917              : 
     918              :       ! SCCS
     919        13164 :       IF (ASSOCIATED(rho_r_sccs_in)) THEN
     920            0 :          CALL qs_rho_set(rho_output, rho_r_sccs=rho_r_sccs_out)
     921            0 :          CALL auxbas_pw_pool%create_pw(rho_r_sccs_out)
     922            0 :          CALL pw_copy(rho_r_sccs_in, rho_r_sccs_out)
     923              :       END IF
     924              : 
     925              :       ! drho_r
     926        13164 :       IF (ASSOCIATED(drho_r_in)) THEN
     927            0 :          nspins = SIZE(drho_r_in)
     928            0 :          CPASSERT(mspin >= nspins)
     929            0 :          ALLOCATE (drho_r_out(3, mspin))
     930            0 :          CALL qs_rho_set(rho_output, drho_r=drho_r_out)
     931            0 :          IF (mspin > nspins) THEN
     932            0 :             DO j = 1, mspin
     933            0 :                DO i = 1, 3
     934            0 :                   CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
     935            0 :                   CALL pw_copy(drho_r_in(i, 1), drho_r_out(i, j))
     936            0 :                   CALL pw_scale(drho_r_out(i, j), ospin)
     937              :                END DO
     938              :             END DO
     939              :          ELSE
     940            0 :             DO j = 1, nspins
     941            0 :                DO i = 1, 3
     942            0 :                   CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
     943            0 :                   CALL pw_copy(drho_r_in(i, j), drho_r_out(i, j))
     944              :                END DO
     945              :             END DO
     946              :          END IF
     947              :       END IF
     948              : 
     949              :       ! drho_g
     950        13164 :       IF (ASSOCIATED(drho_g_in)) THEN
     951            0 :          nspins = SIZE(drho_g_in)
     952            0 :          CPASSERT(mspin >= nspins)
     953            0 :          ALLOCATE (drho_g_out(3, mspin))
     954            0 :          CALL qs_rho_set(rho_output, drho_g=drho_g_out)
     955            0 :          IF (mspin > nspins) THEN
     956            0 :             DO j = 1, mspin
     957            0 :                DO i = 1, 3
     958            0 :                   CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
     959            0 :                   CALL pw_copy(drho_g_in(i, 1), drho_g_out(i, j))
     960            0 :                   CALL pw_scale(drho_g_out(i, j), ospin)
     961              :                END DO
     962              :             END DO
     963              :          ELSE
     964            0 :             DO j = 1, nspins
     965            0 :                DO i = 1, 3
     966            0 :                   CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
     967            0 :                   CALL pw_copy(drho_g_in(i, j), drho_g_out(i, j))
     968              :                END DO
     969              :             END DO
     970              :          END IF
     971              :       END IF
     972              : 
     973              :       ! tau_r
     974        13164 :       IF (ASSOCIATED(tau_r_in)) THEN
     975            0 :          nspins = SIZE(tau_r_in)
     976            0 :          CPASSERT(mspin >= nspins)
     977            0 :          ALLOCATE (tau_r_out(mspin))
     978            0 :          CALL qs_rho_set(rho_output, tau_r=tau_r_out)
     979            0 :          IF (mspin > nspins) THEN
     980            0 :             DO i = 1, mspin
     981            0 :                CALL auxbas_pw_pool%create_pw(tau_r_out(i))
     982            0 :                CALL pw_copy(tau_r_in(1), tau_r_out(i))
     983            0 :                CALL pw_scale(tau_r_out(i), ospin)
     984              :             END DO
     985              :          ELSE
     986            0 :             DO i = 1, nspins
     987            0 :                CALL auxbas_pw_pool%create_pw(tau_r_out(i))
     988            0 :                CALL pw_copy(tau_r_in(i), tau_r_out(i))
     989              :             END DO
     990              :          END IF
     991              :       END IF
     992              : 
     993              :       ! tau_g
     994        13164 :       IF (ASSOCIATED(tau_g_in)) THEN
     995            0 :          nspins = SIZE(tau_g_in)
     996            0 :          CPASSERT(mspin >= nspins)
     997            0 :          ALLOCATE (tau_g_out(mspin))
     998            0 :          CALL qs_rho_set(rho_output, tau_g=tau_g_out)
     999            0 :          IF (mspin > nspins) THEN
    1000            0 :             DO i = 1, mspin
    1001            0 :                CALL auxbas_pw_pool%create_pw(tau_g_out(i))
    1002            0 :                CALL pw_copy(tau_g_in(1), tau_g_out(i))
    1003            0 :                CALL pw_scale(tau_g_out(i), ospin)
    1004              :             END DO
    1005              :          ELSE
    1006            0 :             DO i = 1, nspins
    1007            0 :                CALL auxbas_pw_pool%create_pw(tau_g_out(i))
    1008            0 :                CALL pw_copy(tau_g_in(i), tau_g_out(i))
    1009              :             END DO
    1010              :          END IF
    1011              :       END IF
    1012              : 
    1013              :       ! tot_rho_r
    1014        13164 :       IF (ASSOCIATED(tot_rho_r_in)) THEN
    1015        13164 :          nspins = SIZE(tot_rho_r_in)
    1016        13164 :          CPASSERT(mspin >= nspins)
    1017        39492 :          ALLOCATE (tot_rho_r_out(mspin))
    1018        13164 :          CALL qs_rho_set(rho_output, tot_rho_r=tot_rho_r_out)
    1019        13164 :          IF (mspin > nspins) THEN
    1020         2772 :             DO i = 1, mspin
    1021         2772 :                tot_rho_r_out(i) = tot_rho_r_in(1)*ospin
    1022              :             END DO
    1023              :          ELSE
    1024        26592 :             DO i = 1, nspins
    1025        26592 :                tot_rho_r_out(i) = tot_rho_r_in(i)
    1026              :             END DO
    1027              :          END IF
    1028              :       END IF
    1029              : 
    1030              :       ! tot_rho_g
    1031        13164 :       IF (ASSOCIATED(tot_rho_g_in)) THEN
    1032            0 :          nspins = SIZE(tot_rho_g_in)
    1033            0 :          CPASSERT(mspin >= nspins)
    1034            0 :          ALLOCATE (tot_rho_g_out(mspin))
    1035            0 :          CALL qs_rho_set(rho_output, tot_rho_g=tot_rho_g_out)
    1036            0 :          IF (mspin > nspins) THEN
    1037            0 :             DO i = 1, mspin
    1038            0 :                tot_rho_g_out(i) = tot_rho_g_in(1)*ospin
    1039              :             END DO
    1040              :          ELSE
    1041            0 :             DO i = 1, nspins
    1042            0 :                tot_rho_g_out(i) = tot_rho_g_in(i)
    1043              :             END DO
    1044              :          END IF
    1045              :       END IF
    1046              : 
    1047              :       CALL qs_rho_set(rho_output, &
    1048              :                       rho_g_valid=rho_g_valid_in, &
    1049              :                       rho_r_valid=rho_r_valid_in, &
    1050              :                       drho_g_valid=drho_g_valid_in, &
    1051              :                       drho_r_valid=drho_r_valid_in, &
    1052              :                       tau_r_valid=tau_r_valid_in, &
    1053              :                       tau_g_valid=tau_g_valid_in, &
    1054              :                       soft_valid=soft_valid_in, &
    1055        13164 :                       complex_rho_ao=complex_rho_ao)
    1056              : 
    1057        13164 :       CALL timestop(handle)
    1058              : 
    1059        13164 :    END SUBROUTINE qs_rho_copy
    1060              : 
    1061              : ! **************************************************************************************************
    1062              : !> \brief rhoa(2) = alpha*rhoa(2)+beta*rhob(1)
    1063              : !> \param rhoa ...
    1064              : !> \param rhob ...
    1065              : !> \param alpha ...
    1066              : !> \param beta ...
    1067              : ! **************************************************************************************************
    1068           48 :    SUBROUTINE qs_rho_scale_and_add_b(rhoa, rhob, alpha, beta)
    1069              : 
    1070              :       TYPE(qs_rho_type), INTENT(IN)                      :: rhoa, rhob
    1071              :       REAL(KIND=dp), INTENT(IN)                          :: alpha, beta
    1072              : 
    1073              :       CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_scale_and_add_b'
    1074              : 
    1075              :       INTEGER                                            :: handle
    1076           48 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_g_a, tot_rho_g_b, tot_rho_r_a, &
    1077           48 :                                                             tot_rho_r_b
    1078           48 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao_a, rho_ao_b, rho_ao_im_a, &
    1079           48 :                                                             rho_ao_im_b
    1080           48 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g_a, rho_g_b, tau_g_a, tau_g_b
    1081           48 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g_a, drho_g_b
    1082           48 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r_a, rho_r_b, tau_r_a, tau_r_b
    1083           48 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r_a, drho_r_b
    1084              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_r_sccs_a, rho_r_sccs_b
    1085              : 
    1086           48 :       CALL timeset(routineN, handle)
    1087              : 
    1088           48 :       NULLIFY (rho_ao_a, rho_ao_im_a, rho_r_a, rho_g_a, drho_r_a, &
    1089           48 :                drho_g_a, tau_r_a, tau_g_a, tot_rho_r_a, tot_rho_g_a, rho_r_sccs_a)
    1090              : 
    1091              :       CALL qs_rho_get(rhoa, &
    1092              :                       rho_ao=rho_ao_a, &
    1093              :                       rho_ao_im=rho_ao_im_a, &
    1094              :                       rho_r=rho_r_a, &
    1095              :                       rho_g=rho_g_a, &
    1096              :                       drho_r=drho_r_a, &
    1097              :                       drho_g=drho_g_a, &
    1098              :                       tau_r=tau_r_a, &
    1099              :                       tau_g=tau_g_a, &
    1100              :                       tot_rho_r=tot_rho_r_a, &
    1101              :                       tot_rho_g=tot_rho_g_a, &
    1102           48 :                       rho_r_sccs=rho_r_sccs_a)
    1103              : 
    1104           48 :       NULLIFY (rho_ao_b, rho_ao_im_b, rho_r_b, rho_g_b, drho_r_b, &
    1105           48 :                drho_g_b, tau_r_b, tau_g_b, tot_rho_r_b, tot_rho_g_b, rho_r_sccs_b)
    1106              : 
    1107              :       CALL qs_rho_get(rhob, &
    1108              :                       rho_ao=rho_ao_b, &
    1109              :                       rho_ao_im=rho_ao_im_b, &
    1110              :                       rho_r=rho_r_b, &
    1111              :                       rho_g=rho_g_b, &
    1112              :                       drho_r=drho_r_b, &
    1113              :                       drho_g=drho_g_b, &
    1114              :                       tau_r=tau_r_b, &
    1115              :                       tau_g=tau_g_b, &
    1116              :                       tot_rho_r=tot_rho_r_b, &
    1117              :                       tot_rho_g=tot_rho_g_b, &
    1118           48 :                       rho_r_sccs=rho_r_sccs_b)
    1119              :       ! rho_ao
    1120           48 :       IF (ASSOCIATED(rho_ao_a) .AND. ASSOCIATED(rho_ao_b)) THEN
    1121           48 :          CALL dbcsr_add(rho_ao_a(2)%matrix, rho_ao_b(1)%matrix, alpha, beta)
    1122              :       END IF
    1123              : 
    1124              :       ! rho_ao_im
    1125           48 :       IF (ASSOCIATED(rho_ao_im_a) .AND. ASSOCIATED(rho_ao_im_b)) THEN
    1126            0 :          CALL dbcsr_add(rho_ao_im_a(2)%matrix, rho_ao_im_b(1)%matrix, alpha, beta)
    1127              :       END IF
    1128              : 
    1129              :       ! rho_r
    1130           48 :       IF (ASSOCIATED(rho_r_a) .AND. ASSOCIATED(rho_r_b)) THEN
    1131           48 :          CALL pw_axpy(rho_r_b(1), rho_r_a(2), beta, alpha)
    1132              :       END IF
    1133              : 
    1134              :       ! rho_g
    1135           48 :       IF (ASSOCIATED(rho_g_a) .AND. ASSOCIATED(rho_g_b)) THEN
    1136           48 :          CALL pw_axpy(rho_g_b(1), rho_g_a(2), beta, alpha)
    1137              :       END IF
    1138              : 
    1139              :       ! SCCS
    1140           48 :       IF (ASSOCIATED(rho_r_sccs_a) .AND. ASSOCIATED(rho_r_sccs_b)) THEN
    1141            0 :          CALL pw_axpy(rho_r_sccs_b, rho_r_sccs_a, beta, alpha)
    1142              :       END IF
    1143              : 
    1144              :       ! drho_r
    1145           48 :       IF (ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) THEN
    1146              :          CPASSERT(ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) ! not implemented
    1147              :       END IF
    1148              : 
    1149              :       ! drho_g
    1150           48 :       IF (ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) THEN
    1151              :          CPASSERT(ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) ! not implemented
    1152              :       END IF
    1153              : 
    1154              :       ! tau_r
    1155           48 :       IF (ASSOCIATED(tau_r_a) .AND. ASSOCIATED(tau_r_b)) THEN
    1156            0 :          CALL pw_axpy(tau_r_b(1), tau_r_a(2), beta, alpha)
    1157              :       END IF
    1158              : 
    1159              :       ! tau_g
    1160           48 :       IF (ASSOCIATED(tau_g_a) .AND. ASSOCIATED(tau_g_b)) THEN
    1161            0 :          CALL pw_axpy(tau_g_b(1), tau_g_a(2), beta, alpha)
    1162              :       END IF
    1163              : 
    1164              :       ! tot_rho_r
    1165           48 :       IF (ASSOCIATED(tot_rho_r_a) .AND. ASSOCIATED(tot_rho_r_b)) THEN
    1166            0 :          tot_rho_r_a(2) = alpha*tot_rho_r_a(2) + beta*tot_rho_r_b(1)
    1167              :       END IF
    1168              : 
    1169              :       ! tot_rho_g
    1170           48 :       IF (ASSOCIATED(tot_rho_g_a) .AND. ASSOCIATED(tot_rho_g_b)) THEN
    1171            0 :          tot_rho_g_a(2) = alpha*tot_rho_g_a(2) + beta*tot_rho_g_b(1)
    1172              :       END IF
    1173              : 
    1174           48 :       CALL timestop(handle)
    1175              : 
    1176           48 :    END SUBROUTINE qs_rho_scale_and_add_b
    1177              : 
    1178              : ! **************************************************************************************************
    1179              : !> \brief rhoa = alpha*rhoa+beta*rhob
    1180              : !> \param rhoa ...
    1181              : !> \param rhob ...
    1182              : !> \param alpha ...
    1183              : !> \param beta ...
    1184              : ! **************************************************************************************************
    1185        13080 :    SUBROUTINE qs_rho_scale_and_add(rhoa, rhob, alpha, beta)
    1186              : 
    1187              :       TYPE(qs_rho_type), INTENT(IN)                      :: rhoa, rhob
    1188              :       REAL(KIND=dp), INTENT(IN)                          :: alpha, beta
    1189              : 
    1190              :       CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_scale_and_add'
    1191              : 
    1192              :       INTEGER                                            :: handle, i, j, nspina, nspinb, nspins
    1193        13080 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_g_a, tot_rho_g_b, tot_rho_r_a, &
    1194        13080 :                                                             tot_rho_r_b
    1195        13080 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao_a, rho_ao_b, rho_ao_im_a, &
    1196        13080 :                                                             rho_ao_im_b
    1197        13080 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g_a, rho_g_b, tau_g_a, tau_g_b
    1198        13080 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g_a, drho_g_b
    1199        13080 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r_a, rho_r_b, tau_r_a, tau_r_b
    1200        13080 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r_a, drho_r_b
    1201              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_r_sccs_a, rho_r_sccs_b
    1202              : 
    1203        13080 :       CALL timeset(routineN, handle)
    1204              : 
    1205        13080 :       NULLIFY (rho_ao_a, rho_ao_im_a, rho_r_a, rho_g_a, drho_r_a, &
    1206        13080 :                drho_g_a, tau_r_a, tau_g_a, tot_rho_r_a, tot_rho_g_a, rho_r_sccs_a)
    1207              : 
    1208              :       CALL qs_rho_get(rhoa, &
    1209              :                       rho_ao=rho_ao_a, &
    1210              :                       rho_ao_im=rho_ao_im_a, &
    1211              :                       rho_r=rho_r_a, &
    1212              :                       rho_g=rho_g_a, &
    1213              :                       drho_r=drho_r_a, &
    1214              :                       drho_g=drho_g_a, &
    1215              :                       tau_r=tau_r_a, &
    1216              :                       tau_g=tau_g_a, &
    1217              :                       tot_rho_r=tot_rho_r_a, &
    1218              :                       tot_rho_g=tot_rho_g_a, &
    1219        13080 :                       rho_r_sccs=rho_r_sccs_a)
    1220              : 
    1221        13080 :       NULLIFY (rho_ao_b, rho_ao_im_b, rho_r_b, rho_g_b, drho_r_b, &
    1222        13080 :                drho_g_b, tau_r_b, tau_g_b, tot_rho_r_b, tot_rho_g_b, rho_r_sccs_b)
    1223              : 
    1224              :       CALL qs_rho_get(rhob, &
    1225              :                       rho_ao=rho_ao_b, &
    1226              :                       rho_ao_im=rho_ao_im_b, &
    1227              :                       rho_r=rho_r_b, &
    1228              :                       rho_g=rho_g_b, &
    1229              :                       drho_r=drho_r_b, &
    1230              :                       drho_g=drho_g_b, &
    1231              :                       tau_r=tau_r_b, &
    1232              :                       tau_g=tau_g_b, &
    1233              :                       tot_rho_r=tot_rho_r_b, &
    1234              :                       tot_rho_g=tot_rho_g_b, &
    1235        13080 :                       rho_r_sccs=rho_r_sccs_b)
    1236              :       ! rho_ao
    1237        13080 :       IF (ASSOCIATED(rho_ao_a) .AND. ASSOCIATED(rho_ao_b)) THEN
    1238        13080 :          nspina = SIZE(rho_ao_a)
    1239        13080 :          nspinb = SIZE(rho_ao_b)
    1240        13080 :          nspins = MIN(nspina, nspinb)
    1241        28176 :          DO i = 1, nspins
    1242        28176 :             CALL dbcsr_add(rho_ao_a(i)%matrix, rho_ao_b(i)%matrix, alpha, beta)
    1243              :          END DO
    1244              :       END IF
    1245              : 
    1246              :       ! rho_ao_im
    1247        13080 :       IF (ASSOCIATED(rho_ao_im_a) .AND. ASSOCIATED(rho_ao_im_b)) THEN
    1248            0 :          nspina = SIZE(rho_ao_im_a)
    1249            0 :          nspinb = SIZE(rho_ao_im_b)
    1250            0 :          nspins = MIN(nspina, nspinb)
    1251            0 :          DO i = 1, nspins
    1252            0 :             CALL dbcsr_add(rho_ao_im_a(i)%matrix, rho_ao_im_b(i)%matrix, alpha, beta)
    1253              :          END DO
    1254              :       END IF
    1255              : 
    1256              :       ! rho_r
    1257        13080 :       IF (ASSOCIATED(rho_r_a) .AND. ASSOCIATED(rho_r_b)) THEN
    1258        13080 :          nspina = SIZE(rho_ao_a)
    1259        13080 :          nspinb = SIZE(rho_ao_b)
    1260        13080 :          nspins = MIN(nspina, nspinb)
    1261        28176 :          DO i = 1, nspins
    1262        28176 :             CALL pw_axpy(rho_r_b(i), rho_r_a(i), beta, alpha)
    1263              :          END DO
    1264              :       END IF
    1265              : 
    1266              :       ! rho_g
    1267        13080 :       IF (ASSOCIATED(rho_g_a) .AND. ASSOCIATED(rho_g_b)) THEN
    1268        13080 :          nspina = SIZE(rho_ao_a)
    1269        13080 :          nspinb = SIZE(rho_ao_b)
    1270        13080 :          nspins = MIN(nspina, nspinb)
    1271        28176 :          DO i = 1, nspins
    1272        28176 :             CALL pw_axpy(rho_g_b(i), rho_g_a(i), beta, alpha)
    1273              :          END DO
    1274              :       END IF
    1275              : 
    1276              :       ! SCCS
    1277        13080 :       IF (ASSOCIATED(rho_r_sccs_a) .AND. ASSOCIATED(rho_r_sccs_b)) THEN
    1278            0 :          CALL pw_axpy(rho_r_sccs_b, rho_r_sccs_a, beta, alpha)
    1279              :       END IF
    1280              : 
    1281              :       ! drho_r
    1282        13080 :       IF (ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) THEN
    1283            0 :          CPASSERT(ALL(SHAPE(drho_r_a) == SHAPE(drho_r_b))) ! not implemented
    1284            0 :          DO j = 1, SIZE(drho_r_a, 2)
    1285            0 :             DO i = 1, SIZE(drho_r_a, 1)
    1286            0 :                CALL pw_axpy(drho_r_b(i, j), drho_r_a(i, j), beta, alpha)
    1287              :             END DO
    1288              :          END DO
    1289              :       END IF
    1290              : 
    1291              :       ! drho_g
    1292        13080 :       IF (ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) THEN
    1293            0 :          CPASSERT(ALL(SHAPE(drho_g_a) == SHAPE(drho_g_b))) ! not implemented
    1294            0 :          DO j = 1, SIZE(drho_g_a, 2)
    1295            0 :             DO i = 1, SIZE(drho_g_a, 1)
    1296            0 :                CALL pw_axpy(drho_g_b(i, j), drho_g_a(i, j), beta, alpha)
    1297              :             END DO
    1298              :          END DO
    1299              :       END IF
    1300              : 
    1301              :       ! tau_r
    1302        13080 :       IF (ASSOCIATED(tau_r_a) .AND. ASSOCIATED(tau_r_b)) THEN
    1303            0 :          nspina = SIZE(rho_ao_a)
    1304            0 :          nspinb = SIZE(rho_ao_b)
    1305            0 :          nspins = MIN(nspina, nspinb)
    1306            0 :          DO i = 1, nspins
    1307            0 :             CALL pw_axpy(tau_r_b(i), tau_r_a(i), beta, alpha)
    1308              :          END DO
    1309              :       END IF
    1310              : 
    1311              :       ! tau_g
    1312        13080 :       IF (ASSOCIATED(tau_g_a) .AND. ASSOCIATED(tau_g_b)) THEN
    1313            0 :          nspina = SIZE(rho_ao_a)
    1314            0 :          nspinb = SIZE(rho_ao_b)
    1315            0 :          nspins = MIN(nspina, nspinb)
    1316            0 :          DO i = 1, nspins
    1317            0 :             CALL pw_axpy(tau_g_b(i), tau_g_a(i), beta, alpha)
    1318              :          END DO
    1319              :       END IF
    1320              : 
    1321              :       ! tot_rho_r
    1322        13080 :       IF (ASSOCIATED(tot_rho_r_a) .AND. ASSOCIATED(tot_rho_r_b)) THEN
    1323          360 :          nspina = SIZE(rho_ao_a)
    1324          360 :          nspinb = SIZE(rho_ao_b)
    1325          360 :          nspins = MIN(nspina, nspinb)
    1326         1008 :          DO i = 1, nspins
    1327         1008 :             tot_rho_r_a(i) = alpha*tot_rho_r_a(i) + beta*tot_rho_r_b(i)
    1328              :          END DO
    1329              :       END IF
    1330              : 
    1331              :       ! tot_rho_g
    1332        13080 :       IF (ASSOCIATED(tot_rho_g_a) .AND. ASSOCIATED(tot_rho_g_b)) THEN
    1333            0 :          nspina = SIZE(rho_ao_a)
    1334            0 :          nspinb = SIZE(rho_ao_b)
    1335            0 :          nspins = MIN(nspina, nspinb)
    1336            0 :          DO i = 1, nspins
    1337            0 :             tot_rho_g_a(i) = alpha*tot_rho_g_a(i) + beta*tot_rho_g_b(i)
    1338              :          END DO
    1339              :       END IF
    1340              : 
    1341        13080 :       CALL timestop(handle)
    1342              : 
    1343        13080 :    END SUBROUTINE qs_rho_scale_and_add
    1344              : 
    1345              : ! **************************************************************************************************
    1346              : !> \brief Duplicates a pointer physically
    1347              : !> \param rho_input The rho structure to be duplicated
    1348              : !> \param rho_output The duplicate rho structure
    1349              : !> \param qs_env The QS environment from which the auxiliary PW basis-set
    1350              : !>                pool is taken
    1351              : !> \par History
    1352              : !>      07.2005 initial create [tdk]
    1353              : !> \author Thomas D. Kuehne (tkuehne@phys.chem.ethz.ch)
    1354              : !> \note
    1355              : !>      Associated pointers are deallocated, nullified pointers are NOT accepted!
    1356              : ! **************************************************************************************************
    1357            8 :    SUBROUTINE duplicate_rho_type(rho_input, rho_output, qs_env)
    1358              : 
    1359              :       TYPE(qs_rho_type), INTENT(INOUT)                   :: rho_input, rho_output
    1360              :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1361              : 
    1362              :       CHARACTER(len=*), PARAMETER :: routineN = 'duplicate_rho_type'
    1363              : 
    1364              :       INTEGER                                            :: handle, i, j, nspins
    1365              :       LOGICAL :: complex_rho_ao_in, drho_g_valid_in, drho_r_valid_in, rho_g_valid_in, &
    1366              :          rho_r_valid_in, soft_valid_in, tau_g_valid_in, tau_r_valid_in
    1367            4 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_g_in, tot_rho_g_out, &
    1368            4 :                                                             tot_rho_r_in, tot_rho_r_out
    1369            4 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: rho_ao_im_in, rho_ao_im_out, rho_ao_in, &
    1370            4 :                                                             rho_ao_out
    1371              :       TYPE(dft_control_type), POINTER                    :: dft_control
    1372            4 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g_in, rho_g_out, tau_g_in, tau_g_out
    1373            4 :       TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER     :: drho_g_in, drho_g_out
    1374              :       TYPE(pw_env_type), POINTER                         :: pw_env
    1375              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
    1376            4 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r_in, rho_r_out, tau_r_in, tau_r_out
    1377            4 :       TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER     :: drho_r_in, drho_r_out
    1378              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_r_sccs_in, rho_r_sccs_out
    1379              : 
    1380            4 :       CALL timeset(routineN, handle)
    1381              : 
    1382            4 :       NULLIFY (dft_control, pw_env, auxbas_pw_pool)
    1383            4 :       NULLIFY (rho_ao_in, rho_ao_out, rho_ao_im_in, rho_ao_im_out)
    1384            4 :       NULLIFY (rho_r_in, rho_r_out, rho_g_in, rho_g_out, drho_r_in, drho_r_out)
    1385            4 :       NULLIFY (drho_g_in, drho_g_out, tau_r_in, tau_r_out, tau_g_in, tau_g_out)
    1386            4 :       NULLIFY (tot_rho_r_in, tot_rho_r_out, tot_rho_g_in, tot_rho_g_out)
    1387            4 :       NULLIFY (rho_r_sccs_in, rho_r_sccs_out)
    1388              : 
    1389            4 :       CPASSERT(ASSOCIATED(qs_env))
    1390              : 
    1391            4 :       CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, dft_control=dft_control)
    1392            4 :       CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool)
    1393            4 :       nspins = dft_control%nspins
    1394              : 
    1395            4 :       CALL qs_rho_clear(rho_output)
    1396              : 
    1397              :       CALL qs_rho_get(rho_input, &
    1398              :                       rho_ao=rho_ao_in, &
    1399              :                       rho_ao_im=rho_ao_im_in, &
    1400              :                       rho_r=rho_r_in, &
    1401              :                       rho_g=rho_g_in, &
    1402              :                       drho_r=drho_r_in, &
    1403              :                       drho_g=drho_g_in, &
    1404              :                       tau_r=tau_r_in, &
    1405              :                       tau_g=tau_g_in, &
    1406              :                       tot_rho_r=tot_rho_r_in, &
    1407              :                       tot_rho_g=tot_rho_g_in, &
    1408              :                       rho_g_valid=rho_g_valid_in, &
    1409              :                       rho_r_valid=rho_r_valid_in, &
    1410              :                       drho_g_valid=drho_g_valid_in, &
    1411              :                       drho_r_valid=drho_r_valid_in, &
    1412              :                       tau_r_valid=tau_r_valid_in, &
    1413              :                       tau_g_valid=tau_g_valid_in, &
    1414              :                       rho_r_sccs=rho_r_sccs_in, &
    1415              :                       soft_valid=soft_valid_in, &
    1416            4 :                       complex_rho_ao=complex_rho_ao_in)
    1417              : 
    1418              :       ! rho_ao
    1419            4 :       IF (ASSOCIATED(rho_ao_in)) THEN
    1420            4 :          CALL dbcsr_allocate_matrix_set(rho_ao_out, nspins)
    1421            4 :          CALL qs_rho_set(rho_output, rho_ao=rho_ao_out)
    1422            8 :          DO i = 1, nspins
    1423            4 :             ALLOCATE (rho_ao_out(i)%matrix)
    1424              :             CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(i)%matrix, &
    1425            4 :                             name="myDensityMatrix_for_Spin_"//TRIM(ADJUSTL(cp_to_string(i))))
    1426            8 :             CALL dbcsr_set(rho_ao_out(i)%matrix, 0.0_dp)
    1427              :          END DO
    1428              :       END IF
    1429              : 
    1430              :       ! rho_ao_im
    1431            4 :       IF (ASSOCIATED(rho_ao_im_in)) THEN
    1432            0 :          CALL dbcsr_allocate_matrix_set(rho_ao_im_out, nspins)
    1433            0 :          CALL qs_rho_set(rho_output, rho_ao=rho_ao_im_out)
    1434            0 :          DO i = 1, nspins
    1435            0 :             ALLOCATE (rho_ao_im_out(i)%matrix)
    1436              :             CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(i)%matrix, &
    1437            0 :                             name="myImagDensityMatrix_for_Spin_"//TRIM(ADJUSTL(cp_to_string(i))))
    1438            0 :             CALL dbcsr_set(rho_ao_im_out(i)%matrix, 0.0_dp)
    1439              :          END DO
    1440              :       END IF
    1441              : 
    1442              :       ! rho_r
    1443            4 :       IF (ASSOCIATED(rho_r_in)) THEN
    1444           16 :          ALLOCATE (rho_r_out(nspins))
    1445            4 :          CALL qs_rho_set(rho_output, rho_r=rho_r_out)
    1446            8 :          DO i = 1, nspins
    1447            4 :             CALL auxbas_pw_pool%create_pw(rho_r_out(i))
    1448            8 :             CALL pw_copy(rho_r_in(i), rho_r_out(i))
    1449              :          END DO
    1450              :       END IF
    1451              : 
    1452              :       ! rho_g
    1453            4 :       IF (ASSOCIATED(rho_g_in)) THEN
    1454           16 :          ALLOCATE (rho_g_out(nspins))
    1455            4 :          CALL qs_rho_set(rho_output, rho_g=rho_g_out)
    1456            8 :          DO i = 1, nspins
    1457            4 :             CALL auxbas_pw_pool%create_pw(rho_g_out(i))
    1458            8 :             CALL pw_copy(rho_g_in(i), rho_g_out(i))
    1459              :          END DO
    1460              :       END IF
    1461              : 
    1462              :       ! SCCS
    1463            4 :       IF (ASSOCIATED(rho_r_sccs_in)) THEN
    1464            0 :          CALL qs_rho_set(rho_output, rho_r_sccs=rho_r_sccs_out)
    1465            0 :          CALL auxbas_pw_pool%create_pw(rho_r_sccs_out)
    1466            0 :          CALL pw_copy(rho_r_sccs_in, rho_r_sccs_out)
    1467              :       END IF
    1468              : 
    1469              :       ! drho_r and drho_g are only needed if calculated by collocation
    1470            4 :       IF (dft_control%drho_by_collocation) THEN
    1471              :          ! drho_r
    1472            0 :          IF (ASSOCIATED(drho_r_in)) THEN
    1473            0 :             ALLOCATE (drho_r_out(3, nspins))
    1474            0 :             CALL qs_rho_set(rho_output, drho_r=drho_r_out)
    1475            0 :             DO j = 1, nspins
    1476            0 :                DO i = 1, 3
    1477            0 :                   CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
    1478            0 :                   CALL pw_copy(drho_r_in(i, j), drho_r_out(i, j))
    1479              :                END DO
    1480              :             END DO
    1481              :          END IF
    1482              : 
    1483              :          ! drho_g
    1484            0 :          IF (ASSOCIATED(drho_g_in)) THEN
    1485            0 :             ALLOCATE (drho_g_out(3, nspins))
    1486            0 :             CALL qs_rho_set(rho_output, drho_g=drho_g_out)
    1487            0 :             DO j = 1, nspins
    1488            0 :                DO i = 1, 3
    1489            0 :                   CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
    1490            0 :                   CALL pw_copy(drho_g_in(i, j), drho_g_out(i, j))
    1491              :                END DO
    1492              :             END DO
    1493              :          END IF
    1494              :       END IF
    1495              : 
    1496              :       ! tau_r and tau_g are only needed in the case of Meta-GGA XC-functionals
    1497              :       ! are used. Therefore they are only allocated if
    1498              :       ! dft_control%use_kinetic_energy_density is true
    1499            4 :       IF (dft_control%use_kinetic_energy_density) THEN
    1500              :          ! tau_r
    1501            0 :          IF (ASSOCIATED(tau_r_in)) THEN
    1502            0 :             ALLOCATE (tau_r_out(nspins))
    1503            0 :             CALL qs_rho_set(rho_output, tau_r=tau_r_out)
    1504            0 :             DO i = 1, nspins
    1505            0 :                CALL auxbas_pw_pool%create_pw(tau_r_out(i))
    1506            0 :                CALL pw_copy(tau_r_in(i), tau_r_out(i))
    1507              :             END DO
    1508              :          END IF
    1509              : 
    1510              :          ! tau_g
    1511            0 :          IF (ASSOCIATED(tau_g_in)) THEN
    1512            0 :             ALLOCATE (tau_g_out(nspins))
    1513            0 :             CALL qs_rho_set(rho_output, tau_g=tau_g_out)
    1514            0 :             DO i = 1, nspins
    1515            0 :                CALL auxbas_pw_pool%create_pw(tau_g_out(i))
    1516            0 :                CALL pw_copy(tau_g_in(i), tau_g_out(i))
    1517              :             END DO
    1518              :          END IF
    1519              :       END IF
    1520              : 
    1521              :       CALL qs_rho_set(rho_output, &
    1522              :                       rho_g_valid=rho_g_valid_in, &
    1523              :                       rho_r_valid=rho_r_valid_in, &
    1524              :                       drho_g_valid=drho_g_valid_in, &
    1525              :                       drho_r_valid=drho_r_valid_in, &
    1526              :                       tau_r_valid=tau_r_valid_in, &
    1527              :                       tau_g_valid=tau_g_valid_in, &
    1528              :                       soft_valid=soft_valid_in, &
    1529            4 :                       complex_rho_ao=complex_rho_ao_in)
    1530              : 
    1531              :       ! tot_rho_r
    1532            4 :       IF (ASSOCIATED(tot_rho_r_in)) THEN
    1533           12 :          ALLOCATE (tot_rho_r_out(nspins))
    1534            4 :          CALL qs_rho_set(rho_output, tot_rho_r=tot_rho_r_out)
    1535            8 :          DO i = 1, nspins
    1536            8 :             tot_rho_r_out(i) = tot_rho_r_in(i)
    1537              :          END DO
    1538              :       END IF
    1539              : 
    1540              :       ! tot_rho_g
    1541            4 :       IF (ASSOCIATED(tot_rho_g_in)) THEN
    1542            0 :          ALLOCATE (tot_rho_g_out(nspins))
    1543            0 :          CALL qs_rho_set(rho_output, tot_rho_g=tot_rho_g_out)
    1544            0 :          DO i = 1, nspins
    1545            0 :             tot_rho_g_out(i) = tot_rho_g_in(i)
    1546              :          END DO
    1547              : 
    1548              :       END IF
    1549              : 
    1550            4 :       CALL timestop(handle)
    1551              : 
    1552            4 :    END SUBROUTINE duplicate_rho_type
    1553              : 
    1554              : ! **************************************************************************************************
    1555              : !> \brief (Re-)allocates rho_ao_im from real part rho_ao
    1556              : !> \param rho ...
    1557              : !> \param qs_env ...
    1558              : ! **************************************************************************************************
    1559           94 :    SUBROUTINE allocate_rho_ao_imag_from_real(rho, qs_env)
    1560              :       TYPE(qs_rho_type), POINTER                         :: rho
    1561              :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1562              : 
    1563              :       CHARACTER(LEN=default_string_length)               :: headline
    1564              :       INTEGER                                            :: i, ic, nimages, nspins
    1565           94 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao_im_kp, rho_ao_kp
    1566              :       TYPE(dbcsr_type), POINTER                          :: template
    1567              :       TYPE(dft_control_type), POINTER                    :: dft_control
    1568              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
    1569           94 :          POINTER                                         :: sab_orb
    1570              : 
    1571           94 :       NULLIFY (rho_ao_im_kp, rho_ao_kp, dft_control, template, sab_orb)
    1572              : 
    1573              :       CALL get_qs_env(qs_env, &
    1574              :                       dft_control=dft_control, &
    1575           94 :                       sab_orb=sab_orb)
    1576              : 
    1577           94 :       CALL qs_rho_get(rho, rho_ao_im_kp=rho_ao_im_kp, rho_ao_kp=rho_ao_kp)
    1578              : 
    1579           94 :       nspins = dft_control%nspins
    1580           94 :       nimages = dft_control%nimages
    1581              : 
    1582           94 :       CPASSERT(nspins == SIZE(rho_ao_kp, 1))
    1583           94 :       CPASSERT(nimages == SIZE(rho_ao_kp, 2))
    1584              : 
    1585           94 :       CALL dbcsr_allocate_matrix_set(rho_ao_im_kp, nspins, nimages)
    1586           94 :       CALL qs_rho_set(rho, rho_ao_im_kp=rho_ao_im_kp)
    1587          202 :       DO i = 1, nspins
    1588          310 :          DO ic = 1, nimages
    1589          108 :             IF (nspins > 1) THEN
    1590           28 :                IF (i == 1) THEN
    1591           14 :                   headline = "IMAGINARY PART OF DENSITY MATRIX FOR ALPHA SPIN"
    1592              :                ELSE
    1593           14 :                   headline = "IMAGINARY PART OF DENSITY MATRIX FOR BETA SPIN"
    1594              :                END IF
    1595              :             ELSE
    1596           80 :                headline = "IMAGINARY PART OF DENSITY MATRIX"
    1597              :             END IF
    1598          108 :             ALLOCATE (rho_ao_im_kp(i, ic)%matrix)
    1599          108 :             template => rho_ao_kp(i, ic)%matrix ! base on real part, but anti-symmetric
    1600              :             CALL dbcsr_create(matrix=rho_ao_im_kp(i, ic)%matrix, template=template, &
    1601          108 :                               name=TRIM(headline), matrix_type=dbcsr_type_antisymmetric)
    1602          108 :             CALL cp_dbcsr_alloc_block_from_nbl(rho_ao_im_kp(i, ic)%matrix, sab_orb)
    1603          216 :             CALL dbcsr_set(rho_ao_im_kp(i, ic)%matrix, 0.0_dp)
    1604              :          END DO
    1605              :       END DO
    1606              : 
    1607           94 :    END SUBROUTINE allocate_rho_ao_imag_from_real
    1608              : 
    1609              : END MODULE qs_rho_methods
        

Generated by: LCOV version 2.0-1