36 dbcsr_type_no_symmetry, dbcsr_type_symmetric
58 dbt_batched_contract_finalize, dbt_batched_contract_init, dbt_clear, dbt_contract, &
59 dbt_copy, dbt_copy_matrix_to_tensor, dbt_copy_tensor_to_matrix, dbt_create, dbt_destroy, &
60 dbt_filter, dbt_get_info, dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, &
61 dbt_pgrid_type, dbt_scale, dbt_type
128 integrate_v_core_rspace,&
167#include "./base/base_uses.f90"
173 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_im_time_force_methods'
193 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m
194 INTEGER,
INTENT(IN) :: unit_nr
198 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_im_time_forces'
200 INTEGER :: handle, i_mem, i_xyz, ibasis, ispin, &
201 n_dependent, n_mem, n_rep, natom, &
203 INTEGER(int_8) :: nze, nze_tot
204 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist1, dist2, dist_ao_1, dist_ao_2, &
205 dist_ri, dummy_end, dummy_start, &
206 end_blocks, sizes_ao, sizes_ri, &
208 INTEGER,
DIMENSION(2) :: pdims_t2c
209 INTEGER,
DIMENSION(3) :: nblks_total, pcoord, pdims, pdims_t3c
210 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
211 LOGICAL :: do_periodic, use_virial
212 REAL(
dp) :: compression_factor, eps_pgf_orb, &
213 eps_pgf_orb_old, memory, occ
217 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
218 TYPE(
dbcsr_type) :: dbcsr_work, dbcsr_work2, dbcsr_work3
219 TYPE(
dbcsr_type),
DIMENSION(1) :: t_2c_int_tmp
220 TYPE(
dbcsr_type),
DIMENSION(1, 3) :: t_2c_der_tmp
221 TYPE(dbt_pgrid_type) :: pgrid_t2c, pgrid_t3c
222 TYPE(dbt_type) :: t_2c_template, t_2c_tmp, t_3c_template
223 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: t_3c_der_ao_prv, t_3c_der_ri_prv
228 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
237 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
242 NULLIFY (dft_control, para_env, particle_set, qs_kind_set, dist_2d, nl_2c, blacs_env, matrix_s, &
243 rho, rho_ao, cell, qs_section, orb_basis, ri_basis, virial)
247 CALL timeset(routinen, handle)
249 CALL get_qs_env(qs_env, natom=natom, nkind=nkind, dft_control=dft_control, para_env=para_env, &
250 particle_set=particle_set, qs_kind_set=qs_kind_set, cell=cell, virial=virial)
251 IF (dft_control%qs_control%gapw)
THEN
252 cpabort(
"Low-scaling RPA/SOS-MP2 forces only available with GPW")
255 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
257 do_periodic = .false.
258 IF (any(cell%perd == 1)) do_periodic = .true.
259 force_data%do_periodic = do_periodic
263 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c)
272 eps_pgf_orb = sqrt(eps_pgf_orb)
274 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
276 ALLOCATE (sizes_ri(natom), sizes_ao(natom))
277 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
279 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
281 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
283 DO ibasis = 1,
SIZE(basis_set_ao)
284 orb_basis => basis_set_ao(ibasis)%gto_basis_set
286 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
290 CALL create_3c_tensor(t_3c_template, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c, &
291 sizes_ri, sizes_ao, sizes_ao, map1=[1], map2=[2, 3], name=
"der (RI AO | AO)")
293 ALLOCATE (t_3c_der_ri_prv(1, 1, 3), t_3c_der_ao_prv(1, 1, 3))
295 CALL dbt_create(t_3c_template, t_3c_der_ri_prv(1, 1, i_xyz))
296 CALL dbt_create(t_3c_template, t_3c_der_ao_prv(1, 1, i_xyz))
300 ALLOCATE (force_data%t_3c_virial, force_data%t_3c_virial_split)
301 CALL dbt_create(t_3c_template, force_data%t_3c_virial)
302 CALL dbt_create(t_3c_m, force_data%t_3c_virial_split)
304 CALL dbt_destroy(t_3c_template)
306 CALL dbt_mp_environ_pgrid(pgrid_t3c, pdims, pcoord)
307 CALL mp_comm_t3c%create(pgrid_t3c%mp_comm_2d, 3, pdims)
309 nkind, particle_set, mp_comm_t3c, own_comm=.true.)
313 ALLOCATE (force_data%nl_3c)
314 CALL mp_comm_vir%create(pgrid_t3c%mp_comm_2d, 3, pdims)
316 nkind, particle_set, mp_comm_vir, own_comm=.true.)
318 dist_vir, mp2_env%ri_metric,
"RPA_3c_nl", qs_env, op_pos=1, &
319 sym_jk=.false., own_dist=.true.)
323 mp2_env%ri_metric,
"RPA_3c_nl", qs_env, op_pos=1, sym_jk=.true., &
325 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
328 CALL dbt_get_info(t_3c_m, nblks_total=nblks_total)
329 ALLOCATE (force_data%bsizes_RI_split(nblks_total(1)), force_data%bsizes_AO_split(nblks_total(2)))
330 CALL dbt_get_info(t_3c_m, blk_size_1=force_data%bsizes_RI_split, blk_size_2=force_data%bsizes_AO_split)
332 CALL dbt_create(t_3c_m, force_data%t_3c_der_RI(i_xyz))
333 CALL dbt_create(t_3c_m, force_data%t_3c_der_AO(i_xyz))
337 ALLOCATE (force_data%idx_to_at_RI(nblks_total(1)))
338 CALL get_idx_to_atom(force_data%idx_to_at_RI, force_data%bsizes_RI_split, sizes_ri)
340 ALLOCATE (force_data%idx_to_at_AO(nblks_total(2)))
341 CALL get_idx_to_atom(force_data%idx_to_at_AO, force_data%bsizes_AO_split, sizes_ao)
343 n_mem = mp2_env%ri_rpa_im_time%cut_memory
345 DEALLOCATE (dummy_start, dummy_end)
347 ALLOCATE (force_data%t_3c_der_AO_comp(n_mem, 3), force_data%t_3c_der_RI_comp(n_mem, 3))
348 ALLOCATE (force_data%t_3c_der_AO_ind(n_mem, 3), force_data%t_3c_der_RI_ind(n_mem, 3))
353 CALL build_3c_derivatives(t_3c_der_ri_prv, t_3c_der_ao_prv, mp2_env%ri_rpa_im_time%eps_filter, &
354 qs_env, nl_3c, basis_set_ri_aux, basis_set_ao, basis_set_ao, &
355 mp2_env%ri_metric, der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1, &
356 bounds_i=[start_blocks(i_mem), end_blocks(i_mem)])
359 CALL dbt_copy(t_3c_der_ri_prv(1, 1, i_xyz), force_data%t_3c_der_RI(i_xyz), move_data=.true.)
360 CALL dbt_filter(force_data%t_3c_der_RI(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
362 nze_tot = nze_tot + nze
365 CALL compress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
366 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress, memory)
367 CALL dbt_clear(force_data%t_3c_der_RI(i_xyz))
369 CALL dbt_copy(t_3c_der_ao_prv(1, 1, i_xyz), force_data%t_3c_der_AO(i_xyz), move_data=.true.)
370 CALL dbt_filter(force_data%t_3c_der_AO(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
372 nze_tot = nze_tot + nze
375 CALL compress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
376 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress, memory)
377 CALL dbt_clear(force_data%t_3c_der_AO(i_xyz))
382 CALL dbt_destroy(t_3c_der_ri_prv(1, 1, i_xyz))
383 CALL dbt_destroy(t_3c_der_ao_prv(1, 1, i_xyz))
386 CALL para_env%sum(memory)
387 compression_factor = real(nze_tot,
dp)*1.0e-06*8.0_dp/memory
388 IF (unit_nr > 0)
THEN
389 WRITE (unit=unit_nr, fmt=
"((T3,A,T66,F11.2,A4))") &
390 "MEMORY_INFO| Memory for 3-center derivatives (compressed):", memory,
' MiB'
392 WRITE (unit=unit_nr, fmt=
"((T3,A,T60,F21.2))") &
393 "MEMORY_INFO| Compression factor: ", compression_factor
397 CALL get_qs_env(qs_env, distribution_2d=dist_2d, blacs_env=blacs_env, matrix_s=matrix_s)
399 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
400 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
401 row_bsize(:) = sizes_ri(:)
402 col_bsize(:) = sizes_ri(:)
405 CALL dbt_pgrid_create(para_env, pdims_t2c, pgrid_t2c)
406 CALL create_2c_tensor(t_2c_template, dist1, dist2, pgrid_t2c, force_data%bsizes_RI_split, &
407 force_data%bsizes_RI_split, name=
'(RI| RI)')
408 DEALLOCATE (dist1, dist2)
410 CALL dbcsr_create(t_2c_int_tmp(1),
"(P|Q) RPA", dbcsr_dist, dbcsr_type_symmetric, row_bsize, col_bsize)
412 CALL dbcsr_create(t_2c_der_tmp(1, i_xyz),
"(P|Q) RPA der", dbcsr_dist, &
413 dbcsr_type_antisymmetric, row_bsize, col_bsize)
417 ALLOCATE (force_data%RI_virial_pot, force_data%RI_virial_met)
418 CALL dbcsr_create(force_data%RI_virial_pot,
"RI_virial", dbcsr_dist, &
419 dbcsr_type_no_symmetry, row_bsize, col_bsize)
420 CALL dbcsr_create(force_data%RI_virial_met,
"RI_virial", dbcsr_dist, &
421 dbcsr_type_no_symmetry, row_bsize, col_bsize)
430 CALL dbcsr_create(dbcsr_work2, template=t_2c_int_tmp(1))
431 CALL dbcsr_create(dbcsr_work3, template=t_2c_int_tmp(1))
433 CALL cp_dbcsr_power(dbcsr_work, -0.5_dp, 1.0e-7_dp, n_dependent, para_env, blacs_env)
436 CALL dbt_create(dbcsr_work, t_2c_tmp)
437 CALL dbt_copy_matrix_to_tensor(dbcsr_work, t_2c_tmp)
438 CALL dbt_create(t_2c_template, force_data%t_2c_pot_msqrt)
439 CALL dbt_copy(t_2c_tmp, force_data%t_2c_pot_msqrt, move_data=.true.)
440 CALL dbt_filter(force_data%t_2c_pot_msqrt, mp2_env%ri_rpa_im_time%eps_filter)
442 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work2, dbcsr_work, 0.0_dp, dbcsr_work3)
443 CALL dbt_copy_matrix_to_tensor(dbcsr_work3, t_2c_tmp)
444 CALL dbt_create(t_2c_template, force_data%t_2c_pot_psqrt)
445 CALL dbt_copy(t_2c_tmp, force_data%t_2c_pot_psqrt, move_data=.true.)
446 CALL dbt_filter(force_data%t_2c_pot_psqrt, mp2_env%ri_rpa_im_time%eps_filter)
447 CALL dbt_destroy(t_2c_tmp)
453 IF (.NOT. do_periodic)
THEN
455 "RPA_2c_nl_pot", qs_env, sym_ij=.true., dist_2d=dist_2d)
457 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
461 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
462 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
463 CALL dbt_create(t_2c_template, force_data%t_2c_der_pot(i_xyz))
464 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_pot(i_xyz), move_data=.true.)
465 CALL dbt_filter(force_data%t_2c_der_pot(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
466 CALL dbt_destroy(t_2c_tmp)
472 mp2_env%potential_parameter,
"RPA_2c_nl_pot", qs_env, &
473 sym_ij=.false., dist_2d=dist_2d)
477 CALL dbcsr_create(force_data%G_PQ,
"G_PQ", dbcsr_dist, dbcsr_type_no_symmetry, row_bsize, col_bsize)
481 "RPA_2c_nl_metric", qs_env, sym_ij=.true., dist_2d=dist_2d)
482 CALL build_2c_integrals(t_2c_int_tmp, mp2_env%ri_rpa_im_time%eps_filter, qs_env, nl_2c, &
483 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
485 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
490 mp2_env%ri_metric,
"RPA_2c_nl_metric", qs_env, sym_ij=.false., &
498 CALL dbt_create(dbcsr_work, t_2c_tmp)
499 CALL dbt_copy_matrix_to_tensor(dbcsr_work, t_2c_tmp)
500 CALL dbt_create(t_2c_template, force_data%t_2c_inv_metric)
501 CALL dbt_copy(t_2c_tmp, force_data%t_2c_inv_metric, move_data=.true.)
502 CALL dbt_filter(force_data%t_2c_inv_metric, mp2_env%ri_rpa_im_time%eps_filter)
503 CALL dbt_destroy(t_2c_tmp)
508 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
509 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
510 CALL dbt_create(t_2c_template, force_data%t_2c_der_metric(i_xyz))
511 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_metric(i_xyz), move_data=.true.)
512 CALL dbt_filter(force_data%t_2c_der_metric(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
513 CALL dbt_destroy(t_2c_tmp)
518 CALL dbt_create(t_2c_template, force_data%t_2c_K)
519 CALL dbt_contract(1.0_dp, force_data%t_2c_inv_metric, force_data%t_2c_pot_psqrt, &
520 0.0_dp, force_data%t_2c_K, &
521 contract_1=[2], notcontract_1=[1], &
522 contract_2=[1], notcontract_2=[2], &
523 map_1=[1], map_2=[2], filter_eps=mp2_env%ri_rpa_im_time%eps_filter)
526 CALL dbt_destroy(t_2c_template)
533 DEALLOCATE (row_bsize, col_bsize)
534 ALLOCATE (row_bsize(
SIZE(sizes_ao)))
535 ALLOCATE (col_bsize(
SIZE(sizes_ao)))
536 row_bsize(:) = sizes_ao(:)
537 col_bsize(:) = sizes_ao(:)
539 CALL create_2c_tensor(t_2c_template, dist1, dist2, pgrid_t2c, force_data%bsizes_AO_split, &
540 force_data%bsizes_AO_split, name=
'(AO| AO)')
541 DEALLOCATE (dist1, dist2)
544 CALL dbcsr_create(t_2c_der_tmp(1, i_xyz),
"(P|Q) RPA der", dbcsr_dist, &
545 dbcsr_type_antisymmetric, row_bsize, col_bsize)
550 "RPA_2c_nl_metric", qs_env, sym_ij=.true., dist_2d=dist_2d)
552 basis_set_ao, basis_set_ao, identity_pot)
557 "RPA_2c_nl_metric", qs_env, sym_ij=.false., dist_2d=dist_2d)
560 CALL dbcsr_create(force_data%inv_ovlp, template=matrix_s(1)%matrix)
561 CALL dbcsr_copy(force_data%inv_ovlp, matrix_s(1)%matrix)
566 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
567 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
568 CALL dbt_create(t_2c_template, force_data%t_2c_der_ovlp(i_xyz))
569 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_ovlp(i_xyz), move_data=.true.)
570 CALL dbt_filter(force_data%t_2c_der_ovlp(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
571 CALL dbt_destroy(t_2c_tmp)
576 nspins = dft_control%nspins
577 ALLOCATE (force_data%P_virt(nspins), force_data%P_occ(nspins))
578 ALLOCATE (force_data%sum_YP_tau(nspins), force_data%sum_O_tau(nspins))
580 ALLOCATE (force_data%P_virt(ispin)%matrix, force_data%P_occ(ispin)%matrix)
581 ALLOCATE (force_data%sum_YP_tau(ispin)%matrix, force_data%sum_O_tau(ispin)%matrix)
582 CALL dbcsr_create(force_data%P_virt(ispin)%matrix, template=matrix_s(1)%matrix)
583 CALL dbcsr_create(force_data%P_occ(ispin)%matrix, template=matrix_s(1)%matrix)
584 CALL dbcsr_create(force_data%sum_O_tau(ispin)%matrix, template=matrix_s(1)%matrix)
585 CALL dbcsr_create(force_data%sum_YP_tau(ispin)%matrix, template=matrix_s(1)%matrix)
587 CALL dbcsr_copy(force_data%sum_O_tau(ispin)%matrix, matrix_s(1)%matrix)
588 CALL dbcsr_copy(force_data%sum_YP_tau(ispin)%matrix, matrix_s(1)%matrix)
590 CALL dbcsr_set(force_data%sum_O_tau(ispin)%matrix, 0.0_dp)
591 CALL dbcsr_set(force_data%sum_YP_tau(ispin)%matrix, 0.0_dp)
597 CALL dbcsr_copy(force_data%P_occ(1)%matrix, rho_ao(1)%matrix)
598 IF (nspins == 1)
THEN
599 CALL dbcsr_scale(force_data%P_occ(1)%matrix, 0.5_dp)
601 CALL dbcsr_copy(force_data%P_occ(2)%matrix, rho_ao(2)%matrix)
604 CALL dbcsr_copy(force_data%P_virt(ispin)%matrix, force_data%inv_ovlp)
605 CALL dbcsr_add(force_data%P_virt(ispin)%matrix, force_data%P_occ(ispin)%matrix, 1.0_dp, -1.0_dp)
608 DO ibasis = 1,
SIZE(basis_set_ao)
609 orb_basis => basis_set_ao(ibasis)%gto_basis_set
611 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
615 CALL dbt_destroy(t_2c_template)
620 DEALLOCATE (row_bsize, col_bsize)
621 CALL dbt_pgrid_destroy(pgrid_t3c)
622 CALL dbt_pgrid_destroy(pgrid_t2c)
624 CALL timestop(handle)
663 t_3c_O_ind, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, &
664 fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, &
665 fm_mo_coeff_virt_scaled, starts_array_mc, ends_array_mc, &
666 starts_array_mc_block, ends_array_mc_block, num_integ_points, &
667 nmo, Eigenval, tau_tj, tau_wj, cut_memory, Pspin, Qspin, &
668 open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
671 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega
672 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m, t_3c_o
675 TYPE(
cp_fm_type),
INTENT(IN) :: fm_scaled_dm_occ_tau, &
676 fm_scaled_dm_virt_tau
677 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mo_coeff_occ, fm_mo_coeff_virt
678 TYPE(
cp_fm_type),
INTENT(IN) :: fm_mo_coeff_occ_scaled, &
679 fm_mo_coeff_virt_scaled
680 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
681 starts_array_mc_block, &
683 INTEGER,
INTENT(IN) :: num_integ_points, nmo
684 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
685 REAL(kind=
dp),
DIMENSION(num_integ_points), &
687 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
689 INTEGER,
INTENT(IN) :: cut_memory, pspin, qspin
690 LOGICAL,
INTENT(IN) :: open_shell
691 INTEGER,
INTENT(IN) :: unit_nr
692 REAL(
dp),
INTENT(INOUT) :: dbcsr_time
693 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
697 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_laplace_loop_forces'
699 INTEGER :: dummy_int, handle, handle2, i_mem, i_xyz, ibasis, ispin, j_xyz, jquad, k_xyz, &
700 n_mem_ri, n_rep, natom, nkind, nspins, unit_nr_dbcsr
701 INTEGER(int_8) :: flop, nze, nze_ddint, nze_der_ao, &
703 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, batch_blk_end, &
704 batch_blk_start, batch_end_ri, &
705 batch_start_ri, kind_of, mc_ranges, &
707 INTEGER,
DIMENSION(:, :),
POINTER :: dummy_ptr
708 LOGICAL :: memory_info, use_virial
709 REAL(
dp) :: eps_filter, eps_pgf_orb, &
710 eps_pgf_orb_old,
fac, occ, occ_ddint, &
711 occ_der_ao, occ_der_ri, occ_kqk, &
712 omega, pref, t1, t2, tau
713 REAL(
dp),
DIMENSION(3, 3) :: work_virial, work_virial_ovlp
716 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
717 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_dm_occ, mat_dm_virt
718 TYPE(
dbcsr_type) :: dbcsr_work1, dbcsr_work2, dbcsr_work3, &
719 exp_occ, exp_virt, r_occ, r_virt, &
720 virial_ovlp, y_1, y_2
721 TYPE(dbt_type) :: t_2c_ao, t_2c_ri, t_2c_ri_2, t_2c_tmp, t_3c_0, t_3c_1, t_3c_3, t_3c_4, &
722 t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_help_1, t_3c_help_2, t_3c_ints, t_3c_sparse, &
723 t_3c_work, t_dm_occ, t_dm_virt, t_kqkt, t_m_occ, t_m_virt, t_q, t_r_occ, t_r_virt
724 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_p
727 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
733 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
737 NULLIFY (matrix_s, dummy_ptr, atomic_kind_set, force, matrix_s, matrix_ks, mat_dm_occ, mat_dm_virt)
738 NULLIFY (dft_control, virial, particle_set, cell, para_env, orb_basis, ri_basis, qs_section)
739 NULLIFY (qs_kind_set)
741 CALL timeset(routinen, handle)
743 CALL get_qs_env(qs_env, matrix_s=matrix_s, natom=natom, atomic_kind_set=atomic_kind_set, &
744 force=force, matrix_ks=matrix_ks, dft_control=dft_control, virial=virial, &
745 particle_set=particle_set, cell=cell, para_env=para_env, nkind=nkind, &
746 qs_kind_set=qs_kind_set)
747 eps_filter = mp2_env%ri_rpa_im_time%eps_filter
748 nspins = dft_control%nspins
750 memory_info = mp2_env%ri_rpa_im_time%memory_info
751 IF (memory_info)
THEN
752 unit_nr_dbcsr = unit_nr
757 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
759 IF (use_virial) virial%pv_calculate = .true.
768 eps_pgf_orb = sqrt(eps_pgf_orb)
770 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
772 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
776 DO ibasis = 1,
SIZE(basis_set_ao)
777 orb_basis => basis_set_ao(ibasis)%gto_basis_set
779 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
785 ALLOCATE (t_p(nspins))
786 CALL dbt_create(force_data%t_2c_K, t_2c_ri)
787 CALL dbt_create(force_data%t_2c_K, t_2c_ri_2)
788 CALL dbt_create(force_data%t_2c_der_ovlp(1), t_2c_ao)
794 ALLOCATE (mc_ranges(cut_memory + 1))
795 mc_ranges(:cut_memory) = starts_array_mc_block(:)
796 mc_ranges(cut_memory + 1) = ends_array_mc_block(cut_memory) + 1
799 n_mem_ri = cut_memory
801 batch_blk_start, batch_blk_end)
802 ALLOCATE (mc_ranges_ri(n_mem_ri + 1))
803 mc_ranges_ri(1:n_mem_ri) = batch_blk_start(1:n_mem_ri)
804 mc_ranges_ri(n_mem_ri + 1) = batch_blk_end(n_mem_ri) + 1
805 DEALLOCATE (batch_blk_start, batch_blk_end)
809 CALL dbt_create(t_2c_ri, t_p(ispin))
811 CALL dbt_create(t_2c_ri, t_q)
812 CALL dbt_create(t_2c_ri, t_kqkt)
813 CALL dbt_create(t_2c_ao, t_dm_occ)
814 CALL dbt_create(t_2c_ao, t_dm_virt)
817 CALL dbt_create(t_3c_o, t_m_occ)
818 CALL dbt_create(t_3c_o, t_m_virt)
819 CALL dbt_create(t_3c_o, t_3c_0)
821 CALL dbt_create(t_3c_o, t_3c_1)
822 CALL dbt_create(t_3c_o, t_3c_3)
823 CALL dbt_create(t_3c_o, t_3c_4)
824 CALL dbt_create(t_3c_o, t_3c_5)
825 CALL dbt_create(t_3c_m, t_3c_6)
826 CALL dbt_create(t_3c_m, t_3c_7)
827 CALL dbt_create(t_3c_m, t_3c_8)
828 CALL dbt_create(t_3c_m, t_3c_sparse)
829 CALL dbt_create(t_3c_o, t_3c_help_1)
830 CALL dbt_create(t_3c_o, t_3c_help_2)
831 CALL dbt_create(t_2c_ao, t_r_occ)
832 CALL dbt_create(t_2c_ao, t_r_virt)
833 CALL dbt_create(t_3c_m, t_3c_ints)
834 CALL dbt_create(t_3c_m, t_3c_work)
837 occ_der_ao = 0; nze_der_ao = 0
838 occ_der_ri = 0; nze_der_ri = 0
840 DO i_mem = 1, cut_memory
841 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
842 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
844 occ_der_ri = occ_der_ri + occ
845 nze_der_ri = nze_der_ri + nze
846 CALL dbt_copy(force_data%t_3c_der_RI(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
848 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
849 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
851 occ_der_ao = occ_der_ao + occ
852 nze_der_ao = nze_der_ao + nze
853 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, order=[1, 3, 2], summation=.true.)
854 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
857 occ_der_ri = occ_der_ri/3.0_dp
858 occ_der_ao = occ_der_ao/3.0_dp
859 nze_der_ri = nze_der_ri/3
860 nze_der_ao = nze_der_ao/3
862 CALL dbcsr_create(r_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
863 CALL dbcsr_create(r_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
864 CALL dbcsr_create(dbcsr_work1, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
865 CALL dbcsr_create(dbcsr_work2, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
866 CALL dbcsr_create(dbcsr_work3, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
867 CALL dbcsr_create(exp_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
868 CALL dbcsr_create(exp_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
869 IF (use_virial)
CALL dbcsr_create(virial_ovlp, template=dbcsr_work1)
871 CALL dbt_batched_contract_init(t_3c_0, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
872 CALL dbt_batched_contract_init(t_3c_1, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
873 CALL dbt_batched_contract_init(t_3c_3, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
874 CALL dbt_batched_contract_init(t_m_occ, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
875 CALL dbt_batched_contract_init(t_m_virt, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
877 CALL dbt_batched_contract_init(t_3c_ints, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
878 CALL dbt_batched_contract_init(t_3c_work, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
880 CALL dbt_batched_contract_init(t_3c_4, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
881 batch_range_3=mc_ranges)
882 CALL dbt_batched_contract_init(t_3c_5, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
883 batch_range_3=mc_ranges)
884 CALL dbt_batched_contract_init(t_3c_6, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
885 batch_range_3=mc_ranges)
886 CALL dbt_batched_contract_init(t_3c_7, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
887 batch_range_3=mc_ranges)
888 CALL dbt_batched_contract_init(t_3c_8, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
889 batch_range_3=mc_ranges)
890 CALL dbt_batched_contract_init(t_3c_sparse, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
891 batch_range_3=mc_ranges)
894 work_virial_ovlp = 0.0_dp
895 DO jquad = 1, num_integ_points
897 omega = tau_wj(jquad)
898 fac = -2.0_dp*omega*mp2_env%scale_S
899 IF (open_shell)
fac = 0.5_dp*
fac
900 occ_ddint = 0; nze_ddint = 0
908 CALL dbt_create(mat_p_omega(jquad, ispin)%matrix, t_2c_tmp)
909 CALL dbt_copy_matrix_to_tensor(mat_p_omega(jquad, ispin)%matrix, t_2c_tmp)
910 CALL dbt_copy(t_2c_tmp, t_p(ispin), move_data=.true.)
911 CALL dbt_filter(t_p(ispin), eps_filter)
912 CALL dbt_destroy(t_2c_tmp)
916 CALL dbt_contract(1.0_dp, t_p(qspin), force_data%t_2c_K, 0.0_dp, t_2c_ri, &
917 contract_1=[2], notcontract_1=[1], &
918 contract_2=[1], notcontract_2=[2], &
919 map_1=[1], map_2=[2], filter_eps=eps_filter, &
920 flop=flop, unit_nr=unit_nr_dbcsr)
921 dbcsr_nflop = dbcsr_nflop + flop
922 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_2c_ri, 0.0_dp, t_q, &
923 contract_1=[1], notcontract_1=[2], &
924 contract_2=[1], notcontract_2=[2], &
925 map_1=[1], map_2=[2], filter_eps=eps_filter, &
926 flop=flop, unit_nr=unit_nr_dbcsr)
927 dbcsr_nflop = dbcsr_nflop + flop
928 CALL dbt_clear(t_2c_ri)
930 CALL perform_2c_ops(force, t_kqkt, force_data,
fac, t_q, t_p(pspin), t_2c_ri, t_2c_ri_2, &
931 use_virial, atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
936 nmo, fm_mo_coeff_occ(pspin), fm_mo_coeff_virt(pspin), &
937 fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, mat_dm_occ, mat_dm_virt, &
938 matrix_s, pspin, eigenval(:, pspin), 0.0_dp, eps_filter, &
939 mp2_env%ri_rpa_im_time%memory_info, unit_nr, &
940 jquad, .false., .false., qs_env, dummy_int, dummy_ptr, para_env)
942 CALL dbt_create(mat_dm_occ(jquad, 1)%matrix, t_2c_tmp)
943 CALL dbt_copy_matrix_to_tensor(mat_dm_occ(jquad, 1)%matrix, t_2c_tmp)
944 CALL dbt_copy(t_2c_tmp, t_dm_occ, move_data=.true.)
945 CALL dbt_filter(t_dm_occ, eps_filter)
946 CALL dbt_destroy(t_2c_tmp)
948 CALL dbt_create(mat_dm_virt(jquad, 1)%matrix, t_2c_tmp)
949 CALL dbt_copy_matrix_to_tensor(mat_dm_virt(jquad, 1)%matrix, t_2c_tmp)
950 CALL dbt_copy(t_2c_tmp, t_dm_virt, move_data=.true.)
951 CALL dbt_filter(t_dm_virt, eps_filter)
952 CALL dbt_destroy(t_2c_tmp)
955 CALL perform_3c_ops(force, t_r_occ, t_r_virt, force_data,
fac, cut_memory, n_mem_ri, &
956 t_kqkt, t_dm_occ, t_dm_virt, t_3c_o, t_3c_m, t_m_occ, t_m_virt, t_3c_0, t_3c_1, &
957 t_3c_3, t_3c_4, t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_sparse, t_3c_help_1, t_3c_help_2, &
958 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_ri, &
959 batch_end_ri, t_3c_o_compressed, t_3c_o_ind, use_virial, &
960 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
961 unit_nr_dbcsr, mp2_env)
963 CALL timeset(routinen//
"_dbcsr", handle2)
966 CALL dbt_create(matrix_s(1)%matrix, t_2c_tmp)
967 CALL dbt_copy(t_r_occ, t_2c_tmp, move_data=.true.)
968 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_occ)
970 CALL dbt_copy(t_r_virt, t_2c_tmp, move_data=.true.)
971 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_virt)
974 CALL dbcsr_multiply(
'N',
'N', tau, force_data%P_occ(pspin)%matrix, &
975 matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
976 CALL build_y_matrix(y_1, dbcsr_work1, force_data%P_occ(pspin)%matrix, r_virt, eps_filter)
979 CALL dbcsr_multiply(
'N',
'N', -tau, force_data%P_virt(pspin)%matrix, &
980 matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
981 CALL build_y_matrix(y_2, dbcsr_work1, force_data%P_virt(pspin)%matrix, r_occ, eps_filter)
986 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, r_occ, force_data%inv_ovlp, 0.0_dp, dbcsr_work1)
987 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, exp_virt, dbcsr_work1, 0.0_dp, dbcsr_work3)
988 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, force_data%inv_ovlp, dbcsr_work3, 0.0_dp, dbcsr_work2)
990 CALL dbcsr_multiply(
'N',
'T', tau, force_data%inv_ovlp, y_2, 0.0_dp, dbcsr_work3)
991 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work3, matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
992 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work1, force_data%inv_ovlp, 0.0_dp, dbcsr_work3)
994 CALL dbcsr_add(dbcsr_work2, dbcsr_work3, 1.0_dp, -1.0_dp)
996 CALL dbt_copy_matrix_to_tensor(dbcsr_work2, t_2c_tmp)
997 CALL dbt_copy(t_2c_tmp, t_2c_ao, move_data=.true.)
1000 CALL get_2c_der_force(force, t_2c_ao, force_data%t_2c_der_ovlp, atom_of_kind, &
1001 kind_of, force_data%idx_to_at_AO, pref, do_ovlp=.true.)
1003 IF (use_virial)
CALL dbcsr_add(virial_ovlp, dbcsr_work2, 1.0_dp, pref)
1006 CALL dbcsr_multiply(
'N',
'N', tau*
fac, y_1, force_data%P_occ(pspin)%matrix, 1.0_dp, &
1007 force_data%sum_YP_tau(pspin)%matrix, retain_sparsity=.true.)
1008 CALL dbcsr_multiply(
'N',
'N', -tau*
fac, y_2, force_data%P_virt(pspin)%matrix, 1.0_dp, &
1009 force_data%sum_YP_tau(pspin)%matrix, retain_sparsity=.true.)
1012 pref = -omega*mp2_env%scale_S
1014 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1016 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1017 CALL dbcsr_multiply(
'N',
'N', pref*tau, matrix_ks(pspin)%matrix, y_1, 1.0_dp, &
1018 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1019 CALL dbcsr_multiply(
'N',
'N', pref*tau, matrix_ks(pspin)%matrix, y_2, 1.0_dp, &
1020 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1022 CALL timestop(handle2)
1025 CALL para_env%sync()
1027 dbcsr_time = dbcsr_time + t2 - t1
1029 IF (unit_nr > 0)
THEN
1030 WRITE (unit_nr,
'(/T3,A,1X,I3,A)') &
1031 'RPA_LOW_SCALING_INFO| Info for time point', jquad,
' (gradients)'
1032 WRITE (unit_nr,
'(T6,A,T56,F25.6)') &
1033 'Execution time (s):', t2 - t1
1034 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1035 'Occupancy of 3c AO derivs:', real(nze_der_ao,
dp),
'/', occ_der_ao*100,
'%'
1036 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1037 'Occupancy of 3c RI derivs:', real(nze_der_ri,
dp),
'/', occ_der_ri*100,
'%'
1038 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1039 'Occupancy of the Docc * Dvirt * 3c-int tensor', real(nze_ddint,
dp),
'/', occ_ddint*100,
'%'
1040 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1041 'Occupancy of KQK^T 2c-tensor:', real(nze_kqk,
dp),
'/', occ_kqk*100,
'%'
1048 CALL dbt_destroy(t_2c_tmp)
1051 CALL dbt_batched_contract_finalize(t_3c_0)
1052 CALL dbt_batched_contract_finalize(t_3c_1)
1053 CALL dbt_batched_contract_finalize(t_3c_3)
1054 CALL dbt_batched_contract_finalize(t_m_occ)
1055 CALL dbt_batched_contract_finalize(t_m_virt)
1057 CALL dbt_batched_contract_finalize(t_3c_ints)
1058 CALL dbt_batched_contract_finalize(t_3c_work)
1060 CALL dbt_batched_contract_finalize(t_3c_4)
1061 CALL dbt_batched_contract_finalize(t_3c_5)
1062 CALL dbt_batched_contract_finalize(t_3c_6)
1063 CALL dbt_batched_contract_finalize(t_3c_7)
1064 CALL dbt_batched_contract_finalize(t_3c_8)
1065 CALL dbt_batched_contract_finalize(t_3c_sparse)
1068 IF (use_virial)
THEN
1069 CALL dbt_copy(force_data%t_3c_virial_split, force_data%t_3c_virial, move_data=.true.)
1070 CALL calc_3c_virial(work_virial, force_data%t_3c_virial, 1.0_dp, qs_env, force_data%nl_3c, &
1071 basis_set_ri_aux, basis_set_ao, basis_set_ao, mp2_env%ri_metric, &
1072 der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1)
1074 CALL calc_2c_virial(work_virial, force_data%RI_virial_met, 1.0_dp, qs_env, force_data%nl_2c_met, &
1075 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
1078 IF (.NOT. force_data%do_periodic)
THEN
1079 CALL calc_2c_virial(work_virial, force_data%RI_virial_pot, 1.0_dp, qs_env, force_data%nl_2c_pot, &
1080 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
1085 CALL calc_2c_virial(work_virial_ovlp, virial_ovlp, 1.0_dp, qs_env, force_data%nl_2c_ovlp, &
1086 basis_set_ao, basis_set_ao, identity_pot)
1092 virial%pv_mp2(i_xyz, j_xyz) = virial%pv_mp2(i_xyz, j_xyz) &
1093 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1094 virial%pv_overlap(i_xyz, j_xyz) = virial%pv_overlap(i_xyz, j_xyz) &
1095 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1096 virial%pv_virial(i_xyz, j_xyz) = virial%pv_virial(i_xyz, j_xyz) &
1097 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz) &
1098 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1105 work_virial = 0.0_dp
1106 IF (force_data%do_periodic)
THEN
1108 CALL get_2c_gpw_forces(force_data%G_PQ, force, work_virial, use_virial, mp2_env, qs_env)
1109 ELSE IF (mp2_env%eri_method ==
do_eri_mme)
THEN
1110 CALL get_2c_mme_forces(force_data%G_PQ, force, mp2_env, qs_env)
1111 IF (use_virial) cpabort(
"Stress tensor not available with MME intrgrals")
1113 cpabort(
"Periodic case not possible with OS integrals")
1118 IF (use_virial)
THEN
1119 virial%pv_mp2 = virial%pv_mp2 + work_virial
1120 virial%pv_virial = virial%pv_virial + work_virial
1121 virial%pv_calculate = .false.
1123 DO ibasis = 1,
SIZE(basis_set_ao)
1124 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1126 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1132 IF (
ASSOCIATED(dummy_ptr))
DEALLOCATE (dummy_ptr)
1133 DO ispin = 1, nspins
1134 CALL dbt_destroy(t_p(ispin))
1136 CALL dbt_destroy(t_3c_0)
1137 CALL dbt_destroy(t_3c_1)
1138 CALL dbt_destroy(t_3c_3)
1139 CALL dbt_destroy(t_3c_4)
1140 CALL dbt_destroy(t_3c_5)
1141 CALL dbt_destroy(t_3c_6)
1142 CALL dbt_destroy(t_3c_7)
1143 CALL dbt_destroy(t_3c_8)
1144 CALL dbt_destroy(t_3c_sparse)
1145 CALL dbt_destroy(t_3c_help_1)
1146 CALL dbt_destroy(t_3c_help_2)
1147 CALL dbt_destroy(t_3c_ints)
1148 CALL dbt_destroy(t_3c_work)
1149 CALL dbt_destroy(t_r_occ)
1150 CALL dbt_destroy(t_r_virt)
1151 CALL dbt_destroy(t_dm_occ)
1152 CALL dbt_destroy(t_dm_virt)
1153 CALL dbt_destroy(t_q)
1154 CALL dbt_destroy(t_kqkt)
1155 CALL dbt_destroy(t_m_occ)
1156 CALL dbt_destroy(t_m_virt)
1165 CALL dbt_destroy(t_2c_ri)
1166 CALL dbt_destroy(t_2c_ri_2)
1167 CALL dbt_destroy(t_2c_ao)
1171 CALL timestop(handle)
1213 t_3c_O_ind, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, &
1214 fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, &
1215 fm_mo_coeff_virt_scaled, starts_array_mc, ends_array_mc, &
1216 starts_array_mc_block, ends_array_mc_block, num_integ_points, &
1217 nmo, Eigenval, e_fermi, weights_cos_tf_t_to_w, weights_cos_tf_w_to_t, &
1218 tj, wj, tau_tj, cut_memory, ispin, open_shell, unit_nr, dbcsr_time, &
1219 dbcsr_nflop, mp2_env, qs_env)
1222 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega
1223 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m, t_3c_o
1226 TYPE(
cp_fm_type),
INTENT(IN) :: fm_scaled_dm_occ_tau, &
1227 fm_scaled_dm_virt_tau
1228 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mo_coeff_occ, fm_mo_coeff_virt
1229 TYPE(
cp_fm_type),
INTENT(IN) :: fm_mo_coeff_occ_scaled, &
1230 fm_mo_coeff_virt_scaled
1231 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
1232 starts_array_mc_block, &
1234 INTEGER,
INTENT(IN) :: num_integ_points, nmo
1235 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
1236 REAL(kind=
dp),
INTENT(IN) :: e_fermi
1237 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
1238 INTENT(IN) :: weights_cos_tf_t_to_w, &
1239 weights_cos_tf_w_to_t
1240 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1241 INTENT(IN) :: tj, wj
1242 REAL(kind=
dp),
DIMENSION(num_integ_points), &
1243 INTENT(IN) :: tau_tj
1244 INTEGER,
INTENT(IN) :: cut_memory, ispin
1245 LOGICAL,
INTENT(IN) :: open_shell
1246 INTEGER,
INTENT(IN) :: unit_nr
1247 REAL(
dp),
INTENT(INOUT) :: dbcsr_time
1248 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
1252 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_rpa_loop_forces'
1254 INTEGER :: dummy_int, handle, handle2, i_mem, i_xyz, ibasis, iquad, j_xyz, jquad, k_xyz, &
1255 n_mem_ri, n_rep, natom, nkind, nspins, unit_nr_dbcsr
1256 INTEGER(int_8) :: flop, nze, nze_ddint, nze_der_ao, &
1258 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, batch_blk_end, &
1259 batch_blk_start, batch_end_ri, &
1260 batch_start_ri, kind_of, mc_ranges, &
1262 INTEGER,
DIMENSION(:, :),
POINTER :: dummy_ptr
1263 LOGICAL :: memory_info, use_virial
1264 REAL(
dp) :: eps_filter, eps_pgf_orb, eps_pgf_orb_old,
fac, occ, occ_ddint, occ_der_ao, &
1265 occ_der_ri, occ_kbk, omega, pref, spin_fac, t1, t2, tau, weight
1266 REAL(
dp),
DIMENSION(3, 3) :: work_virial, work_virial_ovlp
1270 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_p_tau, matrix_ks, matrix_s
1271 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_dm_occ, mat_dm_virt
1272 TYPE(
dbcsr_type) :: dbcsr_work1, dbcsr_work2, dbcsr_work3, &
1273 dbcsr_work_symm, exp_occ, exp_virt, &
1274 r_occ, r_virt, virial_ovlp, y_1, y_2
1275 TYPE(dbt_type) :: t_2c_ao, t_2c_ri, t_2c_ri_2, t_2c_tmp, t_3c_0, t_3c_1, t_3c_3, t_3c_4, &
1276 t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_help_1, t_3c_help_2, t_3c_ints, t_3c_sparse, &
1277 t_3c_work, t_dm_occ, t_dm_virt, t_kbkt, t_m_occ, t_m_virt, t_p, t_r_occ, t_r_virt
1278 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_b
1281 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
1287 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1291 NULLIFY (matrix_s, dummy_ptr, atomic_kind_set, force, matrix_s, matrix_ks, mat_dm_occ, mat_dm_virt)
1292 NULLIFY (dft_control, virial, particle_set, cell, blacs_env, para_env, orb_basis, ri_basis)
1293 NULLIFY (qs_kind_set)
1295 CALL timeset(routinen, handle)
1297 CALL get_qs_env(qs_env, matrix_s=matrix_s, natom=natom, atomic_kind_set=atomic_kind_set, &
1298 force=force, matrix_ks=matrix_ks, dft_control=dft_control, virial=virial, &
1299 particle_set=particle_set, cell=cell, blacs_env=blacs_env, para_env=para_env, &
1300 qs_kind_set=qs_kind_set, nkind=nkind)
1301 eps_filter = mp2_env%ri_rpa_im_time%eps_filter
1302 nspins = dft_control%nspins
1304 memory_info = mp2_env%ri_rpa_im_time%memory_info
1305 IF (memory_info)
THEN
1306 unit_nr_dbcsr = unit_nr
1311 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
1313 IF (use_virial) virial%pv_calculate = .true.
1315 IF (use_virial)
THEN
1318 IF (n_rep /= 0)
THEN
1322 eps_pgf_orb = sqrt(eps_pgf_orb)
1324 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
1326 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
1330 DO ibasis = 1,
SIZE(basis_set_ao)
1331 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1333 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1339 CALL dbt_create(force_data%t_2c_K, t_2c_ri)
1340 CALL dbt_create(force_data%t_2c_K, t_2c_ri_2)
1341 CALL dbt_create(force_data%t_2c_der_ovlp(1), t_2c_ao)
1347 ALLOCATE (mc_ranges(cut_memory + 1))
1348 mc_ranges(:cut_memory) = starts_array_mc_block(:)
1349 mc_ranges(cut_memory + 1) = ends_array_mc_block(cut_memory) + 1
1352 n_mem_ri = cut_memory
1354 batch_blk_start, batch_blk_end)
1355 ALLOCATE (mc_ranges_ri(n_mem_ri + 1))
1356 mc_ranges_ri(1:n_mem_ri) = batch_blk_start(1:n_mem_ri)
1357 mc_ranges_ri(n_mem_ri + 1) = batch_blk_end(n_mem_ri) + 1
1358 DEALLOCATE (batch_blk_start, batch_blk_end)
1361 CALL dbt_create(t_2c_ri, t_p)
1362 CALL dbt_create(t_2c_ri, t_kbkt)
1363 CALL dbt_create(t_2c_ao, t_dm_occ)
1364 CALL dbt_create(t_2c_ao, t_dm_virt)
1367 CALL dbt_create(t_3c_o, t_m_occ)
1368 CALL dbt_create(t_3c_o, t_m_virt)
1369 CALL dbt_create(t_3c_o, t_3c_0)
1371 CALL dbt_create(t_3c_o, t_3c_1)
1372 CALL dbt_create(t_3c_o, t_3c_3)
1373 CALL dbt_create(t_3c_o, t_3c_4)
1374 CALL dbt_create(t_3c_o, t_3c_5)
1375 CALL dbt_create(t_3c_m, t_3c_6)
1376 CALL dbt_create(t_3c_m, t_3c_7)
1377 CALL dbt_create(t_3c_m, t_3c_8)
1378 CALL dbt_create(t_3c_m, t_3c_sparse)
1379 CALL dbt_create(t_3c_o, t_3c_help_1)
1380 CALL dbt_create(t_3c_o, t_3c_help_2)
1381 CALL dbt_create(t_2c_ao, t_r_occ)
1382 CALL dbt_create(t_2c_ao, t_r_virt)
1383 CALL dbt_create(t_3c_m, t_3c_ints)
1384 CALL dbt_create(t_3c_m, t_3c_work)
1388 ALLOCATE (t_b(num_integ_points))
1389 DO jquad = 1, num_integ_points
1390 CALL dbt_create(t_2c_ri, t_b(jquad))
1393 ALLOCATE (mat_p_tau(num_integ_points))
1394 DO jquad = 1, num_integ_points
1395 ALLOCATE (mat_p_tau(jquad)%matrix)
1396 CALL dbcsr_create(mat_p_tau(jquad)%matrix, template=mat_p_omega(jquad, ispin)%matrix)
1399 CALL dbcsr_create(dbcsr_work_symm, template=force_data%G_PQ, matrix_type=dbcsr_type_symmetric)
1400 CALL dbt_create(dbcsr_work_symm, t_2c_tmp)
1403 DO iquad = 1, num_integ_points
1408 CALL dbcsr_copy(dbcsr_work_symm, mat_p_omega(iquad, 1)%matrix)
1409 CALL dbt_copy_matrix_to_tensor(dbcsr_work_symm, t_2c_tmp)
1410 CALL dbt_copy(t_2c_tmp, t_2c_ri, move_data=.true.)
1412 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_2c_ri_2, &
1413 contract_1=[2], notcontract_1=[1], &
1414 contract_2=[1], notcontract_2=[2], &
1415 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1416 flop=flop, unit_nr=unit_nr_dbcsr)
1417 dbcsr_nflop = dbcsr_nflop + flop
1418 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_2c_ri_2, 0.0_dp, t_2c_ri, &
1419 contract_1=[1], notcontract_1=[2], &
1420 contract_2=[1], notcontract_2=[2], &
1421 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1422 flop=flop, unit_nr=unit_nr_dbcsr)
1423 CALL dbt_copy(t_2c_ri, t_2c_tmp, move_data=.true.)
1424 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, dbcsr_work_symm)
1432 DO jquad = 1, num_integ_points
1436 weight = weights_cos_tf_w_to_t(jquad, iquad)*cos(tau*omega)
1437 IF (open_shell)
THEN
1438 IF (ispin == 1)
THEN
1440 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 1)%matrix, 1.0_dp, weight)
1441 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 2)%matrix, 1.0_dp, -weight)
1443 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 2)%matrix, 1.0_dp, weight)
1447 weight = 0.5_dp*weight
1448 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 1)%matrix, 1.0_dp, weight)
1452 weight = weights_cos_tf_t_to_w(iquad, jquad)*cos(tau*omega)*wj(iquad)
1453 CALL dbt_copy_matrix_to_tensor(dbcsr_work_symm, t_2c_tmp)
1454 CALL dbt_scale(t_2c_tmp, weight)
1455 CALL dbt_copy(t_2c_tmp, t_b(jquad), summation=.true., move_data=.true.)
1458 CALL dbt_destroy(t_2c_tmp)
1460 CALL dbt_clear(t_2c_ri)
1461 CALL dbt_clear(t_2c_ri_2)
1464 occ_der_ao = 0; nze_der_ao = 0
1465 occ_der_ri = 0; nze_der_ri = 0
1467 DO i_mem = 1, cut_memory
1468 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
1469 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
1471 occ_der_ri = occ_der_ri + occ
1472 nze_der_ri = nze_der_ri + nze
1473 CALL dbt_copy(force_data%t_3c_der_RI(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
1475 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
1476 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
1478 occ_der_ao = occ_der_ao + occ
1479 nze_der_ao = nze_der_ao + nze
1480 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, order=[1, 3, 2], summation=.true.)
1481 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
1484 occ_der_ri = occ_der_ri/3.0_dp
1485 occ_der_ao = occ_der_ao/3.0_dp
1486 nze_der_ri = nze_der_ri/3
1487 nze_der_ao = nze_der_ao/3
1489 CALL dbcsr_create(r_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1490 CALL dbcsr_create(r_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1491 CALL dbcsr_create(dbcsr_work_symm, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_symmetric)
1492 CALL dbcsr_create(dbcsr_work1, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1493 CALL dbcsr_create(dbcsr_work2, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1494 CALL dbcsr_create(dbcsr_work3, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1495 CALL dbcsr_create(exp_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1496 CALL dbcsr_create(exp_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1497 IF (use_virial)
CALL dbcsr_create(virial_ovlp, template=dbcsr_work1)
1499 CALL dbt_batched_contract_init(t_3c_0, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
1500 CALL dbt_batched_contract_init(t_3c_1, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
1501 CALL dbt_batched_contract_init(t_3c_3, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1502 CALL dbt_batched_contract_init(t_m_occ, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1503 CALL dbt_batched_contract_init(t_m_virt, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1505 CALL dbt_batched_contract_init(t_3c_ints, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1506 CALL dbt_batched_contract_init(t_3c_work, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1508 CALL dbt_batched_contract_init(t_3c_4, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1509 batch_range_3=mc_ranges)
1510 CALL dbt_batched_contract_init(t_3c_5, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1511 batch_range_3=mc_ranges)
1512 CALL dbt_batched_contract_init(t_3c_6, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1513 batch_range_3=mc_ranges)
1514 CALL dbt_batched_contract_init(t_3c_7, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1515 batch_range_3=mc_ranges)
1516 CALL dbt_batched_contract_init(t_3c_8, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1517 batch_range_3=mc_ranges)
1518 CALL dbt_batched_contract_init(t_3c_sparse, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1519 batch_range_3=mc_ranges)
1521 fac = 1.0_dp/
fourpi*mp2_env%ri_rpa%scale_rpa
1522 IF (open_shell)
fac = 0.5_dp*
fac
1524 work_virial = 0.0_dp
1525 work_virial_ovlp = 0.0_dp
1526 DO jquad = 1, num_integ_points
1528 occ_ddint = 0; nze_ddint = 0
1530 CALL para_env%sync()
1535 CALL dbt_create(mat_p_tau(jquad)%matrix, t_2c_tmp)
1536 CALL dbt_copy_matrix_to_tensor(mat_p_tau(jquad)%matrix, t_2c_tmp)
1537 CALL dbt_copy(t_2c_tmp, t_p, move_data=.true.)
1538 CALL dbt_filter(t_p, eps_filter)
1539 CALL dbt_destroy(t_2c_tmp)
1541 CALL perform_2c_ops(force, t_kbkt, force_data,
fac, t_b(jquad), t_p, t_2c_ri, t_2c_ri_2, &
1542 use_virial, atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
1547 nmo, fm_mo_coeff_occ(ispin), fm_mo_coeff_virt(ispin), &
1548 fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, mat_dm_occ, mat_dm_virt, &
1549 matrix_s, ispin, eigenval(:, ispin), e_fermi, eps_filter, &
1550 mp2_env%ri_rpa_im_time%memory_info, unit_nr, &
1551 jquad, .false., .false., qs_env, dummy_int, dummy_ptr, para_env)
1553 CALL dbt_create(mat_dm_occ(jquad, 1)%matrix, t_2c_tmp)
1554 CALL dbt_copy_matrix_to_tensor(mat_dm_occ(jquad, 1)%matrix, t_2c_tmp)
1555 CALL dbt_copy(t_2c_tmp, t_dm_occ, move_data=.true.)
1556 CALL dbt_filter(t_dm_occ, eps_filter)
1557 CALL dbt_destroy(t_2c_tmp)
1559 CALL dbt_create(mat_dm_virt(jquad, 1)%matrix, t_2c_tmp)
1560 CALL dbt_copy_matrix_to_tensor(mat_dm_virt(jquad, 1)%matrix, t_2c_tmp)
1561 CALL dbt_copy(t_2c_tmp, t_dm_virt, move_data=.true.)
1562 CALL dbt_filter(t_dm_virt, eps_filter)
1563 CALL dbt_destroy(t_2c_tmp)
1566 CALL perform_3c_ops(force, t_r_occ, t_r_virt, force_data,
fac, cut_memory, n_mem_ri, &
1567 t_kbkt, t_dm_occ, t_dm_virt, t_3c_o, t_3c_m, t_m_occ, t_m_virt, t_3c_0, t_3c_1, &
1568 t_3c_3, t_3c_4, t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_sparse, t_3c_help_1, t_3c_help_2, &
1569 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_ri, &
1570 batch_end_ri, t_3c_o_compressed, t_3c_o_ind, use_virial, &
1571 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
1572 unit_nr_dbcsr, mp2_env)
1574 CALL timeset(routinen//
"_dbcsr", handle2)
1577 CALL dbt_create(matrix_s(1)%matrix, t_2c_tmp)
1578 CALL dbt_copy(t_r_occ, t_2c_tmp, move_data=.true.)
1579 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_occ)
1581 CALL dbt_copy(t_r_virt, t_2c_tmp, move_data=.true.)
1582 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_virt)
1585 CALL dbcsr_copy(dbcsr_work_symm, matrix_ks(ispin)%matrix)
1586 CALL dbcsr_add(dbcsr_work_symm, matrix_s(1)%matrix, 1.0_dp, -e_fermi)
1587 CALL dbcsr_multiply(
'N',
'N', tau, force_data%P_occ(ispin)%matrix, &
1588 dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1589 CALL build_y_matrix(y_1, dbcsr_work1, force_data%P_occ(ispin)%matrix, r_virt, eps_filter)
1592 CALL dbcsr_multiply(
'N',
'N', -tau, force_data%P_virt(ispin)%matrix, &
1593 dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1594 CALL build_y_matrix(y_2, dbcsr_work1, force_data%P_virt(ispin)%matrix, r_occ, eps_filter)
1600 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, r_occ, force_data%inv_ovlp, 0.0_dp, dbcsr_work1)
1601 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, exp_virt, dbcsr_work1, 0.0_dp, dbcsr_work3)
1602 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, force_data%inv_ovlp, dbcsr_work3, 0.0_dp, dbcsr_work2)
1604 CALL dbcsr_multiply(
'N',
'T', tau, force_data%inv_ovlp, y_2, 0.0_dp, dbcsr_work3)
1605 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work3, dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1606 CALL dbcsr_multiply(
'N',
'N', -1.0_dp, dbcsr_work1, force_data%inv_ovlp, 1.0_dp, dbcsr_work2)
1608 CALL dbcsr_multiply(
'N',
'T', tau*e_fermi, force_data%P_occ(ispin)%matrix, y_1, 1.0_dp, dbcsr_work2)
1609 CALL dbcsr_multiply(
'N',
'T', -tau*e_fermi, force_data%P_virt(ispin)%matrix, y_2, 1.0_dp, dbcsr_work2)
1611 CALL dbt_copy_matrix_to_tensor(dbcsr_work2, t_2c_tmp)
1612 CALL dbt_copy(t_2c_tmp, t_2c_ao, move_data=.true.)
1615 CALL get_2c_der_force(force, t_2c_ao, force_data%t_2c_der_ovlp, atom_of_kind, &
1616 kind_of, force_data%idx_to_at_AO, pref, do_ovlp=.true.)
1618 IF (use_virial)
CALL dbcsr_add(virial_ovlp, dbcsr_work2, 1.0_dp, pref)
1621 CALL dbcsr_multiply(
'N',
'N',
fac*tau, y_1, force_data%P_occ(ispin)%matrix, 1.0_dp, &
1622 force_data%sum_YP_tau(ispin)%matrix, retain_sparsity=.true.)
1623 CALL dbcsr_multiply(
'N',
'N', -
fac*tau, y_2, force_data%P_virt(ispin)%matrix, 1.0_dp, &
1624 force_data%sum_YP_tau(ispin)%matrix, retain_sparsity=.true.)
1626 spin_fac = 0.5_dp*
fac
1627 IF (open_shell) spin_fac = 2.0_dp*spin_fac
1629 CALL dbcsr_multiply(
'N',
'N', 1.0_dp*spin_fac, r_virt, exp_occ, 1.0_dp, &
1630 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1631 CALL dbcsr_multiply(
'N',
'N', -1.0_dp*spin_fac, r_occ, exp_virt, 1.0_dp, &
1632 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1633 CALL dbcsr_multiply(
'N',
'N', tau*spin_fac, dbcsr_work_symm, y_1, 1.0_dp, &
1634 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1635 CALL dbcsr_multiply(
'N',
'N', tau*spin_fac, dbcsr_work_symm, y_2, 1.0_dp, &
1636 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1638 CALL timestop(handle2)
1641 CALL para_env%sync()
1643 dbcsr_time = dbcsr_time + t2 - t1
1645 IF (unit_nr > 0)
THEN
1646 WRITE (unit_nr,
'(/T3,A,1X,I3,A)') &
1647 'RPA_LOW_SCALING_INFO| Info for time point', jquad,
' (gradients)'
1648 WRITE (unit_nr,
'(T6,A,T56,F25.6)') &
1650 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1651 'Occupancy of 3c AO derivs:', real(nze_der_ao,
dp),
'/', occ_der_ao*100,
'%'
1652 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1653 'Occupancy of 3c RI derivs:', real(nze_der_ri,
dp),
'/', occ_der_ri*100,
'%'
1654 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1655 'Occupancy of the Docc * Dvirt * 3c-int tensor', real(nze_ddint,
dp),
'/', occ_ddint*100,
'%'
1656 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1657 'Occupancy of KBK^T 2c-tensor:', real(nze_kbk,
dp),
'/', occ_kbk*100,
'%'
1664 CALL dbt_destroy(t_2c_tmp)
1668 CALL dbt_batched_contract_finalize(t_3c_0)
1669 CALL dbt_batched_contract_finalize(t_3c_1)
1670 CALL dbt_batched_contract_finalize(t_3c_3)
1671 CALL dbt_batched_contract_finalize(t_m_occ)
1672 CALL dbt_batched_contract_finalize(t_m_virt)
1674 CALL dbt_batched_contract_finalize(t_3c_ints)
1675 CALL dbt_batched_contract_finalize(t_3c_work)
1677 CALL dbt_batched_contract_finalize(t_3c_4)
1678 CALL dbt_batched_contract_finalize(t_3c_5)
1679 CALL dbt_batched_contract_finalize(t_3c_6)
1680 CALL dbt_batched_contract_finalize(t_3c_7)
1681 CALL dbt_batched_contract_finalize(t_3c_8)
1682 CALL dbt_batched_contract_finalize(t_3c_sparse)
1685 IF (use_virial)
THEN
1686 CALL dbt_copy(force_data%t_3c_virial_split, force_data%t_3c_virial, move_data=.true.)
1687 CALL calc_3c_virial(work_virial, force_data%t_3c_virial, 1.0_dp, qs_env, force_data%nl_3c, &
1688 basis_set_ri_aux, basis_set_ao, basis_set_ao, mp2_env%ri_metric, &
1689 der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1)
1691 CALL calc_2c_virial(work_virial, force_data%RI_virial_met, 1.0_dp, qs_env, force_data%nl_2c_met, &
1692 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
1695 IF (.NOT. force_data%do_periodic)
THEN
1696 CALL calc_2c_virial(work_virial, force_data%RI_virial_pot, 1.0_dp, qs_env, force_data%nl_2c_pot, &
1697 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
1702 CALL calc_2c_virial(work_virial_ovlp, virial_ovlp, 1.0_dp, qs_env, force_data%nl_2c_ovlp, &
1703 basis_set_ao, basis_set_ao, identity_pot)
1709 virial%pv_mp2(i_xyz, j_xyz) = virial%pv_mp2(i_xyz, j_xyz) &
1710 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1711 virial%pv_overlap(i_xyz, j_xyz) = virial%pv_overlap(i_xyz, j_xyz) &
1712 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1713 virial%pv_virial(i_xyz, j_xyz) = virial%pv_virial(i_xyz, j_xyz) &
1714 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz) &
1715 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1722 work_virial = 0.0_dp
1723 IF (force_data%do_periodic)
THEN
1725 CALL get_2c_gpw_forces(force_data%G_PQ, force, work_virial, use_virial, mp2_env, qs_env)
1726 ELSE IF (mp2_env%eri_method ==
do_eri_mme)
THEN
1727 CALL get_2c_mme_forces(force_data%G_PQ, force, mp2_env, qs_env)
1728 IF (use_virial) cpabort(
"Stress tensor not available with MME intrgrals")
1730 cpabort(
"Periodic case not possible with OS integrals")
1735 IF (use_virial)
THEN
1736 virial%pv_mp2 = virial%pv_mp2 + work_virial
1737 virial%pv_virial = virial%pv_virial + work_virial
1738 virial%pv_calculate = .false.
1740 DO ibasis = 1,
SIZE(basis_set_ao)
1741 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1743 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1749 IF (
ASSOCIATED(dummy_ptr))
DEALLOCATE (dummy_ptr)
1750 DO jquad = 1, num_integ_points
1751 CALL dbt_destroy(t_b(jquad))
1753 CALL dbt_destroy(t_p)
1754 CALL dbt_destroy(t_3c_0)
1755 CALL dbt_destroy(t_3c_1)
1756 CALL dbt_destroy(t_3c_3)
1757 CALL dbt_destroy(t_3c_4)
1758 CALL dbt_destroy(t_3c_5)
1759 CALL dbt_destroy(t_3c_6)
1760 CALL dbt_destroy(t_3c_7)
1761 CALL dbt_destroy(t_3c_8)
1762 CALL dbt_destroy(t_3c_sparse)
1763 CALL dbt_destroy(t_3c_help_1)
1764 CALL dbt_destroy(t_3c_help_2)
1765 CALL dbt_destroy(t_3c_ints)
1766 CALL dbt_destroy(t_3c_work)
1767 CALL dbt_destroy(t_r_occ)
1768 CALL dbt_destroy(t_r_virt)
1769 CALL dbt_destroy(t_dm_occ)
1770 CALL dbt_destroy(t_dm_virt)
1771 CALL dbt_destroy(t_kbkt)
1772 CALL dbt_destroy(t_m_occ)
1773 CALL dbt_destroy(t_m_virt)
1783 CALL dbt_destroy(t_2c_ri)
1784 CALL dbt_destroy(t_2c_ri_2)
1785 CALL dbt_destroy(t_2c_ao)
1790 CALL timestop(handle)
1812 SUBROUTINE perform_2c_ops(force, t_KBKT, force_data, fac, t_B, t_P, t_2c_RI, t_2c_RI_2, use_virial, &
1813 atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
1816 TYPE(dbt_type),
INTENT(INOUT) :: t_kbkt
1818 REAL(
dp),
INTENT(IN) ::
fac
1819 TYPE(dbt_type),
INTENT(INOUT) :: t_b, t_p, t_2c_ri, t_2c_ri_2
1820 LOGICAL,
INTENT(IN) :: use_virial
1821 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind, kind_of
1822 REAL(
dp),
INTENT(IN) :: eps_filter
1823 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
1824 INTEGER,
INTENT(IN) :: unit_nr_dbcsr
1826 CHARACTER(LEN=*),
PARAMETER :: routinen =
'perform_2c_ops'
1829 INTEGER(int_8) :: flop
1831 TYPE(dbt_type) :: t_2c_tmp, t_2c_virial
1833 CALL timeset(routinen, handle)
1835 IF (use_virial)
CALL dbt_create(force_data%RI_virial_pot, t_2c_virial)
1838 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_b, 0.0_dp, t_2c_ri, &
1839 contract_1=[2], notcontract_1=[1], &
1840 contract_2=[1], notcontract_2=[2], &
1841 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1842 flop=flop, unit_nr=unit_nr_dbcsr)
1843 dbcsr_nflop = dbcsr_nflop + flop
1845 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_kbkt, &
1846 contract_1=[2], notcontract_1=[1], &
1847 contract_2=[2], notcontract_2=[1], &
1848 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1849 flop=flop, unit_nr=unit_nr_dbcsr)
1850 dbcsr_nflop = dbcsr_nflop + flop
1852 CALL dbt_contract(2.0_dp, t_p, t_2c_ri, 0.0_dp, t_2c_ri_2, &
1853 contract_1=[2], notcontract_1=[1], &
1854 contract_2=[1], notcontract_2=[2], &
1855 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1856 flop=flop, unit_nr=unit_nr_dbcsr)
1857 dbcsr_nflop = dbcsr_nflop + flop
1858 CALL dbt_clear(t_2c_ri)
1862 CALL dbt_contract(1.0_dp, force_data%t_2c_inv_metric, t_2c_ri_2, 0.0_dp, t_2c_ri, &
1863 contract_1=[2], notcontract_1=[1], &
1864 contract_2=[1], notcontract_2=[2], &
1865 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1866 flop=flop, unit_nr=unit_nr_dbcsr)
1867 dbcsr_nflop = dbcsr_nflop + flop
1869 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_2c_ri_2, &
1870 contract_1=[2], notcontract_1=[1], &
1871 contract_2=[2], notcontract_2=[1], &
1872 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1873 flop=flop, unit_nr=unit_nr_dbcsr)
1874 dbcsr_nflop = dbcsr_nflop + flop
1878 CALL get_2c_der_force(force, t_2c_ri_2, force_data%t_2c_der_metric, atom_of_kind, &
1879 kind_of, force_data%idx_to_at_RI, pref, do_mp2=.true.)
1880 IF (use_virial)
THEN
1881 CALL dbt_copy(t_2c_ri_2, t_2c_virial)
1882 CALL dbt_scale(t_2c_virial, pref)
1883 CALL dbt_copy_tensor_to_matrix(t_2c_virial, force_data%RI_virial_met, summation=.true.)
1884 CALL dbt_clear(t_2c_virial)
1889 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_pot_msqrt, 0.0_dp, t_2c_ri_2, &
1890 contract_1=[2], notcontract_1=[1], &
1891 contract_2=[1], notcontract_2=[2], &
1892 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1893 flop=flop, unit_nr=unit_nr_dbcsr)
1894 dbcsr_nflop = dbcsr_nflop + flop
1898 IF (force_data%do_periodic)
THEN
1899 CALL dbt_scale(t_2c_ri_2, pref)
1900 CALL dbt_create(force_data%G_PQ, t_2c_tmp)
1901 CALL dbt_copy(t_2c_ri_2, t_2c_tmp, move_data=.true.)
1902 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, force_data%G_PQ, summation=.true.)
1903 CALL dbt_destroy(t_2c_tmp)
1905 CALL get_2c_der_force(force, t_2c_ri_2, force_data%t_2c_der_pot, atom_of_kind, &
1906 kind_of, force_data%idx_to_at_RI, pref, do_mp2=.true.)
1908 IF (use_virial)
THEN
1909 CALL dbt_copy(t_2c_ri_2, t_2c_virial)
1910 CALL dbt_scale(t_2c_virial, pref)
1911 CALL dbt_copy_tensor_to_matrix(t_2c_virial, force_data%RI_virial_pot, summation=.true.)
1912 CALL dbt_clear(t_2c_virial)
1916 CALL dbt_clear(t_2c_ri)
1917 CALL dbt_clear(t_2c_ri_2)
1919 IF (use_virial)
CALL dbt_destroy(t_2c_virial)
1921 CALL timestop(handle)
1923 END SUBROUTINE perform_2c_ops
1971 SUBROUTINE perform_3c_ops(force, t_R_occ, t_R_virt, force_data, fac, cut_memory, n_mem_RI, &
1972 t_KBKT, t_dm_occ, t_dm_virt, t_3c_O, t_3c_M, t_M_occ, t_M_virt, t_3c_0, t_3c_1, &
1973 t_3c_3, t_3c_4, t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_sparse, t_3c_help_1, t_3c_help_2, &
1974 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_RI, &
1975 batch_end_RI, t_3c_O_compressed, t_3c_O_ind, use_virial, &
1976 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
1977 unit_nr_dbcsr, mp2_env)
1980 TYPE(dbt_type),
INTENT(INOUT) :: t_r_occ, t_r_virt
1982 REAL(
dp),
INTENT(IN) ::
fac
1983 INTEGER,
INTENT(IN) :: cut_memory, n_mem_ri
1984 TYPE(dbt_type),
INTENT(INOUT) :: t_kbkt, t_dm_occ, t_dm_virt, t_3c_o, t_3c_m, t_m_occ, &
1985 t_m_virt, t_3c_0, t_3c_1, t_3c_3, t_3c_4, t_3c_5, t_3c_6, t_3c_7, t_3c_8, t_3c_sparse, &
1986 t_3c_help_1, t_3c_help_2, t_3c_ints, t_3c_work
1987 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
1988 batch_start_ri, batch_end_ri
1991 LOGICAL,
INTENT(IN) :: use_virial
1992 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind, kind_of
1993 REAL(
dp),
INTENT(IN) :: eps_filter
1994 REAL(
dp),
INTENT(INOUT) :: occ_ddint
1995 INTEGER(int_8),
INTENT(INOUT) :: nze_ddint, dbcsr_nflop
1996 INTEGER,
INTENT(IN) :: unit_nr_dbcsr
1999 CHARACTER(LEN=*),
PARAMETER :: routinen =
'perform_3c_ops'
2001 INTEGER :: dummy_int, handle, handle2, i_mem, &
2003 INTEGER(int_8) :: flop, nze
2004 INTEGER,
DIMENSION(2, 1) :: ibounds, jbounds, kbounds
2005 INTEGER,
DIMENSION(2, 2) :: bounds_2c
2006 INTEGER,
DIMENSION(2, 3) :: bounds_cpy
2007 INTEGER,
DIMENSION(3) :: bounds_3c
2008 REAL(
dp) :: memory, occ, pref
2009 TYPE(
block_ind_type),
ALLOCATABLE,
DIMENSION(:, :) :: blk_indices
2011 DIMENSION(:, :) :: store_3c
2013 CALL timeset(routinen, handle)
2015 CALL dbt_get_info(t_3c_m, nfull_total=bounds_3c)
2018 ALLOCATE (store_3c(n_mem_ri, cut_memory))
2019 ALLOCATE (blk_indices(n_mem_ri, cut_memory))
2021 CALL timeset(routinen//
"_pre_3c", handle2)
2023 CALL dbt_copy(t_3c_o, t_3c_0)
2024 DO i_mem = 1, cut_memory
2025 CALL decompress_tensor(t_3c_o, t_3c_o_ind(i_mem)%ind, t_3c_o_compressed(i_mem), &
2026 mp2_env%ri_rpa_im_time%eps_compress)
2027 CALL dbt_copy(t_3c_o, t_3c_ints)
2028 CALL dbt_copy(t_3c_o, t_3c_0, move_data=.true., summation=.true.)
2030 DO k_mem = 1, n_mem_ri
2031 kbounds(:, 1) = [batch_start_ri(k_mem), batch_end_ri(k_mem)]
2036 CALL dbt_batched_contract_init(t_kbkt)
2037 CALL dbt_contract(1.0_dp, t_kbkt, t_3c_ints, 0.0_dp, t_3c_work, &
2038 contract_1=[2], notcontract_1=[1], &
2039 contract_2=[1], notcontract_2=[2, 3], &
2040 map_1=[1], map_2=[2, 3], filter_eps=eps_filter, &
2041 bounds_2=kbounds, flop=flop, unit_nr=unit_nr_dbcsr)
2042 CALL dbt_batched_contract_finalize(t_kbkt)
2043 dbcsr_nflop = dbcsr_nflop + flop
2045 CALL dbt_copy(t_3c_work, t_3c_m, move_data=.true.)
2046 CALL compress_tensor(t_3c_m, blk_indices(k_mem, i_mem)%ind, store_3c(k_mem, i_mem), &
2047 mp2_env%ri_rpa_im_time%eps_compress, memory)
2050 CALL dbt_clear(t_3c_m)
2051 CALL dbt_copy(t_3c_m, t_3c_ints)
2052 CALL timestop(handle2)
2054 CALL dbt_batched_contract_init(t_r_occ)
2055 CALL dbt_batched_contract_init(t_r_virt)
2056 DO i_mem = 1, cut_memory
2057 ibounds(:, 1) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2060 CALL timeset(routinen//
"_3c_M", handle2)
2061 CALL dbt_batched_contract_init(t_dm_occ)
2062 CALL dbt_contract(1.0_dp, t_3c_0, t_dm_occ, 0.0_dp, t_3c_1, &
2063 contract_1=[3], notcontract_1=[1, 2], &
2064 contract_2=[1], notcontract_2=[2], &
2065 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2066 bounds_3=ibounds, flop=flop, unit_nr=unit_nr_dbcsr)
2067 dbcsr_nflop = dbcsr_nflop + flop
2068 CALL dbt_batched_contract_finalize(t_dm_occ)
2069 CALL dbt_copy(t_3c_1, t_m_occ, order=[1, 3, 2], move_data=.true.)
2071 CALL dbt_batched_contract_init(t_dm_virt)
2072 CALL dbt_contract(1.0_dp, t_3c_0, t_dm_virt, 0.0_dp, t_3c_1, &
2073 contract_1=[3], notcontract_1=[1, 2], &
2074 contract_2=[1], notcontract_2=[2], &
2075 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2076 bounds_3=ibounds, flop=flop, unit_nr=unit_nr_dbcsr)
2077 dbcsr_nflop = dbcsr_nflop + flop
2078 CALL dbt_batched_contract_finalize(t_dm_virt)
2079 CALL dbt_copy(t_3c_1, t_m_virt, order=[1, 3, 2], move_data=.true.)
2080 CALL timestop(handle2)
2083 CALL timeset(routinen//
"_3c_R", handle2)
2084 DO k_mem = 1, n_mem_ri
2085 CALL decompress_tensor(t_3c_m, blk_indices(k_mem, i_mem)%ind, store_3c(k_mem, i_mem), &
2086 mp2_env%ri_rpa_im_time%eps_compress)
2087 CALL dbt_copy(t_3c_m, t_3c_3, move_data=.true.)
2089 CALL dbt_contract(1.0_dp, t_m_occ, t_3c_3, 1.0_dp, t_r_occ, &
2090 contract_1=[1, 2], notcontract_1=[3], &
2091 contract_2=[1, 2], notcontract_2=[3], &
2092 map_1=[1], map_2=[2], filter_eps=eps_filter, &
2093 flop=flop, unit_nr=unit_nr_dbcsr)
2094 dbcsr_nflop = dbcsr_nflop + flop
2096 CALL dbt_contract(1.0_dp, t_m_virt, t_3c_3, 1.0_dp, t_r_virt, &
2097 contract_1=[1, 2], notcontract_1=[3], &
2098 contract_2=[1, 2], notcontract_2=[3], &
2099 map_1=[1], map_2=[2], filter_eps=eps_filter, &
2100 flop=flop, unit_nr=unit_nr_dbcsr)
2101 dbcsr_nflop = dbcsr_nflop + flop
2103 CALL dbt_copy(t_3c_m, t_3c_3)
2104 CALL dbt_copy(t_3c_m, t_m_virt)
2105 CALL timestop(handle2)
2107 CALL dbt_copy(t_m_occ, t_3c_4, move_data=.true.)
2109 DO j_mem = 1, cut_memory
2110 jbounds(:, 1) = [starts_array_mc(j_mem), ends_array_mc(j_mem)]
2112 bounds_cpy(:, 1) = [1, bounds_3c(1)]
2113 bounds_cpy(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2114 bounds_cpy(:, 3) = [starts_array_mc(j_mem), ends_array_mc(j_mem)]
2115 CALL dbt_copy(t_3c_sparse, t_3c_7, bounds=bounds_cpy)
2117 CALL dbt_batched_contract_init(t_dm_virt)
2118 DO k_mem = 1, n_mem_ri
2119 bounds_2c(:, 1) = [batch_start_ri(k_mem), batch_end_ri(k_mem)]
2120 bounds_2c(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2122 CALL timeset(routinen//
"_3c_dm", handle2)
2126 CALL dbt_contract(2.0_dp, t_3c_4, t_dm_virt, 0.0_dp, t_3c_5, &
2127 contract_1=[3], notcontract_1=[1, 2], &
2128 contract_2=[1], notcontract_2=[2], &
2129 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2130 bounds_2=bounds_2c, bounds_3=jbounds, flop=flop, unit_nr=unit_nr_dbcsr)
2131 dbcsr_nflop = dbcsr_nflop + flop
2134 nze_ddint = nze_ddint + nze
2135 occ_ddint = occ_ddint + occ
2137 CALL dbt_copy(t_3c_5, t_3c_6, move_data=.true.)
2138 CALL timestop(handle2)
2141 CALL timeset(routinen//
"_3c_KBK", handle2)
2142 CALL dbt_batched_contract_init(t_kbkt)
2143 CALL dbt_contract(1.0_dp, t_kbkt, t_3c_6, 0.0_dp, t_3c_7, &
2144 contract_1=[2], notcontract_1=[1], &
2145 contract_2=[1], notcontract_2=[2, 3], &
2146 map_1=[1], map_2=[2, 3], &
2147 retain_sparsity=.true., flop=flop, unit_nr=unit_nr_dbcsr)
2148 dbcsr_nflop = dbcsr_nflop + flop
2149 CALL dbt_batched_contract_finalize(t_kbkt)
2150 CALL timestop(handle2)
2151 CALL dbt_copy(t_3c_7, t_3c_8, summation=.true.)
2154 CALL dbt_batched_contract_finalize(t_dm_virt)
2157 CALL dbt_copy(t_3c_8, t_3c_help_1, move_data=.true.)
2160 DO k_mem = 1, cut_memory
2162 CALL dbt_clear(force_data%t_3c_der_RI(i_xyz))
2163 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(k_mem, i_xyz)%ind, &
2164 force_data%t_3c_der_RI_comp(k_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
2167 force_data%idx_to_at_RI, pref, do_mp2=.true., deriv_dim=1)
2170 IF (use_virial)
THEN
2171 CALL dbt_copy(t_3c_help_1, t_3c_help_2)
2172 CALL dbt_scale(t_3c_help_2, pref)
2173 CALL dbt_copy(t_3c_help_2, force_data%t_3c_virial_split, summation=.true., move_data=.true.)
2176 CALL dbt_copy(t_3c_help_1, t_3c_help_2)
2177 CALL dbt_copy(t_3c_help_1, t_3c_help_2, order=[1, 3, 2], move_data=.true., summation=.true.)
2178 DO k_mem = 1, cut_memory
2180 CALL dbt_clear(force_data%t_3c_der_AO(i_xyz))
2181 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(k_mem, i_xyz)%ind, &
2182 force_data%t_3c_der_AO_comp(k_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
2185 force_data%idx_to_at_AO, pref, do_mp2=.true., deriv_dim=3)
2188 CALL dbt_clear(t_3c_help_2)
2190 CALL dbt_batched_contract_finalize(t_r_occ)
2191 CALL dbt_batched_contract_finalize(t_r_virt)
2193 DO k_mem = 1, n_mem_ri
2194 DO i_mem = 1, cut_memory
2198 DEALLOCATE (store_3c, blk_indices)
2200 CALL timestop(handle)
2202 END SUBROUTINE perform_3c_ops
2215 INTEGER,
INTENT(IN) :: unit_nr
2218 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_post_loop_forces'
2220 INTEGER :: handle, ispin, nao, nao_aux, nocc, nspins
2225 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: cpmos, mo_occ
2227 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: dbcsr_p_work, matrix_p_mp2, &
2228 matrix_p_mp2_admm, matrix_s, &
2229 matrix_s_aux, work_admm, yp_admm
2236 NULLIFY (linres_control, p_env, dft_control, matrix_s, mos, mo_coeff, fm_struct, lr_section, &
2237 dbcsr_p_work, yp_admm, matrix_p_mp2, admm_env, work_admm, matrix_s_aux, matrix_p_mp2_admm)
2239 CALL timeset(routinen, handle)
2241 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, mos=mos)
2242 nspins = dft_control%nspins
2249 ALLOCATE (linres_control)
2252 CALL section_vals_val_get(lr_section,
"PRECONDITIONER", i_val=linres_control%preconditioner_type)
2255 linres_control%do_kernel = .true.
2256 linres_control%lr_triplet = .false.
2257 linres_control%converged = .false.
2258 linres_control%eps_filter = qs_env%mp2_env%ri_rpa_im_time%eps_filter
2260 CALL set_qs_env(qs_env, linres_control=linres_control)
2262 IF (unit_nr > 0)
THEN
2264 WRITE (unit_nr,
'(T3,A)')
'MP2_CPHF| Iterative solution of Z-Vector equations'
2265 WRITE (unit_nr,
'(T3,A,T45,ES8.1)')
'MP2_CPHF| Convergence threshold:', linres_control%eps
2266 WRITE (unit_nr,
'(T3,A,T45,I8)')
'MP2_CPHF| Maximum number of iterations: ', linres_control%max_iter
2270 CALL p_env_create(p_env, qs_env, orthogonal_orbitals=.true., linres_control=linres_control)
2277 DO ispin = 1, nspins
2278 ALLOCATE (p_env%p1(ispin)%matrix, p_env%w1(ispin)%matrix, dbcsr_p_work(ispin)%matrix)
2279 CALL dbcsr_create(matrix=p_env%p1(ispin)%matrix, template=matrix_s(1)%matrix)
2280 CALL dbcsr_create(matrix=p_env%w1(ispin)%matrix, template=matrix_s(1)%matrix)
2281 CALL dbcsr_create(matrix=dbcsr_p_work(ispin)%matrix, template=matrix_s(1)%matrix)
2282 CALL dbcsr_copy(p_env%p1(ispin)%matrix, matrix_s(1)%matrix)
2283 CALL dbcsr_copy(p_env%w1(ispin)%matrix, matrix_s(1)%matrix)
2284 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, matrix_s(1)%matrix)
2285 CALL dbcsr_set(p_env%p1(ispin)%matrix, 0.0_dp)
2286 CALL dbcsr_set(p_env%w1(ispin)%matrix, 0.0_dp)
2287 CALL dbcsr_set(dbcsr_p_work(ispin)%matrix, 0.0_dp)
2290 IF (dft_control%do_admm)
THEN
2291 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux)
2294 DO ispin = 1, nspins
2295 ALLOCATE (p_env%p1_admm(ispin)%matrix, work_admm(ispin)%matrix)
2296 CALL dbcsr_create(p_env%p1_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2297 CALL dbcsr_copy(p_env%p1_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2298 CALL dbcsr_set(p_env%p1_admm(ispin)%matrix, 0.0_dp)
2299 CALL dbcsr_create(work_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2300 CALL dbcsr_copy(work_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2301 CALL dbcsr_set(work_admm(ispin)%matrix, 0.0_dp)
2306 CALL prepare_for_response(force_data, qs_env)
2307 ALLOCATE (cpmos(nspins), mo_occ(nspins))
2308 DO ispin = 1, nspins
2309 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, homo=nocc)
2312 template_fmstruct=mo_coeff%matrix_struct)
2331 ext_hfx_section=hfx_section, &
2332 x_data=qs_env%mp2_env%ri_rpa%x_data, &
2333 recalc_integrals=.false., &
2334 do_admm=qs_env%mp2_env%ri_rpa%do_admm, &
2336 reuse_hfx=qs_env%mp2_env%ri_rpa%reuse_hfx)
2340 IF (nspins == 1) focc = 4.0_dp
2341 DO ispin = 1, nspins
2342 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
2344 cpmos(ispin), nocc, &
2345 alpha=focc, beta=0.0_dp)
2352 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
2354 DO ispin = 1, nspins
2355 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, p_env%p1(ispin)%matrix)
2356 CALL dbcsr_add(dbcsr_p_work(ispin)%matrix, force_data%sum_YP_tau(ispin)%matrix, 1.0_dp, 1.0_dp)
2358 CALL set_ks_env(qs_env%ks_env, matrix_p_mp2=dbcsr_p_work)
2360 IF (dft_control%do_admm)
THEN
2362 CALL get_qs_env(qs_env, matrix_p_mp2_admm=matrix_p_mp2_admm, admm_env=admm_env)
2363 nao = admm_env%nao_orb
2364 nao_aux = admm_env%nao_aux_fit
2366 DO ispin = 1, nspins
2369 CALL copy_dbcsr_to_fm(force_data%sum_YP_tau(ispin)%matrix, admm_env%work_orb_orb)
2370 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, admm_env%work_orb_orb, &
2371 0.0_dp, admm_env%work_aux_orb)
2372 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
2373 0.0_dp, admm_env%work_aux_aux)
2374 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_admm(ispin)%matrix, keep_sparsity=.true.)
2377 ALLOCATE (yp_admm(ispin)%matrix)
2378 CALL dbcsr_create(yp_admm(ispin)%matrix, template=work_admm(ispin)%matrix)
2379 CALL dbcsr_copy(yp_admm(ispin)%matrix, work_admm(ispin)%matrix)
2381 CALL dbcsr_add(work_admm(ispin)%matrix, p_env%p1_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
2384 CALL set_ks_env(qs_env%ks_env, matrix_p_mp2_admm=work_admm)
2388 CALL update_im_time_forces(p_env, force_data%sum_O_tau, force_data%sum_YP_tau, yp_admm, qs_env)
2398 CALL timestop(handle)
2408 SUBROUTINE prepare_for_response(force_data, qs_env)
2413 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prepare_for_response'
2415 INTEGER :: handle, ispin, nao, nao_aux, nspins
2416 LOGICAL :: do_hfx, do_tau, do_tau_admm
2417 REAL(
dp) :: ehartree
2419 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: dbcsr_p_work, ker_tau_admm, matrix_s, &
2420 matrix_s_aux, work_admm
2429 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rhoz_r, tauz_r, v_xc, v_xc_tau
2434 NULLIFY (pw_env, rhoz_r, rhoz_g, tauz_r, v_xc, v_xc_tau, &
2435 poisson_env, auxbas_pw_pool, dft_control, admm_env, xc_section, rho, rho_aux_fit, &
2436 task_list_aux_fit, ker_tau_admm, work_admm, dbcsr_p_work, matrix_s, hfx_section)
2438 CALL timeset(routinen, handle)
2440 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, rho=rho, matrix_s=matrix_s)
2441 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
2442 nspins = dft_control%nspins
2445 DO ispin = 1, nspins
2446 ALLOCATE (dbcsr_p_work(ispin)%matrix)
2447 CALL dbcsr_create(matrix=dbcsr_p_work(ispin)%matrix, template=matrix_s(1)%matrix)
2448 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, matrix_s(1)%matrix)
2449 CALL dbcsr_set(dbcsr_p_work(ispin)%matrix, 0.0_dp)
2453 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
2454 DO ispin = 1, nspins
2455 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
2456 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
2458 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
2459 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
2460 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
2463 DO ispin = 1, nspins
2464 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=force_data%sum_YP_tau(ispin)%matrix, &
2465 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin))
2466 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
2472 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
2473 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
2479 ALLOCATE (tauz_r(nspins))
2480 CALL auxbas_pw_pool%create_pw(tauz_g)
2481 DO ispin = 1, nspins
2482 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
2484 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=force_data%sum_YP_tau(ispin)%matrix, &
2485 rho=tauz_r(ispin), rho_gspace=tauz_g, compute_tau=.true.)
2487 CALL auxbas_pw_pool%give_back_pw(tauz_g)
2491 IF (dft_control%do_admm)
THEN
2493 xc_section => admm_env%xc_section_primary
2499 CALL create_kernel(qs_env, v_xc, v_xc_tau, rho, rhoz_r, rhoz_g, tauz_r, xc_section)
2501 DO ispin = 1, nspins
2502 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2503 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
2504 CALL integrate_v_rspace(qs_env=qs_env, &
2505 v_rspace=v_xc(ispin), &
2506 hmat=dbcsr_p_work(ispin), &
2507 calculate_forces=.false.)
2509 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2511 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
2512 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
2513 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
2517 DO ispin = 1, nspins
2518 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2519 CALL integrate_v_rspace(qs_env=qs_env, &
2520 v_rspace=v_xc_tau(ispin), &
2521 hmat=dbcsr_p_work(ispin), &
2522 compute_tau=.true., &
2523 calculate_forces=.false.)
2524 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2526 DEALLOCATE (v_xc_tau)
2530 IF (dft_control%do_admm)
THEN
2532 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux, &
2533 task_list_aux_fit=task_list_aux_fit, rho_aux_fit=rho_aux_fit)
2535 CALL qs_rho_get(rho_aux_fit, tau_r_valid=do_tau_admm)
2539 DO ispin = 1, nspins
2540 ALLOCATE (work_admm(ispin)%matrix, ker_tau_admm(ispin)%matrix)
2541 CALL dbcsr_create(work_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2542 CALL dbcsr_copy(work_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2543 CALL dbcsr_set(work_admm(ispin)%matrix, 0.0_dp)
2544 CALL dbcsr_create(ker_tau_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2545 CALL dbcsr_copy(ker_tau_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2546 CALL dbcsr_set(ker_tau_admm(ispin)%matrix, 0.0_dp)
2550 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2551 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2552 cpassert(
ASSOCIATED(admm_env%work_aux_aux))
2553 nao = admm_env%nao_orb
2554 nao_aux = admm_env%nao_aux_fit
2555 DO ispin = 1, nspins
2556 CALL copy_dbcsr_to_fm(force_data%sum_YP_tau(ispin)%matrix, admm_env%work_orb_orb)
2557 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, admm_env%work_orb_orb, &
2558 0.0_dp, admm_env%work_aux_orb)
2559 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
2560 0.0_dp, admm_env%work_aux_aux)
2561 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, ker_tau_admm(ispin)%matrix, keep_sparsity=.true.)
2565 DO ispin = 1, nspins
2569 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
2570 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
2573 IF (do_tau_admm)
THEN
2576 CALL auxbas_pw_pool%create_pw(tauz_g)
2577 DO ispin = 1, nspins
2580 rho=tauz_r(ispin), rho_gspace=tauz_g, &
2581 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit, &
2584 CALL auxbas_pw_pool%give_back_pw(tauz_g)
2588 xc_section => admm_env%xc_section_aux
2589 CALL create_kernel(qs_env, v_xc, v_xc_tau, rho_aux_fit, rhoz_r, rhoz_g, tauz_r, xc_section)
2591 DO ispin = 1, nspins
2592 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2593 CALL integrate_v_rspace(qs_env=qs_env, &
2594 v_rspace=v_xc(ispin), &
2595 hmat=work_admm(ispin), &
2596 calculate_forces=.false., &
2597 basis_type=
"AUX_FIT", &
2598 task_list_external=task_list_aux_fit)
2599 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2603 IF (do_tau_admm)
THEN
2604 DO ispin = 1, nspins
2605 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2606 CALL integrate_v_rspace(qs_env=qs_env, &
2607 v_rspace=v_xc_tau(ispin), &
2608 hmat=work_admm(ispin), &
2609 calculate_forces=.false., &
2610 basis_type=
"AUX_FIT", &
2611 task_list_external=task_list_aux_fit, &
2613 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2615 DEALLOCATE (v_xc_tau)
2620 DO ispin = 1, nspins
2621 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
2622 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
2624 DEALLOCATE (rhoz_r, rhoz_g)
2627 DO ispin = 1, nspins
2628 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
2634 hfx_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC%HF")
2635 CALL section_vals_get(hfx_section, explicit=do_hfx)
2637 IF (dft_control%do_admm)
THEN
2638 CALL tddft_hfx_matrix(work_admm, ker_tau_admm, qs_env, .false., .false.)
2641 CALL dbcsr_create(dbcsr_work, template=dbcsr_p_work(1)%matrix)
2642 CALL dbcsr_copy(dbcsr_work, dbcsr_p_work(1)%matrix)
2643 CALL dbcsr_set(dbcsr_work, 0.0_dp)
2644 DO ispin = 1, nspins
2645 CALL copy_dbcsr_to_fm(work_admm(ispin)%matrix, admm_env%work_aux_aux)
2646 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao_aux, 1.0_dp, admm_env%work_aux_aux, admm_env%A, &
2647 0.0_dp, admm_env%work_aux_orb)
2648 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, admm_env%work_aux_orb, &
2649 0.0_dp, admm_env%work_orb_orb)
2650 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbcsr_work, keep_sparsity=.true.)
2651 CALL dbcsr_add(dbcsr_p_work(ispin)%matrix, dbcsr_work, 1.0_dp, 1.0_dp)
2653 CALL dbcsr_release(dbcsr_work)
2654 CALL dbcsr_deallocate_matrix_set(ker_tau_admm)
2656 CALL tddft_hfx_matrix(dbcsr_p_work, force_data%sum_YP_tau, qs_env, .false., .false.)
2660 DO ispin = 1, nspins
2661 CALL dbcsr_add(force_data%sum_O_tau(ispin)%matrix, dbcsr_p_work(ispin)%matrix, 1.0_dp, 1.0_dp)
2664 CALL dbcsr_deallocate_matrix_set(dbcsr_p_work)
2665 CALL dbcsr_deallocate_matrix_set(work_admm)
2667 CALL timestop(handle)
2669 END SUBROUTINE prepare_for_response
2680 SUBROUTINE get_2c_gpw_forces(G_PQ, force, h_stress, use_virial, mp2_env, qs_env)
2682 TYPE(dbcsr_type),
INTENT(INOUT) :: g_pq
2683 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
2684 REAL(dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
2685 LOGICAL,
INTENT(IN) :: use_virial
2686 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
2687 TYPE(qs_environment_type),
POINTER :: qs_env
2689 CHARACTER(len=*),
PARAMETER :: routinen =
'get_2c_gpw_forces'
2691 INTEGER :: atom_a, color, handle, i, i_ri, i_xyz, iatom, igrid_level, ikind, ipgf, iset, j, &
2692 j_ri, jatom, lb_ri, n_ri, natom, ncoa, ncoms, nkind, nproc, nseta, o1, offset, pdims(2), &
2694 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, iproc_map, kind_of, &
2696 INTEGER,
DIMENSION(:),
POINTER :: col_dist, la_max, la_min, npgfa, nsgfa, &
2698 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, pgrid
2699 LOGICAL :: found, one_proc_group
2700 REAL(dp) :: cutoff_old, radius, relative_cutoff_old
2701 REAL(dp),
ALLOCATABLE,
DIMENSION(:) :: e_cutoff_old, wf_vector
2702 REAL(dp),
DIMENSION(3) :: force_a, force_b, ra
2703 REAL(dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
2704 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: h_tmp, i_ab, pab, pblock, sphi_a, zeta
2705 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
2706 TYPE(cell_type),
POINTER :: cell
2707 TYPE(dbcsr_distribution_type) :: dbcsr_dist
2708 TYPE(dbcsr_type) :: tmp_g_pq
2709 TYPE(dft_control_type),
POINTER :: dft_control
2710 TYPE(gto_basis_set_p_type),
ALLOCATABLE, &
2711 DIMENSION(:),
TARGET :: basis_set_ri_aux
2712 TYPE(gto_basis_set_type),
POINTER :: basis_set_a
2713 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
2714 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_ext
2715 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2717 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
2718 TYPE(pw_c1d_gs_type) :: dvg(3), pot_g, rho_g, rho_g_copy
2719 TYPE(pw_env_type),
POINTER :: pw_env_ext
2720 TYPE(pw_poisson_type),
POINTER :: poisson_env
2721 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
2722 TYPE(pw_r3d_rs_type) :: psi_l, rho_r
2723 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2724 TYPE(realspace_grid_type),
DIMENSION(:),
POINTER :: rs_v
2725 TYPE(task_list_type),
POINTER :: task_list_ext
2727 NULLIFY (sab_orb, task_list_ext, particle_set, qs_kind_set, dft_control, pw_env_ext, auxbas_pw_pool, &
2728 poisson_env, atomic_kind_set, para_env, cell, rs_v, mos, basis_set_a)
2730 CALL timeset(routinen, handle)
2732 CALL get_qs_env(qs_env, dft_control=dft_control, para_env=para_env, sab_orb=sab_orb, &
2733 natom=natom, nkind=nkind, qs_kind_set=qs_kind_set, particle_set=particle_set, &
2734 mos=mos, cell=cell, atomic_kind_set=atomic_kind_set)
2742 IF (para_env%num_pe <= natom)
THEN
2744 pdims(2) = para_env%num_pe
2747 IF (
modulo(para_env%num_pe, i) == 0)
THEN
2748 pdims(1) = para_env%num_pe/i
2755 ALLOCATE (row_dist(natom), col_dist(natom))
2757 row_dist(iatom) =
modulo(iatom, pdims(1))
2760 col_dist(jatom) =
modulo(jatom, pdims(2))
2763 ALLOCATE (pgrid(0:pdims(1) - 1, 0:pdims(2) - 1))
2765 DO i = 0, pdims(1) - 1
2766 DO j = 0, pdims(2) - 1
2772 CALL dbcsr_distribution_new(dbcsr_dist, group=para_env%get_handle(), pgrid=pgrid, row_dist=row_dist, col_dist=col_dist)
2775 CALL dbcsr_create(tmp_g_pq, template=g_pq, matrix_type=dbcsr_type_no_symmetry, dist=dbcsr_dist)
2776 CALL dbcsr_complete_redistribute(g_pq, tmp_g_pq)
2778 ALLOCATE (basis_set_ri_aux(nkind), sizes_ri(natom))
2779 CALL basis_set_list_setup(basis_set_ri_aux,
"RI_AUX", qs_kind_set)
2780 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
2781 n_ri = sum(sizes_ri)
2783 one_proc_group = mp2_env%mp2_num_proc == 1
2784 ALLOCATE (para_env_ext)
2785 IF (one_proc_group)
THEN
2787 CALL para_env_ext%from_split(para_env, para_env%mepos)
2790 ncoms = min(pdims(2), para_env%num_pe/mp2_env%mp2_num_proc)
2791 DO i = 0, pdims(1) - 1
2792 DO j = 0, pdims(2) - 1
2793 IF (pgrid(i, j) == para_env%mepos) color =
modulo(j + 1, ncoms)
2796 CALL para_env_ext%from_split(para_env, color)
2800 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_ext, pw_env_ext, &
2801 auxbas_pw_pool, poisson_env, task_list_ext, rho_r, rho_g, pot_g, psi_l, sab_orb)
2803 IF (use_virial)
THEN
2804 CALL auxbas_pw_pool%create_pw(rho_g_copy)
2806 CALL auxbas_pw_pool%create_pw(dvg(i_xyz))
2810 ALLOCATE (wf_vector(n_ri))
2812 CALL get_atomic_kind_set(atomic_kind_set, kind_of=kind_of, atom_of_kind=atom_of_kind)
2814 ALLOCATE (iproc_map(natom))
2820 IF (one_proc_group)
THEN
2823 IF (pgrid(row_dist(iatom), col_dist(jatom)) == para_env%mepos) iproc_map(iatom) = 1
2825 IF (.NOT. any(iproc_map == 1)) cycle
2827 IF (.NOT.
modulo(col_dist(jatom) + 1, ncoms) == color) cycle
2830 lb_ri = sum(sizes_ri(1:jatom - 1))
2831 ub_ri = lb_ri + sizes_ri(jatom)
2832 DO j_ri = lb_ri + 1, ub_ri
2835 wf_vector(j_ri) = 1.0_dp
2837 CALL collocate_function(wf_vector, psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, &
2838 particle_set, pw_env_ext, dft_control%qs_control%eps_rho_rspace, &
2839 basis_type=
"RI_AUX")
2841 IF (use_virial)
THEN
2842 CALL calc_potential_gpw(rho_r, rho_g, poisson_env, pot_g, mp2_env%potential_parameter, dvg)
2847 IF (one_proc_group)
THEN
2848 IF (.NOT. iproc_map(iatom) == 1) cycle
2851 CALL dbcsr_get_block_p(tmp_g_pq, iatom, jatom, pblock, found)
2852 IF (.NOT. found) cycle
2854 i_ri = sum(sizes_ri(1:iatom - 1))
2855 wf_vector(i_ri + 1:i_ri + sizes_ri(iatom)) = pblock(:, j_ri - lb_ri)
2858 CALL pw_copy(rho_g, rho_g_copy)
2859 CALL collocate_function(wf_vector, psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, &
2860 particle_set, pw_env_ext, dft_control%qs_control%eps_rho_rspace, &
2861 basis_type=
"RI_AUX")
2863 CALL calc_potential_gpw(psi_l, rho_g, poisson_env, pot_g, mp2_env%potential_parameter, &
2865 CALL virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, &
2866 mp2_env%potential_parameter, para_env_ext)
2868 CALL calc_potential_gpw(rho_r, rho_g, poisson_env, pot_g, mp2_env%potential_parameter)
2872 CALL pw_env_get(pw_env_ext, rs_grids=rs_v)
2873 CALL potential_pw2rs(rs_v, rho_r, pw_env_ext)
2878 IF (one_proc_group)
THEN
2879 IF (.NOT. iproc_map(iatom) == 1) cycle
2884 IF (use_virial)
THEN
2885 my_virial_a = 0.0_dp
2886 my_virial_b = 0.0_dp
2889 ikind = kind_of(iatom)
2890 atom_a = atom_of_kind(iatom)
2892 basis_set_a => basis_set_ri_aux(ikind)%gto_basis_set
2893 first_sgfa => basis_set_a%first_sgf
2894 la_max => basis_set_a%lmax
2895 la_min => basis_set_a%lmin
2896 nseta = basis_set_a%nset
2897 nsgfa => basis_set_a%nsgf_set
2898 sphi_a => basis_set_a%sphi
2899 zeta => basis_set_a%zet
2900 npgfa => basis_set_a%npgf
2902 ra(:) = pbc(particle_set(iatom)%r, cell)
2904 CALL dbcsr_get_block_p(tmp_g_pq, iatom, jatom, pblock, found)
2905 IF (.NOT. found) cycle
2909 ncoa = npgfa(iset)*
ncoset(la_max(iset))
2910 sgfa = first_sgfa(1, iset)
2912 ALLOCATE (h_tmp(ncoa, 1)); h_tmp = 0.0_dp
2913 ALLOCATE (i_ab(nsgfa(iset), 1)); i_ab = 0.0_dp
2914 ALLOCATE (pab(ncoa, 1)); pab = 0.0_dp
2916 i_ab(1:nsgfa(iset), 1) = 2.0_dp*pblock(offset + 1:offset + nsgfa(iset), j_ri - lb_ri)
2917 CALL dgemm(
"N",
"N", ncoa, 1, nsgfa(iset), 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
2918 i_ab(1, 1), nsgfa(iset), 0.0_dp, pab(1, 1), ncoa)
2920 igrid_level = gaussian_gridlevel(pw_env_ext%gridlevel_info, minval(zeta(:, iset)))
2924 IF (map_gaussian_here(rs_v(igrid_level), cell%h_inv, ra, 0, 1, 0))
THEN
2925 DO ipgf = 1, npgfa(iset)
2926 o1 = (ipgf - 1)*
ncoset(la_max(iset))
2927 igrid_level = gaussian_gridlevel(pw_env_ext%gridlevel_info, zeta(ipgf, iset))
2929 radius = exp_radius_very_extended(la_min=la_min(iset), la_max=la_max(iset), &
2930 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
2931 zetp=zeta(ipgf, iset), &
2932 eps=dft_control%qs_control%eps_gvg_rspace, &
2933 prefactor=1.0_dp, cutoff=1.0_dp)
2935 CALL integrate_pgf_product( &
2936 la_max=la_max(iset), zeta=zeta(ipgf, iset), la_min=la_min(iset), &
2937 lb_max=0, zetb=0.0_dp, lb_min=0, &
2938 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
2939 rsgrid=rs_v(igrid_level), &
2940 hab=h_tmp, pab=pab, &
2944 calculate_forces=.true., &
2945 force_a=force_a, force_b=force_b, &
2946 use_virial=use_virial, my_virial_a=my_virial_a, my_virial_b=my_virial_b)
2952 offset = offset + nsgfa(iset)
2953 DEALLOCATE (pab, h_tmp, i_ab)
2956 force(ikind)%mp2_non_sep(:, atom_a) = force(ikind)%mp2_non_sep(:, atom_a) + force_a + force_b
2957 IF (use_virial) h_stress = h_stress + my_virial_a + my_virial_b
2963 IF (use_virial)
THEN
2964 CALL auxbas_pw_pool%give_back_pw(rho_g_copy)
2966 CALL auxbas_pw_pool%give_back_pw(dvg(i_xyz))
2970 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_ext, pw_env_ext, &
2971 task_list_ext, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
2973 CALL dbcsr_release(tmp_g_pq)
2974 CALL dbcsr_distribution_release(dbcsr_dist)
2975 DEALLOCATE (col_dist, row_dist, pgrid)
2977 CALL mp_para_env_release(para_env_ext)
2979 CALL timestop(handle)
2981 END SUBROUTINE get_2c_gpw_forces
2990 SUBROUTINE get_2c_mme_forces(G_PQ, force, mp2_env, qs_env)
2992 TYPE(dbcsr_type),
INTENT(INOUT) :: g_pq
2993 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
2994 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
2995 TYPE(qs_environment_type),
POINTER :: qs_env
2997 CHARACTER(len=*),
PARAMETER :: routinen =
'get_2c_mme_forces'
2999 INTEGER :: atom_a, atom_b, g_count, handle, i_xyz, iatom, ikind, iset, jatom, jkind, jset, &
3000 natom, nkind, nseta, nsetb, offset_hab_a, offset_hab_b, r_count, sgfa, sgfb
3001 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
3002 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
3004 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
3006 REAL(dp) :: new_force, pref
3007 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :) :: hab
3008 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: hdab
3009 REAL(dp),
DIMENSION(:, :),
POINTER :: pblock
3010 REAL(kind=dp),
DIMENSION(3) :: ra, rb
3011 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: sphi_a, sphi_b, zeta, zetb
3012 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3013 TYPE(cell_type),
POINTER :: cell
3014 TYPE(dbcsr_iterator_type) :: iter
3015 TYPE(gto_basis_set_p_type),
ALLOCATABLE, &
3016 DIMENSION(:),
TARGET :: basis_set_ri_aux
3017 TYPE(gto_basis_set_type),
POINTER :: basis_set_a, basis_set_b
3018 TYPE(mp_para_env_type),
POINTER :: para_env
3019 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3020 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3022 NULLIFY (qs_kind_set, basis_set_a, basis_set_b, pblock, particle_set, &
3023 cell, la_max, la_min, lb_min, npgfa, lb_max, npgfb, nsgfa, &
3024 nsgfb, first_sgfa, first_sgfb, sphi_a, sphi_b, zeta, zetb, &
3025 atomic_kind_set, para_env)
3027 CALL timeset(routinen, handle)
3029 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind, particle_set=particle_set, &
3030 cell=cell, atomic_kind_set=atomic_kind_set, natom=natom, para_env=para_env)
3032 CALL get_atomic_kind_set(atomic_kind_set, kind_of=kind_of, atom_of_kind=atom_of_kind)
3034 ALLOCATE (basis_set_ri_aux(nkind))
3035 CALL basis_set_list_setup(basis_set_ri_aux,
"RI_AUX", qs_kind_set)
3037 g_count = 0; r_count = 0
3039 CALL dbcsr_iterator_start(iter, g_pq)
3040 DO WHILE (dbcsr_iterator_blocks_left(iter))
3042 CALL dbcsr_iterator_next_block(iter, row=iatom, column=jatom)
3043 CALL dbcsr_get_block_p(g_pq, iatom, jatom, pblock, found)
3044 IF (.NOT. found) cycle
3045 IF (iatom > jatom) cycle
3047 IF (iatom == jatom) pref = 1.0_dp
3049 ikind = kind_of(iatom)
3050 jkind = kind_of(jatom)
3052 atom_a = atom_of_kind(iatom)
3053 atom_b = atom_of_kind(jatom)
3055 basis_set_a => basis_set_ri_aux(ikind)%gto_basis_set
3056 first_sgfa => basis_set_a%first_sgf
3057 la_max => basis_set_a%lmax
3058 la_min => basis_set_a%lmin
3059 nseta = basis_set_a%nset
3060 nsgfa => basis_set_a%nsgf_set
3061 sphi_a => basis_set_a%sphi
3062 zeta => basis_set_a%zet
3063 npgfa => basis_set_a%npgf
3065 basis_set_b => basis_set_ri_aux(jkind)%gto_basis_set
3066 first_sgfb => basis_set_b%first_sgf
3067 lb_max => basis_set_b%lmax
3068 lb_min => basis_set_b%lmin
3069 nsetb = basis_set_b%nset
3070 nsgfb => basis_set_b%nsgf_set
3071 sphi_b => basis_set_b%sphi
3072 zetb => basis_set_b%zet
3073 npgfb => basis_set_b%npgf
3075 ra(:) = pbc(particle_set(iatom)%r, cell)
3076 rb(:) = pbc(particle_set(jatom)%r, cell)
3078 ALLOCATE (hab(basis_set_a%nsgf, basis_set_b%nsgf))
3079 ALLOCATE (hdab(3, basis_set_a%nsgf, basis_set_b%nsgf))
3081 hdab(:, :, :) = 0.0_dp
3085 sgfa = first_sgfa(1, iset)
3089 sgfb = first_sgfb(1, jset)
3091 CALL integrate_set_2c(mp2_env%eri_mme_param%par, mp2_env%potential_parameter, la_min(iset), &
3092 la_max(iset), lb_min(jset), lb_max(jset), npgfa(iset), npgfb(jset), &
3093 zeta(:, iset), zetb(:, jset), ra, rb, hab, nsgfa(iset), nsgfb(jset), &
3094 offset_hab_a, offset_hab_b, 0, 0, sphi_a, sphi_b, sgfa, sgfb, &
3095 nsgfa(iset), nsgfb(jset), do_eri_mme, hdab=hdab, &
3096 g_count=g_count, r_count=r_count)
3098 offset_hab_b = offset_hab_b + nsgfb(jset)
3100 offset_hab_a = offset_hab_a + nsgfa(iset)
3104 new_force = pref*sum(pblock(:, :)*hdab(i_xyz, :, :))
3105 force(ikind)%mp2_non_sep(i_xyz, atom_a) = force(ikind)%mp2_non_sep(i_xyz, atom_a) + new_force
3106 force(jkind)%mp2_non_sep(i_xyz, atom_b) = force(jkind)%mp2_non_sep(i_xyz, atom_b) - new_force
3109 DEALLOCATE (hab, hdab)
3111 CALL dbcsr_iterator_stop(iter)
3113 CALL cp_eri_mme_update_local_counts(mp2_env%eri_mme_param, para_env, g_count_2c=g_count, r_count_2c=r_count)
3115 CALL timestop(handle)
3117 END SUBROUTINE get_2c_mme_forces
3129 SUBROUTINE update_im_time_forces(p_env, matrix_hz, matrix_p_F, matrix_p_F_admm, qs_env)
3131 TYPE(qs_p_env_type),
POINTER :: p_env
3132 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_p_f, matrix_p_f_admm
3133 TYPE(qs_environment_type),
POINTER :: qs_env
3135 CHARACTER(len=*),
PARAMETER :: routinen =
'update_im_time_forces'
3137 INTEGER :: handle, i, idens, ispin, n_rep_hf, nao, &
3138 nao_aux, nder, nimages, nocc, nspins
3139 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
3140 LOGICAL :: do_exx, do_hfx, do_tau, do_tau_admm, &
3142 REAL(dp) :: dummy_real1, dummy_real2, ehartree, &
3144 REAL(dp),
DIMENSION(3, 3) :: h_stress, pv_loc
3145 TYPE(admm_type),
POINTER :: admm_env
3146 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3147 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: current_density, current_density_admm, &
3148 current_mat_h, matrix_p_mp2, matrix_p_mp2_admm, matrix_s, matrix_s_aux_fit, matrix_w, &
3149 rho_ao, rho_ao_aux, scrm, scrm_admm
3150 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: dbcsr_work_h, dbcsr_work_p
3151 TYPE(dbcsr_type) :: dbcsr_work
3152 TYPE(dft_control_type),
POINTER :: dft_control
3153 TYPE(hfx_type),
DIMENSION(:, :),
POINTER :: x_data
3154 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
3155 TYPE(mp_para_env_type),
POINTER :: para_env
3156 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
3157 POINTER :: sab_orb, sac_ae, sac_ppl, sap_ppnl
3158 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3159 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, rhoz_tot_gspace, &
3161 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rhoz_g
3162 TYPE(pw_env_type),
POINTER :: pw_env
3163 TYPE(pw_poisson_type),
POINTER :: poisson_env
3164 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
3165 TYPE(pw_r3d_rs_type) :: vh_rspace, vhxc_rspace, zv_hartree_rspace
3166 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rhoz_r, tauz_r, v_xc, v_xc_tau, &
3167 vadmm_rspace, vtau_rspace, vxc_rspace
3168 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
3169 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3170 TYPE(qs_rho_type),
POINTER :: rho, rho_aux_fit
3171 TYPE(section_vals_type),
POINTER :: hfx_section, xc_section
3172 TYPE(task_list_type),
POINTER :: task_list_aux_fit
3173 TYPE(virial_type),
POINTER :: virial
3175 NULLIFY (scrm, rho, dft_control, matrix_p_mp2, matrix_s, matrix_p_mp2_admm, admm_env, sab_orb, &
3176 cell_to_index, dbcsr_work_p, dbcsr_work_h, sac_ae, sac_ppl, sap_ppnl, force, virial, &
3177 qs_kind_set, atomic_kind_set, particle_set, pw_env, poisson_env, auxbas_pw_pool, &
3178 task_list_aux_fit, matrix_s_aux_fit, scrm_admm, rho_aux_fit, rho_ao_aux, x_data, &
3179 hfx_section, xc_section, para_env, rhoz_g, rhoz_r, tauz_r, v_xc, v_xc_tau, &
3180 vxc_rspace, vtau_rspace, vadmm_rspace, rho_ao, matrix_w)
3182 CALL timeset(routinen, handle)
3184 CALL get_qs_env(qs_env, rho=rho, dft_control=dft_control, matrix_s=matrix_s, admm_env=admm_env, &
3185 sab_orb=sab_orb, sac_ae=sac_ae, sac_ppl=sac_ppl, sap_ppnl=sap_ppnl, force=force, &
3186 virial=virial, particle_set=particle_set, qs_kind_set=qs_kind_set, &
3187 atomic_kind_set=atomic_kind_set, x_data=x_data, para_env=para_env)
3188 nspins = dft_control%nspins
3190 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3191 IF (use_virial) virial%pv_calculate = .true.
3195 IF (qs_env%mp2_env%method == ri_rpa_method_gpw)
THEN
3196 hfx_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC%WF_CORRELATION%RI_RPA%HF")
3197 CALL section_vals_get(hfx_section, explicit=do_exx)
3201 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2, matrix_p_mp2_admm=matrix_p_mp2_admm)
3205 IF (nspins == 2)
CALL dbcsr_add(matrix_p_mp2(1)%matrix, matrix_p_mp2(2)%matrix, 1.0_dp, 1.0_dp)
3206 CALL build_kinetic_matrix(qs_env%ks_env, matrix_t=scrm, &
3207 matrix_name=
"KINETIC ENERGY MATRIX", &
3209 sab_nl=sab_orb, calculate_forces=.true., &
3210 matrix_p=matrix_p_mp2(1)%matrix)
3211 IF (nspins == 2)
CALL dbcsr_add(matrix_p_mp2(1)%matrix, matrix_p_mp2(2)%matrix, 1.0_dp, -1.0_dp)
3212 CALL dbcsr_deallocate_matrix_set(scrm)
3215 CALL dbcsr_allocate_matrix_set(scrm, nspins)
3216 DO ispin = 1, nspins
3217 ALLOCATE (scrm(ispin)%matrix)
3218 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
3219 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
3220 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
3225 NULLIFY (cell_to_index)
3226 ALLOCATE (dbcsr_work_p(nspins, 1), dbcsr_work_h(nspins, 1))
3227 DO ispin = 1, nspins
3228 dbcsr_work_p(ispin, 1)%matrix => matrix_p_mp2(ispin)%matrix
3229 dbcsr_work_h(ispin, 1)%matrix => scrm(ispin)%matrix
3232 IF (
ASSOCIATED(sac_ae))
THEN
3233 CALL build_core_ae(dbcsr_work_h, dbcsr_work_p, force, &
3234 virial, .true., use_virial, nder, &
3235 qs_kind_set, atomic_kind_set, particle_set, &
3236 sab_orb, sac_ae, nimages, cell_to_index)
3239 IF (
ASSOCIATED(sac_ppl))
THEN
3240 CALL build_core_ppl(dbcsr_work_h, dbcsr_work_p, force, &
3241 virial, .true., use_virial, nder, &
3242 qs_kind_set, atomic_kind_set, particle_set, &
3243 sab_orb, sac_ppl, nimages, cell_to_index,
"ORB")
3246 IF (
ASSOCIATED(sap_ppnl))
THEN
3247 eps_ppnl = dft_control%qs_control%eps_ppnl
3248 CALL build_core_ppnl(dbcsr_work_h, dbcsr_work_p, force, &
3249 virial, .true., use_virial, nder, &
3250 qs_kind_set, atomic_kind_set, particle_set, &
3251 sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index,
"ORB")
3253 DEALLOCATE (dbcsr_work_p, dbcsr_work_h)
3255 IF (use_virial)
THEN
3257 virial%pv_xc = 0.0_dp
3258 NULLIFY (vxc_rspace, vtau_rspace, vadmm_rspace)
3259 CALL ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
3260 dummy_real1, dummy_real2, h_stress)
3261 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
3262 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
3263 IF (.NOT. do_exx)
THEN
3265 virial%pv_exc = virial%pv_exc - virial%pv_xc
3266 virial%pv_virial = virial%pv_virial - virial%pv_xc
3269 CALL ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, dummy_real1, dummy_real2)
3271 do_tau =
ASSOCIATED(vtau_rspace)
3274 CALL integrate_v_core_rspace(vh_rspace, qs_env)
3278 CALL qs_rho_get(rho, rho_ao=rho_ao)
3279 DO ispin = 1, nspins
3280 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
3283 CALL get_qs_env(qs_env, pw_env=pw_env)
3284 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3285 poisson_env=poisson_env)
3286 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
3288 IF (use_virial) pv_loc = virial%pv_virial
3292 DO ispin = 1, nspins
3294 CALL pw_transfer(vh_rspace, vhxc_rspace)
3295 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3296 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3297 qs_env=qs_env, calculate_forces=.true.)
3299 CALL pw_transfer(vxc_rspace(ispin), vhxc_rspace)
3300 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3301 hmat=scrm(ispin), pmat=matrix_p_mp2(ispin), &
3302 qs_env=qs_env, calculate_forces=.true.)
3304 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
3305 hmat=scrm(ispin), pmat=matrix_p_mp2(ispin), &
3306 qs_env=qs_env, calculate_forces=.true., compute_tau=.true.)
3310 DO ispin = 1, nspins
3311 CALL pw_transfer(vh_rspace, vhxc_rspace)
3312 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
3313 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3314 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3315 qs_env=qs_env, calculate_forces=.true.)
3317 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
3318 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3319 qs_env=qs_env, calculate_forces=.true., compute_tau=.true.)
3323 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
3325 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3328 IF (dft_control%do_admm)
THEN
3329 CALL get_admm_env(admm_env, task_list_aux_fit=task_list_aux_fit, rho_aux_fit=rho_aux_fit, &
3330 matrix_s_aux_fit=matrix_s_aux_fit)
3331 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux)
3332 CALL dbcsr_allocate_matrix_set(scrm_admm, nspins)
3333 DO ispin = 1, nspins
3334 ALLOCATE (scrm_admm(ispin)%matrix)
3335 CALL dbcsr_create(scrm_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
3336 CALL dbcsr_copy(scrm_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
3337 CALL dbcsr_set(scrm_admm(ispin)%matrix, 0.0_dp)
3340 IF (use_virial) pv_loc = virial%pv_virial
3341 IF (.NOT. qs_env%admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
3342 DO ispin = 1, nspins
3344 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
3345 hmat=scrm_admm(ispin), pmat=matrix_p_mp2_admm(ispin), &
3346 qs_env=qs_env, calculate_forces=.true., &
3347 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3349 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
3350 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
3351 hmat=scrm_admm(ispin), pmat=rho_ao_aux(ispin), &
3352 qs_env=qs_env, calculate_forces=.true., &
3353 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3354 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, -1.0_dp)
3358 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3360 CALL tddft_hfx_matrix(scrm_admm, rho_ao_aux, qs_env, .false., .false.)
3363 CALL admm_projection_derivative(qs_env, scrm_admm, matrix_p_mp2)
3365 CALL admm_projection_derivative(qs_env, scrm_admm, rho_ao)
3370 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
3371 hfx_section => section_vals_get_subs_vals(xc_section,
"HF")
3372 CALL section_vals_get(hfx_section, explicit=do_hfx)
3375 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
3376 cpassert(n_rep_hf == 1)
3377 IF (use_virial) virial%pv_fock_4c = 0.0_dp
3381 IF (dft_control%do_admm)
THEN
3382 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3383 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux, rho_ao_kp=dbcsr_work_p)
3384 IF (x_data(1, 1)%do_hfx_ri)
THEN
3386 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3387 x_data(1, 1)%general_parameter%fraction, &
3388 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2_admm, &
3389 use_virial=use_virial, resp_only=.true.)
3391 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2_admm, hfx_section, para_env, &
3392 1, use_virial, resp_only=.true.)
3395 DO ispin = 1, nspins
3396 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
3398 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3399 IF (x_data(1, 1)%do_hfx_ri)
THEN
3401 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3402 x_data(1, 1)%general_parameter%fraction, &
3403 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2, &
3404 use_virial=use_virial, resp_only=.true.)
3406 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2, hfx_section, para_env, &
3407 1, use_virial, resp_only=.true.)
3409 DO ispin = 1, nspins
3410 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
3415 IF (dft_control%do_admm)
THEN
3416 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3417 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux, rho_ao_kp=dbcsr_work_p)
3418 DO ispin = 1, nspins
3419 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
3421 IF (x_data(1, 1)%do_hfx_ri)
THEN
3423 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3424 x_data(1, 1)%general_parameter%fraction, &
3425 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2_admm, &
3426 use_virial=use_virial, resp_only=.false.)
3428 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2_admm, hfx_section, para_env, &
3429 1, use_virial, resp_only=.false.)
3431 DO ispin = 1, nspins
3432 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, -1.0_dp)
3435 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3436 IF (x_data(1, 1)%do_hfx_ri)
THEN
3438 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3439 x_data(1, 1)%general_parameter%fraction, &
3440 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2, &
3441 use_virial=use_virial, resp_only=.false.)
3443 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2, hfx_section, para_env, &
3444 1, use_virial, resp_only=.false.)
3449 IF (use_virial)
THEN
3450 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
3451 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
3456 CALL qs_rho_get(rho, rho_ao=rho_ao)
3457 DO ispin = 1, nspins
3458 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
3466 ALLOCATE (current_density(nspins), current_mat_h(nspins), current_density_admm(nspins))
3468 DO ispin = 1, nspins
3469 IF (idens == 1)
THEN
3470 current_density(ispin)%matrix => matrix_p_f(ispin)%matrix
3471 current_mat_h(ispin)%matrix => scrm(ispin)%matrix
3472 IF (dft_control%do_admm) current_density_admm(ispin)%matrix => matrix_p_f_admm(ispin)%matrix
3474 current_density(ispin)%matrix => p_env%p1(ispin)%matrix
3475 current_mat_h(ispin)%matrix => matrix_hz(ispin)%matrix
3476 IF (dft_control%do_admm) current_density_admm(ispin)%matrix => p_env%p1_admm(ispin)%matrix
3481 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
3482 DO ispin = 1, nspins
3483 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
3484 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
3486 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
3487 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
3488 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
3490 CALL pw_zero(rhoz_tot_gspace)
3491 DO ispin = 1, nspins
3492 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3493 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin))
3494 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
3497 IF (use_virial)
THEN
3499 CALL get_qs_env(qs_env, rho=rho)
3500 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3502 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
3504 h_stress(:, :) = 0.0_dp
3505 CALL pw_poisson_solve(poisson_env, &
3506 density=rhoz_tot_gspace, &
3507 ehartree=ehartree, &
3508 vhartree=zv_hartree_gspace, &
3509 h_stress=h_stress, &
3510 aux_density=rho_tot_gspace)
3512 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3515 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe, dp)
3516 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe, dp)
3519 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, &
3523 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
3524 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
3525 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
3529 TYPE(pw_c1d_gs_type) :: tauz_g
3530 CALL auxbas_pw_pool%create_pw(tauz_g)
3531 ALLOCATE (tauz_r(nspins))
3532 DO ispin = 1, nspins
3533 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
3535 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3536 rho=tauz_r(ispin), rho_gspace=tauz_g, compute_tau=.true.)
3538 CALL auxbas_pw_pool%give_back_pw(tauz_g)
3543 IF (use_virial)
THEN
3546 DO ispin = 1, nspins
3547 exc = exc + pw_integral_ab(rhoz_r(ispin), vxc_rspace(ispin))/ &
3548 vxc_rspace(ispin)%pw_grid%dvol
3550 IF (
ASSOCIATED(vtau_rspace))
THEN
3551 DO ispin = 1, nspins
3552 exc = exc + pw_integral_ab(tauz_r(ispin), vtau_rspace(ispin))/ &
3553 vtau_rspace(ispin)%pw_grid%dvol
3557 virial%pv_ehartree(i, i) = virial%pv_ehartree(i, i) - 4.0_dp*ehartree/real(para_env%num_pe, dp)
3558 virial%pv_exc(i, i) = virial%pv_exc(i, i) - exc/real(para_env%num_pe, dp)
3559 virial%pv_virial(i, i) = virial%pv_virial(i, i) - 4.0_dp*ehartree/real(para_env%num_pe, dp) &
3560 - exc/real(para_env%num_pe, dp)
3565 IF (dft_control%do_admm)
THEN
3566 CALL get_qs_env(qs_env, admm_env=admm_env)
3567 xc_section => admm_env%xc_section_primary
3569 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
3572 IF (use_virial) virial%pv_xc = 0.0_dp
3574 CALL create_kernel(qs_env, &
3581 xc_section=xc_section, &
3582 compute_virial=use_virial, &
3583 virial_xc=virial%pv_xc)
3585 IF (use_virial)
THEN
3586 virial%pv_exc = virial%pv_exc + virial%pv_xc
3587 virial%pv_virial = virial%pv_virial + virial%pv_xc
3589 pv_loc = virial%pv_virial
3592 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3593 DO ispin = 1, nspins
3594 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
3595 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
3596 CALL integrate_v_rspace(qs_env=qs_env, &
3597 v_rspace=v_xc(ispin), &
3598 hmat=current_mat_h(ispin), &
3599 pmat=dbcsr_work_p(ispin, 1), &
3600 calculate_forces=.true.)
3601 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
3603 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
3604 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
3605 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
3609 DO ispin = 1, nspins
3610 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
3611 CALL integrate_v_rspace(qs_env=qs_env, &
3612 v_rspace=v_xc_tau(ispin), &
3613 hmat=current_mat_h(ispin), &
3614 pmat=dbcsr_work_p(ispin, 1), &
3615 compute_tau=.true., &
3616 calculate_forces=.true.)
3617 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
3619 DEALLOCATE (v_xc_tau)
3622 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3625 IF (dft_control%do_admm)
THEN
3626 DO ispin = 1, nspins
3627 CALL dbcsr_set(scrm_admm(ispin)%matrix, 0.0_dp)
3629 CALL qs_rho_get(rho_aux_fit, tau_r_valid=do_tau_admm)
3631 IF (.NOT. admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
3632 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3633 DO ispin = 1, nspins
3634 CALL pw_zero(rhoz_r(ispin))
3635 CALL pw_zero(rhoz_g(ispin))
3636 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density_admm(ispin)%matrix, &
3637 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
3638 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3641 IF (do_tau_admm)
THEN
3643 TYPE(pw_c1d_gs_type) :: tauz_g
3644 CALL auxbas_pw_pool%create_pw(tauz_g)
3645 DO ispin = 1, nspins
3646 CALL pw_zero(tauz_r(ispin))
3647 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3648 rho=tauz_r(ispin), rho_gspace=tauz_g, &
3649 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit, &
3652 CALL auxbas_pw_pool%give_back_pw(tauz_g)
3657 IF (use_virial)
THEN
3659 DO ispin = 1, nspins
3660 exc = exc + pw_integral_ab(rhoz_r(ispin), vadmm_rspace(ispin))/ &
3661 vadmm_rspace(ispin)%pw_grid%dvol
3664 virial%pv_exc(i, i) = virial%pv_exc(i, i) - exc/real(para_env%num_pe, dp)
3665 virial%pv_virial(i, i) = virial%pv_virial(i, i) - exc/real(para_env%num_pe, dp)
3668 virial%pv_xc = 0.0_dp
3671 xc_section => admm_env%xc_section_aux
3672 CALL create_kernel(qs_env, v_xc, v_xc_tau, rho_aux_fit, rhoz_r, rhoz_g, tauz_r, xc_section, &
3673 compute_virial=use_virial, virial_xc=virial%pv_xc)
3675 IF (use_virial)
THEN
3676 virial%pv_exc = virial%pv_exc + virial%pv_xc
3677 virial%pv_virial = virial%pv_virial + virial%pv_xc
3679 pv_loc = virial%pv_virial
3682 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=dbcsr_work_p)
3683 DO ispin = 1, nspins
3684 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
3685 CALL integrate_v_rspace(qs_env=qs_env, &
3686 v_rspace=v_xc(ispin), &
3687 hmat=scrm_admm(ispin), &
3688 pmat=dbcsr_work_p(ispin, 1), &
3689 calculate_forces=.true., &
3690 basis_type=
"AUX_FIT", &
3691 task_list_external=task_list_aux_fit)
3692 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
3696 IF (do_tau_admm)
THEN
3697 DO ispin = 1, nspins
3698 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
3699 CALL integrate_v_rspace(qs_env=qs_env, &
3700 v_rspace=v_xc_tau(ispin), &
3701 hmat=scrm_admm(ispin), &
3702 pmat=dbcsr_work_p(ispin, 1), &
3703 calculate_forces=.true., &
3704 basis_type=
"AUX_FIT", &
3705 task_list_external=task_list_aux_fit, &
3707 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
3709 DEALLOCATE (v_xc_tau)
3712 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3715 CALL tddft_hfx_matrix(scrm_admm, current_density_admm, qs_env, .false., .false.)
3717 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3718 CALL admm_projection_derivative(qs_env, scrm_admm, dbcsr_work_p(:, 1))
3721 CALL dbcsr_create(dbcsr_work, template=matrix_s(1)%matrix)
3722 IF (idens == 2)
THEN
3723 nao = admm_env%nao_orb
3724 nao_aux = admm_env%nao_aux_fit
3725 DO ispin = 1, nspins
3726 CALL dbcsr_copy(dbcsr_work, matrix_hz(ispin)%matrix)
3727 CALL dbcsr_set(dbcsr_work, 0.0_dp)
3729 CALL cp_dbcsr_sm_fm_multiply(scrm_admm(ispin)%matrix, admm_env%A, &
3730 admm_env%work_aux_orb, nao)
3731 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
3732 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
3733 admm_env%work_orb_orb)
3734 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbcsr_work, keep_sparsity=.true.)
3735 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbcsr_work, 1.0_dp, 1.0_dp)
3739 CALL dbcsr_release(dbcsr_work)
3743 IF (idens == 2)
THEN
3744 CALL tddft_hfx_matrix(matrix_hz, current_density, qs_env, .false., .false.)
3749 DO ispin = 1, nspins
3750 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
3751 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
3753 DEALLOCATE (rhoz_r, rhoz_g)
3756 DO ispin = 1, nspins
3757 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
3762 CALL dbcsr_deallocate_matrix_set(scrm_admm)
3764 DEALLOCATE (current_density, current_mat_h, current_density_admm)
3765 CALL dbcsr_deallocate_matrix_set(scrm)
3769 IF (nspins == 2) focc = 1.0_dp
3770 CALL get_qs_env(qs_env, mos=mos)
3771 DO ispin = 1, nspins
3772 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
3773 CALL calculate_whz_matrix(mos(ispin)%mo_coeff, matrix_hz(ispin)%matrix, &
3774 p_env%w1(ispin)%matrix, focc, nocc)
3776 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, p_env%w1(2)%matrix, 1.0_dp, 1.0_dp)
3779 IF (.NOT. do_exx)
THEN
3780 CALL compute_matrix_w(qs_env, calc_forces=.true.)
3781 CALL get_qs_env(qs_env, matrix_w=matrix_w)
3782 CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(1)%matrix, 1.0_dp, 1.0_dp)
3783 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(2)%matrix, 1.0_dp, 1.0_dp)
3787 CALL build_overlap_matrix(qs_env%ks_env, matrix_s=scrm, &
3788 matrix_name=
"OVERLAP MATRIX", &
3789 basis_type_a=
"ORB", basis_type_b=
"ORB", &
3790 sab_nl=sab_orb, calculate_forces=.true., &
3791 matrix_p=p_env%w1(1)%matrix)
3793 IF (.NOT. do_exx)
THEN
3794 CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(1)%matrix, 1.0_dp, -1.0_dp)
3795 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(2)%matrix, 1.0_dp, -1.0_dp)
3796 DO ispin = 1, nspins
3797 CALL dbcsr_set(matrix_w(ispin)%matrix, 0.0_dp)
3801 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, p_env%w1(2)%matrix, 1.0_dp, -1.0_dp)
3802 CALL dbcsr_deallocate_matrix_set(scrm)
3804 IF (use_virial) virial%pv_calculate = .false.
3807 CALL auxbas_pw_pool%give_back_pw(vh_rspace)
3809 DO ispin = 1, nspins
3810 CALL auxbas_pw_pool%give_back_pw(vxc_rspace(ispin))
3811 IF (
ASSOCIATED(vtau_rspace))
THEN
3812 CALL auxbas_pw_pool%give_back_pw(vtau_rspace(ispin))
3814 IF (
ASSOCIATED(vadmm_rspace))
THEN
3815 CALL auxbas_pw_pool%give_back_pw(vadmm_rspace(ispin))
3818 DEALLOCATE (vxc_rspace)
3819 IF (
ASSOCIATED(vtau_rspace))
DEALLOCATE (vtau_rspace)
3820 IF (
ASSOCIATED(vadmm_rspace))
DEALLOCATE (vadmm_rspace)
3822 CALL timestop(handle)
3824 END SUBROUTINE update_im_time_forces
3837 SUBROUTINE build_y_matrix(Y, A, P, R, filter_eps)
3839 TYPE(dbcsr_type),
INTENT(OUT) :: y
3840 TYPE(dbcsr_type),
INTENT(INOUT) :: a, p, r
3841 REAL(dp),
INTENT(IN) :: filter_eps
3843 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_Y_matrix'
3845 INTEGER :: handle, k, n
3846 REAL(dp) :: norm_scalar, threshold
3847 TYPE(dbcsr_type) :: a2n, exp_a2n, prn, work, work2, yk
3849 CALL timeset(routinen, handle)
3851 threshold = 1.0e-16_dp
3854 norm_scalar = dbcsr_frobenius_norm(a)
3859 IF ((norm_scalar/2.0_dp**n) < 1.0_dp)
EXIT
3864 CALL dbcsr_create(prn, template=a, matrix_type=dbcsr_type_no_symmetry)
3865 CALL dbcsr_create(work, template=a, matrix_type=dbcsr_type_no_symmetry)
3866 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, p, r, 0.0_dp, work, filter_eps=filter_eps)
3867 CALL dbcsr_create(exp_a2n, template=a, matrix_type=dbcsr_type_no_symmetry)
3870 CALL matrix_exponential(exp_a2n, a, 1.0_dp, 0.5_dp**k, threshold)
3871 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, exp_a2n, work, 0.0_dp, prn, filter_eps=filter_eps)
3872 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, work, exp_a2n, 1.0_dp, prn, filter_eps=filter_eps)
3873 CALL dbcsr_copy(work, prn)
3875 CALL dbcsr_release(exp_a2n)
3878 CALL dbcsr_create(a2n, template=a, matrix_type=dbcsr_type_no_symmetry)
3879 CALL dbcsr_copy(a2n, a)
3880 CALL dbcsr_scale(a2n, 0.5_dp**n)
3881 CALL dbcsr_create(y, template=a, matrix_type=dbcsr_type_no_symmetry)
3882 CALL dbcsr_create(yk, template=a, matrix_type=dbcsr_type_no_symmetry)
3883 CALL dbcsr_create(work2, template=a, matrix_type=dbcsr_type_no_symmetry)
3886 CALL dbcsr_scale(prn, 0.5_dp**n)
3887 CALL dbcsr_copy(work, prn)
3888 CALL dbcsr_copy(work2, prn)
3889 CALL dbcsr_add(y, prn, 1.0_dp, 1.0_dp)
3894 CALL dbcsr_multiply(
'N',
'N', 1.0_dp/real(k, dp), a2n, work, 0.0_dp, yk, filter_eps=filter_eps)
3895 CALL dbcsr_multiply(
'N',
'N', 1.0_dp/real(k, dp), work2, a2n, 0.0_dp, prn, filter_eps=filter_eps)
3897 CALL dbcsr_add(yk, prn, 1.0_dp, 1.0_dp)
3898 CALL dbcsr_add(y, yk, 1.0_dp, 1.0_dp)
3900 IF (dbcsr_frobenius_norm(yk) < threshold)
EXIT
3901 CALL dbcsr_copy(work, yk)
3902 CALL dbcsr_copy(work2, prn)
3905 CALL dbcsr_release(work)
3906 CALL dbcsr_release(work2)
3907 CALL dbcsr_release(prn)
3908 CALL dbcsr_release(a2n)
3909 CALL dbcsr_release(yk)
3911 CALL timestop(handle)
3913 END SUBROUTINE build_y_matrix
3929 SUBROUTINE keep_initial_quad(tj, wj, tau_tj, tau_wj, weights_cos_tf_t_to_w, weights_cos_tf_w_to_t, &
3930 do_laplace, do_im_time, num_integ_points, unit_nr, qs_env)
3932 REAL(dp),
ALLOCATABLE,
DIMENSION(:),
INTENT(INOUT) :: tj, wj, tau_tj, tau_wj
3933 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :), &
3934 INTENT(INOUT) :: weights_cos_tf_t_to_w, &
3935 weights_cos_tf_w_to_t
3936 LOGICAL,
INTENT(IN) :: do_laplace, do_im_time
3937 INTEGER,
INTENT(IN) :: num_integ_points, unit_nr
3938 TYPE(qs_environment_type),
POINTER :: qs_env
3942 IF (do_laplace .OR. do_im_time)
THEN
3943 IF (.NOT.
ASSOCIATED(qs_env%mp2_env%ri_rpa_im_time%tau_tj))
THEN
3944 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%tau_tj(num_integ_points))
3945 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%tau_wj(num_integ_points))
3946 qs_env%mp2_env%ri_rpa_im_time%tau_tj(:) = tau_tj(:)
3947 qs_env%mp2_env%ri_rpa_im_time%tau_wj(:) = tau_wj(:)
3950 tau_tj(:) = qs_env%mp2_env%ri_rpa_im_time%tau_tj(:)
3951 tau_wj(:) = qs_env%mp2_env%ri_rpa_im_time%tau_wj(:)
3954 IF (.NOT. do_laplace)
THEN
3955 IF (.NOT.
ASSOCIATED(qs_env%mp2_env%ri_rpa_im_time%tj))
THEN
3956 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%tj(num_integ_points))
3957 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%wj(num_integ_points))
3958 qs_env%mp2_env%ri_rpa_im_time%tj(:) = tj(:)
3959 qs_env%mp2_env%ri_rpa_im_time%wj(:) = wj(:)
3960 IF (do_im_time)
THEN
3961 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_t_to_w(num_integ_points, num_integ_points))
3962 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_w_to_t(num_integ_points, num_integ_points))
3963 qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_t_to_w(:, :) = weights_cos_tf_t_to_w(:, :)
3964 qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_w_to_t(:, :) = weights_cos_tf_w_to_t(:, :)
3967 tj(:) = qs_env%mp2_env%ri_rpa_im_time%tj(:)
3968 wj(:) = qs_env%mp2_env%ri_rpa_im_time%wj(:)
3969 IF (do_im_time)
THEN
3970 weights_cos_tf_t_to_w(:, :) = qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_t_to_w(:, :)
3971 weights_cos_tf_w_to_t(:, :) = qs_env%mp2_env%ri_rpa_im_time%weights_cos_tf_w_to_t(:, :)
3975 IF (unit_nr > 0)
THEN
3977 IF (
ASSOCIATED(qs_env%mp2_env%ri_rpa_im_time%tj) .AND. (.NOT. do_laplace))
THEN
3978 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
3979 "MINIMAX_INFO| Number of integration points:", num_integ_points
3980 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)") &
3981 "MINIMAX_INFO| Minimax params (freq grid, scaled):",
"Weights",
"Abscissas"
3982 DO jquad = 1, num_integ_points
3983 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") wj(jquad), tj(jquad)
3985 CALL m_flush(unit_nr)
3987 IF (
ASSOCIATED(qs_env%mp2_env%ri_rpa_im_time%tau_tj))
THEN
3988 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
3989 "MINIMAX_INFO| Number of integration points:", num_integ_points
3990 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)") &
3991 "MINIMAX_INFO| Minimax params (time grid, scaled):",
"Weights",
"Abscissas"
3992 DO jquad = 1, num_integ_points
3993 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") tau_wj(jquad), tau_tj(jquad)
3995 CALL m_flush(unit_nr)
static GRID_HOST_DEVICE int ncoset(const int l)
Number of Cartesian orbitals up to given angular momentum quantum.
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_projection_derivative(qs_env, matrix_hz, matrix_pz, fval)
Calculate derivatives terms from overlap matrices.
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
All kind of helpful little routines.
real(kind=dp) function, public exp_radius_very_extended(la_min, la_max, lb_min, lb_max, pab, o1, o2, ra, rb, rp, zetp, eps, prefactor, cutoff, epsabs)
computes the radius of the Gaussian outside of which it is smaller than eps
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public bussy2023
Handles all functions related to the CELL.
Calculation of the nuclear attraction contribution to the core Hamiltonian <a|erfc|b> :we only calcul...
subroutine, public build_core_ae(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sac_ae, nimages, cell_to_index, atcore)
...
Calculation of the local pseudopotential contribution to the core Hamiltonian <a|V(local)|b> = <a|Sum...
subroutine, public build_core_ppl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sac_ppl, nimages, cell_to_index, basis_type, deltar, atcore)
...
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_core_ppnl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index, basis_type, deltar, matrix_l, atcore)
...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
subroutine, public dbcsr_clear(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, uplo_to_full)
used to replace the cholesky decomposition by the inverse
subroutine, public dbcsr_add_on_diag(matrix, alpha)
Adds the given scalar to the diagonal of the matrix. Reserves any missing diagonal blocks.
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_power(matrix, exponent, threshold, n_dependent, para_env, blacs_env, verbose, eigenvectors, eigenvalues)
...
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_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
subroutine, public cp_eri_mme_update_local_counts(param, para_env, g_count_2c, r_count_2c, gg_count_3c, gr_count_3c, rr_count_3c)
Update local counters to gather statistics on different paths taken in MME algorithm (each Ewald sum ...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
This is the start of a dbt_api, all publically needed functions are exported here....
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
Routines used for Harris functional Kohn-Sham calculation.
subroutine, public create_kernel(qs_env, vxc, vxc_tau, rho, rho1_r, rho1_g, tau1_r, xc_section, compute_virial, virial_xc)
Creation of second derivative xc-potential.
integer function, public gaussian_gridlevel(gridlevel_info, exponent)
...
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.
Routines to calculate derivatives with respect to basis function origin.
subroutine, public derivatives_four_center(qs_env, rho_ao, rho_ao_resp, hfx_section, para_env, irep, use_virial, adiabatic_rescale_factor, resp_only, external_x_data)
computes four center derivatives for a full basis set and updates the forcesfock_4c arrays....
Routines to calculate EXX in RPA and energy correction methods.
subroutine, public add_exx_to_rhs(rhs, qs_env, ext_hfx_section, x_data, recalc_integrals, do_admm, do_ec, do_exx, reuse_hfx)
Add the EXX contribution to the RHS of the Z-vector equation, namely the HF Hamiltonian.
subroutine, public get_force_from_3c_trace(force, t_3c_contr, t_3c_der, atom_of_kind, kind_of, idx_to_at, pref, do_mp2, deriv_dim)
This routines calculates the force contribution from a trace over 3D tensors, i.e....
subroutine, public get_idx_to_atom(idx_to_at, bsizes_split, bsizes_orig)
a small utility function that returns the atom corresponding to a block of a split tensor
subroutine, public hfx_ri_update_forces(qs_env, ri_data, nspins, hf_fraction, rho_ao, rho_ao_resp, mos, use_virial, resp_only, rescale_factor)
the general routine that calls the relevant force code
subroutine, public get_2c_der_force(force, t_2c_contr, t_2c_der, atom_of_kind, kind_of, idx_to_at, pref, do_mp2, do_ovlp)
Update the forces due to the derivative of the a 2-center product d/dR (Q|R)
Types and set/get functions for HFX.
subroutine, public alloc_containers(data, bin_size)
...
subroutine, public dealloc_containers(data, memory_usage)
...
Routines useful for iterative matrix calculations.
subroutine, public matrix_exponential(matrix_exp, matrix, omega, alpha, threshold)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
real(kind=dp), parameter, public fourpi
real(kind=dp), dimension(0:maxfac), parameter, public fac
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Routines to calculate 2c- and 3c-integrals for RI with GPW.
subroutine, public prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
Prepares GPW calculation for RI-MP2/RI-RPA.
subroutine, public virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, potential_parameter, para_env_sub)
Calculates stress tensor contribution from the operator.
subroutine, public calc_potential_gpw(pot_r, rho_g, poisson_env, pot_g, potential_parameter, dvg, no_transfer)
Calculates potential from a given density in g-space.
subroutine, public cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
Cleanup GPW integration for RI-MP2/RI-RPA.
Interface to direct methods for electron repulsion integrals for MP2.
subroutine, public integrate_set_2c(param, potential_parameter, la_min, la_max, lb_min, lb_max, npgfa, npgfb, zeta, zetb, ra, rb, hab, n_hab_a, n_hab_b, offset_hab_a, offset_hab_b, offset_set_a, offset_set_b, sphi_a, sphi_b, sgfa, sgfb, nsgfa, nsgfb, eri_method, pab, force_a, force_b, hdab, hadb, g_count, r_count, do_reflection_a, do_reflection_b)
Integrate set pair and contract with sphi matrix.
Types needed for MP2 calculations.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
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 ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public collocate_function(vector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, particle_set, pw_env, eps_rho_rspace, basis_type)
maps a given function on the grid
collects routines that calculate density matrices
subroutine, public calculate_whz_matrix(c0vec, hzm, w_matrix, focc, nocc)
Calculate the Wz matrix from the MO eigenvectors, MO eigenvalues, and the MO occupation numbers....
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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Set the QUICKSTEP environment.
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Integrate single or product functions over a potential on a RS grid.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
Calculation of kinetic energy matrix and forces.
subroutine, public build_kinetic_matrix(ks_env, matrix_t, matrixkp_t, matrix_name, basis_type, sab_nl, calculate_forces, matrix_p, matrixkp_p, eps_filter, nderivative)
Calculation of the kinetic energy matrix over Cartesian Gaussian functions.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
Calculate the KS reference potentials.
subroutine, public ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, ehartree, exc, h_stress)
calculate the Kohn-Sham reference potential
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
Type definitiona for linear response calculations.
Utility subroutine for qs energy calculation.
subroutine, public compute_matrix_w(qs_env, calc_forces)
Refactoring of qs_energies_scf. Moves computation of matrix_w into separate subroutine.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Utility functions for the perturbation calculations.
subroutine, public p_env_psi0_changed(p_env, qs_env)
To be called after the value of psi0 has changed. Recalculates the quantities S_psi0 and m_epsilon.
subroutine, public p_env_create(p_env, qs_env, p1_option, p1_admm_option, orthogonal_orbitals, linres_control)
allocates and initializes the perturbation environment (no setup)
basis types for the calculation of the perturbation of density theory.
subroutine, public p_env_release(p_env)
relases the given p_env (see doc/ReferenceCounting.html)
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...
Utility methods to build 3-center integral tensors of various types.
subroutine, public distribution_3d_create(dist_3d, dist1, dist2, dist3, nkind, particle_set, mp_comm_3d, own_comm)
Create a 3d distribution.
subroutine, public create_2c_tensor(t2c, dist_1, dist_2, pgrid, sizes_1, sizes_2, order, name)
...
subroutine, public create_tensor_batches(sizes, nbatches, starts_array, ends_array, starts_array_block, ends_array_block)
...
subroutine, public create_3c_tensor(t3c, dist_1, dist_2, dist_3, pgrid, sizes_1, sizes_2, sizes_3, map1, map2, name)
...
Utility methods to build 3-center integral tensors of various types.
subroutine, public build_2c_integrals(t2c, filter_eps, qs_env, nl_2c, basis_i, basis_j, potential_parameter, do_kpoints, do_hfx_kpoints, ext_kpoints, regularization_ri)
...
subroutine, public calc_3c_virial(work_virial, t3c_trace, pref, qs_env, nl_3c, basis_i, basis_j, basis_k, potential_parameter, der_eps, op_pos)
Calculates the 3c virial contributions on the fly.
subroutine, public build_3c_derivatives(t3c_der_i, t3c_der_k, filter_eps, qs_env, nl_3c, basis_i, basis_j, basis_k, potential_parameter, der_eps, op_pos, do_kpoints, do_hfx_kpoints, bounds_i, bounds_j, bounds_k, ri_range, img_to_ri_cell)
Build 3-center derivative tensors.
subroutine, public build_2c_neighbor_lists(ij_list, basis_i, basis_j, potential_parameter, name, qs_env, sym_ij, molecular, dist_2d, pot_to_rad)
Build 2-center neighborlists adapted to different operators This mainly wraps build_neighbor_lists fo...
subroutine, public compress_tensor(tensor, blk_indices, compressed, eps, memory)
...
subroutine, public neighbor_list_3c_destroy(ijk_list)
Destroy 3c neighborlist.
subroutine, public calc_2c_virial(work_virial, t2c_trace, pref, qs_env, nl_2c, basis_i, basis_j, potential_parameter)
Calculates the virial coming from 2c derivatives on the fly.
subroutine, public decompress_tensor(tensor, blk_indices, compressed, eps)
...
subroutine, public build_2c_derivatives(t2c_der, filter_eps, qs_env, nl_2c, basis_i, basis_j, potential_parameter, do_kpoints)
Calculates the derivatives of 2-center integrals, wrt to the first center.
subroutine, public get_tensor_occupancy(tensor, nze, occ)
...
subroutine, public build_3c_neighbor_lists(ijk_list, basis_i, basis_j, basis_k, dist_3d, potential_parameter, name, qs_env, sym_ij, sym_jk, sym_ik, molecular, op_pos, own_dist)
Build a 3-center neighbor list.
pure logical function, public map_gaussian_here(rs_grid, h_inv, ra, offset, group_size, my_pos)
...
Calculate the CPKS equation and the resulting forces.
subroutine, public response_equation_new(qs_env, p_env, cpmos, iounit)
Initializes vectors for MO-coefficient based linear response solver and calculates response density,...
Routines needed for cubic-scaling RPA and SOS-Laplace-MP2 forces.
subroutine, public calc_laplace_loop_forces(force_data, mat_p_omega, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, num_integ_points, nmo, eigenval, tau_tj, tau_wj, cut_memory, pspin, qspin, open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
Updates the cubic-scaling SOS-Laplace-MP2 contribution to the forces at each quadrature point.
subroutine, public calc_post_loop_forces(force_data, unit_nr, qs_env)
All the forces that can be calculated after the loop on the Laplace quaradture, using terms collected...
subroutine, public calc_rpa_loop_forces(force_data, mat_p_omega, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, num_integ_points, nmo, eigenval, e_fermi, weights_cos_tf_t_to_w, weights_cos_tf_w_to_t, tj, wj, tau_tj, cut_memory, ispin, open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
Updates the cubic-scaling RPA contribution to the forces at each quadrature point....
subroutine, public keep_initial_quad(tj, wj, tau_tj, tau_wj, weights_cos_tf_t_to_w, weights_cos_tf_w_to_t, do_laplace, do_im_time, num_integ_points, unit_nr, qs_env)
Overwrites the "optimal" Laplace quadrature with that of the first step.
subroutine, public init_im_time_forces(force_data, fm_matrix_pq, t_3c_m, unit_nr, mp2_env, qs_env)
Initializes and pre-calculates all needed tensors for the forces.
Types needed for cubic-scaling RPA and SOS-Laplace-MP2 forces.
Routines for low-scaling RPA/GW with imaginary time.
subroutine, public compute_mat_dm_global(fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, tau_tj, num_integ_points, nmo, fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, mat_dm_occ_global, mat_dm_virt_global, matrix_s, ispin, eigenval, e_fermi, eps_filter, memory_info, unit_nr, jquad, do_kpoints_cubic_rpa, do_kpoints_from_gamma, qs_env, num_cells_dm, index_to_cell_dm, para_env)
...
Transfers densities from PW to RS grids and potentials from PW to RS.
subroutine, public potential_pw2rs(rs_v, v_rspace, pw_env)
transfers a potential from a pw_grid to a vector of realspace multigrids
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
distributes pairs on a 2d grid of processors
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
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
General settings for linear response calculations.
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...
keeps the density in various representations, keeping track of which ones are valid.