63#include "./base/base_uses.f90"
69 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_operators'
71 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
73 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
74 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
101 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: aop_evects
102 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects, s_evects
105 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(in) :: matrix_ks
108 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_apply_energy_diff'
110 INTEGER :: handle, i, ispin, ivect, j, nactive, &
111 nao, nspins, nvects, spin2
112 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_active
116 CALL timeset(routinen, handle)
118 nspins =
SIZE(evects, 1)
119 nvects =
SIZE(evects, 2)
121 DO ispin = 1,
SIZE(evects, 1)
122 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
123 nrow_global=nao, ncol_global=nactive)
125 ALLOCATE (evals_active(nactive))
127 j = gs_mos(ispin)%index_active(i)
128 evals_active(i) = gs_mos(ispin)%evals_occ(j)
139 aop_evects(ispin, ivect), ncol=nactive, &
140 alpha=1.0_dp, beta=1.0_dp)
142 IF (
ASSOCIATED(gs_mos(ispin)%evals_occ_matrix))
THEN
144 CALL parallel_gemm(
'N',
'N', nao, nactive, nactive, 1.0_dp, &
145 s_evects(ispin, ivect), gs_mos(ispin)%evals_occ_matrix, &
155 DEALLOCATE (evals_active)
159 CALL timestop(handle)
186 qs_env, sub_env, gapw, work_v_gspace, work_v_rspace, tddfpt_mgrid)
193 LOGICAL,
INTENT(IN) :: gapw
196 LOGICAL,
INTENT(IN) :: tddfpt_mgrid
198 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_apply_coulomb'
200 INTEGER :: handle, ispin, nspins
201 REAL(kind=
dp) :: alpha, pair_energy
206 POINTER :: my_rs_descs
209 CALL timeset(routinen, handle)
211 nspins =
SIZE(a_ia_rspace)
212 pw_env => sub_env%pw_env
213 IF (tddfpt_mgrid)
THEN
214 CALL pw_env_get(pw_env, poisson_env=poisson_env, rs_grids=my_rs_grids, &
215 rs_descs=my_rs_descs, pw_pools=my_pools)
217 CALL pw_env_get(pw_env, poisson_env=poisson_env)
229 cpassert(
ASSOCIATED(local_rho_set))
230 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_ia_g)
231 IF (
ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
232 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_ia_g)
243 CALL pw_axpy(work_v_rspace, a_ia_rspace(ispin), alpha)
248 hartree_local%ecoul_1c, &
250 sub_env%para_env, tddft=.true., core_2nd=.true.)
251 CALL pw_scale(work_v_rspace, work_v_rspace%pw_grid%dvol)
252 IF (tddfpt_mgrid)
THEN
254 calculate_forces=.false., &
255 local_rho_set=local_rho_set, my_pools=my_pools, &
256 my_rs_descs=my_rs_descs)
259 calculate_forces=.false., &
260 local_rho_set=local_rho_set)
264 CALL timestop(handle)
281 LOGICAL,
INTENT(in) :: is_rks_triplets
284 REAL(kind=
dp) :: alpha
287 nspins =
SIZE(a_ia_rspace)
293 IF (nspins == 2)
THEN
294 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
295 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(2), alpha)
296 CALL pw_multiply(a_ia_rspace(2), fxc_rspace(3), rho1_r(2), alpha)
297 CALL pw_multiply(a_ia_rspace(2), fxc_rspace(2), rho1_r(1), alpha)
298 ELSE IF (is_rks_triplets)
THEN
299 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
300 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(1), -alpha)
302 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
303 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(1), alpha)
329 work_rho_ia_ao_symm, work_hmat_symm, work_rho_ia_ao_asymm, &
330 work_hmat_asymm, wfm_rho_orb)
331 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: aop_evects
332 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects
335 LOGICAL,
INTENT(in) :: do_admm
337 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: work_rho_ia_ao_symm
339 TARGET :: work_hmat_symm
340 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: work_rho_ia_ao_asymm
342 TARGET :: work_hmat_asymm
345 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_apply_hfx'
347 INTEGER :: handle, ispin, ivect, nao, nao_aux, &
349 INTEGER,
DIMENSION(maxspins) :: nactive
351 REAL(kind=
dp) :: alpha
355 CALL timeset(routinen, handle)
363 nspins =
SIZE(evects, 1)
364 nvects =
SIZE(evects, 2)
366 IF (
SIZE(gs_mos) > 1)
THEN
393 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
394 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
395 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), 0.5_dp, gs_mos(ispin)%mos_active, &
396 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
398 CALL dbcsr_set(work_hmat_symm(ispin)%matrix, 0.0_dp)
400 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
401 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
402 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
403 0.0_dp, admm_env%work_aux_aux)
404 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao_symm(ispin)%matrix, keep_sparsity=.true.)
406 CALL copy_fm_to_dbcsr(wfm_rho_orb, work_rho_ia_ao_symm(ispin)%matrix, keep_sparsity=.true.)
415 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
417 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
418 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
420 CALL parallel_gemm(
'N',
'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
421 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
426 aop_evects(ispin, ivect), ncol=nactive(ispin), &
427 alpha=alpha, beta=1.0_dp)
435 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
436 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
437 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), -0.5_dp, gs_mos(ispin)%mos_active, &
438 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
440 CALL dbcsr_set(work_hmat_asymm(ispin)%matrix, 0.0_dp)
442 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
443 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
444 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
445 0.0_dp, admm_env%work_aux_aux)
446 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao_asymm(ispin)%matrix, keep_sparsity=.true.)
448 CALL copy_fm_to_dbcsr(wfm_rho_orb, work_rho_ia_ao_asymm(ispin)%matrix, keep_sparsity=.true.)
457 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
459 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
460 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
462 CALL parallel_gemm(
'N',
'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
463 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
468 aop_evects(ispin, ivect), ncol=nactive(ispin), &
469 alpha=alpha, beta=1.0_dp)
475 CALL timestop(handle)
496 hfx_section, x_data, symmetry, recalc_integrals, &
497 work_rho_ia_ao, work_hmat, wfm_rho_orb)
498 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: aop_evects, evects
504 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
505 INTEGER,
INTENT(IN) :: symmetry
506 LOGICAL,
INTENT(IN) :: recalc_integrals
507 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: work_rho_ia_ao
512 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_apply_hfxsr_kernel'
514 INTEGER :: handle, ispin, ivect, nao, nao_aux, &
516 INTEGER,
DIMENSION(maxspins) :: nactive
518 REAL(kind=
dp) :: alpha
520 CALL timeset(routinen, handle)
522 nspins =
SIZE(evects, 1)
523 nvects =
SIZE(evects, 2)
526 IF (nspins > 1) alpha = 1.0_dp
534 reint = recalc_integrals
538 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
539 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
540 CALL parallel_gemm(
'N',
'T', nao, nao, nactive(ispin), 0.5_dp*symmetry, gs_mos(ispin)%mos_active, &
541 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
542 CALL dbcsr_set(work_hmat(ispin)%matrix, 0.0_dp)
543 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
544 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
545 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
546 0.0_dp, admm_env%work_aux_aux)
547 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao(ispin)%matrix, keep_sparsity=.true.)
550 CALL tddft_hfx_matrix(work_hmat, work_rho_ia_ao, qs_env, .false., reint, hfx_section, x_data)
555 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
556 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
557 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
558 CALL parallel_gemm(
'N',
'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
559 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
563 CALL timestop(handle)
583 REAL(kind=
dp),
INTENT(IN) :: rcut, hfx_scale
585 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: x
586 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: res
588 CHARACTER(len=*),
PARAMETER :: routinen =
'tddfpt_apply_hfxlr_kernel'
590 INTEGER :: handle, iatom, ispin, jatom, natom, &
592 INTEGER,
DIMENSION(2) :: nactive
593 REAL(kind=
dp) :: dr, eps_filter, fcut, gabr
594 REAL(kind=
dp),
DIMENSION(3) :: rij
595 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pblock
599 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: xtransformed
607 CALL timeset(routinen, handle)
610 eps_filter = 1.e-08_dp
617 para_env => sub_env%para_env
619 CALL get_qs_env(qs_env, natom=natom, cell=cell, particle_set=particle_set)
623 ALLOCATE (xtransformed(nspins))
626 ct => work%ctransformed(ispin)
628 CALL cp_fm_create(matrix=xtransformed(ispin), matrix_struct=fmstruct, name=
"XTRANSFORMED")
633 ct => work%ctransformed(ispin)
637 tempmat => work%shalf
638 CALL dbcsr_create(pdens, template=tempmat, matrix_type=dbcsr_type_no_symmetry)
640 ct => work%ctransformed(ispin)
643 1.0_dp, keep_sparsity=.false.)
650 rij = particle_set(iatom)%r - particle_set(jatom)%r
652 dr = sqrt(sum(rij(:)**2))
655 gabr = 2._dp*gabr/sqrt(3.1415926_dp)
657 gabr = erf(gabr*dr)/dr
658 fcut = exp(dr - 4._dp*rcut)
659 fcut = fcut/(fcut + 1._dp)
661 pblock = hfx_scale*gabr*pblock
677 CALL timestop(handle)
Types and set/get functions for auxiliary density matrix methods.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
Utilities for hfx and admm methods.
subroutine, public tddft_hfx_matrix(matrix_ks, rho_ao, qs_env, update_energy, recalc_integrals, external_hfx_sections, external_x_data, external_para_env)
Add the hfx contributions to the Hamiltonian.
Types and set/get functions for HFX.
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public tddfpt_apply_hfx(aop_evects, evects, gs_mos, do_admm, qs_env, work_rho_ia_ao_symm, work_hmat_symm, work_rho_ia_ao_asymm, work_hmat_asymm, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
subroutine, public tddfpt_apply_coulomb(a_ia_rspace, rho_ia_g, local_rho_set, hartree_local, qs_env, sub_env, gapw, work_v_gspace, work_v_rspace, tddfpt_mgrid)
Update v_rspace by adding coulomb term.
subroutine, public tddfpt_apply_energy_diff(aop_evects, evects, s_evects, gs_mos, matrix_ks, tddfpt_control)
Apply orbital energy difference term: Aop_evects(spin,state) += KS(spin) * evects(spin,...
subroutine, public tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, hfx_scale, work, x, res)
...Calculate the HFXLR kernel contribution by contracting the Lowdin MO coefficients – transition cha...
subroutine, public tddfpt_apply_hfxsr_kernel(aop_evects, evects, gs_mos, qs_env, admm_env, hfx_section, x_data, symmetry, recalc_integrals, work_rho_ia_ao, work_hmat, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
subroutine, public tddfpt_apply_xc_potential(a_ia_rspace, fxc_rspace, rho_ia_struct, is_rks_triplets)
Routine for applying fxc potential.
Simplified Tamm Dancoff approach (sTDA).
subroutine, public get_lowdin_x(shalf, xvec, xt)
Calculate Lowdin transformed Davidson trial vector X shalf (dbcsr), xvec, xt (fm) are defined in the ...
stores some data used in wavefunction fitting
Type defining parameters related to the simulation cell.
keeps the information about the structure of a full matrix
stores some data used in construction of Kohn-Sham matrix
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
to create arrays of pools
keeps the density in various representations, keeping track of which ones are valid.
Parallel (sub)group environment.
Ground state molecular orbitals.
Set of temporary ("work") matrices.