209#include "./base/base_uses.f90"
217 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'energy_corrections'
238 LOGICAL,
INTENT(IN),
OPTIONAL :: ec_init, calculate_forces
240 CHARACTER(len=*),
PARAMETER :: routinen =
'energy_correction'
242 INTEGER :: handle, unit_nr
243 LOGICAL :: my_calc_forces
249 CALL timeset(routinen, handle)
259 IF (.NOT. ec_env%do_skip)
THEN
261 ec_env%should_update = .true.
262 IF (
PRESENT(ec_init)) ec_env%should_update = ec_init
264 my_calc_forces = .false.
265 IF (
PRESENT(calculate_forces)) my_calc_forces = calculate_forces
267 IF (ec_env%should_update)
THEN
268 ec_env%old_etotal = 0.0_dp
269 ec_env%etotal = 0.0_dp
270 ec_env%eband = 0.0_dp
271 ec_env%ehartree = 0.0_dp
275 ec_env%edispersion = 0.0_dp
276 ec_env%exc_aux_fit = 0.0_dp
279 ec_env%ehartree_1c = 0.0_dp
280 ec_env%exc1_aux_fit = 0.0_dp
284 ec_env%old_etotal = energy%total
288 IF (my_calc_forces)
THEN
289 IF (unit_nr > 0)
THEN
290 WRITE (unit_nr,
'(T2,A,A,A,A,A)')
"!", repeat(
"-", 25), &
291 " Energy Correction Forces ", repeat(
"-", 26),
"!"
293 CALL get_qs_env(qs_env, force=ks_force, virial=virial)
297 IF (unit_nr > 0)
THEN
298 WRITE (unit_nr,
'(T2,A,A,A,A,A)')
"!", repeat(
"-", 29), &
299 " Energy Correction ", repeat(
"-", 29),
"!"
304 CALL energy_correction_low(qs_env, ec_env, my_calc_forces, unit_nr)
307 IF (ec_env%should_update)
THEN
308 energy%nonscf_correction = ec_env%etotal - ec_env%old_etotal
309 energy%total = ec_env%etotal
312 IF (.NOT. my_calc_forces .AND. unit_nr > 0)
THEN
313 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Energy Correction ", energy%nonscf_correction
315 IF (unit_nr > 0)
THEN
316 WRITE (unit_nr,
'(T2,A,A,A)')
"!", repeat(
"-", 77),
"!"
323 IF (unit_nr > 0)
THEN
324 WRITE (unit_nr,
'(T2,A,A,A)')
"!", repeat(
"-", 77),
"!"
325 WRITE (unit_nr,
'(T2,A,A,A,A,A)')
"!", repeat(
"-", 26), &
326 " Skip Energy Correction ", repeat(
"-", 27),
"!"
327 WRITE (unit_nr,
'(T2,A,A,A)')
"!", repeat(
"-", 77),
"!"
332 CALL timestop(handle)
347 SUBROUTINE energy_correction_low(qs_env, ec_env, calculate_forces, unit_nr)
350 LOGICAL,
INTENT(IN) :: calculate_forces
351 INTEGER,
INTENT(IN) :: unit_nr
353 INTEGER :: ispin, nkind, nspins
354 LOGICAL :: debug_f, gapw, gapw_xc
355 REAL(kind=
dp) :: eps_fit, exc
363 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
365 IF (ec_env%should_update)
THEN
366 CALL ec_build_neighborlist(qs_env, ec_env)
372 ec_env%vtau_rspace, &
373 ec_env%vadmm_rspace, &
374 ec_env%ehartree, exc)
376 ec_env%local_rho_set_admm, ec_env%vh_rspace)
378 SELECT CASE (ec_env%energy_functional)
381 CALL ec_build_core_hamiltonian(qs_env, ec_env)
382 CALL ec_build_ks_matrix(qs_env, ec_env)
385 cpassert(.NOT. ec_env%do_kpoints)
388 NULLIFY (ec_env%mao_coef)
389 CALL mao_generate_basis(qs_env, ec_env%mao_coef, ref_basis_set=
"HARRIS", molecular=.true., &
390 max_iter=ec_env%mao_max_iter, eps_grad=ec_env%mao_eps_grad, &
391 eps1_mao=ec_env%mao_eps1, iolevel=ec_env%mao_iolevel, unit_nr=unit_nr)
394 CALL ec_ks_solver(qs_env, ec_env)
396 CALL evaluate_ec_core_matrix_traces(qs_env, ec_env)
398 IF (ec_env%write_harris_wfn)
THEN
399 CALL harris_wfn_output(qs_env, ec_env, unit_nr)
403 cpassert(.NOT. ec_env%do_kpoints)
406 CALL ec_dc_energy(qs_env, ec_env, calculate_forces=.false.)
411 CALL ec_build_ks_matrix(qs_env, ec_env)
414 cpassert(.NOT. ec_env%do_kpoints)
419 cpabort(
"unknown energy correction")
423 CALL ec_disp(qs_env, ec_env, calculate_forces=.false.)
426 CALL ec_energy(ec_env, unit_nr)
430 IF (calculate_forces)
THEN
432 debug_f = ec_env%debug_forces .OR. ec_env%debug_stress
434 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
435 nspins = dft_control%nspins
436 gapw = dft_control%qs_control%gapw
437 gapw_xc = dft_control%qs_control%gapw_xc
438 IF (gapw .OR. gapw_xc)
THEN
440 qs_kind_set=qs_kind_set, particle_set=particle_set)
441 NULLIFY (oce, sap_oce)
442 CALL get_qs_env(qs_env=qs_env, oce=oce, sap_oce=sap_oce)
445 eps_fit = dft_control%qs_control%gapw_control%eps_fit
451 CALL ec_disp(qs_env, ec_env, calculate_forces=.true.)
453 SELECT CASE (ec_env%energy_functional)
456 CALL ec_build_core_hamiltonian_force(qs_env, ec_env, &
460 CALL ec_build_ks_matrix_force(qs_env, ec_env)
461 IF (ec_env%debug_external)
THEN
462 CALL write_response_interface(qs_env, ec_env)
463 CALL init_response_deriv(qs_env, ec_env)
468 cpassert(.NOT. ec_env%do_kpoints)
471 CALL ec_dc_energy(qs_env, ec_env, calculate_forces=.true.)
473 CALL ec_build_core_hamiltonian_force(qs_env, ec_env, &
477 CALL ec_dc_build_ks_matrix_force(qs_env, ec_env)
478 IF (ec_env%debug_external)
THEN
479 CALL write_response_interface(qs_env, ec_env)
480 CALL init_response_deriv(qs_env, ec_env)
485 cpassert(.NOT. ec_env%do_kpoints)
487 CALL init_response_deriv(qs_env, ec_env)
490 ec_env%matrix_w(1, 1)%matrix, unit_nr, &
491 ec_env%debug_forces, ec_env%debug_stress)
494 cpabort(
"unknown energy correction")
497 IF (ec_env%do_error)
THEN
498 ALLOCATE (ec_env%cpref(nspins))
500 CALL cp_fm_create(ec_env%cpref(ispin), ec_env%cpmos(ispin)%matrix_struct)
501 CALL cp_fm_to_fm(ec_env%cpmos(ispin), ec_env%cpref(ispin))
511 cpassert(
ASSOCIATED(pw_env))
512 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
513 ALLOCATE (ec_env%rhoz_r(nspins))
515 CALL auxbas_pw_pool%create_pw(ec_env%rhoz_r(ispin))
519 vh_rspace=ec_env%vh_rspace, &
520 vxc_rspace=ec_env%vxc_rspace, &
521 vtau_rspace=ec_env%vtau_rspace, &
522 vadmm_rspace=ec_env%vadmm_rspace, &
523 matrix_hz=ec_env%matrix_hz, &
524 matrix_pz=ec_env%matrix_z, &
525 matrix_pz_admm=ec_env%z_admm, &
526 matrix_wz=ec_env%matrix_wz, &
527 rhopz_r=ec_env%rhoz_r, &
528 zehartree=ec_env%ehartree, &
530 zexc_aux_fit=ec_env%exc_aux_fit, &
531 p_env=ec_env%p_env, &
534 CALL output_response_deriv(qs_env, ec_env, unit_nr)
536 CALL ec_properties(qs_env, ec_env)
538 IF (ec_env%do_error)
THEN
539 CALL response_force_error(qs_env, ec_env, unit_nr)
543 IF (
ASSOCIATED(ec_env%rhoout_r))
THEN
545 CALL auxbas_pw_pool%give_back_pw(ec_env%rhoout_r(ispin))
547 DEALLOCATE (ec_env%rhoout_r)
549 IF (
ASSOCIATED(ec_env%rhoz_r))
THEN
551 CALL auxbas_pw_pool%give_back_pw(ec_env%rhoz_r(ispin))
553 DEALLOCATE (ec_env%rhoz_r)
569 END SUBROUTINE energy_correction_low
577 SUBROUTINE write_response_interface(qs_env, ec_env)
584 NULLIFY (trexio_section)
588 CALL write_trexio(qs_env, trexio_section, ec_env%matrix_hz)
590 END SUBROUTINE write_response_interface
598 SUBROUTINE init_response_deriv(qs_env, ec_env)
608 ALLOCATE (ec_env%rf(3, natom))
611 CALL get_qs_env(qs_env, force=force, virial=virial)
613 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
616 IF (virial%pv_availability .AND. (.NOT. virial%pv_numer))
THEN
617 ec_env%rpv = virial%pv_virial
620 END SUBROUTINE init_response_deriv
629 SUBROUTINE output_response_deriv(qs_env, ec_env, unit_nr)
632 INTEGER,
INTENT(IN) :: unit_nr
634 CHARACTER(LEN=default_string_length) :: unit_string
635 INTEGER :: funit, ia, natom
636 REAL(kind=
dp) :: evol, fconv
637 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot
645 IF (
ASSOCIATED(ec_env%rf))
THEN
647 ALLOCATE (ftot(3, natom))
649 CALL get_qs_env(qs_env, force=force, virial=virial, para_env=para_env)
651 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
653 ec_env%rf(1:3, 1:natom) = ftot(1:3, 1:natom) - ec_env%rf(1:3, 1:natom)
654 CALL para_env%sum(ec_env%rf)
657 IF (virial%pv_availability .AND. (.NOT. virial%pv_numer))
THEN
658 ec_env%rpv = virial%pv_virial - ec_env%rpv
659 CALL para_env%sum(ec_env%rpv)
661 evol = ec_env%exc + ec_env%exc_aux_fit + 2.0_dp*ec_env%ehartree
662 ec_env%rpv(1, 1) = ec_env%rpv(1, 1) - evol
663 ec_env%rpv(2, 2) = ec_env%rpv(2, 2) - evol
664 ec_env%rpv(3, 3) = ec_env%rpv(3, 3) - evol
667 CALL get_qs_env(qs_env, particle_set=particle_set, cell=cell)
671 IF (unit_nr > 0)
THEN
672 WRITE (unit_nr,
'(/,T2,A)')
"Write EXTERNAL Response Derivative: "//trim(ec_env%exresult_fn)
674 CALL open_file(ec_env%exresult_fn, file_status=
"REPLACE", file_form=
"FORMATTED", &
675 file_action=
"WRITE", unit_number=funit)
676 WRITE (funit,
"(T8,A,T58,A)")
"COORDINATES [Bohr]",
"RESPONSE FORCES [Hartree/Bohr]"
678 WRITE (funit,
"(2(3F15.8,5x))") particle_set(ia)%r(1:3), ec_env%rf(1:3, ia)
681 WRITE (funit,
"(T8,A,T58,A)")
"CELL [Bohr]",
"RESPONSE PRESSURE [GPa]"
683 WRITE (funit,
"(3F15.8,5x,3F15.8)") cell%hmat(ia, 1:3), -fconv*ec_env%rpv(ia, 1:3)
690 END SUBROUTINE output_response_deriv
699 SUBROUTINE evaluate_ec_core_matrix_traces(qs_env, ec_env)
703 CHARACTER(LEN=*),
PARAMETER :: routinen =
'evaluate_ec_core_matrix_traces'
709 CALL timeset(routinen, handle)
712 CALL get_qs_env(qs_env, dft_control=dft_control, energy=energy)
715 CALL calculate_ptrace(ec_env%matrix_h, ec_env%matrix_p, energy%core, dft_control%nspins)
718 CALL calculate_ptrace(ec_env%matrix_t, ec_env%matrix_p, energy%kinetic, dft_control%nspins)
720 CALL timestop(handle)
722 END SUBROUTINE evaluate_ec_core_matrix_traces
735 SUBROUTINE ec_dc_energy(qs_env, ec_env, calculate_forces)
738 LOGICAL,
INTENT(IN) :: calculate_forces
740 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_dc_energy'
742 CHARACTER(LEN=default_string_length) :: headline
743 INTEGER :: handle, ispin, nspins
744 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, matrix_s, matrix_w
750 CALL timeset(routinen, handle)
752 NULLIFY (dft_control, ks_env, matrix_h, matrix_p, matrix_s, matrix_w, rho)
754 dft_control=dft_control, &
756 matrix_h_kp=matrix_h, &
757 matrix_s_kp=matrix_s, &
758 matrix_w_kp=matrix_w, &
761 nspins = dft_control%nspins
766 matrix_name=
"OVERLAP MATRIX", &
767 basis_type_a=
"HARRIS", &
768 basis_type_b=
"HARRIS", &
769 sab_nl=ec_env%sab_orb)
774 headline =
"CORE HAMILTONIAN MATRIX"
775 ALLOCATE (ec_env%matrix_h(1, 1)%matrix)
776 CALL dbcsr_create(ec_env%matrix_h(1, 1)%matrix, name=trim(headline), &
777 template=matrix_s(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
779 CALL dbcsr_copy(ec_env%matrix_h(1, 1)%matrix, matrix_h(1, 1)%matrix)
784 headline =
"DENSITY MATRIX"
786 ALLOCATE (ec_env%matrix_p(ispin, 1)%matrix)
787 CALL dbcsr_create(ec_env%matrix_p(ispin, 1)%matrix, name=trim(headline), &
788 template=matrix_s(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
790 CALL dbcsr_copy(ec_env%matrix_p(ispin, 1)%matrix, matrix_p(ispin, 1)%matrix)
793 IF (calculate_forces)
THEN
798 headline =
"ENERGY-WEIGHTED DENSITY MATRIX"
800 ALLOCATE (ec_env%matrix_w(ispin, 1)%matrix)
801 CALL dbcsr_create(ec_env%matrix_w(ispin, 1)%matrix, name=trim(headline), &
802 template=matrix_s(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
804 CALL dbcsr_copy(ec_env%matrix_w(ispin, 1)%matrix, matrix_w(ispin, 1)%matrix)
811 ec_env%ekTS = energy%ktS
814 ec_env%efield_nuclear = 0.0_dp
815 ec_env%efield_elec = 0.0_dp
818 CALL timestop(handle)
820 END SUBROUTINE ec_dc_energy
831 SUBROUTINE ec_dc_build_ks_matrix_force(qs_env, ec_env)
835 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_dc_build_ks_matrix_force'
837 CHARACTER(LEN=default_string_length) :: basis_type, unit_string
838 INTEGER :: handle, i, iounit, ispin, natom, nspins
839 LOGICAL :: debug_forces, debug_stress, do_ec_hfx, &
840 gapw, gapw_xc, use_virial
841 REAL(
dp) :: dummy_real, dummy_real2(2), ehartree, &
842 ehartree_1c, eovrl, exc, exc1, fconv
843 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot
844 REAL(
dp),
DIMENSION(3) :: fodeb, fodeb2
845 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot
849 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, scrm
850 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p
864 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, v_rspace, v_rspace_in, &
867 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
869 TYPE(
qs_rho_type),
POINTER :: rho, rho1, rho_struct, rho_xc
874 CALL timeset(routinen, handle)
876 debug_forces = ec_env%debug_forces
877 debug_stress = ec_env%debug_stress
881 NULLIFY (atomic_kind_set, cell, dft_control, force, ks_env, &
882 matrix_p, matrix_s, para_env, pw_env, rho, sab_orb, virial)
885 dft_control=dft_control, &
894 cpassert(
ASSOCIATED(pw_env))
896 nspins = dft_control%nspins
897 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
899 fconv = 1.0e-9_dp*
pascal/cell%deth
900 IF (debug_stress .AND. use_virial)
THEN
901 sttot = virial%pv_virial
905 gapw = dft_control%qs_control%gapw
906 gapw_xc = dft_control%qs_control%gapw_xc
908 cpassert(
ASSOCIATED(rho_xc))
910 IF (gapw .OR. gapw_xc)
THEN
912 cpabort(
"DC-DFT + GAPW + Stress NYA")
919 NULLIFY (hartree_local, local_rho_set)
920 IF (gapw .OR. gapw_xc)
THEN
922 atomic_kind_set=atomic_kind_set, &
923 qs_kind_set=qs_kind_set)
926 qs_kind_set, dft_control, para_env)
929 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control)
935 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
937 qs_kind_set, oce, sab_orb, para_env)
941 NULLIFY (auxbas_pw_pool, poisson_env)
943 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
944 poisson_env=poisson_env)
947 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
948 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
949 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
958 h_stress(:, :) = 0.0_dp
960 density=rho_tot_gspace, &
962 vhartree=v_hartree_gspace, &
965 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe,
dp)
966 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe,
dp)
968 IF (debug_stress)
THEN
969 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
970 CALL para_env%sum(stdeb)
971 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
980 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
981 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
985 ALLOCATE (ec_env%rhoout_r(nspins))
987 CALL auxbas_pw_pool%create_pw(ec_env%rhoout_r(ispin))
988 CALL pw_copy(rho_r(ispin), ec_env%rhoout_r(ispin))
993 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
994 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
995 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env)
996 IF (debug_forces)
THEN
997 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
998 CALL para_env%sum(fodeb)
999 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vtot*dncore", fodeb
1001 IF (debug_stress .AND. use_virial)
THEN
1002 stdeb = fconv*(virial%pv_ehartree - stdeb)
1003 CALL para_env%sum(stdeb)
1004 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1010 NULLIFY (v_rspace, v_tau_rspace)
1013 IF (use_virial) virial%pv_calculate = .true.
1017 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_struct)
1019 CALL get_qs_env(qs_env=qs_env, rho=rho_struct)
1021 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=ec_env%xc_section, &
1022 vxc_rho=v_rspace, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
1024 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1025 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1030 IF (debug_forces)
THEN
1031 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1032 CALL para_env%sum(fodeb)
1033 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Fxc*dw ", fodeb
1035 IF (debug_stress .AND. use_virial)
THEN
1036 stdeb = fconv*(virial%pv_virial - stdeb)
1037 CALL para_env%sum(stdeb)
1038 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1042 IF (.NOT.
ASSOCIATED(v_rspace))
THEN
1043 ALLOCATE (v_rspace(nspins))
1044 DO ispin = 1, nspins
1045 CALL auxbas_pw_pool%create_pw(v_rspace(ispin))
1050 IF (use_virial)
THEN
1051 virial%pv_exc = virial%pv_exc - virial%pv_xc
1052 virial%pv_virial = virial%pv_virial - virial%pv_xc
1059 DO ispin = 1, nspins
1060 ALLOCATE (scrm(ispin)%matrix)
1061 CALL dbcsr_create(scrm(ispin)%matrix, template=ec_env%matrix_ks(ispin, 1)%matrix)
1062 CALL dbcsr_copy(scrm(ispin)%matrix, ec_env%matrix_ks(ispin, 1)%matrix)
1063 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1066 pw_grid => v_hartree_rspace%pw_grid
1067 ALLOCATE (v_rspace_in(nspins))
1068 DO ispin = 1, nspins
1069 CALL v_rspace_in(ispin)%create(pw_grid)
1073 DO ispin = 1, nspins
1075 CALL pw_transfer(ec_env%vxc_rspace(ispin), v_rspace_in(ispin))
1076 IF (.NOT. gapw_xc)
THEN
1080 CALL pw_axpy(ec_env%vh_rspace, v_rspace_in(ispin))
1090 IF ((gapw .OR. gapw_xc) .AND. ec_env%do_ec_admm)
THEN
1094 cpabort(
"GAPW HFX ADMM + Energy Correction NYA")
1098 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
1099 IF (debug_forces) fodeb2(1:3) = force(1)%overlap_admm(1:3, 1)
1106 hfx_sections=ec_hfx_sections, &
1107 x_data=ec_env%x_data, &
1109 do_admm=ec_env%do_ec_admm, &
1110 calc_forces=.true., &
1111 reuse_hfx=ec_env%reuse_hfx, &
1112 do_im_time=.false., &
1113 e_ex_from_gw=dummy_real, &
1114 e_admm_from_gw=dummy_real2, &
1117 IF (debug_forces)
THEN
1118 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
1119 CALL para_env%sum(fodeb)
1120 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*hfx_DC ", fodeb
1122 fodeb2(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb2(1:3)
1123 CALL para_env%sum(fodeb2)
1124 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*hfx_DC*S ", fodeb2
1126 IF (debug_stress .AND. use_virial)
THEN
1127 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
1128 CALL para_env%sum(stdeb)
1129 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1137 IF (use_virial)
THEN
1138 pv_loc = virial%pv_virial
1141 basis_type =
"HARRIS"
1142 IF (gapw .OR. gapw_xc)
THEN
1143 task_list => ec_env%task_list_soft
1145 task_list => ec_env%task_list
1148 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1149 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1151 DO ispin = 1, nspins
1153 CALL pw_scale(v_rspace(ispin), v_rspace(ispin)%pw_grid%dvol)
1156 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
1158 pmat=matrix_p(ispin, 1), &
1160 calculate_forces=.true., &
1161 basis_type=basis_type, &
1162 task_list_external=task_list)
1164 CALL integrate_v_rspace(v_rspace=v_hartree_rspace, &
1166 pmat=matrix_p(ispin, 1), &
1168 calculate_forces=.true., &
1169 basis_type=basis_type, &
1170 task_list_external=ec_env%task_list)
1172 CALL pw_axpy(v_hartree_rspace, v_rspace(ispin))
1174 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
1176 pmat=matrix_p(ispin, 1), &
1178 calculate_forces=.true., &
1179 basis_type=basis_type, &
1180 task_list_external=task_list)
1184 IF (debug_forces)
THEN
1185 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1186 CALL para_env%sum(fodeb)
1187 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dVhxc ", fodeb
1189 IF (debug_stress .AND. use_virial)
THEN
1190 stdeb = fconv*(virial%pv_virial - stdeb)
1191 CALL para_env%sum(stdeb)
1192 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1196 IF (
ASSOCIATED(v_tau_rspace))
THEN
1197 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1198 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1199 DO ispin = 1, nspins
1200 CALL pw_scale(v_tau_rspace(ispin), v_tau_rspace(ispin)%pw_grid%dvol)
1202 CALL integrate_v_rspace(v_rspace=v_tau_rspace(ispin), &
1204 pmat=matrix_p(ispin, 1), &
1206 calculate_forces=.true., &
1207 compute_tau=.true., &
1208 basis_type=basis_type, &
1209 task_list_external=task_list)
1212 IF (debug_forces)
THEN
1213 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1214 CALL para_env%sum(fodeb)
1215 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dVhxc_tau ", fodeb
1217 IF (debug_stress .AND. use_virial)
THEN
1218 stdeb = fconv*(virial%pv_virial - stdeb)
1219 CALL para_env%sum(stdeb)
1220 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1225 IF (gapw .OR. gapw_xc)
THEN
1228 rho_atom_set_external=local_rho_set%rho_atom_set, &
1229 xc_section_external=ec_env%xc_section)
1232 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1234 calculate_forces=.true., local_rho_set=local_rho_set)
1235 IF (debug_forces)
THEN
1236 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1237 CALL para_env%sum(fodeb)
1238 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*g0s_Vh_elec ", fodeb
1240 ehartree_1c = 0.0_dp
1241 CALL vh_1c_gg_integrals(qs_env, ehartree_1c, hartree_local%ecoul_1c, local_rho_set, &
1242 para_env, tddft=.false., core_2nd=.false.)
1245 IF (gapw .OR. gapw_xc)
THEN
1247 IF (debug_forces) fodeb(1:3) = force(1)%vhxc_atom(1:3, 1)
1249 rho_atom_external=local_rho_set%rho_atom_set)
1250 IF (debug_forces)
THEN
1251 fodeb(1:3) = force(1)%vhxc_atom(1:3, 1) - fodeb(1:3)
1252 CALL para_env%sum(fodeb)
1253 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P*vhxc_atom ", fodeb
1258 IF (use_virial)
THEN
1259 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1278 NULLIFY (ec_env%matrix_hz)
1280 DO ispin = 1, nspins
1281 ALLOCATE (ec_env%matrix_hz(ispin)%matrix)
1282 CALL dbcsr_create(ec_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
1283 CALL dbcsr_copy(ec_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
1284 CALL dbcsr_set(ec_env%matrix_hz(ispin)%matrix, 0.0_dp)
1287 DO ispin = 1, nspins
1290 CALL pw_axpy(v_rspace_in(ispin), v_rspace(ispin), -1.0_dp)
1293 DO ispin = 1, nspins
1294 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
1295 hmat=ec_env%matrix_hz(ispin), &
1296 pmat=matrix_p(ispin, 1), &
1298 calculate_forces=.false., &
1299 basis_type=basis_type, &
1300 task_list_external=task_list)
1304 IF (dft_control%use_kinetic_energy_density)
THEN
1307 IF (.NOT.
ASSOCIATED(v_tau_rspace))
THEN
1308 ALLOCATE (v_tau_rspace(nspins))
1309 DO ispin = 1, nspins
1310 CALL auxbas_pw_pool%create_pw(v_tau_rspace(ispin))
1311 CALL pw_zero(v_tau_rspace(ispin))
1315 DO ispin = 1, nspins
1317 IF (
ASSOCIATED(ec_env%vtau_rspace))
THEN
1318 CALL pw_axpy(ec_env%vtau_rspace(ispin), v_tau_rspace(ispin), -1.0_dp)
1321 CALL integrate_v_rspace(v_rspace=v_tau_rspace(ispin), &
1322 hmat=ec_env%matrix_hz(ispin), &
1323 pmat=matrix_p(ispin, 1), &
1325 calculate_forces=.false., compute_tau=.true., &
1326 basis_type=basis_type, &
1327 task_list_external=task_list)
1331 IF (gapw .OR. gapw_xc)
THEN
1334 CALL update_ks_atom(qs_env, ec_env%matrix_hz, matrix_p, .false., &
1335 rho_atom_external=local_rho_set%rho_atom_set, kintegral=1.0_dp)
1337 CALL update_ks_atom(qs_env, ec_env%matrix_hz, matrix_p, .false., &
1338 rho_atom_external=ec_env%local_rho_set%rho_atom_set, kintegral=-1.0_dp)
1345 ext_hfx_section=ec_hfx_sections, &
1346 x_data=ec_env%x_data, &
1347 recalc_integrals=.false., &
1348 do_admm=ec_env%do_ec_admm, &
1351 reuse_hfx=ec_env%reuse_hfx)
1354 IF (debug_forces) fodeb(1:3) = force(1)%core_overlap(1:3, 1)
1355 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ecore_overlap
1357 IF (debug_forces)
THEN
1358 fodeb(1:3) = force(1)%core_overlap(1:3, 1) - fodeb(1:3)
1359 CALL para_env%sum(fodeb)
1360 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: CoreOverlap", fodeb
1362 IF (debug_stress .AND. use_virial)
THEN
1363 stdeb = fconv*(stdeb - virial%pv_ecore_overlap)
1364 CALL para_env%sum(stdeb)
1365 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1369 IF (debug_forces)
THEN
1370 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
1371 ALLOCATE (ftot(3, natom))
1373 fodeb(1:3) = ftot(1:3, 1)
1375 CALL para_env%sum(fodeb)
1376 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Force Explicit", fodeb
1380 IF (gapw .OR. gapw_xc)
THEN
1388 DO ispin = 1, nspins
1389 CALL auxbas_pw_pool%give_back_pw(v_rspace(ispin))
1390 CALL auxbas_pw_pool%give_back_pw(v_rspace_in(ispin))
1391 IF (
ASSOCIATED(v_tau_rspace))
THEN
1392 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
1396 DEALLOCATE (v_rspace, v_rspace_in)
1397 IF (
ASSOCIATED(v_tau_rspace))
DEALLOCATE (v_tau_rspace)
1399 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1400 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
1401 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
1405 IF (use_virial)
THEN
1406 IF (qs_env%energy_correction)
THEN
1407 ec_env%ehartree = ehartree
1412 IF (debug_stress .AND. use_virial)
THEN
1414 stdeb = -1.0_dp*fconv*ehartree
1415 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1418 stdeb = -1.0_dp*fconv*exc
1419 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1428 CALL para_env%sum(virdeb%pv_overlap)
1429 CALL para_env%sum(virdeb%pv_ekinetic)
1430 CALL para_env%sum(virdeb%pv_ppl)
1431 CALL para_env%sum(virdeb%pv_ppnl)
1432 CALL para_env%sum(virdeb%pv_ecore_overlap)
1433 CALL para_env%sum(virdeb%pv_ehartree)
1434 CALL para_env%sum(virdeb%pv_exc)
1435 CALL para_env%sum(virdeb%pv_exx)
1436 CALL para_env%sum(virdeb%pv_vdw)
1437 CALL para_env%sum(virdeb%pv_mp2)
1438 CALL para_env%sum(virdeb%pv_nlcc)
1439 CALL para_env%sum(virdeb%pv_gapw)
1440 CALL para_env%sum(virdeb%pv_lrigpw)
1441 CALL para_env%sum(virdeb%pv_virial)
1446 virdeb%pv_ehartree(i, i) = virdeb%pv_ehartree(i, i) - 2.0_dp*ehartree
1447 virdeb%pv_virial(i, i) = virdeb%pv_virial(i, i) - exc &
1449 virdeb%pv_exc(i, i) = virdeb%pv_exc(i, i) - exc
1455 CALL para_env%sum(sttot)
1456 stdeb = fconv*(virdeb%pv_virial - sttot)
1457 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1460 stdeb = fconv*(virdeb%pv_virial)
1461 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1471 CALL timestop(handle)
1473 END SUBROUTINE ec_dc_build_ks_matrix_force
1481 SUBROUTINE ec_disp(qs_env, ec_env, calculate_forces)
1482 TYPE(qs_environment_type),
POINTER :: qs_env
1483 TYPE(energy_correction_type),
POINTER :: ec_env
1484 LOGICAL,
INTENT(IN) :: calculate_forces
1486 REAL(kind=dp) :: edisp, egcp
1489 CALL calculate_dispersion_pairpot(qs_env, ec_env%dispersion_env, edisp, calculate_forces)
1490 IF (.NOT. calculate_forces)
THEN
1491 ec_env%edispersion = ec_env%edispersion + edisp + egcp
1494 END SUBROUTINE ec_disp
1503 SUBROUTINE ec_build_core_hamiltonian(qs_env, ec_env)
1504 TYPE(qs_environment_type),
POINTER :: qs_env
1505 TYPE(energy_correction_type),
POINTER :: ec_env
1507 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_build_core_hamiltonian'
1509 CHARACTER(LEN=default_string_length) :: basis_type
1510 INTEGER :: handle, img, nder, nhfimg, nimages
1511 LOGICAL :: calculate_forces, use_virial
1512 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1513 TYPE(dbcsr_type),
POINTER :: smat
1514 TYPE(dft_control_type),
POINTER :: dft_control
1515 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1516 POINTER :: sab_orb, sac_ae, sac_ppl, sap_ppnl
1517 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1518 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1519 TYPE(qs_ks_env_type),
POINTER :: ks_env
1521 CALL timeset(routinen, handle)
1523 NULLIFY (atomic_kind_set, dft_control, ks_env, particle_set, &
1526 CALL get_qs_env(qs_env=qs_env, &
1527 atomic_kind_set=atomic_kind_set, &
1528 dft_control=dft_control, &
1529 particle_set=particle_set, &
1530 qs_kind_set=qs_kind_set, &
1534 nimages = dft_control%nimages
1535 IF (nimages /= 1)
THEN
1536 cpabort(
"K-points for Harris functional not implemented")
1540 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
1541 cpabort(
"Harris functional for GAPW not implemented")
1545 use_virial = .false.
1546 calculate_forces = .false.
1549 NULLIFY (sab_orb, sac_ae, sac_ppl, sap_ppnl)
1550 sab_orb => ec_env%sab_orb
1551 sac_ae => ec_env%sac_ae
1552 sac_ppl => ec_env%sac_ppl
1553 sap_ppnl => ec_env%sap_ppnl
1555 basis_type =
"HARRIS"
1559 CALL build_overlap_matrix(ks_env, matrixkp_s=ec_env%matrix_s, &
1560 matrix_name=
"OVERLAP MATRIX", &
1561 basis_type_a=basis_type, &
1562 basis_type_b=basis_type, &
1563 sab_nl=sab_orb, ext_kpoints=ec_env%kpoints)
1564 CALL build_kinetic_matrix(ks_env, matrixkp_t=ec_env%matrix_t, &
1565 matrix_name=
"KINETIC ENERGY MATRIX", &
1566 basis_type=basis_type, &
1567 sab_nl=sab_orb, ext_kpoints=ec_env%kpoints)
1570 nhfimg =
SIZE(ec_env%matrix_s, 2)
1571 CALL dbcsr_allocate_matrix_set(ec_env%matrix_h, 1, nhfimg)
1573 ALLOCATE (ec_env%matrix_h(1, img)%matrix)
1574 smat => ec_env%matrix_s(1, img)%matrix
1575 CALL dbcsr_create(ec_env%matrix_h(1, img)%matrix, template=smat)
1576 CALL cp_dbcsr_alloc_block_from_nbl(ec_env%matrix_h(1, img)%matrix, sab_orb)
1581 CALL dbcsr_copy(ec_env%matrix_h(1, img)%matrix, ec_env%matrix_t(1, img)%matrix, &
1582 keep_sparsity=.true., name=
"CORE HAMILTONIAN MATRIX")
1585 CALL core_matrices(qs_env, ec_env%matrix_h, ec_env%matrix_p, calculate_forces, nder, &
1586 ec_env=ec_env, ec_env_matrices=.true., ext_kpoints=ec_env%kpoints, &
1587 basis_type=basis_type)
1590 ec_env%efield_nuclear = 0.0_dp
1591 CALL ec_efield_local_operator(qs_env, ec_env, calculate_forces)
1593 CALL timestop(handle)
1595 END SUBROUTINE ec_build_core_hamiltonian
1606 SUBROUTINE ec_build_ks_matrix(qs_env, ec_env)
1607 TYPE(qs_environment_type),
POINTER :: qs_env
1608 TYPE(energy_correction_type),
POINTER :: ec_env
1610 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_build_ks_matrix'
1612 CHARACTER(LEN=default_string_length) :: headline
1613 INTEGER :: handle, img, iounit, ispin, natom, &
1614 nhfimg, nimages, nspins
1615 LOGICAL :: calculate_forces, &
1616 do_adiabatic_rescaling, do_ec_hfx, &
1617 gapw, gapw_xc, hfx_treat_lsd_in_core, &
1619 REAL(dp) :: dummy_real, dummy_real2(2), eexc, eh1c, &
1621 TYPE(admm_type),
POINTER :: admm_env
1622 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1623 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_mat, ps_mat
1624 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1625 TYPE(dbcsr_type),
POINTER :: smat
1626 TYPE(dft_control_type),
POINTER :: dft_control
1627 TYPE(hartree_local_type),
POINTER :: hartree_local
1628 TYPE(local_rho_type),
POINTER :: local_rho_set_ec
1629 TYPE(mp_para_env_type),
POINTER :: para_env
1630 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1632 TYPE(oce_matrix_type),
POINTER :: oce
1633 TYPE(pw_env_type),
POINTER :: pw_env
1634 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1635 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, tau_r, v_rspace, v_tau_rspace
1636 TYPE(qs_energy_type),
POINTER :: energy
1637 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1638 TYPE(qs_ks_env_type),
POINTER :: ks_env
1639 TYPE(qs_rho_type),
POINTER :: rho, rho_xc
1640 TYPE(section_vals_type),
POINTER :: adiabatic_rescaling_section, &
1641 ec_hfx_sections, ec_section
1643 CALL timeset(routinen, handle)
1645 iounit = cp_logger_get_default_unit_nr(local=.false.)
1648 NULLIFY (auxbas_pw_pool, dft_control, energy, ks_env, rho, rho_r, tau_r)
1649 CALL get_qs_env(qs_env=qs_env, &
1650 dft_control=dft_control, &
1652 rho=rho, rho_xc=rho_xc)
1653 nspins = dft_control%nspins
1654 nimages = dft_control%nimages
1655 calculate_forces = .false.
1656 use_virial = .false.
1658 gapw = dft_control%qs_control%gapw
1659 gapw_xc = dft_control%qs_control%gapw_xc
1662 IF (
ASSOCIATED(ec_env%matrix_ks))
CALL dbcsr_deallocate_matrix_set(ec_env%matrix_ks)
1663 nhfimg =
SIZE(ec_env%matrix_s, 2)
1664 dft_control%nimages = nhfimg
1665 CALL dbcsr_allocate_matrix_set(ec_env%matrix_ks, nspins, nhfimg)
1666 DO ispin = 1, nspins
1667 headline =
"KOHN-SHAM MATRIX"
1669 ALLOCATE (ec_env%matrix_ks(ispin, img)%matrix)
1670 smat => ec_env%matrix_s(1, img)%matrix
1671 CALL dbcsr_create(ec_env%matrix_ks(ispin, img)%matrix, name=trim(headline), &
1672 template=smat, matrix_type=dbcsr_type_symmetric)
1673 CALL cp_dbcsr_alloc_block_from_nbl(ec_env%matrix_ks(ispin, img)%matrix, &
1675 CALL dbcsr_set(ec_env%matrix_ks(ispin, img)%matrix, 0.0_dp)
1680 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1681 cpassert(
ASSOCIATED(pw_env))
1684 ec_section => section_vals_get_subs_vals(qs_env%input,
"DFT%ENERGY_CORRECTION")
1685 ec_hfx_sections => section_vals_get_subs_vals(ec_section,
"XC%HF")
1686 CALL section_vals_get(ec_hfx_sections, explicit=do_ec_hfx)
1691 adiabatic_rescaling_section => section_vals_get_subs_vals(ec_section,
"XC%ADIABATIC_RESCALING")
1692 CALL section_vals_get(adiabatic_rescaling_section, explicit=do_adiabatic_rescaling)
1693 IF (do_adiabatic_rescaling)
THEN
1694 CALL cp_abort(__location__,
"Adiabatic rescaling NYI for energy correction")
1696 CALL section_vals_val_get(ec_hfx_sections,
"TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core)
1697 IF (hfx_treat_lsd_in_core)
THEN
1698 CALL cp_abort(__location__,
"HFX_TREAT_LSD_IN_CORE NYI for energy correction")
1700 IF (ec_env%do_kpoints)
THEN
1701 CALL cp_abort(__location__,
"HFX and K-points NYI for energy correction")
1705 IF (dft_control%do_admm)
THEN
1706 IF (dft_control%do_admm_mo)
THEN
1707 cpassert(.NOT. qs_env%run_rtp)
1708 CALL admm_mo_calc_rho_aux(qs_env)
1709 ELSEIF (dft_control%do_admm_dm)
THEN
1710 CALL admm_dm_calc_rho_aux(qs_env)
1717 CALL get_qs_env(qs_env, energy=energy)
1718 CALL calculate_exx(qs_env=qs_env, &
1720 hfx_sections=ec_hfx_sections, &
1721 x_data=ec_env%x_data, &
1723 do_admm=ec_env%do_ec_admm, &
1724 calc_forces=.false., &
1725 reuse_hfx=ec_env%reuse_hfx, &
1726 do_im_time=.false., &
1727 e_ex_from_gw=dummy_real, &
1728 e_admm_from_gw=dummy_real2, &
1732 ec_env%ex = energy%ex
1734 IF (ec_env%do_ec_admm)
THEN
1735 ec_env%exc_aux_fit = energy%exc_aux_fit + energy%exc
1741 ks_mat => ec_env%matrix_ks(:, 1)
1742 CALL add_exx_to_rhs(rhs=ks_mat, &
1744 ext_hfx_section=ec_hfx_sections, &
1745 x_data=ec_env%x_data, &
1746 recalc_integrals=.false., &
1747 do_admm=ec_env%do_ec_admm, &
1750 reuse_hfx=ec_env%reuse_hfx)
1755 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1756 NULLIFY (v_rspace, v_tau_rspace)
1757 IF (dft_control%qs_control%gapw_xc)
THEN
1758 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_xc, xc_section=ec_env%xc_section, &
1759 vxc_rho=v_rspace, vxc_tau=v_tau_rspace, exc=eexc, just_energy=.false.)
1761 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=ec_env%xc_section, &
1762 vxc_rho=v_rspace, vxc_tau=v_tau_rspace, exc=eexc, just_energy=.false.)
1765 IF (.NOT.
ASSOCIATED(v_rspace))
THEN
1766 ALLOCATE (v_rspace(nspins))
1767 DO ispin = 1, nspins
1768 CALL auxbas_pw_pool%create_pw(v_rspace(ispin))
1769 CALL pw_zero(v_rspace(ispin))
1774 CALL qs_rho_get(rho, rho_r=rho_r)
1775 IF (
ASSOCIATED(v_tau_rspace))
THEN
1776 CALL qs_rho_get(rho, tau_r=tau_r)
1778 DO ispin = 1, nspins
1780 CALL pw_scale(v_rspace(ispin), v_rspace(ispin)%pw_grid%dvol)
1781 CALL pw_axpy(ec_env%vh_rspace, v_rspace(ispin))
1783 ks_mat => ec_env%matrix_ks(ispin, :)
1784 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
1787 calculate_forces=.false., &
1788 basis_type=
"HARRIS", &
1789 task_list_external=ec_env%task_list)
1791 IF (
ASSOCIATED(v_tau_rspace))
THEN
1793 CALL pw_scale(v_tau_rspace(ispin), v_tau_rspace(ispin)%pw_grid%dvol)
1794 CALL integrate_v_rspace(v_rspace=v_tau_rspace(ispin), &
1797 calculate_forces=.false., &
1798 compute_tau=.true., &
1799 basis_type=
"HARRIS", &
1800 task_list_external=ec_env%task_list)
1804 evhxc = evhxc + pw_integral_ab(rho_r(ispin), v_rspace(ispin))/ &
1805 v_rspace(1)%pw_grid%dvol
1806 IF (
ASSOCIATED(v_tau_rspace))
THEN
1807 evhxc = evhxc + pw_integral_ab(tau_r(ispin), v_tau_rspace(ispin))/ &
1808 v_tau_rspace(ispin)%pw_grid%dvol
1813 IF (gapw .OR. gapw_xc)
THEN
1815 IF (ec_env%basis_inconsistent)
THEN
1816 cpabort(
"Energy corrction [GAPW] only with BASIS=ORBITAL possible")
1819 NULLIFY (hartree_local, local_rho_set_ec)
1820 CALL get_qs_env(qs_env, para_env=para_env, &
1821 atomic_kind_set=atomic_kind_set, &
1822 qs_kind_set=qs_kind_set)
1823 CALL local_rho_set_create(local_rho_set_ec)
1824 CALL allocate_rho_atom_internals(local_rho_set_ec%rho_atom_set, atomic_kind_set, &
1825 qs_kind_set, dft_control, para_env)
1827 CALL get_qs_env(qs_env, natom=natom)
1828 CALL init_rho0(local_rho_set_ec, qs_env, dft_control%qs_control%gapw_control)
1829 CALL rho0_s_grid_create(pw_env, local_rho_set_ec%rho0_mpole)
1830 CALL hartree_local_create(hartree_local)
1831 CALL init_coulomb_local(hartree_local, natom)
1834 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
1835 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1836 CALL calculate_rho_atom_coeff(qs_env, rho_ao_kp, local_rho_set_ec%rho_atom_set, &
1837 qs_kind_set, oce, sab, para_env)
1838 CALL prepare_gapw_den(qs_env, local_rho_set_ec, do_rho0=gapw)
1840 CALL calculate_vxc_atom(qs_env, .false., exc1=exc1, xc_section_external=ec_env%xc_section, &
1841 rho_atom_set_external=local_rho_set_ec%rho_atom_set)
1845 CALL vh_1c_gg_integrals(qs_env, eh1c, hartree_local%ecoul_1c, local_rho_set_ec, para_env, .false.)
1846 CALL integrate_vhg0_rspace(qs_env, ec_env%vh_rspace, para_env, calculate_forces=.false., &
1847 local_rho_set=local_rho_set_ec)
1848 ec_env%ehartree_1c = eh1c
1850 IF (dft_control%do_admm)
THEN
1851 CALL get_qs_env(qs_env, admm_env=admm_env)
1852 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none)
THEN
1854 cpabort(
"GAPW HFX ADMM + Energy Correction NYA")
1858 ks_mat => ec_env%matrix_ks(:, 1)
1859 ps_mat => ec_env%matrix_p(:, 1)
1860 CALL update_ks_atom(qs_env, ks_mat, ps_mat, forces=.false., &
1861 rho_atom_external=local_rho_set_ec%rho_atom_set)
1863 CALL local_rho_set_release(local_rho_set_ec)
1865 CALL hartree_local_release(hartree_local)
1871 DO ispin = 1, nspins
1872 CALL auxbas_pw_pool%give_back_pw(v_rspace(ispin))
1873 IF (
ASSOCIATED(v_tau_rspace))
THEN
1874 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
1877 DEALLOCATE (v_rspace)
1878 IF (
ASSOCIATED(v_tau_rspace))
DEALLOCATE (v_tau_rspace)
1885 DO ispin = 1, nspins
1887 CALL dbcsr_add(ec_env%matrix_ks(ispin, img)%matrix, ec_env%matrix_h(1, img)%matrix, &
1888 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
1889 CALL dbcsr_filter(ec_env%matrix_ks(ispin, img)%matrix, &
1890 dft_control%qs_control%eps_filter_matrix)
1894 dft_control%nimages = nimages
1896 CALL timestop(handle)
1898 END SUBROUTINE ec_build_ks_matrix
1910 SUBROUTINE ec_build_core_hamiltonian_force(qs_env, ec_env, matrix_p, matrix_s, matrix_w)
1911 TYPE(qs_environment_type),
POINTER :: qs_env
1912 TYPE(energy_correction_type),
POINTER :: ec_env
1913 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s, matrix_w
1915 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_build_core_hamiltonian_force'
1917 CHARACTER(LEN=default_string_length) :: basis_type
1918 INTEGER :: handle, img, iounit, nder, nhfimg, &
1920 LOGICAL :: calculate_forces, debug_forces, &
1921 debug_stress, use_virial
1922 REAL(kind=dp) :: fconv
1923 REAL(kind=dp),
DIMENSION(3) :: fodeb
1924 REAL(kind=dp),
DIMENSION(3, 3) :: stdeb, sttot
1925 TYPE(cell_type),
POINTER :: cell
1926 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: scrm
1927 TYPE(dft_control_type),
POINTER :: dft_control
1928 TYPE(mp_para_env_type),
POINTER :: para_env
1929 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1931 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
1932 TYPE(qs_ks_env_type),
POINTER :: ks_env
1933 TYPE(virial_type),
POINTER :: virial
1935 CALL timeset(routinen, handle)
1937 debug_forces = ec_env%debug_forces
1938 debug_stress = ec_env%debug_stress
1940 iounit = cp_logger_get_default_unit_nr(local=.false.)
1942 calculate_forces = .true.
1944 basis_type =
"HARRIS"
1947 NULLIFY (cell, dft_control, force, ks_env, para_env, virial)
1948 CALL get_qs_env(qs_env=qs_env, &
1950 dft_control=dft_control, &
1953 para_env=para_env, &
1955 nimages = dft_control%nimages
1956 IF (nimages /= 1)
THEN
1957 cpabort(
"K-points for Harris functional not implemented")
1960 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
1961 IF (ec_env%energy_functional == ec_functional_harris)
THEN
1962 cpabort(
"Harris functional for GAPW not implemented")
1967 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
1969 fconv = 1.0e-9_dp*pascal/cell%deth
1970 IF (debug_stress .AND. use_virial)
THEN
1971 sttot = virial%pv_virial
1975 sab_orb => ec_env%sab_orb
1978 nhfimg =
SIZE(matrix_s, 2)
1980 CALL dbcsr_allocate_matrix_set(scrm, 1, nhfimg)
1982 ALLOCATE (scrm(1, img)%matrix)
1983 CALL dbcsr_create(scrm(1, img)%matrix, template=matrix_s(1, img)%matrix)
1984 CALL cp_dbcsr_alloc_block_from_nbl(scrm(1, img)%matrix, sab_orb)
1988 IF (
SIZE(matrix_p, 1) == 2)
THEN
1990 CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
1991 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
1996 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
1997 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
1998 CALL build_overlap_matrix(ks_env, matrixkp_s=scrm, &
1999 matrix_name=
"OVERLAP MATRIX", &
2000 basis_type_a=basis_type, &
2001 basis_type_b=basis_type, &
2002 sab_nl=sab_orb, calculate_forces=.true., &
2003 matrixkp_p=matrix_w, ext_kpoints=ec_env%kpoints)
2005 IF (debug_forces)
THEN
2006 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2007 CALL para_env%sum(fodeb)
2008 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wout*dS ", fodeb
2010 IF (debug_stress .AND. use_virial)
THEN
2011 stdeb = fconv*(virial%pv_overlap - stdeb)
2012 CALL para_env%sum(stdeb)
2013 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2014 'STRESS| Wout*dS', one_third_sum_diag(stdeb), det_3x3(stdeb)
2017 CALL kinetic_energy_matrix(qs_env, matrixkp_t=scrm, matrix_p=matrix_p, &
2018 calculate_forces=.true., sab_orb=sab_orb, &
2019 basis_type=basis_type, ext_kpoints=ec_env%kpoints, &
2020 debug_forces=debug_forces, debug_stress=debug_stress)
2022 CALL core_matrices(qs_env, scrm, matrix_p, calculate_forces, nder, &
2023 ec_env=ec_env, ec_env_matrices=.false., basis_type=basis_type, &
2024 ext_kpoints=ec_env%kpoints, &
2025 debug_forces=debug_forces, debug_stress=debug_stress)
2028 ec_env%efield_nuclear = 0.0_dp
2029 IF (calculate_forces .AND. debug_forces) fodeb(1:3) = force(1)%efield(1:3, 1)
2030 CALL ec_efield_local_operator(qs_env, ec_env, calculate_forces)
2031 IF (calculate_forces .AND. debug_forces)
THEN
2032 fodeb(1:3) = force(1)%efield(1:3, 1) - fodeb(1:3)
2033 CALL para_env%sum(fodeb)
2034 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dEfield", fodeb
2036 IF (debug_stress .AND. use_virial)
THEN
2037 stdeb = fconv*(virial%pv_virial - sttot)
2038 CALL para_env%sum(stdeb)
2039 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2040 'STRESS| Stress Pout*dHcore ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2041 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))")
' '
2045 CALL dbcsr_deallocate_matrix_set(scrm)
2047 CALL timestop(handle)
2049 END SUBROUTINE ec_build_core_hamiltonian_force
2060 SUBROUTINE ec_build_ks_matrix_force(qs_env, ec_env)
2061 TYPE(qs_environment_type),
POINTER :: qs_env
2062 TYPE(energy_correction_type),
POINTER :: ec_env
2064 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_build_ks_matrix_force'
2066 CHARACTER(LEN=default_string_length) :: unit_string
2067 INTEGER :: handle, i, img, iounit, ispin, natom, &
2068 nhfimg, nimages, nspins
2069 LOGICAL :: debug_forces, debug_stress, do_ec_hfx, &
2071 REAL(dp) :: dehartree, dummy_real, dummy_real2(2), &
2072 eexc, ehartree, eovrl, exc, fconv
2073 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot
2074 REAL(dp),
DIMENSION(3) :: fodeb
2075 REAL(kind=dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot
2076 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
2077 TYPE(cell_type),
POINTER :: cell
2078 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, rho_ao, scrmat
2079 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s, scrm
2080 TYPE(dft_control_type),
POINTER :: dft_control
2081 TYPE(mp_para_env_type),
POINTER :: para_env
2082 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2084 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, rhodn_tot_gspace, &
2086 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rhoout_g
2087 TYPE(pw_c1d_gs_type),
POINTER :: rho_core
2088 TYPE(pw_env_type),
POINTER :: pw_env
2089 TYPE(pw_poisson_type),
POINTER :: poisson_env
2090 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
2091 TYPE(pw_r3d_rs_type) :: dv_hartree_rspace, v_hartree_rspace, &
2093 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rhoout_r, tau_r, tauout_r, &
2094 v_rspace, v_tau_rspace, v_xc, v_xc_tau
2095 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
2096 TYPE(qs_ks_env_type),
POINTER :: ks_env
2097 TYPE(qs_rho_type),
POINTER :: rho
2098 TYPE(section_vals_type),
POINTER :: ec_hfx_sections, xc_section
2099 TYPE(virial_type),
POINTER :: virial
2101 CALL timeset(routinen, handle)
2103 debug_forces = ec_env%debug_forces
2104 debug_stress = ec_env%debug_stress
2106 iounit = cp_logger_get_default_unit_nr(local=.false.)
2109 NULLIFY (atomic_kind_set, cell, dft_control, force, ks_env, &
2110 matrix_ks, matrix_p, matrix_s, para_env, rho, rho_core, &
2111 rho_g, rho_r, sab_orb, tau_r, virial)
2112 CALL get_qs_env(qs_env=qs_env, &
2114 dft_control=dft_control, &
2117 matrix_ks=matrix_ks, &
2118 para_env=para_env, &
2123 nspins = dft_control%nspins
2124 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
2128 fconv = cp_unit_from_cp2k(1.0_dp/cell%deth, trim(unit_string))
2130 IF (debug_stress .AND. use_virial)
THEN
2131 sttot = virial%pv_virial
2135 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2136 cpassert(
ASSOCIATED(pw_env))
2138 NULLIFY (auxbas_pw_pool, poisson_env)
2140 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2141 poisson_env=poisson_env)
2144 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
2145 CALL auxbas_pw_pool%create_pw(rhodn_tot_gspace)
2146 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
2148 CALL pw_transfer(ec_env%vh_rspace, v_hartree_rspace)
2153 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g, tau_r=tau_r)
2154 NULLIFY (rhoout_r, rhoout_g)
2155 ALLOCATE (rhoout_r(nspins), rhoout_g(nspins))
2156 DO ispin = 1, nspins
2157 CALL auxbas_pw_pool%create_pw(rhoout_r(ispin))
2158 CALL auxbas_pw_pool%create_pw(rhoout_g(ispin))
2160 CALL auxbas_pw_pool%create_pw(dv_hartree_rspace)
2161 CALL auxbas_pw_pool%create_pw(vtot_rspace)
2164 nhfimg =
SIZE(ec_env%matrix_s, 2)
2165 nimages = dft_control%nimages
2166 dft_control%nimages = nhfimg
2168 CALL pw_zero(rhodn_tot_gspace)
2169 DO ispin = 1, nspins
2170 rho_ao => ec_env%matrix_p(ispin, :)
2171 CALL calculate_rho_elec(ks_env=ks_env, matrix_p_kp=rho_ao, &
2172 rho=rhoout_r(ispin), &
2173 rho_gspace=rhoout_g(ispin), &
2174 basis_type=
"HARRIS", &
2175 task_list_external=ec_env%task_list)
2179 ALLOCATE (ec_env%rhoout_r(nspins))
2180 DO ispin = 1, nspins
2181 CALL auxbas_pw_pool%create_pw(ec_env%rhoout_r(ispin))
2182 CALL pw_copy(rhoout_r(ispin), ec_env%rhoout_r(ispin))
2186 IF (dft_control%use_kinetic_energy_density)
THEN
2188 TYPE(pw_c1d_gs_type) :: tauout_g
2189 ALLOCATE (tauout_r(nspins))
2190 DO ispin = 1, nspins
2191 CALL auxbas_pw_pool%create_pw(tauout_r(ispin))
2193 CALL auxbas_pw_pool%create_pw(tauout_g)
2195 DO ispin = 1, nspins
2196 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=ec_env%matrix_p(ispin, 1)%matrix, &
2197 rho=tauout_r(ispin), &
2198 rho_gspace=tauout_g, &
2199 compute_tau=.true., &
2200 basis_type=
"HARRIS", &
2201 task_list_external=ec_env%task_list)
2204 CALL auxbas_pw_pool%give_back_pw(tauout_g)
2209 dft_control%nimages = nimages
2211 IF (use_virial)
THEN
2214 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
2217 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
2220 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
2221 CALL pw_copy(rho_core, rhodn_tot_gspace)
2222 DO ispin = 1, dft_control%nspins
2223 CALL pw_axpy(rhoout_g(ispin), rhodn_tot_gspace)
2227 h_stress(:, :) = 0.0_dp
2228 CALL pw_poisson_solve(poisson_env, &
2229 density=rho_tot_gspace, &
2230 ehartree=ehartree, &
2231 vhartree=v_hartree_gspace, &
2232 h_stress=h_stress, &
2233 aux_density=rhodn_tot_gspace)
2235 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
2236 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
2238 IF (debug_stress)
THEN
2239 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
2240 CALL para_env%sum(stdeb)
2241 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2242 'STRESS| GREEN 1st v_H[n_in]*n_out ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2246 virial%pv_calculate = .true.
2248 NULLIFY (v_rspace, v_tau_rspace)
2249 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=ec_env%xc_section, &
2250 vxc_rho=v_rspace, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
2253 virial%pv_exc = virial%pv_exc - virial%pv_xc
2254 virial%pv_virial = virial%pv_virial - virial%pv_xc
2256 IF (debug_stress)
THEN
2257 stdeb = -1.0_dp*fconv*virial%pv_xc
2258 CALL para_env%sum(stdeb)
2259 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2260 'STRESS| GGA 1st E_xc[Pin] ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2263 IF (
ASSOCIATED(v_rspace))
THEN
2264 DO ispin = 1, nspins
2265 CALL auxbas_pw_pool%give_back_pw(v_rspace(ispin))
2267 DEALLOCATE (v_rspace)
2269 IF (
ASSOCIATED(v_tau_rspace))
THEN
2270 DO ispin = 1, nspins
2271 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
2273 DEALLOCATE (v_tau_rspace)
2275 CALL pw_zero(rhodn_tot_gspace)
2280 DO ispin = 1, nspins
2281 CALL pw_axpy(rho_r(ispin), rhoout_r(ispin), -1.0_dp)
2282 CALL pw_axpy(rho_g(ispin), rhoout_g(ispin), -1.0_dp)
2283 CALL pw_axpy(rhoout_g(ispin), rhodn_tot_gspace)
2284 IF (dft_control%use_kinetic_energy_density)
CALL pw_axpy(tau_r(ispin), tauout_r(ispin), -1.0_dp)
2288 IF (use_virial)
THEN
2291 h_stress(:, :) = 0.0_dp
2292 CALL pw_poisson_solve(poisson_env, &
2293 density=rhodn_tot_gspace, &
2294 ehartree=dehartree, &
2295 vhartree=v_hartree_gspace, &
2296 h_stress=h_stress, &
2297 aux_density=rho_tot_gspace)
2299 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
2301 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
2302 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
2304 IF (debug_stress)
THEN
2305 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
2306 CALL para_env%sum(stdeb)
2307 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2308 'STRESS| GREEN 2nd V_H[dP]*n_in ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2313 CALL pw_poisson_solve(poisson_env, rhodn_tot_gspace, dehartree, &
2317 CALL pw_transfer(v_hartree_gspace, dv_hartree_rspace)
2318 CALL pw_scale(dv_hartree_rspace, dv_hartree_rspace%pw_grid%dvol)
2321 CALL pw_transfer(v_hartree_rspace, vtot_rspace)
2322 CALL pw_axpy(dv_hartree_rspace, vtot_rspace)
2323 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
2324 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
2325 CALL integrate_v_core_rspace(vtot_rspace, qs_env)
2326 IF (debug_forces)
THEN
2327 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
2328 CALL para_env%sum(fodeb)
2329 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vtot*dncore", fodeb
2331 IF (debug_stress .AND. use_virial)
THEN
2332 stdeb = fconv*(virial%pv_ehartree - stdeb)
2333 CALL para_env%sum(stdeb)
2334 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2335 'STRESS| Vtot*dncore', one_third_sum_diag(stdeb), det_3x3(stdeb)
2341 xc_section => ec_env%xc_section
2343 IF (use_virial) virial%pv_xc = 0.0_dp
2344 NULLIFY (v_xc, v_xc_tau)
2345 CALL create_kernel(qs_env, &
2352 xc_section=xc_section, &
2353 compute_virial=use_virial, &
2354 virial_xc=virial%pv_xc)
2356 IF (use_virial)
THEN
2358 virial%pv_exc = virial%pv_exc + virial%pv_xc
2359 virial%pv_virial = virial%pv_virial + virial%pv_xc
2361 IF (debug_stress .AND. use_virial)
THEN
2362 stdeb = 1.0_dp*fconv*virial%pv_xc
2363 CALL para_env%sum(stdeb)
2364 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2365 'STRESS| GGA 2nd f_Hxc[dP]*Pin ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2368 CALL get_qs_env(qs_env=qs_env, rho=rho, matrix_s_kp=matrix_s)
2369 NULLIFY (ec_env%matrix_hz)
2370 CALL dbcsr_allocate_matrix_set(ec_env%matrix_hz, nspins)
2371 DO ispin = 1, nspins
2372 ALLOCATE (ec_env%matrix_hz(ispin)%matrix)
2373 CALL dbcsr_create(ec_env%matrix_hz(ispin)%matrix, template=matrix_s(1, 1)%matrix)
2374 CALL dbcsr_copy(ec_env%matrix_hz(ispin)%matrix, matrix_s(1, 1)%matrix)
2375 CALL dbcsr_set(ec_env%matrix_hz(ispin)%matrix, 0.0_dp)
2377 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
2379 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2380 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2383 IF (use_virial)
THEN
2384 pv_loc = virial%pv_virial
2387 DO ispin = 1, nspins
2388 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2389 CALL pw_axpy(dv_hartree_rspace, v_xc(ispin))
2390 CALL integrate_v_rspace(v_rspace=v_xc(ispin), &
2391 hmat=ec_env%matrix_hz(ispin), &
2392 pmat=matrix_p(ispin, 1), &
2394 calculate_forces=.true.)
2397 IF (debug_forces)
THEN
2398 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2399 CALL para_env%sum(fodeb)
2400 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKdrho", fodeb
2402 IF (debug_stress .AND. use_virial)
THEN
2403 stdeb = fconv*(virial%pv_virial - stdeb)
2404 CALL para_env%sum(stdeb)
2405 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2406 'STRESS| INT 2nd f_Hxc[dP]*Pin ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2409 IF (
ASSOCIATED(v_xc_tau))
THEN
2410 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2411 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2413 DO ispin = 1, nspins
2414 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2415 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
2416 hmat=ec_env%matrix_hz(ispin), &
2417 pmat=matrix_p(ispin, 1), &
2419 compute_tau=.true., &
2420 calculate_forces=.true.)
2423 IF (debug_forces)
THEN
2424 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2425 CALL para_env%sum(fodeb)
2426 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtaudtau", fodeb
2428 IF (debug_stress .AND. use_virial)
THEN
2429 stdeb = fconv*(virial%pv_virial - stdeb)
2430 CALL para_env%sum(stdeb)
2431 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2432 'STRESS| INT 2nd f_xctau[dP]*Pin ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2436 IF (use_virial)
THEN
2437 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2441 NULLIFY (v_rspace, v_tau_rspace)
2443 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=ec_env%xc_section, &
2444 vxc_rho=v_rspace, vxc_tau=v_tau_rspace, exc=eexc, just_energy=.false.)
2446 IF (use_virial)
THEN
2448 IF (
ASSOCIATED(v_rspace))
THEN
2449 DO ispin = 1, nspins
2451 eexc = eexc + pw_integral_ab(rhoout_r(ispin), v_rspace(ispin))
2454 IF (
ASSOCIATED(v_tau_rspace))
THEN
2455 DO ispin = 1, nspins
2457 eexc = eexc + pw_integral_ab(tauout_r(ispin), v_tau_rspace(ispin))
2462 IF (.NOT.
ASSOCIATED(v_rspace))
THEN
2463 ALLOCATE (v_rspace(nspins))
2464 DO ispin = 1, nspins
2465 CALL auxbas_pw_pool%create_pw(v_rspace(ispin))
2466 CALL pw_zero(v_rspace(ispin))
2472 IF (use_virial)
THEN
2473 pv_loc = virial%pv_virial
2476 dft_control%nimages = nhfimg
2480 CALL dbcsr_allocate_matrix_set(scrm, nspins, nhfimg)
2481 DO ispin = 1, nspins
2483 ALLOCATE (scrm(ispin, img)%matrix)
2484 CALL dbcsr_create(scrm(ispin, img)%matrix, template=ec_env%matrix_ks(ispin, img)%matrix)
2485 CALL dbcsr_copy(scrm(ispin, img)%matrix, ec_env%matrix_ks(ispin, img)%matrix)
2486 CALL dbcsr_set(scrm(ispin, img)%matrix, 0.0_dp)
2490 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2491 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2492 DO ispin = 1, nspins
2494 CALL pw_scale(v_rspace(ispin), v_rspace(ispin)%pw_grid%dvol)
2495 CALL pw_axpy(v_hartree_rspace, v_rspace(ispin))
2497 rho_ao => ec_env%matrix_p(ispin, :)
2498 scrmat => scrm(ispin, :)
2499 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
2503 calculate_forces=.true., &
2504 basis_type=
"HARRIS", &
2505 task_list_external=ec_env%task_list)
2508 IF (debug_forces)
THEN
2509 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2510 CALL para_env%sum(fodeb)
2511 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dVhxc ", fodeb
2513 IF (debug_stress .AND. use_virial)
THEN
2514 stdeb = fconv*(virial%pv_virial - stdeb)
2515 CALL para_env%sum(stdeb)
2516 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2517 'STRESS| INT Pout*dVhxc ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2521 IF (use_virial)
THEN
2522 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2526 dft_control%nimages = nimages
2528 IF (
ASSOCIATED(v_tau_rspace))
THEN
2529 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2530 DO ispin = 1, nspins
2532 CALL pw_scale(v_tau_rspace(ispin), v_tau_rspace(ispin)%pw_grid%dvol)
2533 rho_ao => ec_env%matrix_p(ispin, :)
2534 scrmat => scrm(ispin, :)
2535 CALL integrate_v_rspace(v_rspace=v_tau_rspace(ispin), &
2539 calculate_forces=.true., &
2540 compute_tau=.true., &
2541 basis_type=
"HARRIS", &
2542 task_list_external=ec_env%task_list)
2544 IF (debug_forces)
THEN
2545 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2546 CALL para_env%sum(fodeb)
2547 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dVhxc_tau ", fodeb
2556 ec_hfx_sections => section_vals_get_subs_vals(qs_env%input,
"DFT%ENERGY_CORRECTION%XC%HF")
2557 CALL section_vals_get(ec_hfx_sections, explicit=do_ec_hfx)
2561 IF (ec_env%do_kpoints)
THEN
2562 CALL cp_abort(__location__,
"HFX and K-points NYI for energy correction")
2565 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2566 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2568 CALL calculate_exx(qs_env=qs_env, &
2570 hfx_sections=ec_hfx_sections, &
2571 x_data=ec_env%x_data, &
2573 do_admm=ec_env%do_ec_admm, &
2574 calc_forces=.true., &
2575 reuse_hfx=ec_env%reuse_hfx, &
2576 do_im_time=.false., &
2577 e_ex_from_gw=dummy_real, &
2578 e_admm_from_gw=dummy_real2, &
2581 IF (use_virial)
THEN
2582 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2583 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2584 virial%pv_calculate = .false.
2586 IF (debug_forces)
THEN
2587 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2588 CALL para_env%sum(fodeb)
2589 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*hfx ", fodeb
2591 IF (debug_stress .AND. use_virial)
THEN
2592 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2593 CALL para_env%sum(stdeb)
2594 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2595 'STRESS| Pout*hfx ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2601 CALL dbcsr_deallocate_matrix_set(scrm)
2604 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
2605 DO ispin = 1, nspins
2606 CALL auxbas_pw_pool%give_back_pw(v_rspace(ispin))
2607 IF (
ASSOCIATED(v_tau_rspace))
THEN
2608 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
2611 IF (
ASSOCIATED(v_tau_rspace))
DEALLOCATE (v_tau_rspace)
2614 IF (debug_forces) fodeb(1:3) = force(1)%core_overlap(1:3, 1)
2615 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ecore_overlap
2616 CALL calculate_ecore_overlap(qs_env, para_env, .true., e_overlap_core=eovrl)
2617 IF (debug_forces)
THEN
2618 fodeb(1:3) = force(1)%core_overlap(1:3, 1) - fodeb(1:3)
2619 CALL para_env%sum(fodeb)
2620 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: CoreOverlap", fodeb
2622 IF (debug_stress .AND. use_virial)
THEN
2623 stdeb = fconv*(stdeb - virial%pv_ecore_overlap)
2624 CALL para_env%sum(stdeb)
2625 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2626 'STRESS| CoreOverlap ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2629 IF (debug_forces)
THEN
2630 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
2631 ALLOCATE (ftot(3, natom))
2632 CALL total_qs_force(ftot, force, atomic_kind_set)
2633 fodeb(1:3) = ftot(1:3, 1)
2635 CALL para_env%sum(fodeb)
2636 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Force Explicit", fodeb
2639 DEALLOCATE (v_rspace)
2641 CALL auxbas_pw_pool%give_back_pw(dv_hartree_rspace)
2642 CALL auxbas_pw_pool%give_back_pw(vtot_rspace)
2643 DO ispin = 1, nspins
2644 CALL auxbas_pw_pool%give_back_pw(rhoout_r(ispin))
2645 CALL auxbas_pw_pool%give_back_pw(rhoout_g(ispin))
2646 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2648 DEALLOCATE (rhoout_r, rhoout_g, v_xc)
2649 IF (
ASSOCIATED(tauout_r))
THEN
2650 DO ispin = 1, nspins
2651 CALL auxbas_pw_pool%give_back_pw(tauout_r(ispin))
2653 DEALLOCATE (tauout_r)
2655 IF (
ASSOCIATED(v_xc_tau))
THEN
2656 DO ispin = 1, nspins
2657 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2659 DEALLOCATE (v_xc_tau)
2661 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
2662 CALL auxbas_pw_pool%give_back_pw(rhodn_tot_gspace)
2666 IF (use_virial)
THEN
2667 IF (qs_env%energy_correction)
THEN
2668 ec_env%ehartree = ehartree + dehartree
2669 ec_env%exc = exc + eexc
2673 IF (debug_stress .AND. use_virial)
THEN
2675 stdeb = -1.0_dp*fconv*ehartree
2676 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2677 'STRESS| VOL 1st v_H[n_in]*n_out', one_third_sum_diag(stdeb), det_3x3(stdeb)
2679 stdeb = -1.0_dp*fconv*exc
2680 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2681 'STRESS| VOL 1st E_XC[n_in]', one_third_sum_diag(stdeb), det_3x3(stdeb)
2683 stdeb = -1.0_dp*fconv*dehartree
2684 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2685 'STRESS| VOL 2nd v_H[dP]*n_in', one_third_sum_diag(stdeb), det_3x3(stdeb)
2687 stdeb = -1.0_dp*fconv*eexc
2688 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2689 'STRESS| VOL 2nd v_XC[n_in]*dP', one_third_sum_diag(stdeb), det_3x3(stdeb)
2694 TYPE(virial_type) :: virdeb
2697 CALL para_env%sum(virdeb%pv_overlap)
2698 CALL para_env%sum(virdeb%pv_ekinetic)
2699 CALL para_env%sum(virdeb%pv_ppl)
2700 CALL para_env%sum(virdeb%pv_ppnl)
2701 CALL para_env%sum(virdeb%pv_ecore_overlap)
2702 CALL para_env%sum(virdeb%pv_ehartree)
2703 CALL para_env%sum(virdeb%pv_exc)
2704 CALL para_env%sum(virdeb%pv_exx)
2705 CALL para_env%sum(virdeb%pv_vdw)
2706 CALL para_env%sum(virdeb%pv_mp2)
2707 CALL para_env%sum(virdeb%pv_nlcc)
2708 CALL para_env%sum(virdeb%pv_gapw)
2709 CALL para_env%sum(virdeb%pv_lrigpw)
2710 CALL para_env%sum(virdeb%pv_virial)
2711 CALL symmetrize_virial(virdeb)
2715 virdeb%pv_ehartree(i, i) = virdeb%pv_ehartree(i, i) - 2.0_dp*(ehartree + dehartree)
2716 virdeb%pv_virial(i, i) = virdeb%pv_virial(i, i) - exc - eexc &
2717 - 2.0_dp*(ehartree + dehartree)
2718 virdeb%pv_exc(i, i) = virdeb%pv_exc(i, i) - exc - eexc
2724 CALL para_env%sum(sttot)
2725 stdeb = fconv*(virdeb%pv_virial - sttot)
2726 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2727 'STRESS| Explicit electronic stress ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2729 stdeb = fconv*(virdeb%pv_virial)
2730 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2731 'STRESS| Explicit total stress ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2733 CALL write_stress_tensor_components(virdeb, iounit, cell, unit_string)
2734 CALL write_stress_tensor(virdeb%pv_virial, iounit, cell, unit_string, .false.)
2739 CALL timestop(handle)
2741 END SUBROUTINE ec_build_ks_matrix_force
2751 SUBROUTINE ec_ks_solver(qs_env, ec_env)
2753 TYPE(qs_environment_type),
POINTER :: qs_env
2754 TYPE(energy_correction_type),
POINTER :: ec_env
2756 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ks_solver'
2758 CHARACTER(LEN=default_string_length) :: headline
2759 INTEGER :: handle, img, ispin, nhfimg, nspins
2760 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, pmat, smat, wmat
2761 TYPE(dbcsr_type),
POINTER :: tsmat
2762 TYPE(dft_control_type),
POINTER :: dft_control
2764 CALL timeset(routinen, handle)
2766 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
2767 nspins = dft_control%nspins
2768 nhfimg =
SIZE(ec_env%matrix_s, 2)
2771 IF (.NOT.
ASSOCIATED(ec_env%matrix_p))
THEN
2772 headline =
"DENSITY MATRIX"
2773 CALL dbcsr_allocate_matrix_set(ec_env%matrix_p, nspins, nhfimg)
2774 DO ispin = 1, nspins
2776 tsmat => ec_env%matrix_s(1, img)%matrix
2777 ALLOCATE (ec_env%matrix_p(ispin, img)%matrix)
2778 CALL dbcsr_create(ec_env%matrix_p(ispin, img)%matrix, &
2779 name=trim(headline), template=tsmat)
2780 CALL cp_dbcsr_alloc_block_from_nbl(ec_env%matrix_p(ispin, img)%matrix, &
2786 IF (.NOT.
ASSOCIATED(ec_env%matrix_w))
THEN
2787 headline =
"ENERGY WEIGHTED DENSITY MATRIX"
2788 CALL dbcsr_allocate_matrix_set(ec_env%matrix_w, nspins, nhfimg)
2789 DO ispin = 1, nspins
2791 tsmat => ec_env%matrix_s(1, img)%matrix
2792 ALLOCATE (ec_env%matrix_w(ispin, img)%matrix)
2793 CALL dbcsr_create(ec_env%matrix_w(ispin, img)%matrix, &
2794 name=trim(headline), template=tsmat)
2795 CALL cp_dbcsr_alloc_block_from_nbl(ec_env%matrix_w(ispin, img)%matrix, &
2801 IF (ec_env%mao)
THEN
2802 CALL mao_create_matrices(ec_env, ksmat, smat, pmat, wmat)
2804 ksmat => ec_env%matrix_ks
2805 smat => ec_env%matrix_s
2806 pmat => ec_env%matrix_p
2807 wmat => ec_env%matrix_w
2810 IF (ec_env%do_kpoints)
THEN
2811 IF (ec_env%ks_solver /= ec_diagonalization)
THEN
2812 CALL cp_abort(__location__,
"Harris functional with k-points "// &
2813 "needs diagonalization solver")
2817 SELECT CASE (ec_env%ks_solver)
2818 CASE (ec_diagonalization)
2819 IF (ec_env%do_kpoints)
THEN
2820 CALL ec_diag_solver_kp(qs_env, ec_env, ksmat, smat, pmat, wmat)
2822 CALL ec_diag_solver_gamma(qs_env, ec_env, ksmat, smat, pmat, wmat)
2825 CALL ec_ot_diag_solver(qs_env, ec_env, ksmat, smat, pmat, wmat)
2826 CASE (ec_matrix_sign, ec_matrix_trs4, ec_matrix_tc2)
2827 CALL ec_ls_init(qs_env, ksmat, smat)
2828 CALL ec_ls_solver(qs_env, pmat, wmat, ec_ls_method=ec_env%ks_solver)
2833 IF (ec_env%mao)
THEN
2834 CALL mao_release_matrices(ec_env, ksmat, smat, pmat, wmat)
2837 CALL timestop(handle)
2839 END SUBROUTINE ec_ks_solver
2852 SUBROUTINE mao_create_matrices(ec_env, ksmat, smat, pmat, wmat)
2854 TYPE(energy_correction_type),
POINTER :: ec_env
2855 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, smat, pmat, wmat
2857 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mao_create_matrices'
2859 INTEGER :: handle, ispin, nspins
2860 INTEGER,
DIMENSION(:),
POINTER :: col_blk_sizes
2861 TYPE(dbcsr_distribution_type) :: dbcsr_dist
2862 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mao_coef
2863 TYPE(dbcsr_type) :: cgmat
2865 CALL timeset(routinen, handle)
2867 mao_coef => ec_env%mao_coef
2869 NULLIFY (ksmat, smat, pmat, wmat)
2870 nspins =
SIZE(ec_env%matrix_ks, 1)
2871 CALL dbcsr_get_info(mao_coef(1)%matrix, col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
2872 CALL dbcsr_allocate_matrix_set(ksmat, nspins, 1)
2873 CALL dbcsr_allocate_matrix_set(smat, nspins, 1)
2874 DO ispin = 1, nspins
2875 ALLOCATE (ksmat(ispin, 1)%matrix)
2876 CALL dbcsr_create(ksmat(ispin, 1)%matrix, dist=dbcsr_dist, name=
"MAO KS mat", &
2877 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
2878 col_blk_size=col_blk_sizes)
2879 ALLOCATE (smat(ispin, 1)%matrix)
2880 CALL dbcsr_create(smat(ispin, 1)%matrix, dist=dbcsr_dist, name=
"MAO S mat", &
2881 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
2882 col_blk_size=col_blk_sizes)
2885 CALL dbcsr_create(cgmat, name=
"TEMP matrix", template=mao_coef(1)%matrix)
2886 DO ispin = 1, nspins
2887 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, ec_env%matrix_s(1, 1)%matrix, mao_coef(ispin)%matrix, &
2889 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, smat(ispin, 1)%matrix)
2890 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, ec_env%matrix_ks(1, 1)%matrix, mao_coef(ispin)%matrix, &
2892 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, ksmat(ispin, 1)%matrix)
2894 CALL dbcsr_release(cgmat)
2896 CALL dbcsr_allocate_matrix_set(pmat, nspins, 1)
2897 DO ispin = 1, nspins
2898 ALLOCATE (pmat(ispin, 1)%matrix)
2899 CALL dbcsr_create(pmat(ispin, 1)%matrix, template=smat(1, 1)%matrix, name=
"MAO P mat")
2900 CALL cp_dbcsr_alloc_block_from_nbl(pmat(ispin, 1)%matrix, ec_env%sab_orb)
2903 CALL dbcsr_allocate_matrix_set(wmat, nspins, 1)
2904 DO ispin = 1, nspins
2905 ALLOCATE (wmat(ispin, 1)%matrix)
2906 CALL dbcsr_create(wmat(ispin, 1)%matrix, template=smat(1, 1)%matrix, name=
"MAO W mat")
2907 CALL cp_dbcsr_alloc_block_from_nbl(wmat(ispin, 1)%matrix, ec_env%sab_orb)
2910 CALL timestop(handle)
2912 END SUBROUTINE mao_create_matrices
2925 SUBROUTINE mao_release_matrices(ec_env, ksmat, smat, pmat, wmat)
2927 TYPE(energy_correction_type),
POINTER :: ec_env
2928 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, smat, pmat, wmat
2930 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mao_release_matrices'
2932 INTEGER :: handle, ispin, nspins
2933 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mao_coef
2934 TYPE(dbcsr_type) :: cgmat
2936 CALL timeset(routinen, handle)
2938 mao_coef => ec_env%mao_coef
2939 nspins =
SIZE(mao_coef, 1)
2942 CALL dbcsr_create(cgmat, name=
"TEMP matrix", template=mao_coef(1)%matrix)
2943 DO ispin = 1, nspins
2944 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mao_coef(ispin)%matrix, pmat(ispin, 1)%matrix, 0.0_dp, cgmat)
2945 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, &
2946 ec_env%matrix_p(ispin, 1)%matrix, retain_sparsity=.true.)
2947 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mao_coef(ispin)%matrix, wmat(ispin, 1)%matrix, 0.0_dp, cgmat)
2948 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, &
2949 ec_env%matrix_w(ispin, 1)%matrix, retain_sparsity=.true.)
2951 CALL dbcsr_release(cgmat)
2953 CALL dbcsr_deallocate_matrix_set(ksmat)
2954 CALL dbcsr_deallocate_matrix_set(smat)
2955 CALL dbcsr_deallocate_matrix_set(pmat)
2956 CALL dbcsr_deallocate_matrix_set(wmat)
2958 CALL timestop(handle)
2960 END SUBROUTINE mao_release_matrices
2968 SUBROUTINE ec_energy(ec_env, unit_nr)
2969 TYPE(energy_correction_type) :: ec_env
2970 INTEGER,
INTENT(IN) :: unit_nr
2972 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_energy'
2974 INTEGER :: handle, nspins
2975 REAL(kind=dp) :: eband, trace
2977 CALL timeset(routinen, handle)
2979 nspins =
SIZE(ec_env%matrix_p, 1)
2980 CALL calculate_ptrace(ec_env%matrix_s, ec_env%matrix_p, trace, nspins)
2981 IF (unit_nr > 0)
WRITE (unit_nr,
'(T3,A,T65,F16.10)')
'Tr[PS] ', trace
2984 SELECT CASE (ec_env%energy_functional)
2985 CASE (ec_functional_harris)
2988 CALL calculate_ptrace(ec_env%matrix_ks, ec_env%matrix_p, eband, nspins, .true.)
2989 ec_env%eband = eband + ec_env%efield_nuclear
2992 ec_env%etotal = ec_env%eband + ec_env%ehartree + ec_env%exc - ec_env%vhxc + ec_env%ekTS + &
2993 ec_env%edispersion - ec_env%ex
2994 IF (unit_nr > 0)
THEN
2995 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Eband ", ec_env%eband
2996 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Ehartree ", ec_env%ehartree
2997 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Exc ", ec_env%exc
2998 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Ex ", ec_env%ex
2999 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Evhxc ", ec_env%vhxc
3000 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Edisp ", ec_env%edispersion
3001 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Entropy ", ec_env%ekTS
3002 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Etotal Harris Functional ", ec_env%etotal
3005 CASE (ec_functional_dc)
3008 CALL calculate_ptrace(ec_env%matrix_h, ec_env%matrix_p, ec_env%ecore, nspins)
3010 ec_env%ecore = ec_env%ecore + ec_env%efield_nuclear
3011 ec_env%etotal = ec_env%ecore + ec_env%ehartree + ec_env%ehartree_1c + &
3012 ec_env%exc + ec_env%exc1 + ec_env%ekTS + ec_env%edispersion + &
3013 ec_env%ex + ec_env%exc_aux_fit + ec_env%exc1_aux_fit
3015 IF (unit_nr > 0)
THEN
3016 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Ecore ", ec_env%ecore
3017 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Ehartree ", ec_env%ehartree + ec_env%ehartree_1c
3018 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Exc ", ec_env%exc + ec_env%exc1
3019 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Ex ", ec_env%ex
3020 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Exc_aux_fit", ec_env%exc_aux_fit + ec_env%exc1_aux_fit
3021 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Edisp ", ec_env%edispersion
3022 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Entropy ", ec_env%ekTS
3023 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Etotal Energy Functional ", ec_env%etotal
3026 CASE (ec_functional_ext)
3028 ec_env%etotal = ec_env%ex
3029 IF (unit_nr > 0)
THEN
3030 WRITE (unit_nr,
'(T3,A,T56,F25.15)')
"Etotal Energy Functional ", ec_env%etotal
3039 CALL timestop(handle)
3041 END SUBROUTINE ec_energy
3053 SUBROUTINE ec_build_neighborlist(qs_env, ec_env)
3054 TYPE(qs_environment_type),
POINTER :: qs_env
3055 TYPE(energy_correction_type),
POINTER :: ec_env
3057 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_build_neighborlist'
3059 INTEGER :: handle, ikind, nimages, nkind, zat
3060 LOGICAL :: all_potential_present, gth_potential_present, paw_atom, paw_atom_present, &
3061 sgp_potential_present, skip_load_balance_distributed
3062 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: all_present, default_present, &
3063 oce_present, orb_present, ppl_present, &
3065 REAL(dp) :: subcells
3066 REAL(dp),
ALLOCATABLE,
DIMENSION(:) :: all_radius, c_radius, oce_radius, &
3067 orb_radius, ppl_radius, ppnl_radius
3068 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :) :: pair_radius
3069 TYPE(all_potential_type),
POINTER :: all_potential
3070 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3071 TYPE(cell_type),
POINTER :: cell
3072 TYPE(dft_control_type),
POINTER :: dft_control
3073 TYPE(distribution_1d_type),
POINTER :: distribution_1d
3074 TYPE(distribution_2d_type),
POINTER :: distribution_2d
3075 TYPE(gth_potential_type),
POINTER :: gth_potential
3076 TYPE(gto_basis_set_type),
POINTER :: basis_set
3077 TYPE(local_atoms_type),
ALLOCATABLE,
DIMENSION(:) :: atom2d
3078 TYPE(molecule_type),
DIMENSION(:),
POINTER :: molecule_set
3079 TYPE(mp_para_env_type),
POINTER :: para_env
3080 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
3081 POINTER :: sab_cn, sab_vdw
3082 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3083 TYPE(paw_proj_set_type),
POINTER :: paw_proj
3084 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
3085 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3086 TYPE(qs_kind_type),
POINTER :: qs_kind
3087 TYPE(qs_ks_env_type),
POINTER :: ks_env
3088 TYPE(sgp_potential_type),
POINTER :: sgp_potential
3090 CALL timeset(routinen, handle)
3092 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
3093 CALL get_qs_kind_set(qs_kind_set, &
3094 paw_atom_present=paw_atom_present, &
3095 all_potential_present=all_potential_present, &
3096 gth_potential_present=gth_potential_present, &
3097 sgp_potential_present=sgp_potential_present)
3098 nkind =
SIZE(qs_kind_set)
3099 ALLOCATE (c_radius(nkind), default_present(nkind))
3100 ALLOCATE (orb_radius(nkind), all_radius(nkind), ppl_radius(nkind), ppnl_radius(nkind))
3101 ALLOCATE (orb_present(nkind), all_present(nkind), ppl_present(nkind), ppnl_present(nkind))
3102 ALLOCATE (pair_radius(nkind, nkind))
3103 ALLOCATE (atom2d(nkind))
3105 CALL get_qs_env(qs_env, &
3106 atomic_kind_set=atomic_kind_set, &
3108 distribution_2d=distribution_2d, &
3109 local_particles=distribution_1d, &
3110 particle_set=particle_set, &
3111 molecule_set=molecule_set)
3113 CALL atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, &
3114 molecule_set, .false., particle_set)
3117 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom2d(ikind)%list)
3118 qs_kind => qs_kind_set(ikind)
3119 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"HARRIS")
3120 IF (
ASSOCIATED(basis_set))
THEN
3121 orb_present(ikind) = .true.
3122 CALL get_gto_basis_set(gto_basis_set=basis_set, kind_radius=orb_radius(ikind))
3124 orb_present(ikind) = .false.
3125 orb_radius(ikind) = 0.0_dp
3127 CALL get_qs_kind(qs_kind, all_potential=all_potential, &
3128 gth_potential=gth_potential, sgp_potential=sgp_potential)
3129 IF (gth_potential_present .OR. sgp_potential_present)
THEN
3130 IF (
ASSOCIATED(gth_potential))
THEN
3131 CALL get_potential(potential=gth_potential, &
3132 ppl_present=ppl_present(ikind), &
3133 ppl_radius=ppl_radius(ikind), &
3134 ppnl_present=ppnl_present(ikind), &
3135 ppnl_radius=ppnl_radius(ikind))
3136 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
3137 CALL get_potential(potential=sgp_potential, &
3138 ppl_present=ppl_present(ikind), &
3139 ppl_radius=ppl_radius(ikind), &
3140 ppnl_present=ppnl_present(ikind), &
3141 ppnl_radius=ppnl_radius(ikind))
3143 ppl_present(ikind) = .false.
3144 ppl_radius(ikind) = 0.0_dp
3145 ppnl_present(ikind) = .false.
3146 ppnl_radius(ikind) = 0.0_dp
3150 IF (all_potential_present .OR. sgp_potential_present)
THEN
3151 all_present(ikind) = .false.
3152 all_radius(ikind) = 0.0_dp
3153 IF (
ASSOCIATED(all_potential))
THEN
3154 all_present(ikind) = .true.
3155 CALL get_potential(potential=all_potential, core_charge_radius=all_radius(ikind))
3156 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
3157 IF (sgp_potential%ecp_local)
THEN
3158 all_present(ikind) = .true.
3159 CALL get_potential(potential=sgp_potential, core_charge_radius=all_radius(ikind))
3165 CALL section_vals_val_get(qs_env%input,
"DFT%SUBCELLS", r_val=subcells)
3168 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
3169 CALL build_neighbor_lists(ec_env%sab_orb, particle_set, atom2d, cell, pair_radius, &
3170 subcells=subcells, nlname=
"sab_orb")
3172 IF (ec_env%do_kpoints)
THEN
3174 CALL build_neighbor_lists(ec_env%sab_kp, particle_set, atom2d, cell, pair_radius, &
3175 subcells=subcells, nlname=
"sab_kp")
3176 IF (ec_env%do_ec_hfx)
THEN
3177 CALL build_neighbor_lists(ec_env%sab_kp_nosym, particle_set, atom2d, cell, pair_radius, &
3178 subcells=subcells, nlname=
"sab_kp_nosym", symmetric=.false.)
3180 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
3181 CALL kpoint_init_cell_index(ec_env%kpoints, ec_env%sab_kp, para_env, nimages)
3185 IF (all_potential_present .OR. sgp_potential_present)
THEN
3186 IF (any(all_present))
THEN
3187 CALL pair_radius_setup(orb_present, all_present, orb_radius, all_radius, pair_radius)
3188 CALL build_neighbor_lists(ec_env%sac_ae, particle_set, atom2d, cell, pair_radius, &
3189 subcells=subcells, operator_type=
"ABC", nlname=
"sac_ae")
3193 IF (gth_potential_present .OR. sgp_potential_present)
THEN
3194 IF (any(ppl_present))
THEN
3195 CALL pair_radius_setup(orb_present, ppl_present, orb_radius, ppl_radius, pair_radius)
3196 CALL build_neighbor_lists(ec_env%sac_ppl, particle_set, atom2d, cell, pair_radius, &
3197 subcells=subcells, operator_type=
"ABC", nlname=
"sac_ppl")
3200 IF (any(ppnl_present))
THEN
3201 CALL pair_radius_setup(orb_present, ppnl_present, orb_radius, ppnl_radius, pair_radius)
3202 CALL build_neighbor_lists(ec_env%sap_ppnl, particle_set, atom2d, cell, pair_radius, &
3203 subcells=subcells, operator_type=
"ABBA", nlname=
"sap_ppnl")
3208 c_radius(:) = 0.0_dp
3209 dispersion_env => ec_env%dispersion_env
3210 sab_vdw => dispersion_env%sab_vdw
3211 sab_cn => dispersion_env%sab_cn
3212 IF (dispersion_env%type == xc_vdw_fun_pairpot)
THEN
3213 c_radius(:) = dispersion_env%rc_disp
3214 default_present = .true.
3215 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
3216 CALL build_neighbor_lists(sab_vdw, particle_set, atom2d, cell, pair_radius, &
3217 subcells=subcells, operator_type=
"PP", nlname=
"sab_vdw")
3218 dispersion_env%sab_vdw => sab_vdw
3219 IF (dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
3220 dispersion_env%pp_type == vdw_pairpot_dftd3bj)
THEN
3223 CALL get_atomic_kind(atomic_kind_set(ikind), z=zat)
3224 c_radius(ikind) = 4._dp*ptable(zat)%covalent_radius*bohr
3226 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
3227 CALL build_neighbor_lists(sab_cn, particle_set, atom2d, cell, pair_radius, &
3228 subcells=subcells, operator_type=
"PP", nlname=
"sab_cn")
3229 dispersion_env%sab_cn => sab_cn
3234 IF (paw_atom_present)
THEN
3235 IF (paw_atom_present)
THEN
3236 ALLOCATE (oce_present(nkind), oce_radius(nkind))
3241 CALL get_qs_kind(qs_kind_set(ikind), paw_proj_set=paw_proj, paw_atom=paw_atom)
3243 oce_present(ikind) = .true.
3244 CALL get_paw_proj_set(paw_proj_set=paw_proj, rcprj=oce_radius(ikind))
3246 oce_present(ikind) = .false.
3251 IF (any(oce_present))
THEN
3252 CALL pair_radius_setup(orb_present, oce_present, orb_radius, oce_radius, pair_radius)
3253 CALL build_neighbor_lists(ec_env%sap_oce, particle_set, atom2d, cell, pair_radius, &
3254 subcells=subcells, operator_type=
"ABBA", nlname=
"sap_oce")
3256 DEALLOCATE (oce_present, oce_radius)
3260 CALL atom2d_cleanup(atom2d)
3262 DEALLOCATE (orb_present, default_present, all_present, ppl_present, ppnl_present)
3263 DEALLOCATE (orb_radius, all_radius, ppl_radius, ppnl_radius, c_radius)
3264 DEALLOCATE (pair_radius)
3267 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
3268 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
3269 IF (
ASSOCIATED(ec_env%task_list))
CALL deallocate_task_list(ec_env%task_list)
3270 CALL allocate_task_list(ec_env%task_list)
3271 CALL generate_qs_task_list(ks_env, ec_env%task_list, basis_type=
"HARRIS", &
3272 reorder_rs_grid_ranks=.false., &
3273 skip_load_balance_distributed=skip_load_balance_distributed, &
3274 sab_orb_external=ec_env%sab_orb, &
3275 ext_kpoints=ec_env%kpoints)
3277 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
3278 IF (
ASSOCIATED(ec_env%task_list_soft))
CALL deallocate_task_list(ec_env%task_list_soft)
3279 CALL allocate_task_list(ec_env%task_list_soft)
3280 CALL generate_qs_task_list(ks_env, ec_env%task_list_soft, basis_type=
"HARRIS_SOFT", &
3281 reorder_rs_grid_ranks=.false., &
3282 skip_load_balance_distributed=skip_load_balance_distributed, &
3283 sab_orb_external=ec_env%sab_orb, &
3284 ext_kpoints=ec_env%kpoints)
3287 CALL timestop(handle)
3289 END SUBROUTINE ec_build_neighborlist
3296 SUBROUTINE ec_properties(qs_env, ec_env)
3297 TYPE(qs_environment_type),
POINTER :: qs_env
3298 TYPE(energy_correction_type),
POINTER :: ec_env
3300 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_properties'
3302 CHARACTER(LEN=8),
DIMENSION(3) :: rlab
3303 CHARACTER(LEN=default_path_length) :: filename, my_pos_voro
3304 CHARACTER(LEN=default_string_length) :: description
3305 INTEGER :: akind, handle, i, ia, iatom, idir, ikind, iounit, ispin, maxmom, nspins, &
3306 reference, should_print_bqb, should_print_voro, unit_nr, unit_nr_voro
3307 LOGICAL :: append_voro, magnetic, periodic, &
3309 REAL(kind=dp) :: charge, dd, focc, tmp
3310 REAL(kind=dp),
DIMENSION(3) :: cdip, pdip, rcc, rdip, ria, tdip
3311 REAL(kind=dp),
DIMENSION(:),
POINTER :: ref_point
3312 TYPE(atomic_kind_type),
POINTER :: atomic_kind
3313 TYPE(cell_type),
POINTER :: cell
3314 TYPE(cp_logger_type),
POINTER :: logger
3315 TYPE(cp_result_type),
POINTER :: results
3316 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, moments
3317 TYPE(dft_control_type),
POINTER :: dft_control
3318 TYPE(distribution_1d_type),
POINTER :: local_particles
3319 TYPE(mp_para_env_type),
POINTER :: para_env
3320 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3321 TYPE(pw_env_type),
POINTER :: pw_env
3322 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
3323 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
3324 TYPE(pw_r3d_rs_type) :: rho_elec_rspace
3325 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3326 TYPE(section_vals_type),
POINTER :: ec_section, print_key, print_key_bqb, &
3329 CALL timeset(routinen, handle)
3335 logger => cp_get_default_logger()
3336 iounit = cp_logger_get_default_unit_nr(logger, local=.false.)
3338 NULLIFY (dft_control)
3339 CALL get_qs_env(qs_env, dft_control=dft_control)
3340 nspins = dft_control%nspins
3342 ec_section => section_vals_get_subs_vals(qs_env%input,
"DFT%ENERGY_CORRECTION")
3343 print_key => section_vals_get_subs_vals(section_vals=ec_section, &
3344 subsection_name=
"PRINT%MOMENTS")
3346 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file))
THEN
3348 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
3349 cpabort(
"Properties for GAPW in EC NYA")
3352 maxmom = section_get_ival(section_vals=ec_section, &
3353 keyword_name=
"PRINT%MOMENTS%MAX_MOMENT")
3354 periodic = section_get_lval(section_vals=ec_section, &
3355 keyword_name=
"PRINT%MOMENTS%PERIODIC")
3356 reference = section_get_ival(section_vals=ec_section, &
3357 keyword_name=
"PRINT%MOMENTS%REFERENCE")
3358 magnetic = section_get_lval(section_vals=ec_section, &
3359 keyword_name=
"PRINT%MOMENTS%MAGNETIC")
3361 CALL section_vals_val_get(ec_section,
"PRINT%MOMENTS%REF_POINT", r_vals=ref_point)
3362 unit_nr = cp_print_key_unit_nr(logger=logger, basis_section=ec_section, &
3363 print_key_path=
"PRINT%MOMENTS", extension=
".dat", &
3364 middle_name=
"moments", log_filename=.false.)
3366 IF (iounit > 0)
THEN
3367 IF (unit_nr /= iounit .AND. unit_nr > 0)
THEN
3368 INQUIRE (unit=unit_nr, name=filename)
3369 WRITE (unit=iounit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
3370 "MOMENTS",
"The electric/magnetic moments are written to file:", &
3373 WRITE (unit=iounit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
3378 cpabort(
"Periodic moments not implemented with EC")
3380 cpassert(maxmom < 2)
3381 cpassert(.NOT. magnetic)
3382 IF (maxmom == 1)
THEN
3383 CALL get_qs_env(qs_env=qs_env, cell=cell, para_env=para_env)
3385 CALL get_reference_point(rcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
3388 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, &
3389 qs_kind_set=qs_kind_set, local_particles=local_particles)
3390 DO ikind = 1,
SIZE(local_particles%n_el)
3391 DO ia = 1, local_particles%n_el(ikind)
3392 iatom = local_particles%list(ikind)%array(ia)
3394 ria = pbc(particle_set(iatom)%r - rcc, cell) + rcc
3396 atomic_kind => particle_set(iatom)%atomic_kind
3397 CALL get_atomic_kind(atomic_kind, kind_number=akind)
3398 CALL get_qs_kind(qs_kind_set(akind), core_charge=charge)
3399 cdip(1:3) = cdip(1:3) - charge*ria(1:3)
3402 CALL para_env%sum(cdip)
3405 CALL ec_efield_integrals(qs_env, ec_env, rcc)
3408 DO ispin = 1, nspins
3410 CALL dbcsr_dot(ec_env%matrix_p(ispin, 1)%matrix, &
3411 ec_env%efield%dipmat(idir)%matrix, tmp)
3412 pdip(idir) = pdip(idir) + tmp
3417 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
3419 CALL dbcsr_allocate_matrix_set(moments, 4)
3421 ALLOCATE (moments(i)%matrix)
3422 CALL dbcsr_copy(moments(i)%matrix, matrix_s(1)%matrix,
"Moments")
3423 CALL dbcsr_set(moments(i)%matrix, 0.0_dp)
3425 CALL build_local_moment_matrix(qs_env, moments, 1, ref_point=rcc)
3428 IF (nspins == 2) focc = 1.0_dp
3430 DO ispin = 1, nspins
3432 CALL dbcsr_dot(ec_env%matrix_z(ispin)%matrix, moments(idir)%matrix, tmp)
3433 rdip(idir) = rdip(idir) + tmp
3436 CALL dbcsr_deallocate_matrix_set(moments)
3438 tdip = -(rdip + pdip + cdip)
3439 IF (unit_nr > 0)
THEN
3440 WRITE (unit_nr,
"(T3,A)")
"Dipoles are based on the traditional operator."
3441 dd = sqrt(sum(tdip(1:3)**2))*debye
3442 WRITE (unit_nr,
"(T3,A)")
"Dipole moment [Debye]"
3443 WRITE (unit_nr,
"(T5,3(A,A,F14.8,1X),T60,A,T67,F14.8)") &
3444 (trim(rlab(i)),
"=", tdip(i)*debye, i=1, 3),
"Total=", dd
3449 CALL cp_print_key_finished_output(unit_nr=unit_nr, logger=logger, &
3450 basis_section=ec_section, print_key_path=
"PRINT%MOMENTS")
3451 CALL get_qs_env(qs_env=qs_env, results=results)
3452 description =
"[DIPOLE]"
3453 CALL cp_results_erase(results=results, description=description)
3454 CALL put_results(results=results, description=description, values=tdip(1:3))
3458 print_key_voro => section_vals_get_subs_vals(ec_section,
"PRINT%VORONOI")
3459 print_key_bqb => section_vals_get_subs_vals(ec_section,
"PRINT%E_DENSITY_BQB")
3460 IF (btest(cp_print_key_should_output(logger%iter_info, print_key_voro), cp_p_file))
THEN
3461 should_print_voro = 1
3463 should_print_voro = 0
3465 IF (btest(cp_print_key_should_output(logger%iter_info, print_key_bqb), cp_p_file))
THEN
3466 should_print_bqb = 1
3468 should_print_bqb = 0
3470 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3472 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
3473 cpabort(
"Properties for GAPW in EC NYA")
3476 CALL get_qs_env(qs_env=qs_env, &
3478 CALL pw_env_get(pw_env=pw_env, &
3479 auxbas_pw_pool=auxbas_pw_pool, &
3481 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
3483 IF (dft_control%nspins > 1)
THEN
3486 CALL pw_copy(ec_env%rhoout_r(1), rho_elec_rspace)
3487 CALL pw_axpy(ec_env%rhoout_r(2), rho_elec_rspace)
3489 CALL pw_axpy(ec_env%rhoz_r(1), rho_elec_rspace)
3490 CALL pw_axpy(ec_env%rhoz_r(2), rho_elec_rspace)
3494 CALL pw_copy(ec_env%rhoout_r(1), rho_elec_rspace)
3495 CALL pw_axpy(ec_env%rhoz_r(1), rho_elec_rspace)
3498 IF (should_print_voro /= 0)
THEN
3499 CALL section_vals_val_get(print_key_voro,
"OUTPUT_TEXT", l_val=voro_print_txt)
3500 IF (voro_print_txt)
THEN
3501 append_voro = section_get_lval(ec_section,
"PRINT%VORONOI%APPEND")
3502 my_pos_voro =
"REWIND"
3503 IF (append_voro)
THEN
3504 my_pos_voro =
"APPEND"
3506 unit_nr_voro = cp_print_key_unit_nr(logger, ec_section,
"PRINT%VORONOI", extension=
".voronoi", &
3507 file_position=my_pos_voro, log_filename=.false.)
3515 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3516 unit_nr_voro, qs_env, rho_elec_rspace)
3518 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3520 IF (unit_nr_voro > 0)
THEN
3521 CALL cp_print_key_finished_output(unit_nr_voro, logger, ec_section,
"PRINT%VORONOI")
3526 CALL timestop(handle)
3528 END SUBROUTINE ec_properties
3535 SUBROUTINE harris_wfn_output(qs_env, ec_env, unit_nr)
3536 TYPE(qs_environment_type),
POINTER :: qs_env
3537 TYPE(energy_correction_type),
POINTER :: ec_env
3538 INTEGER,
INTENT(IN) :: unit_nr
3540 CHARACTER(LEN=*),
PARAMETER :: routinen =
'harris_wfn_output'
3542 INTEGER :: handle, ic, ires, ispin, nimages, nsize, &
3544 INTEGER,
DIMENSION(3) :: cell
3545 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
3546 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
3547 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
3548 TYPE(cp_fm_type) :: fmat
3549 TYPE(cp_logger_type),
POINTER :: logger
3550 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: denmat
3551 TYPE(mp_para_env_type),
POINTER :: para_env
3552 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3553 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3554 TYPE(section_vals_type),
POINTER :: ec_section
3558 CALL timeset(routinen, handle)
3560 logger => cp_get_default_logger()
3562 ec_section => section_vals_get_subs_vals(qs_env%input,
"DFT%ENERGY_CORRECTION")
3563 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set)
3565 IF (ec_env%do_kpoints)
THEN
3566 ires = cp_print_key_unit_nr(logger, ec_section,
"PRINT%HARRIS_OUTPUT_WFN", &
3567 extension=
".kp", file_status=
"REPLACE", file_action=
"WRITE", &
3568 file_form=
"UNFORMATTED", middle_name=
"Harris")
3570 CALL write_kpoints_file_header(qs_kind_set, particle_set, ires)
3572 denmat => ec_env%matrix_p
3573 nspin =
SIZE(denmat, 1)
3574 nimages =
SIZE(denmat, 2)
3575 NULLIFY (cell_to_index)
3576 IF (nimages > 1)
THEN
3577 CALL get_kpoint_info(kpoint=ec_env%kpoints, cell_to_index=cell_to_index)
3579 CALL dbcsr_get_info(denmat(1, 1)%matrix, nfullrows_total=nsize)
3580 NULLIFY (blacs_env, para_env)
3581 CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env, para_env=para_env)
3583 CALL cp_fm_struct_create(fm_struct, context=blacs_env, nrow_global=nsize, &
3584 ncol_global=nsize, para_env=para_env)
3585 CALL cp_fm_create(fmat, fm_struct)
3586 CALL cp_fm_struct_release(fm_struct)
3589 IF (ires > 0)
WRITE (ires) ispin, nspin, nimages
3591 IF (nimages > 1)
THEN
3592 cell = get_cell(ic, cell_to_index)
3596 IF (ires > 0)
WRITE (ires) ic, cell
3597 CALL copy_dbcsr_to_fm(denmat(ispin, ic)%matrix, fmat)
3598 CALL cp_fm_write_unformatted(fmat, ires)
3602 CALL cp_print_key_finished_output(ires, logger, ec_section,
"PRINT%HARRIS_OUTPUT_WFN")
3603 CALL cp_fm_release(fmat)
3605 CALL cp_warn(__location__, &
3606 "Orbital energy correction potential is an experimental feature. "// &
3607 "Use it with extreme care")
3610 CALL timestop(handle)
3612 END SUBROUTINE harris_wfn_output
3620 SUBROUTINE response_force_error(qs_env, ec_env, unit_nr)
3621 TYPE(qs_environment_type),
POINTER :: qs_env
3622 TYPE(energy_correction_type),
POINTER :: ec_env
3623 INTEGER,
INTENT(IN) :: unit_nr
3625 CHARACTER(LEN=10) :: eformat
3626 INTEGER :: feunit, funit, i, ia, ib, ispin, mref, &
3627 na, nao, natom, nb, norb, nref, &
3629 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: natom_of_kind, rlist, t2cind
3630 LOGICAL :: debug_f, do_resp, is_source
3631 REAL(kind=dp) :: focc, rfac, vres
3632 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: tvec, yvec
3633 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eforce, fmlocal, fmreord, smat
3634 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: smpforce
3635 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
3636 TYPE(cp_fm_struct_type),
POINTER :: fm_struct, fm_struct_mat
3637 TYPE(cp_fm_type) :: hmats
3638 TYPE(cp_fm_type),
DIMENSION(:, :),
POINTER :: rpmos, spmos
3639 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
3640 TYPE(dbcsr_type),
POINTER :: mats
3641 TYPE(mp_para_env_type),
POINTER :: para_env
3642 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: ks_force, res_force
3643 TYPE(virial_type) :: res_virial
3644 TYPE(virial_type),
POINTER :: ks_virial
3646 IF (unit_nr > 0)
THEN
3647 WRITE (unit_nr,
'(/,T2,A,A,A,A,A)')
"!", repeat(
"-", 25), &
3648 " Response Force Error Est. ", repeat(
"-", 25),
"!"
3649 SELECT CASE (ec_env%error_method)
3651 WRITE (unit_nr,
'(T2,A)')
" Response Force Error Est. using full RHS"
3653 WRITE (unit_nr,
'(T2,A)')
" Response Force Error Est. using delta RHS"
3655 WRITE (unit_nr,
'(T2,A)')
" Response Force Error Est. using extrapolated RHS"
3656 WRITE (unit_nr,
'(T2,A,E20.10)')
" Extrapolation cutoff:", ec_env%error_cutoff
3657 WRITE (unit_nr,
'(T2,A,I10)')
" Max. extrapolation size:", ec_env%error_subspace
3659 cpabort(
"Unknown Error Estimation Method")
3663 IF (abs(ec_env%orbrot_index) > 1.e-8_dp .OR. ec_env%phase_index > 1.e-8_dp)
THEN
3664 cpabort(
"Response error calculation for rotated orbital sets not implemented")
3667 SELECT CASE (ec_env%energy_functional)
3668 CASE (ec_functional_harris)
3669 cpwarn(
'Response force error calculation not possible for Harris functional.')
3670 CASE (ec_functional_dc)
3671 cpwarn(
'Response force error calculation not possible for DCDFT.')
3672 CASE (ec_functional_ext)
3675 CALL get_qs_env(qs_env, force=ks_force, virial=ks_virial, &
3676 atomic_kind_set=atomic_kind_set)
3677 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, natom_of_kind=natom_of_kind)
3679 CALL allocate_qs_force(res_force, natom_of_kind)
3680 DEALLOCATE (natom_of_kind)
3681 CALL zero_qs_force(res_force)
3682 res_virial = ks_virial
3683 CALL zero_virial(ks_virial, reset=.false.)
3684 CALL set_qs_env(qs_env, force=res_force)
3686 CALL get_qs_env(qs_env, natom=natom)
3687 ALLOCATE (eforce(3, natom))
3689 CALL get_qs_env(qs_env, para_env=para_env)
3690 is_source = para_env%is_source()
3692 nspins =
SIZE(ec_env%mo_occ)
3693 CALL cp_fm_get_info(ec_env%mo_occ(1), nrow_global=nao)
3696 CALL open_file(ec_env%exresperr_fn, file_status=
"OLD", file_action=
"READ", &
3697 file_form=
"FORMATTED", unit_number=funit)
3698 READ (funit,
'(A)') eformat
3699 CALL uppercase(eformat)
3700 READ (funit, *) nsample
3702 CALL para_env%bcast(nsample, para_env%source)
3703 CALL para_env%bcast(eformat, para_env%source)
3705 CALL cp_fm_get_info(ec_env%mo_occ(1), matrix_struct=fm_struct)
3706 CALL cp_fm_struct_create(fm_struct_mat, template_fmstruct=fm_struct, &
3707 nrow_global=nao, ncol_global=nao)
3708 ALLOCATE (fmlocal(nao, nao))
3709 IF (adjustl(trim(eformat)) ==
"TREXIO")
THEN
3710 ALLOCATE (fmreord(nao, nao))
3711 CALL get_t2cindex(qs_env, t2cind)
3713 ALLOCATE (rpmos(nsample, nspins))
3714 ALLOCATE (smpforce(3, natom, nsample))
3718 IF (nspins == 1) focc = 4.0_dp
3719 CALL cp_fm_create(hmats, fm_struct_mat)
3722 DO ispin = 1, nspins
3723 CALL cp_fm_create(rpmos(i, ispin), fm_struct)
3725 READ (funit, *) na, nb
3726 cpassert(na == nao .AND. nb == nao)
3727 READ (funit, *) fmlocal
3731 CALL para_env%bcast(fmlocal)
3733 SELECT CASE (adjustl(trim(eformat)))
3740 fmreord(ia, ib) = fmlocal(t2cind(ia), t2cind(ib))
3743 fmlocal(1:nao, 1:nao) = fmreord(1:nao, 1:nao)
3745 cpabort(
"Error file dE/dC: unknown format")
3748 CALL cp_fm_set_submatrix(hmats, fmlocal, 1, 1, nao, nao)
3749 CALL cp_fm_get_info(rpmos(i, ispin), ncol_global=norb)
3750 CALL parallel_gemm(
'N',
'N', nao, norb, nao, focc, hmats, &
3751 ec_env%mo_occ(ispin), 0.0_dp, rpmos(i, ispin))
3752 IF (ec_env%error_method ==
"D" .OR. ec_env%error_method ==
"E")
THEN
3753 CALL cp_fm_scale_and_add(1.0_dp, rpmos(i, ispin), -1.0_dp, ec_env%cpref(ispin))
3757 CALL cp_fm_struct_release(fm_struct_mat)
3758 IF (adjustl(trim(eformat)) ==
"TREXIO")
THEN
3759 DEALLOCATE (fmreord, t2cind)
3763 CALL close_file(funit)
3766 IF (unit_nr > 0)
THEN
3767 CALL open_file(ec_env%exresult_fn, file_status=
"OLD", file_form=
"FORMATTED", &
3768 file_action=
"WRITE", file_position=
"APPEND", unit_number=feunit)
3769 WRITE (feunit,
"(/,6X,A)")
" Response Forces from error sampling [Hartree/Bohr]"
3771 WRITE (feunit,
"(5X,I8)") i
3773 WRITE (feunit,
"(5X,3F20.12)") ec_env%rf(1:3, ia)
3777 debug_f = ec_env%debug_forces .OR. ec_env%debug_stress
3779 IF (ec_env%error_method ==
"E")
THEN
3780 CALL get_qs_env(qs_env, matrix_s=matrix_s)
3781 mats => matrix_s(1)%matrix
3782 ALLOCATE (spmos(nsample, nspins))
3784 DO ispin = 1, nspins
3785 CALL cp_fm_create(spmos(i, ispin), fm_struct, set_zero=.true.)
3786 CALL cp_dbcsr_sm_fm_multiply(mats, rpmos(i, ispin), spmos(i, ispin), norb)
3791 mref = ec_env%error_subspace
3792 mref = min(mref, nsample)
3794 ALLOCATE (smat(mref, mref), tvec(mref), yvec(mref), rlist(mref))
3797 CALL cp_fm_release(ec_env%cpmos)
3800 IF (unit_nr > 0)
THEN
3801 WRITE (unit_nr,
'(T2,A,I6)')
" Response Force Number ", i
3804 CALL zero_qs_force(res_force)
3805 CALL zero_virial(ks_virial, reset=.false.)
3806 DO ispin = 1, nspins
3807 CALL dbcsr_set(ec_env%matrix_hz(ispin)%matrix, 0.0_dp)
3810 ALLOCATE (ec_env%cpmos(nspins))
3811 DO ispin = 1, nspins
3812 CALL cp_fm_create(ec_env%cpmos(ispin), fm_struct)
3816 IF (ec_env%error_method ==
"F" .OR. ec_env%error_method ==
"D")
THEN
3817 DO ispin = 1, nspins
3818 CALL cp_fm_to_fm(rpmos(i, ispin), ec_env%cpmos(ispin))
3820 ELSE IF (ec_env%error_method ==
"E")
THEN
3821 CALL cp_extrapolate(rpmos, spmos, i, nref, rlist, smat, tvec, yvec, vres)
3822 IF (vres > ec_env%error_cutoff .OR. nref < min(5, mref))
THEN
3823 DO ispin = 1, nspins
3824 CALL cp_fm_to_fm(rpmos(i, ispin), ec_env%cpmos(ispin))
3829 DO ispin = 1, nspins
3830 CALL cp_fm_scale_and_add(1.0_dp, ec_env%cpmos(ispin), &
3831 rfac, rpmos(ia, ispin))
3837 IF (unit_nr > 0)
THEN
3838 WRITE (unit_nr,
'(T2,A,T60,I4,T69,F12.8)') &
3839 " Response Vector Extrapolation [nref|delta] = ", nref, vres
3842 cpabort(
"Unknown Error Estimation Method")
3846 CALL matrix_r_forces(qs_env, ec_env%cpmos, ec_env%mo_occ, &
3847 ec_env%matrix_w(1, 1)%matrix, unit_nr, &
3848 ec_env%debug_forces, ec_env%debug_stress)
3850 CALL response_calculation(qs_env, ec_env, silent=.true.)
3852 CALL response_force(qs_env, &
3853 vh_rspace=ec_env%vh_rspace, &
3854 vxc_rspace=ec_env%vxc_rspace, &
3855 vtau_rspace=ec_env%vtau_rspace, &
3856 vadmm_rspace=ec_env%vadmm_rspace, &
3857 matrix_hz=ec_env%matrix_hz, &
3858 matrix_pz=ec_env%matrix_z, &
3859 matrix_pz_admm=ec_env%z_admm, &
3860 matrix_wz=ec_env%matrix_wz, &
3861 rhopz_r=ec_env%rhoz_r, &
3862 zehartree=ec_env%ehartree, &
3864 zexc_aux_fit=ec_env%exc_aux_fit, &
3865 p_env=ec_env%p_env, &
3867 CALL total_qs_force(eforce, res_force, atomic_kind_set)
3868 CALL para_env%sum(eforce)
3870 IF (unit_nr > 0)
THEN
3871 WRITE (unit_nr,
'(T2,A)')
" Response Force Calculation is skipped. "
3876 IF (ec_env%error_method ==
"D")
THEN
3877 eforce(1:3, 1:natom) = eforce(1:3, 1:natom) + ec_env%rf(1:3, 1:natom)
3878 smpforce(1:3, 1:natom, i) = eforce(1:3, 1:natom)
3879 ELSE IF (ec_env%error_method ==
"E")
THEN
3883 eforce(1:3, 1:natom) = eforce(1:3, 1:natom) + rfac*smpforce(1:3, 1:natom, ia)
3885 smpforce(1:3, 1:natom, i) = eforce(1:3, 1:natom)
3886 eforce(1:3, 1:natom) = eforce(1:3, 1:natom) + ec_env%rf(1:3, 1:natom)
3887 IF (do_resp .AND. nref < mref)
THEN
3892 smpforce(1:3, 1:natom, i) = eforce(1:3, 1:natom)
3895 IF (unit_nr > 0)
THEN
3896 WRITE (unit_nr, *)
" FORCES"
3898 WRITE (unit_nr,
"(i7,3F11.6,6X,3F11.6)") ia, eforce(1:3, ia), &
3899 (eforce(1:3, ia) - ec_env%rf(1:3, ia))
3903 WRITE (feunit,
"(5X,I8)") i
3905 WRITE (feunit,
"(5X,3F20.12)") eforce(1:3, ia)
3909 CALL cp_fm_release(ec_env%cpmos)
3913 IF (unit_nr > 0)
THEN
3914 CALL close_file(feunit)
3917 DEALLOCATE (smat, tvec, yvec, rlist)
3919 CALL cp_fm_release(hmats)
3920 CALL cp_fm_release(rpmos)
3921 IF (ec_env%error_method ==
"E")
THEN
3922 CALL cp_fm_release(spmos)
3925 DEALLOCATE (eforce, smpforce)
3928 CALL get_qs_env(qs_env, force=res_force, virial=ks_virial)
3929 CALL set_qs_env(qs_env, force=ks_force)
3930 CALL deallocate_qs_force(res_force)
3931 ks_virial = res_virial
3934 cpabort(
"unknown energy correction")
3937 END SUBROUTINE response_force_error
3951 SUBROUTINE cp_extrapolate(rpmos, Spmos, ip, nref, rlist, smat, tvec, yvec, vres)
3952 TYPE(cp_fm_type),
DIMENSION(:, :),
POINTER :: rpmos, spmos
3953 INTEGER,
INTENT(IN) :: ip, nref
3954 INTEGER,
DIMENSION(:),
INTENT(IN) :: rlist
3955 REAL(kind=dp),
DIMENSION(:, :),
INTENT(INOUT) :: smat
3956 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: tvec, yvec
3957 REAL(kind=dp),
INTENT(OUT) :: vres
3959 INTEGER :: i, ia, j, ja
3960 REAL(kind=dp) :: aval
3961 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: sinv
3969 ALLOCATE (sinv(nref, nref))
3973 tvec(i) = ctrace(rpmos(ip, :), spmos(ia, :))
3976 smat(j, i) = ctrace(rpmos(ja, :), spmos(ia, :))
3977 smat(i, j) = smat(j, i)
3979 smat(i, i) = ctrace(rpmos(ia, :), spmos(ia, :))
3981 aval = ctrace(rpmos(ip, :), spmos(ip, :))
3983 sinv(1:nref, 1:nref) = smat(1:nref, 1:nref)
3984 CALL invmat_symm(sinv(1:nref, 1:nref))
3986 yvec(1:nref) = matmul(sinv(1:nref, 1:nref), tvec(1:nref))
3988 vres = aval - sum(yvec(1:nref)*tvec(1:nref))
3989 vres = sqrt(abs(vres))
3996 END SUBROUTINE cp_extrapolate
4004 FUNCTION ctrace(ca, cb)
4005 TYPE(cp_fm_type),
DIMENSION(:) :: ca, cb
4006 REAL(kind=dp) :: ctrace
4009 REAL(kind=dp) :: trace
4015 CALL cp_fm_trace(ca(is), cb(is), trace)
4016 ctrace = ctrace + trace
4026 SUBROUTINE get_t2cindex(qs_env, t2cind)
4027 TYPE(qs_environment_type),
POINTER :: qs_env
4028 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: t2cind
4030 INTEGER :: i, iatom, ikind, is, iset, ishell, k, l, &
4031 m, natom, nset, nsgf, numshell
4032 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lshell
4033 INTEGER,
DIMENSION(:),
POINTER :: nshell
4034 INTEGER,
DIMENSION(:, :),
POINTER :: lval
4035 TYPE(gto_basis_set_type),
POINTER :: basis_set
4036 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
4037 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4041 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, natom=natom)
4042 CALL get_qs_kind_set(qs_kind_set, nshell=numshell, nsgf=nsgf)
4044 ALLOCATE (t2cind(nsgf))
4045 ALLOCATE (lshell(numshell))
4049 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
4050 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis_set, basis_type=
"ORB")
4051 CALL get_gto_basis_set(basis_set, nset=nset, nshell=nshell, l=lval)
4053 DO is = 1, nshell(iset)
4062 DO ishell = 1, numshell
4065 m = (-1)**k*floor(real(k, kind=dp)/2.0_dp)
4066 t2cind(i + l + 1 + m) = i + k
4073 END SUBROUTINE get_t2cindex
subroutine, public accint_weight_force(qs_env, rho, rho1, order, xc_section, triplet)
...
Contains ADMM methods which only require the density matrix.
subroutine, public admm_dm_calc_rho_aux(qs_env)
Entry methods: Calculates auxiliary density matrix from primary one.
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_mo_calc_rho_aux(qs_env)
...
Types and set/get functions for auxiliary density matrix methods.
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.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public belleflamme2023
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_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
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)
Copy a DBCSR matrix to a BLACS matrix.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
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_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_write_unformatted(fm, unit)
...
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
Routines for an energy correction on top of a Kohn-Sham calculation.
subroutine, public ec_diag_solver_gamma(qs_env, ec_env, matrix_ks, matrix_s, matrix_p, matrix_w)
Solve KS equation using diagonalization.
subroutine, public ec_ot_diag_solver(qs_env, ec_env, matrix_ks, matrix_s, matrix_p, matrix_w)
Use OT-diagonalziation to obtain density matrix from Harris Kohn-Sham matrix Initial guess of density...
subroutine, public ec_ls_solver(qs_env, matrix_p, matrix_w, ec_ls_method)
Solve the Harris functional by linear scaling density purification scheme, instead of the diagonaliza...
subroutine, public ec_diag_solver_kp(qs_env, ec_env, matrix_ks, matrix_s, matrix_p, matrix_w)
Solve Kpoint-KS equation using diagonalization.
subroutine, public ec_ls_init(qs_env, matrix_ks, matrix_s)
Solve the Harris functional by linear scaling density purification scheme, instead of the diagonaliza...
Calculates the energy contribution and the mo_derivative of a static electric field (nonperiodic)
subroutine, public ec_efield_local_operator(qs_env, ec_env, calculate_forces)
...
subroutine, public ec_efield_integrals(qs_env, ec_env, rpoint)
...
Types needed for a for a Energy Correction.
subroutine, public ec_env_potential_release(ec_env)
...
Routines for an external energy correction on top of a Kohn-Sham calculation.
subroutine, public ec_ext_energy(qs_env, ec_env, calculate_forces)
External energy method.
subroutine, public matrix_r_forces(qs_env, cpmos, mo_occ, matrix_r, unit_nr, debug_forces, debug_stress)
...
Routines used for Harris functional Kohn-Sham calculation.
subroutine, public create_kernel(qs_env, vxc, vxc_tau, rho, rho1_r, rho1_g, tau1_r, xc_section, compute_virial, virial_xc)
Creation of second derivative xc-potential.
Routines for an energy correction on top of a Kohn-Sham calculation.
subroutine, public energy_correction(qs_env, ec_init, calculate_forces)
Energy Correction to a Kohn-Sham simulation Available energy corrections: (1) Harris energy functiona...
Definition of the atomic potential types.
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
subroutine, public hartree_local_release(hartree_local)
...
subroutine, public hartree_local_create(hartree_local)
...
Routines to calculate EXX in RPA and energy correction methods.
subroutine, public calculate_exx(qs_env, unit_nr, hfx_sections, x_data, do_gw, do_admm, calc_forces, reuse_hfx, do_im_time, e_ex_from_gw, e_admm_from_gw, t3)
...
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.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Restart file for k point calculations.
subroutine, public write_kpoints_file_header(qs_kind_set, particle_set, ires)
...
integer function, dimension(3), public get_cell(ic, cell_to_index)
...
Routines needed for kpoint calculation.
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, nimages)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_generate_basis(qs_env, mao_coef, ref_basis_set, pmat_external, smat_external, molecular, max_iter, eps_grad, nmao_external, eps1_mao, iolevel, unit_nr)
...
Collection of simple mathematical functions and subroutines.
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
Interface to the message passing library MPI.
Define the data structure for the molecule information.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
subroutine, public get_paw_proj_set(paw_proj_set, csprj, chprj, first_prj, first_prjs, last_prj, local_oce_sphi_h, local_oce_sphi_s, maxl, ncgauprj, nsgauprj, nsatbas, nsotot, nprj, o2nindex, n2oindex, rcprj, rzetprj, zisomin, zetprj)
Get informations about a paw projectors set.
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
Definition of physical constants:
real(kind=dp), parameter, public pascal
real(kind=dp), parameter, public bohr
real(kind=dp), parameter, public debye
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
Calculation of the energies concerning the core charge distribution.
subroutine, public calculate_ecore_overlap(qs_env, para_env, calculate_forces, molecular, e_overlap_core, atecc)
Calculate the overlap energy of the core charge distribution.
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.
Calculation of dispersion using pair potentials.
subroutine, public calculate_dispersion_pairpot(qs_env, dispersion_env, energy, calculate_forces, atevdw)
...
Definition of disperson types for DFT calculations.
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, 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.
subroutine, public deallocate_qs_force(qs_force)
Deallocate a Quickstep force data structure.
subroutine, public zero_qs_force(qs_force)
Initialize a Quickstep force data structure.
subroutine, public allocate_qs_force(qs_force, natom_of_kind)
Allocate a Quickstep force data structure.
subroutine, public total_qs_force(force, qs_force, atomic_kind_set)
Get current total force.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
Calculation of kinetic energy matrix and forces.
subroutine, public build_kinetic_matrix(ks_env, matrix_t, matrixkp_t, matrix_name, basis_type, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints, eps_filter, nderivative)
Calculation of the kinetic energy matrix over Cartesian Gaussian functions.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
Calculate the KS reference potentials.
subroutine, public ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, ehartree, exc, h_stress)
calculate the Kohn-Sham reference potential
subroutine, public ks_ref_potential_atom(qs_env, local_rho_set, local_rho_set_admm, v_hartree_rspace)
calculate the Kohn-Sham GAPW reference potentials
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
Generate the atomic neighbor lists.
subroutine, public atom2d_cleanup(atom2d)
free the internals of atom2d
subroutine, public pair_radius_setup(present_a, present_b, radius_a, radius_b, pair_radius, prmin)
...
subroutine, public build_neighbor_lists(ab_list, particle_set, atom, cell, pair_radius, subcells, mic, symmetric, molecular, subset_of_mol, current_subset, operator_type, nlname, atomb_to_keep)
Build simple pair neighbor lists.
subroutine, public atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, molecule_set, molecule_only, particle_set)
Build some distribution structure of atoms, refactored from build_qs_neighbor_lists.
Routines for the construction of the coefficients for the expansion of the atomic densities rho1_hard...
subroutine, public build_oce_matrices(intac, calculate_forces, nder, qs_kind_set, particle_set, sap_oce, eps_fit)
Set up the sparse matrix for the coefficients of one center expansions This routine uses the same log...
subroutine, public allocate_oce_set(oce_set, nkind)
Allocate and initialize the matrix set of oce coefficients.
subroutine, public create_oce_set(oce_set)
...
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.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Calculate the CPKS equation and the resulting forces.
subroutine, public response_force(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, matrix_hz, matrix_pz, matrix_pz_admm, matrix_wz, zehartree, zexc, zexc_aux_fit, rhopz_r, p_env, ex_env, debug)
...
subroutine, public response_calculation(qs_env, ec_env, silent)
Initializes solver of linear response equation for energy correction.
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, basis_type, reorder_rs_grid_ranks, skip_load_balance_distributed, pw_env_external, sab_orb_external, ext_kpoints)
...
subroutine, public deallocate_task_list(task_list)
deallocates the components and the object itself
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
subroutine, public write_stress_tensor(pv_virial, iw, cell, unit_string, numerical)
Print stress tensor to output file.
subroutine, public write_stress_tensor_components(virial, iw, cell, unit_string)
...
pure real(kind=dp) function, public one_third_sum_diag(a)
...
subroutine, public zero_virial(virial, reset)
...
subroutine, public symmetrize_virial(virial)
Symmetrize the virial components.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
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
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
structure to store local (to a processor) ordered lists of integers.
distributes pairs on a 2d grid of processors
Contains information on the energy correction functional for KG.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
to create arrays of pools
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.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.