66 SUBROUTINE zeroth_order_gw(qs_env, Aop_evects, evects, S_evects, gs_mos, matrix_s, matrix_ks)
68 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: aop_evects
69 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects, s_evects
72 TYPE(
dbcsr_type),
INTENT(in),
POINTER :: matrix_s
73 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(in) :: matrix_ks
75 CHARACTER(LEN=*),
PARAMETER :: routinen =
'zeroth_order_gw'
77 INTEGER :: handle, i, ispin, ivect, j, nactive, &
78 nao, nmo, nspins, nvects, occ, virt
79 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: gw_occ, gw_virt
82 TYPE(
cp_fm_type) :: fms, hevec, matrixtmp, matrixtmp2, &
83 matrixtmp3, sweighted_vect, &
91 CALL timeset(routinen, handle)
93 NULLIFY (ex_env, sab_orb)
94 CALL get_qs_env(qs_env, exstate_env=ex_env, sab_orb=sab_orb)
96 nspins =
SIZE(matrix_ks, 1)
97 nspins =
SIZE(evects, 1)
98 nvects =
SIZE(evects, 2)
102 cpassert(.NOT.
ASSOCIATED(gs_mos(ispin)%evals_occ_matrix))
105 nmo =
SIZE(ex_env%gw_eigen)
106 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
107 nrow_global=nao, ncol_global=nactive)
108 NULLIFY (blacs_env, para_env)
109 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
111 occ =
SIZE(gs_mos(ispin)%evals_occ)
112 nactive = gs_mos(ispin)%nmo_active
113 nmo =
SIZE(ex_env%gw_eigen)
114 virt =
SIZE(gs_mos(ispin)%evals_virt)
117 context=blacs_env, nrow_global=virt, ncol_global=virt)
123 context=blacs_env, nrow_global=virt, ncol_global=nao)
129 context=blacs_env, nrow_global=nao, ncol_global=nao)
137 CALL cp_fm_create(weighted_vect, gs_mos(ispin)%mos_virt%matrix_struct)
138 CALL cp_fm_create(sweighted_vect, gs_mos(ispin)%mos_virt%matrix_struct)
139 CALL cp_fm_to_fm(gs_mos(ispin)%mos_virt, weighted_vect)
142 ALLOCATE (gw_virt(virt))
143 ALLOCATE (gw_occ(nactive))
144 gw_virt(1:virt) = ex_env%gw_eigen(occ + 1:nmo)
146 j = gs_mos(ispin)%index_active(i)
147 gw_occ(i) = ex_env%gw_eigen(j)
155 CALL parallel_gemm(
'N',
'N', nao, virt, nao, 1.0_dp, fms, weighted_vect, 0.0_dp, sweighted_vect)
156 CALL parallel_gemm(
'N',
'T', virt, nao, virt, 1.0_dp, matrixtmp, sweighted_vect, 0.0_dp, matrixtmp2)
157 CALL parallel_gemm(
'N',
'N', nao, nao, virt, 1.0_dp, sweighted_vect, matrixtmp2, 0.0_dp, matrixtmp3)
164 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
165 nrow_global=nao, ncol_global=nactive)
170 aop_evects(ispin, ivect), ncol=nactive, &
171 alpha=1.0_dp, beta=1.0_dp)
188 virt =
SIZE(aop_evects, 2)
189 CALL timestop(handle)
204 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: aop_evects
205 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects
210 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_apply_bse'
212 INTEGER :: a_nao_col, a_virt_col, b_nao_col, c_virt_col, handle, i_occ_row, i_row_global, &
213 ii, ispin, ivect, j_col_global, j_occ_row, jj, k_occ_col, mu_col_global, nao, ncol_block, &
214 ncol_local, nrow_block, nrow_local, nspins, nvects, nvirt
215 INTEGER,
DIMENSION(2) :: nactive
216 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
217 REAL(kind=
dp) :: alpha
220 TYPE(
cp_fm_type) :: csvirt, fms, wxaoao, wxmat2, wxvirtao
226 CALL timeset(routinen, handle)
228 nspins =
SIZE(evects, 1)
229 nvects =
SIZE(evects, 2)
240 NULLIFY (ex_env, para_env, blacs_env, matrix_s)
241 CALL get_qs_env(qs_env, exstate_env=ex_env, para_env=para_env, blacs_env=blacs_env, &
245 context=blacs_env, nrow_global=nao, ncol_global=nao)
250 NULLIFY (bse_w_matrix_mo)
251 bse_w_matrix_mo => ex_env%bse_w_matrix_MO(1, 1)
255 NULLIFY (matrix_struct, fmstruct)
256 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
257 nrow_global=nao, ncol_global=nactive(ispin))
258 nvirt =
SIZE(gs_mos(ispin)%evals_virt)
261 context=blacs_env, nrow_global=nvirt, ncol_global=nao)
266 context=blacs_env, nrow_global=nactive(ispin)*nactive(ispin), &
267 ncol_global=nvirt*nao)
273 context=blacs_env, nrow_global=nactive(ispin)*nactive(ispin), &
279 CALL parallel_gemm(
'T',
'N', nvirt, nao, nao, 1.0_dp, gs_mos(ispin)%mos_virt, fms, 0.0_dp, csvirt)
280 NULLIFY (row_indices, col_indices)
281 CALL cp_fm_get_info(matrix=wxvirtao, nrow_local=nrow_local, ncol_local=ncol_local, &
282 row_indices=row_indices, col_indices=col_indices, &
283 nrow_block=nrow_block, ncol_block=ncol_block)
286 DO ii = 1, nrow_local
287 i_row_global = row_indices(ii)
288 DO jj = 1, ncol_local
289 j_col_global = col_indices(jj)
291 i_occ_row = (i_row_global - 1)/nactive(ispin) + 1
292 j_occ_row = mod(i_row_global - 1, nactive(ispin)) + 1
294 a_virt_col = (j_col_global - 1)/nao + 1
295 b_nao_col = mod(j_col_global - 1, nao) + 1
297 DO c_virt_col = 1, nvirt
298 mu_col_global = (a_virt_col - 1)*nvirt + c_virt_col
300 wxvirtao%local_data(i_row_global, j_col_global) = wxvirtao%local_data(i_row_global, j_col_global) + &
301 bse_w_matrix_mo%local_data(i_row_global, mu_col_global)*csvirt%local_data(c_virt_col, b_nao_col)
307 NULLIFY (row_indices, col_indices)
308 CALL cp_fm_get_info(matrix=wxaoao, nrow_local=nrow_local, ncol_local=ncol_local, &
309 row_indices=row_indices, col_indices=col_indices, &
310 nrow_block=nrow_block, ncol_block=ncol_block)
313 DO ii = 1, nrow_local
314 i_row_global = row_indices(ii)
315 DO jj = 1, ncol_local
316 j_col_global = col_indices(jj)
318 i_occ_row = (i_row_global - 1)/nactive(ispin) + 1
319 j_occ_row = mod(i_row_global - 1, nactive(ispin)) + 1
321 a_nao_col = (j_col_global - 1)/nao + 1
322 b_nao_col = mod(j_col_global - 1, nao) + 1
324 DO k_occ_col = 1, nvirt
325 mu_col_global = (k_occ_col - 1)*nao + a_nao_col
327 wxaoao%local_data(i_row_global, j_col_global) = wxaoao%local_data(i_row_global, j_col_global) + &
328 wxvirtao%local_data(i_row_global, mu_col_global)*csvirt%local_data(k_occ_col, b_nao_col)
338 context=blacs_env, nrow_global=nao, ncol_global=nactive(ispin))
343 DO ii = 1, nrow_local
344 i_row_global = row_indices(ii)
345 DO jj = 1, ncol_local
346 j_col_global = col_indices(jj)
348 i_occ_row = (i_row_global - 1)/nactive(ispin) + 1
349 j_occ_row = mod(i_row_global - 1, nactive(ispin)) + 1
350 a_nao_col = (j_col_global - 1)/nao + 1
351 b_nao_col = mod(j_col_global - 1, nao) + 1
352 IF (a_nao_col == b_nao_col)
THEN
353 wxmat2%local_data(b_nao_col, i_occ_row) = wxmat2%local_data(b_nao_col, i_occ_row) + &
354 wxaoao%local_data(i_row_global, j_col_global)*evects(ispin, ivect)%local_data(a_nao_col, j_occ_row)
356 IF (a_nao_col /= b_nao_col)
THEN
357 wxmat2%local_data(a_nao_col, i_occ_row) = wxmat2%local_data(a_nao_col, i_occ_row) + &
358 wxaoao%local_data(i_row_global, j_col_global)*evects(ispin, ivect)%local_data(b_nao_col, j_occ_row)
374 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.