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