74 block_offset, kind_of, basis_parameter, &
75 get_max_vals_spin, rho_beta, antisymmetric)
78 REAL(
dp),
DIMENSION(:) :: full_density
80 INTEGER,
INTENT(IN) :: number_of_p_entries
81 INTEGER,
DIMENSION(:),
POINTER :: block_offset
84 LOGICAL,
INTENT(IN) :: get_max_vals_spin
85 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: rho_beta
86 LOGICAL,
INTENT(IN) :: antisymmetric
88 INTEGER :: block_size, data_from, dest, i, iatom, icpu, ikind, iset, jatom, jkind, jset, &
89 mepos, ncpu, nseta, nsetb, pa, pa1, pb, pb1, source, source_cpu
90 INTEGER,
DIMENSION(:),
POINTER :: nsgfa, nsgfb
93 REAL(
dp),
DIMENSION(:),
POINTER :: recbuffer, sendbuffer, swapbuffer
94 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block, sparse_block_beta
99 ALLOCATE (sendbuffer(number_of_p_entries))
100 ALLOCATE (recbuffer(number_of_p_entries))
109 IF (antisymmetric .AND. iatom > jatom) symmfac = -1.0_dp
110 ikind = kind_of(iatom)
111 nseta = basis_parameter(ikind)%nset
112 nsgfa => basis_parameter(ikind)%nsgf
113 jkind = kind_of(jatom)
114 nsetb = basis_parameter(jkind)%nset
115 nsgfb => basis_parameter(jkind)%nsgf
116 IF (get_max_vals_spin)
THEN
118 row=iatom, col=jatom, block=sparse_block_beta, found=found)
123 DO pa1 = pa + 1, pa + nsgfa(iset)
124 DO pb1 = pb + 1, pb + nsgfb(jset)
125 sendbuffer(i) = max(abs(sparse_block(pa1, pb1)), abs(sparse_block_beta(pa1, pb1)))
129 pb = pb + nsgfb(jset)
131 pa = pa + nsgfa(iset)
138 DO pa1 = pa + 1, pa + nsgfa(iset)
139 DO pb1 = pb + 1, pb + nsgfb(jset)
140 sendbuffer(i) = sparse_block(pa1, pb1)*symmfac
144 pb = pb + nsgfb(jset)
146 pa = pa + nsgfa(iset)
154 ncpu = para_env%num_pe
155 mepos = para_env%mepos
156 dest =
modulo(mepos + 1, ncpu)
157 source =
modulo(mepos - 1, ncpu)
158 DO icpu = 0, ncpu - 1
159 IF (icpu .NE. ncpu - 1)
THEN
160 CALL para_env%isendrecv(sendbuffer, dest, recbuffer, source, &
163 data_from =
modulo(mepos - icpu, ncpu)
164 source_cpu =
modulo(data_from, ncpu) + 1
165 block_size = block_offset(source_cpu + 1) - block_offset(source_cpu)
166 full_density(block_offset(source_cpu):block_offset(source_cpu) + block_size - 1) = sendbuffer(1:block_size)
168 IF (icpu .NE. ncpu - 1)
THEN
171 swapbuffer => sendbuffer
172 sendbuffer => recbuffer
173 recbuffer => swapbuffer
175 DEALLOCATE (sendbuffer, recbuffer)
199 block_offset, kind_of, basis_parameter, &
200 off_diag_fac, diag_fac)
203 REAL(
dp),
DIMENSION(:) :: full_ks
205 INTEGER,
INTENT(IN) :: number_of_p_entries
206 INTEGER,
DIMENSION(:),
POINTER :: block_offset
207 INTEGER :: kind_of(*)
209 REAL(
dp),
INTENT(IN),
OPTIONAL :: off_diag_fac, diag_fac
211 INTEGER :: block_size, data_to, dest, dest_cpu, i, iatom, icpu, ikind, iset, jatom, jkind, &
212 jset, mepos, ncpu, nseta, nsetb, pa, pa1, pb, pb1, source
213 INTEGER,
DIMENSION(:),
POINTER :: nsgfa, nsgfb
214 REAL(
dp) :: my_fac, myd_fac
215 REAL(
dp),
DIMENSION(:),
POINTER :: recbuffer, sendbuffer, swapbuffer
216 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
220 my_fac = 1.0_dp; myd_fac = 1.0_dp
221 IF (
PRESENT(off_diag_fac)) my_fac = off_diag_fac
222 IF (
PRESENT(diag_fac)) myd_fac = diag_fac
224 ALLOCATE (sendbuffer(number_of_p_entries))
226 ALLOCATE (recbuffer(number_of_p_entries))
229 ncpu = para_env%num_pe
230 mepos = para_env%mepos
231 dest =
modulo(mepos + 1, ncpu)
232 source =
modulo(mepos - 1, ncpu)
238 data_to = mepos - icpu
239 dest_cpu =
modulo(data_to, ncpu) + 1
240 block_size = block_offset(dest_cpu + 1) - block_offset(dest_cpu)
241 sendbuffer(1:block_size) = sendbuffer(1:block_size) + full_ks(block_offset(dest_cpu):block_offset(dest_cpu) + block_size - 1)
242 IF (icpu .EQ. ncpu)
EXIT
243 CALL para_env%isendrecv(sendbuffer, dest, recbuffer, source, &
247 swapbuffer => sendbuffer
248 sendbuffer => recbuffer
249 recbuffer => swapbuffer
259 ikind = kind_of(iatom)
260 nseta = basis_parameter(ikind)%nset
261 nsgfa => basis_parameter(ikind)%nsgf
262 jkind = kind_of(jatom)
263 nsetb = basis_parameter(jkind)%nset
264 nsgfb => basis_parameter(jkind)%nsgf
269 DO pa1 = pa + 1, pa + nsgfa(iset)
270 DO pb1 = pb + 1, pb + nsgfb(jset)
271 IF (iatom == jatom .AND. pa1 == pb1)
THEN
272 sparse_block(pa1, pb1) = sendbuffer(i)*myd_fac + sparse_block(pa1, pb1)
274 sparse_block(pa1, pb1) = sendbuffer(i)*my_fac + sparse_block(pa1, pb1)
279 pb = pb + nsgfb(jset)
281 pa = pa + nsgfa(iset)
286 DEALLOCATE (sendbuffer, recbuffer)
310 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
311 INTEGER,
INTENT(IN) :: irep
312 REAL(
dp),
INTENT(IN) :: scaling_factor
314 INTEGER :: iatom, ikind, img, natom, nimages, nspins
315 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, last_sgf_global
316 REAL(
dp),
DIMENSION(:, :),
POINTER :: full_ks
320 TYPE(
hfx_type),
POINTER :: actual_x_data
325 NULLIFY (dft_control)
326 actual_x_data => qs_env%x_data(irep, 1)
327 basis_parameter => actual_x_data%basis_parameter
330 atomic_kind_set=atomic_kind_set, &
331 particle_set=particle_set, &
332 dft_control=dft_control)
334 nspins = dft_control%nspins
335 nimages = dft_control%nimages
336 cpassert(nimages == 1)
340 natom =
SIZE(particle_set, 1)
341 ALLOCATE (last_sgf_global(0:natom))
342 last_sgf_global(0) = 0
344 ikind = kind_of(iatom)
345 last_sgf_global(iatom) = last_sgf_global(iatom - 1) + basis_parameter(ikind)%nsgf_total
347 full_ks => actual_x_data%full_ks_alpha
348 IF (scaling_factor /= 1.0_dp)
THEN
349 full_ks = full_ks*scaling_factor
352 CALL distribute_ks_matrix(para_env, full_ks(:, img), ks_matrix(1, img)%matrix, actual_x_data%number_of_p_entries, &
353 actual_x_data%block_offset, kind_of, basis_parameter, &
356 DEALLOCATE (actual_x_data%full_ks_alpha)
358 IF (nspins == 2)
THEN
359 full_ks => actual_x_data%full_ks_beta
360 IF (scaling_factor /= 1.0_dp)
THEN
361 full_ks = full_ks*scaling_factor
364 CALL distribute_ks_matrix(para_env, full_ks(:, img), ks_matrix(2, img)%matrix, actual_x_data%number_of_p_entries, &
365 actual_x_data%block_offset, kind_of, basis_parameter, &
368 DEALLOCATE (actual_x_data%full_ks_beta)
371 DEALLOCATE (last_sgf_global)
422 is_assoc_atomic_block, number_of_p_entries, &
423 para_env, atomic_block_offset, set_offset, &
424 block_offset, map_atoms_to_cpus, nkind)
428 INTEGER,
DIMENSION(:) :: kind_of
429 INTEGER,
DIMENSION(:, :),
INTENT(OUT) :: is_assoc_atomic_block
430 INTEGER,
INTENT(OUT) :: number_of_p_entries
432 INTEGER,
DIMENSION(:, :),
POINTER :: atomic_block_offset
433 INTEGER,
DIMENSION(:, :, :, :),
POINTER :: set_offset
434 INTEGER,
DIMENSION(:),
POINTER :: block_offset
435 TYPE(
hfx_2d_map),
DIMENSION(:),
POINTER :: map_atoms_to_cpus
438 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_atomic_block_maps'
440 INTEGER :: handle, iatom, ibuf, icpu, ikind, ilist, iset, itask, jatom, jkind, jset, natom, &
441 ncpu, nseta, nsetb, number_of_p_blocks, offset, tmp(2)
442 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: buffer_in, buffer_out, counter, rcount, &
444 INTEGER,
DIMENSION(:),
POINTER :: iatom_list, jatom_list, nsgfa, nsgfb
445 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: sparse_block
448 CALL timeset(routinen, handle)
450 is_assoc_atomic_block = 0
451 number_of_p_entries = 0
452 number_of_p_blocks = 0
460 ikind = kind_of(iatom)
461 jkind = kind_of(jatom)
462 number_of_p_blocks = number_of_p_blocks + 1
463 number_of_p_entries = number_of_p_entries + &
464 basis_parameter(ikind)%nsgf_total*basis_parameter(jkind)%nsgf_total
468 tmp = (/number_of_p_entries, number_of_p_blocks/)
469 CALL para_env%max(tmp)
470 number_of_p_entries = tmp(1)
471 number_of_p_blocks = tmp(2)
476 ALLOCATE (buffer_in(3*number_of_p_blocks))
477 ALLOCATE (buffer_out(3*number_of_p_blocks*para_env%num_pe))
478 ALLOCATE (rcount(para_env%num_pe), rdispl(para_env%num_pe))
487 buffer_in(ibuf + 1) = iatom
488 buffer_in(ibuf + 2) = jatom
489 buffer_in(ibuf + 3) = para_env%mepos + 1
494 rcount =
SIZE(buffer_in)
496 DO icpu = 2, para_env%num_pe
497 rdispl(icpu) = rdispl(icpu - 1) + rcount(icpu - 1)
499 CALL para_env%allgatherv(buffer_in, buffer_out, rcount, rdispl)
501 DO ibuf = 0, number_of_p_blocks*para_env%num_pe*3 - 3, 3
502 itask = buffer_out(ibuf + 3)
505 IF (itask .NE. 0)
THEN
506 iatom = buffer_out(ibuf + 1)
507 jatom = buffer_out(ibuf + 2)
508 is_assoc_atomic_block(iatom, jatom) = itask
509 is_assoc_atomic_block(jatom, iatom) = itask
513 IF (
ASSOCIATED(map_atoms_to_cpus))
THEN
514 DO icpu = 1, para_env%num_pe
515 DEALLOCATE (map_atoms_to_cpus(icpu)%iatom_list)
516 DEALLOCATE (map_atoms_to_cpus(icpu)%jatom_list)
518 DEALLOCATE (map_atoms_to_cpus)
521 natom =
SIZE(is_assoc_atomic_block, 1)
522 ALLOCATE (map_atoms_to_cpus(para_env%num_pe))
523 ALLOCATE (counter(para_env%num_pe))
527 DO jatom = iatom, natom
528 icpu = is_assoc_atomic_block(jatom, iatom)
529 IF (icpu > 0) counter(icpu) = counter(icpu) + 1
532 DO icpu = 1, para_env%num_pe
533 ALLOCATE (map_atoms_to_cpus(icpu)%iatom_list(counter(icpu)))
534 ALLOCATE (map_atoms_to_cpus(icpu)%jatom_list(counter(icpu)))
538 DO jatom = iatom, natom
539 icpu = is_assoc_atomic_block(jatom, iatom)
541 counter(icpu) = counter(icpu) + 1
542 map_atoms_to_cpus(icpu)%jatom_list(counter(icpu)) = jatom
543 map_atoms_to_cpus(icpu)%iatom_list(counter(icpu)) = iatom
550 ncpu = para_env%num_pe
552 atomic_block_offset = 0
555 iatom_list => map_atoms_to_cpus(icpu)%iatom_list
556 jatom_list => map_atoms_to_cpus(icpu)%jatom_list
557 block_offset(icpu) = offset
558 DO ilist = 1,
SIZE(iatom_list)
559 iatom = iatom_list(ilist)
560 ikind = kind_of(iatom)
561 jatom = jatom_list(ilist)
562 jkind = kind_of(jatom)
563 atomic_block_offset(iatom, jatom) = offset
564 atomic_block_offset(jatom, iatom) = offset
565 offset = offset + basis_parameter(ikind)%nsgf_total*basis_parameter(jkind)%nsgf_total
568 block_offset(ncpu + 1) = offset
571 nseta = basis_parameter(ikind)%nset
572 nsgfa => basis_parameter(ikind)%nsgf
574 nsetb = basis_parameter(jkind)%nset
575 nsgfb => basis_parameter(jkind)%nsgf
579 set_offset(jset, iset, jkind, ikind) = offset
580 offset = offset + nsgfa(iset)*nsgfb(jset)
586 CALL timestop(handle)
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, 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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.