LCOV - code coverage report
Current view: top level - src - kpoint_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b8e0b09) Lines: 244 271 90.0 %
Date: 2024-08-31 06:31:37 Functions: 11 17 64.7 %

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

Generated by: LCOV version 1.15