LCOV - code coverage report
Current view: top level - src - qs_rho_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:24d69ee) Lines: 69.5 % 816 567
Test Date: 2026-09-03 07:32:15 Functions: 100.0 % 10 10

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

Generated by: LCOV version 2.0-1