LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:1155b05) Lines: 89.2 % 278 248
Test Date: 2026-03-21 06:31:29 Functions: 64.7 % 17 11

            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_real_wfn
      29              :    USE input_section_types,             ONLY: section_vals_get,&
      30              :                                               section_vals_type,&
      31              :                                               section_vals_val_get
      32              :    USE kinds,                           ONLY: default_string_length,&
      33              :                                               dp
      34              :    USE mathconstants,                   ONLY: twopi
      35              :    USE message_passing,                 ONLY: mp_para_env_release,&
      36              :                                               mp_para_env_type
      37              :    USE physcon,                         ONLY: angstrom
      38              :    USE qs_diis_types,                   ONLY: qs_diis_b_release_kp,&
      39              :                                               qs_diis_buffer_type_kp
      40              :    USE qs_matrix_pools,                 ONLY: mpools_release,&
      41              :                                               qs_matrix_pools_type
      42              :    USE qs_mo_types,                     ONLY: deallocate_mo_set,&
      43              :                                               mo_set_type
      44              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      45              :    USE string_utilities,                ONLY: uppercase
      46              : #include "./base/base_uses.f90"
      47              : 
      48              :    IMPLICIT NONE
      49              : 
      50              :    PRIVATE
      51              : 
      52              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
      53              : 
      54              :    PUBLIC :: kpoint_type
      55              :    PUBLIC :: kpoint_create, kpoint_release, get_kpoint_info, set_kpoint_info
      56              :    PUBLIC :: read_kpoint_section, write_kpoint_info
      57              :    PUBLIC :: kpoint_env_type, kpoint_env_p_type
      58              :    PUBLIC :: kpoint_env_create, get_kpoint_env
      59              :    PUBLIC :: kind_rotmat_type
      60              :    PUBLIC :: kpoint_sym_type
      61              :    PUBLIC :: kpoint_sym_create
      62              : 
      63              : ! **************************************************************************************************
      64              : !> \brief Keeps information about a specific k-point
      65              : !> \param nkpoint   the kpoint index
      66              : !> \param wkp       weight of this kpoint
      67              : !> \param xkp       kpoint coordinates in units of b-vector
      68              : !> \param is_local  if this kpoint is calculated on a single thread
      69              : !> \param mos       associated MOs (r/i,spin)
      70              : !> \param pmat      associated density matrix (r/i,spin)
      71              : !> \param wmat      associated energy weighted density matrix (r/i,spin)
      72              : !> \param smat      associated overlap matrix (for ADMM) (r/i,spin)
      73              : !> \param amat      associated ADMM basis projection matrix (r/i,spin)
      74              : !> \param shalf     S(K)^(1/2) DFT+U Lowdin method (real wfn)
      75              : !> \param cshalf    S(K)^(1/2) DFT+U Lowdin method (complex wfn)
      76              : !> \author JGH
      77              : ! **************************************************************************************************
      78              :    TYPE kpoint_env_type
      79              :       INTEGER                                           :: nkpoint = -1
      80              :       REAL(KIND=dp)                                     :: wkp = 0.0_dp
      81              :       REAL(KIND=dp), DIMENSION(3)                       :: xkp = 0.0_dp
      82              :       LOGICAL                                           :: is_local = .FALSE.
      83              :       TYPE(mo_set_type), DIMENSION(:, :), POINTER       :: mos => NULL()
      84              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: pmat => NULL()
      85              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: wmat => NULL()
      86              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: smat => NULL()
      87              :       TYPE(cp_fm_type), DIMENSION(:, :), POINTER        :: amat => NULL()
      88              :       TYPE(cp_fm_type)                                  :: shalf
      89              :       TYPE(cp_cfm_type)                                 :: cshalf
      90              :    END TYPE kpoint_env_type
      91              : 
      92              :    TYPE kpoint_env_p_type
      93              :       TYPE(kpoint_env_type), POINTER                    :: kpoint_env => NULL()
      94              :    END TYPE kpoint_env_p_type
      95              : 
      96              : ! **************************************************************************************************
      97              : !> \brief Rotation matrices for basis sets
      98              : !> \param rmat      atom basis function rotation matrix
      99              : !> \author JGH
     100              : ! **************************************************************************************************
     101              :    TYPE kind_rotmat_type
     102              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: rmat => NULL()
     103              :    END TYPE kind_rotmat_type
     104              : 
     105              : ! **************************************************************************************************
     106              : !> \brief Keeps symmetry information about a specific k-point
     107              : !> \param apply_symmetry ...
     108              : !> \param nwght     kpoint multiplicity
     109              : !> \param xkp       kpoint coordinates
     110              : !> \param rot       rotation matrices
     111              : !> \param f0        atom permutation
     112              : !> \author JGH
     113              : ! **************************************************************************************************
     114              :    TYPE kpoint_sym_type
     115              :       LOGICAL                                           :: apply_symmetry = .FALSE.
     116              :       INTEGER                                           :: nwght = -1
     117              :       INTEGER                                           :: nwred = -1
     118              :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: xkp => NULL()
     119              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: rot => NULL()
     120              :       INTEGER, DIMENSION(:), POINTER                    :: rotp => NULL()
     121              :       INTEGER, DIMENSION(:, :), POINTER                 :: f0 => NULL()
     122              :    END TYPE kpoint_sym_type
     123              : 
     124              :    TYPE kpoint_sym_p_type
     125              :       TYPE(kpoint_sym_type), POINTER                    :: kpoint_sym => NULL()
     126              :    END TYPE kpoint_sym_p_type
     127              : 
     128              : ! **************************************************************************************************
     129              : !> \brief Contains information about kpoints
     130              : !> \par History
     131              : !>       2014.07 created [JGH]
     132              : !> \param kp_scheme           [input] Type of kpoint grid
     133              : !> \param nkp_grid            [input] Grid points
     134              : !> \param kp_shift            [input] Shift of the grid
     135              : !> \param use_real_wfn        [input] real/complex wfn
     136              : !> \param symmetry            [input] use symmetry (atoms) to reduce kpoints
     137              : !> \param full_grid           [input] don't reduce kpoints at all
     138              : !> \param verbose             [input] more output information
     139              : !> \param eps_geo             [input] accuracy of atom symmetry detection
     140              : !> \param parallel_group_size [input] kpoint group size
     141              : !> \param nkp     number of kpoints
     142              : !> \param xkp     kpoint coordinates
     143              : !> \param wkp     kpoint weights
     144              : !> \param para_env 'global' parallel environment
     145              : !> \param para_env_kp parallel environment of the kpoint calculation
     146              : !> \param para_env_inter_kp parallel environment between kpoints
     147              : !> \param iogrp  this kpoint group has the IO processor
     148              : !> \param nkp_groups   number of kpoint groups
     149              : !> \param kp_dist      kpoints distribution on groups
     150              : !> \param kp_range     kpoints distribution for local processor
     151              : !> \param blacs_env    BLACS env for the kpoint group
     152              : !> \param opmats       Operator matrices
     153              : !> \param kp_env       Information for each kpoint
     154              : !> \param mpools       FM matrix pools for kpoint groups
     155              : !> \author JGH
     156              : ! **************************************************************************************************
     157              :    TYPE kpoint_type
     158              :       CHARACTER(LEN=default_string_length)    :: kp_scheme = ""
     159              :       INTEGER, DIMENSION(3)                   :: nkp_grid = -1
     160              :       REAL(KIND=dp), DIMENSION(3)             :: kp_shift = 0.0_dp
     161              :       LOGICAL                                 :: use_real_wfn = .FALSE.
     162              :       LOGICAL                                 :: symmetry = .FALSE.
     163              :       LOGICAL                                 :: full_grid = .FALSE.
     164              :       LOGICAL                                 :: verbose = .FALSE.
     165              :       REAL(KIND=dp)                           :: eps_geo = 0.0_dp
     166              :       INTEGER                                 :: parallel_group_size = -1
     167              :       INTEGER                                 :: nkp = -1
     168              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => Null()
     169              :       REAL(KIND=dp), DIMENSION(:), POINTER    :: wkp => Null()
     170              :       ! parallel environment
     171              :       TYPE(mp_para_env_type), POINTER         :: para_env => Null()
     172              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env_all => Null()
     173              :       TYPE(mp_para_env_type), POINTER         :: para_env_kp => Null(), &
     174              :                                                  para_env_inter_kp => Null()
     175              :       LOGICAL                                 :: iogrp = .FALSE.
     176              :       INTEGER                                 :: nkp_groups = -1
     177              :       INTEGER, DIMENSION(:, :), POINTER       :: kp_dist => Null()
     178              :       INTEGER, DIMENSION(2)                   :: kp_range = -1
     179              :       TYPE(cp_blacs_env_type), POINTER        :: blacs_env => Null()
     180              :       INTEGER, DIMENSION(:, :, :), POINTER    :: cell_to_index => Null()
     181              :       INTEGER, DIMENSION(:, :), POINTER       :: index_to_cell => Null()
     182              :       TYPE(neighbor_list_set_p_type), &
     183              :          DIMENSION(:), POINTER                :: sab_nl => Null(), &
     184              :                                                  sab_nl_nosym => Null()
     185              :       ! environment
     186              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     187              :          POINTER                              :: kp_env => Null()
     188              :       TYPE(kpoint_env_p_type), DIMENSION(:), &
     189              :          POINTER                              :: kp_aux_env => Null()
     190              :       ! symmetry
     191              :       TYPE(kpoint_sym_p_type), DIMENSION(:), &
     192              :          POINTER                              :: kp_sym => Null()
     193              :       INTEGER, DIMENSION(:), POINTER          :: atype => Null()
     194              :       INTEGER, DIMENSION(:), POINTER          :: ibrot => Null()
     195              :       TYPE(kind_rotmat_type), DIMENSION(:, :), &
     196              :          POINTER                              :: kind_rotmat => Null()
     197              :       ! pools
     198              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools => Null()
     199              :       TYPE(qs_diis_buffer_type_kp), POINTER   :: scf_diis_buffer => Null()
     200              :       TYPE(qs_matrix_pools_type), POINTER     :: mpools_aux_fit => Null()
     201              :    END TYPE kpoint_type
     202              : 
     203              : ! **************************************************************************************************
     204              : 
     205              : CONTAINS
     206              : 
     207              : ! **************************************************************************************************
     208              : !> \brief Create a kpoint environment
     209              : !> \param kpoint  All the kpoint information
     210              : !> \author JGH
     211              : ! **************************************************************************************************
     212         7858 :    SUBROUTINE kpoint_create(kpoint)
     213              :       TYPE(kpoint_type), POINTER                         :: kpoint
     214              : 
     215         7858 :       CPASSERT(.NOT. ASSOCIATED(kpoint))
     216              : 
     217        86438 :       ALLOCATE (kpoint)
     218              : 
     219         7858 :       kpoint%kp_scheme = ""
     220        31432 :       kpoint%nkp_grid = 0
     221        31432 :       kpoint%kp_shift = 0.0_dp
     222         7858 :       kpoint%symmetry = .FALSE.
     223         7858 :       kpoint%verbose = .FALSE.
     224         7858 :       kpoint%full_grid = .FALSE.
     225         7858 :       kpoint%use_real_wfn = .FALSE.
     226         7858 :       kpoint%eps_geo = 1.0e-6_dp
     227         7858 :       kpoint%parallel_group_size = -1
     228              : 
     229         7858 :       kpoint%nkp = 0
     230              : 
     231         7858 :       NULLIFY (kpoint%xkp, kpoint%wkp)
     232         7858 :       NULLIFY (kpoint%kp_dist)
     233              : 
     234         7858 :       NULLIFY (kpoint%para_env)
     235         7858 :       NULLIFY (kpoint%blacs_env_all)
     236         7858 :       NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
     237         7858 :       NULLIFY (kpoint%blacs_env)
     238         7858 :       kpoint%nkp_groups = 0
     239         7858 :       kpoint%iogrp = .FALSE.
     240        23574 :       kpoint%kp_range = 0
     241              : 
     242         7858 :       NULLIFY (kpoint%kp_env)
     243         7858 :       NULLIFY (kpoint%mpools)
     244              : 
     245         7858 :       ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
     246        31432 :       kpoint%cell_to_index(:, :, :) = 1
     247              : 
     248         7858 :       ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
     249        23574 :       kpoint%index_to_cell(:, :) = 0
     250              : 
     251         7858 :    END SUBROUTINE kpoint_create
     252              : 
     253              : ! **************************************************************************************************
     254              : !> \brief  Release a kpoint environment, deallocate all data
     255              : !> \param kpoint  The kpoint environment
     256              : !> \author JGH
     257              : ! **************************************************************************************************
     258        15571 :    SUBROUTINE kpoint_release(kpoint)
     259              :       TYPE(kpoint_type), POINTER                         :: kpoint
     260              : 
     261              :       INTEGER                                            :: i, ik, j
     262              : 
     263        15571 :       IF (ASSOCIATED(kpoint)) THEN
     264              : 
     265         7858 :          IF (ASSOCIATED(kpoint%xkp)) THEN
     266          344 :             DEALLOCATE (kpoint%xkp)
     267              :          END IF
     268         7858 :          IF (ASSOCIATED(kpoint%wkp)) THEN
     269          344 :             DEALLOCATE (kpoint%wkp)
     270              :          END IF
     271         7858 :          IF (ASSOCIATED(kpoint%kp_dist)) THEN
     272          252 :             DEALLOCATE (kpoint%kp_dist)
     273              :          END IF
     274              : 
     275         7858 :          CALL mpools_release(kpoint%mpools)
     276         7858 :          CALL mpools_release(kpoint%mpools_aux_fit)
     277              : 
     278         7858 :          CALL cp_blacs_env_release(kpoint%blacs_env)
     279         7858 :          CALL cp_blacs_env_release(kpoint%blacs_env_all)
     280              : 
     281         7858 :          CALL mp_para_env_release(kpoint%para_env)
     282         7858 :          CALL mp_para_env_release(kpoint%para_env_kp)
     283         7858 :          CALL mp_para_env_release(kpoint%para_env_inter_kp)
     284              : 
     285         7858 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     286         7858 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     287              : 
     288         7858 :          IF (ASSOCIATED(kpoint%kp_env)) THEN
     289         1968 :             DO ik = 1, SIZE(kpoint%kp_env)
     290         1968 :                CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
     291              :             END DO
     292          252 :             DEALLOCATE (kpoint%kp_env)
     293              :          END IF
     294              : 
     295         7858 :          IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
     296          244 :             DO ik = 1, SIZE(kpoint%kp_aux_env)
     297          244 :                CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
     298              :             END DO
     299           30 :             DEALLOCATE (kpoint%kp_aux_env)
     300              :          END IF
     301              : 
     302         7858 :          IF (ASSOCIATED(kpoint%kp_sym)) THEN
     303        13566 :             DO ik = 1, SIZE(kpoint%kp_sym)
     304        13566 :                CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
     305              :             END DO
     306          260 :             DEALLOCATE (kpoint%kp_sym)
     307              :          END IF
     308              : 
     309         7858 :          IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
     310         7858 :          IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
     311              : 
     312         7858 :          IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
     313           64 :             DO i = 1, SIZE(kpoint%kind_rotmat, 1)
     314           64 :                DO j = 1, SIZE(kpoint%kind_rotmat, 2)
     315            0 :                   IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
     316            0 :                      DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
     317              :                   END IF
     318              :                END DO
     319              :             END DO
     320           64 :             DEALLOCATE (kpoint%kind_rotmat)
     321              :          END IF
     322              : 
     323         7858 :          IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
     324          138 :             CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
     325          138 :             DEALLOCATE (kpoint%scf_diis_buffer)
     326              :          END IF
     327              : 
     328         7858 :          DEALLOCATE (kpoint)
     329              : 
     330              :       END IF
     331              : 
     332        15571 :    END SUBROUTINE kpoint_release
     333              : 
     334              : ! **************************************************************************************************
     335              : !> \brief Retrieve information from a kpoint environment
     336              : !> \param kpoint        The kpoint environment
     337              : !> \param kp_scheme     Type of kpoint grid
     338              : !> \param nkp_grid      Grid points
     339              : !> \param kp_shift      Shift of the grid
     340              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     341              : !> \param verbose       more output information
     342              : !> \param full_grid     don't reduce kpoints at all
     343              : !> \param use_real_wfn  real/complex wfn
     344              : !> \param eps_geo       accuracy of atom symmetry detection
     345              : !> \param parallel_group_size kpoint group size
     346              : !> \param kp_range      kpoints distribution for local processor
     347              : !> \param nkp           number of kpoints
     348              : !> \param xkp           kpoint coordinates in units of b-vector
     349              : !> \param wkp           kpoint weights
     350              : !> \param para_env      'global' parallel environment
     351              : !> \param blacs_env_all BLACS env for the total environment
     352              : !> \param para_env_kp   parallel environment of the kpoint calculation
     353              : !> \param para_env_inter_kp   parallel environment between kpoints
     354              : !> \param blacs_env     BLACS env for the kpoint group
     355              : !> \param kp_env        Information for each kpoint
     356              : !> \param kp_aux_env ...
     357              : !> \param mpools        FM matrix pools for kpoint groups
     358              : !> \param iogrp         this kpoint group has the IO processor
     359              : !> \param nkp_groups    number of kpoint groups
     360              : !> \param kp_dist       kpoints distribution on groups
     361              : !> \param cell_to_index given a cell triple, returns the real space index
     362              : !> \param index_to_cell ...
     363              : !> \param sab_nl        neighbourlist that defines real space matrices
     364              : !> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
     365              : !> \author JGH
     366              : ! **************************************************************************************************
     367      1487693 :    SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
     368              :                               full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
     369              :                               para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
     370              :                               kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
     371              :                               sab_nl, sab_nl_nosym)
     372              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
     373              :       CHARACTER(LEN=*), OPTIONAL                         :: kp_scheme
     374              :       INTEGER, DIMENSION(3), OPTIONAL                    :: nkp_grid
     375              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: kp_shift
     376              :       LOGICAL, OPTIONAL                                  :: symmetry, verbose, full_grid, &
     377              :                                                             use_real_wfn
     378              :       REAL(KIND=dp), OPTIONAL                            :: eps_geo
     379              :       INTEGER, OPTIONAL                                  :: parallel_group_size
     380              :       INTEGER, DIMENSION(2), OPTIONAL                    :: kp_range
     381              :       INTEGER, OPTIONAL                                  :: nkp
     382              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: xkp
     383              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     384              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     385              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_all
     386              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_kp, para_env_inter_kp
     387              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env
     388              :       TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
     389              :          POINTER                                         :: kp_env, kp_aux_env
     390              :       TYPE(qs_matrix_pools_type), OPTIONAL, POINTER      :: mpools
     391              :       LOGICAL, OPTIONAL                                  :: iogrp
     392              :       INTEGER, OPTIONAL                                  :: nkp_groups
     393              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: kp_dist
     394              :       INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER     :: cell_to_index
     395              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: index_to_cell
     396              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     397              :          OPTIONAL, POINTER                               :: sab_nl, sab_nl_nosym
     398              : 
     399            0 :       IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
     400      1488357 :       IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
     401      1487693 :       IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
     402      1487693 :       IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
     403      1487693 :       IF (PRESENT(verbose)) verbose = kpoint%verbose
     404      1487693 :       IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
     405      1487693 :       IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
     406      1487693 :       IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
     407      1487693 :       IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
     408              : 
     409      1487693 :       IF (PRESENT(nkp)) nkp = kpoint%nkp
     410      1487693 :       IF (PRESENT(wkp)) wkp => kpoint%wkp
     411      1487693 :       IF (PRESENT(xkp)) xkp => kpoint%xkp
     412              : 
     413      1487693 :       IF (PRESENT(para_env)) para_env => kpoint%para_env
     414      1487693 :       IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
     415      1487693 :       IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
     416      1487693 :       IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
     417      1487693 :       IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
     418              : 
     419      1487693 :       IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
     420      1541141 :       IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
     421      1487693 :       IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
     422      1487693 :       IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
     423              : 
     424      1487693 :       IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
     425      1487693 :       IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
     426      1487693 :       IF (PRESENT(mpools)) mpools => kpoint%mpools
     427              : 
     428      1487693 :       IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
     429      1487693 :       IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
     430      1487693 :       IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
     431      1487693 :       IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
     432              : 
     433      1487693 :    END SUBROUTINE get_kpoint_info
     434              : 
     435              : ! **************************************************************************************************
     436              : !> \brief Set information in a kpoint environment
     437              : !> \param kpoint        The kpoint environment
     438              : !> \param kp_scheme     Type of kpoint grid
     439              : !> \param nkp_grid      Grid points
     440              : !> \param kp_shift      Shift of the grid
     441              : !> \param symmetry      use symmetry (atoms) to reduce kpoints
     442              : !> \param verbose       more output information
     443              : !> \param full_grid     don't reduce kpoints at all
     444              : !> \param use_real_wfn  real/complex wfn
     445              : !> \param eps_geo       accuracy of atom symmetry detection
     446              : !> \param parallel_group_size kpoint group size
     447              : !> \param kp_range      kpoints distribution for local processor
     448              : !> \param nkp           number of kpoints
     449              : !> \param xkp           kpoint coordinates
     450              : !> \param wkp           kpoint weights
     451              : !> \param para_env      'global' parallel environment
     452              : !> \param blacs_env_all BLACS env for the total environment
     453              : !> \param para_env_kp   parallel environment of the kpoint calculation
     454              : !> \param para_env_inter_kp   parallel environment between kpoints
     455              : !> \param blacs_env     BLACS env for the kpoint group
     456              : !> \param kp_env        Information for each kpoint
     457              : !> \param kp_aux_env ...
     458              : !> \param mpools        FM matrix pools for kpoint groups
     459              : !> \param iogrp         this kpoint group has the IO processor
     460              : !> \param nkp_groups    number of kpoint groups
     461              : !> \param kp_dist       kpoints distribution on groups
     462              : !> \param cell_to_index given a cell triple, returns the real space index
     463              : !> \param index_to_cell ...
     464              : !> \param sab_nl        neighbourlist that defines real space matrices
     465              : !> \param sab_nl_nosym  neighbourlist that defines real space matrices
     466              : !> \author JGH
     467              : ! **************************************************************************************************
     468          974 :    SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
     469              :                               full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
     470              :                               para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
     471              :                               kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
     472              :                               sab_nl, sab_nl_nosym)
     473              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     474              :       CHARACTER(LEN=*), OPTIONAL                         :: kp_scheme
     475              :       INTEGER, DIMENSION(3), OPTIONAL                    :: nkp_grid
     476              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: kp_shift
     477              :       LOGICAL, OPTIONAL                                  :: symmetry, verbose, full_grid, &
     478              :                                                             use_real_wfn
     479              :       REAL(KIND=dp), OPTIONAL                            :: eps_geo
     480              :       INTEGER, OPTIONAL                                  :: parallel_group_size
     481              :       INTEGER, DIMENSION(2), OPTIONAL                    :: kp_range
     482              :       INTEGER, OPTIONAL                                  :: nkp
     483              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: xkp
     484              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     485              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     486              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_all
     487              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env_kp, para_env_inter_kp
     488              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env
     489              :       TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
     490              :          POINTER                                         :: kp_env, kp_aux_env
     491              :       TYPE(qs_matrix_pools_type), OPTIONAL, POINTER      :: mpools
     492              :       LOGICAL, OPTIONAL                                  :: iogrp
     493              :       INTEGER, OPTIONAL                                  :: nkp_groups
     494              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: kp_dist
     495              :       INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER     :: cell_to_index
     496              :       INTEGER, DIMENSION(:, :), OPTIONAL, POINTER        :: index_to_cell
     497              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     498              :          OPTIONAL, POINTER                               :: sab_nl, sab_nl_nosym
     499              : 
     500            0 :       IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
     501          974 :       IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
     502          974 :       IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
     503          974 :       IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
     504          974 :       IF (PRESENT(verbose)) kpoint%verbose = verbose
     505          974 :       IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
     506          974 :       IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
     507          974 :       IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
     508          974 :       IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
     509              : 
     510          974 :       IF (PRESENT(nkp)) kpoint%nkp = nkp
     511          974 :       IF (PRESENT(wkp)) kpoint%wkp => wkp
     512          974 :       IF (PRESENT(xkp)) kpoint%xkp => xkp
     513              : 
     514          974 :       IF (PRESENT(para_env)) kpoint%para_env => para_env
     515          974 :       IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
     516          974 :       IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
     517          974 :       IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
     518          974 :       IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
     519              : 
     520          974 :       IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
     521          974 :       IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
     522          974 :       IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
     523          974 :       IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
     524              : 
     525          974 :       IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
     526            0 :       IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
     527          974 :       IF (PRESENT(mpools)) kpoint%mpools => mpools
     528          974 :       IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
     529          974 :       IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
     530              : 
     531          974 :       IF (PRESENT(cell_to_index)) THEN
     532            0 :          IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
     533            0 :          kpoint%cell_to_index => cell_to_index
     534              :       END IF
     535              : 
     536          974 :       IF (PRESENT(index_to_cell)) THEN
     537            0 :          IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
     538            0 :          kpoint%index_to_cell => index_to_cell
     539              :       END IF
     540              : 
     541          974 :    END SUBROUTINE set_kpoint_info
     542              : 
     543              : ! **************************************************************************************************
     544              : !> \brief Read the kpoint input section
     545              : !> \param kpoint  The kpoint environment
     546              : !> \param kpoint_section The input section
     547              : !> \param a_vec ...
     548              : !> \author JGH
     549              : ! **************************************************************************************************
     550         7704 :    SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec)
     551              :       TYPE(kpoint_type), INTENT(INOUT)                   :: kpoint
     552              :       TYPE(section_vals_type), POINTER                   :: kpoint_section
     553              :       REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN)         :: a_vec
     554              : 
     555              :       CHARACTER(LEN=default_string_length)               :: ustr
     556              :       CHARACTER(LEN=default_string_length), &
     557         7704 :          DIMENSION(:), POINTER                           :: tmpstringlist
     558              :       INTEGER                                            :: i, n_rep, nval, wfntype
     559              :       LOGICAL                                            :: available
     560              :       REAL(KIND=dp)                                      :: ff
     561         7704 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: reallist
     562              : 
     563         7704 :       CALL section_vals_get(kpoint_section, explicit=available)
     564              : 
     565         7704 :       IF (available) THEN
     566          216 :          CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
     567          216 :          nval = SIZE(tmpstringlist)
     568          216 :          CPASSERT(nval >= 1)
     569          216 :          kpoint%kp_scheme = tmpstringlist(1)
     570          216 :          CALL uppercase(kpoint%kp_scheme)
     571              : 
     572              :          ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
     573          176 :          SELECT CASE (kpoint%kp_scheme)
     574              :          CASE ("NONE")
     575              :             ! do nothing
     576              :          CASE ("GAMMA")
     577              :             ! do nothing
     578              :          CASE ("MONKHORST-PACK")
     579          176 :             CPASSERT(nval >= 4)
     580          704 :             DO i = 2, 4
     581          704 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     582              :             END DO
     583              :          CASE ("MACDONALD")
     584            0 :             CPASSERT(nval >= 7)
     585            0 :             DO i = 2, 4
     586            0 :                READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
     587              :             END DO
     588            0 :             DO i = 5, 7
     589            0 :                READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
     590              :             END DO
     591              :          CASE ("GENERAL")
     592            4 :             CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
     593            4 :             CALL uppercase(ustr)
     594            4 :             CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
     595            4 :             kpoint%nkp = n_rep
     596           20 :             ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
     597           12 :             DO i = 1, n_rep
     598              :                CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
     599            8 :                                          r_vals=reallist)
     600            8 :                nval = SIZE(reallist)
     601            8 :                CPASSERT(nval >= 4)
     602            8 :                SELECT CASE (ustr)
     603              :                CASE ("B_VECTOR")
     604           32 :                   kpoint%xkp(1:3, i) = reallist(1:3)
     605              :                CASE ("CART_ANGSTROM")
     606              :                   kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
     607              :                                         reallist(2)*a_vec(2, 1:3) + &
     608            0 :                                         reallist(3)*a_vec(3, 1:3))/twopi*angstrom
     609              :                CASE ("CART_BOHR")
     610              :                   kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
     611              :                                         reallist(2)*a_vec(2, 1:3) + &
     612            0 :                                         reallist(3)*a_vec(3, 1:3))/twopi
     613              :                CASE DEFAULT
     614            8 :                   CPABORT("Unknown Unit for kpoint definition")
     615              :                END SELECT
     616           12 :                kpoint%wkp(i) = reallist(4)
     617              :             END DO
     618           12 :             ff = 1.0_dp/SUM(kpoint%wkp(:))
     619           16 :             kpoint%wkp(:) = ff*kpoint%wkp(:)
     620              :          CASE DEFAULT
     621          216 :             CPABORT("")
     622              :          END SELECT
     623              : 
     624          216 :          CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
     625          216 :          CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
     626          216 :          CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
     627          216 :          CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
     628          216 :          CALL section_vals_val_get(kpoint_section, "EPS_GEO", r_val=kpoint%eps_geo)
     629              :          CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
     630          216 :                                    i_val=kpoint%parallel_group_size)
     631           10 :          SELECT CASE (wfntype)
     632              :          CASE (use_real_wfn)
     633           10 :             kpoint%use_real_wfn = .TRUE.
     634              :          CASE (use_complex_wfn)
     635          206 :             kpoint%use_real_wfn = .FALSE.
     636              :          CASE DEFAULT
     637          216 :             CPABORT("")
     638              :          END SELECT
     639              : 
     640              :       ELSE
     641         7488 :          kpoint%kp_scheme = "NONE"
     642              :       END IF
     643              : 
     644         7704 :    END SUBROUTINE read_kpoint_section
     645              : 
     646              : ! **************************************************************************************************
     647              : !> \brief Write information on the kpoints to output
     648              : !> \param kpoint  The kpoint environment
     649              : !> \param iounit  output unit
     650              : !> \param dft_section  DFT section information for output unit
     651              : !> \author JGH
     652              : ! **************************************************************************************************
     653         7702 :    SUBROUTINE write_kpoint_info(kpoint, iounit, dft_section)
     654              :       TYPE(kpoint_type), INTENT(IN)                      :: kpoint
     655              :       INTEGER, INTENT(IN), OPTIONAL                      :: iounit
     656              :       TYPE(section_vals_type), INTENT(IN), OPTIONAL      :: dft_section
     657              : 
     658              :       INTEGER                                            :: i, punit
     659              :       TYPE(cp_logger_type), POINTER                      :: logger
     660              : 
     661         7702 :       NULLIFY (logger)
     662         7702 :       logger => cp_get_default_logger()
     663              : 
     664         7702 :       IF (PRESENT(dft_section)) THEN
     665         7702 :          punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
     666            0 :       ELSE IF (PRESENT(iounit)) THEN
     667            0 :          punit = iounit
     668              :       ELSE
     669            0 :          punit = cp_logger_get_default_unit_nr(logger)
     670              :       END IF
     671              : 
     672         7702 :       IF (punit > 0) THEN
     673              : 
     674         1898 :          IF (kpoint%kp_scheme /= "NONE") THEN
     675           36 :             WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
     676              :          END IF
     677            1 :          SELECT CASE (kpoint%kp_scheme)
     678              :          CASE ("NONE")
     679              :             ! be silent
     680              :          CASE ("GAMMA")
     681            1 :             WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
     682              :          CASE ("MONKHORST-PACK")
     683           35 :             WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', '      Monkhorst-Pack'
     684           35 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
     685           35 :             WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
     686              :          CASE ("MACDONALD")
     687            0 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
     688            0 :             WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
     689            0 :             WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
     690            0 :             WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
     691              :          CASE ("GENERAL")
     692            0 :             WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', '   General'
     693              :          CASE DEFAULT
     694         1898 :             CPABORT("")
     695              :          END SELECT
     696         1898 :          IF (kpoint%kp_scheme /= "NONE") THEN
     697           36 :             IF (kpoint%symmetry) THEN
     698            7 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '   ON'
     699              :             ELSE
     700           29 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', '  OFF'
     701              :             END IF
     702           36 :             IF (kpoint%use_real_wfn) THEN
     703            0 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
     704              :             ELSE
     705           36 :                WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
     706              :             END IF
     707           36 :             IF (kpoint%full_grid) THEN
     708            7 :                WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid     '
     709              :             END IF
     710           36 :             IF (kpoint%kp_scheme /= "GAMMA") THEN
     711           35 :                WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
     712              :                WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
     713           35 :                   ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
     714          575 :                DO i = 1, kpoint%nkp
     715          540 :                   WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
     716         1115 :                      kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
     717              :                END DO
     718              :             END IF
     719           36 :             WRITE (punit, '(" ",79("*"))')
     720              :          END IF
     721              : 
     722              :       END IF
     723              : 
     724         7702 :       IF (PRESENT(dft_section)) THEN
     725         7702 :          CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
     726              :       END IF
     727              : 
     728         7702 :    END SUBROUTINE write_kpoint_info
     729              : 
     730              : ! **************************************************************************************************
     731              : !> \brief Create a single kpoint environment
     732              : !> \param kp_env  Single kpoint environment
     733              : !> \author JGH
     734              : ! **************************************************************************************************
     735         1930 :    SUBROUTINE kpoint_env_create(kp_env)
     736              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
     737              : 
     738         1930 :       CPASSERT(.NOT. ASSOCIATED(kp_env))
     739              : 
     740         9650 :       ALLOCATE (kp_env)
     741              : 
     742         1930 :       kp_env%nkpoint = 0
     743              :       kp_env%wkp = 0.0_dp
     744         7720 :       kp_env%xkp = 0.0_dp
     745         1930 :       kp_env%is_local = .FALSE.
     746              : 
     747         1930 :       NULLIFY (kp_env%mos)
     748         1930 :       NULLIFY (kp_env%pmat)
     749         1930 :       NULLIFY (kp_env%wmat)
     750         1930 :       NULLIFY (kp_env%smat)
     751         1930 :       NULLIFY (kp_env%amat)
     752              : 
     753         1930 :    END SUBROUTINE kpoint_env_create
     754              : 
     755              : ! **************************************************************************************************
     756              : !> \brief Release a single kpoint environment
     757              : !> \param kp_env  Single kpoint environment
     758              : !> \author JGH
     759              : ! **************************************************************************************************
     760         1930 :    SUBROUTINE kpoint_env_release(kp_env)
     761              :       TYPE(kpoint_env_type), POINTER                     :: kp_env
     762              : 
     763              :       INTEGER                                            :: ic, is
     764              : 
     765         1930 :       IF (ASSOCIATED(kp_env)) THEN
     766              : 
     767         1930 :          IF (ASSOCIATED(kp_env%mos)) THEN
     768         4124 :             DO is = 1, SIZE(kp_env%mos, 2)
     769         8498 :                DO ic = 1, SIZE(kp_env%mos, 1)
     770         6568 :                   CALL deallocate_mo_set(kp_env%mos(ic, is))
     771              :                END DO
     772              :             END DO
     773         1930 :             DEALLOCATE (kp_env%mos)
     774              :          END IF
     775              : 
     776         1930 :          CALL cp_fm_release(kp_env%pmat)
     777         1930 :          CALL cp_fm_release(kp_env%wmat)
     778         1930 :          CALL cp_fm_release(kp_env%smat)
     779         1930 :          CALL cp_fm_release(kp_env%amat)
     780              : 
     781         1930 :          CALL cp_fm_release(kp_env%shalf)
     782         1930 :          CALL cp_cfm_release(kp_env%cshalf)
     783              : 
     784         1930 :          DEALLOCATE (kp_env)
     785              : 
     786              :       END IF
     787              : 
     788         1930 :    END SUBROUTINE kpoint_env_release
     789              : 
     790              : ! **************************************************************************************************
     791              : !> \brief Get information from a single kpoint environment
     792              : !> \param kpoint_env Single kpoint environment
     793              : !> \param nkpoint    Index of kpoint
     794              : !> \param wkp        Weight of kpoint
     795              : !> \param xkp        Coordinates of kpoint
     796              : !> \param is_local   Is this kpoint local (single cpu group)
     797              : !> \param mos        MOs of this kpoint
     798              : !> \author JGH
     799              : ! **************************************************************************************************
     800         7484 :    SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
     801              :       TYPE(kpoint_env_type), INTENT(IN)                  :: kpoint_env
     802              :       INTEGER, OPTIONAL                                  :: nkpoint
     803              :       REAL(KIND=dp), OPTIONAL                            :: wkp
     804              :       REAL(KIND=dp), DIMENSION(3), OPTIONAL              :: xkp
     805              :       LOGICAL, OPTIONAL                                  :: is_local
     806              :       TYPE(mo_set_type), DIMENSION(:, :), OPTIONAL, &
     807              :          POINTER                                         :: mos
     808              : 
     809         7484 :       IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
     810         7484 :       IF (PRESENT(wkp)) wkp = kpoint_env%wkp
     811         7484 :       IF (PRESENT(xkp)) xkp = kpoint_env%xkp
     812         7484 :       IF (PRESENT(is_local)) is_local = kpoint_env%is_local
     813         7484 :       IF (PRESENT(mos)) mos => kpoint_env%mos
     814              : 
     815         7484 :    END SUBROUTINE get_kpoint_env
     816              : 
     817              : ! **************************************************************************************************
     818              : !> \brief Create a single kpoint symmetry environment
     819              : !> \param kp_sym  ...
     820              : !> \author JGH
     821              : ! **************************************************************************************************
     822        13306 :    SUBROUTINE kpoint_sym_create(kp_sym)
     823              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
     824              : 
     825        13306 :       CPASSERT(.NOT. ASSOCIATED(kp_sym))
     826              : 
     827        13306 :       ALLOCATE (kp_sym)
     828              : 
     829        13306 :       kp_sym%nwght = 0
     830        13306 :       kp_sym%nwred = 0
     831              :       kp_sym%apply_symmetry = .FALSE.
     832              : 
     833              :       NULLIFY (kp_sym%rot)
     834              :       NULLIFY (kp_sym%xkp)
     835              :       NULLIFY (kp_sym%rotp)
     836              :       NULLIFY (kp_sym%f0)
     837              : 
     838        13306 :    END SUBROUTINE kpoint_sym_create
     839              : 
     840              : ! **************************************************************************************************
     841              : !> \brief Release a single kpoint symmetry environment
     842              : !> \param kp_sym  ...
     843              : !> \author JGH
     844              : ! **************************************************************************************************
     845        13306 :    SUBROUTINE kpoint_sym_release(kp_sym)
     846              :       TYPE(kpoint_sym_type), POINTER                     :: kp_sym
     847              : 
     848        13306 :       IF (ASSOCIATED(kp_sym)) THEN
     849              : 
     850        13306 :          IF (ASSOCIATED(kp_sym%rot)) THEN
     851            0 :             DEALLOCATE (kp_sym%rot)
     852              :          END IF
     853        13306 :          IF (ASSOCIATED(kp_sym%xkp)) THEN
     854            0 :             DEALLOCATE (kp_sym%xkp)
     855              :          END IF
     856        13306 :          IF (ASSOCIATED(kp_sym%f0)) THEN
     857            0 :             DEALLOCATE (kp_sym%f0)
     858              :          END IF
     859        13306 :          IF (ASSOCIATED(kp_sym%rotp)) THEN
     860            0 :             DEALLOCATE (kp_sym%rotp)
     861              :          END IF
     862              : 
     863        13306 :          DEALLOCATE (kp_sym)
     864              : 
     865              :       END IF
     866              : 
     867        13306 :    END SUBROUTINE kpoint_sym_release
     868              : 
     869              : ! **************************************************************************************************
     870              : 
     871            0 : END MODULE kpoint_types
        

Generated by: LCOV version 2.0-1