LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 94.7 % 456 432
Test Date: 2026-11-04 00:58:17 Functions: 65.2 % 23 15

            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 Types and basic routines needed for a kpoint calculation
      10              : !> \par History
      11              : !>       2014.07 created [JGH]
      12              : !>       2014.11 unified k-point and gamma-point code [Ole Schuett]
      13              : !> \author JGH
      14              : ! **************************************************************************************************
      15              : MODULE kpoint_types
      16              :    USE cell_types,                      ONLY: cell_type
      17              :    USE cp_blacs_env,                    ONLY: cp_blacs_env_release,&
      18              :                                               cp_blacs_env_type
      19              :    USE cp_cfm_types,                    ONLY: cp_cfm_release,&
      20              :                                               cp_cfm_type
      21              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      22              :                                               cp_fm_type
      23              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      24              :                                               cp_logger_get_default_unit_nr,&
      25              :                                               cp_logger_type
      26              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      27              :                                               cp_print_key_unit_nr
      28              :    USE input_cp2k_kpoints,              ONLY: lattice_fft_auto,&
      29              :                                               use_complex_wfn,&
      30              :                                               use_k290_kpoint_backend,&
      31              :                                               use_k290_kpoint_symmetry,&
      32              :                                               use_real_wfn,&
      33              :                                               use_spglib_kpoint_backend,&
      34              :                                               use_spglib_kpoint_symmetry
      35              :    USE input_section_types,             ONLY: section_vals_get,&
      36              :                                               section_vals_type,&
      37              :                                               section_vals_val_get
      38              :    USE kinds,                           ONLY: default_string_length,&
      39              :                                               dp
      40              :    USE local_gemm_api,                  ONLY: local_gemm_ctxt_type
      41              :    USE mathconstants,                   ONLY: twopi
      42              :    USE message_passing,                 ONLY: mp_para_env_release,&
      43              :                                               mp_para_env_type
      44              :    USE physcon,                         ONLY: angstrom
      45              :    USE qs_diis_types,                   ONLY: qs_diis_b_release_kp,&
      46              :                                               qs_diis_buffer_type_kp
      47              :    USE qs_matrix_pools,                 ONLY: mpools_release,&
      48              :                                               qs_matrix_pools_type
      49              :    USE qs_mo_types,                     ONLY: deallocate_mo_set,&
      50              :                                               mo_set_type
      51              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      52              :    USE string_utilities,                ONLY: uppercase
      53              : #include "./base/base_uses.f90"
      54              : 
      55              :    IMPLICIT NONE
      56              : 
      57              :    PRIVATE
      58              : 
      59              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
      60              : 
      61              :    PUBLIC :: kpoint_type
      62              :    PUBLIC :: kpoint_create, kpoint_release, kpoint_reset_initialization, get_kpoint_info, set_kpoint_info
      63              :    PUBLIC :: read_kpoint_section, write_kpoint_info
      64              :    PUBLIC :: kpoint_clear_scf_smat
      65              :    PUBLIC :: kpoint_env_type, kpoint_env_p_type
      66              :    PUBLIC :: kpoint_env_create, get_kpoint_env
      67              :    PUBLIC :: kind_rotmat_type
      68              :    PUBLIC :: kpoint_sym_type
      69              :    PUBLIC :: kpoint_sym_create, find_kpoint_rotation_slot
      70              : 
      71              : ! **************************************************************************************************
      72              : !> \brief Keeps information about a specific k-point
      73              : !> \param nkpoint   the kpoint index
      74              : !> \param wkp       weight of this kpoint
      75              : !> \param xkp       kpoint coordinates in units of b-vector
      76              : !> \param is_local  if this kpoint is calculated on a single thread
      77              : !> \param mos       associated MOs (spin); complex coefficients use native CFM storage
      78              : !> \param mos_prefilled the MOS hold meaningful coefficients (refilled and
      79              : !>                     reorthogonalized by wavefunction extrapolation for the
      80              : !>                     current geometry) rather than being only allocated
      81              : !> \param pmat      associated density matrix (r/i,spin)
      82              : !> \param wmat      associated energy weighted density matrix (r/i,spin)
      83              : !> \param smat      real ADMM auxiliary overlap matrix
      84              : !> \param amat      real ADMM basis projection matrix
      85              : !> \param csmat     complex ADMM auxiliary overlap matrix
      86              : !> \param camat     complex ADMM basis projection matrix
      87              : !> \param ot_hmat   channel-local Kohn-Sham matrix for k-point OT (r/i,spin)
      88              : !> \param ot_smat   channel-local overlap matrix for k-point OT (r/i)
      89              : !> \param ot_tmat   channel-local kinetic-energy matrix for k-point OT (r/i)
      90              : !> \param shalf     S(K)^(1/2) DFT+U Lowdin method (real wfn)
      91              : !> \param cshalf    S(K)^(1/2) DFT+U Lowdin method (complex wfn)
      92              : !> \author JGH
      93              : ! **************************************************************************************************
      94              :    TYPE kpoint_env_type
      95              :       INTEGER                                           :: nkpoint = -1
      96              :       REAL(KIND=dp)                                     :: wkp = 0.0_dp
      97              :       REAL(KIND=dp), DIMENSION(3)                       :: xkp = 0.0_dp
      98              :       LOGICAL                                           :: is_local = .FALSE.
      99              :       TYPE(mo_set_type), DIMENSION(:), POINTER          :: mos => NULL()
     100              :       LOGICAL                                           :: mos_prefilled = .FALSE.
     101              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: pmat => NULL()
     102              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: wmat => NULL()
     103              :       TYPE(cp_fm_type)                                  :: smat, amat
     104              :       TYPE(cp_cfm_type)                                 :: csmat, camat
     105              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: ot_hmat => NULL()
     106              :       TYPE(cp_fm_type), DIMENSION(:), POINTER            :: ot_smat => NULL()
     107              :       TYPE(cp_fm_type), DIMENSION(:), POINTER            :: ot_tmat => NULL()
     108              :       TYPE(cp_fm_type)                                  :: shalf
     109              :       TYPE(cp_cfm_type)                                 :: cshalf
     110              :       ! Selected columns of S(k)**(1/2), with one reusable product workspace.
     111              :       TYPE(cp_fm_type)                                  :: lowdin_b, lowdin_work
     112              :       TYPE(cp_cfm_type)                                 :: lowdin_cb, lowdin_cwork
     113              :       ! Spectrum of S for analytic Lowdin derivatives, retained only for force runs.
     114              :       TYPE(cp_cfm_type)                                 :: lowdin_evec
     115              :       REAL(dp), ALLOCATABLE                             :: lowdin_sqrt(:)
     116              :       TYPE(local_gemm_ctxt_type)                        :: lowdin_gemm
     117              :    END TYPE kpoint_env_type
     118              : 
     119              :    TYPE kpoint_env_p_type
     120              :       TYPE(kpoint_env_type), POINTER                    :: kpoint_env => NULL()
     121              :    END TYPE kpoint_env_p_type
     122              : 
     123              : ! **************************************************************************************************
     124              : !> \brief Rotation matrices for basis sets
     125              : !> \param rmat      atom basis function rotation matrix
     126              : !> \author JGH
     127              : ! **************************************************************************************************
     128              :    TYPE kind_rotmat_type
     129              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: rmat => NULL()
     130              :    END TYPE kind_rotmat_type
     131              : 
     132              : ! **************************************************************************************************
     133              : !> \brief Keeps symmetry information about a specific k-point
     134              : !> \param apply_symmetry ...
     135              : !> \param nwght     kpoint multiplicity
     136              : !> \param xkp       kpoint coordinates
     137              : !> \param rot       rotation matrices
     138              : !> \param f0        atom permutation
     139              : !> \param fcell     atom cell shifts generated by the symmetry operation
     140              : !> \param fcell_gauge atom cell shifts in CP2K's internal PBC gauge
     141              : !> \param phase_mode Bloch phase direction selected from overlap covariance
     142              : !> \author JGH
     143              : ! **************************************************************************************************
     144              :    TYPE kpoint_sym_type
     145              :       LOGICAL                                           :: apply_symmetry = .FALSE.
     146              :       INTEGER                                           :: nwght = -1
     147              :       INTEGER                                           :: nwred = -1
     148              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: xkp => NULL()
     149              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: rot => NULL()
     150              :       INTEGER, DIMENSION(:), POINTER                    :: rotp => NULL()
     151              :       INTEGER, DIMENSION(:, :), POINTER                 :: f0 => NULL()
     152              :       INTEGER, DIMENSION(:, :, :), POINTER              :: fcell => NULL()
     153              :       INTEGER, DIMENSION(:, :, :), POINTER              :: fcell_gauge => NULL()
     154              :       INTEGER, DIMENSION(:), POINTER                    :: phase_mode => NULL()
     155              :    END TYPE kpoint_sym_type
     156              : 
     157              :    TYPE kpoint_sym_p_type
     158              :       TYPE(kpoint_sym_type), POINTER                    :: kpoint_sym => NULL()
     159              :    END TYPE kpoint_sym_p_type
     160              : 
     161              : ! **************************************************************************************************
     162              : !> \brief Contains information about kpoints
     163              : !> \par History
     164              : !>       2014.07 created [JGH]
     165              : !> \param kp_scheme           [input] Type of kpoint grid
     166              : !> \param nkp_grid            [input] Grid points
     167              : !> \param kp_shift            [input] Shift of the grid
     168              : !> \param use_real_wfn        [input] real/complex wfn
     169              : !> \param symmetry            [input] use symmetry (atoms) to reduce kpoints
     170              : !> \param full_grid           [input] don't reduce kpoints at all
     171              : !> \param lattice_fft         [input] lattice FFT selection mode
     172              : !> \param inversion_symmetry_only [input] reduce kpoints only by inversion symmetry
     173              : !> \param symmetry_backend [input] k-point symmetry backend
     174              : !> \param symmetry_reduction_method [input] k-point symmetry reduction method
     175              : !> \param verbose             [input] more output information
     176              : !> \param eps_geo             [input] accuracy of atom symmetry detection
     177              : !> \param parallel_group_size [input] kpoint group size
     178              : !> \param nkp     number of kpoints
     179              : !> \param xkp     kpoint coordinates
     180              : !> \param wkp     kpoint weights
     181              : !> \param xkp_input explicit GENERAL kpoint coordinates as read from the input
     182              : !> \param wkp_input explicit GENERAL kpoint weights as read from the input
     183              : !> \param para_env 'global' parallel environment
     184              : !> \param para_env_kp parallel environment of the kpoint calculation
     185              : !> \param para_env_inter_kp parallel environment between kpoints
     186              : !> \param iogrp  this kpoint group has the IO processor
     187              : !> \param nkp_groups   number of kpoint groups
     188              : !> \param kp_dist      kpoints distribution on groups
     189              : !> \param kp_range     kpoints distribution for local processor
     190              : !> \param blacs_env    BLACS env for the kpoint group
     191              : !> \param opmats       Operator matrices
     192              : !> \param kp_env       Information for each kpoint
     193              : !> \param mpools       FM matrix pools for kpoint groups
     194              : !> \author JGH
     195              : ! **************************************************************************************************
     196              :    TYPE kpoint_type
     197              :       CHARACTER(LEN=default_string_length)    :: kp_scheme = ""
     198              :       INTEGER, DIMENSION(3)                   :: nkp_grid = -1
     199              :       REAL(KIND=dp), DIMENSION(3)             :: kp_shift = 0.0_dp
     200              :       LOGICAL                                 :: gamma_centered = .FALSE.
     201              :       LOGICAL                                 :: use_real_wfn = .FALSE.
     202              :       LOGICAL                                 :: symmetry = .FALSE.
     203              :       LOGICAL                                 :: full_grid = .FALSE.
     204              :       INTEGER                                 :: lattice_fft = lattice_fft_auto
     205              :       LOGICAL                                 :: inversion_symmetry_only = .FALSE.
     206              :       INTEGER                                 :: symmetry_backend = use_k290_kpoint_backend
     207              :       INTEGER                                 :: symmetry_reduction_method = use_k290_kpoint_symmetry
     208              :       LOGICAL                                 :: verbose = .FALSE.
     209              :       REAL(KIND=dp)                           :: eps_geo = 0.0_dp
     210              :       INTEGER                                 :: parallel_group_size = -1
     211              :       INTEGER                                 :: nkp = -1
     212              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => Null()
     213              :       REAL(KIND=dp), DIMENSION(:), POINTER    :: wkp => Null()
     214              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp_input => Null()
     215              :       REAL(KIND=dp), DIMENSION(:), POINTER    :: wkp_input => Null()
     216              :       ! parallel environment
     217              :       TYPE(mp_para_env_type), POINTER         :: para_env => Null()
     218              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env_all => Null()
     219              :       TYPE(mp_para_env_type), POINTER         :: para_env_kp => Null(), &
     220              :                                                  para_env_inter_kp => Null()
     221              :       LOGICAL                                 :: iogrp = .FALSE.
     222              :       INTEGER                                 :: nkp_groups = -1
     223              :       INTEGER, DIMENSION(:, :), POINTER       :: kp_dist => Null()
     224              :       INTEGER, DIMENSION(2)                   :: kp_range = -1
     225              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env => Null()
     226              :       INTEGER, DIMENSION(:, :, :), POINTER    :: cell_to_index => Null()
     227              :       INTEGER, DIMENSION(:, :), POINTER       :: index_to_cell => Null()
     228              :       TYPE(neighbor_list_set_p_type), &
     229              :          DIMENSION(:), POINTER                :: sab_nl => Null(), &
     230              :                                                  sab_nl_nosym => Null()
     231              :       ! environment
     232              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     233              :          POINTER                              :: kp_env => Null()
     234              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     235              :          POINTER                              :: kp_aux_env => Null()
     236              :       ! symmetry
     237              :       TYPE(kpoint_sym_p_type), DIMENSION(:), &
     238              :          POINTER                              :: kp_sym => Null()
     239              :       LOGICAL                                 :: phases_calibrated = .FALSE.
     240              :       INTEGER, DIMENSION(:), POINTER          :: atype => Null()
     241              :       INTEGER, DIMENSION(:), POINTER          :: ibrot => Null()
     242              :       TYPE(kind_rotmat_type), DIMENSION(:, :), &
     243              :          POINTER                              :: kind_rotmat => Null()
     244              :       TYPE(kind_rotmat_type), DIMENSION(:, :), &
     245              :          POINTER                              :: kind_rotmat_aux => Null()
     246              :       ! pools
     247              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools => Null()
     248              :       TYPE(qs_diis_buffer_type_kp), POINTER   :: scf_diis_buffer => Null()
     249              :       ! Unmodified complex overlaps for the current SCF run, indexed by local k-point.
     250              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: scf_smat
     251              :       ! Selected AO indices, accepted density/potential, and a separate cached trial density.
     252              :       INTEGER, ALLOCATABLE :: lowdin_orbitals(:)
     253              :       REAL(dp), ALLOCATABLE :: lowdin_q(:, :), lowdin_v(:, :), lowdin_q_new(:, :)
     254              :       LOGICAL :: lowdin_density_ready = .FALSE., lowdin_population_ready = .FALSE.
     255              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools_aux_fit => Null()
     256              :    END TYPE kpoint_type
     257              : 
     258              : ! **************************************************************************************************
     259              : 
     260              : CONTAINS
     261              : 
     262              : ! **************************************************************************************************
     263              : !> \brief Create a kpoint environment
     264              : !> \param kpoint  All the kpoint information
     265              : !> \author JGH
     266              : ! **************************************************************************************************
     267         9914 :    SUBROUTINE kpoint_create(kpoint)
     268              :       TYPE(kpoint_type), POINTER                         :: kpoint
     269              : 
     270         9914 :       CPASSERT(.NOT. ASSOCIATED(kpoint))
     271              : 
     272       109054 :       ALLOCATE (kpoint)
     273              : 
     274         9914 :       kpoint%kp_scheme = ""
     275        39656 :       kpoint%nkp_grid = 0
     276        39656 :       kpoint%kp_shift = 0.0_dp
     277         9914 :       kpoint%gamma_centered = .FALSE.
     278         9914 :       kpoint%symmetry = .FALSE.
     279         9914 :       kpoint%verbose = .FALSE.
     280         9914 :       kpoint%full_grid = .FALSE.
     281         9914 :       kpoint%lattice_fft = lattice_fft_auto
     282         9914 :       kpoint%inversion_symmetry_only = .FALSE.
     283         9914 :       kpoint%symmetry_backend = use_k290_kpoint_backend
     284         9914 :       kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
     285         9914 :       kpoint%use_real_wfn = .FALSE.
     286         9914 :       kpoint%eps_geo = 1.0e-6_dp
     287         9914 :       kpoint%parallel_group_size = -1
     288              : 
     289         9914 :       kpoint%nkp = 0
     290         9914 :       kpoint%phases_calibrated = .FALSE.
     291              : 
     292         9914 :       NULLIFY (kpoint%xkp, kpoint%wkp)
     293         9914 :       NULLIFY (kpoint%xkp_input, kpoint%wkp_input)
     294         9914 :       NULLIFY (kpoint%kp_dist)
     295              : 
     296         9914 :       NULLIFY (kpoint%para_env)
     297         9914 :       NULLIFY (kpoint%blacs_env_all)
     298         9914 :       NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
     299         9914 :       NULLIFY (kpoint%blacs_env)
     300         9914 :       kpoint%nkp_groups = 0
     301         9914 :       kpoint%iogrp = .FALSE.
     302        29742 :       kpoint%kp_range = 0
     303              : 
     304         9914 :       NULLIFY (kpoint%kp_env)
     305         9914 :       NULLIFY (kpoint%mpools)
     306              : 
     307         9914 :       ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
     308        39656 :       kpoint%cell_to_index(:, :, :) = 1
     309              : 
     310         9914 :       ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
     311        29742 :       kpoint%index_to_cell(:, :) = 0
     312              : 
     313         9914 :    END SUBROUTINE kpoint_create
     314              : 
     315              : ! **************************************************************************************************
     316              : !> \brief  Release a kpoint environment, deallocate all data
     317              : !> \param kpoint  The kpoint environment
     318              : !> \author JGH
     319              : ! **************************************************************************************************
     320        19297 :    SUBROUTINE kpoint_release(kpoint)
     321              :       TYPE(kpoint_type), POINTER                         :: kpoint
     322              : 
     323              :       INTEGER                                            :: i, ik, j
     324              : 
     325        19297 :       IF (ASSOCIATED(kpoint)) THEN
     326         9914 :          CALL kpoint_clear_scf_smat(kpoint)
     327              : 
     328         9914 :          IF (ASSOCIATED(kpoint%xkp)) THEN
     329         1278 :             DEALLOCATE (kpoint%xkp)
     330              :          END IF
     331         9914 :          IF (ASSOCIATED(kpoint%wkp)) THEN
     332         1278 :             DEALLOCATE (kpoint%wkp)
     333              :          END IF
     334         9914 :          IF (ASSOCIATED(kpoint%xkp_input)) THEN
     335           18 :             DEALLOCATE (kpoint%xkp_input)
     336              :          END IF
     337         9914 :          IF (ASSOCIATED(kpoint%wkp_input)) THEN
     338           18 :             DEALLOCATE (kpoint%wkp_input)
     339              :          END IF
     340         9914 :          IF (ASSOCIATED(kpoint%kp_dist)) THEN
     341          950 :             DEALLOCATE (kpoint%kp_dist)
     342              :          END IF
     343              : 
     344         9914 :          CALL mpools_release(kpoint%mpools)
     345         9914 :          CALL mpools_release(kpoint%mpools_aux_fit)
     346              : 
     347         9914 :          CALL cp_blacs_env_release(kpoint%blacs_env)
     348         9914 :          CALL cp_blacs_env_release(kpoint%blacs_env_all)
     349              : 
     350         9914 :          CALL mp_para_env_release(kpoint%para_env)
     351         9914 :          CALL mp_para_env_release(kpoint%para_env_kp)
     352         9914 :          CALL mp_para_env_release(kpoint%para_env_inter_kp)
     353              : 
     354         9914 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     355         9914 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     356              : 
     357         9914 :          IF (ASSOCIATED(kpoint%kp_env)) THEN
     358         4799 :             DO ik = 1, SIZE(kpoint%kp_env)
     359         4799 :                CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
     360              :             END DO
     361          950 :             DEALLOCATE (kpoint%kp_env)
     362              :          END IF
     363              : 
     364         9914 :          IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
     365          211 :             DO ik = 1, SIZE(kpoint%kp_aux_env)
     366          211 :                CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
     367              :             END DO
     368           36 :             DEALLOCATE (kpoint%kp_aux_env)
     369              :          END IF
     370              : 
     371         9914 :          IF (ASSOCIATED(kpoint%kp_sym)) THEN
     372        16880 :             DO ik = 1, SIZE(kpoint%kp_sym)
     373        16880 :                CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
     374              :             END DO
     375          938 :             DEALLOCATE (kpoint%kp_sym)
     376              :          END IF
     377              : 
     378         9914 :          IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
     379         9914 :          IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
     380              : 
     381         9914 :          IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
     382        12412 :             DO i = 1, SIZE(kpoint%kind_rotmat, 1)
     383        24546 :                DO j = 1, SIZE(kpoint%kind_rotmat, 2)
     384        24002 :                   IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
     385        10054 :                      DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
     386              :                   END IF
     387              :                END DO
     388              :             END DO
     389          544 :             DEALLOCATE (kpoint%kind_rotmat)
     390              :          END IF
     391              : 
     392         9914 :          IF (ASSOCIATED(kpoint%kind_rotmat_aux)) THEN
     393        12412 :             DO i = 1, SIZE(kpoint%kind_rotmat_aux, 1)
     394        24546 :                DO j = 1, SIZE(kpoint%kind_rotmat_aux, 2)
     395        24002 :                   IF (ASSOCIATED(kpoint%kind_rotmat_aux(i, j)%rmat)) THEN
     396           60 :                      DEALLOCATE (kpoint%kind_rotmat_aux(i, j)%rmat)
     397              :                   END IF
     398              :                END DO
     399              :             END DO
     400          544 :             DEALLOCATE (kpoint%kind_rotmat_aux)
     401              :          END IF
     402              : 
     403         9914 :          IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
     404          374 :             CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
     405          374 :             DEALLOCATE (kpoint%scf_diis_buffer)
     406              :          END IF
     407              : 
     408         9914 :          DEALLOCATE (kpoint)
     409              : 
     410              :       END IF
     411              : 
     412        19297 :    END SUBROUTINE kpoint_release
     413              : 
     414              : ! **************************************************************************************************
     415              : !> \brief Release overlap matrices cached for a single SCF run.
     416              : !> \param kpoint The kpoint environment
     417              : ! **************************************************************************************************
     418        16698 :    SUBROUTINE kpoint_clear_scf_smat(kpoint)
     419              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     420              : 
     421              :       INTEGER                                            :: ikp
     422              : 
     423        16698 :       IF (ALLOCATED(kpoint%scf_smat)) THEN
     424        11496 :          DO ikp = 1, SIZE(kpoint%scf_smat)
     425        11496 :             CALL cp_cfm_release(kpoint%scf_smat(ikp))
     426              :          END DO
     427         3774 :          DEALLOCATE (kpoint%scf_smat)
     428              :       END IF
     429              : 
     430        16698 :    END SUBROUTINE kpoint_clear_scf_smat
     431              : 
     432              : ! **************************************************************************************************
     433              : !> \brief Reset all data derived from a concrete k-point initialization.
     434              : !>        Input options such as the scheme, grid, shifts and symmetry settings are kept.
     435              : !> \param kpoint  The kpoint environment
     436              : ! **************************************************************************************************
     437         2678 :    SUBROUTINE kpoint_reset_initialization(kpoint)
     438              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     439              : 
     440              :       INTEGER                                            :: i, ik, j
     441              : 
     442         2678 :       CALL kpoint_clear_scf_smat(kpoint)
     443         2678 :       IF (ALLOCATED(kpoint%lowdin_orbitals)) THEN
     444            0 :          DEALLOCATE (kpoint%lowdin_orbitals, kpoint%lowdin_q, kpoint%lowdin_q_new, kpoint%lowdin_v)
     445              :       END IF
     446         2678 :       kpoint%lowdin_density_ready = .FALSE.
     447         2678 :       kpoint%lowdin_population_ready = .FALSE.
     448              : 
     449         2678 :       IF (ASSOCIATED(kpoint%xkp)) THEN
     450         2678 :          DEALLOCATE (kpoint%xkp)
     451              :          NULLIFY (kpoint%xkp)
     452              :       END IF
     453         2678 :       IF (ASSOCIATED(kpoint%wkp)) THEN
     454         2678 :          DEALLOCATE (kpoint%wkp)
     455              :          NULLIFY (kpoint%wkp)
     456              :       END IF
     457         2678 :       IF (kpoint%kp_scheme == "GENERAL" .AND. ASSOCIATED(kpoint%xkp_input) .AND. &
     458              :           ASSOCIATED(kpoint%wkp_input)) THEN
     459           18 :          kpoint%nkp = SIZE(kpoint%wkp_input)
     460           90 :          ALLOCATE (kpoint%xkp(3, kpoint%nkp), kpoint%wkp(kpoint%nkp))
     461          594 :          kpoint%xkp(1:3, 1:kpoint%nkp) = kpoint%xkp_input(1:3, 1:kpoint%nkp)
     462          162 :          kpoint%wkp(1:kpoint%nkp) = kpoint%wkp_input(1:kpoint%nkp)
     463              :       END IF
     464         2678 :       IF (ASSOCIATED(kpoint%kp_dist)) THEN
     465         2354 :          DEALLOCATE (kpoint%kp_dist)
     466              :          NULLIFY (kpoint%kp_dist)
     467              :       END IF
     468              : 
     469         2678 :       CALL mpools_release(kpoint%mpools)
     470         2678 :       CALL mpools_release(kpoint%mpools_aux_fit)
     471              : 
     472         2678 :       CALL cp_blacs_env_release(kpoint%blacs_env)
     473         2678 :       CALL cp_blacs_env_release(kpoint%blacs_env_all)
     474              : 
     475         2678 :       CALL mp_para_env_release(kpoint%para_env)
     476         2678 :       CALL mp_para_env_release(kpoint%para_env_kp)
     477         2678 :       CALL mp_para_env_release(kpoint%para_env_inter_kp)
     478              : 
     479         2678 :       IF (ASSOCIATED(kpoint%cell_to_index)) THEN
     480         2678 :          DEALLOCATE (kpoint%cell_to_index)
     481              :          NULLIFY (kpoint%cell_to_index)
     482              :       END IF
     483         2678 :       IF (ASSOCIATED(kpoint%index_to_cell)) THEN
     484         2678 :          DEALLOCATE (kpoint%index_to_cell)
     485              :          NULLIFY (kpoint%index_to_cell)
     486              :       END IF
     487              : 
     488         2678 :       IF (ASSOCIATED(kpoint%kp_env)) THEN
     489         6140 :          DO ik = 1, SIZE(kpoint%kp_env)
     490         6140 :             CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
     491              :          END DO
     492         2354 :          DEALLOCATE (kpoint%kp_env)
     493              :          NULLIFY (kpoint%kp_env)
     494              :       END IF
     495              : 
     496         2678 :       IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
     497            0 :          DO ik = 1, SIZE(kpoint%kp_aux_env)
     498            0 :             CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
     499              :          END DO
     500            0 :          DEALLOCATE (kpoint%kp_aux_env)
     501              :          NULLIFY (kpoint%kp_aux_env)
     502              :       END IF
     503              : 
     504         2678 :       IF (ASSOCIATED(kpoint%kp_sym)) THEN
     505        10712 :          DO ik = 1, SIZE(kpoint%kp_sym)
     506        10712 :             CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
     507              :          END DO
     508         2678 :          DEALLOCATE (kpoint%kp_sym)
     509              :          NULLIFY (kpoint%kp_sym)
     510              :       END IF
     511              : 
     512         2678 :       IF (ASSOCIATED(kpoint%atype)) THEN
     513         2676 :          DEALLOCATE (kpoint%atype)
     514              :          NULLIFY (kpoint%atype)
     515              :       END IF
     516         2678 :       IF (ASSOCIATED(kpoint%ibrot)) THEN
     517         2668 :          DEALLOCATE (kpoint%ibrot)
     518              :          NULLIFY (kpoint%ibrot)
     519              :       END IF
     520              : 
     521         2678 :       IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
     522        17154 :          DO i = 1, SIZE(kpoint%kind_rotmat, 1)
     523        33514 :             DO j = 1, SIZE(kpoint%kind_rotmat, 2)
     524        30846 :                IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
     525         6578 :                   DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
     526         6578 :                   NULLIFY (kpoint%kind_rotmat(i, j)%rmat)
     527              :                END IF
     528              :             END DO
     529              :          END DO
     530         2668 :          DEALLOCATE (kpoint%kind_rotmat)
     531              :          NULLIFY (kpoint%kind_rotmat)
     532              :       END IF
     533              : 
     534         2678 :       IF (ASSOCIATED(kpoint%kind_rotmat_aux)) THEN
     535        17154 :          DO i = 1, SIZE(kpoint%kind_rotmat_aux, 1)
     536        33514 :             DO j = 1, SIZE(kpoint%kind_rotmat_aux, 2)
     537        30846 :                IF (ASSOCIATED(kpoint%kind_rotmat_aux(i, j)%rmat)) THEN
     538            0 :                   DEALLOCATE (kpoint%kind_rotmat_aux(i, j)%rmat)
     539            0 :                   NULLIFY (kpoint%kind_rotmat_aux(i, j)%rmat)
     540              :                END IF
     541              :             END DO
     542              :          END DO
     543         2668 :          DEALLOCATE (kpoint%kind_rotmat_aux)
     544              :          NULLIFY (kpoint%kind_rotmat_aux)
     545              :       END IF
     546              : 
     547         2678 :       IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
     548         2186 :          CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
     549         2186 :          DEALLOCATE (kpoint%scf_diis_buffer)
     550              :          NULLIFY (kpoint%scf_diis_buffer)
     551              :       END IF
     552              : 
     553         2678 :       NULLIFY (kpoint%sab_nl)
     554         2678 :       NULLIFY (kpoint%sab_nl_nosym)
     555              : 
     556         2678 :       ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
     557        10712 :       kpoint%cell_to_index(:, :, :) = 1
     558              : 
     559         2678 :       ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
     560         8034 :       kpoint%index_to_cell(:, :) = 0
     561              : 
     562         2678 :       IF (.NOT. ASSOCIATED(kpoint%wkp)) kpoint%nkp = 0
     563         2678 :       kpoint%nkp_groups = 0
     564         8034 :       kpoint%kp_range = 0
     565         2678 :       kpoint%iogrp = .FALSE.
     566              : 
     567         2678 :    END SUBROUTINE kpoint_reset_initialization
     568              : 
     569              : ! **************************************************************************************************
     570              : !> \brief Retrieve information from a kpoint environment
     571              : !> \param kpoint        The kpoint environment
     572              : !> \param kp_scheme     Type of kpoint grid
     573              : !> \param nkp_grid      Grid points
     574              : !> \param kp_shift      Shift of the grid
     575              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     576              : !> \param verbose       more output information
     577              : !> \param full_grid     don't reduce kpoints at all
     578              : !> \param use_real_wfn  real/complex wfn
     579              : !> \param eps_geo       accuracy of atom symmetry detection
     580              : !> \param parallel_group_size kpoint group size
     581              : !> \param kp_range      kpoints distribution for local processor
     582              : !> \param nkp           number of kpoints
     583              : !> \param xkp           kpoint coordinates in units of b-vector
     584              : !> \param wkp           kpoint weights
     585              : !> \param para_env      'global' parallel environment
     586              : !> \param blacs_env_all BLACS env for the total environment
     587              : !> \param para_env_kp   parallel environment of the kpoint calculation
     588              : !> \param para_env_inter_kp   parallel environment between kpoints
     589              : !> \param blacs_env     BLACS env for the kpoint group
     590              : !> \param kp_env        Information for each kpoint
     591              : !> \param kp_aux_env ...
     592              : !> \param mpools        FM matrix pools for kpoint groups
     593              : !> \param iogrp         this kpoint group has the IO processor
     594              : !> \param nkp_groups    number of kpoint groups
     595              : !> \param kp_dist       kpoints distribution on groups
     596              : !> \param cell_to_index given a cell triple, returns the real space index
     597              : !> \param index_to_cell ...
     598              : !> \param sab_nl        neighbourlist that defines real space matrices
     599              : !> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
     600              : !> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
     601              : !> \param symmetry_backend k-point symmetry backend
     602              : !> \param symmetry_reduction_method k-point symmetry reduction method
     603              : !> \param gamma_centered ...
     604              : !> \param lattice_fft   lattice FFT selection mode
     605              : !> \author JGH
     606              : ! **************************************************************************************************
     607      2774463 :    SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
     608              :                               full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
     609              :                               para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
     610              :                               kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
     611              :                               sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
     612              :                               symmetry_reduction_method, gamma_centered, lattice_fft)
     613              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
     614              :       CHARACTER(LEN=*), OPTIONAL                         :: kp_scheme
     615              :       INTEGER, DIMENSION(3), OPTIONAL                    :: nkp_grid
     616              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: kp_shift
     617              :       LOGICAL, OPTIONAL                                  :: symmetry, verbose, full_grid, &
     618              :                                                             use_real_wfn
     619              :       REAL(KIND=dp), OPTIONAL                            :: eps_geo
     620              :       INTEGER, OPTIONAL                                  :: parallel_group_size
     621              :       INTEGER, DIMENSION(2), OPTIONAL                    :: kp_range
     622              :       INTEGER, OPTIONAL                                  :: nkp
     623              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: xkp
     624              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     625              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     626              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_all
     627              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_kp, para_env_inter_kp
     628              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env
     629              :       TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
     630              :          POINTER                                         :: kp_env, kp_aux_env
     631              :       TYPE(qs_matrix_pools_type), OPTIONAL, POINTER      :: mpools
     632              :       LOGICAL, OPTIONAL                                  :: iogrp
     633              :       INTEGER, OPTIONAL                                  :: nkp_groups
     634              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: kp_dist
     635              :       INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER     :: cell_to_index
     636              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: index_to_cell
     637              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     638              :          OPTIONAL, POINTER                               :: sab_nl, sab_nl_nosym
     639              :       LOGICAL, OPTIONAL                                  :: inversion_symmetry_only
     640              :       INTEGER, OPTIONAL                                  :: symmetry_backend, &
     641              :                                                             symmetry_reduction_method
     642              :       LOGICAL, OPTIONAL                                  :: gamma_centered
     643              :       INTEGER, OPTIONAL                                  :: lattice_fft
     644              : 
     645         7516 :       IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
     646      2921663 :       IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
     647      2775111 :       IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
     648      2774463 :       IF (PRESENT(gamma_centered)) gamma_centered = kpoint%gamma_centered
     649      2774463 :       IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
     650      2774463 :       IF (PRESENT(verbose)) verbose = kpoint%verbose
     651      2774463 :       IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
     652      2774463 :       IF (PRESENT(lattice_fft)) lattice_fft = kpoint%lattice_fft
     653      2774463 :       IF (PRESENT(inversion_symmetry_only)) inversion_symmetry_only = kpoint%inversion_symmetry_only
     654      2774463 :       IF (PRESENT(symmetry_backend)) symmetry_backend = kpoint%symmetry_backend
     655      2774463 :       IF (PRESENT(symmetry_reduction_method)) THEN
     656            0 :          symmetry_reduction_method = kpoint%symmetry_reduction_method
     657              :       END IF
     658      2774463 :       IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
     659      2774463 :       IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
     660      2774463 :       IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
     661              : 
     662      2774463 :       IF (PRESENT(nkp)) nkp = kpoint%nkp
     663      2774463 :       IF (PRESENT(wkp)) wkp => kpoint%wkp
     664      2774463 :       IF (PRESENT(xkp)) xkp => kpoint%xkp
     665              : 
     666      2774463 :       IF (PRESENT(para_env)) para_env => kpoint%para_env
     667      2774463 :       IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
     668      2774463 :       IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
     669      2774463 :       IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
     670      2774463 :       IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
     671              : 
     672      2774463 :       IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
     673      3047661 :       IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
     674      2774463 :       IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
     675      2774463 :       IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
     676              : 
     677      2774463 :       IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
     678      2774463 :       IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
     679      2774463 :       IF (PRESENT(mpools)) mpools => kpoint%mpools
     680              : 
     681      2774463 :       IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
     682      2774463 :       IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
     683      2774463 :       IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
     684      2774463 :       IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
     685              : 
     686      2774463 :    END SUBROUTINE get_kpoint_info
     687              : 
     688              : ! **************************************************************************************************
     689              : !> \brief Set information in a kpoint environment
     690              : !> \param kpoint        The kpoint environment
     691              : !> \param kp_scheme     Type of kpoint grid
     692              : !> \param nkp_grid      Grid points
     693              : !> \param kp_shift      Shift of the grid
     694              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     695              : !> \param verbose       more output information
     696              : !> \param full_grid     don't reduce kpoints at all
     697              : !> \param use_real_wfn  real/complex wfn
     698              : !> \param eps_geo       accuracy of atom symmetry detection
     699              : !> \param parallel_group_size kpoint group size
     700              : !> \param kp_range      kpoints distribution for local processor
     701              : !> \param nkp           number of kpoints
     702              : !> \param xkp           kpoint coordinates
     703              : !> \param wkp           kpoint weights
     704              : !> \param para_env      'global' parallel environment
     705              : !> \param blacs_env_all BLACS env for the total environment
     706              : !> \param para_env_kp   parallel environment of the kpoint calculation
     707              : !> \param para_env_inter_kp   parallel environment between kpoints
     708              : !> \param blacs_env     BLACS env for the kpoint group
     709              : !> \param kp_env        Information for each kpoint
     710              : !> \param kp_aux_env ...
     711              : !> \param mpools        FM matrix pools for kpoint groups
     712              : !> \param iogrp         this kpoint group has the IO processor
     713              : !> \param nkp_groups    number of kpoint groups
     714              : !> \param kp_dist       kpoints distribution on groups
     715              : !> \param cell_to_index given a cell triple, returns the real space index
     716              : !> \param index_to_cell ...
     717              : !> \param sab_nl        neighbourlist that defines real space matrices
     718              : !> \param sab_nl_nosym  neighbourlist that defines real space matrices
     719              : !> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
     720              : !> \param symmetry_backend k-point symmetry backend
     721              : !> \param symmetry_reduction_method k-point symmetry reduction method
     722              : !> \param gamma_centered ...
     723              : !> \author JGH
     724              : ! **************************************************************************************************
     725         7122 :    SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
     726              :                               full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
     727              :                               para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
     728              :                               kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
     729              :                               sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
     730              :                               symmetry_reduction_method, gamma_centered)
     731              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     732              :       CHARACTER(LEN=*), OPTIONAL                         :: kp_scheme
     733              :       INTEGER, DIMENSION(3), OPTIONAL                    :: nkp_grid
     734              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: kp_shift
     735              :       LOGICAL, OPTIONAL                                  :: symmetry, verbose, full_grid, &
     736              :                                                             use_real_wfn
     737              :       REAL(KIND=dp), OPTIONAL                            :: eps_geo
     738              :       INTEGER, OPTIONAL                                  :: parallel_group_size
     739              :       INTEGER, DIMENSION(2), OPTIONAL                    :: kp_range
     740              :       INTEGER, OPTIONAL                                  :: nkp
     741              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: xkp
     742              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     743              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     744              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_all
     745              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_kp, para_env_inter_kp
     746              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env
     747              :       TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
     748              :          POINTER                                         :: kp_env, kp_aux_env
     749              :       TYPE(qs_matrix_pools_type), OPTIONAL, POINTER      :: mpools
     750              :       LOGICAL, OPTIONAL                                  :: iogrp
     751              :       INTEGER, OPTIONAL                                  :: nkp_groups
     752              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: kp_dist
     753              :       INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER     :: cell_to_index
     754              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: index_to_cell
     755              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     756              :          OPTIONAL, POINTER                               :: sab_nl, sab_nl_nosym
     757              :       LOGICAL, OPTIONAL                                  :: inversion_symmetry_only
     758              :       INTEGER, OPTIONAL                                  :: symmetry_backend, &
     759              :                                                             symmetry_reduction_method
     760              :       LOGICAL, OPTIONAL                                  :: gamma_centered
     761              : 
     762            2 :       IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
     763         7122 :       IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
     764         7122 :       IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
     765         7122 :       IF (PRESENT(gamma_centered)) kpoint%gamma_centered = gamma_centered
     766         7122 :       IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
     767         7122 :       IF (PRESENT(verbose)) kpoint%verbose = verbose
     768         7122 :       IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
     769         7122 :       IF (PRESENT(inversion_symmetry_only)) kpoint%inversion_symmetry_only = inversion_symmetry_only
     770         7122 :       IF (PRESENT(symmetry_backend)) kpoint%symmetry_backend = symmetry_backend
     771         7122 :       IF (PRESENT(symmetry_reduction_method)) THEN
     772            0 :          kpoint%symmetry_reduction_method = symmetry_reduction_method
     773              :       END IF
     774         7122 :       IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
     775         7122 :       IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
     776         7122 :       IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
     777              : 
     778         7122 :       IF (PRESENT(nkp)) kpoint%nkp = nkp
     779         7122 :       IF (PRESENT(wkp)) kpoint%wkp => wkp
     780         7122 :       IF (PRESENT(xkp)) kpoint%xkp => xkp
     781              : 
     782         7122 :       IF (PRESENT(para_env)) kpoint%para_env => para_env
     783         7122 :       IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
     784         7122 :       IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
     785         7122 :       IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
     786         7122 :       IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
     787              : 
     788         7122 :       IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
     789         7122 :       IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
     790         7122 :       IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
     791         7122 :       IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
     792              : 
     793         7122 :       IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
     794            0 :       IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
     795         7122 :       IF (PRESENT(mpools)) kpoint%mpools => mpools
     796         7122 :       IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
     797         7122 :       IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
     798              : 
     799         7122 :       IF (PRESENT(cell_to_index)) THEN
     800            0 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     801            0 :          kpoint%cell_to_index => cell_to_index
     802              :       END IF
     803              : 
     804         7122 :       IF (PRESENT(index_to_cell)) THEN
     805            0 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     806            0 :          kpoint%index_to_cell => index_to_cell
     807              :       END IF
     808              : 
     809         7122 :    END SUBROUTINE set_kpoint_info
     810              : 
     811              : ! **************************************************************************************************
     812              : !> \brief Read the kpoint input section
     813              : !> \param kpoint  The kpoint environment
     814              : !> \param kpoint_section The input section
     815              : !> \param a_vec ...
     816              : !> \param cell ...
     817              : !> \author JGH
     818              : ! **************************************************************************************************
     819         9328 :    SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec, cell)
     820              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     821              :       TYPE(section_vals_type), POINTER                   :: kpoint_section
     822              :       REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN)         :: a_vec
     823              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     824              : 
     825              :       REAL(KIND=dp), PARAMETER                           :: eps_cell = 1.0E-14_dp
     826              : 
     827              :       CHARACTER(LEN=default_string_length)               :: ustr
     828              :       CHARACTER(LEN=default_string_length), &
     829         9328 :          DIMENSION(:), POINTER                           :: tmpstringlist
     830              :       INTEGER                                            :: i, n_rep, nval, wfntype
     831              :       LOGICAL                                            :: available, backend_explicit, &
     832              :                                                             non_lower_triangular_cell, &
     833              :                                                             reduction_explicit
     834              :       REAL(KIND=dp)                                      :: ff
     835              :       REAL(KIND=dp), DIMENSION(3, 3)                     :: cart_a_vec
     836         9328 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: reallist
     837              : 
     838         9328 :       CALL section_vals_get(kpoint_section, explicit=available)
     839         9328 :       cart_a_vec(:, :) = a_vec(:, :)
     840         9328 :       IF (PRESENT(cell)) THEN
     841         9328 :          IF (ASSOCIATED(cell)) THEN
     842        10048 :             IF (cell%input_cell_canonicalized) cart_a_vec(:, :) = cell%input_hmat(:, :)
     843              :          END IF
     844              :       END IF
     845              : 
     846         9328 :       IF (available) THEN
     847          836 :          CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
     848          836 :          nval = SIZE(tmpstringlist)
     849          836 :          CPASSERT(nval >= 1)
     850          836 :          kpoint%kp_scheme = tmpstringlist(1)
     851          836 :          CALL uppercase(kpoint%kp_scheme)
     852              : 
     853              :          ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
     854          746 :          SELECT CASE (kpoint%kp_scheme)
     855              :          CASE ("NONE")
     856              :             ! do nothing
     857              :          CASE ("GAMMA")
     858              :             ! do nothing
     859              :          CASE ("MONKHORST-PACK")
     860          746 :             CPASSERT(nval >= 4)
     861         2984 :             DO i = 2, 4
     862         2984 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     863              :             END DO
     864              :          CASE ("MACDONALD")
     865           24 :             CPASSERT(nval >= 7)
     866           96 :             DO i = 2, 4
     867           96 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     868              :             END DO
     869           96 :             DO i = 5, 7
     870           96 :                READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
     871              :             END DO
     872              :          CASE ("GENERAL")
     873           18 :             CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
     874           18 :             CALL uppercase(ustr)
     875           18 :             CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
     876           18 :             kpoint%nkp = n_rep
     877           18 :             IF (ASSOCIATED(kpoint%xkp_input)) THEN
     878            0 :                DEALLOCATE (kpoint%xkp_input)
     879              :                NULLIFY (kpoint%xkp_input)
     880              :             END IF
     881           18 :             IF (ASSOCIATED(kpoint%wkp_input)) THEN
     882            0 :                DEALLOCATE (kpoint%wkp_input)
     883              :                NULLIFY (kpoint%wkp_input)
     884              :             END IF
     885           90 :             ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
     886          126 :             DO i = 1, n_rep
     887              :                CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
     888          108 :                                          r_vals=reallist)
     889          108 :                nval = SIZE(reallist)
     890          108 :                CPASSERT(nval >= 4)
     891          108 :                SELECT CASE (ustr)
     892              :                CASE ("B_VECTOR")
     893          432 :                   kpoint%xkp(1:3, i) = reallist(1:3)
     894              :                CASE ("CART_ANGSTROM")
     895              :                   kpoint%xkp(1:3, i) = (reallist(1)*cart_a_vec(1, 1:3) + &
     896              :                                         reallist(2)*cart_a_vec(2, 1:3) + &
     897            0 :                                         reallist(3)*cart_a_vec(3, 1:3))/twopi*angstrom
     898              :                CASE ("CART_BOHR")
     899              :                   kpoint%xkp(1:3, i) = (reallist(1)*cart_a_vec(1, 1:3) + &
     900              :                                         reallist(2)*cart_a_vec(2, 1:3) + &
     901            0 :                                         reallist(3)*cart_a_vec(3, 1:3))/twopi
     902              :                CASE DEFAULT
     903          108 :                   CPABORT("Unknown Unit for kpoint definition")
     904              :                END SELECT
     905          126 :                kpoint%wkp(i) = reallist(4)
     906              :             END DO
     907          126 :             ff = 1.0_dp/SUM(kpoint%wkp(:))
     908          126 :             kpoint%wkp(:) = ff*kpoint%wkp(:)
     909           54 :             ALLOCATE (kpoint%xkp_input(3, n_rep), kpoint%wkp_input(n_rep))
     910          450 :             kpoint%xkp_input(1:3, 1:n_rep) = kpoint%xkp(1:3, 1:n_rep)
     911          144 :             kpoint%wkp_input(1:n_rep) = kpoint%wkp(1:n_rep)
     912              :          CASE DEFAULT
     913              :             CALL cp_abort(__LOCATION__, &
     914              :                           "<NONE>, <GAMMA>, <MONKHORST-PACK>, <MACDONALD>, "// &
     915              :                           "<GENERAL> are supported as the <kpoint%kp_scheme> for "// &
     916              :                           "read_kpoint_section, found unknown option "// &
     917          836 :                           "<"//TRIM(kpoint%kp_scheme)//">")
     918              :          END SELECT
     919              : 
     920          836 :          CALL section_vals_val_get(kpoint_section, "GAMMA_CENTERED", l_val=kpoint%gamma_centered)
     921          836 :          IF (kpoint%gamma_centered .AND. kpoint%kp_scheme /= "MONKHORST-PACK" .AND. &
     922              :              kpoint%kp_scheme /= "MACDONALD") THEN
     923              :             CALL cp_abort(__LOCATION__, &
     924            0 :                           "KPOINTS%GAMMA_CENTERED is only supported with SCHEME MONKHORST-PACK or MACDONALD")
     925              :          END IF
     926              : 
     927          836 :          CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
     928          836 :          CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
     929          836 :          CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
     930          836 :          CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
     931          836 :          CALL section_vals_val_get(kpoint_section, "LATTICE_FFT", i_val=kpoint%lattice_fft)
     932              :          CALL section_vals_val_get(kpoint_section, "INVERSION_SYMMETRY_ONLY", &
     933          836 :                                    l_val=kpoint%inversion_symmetry_only)
     934              :          CALL section_vals_val_get(kpoint_section, "SYMMETRY_BACKEND", &
     935          836 :                                    i_val=kpoint%symmetry_backend, explicit=backend_explicit)
     936              :          CALL section_vals_val_get(kpoint_section, "SYMMETRY_REDUCTION_METHOD", &
     937          836 :                                    i_val=kpoint%symmetry_reduction_method, explicit=reduction_explicit)
     938          836 :          CALL resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
     939          836 :          CALL section_vals_val_get(kpoint_section, "EPS_SYMMETRY", r_val=kpoint%eps_geo)
     940              :          IF ((kpoint%kp_scheme == "MONKHORST-PACK" .OR. kpoint%kp_scheme == "MACDONALD") .AND. &
     941          836 :              kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
     942              :              .NOT. kpoint%inversion_symmetry_only) THEN
     943              :             non_lower_triangular_cell = (ABS(a_vec(2, 1)) > eps_cell) .OR. &
     944              :                                         (ABS(a_vec(3, 1)) > eps_cell) .OR. &
     945          408 :                                         (ABS(a_vec(3, 2)) > eps_cell)
     946              :             IF (non_lower_triangular_cell) THEN
     947            6 :                kpoint%inversion_symmetry_only = .TRUE.
     948              :                CALL cp_warn(__LOCATION__, &
     949              :                             "Full atomic k-point symmetry was requested for a cell matrix that does "// &
     950              :                             "not follow the CP2K lower-triangular convention. Falling back to "// &
     951              :                             "KPOINTS%INVERSION_SYMMETRY_ONLY. Use ABC/ALPHA_BETA_GAMMA or canonical "// &
     952            6 :                             "A/B/C vectors to enable full point-group k-point reduction.")
     953              :             END IF
     954              :          END IF
     955              :          CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
     956          836 :                                    i_val=kpoint%parallel_group_size)
     957           16 :          SELECT CASE (wfntype)
     958              :          CASE (use_real_wfn)
     959           16 :             kpoint%use_real_wfn = .TRUE.
     960              :          CASE (use_complex_wfn)
     961          820 :             kpoint%use_real_wfn = .FALSE.
     962              :          CASE DEFAULT
     963          836 :             CPABORT("The WAVEFUNCTIONS option should be either REAL or COMPLEX")
     964              :          END SELECT
     965              : 
     966              :       ELSE
     967         8492 :          kpoint%kp_scheme = "NONE"
     968              :       END IF
     969              : 
     970         9328 :    END SUBROUTINE read_kpoint_section
     971              : 
     972              : ! **************************************************************************************************
     973              : !> \brief Resolve legacy and backend k-point symmetry settings
     974              : !> \param kpoint ...
     975              : !> \param backend_explicit whether SYMMETRY_BACKEND was given
     976              : !> \param reduction_explicit whether SYMMETRY_REDUCTION_METHOD was given
     977              : ! **************************************************************************************************
     978          836 :    SUBROUTINE resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
     979              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     980              :       LOGICAL, INTENT(IN)                                :: backend_explicit, reduction_explicit
     981              : 
     982          836 :       IF (backend_explicit .AND. .NOT. reduction_explicit) THEN
     983          186 :          SELECT CASE (kpoint%symmetry_backend)
     984              :          CASE (use_k290_kpoint_backend)
     985           50 :             kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
     986              :          CASE (use_spglib_kpoint_backend)
     987           86 :             kpoint%symmetry_reduction_method = use_spglib_kpoint_symmetry
     988              :          CASE DEFAULT
     989          136 :             CPABORT("Unknown k-point symmetry backend")
     990              :          END SELECT
     991              :       END IF
     992              : 
     993          836 :       IF (kpoint%symmetry_backend == use_spglib_kpoint_backend .AND. &
     994              :           kpoint%symmetry_reduction_method /= use_spglib_kpoint_symmetry) THEN
     995              :          CALL cp_abort(__LOCATION__, &
     996            0 :                        "SYMMETRY_BACKEND SPGLIB requires SYMMETRY_REDUCTION_METHOD SPGLIB")
     997              :       END IF
     998              : 
     999          836 :    END SUBROUTINE resolve_kpoint_symmetry_settings
    1000              : 
    1001              : ! **************************************************************************************************
    1002              : !> \brief Write information on the kpoints to output
    1003              : !> \param kpoint  The kpoint environment
    1004              : !> \param iounit  output unit
    1005              : !> \param dft_section  DFT section information for output unit
    1006              : !> \author JGH
    1007              : ! **************************************************************************************************
    1008         9319 :    SUBROUTINE write_kpoint_info(kpoint, iounit, dft_section)
    1009              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
    1010              :       INTEGER, INTENT(IN), OPTIONAL                      :: iounit
    1011              :       TYPE(section_vals_type), INTENT(IN), OPTIONAL      :: dft_section
    1012              : 
    1013              :       INTEGER                                            :: i, punit
    1014              :       TYPE(cp_logger_type), POINTER                      :: logger
    1015              : 
    1016         9319 :       NULLIFY (logger)
    1017         9319 :       logger => cp_get_default_logger()
    1018              : 
    1019         9319 :       IF (PRESENT(dft_section)) THEN
    1020         9312 :          punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
    1021            7 :       ELSE IF (PRESENT(iounit)) THEN
    1022            7 :          punit = iounit
    1023              :       ELSE
    1024            0 :          punit = cp_logger_get_default_unit_nr(logger)
    1025              :       END IF
    1026              : 
    1027         9319 :       IF (punit > 0) THEN
    1028              : 
    1029         2123 :          IF (kpoint%kp_scheme /= "NONE") THEN
    1030          111 :             WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
    1031              :          END IF
    1032            1 :          SELECT CASE (kpoint%kp_scheme)
    1033              :          CASE ("NONE")
    1034              :             ! be silent
    1035              :          CASE ("GAMMA")
    1036            1 :             WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
    1037              :          CASE ("MONKHORST-PACK")
    1038          107 :             WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', '      Monkhorst-Pack'
    1039          107 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
    1040          107 :             IF (kpoint%gamma_centered) THEN
    1041            1 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Gamma-centered k-point mesh', ' ON'
    1042              :             END IF
    1043              :             WRITE (punit, '(A,T66,G15.6)') &
    1044          107 :                ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
    1045              :          CASE ("MACDONALD")
    1046            3 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
    1047            3 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
    1048            3 :             WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
    1049            3 :             IF (kpoint%gamma_centered) THEN
    1050            0 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Gamma-centered k-point mesh', ' ON'
    1051              :             END IF
    1052              :             WRITE (punit, '(A,T66,G15.6)') &
    1053            3 :                ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
    1054              :          CASE ("GENERAL")
    1055            0 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', '   General'
    1056              :          CASE DEFAULT
    1057              :             CALL cp_abort(__LOCATION__, &
    1058              :                           "<NONE>, <GAMMA>, <MONKHORST-PACK>, <MACDONALD>, "// &
    1059              :                           "<GENERAL> are supported as the <kpoint%kp_scheme> for "// &
    1060              :                           "write_kpoint_info, found unknown option "// &
    1061         2123 :                           "<"//TRIM(kpoint%kp_scheme)//">")
    1062              :          END SELECT
    1063         2123 :          IF (kpoint%kp_scheme /= "NONE") THEN
    1064          111 :             IF (kpoint%symmetry) THEN
    1065           79 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '   ON'
    1066              :             ELSE
    1067           32 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '  OFF'
    1068              :             END IF
    1069          111 :             IF (kpoint%inversion_symmetry_only) THEN
    1070            4 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Restrict symmetry to inversion', '   ON'
    1071              :             END IF
    1072              :             IF (kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
    1073          111 :                 .NOT. kpoint%inversion_symmetry_only .AND. &
    1074              :                 (kpoint%kp_scheme == "MONKHORST-PACK" .OR. kpoint%kp_scheme == "MACDONALD" .OR. &
    1075              :                  kpoint%kp_scheme == "GENERAL")) THEN
    1076           86 :                SELECT CASE (kpoint%symmetry_backend)
    1077              :                CASE (use_k290_kpoint_backend)
    1078           30 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', '   K290'
    1079              :                CASE (use_spglib_kpoint_backend)
    1080           26 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', ' SPGLIB'
    1081              :                CASE DEFAULT
    1082           56 :                   CPABORT("Unknown k-point symmetry backend")
    1083              :                END SELECT
    1084           86 :                SELECT CASE (kpoint%symmetry_reduction_method)
    1085              :                CASE (use_k290_kpoint_symmetry)
    1086           30 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', '   K290'
    1087              :                CASE (use_spglib_kpoint_symmetry)
    1088           26 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', ' SPGLIB'
    1089              :                CASE DEFAULT
    1090          111 :                   CPABORT("Unknown k-point symmetry reduction method")
    1091              :                END SELECT
    1092              :             END IF
    1093          111 :             IF (kpoint%use_real_wfn) THEN
    1094            0 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
    1095              :             ELSE
    1096          111 :                WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
    1097              :             END IF
    1098          111 :             IF (kpoint%full_grid) THEN
    1099           19 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid     '
    1100              :             END IF
    1101          111 :             IF (kpoint%kp_scheme /= "GAMMA") THEN
    1102          110 :                WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
    1103              :                WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
    1104          110 :                   ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
    1105          882 :                DO i = 1, kpoint%nkp
    1106          772 :                   WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
    1107         1654 :                      kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
    1108              :                END DO
    1109              :             END IF
    1110          111 :             WRITE (punit, '(" ",79("*"))')
    1111              :          END IF
    1112              : 
    1113              :       END IF
    1114              : 
    1115         9319 :       IF (PRESENT(dft_section)) THEN
    1116         9312 :          CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
    1117              :       END IF
    1118              : 
    1119         9319 :    END SUBROUTINE write_kpoint_info
    1120              : 
    1121              : ! **************************************************************************************************
    1122              : !> \brief Create a single kpoint environment
    1123              : !> \param kp_env  Single kpoint environment
    1124              : !> \author JGH
    1125              : ! **************************************************************************************************
    1126         7810 :    SUBROUTINE kpoint_env_create(kp_env)
    1127              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
    1128              : 
    1129         7810 :       CPASSERT(.NOT. ASSOCIATED(kp_env))
    1130              : 
    1131        39050 :       ALLOCATE (kp_env)
    1132              : 
    1133         7810 :       kp_env%nkpoint = 0
    1134              :       kp_env%wkp = 0.0_dp
    1135        31240 :       kp_env%xkp = 0.0_dp
    1136         7810 :       kp_env%is_local = .FALSE.
    1137              : 
    1138         7810 :       NULLIFY (kp_env%mos)
    1139         7810 :       NULLIFY (kp_env%pmat)
    1140         7810 :       NULLIFY (kp_env%wmat)
    1141         7810 :       NULLIFY (kp_env%ot_hmat)
    1142         7810 :       NULLIFY (kp_env%ot_smat)
    1143         7810 :       NULLIFY (kp_env%ot_tmat)
    1144              : 
    1145         7810 :    END SUBROUTINE kpoint_env_create
    1146              : 
    1147              : ! **************************************************************************************************
    1148              : !> \brief Release a single kpoint environment
    1149              : !> \param kp_env  Single kpoint environment
    1150              : !> \author JGH
    1151              : ! **************************************************************************************************
    1152         7810 :    SUBROUTINE kpoint_env_release(kp_env)
    1153              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
    1154              : 
    1155              :       INTEGER                                            :: is
    1156              : 
    1157         7810 :       IF (ASSOCIATED(kp_env)) THEN
    1158              : 
    1159         7810 :          IF (ASSOCIATED(kp_env%mos)) THEN
    1160        16356 :             DO is = 1, SIZE(kp_env%mos)
    1161        16356 :                CALL deallocate_mo_set(kp_env%mos(is))
    1162              :             END DO
    1163         7810 :             DEALLOCATE (kp_env%mos)
    1164              :          END IF
    1165              : 
    1166         7810 :          CALL cp_fm_release(kp_env%pmat)
    1167         7810 :          CALL cp_fm_release(kp_env%wmat)
    1168         7810 :          CALL cp_fm_release(kp_env%smat)
    1169         7810 :          CALL cp_fm_release(kp_env%amat)
    1170         7810 :          CALL cp_cfm_release(kp_env%csmat)
    1171         7810 :          CALL cp_cfm_release(kp_env%camat)
    1172         7810 :          CALL cp_fm_release(kp_env%ot_hmat)
    1173         7810 :          CALL cp_fm_release(kp_env%ot_smat)
    1174         7810 :          CALL cp_fm_release(kp_env%ot_tmat)
    1175              : 
    1176         7810 :          CALL cp_fm_release(kp_env%shalf)
    1177         7810 :          CALL cp_cfm_release(kp_env%cshalf)
    1178         7810 :          CALL cp_fm_release(kp_env%lowdin_b)
    1179         7810 :          CALL cp_fm_release(kp_env%lowdin_work)
    1180         7810 :          CALL cp_cfm_release(kp_env%lowdin_cb)
    1181         7810 :          CALL cp_cfm_release(kp_env%lowdin_cwork)
    1182         7810 :          CALL cp_cfm_release(kp_env%lowdin_evec)
    1183         7810 :          CALL kp_env%lowdin_gemm%destroy()
    1184              : 
    1185         7810 :          DEALLOCATE (kp_env)
    1186              : 
    1187              :       END IF
    1188              : 
    1189         7810 :    END SUBROUTINE kpoint_env_release
    1190              : 
    1191              : ! **************************************************************************************************
    1192              : !> \brief Get information from a single kpoint environment
    1193              : !> \param kpoint_env Single kpoint environment
    1194              : !> \param nkpoint    Index of kpoint
    1195              : !> \param wkp        Weight of kpoint
    1196              : !> \param xkp        Coordinates of kpoint
    1197              : !> \param is_local   Is this kpoint local (single cpu group)
    1198              : !> \param mos        MOs of this kpoint
    1199              : !> \author JGH
    1200              : ! **************************************************************************************************
    1201         5214 :    SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
    1202              :       TYPE(kpoint_env_type), INTENT(IN)                  :: kpoint_env
    1203              :       INTEGER, OPTIONAL                                  :: nkpoint
    1204              :       REAL(KIND=dp), OPTIONAL                            :: wkp
    1205              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: xkp
    1206              :       LOGICAL, OPTIONAL                                  :: is_local
    1207              :       TYPE(mo_set_type), DIMENSION(:), OPTIONAL, POINTER :: mos
    1208              : 
    1209         5214 :       IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
    1210         5214 :       IF (PRESENT(wkp)) wkp = kpoint_env%wkp
    1211         5214 :       IF (PRESENT(xkp)) xkp = kpoint_env%xkp
    1212         5214 :       IF (PRESENT(is_local)) is_local = kpoint_env%is_local
    1213         5214 :       IF (PRESENT(mos)) mos => kpoint_env%mos
    1214              : 
    1215         5214 :    END SUBROUTINE get_kpoint_env
    1216              : 
    1217              : ! **************************************************************************************************
    1218              : !> \brief Create a single kpoint symmetry environment
    1219              : !> \param kp_sym  ...
    1220              : !> \author JGH
    1221              : ! **************************************************************************************************
    1222        23976 :    SUBROUTINE kpoint_sym_create(kp_sym)
    1223              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
    1224              : 
    1225        23976 :       CPASSERT(.NOT. ASSOCIATED(kp_sym))
    1226              : 
    1227        23976 :       ALLOCATE (kp_sym)
    1228              : 
    1229        23976 :       kp_sym%nwght = 0
    1230        23976 :       kp_sym%nwred = 0
    1231              :       kp_sym%apply_symmetry = .FALSE.
    1232              : 
    1233              :       NULLIFY (kp_sym%rot)
    1234              :       NULLIFY (kp_sym%xkp)
    1235              :       NULLIFY (kp_sym%rotp)
    1236              :       NULLIFY (kp_sym%f0)
    1237              :       NULLIFY (kp_sym%fcell)
    1238              :       NULLIFY (kp_sym%fcell_gauge)
    1239              :       NULLIFY (kp_sym%phase_mode)
    1240              : 
    1241        23976 :    END SUBROUTINE kpoint_sym_create
    1242              : 
    1243              : ! **************************************************************************************************
    1244              : !> \brief Release a single kpoint symmetry environment
    1245              : !> \param kp_sym  ...
    1246              : !> \author JGH
    1247              : ! **************************************************************************************************
    1248        23976 :    SUBROUTINE kpoint_sym_release(kp_sym)
    1249              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
    1250              : 
    1251        23976 :       IF (ASSOCIATED(kp_sym)) THEN
    1252              : 
    1253        23976 :          IF (ASSOCIATED(kp_sym%rot)) THEN
    1254         3722 :             DEALLOCATE (kp_sym%rot)
    1255              :          END IF
    1256        23976 :          IF (ASSOCIATED(kp_sym%xkp)) THEN
    1257         3722 :             DEALLOCATE (kp_sym%xkp)
    1258              :          END IF
    1259        23976 :          IF (ASSOCIATED(kp_sym%f0)) THEN
    1260         3722 :             DEALLOCATE (kp_sym%f0)
    1261              :          END IF
    1262        23976 :          IF (ASSOCIATED(kp_sym%fcell)) THEN
    1263         3722 :             DEALLOCATE (kp_sym%fcell)
    1264              :          END IF
    1265        23976 :          IF (ASSOCIATED(kp_sym%fcell_gauge)) THEN
    1266         3722 :             DEALLOCATE (kp_sym%fcell_gauge)
    1267              :          END IF
    1268        23976 :          IF (ASSOCIATED(kp_sym%phase_mode)) THEN
    1269         3722 :             DEALLOCATE (kp_sym%phase_mode)
    1270              :          END IF
    1271        23976 :          IF (ASSOCIATED(kp_sym%rotp)) THEN
    1272         3722 :             DEALLOCATE (kp_sym%rotp)
    1273              :          END IF
    1274              : 
    1275        23976 :          DEALLOCATE (kp_sym)
    1276              : 
    1277              :       END IF
    1278              : 
    1279        23976 :    END SUBROUTINE kpoint_sym_release
    1280              : 
    1281              : ! **************************************************************************************************
    1282              : !> \brief Locate the basis-rotation slot corresponding to a signed k-point symmetry operation.
    1283              : !> \param qs_kpoint SCF k-point object
    1284              : !> \param rotp signed operation identifier
    1285              : !> \return rotation slot, or zero when no slot matches
    1286              : ! **************************************************************************************************
    1287       392432 :    INTEGER FUNCTION find_kpoint_rotation_slot(qs_kpoint, rotp) RESULT(rot_slot)
    1288              :       TYPE(kpoint_type), POINTER                         :: qs_kpoint
    1289              :       INTEGER, INTENT(IN)                                :: rotp
    1290              : 
    1291              :       INTEGER                                            :: irot, rot_abs
    1292              : 
    1293       392432 :       rot_slot = 0
    1294       392432 :       rot_abs = ABS(rotp)
    1295       392432 :       IF (.NOT. ASSOCIATED(qs_kpoint%ibrot)) RETURN
    1296      1710886 :       DO irot = 1, SIZE(qs_kpoint%ibrot)
    1297      1710886 :          IF (rot_abs == qs_kpoint%ibrot(irot)) THEN
    1298       392432 :             rot_slot = irot
    1299              :             RETURN
    1300              :          END IF
    1301              :       END DO
    1302              : 
    1303              :    END FUNCTION find_kpoint_rotation_slot
    1304              : 
    1305            0 : END MODULE kpoint_types
        

Generated by: LCOV version 2.0-1