178 t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, &
179 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, &
180 starts_array_mc, ends_array_mc, &
181 mo_coeff, matrix_s, &
182 gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, &
185 t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, &
186 qs_env, unit_nr, do_alpha)
188 TYPE(dbt_type),
DIMENSION(:, :) :: t_3c_overl_int
191 TYPE(dbt_type) :: t_3c_overl_int_ao_mo
193 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_o_mo_ind
194 TYPE(dbt_type) :: t_3c_overl_int_gw_ri, &
196 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc
199 INTEGER,
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo, &
202 LOGICAL,
INTENT(IN) :: do_ic_model
203 TYPE(dbt_type) :: t_3c_overl_nnp_ic, &
204 t_3c_overl_nnp_ic_reflected
206 INTEGER,
INTENT(IN) :: unit_nr
207 LOGICAL,
INTENT(IN),
OPTIONAL :: do_alpha
209 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_tensor_3c_overl_int_gw'
211 INTEGER :: cut_memory, handle, i_mem, icol_global, imo, irow_global, min_bsize, &
212 min_bsize_mo, nkind, nmo_blk_gw, npcols, nprows, size_mo, unit_nr_prv
213 INTEGER(int_8) :: nze
214 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist1, dist2, dist3, sizes_ao, &
215 sizes_ao_split, sizes_mo, sizes_mo_1, &
216 sizes_ri, sizes_ri_split, tmp
217 INTEGER,
DIMENSION(2) :: pdims_2d
218 INTEGER,
DIMENSION(2, 1) :: bounds
219 INTEGER,
DIMENSION(2, 3) :: ibounds
220 INTEGER,
DIMENSION(3) :: bounds_3c, pdims
221 INTEGER,
DIMENSION(:),
POINTER :: distp_1, distp_2, sizes_mo_blocked, &
222 sizes_mo_p1, sizes_mo_p2
223 LOGICAL :: memory_info, my_do_alpha
224 REAL(
dp) :: compression_factor, memory_3c, occ
225 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: norm
229 TYPE(
dbcsr_type) :: mat_mo_coeff_gw_reflected_norm, &
230 mat_norm, mat_norm_diag, mat_work
231 TYPE(
dbcsr_type),
POINTER :: mat_mo_coeff_gw, &
232 mat_mo_coeff_gw_reflected
233 TYPE(dbt_pgrid_type) :: pgrid_2d, pgrid_ao, pgrid_ic, pgrid_mo
234 TYPE(dbt_type) :: mo_coeff_gw_t, mo_coeff_gw_t_tmp, &
235 t_3c_overl_int_ao_ao, &
236 t_3c_overl_int_mo_ao, &
240 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
242 memory_info = qs_env%mp2_env%ri_rpa_im_time%memory_info
243 IF (memory_info)
THEN
244 unit_nr_prv = unit_nr
249 my_do_alpha = .false.
250 IF (
PRESENT(do_alpha)) my_do_alpha = do_alpha
252 CALL timeset(routinen, handle)
254 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, particle_set=particle_set, atomic_kind_set=atomic_kind_set)
256 CALL cp_fm_create(fm_mat_mo_coeff_gw, mo_coeff%matrix_struct)
260 DO irow_global = 1, nmo
261 DO icol_global = 1, homo - gw_corr_lev_occ
264 DO icol_global = homo + gw_corr_lev_virt + 1, nmo
269 NULLIFY (mat_mo_coeff_gw)
273 sym=dbcsr_type_no_symmetry)
277 keep_sparsity=.false.)
282 min_bsize = qs_env%mp2_env%ri_rpa_im_time%min_bsize
283 min_bsize_mo = qs_env%mp2_env%ri_rpa_im_time%min_bsize_mo
285 CALL split_block_sizes([gw_corr_lev_occ + gw_corr_lev_virt], sizes_mo, min_bsize_mo)
286 ALLOCATE (sizes_mo_1(nmo))
289 nmo_blk_gw =
SIZE(sizes_mo)
290 CALL move_alloc(sizes_mo, tmp)
291 ALLOCATE (sizes_mo(nmo_blk_gw + 2))
292 sizes_mo(1) = homo - gw_corr_lev_occ
293 sizes_mo(2:
SIZE(tmp) + 1) = tmp(:)
294 sizes_mo(
SIZE(tmp) + 2) = nmo - (homo + gw_corr_lev_virt)
296 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
298 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
300 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
302 CALL pgf_block_sizes(atomic_kind_set, basis_set_ao, min_bsize, sizes_ao_split)
303 CALL pgf_block_sizes(atomic_kind_set, basis_set_ri_aux, min_bsize, sizes_ri_split)
305 DEALLOCATE (basis_set_ao, basis_set_ri_aux)
308 CALL dbt_pgrid_create(para_env, pdims, pgrid_ao, &
309 tensor_dims=[
SIZE(sizes_ri_split),
SIZE(sizes_ao_split),
SIZE(sizes_ao_split)])
315 pdims = [pdims_2d(1), pdims_2d(2), 1]
316 CALL dbt_pgrid_create(para_env, pdims, pgrid_mo, &
317 tensor_dims=[
SIZE(sizes_ri_split),
SIZE(sizes_ao_split), 1])
320 CALL dbt_pgrid_create(para_env, pdims_2d, pgrid_2d, &
321 tensor_dims=[
SIZE(sizes_ao_split), nmo])
323 CALL create_3c_tensor(t_3c_overl_int_ao_ao, dist1, dist2, dist3, pgrid_ao, &
324 sizes_ri_split, sizes_ao_split, sizes_ao_split, [1, 2], [3], name=
"(RI AO | AO)")
325 DEALLOCATE (dist1, dist2, dist3)
327 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
328 CALL create_3c_tensor(t_3c_overl_int_ao_mo, dist1, dist2, dist3, pgrid_ao, &
329 sizes_ri_split, sizes_ao_split, sizes_mo_1, [1, 2], [3], name=
"(RI AO | MO)")
330 DEALLOCATE (dist1, dist2, dist3)
333 CALL create_3c_tensor(t_3c_overl_int_gw_ri, dist1, dist2, dist3, pgrid_mo, &
334 sizes_ri_split, sizes_ao_split, sizes_mo, [1], [2, 3], name=
"(RI | AO MO)")
335 DEALLOCATE (dist1, dist2, dist3)
337 CALL create_3c_tensor(t_3c_overl_int_gw_ao, dist1, dist2, dist3, pgrid_mo, &
338 sizes_ao_split, sizes_ri_split, sizes_mo, [1], [2, 3], name=
"(AO | RI MO)")
339 DEALLOCATE (dist1, dist2, dist3)
341 CALL dbt_pgrid_destroy(pgrid_ao)
342 CALL dbt_pgrid_destroy(pgrid_mo)
344 CALL create_2c_tensor(mo_coeff_gw_t, dist1, dist2, pgrid_2d, sizes_ao_split, sizes_mo_1, name=
"(AO|MO)")
345 DEALLOCATE (dist1, dist2)
346 CALL dbt_pgrid_destroy(pgrid_2d)
348 CALL dbt_create(mat_mo_coeff_gw, mo_coeff_gw_t_tmp, name=
"MO coeffs")
349 CALL dbt_copy_matrix_to_tensor(mat_mo_coeff_gw, mo_coeff_gw_t_tmp)
351 CALL dbt_copy(mo_coeff_gw_t_tmp, mo_coeff_gw_t)
353 bounds(1, 1) = homo - gw_corr_lev_occ + 1
354 bounds(2, 1) = homo + gw_corr_lev_virt
356 CALL dbt_get_info(t_3c_overl_int_ao_ao, nfull_total=bounds_3c)
358 ibounds(:, 1) = [1, bounds_3c(1)]
359 ibounds(:, 3) = [1, bounds_3c(3)]
361 cut_memory =
SIZE(starts_array_mc)
363 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
364 DO i_mem = 1, cut_memory
365 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), &
366 qs_env%mp2_env%ri_rpa_im_time%eps_compress)
368 ibounds(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
370 CALL dbt_copy(t_3c_overl_int(1, 1), t_3c_overl_int_ao_ao, move_data=.true.)
372 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_ao_ao, 1.0_dp, &
373 t_3c_overl_int_ao_mo, contract_1=[1], notcontract_1=[2], &
374 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
375 bounds_2=ibounds, move_data=.false., unit_nr=unit_nr_prv)
382 IF (do_ic_model)
THEN
384 CALL dbt_pgrid_create(para_env, pdims, pgrid_ic, &
385 tensor_dims=[
SIZE(sizes_ri_split), nmo, nmo])
387 CALL create_3c_tensor(t_3c_overl_int_mo_ao, dist1, dist2, dist3, pgrid_ic, &
388 sizes_ri_split, sizes_mo_1, sizes_ao_split, [1, 2], [3], name=
"(RI MO | AO)")
389 DEALLOCATE (dist1, dist2, dist3)
390 CALL create_3c_tensor(t_3c_overl_int_mo_mo, dist1, dist2, dist3, pgrid_ic, &
391 sizes_ri_split, sizes_mo_1, sizes_mo_1, [1, 2], [3], name=
"(RI MO | MO)")
392 DEALLOCATE (dist1, dist2, dist3)
393 CALL dbt_create(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic)
394 CALL create_3c_tensor(t_3c_overl_nnp_ic_reflected, dist1, dist2, dist3, pgrid_ic, &
395 sizes_ri_split, sizes_mo_1, sizes_mo_1, [1], [2, 3], name=
"(RI | MO MO)")
396 DEALLOCATE (dist1, dist2, dist3)
398 CALL dbt_pgrid_destroy(pgrid_ic)
400 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_mo_ao, order=[1, 3, 2])
401 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_mo_ao, 0.0_dp, &
402 t_3c_overl_int_mo_mo, contract_1=[1], notcontract_1=[2], &
403 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
404 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
405 CALL dbt_copy(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic)
407 NULLIFY (mat_mo_coeff_gw_reflected)
411 sym=dbcsr_type_no_symmetry)
413 CALL reflect_mat_row(mat_mo_coeff_gw_reflected, mat_mo_coeff_gw, para_env, qs_env, unit_nr, do_alpha=my_do_alpha)
417 CALL dbcsr_create(matrix=mat_work, template=mat_mo_coeff_gw_reflected, matrix_type=dbcsr_type_no_symmetry)
419 CALL dbcsr_get_info(mat_work, distribution=dist_templ, nblkcols_total=size_mo, col_blk_size=sizes_mo_blocked)
423 ALLOCATE (distp_1(size_mo), distp_2(size_mo))
424 CALL dbt_default_distvec(size_mo, nprows, sizes_mo_blocked, distp_1)
425 CALL dbt_default_distvec(size_mo, npcols, sizes_mo_blocked, distp_2)
426 CALL dbcsr_distribution_new(dist, template=dist_templ, row_dist=distp_1, col_dist=distp_2, reuse_arrays=.true.)
428 ALLOCATE (sizes_mo_p1(size_mo))
429 ALLOCATE (sizes_mo_p2(size_mo))
430 sizes_mo_p1(:) = sizes_mo_blocked
431 sizes_mo_p2(:) = sizes_mo_blocked
432 CALL dbcsr_create(mat_norm,
"mo norm", dist, dbcsr_type_no_symmetry, sizes_mo_p1, sizes_mo_p2, &
436 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_s(1)%matrix, mat_mo_coeff_gw_reflected, 0.0_dp, mat_work)
437 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mat_mo_coeff_gw_reflected, mat_work, 0.0_dp, mat_norm)
445 CALL para_env%sum(norm)
447 DO imo = bounds(1, 1), bounds(2, 1)
448 norm(imo) = 1.0_dp/sqrt(norm(imo))
458 CALL dbcsr_create(mat_mo_coeff_gw_reflected_norm, template=mat_mo_coeff_gw_reflected)
459 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)
462 CALL dbcsr_filter(mat_mo_coeff_gw_reflected_norm, 1.0e-20_dp)
464 CALL dbt_copy_matrix_to_tensor(mat_mo_coeff_gw_reflected_norm, mo_coeff_gw_t_tmp)
466 CALL dbt_copy(mo_coeff_gw_t_tmp, mo_coeff_gw_t)
468 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_ao_ao, 0.0_dp, &
469 t_3c_overl_int_ao_mo, contract_1=[1], notcontract_1=[2], &
470 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
471 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
473 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_mo_ao, order=[1, 3, 2])
474 CALL dbt_contract(1.0_dp, mo_coeff_gw_t, t_3c_overl_int_mo_ao, 0.0_dp, &
475 t_3c_overl_int_mo_mo, contract_1=[1], notcontract_1=[2], &
476 contract_2=[3], notcontract_2=[1, 2], map_1=[3], map_2=[1, 2], &
477 bounds_2=bounds, move_data=.false., unit_nr=unit_nr_prv)
478 CALL dbt_copy(t_3c_overl_int_mo_mo, t_3c_overl_nnp_ic_reflected)
479 CALL dbt_destroy(t_3c_overl_int_mo_ao)
480 CALL dbt_destroy(t_3c_overl_int_mo_mo)
486 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
491 CALL compress_tensor(t_3c_overl_int_ao_mo, t_3c_o_mo_ind, t_3c_o_mo_compressed, &
492 qs_env%mp2_env%ri_rpa_im_time%eps_compress, memory_3c)
494 CALL para_env%sum(memory_3c)
495 compression_factor = real(nze,
dp)*1.0e-06_dp*8.0_dp/memory_3c
497 IF (unit_nr > 0)
THEN
498 WRITE (unit=unit_nr, fmt=
"((T3,A,T66,F11.2,A4))") &
499 "MEMORY_INFO| Memory of MO-contracted tensor (compressed):", memory_3c,
' MiB'
501 WRITE (unit=unit_nr, fmt=
"((T3,A,T60,F21.2))") &
502 "MEMORY_INFO| Compression factor: ", compression_factor
508 CALL dbt_destroy(t_3c_overl_int_ao_ao)
509 CALL dbt_destroy(mo_coeff_gw_t)
510 CALL dbt_destroy(mo_coeff_gw_t_tmp)
512 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.