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