160 SUBROUTINE fhxc_force(qs_env, ex_env, gs_mos, full_kernel, debug_forces)
167 LOGICAL,
INTENT(IN) :: debug_forces
169 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fhxc_force'
171 CHARACTER(LEN=default_string_length) :: basis_type
172 INTEGER :: handle, iounit, ispin, mspin, myfun, &
173 n_rep_hf, nao, nao_aux, natom, nkind, &
175 LOGICAL :: distribute_fock_matrix, do_admm,
do_analytic, do_hfx, do_hfxlr, do_hfxsr, &
176 do_numeric, gapw, gapw_xc, hfx_treat_lsd_in_core, is_rks_triplets, s_mstruct_changed, &
178 REAL(kind=
dp) :: eh1, eh1c, eps_delta, eps_fit, focc, &
179 fscal, fval, kval, xehartree
180 REAL(kind=
dp),
DIMENSION(3) :: fodeb
185 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: cpmos, evect
188 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_fx, matrix_gx, matrix_hfx, &
189 matrix_hfx_admm, matrix_hfx_admm_asymm, matrix_hfx_asymm, matrix_hx, matrix_p, &
190 matrix_p_admm, matrix_px1, matrix_px1_admm, matrix_px1_admm_asymm, matrix_px1_asymm, &
191 matrix_s, matrix_s_aux_fit, matrix_wx1, mdum, mfx, mgx
192 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mhe, mpe, mpga
193 TYPE(
dbcsr_type),
POINTER :: dbwork, dbwork_asymm
196 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
197 TYPE(
local_rho_type),
POINTER :: local_rho_set, local_rho_set_admm, local_rho_set_f, &
198 local_rho_set_f_admm, local_rho_set_g, local_rho_set_g_admm
201 POINTER :: sab, sab_aux_fit, sab_orb, sap_oce
205 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_aux, rhox_g, rhox_g_aux, rhoxx_g
210 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau, &
211 rho_r_aux, rhox_r, rhox_r_aux, rhoxx_r
213 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
215 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rhox, rhox_aux
216 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho_atom_set, rho_atom_set_f, &
222 CALL timeset(routinen, handle)
225 IF (logger%para_env%is_source())
THEN
231 CALL get_qs_env(qs_env, dft_control=dft_control)
232 tddfpt_control => dft_control%tddfpt2_control
233 nspins = dft_control%nspins
234 is_rks_triplets = tddfpt_control%rks_triplets .AND. (nspins == 1)
236 do_hfx = tddfpt_control%do_hfx
237 do_hfxsr = tddfpt_control%do_hfxsr
238 do_hfxlr = tddfpt_control%do_hfxlr
239 do_admm = tddfpt_control%do_admm
240 gapw = dft_control%qs_control%gapw
241 gapw_xc = dft_control%qs_control%gapw_xc
243 evect => ex_env%evect
244 matrix_px1 => ex_env%matrix_px1
245 matrix_px1_admm => ex_env%matrix_px1_admm
246 matrix_px1_asymm => ex_env%matrix_px1_asymm
247 matrix_px1_admm_asymm => ex_env%matrix_px1_admm_asymm
250 IF (nspins == 2) focc = 0.5_dp
252 CALL dbcsr_set(matrix_px1(ispin)%matrix, 0.0_dp)
255 matrix_v=evect(ispin), &
256 matrix_g=gs_mos(ispin)%mos_occ, &
257 ncol=norb, alpha=2.0_dp*focc, symmetry_mode=1)
259 CALL dbcsr_set(matrix_px1_asymm(ispin)%matrix, 0.0_dp)
262 matrix_v=gs_mos(ispin)%mos_occ, &
263 matrix_g=evect(ispin), &
264 ncol=norb, alpha=2.0_dp*focc, &
268 CALL get_qs_env(qs_env, ks_env=ks_env, pw_env=pw_env, para_env=para_env)
270 NULLIFY (hartree_local, local_rho_set, local_rho_set_admm)
271 IF (gapw .OR. gapw_xc)
THEN
272 IF (nspins == 2)
THEN
278 atomic_kind_set=atomic_kind_set, &
279 qs_kind_set=qs_kind_set)
282 qs_kind_set, dft_control, para_env)
285 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
292 CALL get_qs_env(qs_env=qs_env, oce=oce, sap_oce=sap_oce, sab_orb=sab)
294 CALL get_qs_env(qs_env=qs_env, nkind=nkind, particle_set=particle_set)
296 eps_fit = dft_control%qs_control%gapw_control%eps_fit
301 mpga(1:nspins, 1:1) => matrix_px1(1:nspins)
303 qs_kind_set, oce, sab, para_env)
308 qs_kind_set, dft_control, para_env)
310 qs_kind_set, oce, sab, para_env)
315 qs_kind_set, dft_control, para_env)
317 qs_kind_set, oce, sab, para_env)
319 IF (nspins == 2)
THEN
328 nao_aux = admm_env%nao_aux_fit
329 nao = admm_env%nao_orb
334 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
335 admm_env%work_aux_orb)
337 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
338 admm_env%work_aux_aux)
339 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_px1_admm(ispin)%matrix, &
340 keep_sparsity=.true.)
342 CALL copy_dbcsr_to_fm(matrix_px1_asymm(ispin)%matrix, admm_env%work_orb_orb)
344 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
345 admm_env%work_aux_orb)
347 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
348 admm_env%work_aux_aux)
349 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_px1_admm_asymm(ispin)%matrix, &
350 keep_sparsity=.true.)
353 IF (admm_env%do_gapw)
THEN
354 IF (do_admm .AND. tddfpt_control%admm_xc_correction)
THEN
358 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
361 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
362 mpga(1:nspins, 1:1) => matrix_px1_admm(1:nspins)
365 admm_env%admm_gapw_env%admm_kind_set, &
366 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
368 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
372 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
374 admm_env%admm_gapw_env%admm_kind_set, &
375 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
377 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
381 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
383 admm_env%admm_gapw_env%admm_kind_set, &
384 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
386 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
392 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
393 poisson_env=poisson_env)
395 ALLOCATE (rhox_r(nspins), rhox_g(nspins))
397 CALL auxbas_pw_pool%create_pw(rhox_r(ispin))
398 CALL auxbas_pw_pool%create_pw(rhox_g(ispin))
400 CALL auxbas_pw_pool%create_pw(rhox_tot_gspace)
404 IF (nspins == 2)
CALL dbcsr_scale(matrix_px1(ispin)%matrix, 2.0_dp)
406 rho=rhox_r(ispin), rho_gspace=rhox_g(ispin), &
408 CALL pw_axpy(rhox_g(ispin), rhox_tot_gspace)
409 IF (nspins == 2)
CALL dbcsr_scale(matrix_px1(ispin)%matrix, 0.5_dp)
413 ALLOCATE (rhoxx_r(nspins), rhoxx_g(nspins))
415 CALL auxbas_pw_pool%create_pw(rhoxx_r(ispin))
416 CALL auxbas_pw_pool%create_pw(rhoxx_g(ispin))
419 IF (nspins == 2)
CALL dbcsr_scale(matrix_px1(ispin)%matrix, 2.0_dp)
421 rho=rhoxx_r(ispin), rho_gspace=rhoxx_g(ispin), &
423 IF (nspins == 2)
CALL dbcsr_scale(matrix_px1(ispin)%matrix, 0.5_dp)
427 CALL get_qs_env(qs_env, matrix_s=matrix_s, force=force)
429 IF (.NOT. is_rks_triplets)
THEN
430 CALL auxbas_pw_pool%create_pw(xv_hartree_rspace)
431 CALL auxbas_pw_pool%create_pw(xv_hartree_gspace)
434 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rhox_tot_gspace)
438 CALL pw_transfer(xv_hartree_gspace, xv_hartree_rspace)
439 CALL pw_scale(xv_hartree_rspace, xv_hartree_rspace%pw_grid%dvol)
441 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
445 ALLOCATE (matrix_hx(ispin)%matrix)
446 CALL dbcsr_create(matrix_hx(ispin)%matrix, template=matrix_s(1)%matrix)
447 CALL dbcsr_copy(matrix_hx(ispin)%matrix, matrix_s(1)%matrix)
448 CALL dbcsr_set(matrix_hx(ispin)%matrix, 0.0_dp)
449 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=xv_hartree_rspace, &
450 pmat=matrix_px1(ispin), hmat=matrix_hx(ispin), &
451 gapw=gapw, calculate_forces=.true.)
453 IF (debug_forces)
THEN
454 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
455 CALL para_env%sum(fodeb)
456 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKh[X] ", fodeb
459 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
460 CALL vh_1c_gg_integrals(qs_env, eh1c, hartree_local%ecoul_1c, local_rho_set, para_env, tddft=.true., &
462 IF (nspins == 1)
THEN
468 local_rho_set=local_rho_set, kforce=kval)
469 IF (debug_forces)
THEN
470 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
471 CALL para_env%sum(fodeb)
472 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKh[X]PAWg0", fodeb
474 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
475 CALL update_ks_atom(qs_env, matrix_hx, matrix_px1, forces=.true., &
476 rho_atom_external=local_rho_set%rho_atom_set)
477 IF (debug_forces)
THEN
478 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
479 CALL para_env%sum(fodeb)
480 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKh[X]PAW ", fodeb
486 IF (full_kernel%do_exck)
THEN
489 NULLIFY (fxc_rho, fxc_tau, gxc_rho, gxc_tau)
490 xc_section => full_kernel%xc_section
494 SELECT CASE (ex_env%xc_kernel_method)
505 cpabort(
"invalid xc_kernel_method")
507 order = ex_env%diff_order
508 eps_delta = ex_env%eps_delta_rho
511 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, rho_xc=rho)
513 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, rho=rho)
520 CALL qs_rho_set(rho_struct=rhox, rho_ao=matrix_px1, rho_r=rhoxx_r, rho_g=rhoxx_g, &
521 rho_r_valid=.true., rho_g_valid=.true.)
523 CALL qs_rho_set(rho_struct=rhox, rho_ao=matrix_px1, rho_r=rhox_r, rho_g=rhox_g, &
524 rho_r_valid=.true., rho_g_valid=.true.)
527 cpabort(
"Analytic 3rd EXC derivatives not available")
530 CALL qs_fgxc_gdiff(ks_env, rho, rhox, xc_section, order, eps_delta, is_rks_triplets, &
531 fxc_rho, fxc_tau, gxc_rho, gxc_tau)
533 CALL qs_fgxc_create(ks_env, rho, rhox, xc_section, order, is_rks_triplets, &
534 fxc_rho, fxc_tau, gxc_rho, gxc_tau)
537 cpabort(
"FHXC forces analytic/numeric")
546 IF (nspins == 2)
THEN
548 CALL pw_scale(gxc_rho(ispin), 0.5_dp)
549 IF (
ASSOCIATED(gxc_tau))
CALL pw_scale(gxc_tau(ispin), 0.5_dp)
552 IF (gapw .OR. gapw_xc)
THEN
554 cpabort(
"Analytic 3rd EXC derivatives not available")
558 local_rho_set_f%rho_atom_set, local_rho_set_g%rho_atom_set, &
559 qs_kind_set, xc_section, is_rks_triplets, order, eps_delta)
562 local_rho_set_f%rho_atom_set, local_rho_set_g%rho_atom_set, &
563 qs_kind_set, xc_section, is_rks_triplets, order)
566 cpabort(
"FHXC forces analytic/numeric")
570 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
574 ALLOCATE (matrix_fx(ispin)%matrix)
575 CALL dbcsr_create(matrix_fx(ispin)%matrix, template=matrix_s(1)%matrix)
576 CALL dbcsr_copy(matrix_fx(ispin)%matrix, matrix_s(1)%matrix)
577 CALL dbcsr_set(matrix_fx(ispin)%matrix, 0.0_dp)
578 CALL pw_scale(fxc_rho(ispin), fxc_rho(ispin)%pw_grid%dvol)
579 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=fxc_rho(ispin), &
580 pmat=matrix_px1(ispin), hmat=matrix_fx(ispin), &
581 gapw=(gapw .OR. gapw_xc), calculate_forces=.true.)
583 IF (debug_forces)
THEN
584 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
585 CALL para_env%sum(fodeb)
586 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKf[X] ", fodeb
589 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
593 ALLOCATE (matrix_gx(ispin)%matrix)
594 CALL dbcsr_create(matrix_gx(ispin)%matrix, template=matrix_s(1)%matrix)
595 CALL dbcsr_copy(matrix_gx(ispin)%matrix, matrix_s(1)%matrix)
596 CALL dbcsr_set(matrix_gx(ispin)%matrix, 0.0_dp)
597 CALL pw_scale(gxc_rho(ispin), gxc_rho(ispin)%pw_grid%dvol)
598 CALL pw_scale(gxc_rho(ispin), 0.5_dp)
599 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=gxc_rho(ispin), &
600 pmat=matrix_p(ispin), hmat=matrix_gx(ispin), &
601 gapw=(gapw .OR. gapw_xc), calculate_forces=.true.)
604 IF (debug_forces)
THEN
605 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
606 CALL para_env%sum(fodeb)
607 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*dKg[X] ", fodeb
611 IF (gapw .OR. gapw_xc)
THEN
612 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
613 CALL update_ks_atom(qs_env, matrix_fx, matrix_px1, forces=.true., tddft=.true., &
614 rho_atom_external=local_rho_set_f%rho_atom_set, &
615 kintegral=1.0_dp, kforce=1.0_dp)
616 IF (debug_forces)
THEN
617 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
618 CALL para_env%sum(fodeb)
619 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKf[X]PAW ", fodeb
621 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
622 IF (nspins == 1)
THEN
623 CALL update_ks_atom(qs_env, matrix_gx, matrix_p, forces=.true., tddft=.true., &
624 rho_atom_external=local_rho_set_g%rho_atom_set, &
628 rho_atom_external=local_rho_set_g%rho_atom_set, &
629 kintegral=0.5_dp, kforce=0.25_dp)
631 IF (debug_forces)
THEN
632 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
633 CALL para_env%sum(fodeb)
634 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKg[X]PAW ", fodeb
640 IF (do_admm .AND. tddfpt_control%admm_xc_correction)
THEN
644 IF (.NOT. tddfpt_control%admm_symm)
THEN
645 CALL cp_warn(__location__,
"Forces need symmetric ADMM kernel corrections")
646 cpabort(
"ADMM KERNEL CORRECTION")
648 xc_section => admm_env%xc_section_aux
649 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=matrix_s_aux_fit, &
650 task_list_aux_fit=task_list)
651 basis_type =
"AUX_FIT"
652 IF (admm_env%do_gapw)
THEN
653 basis_type =
"AUX_FIT_SOFT"
654 task_list => admm_env%admm_gapw_env%task_list
661 ALLOCATE (mfx(ispin)%matrix, mgx(ispin)%matrix)
662 CALL dbcsr_create(mfx(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
663 CALL dbcsr_copy(mfx(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
664 CALL dbcsr_set(mfx(ispin)%matrix, 0.0_dp)
665 CALL dbcsr_create(mgx(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
666 CALL dbcsr_copy(mgx(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
667 CALL dbcsr_set(mgx(ispin)%matrix, 0.0_dp)
671 NULLIFY (rho_g_aux, rho_r_aux, rhox_g_aux, rhox_r_aux)
672 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
673 CALL qs_rho_get(rho_aux_fit, rho_ao=matrix_p_admm)
675 ALLOCATE (rhox_r_aux(nspins), rhox_g_aux(nspins))
677 CALL auxbas_pw_pool%create_pw(rhox_r_aux(ispin))
678 CALL auxbas_pw_pool%create_pw(rhox_g_aux(ispin))
682 rho=rhox_r_aux(ispin), rho_gspace=rhox_g_aux(ispin), &
683 basis_type=basis_type, &
684 task_list_external=task_list)
690 CALL qs_rho_set(rho_struct=rhox_aux, rho_ao=matrix_px1_admm, &
691 rho_r=rhox_r_aux, rho_g=rhox_g_aux, &
692 rho_r_valid=.true., rho_g_valid=.true.)
694 cpabort(
"Analytic 3rd derivatives of EXC not available")
697 CALL qs_fgxc_gdiff(ks_env, rho_aux_fit, rhox_aux, xc_section, order, eps_delta, &
698 is_rks_triplets, fxc_rho, fxc_tau, gxc_rho, gxc_tau)
701 order, is_rks_triplets, fxc_rho, fxc_tau, gxc_rho, gxc_tau)
704 cpabort(
"FHXC forces analytic/numeric")
711 DEALLOCATE (rhox_aux)
714 CALL auxbas_pw_pool%give_back_pw(rhox_r_aux(ispin))
715 CALL auxbas_pw_pool%give_back_pw(rhox_g_aux(ispin))
717 DEALLOCATE (rhox_r_aux, rhox_g_aux)
719 IF (nspins == 2) fscal = 2.0_dp
721 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
723 CALL pw_scale(fxc_rho(ispin), fxc_rho(ispin)%pw_grid%dvol)
724 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=fxc_rho(ispin), &
726 pmat=matrix_px1_admm(ispin), &
727 basis_type=basis_type, &
728 calculate_forces=.true., &
730 task_list_external=task_list)
732 IF (debug_forces)
THEN
733 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
734 CALL para_env%sum(fodeb)
735 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKf[X]ADMM", fodeb
738 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
740 CALL pw_scale(gxc_rho(ispin), gxc_rho(ispin)%pw_grid%dvol)
741 CALL pw_scale(gxc_rho(ispin), 0.5_dp)
742 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=gxc_rho(ispin), &
744 pmat=matrix_p_admm(ispin), &
745 basis_type=basis_type, &
746 calculate_forces=.true., &
748 task_list_external=task_list)
751 IF (debug_forces)
THEN
752 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
753 CALL para_env%sum(fodeb)
754 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*dKg[X]ADMM", fodeb
758 IF (admm_env%do_gapw)
THEN
760 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
761 rho_atom_set_f => local_rho_set_f_admm%rho_atom_set
762 rho_atom_set_g => local_rho_set_g_admm%rho_atom_set
765 cpabort(
"Analytic 3rd EXC derivatives not available")
769 rho_atom_set_f, rho_atom_set_g, &
770 admm_env%admm_gapw_env%admm_kind_set, xc_section, &
771 is_rks_triplets, order, eps_delta)
774 rho_atom_set_f, rho_atom_set_g, &
775 admm_env%admm_gapw_env%admm_kind_set, xc_section, &
776 is_rks_triplets, order)
779 cpabort(
"FHXC forces analytic/numeric")
782 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
783 IF (nspins == 1)
THEN
784 CALL update_ks_atom(qs_env, mfx, matrix_px1_admm, forces=.true., &
785 rho_atom_external=rho_atom_set_f, &
786 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
787 oce_external=admm_env%admm_gapw_env%oce, sab_external=sab_aux_fit, &
788 kintegral=2.0_dp, kforce=0.5_dp)
790 CALL update_ks_atom(qs_env, mfx, matrix_px1_admm, forces=.true., &
791 rho_atom_external=rho_atom_set_f, &
792 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
793 oce_external=admm_env%admm_gapw_env%oce, sab_external=sab_aux_fit, &
794 kintegral=2.0_dp, kforce=1.0_dp)
796 IF (debug_forces)
THEN
797 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
798 CALL para_env%sum(fodeb)
799 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*dKf[X]ADMM-PAW ", fodeb
801 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
802 IF (nspins == 1)
THEN
804 rho_atom_external=rho_atom_set_g, &
805 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
806 oce_external=admm_env%admm_gapw_env%oce, sab_external=sab_aux_fit, &
807 kintegral=1.0_dp, kforce=0.5_dp)
810 rho_atom_external=rho_atom_set_g, &
811 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
812 oce_external=admm_env%admm_gapw_env%oce, sab_external=sab_aux_fit, &
813 kintegral=1.0_dp, kforce=1.0_dp)
815 IF (debug_forces)
THEN
816 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
817 CALL para_env%sum(fodeb)
818 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*dKg[X]ADMM-PAW ", fodeb
824 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
825 fval = 2.0_dp*real(nspins, kind=
dp)
827 IF (debug_forces)
THEN
828 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
829 CALL para_env%sum(fodeb)
830 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*dfXC(P)*S' ", fodeb
832 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
833 fval = 2.0_dp*real(nspins, kind=
dp)
835 IF (debug_forces)
THEN
836 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
837 CALL para_env%sum(fodeb)
838 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*dgXC(P)*S' ", fodeb
843 IF (nspins == 2) fscal = 2.0_dp
844 nao = admm_env%nao_orb
845 nao_aux = admm_env%nao_aux_fit
851 admm_env%work_aux_orb, nao)
853 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
854 admm_env%work_orb_orb)
858 CALL dbcsr_add(matrix_fx(ispin)%matrix, dbwork, 1.0_dp, fscal)
861 admm_env%work_aux_orb, nao)
863 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
864 admm_env%work_orb_orb)
867 CALL dbcsr_add(matrix_gx(ispin)%matrix, dbwork, 1.0_dp, fscal)
878 CALL auxbas_pw_pool%give_back_pw(rhox_r(ispin))
879 CALL auxbas_pw_pool%give_back_pw(rhox_g(ispin))
881 DEALLOCATE (rhox_r, rhox_g)
882 CALL auxbas_pw_pool%give_back_pw(rhox_tot_gspace)
885 CALL auxbas_pw_pool%give_back_pw(rhoxx_r(ispin))
886 CALL auxbas_pw_pool%give_back_pw(rhoxx_g(ispin))
888 DEALLOCATE (rhoxx_r, rhoxx_g)
890 IF (.NOT. is_rks_triplets)
THEN
891 CALL auxbas_pw_pool%give_back_pw(xv_hartree_rspace)
892 CALL auxbas_pw_pool%give_back_pw(xv_hartree_gspace)
897 NULLIFY (matrix_hfx, matrix_hfx_asymm)
901 ALLOCATE (matrix_hfx(ispin)%matrix)
902 CALL dbcsr_create(matrix_hfx(ispin)%matrix, template=matrix_s(1)%matrix)
903 CALL dbcsr_copy(matrix_hfx(ispin)%matrix, matrix_s(1)%matrix)
904 CALL dbcsr_set(matrix_hfx(ispin)%matrix, 0.0_dp)
906 ALLOCATE (matrix_hfx_asymm(ispin)%matrix)
907 CALL dbcsr_create(matrix_hfx_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
908 matrix_type=dbcsr_type_antisymmetric)
912 xc_section => full_kernel%xc_section
915 cpassert(n_rep_hf == 1)
919 IF (hfx_treat_lsd_in_core) mspin = nspins
921 CALL get_qs_env(qs_env=qs_env, x_data=x_data, s_mstruct_changed=s_mstruct_changed)
922 distribute_fock_matrix = .true.
925 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
926 NULLIFY (matrix_hfx_admm, matrix_hfx_admm_asymm)
930 ALLOCATE (matrix_hfx_admm(ispin)%matrix)
931 CALL dbcsr_create(matrix_hfx_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
932 CALL dbcsr_copy(matrix_hfx_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
933 CALL dbcsr_set(matrix_hfx_admm(ispin)%matrix, 0.0_dp)
935 ALLOCATE (matrix_hfx_admm_asymm(ispin)%matrix)
936 CALL dbcsr_create(matrix_hfx_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
937 matrix_type=dbcsr_type_antisymmetric)
942 ALLOCATE (mpe(nspins, 1), mhe(nspins, 1))
944 mhe(ispin, 1)%matrix => matrix_hfx_admm(ispin)%matrix
945 mpe(ispin, 1)%matrix => matrix_px1_admm(ispin)%matrix
947 IF (x_data(1, 1)%do_hfx_ri)
THEN
950 geometry_did_change=s_mstruct_changed, nspins=nspins, &
951 hf_fraction=x_data(1, 1)%general_parameter%fraction)
956 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
962 mhe(ispin, 1)%matrix => matrix_hfx_admm_asymm(ispin)%matrix
963 mpe(ispin, 1)%matrix => matrix_px1_admm_asymm(ispin)%matrix
965 IF (x_data(1, 1)%do_hfx_ri)
THEN
968 geometry_did_change=s_mstruct_changed, nspins=nspins, &
969 hf_fraction=x_data(1, 1)%general_parameter%fraction)
974 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
979 nao = admm_env%nao_orb
980 nao_aux = admm_env%nao_aux_fit
981 ALLOCATE (dbwork, dbwork_asymm)
982 CALL dbcsr_create(dbwork, template=matrix_hfx(1)%matrix)
983 CALL dbcsr_create(dbwork_asymm, template=matrix_hfx(1)%matrix, matrix_type=dbcsr_type_antisymmetric)
986 admm_env%work_aux_orb, nao)
988 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
989 admm_env%work_orb_orb)
993 CALL dbcsr_add(matrix_hfx(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
996 admm_env%work_aux_orb, nao)
998 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
999 admm_env%work_orb_orb)
1000 CALL dbcsr_copy(dbwork_asymm, matrix_hfx_asymm(1)%matrix)
1002 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork_asymm, keep_sparsity=.true.)
1003 CALL dbcsr_add(matrix_hfx_asymm(ispin)%matrix, dbwork_asymm, 1.0_dp, 1.0_dp)
1007 DEALLOCATE (dbwork, dbwork_asymm)
1010 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
1011 fval = 4.0_dp*real(nspins, kind=
dp)*0.5_dp
1014 IF (debug_forces)
THEN
1015 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
1016 CALL para_env%sum(fodeb)
1017 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*Hx(P)*S' ", fodeb
1020 use_virial = .false.
1022 fval = 2.0_dp*real(nspins, kind=
dp)*0.5_dp
1023 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
1024 DO ispin = 1, nspins
1025 mpe(ispin, 1)%matrix => matrix_px1_admm(ispin)%matrix
1027 IF (x_data(1, 1)%do_hfx_ri)
THEN
1029 x_data(1, 1)%general_parameter%fraction, &
1030 rho_ao=mpe, rho_ao_resp=mdum, &
1031 use_virial=use_virial, rescale_factor=fval)
1034 adiabatic_rescale_factor=fval)
1036 DO ispin = 1, nspins
1037 mpe(ispin, 1)%matrix => matrix_px1_admm_asymm(ispin)%matrix
1039 IF (x_data(1, 1)%do_hfx_ri)
THEN
1041 x_data(1, 1)%general_parameter%fraction, &
1042 rho_ao=mpe, rho_ao_resp=mdum, &
1043 use_virial=use_virial, rescale_factor=fval)
1046 adiabatic_rescale_factor=fval)
1048 IF (debug_forces)
THEN
1049 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
1050 CALL para_env%sum(fodeb)
1051 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*hfx'*Px ", fodeb
1054 DEALLOCATE (mpe, mhe)
1060 ALLOCATE (mpe(nspins, 1), mhe(nspins, 1))
1061 DO ispin = 1, nspins
1062 mhe(ispin, 1)%matrix => matrix_hfx(ispin)%matrix
1063 mpe(ispin, 1)%matrix => matrix_px1(ispin)%matrix
1065 IF (x_data(1, 1)%do_hfx_ri)
THEN
1067 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhe, eh1, rho_ao=mpe, &
1068 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1069 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1074 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1080 DO ispin = 1, nspins
1081 mhe(ispin, 1)%matrix => matrix_hfx_asymm(ispin)%matrix
1082 mpe(ispin, 1)%matrix => matrix_px1_asymm(ispin)%matrix
1084 IF (x_data(1, 1)%do_hfx_ri)
THEN
1086 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhe, eh1, rho_ao=mpe, &
1087 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1088 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1093 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1098 use_virial = .false.
1100 fval = 2.0_dp*real(nspins, kind=
dp)*0.5_dp
1101 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
1102 DO ispin = 1, nspins
1103 mpe(ispin, 1)%matrix => matrix_px1(ispin)%matrix
1105 IF (x_data(1, 1)%do_hfx_ri)
THEN
1107 x_data(1, 1)%general_parameter%fraction, &
1108 rho_ao=mpe, rho_ao_resp=mdum, &
1109 use_virial=use_virial, rescale_factor=fval)
1112 adiabatic_rescale_factor=fval)
1114 DO ispin = 1, nspins
1115 mpe(ispin, 1)%matrix => matrix_px1_asymm(ispin)%matrix
1117 IF (x_data(1, 1)%do_hfx_ri)
THEN
1119 x_data(1, 1)%general_parameter%fraction, &
1120 rho_ao=mpe, rho_ao_resp=mdum, &
1121 use_virial=use_virial, rescale_factor=fval)
1124 adiabatic_rescale_factor=fval)
1126 IF (debug_forces)
THEN
1127 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
1128 CALL para_env%sum(fodeb)
1129 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Px*hfx'*Px ", fodeb
1132 DEALLOCATE (mpe, mhe)
1134 fval = 2.0_dp*real(nspins, kind=
dp)*0.5_dp
1135 DO ispin = 1, nspins
1137 CALL dbcsr_scale(matrix_hfx_asymm(ispin)%matrix, fval)
1141 IF (gapw .OR. gapw_xc)
THEN
1150 IF (admm_env%do_gapw)
THEN
1151 IF (tddfpt_control%admm_xc_correction)
THEN
1163 cpabort(
"HFXSR not implemented")
1167 cpabort(
"HFXLR not implemented")
1171 NULLIFY (matrix_wx1)
1173 cpmos => ex_env%cpmos
1175 IF (nspins == 2) focc = 1.0_dp
1176 DO ispin = 1, nspins
1177 mos => gs_mos(ispin)%mos_occ
1180 CALL cp_fm_get_info(vcvec, matrix_struct=fm_struct, nrow_global=nao)
1182 ncol_global=norb, para_env=fm_struct%para_env)
1186 ALLOCATE (matrix_wx1(ispin)%matrix)
1187 CALL dbcsr_create(matrix=matrix_wx1(ispin)%matrix, template=matrix_s(1)%matrix)
1189 CALL dbcsr_set(matrix_wx1(ispin)%matrix, 0.0_dp)
1191 IF (.NOT. is_rks_triplets)
THEN
1193 cpmos(ispin), norb, alpha=focc, beta=1.0_dp)
1195 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, mos, vcvec, 0.0_dp, cvcmat)
1196 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, evect(ispin), cvcmat, 0.0_dp, vcvec)
1198 norb, alpha=-focc, beta=1.0_dp)
1201 ncol=norb, alpha=2.0_dp, symmetry_mode=1)
1206 cpmos(ispin), norb, alpha=focc, beta=1.0_dp)
1208 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, mos, vcvec, 0.0_dp, cvcmat)
1209 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, evect(ispin), cvcmat, 0.0_dp, vcvec)
1211 norb, alpha=-focc, beta=1.0_dp)
1214 ncol=norb, alpha=2.0_dp, symmetry_mode=1)
1217 cpmos(ispin), norb, alpha=focc, beta=1.0_dp)
1220 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, mos, vcvec, 0.0_dp, cvcmat)
1221 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, mos, cvcmat, 0.0_dp, vcvec)
1223 ncol=norb, alpha=1.0_dp, symmetry_mode=1)
1228 cpmos(ispin), norb, alpha=focc, beta=1.0_dp)
1231 cpmos(ispin), norb, alpha=focc, beta=1.0_dp)
1234 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, mos, vcvec, 0.0_dp, cvcmat)
1235 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, evect(ispin), cvcmat, 0.0_dp, vcvec)
1237 norb, alpha=-focc, beta=1.0_dp)
1240 ncol=norb, alpha=2.0_dp, symmetry_mode=1)
1247 IF (.NOT. is_rks_triplets)
THEN
1251 ex_env%matrix_wx1 => matrix_wx1
1261 CALL timestop(handle)
1275 SUBROUTINE stda_force(qs_env, ex_env, gs_mos, stda_env, sub_env, work, debug_forces)
1284 LOGICAL,
INTENT(IN) :: debug_forces
1286 CHARACTER(len=*),
PARAMETER :: routinen =
'stda_force'
1288 INTEGER :: atom_i, atom_j, ewald_type, handle, i, &
1289 ia, iatom, idimk, ikind, iounit, is, &
1290 ispin, jatom, jkind, jspin, nao, &
1291 natom, norb, nsgf, nspins
1292 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, first_sgf, kind_of, &
1294 INTEGER,
DIMENSION(2) :: nactive, nlim
1295 LOGICAL :: calculate_forces, do_coulomb, do_ewald, &
1296 found, is_rks_triplets, use_virial
1297 REAL(kind=
dp) :: alpha, bp, dgabr, dr, eta, fdim, gabr, &
1298 hfx, rbeta, spinfac, xfac
1299 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: tcharge, tv
1300 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gtcharge
1301 REAL(kind=
dp),
DIMENSION(3) :: fij, fodeb, rij
1302 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gab, pblock
1306 TYPE(
cp_fm_type) :: cvcmat, cvec, cvecjspin, t0matrix, &
1307 t1matrix, vcvec, xvec
1308 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: xtransformed
1309 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: cpmos, x
1310 TYPE(
cp_fm_type),
POINTER :: ct, ctjspin, ucmatrix, uxmatrix
1313 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: gamma_matrix, matrix_plo, matrix_s, &
1322 POINTER :: n_list, sab_orb
1325 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1331 CALL timeset(routinen, handle)
1333 cpassert(
ASSOCIATED(ex_env))
1334 cpassert(
ASSOCIATED(gs_mos))
1337 IF (logger%para_env%is_source())
THEN
1343 CALL get_qs_env(qs_env, dft_control=dft_control)
1344 tddfpt_control => dft_control%tddfpt2_control
1345 stda_control => tddfpt_control%stda_control
1346 nspins = dft_control%nspins
1347 is_rks_triplets = tddfpt_control%rks_triplets .AND. (nspins == 1)
1351 nactive(:) = stda_env%nactive(:)
1354 IF (nspins == 2) spinfac = 1.0_dp
1355 NULLIFY (matrix_wx1)
1357 NULLIFY (matrix_plo)
1360 IF (nspins == 1 .AND. is_rks_triplets)
THEN
1361 do_coulomb = .false.
1365 do_ewald = stda_control%do_ewald
1367 CALL get_qs_env(qs_env, para_env=para_env, force=force)
1369 CALL get_qs_env(qs_env, natom=natom, cell=cell, &
1370 particle_set=particle_set, qs_kind_set=qs_kind_set)
1371 ALLOCATE (first_sgf(natom))
1372 ALLOCATE (last_sgf(natom))
1373 CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf, last_sgf=last_sgf)
1375 CALL get_qs_env(qs_env, ks_env=ks_env, matrix_s=matrix_s, sab_orb=sab_orb, atomic_kind_set=atomic_kind_set)
1376 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of, atom_of_kind=atom_of_kind)
1380 ALLOCATE (xtransformed(nspins))
1381 DO ispin = 1, nspins
1383 ct => work%ctransformed(ispin)
1385 CALL cp_fm_create(matrix=xtransformed(ispin), matrix_struct=fmstruct, name=
"XTRANSFORMED")
1389 ALLOCATE (tcharge(natom), gtcharge(natom, 4))
1391 cpmos => ex_env%cpmos
1393 DO ispin = 1, nspins
1394 ct => work%ctransformed(ispin)
1395 CALL cp_fm_get_info(ct, matrix_struct=fmstruct, nrow_global=nsgf)
1400 ALLOCATE (matrix_wx1(ispin)%matrix)
1401 CALL dbcsr_create(matrix=matrix_wx1(ispin)%matrix, template=matrix_s(1)%matrix)
1403 CALL dbcsr_set(matrix_wx1(ispin)%matrix, 0.0_dp)
1404 ALLOCATE (matrix_plo(ispin)%matrix)
1405 CALL dbcsr_create(matrix=matrix_plo(ispin)%matrix, template=matrix_s(1)%matrix)
1407 CALL dbcsr_set(matrix_plo(ispin)%matrix, 0.0_dp)
1411 IF (do_coulomb)
THEN
1413 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1416 DO jspin = 1, nspins
1417 ctjspin => work%ctransformed(jspin)
1419 CALL cp_fm_get_info(ctjspin, matrix_struct=fmstructjspin, nrow_global=nsgf)
1428 DO is = first_sgf(ia), last_sgf(ia)
1429 tcharge(ia) = tcharge(ia) + tv(is)
1439 NULLIFY (gamma_matrix)
1440 CALL setup_gamma(qs_env, stda_env, sub_env, gamma_matrix, ndim=4)
1441 tempmat => gamma_matrix(1)%matrix
1445 gtcharge(iatom, 1) = gtcharge(iatom, 1) + gab(1, 1)*tcharge(jatom)
1446 IF (iatom /= jatom)
THEN
1447 gtcharge(jatom, 1) = gtcharge(jatom, 1) + gab(1, 1)*tcharge(iatom)
1452 row=iatom, col=jatom, block=gab, found=found)
1454 gtcharge(iatom, idimk) = gtcharge(iatom, idimk) + gab(1, 1)*tcharge(jatom)
1455 IF (iatom /= jatom)
THEN
1456 gtcharge(jatom, idimk) = gtcharge(jatom, idimk) + fdim*gab(1, 1)*tcharge(iatom)
1465 ewald_env => work%ewald_env
1466 ewald_pw => work%ewald_pw
1467 CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type)
1468 CALL get_qs_env(qs_env=qs_env, sab_orb=n_list, virial=virial)
1469 use_virial = .false.
1470 calculate_forces = .false.
1471 CALL tb_ewald_overlap(gtcharge, tcharge, alpha, n_list, virial, use_virial)
1473 gtcharge, tcharge, calculate_forces, virial, use_virial)
1475 IF (para_env%is_source())
THEN
1476 gtcharge(:, 1) = gtcharge(:, 1) - 2._dp*alpha*
oorootpi*tcharge(:)
1479 nlim =
get_limit(natom, para_env%num_pe, para_env%mepos)
1480 DO iatom = nlim(1), nlim(2)
1481 DO jatom = 1, iatom - 1
1482 rij = particle_set(iatom)%r - particle_set(jatom)%r
1483 rij =
pbc(rij, cell)
1484 dr = sqrt(sum(rij(:)**2))
1485 IF (dr > 1.e-6_dp)
THEN
1486 gtcharge(iatom, 1) = gtcharge(iatom, 1) + tcharge(jatom)/dr
1487 gtcharge(jatom, 1) = gtcharge(jatom, 1) + tcharge(iatom)/dr
1489 gtcharge(iatom, idimk) = gtcharge(iatom, idimk) + rij(idimk - 1)*tcharge(jatom)/dr**3
1490 gtcharge(jatom, idimk) = gtcharge(jatom, idimk) - rij(idimk - 1)*tcharge(iatom)/dr**3
1496 CALL para_env%sum(gtcharge(:, 1))
1501 DO is = first_sgf(ia), last_sgf(ia)
1502 tv(is) = gtcharge(ia, 1)
1507 ikind = kind_of(iatom)
1508 atom_i = atom_of_kind(iatom)
1510 fij(i) = spinfac*spinfac*gtcharge(iatom, i + 1)*tcharge(iatom)
1512 force(ikind)%rho_elec(1, atom_i) = force(ikind)%rho_elec(1, atom_i) - fij(1)
1513 force(ikind)%rho_elec(2, atom_i) = force(ikind)%rho_elec(2, atom_i) - fij(2)
1514 force(ikind)%rho_elec(3, atom_i) = force(ikind)%rho_elec(3, atom_i) - fij(3)
1517 IF (debug_forces)
THEN
1518 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1519 CALL para_env%sum(fodeb)
1520 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Coul[X] ", fodeb
1522 norb = nactive(ispin)
1524 CALL cp_fm_get_info(work%S_C0_C0T(ispin), matrix_struct=fmstruct)
1525 CALL cp_fm_create(t0matrix, matrix_struct=fmstruct, name=
"T0 SCRATCH")
1526 CALL cp_fm_create(t1matrix, matrix_struct=fmstruct, name=
"T1 SCRATCH")
1531 ct => work%ctransformed(ispin)
1534 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1535 cvec, 0.0_dp, ucmatrix)
1536 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1537 x(ispin), 0.0_dp, uxmatrix)
1538 CALL parallel_gemm(
'N',
'T', nsgf, nsgf, norb, 1.0_dp, uxmatrix, ucmatrix, 0.0_dp, t0matrix)
1541 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1542 cvec, 0.0_dp, uxmatrix)
1543 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1544 gs_mos(ispin)%mos_occ, 0.0_dp, ucmatrix)
1545 CALL parallel_gemm(
'N',
'T', nsgf, nsgf, norb, 1.0_dp, ucmatrix, uxmatrix, 1.0_dp, t0matrix)
1548 CALL parallel_gemm(
'N',
'N', nsgf, nsgf, nsgf, spinfac, work%S_eigenvectors, t1matrix, &
1551 matrix_g=work%S_eigenvectors, ncol=nsgf, alpha=2.0_dp, symmetry_mode=1)
1553 DEALLOCATE (ucmatrix)
1555 DEALLOCATE (uxmatrix)
1564 ct => work%ctransformed(ispin)
1568 CALL cp_fm_get_info(cvec, matrix_struct=fmstruct, nrow_global=nao)
1572 ncol_global=norb, para_env=fmstruct%para_env)
1575 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, gs_mos(ispin)%mos_occ, vcvec, 0.0_dp, cvcmat)
1576 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, x(ispin), cvcmat, 0.0_dp, vcvec)
1578 nactive(ispin), alpha=-2.0_dp*spinfac, beta=1.0_dp)
1582 matrix_g=vcvec, ncol=norb, alpha=2.0_dp*alpha, symmetry_mode=1)
1589 IF (stda_env%do_exchange)
THEN
1591 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1593 norb = nactive(ispin)
1595 tempmat => work%shalf
1596 CALL dbcsr_create(pdens, template=tempmat, matrix_type=dbcsr_type_no_symmetry)
1598 ct => work%ctransformed(ispin)
1601 1.0_dp, keep_sparsity=.false.)
1605 bp = stda_env%beta_param
1606 hfx = stda_env%hfx_fraction
1610 rij = particle_set(iatom)%r - particle_set(jatom)%r
1611 rij =
pbc(rij, cell)
1612 dr = sqrt(sum(rij(:)**2))
1613 ikind = kind_of(iatom)
1614 jkind = kind_of(jatom)
1615 eta = (stda_env%kind_param_set(ikind)%kind_param%hardness_param + &
1616 stda_env%kind_param_set(jkind)%kind_param%hardness_param)/2.0_dp
1618 IF (hfx > 0.0_dp)
THEN
1619 gabr = (1._dp/(rbeta + (hfx*eta)**(-bp)))**(1._dp/bp)
1621 IF (dr < 1.0e-6_dp)
THEN
1629 IF (dr > 1.0e-6_dp)
THEN
1630 IF (hfx > 0.0_dp)
THEN
1631 dgabr = -(1._dp/bp)*(1._dp/(rbeta + (hfx*eta)**(-bp)))**(1._dp/bp + 1._dp)
1632 dgabr = bp*rbeta/dr**2*dgabr
1633 dgabr = sum(pblock**2)*dgabr
1635 dgabr = -1.0_dp/dr**3
1636 dgabr = sum(pblock**2)*dgabr
1638 atom_i = atom_of_kind(iatom)
1639 atom_j = atom_of_kind(jatom)
1641 fij(i) = dgabr*rij(i)
1643 force(ikind)%rho_elec(1, atom_i) = force(ikind)%rho_elec(1, atom_i) - fij(1)
1644 force(ikind)%rho_elec(2, atom_i) = force(ikind)%rho_elec(2, atom_i) - fij(2)
1645 force(ikind)%rho_elec(3, atom_i) = force(ikind)%rho_elec(3, atom_i) - fij(3)
1646 force(jkind)%rho_elec(1, atom_j) = force(jkind)%rho_elec(1, atom_j) + fij(1)
1647 force(jkind)%rho_elec(2, atom_j) = force(jkind)%rho_elec(2, atom_j) + fij(2)
1648 force(jkind)%rho_elec(3, atom_j) = force(jkind)%rho_elec(3, atom_j) + fij(3)
1651 pblock = gabr*pblock
1660 CALL cp_fm_get_info(work%S_C0_C0T(ispin), matrix_struct=fmstruct)
1661 CALL cp_fm_create(t0matrix, matrix_struct=fmstruct, name=
"T0 SCRATCH")
1662 CALL cp_fm_create(t1matrix, matrix_struct=fmstruct, name=
"T1 SCRATCH")
1667 ct => work%ctransformed(ispin)
1669 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1670 cvec, 0.0_dp, ucmatrix)
1671 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1672 x(ispin), 0.0_dp, uxmatrix)
1673 CALL parallel_gemm(
'N',
'T', nsgf, nsgf, norb, 1.0_dp, uxmatrix, ucmatrix, 0.0_dp, t0matrix)
1675 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1676 cvec, 0.0_dp, uxmatrix)
1677 CALL parallel_gemm(
'T',
'N', nsgf, norb, nsgf, 1.0_dp, work%S_eigenvectors, &
1678 gs_mos(ispin)%mos_occ, 0.0_dp, ucmatrix)
1679 CALL parallel_gemm(
'N',
'T', nsgf, nsgf, norb, 1.0_dp, ucmatrix, uxmatrix, 1.0_dp, t0matrix)
1681 CALL parallel_gemm(
'N',
'N', nsgf, nsgf, nsgf, -1.0_dp, work%S_eigenvectors, t1matrix, &
1684 matrix_g=work%S_eigenvectors, ncol=nsgf, alpha=2.0_dp, symmetry_mode=1)
1686 DEALLOCATE (ucmatrix)
1688 DEALLOCATE (uxmatrix)
1696 alpha=-xfac, beta=1.0_dp)
1698 CALL cp_fm_get_info(cvec, matrix_struct=fmstruct, nrow_global=nao)
1704 ncol_global=norb, para_env=fmstruct%para_env)
1707 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, gs_mos(ispin)%mos_occ, vcvec, 0.0_dp, cvcmat)
1708 CALL parallel_gemm(
"N",
"N", nao, norb, norb, 1.0_dp, x(ispin), cvcmat, 0.0_dp, vcvec)
1710 norb, alpha=xfac, beta=1.0_dp)
1712 IF (nspins == 2)
THEN
1719 ncol=norb, alpha=2.0_dp*alpha, symmetry_mode=1)
1726 IF (debug_forces)
THEN
1727 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1728 CALL para_env%sum(fodeb)
1729 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Exch[X] ", fodeb
1739 DEALLOCATE (tcharge, gtcharge)
1740 DEALLOCATE (first_sgf, last_sgf)
1743 IF (nspins == 2)
THEN
1744 CALL dbcsr_add(matrix_plo(1)%matrix, matrix_plo(2)%matrix, &
1745 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
1749 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
1751 matrix_name=
"OVERLAP MATRIX", &
1752 basis_type_a=
"ORB", basis_type_b=
"ORB", &
1753 sab_nl=sab_orb, calculate_forces=.true., &
1754 matrix_p=matrix_plo(1)%matrix)
1757 IF (debug_forces)
THEN
1758 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
1759 CALL para_env%sum(fodeb)
1760 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Lowdin ", fodeb
1764 ex_env%matrix_wx1 => matrix_wx1
1766 CALL timestop(handle)