(git:295f299)
Loading...
Searching...
No Matches
qs_tddfpt2_subgroups.F
Go to the documentation of this file.
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
9 USE admm_types, ONLY: admm_type,&
14 USE cell_types, ONLY: cell_type
21 USE cp_dbcsr_api, ONLY: dbcsr_create,&
50 USE kinds, ONLY: default_string_length,&
51 dp
57 USE pw_env_methods, ONLY: pw_env_create,&
59 USE pw_env_types, ONLY: pw_env_release,&
62 USE pw_types, ONLY: pw_r3d_rs_type
65 USE qs_kind_types, ONLY: get_qs_kind,&
79 USE qs_rho0_methods, ONLY: init_rho0
85#include "./base/base_uses.f90"
86
87 IMPLICIT NONE
88
89 PRIVATE
90
91 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_subgroups'
92 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .true.
93
97
98! **************************************************************************************************
99!> \brief Parallel (sub)group environment.
100!> \par History
101!> * 01.2017 created [Sergey Chulkov]
102! **************************************************************************************************
104 !> indicates that the global MPI communicator has been split into subgroups; if it is .FALSE.
105 !> certain components of the structure (blacs_env, para_env, admm_A, and mos_occ)
106 !> can still be accessed; in this case they simply point to the corresponding global variables
107 LOGICAL :: is_split = .false.
108 !> number of parallel groups
109 INTEGER :: ngroups = -1
110 !> group_distribution(0:ngroups-1) : a process with rank 'i' belongs to the parallel group
111 !> with index 'group_distribution(i)'
112 INTEGER, DIMENSION(:), ALLOCATABLE :: group_distribution
113 !> group-specific BLACS parallel environment
114 TYPE(cp_blacs_env_type), POINTER :: blacs_env => null()
115 !> group-specific MPI parallel environment
116 TYPE(mp_para_env_type), POINTER :: para_env => null()
117 !> (active) occupied MOs stored in a matrix form [nao x nmo_occ(spin)] distributed across processes
118 !> in the parallel group
119 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: mos_occ
120 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: mos_active
121 !> group-specific copy of the ADMM A matrix 'admm_type%A'
122 TYPE(cp_fm_type), POINTER :: admm_a => null()
123 !
124 !> indicates that a set of multi-grids has been allocated; if it is .FALSE. all the components
125 !> below point to the corresponding global variables and can be accessed
126 LOGICAL :: is_mgrid = .false.
127 !> group-specific DBCSR distribution
128 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist => null()
129 !> group-specific two-dimensional distribution of pairs of particles
130 TYPE(distribution_2d_type), POINTER :: dist_2d => null()
131 !> group-specific plane wave environment
132 TYPE(pw_env_type), POINTER :: pw_env => null()
133 !> integration weights
134 TYPE(pw_r3d_rs_type), POINTER :: xcint_weights => null()
135 !> lists of neighbours in auxiliary and primary basis sets
137 DIMENSION(:), POINTER :: sab_aux_fit => null(), sab_orb => null()
138 !> task lists in auxiliary and primary basis sets
139 TYPE(task_list_type), POINTER :: task_list_aux_fit => null(), task_list_orb => null()
140 !> soft task lists in auxiliary and primary basis sets
141 TYPE(task_list_type), POINTER :: task_list_aux_fit_soft => null(), task_list_orb_soft => null()
142 !> GAPW local atomic grids
143 TYPE(hartree_local_type), POINTER :: hartree_local => null()
144 TYPE(local_rho_type), POINTER :: local_rho_set => null()
145 TYPE(local_rho_type), POINTER :: local_rho_set_admm => null()
147
148! **************************************************************************************************
149!> \brief Structure to save global multi-grid related parameters.
150!> \par History
151!> * 09.2016 created [Sergey Chulkov]
152!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
153! **************************************************************************************************
154 TYPE mgrid_saved_parameters
155 !> create commensurate grids
156 LOGICAL :: commensurate_mgrids = .false.
157 !> create real-space grids
158 LOGICAL :: realspace_mgrids = .false.
159 !> do not perform load balancing
160 LOGICAL :: skip_load_balance = .false.
161 !> cutoff value at the finest grid level
162 REAL(kind=dp) :: cutoff = 0.0_dp
163 !> inverse scale factor
164 REAL(kind=dp) :: progression_factor = 0.0_dp
165 !> relative cutoff
166 REAL(kind=dp) :: relative_cutoff = 0.0_dp
167 !> list of explicitly given cutoff values
168 REAL(kind=dp), DIMENSION(:), POINTER :: e_cutoff => null()
169 END TYPE mgrid_saved_parameters
170
171CONTAINS
172
173! **************************************************************************************************
174!> \brief Split MPI communicator to create a set of parallel (sub)groups.
175!> \param sub_env parallel group environment (initialised on exit)
176!> \param qs_env Quickstep environment
177!> \param mos_occ ground state molecular orbitals in primary atomic basis set
178!> \param mos_active active ground state molecular orbitals in primary atomic basis set
179!> \param kernel Type of kernel (full/sTDA) that will be used
180!> \par History
181!> * 01.2017 (sub)group-related code has been moved here from the main subroutine tddfpt()
182!> [Sergey Chulkov]
183! **************************************************************************************************
184 SUBROUTINE tddfpt_sub_env_init(sub_env, qs_env, mos_occ, mos_active, kernel)
185 TYPE(tddfpt_subgroup_env_type), INTENT(out) :: sub_env
186 TYPE(qs_environment_type), POINTER :: qs_env
187 TYPE(cp_fm_type), DIMENSION(:), INTENT(in) :: mos_occ, mos_active
188 INTEGER, INTENT(in) :: kernel
189
190 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_sub_env_init'
191
192 INTEGER :: handle, ispin, nao, nao_aux, natom, &
193 nmo_active, nmo_occ, nspins
194 TYPE(admm_type), POINTER :: admm_env
195 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
196 TYPE(cp_blacs_env_type), POINTER :: blacs_env_global
197 TYPE(cp_fm_struct_type), POINTER :: fm_struct
198 TYPE(dft_control_type), POINTER :: dft_control
199 TYPE(mgrid_saved_parameters) :: mgrid_saved
200 TYPE(mp_para_env_type), POINTER :: para_env_global
201 TYPE(pw_env_type), POINTER :: pw_env_global
202 TYPE(pw_r3d_rs_type), POINTER :: weights
203 TYPE(qs_control_type), POINTER :: qs_control
204 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
205 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
206
207 CALL timeset(routinen, handle)
208
209 nspins = SIZE(mos_occ)
210
211 CALL get_qs_env(qs_env, blacs_env=blacs_env_global, dft_control=dft_control, &
212 para_env=para_env_global, pw_env=pw_env_global)
213
214 tddfpt_control => dft_control%tddfpt2_control
215 qs_control => dft_control%qs_control
216
217 ! ++ split mpi communicator if
218 ! a) the requested number of processors per group > 0
219 ! (means that the split has been requested explicitly), and
220 ! b) the number of subgroups is >= 2
221 sub_env%is_split = tddfpt_control%nprocs > 0 .AND. tddfpt_control%nprocs*2 <= para_env_global%num_pe
222
223 ALLOCATE (sub_env%mos_occ(nspins))
224 ALLOCATE (sub_env%mos_active(nspins))
225 NULLIFY (sub_env%admm_A)
226
227 CALL get_qs_env(qs_env, xcint_weights=weights)
228 sub_env%xcint_weights => weights
229 IF (sub_env%is_split .AND. ASSOCIATED(weights)) THEN
230 cpabort('subgroups and integration weights not compatible')
231 END IF
232
233 IF (sub_env%is_split) THEN
234 ALLOCATE (sub_env%group_distribution(0:para_env_global%num_pe - 1))
235
236 ALLOCATE (sub_env%para_env)
237 CALL sub_env%para_env%from_split(comm=para_env_global, ngroups=sub_env%ngroups, &
238 group_distribution=sub_env%group_distribution, subgroup_min_size=tddfpt_control%nprocs)
239
240 ! ++ create a new parallel environment based on the given sub-communicator)
241 NULLIFY (sub_env%blacs_env)
242
243 ! use the default (SQUARE) BLACS grid layout and non-repeatable BLACS collective operations
244 ! by omitting optional parameters 'blacs_grid_layout' and 'blacs_repeatable'.
245 ! Ideally we should take these parameters from the variables globenv%blacs_grid_layout and
246 ! globenv%blacs_repeatable, however the global environment is not available
247 ! from the subroutine 'qs_energies_properties'.
248 CALL cp_blacs_env_create(sub_env%blacs_env, sub_env%para_env)
249
250 NULLIFY (fm_struct)
251
252 DO ispin = 1, nspins
253 CALL cp_fm_get_info(mos_occ(ispin), nrow_global=nao, ncol_global=nmo_occ)
254 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_occ, context=sub_env%blacs_env)
255 CALL cp_fm_create(sub_env%mos_occ(ispin), fm_struct)
256 CALL cp_fm_struct_release(fm_struct)
257 CALL tddfpt_fm_replicate_across_subgroups(fm_src=mos_occ(ispin), &
258 fm_dest_sub=sub_env%mos_occ(ispin), sub_env=sub_env)
259 END DO
260
261 DO ispin = 1, nspins
262 CALL cp_fm_get_info(mos_active(ispin), nrow_global=nao, ncol_global=nmo_active)
263 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_active, context=sub_env%blacs_env)
264 CALL cp_fm_create(sub_env%mos_active(ispin), fm_struct)
265 CALL cp_fm_struct_release(fm_struct)
266 CALL tddfpt_fm_replicate_across_subgroups(fm_src=mos_active(ispin), &
267 fm_dest_sub=sub_env%mos_active(ispin), sub_env=sub_env)
268 END DO
269
270 IF (dft_control%do_admm) THEN
271 CALL get_qs_env(qs_env, admm_env=admm_env)
272 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
273 CALL cp_fm_struct_create(fm_struct, nrow_global=nao_aux, ncol_global=nao, context=sub_env%blacs_env)
274 ALLOCATE (sub_env%admm_A)
275 CALL cp_fm_create(sub_env%admm_A, fm_struct)
276 CALL cp_fm_struct_release(fm_struct)
277 CALL tddfpt_fm_replicate_across_subgroups(fm_src=admm_env%A, fm_dest_sub=sub_env%admm_A, sub_env=sub_env)
278 END IF
279 ELSE
280 CALL para_env_global%retain()
281 sub_env%para_env => para_env_global
282
283 CALL blacs_env_global%retain()
284 sub_env%blacs_env => blacs_env_global
285
286 sub_env%mos_occ(:) = mos_occ(:)
287 sub_env%mos_active(:) = mos_active(:)
288
289 IF (dft_control%do_admm) THEN
290 CALL get_qs_env(qs_env, admm_env=admm_env)
291 sub_env%admm_A => admm_env%A
292 END IF
293 END IF
294
295 IF (kernel == tddfpt_kernel_full) THEN
296 ! ++ allocate a new plane wave environment
297 sub_env%is_mgrid = sub_env%is_split .OR. tddfpt_control%mgrid_is_explicit
298
299 NULLIFY (sub_env%dbcsr_dist, sub_env%dist_2d)
300 NULLIFY (sub_env%sab_orb, sub_env%sab_aux_fit)
301 NULLIFY (sub_env%task_list_orb, sub_env%task_list_aux_fit)
302 NULLIFY (sub_env%task_list_orb_soft, sub_env%task_list_aux_fit_soft)
303
304 IF (sub_env%is_mgrid) THEN
305 IF (tddfpt_control%mgrid_is_explicit) THEN
306 CALL init_tddfpt_mgrid(qs_control, tddfpt_control, mgrid_saved)
307 END IF
308
309 IF (ASSOCIATED(weights)) THEN
310 cpabort('Redefining MGRID and integration weights not compatible')
311 END IF
312
313 NULLIFY (sub_env%pw_env)
314
315 CALL pw_env_create(sub_env%pw_env)
316 CALL pw_env_rebuild(sub_env%pw_env, qs_env, sub_env%para_env)
317
318 CALL tddfpt_build_distribution_2d(distribution_2d=sub_env%dist_2d, dbcsr_dist=sub_env%dbcsr_dist, &
319 blacs_env=sub_env%blacs_env, qs_env=qs_env)
320
321 CALL tddfpt_build_tasklist(task_list=sub_env%task_list_orb, sab=sub_env%sab_orb, basis_type="ORB", &
322 distribution_2d=sub_env%dist_2d, pw_env=sub_env%pw_env, qs_env=qs_env, &
323 skip_load_balance=qs_control%skip_load_balance_distributed, &
324 reorder_grid_ranks=.true.)
325
326 IF (qs_control%gapw .OR. qs_control%gapw_xc) THEN
327 CALL tddfpt_build_tasklist(task_list=sub_env%task_list_orb_soft, sab=sub_env%sab_orb, basis_type="ORB_SOFT", &
328 distribution_2d=sub_env%dist_2d, pw_env=sub_env%pw_env, qs_env=qs_env, &
329 skip_load_balance=qs_control%skip_load_balance_distributed, &
330 reorder_grid_ranks=.true.)
331 END IF
332
333 IF (dft_control%do_admm) THEN
334 CALL tddfpt_build_tasklist(task_list=sub_env%task_list_aux_fit, sab=sub_env%sab_aux_fit, &
335 basis_type="AUX_FIT", distribution_2d=sub_env%dist_2d, &
336 pw_env=sub_env%pw_env, qs_env=qs_env, &
337 skip_load_balance=qs_control%skip_load_balance_distributed, &
338 reorder_grid_ranks=.false.)
339 IF (qs_control%gapw .OR. qs_control%gapw_xc) THEN
340 CALL tddfpt_build_tasklist(task_list=sub_env%task_list_aux_fit_soft, sab=sub_env%sab_aux_fit, &
341 basis_type="AUX_FIT_SOFT", distribution_2d=sub_env%dist_2d, &
342 pw_env=sub_env%pw_env, qs_env=qs_env, &
343 skip_load_balance=qs_control%skip_load_balance_distributed, &
344 reorder_grid_ranks=.false.)
345 END IF
346 END IF
347
348 IF (tddfpt_control%mgrid_is_explicit) THEN
349 CALL restore_qs_mgrid(qs_control, mgrid_saved)
350 END IF
351 ELSE
352 CALL pw_env_retain(pw_env_global)
353 sub_env%pw_env => pw_env_global
354
355 CALL get_qs_env(qs_env, dbcsr_dist=sub_env%dbcsr_dist, &
356 sab_orb=sub_env%sab_orb, task_list=sub_env%task_list_orb)
357 IF (dft_control%do_admm) THEN
358 CALL get_admm_env(admm_env, sab_aux_fit=sub_env%sab_aux_fit, &
359 task_list_aux_fit=sub_env%task_list_aux_fit)
360 IF (qs_control%gapw .OR. qs_control%gapw_xc) THEN
361 sub_env%task_list_aux_fit_soft => admm_env%admm_gapw_env%task_list
362 END IF
363 END IF
364 IF (qs_control%gapw .OR. qs_control%gapw_xc) THEN
365 CALL get_qs_env(qs_env, task_list_soft=sub_env%task_list_orb_soft)
366 END IF
367 END IF
368
369 ! GAPW initializations
370 IF (dft_control%qs_control%gapw) THEN
371 CALL get_qs_env(qs_env, &
372 atomic_kind_set=atomic_kind_set, &
373 natom=natom, &
374 qs_kind_set=qs_kind_set)
375
376 CALL local_rho_set_create(sub_env%local_rho_set)
377 CALL allocate_rho_atom_internals(sub_env%local_rho_set%rho_atom_set, atomic_kind_set, &
378 qs_kind_set, dft_control, sub_env%para_env)
379
380 CALL init_rho0(sub_env%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
381 zcore=0.0_dp)
382 CALL rho0_s_grid_create(sub_env%pw_env, sub_env%local_rho_set%rho0_mpole)
383 CALL hartree_local_create(sub_env%hartree_local)
384 CALL init_coulomb_local(sub_env%hartree_local, natom)
385 ELSE IF (dft_control%qs_control%gapw_xc) THEN
386 CALL get_qs_env(qs_env, &
387 atomic_kind_set=atomic_kind_set, &
388 qs_kind_set=qs_kind_set)
389 CALL local_rho_set_create(sub_env%local_rho_set)
390 CALL allocate_rho_atom_internals(sub_env%local_rho_set%rho_atom_set, atomic_kind_set, &
391 qs_kind_set, dft_control, sub_env%para_env)
392 END IF
393
394 ! ADMM/GAPW
395 IF (dft_control%do_admm) THEN
396 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
397 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
398 CALL local_rho_set_create(sub_env%local_rho_set_admm)
399 CALL allocate_rho_atom_internals(sub_env%local_rho_set_admm%rho_atom_set, atomic_kind_set, &
400 admm_env%admm_gapw_env%admm_kind_set, &
401 dft_control, sub_env%para_env)
402 END IF
403 END IF
404
405 ELSE IF (kernel == tddfpt_kernel_stda) THEN
406 sub_env%is_mgrid = .false.
407 NULLIFY (sub_env%dbcsr_dist, sub_env%dist_2d)
408 NULLIFY (sub_env%sab_orb, sub_env%sab_aux_fit)
409 NULLIFY (sub_env%task_list_orb, sub_env%task_list_orb_soft)
410 NULLIFY (sub_env%task_list_aux_fit, sub_env%task_list_aux_fit_soft)
411 NULLIFY (sub_env%pw_env)
412 IF (sub_env%is_split) THEN
413 cpabort('Subsys option not available')
414 ELSE
415 CALL get_qs_env(qs_env, dbcsr_dist=sub_env%dbcsr_dist, sab_orb=sub_env%sab_orb)
416 END IF
417 ELSE IF (kernel == tddfpt_kernel_none) THEN
418 sub_env%is_mgrid = .false.
419 NULLIFY (sub_env%dbcsr_dist, sub_env%dist_2d)
420 NULLIFY (sub_env%sab_orb, sub_env%sab_aux_fit)
421 NULLIFY (sub_env%task_list_orb, sub_env%task_list_orb_soft)
422 NULLIFY (sub_env%task_list_aux_fit, sub_env%task_list_aux_fit_soft)
423 NULLIFY (sub_env%pw_env)
424 IF (sub_env%is_split) THEN
425 cpabort('Subsys option not available')
426 ELSE
427 CALL get_qs_env(qs_env, dbcsr_dist=sub_env%dbcsr_dist, sab_orb=sub_env%sab_orb)
428 END IF
429 ELSE
430 cpabort("Unknown kernel type")
431 END IF
432
433 CALL timestop(handle)
434
435 END SUBROUTINE tddfpt_sub_env_init
436
437! **************************************************************************************************
438!> \brief Release parallel group environment
439!> \param sub_env parallel group environment (modified on exit)
440!> \par History
441!> * 01.2017 created [Sergey Chulkov]
442! **************************************************************************************************
443 SUBROUTINE tddfpt_sub_env_release(sub_env)
444 TYPE(tddfpt_subgroup_env_type), INTENT(inout) :: sub_env
445
446 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_sub_env_release'
447
448 INTEGER :: handle, i
449
450 CALL timeset(routinen, handle)
451
452 IF (sub_env%is_mgrid) THEN
453 IF (ASSOCIATED(sub_env%task_list_aux_fit)) THEN
454 CALL deallocate_task_list(sub_env%task_list_aux_fit)
455 END IF
456
457 IF (ASSOCIATED(sub_env%task_list_aux_fit_soft)) THEN
458 CALL deallocate_task_list(sub_env%task_list_aux_fit_soft)
459 END IF
460
461 IF (ASSOCIATED(sub_env%task_list_orb)) THEN
462 CALL deallocate_task_list(sub_env%task_list_orb)
463 END IF
464
465 IF (ASSOCIATED(sub_env%task_list_orb_soft)) THEN
466 CALL deallocate_task_list(sub_env%task_list_orb_soft)
467 END IF
468
469 CALL release_neighbor_list_sets(sub_env%sab_aux_fit)
470 CALL release_neighbor_list_sets(sub_env%sab_orb)
471
472 IF (ASSOCIATED(sub_env%dbcsr_dist)) THEN
473 CALL dbcsr_distribution_release(sub_env%dbcsr_dist)
474 DEALLOCATE (sub_env%dbcsr_dist)
475 END IF
476
477 IF (ASSOCIATED(sub_env%dist_2d)) THEN
478 CALL distribution_2d_release(sub_env%dist_2d)
479 END IF
480 END IF
481
482 ! GAPW
483 IF (ASSOCIATED(sub_env%local_rho_set)) THEN
484 CALL local_rho_set_release(sub_env%local_rho_set)
485 END IF
486 IF (ASSOCIATED(sub_env%hartree_local)) THEN
487 CALL hartree_local_release(sub_env%hartree_local)
488 END IF
489 IF (ASSOCIATED(sub_env%local_rho_set_admm)) THEN
490 CALL local_rho_set_release(sub_env%local_rho_set_admm)
491 END IF
492
493 ! if TDDFPT-specific plane-wave environment has not been requested,
494 ! the pointers sub_env%dbcsr_dist, sub_env%sab_*, and sub_env%task_list_*
495 ! point to the corresponding ground-state variables from qs_env
496 ! and should not be deallocated
497
498 CALL pw_env_release(sub_env%pw_env)
499
500 sub_env%is_mgrid = .false.
501
502 IF (sub_env%is_split .AND. ASSOCIATED(sub_env%admm_A)) THEN
503 CALL cp_fm_release(sub_env%admm_A)
504 DEALLOCATE (sub_env%admm_A)
505 NULLIFY (sub_env%admm_A)
506 END IF
507
508 IF (sub_env%is_split) THEN
509 DO i = SIZE(sub_env%mos_occ), 1, -1
510 CALL cp_fm_release(sub_env%mos_occ(i))
511 END DO
512 DO i = SIZE(sub_env%mos_active), 1, -1
513 CALL cp_fm_release(sub_env%mos_active(i))
514 END DO
515 END IF
516 DEALLOCATE (sub_env%mos_occ)
517 DEALLOCATE (sub_env%mos_active)
518
519 CALL cp_blacs_env_release(sub_env%blacs_env)
520 CALL mp_para_env_release(sub_env%para_env)
521
522 IF (ALLOCATED(sub_env%group_distribution)) THEN
523 DEALLOCATE (sub_env%group_distribution)
524 END IF
525
526 sub_env%is_split = .false.
527
528 CALL timestop(handle)
529
530 END SUBROUTINE tddfpt_sub_env_release
531
532! **************************************************************************************************
533!> \brief Replace the global multi-grid related parameters in qs_control by the ones given in the
534!> TDDFPT/MGRID subsection. The original parameters are stored into the 'mgrid_saved'
535!> variable.
536!> \param qs_control Quickstep control parameters (modified on exit)
537!> \param tddfpt_control TDDFPT control parameters
538!> \param mgrid_saved structure to hold global MGRID-related parameters (initialised on exit)
539!> \par History
540!> * 09.2016 created [Sergey Chulkov]
541!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
542!> \note the code to build the 'e_cutoff' list was taken from the subroutine read_mgrid_section()
543! **************************************************************************************************
544 SUBROUTINE init_tddfpt_mgrid(qs_control, tddfpt_control, mgrid_saved)
545 TYPE(qs_control_type), POINTER :: qs_control
546 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
547 TYPE(mgrid_saved_parameters), INTENT(out) :: mgrid_saved
548
549 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_tddfpt_mgrid'
550
551 INTEGER :: handle, igrid, ngrids
552
553 CALL timeset(routinen, handle)
554
555 ! ++ save global plane-wave grid parameters to the variable 'mgrid_saved'
556 mgrid_saved%commensurate_mgrids = qs_control%commensurate_mgrids
557 mgrid_saved%realspace_mgrids = qs_control%realspace_mgrids
558 mgrid_saved%skip_load_balance = qs_control%skip_load_balance_distributed
559 mgrid_saved%cutoff = qs_control%cutoff
560 mgrid_saved%progression_factor = qs_control%progression_factor
561 mgrid_saved%relative_cutoff = qs_control%relative_cutoff
562 mgrid_saved%e_cutoff => qs_control%e_cutoff
563
564 ! ++ set parameters from 'tddfpt_control' as default ones for all newly allocated plane-wave grids
565 qs_control%commensurate_mgrids = tddfpt_control%mgrid_commensurate_mgrids
566 qs_control%realspace_mgrids = tddfpt_control%mgrid_realspace_mgrids
567 qs_control%skip_load_balance_distributed = tddfpt_control%mgrid_skip_load_balance
568 qs_control%cutoff = tddfpt_control%mgrid_cutoff
569 qs_control%progression_factor = tddfpt_control%mgrid_progression_factor
570 qs_control%relative_cutoff = tddfpt_control%mgrid_relative_cutoff
571
572 ALLOCATE (qs_control%e_cutoff(tddfpt_control%mgrid_ngrids))
573 ngrids = tddfpt_control%mgrid_ngrids
574 IF (ASSOCIATED(tddfpt_control%mgrid_e_cutoff)) THEN
575 ! following read_mgrid_section() there is a magic scale factor there (0.5_dp)
576 DO igrid = 1, ngrids
577 qs_control%e_cutoff(igrid) = tddfpt_control%mgrid_e_cutoff(igrid)*0.5_dp
578 END DO
579 ! ++ round 'qs_control%cutoff' upward to the nearest sub-grid's cutoff value;
580 ! here we take advantage of the fact that the array 'e_cutoff' has been sorted in descending order
581 DO igrid = ngrids, 1, -1
582 IF (qs_control%cutoff <= qs_control%e_cutoff(igrid)) THEN
583 qs_control%cutoff = qs_control%e_cutoff(igrid)
584 EXIT
585 END IF
586 END DO
587 ! igrid == 0 if qs_control%cutoff is larger than the largest manually provided cutoff value;
588 ! use the largest actual value
589 IF (igrid <= 0) THEN
590 qs_control%cutoff = qs_control%e_cutoff(1)
591 END IF
592 ELSE
593 qs_control%e_cutoff(1) = qs_control%cutoff
594 DO igrid = 2, ngrids
595 qs_control%e_cutoff(igrid) = qs_control%e_cutoff(igrid - 1)/qs_control%progression_factor
596 END DO
597 END IF
598
599 CALL timestop(handle)
600 END SUBROUTINE init_tddfpt_mgrid
601
602! **************************************************************************************************
603!> \brief Restore the global multi-grid related parameters stored in the 'mgrid_saved' variable.
604!> \param qs_control Quickstep control parameters (modified on exit)
605!> \param mgrid_saved structure that holds global MGRID-related parameters
606!> \par History
607!> * 09.2016 created [Sergey Chulkov]
608! **************************************************************************************************
609 SUBROUTINE restore_qs_mgrid(qs_control, mgrid_saved)
610 TYPE(qs_control_type), POINTER :: qs_control
611 TYPE(mgrid_saved_parameters), INTENT(in) :: mgrid_saved
612
613 CHARACTER(LEN=*), PARAMETER :: routinen = 'restore_qs_mgrid'
614
615 INTEGER :: handle
616
617 CALL timeset(routinen, handle)
618
619 IF (ASSOCIATED(qs_control%e_cutoff)) THEN
620 DEALLOCATE (qs_control%e_cutoff)
621 END IF
622
623 qs_control%commensurate_mgrids = mgrid_saved%commensurate_mgrids
624 qs_control%realspace_mgrids = mgrid_saved%realspace_mgrids
625 qs_control%skip_load_balance_distributed = mgrid_saved%skip_load_balance
626 qs_control%cutoff = mgrid_saved%cutoff
627 qs_control%progression_factor = mgrid_saved%progression_factor
628 qs_control%relative_cutoff = mgrid_saved%relative_cutoff
629 qs_control%e_cutoff => mgrid_saved%e_cutoff
630
631 CALL timestop(handle)
632 END SUBROUTINE restore_qs_mgrid
633
634! **************************************************************************************************
635!> \brief Distribute atoms across the two-dimensional grid of processors.
636!> \param distribution_2d new two-dimensional distribution of pairs of particles
637!> (allocated and initialised on exit)
638!> \param dbcsr_dist new DBCSR distribution (allocated and initialised on exit)
639!> \param blacs_env BLACS parallel environment
640!> \param qs_env Quickstep environment
641!> \par History
642!> * 09.2016 created [Sergey Chulkov]
643!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
644! **************************************************************************************************
645 SUBROUTINE tddfpt_build_distribution_2d(distribution_2d, dbcsr_dist, blacs_env, qs_env)
646 TYPE(distribution_2d_type), POINTER :: distribution_2d
647 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist
648 TYPE(cp_blacs_env_type), POINTER :: blacs_env
649 TYPE(qs_environment_type), POINTER :: qs_env
650
651 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_build_distribution_2d'
652
653 INTEGER :: handle
654 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
655 TYPE(cell_type), POINTER :: cell
656 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
657 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
658 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
659 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
660 TYPE(section_vals_type), POINTER :: input
661
662 CALL timeset(routinen, handle)
663
664 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, cell=cell, input=input, &
665 molecule_kind_set=molecule_kind_set, molecule_set=molecule_set, &
666 particle_set=particle_set, qs_kind_set=qs_kind_set)
667
668 NULLIFY (distribution_2d)
669 CALL distribute_molecules_2d(cell=cell, &
670 atomic_kind_set=atomic_kind_set, &
671 particle_set=particle_set, &
672 qs_kind_set=qs_kind_set, &
673 molecule_kind_set=molecule_kind_set, &
674 molecule_set=molecule_set, &
675 distribution_2d=distribution_2d, &
676 blacs_env=blacs_env, &
677 force_env_section=input)
678
679 ALLOCATE (dbcsr_dist)
680 CALL cp_dbcsr_dist2d_to_dist(distribution_2d, dbcsr_dist)
681
682 CALL timestop(handle)
683 END SUBROUTINE tddfpt_build_distribution_2d
684
685! **************************************************************************************************
686!> \brief Build task and neighbour lists for the given plane wave environment and basis set.
687!> \param task_list new task list (allocated and initialised on exit)
688!> \param sab new list of neighbours (allocated and initialised on exit)
689!> \param basis_type type of the basis set
690!> \param distribution_2d two-dimensional distribution of pairs of particles
691!> \param pw_env plane wave environment
692!> \param qs_env Quickstep environment
693!> \param skip_load_balance do not perform load balancing
694!> \param reorder_grid_ranks re-optimise grid ranks and re-create the real-space grid descriptor
695!> as well as grids
696!> \par History
697!> * 09.2016 created [Sergey Chulkov]
698!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
699! **************************************************************************************************
700 SUBROUTINE tddfpt_build_tasklist(task_list, sab, basis_type, distribution_2d, pw_env, qs_env, &
701 skip_load_balance, reorder_grid_ranks)
702 TYPE(task_list_type), POINTER :: task_list
703 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
704 POINTER :: sab
705 CHARACTER(len=*), INTENT(in) :: basis_type
706 TYPE(distribution_2d_type), POINTER :: distribution_2d
707 TYPE(pw_env_type), POINTER :: pw_env
708 TYPE(qs_environment_type), POINTER :: qs_env
709 LOGICAL, INTENT(in) :: skip_load_balance, reorder_grid_ranks
710
711 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_build_tasklist'
712
713 INTEGER :: handle, ikind, nkinds
714 LOGICAL, ALLOCATABLE, DIMENSION(:) :: orb_present
715 REAL(kind=dp) :: subcells
716 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: orb_radius
717 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: pair_radius
718 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
719 TYPE(cell_type), POINTER :: cell
720 TYPE(distribution_1d_type), POINTER :: local_particles
721 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
722 TYPE(local_atoms_type), ALLOCATABLE, DIMENSION(:) :: atom2d
723 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
724 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
725 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
726 TYPE(qs_ks_env_type), POINTER :: ks_env
727 TYPE(section_vals_type), POINTER :: input
728
729 CALL timeset(routinen, handle)
730
731 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, cell=cell, input=input, &
732 ks_env=ks_env, local_particles=local_particles, molecule_set=molecule_set, &
733 particle_set=particle_set, qs_kind_set=qs_kind_set)
734
735 nkinds = SIZE(atomic_kind_set)
736
737 IF (.NOT. (ASSOCIATED(sab))) THEN
738 ALLOCATE (atom2d(nkinds))
739 CALL atom2d_build(atom2d, local_particles, distribution_2d, atomic_kind_set, &
740 molecule_set, molecule_only=.false., particle_set=particle_set)
741
742 ALLOCATE (orb_present(nkinds))
743 ALLOCATE (orb_radius(nkinds))
744 ALLOCATE (pair_radius(nkinds, nkinds))
745
746 DO ikind = 1, nkinds
747 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, basis_type=basis_type)
748 IF (ASSOCIATED(orb_basis_set)) THEN
749 orb_present(ikind) = .true.
750 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, kind_radius=orb_radius(ikind))
751 ELSE
752 orb_present(ikind) = .false.
753 orb_radius(ikind) = 0.0_dp
754 END IF
755 END DO
756
757 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
758
759 NULLIFY (sab)
760 CALL section_vals_val_get(input, "DFT%SUBCELLS", r_val=subcells)
761 CALL build_neighbor_lists(sab, particle_set, atom2d, cell, pair_radius, &
762 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb")
763
764 CALL atom2d_cleanup(atom2d)
765 DEALLOCATE (atom2d, orb_present, orb_radius, pair_radius)
766 END IF
767
768 CALL allocate_task_list(task_list)
769 CALL generate_qs_task_list(ks_env, task_list, basis_type=basis_type, &
770 reorder_rs_grid_ranks=reorder_grid_ranks, &
771 skip_load_balance_distributed=skip_load_balance, &
772 pw_env_external=pw_env, sab_orb_external=sab)
773
774 CALL timestop(handle)
775 END SUBROUTINE tddfpt_build_tasklist
776
777! **************************************************************************************************
778!> \brief Create a DBCSR matrix based on a template matrix, distribution object, and the list of
779!> neighbours.
780!> \param matrix matrix to create
781!> \param template template matrix
782!> \param dbcsr_dist DBCSR distribution
783!> \param sab list of neighbours
784!> \par History
785!> * 09.2016 created [Sergey Chulkov]
786!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
787! **************************************************************************************************
788 SUBROUTINE tddfpt_dbcsr_create_by_dist(matrix, template, dbcsr_dist, sab)
789 TYPE(dbcsr_type), POINTER :: matrix, template
790 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist
791 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
792 POINTER :: sab
793
794 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_dbcsr_create_by_dist'
795
796 CHARACTER :: matrix_type
797 CHARACTER(len=default_string_length) :: matrix_name
798 INTEGER :: handle
799 INTEGER, DIMENSION(:), POINTER :: col_blk_sizes, row_blk_sizes
800
801 CALL timeset(routinen, handle)
802
803 cpassert(ASSOCIATED(template))
804 CALL dbcsr_get_info(template, row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes, &
805 name=matrix_name, matrix_type=matrix_type)
806
807 IF (ASSOCIATED(matrix)) THEN
808 CALL dbcsr_release(matrix)
809 ELSE
810 ALLOCATE (matrix)
811 END IF
812
813 CALL dbcsr_create(matrix, matrix_name, dbcsr_dist, matrix_type, row_blk_sizes, col_blk_sizes)
814 CALL cp_dbcsr_alloc_block_from_nbl(matrix, sab)
815
816 CALL timestop(handle)
817
818 END SUBROUTINE tddfpt_dbcsr_create_by_dist
819
820! **************************************************************************************************
821!> \brief Replicate a globally distributed matrix across all sub-groups. At the end
822!> every sub-group will hold a local copy of the original globally distributed matrix.
823!>
824!> |--------------------|
825!> fm_src | 0 1 2 3 |
826!> |--------------------|
827!> / MPI ranks \
828!> |/_ _\|
829!> |--------------------| |--------------------|
830!> fm_dest_subgroup0 | 0 1 | | 2 3 | fm_dest_subgroup1
831!> |--------------------| |--------------------|
832!> subgroup 0 subgroup 1
833!>
834!> \param fm_src globally distributed matrix to replicate
835!> \param fm_dest_sub subgroup-specific copy of the replicated matrix
836!> \param sub_env subgroup environment
837!> \par History
838!> * 09.2016 created [Sergey Chulkov]
839!> * 01.2017 moved from qs_tddfpt2_methods [Sergey Chulkov]
840! **************************************************************************************************
841 SUBROUTINE tddfpt_fm_replicate_across_subgroups(fm_src, fm_dest_sub, sub_env)
842 TYPE(cp_fm_type), INTENT(IN) :: fm_src, fm_dest_sub
843 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
844
845 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_fm_replicate_across_subgroups'
846
847 INTEGER :: handle, igroup, igroup_local, ncols_global_dest, ncols_global_src, ngroups, &
848 nrows_global_dest, nrows_global_src
849 TYPE(cp_blacs_env_type), POINTER :: blacs_env_global
850 TYPE(cp_fm_type) :: fm_null
851 TYPE(mp_para_env_type), POINTER :: para_env_global
852
853 IF (sub_env%is_split) THEN
854 CALL timeset(routinen, handle)
855
856 CALL cp_fm_get_info(fm_src, nrow_global=nrows_global_src, ncol_global=ncols_global_src, &
857 context=blacs_env_global, para_env=para_env_global)
858 CALL cp_fm_get_info(fm_dest_sub, nrow_global=nrows_global_dest, ncol_global=ncols_global_dest)
859
860 IF (debug_this_module) THEN
861 cpassert(nrows_global_src == nrows_global_dest)
862 cpassert(ncols_global_src == ncols_global_dest)
863 END IF
864
865 igroup_local = sub_env%group_distribution(para_env_global%mepos)
866 ngroups = sub_env%ngroups
867
868 DO igroup = 0, ngroups - 1
869 IF (igroup == igroup_local) THEN
870 CALL cp_fm_copy_general(fm_src, fm_dest_sub, para_env_global)
871 ELSE
872 CALL cp_fm_copy_general(fm_src, fm_null, para_env_global)
873 END IF
874 END DO
875
876 CALL timestop(handle)
877 END IF
879END MODULE qs_tddfpt2_subgroups
880
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition admm_types.F:599
Define the atomic kind types and their sub types.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
subroutine, public distribution_2d_release(distribution_2d)
...
Distribution methods for atoms, particles, or molecules.
subroutine, public distribute_molecules_2d(cell, atomic_kind_set, particle_set, qs_kind_set, molecule_kind_set, molecule_set, distribution_2d, blacs_env, force_env_section)
Distributes the particle pairs creating a 2d distribution optimally suited for quickstep.
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public hartree_local_release(hartree_local)
...
subroutine, public hartree_local_create(hartree_local)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public tddfpt_kernel_none
integer, parameter, public tddfpt_kernel_full
integer, parameter, public tddfpt_kernel_stda
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Define the molecule kind structure types and the corresponding functionality.
Define the data structure for the molecule information.
Define the data structure for the particle information.
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_rebuild(pw_env, qs_env, external_para_env)
rebuilds the pw_env data (necessary if cell or cutoffs change)
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
subroutine, public pw_env_retain(pw_env)
retains the pw_env (see doc/ReferenceCounting.html)
subroutine, public pw_env_release(pw_env, para_env)
releases the given pw_env (see doc/ReferenceCounting.html)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public atom2d_cleanup(atom2d)
free the internals of atom2d
subroutine, public pair_radius_setup(present_a, present_b, radius_a, radius_b, pair_radius, prmin)
...
subroutine, public build_neighbor_lists(ab_list, particle_set, atom, cell, pair_radius, subcells, mic, symmetric, molecular, subset_of_mol, current_subset, operator_type, nlname, atomb_to_keep)
Build simple pair neighbor lists.
subroutine, public atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, molecule_set, molecule_only, particle_set)
Build some distribution structure of atoms, refactored from build_qs_neighbor_lists.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public tddfpt_sub_env_init(sub_env, qs_env, mos_occ, mos_active, kernel)
Split MPI communicator to create a set of parallel (sub)groups.
subroutine, public tddfpt_sub_env_release(sub_env)
Release parallel group environment.
subroutine, public tddfpt_fm_replicate_across_subgroups(fm_src, fm_dest_sub, sub_env)
Replicate a globally distributed matrix across all sub-groups. At the end every sub-group will hold a...
subroutine, public tddfpt_dbcsr_create_by_dist(matrix, template, dbcsr_dist, sab)
Create a DBCSR matrix based on a template matrix, distribution object, and the list of neighbours.
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, basis_type, reorder_rs_grid_ranks, skip_load_balance_distributed, pw_env_external, sab_orb_external, ext_kpoints)
...
types for task lists
subroutine, public deallocate_task_list(task_list)
deallocates the components and the object itself
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
represent a full matrix
structure to store local (to a processor) ordered lists of integers.
distributes pairs on a 2d grid of processors
stores all the informations relevant to an mpi environment
contained for different pw related things
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...