LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:34ef472) Lines: 242 265 91.3 %
Date: 2024-04-26 08:30:29 Functions: 11 16 68.8 %

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

Generated by: LCOV version 1.15