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_type
24 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
25 : cp_print_key_unit_nr
26 : USE input_cp2k_kpoints, ONLY: use_complex_wfn,&
27 : use_real_wfn
28 : USE input_section_types, ONLY: section_vals_get,&
29 : section_vals_type,&
30 : section_vals_val_get
31 : USE kinds, ONLY: default_string_length,&
32 : dp
33 : USE mathconstants, ONLY: twopi
34 : USE message_passing, ONLY: mp_para_env_release,&
35 : mp_para_env_type
36 : USE physcon, ONLY: angstrom
37 : USE qs_diis_types, ONLY: qs_diis_b_release_kp,&
38 : qs_diis_buffer_type_kp
39 : USE qs_matrix_pools, ONLY: mpools_release,&
40 : qs_matrix_pools_type
41 : USE qs_mo_types, ONLY: deallocate_mo_set,&
42 : mo_set_type
43 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
44 : USE string_utilities, ONLY: uppercase
45 : #include "./base/base_uses.f90"
46 :
47 : IMPLICIT NONE
48 :
49 : PRIVATE
50 :
51 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
52 :
53 : PUBLIC :: kpoint_type
54 : PUBLIC :: kpoint_create, kpoint_release, get_kpoint_info, set_kpoint_info
55 : PUBLIC :: read_kpoint_section, write_kpoint_info
56 : PUBLIC :: kpoint_env_type, kpoint_env_p_type
57 : PUBLIC :: kpoint_env_create, get_kpoint_env
58 : PUBLIC :: kind_rotmat_type
59 : PUBLIC :: kpoint_sym_type
60 : PUBLIC :: kpoint_sym_create
61 :
62 : ! **************************************************************************************************
63 : !> \brief Keeps information about a specific k-point
64 : !> \param nkpoint the kpoint index
65 : !> \param wkp weight of this kpoint
66 : !> \param xkp kpoint coordinates in units of b-vector
67 : !> \param is_local if this kpoint is calculated on a single thread
68 : !> \param mos associated MOs (r/i,spin)
69 : !> \param pmat associated density matrix (r/i,spin)
70 : !> \param wmat associated energy weighted density matrix (r/i,spin)
71 : !> \param smat associated overlap matrix (for ADMM) (r/i,spin)
72 : !> \param amat associated ADMM basis projection matrix (r/i,spin)
73 : !> \param shalf S(K)^(1/2) DFT+U Lowdin method (real wfn)
74 : !> \param cshalf S(K)^(1/2) DFT+U Lowdin method (complex wfn)
75 : !> \author JGH
76 : ! **************************************************************************************************
77 : TYPE kpoint_env_type
78 : INTEGER :: nkpoint = -1
79 : REAL(KIND=dp) :: wkp = 0.0_dp
80 : REAL(KIND=dp), DIMENSION(3) :: xkp = 0.0_dp
81 : LOGICAL :: is_local = .FALSE.
82 : TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos => NULL()
83 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: pmat => NULL()
84 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: wmat => NULL()
85 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: smat => NULL()
86 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: amat => NULL()
87 : TYPE(cp_fm_type) :: shalf
88 : TYPE(cp_cfm_type) :: cshalf
89 : END TYPE kpoint_env_type
90 :
91 : TYPE kpoint_env_p_type
92 : TYPE(kpoint_env_type), POINTER :: kpoint_env => NULL()
93 : END TYPE kpoint_env_p_type
94 :
95 : ! **************************************************************************************************
96 : !> \brief Rotation matrices for basis sets
97 : !> \param rmat atom basis function rotation matrix
98 : !> \author JGH
99 : ! **************************************************************************************************
100 : TYPE kind_rotmat_type
101 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: rmat => NULL()
102 : END TYPE kind_rotmat_type
103 :
104 : ! **************************************************************************************************
105 : !> \brief Keeps symmetry information about a specific k-point
106 : !> \param apply_symmetry ...
107 : !> \param nwght kpoint multiplicity
108 : !> \param xkp kpoint coordinates
109 : !> \param rot rotation matrices
110 : !> \param f0 atom permutation
111 : !> \author JGH
112 : ! **************************************************************************************************
113 : TYPE kpoint_sym_type
114 : LOGICAL :: apply_symmetry = .FALSE.
115 : INTEGER :: nwght = -1
116 : INTEGER :: nwred = -1
117 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => NULL()
118 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: rot => NULL()
119 : INTEGER, DIMENSION(:), POINTER :: rotp => NULL()
120 : INTEGER, DIMENSION(:, :), POINTER :: f0 => NULL()
121 : END TYPE kpoint_sym_type
122 :
123 : TYPE kpoint_sym_p_type
124 : TYPE(kpoint_sym_type), POINTER :: kpoint_sym => NULL()
125 : END TYPE kpoint_sym_p_type
126 :
127 : ! **************************************************************************************************
128 : !> \brief Contains information about kpoints
129 : !> \par History
130 : !> 2014.07 created [JGH]
131 : !> \param kp_scheme [input] Type of kpoint grid
132 : !> \param nkp_grid [input] Grid points
133 : !> \param kp_shift [input] Shift of the grid
134 : !> \param use_real_wfn [input] real/complex wfn
135 : !> \param symmetry [input] use symmetry (atoms) to reduce kpoints
136 : !> \param full_grid [input] don't reduce kpoints at all
137 : !> \param verbose [input] more output information
138 : !> \param eps_geo [input] accuracy of atom symmetry detection
139 : !> \param parallel_group_size [input] kpoint group size
140 : !> \param nkp number of kpoints
141 : !> \param xkp kpoint coordinates
142 : !> \param wkp kpoint weights
143 : !> \param para_env 'global' parallel environment
144 : !> \param para_env_kp parallel environment of the kpoint calculation
145 : !> \param para_env_inter_kp parallel environment between kpoints
146 : !> \param iogrp this kpoint group has the IO processor
147 : !> \param nkp_groups number of kpoint groups
148 : !> \param kp_dist kpoints distribution on groups
149 : !> \param kp_range kpoints distribution for local processor
150 : !> \param blacs_env BLACS env for the kpoint group
151 : !> \param opmats Operator matrices
152 : !> \param kp_env Information for each kpoint
153 : !> \param mpools FM matrix pools for kpoint groups
154 : !> \author JGH
155 : ! **************************************************************************************************
156 : TYPE kpoint_type
157 : CHARACTER(LEN=default_string_length) :: kp_scheme = ""
158 : INTEGER, DIMENSION(3) :: nkp_grid = -1
159 : REAL(KIND=dp), DIMENSION(3) :: kp_shift = 0.0_dp
160 : LOGICAL :: use_real_wfn = .FALSE.
161 : LOGICAL :: symmetry = .FALSE.
162 : LOGICAL :: full_grid = .FALSE.
163 : LOGICAL :: verbose = .FALSE.
164 : REAL(KIND=dp) :: eps_geo = 0.0_dp
165 : INTEGER :: parallel_group_size = -1
166 : INTEGER :: nkp = -1
167 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => Null()
168 : REAL(KIND=dp), DIMENSION(:), POINTER :: wkp => Null()
169 : ! parallel environment
170 : TYPE(mp_para_env_type), POINTER :: para_env => Null()
171 : TYPE(cp_blacs_env_type), POINTER :: blacs_env_all => Null()
172 : TYPE(mp_para_env_type), POINTER :: para_env_kp => Null(), &
173 : para_env_inter_kp => Null()
174 : LOGICAL :: iogrp = .FALSE.
175 : INTEGER :: nkp_groups = -1
176 : INTEGER, DIMENSION(:, :), POINTER :: kp_dist => Null()
177 : INTEGER, DIMENSION(2) :: kp_range = -1
178 : TYPE(cp_blacs_env_type), POINTER :: blacs_env => Null()
179 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index => Null()
180 : INTEGER, DIMENSION(:, :), POINTER :: index_to_cell => Null()
181 : TYPE(neighbor_list_set_p_type), &
182 : DIMENSION(:), POINTER :: sab_nl => Null(), &
183 : sab_nl_nosym => Null()
184 : ! environment
185 : TYPE(kpoint_env_p_type), DIMENSION(:), &
186 : POINTER :: kp_env => Null()
187 : TYPE(kpoint_env_p_type), DIMENSION(:), &
188 : POINTER :: kp_aux_env => Null()
189 : ! symmetry
190 : TYPE(kpoint_sym_p_type), DIMENSION(:), &
191 : POINTER :: kp_sym => Null()
192 : INTEGER, DIMENSION(:), POINTER :: atype => Null()
193 : INTEGER, DIMENSION(:), POINTER :: ibrot => Null()
194 : TYPE(kind_rotmat_type), DIMENSION(:, :), &
195 : POINTER :: kind_rotmat => Null()
196 : ! pools
197 : TYPE(qs_matrix_pools_type), POINTER :: mpools => Null()
198 : TYPE(qs_diis_buffer_type_kp), POINTER :: scf_diis_buffer => Null()
199 : TYPE(qs_matrix_pools_type), POINTER :: mpools_aux_fit => Null()
200 : END TYPE kpoint_type
201 :
202 : ! **************************************************************************************************
203 :
204 : CONTAINS
205 :
206 : ! **************************************************************************************************
207 : !> \brief Create a kpoint environment
208 : !> \param kpoint All the kpoint information
209 : !> \author JGH
210 : ! **************************************************************************************************
211 7834 : SUBROUTINE kpoint_create(kpoint)
212 : TYPE(kpoint_type), POINTER :: kpoint
213 :
214 7834 : CPASSERT(.NOT. ASSOCIATED(kpoint))
215 :
216 86174 : ALLOCATE (kpoint)
217 :
218 7834 : kpoint%kp_scheme = ""
219 31336 : kpoint%nkp_grid = 0
220 31336 : kpoint%kp_shift = 0.0_dp
221 7834 : kpoint%symmetry = .FALSE.
222 7834 : kpoint%verbose = .FALSE.
223 7834 : kpoint%full_grid = .FALSE.
224 7834 : kpoint%use_real_wfn = .FALSE.
225 7834 : kpoint%eps_geo = 1.0e-6_dp
226 7834 : kpoint%parallel_group_size = -1
227 :
228 7834 : kpoint%nkp = 0
229 :
230 7834 : NULLIFY (kpoint%xkp, kpoint%wkp)
231 7834 : NULLIFY (kpoint%kp_dist)
232 :
233 7834 : NULLIFY (kpoint%para_env)
234 7834 : NULLIFY (kpoint%blacs_env_all)
235 7834 : NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
236 7834 : NULLIFY (kpoint%blacs_env)
237 7834 : kpoint%nkp_groups = 0
238 7834 : kpoint%iogrp = .FALSE.
239 23502 : kpoint%kp_range = 0
240 :
241 7834 : NULLIFY (kpoint%kp_env)
242 7834 : NULLIFY (kpoint%mpools)
243 :
244 7834 : ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
245 31336 : kpoint%cell_to_index(:, :, :) = 1
246 :
247 7834 : ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
248 23502 : kpoint%index_to_cell(:, :) = 0
249 :
250 7834 : END SUBROUTINE kpoint_create
251 :
252 : ! **************************************************************************************************
253 : !> \brief Release a kpoint environment, deallocate all data
254 : !> \param kpoint The kpoint environment
255 : !> \author JGH
256 : ! **************************************************************************************************
257 7843 : SUBROUTINE kpoint_release(kpoint)
258 : TYPE(kpoint_type), POINTER :: kpoint
259 :
260 : INTEGER :: i, ik, j
261 :
262 7843 : IF (ASSOCIATED(kpoint)) THEN
263 :
264 7834 : IF (ASSOCIATED(kpoint%xkp)) THEN
265 330 : DEALLOCATE (kpoint%xkp)
266 : END IF
267 7834 : IF (ASSOCIATED(kpoint%wkp)) THEN
268 330 : DEALLOCATE (kpoint%wkp)
269 : END IF
270 7834 : IF (ASSOCIATED(kpoint%kp_dist)) THEN
271 238 : DEALLOCATE (kpoint%kp_dist)
272 : END IF
273 :
274 7834 : CALL mpools_release(kpoint%mpools)
275 7834 : CALL mpools_release(kpoint%mpools_aux_fit)
276 :
277 7834 : CALL cp_blacs_env_release(kpoint%blacs_env)
278 7834 : CALL cp_blacs_env_release(kpoint%blacs_env_all)
279 :
280 7834 : CALL mp_para_env_release(kpoint%para_env)
281 7834 : CALL mp_para_env_release(kpoint%para_env_kp)
282 7834 : CALL mp_para_env_release(kpoint%para_env_inter_kp)
283 :
284 7834 : IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
285 7834 : IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
286 :
287 7834 : IF (ASSOCIATED(kpoint%kp_env)) THEN
288 1786 : DO ik = 1, SIZE(kpoint%kp_env)
289 1786 : CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
290 : END DO
291 238 : DEALLOCATE (kpoint%kp_env)
292 : END IF
293 :
294 7834 : IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
295 244 : DO ik = 1, SIZE(kpoint%kp_aux_env)
296 244 : CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
297 : END DO
298 30 : DEALLOCATE (kpoint%kp_aux_env)
299 : END IF
300 :
301 7834 : IF (ASSOCIATED(kpoint%kp_sym)) THEN
302 13384 : DO ik = 1, SIZE(kpoint%kp_sym)
303 13384 : CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
304 : END DO
305 246 : DEALLOCATE (kpoint%kp_sym)
306 : END IF
307 :
308 7834 : IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
309 7834 : IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
310 :
311 7834 : IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
312 50 : DO i = 1, SIZE(kpoint%kind_rotmat, 1)
313 50 : DO j = 1, SIZE(kpoint%kind_rotmat, 2)
314 0 : IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
315 0 : DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
316 : END IF
317 : END DO
318 : END DO
319 50 : DEALLOCATE (kpoint%kind_rotmat)
320 : END IF
321 :
322 7834 : IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
323 140 : CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
324 140 : DEALLOCATE (kpoint%scf_diis_buffer)
325 : END IF
326 :
327 7834 : DEALLOCATE (kpoint)
328 :
329 : END IF
330 :
331 7843 : END SUBROUTINE kpoint_release
332 :
333 : ! **************************************************************************************************
334 : !> \brief Retrieve information from a kpoint environment
335 : !> \param kpoint The kpoint environment
336 : !> \param kp_scheme Type of kpoint grid
337 : !> \param nkp_grid Grid points
338 : !> \param kp_shift Shift of the grid
339 : !> \param symmetry use symmetry (atoms) to reduce kpoints
340 : !> \param verbose more output information
341 : !> \param full_grid don't reduce kpoints at all
342 : !> \param use_real_wfn real/complex wfn
343 : !> \param eps_geo accuracy of atom symmetry detection
344 : !> \param parallel_group_size kpoint group size
345 : !> \param kp_range kpoints distribution for local processor
346 : !> \param nkp number of kpoints
347 : !> \param xkp kpoint coordinates in units of b-vector
348 : !> \param wkp kpoint weights
349 : !> \param para_env 'global' parallel environment
350 : !> \param blacs_env_all BLACS env for the total environment
351 : !> \param para_env_kp parallel environment of the kpoint calculation
352 : !> \param para_env_inter_kp parallel environment between kpoints
353 : !> \param blacs_env BLACS env for the kpoint group
354 : !> \param kp_env Information for each kpoint
355 : !> \param kp_aux_env ...
356 : !> \param mpools FM matrix pools for kpoint groups
357 : !> \param iogrp this kpoint group has the IO processor
358 : !> \param nkp_groups number of kpoint groups
359 : !> \param kp_dist kpoints distribution on groups
360 : !> \param cell_to_index given a cell triple, returns the real space index
361 : !> \param index_to_cell ...
362 : !> \param sab_nl neighbourlist that defines real space matrices
363 : !> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
364 : !> \author JGH
365 : ! **************************************************************************************************
366 1447129 : SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
367 : full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
368 : para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
369 : kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
370 : sab_nl, sab_nl_nosym)
371 : TYPE(kpoint_type), INTENT(IN) :: kpoint
372 : CHARACTER(LEN=*), OPTIONAL :: kp_scheme
373 : INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
374 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: kp_shift
375 : LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
376 : use_real_wfn
377 : REAL(KIND=dp), OPTIONAL :: eps_geo
378 : INTEGER, OPTIONAL :: parallel_group_size
379 : INTEGER, DIMENSION(2), OPTIONAL :: kp_range
380 : INTEGER, OPTIONAL :: nkp
381 : REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
382 : REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
383 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
384 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
385 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
386 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
387 : TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
388 : POINTER :: kp_env, kp_aux_env
389 : TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
390 : LOGICAL, OPTIONAL :: iogrp
391 : INTEGER, OPTIONAL :: nkp_groups
392 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
393 : INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
394 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
395 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
396 : OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
397 :
398 0 : IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
399 1447793 : IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
400 1447129 : IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
401 1447129 : IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
402 1447129 : IF (PRESENT(verbose)) verbose = kpoint%verbose
403 1447129 : IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
404 1447129 : IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
405 1447129 : IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
406 1447129 : IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
407 :
408 1447129 : IF (PRESENT(nkp)) nkp = kpoint%nkp
409 1447129 : IF (PRESENT(wkp)) wkp => kpoint%wkp
410 1447129 : IF (PRESENT(xkp)) xkp => kpoint%xkp
411 :
412 1447129 : IF (PRESENT(para_env)) para_env => kpoint%para_env
413 1447129 : IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
414 1447129 : IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
415 1447129 : IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
416 1447129 : IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
417 :
418 1447129 : IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
419 1501681 : IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
420 1447129 : IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
421 1447129 : IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
422 :
423 1447129 : IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
424 1447129 : IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
425 1447129 : IF (PRESENT(mpools)) mpools => kpoint%mpools
426 :
427 1447129 : IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
428 1447129 : IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
429 1447129 : IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
430 1447129 : IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
431 :
432 1447129 : END SUBROUTINE get_kpoint_info
433 :
434 : ! **************************************************************************************************
435 : !> \brief Set information in a kpoint environment
436 : !> \param kpoint The kpoint environment
437 : !> \param kp_scheme Type of kpoint grid
438 : !> \param nkp_grid Grid points
439 : !> \param kp_shift Shift of the grid
440 : !> \param symmetry use symmetry (atoms) to reduce kpoints
441 : !> \param verbose more output information
442 : !> \param full_grid don't reduce kpoints at all
443 : !> \param use_real_wfn real/complex wfn
444 : !> \param eps_geo accuracy of atom symmetry detection
445 : !> \param parallel_group_size kpoint group size
446 : !> \param kp_range kpoints distribution for local processor
447 : !> \param nkp number of kpoints
448 : !> \param xkp kpoint coordinates
449 : !> \param wkp kpoint weights
450 : !> \param para_env 'global' parallel environment
451 : !> \param blacs_env_all BLACS env for the total environment
452 : !> \param para_env_kp parallel environment of the kpoint calculation
453 : !> \param para_env_inter_kp parallel environment between kpoints
454 : !> \param blacs_env BLACS env for the kpoint group
455 : !> \param kp_env Information for each kpoint
456 : !> \param kp_aux_env ...
457 : !> \param mpools FM matrix pools for kpoint groups
458 : !> \param iogrp this kpoint group has the IO processor
459 : !> \param nkp_groups number of kpoint groups
460 : !> \param kp_dist kpoints distribution on groups
461 : !> \param cell_to_index given a cell triple, returns the real space index
462 : !> \param index_to_cell ...
463 : !> \param sab_nl neighbourlist that defines real space matrices
464 : !> \param sab_nl_nosym neighbourlist that defines real space matrices
465 : !> \author JGH
466 : ! **************************************************************************************************
467 940 : SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
468 : full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
469 : para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
470 : kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
471 : sab_nl, sab_nl_nosym)
472 : TYPE(kpoint_type), INTENT(INOUT) :: kpoint
473 : CHARACTER(LEN=*), OPTIONAL :: kp_scheme
474 : INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
475 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: kp_shift
476 : LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
477 : use_real_wfn
478 : REAL(KIND=dp), OPTIONAL :: eps_geo
479 : INTEGER, OPTIONAL :: parallel_group_size
480 : INTEGER, DIMENSION(2), OPTIONAL :: kp_range
481 : INTEGER, OPTIONAL :: nkp
482 : REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
483 : REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
484 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
485 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
486 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
487 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
488 : TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
489 : POINTER :: kp_env, kp_aux_env
490 : TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
491 : LOGICAL, OPTIONAL :: iogrp
492 : INTEGER, OPTIONAL :: nkp_groups
493 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
494 : INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
495 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
496 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
497 : OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
498 :
499 0 : IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
500 940 : IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
501 940 : IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
502 940 : IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
503 940 : IF (PRESENT(verbose)) kpoint%verbose = verbose
504 940 : IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
505 940 : IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
506 940 : IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
507 940 : IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
508 :
509 940 : IF (PRESENT(nkp)) kpoint%nkp = nkp
510 940 : IF (PRESENT(wkp)) kpoint%wkp => wkp
511 940 : IF (PRESENT(xkp)) kpoint%xkp => xkp
512 :
513 940 : IF (PRESENT(para_env)) kpoint%para_env => para_env
514 940 : IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
515 940 : IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
516 940 : IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
517 940 : IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
518 :
519 940 : IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
520 940 : IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
521 940 : IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
522 940 : IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
523 :
524 940 : IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
525 0 : IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
526 940 : IF (PRESENT(mpools)) kpoint%mpools => mpools
527 940 : IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
528 940 : IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
529 :
530 940 : IF (PRESENT(cell_to_index)) THEN
531 0 : IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
532 0 : kpoint%cell_to_index => cell_to_index
533 : END IF
534 :
535 940 : IF (PRESENT(index_to_cell)) THEN
536 0 : IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
537 0 : kpoint%index_to_cell => index_to_cell
538 : END IF
539 :
540 940 : END SUBROUTINE set_kpoint_info
541 :
542 : ! **************************************************************************************************
543 : !> \brief Read the kpoint input section
544 : !> \param kpoint The kpoint environment
545 : !> \param kpoint_section The input section
546 : !> \param a_vec ...
547 : !> \author JGH
548 : ! **************************************************************************************************
549 7680 : SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec)
550 : TYPE(kpoint_type), INTENT(INOUT) :: kpoint
551 : TYPE(section_vals_type), POINTER :: kpoint_section
552 : REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN) :: a_vec
553 :
554 : CHARACTER(LEN=default_string_length) :: ustr
555 : CHARACTER(LEN=default_string_length), &
556 7680 : DIMENSION(:), POINTER :: tmpstringlist
557 : INTEGER :: i, n_rep, nval, wfntype
558 : LOGICAL :: available
559 : REAL(KIND=dp) :: ff
560 7680 : REAL(KIND=dp), DIMENSION(:), POINTER :: reallist
561 :
562 7680 : CALL section_vals_get(kpoint_section, explicit=available)
563 :
564 7680 : IF (available) THEN
565 202 : CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
566 202 : nval = SIZE(tmpstringlist)
567 202 : CPASSERT(nval >= 1)
568 202 : kpoint%kp_scheme = tmpstringlist(1)
569 202 : CALL uppercase(kpoint%kp_scheme)
570 :
571 : ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
572 162 : SELECT CASE (kpoint%kp_scheme)
573 : CASE ("NONE")
574 : ! do nothing
575 : CASE ("GAMMA")
576 : ! do nothing
577 : CASE ("MONKHORST-PACK")
578 162 : CPASSERT(nval >= 4)
579 648 : DO i = 2, 4
580 648 : READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
581 : END DO
582 : CASE ("MACDONALD")
583 0 : CPASSERT(nval >= 7)
584 0 : DO i = 2, 4
585 0 : READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
586 : END DO
587 0 : DO i = 5, 7
588 0 : READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
589 : END DO
590 : CASE ("GENERAL")
591 4 : CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
592 4 : CALL uppercase(ustr)
593 4 : CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
594 4 : kpoint%nkp = n_rep
595 20 : ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
596 12 : DO i = 1, n_rep
597 : CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
598 8 : r_vals=reallist)
599 8 : nval = SIZE(reallist)
600 8 : CPASSERT(nval >= 4)
601 8 : SELECT CASE (ustr)
602 : CASE ("B_VECTOR")
603 32 : kpoint%xkp(1:3, i) = reallist(1:3)
604 : CASE ("CART_ANGSTROM")
605 : kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
606 : reallist(2)*a_vec(2, 1:3) + &
607 0 : reallist(3)*a_vec(3, 1:3))/twopi*angstrom
608 : CASE ("CART_BOHR")
609 : kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
610 : reallist(2)*a_vec(2, 1:3) + &
611 0 : reallist(3)*a_vec(3, 1:3))/twopi
612 : CASE DEFAULT
613 8 : CPABORT("Unknown Unit for kpoint definition")
614 : END SELECT
615 12 : kpoint%wkp(i) = reallist(4)
616 : END DO
617 12 : ff = 1.0_dp/SUM(kpoint%wkp(:))
618 16 : kpoint%wkp(:) = ff*kpoint%wkp(:)
619 : CASE DEFAULT
620 202 : CPABORT("")
621 : END SELECT
622 :
623 202 : CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
624 202 : CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
625 202 : CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
626 202 : CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
627 202 : CALL section_vals_val_get(kpoint_section, "EPS_GEO", r_val=kpoint%eps_geo)
628 : CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
629 202 : i_val=kpoint%parallel_group_size)
630 10 : SELECT CASE (wfntype)
631 : CASE (use_real_wfn)
632 10 : kpoint%use_real_wfn = .TRUE.
633 : CASE (use_complex_wfn)
634 192 : kpoint%use_real_wfn = .FALSE.
635 : CASE DEFAULT
636 202 : CPABORT("")
637 : END SELECT
638 :
639 : ELSE
640 7478 : kpoint%kp_scheme = "NONE"
641 : END IF
642 :
643 7680 : END SUBROUTINE read_kpoint_section
644 :
645 : ! **************************************************************************************************
646 : !> \brief Write information on the kpoints to output
647 : !> \param kpoint The kpoint environment
648 : !> \param dft_section DFT section information
649 : !> \author JGH
650 : ! **************************************************************************************************
651 7678 : SUBROUTINE write_kpoint_info(kpoint, dft_section)
652 : TYPE(kpoint_type), INTENT(IN) :: kpoint
653 : TYPE(section_vals_type), INTENT(IN) :: dft_section
654 :
655 : INTEGER :: i, punit
656 : TYPE(cp_logger_type), POINTER :: logger
657 :
658 7678 : NULLIFY (logger)
659 7678 : logger => cp_get_default_logger()
660 :
661 7678 : punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
662 7678 : IF (punit > 0) THEN
663 :
664 1894 : IF (kpoint%kp_scheme /= "NONE") THEN
665 34 : WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
666 : END IF
667 1 : SELECT CASE (kpoint%kp_scheme)
668 : CASE ("NONE")
669 : ! be silent
670 : CASE ("GAMMA")
671 1 : WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
672 : CASE ("MONKHORST-PACK")
673 33 : WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', ' Monkhorst-Pack'
674 33 : WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
675 33 : WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
676 : CASE ("MACDONALD")
677 0 : WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
678 0 : WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
679 0 : WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
680 0 : WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
681 : CASE ("GENERAL")
682 0 : WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' General'
683 : CASE DEFAULT
684 1894 : CPABORT("")
685 : END SELECT
686 1894 : IF (kpoint%kp_scheme /= "NONE") THEN
687 34 : IF (kpoint%symmetry) THEN
688 5 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' ON'
689 : ELSE
690 29 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' OFF'
691 : END IF
692 34 : IF (kpoint%use_real_wfn) THEN
693 0 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
694 : ELSE
695 34 : WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
696 : END IF
697 34 : IF (kpoint%full_grid) THEN
698 5 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid '
699 : END IF
700 34 : IF (kpoint%kp_scheme /= "GAMMA") THEN
701 33 : WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
702 : WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
703 33 : ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
704 509 : DO i = 1, kpoint%nkp
705 476 : WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
706 985 : kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
707 : END DO
708 : END IF
709 34 : WRITE (punit, '(" ",79("*"))')
710 : END IF
711 :
712 : END IF
713 7678 : CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
714 :
715 7678 : END SUBROUTINE write_kpoint_info
716 :
717 : ! **************************************************************************************************
718 : !> \brief Create a single kpoint environment
719 : !> \param kp_env Single kpoint environment
720 : !> \author JGH
721 : ! **************************************************************************************************
722 1762 : SUBROUTINE kpoint_env_create(kp_env)
723 : TYPE(kpoint_env_type), POINTER :: kp_env
724 :
725 1762 : CPASSERT(.NOT. ASSOCIATED(kp_env))
726 :
727 8810 : ALLOCATE (kp_env)
728 :
729 1762 : kp_env%nkpoint = 0
730 : kp_env%wkp = 0.0_dp
731 7048 : kp_env%xkp = 0.0_dp
732 1762 : kp_env%is_local = .FALSE.
733 :
734 1762 : NULLIFY (kp_env%mos)
735 1762 : NULLIFY (kp_env%pmat)
736 1762 : NULLIFY (kp_env%wmat)
737 1762 : NULLIFY (kp_env%smat)
738 1762 : NULLIFY (kp_env%amat)
739 :
740 1762 : END SUBROUTINE kpoint_env_create
741 :
742 : ! **************************************************************************************************
743 : !> \brief Release a single kpoint environment
744 : !> \param kp_env Single kpoint environment
745 : !> \author JGH
746 : ! **************************************************************************************************
747 1762 : SUBROUTINE kpoint_env_release(kp_env)
748 : TYPE(kpoint_env_type), POINTER :: kp_env
749 :
750 : INTEGER :: ic, is
751 :
752 1762 : IF (ASSOCIATED(kp_env)) THEN
753 :
754 1762 : IF (ASSOCIATED(kp_env%mos)) THEN
755 3788 : DO is = 1, SIZE(kp_env%mos, 2)
756 7826 : DO ic = 1, SIZE(kp_env%mos, 1)
757 6064 : CALL deallocate_mo_set(kp_env%mos(ic, is))
758 : END DO
759 : END DO
760 1762 : DEALLOCATE (kp_env%mos)
761 : END IF
762 :
763 1762 : CALL cp_fm_release(kp_env%pmat)
764 1762 : CALL cp_fm_release(kp_env%wmat)
765 1762 : CALL cp_fm_release(kp_env%smat)
766 1762 : CALL cp_fm_release(kp_env%amat)
767 :
768 1762 : CALL cp_fm_release(kp_env%shalf)
769 1762 : CALL cp_cfm_release(kp_env%cshalf)
770 :
771 1762 : DEALLOCATE (kp_env)
772 :
773 : END IF
774 :
775 1762 : END SUBROUTINE kpoint_env_release
776 :
777 : ! **************************************************************************************************
778 : !> \brief Get information from a single kpoint environment
779 : !> \param kpoint_env Single kpoint environment
780 : !> \param nkpoint Index of kpoint
781 : !> \param wkp Weight of kpoint
782 : !> \param xkp Coordinates of kpoint
783 : !> \param is_local Is this kpoint local (single cpu group)
784 : !> \param mos MOs of this kpoint
785 : !> \author JGH
786 : ! **************************************************************************************************
787 6654 : SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
788 : TYPE(kpoint_env_type), INTENT(IN) :: kpoint_env
789 : INTEGER, OPTIONAL :: nkpoint
790 : REAL(KIND=dp), OPTIONAL :: wkp
791 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: xkp
792 : LOGICAL, OPTIONAL :: is_local
793 : TYPE(mo_set_type), DIMENSION(:, :), OPTIONAL, &
794 : POINTER :: mos
795 :
796 6654 : IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
797 6654 : IF (PRESENT(wkp)) wkp = kpoint_env%wkp
798 6654 : IF (PRESENT(xkp)) xkp = kpoint_env%xkp
799 6654 : IF (PRESENT(is_local)) is_local = kpoint_env%is_local
800 6654 : IF (PRESENT(mos)) mos => kpoint_env%mos
801 :
802 6654 : END SUBROUTINE get_kpoint_env
803 :
804 : ! **************************************************************************************************
805 : !> \brief Create a single kpoint symmetry environment
806 : !> \param kp_sym ...
807 : !> \author JGH
808 : ! **************************************************************************************************
809 13138 : SUBROUTINE kpoint_sym_create(kp_sym)
810 : TYPE(kpoint_sym_type), POINTER :: kp_sym
811 :
812 13138 : CPASSERT(.NOT. ASSOCIATED(kp_sym))
813 :
814 13138 : ALLOCATE (kp_sym)
815 :
816 13138 : kp_sym%nwght = 0
817 13138 : kp_sym%nwred = 0
818 : kp_sym%apply_symmetry = .FALSE.
819 :
820 : NULLIFY (kp_sym%rot)
821 : NULLIFY (kp_sym%xkp)
822 : NULLIFY (kp_sym%rotp)
823 : NULLIFY (kp_sym%f0)
824 :
825 13138 : END SUBROUTINE kpoint_sym_create
826 :
827 : ! **************************************************************************************************
828 : !> \brief Release a single kpoint symmetry environment
829 : !> \param kp_sym ...
830 : !> \author JGH
831 : ! **************************************************************************************************
832 13138 : SUBROUTINE kpoint_sym_release(kp_sym)
833 : TYPE(kpoint_sym_type), POINTER :: kp_sym
834 :
835 13138 : IF (ASSOCIATED(kp_sym)) THEN
836 :
837 13138 : IF (ASSOCIATED(kp_sym%rot)) THEN
838 0 : DEALLOCATE (kp_sym%rot)
839 : END IF
840 13138 : IF (ASSOCIATED(kp_sym%xkp)) THEN
841 0 : DEALLOCATE (kp_sym%xkp)
842 : END IF
843 13138 : IF (ASSOCIATED(kp_sym%f0)) THEN
844 0 : DEALLOCATE (kp_sym%f0)
845 : END IF
846 13138 : IF (ASSOCIATED(kp_sym%rotp)) THEN
847 0 : DEALLOCATE (kp_sym%rotp)
848 : END IF
849 :
850 13138 : DEALLOCATE (kp_sym)
851 :
852 : END IF
853 :
854 13138 : END SUBROUTINE kpoint_sym_release
855 :
856 : ! **************************************************************************************************
857 :
858 0 : END MODULE kpoint_types
|