33 dbcsr_type_no_symmetry, dbcsr_type_symmetric
55 dbt_batched_contract_finalize, dbt_batched_contract_init, dbt_clear, dbt_contract, &
56 dbt_copy, dbt_copy_matrix_to_tensor, dbt_copy_tensor_to_matrix, dbt_create, dbt_destroy, &
57 dbt_filter, dbt_get_info, dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, &
58 dbt_pgrid_type, dbt_scale, dbt_type
127 integrate_v_core_rspace,&
171#include "./base/base_uses.f90"
177 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_im_time_force_methods'
197 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m
198 INTEGER,
INTENT(IN) :: unit_nr
202 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_im_time_forces'
204 INTEGER :: handle, i_mem, i_xyz, ibasis, ispin, &
205 n_dependent, n_mem, n_rep, natom, &
207 INTEGER(int_8) :: nze, nze_tot
208 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist1, dist2, dist_ao_1, dist_ao_2, &
209 dist_ri, dummy_end, dummy_start, &
210 end_blocks, sizes_ao, sizes_ri, &
212 INTEGER,
DIMENSION(2) :: pdims_t2c
213 INTEGER,
DIMENSION(3) :: nblks_total, pcoord, pdims, pdims_t3c
214 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
215 LOGICAL :: do_periodic, use_virial
216 REAL(
dp) :: compression_factor, eps_pgf_orb, &
217 eps_pgf_orb_old, memory, occ
221 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
222 TYPE(
dbcsr_type) :: dbcsr_work, dbcsr_work2, dbcsr_work3
223 TYPE(
dbcsr_type),
DIMENSION(1) :: t_2c_int_tmp
224 TYPE(
dbcsr_type),
DIMENSION(1, 3) :: t_2c_der_tmp
225 TYPE(dbt_pgrid_type) :: pgrid_t2c, pgrid_t3c
226 TYPE(dbt_type) :: t_2c_template, t_2c_tmp, t_3c_template
227 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: t_3c_der_ao_prv, t_3c_der_ri_prv
232 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
234 TYPE(libint_potential_type) :: identity_pot
241 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
246 NULLIFY (dft_control, para_env, particle_set, qs_kind_set, dist_2d, nl_2c, blacs_env, matrix_s, &
247 rho, rho_ao, cell, qs_section, orb_basis, ri_basis, virial)
251 CALL timeset(routinen, handle)
253 CALL get_qs_env(qs_env, natom=natom, nkind=nkind, dft_control=dft_control, para_env=para_env, &
254 particle_set=particle_set, qs_kind_set=qs_kind_set, cell=cell, virial=virial)
255 IF (dft_control%qs_control%gapw)
THEN
256 cpabort(
"Low-scaling RPA/SOS-MP2 forces only available with GPW")
259 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
261 do_periodic = .false.
262 IF (any(cell%perd == 1)) do_periodic = .true.
263 force_data%do_periodic = do_periodic
267 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c)
276 eps_pgf_orb = sqrt(eps_pgf_orb)
278 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
280 ALLOCATE (sizes_ri(natom), sizes_ao(natom))
281 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
283 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
285 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
287 DO ibasis = 1,
SIZE(basis_set_ao)
288 orb_basis => basis_set_ao(ibasis)%gto_basis_set
290 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
294 CALL create_3c_tensor(t_3c_template, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c, &
295 sizes_ri, sizes_ao, sizes_ao, map1=[1], map2=[2, 3], name=
"der (RI AO | AO)")
297 ALLOCATE (t_3c_der_ri_prv(1, 1, 3), t_3c_der_ao_prv(1, 1, 3))
299 CALL dbt_create(t_3c_template, t_3c_der_ri_prv(1, 1, i_xyz))
300 CALL dbt_create(t_3c_template, t_3c_der_ao_prv(1, 1, i_xyz))
304 ALLOCATE (force_data%t_3c_virial, force_data%t_3c_virial_split)
305 CALL dbt_create(t_3c_template, force_data%t_3c_virial)
306 CALL dbt_create(t_3c_m, force_data%t_3c_virial_split)
308 CALL dbt_destroy(t_3c_template)
310 CALL dbt_mp_environ_pgrid(pgrid_t3c, pdims, pcoord)
311 CALL mp_comm_t3c%create(pgrid_t3c%mp_comm_2d, 3, pdims)
313 nkind, particle_set, mp_comm_t3c, own_comm=.true.)
317 ALLOCATE (force_data%nl_3c)
318 CALL mp_comm_vir%create(pgrid_t3c%mp_comm_2d, 3, pdims)
320 nkind, particle_set, mp_comm_vir, own_comm=.true.)
322 dist_vir, mp2_env%ri_metric,
"RPA_3c_nl", qs_env, op_pos=1, &
323 sym_jk=.false., own_dist=.true.)
327 mp2_env%ri_metric,
"RPA_3c_nl", qs_env, op_pos=1, sym_jk=.true., &
329 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
332 CALL dbt_get_info(t_3c_m, nblks_total=nblks_total)
333 ALLOCATE (force_data%bsizes_RI_split(nblks_total(1)), force_data%bsizes_AO_split(nblks_total(2)))
334 CALL dbt_get_info(t_3c_m, blk_size_1=force_data%bsizes_RI_split, blk_size_2=force_data%bsizes_AO_split)
336 CALL dbt_create(t_3c_m, force_data%t_3c_der_RI(i_xyz))
337 CALL dbt_create(t_3c_m, force_data%t_3c_der_AO(i_xyz))
341 ALLOCATE (force_data%idx_to_at_RI(nblks_total(1)))
342 CALL get_idx_to_atom(force_data%idx_to_at_RI, force_data%bsizes_RI_split, sizes_ri)
344 ALLOCATE (force_data%idx_to_at_AO(nblks_total(2)))
345 CALL get_idx_to_atom(force_data%idx_to_at_AO, force_data%bsizes_AO_split, sizes_ao)
347 n_mem = mp2_env%ri_rpa_im_time%cut_memory
349 DEALLOCATE (dummy_start, dummy_end)
351 ALLOCATE (force_data%t_3c_der_AO_comp(n_mem, 3), force_data%t_3c_der_RI_comp(n_mem, 3))
352 ALLOCATE (force_data%t_3c_der_AO_ind(n_mem, 3), force_data%t_3c_der_RI_ind(n_mem, 3))
357 CALL build_3c_derivatives(t_3c_der_ri_prv, t_3c_der_ao_prv, mp2_env%ri_rpa_im_time%eps_filter, &
358 qs_env, nl_3c, basis_set_ri_aux, basis_set_ao, basis_set_ao, &
359 mp2_env%ri_metric, der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1, &
360 bounds_i=[start_blocks(i_mem), end_blocks(i_mem)])
363 CALL dbt_copy(t_3c_der_ri_prv(1, 1, i_xyz), force_data%t_3c_der_RI(i_xyz), move_data=.true.)
364 CALL dbt_filter(force_data%t_3c_der_RI(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
366 nze_tot = nze_tot + nze
369 CALL compress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
370 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress, memory)
371 CALL dbt_clear(force_data%t_3c_der_RI(i_xyz))
373 CALL dbt_copy(t_3c_der_ao_prv(1, 1, i_xyz), force_data%t_3c_der_AO(i_xyz), move_data=.true.)
374 CALL dbt_filter(force_data%t_3c_der_AO(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
376 nze_tot = nze_tot + nze
379 CALL compress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
380 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress, memory)
381 CALL dbt_clear(force_data%t_3c_der_AO(i_xyz))
386 CALL dbt_destroy(t_3c_der_ri_prv(1, 1, i_xyz))
387 CALL dbt_destroy(t_3c_der_ao_prv(1, 1, i_xyz))
390 CALL para_env%sum(memory)
391 compression_factor = real(nze_tot,
dp)*1.0e-06_dp*8.0_dp/memory
392 IF (unit_nr > 0)
THEN
393 WRITE (unit=unit_nr, fmt=
"((T3,A,T66,F11.2,A4))") &
394 "MEMORY_INFO| Memory for 3-center derivatives (compressed):", memory,
' MiB'
396 WRITE (unit=unit_nr, fmt=
"((T3,A,T60,F21.2))") &
397 "MEMORY_INFO| Compression factor: ", compression_factor
401 CALL get_qs_env(qs_env, distribution_2d=dist_2d, blacs_env=blacs_env, matrix_s=matrix_s)
403 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
404 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
405 row_bsize(:) = sizes_ri(:)
406 col_bsize(:) = sizes_ri(:)
409 CALL dbt_pgrid_create(para_env, pdims_t2c, pgrid_t2c)
410 CALL create_2c_tensor(t_2c_template, dist1, dist2, pgrid_t2c, force_data%bsizes_RI_split, &
411 force_data%bsizes_RI_split, name=
'(RI| RI)')
412 DEALLOCATE (dist1, dist2)
414 CALL dbcsr_create(t_2c_int_tmp(1),
"(P|Q) RPA", dbcsr_dist, dbcsr_type_symmetric, row_bsize, col_bsize)
416 CALL dbcsr_create(t_2c_der_tmp(1, i_xyz),
"(P|Q) RPA der", dbcsr_dist, &
417 dbcsr_type_antisymmetric, row_bsize, col_bsize)
421 ALLOCATE (force_data%RI_virial_pot, force_data%RI_virial_met)
422 CALL dbcsr_create(force_data%RI_virial_pot,
"RI_virial", dbcsr_dist, &
423 dbcsr_type_no_symmetry, row_bsize, col_bsize)
424 CALL dbcsr_create(force_data%RI_virial_met,
"RI_virial", dbcsr_dist, &
425 dbcsr_type_no_symmetry, row_bsize, col_bsize)
434 CALL dbcsr_create(dbcsr_work2, template=t_2c_int_tmp(1))
435 CALL dbcsr_create(dbcsr_work3, template=t_2c_int_tmp(1))
437 CALL cp_dbcsr_power(dbcsr_work, -0.5_dp, 1.0e-7_dp, n_dependent, para_env, blacs_env)
440 CALL dbt_create(dbcsr_work, t_2c_tmp)
441 CALL dbt_copy_matrix_to_tensor(dbcsr_work, t_2c_tmp)
442 CALL dbt_create(t_2c_template, force_data%t_2c_pot_msqrt)
443 CALL dbt_copy(t_2c_tmp, force_data%t_2c_pot_msqrt, move_data=.true.)
444 CALL dbt_filter(force_data%t_2c_pot_msqrt, mp2_env%ri_rpa_im_time%eps_filter)
446 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work2, dbcsr_work, 0.0_dp, dbcsr_work3)
447 CALL dbt_copy_matrix_to_tensor(dbcsr_work3, t_2c_tmp)
448 CALL dbt_create(t_2c_template, force_data%t_2c_pot_psqrt)
449 CALL dbt_copy(t_2c_tmp, force_data%t_2c_pot_psqrt, move_data=.true.)
450 CALL dbt_filter(force_data%t_2c_pot_psqrt, mp2_env%ri_rpa_im_time%eps_filter)
451 CALL dbt_destroy(t_2c_tmp)
457 IF (.NOT. do_periodic)
THEN
459 "RPA_2c_nl_pot", qs_env, sym_ij=.true., dist_2d=dist_2d)
461 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
465 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
466 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
467 CALL dbt_create(t_2c_template, force_data%t_2c_der_pot(i_xyz))
468 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_pot(i_xyz), move_data=.true.)
469 CALL dbt_filter(force_data%t_2c_der_pot(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
470 CALL dbt_destroy(t_2c_tmp)
476 mp2_env%potential_parameter,
"RPA_2c_nl_pot", qs_env, &
477 sym_ij=.false., dist_2d=dist_2d)
481 CALL dbcsr_create(force_data%G_PQ,
"G_PQ", dbcsr_dist, dbcsr_type_no_symmetry, row_bsize, col_bsize)
485 "RPA_2c_nl_metric", qs_env, sym_ij=.true., dist_2d=dist_2d)
486 CALL build_2c_integrals(t_2c_int_tmp, mp2_env%ri_rpa_im_time%eps_filter, qs_env, nl_2c, &
487 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
489 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
494 mp2_env%ri_metric,
"RPA_2c_nl_metric", qs_env, sym_ij=.false., &
502 CALL dbt_create(dbcsr_work, t_2c_tmp)
503 CALL dbt_copy_matrix_to_tensor(dbcsr_work, t_2c_tmp)
504 CALL dbt_create(t_2c_template, force_data%t_2c_inv_metric)
505 CALL dbt_copy(t_2c_tmp, force_data%t_2c_inv_metric, move_data=.true.)
506 CALL dbt_filter(force_data%t_2c_inv_metric, mp2_env%ri_rpa_im_time%eps_filter)
507 CALL dbt_destroy(t_2c_tmp)
512 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
513 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
514 CALL dbt_create(t_2c_template, force_data%t_2c_der_metric(i_xyz))
515 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_metric(i_xyz), move_data=.true.)
516 CALL dbt_filter(force_data%t_2c_der_metric(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
517 CALL dbt_destroy(t_2c_tmp)
522 CALL dbt_create(t_2c_template, force_data%t_2c_K)
523 CALL dbt_contract(1.0_dp, force_data%t_2c_inv_metric, force_data%t_2c_pot_psqrt, &
524 0.0_dp, force_data%t_2c_K, &
525 contract_1=[2], notcontract_1=[1], &
526 contract_2=[1], notcontract_2=[2], &
527 map_1=[1], map_2=[2], filter_eps=mp2_env%ri_rpa_im_time%eps_filter)
530 CALL dbt_destroy(t_2c_template)
537 DEALLOCATE (row_bsize, col_bsize)
538 ALLOCATE (row_bsize(
SIZE(sizes_ao)))
539 ALLOCATE (col_bsize(
SIZE(sizes_ao)))
540 row_bsize(:) = sizes_ao(:)
541 col_bsize(:) = sizes_ao(:)
543 CALL create_2c_tensor(t_2c_template, dist1, dist2, pgrid_t2c, force_data%bsizes_AO_split, &
544 force_data%bsizes_AO_split, name=
'(AO| AO)')
545 DEALLOCATE (dist1, dist2)
548 CALL dbcsr_create(t_2c_der_tmp(1, i_xyz),
"(P|Q) RPA der", dbcsr_dist, &
549 dbcsr_type_antisymmetric, row_bsize, col_bsize)
554 "RPA_2c_nl_metric", qs_env, sym_ij=.true., dist_2d=dist_2d)
556 basis_set_ao, basis_set_ao, identity_pot)
561 "RPA_2c_nl_metric", qs_env, sym_ij=.false., dist_2d=dist_2d)
564 CALL dbcsr_create(force_data%inv_ovlp, template=matrix_s(1)%matrix)
565 CALL dbcsr_copy(force_data%inv_ovlp, matrix_s(1)%matrix)
570 CALL dbt_create(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
571 CALL dbt_copy_matrix_to_tensor(t_2c_der_tmp(1, i_xyz), t_2c_tmp)
572 CALL dbt_create(t_2c_template, force_data%t_2c_der_ovlp(i_xyz))
573 CALL dbt_copy(t_2c_tmp, force_data%t_2c_der_ovlp(i_xyz), move_data=.true.)
574 CALL dbt_filter(force_data%t_2c_der_ovlp(i_xyz), mp2_env%ri_rpa_im_time%eps_filter)
575 CALL dbt_destroy(t_2c_tmp)
580 nspins = dft_control%nspins
581 ALLOCATE (force_data%P_virt(nspins), force_data%P_occ(nspins))
582 ALLOCATE (force_data%sum_YP_tau(nspins), force_data%sum_O_tau(nspins))
584 ALLOCATE (force_data%P_virt(ispin)%matrix, force_data%P_occ(ispin)%matrix)
585 ALLOCATE (force_data%sum_YP_tau(ispin)%matrix, force_data%sum_O_tau(ispin)%matrix)
586 CALL dbcsr_create(force_data%P_virt(ispin)%matrix, template=matrix_s(1)%matrix)
587 CALL dbcsr_create(force_data%P_occ(ispin)%matrix, template=matrix_s(1)%matrix)
588 CALL dbcsr_create(force_data%sum_O_tau(ispin)%matrix, template=matrix_s(1)%matrix)
589 CALL dbcsr_create(force_data%sum_YP_tau(ispin)%matrix, template=matrix_s(1)%matrix)
591 CALL dbcsr_copy(force_data%sum_O_tau(ispin)%matrix, matrix_s(1)%matrix)
592 CALL dbcsr_copy(force_data%sum_YP_tau(ispin)%matrix, matrix_s(1)%matrix)
594 CALL dbcsr_set(force_data%sum_O_tau(ispin)%matrix, 0.0_dp)
595 CALL dbcsr_set(force_data%sum_YP_tau(ispin)%matrix, 0.0_dp)
601 CALL dbcsr_copy(force_data%P_occ(1)%matrix, rho_ao(1)%matrix)
602 IF (nspins == 1)
THEN
603 CALL dbcsr_scale(force_data%P_occ(1)%matrix, 0.5_dp)
605 CALL dbcsr_copy(force_data%P_occ(2)%matrix, rho_ao(2)%matrix)
608 CALL dbcsr_copy(force_data%P_virt(ispin)%matrix, force_data%inv_ovlp)
609 CALL dbcsr_add(force_data%P_virt(ispin)%matrix, force_data%P_occ(ispin)%matrix, 1.0_dp, -1.0_dp)
612 DO ibasis = 1,
SIZE(basis_set_ao)
613 orb_basis => basis_set_ao(ibasis)%gto_basis_set
615 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
619 CALL dbt_destroy(t_2c_template)
624 DEALLOCATE (row_bsize, col_bsize)
625 CALL dbt_pgrid_destroy(pgrid_t3c)
626 CALL dbt_pgrid_destroy(pgrid_t2c)
628 CALL timestop(handle)
661 t_3c_O_ind, fm_mo_coeff, homo, starts_array_mc, ends_array_mc, &
662 starts_array_mc_block, ends_array_mc_block, &
663 nmo, Eigenval, grid, cut_memory, Pspin, Qspin, &
664 open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
667 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega
668 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m, t_3c_o
671 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mo_coeff
672 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, starts_array_mc, ends_array_mc, &
673 starts_array_mc_block, &
675 INTEGER,
INTENT(IN) :: nmo
676 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
678 INTEGER,
INTENT(IN) :: cut_memory, pspin, qspin
679 LOGICAL,
INTENT(IN) :: open_shell
680 INTEGER,
INTENT(IN) :: unit_nr
681 REAL(
dp),
INTENT(INOUT) :: dbcsr_time
682 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
686 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_laplace_loop_forces'
688 INTEGER :: dummy_int, handle, handle2, i_mem, i_xyz, ibasis, ispin, j_xyz, jquad, k_xyz, &
689 n_mem_ri, n_rep, natom, nkind, nspins, num_integ_points, unit_nr_dbcsr
690 INTEGER(int_8) :: flop, nze, nze_ddint, nze_der_ao, &
692 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, batch_blk_end, &
693 batch_blk_start, batch_end_ri, &
694 batch_start_ri, kind_of, mc_ranges, &
696 INTEGER,
DIMENSION(:, :),
POINTER :: dummy_ptr
697 LOGICAL :: memory_info, use_virial
698 REAL(
dp) :: eps_filter, eps_pgf_orb, &
699 eps_pgf_orb_old,
fac, occ, occ_ddint, &
700 occ_der_ao, occ_der_ri, occ_kqk, &
701 omega, pref, t1, t2, tau
702 REAL(
dp),
DIMENSION(3, 3) :: work_virial, work_virial_ovlp
705 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
706 TYPE(
dbcsr_p_type),
DIMENSION(:, :, :),
POINTER :: propagator
707 TYPE(
dbcsr_type) :: dbcsr_work1, dbcsr_work2, dbcsr_work3, &
708 exp_occ, exp_virt, r_occ, r_virt, &
709 virial_ovlp, y_1, y_2
710 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, &
711 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, &
712 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
713 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_p
716 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
718 TYPE(libint_potential_type) :: identity_pot
722 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
726 NULLIFY (matrix_s, dummy_ptr, atomic_kind_set, force, matrix_s, matrix_ks)
727 NULLIFY (dft_control, virial, particle_set, cell, para_env, orb_basis, ri_basis, qs_section)
728 NULLIFY (qs_kind_set)
730 CALL timeset(routinen, handle)
732 num_integ_points =
SIZE(grid%imaginary_time)
736 CALL get_qs_env(qs_env, matrix_s=matrix_s, natom=natom, atomic_kind_set=atomic_kind_set, &
737 force=force, matrix_ks=matrix_ks, dft_control=dft_control, virial=virial, &
738 particle_set=particle_set, cell=cell, para_env=para_env, nkind=nkind, &
739 qs_kind_set=qs_kind_set)
740 eps_filter = mp2_env%ri_rpa_im_time%eps_filter
741 nspins = dft_control%nspins
743 memory_info = mp2_env%ri_rpa_im_time%memory_info
744 IF (memory_info)
THEN
745 unit_nr_dbcsr = unit_nr
750 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
752 IF (use_virial) virial%pv_calculate = .true.
761 eps_pgf_orb = sqrt(eps_pgf_orb)
763 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
765 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
769 DO ibasis = 1,
SIZE(basis_set_ao)
770 orb_basis => basis_set_ao(ibasis)%gto_basis_set
772 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
778 ALLOCATE (t_p(nspins))
779 CALL dbt_create(force_data%t_2c_K, t_2c_ri)
780 CALL dbt_create(force_data%t_2c_K, t_2c_ri_2)
781 CALL dbt_create(force_data%t_2c_der_ovlp(1), t_2c_ao)
787 ALLOCATE (mc_ranges(cut_memory + 1))
788 mc_ranges(:cut_memory) = starts_array_mc_block(:)
789 mc_ranges(cut_memory + 1) = ends_array_mc_block(cut_memory) + 1
792 n_mem_ri = cut_memory
794 batch_blk_start, batch_blk_end)
795 ALLOCATE (mc_ranges_ri(n_mem_ri + 1))
796 mc_ranges_ri(1:n_mem_ri) = batch_blk_start(1:n_mem_ri)
797 mc_ranges_ri(n_mem_ri + 1) = batch_blk_end(n_mem_ri) + 1
798 DEALLOCATE (batch_blk_start, batch_blk_end)
802 CALL dbt_create(t_2c_ri, t_p(ispin))
804 CALL dbt_create(t_2c_ri, t_q)
805 CALL dbt_create(t_2c_ri, t_kqkt)
806 CALL dbt_create(t_2c_ao, t_dm_occ)
807 CALL dbt_create(t_2c_ao, t_dm_virt)
810 CALL dbt_create(t_3c_o, t_m_occ)
811 CALL dbt_create(t_3c_o, t_m_virt)
812 CALL dbt_create(t_3c_o, t_3c_0)
814 CALL dbt_create(t_3c_o, t_3c_1)
815 CALL dbt_create(t_3c_o, t_3c_3)
816 CALL dbt_create(t_3c_o, t_3c_4)
817 CALL dbt_create(t_3c_o, t_3c_5)
818 CALL dbt_create(t_3c_m, t_3c_6)
819 CALL dbt_create(t_3c_m, t_3c_7)
820 CALL dbt_create(t_3c_m, t_3c_8)
821 CALL dbt_create(t_3c_m, t_3c_sparse)
822 CALL dbt_create(t_3c_o, t_3c_help_1)
823 CALL dbt_create(t_3c_o, t_3c_help_2)
824 CALL dbt_create(t_2c_ao, t_r_occ)
825 CALL dbt_create(t_2c_ao, t_r_virt)
826 CALL dbt_create(t_3c_m, t_3c_ints)
827 CALL dbt_create(t_3c_m, t_3c_work)
830 occ_der_ao = 0; nze_der_ao = 0
831 occ_der_ri = 0; nze_der_ri = 0
833 DO i_mem = 1, cut_memory
834 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
835 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
837 occ_der_ri = occ_der_ri + occ
838 nze_der_ri = nze_der_ri + nze
839 CALL dbt_copy(force_data%t_3c_der_RI(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
841 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
842 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
844 occ_der_ao = occ_der_ao + occ
845 nze_der_ao = nze_der_ao + nze
846 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, order=[1, 3, 2], summation=.true.)
847 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
850 occ_der_ri = occ_der_ri/3.0_dp
851 occ_der_ao = occ_der_ao/3.0_dp
852 nze_der_ri = nze_der_ri/3
853 nze_der_ao = nze_der_ao/3
855 CALL dbcsr_create(r_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
856 CALL dbcsr_create(r_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
857 CALL dbcsr_create(dbcsr_work1, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
858 CALL dbcsr_create(dbcsr_work2, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
859 CALL dbcsr_create(dbcsr_work3, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
860 CALL dbcsr_create(exp_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
861 CALL dbcsr_create(exp_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
862 IF (use_virial)
CALL dbcsr_create(virial_ovlp, template=dbcsr_work1)
864 CALL dbt_batched_contract_init(t_3c_0, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
865 CALL dbt_batched_contract_init(t_3c_1, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
866 CALL dbt_batched_contract_init(t_3c_3, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
867 CALL dbt_batched_contract_init(t_m_occ, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
868 CALL dbt_batched_contract_init(t_m_virt, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
870 CALL dbt_batched_contract_init(t_3c_ints, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
871 CALL dbt_batched_contract_init(t_3c_work, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
873 CALL dbt_batched_contract_init(t_3c_4, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
874 batch_range_3=mc_ranges)
875 CALL dbt_batched_contract_init(t_3c_5, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
876 batch_range_3=mc_ranges)
877 CALL dbt_batched_contract_init(t_3c_6, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
878 batch_range_3=mc_ranges)
879 CALL dbt_batched_contract_init(t_3c_7, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
880 batch_range_3=mc_ranges)
881 CALL dbt_batched_contract_init(t_3c_8, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
882 batch_range_3=mc_ranges)
883 CALL dbt_batched_contract_init(t_3c_sparse, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
884 batch_range_3=mc_ranges)
887 work_virial_ovlp = 0.0_dp
888 DO jquad = 1, num_integ_points
889 tau = grid%imaginary_time(jquad)
890 omega = grid%time_weights_at_zero_frequency(jquad)
891 fac = -2.0_dp*omega*mp2_env%scale_S
892 IF (open_shell)
fac = 0.5_dp*
fac
893 occ_ddint = 0; nze_ddint = 0
901 CALL dbt_create(mat_p_omega(jquad, ispin)%matrix, t_2c_tmp)
902 CALL dbt_copy_matrix_to_tensor(mat_p_omega(jquad, ispin)%matrix, t_2c_tmp)
903 CALL dbt_copy(t_2c_tmp, t_p(ispin), move_data=.true.)
904 CALL dbt_filter(t_p(ispin), eps_filter)
905 CALL dbt_destroy(t_2c_tmp)
909 CALL dbt_contract(1.0_dp, t_p(qspin), force_data%t_2c_K, 0.0_dp, t_2c_ri, &
910 contract_1=[2], notcontract_1=[1], &
911 contract_2=[1], notcontract_2=[2], &
912 map_1=[1], map_2=[2], filter_eps=eps_filter, &
913 flop=flop, unit_nr=unit_nr_dbcsr)
914 dbcsr_nflop = dbcsr_nflop + flop
915 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_2c_ri, 0.0_dp, t_q, &
916 contract_1=[1], notcontract_1=[2], &
917 contract_2=[1], notcontract_2=[2], &
918 map_1=[1], map_2=[2], filter_eps=eps_filter, &
919 flop=flop, unit_nr=unit_nr_dbcsr)
920 dbcsr_nflop = dbcsr_nflop + flop
921 CALL dbt_clear(t_2c_ri)
923 CALL perform_2c_ops(force, t_kqkt, force_data,
fac, t_q, t_p(pspin), t_2c_ri, t_2c_ri_2, &
924 use_virial, atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
929 matrix_s, pspin, eigenval(:, pspin), 0.0_dp, eps_filter, &
930 mp2_env%ri_rpa_im_time%memory_info, unit_nr, &
931 jquad, .false., .false., qs_env, dummy_int, dummy_ptr, para_env)
935 CALL dbt_copy(t_2c_tmp, t_dm_occ, move_data=.true.)
936 CALL dbt_filter(t_dm_occ, eps_filter)
937 CALL dbt_destroy(t_2c_tmp)
941 CALL dbt_copy(t_2c_tmp, t_dm_virt, move_data=.true.)
942 CALL dbt_filter(t_dm_virt, eps_filter)
943 CALL dbt_destroy(t_2c_tmp)
946 CALL perform_3c_ops(force, t_r_occ, t_r_virt, force_data,
fac, cut_memory, n_mem_ri, &
947 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, &
948 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, &
949 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_ri, &
950 batch_end_ri, t_3c_o_compressed, t_3c_o_ind, use_virial, &
951 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
952 unit_nr_dbcsr, mp2_env)
954 CALL timeset(routinen//
"_dbcsr", handle2)
957 CALL dbt_create(matrix_s(1)%matrix, t_2c_tmp)
958 CALL dbt_copy(t_r_occ, t_2c_tmp, move_data=.true.)
959 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_occ)
961 CALL dbt_copy(t_r_virt, t_2c_tmp, move_data=.true.)
962 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_virt)
965 CALL dbcsr_multiply(
'N',
'N', tau, force_data%P_occ(pspin)%matrix, &
966 matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
967 CALL build_y_matrix(y_1, dbcsr_work1, force_data%P_occ(pspin)%matrix, r_virt, eps_filter)
970 CALL dbcsr_multiply(
'N',
'N', -tau, force_data%P_virt(pspin)%matrix, &
971 matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
972 CALL build_y_matrix(y_2, dbcsr_work1, force_data%P_virt(pspin)%matrix, r_occ, eps_filter)
977 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, r_occ, force_data%inv_ovlp, 0.0_dp, dbcsr_work1)
978 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, exp_virt, dbcsr_work1, 0.0_dp, dbcsr_work3)
979 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, force_data%inv_ovlp, dbcsr_work3, 0.0_dp, dbcsr_work2)
981 CALL dbcsr_multiply(
'N',
'T', tau, force_data%inv_ovlp, y_2, 0.0_dp, dbcsr_work3)
982 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work3, matrix_ks(pspin)%matrix, 0.0_dp, dbcsr_work1)
983 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work1, force_data%inv_ovlp, 0.0_dp, dbcsr_work3)
985 CALL dbcsr_add(dbcsr_work2, dbcsr_work3, 1.0_dp, -1.0_dp)
987 CALL dbt_copy_matrix_to_tensor(dbcsr_work2, t_2c_tmp)
988 CALL dbt_copy(t_2c_tmp, t_2c_ao, move_data=.true.)
991 CALL get_2c_der_force(force, t_2c_ao, force_data%t_2c_der_ovlp, atom_of_kind, &
992 kind_of, force_data%idx_to_at_AO, pref, do_ovlp=.true.)
994 IF (use_virial)
CALL dbcsr_add(virial_ovlp, dbcsr_work2, 1.0_dp, pref)
997 CALL dbcsr_multiply(
'N',
'N', tau*
fac, y_1, force_data%P_occ(pspin)%matrix, 1.0_dp, &
998 force_data%sum_YP_tau(pspin)%matrix, retain_sparsity=.true.)
999 CALL dbcsr_multiply(
'N',
'N', -tau*
fac, y_2, force_data%P_virt(pspin)%matrix, 1.0_dp, &
1000 force_data%sum_YP_tau(pspin)%matrix, retain_sparsity=.true.)
1003 pref = -omega*mp2_env%scale_S
1005 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1007 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1008 CALL dbcsr_multiply(
'N',
'N', pref*tau, matrix_ks(pspin)%matrix, y_1, 1.0_dp, &
1009 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1010 CALL dbcsr_multiply(
'N',
'N', pref*tau, matrix_ks(pspin)%matrix, y_2, 1.0_dp, &
1011 force_data%sum_O_tau(pspin)%matrix, retain_sparsity=.true.)
1013 CALL timestop(handle2)
1016 CALL para_env%sync()
1018 dbcsr_time = dbcsr_time + t2 - t1
1020 IF (unit_nr > 0)
THEN
1021 WRITE (unit_nr,
'(/T3,A,1X,I3,A)') &
1022 'RPA_LOW_SCALING_INFO| Info for time point', jquad,
' (gradients)'
1023 WRITE (unit_nr,
'(T6,A,T56,F25.6)') &
1024 'Execution time (s):', t2 - t1
1025 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1026 'Occupancy of 3c AO derivs:', real(nze_der_ao,
dp),
'/', occ_der_ao*100,
'%'
1027 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1028 'Occupancy of 3c RI derivs:', real(nze_der_ri,
dp),
'/', occ_der_ri*100,
'%'
1029 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1030 'Occupancy of the Docc * Dvirt * 3c-int tensor', real(nze_ddint,
dp),
'/', occ_ddint*100,
'%'
1031 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1032 'Occupancy of KQK^T 2c-tensor:', real(nze_kqk,
dp),
'/', occ_kqk*100,
'%'
1039 CALL dbt_destroy(t_2c_tmp)
1042 CALL dbt_batched_contract_finalize(t_3c_0)
1043 CALL dbt_batched_contract_finalize(t_3c_1)
1044 CALL dbt_batched_contract_finalize(t_3c_3)
1045 CALL dbt_batched_contract_finalize(t_m_occ)
1046 CALL dbt_batched_contract_finalize(t_m_virt)
1048 CALL dbt_batched_contract_finalize(t_3c_ints)
1049 CALL dbt_batched_contract_finalize(t_3c_work)
1051 CALL dbt_batched_contract_finalize(t_3c_4)
1052 CALL dbt_batched_contract_finalize(t_3c_5)
1053 CALL dbt_batched_contract_finalize(t_3c_6)
1054 CALL dbt_batched_contract_finalize(t_3c_7)
1055 CALL dbt_batched_contract_finalize(t_3c_8)
1056 CALL dbt_batched_contract_finalize(t_3c_sparse)
1059 IF (use_virial)
THEN
1060 CALL dbt_copy(force_data%t_3c_virial_split, force_data%t_3c_virial, move_data=.true.)
1061 CALL calc_3c_virial(work_virial, force_data%t_3c_virial, 1.0_dp, qs_env, force_data%nl_3c, &
1062 basis_set_ri_aux, basis_set_ao, basis_set_ao, mp2_env%ri_metric, &
1063 der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1)
1065 CALL calc_2c_virial(work_virial, force_data%RI_virial_met, 1.0_dp, qs_env, force_data%nl_2c_met, &
1066 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
1069 IF (.NOT. force_data%do_periodic)
THEN
1070 CALL calc_2c_virial(work_virial, force_data%RI_virial_pot, 1.0_dp, qs_env, force_data%nl_2c_pot, &
1071 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
1076 CALL calc_2c_virial(work_virial_ovlp, virial_ovlp, 1.0_dp, qs_env, force_data%nl_2c_ovlp, &
1077 basis_set_ao, basis_set_ao, identity_pot)
1083 virial%pv_mp2(i_xyz, j_xyz) = virial%pv_mp2(i_xyz, j_xyz) &
1084 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1085 virial%pv_overlap(i_xyz, j_xyz) = virial%pv_overlap(i_xyz, j_xyz) &
1086 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1087 virial%pv_virial(i_xyz, j_xyz) = virial%pv_virial(i_xyz, j_xyz) &
1088 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz) &
1089 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1096 work_virial = 0.0_dp
1097 IF (force_data%do_periodic)
THEN
1099 CALL get_2c_gpw_forces(force_data%G_PQ, force, work_virial, use_virial, mp2_env, qs_env)
1100 ELSE IF (mp2_env%eri_method ==
do_eri_mme)
THEN
1101 CALL get_2c_mme_forces(force_data%G_PQ, force, mp2_env, qs_env)
1102 IF (use_virial) cpabort(
"Stress tensor not available with MME intrgrals")
1104 cpabort(
"Periodic case not possible with OS integrals")
1109 IF (use_virial)
THEN
1110 virial%pv_mp2 = virial%pv_mp2 + work_virial
1111 virial%pv_virial = virial%pv_virial + work_virial
1112 virial%pv_calculate = .false.
1114 DO ibasis = 1,
SIZE(basis_set_ao)
1115 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1117 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1123 IF (
ASSOCIATED(dummy_ptr))
DEALLOCATE (dummy_ptr)
1124 DO ispin = 1, nspins
1125 CALL dbt_destroy(t_p(ispin))
1127 CALL dbt_destroy(t_3c_0)
1128 CALL dbt_destroy(t_3c_1)
1129 CALL dbt_destroy(t_3c_3)
1130 CALL dbt_destroy(t_3c_4)
1131 CALL dbt_destroy(t_3c_5)
1132 CALL dbt_destroy(t_3c_6)
1133 CALL dbt_destroy(t_3c_7)
1134 CALL dbt_destroy(t_3c_8)
1135 CALL dbt_destroy(t_3c_sparse)
1136 CALL dbt_destroy(t_3c_help_1)
1137 CALL dbt_destroy(t_3c_help_2)
1138 CALL dbt_destroy(t_3c_ints)
1139 CALL dbt_destroy(t_3c_work)
1140 CALL dbt_destroy(t_r_occ)
1141 CALL dbt_destroy(t_r_virt)
1142 CALL dbt_destroy(t_dm_occ)
1143 CALL dbt_destroy(t_dm_virt)
1144 CALL dbt_destroy(t_q)
1145 CALL dbt_destroy(t_kqkt)
1146 CALL dbt_destroy(t_m_occ)
1147 CALL dbt_destroy(t_m_virt)
1156 CALL dbt_destroy(t_2c_ri)
1157 CALL dbt_destroy(t_2c_ri_2)
1158 CALL dbt_destroy(t_2c_ao)
1161 CALL timestop(handle)
1194 t_3c_O_ind, fm_mo_coeff, homo, starts_array_mc, ends_array_mc, &
1195 starts_array_mc_block, ends_array_mc_block, &
1196 nmo, Eigenval, e_fermi, grid, cut_memory, ispin, open_shell, unit_nr, dbcsr_time, &
1197 dbcsr_nflop, mp2_env, qs_env)
1200 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega
1201 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m, t_3c_o
1204 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mo_coeff
1205 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, starts_array_mc, ends_array_mc, &
1206 starts_array_mc_block, &
1208 INTEGER,
INTENT(IN) :: nmo
1209 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
1210 REAL(kind=
dp),
INTENT(IN) :: e_fermi
1212 INTEGER,
INTENT(IN) :: cut_memory, ispin
1213 LOGICAL,
INTENT(IN) :: open_shell
1214 INTEGER,
INTENT(IN) :: unit_nr
1215 REAL(
dp),
INTENT(INOUT) :: dbcsr_time
1216 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
1220 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_rpa_loop_forces'
1222 INTEGER :: dummy_int, handle, handle2, i_mem, i_xyz, ibasis, iquad, j_xyz, jquad, k_xyz, &
1223 n_mem_ri, n_rep, natom, nkind, nspins, num_integ_points, unit_nr_dbcsr
1224 INTEGER(int_8) :: flop, nze, nze_ddint, nze_der_ao, &
1226 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, batch_blk_end, &
1227 batch_blk_start, batch_end_ri, &
1228 batch_start_ri, kind_of, mc_ranges, &
1230 INTEGER,
DIMENSION(:, :),
POINTER :: dummy_ptr
1231 LOGICAL :: memory_info, use_virial
1232 REAL(
dp) :: eps_filter, eps_pgf_orb, eps_pgf_orb_old,
fac, occ, occ_ddint, occ_der_ao, &
1233 occ_der_ri, occ_kbk, pref, spin_fac, t1, t2, tau, weight
1234 REAL(
dp),
DIMENSION(3, 3) :: work_virial, work_virial_ovlp
1238 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_p_tau, matrix_ks, matrix_s
1239 TYPE(
dbcsr_p_type),
DIMENSION(:, :, :),
POINTER :: propagator
1240 TYPE(
dbcsr_type) :: dbcsr_work1, dbcsr_work2, dbcsr_work3, &
1241 dbcsr_work_symm, exp_occ, exp_virt, &
1242 r_occ, r_virt, virial_ovlp, y_1, y_2
1243 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, &
1244 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, &
1245 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
1246 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_b
1249 DIMENSION(:),
TARGET :: basis_set_ao, basis_set_ri_aux
1251 TYPE(libint_potential_type) :: identity_pot
1255 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1259 NULLIFY (matrix_s, dummy_ptr, atomic_kind_set, force, matrix_s, matrix_ks)
1260 NULLIFY (dft_control, virial, particle_set, cell, blacs_env, para_env, orb_basis, ri_basis)
1261 NULLIFY (qs_kind_set)
1263 CALL timeset(routinen, handle)
1265 num_integ_points =
SIZE(grid%imaginary_time)
1267 NULLIFY (propagator)
1269 CALL get_qs_env(qs_env, matrix_s=matrix_s, natom=natom, atomic_kind_set=atomic_kind_set, &
1270 force=force, matrix_ks=matrix_ks, dft_control=dft_control, virial=virial, &
1271 particle_set=particle_set, cell=cell, blacs_env=blacs_env, para_env=para_env, &
1272 qs_kind_set=qs_kind_set, nkind=nkind)
1273 eps_filter = mp2_env%ri_rpa_im_time%eps_filter
1274 nspins = dft_control%nspins
1276 memory_info = mp2_env%ri_rpa_im_time%memory_info
1277 IF (memory_info)
THEN
1278 unit_nr_dbcsr = unit_nr
1283 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
1285 IF (use_virial) virial%pv_calculate = .true.
1287 IF (use_virial)
THEN
1290 IF (n_rep /= 0)
THEN
1294 eps_pgf_orb = sqrt(eps_pgf_orb)
1296 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
1298 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
1302 DO ibasis = 1,
SIZE(basis_set_ao)
1303 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1305 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1311 CALL dbt_create(force_data%t_2c_K, t_2c_ri)
1312 CALL dbt_create(force_data%t_2c_K, t_2c_ri_2)
1313 CALL dbt_create(force_data%t_2c_der_ovlp(1), t_2c_ao)
1319 ALLOCATE (mc_ranges(cut_memory + 1))
1320 mc_ranges(:cut_memory) = starts_array_mc_block(:)
1321 mc_ranges(cut_memory + 1) = ends_array_mc_block(cut_memory) + 1
1324 n_mem_ri = cut_memory
1326 batch_blk_start, batch_blk_end)
1327 ALLOCATE (mc_ranges_ri(n_mem_ri + 1))
1328 mc_ranges_ri(1:n_mem_ri) = batch_blk_start(1:n_mem_ri)
1329 mc_ranges_ri(n_mem_ri + 1) = batch_blk_end(n_mem_ri) + 1
1330 DEALLOCATE (batch_blk_start, batch_blk_end)
1333 CALL dbt_create(t_2c_ri, t_p)
1334 CALL dbt_create(t_2c_ri, t_kbkt)
1335 CALL dbt_create(t_2c_ao, t_dm_occ)
1336 CALL dbt_create(t_2c_ao, t_dm_virt)
1339 CALL dbt_create(t_3c_o, t_m_occ)
1340 CALL dbt_create(t_3c_o, t_m_virt)
1341 CALL dbt_create(t_3c_o, t_3c_0)
1343 CALL dbt_create(t_3c_o, t_3c_1)
1344 CALL dbt_create(t_3c_o, t_3c_3)
1345 CALL dbt_create(t_3c_o, t_3c_4)
1346 CALL dbt_create(t_3c_o, t_3c_5)
1347 CALL dbt_create(t_3c_m, t_3c_6)
1348 CALL dbt_create(t_3c_m, t_3c_7)
1349 CALL dbt_create(t_3c_m, t_3c_8)
1350 CALL dbt_create(t_3c_m, t_3c_sparse)
1351 CALL dbt_create(t_3c_o, t_3c_help_1)
1352 CALL dbt_create(t_3c_o, t_3c_help_2)
1353 CALL dbt_create(t_2c_ao, t_r_occ)
1354 CALL dbt_create(t_2c_ao, t_r_virt)
1355 CALL dbt_create(t_3c_m, t_3c_ints)
1356 CALL dbt_create(t_3c_m, t_3c_work)
1360 ALLOCATE (t_b(num_integ_points))
1361 DO jquad = 1, num_integ_points
1362 CALL dbt_create(t_2c_ri, t_b(jquad))
1365 ALLOCATE (mat_p_tau(num_integ_points))
1366 DO jquad = 1, num_integ_points
1367 ALLOCATE (mat_p_tau(jquad)%matrix)
1368 CALL dbcsr_create(mat_p_tau(jquad)%matrix, template=mat_p_omega(jquad, ispin)%matrix)
1371 CALL dbcsr_create(dbcsr_work_symm, template=force_data%G_PQ, matrix_type=dbcsr_type_symmetric)
1372 CALL dbt_create(dbcsr_work_symm, t_2c_tmp)
1375 DO iquad = 1, num_integ_points
1379 CALL dbcsr_copy(dbcsr_work_symm, mat_p_omega(iquad, 1)%matrix)
1380 CALL dbt_copy_matrix_to_tensor(dbcsr_work_symm, t_2c_tmp)
1381 CALL dbt_copy(t_2c_tmp, t_2c_ri, move_data=.true.)
1383 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_2c_ri_2, &
1384 contract_1=[2], notcontract_1=[1], &
1385 contract_2=[1], notcontract_2=[2], &
1386 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1387 flop=flop, unit_nr=unit_nr_dbcsr)
1388 dbcsr_nflop = dbcsr_nflop + flop
1389 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_2c_ri_2, 0.0_dp, t_2c_ri, &
1390 contract_1=[1], notcontract_1=[2], &
1391 contract_2=[1], notcontract_2=[2], &
1392 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1393 flop=flop, unit_nr=unit_nr_dbcsr)
1394 CALL dbt_copy(t_2c_ri, t_2c_tmp, move_data=.true.)
1395 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, dbcsr_work_symm)
1403 DO jquad = 1, num_integ_points
1406 weight = grid%cosine_frequency_to_time(jquad, iquad)
1407 IF (open_shell)
THEN
1408 IF (ispin == 1)
THEN
1410 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 1)%matrix, 1.0_dp, weight)
1411 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 2)%matrix, 1.0_dp, -weight)
1413 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 2)%matrix, 1.0_dp, weight)
1417 weight = 0.5_dp*weight
1418 CALL dbcsr_add(mat_p_tau(jquad)%matrix, mat_p_omega(iquad, 1)%matrix, 1.0_dp, weight)
1422 weight = grid%cosine_time_to_frequency(iquad, jquad)* &
1423 grid%frequency_weights(iquad)
1424 CALL dbt_copy_matrix_to_tensor(dbcsr_work_symm, t_2c_tmp)
1425 CALL dbt_scale(t_2c_tmp, weight)
1426 CALL dbt_copy(t_2c_tmp, t_b(jquad), summation=.true., move_data=.true.)
1429 CALL dbt_destroy(t_2c_tmp)
1431 CALL dbt_clear(t_2c_ri)
1432 CALL dbt_clear(t_2c_ri_2)
1435 occ_der_ao = 0; nze_der_ao = 0
1436 occ_der_ri = 0; nze_der_ri = 0
1438 DO i_mem = 1, cut_memory
1439 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(i_mem, i_xyz)%ind, &
1440 force_data%t_3c_der_RI_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
1442 occ_der_ri = occ_der_ri + occ
1443 nze_der_ri = nze_der_ri + nze
1444 CALL dbt_copy(force_data%t_3c_der_RI(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
1446 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(i_mem, i_xyz)%ind, &
1447 force_data%t_3c_der_AO_comp(i_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
1449 occ_der_ao = occ_der_ao + occ
1450 nze_der_ao = nze_der_ao + nze
1451 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, order=[1, 3, 2], summation=.true.)
1452 CALL dbt_copy(force_data%t_3c_der_AO(i_xyz), t_3c_sparse, summation=.true., move_data=.true.)
1455 occ_der_ri = occ_der_ri/3.0_dp
1456 occ_der_ao = occ_der_ao/3.0_dp
1457 nze_der_ri = nze_der_ri/3
1458 nze_der_ao = nze_der_ao/3
1460 CALL dbcsr_create(r_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1461 CALL dbcsr_create(r_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1462 CALL dbcsr_create(dbcsr_work_symm, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_symmetric)
1463 CALL dbcsr_create(dbcsr_work1, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1464 CALL dbcsr_create(dbcsr_work2, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1465 CALL dbcsr_create(dbcsr_work3, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1466 CALL dbcsr_create(exp_occ, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1467 CALL dbcsr_create(exp_virt, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1468 IF (use_virial)
CALL dbcsr_create(virial_ovlp, template=dbcsr_work1)
1470 CALL dbt_batched_contract_init(t_3c_0, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
1471 CALL dbt_batched_contract_init(t_3c_1, batch_range_2=mc_ranges, batch_range_3=mc_ranges)
1472 CALL dbt_batched_contract_init(t_3c_3, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1473 CALL dbt_batched_contract_init(t_m_occ, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1474 CALL dbt_batched_contract_init(t_m_virt, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1476 CALL dbt_batched_contract_init(t_3c_ints, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1477 CALL dbt_batched_contract_init(t_3c_work, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges)
1479 CALL dbt_batched_contract_init(t_3c_4, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1480 batch_range_3=mc_ranges)
1481 CALL dbt_batched_contract_init(t_3c_5, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1482 batch_range_3=mc_ranges)
1483 CALL dbt_batched_contract_init(t_3c_6, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1484 batch_range_3=mc_ranges)
1485 CALL dbt_batched_contract_init(t_3c_7, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1486 batch_range_3=mc_ranges)
1487 CALL dbt_batched_contract_init(t_3c_8, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1488 batch_range_3=mc_ranges)
1489 CALL dbt_batched_contract_init(t_3c_sparse, batch_range_1=mc_ranges_ri, batch_range_2=mc_ranges, &
1490 batch_range_3=mc_ranges)
1492 fac = 1.0_dp/
fourpi*mp2_env%ri_rpa%scale_rpa
1493 IF (open_shell)
fac = 0.5_dp*
fac
1495 work_virial = 0.0_dp
1496 work_virial_ovlp = 0.0_dp
1497 DO jquad = 1, num_integ_points
1498 tau = grid%imaginary_time(jquad)
1499 occ_ddint = 0; nze_ddint = 0
1501 CALL para_env%sync()
1506 CALL dbt_create(mat_p_tau(jquad)%matrix, t_2c_tmp)
1507 CALL dbt_copy_matrix_to_tensor(mat_p_tau(jquad)%matrix, t_2c_tmp)
1508 CALL dbt_copy(t_2c_tmp, t_p, move_data=.true.)
1509 CALL dbt_filter(t_p, eps_filter)
1510 CALL dbt_destroy(t_2c_tmp)
1512 CALL perform_2c_ops(force, t_kbkt, force_data,
fac, t_b(jquad), t_p, t_2c_ri, t_2c_ri_2, &
1513 use_virial, atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
1518 matrix_s, ispin, eigenval(:, ispin), e_fermi, eps_filter, &
1519 mp2_env%ri_rpa_im_time%memory_info, unit_nr, &
1520 jquad, .false., .false., qs_env, dummy_int, dummy_ptr, para_env)
1524 CALL dbt_copy(t_2c_tmp, t_dm_occ, move_data=.true.)
1525 CALL dbt_filter(t_dm_occ, eps_filter)
1526 CALL dbt_destroy(t_2c_tmp)
1530 CALL dbt_copy(t_2c_tmp, t_dm_virt, move_data=.true.)
1531 CALL dbt_filter(t_dm_virt, eps_filter)
1532 CALL dbt_destroy(t_2c_tmp)
1535 CALL perform_3c_ops(force, t_r_occ, t_r_virt, force_data,
fac, cut_memory, n_mem_ri, &
1536 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, &
1537 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, &
1538 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_ri, &
1539 batch_end_ri, t_3c_o_compressed, t_3c_o_ind, use_virial, &
1540 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
1541 unit_nr_dbcsr, mp2_env)
1543 CALL timeset(routinen//
"_dbcsr", handle2)
1546 CALL dbt_create(matrix_s(1)%matrix, t_2c_tmp)
1547 CALL dbt_copy(t_r_occ, t_2c_tmp, move_data=.true.)
1548 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_occ)
1550 CALL dbt_copy(t_r_virt, t_2c_tmp, move_data=.true.)
1551 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, r_virt)
1554 CALL dbcsr_copy(dbcsr_work_symm, matrix_ks(ispin)%matrix)
1555 CALL dbcsr_add(dbcsr_work_symm, matrix_s(1)%matrix, 1.0_dp, -e_fermi)
1556 CALL dbcsr_multiply(
'N',
'N', tau, force_data%P_occ(ispin)%matrix, &
1557 dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1558 CALL build_y_matrix(y_1, dbcsr_work1, force_data%P_occ(ispin)%matrix, r_virt, eps_filter)
1561 CALL dbcsr_multiply(
'N',
'N', -tau, force_data%P_virt(ispin)%matrix, &
1562 dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1563 CALL build_y_matrix(y_2, dbcsr_work1, force_data%P_virt(ispin)%matrix, r_occ, eps_filter)
1569 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, r_occ, force_data%inv_ovlp, 0.0_dp, dbcsr_work1)
1570 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, exp_virt, dbcsr_work1, 0.0_dp, dbcsr_work3)
1571 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, force_data%inv_ovlp, dbcsr_work3, 0.0_dp, dbcsr_work2)
1573 CALL dbcsr_multiply(
'N',
'T', tau, force_data%inv_ovlp, y_2, 0.0_dp, dbcsr_work3)
1574 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, dbcsr_work3, dbcsr_work_symm, 0.0_dp, dbcsr_work1)
1575 CALL dbcsr_multiply(
'N',
'N', -1.0_dp, dbcsr_work1, force_data%inv_ovlp, 1.0_dp, dbcsr_work2)
1577 CALL dbcsr_multiply(
'N',
'T', tau*e_fermi, force_data%P_occ(ispin)%matrix, y_1, 1.0_dp, dbcsr_work2)
1578 CALL dbcsr_multiply(
'N',
'T', -tau*e_fermi, force_data%P_virt(ispin)%matrix, y_2, 1.0_dp, dbcsr_work2)
1580 CALL dbt_copy_matrix_to_tensor(dbcsr_work2, t_2c_tmp)
1581 CALL dbt_copy(t_2c_tmp, t_2c_ao, move_data=.true.)
1584 CALL get_2c_der_force(force, t_2c_ao, force_data%t_2c_der_ovlp, atom_of_kind, &
1585 kind_of, force_data%idx_to_at_AO, pref, do_ovlp=.true.)
1587 IF (use_virial)
CALL dbcsr_add(virial_ovlp, dbcsr_work2, 1.0_dp, pref)
1590 CALL dbcsr_multiply(
'N',
'N',
fac*tau, y_1, force_data%P_occ(ispin)%matrix, 1.0_dp, &
1591 force_data%sum_YP_tau(ispin)%matrix, retain_sparsity=.true.)
1592 CALL dbcsr_multiply(
'N',
'N', -
fac*tau, y_2, force_data%P_virt(ispin)%matrix, 1.0_dp, &
1593 force_data%sum_YP_tau(ispin)%matrix, retain_sparsity=.true.)
1595 spin_fac = 0.5_dp*
fac
1596 IF (open_shell) spin_fac = 2.0_dp*spin_fac
1598 CALL dbcsr_multiply(
'N',
'N', 1.0_dp*spin_fac, r_virt, exp_occ, 1.0_dp, &
1599 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1600 CALL dbcsr_multiply(
'N',
'N', -1.0_dp*spin_fac, r_occ, exp_virt, 1.0_dp, &
1601 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1602 CALL dbcsr_multiply(
'N',
'N', tau*spin_fac, dbcsr_work_symm, y_1, 1.0_dp, &
1603 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1604 CALL dbcsr_multiply(
'N',
'N', tau*spin_fac, dbcsr_work_symm, y_2, 1.0_dp, &
1605 force_data%sum_O_tau(ispin)%matrix, retain_sparsity=.true.)
1607 CALL timestop(handle2)
1610 CALL para_env%sync()
1612 dbcsr_time = dbcsr_time + t2 - t1
1614 IF (unit_nr > 0)
THEN
1615 WRITE (unit_nr,
'(/T3,A,1X,I3,A)') &
1616 'RPA_LOW_SCALING_INFO| Info for time point', jquad,
' (gradients)'
1617 WRITE (unit_nr,
'(T6,A,T56,F25.6)') &
1619 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1620 'Occupancy of 3c AO derivs:', real(nze_der_ao,
dp),
'/', occ_der_ao*100,
'%'
1621 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1622 'Occupancy of 3c RI derivs:', real(nze_der_ri,
dp),
'/', occ_der_ri*100,
'%'
1623 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1624 'Occupancy of the Docc * Dvirt * 3c-int tensor', real(nze_ddint,
dp),
'/', occ_ddint*100,
'%'
1625 WRITE (unit_nr,
'(T6,A,T63,ES7.1,1X,A1,1X,F7.3,A1)') &
1626 'Occupancy of KBK^T 2c-tensor:', real(nze_kbk,
dp),
'/', occ_kbk*100,
'%'
1633 CALL dbt_destroy(t_2c_tmp)
1637 CALL dbt_batched_contract_finalize(t_3c_0)
1638 CALL dbt_batched_contract_finalize(t_3c_1)
1639 CALL dbt_batched_contract_finalize(t_3c_3)
1640 CALL dbt_batched_contract_finalize(t_m_occ)
1641 CALL dbt_batched_contract_finalize(t_m_virt)
1643 CALL dbt_batched_contract_finalize(t_3c_ints)
1644 CALL dbt_batched_contract_finalize(t_3c_work)
1646 CALL dbt_batched_contract_finalize(t_3c_4)
1647 CALL dbt_batched_contract_finalize(t_3c_5)
1648 CALL dbt_batched_contract_finalize(t_3c_6)
1649 CALL dbt_batched_contract_finalize(t_3c_7)
1650 CALL dbt_batched_contract_finalize(t_3c_8)
1651 CALL dbt_batched_contract_finalize(t_3c_sparse)
1654 IF (use_virial)
THEN
1655 CALL dbt_copy(force_data%t_3c_virial_split, force_data%t_3c_virial, move_data=.true.)
1656 CALL calc_3c_virial(work_virial, force_data%t_3c_virial, 1.0_dp, qs_env, force_data%nl_3c, &
1657 basis_set_ri_aux, basis_set_ao, basis_set_ao, mp2_env%ri_metric, &
1658 der_eps=mp2_env%ri_rpa_im_time%eps_filter, op_pos=1)
1660 CALL calc_2c_virial(work_virial, force_data%RI_virial_met, 1.0_dp, qs_env, force_data%nl_2c_met, &
1661 basis_set_ri_aux, basis_set_ri_aux, mp2_env%ri_metric)
1664 IF (.NOT. force_data%do_periodic)
THEN
1665 CALL calc_2c_virial(work_virial, force_data%RI_virial_pot, 1.0_dp, qs_env, force_data%nl_2c_pot, &
1666 basis_set_ri_aux, basis_set_ri_aux, mp2_env%potential_parameter)
1671 CALL calc_2c_virial(work_virial_ovlp, virial_ovlp, 1.0_dp, qs_env, force_data%nl_2c_ovlp, &
1672 basis_set_ao, basis_set_ao, identity_pot)
1678 virial%pv_mp2(i_xyz, j_xyz) = virial%pv_mp2(i_xyz, j_xyz) &
1679 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1680 virial%pv_overlap(i_xyz, j_xyz) = virial%pv_overlap(i_xyz, j_xyz) &
1681 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1682 virial%pv_virial(i_xyz, j_xyz) = virial%pv_virial(i_xyz, j_xyz) &
1683 - work_virial(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz) &
1684 - work_virial_ovlp(i_xyz, k_xyz)*cell%hmat(j_xyz, k_xyz)
1691 work_virial = 0.0_dp
1692 IF (force_data%do_periodic)
THEN
1694 CALL get_2c_gpw_forces(force_data%G_PQ, force, work_virial, use_virial, mp2_env, qs_env)
1695 ELSE IF (mp2_env%eri_method ==
do_eri_mme)
THEN
1696 CALL get_2c_mme_forces(force_data%G_PQ, force, mp2_env, qs_env)
1697 IF (use_virial) cpabort(
"Stress tensor not available with MME intrgrals")
1699 cpabort(
"Periodic case not possible with OS integrals")
1704 IF (use_virial)
THEN
1705 virial%pv_mp2 = virial%pv_mp2 + work_virial
1706 virial%pv_virial = virial%pv_virial + work_virial
1707 virial%pv_calculate = .false.
1709 DO ibasis = 1,
SIZE(basis_set_ao)
1710 orb_basis => basis_set_ao(ibasis)%gto_basis_set
1712 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
1718 IF (
ASSOCIATED(dummy_ptr))
DEALLOCATE (dummy_ptr)
1719 DO jquad = 1, num_integ_points
1720 CALL dbt_destroy(t_b(jquad))
1722 CALL dbt_destroy(t_p)
1723 CALL dbt_destroy(t_3c_0)
1724 CALL dbt_destroy(t_3c_1)
1725 CALL dbt_destroy(t_3c_3)
1726 CALL dbt_destroy(t_3c_4)
1727 CALL dbt_destroy(t_3c_5)
1728 CALL dbt_destroy(t_3c_6)
1729 CALL dbt_destroy(t_3c_7)
1730 CALL dbt_destroy(t_3c_8)
1731 CALL dbt_destroy(t_3c_sparse)
1732 CALL dbt_destroy(t_3c_help_1)
1733 CALL dbt_destroy(t_3c_help_2)
1734 CALL dbt_destroy(t_3c_ints)
1735 CALL dbt_destroy(t_3c_work)
1736 CALL dbt_destroy(t_r_occ)
1737 CALL dbt_destroy(t_r_virt)
1738 CALL dbt_destroy(t_dm_occ)
1739 CALL dbt_destroy(t_dm_virt)
1740 CALL dbt_destroy(t_kbkt)
1741 CALL dbt_destroy(t_m_occ)
1742 CALL dbt_destroy(t_m_virt)
1752 CALL dbt_destroy(t_2c_ri)
1753 CALL dbt_destroy(t_2c_ri_2)
1754 CALL dbt_destroy(t_2c_ao)
1758 CALL timestop(handle)
1780 SUBROUTINE perform_2c_ops(force, t_KBKT, force_data, fac, t_B, t_P, t_2c_RI, t_2c_RI_2, use_virial, &
1781 atom_of_kind, kind_of, eps_filter, dbcsr_nflop, unit_nr_dbcsr)
1784 TYPE(dbt_type),
INTENT(INOUT) :: t_kbkt
1786 REAL(
dp),
INTENT(IN) ::
fac
1787 TYPE(dbt_type),
INTENT(INOUT) :: t_b, t_p, t_2c_ri, t_2c_ri_2
1788 LOGICAL,
INTENT(IN) :: use_virial
1789 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind, kind_of
1790 REAL(
dp),
INTENT(IN) :: eps_filter
1791 INTEGER(int_8),
INTENT(INOUT) :: dbcsr_nflop
1792 INTEGER,
INTENT(IN) :: unit_nr_dbcsr
1794 CHARACTER(LEN=*),
PARAMETER :: routinen =
'perform_2c_ops'
1797 INTEGER(int_8) :: flop
1799 TYPE(dbt_type) :: t_2c_tmp, t_2c_virial
1801 CALL timeset(routinen, handle)
1803 IF (use_virial)
CALL dbt_create(force_data%RI_virial_pot, t_2c_virial)
1806 CALL dbt_contract(1.0_dp, force_data%t_2c_K, t_b, 0.0_dp, t_2c_ri, &
1807 contract_1=[2], notcontract_1=[1], &
1808 contract_2=[1], notcontract_2=[2], &
1809 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1810 flop=flop, unit_nr=unit_nr_dbcsr)
1811 dbcsr_nflop = dbcsr_nflop + flop
1813 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_kbkt, &
1814 contract_1=[2], notcontract_1=[1], &
1815 contract_2=[2], notcontract_2=[1], &
1816 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1817 flop=flop, unit_nr=unit_nr_dbcsr)
1818 dbcsr_nflop = dbcsr_nflop + flop
1820 CALL dbt_contract(2.0_dp, t_p, t_2c_ri, 0.0_dp, t_2c_ri_2, &
1821 contract_1=[2], notcontract_1=[1], &
1822 contract_2=[1], notcontract_2=[2], &
1823 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1824 flop=flop, unit_nr=unit_nr_dbcsr)
1825 dbcsr_nflop = dbcsr_nflop + flop
1826 CALL dbt_clear(t_2c_ri)
1830 CALL dbt_contract(1.0_dp, force_data%t_2c_inv_metric, t_2c_ri_2, 0.0_dp, t_2c_ri, &
1831 contract_1=[2], notcontract_1=[1], &
1832 contract_2=[1], notcontract_2=[2], &
1833 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1834 flop=flop, unit_nr=unit_nr_dbcsr)
1835 dbcsr_nflop = dbcsr_nflop + flop
1837 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_K, 0.0_dp, t_2c_ri_2, &
1838 contract_1=[2], notcontract_1=[1], &
1839 contract_2=[2], notcontract_2=[1], &
1840 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1841 flop=flop, unit_nr=unit_nr_dbcsr)
1842 dbcsr_nflop = dbcsr_nflop + flop
1846 CALL get_2c_der_force(force, t_2c_ri_2, force_data%t_2c_der_metric, atom_of_kind, &
1847 kind_of, force_data%idx_to_at_RI, pref, do_mp2=.true.)
1848 IF (use_virial)
THEN
1849 CALL dbt_copy(t_2c_ri_2, t_2c_virial)
1850 CALL dbt_scale(t_2c_virial, pref)
1851 CALL dbt_copy_tensor_to_matrix(t_2c_virial, force_data%RI_virial_met, summation=.true.)
1852 CALL dbt_clear(t_2c_virial)
1857 CALL dbt_contract(1.0_dp, t_2c_ri, force_data%t_2c_pot_msqrt, 0.0_dp, t_2c_ri_2, &
1858 contract_1=[2], notcontract_1=[1], &
1859 contract_2=[1], notcontract_2=[2], &
1860 map_1=[1], map_2=[2], filter_eps=eps_filter, &
1861 flop=flop, unit_nr=unit_nr_dbcsr)
1862 dbcsr_nflop = dbcsr_nflop + flop
1866 IF (force_data%do_periodic)
THEN
1867 CALL dbt_scale(t_2c_ri_2, pref)
1868 CALL dbt_create(force_data%G_PQ, t_2c_tmp)
1869 CALL dbt_copy(t_2c_ri_2, t_2c_tmp, move_data=.true.)
1870 CALL dbt_copy_tensor_to_matrix(t_2c_tmp, force_data%G_PQ, summation=.true.)
1871 CALL dbt_destroy(t_2c_tmp)
1873 CALL get_2c_der_force(force, t_2c_ri_2, force_data%t_2c_der_pot, atom_of_kind, &
1874 kind_of, force_data%idx_to_at_RI, pref, do_mp2=.true.)
1876 IF (use_virial)
THEN
1877 CALL dbt_copy(t_2c_ri_2, t_2c_virial)
1878 CALL dbt_scale(t_2c_virial, pref)
1879 CALL dbt_copy_tensor_to_matrix(t_2c_virial, force_data%RI_virial_pot, summation=.true.)
1880 CALL dbt_clear(t_2c_virial)
1884 CALL dbt_clear(t_2c_ri)
1885 CALL dbt_clear(t_2c_ri_2)
1887 IF (use_virial)
CALL dbt_destroy(t_2c_virial)
1889 CALL timestop(handle)
1891 END SUBROUTINE perform_2c_ops
1939 SUBROUTINE perform_3c_ops(force, t_R_occ, t_R_virt, force_data, fac, cut_memory, n_mem_RI, &
1940 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, &
1941 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, &
1942 t_3c_ints, t_3c_work, starts_array_mc, ends_array_mc, batch_start_RI, &
1943 batch_end_RI, t_3c_O_compressed, t_3c_O_ind, use_virial, &
1944 atom_of_kind, kind_of, eps_filter, occ_ddint, nze_ddint, dbcsr_nflop, &
1945 unit_nr_dbcsr, mp2_env)
1948 TYPE(dbt_type),
INTENT(INOUT) :: t_r_occ, t_r_virt
1950 REAL(
dp),
INTENT(IN) ::
fac
1951 INTEGER,
INTENT(IN) :: cut_memory, n_mem_ri
1952 TYPE(dbt_type),
INTENT(INOUT) :: t_kbkt, t_dm_occ, t_dm_virt, t_3c_o, t_3c_m, t_m_occ, &
1953 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, &
1954 t_3c_help_1, t_3c_help_2, t_3c_ints, t_3c_work
1955 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
1956 batch_start_ri, batch_end_ri
1959 LOGICAL,
INTENT(IN) :: use_virial
1960 INTEGER,
DIMENSION(:),
INTENT(IN) :: atom_of_kind, kind_of
1961 REAL(
dp),
INTENT(IN) :: eps_filter
1962 REAL(
dp),
INTENT(INOUT) :: occ_ddint
1963 INTEGER(int_8),
INTENT(INOUT) :: nze_ddint, dbcsr_nflop
1964 INTEGER,
INTENT(IN) :: unit_nr_dbcsr
1967 CHARACTER(LEN=*),
PARAMETER :: routinen =
'perform_3c_ops'
1969 INTEGER :: dummy_int, handle, handle2, i_mem, &
1971 INTEGER(int_8) :: flop, nze
1972 INTEGER,
DIMENSION(2, 1) :: ibounds, jbounds, kbounds
1973 INTEGER,
DIMENSION(2, 2) :: bounds_2c
1974 INTEGER,
DIMENSION(2, 3) :: bounds_cpy
1975 INTEGER,
DIMENSION(3) :: bounds_3c
1976 REAL(
dp) :: memory, occ, pref
1977 TYPE(
block_ind_type),
ALLOCATABLE,
DIMENSION(:, :) :: blk_indices
1979 DIMENSION(:, :) :: store_3c
1981 CALL timeset(routinen, handle)
1983 CALL dbt_get_info(t_3c_m, nfull_total=bounds_3c)
1986 ALLOCATE (store_3c(n_mem_ri, cut_memory))
1987 ALLOCATE (blk_indices(n_mem_ri, cut_memory))
1989 CALL timeset(routinen//
"_pre_3c", handle2)
1991 CALL dbt_copy(t_3c_o, t_3c_0)
1992 DO i_mem = 1, cut_memory
1993 CALL decompress_tensor(t_3c_o, t_3c_o_ind(i_mem)%ind, t_3c_o_compressed(i_mem), &
1994 mp2_env%ri_rpa_im_time%eps_compress)
1995 CALL dbt_copy(t_3c_o, t_3c_ints)
1996 CALL dbt_copy(t_3c_o, t_3c_0, move_data=.true., summation=.true.)
1998 DO k_mem = 1, n_mem_ri
1999 kbounds(:, 1) = [batch_start_ri(k_mem), batch_end_ri(k_mem)]
2004 CALL dbt_batched_contract_init(t_kbkt)
2005 CALL dbt_contract(1.0_dp, t_kbkt, t_3c_ints, 0.0_dp, t_3c_work, &
2006 contract_1=[2], notcontract_1=[1], &
2007 contract_2=[1], notcontract_2=[2, 3], &
2008 map_1=[1], map_2=[2, 3], filter_eps=eps_filter, &
2009 bounds_2=kbounds, flop=flop, unit_nr=unit_nr_dbcsr)
2010 CALL dbt_batched_contract_finalize(t_kbkt)
2011 dbcsr_nflop = dbcsr_nflop + flop
2013 CALL dbt_copy(t_3c_work, t_3c_m, move_data=.true.)
2014 CALL compress_tensor(t_3c_m, blk_indices(k_mem, i_mem)%ind, store_3c(k_mem, i_mem), &
2015 mp2_env%ri_rpa_im_time%eps_compress, memory)
2018 CALL dbt_clear(t_3c_m)
2019 CALL dbt_copy(t_3c_m, t_3c_ints)
2020 CALL timestop(handle2)
2022 CALL dbt_batched_contract_init(t_r_occ)
2023 CALL dbt_batched_contract_init(t_r_virt)
2024 DO i_mem = 1, cut_memory
2025 ibounds(:, 1) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2028 CALL timeset(routinen//
"_3c_M", handle2)
2029 CALL dbt_batched_contract_init(t_dm_occ)
2030 CALL dbt_contract(1.0_dp, t_3c_0, t_dm_occ, 0.0_dp, t_3c_1, &
2031 contract_1=[3], notcontract_1=[1, 2], &
2032 contract_2=[1], notcontract_2=[2], &
2033 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2034 bounds_3=ibounds, flop=flop, unit_nr=unit_nr_dbcsr)
2035 dbcsr_nflop = dbcsr_nflop + flop
2036 CALL dbt_batched_contract_finalize(t_dm_occ)
2037 CALL dbt_copy(t_3c_1, t_m_occ, order=[1, 3, 2], move_data=.true.)
2039 CALL dbt_batched_contract_init(t_dm_virt)
2040 CALL dbt_contract(1.0_dp, t_3c_0, t_dm_virt, 0.0_dp, t_3c_1, &
2041 contract_1=[3], notcontract_1=[1, 2], &
2042 contract_2=[1], notcontract_2=[2], &
2043 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2044 bounds_3=ibounds, flop=flop, unit_nr=unit_nr_dbcsr)
2045 dbcsr_nflop = dbcsr_nflop + flop
2046 CALL dbt_batched_contract_finalize(t_dm_virt)
2047 CALL dbt_copy(t_3c_1, t_m_virt, order=[1, 3, 2], move_data=.true.)
2048 CALL timestop(handle2)
2051 CALL timeset(routinen//
"_3c_R", handle2)
2052 DO k_mem = 1, n_mem_ri
2053 CALL decompress_tensor(t_3c_m, blk_indices(k_mem, i_mem)%ind, store_3c(k_mem, i_mem), &
2054 mp2_env%ri_rpa_im_time%eps_compress)
2055 CALL dbt_copy(t_3c_m, t_3c_3, move_data=.true.)
2057 CALL dbt_contract(1.0_dp, t_m_occ, t_3c_3, 1.0_dp, t_r_occ, &
2058 contract_1=[1, 2], notcontract_1=[3], &
2059 contract_2=[1, 2], notcontract_2=[3], &
2060 map_1=[1], map_2=[2], filter_eps=eps_filter, &
2061 flop=flop, unit_nr=unit_nr_dbcsr)
2062 dbcsr_nflop = dbcsr_nflop + flop
2064 CALL dbt_contract(1.0_dp, t_m_virt, t_3c_3, 1.0_dp, t_r_virt, &
2065 contract_1=[1, 2], notcontract_1=[3], &
2066 contract_2=[1, 2], notcontract_2=[3], &
2067 map_1=[1], map_2=[2], filter_eps=eps_filter, &
2068 flop=flop, unit_nr=unit_nr_dbcsr)
2069 dbcsr_nflop = dbcsr_nflop + flop
2071 CALL dbt_copy(t_3c_m, t_3c_3)
2072 CALL dbt_copy(t_3c_m, t_m_virt)
2073 CALL timestop(handle2)
2075 CALL dbt_copy(t_m_occ, t_3c_4, move_data=.true.)
2077 IF (cut_memory > 0)
CALL dbt_batched_contract_init(t_kbkt)
2078 DO j_mem = 1, cut_memory
2079 jbounds(:, 1) = [starts_array_mc(j_mem), ends_array_mc(j_mem)]
2081 bounds_cpy(:, 1) = [1, bounds_3c(1)]
2082 bounds_cpy(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2083 bounds_cpy(:, 3) = [starts_array_mc(j_mem), ends_array_mc(j_mem)]
2084 CALL dbt_copy(t_3c_sparse, t_3c_7, bounds=bounds_cpy)
2086 CALL dbt_batched_contract_init(t_dm_virt)
2087 DO k_mem = 1, n_mem_ri
2088 bounds_2c(:, 1) = [batch_start_ri(k_mem), batch_end_ri(k_mem)]
2089 bounds_2c(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
2091 CALL timeset(routinen//
"_3c_dm", handle2)
2095 CALL dbt_contract(2.0_dp, t_3c_4, t_dm_virt, 0.0_dp, t_3c_5, &
2096 contract_1=[3], notcontract_1=[1, 2], &
2097 contract_2=[1], notcontract_2=[2], &
2098 map_1=[1, 2], map_2=[3], filter_eps=eps_filter, &
2099 bounds_2=bounds_2c, bounds_3=jbounds, flop=flop, unit_nr=unit_nr_dbcsr)
2100 dbcsr_nflop = dbcsr_nflop + flop
2103 nze_ddint = nze_ddint + nze
2104 occ_ddint = occ_ddint + occ
2108 CALL dbt_clear(t_3c_5)
2112 CALL dbt_copy(t_3c_5, t_3c_6, move_data=.true.)
2113 CALL timestop(handle2)
2116 CALL timeset(routinen//
"_3c_KBK", handle2)
2117 CALL dbt_contract(1.0_dp, t_kbkt, t_3c_6, 0.0_dp, t_3c_7, &
2118 contract_1=[2], notcontract_1=[1], &
2119 contract_2=[1], notcontract_2=[2, 3], &
2120 map_1=[1], map_2=[2, 3], &
2121 retain_sparsity=.true., flop=flop, unit_nr=unit_nr_dbcsr)
2122 dbcsr_nflop = dbcsr_nflop + flop
2123 CALL timestop(handle2)
2124 CALL dbt_copy(t_3c_7, t_3c_8, summation=.true.)
2127 CALL dbt_batched_contract_finalize(t_dm_virt)
2129 IF (cut_memory > 0)
CALL dbt_batched_contract_finalize(t_kbkt)
2131 CALL dbt_copy(t_3c_8, t_3c_help_1, move_data=.true.)
2134 DO k_mem = 1, cut_memory
2136 CALL dbt_clear(force_data%t_3c_der_RI(i_xyz))
2137 CALL decompress_tensor(force_data%t_3c_der_RI(i_xyz), force_data%t_3c_der_RI_ind(k_mem, i_xyz)%ind, &
2138 force_data%t_3c_der_RI_comp(k_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
2141 force_data%idx_to_at_RI, pref, do_mp2=.true., deriv_dim=1)
2144 IF (use_virial)
THEN
2145 CALL dbt_copy(t_3c_help_1, t_3c_help_2)
2146 CALL dbt_scale(t_3c_help_2, pref)
2147 CALL dbt_copy(t_3c_help_2, force_data%t_3c_virial_split, summation=.true., move_data=.true.)
2150 CALL dbt_copy(t_3c_help_1, t_3c_help_2)
2151 CALL dbt_copy(t_3c_help_1, t_3c_help_2, order=[1, 3, 2], move_data=.true., summation=.true.)
2152 DO k_mem = 1, cut_memory
2154 CALL dbt_clear(force_data%t_3c_der_AO(i_xyz))
2155 CALL decompress_tensor(force_data%t_3c_der_AO(i_xyz), force_data%t_3c_der_AO_ind(k_mem, i_xyz)%ind, &
2156 force_data%t_3c_der_AO_comp(k_mem, i_xyz), mp2_env%ri_rpa_im_time%eps_compress)
2159 force_data%idx_to_at_AO, pref, do_mp2=.true., deriv_dim=3)
2162 CALL dbt_clear(t_3c_help_2)
2164 CALL dbt_batched_contract_finalize(t_r_occ)
2165 CALL dbt_batched_contract_finalize(t_r_virt)
2167 DO k_mem = 1, n_mem_ri
2168 DO i_mem = 1, cut_memory
2172 DEALLOCATE (store_3c, blk_indices)
2174 CALL timestop(handle)
2176 END SUBROUTINE perform_3c_ops
2189 INTEGER,
INTENT(IN) :: unit_nr
2192 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_post_loop_forces'
2194 INTEGER :: handle, ispin, nao, nao_aux, nocc, nspins
2199 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: cpmos, mo_occ
2201 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: dbcsr_p_work, matrix_p_mp2, &
2202 matrix_p_mp2_admm, matrix_s, &
2203 matrix_s_aux, work_admm, yp_admm
2210 NULLIFY (linres_control, p_env, dft_control, matrix_s, mos, mo_coeff, fm_struct, lr_section, &
2211 dbcsr_p_work, yp_admm, matrix_p_mp2, admm_env, work_admm, matrix_s_aux, matrix_p_mp2_admm)
2213 CALL timeset(routinen, handle)
2215 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, mos=mos)
2216 nspins = dft_control%nspins
2223 ALLOCATE (linres_control)
2226 CALL section_vals_val_get(lr_section,
"PRECONDITIONER", i_val=linres_control%preconditioner_type)
2229 linres_control%do_kernel = .true.
2230 linres_control%lr_triplet = .false.
2231 linres_control%converged = .false.
2232 linres_control%eps_filter = qs_env%mp2_env%ri_rpa_im_time%eps_filter
2234 CALL set_qs_env(qs_env, linres_control=linres_control)
2236 IF (unit_nr > 0)
THEN
2238 WRITE (unit_nr,
'(T3,A)')
'MP2_CPHF| Iterative solution of Z-Vector equations'
2239 WRITE (unit_nr,
'(T3,A,T45,ES8.1)')
'MP2_CPHF| Convergence threshold:', linres_control%eps
2240 WRITE (unit_nr,
'(T3,A,T45,I8)')
'MP2_CPHF| Maximum number of iterations: ', linres_control%max_iter
2244 CALL p_env_create(p_env, qs_env, orthogonal_orbitals=.true., linres_control=linres_control)
2251 DO ispin = 1, nspins
2252 ALLOCATE (p_env%p1(ispin)%matrix, p_env%w1(ispin)%matrix, dbcsr_p_work(ispin)%matrix)
2253 CALL dbcsr_create(matrix=p_env%p1(ispin)%matrix, template=matrix_s(1)%matrix)
2254 CALL dbcsr_create(matrix=p_env%w1(ispin)%matrix, template=matrix_s(1)%matrix)
2255 CALL dbcsr_create(matrix=dbcsr_p_work(ispin)%matrix, template=matrix_s(1)%matrix)
2256 CALL dbcsr_copy(p_env%p1(ispin)%matrix, matrix_s(1)%matrix)
2257 CALL dbcsr_copy(p_env%w1(ispin)%matrix, matrix_s(1)%matrix)
2258 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, matrix_s(1)%matrix)
2259 CALL dbcsr_set(p_env%p1(ispin)%matrix, 0.0_dp)
2260 CALL dbcsr_set(p_env%w1(ispin)%matrix, 0.0_dp)
2261 CALL dbcsr_set(dbcsr_p_work(ispin)%matrix, 0.0_dp)
2264 IF (dft_control%do_admm)
THEN
2265 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux)
2268 DO ispin = 1, nspins
2269 ALLOCATE (p_env%p1_admm(ispin)%matrix, work_admm(ispin)%matrix)
2270 CALL dbcsr_create(p_env%p1_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2271 CALL dbcsr_copy(p_env%p1_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2272 CALL dbcsr_set(p_env%p1_admm(ispin)%matrix, 0.0_dp)
2273 CALL dbcsr_create(work_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2274 CALL dbcsr_copy(work_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2275 CALL dbcsr_set(work_admm(ispin)%matrix, 0.0_dp)
2280 CALL prepare_for_response(force_data, qs_env)
2281 ALLOCATE (cpmos(nspins), mo_occ(nspins))
2282 DO ispin = 1, nspins
2283 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, homo=nocc)
2286 template_fmstruct=mo_coeff%matrix_struct)
2305 ext_hfx_section=hfx_section, &
2306 x_data=qs_env%mp2_env%ri_rpa%x_data, &
2307 recalc_integrals=.false., &
2308 do_admm=qs_env%mp2_env%ri_rpa%do_admm, &
2310 reuse_hfx=qs_env%mp2_env%ri_rpa%reuse_hfx)
2314 IF (nspins == 1) focc = 4.0_dp
2315 DO ispin = 1, nspins
2316 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
2318 cpmos(ispin), nocc, &
2319 alpha=focc, beta=0.0_dp)
2326 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
2328 DO ispin = 1, nspins
2329 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, p_env%p1(ispin)%matrix)
2330 CALL dbcsr_add(dbcsr_p_work(ispin)%matrix, force_data%sum_YP_tau(ispin)%matrix, 1.0_dp, 1.0_dp)
2332 CALL set_ks_env(qs_env%ks_env, matrix_p_mp2=dbcsr_p_work)
2334 IF (dft_control%do_admm)
THEN
2336 CALL get_qs_env(qs_env, matrix_p_mp2_admm=matrix_p_mp2_admm, admm_env=admm_env)
2337 nao = admm_env%nao_orb
2338 nao_aux = admm_env%nao_aux_fit
2340 DO ispin = 1, nspins
2343 CALL copy_dbcsr_to_fm(force_data%sum_YP_tau(ispin)%matrix, admm_env%work_orb_orb)
2344 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, admm_env%work_orb_orb, &
2345 0.0_dp, admm_env%work_aux_orb)
2346 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
2347 0.0_dp, admm_env%work_aux_aux)
2348 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_admm(ispin)%matrix, keep_sparsity=.true.)
2351 ALLOCATE (yp_admm(ispin)%matrix)
2352 CALL dbcsr_create(yp_admm(ispin)%matrix, template=work_admm(ispin)%matrix)
2353 CALL dbcsr_copy(yp_admm(ispin)%matrix, work_admm(ispin)%matrix)
2355 CALL dbcsr_add(work_admm(ispin)%matrix, p_env%p1_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
2358 CALL set_ks_env(qs_env%ks_env, matrix_p_mp2_admm=work_admm)
2362 CALL update_im_time_forces(p_env, force_data%sum_O_tau, force_data%sum_YP_tau, yp_admm, qs_env)
2372 CALL timestop(handle)
2382 SUBROUTINE prepare_for_response(force_data, qs_env)
2387 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prepare_for_response'
2389 INTEGER :: handle, ispin, nao, nao_aux, nspins
2390 LOGICAL :: do_hfx, do_tau, do_tau_admm
2391 REAL(
dp) :: ehartree
2393 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: dbcsr_p_work, ker_tau_admm, matrix_s, &
2394 matrix_s_aux, work_admm
2403 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rhoz_r, tauz_r, v_xc, v_xc_tau
2404 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rhoz
2405 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho0_atom_set, rho1_atom_set
2409 NULLIFY (pw_env, rhoz_r, rhoz_g, tauz_r, v_xc, v_xc_tau, &
2410 poisson_env, auxbas_pw_pool, dft_control, admm_env, xc_section, rho, rho_aux_fit, &
2411 task_list_aux_fit, ker_tau_admm, work_admm, dbcsr_p_work, matrix_s, hfx_section)
2412 NULLIFY (rho0_atom_set, rho1_atom_set)
2414 CALL timeset(routinen, handle)
2416 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, rho=rho, matrix_s=matrix_s)
2417 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
2418 nspins = dft_control%nspins
2421 DO ispin = 1, nspins
2422 ALLOCATE (dbcsr_p_work(ispin)%matrix)
2423 CALL dbcsr_create(matrix=dbcsr_p_work(ispin)%matrix, template=matrix_s(1)%matrix)
2424 CALL dbcsr_copy(dbcsr_p_work(ispin)%matrix, matrix_s(1)%matrix)
2425 CALL dbcsr_set(dbcsr_p_work(ispin)%matrix, 0.0_dp)
2429 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
2430 DO ispin = 1, nspins
2431 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
2432 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
2434 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
2435 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
2436 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
2439 DO ispin = 1, nspins
2440 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=force_data%sum_YP_tau(ispin)%matrix, &
2441 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin))
2442 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
2448 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
2449 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
2455 ALLOCATE (tauz_r(nspins))
2456 CALL auxbas_pw_pool%create_pw(tauz_g)
2457 DO ispin = 1, nspins
2458 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
2460 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=force_data%sum_YP_tau(ispin)%matrix, &
2461 rho=tauz_r(ispin), rho_gspace=tauz_g, compute_tau=.true.)
2463 CALL auxbas_pw_pool%give_back_pw(tauz_g)
2467 IF (dft_control%do_admm)
THEN
2469 xc_section => admm_env%xc_section_primary
2477 IF (
ASSOCIATED(rhoz_r))
THEN
2478 CALL qs_rho_set(rhoz, rho_r=rhoz_r, rho_r_valid=.true.)
2480 IF (
ASSOCIATED(rhoz_g))
THEN
2481 CALL qs_rho_set(rhoz, rho_g=rhoz_g, rho_g_valid=.true.)
2483 IF (
ASSOCIATED(tauz_r))
THEN
2484 CALL qs_rho_set(rhoz, tau_r=tauz_r, tau_r_valid=.true.)
2487 CALL qs_fxc_create(qs_env, rho, rhoz, rho0_atom_set, xc_section, .false., &
2488 v_xc, v_xc_tau, rho1_atom_set, &
2489 dispersion_env=qs_env%dispersion_env)
2493 DO ispin = 1, nspins
2494 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2495 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
2496 CALL integrate_v_rspace(qs_env=qs_env, &
2497 v_rspace=v_xc(ispin), &
2498 hmat=dbcsr_p_work(ispin), &
2499 calculate_forces=.false.)
2501 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2503 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
2504 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
2505 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
2509 DO ispin = 1, nspins
2510 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2511 CALL integrate_v_rspace(qs_env=qs_env, &
2512 v_rspace=v_xc_tau(ispin), &
2513 hmat=dbcsr_p_work(ispin), &
2514 compute_tau=.true., &
2515 calculate_forces=.false.)
2516 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2518 DEALLOCATE (v_xc_tau)
2522 IF (dft_control%do_admm)
THEN
2524 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux, &
2525 task_list_aux_fit=task_list_aux_fit, rho_aux_fit=rho_aux_fit)
2527 CALL qs_rho_get(rho_aux_fit, tau_r_valid=do_tau_admm)
2531 DO ispin = 1, nspins
2532 ALLOCATE (work_admm(ispin)%matrix, ker_tau_admm(ispin)%matrix)
2533 CALL dbcsr_create(work_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2534 CALL dbcsr_copy(work_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2535 CALL dbcsr_set(work_admm(ispin)%matrix, 0.0_dp)
2536 CALL dbcsr_create(ker_tau_admm(ispin)%matrix, template=matrix_s_aux(1)%matrix)
2537 CALL dbcsr_copy(ker_tau_admm(ispin)%matrix, matrix_s_aux(1)%matrix)
2538 CALL dbcsr_set(ker_tau_admm(ispin)%matrix, 0.0_dp)
2542 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2543 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2544 cpassert(
ASSOCIATED(admm_env%work_aux_aux))
2545 nao = admm_env%nao_orb
2546 nao_aux = admm_env%nao_aux_fit
2547 DO ispin = 1, nspins
2548 CALL copy_dbcsr_to_fm(force_data%sum_YP_tau(ispin)%matrix, admm_env%work_orb_orb)
2549 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, admm_env%work_orb_orb, &
2550 0.0_dp, admm_env%work_aux_orb)
2551 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
2552 0.0_dp, admm_env%work_aux_aux)
2553 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, ker_tau_admm(ispin)%matrix, keep_sparsity=.true.)
2557 DO ispin = 1, nspins
2561 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
2562 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
2565 IF (do_tau_admm)
THEN
2568 CALL auxbas_pw_pool%create_pw(tauz_g)
2569 DO ispin = 1, nspins
2572 rho=tauz_r(ispin), rho_gspace=tauz_g, &
2573 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit, &
2576 CALL auxbas_pw_pool%give_back_pw(tauz_g)
2580 xc_section => admm_env%xc_section_aux
2582 CALL qs_rho_create(rhoz)
2583 IF (
ASSOCIATED(rhoz_r))
THEN
2584 CALL qs_rho_set(rhoz, rho_r=rhoz_r, rho_r_valid=.true.)
2586 IF (
ASSOCIATED(rhoz_g))
THEN
2587 CALL qs_rho_set(rhoz, rho_g=rhoz_g, rho_g_valid=.true.)
2589 IF (
ASSOCIATED(tauz_r))
THEN
2590 CALL qs_rho_set(rhoz, tau_r=tauz_r, tau_r_valid=.true.)
2593 CALL qs_fxc_create(qs_env, rho_aux_fit, rhoz, rho0_atom_set, xc_section, .false., &
2594 v_xc, v_xc_tau, rho1_atom_set)
2598 DO ispin = 1, nspins
2599 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2600 CALL integrate_v_rspace(qs_env=qs_env, &
2601 v_rspace=v_xc(ispin), &
2602 hmat=work_admm(ispin), &
2603 calculate_forces=.false., &
2604 basis_type=
"AUX_FIT", &
2605 task_list_external=task_list_aux_fit)
2606 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2610 IF (do_tau_admm)
THEN
2611 DO ispin = 1, nspins
2612 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2613 CALL integrate_v_rspace(qs_env=qs_env, &
2614 v_rspace=v_xc_tau(ispin), &
2615 hmat=work_admm(ispin), &
2616 calculate_forces=.false., &
2617 basis_type=
"AUX_FIT", &
2618 task_list_external=task_list_aux_fit, &
2620 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2622 DEALLOCATE (v_xc_tau)
2627 DO ispin = 1, nspins
2628 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
2629 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
2631 DEALLOCATE (rhoz_r, rhoz_g)
2634 DO ispin = 1, nspins
2635 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
2641 hfx_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC%HF")
2642 CALL section_vals_get(hfx_section, explicit=do_hfx)
2644 IF (dft_control%do_admm)
THEN
2645 CALL tddft_hfx_matrix(work_admm, ker_tau_admm, qs_env, .false., .false.)
2648 CALL dbcsr_create(dbcsr_work, template=dbcsr_p_work(1)%matrix)
2649 CALL dbcsr_copy(dbcsr_work, dbcsr_p_work(1)%matrix)
2650 CALL dbcsr_set(dbcsr_work, 0.0_dp)
2651 DO ispin = 1, nspins
2652 CALL copy_dbcsr_to_fm(work_admm(ispin)%matrix, admm_env%work_aux_aux)
2653 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao_aux, 1.0_dp, admm_env%work_aux_aux, admm_env%A, &
2654 0.0_dp, admm_env%work_aux_orb)
2655 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, admm_env%work_aux_orb, &
2656 0.0_dp, admm_env%work_orb_orb)
2657 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbcsr_work, keep_sparsity=.true.)
2658 CALL dbcsr_add(dbcsr_p_work(ispin)%matrix, dbcsr_work, 1.0_dp, 1.0_dp)
2660 CALL dbcsr_release(dbcsr_work)
2661 CALL dbcsr_deallocate_matrix_set(ker_tau_admm)
2663 CALL tddft_hfx_matrix(dbcsr_p_work, force_data%sum_YP_tau, qs_env, .false., .false.)
2667 DO ispin = 1, nspins
2668 CALL dbcsr_add(force_data%sum_O_tau(ispin)%matrix, dbcsr_p_work(ispin)%matrix, 1.0_dp, 1.0_dp)
2671 CALL dbcsr_deallocate_matrix_set(dbcsr_p_work)
2672 CALL dbcsr_deallocate_matrix_set(work_admm)
2674 CALL timestop(handle)
2676 END SUBROUTINE prepare_for_response
2687 SUBROUTINE get_2c_gpw_forces(G_PQ, force, h_stress, use_virial, mp2_env, qs_env)
2689 TYPE(dbcsr_type),
INTENT(INOUT) :: g_pq
2690 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
2691 REAL(dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
2692 LOGICAL,
INTENT(IN) :: use_virial
2693 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
2694 TYPE(qs_environment_type),
POINTER :: qs_env
2696 CHARACTER(len=*),
PARAMETER :: routinen =
'get_2c_gpw_forces'
2698 INTEGER :: atom_a, color, handle, i, i_ri, i_xyz, iatom, igrid_level, ikind, ipgf, iset, j, &
2699 j_ri, jatom, lb_ri, n_ri, natom, ncoa, ncoms, nkind, nproc, nseta, o1, offset, pdims(2), &
2701 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, iproc_map, kind_of, &
2703 INTEGER,
DIMENSION(:),
POINTER :: col_dist, la_max, la_min, npgfa, nsgfa, &
2705 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, pgrid
2706 LOGICAL :: found, one_proc_group
2707 REAL(dp) :: cutoff_old, radius, relative_cutoff_old
2708 REAL(dp),
ALLOCATABLE,
DIMENSION(:) :: e_cutoff_old, wf_vector
2709 REAL(dp),
DIMENSION(3) :: force_a, force_b, ra
2710 REAL(dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
2711 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: h_tmp, i_ab, pab, pblock, sphi_a, zeta
2712 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
2713 TYPE(cell_type),
POINTER :: cell
2714 TYPE(dbcsr_distribution_type) :: dbcsr_dist
2715 TYPE(dbcsr_type) :: tmp_g_pq
2716 TYPE(dft_control_type),
POINTER :: dft_control
2717 TYPE(gto_basis_set_p_type),
ALLOCATABLE, &
2718 DIMENSION(:),
TARGET :: basis_set_ri_aux
2719 TYPE(gto_basis_set_type),
POINTER :: basis_set_a
2720 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
2721 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_ext
2722 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2724 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
2725 TYPE(pw_c1d_gs_type) :: dvg(3), pot_g, rho_g, rho_g_copy
2726 TYPE(pw_env_type),
POINTER :: pw_env_ext
2727 TYPE(pw_poisson_type),
POINTER :: poisson_env
2728 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
2729 TYPE(pw_r3d_rs_type) :: psi_l, rho_r
2730 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2731 TYPE(realspace_grid_type),
DIMENSION(:),
POINTER :: rs_v
2732 TYPE(task_list_type),
POINTER :: task_list_ext
2734 NULLIFY (sab_orb, task_list_ext, particle_set, qs_kind_set, dft_control, pw_env_ext, auxbas_pw_pool, &
2735 poisson_env, atomic_kind_set, para_env, cell, rs_v, mos, basis_set_a)
2737 CALL timeset(routinen, handle)
2739 CALL get_qs_env(qs_env, dft_control=dft_control, para_env=para_env, sab_orb=sab_orb, &
2740 natom=natom, nkind=nkind, qs_kind_set=qs_kind_set, particle_set=particle_set, &
2741 mos=mos, cell=cell, atomic_kind_set=atomic_kind_set)
2749 IF (para_env%num_pe <= natom)
THEN
2751 pdims(2) = para_env%num_pe
2754 IF (
modulo(para_env%num_pe, i) == 0)
THEN
2755 pdims(1) = para_env%num_pe/i
2762 ALLOCATE (row_dist(natom), col_dist(natom))
2764 row_dist(iatom) =
modulo(iatom, pdims(1))
2767 col_dist(jatom) =
modulo(jatom, pdims(2))
2770 ALLOCATE (pgrid(0:pdims(1) - 1, 0:pdims(2) - 1))
2772 DO i = 0, pdims(1) - 1
2773 DO j = 0, pdims(2) - 1
2779 CALL dbcsr_distribution_new(dbcsr_dist, group=para_env%get_handle(), pgrid=pgrid, row_dist=row_dist, col_dist=col_dist)
2782 CALL dbcsr_create(tmp_g_pq, template=g_pq, matrix_type=dbcsr_type_no_symmetry, dist=dbcsr_dist)
2783 CALL dbcsr_complete_redistribute(g_pq, tmp_g_pq)
2785 ALLOCATE (basis_set_ri_aux(nkind), sizes_ri(natom))
2786 CALL basis_set_list_setup(basis_set_ri_aux,
"RI_AUX", qs_kind_set)
2787 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
2788 n_ri = sum(sizes_ri)
2790 one_proc_group = mp2_env%mp2_num_proc == 1
2791 ALLOCATE (para_env_ext)
2792 IF (one_proc_group)
THEN
2794 CALL para_env_ext%from_split(para_env, para_env%mepos)
2797 ncoms = min(pdims(2), para_env%num_pe/mp2_env%mp2_num_proc)
2798 DO i = 0, pdims(1) - 1
2799 DO j = 0, pdims(2) - 1
2800 IF (pgrid(i, j) == para_env%mepos) color =
modulo(j + 1, ncoms)
2803 CALL para_env_ext%from_split(para_env, color)
2807 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_ext, pw_env_ext, &
2808 auxbas_pw_pool, poisson_env, task_list_ext, rho_r, rho_g, pot_g, psi_l, sab_orb)
2810 IF (use_virial)
THEN
2811 CALL auxbas_pw_pool%create_pw(rho_g_copy)
2813 CALL auxbas_pw_pool%create_pw(dvg(i_xyz))
2817 ALLOCATE (wf_vector(n_ri))
2819 CALL get_atomic_kind_set(atomic_kind_set, kind_of=kind_of, atom_of_kind=atom_of_kind)
2821 ALLOCATE (iproc_map(natom))
2827 IF (one_proc_group)
THEN
2830 IF (pgrid(row_dist(iatom), col_dist(jatom)) == para_env%mepos) iproc_map(iatom) = 1
2832 IF (.NOT. any(iproc_map == 1)) cycle
2834 IF (.NOT.
modulo(col_dist(jatom) + 1, ncoms) == color) cycle
2837 lb_ri = sum(sizes_ri(1:jatom - 1))
2838 ub_ri = lb_ri + sizes_ri(jatom)
2839 DO j_ri = lb_ri + 1, ub_ri
2842 wf_vector(j_ri) = 1.0_dp
2844 CALL collocate_function(wf_vector, psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, &
2845 particle_set, pw_env_ext, dft_control%qs_control%eps_rho_rspace, &
2846 basis_type=
"RI_AUX")
2848 IF (use_virial)
THEN
2849 CALL calc_potential_gpw(rho_r, rho_g, poisson_env, pot_g, mp2_env%potential_parameter, dvg)
2854 IF (one_proc_group)
THEN
2855 IF (.NOT. iproc_map(iatom) == 1) cycle
2858 CALL dbcsr_get_block_p(tmp_g_pq, iatom, jatom, pblock, found)
2859 IF (.NOT. found) cycle
2861 i_ri = sum(sizes_ri(1:iatom - 1))
2862 wf_vector(i_ri + 1:i_ri + sizes_ri(iatom)) = pblock(:, j_ri - lb_ri)
2865 CALL pw_copy(rho_g, rho_g_copy)
2866 CALL collocate_function(wf_vector, psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, &
2867 particle_set, pw_env_ext, dft_control%qs_control%eps_rho_rspace, &
2868 basis_type=
"RI_AUX")
2870 CALL calc_potential_gpw(psi_l, rho_g, poisson_env, pot_g, mp2_env%potential_parameter, &
2872 CALL virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, &
2873 mp2_env%potential_parameter, para_env_ext)
2875 CALL calc_potential_gpw(rho_r, rho_g, poisson_env, pot_g, mp2_env%potential_parameter)
2879 CALL pw_env_get(pw_env_ext, rs_grids=rs_v)
2880 CALL potential_pw2rs(rs_v, rho_r, pw_env_ext)
2885 IF (one_proc_group)
THEN
2886 IF (.NOT. iproc_map(iatom) == 1) cycle
2891 IF (use_virial)
THEN
2892 my_virial_a = 0.0_dp
2893 my_virial_b = 0.0_dp
2896 ikind = kind_of(iatom)
2897 atom_a = atom_of_kind(iatom)
2899 basis_set_a => basis_set_ri_aux(ikind)%gto_basis_set
2900 first_sgfa => basis_set_a%first_sgf
2901 la_max => basis_set_a%lmax
2902 la_min => basis_set_a%lmin
2903 nseta = basis_set_a%nset
2904 nsgfa => basis_set_a%nsgf_set
2905 sphi_a => basis_set_a%sphi
2906 zeta => basis_set_a%zet
2907 npgfa => basis_set_a%npgf
2909 ra(:) = pbc(particle_set(iatom)%r, cell)
2911 CALL dbcsr_get_block_p(tmp_g_pq, iatom, jatom, pblock, found)
2912 IF (.NOT. found) cycle
2916 ncoa = npgfa(iset)*
ncoset(la_max(iset))
2917 sgfa = first_sgfa(1, iset)
2919 ALLOCATE (h_tmp(ncoa, 1)); h_tmp = 0.0_dp
2920 ALLOCATE (i_ab(nsgfa(iset), 1)); i_ab = 0.0_dp
2921 ALLOCATE (pab(ncoa, 1)); pab = 0.0_dp
2923 i_ab(1:nsgfa(iset), 1) = 2.0_dp*pblock(offset + 1:offset + nsgfa(iset), j_ri - lb_ri)
2924 CALL dgemm(
"N",
"N", ncoa, 1, nsgfa(iset), 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
2925 i_ab(1, 1), nsgfa(iset), 0.0_dp, pab(1, 1), ncoa)
2927 igrid_level = gaussian_gridlevel(pw_env_ext%gridlevel_info, minval(zeta(:, iset)))
2931 IF (map_gaussian_here(rs_v(igrid_level), cell%h_inv, ra, 0, 1, 0))
THEN
2932 DO ipgf = 1, npgfa(iset)
2933 o1 = (ipgf - 1)*
ncoset(la_max(iset))
2934 igrid_level = gaussian_gridlevel(pw_env_ext%gridlevel_info, zeta(ipgf, iset))
2936 radius = exp_radius_very_extended(la_min=la_min(iset), la_max=la_max(iset), &
2937 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
2938 zetp=zeta(ipgf, iset), &
2939 eps=dft_control%qs_control%eps_gvg_rspace, &
2940 prefactor=1.0_dp, cutoff=1.0_dp)
2942 CALL integrate_pgf_product( &
2943 la_max=la_max(iset), zeta=zeta(ipgf, iset), la_min=la_min(iset), &
2944 lb_max=0, zetb=0.0_dp, lb_min=0, &
2945 ra=ra, rab=[0.0_dp, 0.0_dp, 0.0_dp], &
2946 rsgrid=rs_v(igrid_level), &
2947 hab=h_tmp, pab=pab, &
2951 calculate_forces=.true., &
2952 force_a=force_a, force_b=force_b, &
2953 use_virial=use_virial, my_virial_a=my_virial_a, my_virial_b=my_virial_b)
2959 offset = offset + nsgfa(iset)
2960 DEALLOCATE (pab, h_tmp, i_ab)
2963 force(ikind)%mp2_non_sep(:, atom_a) = force(ikind)%mp2_non_sep(:, atom_a) + force_a + force_b
2964 IF (use_virial) h_stress = h_stress + my_virial_a + my_virial_b
2970 IF (use_virial)
THEN
2971 CALL auxbas_pw_pool%give_back_pw(rho_g_copy)
2973 CALL auxbas_pw_pool%give_back_pw(dvg(i_xyz))
2977 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_ext, pw_env_ext, &
2978 task_list_ext, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
2980 CALL dbcsr_release(tmp_g_pq)
2981 CALL dbcsr_distribution_release(dbcsr_dist)
2982 DEALLOCATE (col_dist, row_dist, pgrid)
2984 CALL mp_para_env_release(para_env_ext)
2986 CALL timestop(handle)
2988 END SUBROUTINE get_2c_gpw_forces
2997 SUBROUTINE get_2c_mme_forces(G_PQ, force, mp2_env, qs_env)
2999 TYPE(dbcsr_type),
INTENT(INOUT) :: g_pq
3000 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
3001 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
3002 TYPE(qs_environment_type),
POINTER :: qs_env
3004 CHARACTER(len=*),
PARAMETER :: routinen =
'get_2c_mme_forces'
3006 INTEGER :: atom_a, atom_b, g_count, handle, i_xyz, iatom, ikind, iset, jatom, jkind, jset, &
3007 natom, nkind, nseta, nsetb, offset_hab_a, offset_hab_b, r_count, sgfa, sgfb
3008 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
3009 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
3011 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
3013 REAL(dp) :: new_force, pref
3014 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :) :: hab
3015 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: hdab
3016 REAL(dp),
DIMENSION(:, :),
POINTER :: pblock
3017 REAL(kind=dp),
DIMENSION(3) :: ra, rb
3018 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: sphi_a, sphi_b, zeta, zetb
3019 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3020 TYPE(cell_type),
POINTER :: cell
3021 TYPE(dbcsr_iterator_type) :: iter
3022 TYPE(gto_basis_set_p_type),
ALLOCATABLE, &
3023 DIMENSION(:),
TARGET :: basis_set_ri_aux
3024 TYPE(gto_basis_set_type),
POINTER :: basis_set_a, basis_set_b
3025 TYPE(mp_para_env_type),
POINTER :: para_env
3026 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3027 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3029 NULLIFY (qs_kind_set, basis_set_a, basis_set_b, pblock, particle_set, &
3030 cell, la_max, la_min, lb_min, npgfa, lb_max, npgfb, nsgfa, &
3031 nsgfb, first_sgfa, first_sgfb, sphi_a, sphi_b, zeta, zetb, &
3032 atomic_kind_set, para_env)
3034 CALL timeset(routinen, handle)
3036 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, nkind=nkind, particle_set=particle_set, &
3037 cell=cell, atomic_kind_set=atomic_kind_set, natom=natom, para_env=para_env)
3039 CALL get_atomic_kind_set(atomic_kind_set, kind_of=kind_of, atom_of_kind=atom_of_kind)
3041 ALLOCATE (basis_set_ri_aux(nkind))
3042 CALL basis_set_list_setup(basis_set_ri_aux,
"RI_AUX", qs_kind_set)
3044 g_count = 0; r_count = 0
3046 CALL dbcsr_iterator_start(iter, g_pq)
3047 DO WHILE (dbcsr_iterator_blocks_left(iter))
3049 CALL dbcsr_iterator_next_block(iter, row=iatom, column=jatom)
3050 CALL dbcsr_get_block_p(g_pq, iatom, jatom, pblock, found)
3051 IF (.NOT. found) cycle
3052 IF (iatom > jatom) cycle
3054 IF (iatom == jatom) pref = 1.0_dp
3056 ikind = kind_of(iatom)
3057 jkind = kind_of(jatom)
3059 atom_a = atom_of_kind(iatom)
3060 atom_b = atom_of_kind(jatom)
3062 basis_set_a => basis_set_ri_aux(ikind)%gto_basis_set
3063 first_sgfa => basis_set_a%first_sgf
3064 la_max => basis_set_a%lmax
3065 la_min => basis_set_a%lmin
3066 nseta = basis_set_a%nset
3067 nsgfa => basis_set_a%nsgf_set
3068 sphi_a => basis_set_a%sphi
3069 zeta => basis_set_a%zet
3070 npgfa => basis_set_a%npgf
3072 basis_set_b => basis_set_ri_aux(jkind)%gto_basis_set
3073 first_sgfb => basis_set_b%first_sgf
3074 lb_max => basis_set_b%lmax
3075 lb_min => basis_set_b%lmin
3076 nsetb = basis_set_b%nset
3077 nsgfb => basis_set_b%nsgf_set
3078 sphi_b => basis_set_b%sphi
3079 zetb => basis_set_b%zet
3080 npgfb => basis_set_b%npgf
3082 ra(:) = pbc(particle_set(iatom)%r, cell)
3083 rb(:) = pbc(particle_set(jatom)%r, cell)
3085 ALLOCATE (hab(basis_set_a%nsgf, basis_set_b%nsgf))
3086 ALLOCATE (hdab(3, basis_set_a%nsgf, basis_set_b%nsgf))
3088 hdab(:, :, :) = 0.0_dp
3092 sgfa = first_sgfa(1, iset)
3096 sgfb = first_sgfb(1, jset)
3098 CALL integrate_set_2c(mp2_env%eri_mme_param%par, mp2_env%potential_parameter, la_min(iset), &
3099 la_max(iset), lb_min(jset), lb_max(jset), npgfa(iset), npgfb(jset), &
3100 zeta(:, iset), zetb(:, jset), ra, rb, hab, nsgfa(iset), nsgfb(jset), &
3101 offset_hab_a, offset_hab_b, 0, 0, sphi_a, sphi_b, sgfa, sgfb, &
3102 nsgfa(iset), nsgfb(jset), do_eri_mme, hdab=hdab, &
3103 g_count=g_count, r_count=r_count)
3105 offset_hab_b = offset_hab_b + nsgfb(jset)
3107 offset_hab_a = offset_hab_a + nsgfa(iset)
3111 new_force = pref*sum(pblock(:, :)*hdab(i_xyz, :, :))
3112 force(ikind)%mp2_non_sep(i_xyz, atom_a) = force(ikind)%mp2_non_sep(i_xyz, atom_a) + new_force
3113 force(jkind)%mp2_non_sep(i_xyz, atom_b) = force(jkind)%mp2_non_sep(i_xyz, atom_b) - new_force
3116 DEALLOCATE (hab, hdab)
3118 CALL dbcsr_iterator_stop(iter)
3120 CALL cp_eri_mme_update_local_counts(mp2_env%eri_mme_param, para_env, g_count_2c=g_count, r_count_2c=r_count)
3122 CALL timestop(handle)
3124 END SUBROUTINE get_2c_mme_forces
3136 SUBROUTINE update_im_time_forces(p_env, matrix_hz, matrix_p_F, matrix_p_F_admm, qs_env)
3138 TYPE(qs_p_env_type),
POINTER :: p_env
3139 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_p_f, matrix_p_f_admm
3140 TYPE(qs_environment_type),
POINTER :: qs_env
3142 CHARACTER(len=*),
PARAMETER :: routinen =
'update_im_time_forces'
3144 INTEGER :: handle, i, idens, ispin, n_rep_hf, nao, &
3145 nao_aux, nder, nimages, nocc, nspins
3146 LOGICAL :: do_exx, do_hfx, do_tau, do_tau_admm, &
3148 REAL(dp) :: dummy_real1, dummy_real2, ehartree, exc, &
3150 REAL(dp),
DIMENSION(3, 3) :: h_stress, pv_loc
3151 TYPE(admm_type),
POINTER :: admm_env
3152 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3153 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: current_density, current_density_admm, &
3154 current_mat_h, matrix_p_mp2, matrix_p_mp2_admm, matrix_s, matrix_s_aux_fit, matrix_w, &
3155 rho_ao, rho_ao_aux, scrm, scrm_admm
3156 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: dbcsr_work_h, dbcsr_work_p, mpa2
3157 TYPE(dbcsr_type) :: dbcsr_work
3158 TYPE(dft_control_type),
POINTER :: dft_control
3159 TYPE(hfx_type),
DIMENSION(:, :),
POINTER :: x_data
3160 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
3161 TYPE(mp_para_env_type),
POINTER :: para_env
3162 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
3163 POINTER :: sab_orb, sac_ae, sac_ppl, sap_ppnl
3164 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3165 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, rhoz_tot_gspace, &
3167 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rhoz_g
3168 TYPE(pw_env_type),
POINTER :: pw_env
3169 TYPE(pw_poisson_type),
POINTER :: poisson_env
3170 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
3171 TYPE(pw_r3d_rs_type) :: vh_rspace, vhxc_rspace, zv_hartree_rspace
3172 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rhoz_r, tauz_r, v_xc, v_xc_tau, &
3173 vadmm_rspace, vtau_rspace, vxc_rspace
3174 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
3175 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3176 TYPE(qs_rho_type),
POINTER :: rho, rho_aux_fit, rhoz
3177 TYPE(rho_atom_type),
DIMENSION(:),
POINTER :: rho0_atom_set, rho1_atom_set
3178 TYPE(section_vals_type),
POINTER :: hfx_section, xc_section
3179 TYPE(task_list_type),
POINTER :: task_list_aux_fit
3180 TYPE(virial_type),
POINTER :: virial
3182 NULLIFY (scrm, rho, dft_control, matrix_p_mp2, matrix_s, &
3183 matrix_p_mp2_admm, admm_env, sab_orb, dbcsr_work_p, &
3184 dbcsr_work_h, sac_ae, sac_ppl, sap_ppnl, force, virial, &
3185 qs_kind_set, atomic_kind_set, particle_set, pw_env, poisson_env, &
3186 auxbas_pw_pool, task_list_aux_fit, matrix_s_aux_fit, scrm_admm, &
3187 rho_aux_fit, rho_ao_aux, x_data, hfx_section, xc_section, &
3188 para_env, rhoz_g, rhoz_r, tauz_r, v_xc, v_xc_tau, vxc_rspace, &
3189 vtau_rspace, vadmm_rspace, rho_ao, matrix_w)
3190 NULLIFY (rho0_atom_set, rho1_atom_set)
3192 CALL timeset(routinen, handle)
3194 CALL get_qs_env(qs_env, rho=rho, dft_control=dft_control, matrix_s=matrix_s, admm_env=admm_env, &
3195 sab_orb=sab_orb, sac_ae=sac_ae, sac_ppl=sac_ppl, sap_ppnl=sap_ppnl, force=force, &
3196 virial=virial, particle_set=particle_set, qs_kind_set=qs_kind_set, &
3197 atomic_kind_set=atomic_kind_set, x_data=x_data, para_env=para_env)
3198 nspins = dft_control%nspins
3200 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3201 IF (use_virial) virial%pv_calculate = .true.
3205 IF (qs_env%mp2_env%method == ri_rpa_method_gpw)
THEN
3206 hfx_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC%WF_CORRELATION%RI_RPA%HF")
3207 CALL section_vals_get(hfx_section, explicit=do_exx)
3211 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2, matrix_p_mp2_admm=matrix_p_mp2_admm)
3215 mpa2(1:nspins, 1:1) => matrix_p_mp2(1:nspins)
3216 CALL kinetic_energy_matrix(qs_env, matrix_t=scrm, matrix_p=mpa2, &
3217 matrix_name=
"KINETIC ENERGY MATRIX", &
3219 sab_orb=sab_orb, calculate_forces=.true.)
3220 CALL dbcsr_deallocate_matrix_set(scrm)
3223 CALL dbcsr_allocate_matrix_set(scrm, nspins)
3224 DO ispin = 1, nspins
3225 ALLOCATE (scrm(ispin)%matrix)
3226 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
3227 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
3228 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
3233 ALLOCATE (dbcsr_work_p(nspins, 1), dbcsr_work_h(nspins, 1))
3234 DO ispin = 1, nspins
3235 dbcsr_work_p(ispin, 1)%matrix => matrix_p_mp2(ispin)%matrix
3236 dbcsr_work_h(ispin, 1)%matrix => scrm(ispin)%matrix
3239 CALL core_matrices(qs_env, dbcsr_work_h, dbcsr_work_p, .true., nder)
3241 DEALLOCATE (dbcsr_work_p, dbcsr_work_h)
3243 IF (use_virial)
THEN
3245 virial%pv_xc = 0.0_dp
3246 NULLIFY (vxc_rspace, vtau_rspace, vadmm_rspace)
3247 CALL ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
3248 dummy_real1, dummy_real2, h_stress)
3249 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
3250 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
3251 IF (.NOT. do_exx)
THEN
3253 virial%pv_exc = virial%pv_exc - virial%pv_xc
3254 virial%pv_virial = virial%pv_virial - virial%pv_xc
3257 CALL ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, dummy_real1, dummy_real2)
3259 do_tau =
ASSOCIATED(vtau_rspace)
3262 CALL integrate_v_core_rspace(vh_rspace, qs_env)
3266 CALL qs_rho_get(rho, rho_ao=rho_ao)
3267 DO ispin = 1, nspins
3268 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
3271 CALL get_qs_env(qs_env, pw_env=pw_env)
3272 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3273 poisson_env=poisson_env)
3274 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
3276 IF (use_virial) pv_loc = virial%pv_virial
3280 DO ispin = 1, nspins
3282 CALL pw_transfer(vh_rspace, vhxc_rspace)
3283 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3284 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3285 qs_env=qs_env, calculate_forces=.true.)
3287 CALL pw_transfer(vxc_rspace(ispin), vhxc_rspace)
3288 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3289 hmat=scrm(ispin), pmat=matrix_p_mp2(ispin), &
3290 qs_env=qs_env, calculate_forces=.true.)
3292 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
3293 hmat=scrm(ispin), pmat=matrix_p_mp2(ispin), &
3294 qs_env=qs_env, calculate_forces=.true., compute_tau=.true.)
3298 DO ispin = 1, nspins
3299 CALL pw_transfer(vh_rspace, vhxc_rspace)
3300 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
3301 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
3302 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3303 qs_env=qs_env, calculate_forces=.true.)
3305 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
3306 hmat=scrm(ispin), pmat=rho_ao(ispin), &
3307 qs_env=qs_env, calculate_forces=.true., compute_tau=.true.)
3311 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
3313 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3316 IF (dft_control%do_admm)
THEN
3317 CALL get_admm_env(admm_env, task_list_aux_fit=task_list_aux_fit, rho_aux_fit=rho_aux_fit, &
3318 matrix_s_aux_fit=matrix_s_aux_fit)
3319 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux)
3320 CALL dbcsr_allocate_matrix_set(scrm_admm, nspins)
3321 DO ispin = 1, nspins
3322 ALLOCATE (scrm_admm(ispin)%matrix)
3323 CALL dbcsr_create(scrm_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
3324 CALL dbcsr_copy(scrm_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
3325 CALL dbcsr_set(scrm_admm(ispin)%matrix, 0.0_dp)
3328 IF (use_virial) pv_loc = virial%pv_virial
3329 IF (.NOT. qs_env%admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
3330 DO ispin = 1, nspins
3332 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
3333 hmat=scrm_admm(ispin), pmat=matrix_p_mp2_admm(ispin), &
3334 qs_env=qs_env, calculate_forces=.true., &
3335 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3337 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
3338 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
3339 hmat=scrm_admm(ispin), pmat=rho_ao_aux(ispin), &
3340 qs_env=qs_env, calculate_forces=.true., &
3341 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3342 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, -1.0_dp)
3346 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3348 CALL tddft_hfx_matrix(scrm_admm, rho_ao_aux, qs_env, .false., .false.)
3351 CALL admm_projection_derivative(qs_env, scrm_admm, matrix_p_mp2)
3353 CALL admm_projection_derivative(qs_env, scrm_admm, rho_ao)
3358 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
3359 hfx_section => section_vals_get_subs_vals(xc_section,
"HF")
3360 CALL section_vals_get(hfx_section, explicit=do_hfx)
3363 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
3364 cpassert(n_rep_hf == 1)
3365 IF (use_virial) virial%pv_fock_4c = 0.0_dp
3369 IF (dft_control%do_admm)
THEN
3370 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3371 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux, rho_ao_kp=dbcsr_work_p)
3372 IF (x_data(1, 1)%do_hfx_ri)
THEN
3374 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3375 x_data(1, 1)%general_parameter%fraction, &
3376 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2_admm, &
3377 use_virial=use_virial, resp_only=.true.)
3379 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2_admm, hfx_section, para_env, &
3380 1, use_virial, resp_only=.true.)
3383 DO ispin = 1, nspins
3384 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
3386 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3387 IF (x_data(1, 1)%do_hfx_ri)
THEN
3389 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3390 x_data(1, 1)%general_parameter%fraction, &
3391 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2, &
3392 use_virial=use_virial, resp_only=.true.)
3394 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2, hfx_section, para_env, &
3395 1, use_virial, resp_only=.true.)
3397 DO ispin = 1, nspins
3398 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
3403 IF (dft_control%do_admm)
THEN
3404 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3405 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux, rho_ao_kp=dbcsr_work_p)
3406 DO ispin = 1, nspins
3407 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, 1.0_dp)
3409 IF (x_data(1, 1)%do_hfx_ri)
THEN
3411 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3412 x_data(1, 1)%general_parameter%fraction, &
3413 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2_admm, &
3414 use_virial=use_virial, resp_only=.false.)
3416 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2_admm, hfx_section, para_env, &
3417 1, use_virial, resp_only=.false.)
3419 DO ispin = 1, nspins
3420 CALL dbcsr_add(rho_ao_aux(ispin)%matrix, matrix_p_mp2_admm(ispin)%matrix, 1.0_dp, -1.0_dp)
3423 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3424 IF (x_data(1, 1)%do_hfx_ri)
THEN
3426 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
3427 x_data(1, 1)%general_parameter%fraction, &
3428 rho_ao=dbcsr_work_p, rho_ao_resp=matrix_p_mp2, &
3429 use_virial=use_virial, resp_only=.false.)
3431 CALL derivatives_four_center(qs_env, dbcsr_work_p, matrix_p_mp2, hfx_section, para_env, &
3432 1, use_virial, resp_only=.false.)
3437 IF (use_virial)
THEN
3438 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
3439 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
3444 CALL qs_rho_get(rho, rho_ao=rho_ao)
3445 DO ispin = 1, nspins
3446 CALL dbcsr_add(rho_ao(ispin)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
3454 ALLOCATE (current_density(nspins), current_mat_h(nspins), current_density_admm(nspins))
3456 DO ispin = 1, nspins
3457 IF (idens == 1)
THEN
3458 current_density(ispin)%matrix => matrix_p_f(ispin)%matrix
3459 current_mat_h(ispin)%matrix => scrm(ispin)%matrix
3460 IF (dft_control%do_admm) current_density_admm(ispin)%matrix => matrix_p_f_admm(ispin)%matrix
3462 current_density(ispin)%matrix => p_env%p1(ispin)%matrix
3463 current_mat_h(ispin)%matrix => matrix_hz(ispin)%matrix
3464 IF (dft_control%do_admm) current_density_admm(ispin)%matrix => p_env%p1_admm(ispin)%matrix
3469 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
3470 DO ispin = 1, nspins
3471 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
3472 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
3474 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
3475 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
3476 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
3478 CALL pw_zero(rhoz_tot_gspace)
3479 DO ispin = 1, nspins
3480 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3481 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin))
3482 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
3485 IF (use_virial)
THEN
3487 CALL get_qs_env(qs_env, rho=rho)
3488 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3490 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
3492 h_stress(:, :) = 0.0_dp
3493 CALL pw_poisson_solve(poisson_env, &
3494 density=rhoz_tot_gspace, &
3495 ehartree=ehartree, &
3496 vhartree=zv_hartree_gspace, &
3497 h_stress=h_stress, &
3498 aux_density=rho_tot_gspace)
3500 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3503 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe, dp)
3504 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe, dp)
3507 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, &
3511 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
3512 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
3513 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
3517 TYPE(pw_c1d_gs_type) :: tauz_g
3518 CALL auxbas_pw_pool%create_pw(tauz_g)
3519 ALLOCATE (tauz_r(nspins))
3520 DO ispin = 1, nspins
3521 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
3523 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3524 rho=tauz_r(ispin), rho_gspace=tauz_g, compute_tau=.true.)
3526 CALL auxbas_pw_pool%give_back_pw(tauz_g)
3531 IF (use_virial)
THEN
3534 DO ispin = 1, nspins
3535 exc = exc + pw_integral_ab(rhoz_r(ispin), vxc_rspace(ispin))/ &
3536 vxc_rspace(ispin)%pw_grid%dvol
3538 IF (
ASSOCIATED(vtau_rspace))
THEN
3539 DO ispin = 1, nspins
3540 exc = exc + pw_integral_ab(tauz_r(ispin), vtau_rspace(ispin))/ &
3541 vtau_rspace(ispin)%pw_grid%dvol
3545 virial%pv_ehartree(i, i) = virial%pv_ehartree(i, i) - 4.0_dp*ehartree/real(para_env%num_pe, dp)
3546 virial%pv_exc(i, i) = virial%pv_exc(i, i) - exc/real(para_env%num_pe, dp)
3547 virial%pv_virial(i, i) = virial%pv_virial(i, i) - 4.0_dp*ehartree/real(para_env%num_pe, dp) &
3548 - exc/real(para_env%num_pe, dp)
3553 IF (dft_control%do_admm)
THEN
3554 CALL get_qs_env(qs_env, admm_env=admm_env)
3555 xc_section => admm_env%xc_section_primary
3557 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
3560 IF (use_virial) virial%pv_xc = 0.0_dp
3563 CALL qs_rho_create(rhoz)
3564 IF (
ASSOCIATED(rhoz_r))
THEN
3565 CALL qs_rho_set(rhoz, rho_r=rhoz_r, rho_r_valid=.true.)
3567 IF (
ASSOCIATED(rhoz_g))
THEN
3568 CALL qs_rho_set(rhoz, rho_g=rhoz_g, rho_g_valid=.true.)
3570 IF (
ASSOCIATED(tauz_r))
THEN
3571 CALL qs_rho_set(rhoz, tau_r=tauz_r, tau_r_valid=.true.)
3574 CALL qs_fxc_create(qs_env, rho, rhoz, rho0_atom_set, xc_section, .false., &
3575 v_xc, v_xc_tau, rho1_atom_set, &
3576 dispersion_env=qs_env%dispersion_env, &
3577 compute_virial=use_virial, virial_xc=virial%pv_xc)
3581 IF (use_virial)
THEN
3582 virial%pv_exc = virial%pv_exc + virial%pv_xc
3583 virial%pv_virial = virial%pv_virial + virial%pv_xc
3585 pv_loc = virial%pv_virial
3588 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3589 DO ispin = 1, nspins
3590 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
3591 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
3592 CALL integrate_v_rspace(qs_env=qs_env, &
3593 v_rspace=v_xc(ispin), &
3594 hmat=current_mat_h(ispin), &
3595 pmat=dbcsr_work_p(ispin, 1), &
3596 calculate_forces=.true.)
3597 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
3599 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
3600 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
3601 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
3605 DO ispin = 1, nspins
3606 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
3607 CALL integrate_v_rspace(qs_env=qs_env, &
3608 v_rspace=v_xc_tau(ispin), &
3609 hmat=current_mat_h(ispin), &
3610 pmat=dbcsr_work_p(ispin, 1), &
3611 compute_tau=.true., &
3612 calculate_forces=.true.)
3613 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
3615 DEALLOCATE (v_xc_tau)
3618 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3621 IF (dft_control%do_admm)
THEN
3622 DO ispin = 1, nspins
3623 CALL dbcsr_set(scrm_admm(ispin)%matrix, 0.0_dp)
3625 CALL qs_rho_get(rho_aux_fit, tau_r_valid=do_tau_admm)
3627 IF (.NOT. admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
3628 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit)
3629 DO ispin = 1, nspins
3630 CALL pw_zero(rhoz_r(ispin))
3631 CALL pw_zero(rhoz_g(ispin))
3632 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density_admm(ispin)%matrix, &
3633 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
3634 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit)
3637 IF (do_tau_admm)
THEN
3639 TYPE(pw_c1d_gs_type) :: tauz_g
3640 CALL auxbas_pw_pool%create_pw(tauz_g)
3641 DO ispin = 1, nspins
3642 CALL pw_zero(tauz_r(ispin))
3643 CALL calculate_rho_elec(ks_env=qs_env%ks_env, matrix_p=current_density(ispin)%matrix, &
3644 rho=tauz_r(ispin), rho_gspace=tauz_g, &
3645 basis_type=
"AUX_FIT", task_list_external=task_list_aux_fit, &
3648 CALL auxbas_pw_pool%give_back_pw(tauz_g)
3653 IF (use_virial)
THEN
3655 DO ispin = 1, nspins
3656 exc = exc + pw_integral_ab(rhoz_r(ispin), vadmm_rspace(ispin))/ &
3657 vadmm_rspace(ispin)%pw_grid%dvol
3660 virial%pv_exc(i, i) = virial%pv_exc(i, i) - exc/real(para_env%num_pe, dp)
3661 virial%pv_virial(i, i) = virial%pv_virial(i, i) - exc/real(para_env%num_pe, dp)
3664 virial%pv_xc = 0.0_dp
3667 xc_section => admm_env%xc_section_aux
3669 CALL qs_rho_create(rhoz)
3670 IF (
ASSOCIATED(rhoz_r))
THEN
3671 CALL qs_rho_set(rhoz, rho_r=rhoz_r, rho_r_valid=.true.)
3673 IF (
ASSOCIATED(rhoz_g))
THEN
3674 CALL qs_rho_set(rhoz, rho_g=rhoz_g, rho_g_valid=.true.)
3676 IF (
ASSOCIATED(tauz_r))
THEN
3677 CALL qs_rho_set(rhoz, tau_r=tauz_r, tau_r_valid=.true.)
3680 CALL qs_fxc_create(qs_env, rho_aux_fit, rhoz, rho0_atom_set, xc_section, .false., &
3681 v_xc, v_xc_tau, rho1_atom_set, &
3682 compute_virial=use_virial, virial_xc=virial%pv_xc)
3686 IF (use_virial)
THEN
3687 virial%pv_exc = virial%pv_exc + virial%pv_xc
3688 virial%pv_virial = virial%pv_virial + virial%pv_xc
3690 pv_loc = virial%pv_virial
3693 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=dbcsr_work_p)
3694 DO ispin = 1, nspins
3695 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
3696 CALL integrate_v_rspace(qs_env=qs_env, &
3697 v_rspace=v_xc(ispin), &
3698 hmat=scrm_admm(ispin), &
3699 pmat=dbcsr_work_p(ispin, 1), &
3700 calculate_forces=.true., &
3701 basis_type=
"AUX_FIT", &
3702 task_list_external=task_list_aux_fit)
3703 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
3707 IF (do_tau_admm)
THEN
3708 DO ispin = 1, nspins
3709 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
3710 CALL integrate_v_rspace(qs_env=qs_env, &
3711 v_rspace=v_xc_tau(ispin), &
3712 hmat=scrm_admm(ispin), &
3713 pmat=dbcsr_work_p(ispin, 1), &
3714 calculate_forces=.true., &
3715 basis_type=
"AUX_FIT", &
3716 task_list_external=task_list_aux_fit, &
3718 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
3720 DEALLOCATE (v_xc_tau)
3723 IF (use_virial) virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
3726 CALL tddft_hfx_matrix(scrm_admm, current_density_admm, qs_env, .false., .false.)
3728 CALL qs_rho_get(rho, rho_ao_kp=dbcsr_work_p)
3729 CALL admm_projection_derivative(qs_env, scrm_admm, dbcsr_work_p(:, 1))
3732 CALL dbcsr_create(dbcsr_work, template=matrix_s(1)%matrix)
3733 IF (idens == 2)
THEN
3734 nao = admm_env%nao_orb
3735 nao_aux = admm_env%nao_aux_fit
3736 DO ispin = 1, nspins
3737 CALL dbcsr_copy(dbcsr_work, matrix_hz(ispin)%matrix)
3738 CALL dbcsr_set(dbcsr_work, 0.0_dp)
3740 CALL cp_dbcsr_sm_fm_multiply(scrm_admm(ispin)%matrix, admm_env%A, &
3741 admm_env%work_aux_orb, nao)
3742 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
3743 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
3744 admm_env%work_orb_orb)
3745 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbcsr_work, keep_sparsity=.true.)
3746 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbcsr_work, 1.0_dp, 1.0_dp)
3750 CALL dbcsr_release(dbcsr_work)
3754 IF (idens == 2)
THEN
3755 CALL tddft_hfx_matrix(matrix_hz, current_density, qs_env, .false., .false.)
3760 DO ispin = 1, nspins
3761 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
3762 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
3764 DEALLOCATE (rhoz_r, rhoz_g)
3767 DO ispin = 1, nspins
3768 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
3773 CALL dbcsr_deallocate_matrix_set(scrm_admm)
3775 DEALLOCATE (current_density, current_mat_h, current_density_admm)
3776 CALL dbcsr_deallocate_matrix_set(scrm)
3780 IF (nspins == 2) focc = 1.0_dp
3781 CALL get_qs_env(qs_env, mos=mos)
3782 DO ispin = 1, nspins
3783 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
3784 CALL calculate_whz_matrix(mos(ispin)%mo_coeff, matrix_hz(ispin)%matrix, &
3785 p_env%w1(ispin)%matrix, focc, nocc)
3787 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, p_env%w1(2)%matrix, 1.0_dp, 1.0_dp)
3790 IF (.NOT. do_exx)
THEN
3791 CALL compute_matrix_w(qs_env, calc_forces=.true.)
3792 CALL get_qs_env(qs_env, matrix_w=matrix_w)
3793 CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(1)%matrix, 1.0_dp, 1.0_dp)
3794 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(2)%matrix, 1.0_dp, 1.0_dp)
3798 CALL build_overlap_matrix(qs_env%ks_env, matrix_s=scrm, &
3799 matrix_name=
"OVERLAP MATRIX", &
3800 basis_type_a=
"ORB", basis_type_b=
"ORB", &
3801 sab_nl=sab_orb, calculate_forces=.true., &
3802 matrix_p=p_env%w1(1)%matrix)
3804 IF (.NOT. do_exx)
THEN
3805 CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(1)%matrix, 1.0_dp, -1.0_dp)
3806 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, matrix_w(2)%matrix, 1.0_dp, -1.0_dp)
3807 DO ispin = 1, nspins
3808 CALL dbcsr_set(matrix_w(ispin)%matrix, 0.0_dp)
3812 IF (nspins == 2)
CALL dbcsr_add(p_env%w1(1)%matrix, p_env%w1(2)%matrix, 1.0_dp, -1.0_dp)
3813 CALL dbcsr_deallocate_matrix_set(scrm)
3815 IF (use_virial) virial%pv_calculate = .false.
3818 CALL auxbas_pw_pool%give_back_pw(vh_rspace)
3820 DO ispin = 1, nspins
3821 CALL auxbas_pw_pool%give_back_pw(vxc_rspace(ispin))
3822 IF (
ASSOCIATED(vtau_rspace))
THEN
3823 CALL auxbas_pw_pool%give_back_pw(vtau_rspace(ispin))
3825 IF (
ASSOCIATED(vadmm_rspace))
THEN
3826 CALL auxbas_pw_pool%give_back_pw(vadmm_rspace(ispin))
3829 DEALLOCATE (vxc_rspace)
3830 IF (
ASSOCIATED(vtau_rspace))
DEALLOCATE (vtau_rspace)
3831 IF (
ASSOCIATED(vadmm_rspace))
DEALLOCATE (vadmm_rspace)
3833 CALL timestop(handle)
3835 END SUBROUTINE update_im_time_forces
3848 SUBROUTINE build_y_matrix(Y, A, P, R, filter_eps)
3850 TYPE(dbcsr_type),
INTENT(OUT) :: y
3851 TYPE(dbcsr_type),
INTENT(INOUT) :: a, p, r
3852 REAL(dp),
INTENT(IN) :: filter_eps
3854 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_Y_matrix'
3856 INTEGER :: handle, k, n
3857 REAL(dp) :: norm_scalar, threshold
3858 TYPE(dbcsr_type) :: a2n, exp_a2n, prn, work, work2, yk
3860 CALL timeset(routinen, handle)
3862 threshold = 1.0e-16_dp
3865 norm_scalar = dbcsr_frobenius_norm(a)
3870 IF ((norm_scalar/2.0_dp**n) < 1.0_dp)
EXIT
3875 CALL dbcsr_create(prn, template=a, matrix_type=dbcsr_type_no_symmetry)
3876 CALL dbcsr_create(work, template=a, matrix_type=dbcsr_type_no_symmetry)
3877 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, p, r, 0.0_dp, work, filter_eps=filter_eps)
3878 CALL dbcsr_create(exp_a2n, template=a, matrix_type=dbcsr_type_no_symmetry)
3881 CALL matrix_exponential(exp_a2n, a, 1.0_dp, 0.5_dp**k, threshold)
3882 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, exp_a2n, work, 0.0_dp, prn, filter_eps=filter_eps)
3883 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, work, exp_a2n, 1.0_dp, prn, filter_eps=filter_eps)
3884 CALL dbcsr_copy(work, prn)
3886 CALL dbcsr_release(exp_a2n)
3889 CALL dbcsr_create(a2n, template=a, matrix_type=dbcsr_type_no_symmetry)
3890 CALL dbcsr_copy(a2n, a)
3891 CALL dbcsr_scale(a2n, 0.5_dp**n)
3892 CALL dbcsr_create(y, template=a, matrix_type=dbcsr_type_no_symmetry)
3893 CALL dbcsr_create(yk, template=a, matrix_type=dbcsr_type_no_symmetry)
3894 CALL dbcsr_create(work2, template=a, matrix_type=dbcsr_type_no_symmetry)
3897 CALL dbcsr_scale(prn, 0.5_dp**n)
3898 CALL dbcsr_copy(work, prn)
3899 CALL dbcsr_copy(work2, prn)
3900 CALL dbcsr_add(y, prn, 1.0_dp, 1.0_dp)
3905 CALL dbcsr_multiply(
'N',
'N', 1.0_dp/real(k, dp), a2n, work, 0.0_dp, yk, filter_eps=filter_eps)
3906 CALL dbcsr_multiply(
'N',
'N', 1.0_dp/real(k, dp), work2, a2n, 0.0_dp, prn, filter_eps=filter_eps)
3908 CALL dbcsr_add(yk, prn, 1.0_dp, 1.0_dp)
3909 CALL dbcsr_add(y, yk, 1.0_dp, 1.0_dp)
3911 IF (dbcsr_frobenius_norm(yk) < threshold)
EXIT
3912 CALL dbcsr_copy(work, yk)
3913 CALL dbcsr_copy(work2, prn)
3916 CALL dbcsr_release(work)
3917 CALL dbcsr_release(work2)
3918 CALL dbcsr_release(prn)
3919 CALL dbcsr_release(a2n)
3920 CALL dbcsr_release(yk)
3922 CALL timestop(handle)
3924 END SUBROUTINE build_y_matrix
3936 TYPE(time_frequency_grid_type),
INTENT(INOUT) :: grid
3937 LOGICAL,
INTENT(IN) :: do_laplace, do_im_time
3938 INTEGER,
INTENT(IN) :: unit_nr
3939 TYPE(qs_environment_type),
POINTER :: qs_env
3943 IF (do_laplace .OR. do_im_time)
THEN
3944 IF (.NOT.
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%imaginary_time))
THEN
3945 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%imaginary_time, source=grid%imaginary_time)
3946 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%time_weights_at_zero_frequency, &
3947 source=grid%time_weights_at_zero_frequency)
3950 grid%imaginary_time(:) = qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%imaginary_time(:)
3951 grid%time_weights_at_zero_frequency(:) = &
3952 qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%time_weights_at_zero_frequency(:)
3955 IF (.NOT. do_laplace)
THEN
3956 IF (.NOT.
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency))
THEN
3957 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency, source=grid%frequency)
3958 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency_weights, &
3959 source=grid%frequency_weights)
3960 IF (do_im_time)
THEN
3961 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%cosine_time_to_frequency, &
3962 source=grid%cosine_time_to_frequency)
3963 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%cosine_frequency_to_time, &
3964 source=grid%cosine_frequency_to_time)
3967 grid%frequency(:) = qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency(:)
3968 grid%frequency_weights(:) = qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency_weights(:)
3969 IF (do_im_time)
THEN
3970 grid%cosine_time_to_frequency(:, :) = &
3971 qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%cosine_time_to_frequency(:, :)
3972 grid%cosine_frequency_to_time(:, :) = &
3973 qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%cosine_frequency_to_time(:, :)
3977 IF (unit_nr > 0)
THEN
3979 IF (
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%frequency) .AND. (.NOT. do_laplace))
THEN
3980 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
3981 "MINIMAX_INFO| Number of integration points:",
SIZE(grid%frequency)
3982 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)") &
3983 "MINIMAX_INFO| Minimax params (freq grid, scaled):",
"Weights",
"Abscissas"
3984 DO jquad = 1,
SIZE(grid%frequency)
3985 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") &
3986 grid%frequency_weights(jquad), grid%frequency(jquad)
3988 CALL m_flush(unit_nr)
3990 IF (
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%time_frequency_grid%imaginary_time))
THEN
3991 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
3992 "MINIMAX_INFO| Number of integration points:",
SIZE(grid%imaginary_time)
3993 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)") &
3994 "MINIMAX_INFO| Minimax params (time grid, scaled):",
"Weights",
"Abscissas"
3995 DO jquad = 1,
SIZE(grid%imaginary_time)
3996 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") &
3997 grid%time_weights_at_zero_frequency(jquad), grid%imaginary_time(jquad)
3999 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.
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)
...
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_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
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 copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
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, nrow, ncol, set_zero)
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...
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, nspins)
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, rpgfa, rpgfb, coulomb_context)
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, ncgf)
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
Calculation of the core Hamiltonian integral matrix <a|H|b> over Cartesian Gaussian-type functions.
subroutine, public core_matrices(qs_env, matrix_h, matrix_p, calculate_forces, nder, ec_env, dcdr_env, ec_env_matrices, ext_kpoints, basis_type, debug_forces, debug_stress, atcore)
...
subroutine, public kinetic_energy_matrix(qs_env, matrixkp_t, matrix_t, matrix_p, ext_kpoints, matrix_name, calculate_forces, nderivative, sab_orb, eps_filter, basis_type, debug_forces, debug_stress)
Calculate kinetic energy matrix and possible relativistic correction.
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, 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, rhoz_cneo_set, 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, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Setup Routine for Fxc Potentials.
subroutine, public qs_fxc_create(qs_env, rho0_struct, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, no_weights, uf_grid_results, pw_env_ext, kind_set_external, para_env_external, dispersion_env, compute_virial, virial_xc)
...
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.
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, vadmm_tau_rspace)
calculate the Kohn-Sham reference potential
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, 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_vhxc, 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, xcint_weights, 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, sab_cneo, 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, include_lowdin_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, cmo_coeff)
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, ext_kpoints)
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_set(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)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
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, silent)
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_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_laplace_loop_forces(force_data, mat_p_omega, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, fm_mo_coeff, homo, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, nmo, eigenval, grid, 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 keep_initial_quad(grid, do_laplace, do_im_time, 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.
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_mo_coeff, homo, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, nmo, eigenval, e_fermi, grid, 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....
Types needed for cubic-scaling RPA and SOS-Laplace-MP2 forces.
Routines for low-scaling RPA/GW with imaginary time.
integer, parameter, public propagator_sector_virtual
integer, parameter, public propagator_sector_occupied
subroutine, public compute_mat_dm_global(grid, nmo, fm_mo_coeff, homo, propagator, 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
Definition and construction of time/frequency grids for correlation methods.
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.