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