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