LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:92574dc) Lines: 95.1 % 428 407
Test Date: 2026-09-24 01:27:39 Functions: 66.7 % 21 14

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

Generated by: LCOV version 2.0-1