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