LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:cccd2f3) Lines: 93.8 % 370 347
Test Date: 2026-05-06 07:07:47 Functions: 68.4 % 19 13

            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 cp_blacs_env,                    ONLY: cp_blacs_env_release,&
      17              :                                               cp_blacs_env_type
      18              :    USE cp_cfm_types,                    ONLY: cp_cfm_release,&
      19              :                                               cp_cfm_type
      20              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      21              :                                               cp_fm_type
      22              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      23              :                                               cp_logger_get_default_unit_nr,&
      24              :                                               cp_logger_type
      25              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      26              :                                               cp_print_key_unit_nr
      27              :    USE input_cp2k_kpoints,              ONLY: use_complex_wfn,&
      28              :                                               use_k290_kpoint_backend,&
      29              :                                               use_k290_kpoint_symmetry,&
      30              :                                               use_real_wfn,&
      31              :                                               use_spglib_kpoint_backend,&
      32              :                                               use_spglib_kpoint_symmetry
      33              :    USE input_section_types,             ONLY: section_vals_get,&
      34              :                                               section_vals_type,&
      35              :                                               section_vals_val_get
      36              :    USE kinds,                           ONLY: default_string_length,&
      37              :                                               dp
      38              :    USE mathconstants,                   ONLY: twopi
      39              :    USE message_passing,                 ONLY: mp_para_env_release,&
      40              :                                               mp_para_env_type
      41              :    USE physcon,                         ONLY: angstrom
      42              :    USE qs_diis_types,                   ONLY: qs_diis_b_release_kp,&
      43              :                                               qs_diis_buffer_type_kp
      44              :    USE qs_matrix_pools,                 ONLY: mpools_release,&
      45              :                                               qs_matrix_pools_type
      46              :    USE qs_mo_types,                     ONLY: deallocate_mo_set,&
      47              :                                               mo_set_type
      48              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      49              :    USE string_utilities,                ONLY: uppercase
      50              : #include "./base/base_uses.f90"
      51              : 
      52              :    IMPLICIT NONE
      53              : 
      54              :    PRIVATE
      55              : 
      56              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
      57              : 
      58              :    PUBLIC :: kpoint_type
      59              :    PUBLIC :: kpoint_create, kpoint_release, kpoint_reset_initialization, get_kpoint_info, set_kpoint_info
      60              :    PUBLIC :: read_kpoint_section, write_kpoint_info
      61              :    PUBLIC :: kpoint_env_type, kpoint_env_p_type
      62              :    PUBLIC :: kpoint_env_create, get_kpoint_env
      63              :    PUBLIC :: kind_rotmat_type
      64              :    PUBLIC :: kpoint_sym_type
      65              :    PUBLIC :: kpoint_sym_create
      66              : 
      67              : ! **************************************************************************************************
      68              : !> \brief Keeps information about a specific k-point
      69              : !> \param nkpoint   the kpoint index
      70              : !> \param wkp       weight of this kpoint
      71              : !> \param xkp       kpoint coordinates in units of b-vector
      72              : !> \param is_local  if this kpoint is calculated on a single thread
      73              : !> \param mos       associated MOs (r/i,spin)
      74              : !> \param pmat      associated density matrix (r/i,spin)
      75              : !> \param wmat      associated energy weighted density matrix (r/i,spin)
      76              : !> \param smat      associated overlap matrix (for ADMM) (r/i,spin)
      77              : !> \param amat      associated ADMM basis projection matrix (r/i,spin)
      78              : !> \param shalf     S(K)^(1/2) DFT+U Lowdin method (real wfn)
      79              : !> \param cshalf    S(K)^(1/2) DFT+U Lowdin method (complex wfn)
      80              : !> \author JGH
      81              : ! **************************************************************************************************
      82              :    TYPE kpoint_env_type
      83              :       INTEGER                                           :: nkpoint = -1
      84              :       REAL(KIND=dp)                                     :: wkp = 0.0_dp
      85              :       REAL(KIND=dp), DIMENSION(3)                       :: xkp = 0.0_dp
      86              :       LOGICAL                                           :: is_local = .FALSE.
      87              :       TYPE(mo_set_type), DIMENSION(:, :), POINTER       :: mos => NULL()
      88              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: pmat => NULL()
      89              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: wmat => NULL()
      90              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: smat => NULL()
      91              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: amat => NULL()
      92              :       TYPE(cp_fm_type)                                  :: shalf
      93              :       TYPE(cp_cfm_type)                                 :: cshalf
      94              :    END TYPE kpoint_env_type
      95              : 
      96              :    TYPE kpoint_env_p_type
      97              :       TYPE(kpoint_env_type), POINTER                    :: kpoint_env => NULL()
      98              :    END TYPE kpoint_env_p_type
      99              : 
     100              : ! **************************************************************************************************
     101              : !> \brief Rotation matrices for basis sets
     102              : !> \param rmat      atom basis function rotation matrix
     103              : !> \author JGH
     104              : ! **************************************************************************************************
     105              :    TYPE kind_rotmat_type
     106              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: rmat => NULL()
     107              :    END TYPE kind_rotmat_type
     108              : 
     109              : ! **************************************************************************************************
     110              : !> \brief Keeps symmetry information about a specific k-point
     111              : !> \param apply_symmetry ...
     112              : !> \param nwght     kpoint multiplicity
     113              : !> \param xkp       kpoint coordinates
     114              : !> \param rot       rotation matrices
     115              : !> \param f0        atom permutation
     116              : !> \param fcell     atom cell shifts generated by the symmetry operation
     117              : !> \author JGH
     118              : ! **************************************************************************************************
     119              :    TYPE kpoint_sym_type
     120              :       LOGICAL                                           :: apply_symmetry = .FALSE.
     121              :       INTEGER                                           :: nwght = -1
     122              :       INTEGER                                           :: nwred = -1
     123              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: xkp => NULL()
     124              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: rot => NULL()
     125              :       INTEGER, DIMENSION(:), POINTER                    :: rotp => NULL()
     126              :       INTEGER, DIMENSION(:, :), POINTER                 :: f0 => NULL()
     127              :       INTEGER, DIMENSION(:, :, :), POINTER              :: fcell => NULL()
     128              :    END TYPE kpoint_sym_type
     129              : 
     130              :    TYPE kpoint_sym_p_type
     131              :       TYPE(kpoint_sym_type), POINTER                    :: kpoint_sym => NULL()
     132              :    END TYPE kpoint_sym_p_type
     133              : 
     134              : ! **************************************************************************************************
     135              : !> \brief Contains information about kpoints
     136              : !> \par History
     137              : !>       2014.07 created [JGH]
     138              : !> \param kp_scheme           [input] Type of kpoint grid
     139              : !> \param nkp_grid            [input] Grid points
     140              : !> \param kp_shift            [input] Shift of the grid
     141              : !> \param use_real_wfn        [input] real/complex wfn
     142              : !> \param symmetry            [input] use symmetry (atoms) to reduce kpoints
     143              : !> \param full_grid           [input] don't reduce kpoints at all
     144              : !> \param inversion_symmetry_only [input] reduce kpoints only by inversion symmetry
     145              : !> \param symmetry_backend [input] k-point symmetry backend
     146              : !> \param symmetry_reduction_method [input] k-point symmetry reduction method
     147              : !> \param verbose             [input] more output information
     148              : !> \param eps_geo             [input] accuracy of atom symmetry detection
     149              : !> \param parallel_group_size [input] kpoint group size
     150              : !> \param nkp     number of kpoints
     151              : !> \param xkp     kpoint coordinates
     152              : !> \param wkp     kpoint weights
     153              : !> \param para_env 'global' parallel environment
     154              : !> \param para_env_kp parallel environment of the kpoint calculation
     155              : !> \param para_env_inter_kp parallel environment between kpoints
     156              : !> \param iogrp  this kpoint group has the IO processor
     157              : !> \param nkp_groups   number of kpoint groups
     158              : !> \param kp_dist      kpoints distribution on groups
     159              : !> \param kp_range     kpoints distribution for local processor
     160              : !> \param blacs_env    BLACS env for the kpoint group
     161              : !> \param opmats       Operator matrices
     162              : !> \param kp_env       Information for each kpoint
     163              : !> \param mpools       FM matrix pools for kpoint groups
     164              : !> \author JGH
     165              : ! **************************************************************************************************
     166              :    TYPE kpoint_type
     167              :       CHARACTER(LEN=default_string_length)    :: kp_scheme = ""
     168              :       INTEGER, DIMENSION(3)                   :: nkp_grid = -1
     169              :       REAL(KIND=dp), DIMENSION(3)             :: kp_shift = 0.0_dp
     170              :       LOGICAL                                 :: use_real_wfn = .FALSE.
     171              :       LOGICAL                                 :: symmetry = .FALSE.
     172              :       LOGICAL                                 :: full_grid = .FALSE.
     173              :       LOGICAL                                 :: inversion_symmetry_only = .FALSE.
     174              :       INTEGER                                 :: symmetry_backend = use_k290_kpoint_backend
     175              :       INTEGER                                 :: symmetry_reduction_method = use_k290_kpoint_symmetry
     176              :       LOGICAL                                 :: verbose = .FALSE.
     177              :       REAL(KIND=dp)                           :: eps_geo = 0.0_dp
     178              :       INTEGER                                 :: parallel_group_size = -1
     179              :       INTEGER                                 :: nkp = -1
     180              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => Null()
     181              :       REAL(KIND=dp), DIMENSION(:), POINTER    :: wkp => Null()
     182              :       ! parallel environment
     183              :       TYPE(mp_para_env_type), POINTER         :: para_env => Null()
     184              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env_all => Null()
     185              :       TYPE(mp_para_env_type), POINTER         :: para_env_kp => Null(), &
     186              :                                                  para_env_inter_kp => Null()
     187              :       LOGICAL                                 :: iogrp = .FALSE.
     188              :       INTEGER                                 :: nkp_groups = -1
     189              :       INTEGER, DIMENSION(:, :), POINTER       :: kp_dist => Null()
     190              :       INTEGER, DIMENSION(2)                   :: kp_range = -1
     191              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env => Null()
     192              :       INTEGER, DIMENSION(:, :, :), POINTER    :: cell_to_index => Null()
     193              :       INTEGER, DIMENSION(:, :), POINTER       :: index_to_cell => Null()
     194              :       TYPE(neighbor_list_set_p_type), &
     195              :          DIMENSION(:), POINTER                :: sab_nl => Null(), &
     196              :                                                  sab_nl_nosym => Null()
     197              :       ! environment
     198              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     199              :          POINTER                              :: kp_env => Null()
     200              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     201              :          POINTER                              :: kp_aux_env => Null()
     202              :       ! symmetry
     203              :       TYPE(kpoint_sym_p_type), DIMENSION(:), &
     204              :          POINTER                              :: kp_sym => Null()
     205              :       INTEGER, DIMENSION(:), POINTER          :: atype => Null()
     206              :       INTEGER, DIMENSION(:), POINTER          :: ibrot => Null()
     207              :       TYPE(kind_rotmat_type), DIMENSION(:, :), &
     208              :          POINTER                              :: kind_rotmat => Null()
     209              :       ! pools
     210              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools => Null()
     211              :       TYPE(qs_diis_buffer_type_kp), POINTER   :: scf_diis_buffer => Null()
     212              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools_aux_fit => Null()
     213              :    END TYPE kpoint_type
     214              : 
     215              : ! **************************************************************************************************
     216              : 
     217              : CONTAINS
     218              : 
     219              : ! **************************************************************************************************
     220              : !> \brief Create a kpoint environment
     221              : !> \param kpoint  All the kpoint information
     222              : !> \author JGH
     223              : ! **************************************************************************************************
     224         8149 :    SUBROUTINE kpoint_create(kpoint)
     225              :       TYPE(kpoint_type), POINTER                         :: kpoint
     226              : 
     227         8149 :       CPASSERT(.NOT. ASSOCIATED(kpoint))
     228              : 
     229        89639 :       ALLOCATE (kpoint)
     230              : 
     231         8149 :       kpoint%kp_scheme = ""
     232        32596 :       kpoint%nkp_grid = 0
     233        32596 :       kpoint%kp_shift = 0.0_dp
     234         8149 :       kpoint%symmetry = .FALSE.
     235         8149 :       kpoint%verbose = .FALSE.
     236         8149 :       kpoint%full_grid = .FALSE.
     237         8149 :       kpoint%inversion_symmetry_only = .FALSE.
     238         8149 :       kpoint%symmetry_backend = use_k290_kpoint_backend
     239         8149 :       kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
     240         8149 :       kpoint%use_real_wfn = .FALSE.
     241         8149 :       kpoint%eps_geo = 1.0e-6_dp
     242         8149 :       kpoint%parallel_group_size = -1
     243              : 
     244         8149 :       kpoint%nkp = 0
     245              : 
     246         8149 :       NULLIFY (kpoint%xkp, kpoint%wkp)
     247         8149 :       NULLIFY (kpoint%kp_dist)
     248              : 
     249         8149 :       NULLIFY (kpoint%para_env)
     250         8149 :       NULLIFY (kpoint%blacs_env_all)
     251         8149 :       NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
     252         8149 :       NULLIFY (kpoint%blacs_env)
     253         8149 :       kpoint%nkp_groups = 0
     254         8149 :       kpoint%iogrp = .FALSE.
     255        24447 :       kpoint%kp_range = 0
     256              : 
     257         8149 :       NULLIFY (kpoint%kp_env)
     258         8149 :       NULLIFY (kpoint%mpools)
     259              : 
     260         8149 :       ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
     261        32596 :       kpoint%cell_to_index(:, :, :) = 1
     262              : 
     263         8149 :       ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
     264        24447 :       kpoint%index_to_cell(:, :) = 0
     265              : 
     266         8149 :    END SUBROUTINE kpoint_create
     267              : 
     268              : ! **************************************************************************************************
     269              : !> \brief  Release a kpoint environment, deallocate all data
     270              : !> \param kpoint  The kpoint environment
     271              : !> \author JGH
     272              : ! **************************************************************************************************
     273        16115 :    SUBROUTINE kpoint_release(kpoint)
     274              :       TYPE(kpoint_type), POINTER                         :: kpoint
     275              : 
     276              :       INTEGER                                            :: i, ik, j
     277              : 
     278        16115 :       IF (ASSOCIATED(kpoint)) THEN
     279              : 
     280         8148 :          IF (ASSOCIATED(kpoint%xkp)) THEN
     281          490 :             DEALLOCATE (kpoint%xkp)
     282              :          END IF
     283         8148 :          IF (ASSOCIATED(kpoint%wkp)) THEN
     284          490 :             DEALLOCATE (kpoint%wkp)
     285              :          END IF
     286         8148 :          IF (ASSOCIATED(kpoint%kp_dist)) THEN
     287          386 :             DEALLOCATE (kpoint%kp_dist)
     288              :          END IF
     289              : 
     290         8148 :          CALL mpools_release(kpoint%mpools)
     291         8148 :          CALL mpools_release(kpoint%mpools_aux_fit)
     292              : 
     293         8148 :          CALL cp_blacs_env_release(kpoint%blacs_env)
     294         8148 :          CALL cp_blacs_env_release(kpoint%blacs_env_all)
     295              : 
     296         8148 :          CALL mp_para_env_release(kpoint%para_env)
     297         8148 :          CALL mp_para_env_release(kpoint%para_env_kp)
     298         8148 :          CALL mp_para_env_release(kpoint%para_env_inter_kp)
     299              : 
     300         8148 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     301         8148 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     302              : 
     303         8148 :          IF (ASSOCIATED(kpoint%kp_env)) THEN
     304         2464 :             DO ik = 1, SIZE(kpoint%kp_env)
     305         2464 :                CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
     306              :             END DO
     307          386 :             DEALLOCATE (kpoint%kp_env)
     308              :          END IF
     309              : 
     310         8148 :          IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
     311          250 :             DO ik = 1, SIZE(kpoint%kp_aux_env)
     312          250 :                CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
     313              :             END DO
     314           32 :             DEALLOCATE (kpoint%kp_aux_env)
     315              :          END IF
     316              : 
     317         8148 :          IF (ASSOCIATED(kpoint%kp_sym)) THEN
     318        14290 :             DO ik = 1, SIZE(kpoint%kp_sym)
     319        14290 :                CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
     320              :             END DO
     321          394 :             DEALLOCATE (kpoint%kp_sym)
     322              :          END IF
     323              : 
     324         8148 :          IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
     325         8148 :          IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
     326              : 
     327         8148 :          IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
     328         5546 :             DO i = 1, SIZE(kpoint%kind_rotmat, 1)
     329        10902 :                DO j = 1, SIZE(kpoint%kind_rotmat, 2)
     330        10712 :                   IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
     331          484 :                      DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
     332              :                   END IF
     333              :                END DO
     334              :             END DO
     335          190 :             DEALLOCATE (kpoint%kind_rotmat)
     336              :          END IF
     337              : 
     338         8148 :          IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
     339          224 :             CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
     340          224 :             DEALLOCATE (kpoint%scf_diis_buffer)
     341              :          END IF
     342              : 
     343         8148 :          DEALLOCATE (kpoint)
     344              : 
     345              :       END IF
     346              : 
     347        16115 :    END SUBROUTINE kpoint_release
     348              : 
     349              : ! **************************************************************************************************
     350              : !> \brief Reset all data derived from a concrete k-point initialization.
     351              : !>        Input options such as the scheme, grid, shifts and symmetry settings are kept.
     352              : !> \param kpoint  The kpoint environment
     353              : ! **************************************************************************************************
     354          760 :    SUBROUTINE kpoint_reset_initialization(kpoint)
     355              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     356              : 
     357              :       INTEGER                                            :: i, ik, j
     358              : 
     359          760 :       IF (ASSOCIATED(kpoint%xkp)) THEN
     360          760 :          DEALLOCATE (kpoint%xkp)
     361              :          NULLIFY (kpoint%xkp)
     362              :       END IF
     363          760 :       IF (ASSOCIATED(kpoint%wkp)) THEN
     364          760 :          DEALLOCATE (kpoint%wkp)
     365              :          NULLIFY (kpoint%wkp)
     366              :       END IF
     367          760 :       IF (ASSOCIATED(kpoint%kp_dist)) THEN
     368          760 :          DEALLOCATE (kpoint%kp_dist)
     369              :          NULLIFY (kpoint%kp_dist)
     370              :       END IF
     371              : 
     372          760 :       CALL mpools_release(kpoint%mpools)
     373          760 :       CALL mpools_release(kpoint%mpools_aux_fit)
     374              : 
     375          760 :       CALL cp_blacs_env_release(kpoint%blacs_env)
     376          760 :       CALL cp_blacs_env_release(kpoint%blacs_env_all)
     377              : 
     378          760 :       CALL mp_para_env_release(kpoint%para_env)
     379          760 :       CALL mp_para_env_release(kpoint%para_env_kp)
     380          760 :       CALL mp_para_env_release(kpoint%para_env_inter_kp)
     381              : 
     382          760 :       IF (ASSOCIATED(kpoint%cell_to_index)) THEN
     383          760 :          DEALLOCATE (kpoint%cell_to_index)
     384              :          NULLIFY (kpoint%cell_to_index)
     385              :       END IF
     386          760 :       IF (ASSOCIATED(kpoint%index_to_cell)) THEN
     387          760 :          DEALLOCATE (kpoint%index_to_cell)
     388              :          NULLIFY (kpoint%index_to_cell)
     389              :       END IF
     390              : 
     391          760 :       IF (ASSOCIATED(kpoint%kp_env)) THEN
     392         2718 :          DO ik = 1, SIZE(kpoint%kp_env)
     393         2718 :             CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
     394              :          END DO
     395          760 :          DEALLOCATE (kpoint%kp_env)
     396              :          NULLIFY (kpoint%kp_env)
     397              :       END IF
     398              : 
     399          760 :       IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
     400            0 :          DO ik = 1, SIZE(kpoint%kp_aux_env)
     401            0 :             CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
     402              :          END DO
     403            0 :          DEALLOCATE (kpoint%kp_aux_env)
     404              :          NULLIFY (kpoint%kp_aux_env)
     405              :       END IF
     406              : 
     407          760 :       IF (ASSOCIATED(kpoint%kp_sym)) THEN
     408         4382 :          DO ik = 1, SIZE(kpoint%kp_sym)
     409         4382 :             CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
     410              :          END DO
     411          760 :          DEALLOCATE (kpoint%kp_sym)
     412              :          NULLIFY (kpoint%kp_sym)
     413              :       END IF
     414              : 
     415          760 :       IF (ASSOCIATED(kpoint%atype)) THEN
     416          760 :          DEALLOCATE (kpoint%atype)
     417              :          NULLIFY (kpoint%atype)
     418              :       END IF
     419          760 :       IF (ASSOCIATED(kpoint%ibrot)) THEN
     420          760 :          DEALLOCATE (kpoint%ibrot)
     421              :          NULLIFY (kpoint%ibrot)
     422              :       END IF
     423              : 
     424          760 :       IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
     425         1080 :          DO i = 1, SIZE(kpoint%kind_rotmat, 1)
     426         1424 :             DO j = 1, SIZE(kpoint%kind_rotmat, 2)
     427          664 :                IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
     428          104 :                   DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
     429          104 :                   NULLIFY (kpoint%kind_rotmat(i, j)%rmat)
     430              :                END IF
     431              :             END DO
     432              :          END DO
     433          760 :          DEALLOCATE (kpoint%kind_rotmat)
     434              :          NULLIFY (kpoint%kind_rotmat)
     435              :       END IF
     436              : 
     437          760 :       IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
     438          680 :          CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
     439          680 :          DEALLOCATE (kpoint%scf_diis_buffer)
     440              :          NULLIFY (kpoint%scf_diis_buffer)
     441              :       END IF
     442              : 
     443          760 :       NULLIFY (kpoint%sab_nl)
     444          760 :       NULLIFY (kpoint%sab_nl_nosym)
     445              : 
     446          760 :       ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
     447         3040 :       kpoint%cell_to_index(:, :, :) = 1
     448              : 
     449          760 :       ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
     450         2280 :       kpoint%index_to_cell(:, :) = 0
     451              : 
     452          760 :       kpoint%nkp = 0
     453          760 :       kpoint%nkp_groups = 0
     454         2280 :       kpoint%kp_range = 0
     455          760 :       kpoint%iogrp = .FALSE.
     456              : 
     457          760 :    END SUBROUTINE kpoint_reset_initialization
     458              : 
     459              : ! **************************************************************************************************
     460              : !> \brief Retrieve information from a kpoint environment
     461              : !> \param kpoint        The kpoint environment
     462              : !> \param kp_scheme     Type of kpoint grid
     463              : !> \param nkp_grid      Grid points
     464              : !> \param kp_shift      Shift of the grid
     465              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     466              : !> \param verbose       more output information
     467              : !> \param full_grid     don't reduce kpoints at all
     468              : !> \param use_real_wfn  real/complex wfn
     469              : !> \param eps_geo       accuracy of atom symmetry detection
     470              : !> \param parallel_group_size kpoint group size
     471              : !> \param kp_range      kpoints distribution for local processor
     472              : !> \param nkp           number of kpoints
     473              : !> \param xkp           kpoint coordinates in units of b-vector
     474              : !> \param wkp           kpoint weights
     475              : !> \param para_env      'global' parallel environment
     476              : !> \param blacs_env_all BLACS env for the total environment
     477              : !> \param para_env_kp   parallel environment of the kpoint calculation
     478              : !> \param para_env_inter_kp   parallel environment between kpoints
     479              : !> \param blacs_env     BLACS env for the kpoint group
     480              : !> \param kp_env        Information for each kpoint
     481              : !> \param kp_aux_env ...
     482              : !> \param mpools        FM matrix pools for kpoint groups
     483              : !> \param iogrp         this kpoint group has the IO processor
     484              : !> \param nkp_groups    number of kpoint groups
     485              : !> \param kp_dist       kpoints distribution on groups
     486              : !> \param cell_to_index given a cell triple, returns the real space index
     487              : !> \param index_to_cell ...
     488              : !> \param sab_nl        neighbourlist that defines real space matrices
     489              : !> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
     490              : !> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
     491              : !> \param symmetry_backend k-point symmetry backend
     492              : !> \param symmetry_reduction_method k-point symmetry reduction method
     493              : !> \author JGH
     494              : ! **************************************************************************************************
     495      1871532 :    SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
     496              :                               full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
     497              :                               para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
     498              :                               kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
     499              :                               sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
     500              :                               symmetry_reduction_method)
     501              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
     502              :       CHARACTER(LEN=*), OPTIONAL                         :: kp_scheme
     503              :       INTEGER, DIMENSION(3), OPTIONAL                    :: nkp_grid
     504              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: kp_shift
     505              :       LOGICAL, OPTIONAL                                  :: symmetry, verbose, full_grid, &
     506              :                                                             use_real_wfn
     507              :       REAL(KIND=dp), OPTIONAL                            :: eps_geo
     508              :       INTEGER, OPTIONAL                                  :: parallel_group_size
     509              :       INTEGER, DIMENSION(2), OPTIONAL                    :: kp_range
     510              :       INTEGER, OPTIONAL                                  :: nkp
     511              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: xkp
     512              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     513              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     514              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_all
     515              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_kp, para_env_inter_kp
     516              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env
     517              :       TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
     518              :          POINTER                                         :: kp_env, kp_aux_env
     519              :       TYPE(qs_matrix_pools_type), OPTIONAL, POINTER      :: mpools
     520              :       LOGICAL, OPTIONAL                                  :: iogrp
     521              :       INTEGER, OPTIONAL                                  :: nkp_groups
     522              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: kp_dist
     523              :       INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER     :: cell_to_index
     524              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: index_to_cell
     525              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     526              :          OPTIONAL, POINTER                               :: sab_nl, sab_nl_nosym
     527              :       LOGICAL, OPTIONAL                                  :: inversion_symmetry_only
     528              :       INTEGER, OPTIONAL                                  :: symmetry_backend, &
     529              :                                                             symmetry_reduction_method
     530              : 
     531         3292 :       IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
     532      1872252 :       IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
     533      1871532 :       IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
     534      1871532 :       IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
     535      1871532 :       IF (PRESENT(verbose)) verbose = kpoint%verbose
     536      1871532 :       IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
     537      1871532 :       IF (PRESENT(inversion_symmetry_only)) inversion_symmetry_only = kpoint%inversion_symmetry_only
     538      1871532 :       IF (PRESENT(symmetry_backend)) symmetry_backend = kpoint%symmetry_backend
     539      1871532 :       IF (PRESENT(symmetry_reduction_method)) &
     540            0 :          symmetry_reduction_method = kpoint%symmetry_reduction_method
     541      1871532 :       IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
     542      1871532 :       IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
     543      1871532 :       IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
     544              : 
     545      1871532 :       IF (PRESENT(nkp)) nkp = kpoint%nkp
     546      1871532 :       IF (PRESENT(wkp)) wkp => kpoint%wkp
     547      1871532 :       IF (PRESENT(xkp)) xkp => kpoint%xkp
     548              : 
     549      1871532 :       IF (PRESENT(para_env)) para_env => kpoint%para_env
     550      1871532 :       IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
     551      1871532 :       IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
     552      1871532 :       IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
     553      1871532 :       IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
     554              : 
     555      1871532 :       IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
     556      1998384 :       IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
     557      1871532 :       IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
     558      1871532 :       IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
     559              : 
     560      1871532 :       IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
     561      1871532 :       IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
     562      1871532 :       IF (PRESENT(mpools)) mpools => kpoint%mpools
     563              : 
     564      1871532 :       IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
     565      1871532 :       IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
     566      1871532 :       IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
     567      1871532 :       IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
     568              : 
     569      1871532 :    END SUBROUTINE get_kpoint_info
     570              : 
     571              : ! **************************************************************************************************
     572              : !> \brief Set information in a kpoint environment
     573              : !> \param kpoint        The kpoint environment
     574              : !> \param kp_scheme     Type of kpoint grid
     575              : !> \param nkp_grid      Grid points
     576              : !> \param kp_shift      Shift of the grid
     577              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     578              : !> \param verbose       more output information
     579              : !> \param full_grid     don't reduce kpoints at all
     580              : !> \param use_real_wfn  real/complex wfn
     581              : !> \param eps_geo       accuracy of atom symmetry detection
     582              : !> \param parallel_group_size kpoint group size
     583              : !> \param kp_range      kpoints distribution for local processor
     584              : !> \param nkp           number of kpoints
     585              : !> \param xkp           kpoint coordinates
     586              : !> \param wkp           kpoint weights
     587              : !> \param para_env      'global' parallel environment
     588              : !> \param blacs_env_all BLACS env for the total environment
     589              : !> \param para_env_kp   parallel environment of the kpoint calculation
     590              : !> \param para_env_inter_kp   parallel environment between kpoints
     591              : !> \param blacs_env     BLACS env for the kpoint group
     592              : !> \param kp_env        Information for each kpoint
     593              : !> \param kp_aux_env ...
     594              : !> \param mpools        FM matrix pools for kpoint groups
     595              : !> \param iogrp         this kpoint group has the IO processor
     596              : !> \param nkp_groups    number of kpoint groups
     597              : !> \param kp_dist       kpoints distribution on groups
     598              : !> \param cell_to_index given a cell triple, returns the real space index
     599              : !> \param index_to_cell ...
     600              : !> \param sab_nl        neighbourlist that defines real space matrices
     601              : !> \param sab_nl_nosym  neighbourlist that defines real space matrices
     602              : !> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
     603              : !> \param symmetry_backend k-point symmetry backend
     604              : !> \param symmetry_reduction_method k-point symmetry reduction method
     605              : !> \author JGH
     606              : ! **************************************************************************************************
     607         2476 :    SUBROUTINE set_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)
     613              :       TYPE(kpoint_type), INTENT(INOUT)                   :: 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              : 
     643            0 :       IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
     644         2476 :       IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
     645         2476 :       IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
     646         2476 :       IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
     647         2476 :       IF (PRESENT(verbose)) kpoint%verbose = verbose
     648         2476 :       IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
     649         2476 :       IF (PRESENT(inversion_symmetry_only)) kpoint%inversion_symmetry_only = inversion_symmetry_only
     650         2476 :       IF (PRESENT(symmetry_backend)) kpoint%symmetry_backend = symmetry_backend
     651         2476 :       IF (PRESENT(symmetry_reduction_method)) &
     652            0 :          kpoint%symmetry_reduction_method = symmetry_reduction_method
     653         2476 :       IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
     654         2476 :       IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
     655         2476 :       IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
     656              : 
     657         2476 :       IF (PRESENT(nkp)) kpoint%nkp = nkp
     658         2476 :       IF (PRESENT(wkp)) kpoint%wkp => wkp
     659         2476 :       IF (PRESENT(xkp)) kpoint%xkp => xkp
     660              : 
     661         2476 :       IF (PRESENT(para_env)) kpoint%para_env => para_env
     662         2476 :       IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
     663         2476 :       IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
     664         2476 :       IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
     665         2476 :       IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
     666              : 
     667         2476 :       IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
     668         2476 :       IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
     669         2476 :       IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
     670         2476 :       IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
     671              : 
     672         2476 :       IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
     673            0 :       IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
     674         2476 :       IF (PRESENT(mpools)) kpoint%mpools => mpools
     675         2476 :       IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
     676         2476 :       IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
     677              : 
     678         2476 :       IF (PRESENT(cell_to_index)) THEN
     679            0 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     680            0 :          kpoint%cell_to_index => cell_to_index
     681              :       END IF
     682              : 
     683         2476 :       IF (PRESENT(index_to_cell)) THEN
     684            0 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     685            0 :          kpoint%index_to_cell => index_to_cell
     686              :       END IF
     687              : 
     688         2476 :    END SUBROUTINE set_kpoint_info
     689              : 
     690              : ! **************************************************************************************************
     691              : !> \brief Read the kpoint input section
     692              : !> \param kpoint  The kpoint environment
     693              : !> \param kpoint_section The input section
     694              : !> \param a_vec ...
     695              : !> \author JGH
     696              : ! **************************************************************************************************
     697         7983 :    SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec)
     698              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     699              :       TYPE(section_vals_type), POINTER                   :: kpoint_section
     700              :       REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN)         :: a_vec
     701              : 
     702              :       CHARACTER(LEN=default_string_length)               :: ustr
     703              :       CHARACTER(LEN=default_string_length), &
     704         7983 :          DIMENSION(:), POINTER                           :: tmpstringlist
     705              :       INTEGER                                            :: i, n_rep, nval, wfntype
     706              :       LOGICAL                                            :: available, backend_explicit, &
     707              :                                                             reduction_explicit
     708              :       REAL(KIND=dp)                                      :: ff
     709         7983 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: reallist
     710              : 
     711         7983 :       CALL section_vals_get(kpoint_section, explicit=available)
     712              : 
     713         7983 :       IF (available) THEN
     714          358 :          CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
     715          358 :          nval = SIZE(tmpstringlist)
     716          358 :          CPASSERT(nval >= 1)
     717          358 :          kpoint%kp_scheme = tmpstringlist(1)
     718          358 :          CALL uppercase(kpoint%kp_scheme)
     719              : 
     720              :          ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
     721          306 :          SELECT CASE (kpoint%kp_scheme)
     722              :          CASE ("NONE")
     723              :             ! do nothing
     724              :          CASE ("GAMMA")
     725              :             ! do nothing
     726              :          CASE ("MONKHORST-PACK")
     727          306 :             CPASSERT(nval >= 4)
     728         1224 :             DO i = 2, 4
     729         1224 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     730              :             END DO
     731              :          CASE ("MACDONALD")
     732            2 :             CPASSERT(nval >= 7)
     733            8 :             DO i = 2, 4
     734            8 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     735              :             END DO
     736            8 :             DO i = 5, 7
     737            8 :                READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
     738              :             END DO
     739              :          CASE ("GENERAL")
     740            4 :             CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
     741            4 :             CALL uppercase(ustr)
     742            4 :             CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
     743            4 :             kpoint%nkp = n_rep
     744           20 :             ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
     745           12 :             DO i = 1, n_rep
     746              :                CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
     747            8 :                                          r_vals=reallist)
     748            8 :                nval = SIZE(reallist)
     749            8 :                CPASSERT(nval >= 4)
     750            8 :                SELECT CASE (ustr)
     751              :                CASE ("B_VECTOR")
     752           32 :                   kpoint%xkp(1:3, i) = reallist(1:3)
     753              :                CASE ("CART_ANGSTROM")
     754              :                   kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
     755              :                                         reallist(2)*a_vec(2, 1:3) + &
     756            0 :                                         reallist(3)*a_vec(3, 1:3))/twopi*angstrom
     757              :                CASE ("CART_BOHR")
     758              :                   kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
     759              :                                         reallist(2)*a_vec(2, 1:3) + &
     760            0 :                                         reallist(3)*a_vec(3, 1:3))/twopi
     761              :                CASE DEFAULT
     762            8 :                   CPABORT("Unknown Unit for kpoint definition")
     763              :                END SELECT
     764           12 :                kpoint%wkp(i) = reallist(4)
     765              :             END DO
     766           12 :             ff = 1.0_dp/SUM(kpoint%wkp(:))
     767           16 :             kpoint%wkp(:) = ff*kpoint%wkp(:)
     768              :          CASE DEFAULT
     769          358 :             CPABORT("")
     770              :          END SELECT
     771              : 
     772          358 :          CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
     773          358 :          CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
     774          358 :          CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
     775          358 :          CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
     776              :          CALL section_vals_val_get(kpoint_section, "INVERSION_SYMMETRY_ONLY", &
     777          358 :                                    l_val=kpoint%inversion_symmetry_only)
     778              :          CALL section_vals_val_get(kpoint_section, "SYMMETRY_BACKEND", &
     779          358 :                                    i_val=kpoint%symmetry_backend, explicit=backend_explicit)
     780              :          CALL section_vals_val_get(kpoint_section, "SYMMETRY_REDUCTION_METHOD", &
     781          358 :                                    i_val=kpoint%symmetry_reduction_method, explicit=reduction_explicit)
     782          358 :          CALL resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
     783          358 :          CALL section_vals_val_get(kpoint_section, "EPS_SYMMETRY", r_val=kpoint%eps_geo)
     784              :          CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
     785          358 :                                    i_val=kpoint%parallel_group_size)
     786           16 :          SELECT CASE (wfntype)
     787              :          CASE (use_real_wfn)
     788           16 :             kpoint%use_real_wfn = .TRUE.
     789              :          CASE (use_complex_wfn)
     790          342 :             kpoint%use_real_wfn = .FALSE.
     791              :          CASE DEFAULT
     792          358 :             CPABORT("")
     793              :          END SELECT
     794              : 
     795              :       ELSE
     796         7625 :          kpoint%kp_scheme = "NONE"
     797              :       END IF
     798              : 
     799         7983 :    END SUBROUTINE read_kpoint_section
     800              : 
     801              : ! **************************************************************************************************
     802              : !> \brief Resolve legacy and backend k-point symmetry settings
     803              : !> \param kpoint ...
     804              : !> \param backend_explicit whether SYMMETRY_BACKEND was given
     805              : !> \param reduction_explicit whether SYMMETRY_REDUCTION_METHOD was given
     806              : ! **************************************************************************************************
     807          358 :    SUBROUTINE resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
     808              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     809              :       LOGICAL, INTENT(IN)                                :: backend_explicit, reduction_explicit
     810              : 
     811          358 :       IF (backend_explicit .AND. .NOT. reduction_explicit) THEN
     812           22 :          SELECT CASE (kpoint%symmetry_backend)
     813              :          CASE (use_k290_kpoint_backend)
     814            0 :             kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
     815              :          CASE (use_spglib_kpoint_backend)
     816           22 :             kpoint%symmetry_reduction_method = use_spglib_kpoint_symmetry
     817              :          CASE DEFAULT
     818           22 :             CPABORT("Unknown k-point symmetry backend")
     819              :          END SELECT
     820              :       END IF
     821              : 
     822          358 :       IF (kpoint%symmetry_backend == use_spglib_kpoint_backend .AND. &
     823              :           kpoint%symmetry_reduction_method /= use_spglib_kpoint_symmetry) THEN
     824              :          CALL cp_abort(__LOCATION__, &
     825            0 :                        "SYMMETRY_BACKEND SPGLIB requires SYMMETRY_REDUCTION_METHOD SPGLIB")
     826              :       END IF
     827              : 
     828          358 :    END SUBROUTINE resolve_kpoint_symmetry_settings
     829              : 
     830              : ! **************************************************************************************************
     831              : !> \brief Write information on the kpoints to output
     832              : !> \param kpoint  The kpoint environment
     833              : !> \param iounit  output unit
     834              : !> \param dft_section  DFT section information for output unit
     835              : !> \author JGH
     836              : ! **************************************************************************************************
     837         7981 :    SUBROUTINE write_kpoint_info(kpoint, iounit, dft_section)
     838              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
     839              :       INTEGER, INTENT(IN), OPTIONAL                      :: iounit
     840              :       TYPE(section_vals_type), INTENT(IN), OPTIONAL      :: dft_section
     841              : 
     842              :       INTEGER                                            :: i, punit
     843              :       TYPE(cp_logger_type), POINTER                      :: logger
     844              : 
     845         7981 :       NULLIFY (logger)
     846         7981 :       logger => cp_get_default_logger()
     847              : 
     848         7981 :       IF (PRESENT(dft_section)) THEN
     849         7969 :          punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
     850           12 :       ELSE IF (PRESENT(iounit)) THEN
     851           12 :          punit = iounit
     852              :       ELSE
     853            0 :          punit = cp_logger_get_default_unit_nr(logger)
     854              :       END IF
     855              : 
     856         7981 :       IF (punit > 0) THEN
     857              : 
     858         1964 :          IF (kpoint%kp_scheme /= "NONE") THEN
     859           65 :             WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
     860              :          END IF
     861            1 :          SELECT CASE (kpoint%kp_scheme)
     862              :          CASE ("NONE")
     863              :             ! be silent
     864              :          CASE ("GAMMA")
     865            1 :             WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
     866              :          CASE ("MONKHORST-PACK")
     867           64 :             WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', '      Monkhorst-Pack'
     868           64 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
     869              :             WRITE (punit, '(A,T66,G15.6)') &
     870           64 :                ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
     871              :          CASE ("MACDONALD")
     872            0 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
     873            0 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
     874            0 :             WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
     875              :             WRITE (punit, '(A,T66,G15.6)') &
     876            0 :                ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
     877              :          CASE ("GENERAL")
     878            0 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', '   General'
     879              :          CASE DEFAULT
     880         1964 :             CPABORT("")
     881              :          END SELECT
     882         1964 :          IF (kpoint%kp_scheme /= "NONE") THEN
     883           65 :             IF (kpoint%symmetry) THEN
     884           35 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '   ON'
     885              :             ELSE
     886           30 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '  OFF'
     887              :             END IF
     888           65 :             IF (kpoint%inversion_symmetry_only) THEN
     889            4 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Restrict symmetry to inversion', '   ON'
     890              :             END IF
     891              :             IF (kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
     892           65 :                 .NOT. kpoint%inversion_symmetry_only .AND. &
     893              :                 (kpoint%kp_scheme == "MONKHORST-PACK" .OR. kpoint%kp_scheme == "MACDONALD")) THEN
     894           31 :                SELECT CASE (kpoint%symmetry_backend)
     895              :                CASE (use_k290_kpoint_backend)
     896           15 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', '   K290'
     897              :                CASE (use_spglib_kpoint_backend)
     898            1 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', ' SPGLIB'
     899              :                CASE DEFAULT
     900           16 :                   CPABORT("Unknown k-point symmetry backend")
     901              :                END SELECT
     902           31 :                SELECT CASE (kpoint%symmetry_reduction_method)
     903              :                CASE (use_k290_kpoint_symmetry)
     904           15 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', '   K290'
     905              :                CASE (use_spglib_kpoint_symmetry)
     906            1 :                   WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', ' SPGLIB'
     907              :                CASE DEFAULT
     908           65 :                   CPABORT("Unknown k-point symmetry reduction method")
     909              :                END SELECT
     910              :             END IF
     911           65 :             IF (kpoint%use_real_wfn) THEN
     912            0 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
     913              :             ELSE
     914           65 :                WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
     915              :             END IF
     916           65 :             IF (kpoint%full_grid) THEN
     917           15 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid     '
     918              :             END IF
     919           65 :             IF (kpoint%kp_scheme /= "GAMMA") THEN
     920           64 :                WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
     921              :                WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
     922           64 :                   ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
     923          710 :                DO i = 1, kpoint%nkp
     924          646 :                   WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
     925         1356 :                      kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
     926              :                END DO
     927              :             END IF
     928           65 :             WRITE (punit, '(" ",79("*"))')
     929              :          END IF
     930              : 
     931              :       END IF
     932              : 
     933         7981 :       IF (PRESENT(dft_section)) THEN
     934         7969 :          CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
     935              :       END IF
     936              : 
     937         7981 :    END SUBROUTINE write_kpoint_info
     938              : 
     939              : ! **************************************************************************************************
     940              : !> \brief Create a single kpoint environment
     941              : !> \param kp_env  Single kpoint environment
     942              : !> \author JGH
     943              : ! **************************************************************************************************
     944         4254 :    SUBROUTINE kpoint_env_create(kp_env)
     945              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
     946              : 
     947         4254 :       CPASSERT(.NOT. ASSOCIATED(kp_env))
     948              : 
     949        21270 :       ALLOCATE (kp_env)
     950              : 
     951         4254 :       kp_env%nkpoint = 0
     952              :       kp_env%wkp = 0.0_dp
     953        17016 :       kp_env%xkp = 0.0_dp
     954         4254 :       kp_env%is_local = .FALSE.
     955              : 
     956         4254 :       NULLIFY (kp_env%mos)
     957         4254 :       NULLIFY (kp_env%pmat)
     958         4254 :       NULLIFY (kp_env%wmat)
     959         4254 :       NULLIFY (kp_env%smat)
     960         4254 :       NULLIFY (kp_env%amat)
     961              : 
     962         4254 :    END SUBROUTINE kpoint_env_create
     963              : 
     964              : ! **************************************************************************************************
     965              : !> \brief Release a single kpoint environment
     966              : !> \param kp_env  Single kpoint environment
     967              : !> \author JGH
     968              : ! **************************************************************************************************
     969         4254 :    SUBROUTINE kpoint_env_release(kp_env)
     970              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
     971              : 
     972              :       INTEGER                                            :: ic, is
     973              : 
     974         4254 :       IF (ASSOCIATED(kp_env)) THEN
     975              : 
     976         4254 :          IF (ASSOCIATED(kp_env%mos)) THEN
     977         8788 :             DO is = 1, SIZE(kp_env%mos, 2)
     978        17836 :                DO ic = 1, SIZE(kp_env%mos, 1)
     979        13582 :                   CALL deallocate_mo_set(kp_env%mos(ic, is))
     980              :                END DO
     981              :             END DO
     982         4254 :             DEALLOCATE (kp_env%mos)
     983              :          END IF
     984              : 
     985         4254 :          CALL cp_fm_release(kp_env%pmat)
     986         4254 :          CALL cp_fm_release(kp_env%wmat)
     987         4254 :          CALL cp_fm_release(kp_env%smat)
     988         4254 :          CALL cp_fm_release(kp_env%amat)
     989              : 
     990         4254 :          CALL cp_fm_release(kp_env%shalf)
     991         4254 :          CALL cp_cfm_release(kp_env%cshalf)
     992              : 
     993         4254 :          DEALLOCATE (kp_env)
     994              : 
     995              :       END IF
     996              : 
     997         4254 :    END SUBROUTINE kpoint_env_release
     998              : 
     999              : ! **************************************************************************************************
    1000              : !> \brief Get information from a single kpoint environment
    1001              : !> \param kpoint_env Single kpoint environment
    1002              : !> \param nkpoint    Index of kpoint
    1003              : !> \param wkp        Weight of kpoint
    1004              : !> \param xkp        Coordinates of kpoint
    1005              : !> \param is_local   Is this kpoint local (single cpu group)
    1006              : !> \param mos        MOs of this kpoint
    1007              : !> \author JGH
    1008              : ! **************************************************************************************************
    1009         7564 :    SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
    1010              :       TYPE(kpoint_env_type), INTENT(IN)                  :: kpoint_env
    1011              :       INTEGER, OPTIONAL                                  :: nkpoint
    1012              :       REAL(KIND=dp), OPTIONAL                            :: wkp
    1013              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: xkp
    1014              :       LOGICAL, OPTIONAL                                  :: is_local
    1015              :       TYPE(mo_set_type), DIMENSION(:, :), OPTIONAL, &
    1016              :          POINTER                                         :: mos
    1017              : 
    1018         7564 :       IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
    1019         7564 :       IF (PRESENT(wkp)) wkp = kpoint_env%wkp
    1020         7564 :       IF (PRESENT(xkp)) xkp = kpoint_env%xkp
    1021         7564 :       IF (PRESENT(is_local)) is_local = kpoint_env%is_local
    1022         7564 :       IF (PRESENT(mos)) mos => kpoint_env%mos
    1023              : 
    1024         7564 :    END SUBROUTINE get_kpoint_env
    1025              : 
    1026              : ! **************************************************************************************************
    1027              : !> \brief Create a single kpoint symmetry environment
    1028              : !> \param kp_sym  ...
    1029              : !> \author JGH
    1030              : ! **************************************************************************************************
    1031        17518 :    SUBROUTINE kpoint_sym_create(kp_sym)
    1032              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
    1033              : 
    1034        17518 :       CPASSERT(.NOT. ASSOCIATED(kp_sym))
    1035              : 
    1036        17518 :       ALLOCATE (kp_sym)
    1037              : 
    1038        17518 :       kp_sym%nwght = 0
    1039        17518 :       kp_sym%nwred = 0
    1040              :       kp_sym%apply_symmetry = .FALSE.
    1041              : 
    1042              :       NULLIFY (kp_sym%rot)
    1043              :       NULLIFY (kp_sym%xkp)
    1044              :       NULLIFY (kp_sym%rotp)
    1045              :       NULLIFY (kp_sym%f0)
    1046              :       NULLIFY (kp_sym%fcell)
    1047              : 
    1048        17518 :    END SUBROUTINE kpoint_sym_create
    1049              : 
    1050              : ! **************************************************************************************************
    1051              : !> \brief Release a single kpoint symmetry environment
    1052              : !> \param kp_sym  ...
    1053              : !> \author JGH
    1054              : ! **************************************************************************************************
    1055        17518 :    SUBROUTINE kpoint_sym_release(kp_sym)
    1056              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
    1057              : 
    1058        17518 :       IF (ASSOCIATED(kp_sym)) THEN
    1059              : 
    1060        17518 :          IF (ASSOCIATED(kp_sym%rot)) THEN
    1061          298 :             DEALLOCATE (kp_sym%rot)
    1062              :          END IF
    1063        17518 :          IF (ASSOCIATED(kp_sym%xkp)) THEN
    1064          298 :             DEALLOCATE (kp_sym%xkp)
    1065              :          END IF
    1066        17518 :          IF (ASSOCIATED(kp_sym%f0)) THEN
    1067          298 :             DEALLOCATE (kp_sym%f0)
    1068              :          END IF
    1069        17518 :          IF (ASSOCIATED(kp_sym%fcell)) THEN
    1070          298 :             DEALLOCATE (kp_sym%fcell)
    1071              :          END IF
    1072        17518 :          IF (ASSOCIATED(kp_sym%rotp)) THEN
    1073          298 :             DEALLOCATE (kp_sym%rotp)
    1074              :          END IF
    1075              : 
    1076        17518 :          DEALLOCATE (kp_sym)
    1077              : 
    1078              :       END IF
    1079              : 
    1080        17518 :    END SUBROUTINE kpoint_sym_release
    1081              : 
    1082              : ! **************************************************************************************************
    1083              : 
    1084            0 : END MODULE kpoint_types
        

Generated by: LCOV version 2.0-1