98 t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, &
99 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, &
100 starts_array_mc, ends_array_mc, &
101 mo_coeff, matrix_s, &
102 gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, &
105 t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, &
106 qs_env, unit_nr, do_alpha)
108 TYPE(dbt_type),
DIMENSION(:, :) :: t_3c_overl_int
111 TYPE(dbt_type) :: t_3c_overl_int_ao_mo
113 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_o_mo_ind
114 TYPE(dbt_type) :: t_3c_overl_int_gw_ri, &
116 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc
119 INTEGER,
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo, &
122 LOGICAL,
INTENT(IN) :: do_ic_model
123 TYPE(dbt_type) :: t_3c_overl_nnp_ic, &
124 t_3c_overl_nnp_ic_reflected
126 INTEGER,
INTENT(IN) :: unit_nr
127 LOGICAL,
INTENT(IN),
OPTIONAL :: do_alpha
129 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_tensor_3c_overl_int_gw'
131 INTEGER :: cut_memory, handle, i_mem, icol_global, imo, irow_global, min_bsize, &
132 min_bsize_mo, nkind, nmo_blk_gw, npcols, nprows, size_mo, unit_nr_prv
133 INTEGER(int_8) :: nze
134 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist1, dist2, dist3, sizes_ao, &
135 sizes_ao_split, sizes_mo, sizes_mo_1, &
136 sizes_ri, sizes_ri_split, tmp
137 INTEGER,
DIMENSION(2) :: pdims_2d
138 INTEGER,
DIMENSION(2, 1) :: bounds
139 INTEGER,
DIMENSION(2, 3) :: ibounds
140 INTEGER,
DIMENSION(3) :: bounds_3c, pdims
141 INTEGER,
DIMENSION(:),
POINTER :: distp_1, distp_2, sizes_mo_blocked, &
142 sizes_mo_p1, sizes_mo_p2
143 LOGICAL :: memory_info, my_do_alpha
144 REAL(
dp) :: compression_factor, memory_3c, occ
145 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: norm
149 TYPE(
dbcsr_type) :: mat_mo_coeff_gw_reflected_norm, &
150 mat_norm, mat_norm_diag, mat_work
151 TYPE(
dbcsr_type),
POINTER :: mat_mo_coeff_gw, &
152 mat_mo_coeff_gw_reflected
153 TYPE(dbt_pgrid_type) :: pgrid_2d, pgrid_ao, pgrid_ic, pgrid_mo
154 TYPE(dbt_type) :: mo_coeff_gw_t, mo_coeff_gw_t_tmp, &
155 t_3c_overl_int_ao_ao, &
156 t_3c_overl_int_mo_ao, &
160 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
162 memory_info = qs_env%mp2_env%ri_rpa_im_time%memory_info
163 IF (memory_info)
THEN
164 unit_nr_prv = unit_nr
169 my_do_alpha = .false.
170 IF (
PRESENT(do_alpha)) my_do_alpha = do_alpha
172 CALL timeset(routinen, handle)
174 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, particle_set=particle_set, atomic_kind_set=atomic_kind_set)
176 CALL cp_fm_create(fm_mat_mo_coeff_gw, mo_coeff%matrix_struct)
180 DO irow_global = 1, nmo
181 DO icol_global = 1, homo - gw_corr_lev_occ
184 DO icol_global = homo + gw_corr_lev_virt + 1, nmo
189 NULLIFY (mat_mo_coeff_gw)
193 sym=dbcsr_type_no_symmetry)
197 keep_sparsity=.false.)
202 min_bsize = qs_env%mp2_env%ri_rpa_im_time%min_bsize
203 min_bsize_mo = qs_env%mp2_env%ri_rpa_im_time%min_bsize_mo
205 CALL split_block_sizes([gw_corr_lev_occ + gw_corr_lev_virt], sizes_mo, min_bsize_mo)
206 ALLOCATE (sizes_mo_1(nmo))
209 nmo_blk_gw =
SIZE(sizes_mo)
210 CALL move_alloc(sizes_mo, tmp)
211 ALLOCATE (sizes_mo(nmo_blk_gw + 2))
212 sizes_mo(1) = homo - gw_corr_lev_occ
213 sizes_mo(2:
SIZE(tmp) + 1) = tmp(:)
214 sizes_mo(
SIZE(tmp) + 2) = nmo - (homo + gw_corr_lev_virt)
216 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
218 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
220 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
222 CALL pgf_block_sizes(atomic_kind_set, basis_set_ao, min_bsize, sizes_ao_split)
223 CALL pgf_block_sizes(atomic_kind_set, basis_set_ri_aux, min_bsize, sizes_ri_split)
225 DEALLOCATE (basis_set_ao, basis_set_ri_aux)
228 CALL dbt_pgrid_create(para_env, pdims, pgrid_ao, &
229 tensor_dims=[
SIZE(sizes_ri_split),
SIZE(sizes_ao_split),
SIZE(sizes_ao_split)])
235 pdims = [pdims_2d(1), pdims_2d(2), 1]
236 CALL dbt_pgrid_create(para_env, pdims, pgrid_mo, &
237 tensor_dims=[
SIZE(sizes_ri_split),
SIZE(sizes_ao_split), 1])
240 CALL dbt_pgrid_create(para_env, pdims_2d, pgrid_2d, &
241 tensor_dims=[
SIZE(sizes_ao_split), nmo])
243 CALL create_3c_tensor(t_3c_overl_int_ao_ao, dist1, dist2, dist3, pgrid_ao, &
244 sizes_ri_split, sizes_ao_split, sizes_ao_split, [1, 2], [3], name=
"(RI AO | AO)")
245 DEALLOCATE (dist1, dist2, dist3)
247 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
248 CALL create_3c_tensor(t_3c_overl_int_ao_mo, dist1, dist2, dist3, pgrid_ao, &
249 sizes_ri_split, sizes_ao_split, sizes_mo_1, [1, 2], [3], name=
"(RI AO | MO)")
250 DEALLOCATE (dist1, dist2, dist3)
253 CALL create_3c_tensor(t_3c_overl_int_gw_ri, dist1, dist2, dist3, pgrid_mo, &
254 sizes_ri_split, sizes_ao_split, sizes_mo, [1], [2, 3], name=
"(RI | AO MO)")
255 DEALLOCATE (dist1, dist2, dist3)
257 CALL create_3c_tensor(t_3c_overl_int_gw_ao, dist1, dist2, dist3, pgrid_mo, &
258 sizes_ao_split, sizes_ri_split, sizes_mo, [1], [2, 3], name=
"(AO | RI MO)")
259 DEALLOCATE (dist1, dist2, dist3)
261 CALL dbt_pgrid_destroy(pgrid_ao)
262 CALL dbt_pgrid_destroy(pgrid_mo)
264 CALL create_2c_tensor(mo_coeff_gw_t, dist1, dist2, pgrid_2d, sizes_ao_split, sizes_mo_1, name=
"(AO|MO)")
265 DEALLOCATE (dist1, dist2)
266 CALL dbt_pgrid_destroy(pgrid_2d)
268 CALL dbt_create(mat_mo_coeff_gw, mo_coeff_gw_t_tmp, name=
"MO coeffs")
269 CALL dbt_copy_matrix_to_tensor(mat_mo_coeff_gw, mo_coeff_gw_t_tmp)
271 CALL dbt_copy(mo_coeff_gw_t_tmp, mo_coeff_gw_t)
273 bounds(1, 1) = homo - gw_corr_lev_occ + 1
274 bounds(2, 1) = homo + gw_corr_lev_virt
276 CALL dbt_get_info(t_3c_overl_int_ao_ao, nfull_total=bounds_3c)
278 ibounds(:, 1) = [1, bounds_3c(1)]
279 ibounds(:, 3) = [1, bounds_3c(3)]
281 cut_memory =
SIZE(starts_array_mc)
283 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
284 DO i_mem = 1, cut_memory
285 CALL decompress_tensor(t_3c_overl_int(1, 1), t_3c_o_ind(1, 1, i_mem)%ind, t_3c_o_compressed(1, 1, i_mem), &
286 qs_env%mp2_env%ri_rpa_im_time%eps_compress)
288 ibounds(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
290 CALL dbt_copy(t_3c_overl_int(1, 1), t_3c_overl_int_ao_ao, move_data=.true.)
292 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_ao_ao, 1.0_dp, &
293 t_3c_overl_int_ao_mo, contract_1=[1], notcontract_1=[2], &
294 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
295 bounds_2=ibounds, move_data=.false., unit_nr=unit_nr_prv)
302 IF (do_ic_model)
THEN
304 CALL dbt_pgrid_create(para_env, pdims, pgrid_ic, &
305 tensor_dims=[
SIZE(sizes_ri_split), nmo, nmo])
307 CALL create_3c_tensor(t_3c_overl_int_mo_ao, dist1, dist2, dist3, pgrid_ic, &
308 sizes_ri_split, sizes_mo_1, sizes_ao_split, [1, 2], [3], name=
"(RI MO | AO)")
309 DEALLOCATE (dist1, dist2, dist3)
310 CALL create_3c_tensor(t_3c_overl_int_mo_mo, dist1, dist2, dist3, pgrid_ic, &
311 sizes_ri_split, sizes_mo_1, sizes_mo_1, [1, 2], [3], name=
"(RI MO | MO)")
312 DEALLOCATE (dist1, dist2, dist3)
313 CALL dbt_create(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic)
314 CALL create_3c_tensor(t_3c_overl_nnp_ic_reflected, dist1, dist2, dist3, pgrid_ic, &
315 sizes_ri_split, sizes_mo_1, sizes_mo_1, [1], [2, 3], name=
"(RI | MO MO)")
316 DEALLOCATE (dist1, dist2, dist3)
318 CALL dbt_pgrid_destroy(pgrid_ic)
320 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_mo_ao, order=[1, 3, 2])
321 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_mo_ao, 0.0_dp, &
322 t_3c_overl_int_mo_mo, contract_1=[1], notcontract_1=[2], &
323 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
324 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
325 CALL dbt_copy(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic)
327 NULLIFY (mat_mo_coeff_gw_reflected)
331 sym=dbcsr_type_no_symmetry)
333 CALL reflect_mat_row(mat_mo_coeff_gw_reflected, mat_mo_coeff_gw, para_env, qs_env, unit_nr, do_alpha=my_do_alpha)
337 CALL dbcsr_create(matrix=mat_work, template=mat_mo_coeff_gw_reflected, matrix_type=dbcsr_type_no_symmetry)
339 CALL dbcsr_get_info(mat_work, distribution=dist_templ, nblkcols_total=size_mo, col_blk_size=sizes_mo_blocked)
343 ALLOCATE (distp_1(size_mo), distp_2(size_mo))
344 CALL dbt_default_distvec(size_mo, nprows, sizes_mo_blocked, distp_1)
345 CALL dbt_default_distvec(size_mo, npcols, sizes_mo_blocked, distp_2)
346 CALL dbcsr_distribution_new(dist, template=dist_templ, row_dist=distp_1, col_dist=distp_2, reuse_arrays=.true.)
348 ALLOCATE (sizes_mo_p1(size_mo))
349 ALLOCATE (sizes_mo_p2(size_mo))
350 sizes_mo_p1(:) = sizes_mo_blocked
351 sizes_mo_p2(:) = sizes_mo_blocked
352 CALL dbcsr_create(mat_norm,
"mo norm", dist, dbcsr_type_no_symmetry, sizes_mo_p1, sizes_mo_p2, &
356 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_s(1)%matrix, mat_mo_coeff_gw_reflected, 0.0_dp, mat_work)
357 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mat_mo_coeff_gw_reflected, mat_work, 0.0_dp, mat_norm)
365 CALL para_env%sum(norm)
367 DO imo = bounds(1, 1), bounds(2, 1)
368 norm(imo) = 1.0_dp/sqrt(norm(imo))
378 CALL dbcsr_create(mat_mo_coeff_gw_reflected_norm, template=mat_mo_coeff_gw_reflected)
379 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mat_mo_coeff_gw_reflected, mat_norm_diag, 0.0_dp, mat_mo_coeff_gw_reflected_norm)
382 CALL dbcsr_filter(mat_mo_coeff_gw_reflected_norm, 1.0e-20_dp)
384 CALL dbt_copy_matrix_to_tensor(mat_mo_coeff_gw_reflected_norm, mo_coeff_gw_t_tmp)
386 CALL dbt_copy(mo_coeff_gw_t_tmp, mo_coeff_gw_t)
388 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_ao_ao, 0.0_dp, &
389 t_3c_overl_int_ao_mo, contract_1=[1], notcontract_1=[2], &
390 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
391 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
393 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_mo_ao, order=[1, 3, 2])
394 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_mo_ao, 0.0_dp, &
395 t_3c_overl_int_mo_mo, contract_1=[1], notcontract_1=[2], &
396 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
397 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
398 CALL dbt_copy(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic_reflected)
399 CALL dbt_destroy(t_3c_overl_int_mo_ao)
400 CALL dbt_destroy(t_3c_overl_int_mo_mo)
406 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
411 CALL compress_tensor(t_3c_overl_int_ao_mo, t_3c_o_mo_ind, t_3c_o_mo_compressed, &
412 qs_env%mp2_env%ri_rpa_im_time%eps_compress, memory_3c)
414 CALL para_env%sum(memory_3c)
415 compression_factor = real(nze,
dp)*1.0e-06_dp*8.0_dp/memory_3c
417 IF (unit_nr > 0)
THEN
418 WRITE (unit=unit_nr, fmt=
"((T3,A,T66,F11.2,A4))") &
419 "MEMORY_INFO| Memory of MO-contracted tensor (compressed):", memory_3c,
' MiB'
421 WRITE (unit=unit_nr, fmt=
"((T3,A,T60,F21.2))") &
422 "MEMORY_INFO| Compression factor: ", compression_factor
428 CALL dbt_destroy(t_3c_overl_int_ao_ao)
429 CALL dbt_destroy(mo_coeff_gw_t)
430 CALL dbt_destroy(mo_coeff_gw_t_tmp)
432 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, 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.