88 fm_mat_Q_static_bse_gemm, &
89 Eigenval, Eigenval_scf, &
90 homo, virtual, dimen_RI, dimen_RI_red, bse_lev_virt, &
91 gd_array, color_sub, mp2_env, qs_env, mo_coeff, unit_nr)
93 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s_ia_bse, fm_mat_s_ij_bse, &
95 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_mat_q_static_bse_gemm
96 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
97 INTENT(IN) :: eigenval, eigenval_scf
98 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, virtual
99 INTEGER,
INTENT(IN) :: dimen_ri, dimen_ri_red
100 INTEGER,
DIMENSION(:),
INTENT(IN) :: bse_lev_virt
102 INTEGER,
INTENT(IN) :: color_sub
105 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
106 INTEGER,
INTENT(IN) :: unit_nr
108 CHARACTER(LEN=*),
PARAMETER :: routinen =
'start_bse_calculation'
110 INTEGER :: handle, ispin, n_ov_joint, nspins
111 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: homo_red_arr, n_ov_arr, offsets_arr, &
113 LOGICAL :: my_do_abba, my_do_fulldiag, &
114 my_do_iterat_diag, my_do_tda, &
116 REAL(kind=
dp) :: diag_runtime_est
117 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenval_reduced, eigenval_reduced_1, &
118 eigenval_reduced_2, &
119 eigenval_reduced_joint
120 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: b_abq_bse_local, b_bar_iaq_bse_local, &
121 b_bar_ijq_bse_local, b_iaq_bse_local
122 TYPE(
cp_fm_type) :: fm_a_bse, fm_b_bse, fm_c_bse, &
123 fm_inv_sqrt_a_minus_b, fm_q_copy, &
125 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_mat_s_ab_trunc_arr, &
126 fm_mat_s_bar_ia_bse_arr, fm_mat_s_bar_ij_bse_arr, fm_mat_s_ia_trunc_arr, &
127 fm_mat_s_ij_trunc_arr
135 CALL timeset(routinen, handle)
138 para_env => fm_mat_s_ia_bse(1)%matrix_struct%para_env
140 my_do_fulldiag = .false.
141 my_do_iterat_diag = .false.
145 SELECT CASE (mp2_env%bse%bse_diag_method)
147 my_do_iterat_diag = .true.
149 cpabort(
"Iterative BSE not yet implemented")
151 my_do_fulldiag = .true.
154 SELECT CASE (mp2_env%bse%flag_tda)
169 mp2_env%bse%bse_debug_print = .true.
172 CALL fm_mat_s_ia_bse(1)%matrix_struct%para_env%sync()
174 ALLOCATE (homo_red_arr(nspins), virt_red_arr(nspins))
175 ALLOCATE (spin_windows(nspins))
176 ALLOCATE (fm_mat_s_ia_trunc_arr(nspins), fm_mat_s_ij_trunc_arr(nspins), fm_mat_s_ab_trunc_arr(nspins))
177 ALLOCATE (fm_mat_s_bar_ia_bse_arr(nspins), fm_mat_s_bar_ij_bse_arr(nspins))
180 CALL determine_mo_window(eigenval_scf(:, 1, ispin), homo(ispin) + virtual(ispin), homo(ispin), &
181 mp2_env%bse%bse_cutoff_occ, mp2_env%bse%bse_cutoff_empty, &
186 CALL cp_warn(__location__, &
187 "Open-shell (UKS/LSD) BSE is a recent addition and has not been "// &
188 "extensively validated. Verify results carefully before using them "// &
189 "for production calculations.")
192 IF (spins_differ)
THEN
193 cpwarn(
"BSE: spin-resolved active MO cutoff candidates differ; using combined window.")
197 fm_mat_s_ab_bse(ispin), &
198 fm_mat_s_ia_trunc_arr(ispin), fm_mat_s_ij_trunc_arr(ispin), &
199 fm_mat_s_ab_trunc_arr(ispin), &
200 eigenval_scf(:, 1, ispin), eigenval(:, 1, ispin), &
201 eigenval_reduced, homo(ispin), virtual(ispin), dimen_ri, &
202 unit_nr, bse_lev_virt(ispin), homo_red_arr(ispin), &
203 virt_red_arr(ispin), mp2_env, combined_window, .false.)
205 ALLOCATE (eigenval_reduced_1(
SIZE(eigenval_reduced)))
206 eigenval_reduced_1(:) = eigenval_reduced(:)
208 ALLOCATE (eigenval_reduced_2(
SIZE(eigenval_reduced)))
209 eigenval_reduced_2(:) = eigenval_reduced(:)
211 DEALLOCATE (eigenval_reduced)
214 ALLOCATE (eigenval_reduced_joint(
SIZE(eigenval_reduced_1) +
SIZE(eigenval_reduced_2)))
215 eigenval_reduced_joint(1:
SIZE(eigenval_reduced_1)) = eigenval_reduced_1
216 eigenval_reduced_joint(
SIZE(eigenval_reduced_1) + 1:) = eigenval_reduced_2
217 DEALLOCATE (eigenval_reduced_1, eigenval_reduced_2)
219 ALLOCATE (n_ov_arr(nspins), offsets_arr(nspins))
226 CALL cp_fm_create(fm_q_copy, fm_mat_q_static_bse_gemm%matrix_struct)
227 CALL cp_fm_to_fm(fm_mat_q_static_bse_gemm, fm_q_copy)
228 CALL mult_b_with_w(fm_mat_s_ij_trunc_arr(ispin), fm_mat_s_ia_trunc_arr(ispin), &
229 fm_mat_s_bar_ia_bse_arr(ispin), fm_mat_s_bar_ij_bse_arr(ispin), &
230 fm_q_copy, dimen_ri_red, homo_red_arr(ispin), virt_red_arr(ispin))
235 IF (my_do_fulldiag)
THEN
239 CALL create_a(fm_mat_s_ia_trunc_arr, fm_mat_s_ij_trunc_arr, fm_mat_s_ab_trunc_arr, &
240 fm_a_bse, eigenval_reduced_joint, unit_nr, &
241 homo_red_arr, virt_red_arr, dimen_ri, mp2_env, para_env, qs_env)
243 CALL create_a(fm_mat_s_ia_trunc_arr, fm_mat_s_bar_ij_bse_arr, fm_mat_s_ab_trunc_arr, &
244 fm_a_bse, eigenval_reduced_joint, unit_nr, &
245 homo_red_arr, virt_red_arr, dimen_ri, mp2_env, para_env, qs_env)
250 CALL create_b(fm_mat_s_ia_trunc_arr, fm_mat_s_ia_trunc_arr, fm_b_bse, &
251 homo_red_arr, virt_red_arr, dimen_ri, unit_nr, mp2_env)
253 CALL create_b(fm_mat_s_ia_trunc_arr, fm_mat_s_bar_ia_bse_arr, fm_b_bse, &
254 homo_red_arr, virt_red_arr, dimen_ri, unit_nr, mp2_env)
257 fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, &
258 unit_nr, mp2_env, diag_runtime_est)
261 NULLIFY (dft_control, tddfpt_control)
262 CALL get_qs_env(qs_env, dft_control=dft_control)
263 tddfpt_control => dft_control%tddfpt2_control
266 IF (my_do_tda .AND. (.NOT. tddfpt_control%do_bse))
THEN
267 CALL diagonalize_a(fm_a_bse, homo_red_arr, virt_red_arr, homo, &
268 unit_nr, diag_runtime_est, mp2_env, qs_env, mo_coeff)
272 CALL diagonalize_c(fm_c_bse, homo_red_arr, virt_red_arr, homo, &
273 fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, &
274 unit_nr, diag_runtime_est, mp2_env, qs_env, mo_coeff)
286 IF (mp2_env%bse%do_nto_analysis)
DEALLOCATE (mp2_env%bse%bse_nto_state_list_final)
287 DEALLOCATE (eigenval_reduced_joint, n_ov_arr, offsets_arr)
292 fm_mat_s_ia_trunc_arr(1), fm_mat_s_ij_trunc_arr(1), &
293 fm_mat_s_ab_trunc_arr(1), &
294 eigenval_scf(:, 1, 1), eigenval(:, 1, 1), eigenval_reduced, &
295 homo(1), virtual(1), dimen_ri, unit_nr, &
296 bse_lev_virt(1), homo_red_arr(1), virt_red_arr(1), mp2_env, &
297 spin_windows(1), .true.)
298 CALL mult_b_with_w(fm_mat_s_ij_trunc_arr(1), fm_mat_s_ia_trunc_arr(1), &
299 fm_mat_s_bar_ia_bse_arr(1), fm_mat_s_bar_ij_bse_arr(1), &
300 fm_mat_q_static_bse_gemm, dimen_ri_red, homo_red_arr(1), virt_red_arr(1))
302 IF (my_do_iterat_diag)
THEN
304 fm_mat_s_bar_ia_bse_arr(1), fm_mat_s_bar_ij_bse_arr(1), &
305 b_bar_ijq_bse_local, b_abq_bse_local, b_bar_iaq_bse_local, &
306 b_iaq_bse_local, dimen_ri_red, homo_red_arr(1), &
307 virt_red_arr(1), gd_array, color_sub, para_env)
312 IF (my_do_fulldiag)
THEN
313 n_ov_joint = homo_red_arr(1)*virt_red_arr(1)
317 CALL create_a(fm_mat_s_ia_trunc_arr, fm_mat_s_ij_trunc_arr, fm_mat_s_ab_trunc_arr, &
318 fm_a_bse, eigenval_reduced, unit_nr, &
319 homo_red_arr, virt_red_arr, dimen_ri, mp2_env, para_env, qs_env)
321 CALL create_a(fm_mat_s_ia_trunc_arr, fm_mat_s_bar_ij_bse_arr, fm_mat_s_ab_trunc_arr, &
322 fm_a_bse, eigenval_reduced, unit_nr, &
323 homo_red_arr, virt_red_arr, dimen_ri, mp2_env, para_env, qs_env)
328 CALL create_b(fm_mat_s_ia_trunc_arr, fm_mat_s_ia_trunc_arr, fm_b_bse, &
329 homo_red_arr, virt_red_arr, dimen_ri, unit_nr, mp2_env)
331 CALL create_b(fm_mat_s_ia_trunc_arr, fm_mat_s_bar_ia_bse_arr, fm_b_bse, &
332 homo_red_arr, virt_red_arr, dimen_ri, unit_nr, mp2_env)
335 fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, &
336 unit_nr, mp2_env, diag_runtime_est)
340 NULLIFY (dft_control, tddfpt_control)
341 CALL get_qs_env(qs_env, dft_control=dft_control)
342 tddfpt_control => dft_control%tddfpt2_control
343 IF (my_do_tda .AND. (.NOT. tddfpt_control%do_bse))
THEN
344 CALL diagonalize_a(fm_a_bse, homo_red_arr, virt_red_arr, homo, &
345 unit_nr, diag_runtime_est, mp2_env, qs_env, mo_coeff)
349 CALL diagonalize_c(fm_c_bse, homo_red_arr, virt_red_arr, homo, &
350 fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, &
351 unit_nr, diag_runtime_est, mp2_env, qs_env, mo_coeff)
357 fm_mat_s_ia_trunc_arr(1), fm_mat_s_ij_trunc_arr(1), &
358 fm_mat_s_ab_trunc_arr(1), fm_mat_q_static_bse_gemm, mp2_env)
359 DEALLOCATE (eigenval_reduced)
360 IF (my_do_iterat_diag)
THEN
362 b_iaq_bse_local, homo(1), virtual(1), &
363 mp2_env%bse%bse_spin_config, unit_nr, &
364 eigenval(:, 1, 1), para_env, mp2_env)
365 DEALLOCATE (b_bar_ijq_bse_local, b_abq_bse_local, b_bar_iaq_bse_local, b_iaq_bse_local)
370 DEALLOCATE (homo_red_arr, virt_red_arr)
371 DEALLOCATE (spin_windows)
372 DEALLOCATE (fm_mat_s_ia_trunc_arr, fm_mat_s_ij_trunc_arr, fm_mat_s_ab_trunc_arr)
373 DEALLOCATE (fm_mat_s_bar_ia_bse_arr, fm_mat_s_bar_ij_bse_arr)
375 IF (unit_nr > 0)
THEN
376 WRITE (unit_nr,
'(T2,A4,T7,A53)')
'BSE|',
'The BSE was successfully calculated. Have a nice day!'
379 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.