LCOV - code coverage report
Current view: top level - src - qs_tddfpt2_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:34ef472) Lines: 401 411 97.6 %
Date: 2024-04-26 08:30:29 Functions: 4 8 50.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : MODULE qs_tddfpt2_types
       9             :    USE admm_types,                      ONLY: admm_type,&
      10             :                                               get_admm_env
      11             :    USE atomic_kind_types,               ONLY: atomic_kind_type
      12             :    USE cp_blacs_env,                    ONLY: cp_blacs_env_type
      13             :    USE cp_control_types,                ONLY: dft_control_type
      14             :    USE cp_dbcsr_operations,             ONLY: cp_dbcsr_sm_fm_multiply,&
      15             :                                               dbcsr_allocate_matrix_set,&
      16             :                                               dbcsr_deallocate_matrix_set
      17             :    USE cp_fm_pool_types,                ONLY: cp_fm_pool_p_type,&
      18             :                                               fm_pool_create,&
      19             :                                               fm_pool_create_fm,&
      20             :                                               fm_pool_release
      21             :    USE cp_fm_struct,                    ONLY: cp_fm_struct_create,&
      22             :                                               cp_fm_struct_p_type,&
      23             :                                               cp_fm_struct_release,&
      24             :                                               cp_fm_struct_type
      25             :    USE cp_fm_types,                     ONLY: cp_fm_create,&
      26             :                                               cp_fm_release,&
      27             :                                               cp_fm_type
      28             :    USE dbcsr_api,                       ONLY: &
      29             :         dbcsr_complete_redistribute, dbcsr_create, dbcsr_deallocate_matrix, &
      30             :         dbcsr_distribution_type, dbcsr_get_info, dbcsr_init_p, dbcsr_p_type, dbcsr_release_p, &
      31             :         dbcsr_type, dbcsr_type_antisymmetric
      32             :    USE ewald_environment_types,         ONLY: ewald_env_release,&
      33             :                                               ewald_environment_type
      34             :    USE ewald_pw_types,                  ONLY: ewald_pw_release,&
      35             :                                               ewald_pw_type
      36             :    USE hartree_local_methods,           ONLY: init_coulomb_local
      37             :    USE hartree_local_types,             ONLY: hartree_local_create,&
      38             :                                               hartree_local_release,&
      39             :                                               hartree_local_type
      40             :    USE kinds,                           ONLY: dp
      41             :    USE message_passing,                 ONLY: mp_para_env_type
      42             :    USE parallel_gemm_api,               ONLY: parallel_gemm
      43             :    USE pw_env_types,                    ONLY: pw_env_get
      44             :    USE pw_pool_types,                   ONLY: pw_pool_type
      45             :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      46             :                                               pw_r3d_rs_type
      47             :    USE qs_environment_types,            ONLY: get_qs_env,&
      48             :                                               qs_environment_type
      49             :    USE qs_kind_types,                   ONLY: qs_kind_type
      50             :    USE qs_local_rho_types,              ONLY: local_rho_set_create,&
      51             :                                               local_rho_set_release,&
      52             :                                               local_rho_type
      53             :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      54             :    USE qs_rho0_ggrid,                   ONLY: rho0_s_grid_create
      55             :    USE qs_rho0_methods,                 ONLY: init_rho0
      56             :    USE qs_rho_atom_methods,             ONLY: allocate_rho_atom_internals
      57             :    USE qs_rho_methods,                  ONLY: qs_rho_rebuild
      58             :    USE qs_rho_types,                    ONLY: qs_rho_create,&
      59             :                                               qs_rho_release,&
      60             :                                               qs_rho_set,&
      61             :                                               qs_rho_type
      62             :    USE qs_tddfpt2_subgroups,            ONLY: tddfpt_dbcsr_create_by_dist,&
      63             :                                               tddfpt_subgroup_env_type
      64             : #include "./base/base_uses.f90"
      65             : 
      66             :    IMPLICIT NONE
      67             : 
      68             :    PRIVATE
      69             : 
      70             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_types'
      71             : 
      72             :    LOGICAL, PARAMETER, PRIVATE          :: debug_this_module = .FALSE.
      73             :    ! number of first derivative components (3: d/dx, d/dy, d/dz)
      74             :    INTEGER, PARAMETER, PRIVATE          :: nderivs = 3
      75             :    INTEGER, PARAMETER, PRIVATE          :: maxspins = 2
      76             : 
      77             :    PUBLIC :: tddfpt_ground_state_mos, tddfpt_work_matrices
      78             :    PUBLIC :: tddfpt_create_work_matrices, stda_create_work_matrices, tddfpt_release_work_matrices
      79             :    PUBLIC :: hfxsr_create_work_matrices
      80             : 
      81             : ! **************************************************************************************************
      82             : !> \brief Ground state molecular orbitals.
      83             : !> \par History
      84             : !>   * 06.2016 created [Sergey Chulkov]
      85             : ! **************************************************************************************************
      86             :    TYPE tddfpt_ground_state_mos
      87             :       !> occupied MOs stored in a matrix form [nao x nmo_occ]
      88             :       TYPE(cp_fm_type), POINTER                          :: mos_occ
      89             :       !> virtual MOs stored in a matrix form [nao x nmo_virt]
      90             :       TYPE(cp_fm_type), POINTER                          :: mos_virt
      91             :       !> negated occupied orbital energy matrix [nmo_occ x nmo_occ]: - mos_occ^T * KS * mos_occ .
      92             :       !> Allocated when orbital energy correction is in use, otherwise it is just a diagonal
      93             :       !> matrix with 'evals_occ' on its diagonal
      94             :       TYPE(cp_fm_type), POINTER                          :: evals_occ_matrix
      95             :       !> (non-corrected) occupied orbital energies
      96             :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: evals_occ
      97             :       !> (non-corrected) virtual orbital energies
      98             :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: evals_virt
      99             :       !> phase of occupied MOs; +1.0 -- positive, -1.0 -- negative;
     100             :       !> it is mainly needed to make the restart file transferable
     101             :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: phases_occ
     102             :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: phases_virt
     103             :    END TYPE tddfpt_ground_state_mos
     104             : 
     105             : ! **************************************************************************************************
     106             : !> \brief Set of temporary ("work") matrices.
     107             : !> \par History
     108             : !>   * 01.2017 created [Sergey Chulkov]
     109             : ! **************************************************************************************************
     110             :    TYPE tddfpt_work_matrices
     111             :       !
     112             :       ! *** globally distributed dense matrices ***
     113             :       !
     114             :       !> pool of dense [nao x nmo_occ(spin)] matrices;
     115             :       !> used mainly to dynamically expand the list of trial vectors
     116             :       TYPE(cp_fm_pool_p_type), ALLOCATABLE, DIMENSION(:) :: fm_pool_ao_mo_occ
     117             :       !> S * mos_occ(spin)
     118             :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:)        :: S_C0
     119             :       !> S * \rho_0(spin)
     120             :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:)        :: S_C0_C0T
     121             :       !
     122             :       ! *** dense matrices distributed across parallel (sub)groups ***
     123             :       !
     124             :       !> evects_sub(1:nspins, 1:nstates): a copy of the last 'nstates' trial vectors distributed
     125             :       !> across parallel (sub)groups. Here 'nstates' is the number of requested excited states which
     126             :       !> is typically much smaller than the total number of Krylov's vectors. Allocated only if
     127             :       !> the number of parallel groups > 1, otherwise we use the original globally distributed vectors.
     128             :       !> evects_sub(spin, state) == null() means that the trial vector is assigned to a different (sub)group
     129             :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :)     :: evects_sub
     130             :       !> action of TDDFPT operator on trial vectors distributed across parallel (sub)groups
     131             :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :)     :: Aop_evects_sub
     132             :       !> electron density expressed in terms of atomic orbitals using primary basis set
     133             :       TYPE(cp_fm_type), POINTER                          :: rho_ao_orb_fm_sub
     134             :       !
     135             :       ! NOTE: we do not need the next 2 matrices in case of a sparse matrix 'tddfpt_subgroup_env_type%admm_A'
     136             :       !
     137             :       !> electron density expressed in terms of atomic orbitals using auxiliary basis set;
     138             :       !> can be seen as a group-specific version of the matrix 'admm_type%work_aux_aux'
     139             :       TYPE(cp_fm_type), POINTER                          :: rho_ao_aux_fit_fm_sub
     140             :       !> group-specific version of the matrix 'admm_type%work_aux_orb' with shape [nao_aux x nao]
     141             :       TYPE(cp_fm_type), POINTER                          :: wfm_aux_orb_sub
     142             :       !
     143             :       ! *** sparse matrices distributed across parallel (sub)groups ***
     144             :       !
     145             :       !> sparse matrix with shape [nao x nao] distributed across subgroups;
     146             :       !> Aop_evects_sub(spin,:) = A_ia_munu_sub(spin) * mos_occ(spin)
     147             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: A_ia_munu_sub
     148             :       !
     149             :       ! *** structures to store electron densities distributed across parallel (sub)groups ***
     150             :       !
     151             :       !> electron density in terms of primary basis set
     152             :       TYPE(qs_rho_type), POINTER                         :: rho_orb_struct_sub
     153             :       !> electron density for XC in GAPW_XC
     154             :       TYPE(qs_rho_type), POINTER                         :: rho_xc_struct_sub
     155             :       !> electron density in terms of auxiliary basis set
     156             :       TYPE(qs_rho_type), POINTER                         :: rho_aux_fit_struct_sub
     157             :       !> group-specific copy of a Coulomb/xc-potential on a real-space grid
     158             :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER             :: A_ia_rspace_sub
     159             :       !> group-specific copy of a reciprocal-space grid
     160             :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER             :: wpw_gspace_sub
     161             :       !> group-specific copy of a real-space grid
     162             :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER             :: wpw_rspace_sub
     163             :       !> group-specific copy of a real-space grid for the kinetic energy density
     164             :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER             :: wpw_tau_rspace_sub
     165             :       !
     166             :       ! *** real space pw grid to hold fxc kernel <> A_ia_rspace_sub ***
     167             :       !
     168             :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER             :: fxc_rspace_sub
     169             :       !
     170             :       ! *** globally distributed matrices required to compute exact exchange terms ***
     171             :       !
     172             :       !> globally distributed version of the matrix 'rho_ao_orb_fm_sub' to store the electron density
     173             :       TYPE(cp_fm_type), POINTER                          :: hfx_fm_ao_ao
     174             :       !> sparse matrix to store the electron density in terms of auxiliary (ADMM calculation)
     175             :       !> or primary (regular calculation) basis set
     176             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: hfx_rho_ao_symm, hfx_rho_ao_asymm
     177             :       !> exact exchange expressed in terms of auxiliary or primary basis set
     178             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: hfx_hmat_symm, hfx_hmat_asymm
     179             :       !> SR exact exchage matrices
     180             :       TYPE(cp_fm_type), POINTER                          :: hfxsr_fm_ao_ao
     181             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: hfxsr_rho_ao_symm, hfxsr_rho_ao_asymm
     182             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: hfxsr_hmat_symm, hfxsr_hmat_asymm
     183             :       !
     184             :       ! *** matrices required for sTDA kernel, all matrices are within subgroups
     185             :       !
     186             :       ! Short-range gamma exchange matrix
     187             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: gamma_exchange
     188             :       !Lowdin MO coefficients: NAO*NOCC
     189             :       TYPE(cp_fm_type), DIMENSION(:), POINTER            :: ctransformed
     190             :       !S^1/2
     191             :       TYPE(dbcsr_type), POINTER                          :: shalf
     192             :       !Eigenvalues/eigenvectors of the overlap matrix, used in sTDA forces (Lowdin derivatives)
     193             :       REAL(KIND=dp), DIMENSION(:), POINTER               :: S_eigenvalues
     194             :       TYPE(cp_fm_type), POINTER                          :: S_eigenvectors
     195             :       TYPE(cp_fm_type), POINTER                          :: slambda
     196             :       !Ewald environments
     197             :       TYPE(ewald_environment_type), POINTER              :: ewald_env
     198             :       TYPE(ewald_pw_type), POINTER                       :: ewald_pw
     199             :       !> GAPW local atomic grids
     200             :       TYPE(hartree_local_type), POINTER                  :: hartree_local
     201             :       TYPE(local_rho_type), POINTER                      :: local_rho_set
     202             :       TYPE(local_rho_type), POINTER                      :: local_rho_set_admm
     203             :    END TYPE tddfpt_work_matrices
     204             : 
     205             : CONTAINS
     206             : 
     207             : ! **************************************************************************************************
     208             : !> \brief Allocate work matrices for full kernel
     209             : !> \param work_matrices  work matrices (allocated on exit)
     210             : !> \param gs_mos         occupied and virtual molecular orbitals optimised for the ground state
     211             : !> \param nstates        number of excited states to converge
     212             : !> \param do_hfx         flag that requested to allocate work matrices required for computation
     213             : !>                       of exact-exchange terms
     214             : !> \param do_admm ...
     215             : !> \param do_hfxlr ...
     216             : !> \param do_exck ...
     217             : !> \param qs_env         Quickstep environment
     218             : !> \param sub_env        parallel group environment
     219             : !> \par History
     220             : !>    * 02.2017 created [Sergey Chulkov]
     221             : ! **************************************************************************************************
     222        1132 :    SUBROUTINE tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, &
     223             :                                           do_hfxlr, do_exck, qs_env, sub_env)
     224             :       TYPE(tddfpt_work_matrices), INTENT(out)            :: work_matrices
     225             :       TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
     226             :          INTENT(in)                                      :: gs_mos
     227             :       INTEGER, INTENT(in)                                :: nstates
     228             :       LOGICAL, INTENT(in)                                :: do_hfx, do_admm, do_hfxlr, do_exck
     229             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     230             :       TYPE(tddfpt_subgroup_env_type), INTENT(in)         :: sub_env
     231             : 
     232             :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tddfpt_create_work_matrices'
     233             : 
     234             :       INTEGER                                            :: handle, igroup, ispin, istate, nao, &
     235             :                                                             nao_aux, natom, ngroups, nspins
     236             :       INTEGER, DIMENSION(maxspins)                       :: nmo_occ, nmo_virt
     237             :       TYPE(admm_type), POINTER                           :: admm_env
     238         566 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     239             :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     240        1698 :       TYPE(cp_fm_struct_p_type), DIMENSION(maxspins)     :: fm_struct_evects
     241             :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct
     242             :       TYPE(dbcsr_distribution_type), POINTER             :: dbcsr_dist
     243         566 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: matrix_s, matrix_s_aux_fit, rho_ia_ao, &
     244         566 :                                                             rho_xc_ao
     245             :       TYPE(dbcsr_type), POINTER                          :: dbcsr_template_hfx
     246             :       TYPE(dft_control_type), POINTER                    :: dft_control
     247             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     248             :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     249         566 :          POINTER                                         :: sab_hfx
     250             :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     251         566 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     252             : 
     253         566 :       CALL timeset(routineN, handle)
     254             : 
     255             :       ! sTDA
     256         566 :       NULLIFY (work_matrices%shalf)
     257         566 :       NULLIFY (work_matrices%ewald_env)
     258         566 :       NULLIFY (work_matrices%ewald_pw)
     259         566 :       NULLIFY (work_matrices%gamma_exchange)
     260         566 :       NULLIFY (work_matrices%ctransformed)
     261         566 :       NULLIFY (work_matrices%S_eigenvalues)
     262         566 :       NULLIFY (work_matrices%S_eigenvectors)
     263         566 :       NULLIFY (work_matrices%slambda)
     264             : 
     265             :       ! GAPW
     266         566 :       NULLIFY (work_matrices%hartree_local)
     267         566 :       NULLIFY (work_matrices%local_rho_set)
     268         566 :       NULLIFY (work_matrices%local_rho_set_admm)
     269             : 
     270             :       ! EXCK
     271         566 :       NULLIFY (work_matrices%rho_xc_struct_sub)
     272             : 
     273         566 :       nspins = SIZE(gs_mos)
     274         566 :       CALL get_qs_env(qs_env, blacs_env=blacs_env, matrix_s=matrix_s)
     275         566 :       CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
     276             : 
     277        1224 :       DO ispin = 1, nspins
     278         658 :          nmo_occ(ispin) = SIZE(gs_mos(ispin)%evals_occ)
     279         566 :          nmo_virt(ispin) = SIZE(gs_mos(ispin)%evals_virt)
     280             :       END DO
     281             : 
     282         566 :       IF (do_admm) THEN
     283         120 :          CPASSERT(do_hfx)
     284         120 :          CPASSERT(ASSOCIATED(sub_env%admm_A))
     285         120 :          CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
     286         120 :          CALL dbcsr_get_info(matrix_s_aux_fit(1)%matrix, nfullrows_total=nao_aux)
     287             :       END IF
     288             : 
     289         566 :       NULLIFY (fm_struct)
     290        2356 :       ALLOCATE (work_matrices%fm_pool_ao_mo_occ(nspins))
     291        1224 :       DO ispin = 1, nspins
     292         658 :          NULLIFY (work_matrices%fm_pool_ao_mo_occ(ispin)%pool)
     293         658 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_occ(ispin), context=blacs_env)
     294         658 :          CALL fm_pool_create(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, fm_struct)
     295        1224 :          CALL cp_fm_struct_release(fm_struct)
     296             :       END DO
     297             : 
     298        2356 :       ALLOCATE (work_matrices%S_C0_C0T(nspins))
     299         566 :       CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     300        1224 :       DO ispin = 1, nspins
     301        1224 :          CALL cp_fm_create(work_matrices%S_C0_C0T(ispin), fm_struct)
     302             :       END DO
     303         566 :       CALL cp_fm_struct_release(fm_struct)
     304             : 
     305        2356 :       ALLOCATE (work_matrices%S_C0(nspins))
     306        1224 :       DO ispin = 1, nspins
     307         658 :          CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, work_matrices%S_C0(ispin))
     308             : 
     309             :          CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, gs_mos(ispin)%mos_occ, work_matrices%S_C0(ispin), &
     310         658 :                                       ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
     311             :          CALL parallel_gemm('N', 'T', nao, nao, nmo_occ(ispin), 1.0_dp, work_matrices%S_C0(ispin), &
     312        1224 :                             gs_mos(ispin)%mos_occ, 0.0_dp, work_matrices%S_C0_C0T(ispin))
     313             :       END DO
     314             : 
     315         566 :       IF (sub_env%is_split) THEN
     316           4 :          DO ispin = 1, nspins
     317             :             CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, nrow_global=nao, &
     318           4 :                                      ncol_global=nmo_occ(ispin), context=sub_env%blacs_env)
     319             :          END DO
     320             : 
     321          30 :          ALLOCATE (work_matrices%evects_sub(nspins, nstates), work_matrices%Aop_evects_sub(nspins, nstates))
     322             : 
     323           2 :          CALL blacs_env%get(para_env=para_env)
     324           2 :          igroup = sub_env%group_distribution(para_env%mepos)
     325           2 :          ngroups = sub_env%ngroups
     326             : 
     327           4 :          DO istate = ngroups - igroup, nstates, ngroups
     328           6 :             DO ispin = 1, nspins
     329           2 :                CALL cp_fm_create(work_matrices%evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
     330           4 :                CALL cp_fm_create(work_matrices%Aop_evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
     331             :             END DO
     332             :          END DO
     333             : 
     334           4 :          DO ispin = nspins, 1, -1
     335           4 :             CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
     336             :          END DO
     337             :       END IF
     338             : 
     339         566 :       CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=sub_env%blacs_env)
     340         566 :       ALLOCATE (work_matrices%rho_ao_orb_fm_sub)
     341         566 :       CALL cp_fm_create(work_matrices%rho_ao_orb_fm_sub, fm_struct)
     342         566 :       CALL cp_fm_struct_release(fm_struct)
     343             : 
     344         566 :       NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub, work_matrices%wfm_aux_orb_sub)
     345         566 :       IF (do_admm) THEN
     346         120 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao_aux, ncol_global=nao_aux, context=sub_env%blacs_env)
     347         120 :          ALLOCATE (work_matrices%rho_ao_aux_fit_fm_sub)
     348         120 :          CALL cp_fm_create(work_matrices%rho_ao_aux_fit_fm_sub, fm_struct)
     349         120 :          CALL cp_fm_struct_release(fm_struct)
     350             : 
     351         120 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao_aux, ncol_global=nao, context=sub_env%blacs_env)
     352         120 :          ALLOCATE (work_matrices%wfm_aux_orb_sub)
     353         120 :          CALL cp_fm_create(work_matrices%wfm_aux_orb_sub, fm_struct)
     354         120 :          CALL cp_fm_struct_release(fm_struct)
     355             :       END IF
     356             : 
     357             :       ! group-specific dbcsr matrices
     358         566 :       NULLIFY (work_matrices%A_ia_munu_sub)
     359         566 :       CALL dbcsr_allocate_matrix_set(work_matrices%A_ia_munu_sub, nspins)
     360        1224 :       DO ispin = 1, nspins
     361         658 :          CALL dbcsr_init_p(work_matrices%A_ia_munu_sub(ispin)%matrix)
     362             :          CALL tddfpt_dbcsr_create_by_dist(work_matrices%A_ia_munu_sub(ispin)%matrix, template=matrix_s(1)%matrix, &
     363        1224 :                                           dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
     364             :       END DO
     365             : 
     366             :       ! group-specific response density
     367         566 :       NULLIFY (rho_ia_ao)
     368         566 :       CALL dbcsr_allocate_matrix_set(rho_ia_ao, nspins)
     369        1224 :       DO ispin = 1, nspins
     370         658 :          CALL dbcsr_init_p(rho_ia_ao(ispin)%matrix)
     371             :          CALL tddfpt_dbcsr_create_by_dist(rho_ia_ao(ispin)%matrix, template=matrix_s(1)%matrix, &
     372        1224 :                                           dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
     373             :       END DO
     374             : 
     375             :       NULLIFY (work_matrices%rho_orb_struct_sub)
     376         566 :       ALLOCATE (work_matrices%rho_orb_struct_sub)
     377         566 :       CALL qs_rho_create(work_matrices%rho_orb_struct_sub)
     378         566 :       CALL qs_rho_set(work_matrices%rho_orb_struct_sub, rho_ao=rho_ia_ao)
     379             :       CALL qs_rho_rebuild(work_matrices%rho_orb_struct_sub, qs_env, rebuild_ao=.FALSE., &
     380         566 :                           rebuild_grids=.TRUE., pw_env_external=sub_env%pw_env)
     381         566 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     382         566 :       IF (dft_control%qs_control%gapw_xc) THEN
     383          32 :          NULLIFY (rho_xc_ao)
     384          32 :          CALL dbcsr_allocate_matrix_set(rho_xc_ao, nspins)
     385          64 :          DO ispin = 1, nspins
     386          32 :             CALL dbcsr_init_p(rho_xc_ao(ispin)%matrix)
     387             :             CALL tddfpt_dbcsr_create_by_dist(rho_xc_ao(ispin)%matrix, template=matrix_s(1)%matrix, &
     388          64 :                                              dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
     389             :          END DO
     390             :          NULLIFY (work_matrices%rho_xc_struct_sub)
     391          32 :          ALLOCATE (work_matrices%rho_xc_struct_sub)
     392          32 :          CALL qs_rho_create(work_matrices%rho_xc_struct_sub)
     393          32 :          CALL qs_rho_set(work_matrices%rho_xc_struct_sub, rho_ao=rho_xc_ao)
     394             :          CALL qs_rho_rebuild(work_matrices%rho_xc_struct_sub, qs_env, rebuild_ao=.FALSE., &
     395          32 :                              rebuild_grids=.TRUE., pw_env_external=sub_env%pw_env)
     396             :       END IF
     397             : 
     398         566 :       NULLIFY (work_matrices%rho_aux_fit_struct_sub)
     399         566 :       IF (do_admm) THEN
     400         120 :          NULLIFY (rho_ia_ao)
     401         120 :          CALL dbcsr_allocate_matrix_set(rho_ia_ao, nspins)
     402         244 :          DO ispin = 1, nspins
     403         124 :             CALL dbcsr_init_p(rho_ia_ao(ispin)%matrix)
     404             :             CALL tddfpt_dbcsr_create_by_dist(rho_ia_ao(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
     405         244 :                                              dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_aux_fit)
     406             :          END DO
     407             : 
     408         120 :          ALLOCATE (work_matrices%rho_aux_fit_struct_sub)
     409         120 :          CALL qs_rho_create(work_matrices%rho_aux_fit_struct_sub)
     410         120 :          CALL qs_rho_set(work_matrices%rho_aux_fit_struct_sub, rho_ao=rho_ia_ao)
     411             :          CALL qs_rho_rebuild(work_matrices%rho_aux_fit_struct_sub, qs_env, rebuild_ao=.FALSE., &
     412         120 :                              rebuild_grids=.TRUE., pw_env_external=sub_env%pw_env)
     413             :       END IF
     414             : 
     415             :       ! work plain-wave grids
     416         566 :       CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
     417        2356 :       ALLOCATE (work_matrices%A_ia_rspace_sub(nspins))
     418             :       ALLOCATE (work_matrices%wpw_gspace_sub(nspins), work_matrices%wpw_rspace_sub(nspins), &
     419        5936 :                 work_matrices%wpw_tau_rspace_sub(nspins))
     420        1224 :       DO ispin = 1, nspins
     421         658 :          CALL auxbas_pw_pool%create_pw(work_matrices%A_ia_rspace_sub(ispin))
     422         658 :          CALL auxbas_pw_pool%create_pw(work_matrices%wpw_gspace_sub(ispin))
     423         658 :          CALL auxbas_pw_pool%create_pw(work_matrices%wpw_rspace_sub(ispin))
     424        1224 :          CALL auxbas_pw_pool%create_pw(work_matrices%wpw_tau_rspace_sub(ispin))
     425             :       END DO
     426             : 
     427             :       ! fxc kernel potential real space grid
     428         566 :       IF (do_exck) THEN
     429             :          ! we need spins: aa, ab, bb
     430          48 :          ALLOCATE (work_matrices%fxc_rspace_sub(3))
     431          48 :          DO ispin = 1, 3
     432          48 :             CALL auxbas_pw_pool%create_pw(work_matrices%fxc_rspace_sub(ispin))
     433             :          END DO
     434             :       ELSE
     435         554 :          NULLIFY (work_matrices%fxc_rspace_sub)
     436             :       END IF
     437             : 
     438             :       ! GAPW initializations
     439         566 :       IF (dft_control%qs_control%gapw) THEN
     440             :          CALL get_qs_env(qs_env, &
     441             :                          atomic_kind_set=atomic_kind_set, &
     442             :                          natom=natom, &
     443         160 :                          qs_kind_set=qs_kind_set)
     444         160 :          CALL local_rho_set_create(work_matrices%local_rho_set)
     445             :          CALL allocate_rho_atom_internals(work_matrices%local_rho_set%rho_atom_set, atomic_kind_set, &
     446         160 :                                           qs_kind_set, dft_control, sub_env%para_env)
     447             :          CALL init_rho0(work_matrices%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
     448         160 :                         zcore=0.0_dp)
     449         160 :          CALL rho0_s_grid_create(sub_env%pw_env, work_matrices%local_rho_set%rho0_mpole)
     450         160 :          CALL hartree_local_create(work_matrices%hartree_local)
     451         160 :          CALL init_coulomb_local(work_matrices%hartree_local, natom)
     452         406 :       ELSEIF (dft_control%qs_control%gapw_xc) THEN
     453             :          CALL get_qs_env(qs_env, &
     454             :                          atomic_kind_set=atomic_kind_set, &
     455          32 :                          qs_kind_set=qs_kind_set)
     456          32 :          CALL local_rho_set_create(work_matrices%local_rho_set)
     457             :          CALL allocate_rho_atom_internals(work_matrices%local_rho_set%rho_atom_set, atomic_kind_set, &
     458          32 :                                           qs_kind_set, dft_control, sub_env%para_env)
     459             :       END IF
     460             : 
     461             :       ! HFX-related globally distributed matrices
     462         566 :       NULLIFY (work_matrices%hfx_fm_ao_ao, work_matrices%hfx_rho_ao_symm, work_matrices%hfx_hmat_symm, &
     463         566 :                work_matrices%hfx_rho_ao_asymm, work_matrices%hfx_hmat_asymm)
     464         566 :       IF (do_hfx) THEN
     465         206 :          IF (do_admm) THEN
     466         120 :             CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist)
     467         120 :             CALL get_admm_env(qs_env%admm_env, sab_aux_fit=sab_hfx)
     468         120 :             dbcsr_template_hfx => matrix_s_aux_fit(1)%matrix
     469         120 :             IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
     470          34 :                CALL get_qs_env(qs_env, admm_env=admm_env, atomic_kind_set=atomic_kind_set)
     471          34 :                CALL local_rho_set_create(work_matrices%local_rho_set_admm)
     472             :                CALL allocate_rho_atom_internals(work_matrices%local_rho_set_admm%rho_atom_set, &
     473             :                                                 atomic_kind_set, admm_env%admm_gapw_env%admm_kind_set, &
     474          34 :                                                 dft_control, sub_env%para_env)
     475             :             END IF
     476             :          ELSE
     477          86 :             CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist, sab_orb=sab_hfx)
     478          86 :             dbcsr_template_hfx => matrix_s(1)%matrix
     479             :          END IF
     480             : 
     481         206 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     482         206 :          ALLOCATE (work_matrices%hfx_fm_ao_ao)
     483         206 :          CALL cp_fm_create(work_matrices%hfx_fm_ao_ao, fm_struct)
     484         206 :          CALL cp_fm_struct_release(fm_struct)
     485             : 
     486         206 :          CALL dbcsr_allocate_matrix_set(work_matrices%hfx_rho_ao_symm, nspins)
     487         206 :          CALL dbcsr_allocate_matrix_set(work_matrices%hfx_rho_ao_asymm, nspins)
     488         424 :          DO ispin = 1, nspins
     489         218 :             CALL dbcsr_init_p(work_matrices%hfx_rho_ao_symm(ispin)%matrix)
     490             :             CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfx_rho_ao_symm(ispin)%matrix, &
     491         218 :                                              template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
     492             : 
     493         218 :             CALL dbcsr_init_p(work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
     494             :             CALL dbcsr_create(work_matrices%hfx_rho_ao_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
     495         218 :                               template=work_matrices%hfx_rho_ao_symm(ispin)%matrix)
     496             :             CALL dbcsr_complete_redistribute(work_matrices%hfx_rho_ao_symm(ispin)%matrix, &
     497         424 :                                              work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
     498             :          END DO
     499             : 
     500         206 :          CALL dbcsr_allocate_matrix_set(work_matrices%hfx_hmat_symm, nspins)
     501         206 :          CALL dbcsr_allocate_matrix_set(work_matrices%hfx_hmat_asymm, nspins)
     502         424 :          DO ispin = 1, nspins
     503         218 :             CALL dbcsr_init_p(work_matrices%hfx_hmat_symm(ispin)%matrix)
     504             :             CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfx_hmat_symm(ispin)%matrix, &
     505         218 :                                              template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
     506             : 
     507         218 :             CALL dbcsr_init_p(work_matrices%hfx_hmat_asymm(ispin)%matrix)
     508             :             CALL dbcsr_create(work_matrices%hfx_hmat_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
     509         218 :                               template=work_matrices%hfx_hmat_symm(ispin)%matrix)
     510             :             CALL dbcsr_complete_redistribute(work_matrices%hfx_hmat_symm(ispin)%matrix, &
     511         424 :                                              work_matrices%hfx_hmat_asymm(ispin)%matrix)
     512             :          END DO
     513             :       END IF
     514             : 
     515             :       ! matrices needed to do HFX short range calllculations
     516         566 :       NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
     517         566 :                work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
     518             :       ! matrices needed to do HFX long range calllculations
     519         566 :       IF (do_hfxlr) THEN
     520          12 :          DO ispin = 1, nspins
     521             :             CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, nrow_global=nao, &
     522          12 :                                      ncol_global=nmo_occ(ispin), context=sub_env%blacs_env)
     523             :          END DO
     524           6 :          CALL dbcsr_init_p(work_matrices%shalf)
     525           6 :          CALL dbcsr_create(work_matrices%shalf, template=matrix_s(1)%matrix)
     526          24 :          ALLOCATE (work_matrices%ctransformed(nspins))
     527          12 :          DO ispin = 1, nspins
     528          12 :             CALL cp_fm_create(work_matrices%ctransformed(ispin), fm_struct_evects(ispin)%struct)
     529             :          END DO
     530             :          ! forces
     531          18 :          ALLOCATE (work_matrices%S_eigenvalues(nao))
     532           6 :          NULLIFY (fm_struct)
     533           6 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     534           6 :          ALLOCATE (work_matrices%S_eigenvectors, work_matrices%slambda)
     535           6 :          CALL cp_fm_create(work_matrices%S_eigenvectors, fm_struct)
     536           6 :          CALL cp_fm_create(work_matrices%slambda, fm_struct)
     537             :          !
     538           6 :          CALL cp_fm_struct_release(fm_struct)
     539          12 :          DO ispin = 1, nspins
     540          12 :             CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
     541             :          END DO
     542             :       END IF
     543             : 
     544         566 :       CALL timestop(handle)
     545             : 
     546        2264 :    END SUBROUTINE tddfpt_create_work_matrices
     547             : 
     548             : ! **************************************************************************************************
     549             : !> \brief Allocate work matrices for hfxsr
     550             : !> \param work_matrices  work matrices (allocated on exit)
     551             : !> \param qs_env ...
     552             : !> \param admm_env ...
     553             : ! **************************************************************************************************
     554          12 :    SUBROUTINE hfxsr_create_work_matrices(work_matrices, qs_env, admm_env)
     555             :       TYPE(tddfpt_work_matrices), INTENT(inout)          :: work_matrices
     556             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     557             :       TYPE(admm_type), POINTER                           :: admm_env
     558             : 
     559             :       CHARACTER(LEN=*), PARAMETER :: routineN = 'hfxsr_create_work_matrices'
     560             : 
     561             :       INTEGER                                            :: handle, ispin, nao, nao_aux, nspins
     562             :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     563             :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct
     564             :       TYPE(dbcsr_distribution_type), POINTER             :: dbcsr_dist
     565           4 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: matrix_s, matrix_s_aux_fit
     566             :       TYPE(dbcsr_type), POINTER                          :: dbcsr_template_hfx
     567             :       TYPE(dft_control_type), POINTER                    :: dft_control
     568             :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     569           4 :          POINTER                                         :: sab_hfx
     570             : 
     571           4 :       CALL timeset(routineN, handle)
     572             : 
     573             :       ! matrices needed to do HFX short range calllculations
     574           4 :       NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
     575           4 :                work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
     576             : 
     577             :       CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, &
     578           4 :                       blacs_env=blacs_env, dbcsr_dist=dbcsr_dist)
     579           4 :       nspins = dft_control%nspins
     580           4 :       CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
     581           4 :       CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
     582           4 :       dbcsr_template_hfx => matrix_s_aux_fit(1)%matrix
     583           4 :       CALL dbcsr_get_info(dbcsr_template_hfx, nfullrows_total=nao_aux)
     584             : 
     585           4 :       CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     586           4 :       ALLOCATE (work_matrices%hfxsr_fm_ao_ao)
     587           4 :       CALL cp_fm_create(work_matrices%hfxsr_fm_ao_ao, fm_struct)
     588           4 :       CALL cp_fm_struct_release(fm_struct)
     589             : 
     590           4 :       CALL get_admm_env(admm_env, sab_aux_fit=sab_hfx)
     591           4 :       CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_rho_ao_symm, nspins)
     592           4 :       CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_rho_ao_asymm, nspins)
     593           8 :       DO ispin = 1, nspins
     594           4 :          CALL dbcsr_init_p(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
     595             :          CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix, &
     596           4 :                                           template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
     597             : 
     598           4 :          CALL dbcsr_init_p(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
     599             :          CALL dbcsr_create(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
     600           4 :                            template=work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
     601             :          CALL dbcsr_complete_redistribute(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix, &
     602           8 :                                           work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
     603             :       END DO
     604             : 
     605           4 :       CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_hmat_symm, nspins)
     606           4 :       CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_hmat_asymm, nspins)
     607           8 :       DO ispin = 1, nspins
     608           4 :          CALL dbcsr_init_p(work_matrices%hfxsr_hmat_symm(ispin)%matrix)
     609             :          CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfxsr_hmat_symm(ispin)%matrix, &
     610           4 :                                           template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
     611             : 
     612           4 :          CALL dbcsr_init_p(work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
     613             :          CALL dbcsr_create(work_matrices%hfxsr_hmat_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
     614           4 :                            template=work_matrices%hfxsr_hmat_symm(ispin)%matrix)
     615             :          CALL dbcsr_complete_redistribute(work_matrices%hfxsr_hmat_symm(ispin)%matrix, &
     616           8 :                                           work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
     617             :       END DO
     618             : 
     619           4 :       CALL timestop(handle)
     620             : 
     621           4 :    END SUBROUTINE hfxsr_create_work_matrices
     622             : 
     623             : ! **************************************************************************************************
     624             : !> \brief Allocate work matrices for sTDA kernel
     625             : !> \param work_matrices  work matrices (allocated on exit)
     626             : !> \param gs_mos         occupied and virtual molecular orbitals optimised for the ground state
     627             : !> \param nstates        number of excited states to converge
     628             : !> \param qs_env         Quickstep environment
     629             : !> \param sub_env        parallel group environment
     630             : !> \par History
     631             : !>    * 04.2019 created from full kernel version [JHU]
     632             : ! **************************************************************************************************
     633         992 :    SUBROUTINE stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
     634             :       TYPE(tddfpt_work_matrices), INTENT(out)            :: work_matrices
     635             :       TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
     636             :          INTENT(in)                                      :: gs_mos
     637             :       INTEGER, INTENT(in)                                :: nstates
     638             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     639             :       TYPE(tddfpt_subgroup_env_type), INTENT(in)         :: sub_env
     640             : 
     641             :       CHARACTER(LEN=*), PARAMETER :: routineN = 'stda_create_work_matrices'
     642             : 
     643             :       INTEGER                                            :: handle, igroup, ispin, istate, nao, &
     644             :                                                             ngroups, nspins
     645             :       INTEGER, DIMENSION(maxspins)                       :: nmo_occ, nmo_virt
     646             :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     647        1488 :       TYPE(cp_fm_struct_p_type), DIMENSION(maxspins)     :: fm_struct_evects
     648             :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct
     649         496 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: matrix_s
     650             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     651             : 
     652         496 :       CALL timeset(routineN, handle)
     653             : 
     654         496 :       NULLIFY (work_matrices%gamma_exchange, work_matrices%ctransformed)
     655             : 
     656         496 :       nspins = SIZE(gs_mos)
     657         496 :       CALL get_qs_env(qs_env, blacs_env=blacs_env, matrix_s=matrix_s)
     658         496 :       CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
     659             : 
     660        1024 :       DO ispin = 1, nspins
     661         528 :          nmo_occ(ispin) = SIZE(gs_mos(ispin)%evals_occ)
     662         496 :          nmo_virt(ispin) = SIZE(gs_mos(ispin)%evals_virt)
     663             :       END DO
     664             : 
     665         496 :       NULLIFY (fm_struct)
     666        2016 :       ALLOCATE (work_matrices%fm_pool_ao_mo_occ(nspins))
     667        1024 :       DO ispin = 1, nspins
     668         528 :          NULLIFY (work_matrices%fm_pool_ao_mo_occ(ispin)%pool)
     669         528 :          CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_occ(ispin), context=blacs_env)
     670         528 :          CALL fm_pool_create(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, fm_struct)
     671        1024 :          CALL cp_fm_struct_release(fm_struct)
     672             :       END DO
     673             : 
     674        2016 :       ALLOCATE (work_matrices%S_C0_C0T(nspins))
     675         496 :       CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     676        1024 :       DO ispin = 1, nspins
     677        1024 :          CALL cp_fm_create(work_matrices%S_C0_C0T(ispin), fm_struct)
     678             :       END DO
     679         496 :       CALL cp_fm_struct_release(fm_struct)
     680             : 
     681        2016 :       ALLOCATE (work_matrices%S_C0(nspins))
     682        1024 :       DO ispin = 1, nspins
     683         528 :          CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, work_matrices%S_C0(ispin))
     684             : 
     685             :          CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, gs_mos(ispin)%mos_occ, work_matrices%S_C0(ispin), &
     686         528 :                                       ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
     687             :          CALL parallel_gemm('N', 'T', nao, nao, nmo_occ(ispin), 1.0_dp, work_matrices%S_C0(ispin), &
     688        1024 :                             gs_mos(ispin)%mos_occ, 0.0_dp, work_matrices%S_C0_C0T(ispin))
     689             :       END DO
     690             : 
     691        1024 :       DO ispin = 1, nspins
     692             :          CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, nrow_global=nao, &
     693        1024 :                                   ncol_global=nmo_occ(ispin), context=sub_env%blacs_env)
     694             :       END DO
     695             : 
     696         496 :       IF (sub_env%is_split) THEN
     697           0 :          ALLOCATE (work_matrices%evects_sub(nspins, nstates), work_matrices%Aop_evects_sub(nspins, nstates))
     698             : 
     699           0 :          CALL blacs_env%get(para_env=para_env)
     700           0 :          igroup = sub_env%group_distribution(para_env%mepos)
     701           0 :          ngroups = sub_env%ngroups
     702             : 
     703           0 :          DO istate = ngroups - igroup, nstates, ngroups
     704           0 :             DO ispin = 1, nspins
     705           0 :                CALL cp_fm_create(work_matrices%evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
     706           0 :                CALL cp_fm_create(work_matrices%Aop_evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
     707             :             END DO
     708             :          END DO
     709             :       END IF
     710             : 
     711             :       ! sTDA specific work arrays
     712        2016 :       ALLOCATE (work_matrices%ctransformed(nspins))
     713        1024 :       DO ispin = 1, nspins
     714        1024 :          CALL cp_fm_create(work_matrices%ctransformed(ispin), fm_struct_evects(ispin)%struct)
     715             :       END DO
     716         496 :       NULLIFY (work_matrices%shalf)
     717         496 :       CALL dbcsr_init_p(work_matrices%shalf)
     718         496 :       CALL dbcsr_create(work_matrices%shalf, template=matrix_s(1)%matrix)
     719             :       ! forces
     720        1488 :       ALLOCATE (work_matrices%S_eigenvalues(nao))
     721         496 :       NULLIFY (fm_struct)
     722         496 :       CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
     723         496 :       ALLOCATE (work_matrices%S_eigenvectors, work_matrices%slambda)
     724         496 :       CALL cp_fm_create(work_matrices%S_eigenvectors, fm_struct)
     725         496 :       CALL cp_fm_create(work_matrices%slambda, fm_struct)
     726         496 :       CALL cp_fm_struct_release(fm_struct)
     727             : 
     728        1024 :       DO ispin = nspins, 1, -1
     729        1024 :          CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
     730             :       END DO
     731             : 
     732         496 :       NULLIFY (work_matrices%rho_ao_orb_fm_sub)
     733         496 :       NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub, work_matrices%wfm_aux_orb_sub)
     734         496 :       NULLIFY (work_matrices%rho_aux_fit_struct_sub)
     735         496 :       NULLIFY (work_matrices%rho_orb_struct_sub)
     736         496 :       NULLIFY (work_matrices%hfx_fm_ao_ao, work_matrices%hfx_rho_ao_symm, work_matrices%hfx_hmat_symm, &
     737         496 :                work_matrices%hfx_rho_ao_asymm, work_matrices%hfx_hmat_asymm)
     738         496 :       NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
     739         496 :                work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
     740         496 :       NULLIFY (work_matrices%A_ia_rspace_sub, work_matrices%wpw_gspace_sub, &
     741         496 :                work_matrices%wpw_rspace_sub)
     742         496 :       NULLIFY (work_matrices%fxc_rspace_sub)
     743         496 :       NULLIFY (work_matrices%A_ia_munu_sub)
     744             : 
     745         496 :       NULLIFY (work_matrices%ewald_env)
     746         496 :       NULLIFY (work_matrices%ewald_pw)
     747             : 
     748         496 :       NULLIFY (work_matrices%hartree_local)
     749         496 :       NULLIFY (work_matrices%local_rho_set)
     750         496 :       NULLIFY (work_matrices%local_rho_set_admm)
     751         496 :       NULLIFY (work_matrices%rho_xc_struct_sub)
     752             : 
     753         496 :       CALL timestop(handle)
     754             : 
     755        1488 :    END SUBROUTINE stda_create_work_matrices
     756             : 
     757             : ! **************************************************************************************************
     758             : !> \brief Release work matrices.
     759             : !> \param work_matrices  work matrices (destroyed on exit)
     760             : !> \param sub_env        parallel group environment
     761             : !> \par History
     762             : !>    * 02.2017 created [Sergey Chulkov]
     763             : ! **************************************************************************************************
     764        1062 :    SUBROUTINE tddfpt_release_work_matrices(work_matrices, sub_env)
     765             :       TYPE(tddfpt_work_matrices), INTENT(inout)          :: work_matrices
     766             :       TYPE(tddfpt_subgroup_env_type), INTENT(in)         :: sub_env
     767             : 
     768             :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tddfpt_release_work_matrices'
     769             : 
     770             :       INTEGER                                            :: handle, ispin
     771             :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     772             : 
     773        1062 :       CALL timeset(routineN, handle)
     774             : 
     775             :       ! HFX-related matrices
     776        1062 :       IF (ASSOCIATED(work_matrices%hfx_hmat_symm)) THEN
     777         424 :          DO ispin = SIZE(work_matrices%hfx_hmat_symm), 1, -1
     778         424 :             CALL dbcsr_deallocate_matrix(work_matrices%hfx_hmat_symm(ispin)%matrix)
     779             :          END DO
     780         206 :          DEALLOCATE (work_matrices%hfx_hmat_symm)
     781             :       END IF
     782             : 
     783        1062 :       IF (ASSOCIATED(work_matrices%hfx_hmat_asymm)) THEN
     784         424 :          DO ispin = SIZE(work_matrices%hfx_hmat_asymm), 1, -1
     785         424 :             CALL dbcsr_deallocate_matrix(work_matrices%hfx_hmat_asymm(ispin)%matrix)
     786             :          END DO
     787         206 :          DEALLOCATE (work_matrices%hfx_hmat_asymm)
     788             :       END IF
     789             : 
     790        1062 :       IF (ASSOCIATED(work_matrices%hfx_rho_ao_symm)) THEN
     791         424 :          DO ispin = SIZE(work_matrices%hfx_rho_ao_symm), 1, -1
     792         424 :             CALL dbcsr_deallocate_matrix(work_matrices%hfx_rho_ao_symm(ispin)%matrix)
     793             :          END DO
     794         206 :          DEALLOCATE (work_matrices%hfx_rho_ao_symm)
     795             :       END IF
     796             : 
     797        1062 :       IF (ASSOCIATED(work_matrices%hfx_rho_ao_asymm)) THEN
     798         424 :          DO ispin = SIZE(work_matrices%hfx_rho_ao_asymm), 1, -1
     799         424 :             CALL dbcsr_deallocate_matrix(work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
     800             :          END DO
     801         206 :          DEALLOCATE (work_matrices%hfx_rho_ao_asymm)
     802             :       END IF
     803             : 
     804        1062 :       IF (ASSOCIATED(work_matrices%hfx_fm_ao_ao)) THEN
     805         206 :          CALL cp_fm_release(work_matrices%hfx_fm_ao_ao)
     806         206 :          DEALLOCATE (work_matrices%hfx_fm_ao_ao)
     807             :       END IF
     808             : 
     809             :       ! HFXSR-related matrices
     810        1062 :       IF (ASSOCIATED(work_matrices%hfxsr_hmat_symm)) THEN
     811           8 :          DO ispin = SIZE(work_matrices%hfxsr_hmat_symm), 1, -1
     812           8 :             CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_hmat_symm(ispin)%matrix)
     813             :          END DO
     814           4 :          DEALLOCATE (work_matrices%hfxsr_hmat_symm)
     815             :       END IF
     816             : 
     817        1062 :       IF (ASSOCIATED(work_matrices%hfxsr_hmat_asymm)) THEN
     818           8 :          DO ispin = SIZE(work_matrices%hfxsr_hmat_asymm), 1, -1
     819           8 :             CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
     820             :          END DO
     821           4 :          DEALLOCATE (work_matrices%hfxsr_hmat_asymm)
     822             :       END IF
     823             : 
     824        1062 :       IF (ASSOCIATED(work_matrices%hfxsr_rho_ao_symm)) THEN
     825           8 :          DO ispin = SIZE(work_matrices%hfxsr_rho_ao_symm), 1, -1
     826           8 :             CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
     827             :          END DO
     828           4 :          DEALLOCATE (work_matrices%hfxsr_rho_ao_symm)
     829             :       END IF
     830             : 
     831        1062 :       IF (ASSOCIATED(work_matrices%hfxsr_rho_ao_asymm)) THEN
     832           8 :          DO ispin = SIZE(work_matrices%hfxsr_rho_ao_asymm), 1, -1
     833           8 :             CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
     834             :          END DO
     835           4 :          DEALLOCATE (work_matrices%hfxsr_rho_ao_asymm)
     836             :       END IF
     837             : 
     838        1062 :       IF (ASSOCIATED(work_matrices%hfxsr_fm_ao_ao)) THEN
     839           4 :          CALL cp_fm_release(work_matrices%hfxsr_fm_ao_ao)
     840           4 :          DEALLOCATE (work_matrices%hfxsr_fm_ao_ao)
     841             :       END IF
     842             : 
     843             :       ! real-space and reciprocal-space grids
     844        1062 :       IF (ASSOCIATED(sub_env%pw_env)) THEN
     845         566 :          CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
     846        1224 :          DO ispin = SIZE(work_matrices%wpw_rspace_sub), 1, -1
     847         658 :             CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_rspace_sub(ispin))
     848         658 :             CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_tau_rspace_sub(ispin))
     849         658 :             CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_gspace_sub(ispin))
     850        1224 :             CALL auxbas_pw_pool%give_back_pw(work_matrices%A_ia_rspace_sub(ispin))
     851             :          END DO
     852           0 :          DEALLOCATE (work_matrices%A_ia_rspace_sub, work_matrices%wpw_gspace_sub, &
     853         566 :                      work_matrices%wpw_rspace_sub, work_matrices%wpw_tau_rspace_sub)
     854         566 :          IF (ASSOCIATED(work_matrices%fxc_rspace_sub)) THEN
     855          48 :             DO ispin = SIZE(work_matrices%fxc_rspace_sub), 1, -1
     856          48 :                CALL auxbas_pw_pool%give_back_pw(work_matrices%fxc_rspace_sub(ispin))
     857             :             END DO
     858          12 :             DEALLOCATE (work_matrices%fxc_rspace_sub)
     859             :          END IF
     860             :       END IF
     861             : 
     862        1062 :       IF (ASSOCIATED(work_matrices%rho_aux_fit_struct_sub)) THEN
     863         120 :          CALL qs_rho_release(work_matrices%rho_aux_fit_struct_sub)
     864         120 :          DEALLOCATE (work_matrices%rho_aux_fit_struct_sub)
     865             :       END IF
     866        1062 :       IF (ASSOCIATED(work_matrices%rho_orb_struct_sub)) THEN
     867         566 :          CALL qs_rho_release(work_matrices%rho_orb_struct_sub)
     868         566 :          DEALLOCATE (work_matrices%rho_orb_struct_sub)
     869             :       END IF
     870             : 
     871        1062 :       IF (ASSOCIATED(work_matrices%A_ia_munu_sub)) THEN
     872        1224 :          DO ispin = SIZE(work_matrices%A_ia_munu_sub), 1, -1
     873        1224 :             CALL dbcsr_deallocate_matrix(work_matrices%A_ia_munu_sub(ispin)%matrix)
     874             :          END DO
     875         566 :          DEALLOCATE (work_matrices%A_ia_munu_sub)
     876             :       END IF
     877             : 
     878        1062 :       IF (ASSOCIATED(work_matrices%wfm_aux_orb_sub)) THEN
     879         120 :          CALL cp_fm_release(work_matrices%wfm_aux_orb_sub)
     880         120 :          DEALLOCATE (work_matrices%wfm_aux_orb_sub)
     881             :          NULLIFY (work_matrices%wfm_aux_orb_sub)
     882             :       END IF
     883        1062 :       IF (ASSOCIATED(work_matrices%rho_ao_aux_fit_fm_sub)) THEN
     884         120 :          CALL cp_fm_release(work_matrices%rho_ao_aux_fit_fm_sub)
     885         120 :          DEALLOCATE (work_matrices%rho_ao_aux_fit_fm_sub)
     886             :          NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub)
     887             :       END IF
     888        1062 :       IF (ASSOCIATED(work_matrices%rho_ao_orb_fm_sub)) THEN
     889         566 :          CALL cp_fm_release(work_matrices%rho_ao_orb_fm_sub)
     890         566 :          DEALLOCATE (work_matrices%rho_ao_orb_fm_sub)
     891             :          NULLIFY (work_matrices%rho_ao_orb_fm_sub)
     892             :       END IF
     893             : 
     894        1062 :       CALL cp_fm_release(work_matrices%Aop_evects_sub)
     895        1062 :       CALL cp_fm_release(work_matrices%evects_sub)
     896             : 
     897        1062 :       CALL cp_fm_release(work_matrices%S_C0)
     898        1062 :       CALL cp_fm_release(work_matrices%S_C0_C0T)
     899             : 
     900        2248 :       DO ispin = SIZE(work_matrices%fm_pool_ao_mo_occ), 1, -1
     901        2248 :          CALL fm_pool_release(work_matrices%fm_pool_ao_mo_occ(ispin)%pool)
     902             :       END DO
     903        1062 :       DEALLOCATE (work_matrices%fm_pool_ao_mo_occ)
     904             : 
     905             :       ! sTDA
     906        1062 :       IF (ASSOCIATED(work_matrices%gamma_exchange)) THEN
     907         308 :          CALL dbcsr_deallocate_matrix_set(work_matrices%gamma_exchange)
     908         308 :          NULLIFY (work_matrices%gamma_exchange)
     909             :       END IF
     910        1062 :       IF (ASSOCIATED(work_matrices%ctransformed)) THEN
     911         502 :          CALL cp_fm_release(work_matrices%ctransformed)
     912         502 :          NULLIFY (work_matrices%ctransformed)
     913             :       END IF
     914        1062 :       CALL dbcsr_release_p(work_matrices%shalf)
     915             :       !
     916        1062 :       IF (ASSOCIATED(work_matrices%S_eigenvectors)) THEN
     917         502 :          CALL cp_fm_release(work_matrices%S_eigenvectors)
     918         502 :          DEALLOCATE (work_matrices%S_eigenvectors)
     919             :       END IF
     920        1062 :       IF (ASSOCIATED(work_matrices%slambda)) THEN
     921         502 :          CALL cp_fm_release(work_matrices%slambda)
     922         502 :          DEALLOCATE (work_matrices%slambda)
     923             :       END IF
     924        1062 :       IF (ASSOCIATED(work_matrices%S_eigenvalues)) &
     925         502 :          DEALLOCATE (work_matrices%S_eigenvalues)
     926             :       ! Ewald
     927        1062 :       IF (ASSOCIATED(work_matrices%ewald_env)) THEN
     928          94 :          CALL ewald_env_release(work_matrices%ewald_env)
     929          94 :          DEALLOCATE (work_matrices%ewald_env)
     930             :       END IF
     931        1062 :       IF (ASSOCIATED(work_matrices%ewald_pw)) THEN
     932          94 :          CALL ewald_pw_release(work_matrices%ewald_pw)
     933          94 :          DEALLOCATE (work_matrices%ewald_pw)
     934             :       END IF
     935             :       ! GAPW
     936        1062 :       IF (ASSOCIATED(work_matrices%local_rho_set)) THEN
     937         192 :          CALL local_rho_set_release(work_matrices%local_rho_set)
     938             :       END IF
     939        1062 :       IF (ASSOCIATED(work_matrices%local_rho_set_admm)) THEN
     940          34 :          CALL local_rho_set_release(work_matrices%local_rho_set_admm)
     941             :       END IF
     942        1062 :       IF (ASSOCIATED(work_matrices%hartree_local)) THEN
     943         160 :          CALL hartree_local_release(work_matrices%hartree_local)
     944             :       END IF
     945             :       ! GAPW_XC
     946        1062 :       IF (ASSOCIATED(work_matrices%rho_xc_struct_sub)) THEN
     947          32 :          CALL qs_rho_release(work_matrices%rho_xc_struct_sub)
     948          32 :          DEALLOCATE (work_matrices%rho_xc_struct_sub)
     949             :       END IF
     950             : 
     951        1062 :       CALL timestop(handle)
     952             : 
     953        1062 :    END SUBROUTINE tddfpt_release_work_matrices
     954             : 
     955           0 : END MODULE qs_tddfpt2_types

Generated by: LCOV version 1.15