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