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, 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, 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, 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.