35 USE dbcsr_api,
ONLY: &
36 dbcsr_add, dbcsr_complete_redistribute, dbcsr_copy, dbcsr_create, dbcsr_dot, dbcsr_p_type, &
37 dbcsr_release, dbcsr_scale, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric
128 #include "./base/base_uses.f90"
134 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_forces'
154 TYPE(qs_environment_type),
POINTER :: qs_env
155 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
157 TYPE(excited_energy_type),
POINTER :: ex_env
158 TYPE(kernel_env_type) :: kernel_env
159 TYPE(tddfpt_subgroup_env_type) :: sub_env
160 TYPE(tddfpt_work_matrices) :: work_matrices
162 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces_main'
164 INTEGER :: handle, ispin, nspins
165 TYPE(admm_type),
POINTER :: admm_env
166 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
167 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe_asymm, matrix_pe_symm, &
168 matrix_s, matrix_s_aux_fit
169 TYPE(dft_control_type),
POINTER :: dft_control
170 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
172 CALL timeset(routinen, handle)
174 CALL get_qs_env(qs_env, dft_control=dft_control)
175 nspins = dft_control%nspins
176 tddfpt_control => dft_control%tddfpt2_control
178 IF (
ASSOCIATED(ex_env%cpmos))
THEN
179 DO ispin = 1,
SIZE(ex_env%cpmos)
180 CALL cp_fm_release(ex_env%cpmos(ispin))
182 DEALLOCATE (ex_env%cpmos)
184 ALLOCATE (ex_env%cpmos(nspins))
186 CALL cp_fm_get_info(matrix=ex_env%evect(ispin), matrix_struct=matrix_struct)
190 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
191 NULLIFY (matrix_pe_asymm, matrix_pe_symm)
196 ALLOCATE (ex_env%matrix_pe(ispin)%matrix)
197 CALL dbcsr_create(ex_env%matrix_pe(ispin)%matrix, template=matrix_s(1)%matrix)
198 CALL dbcsr_copy(ex_env%matrix_pe(ispin)%matrix, matrix_s(1)%matrix)
199 CALL dbcsr_set(ex_env%matrix_pe(ispin)%matrix, 0.0_dp)
201 ALLOCATE (matrix_pe_symm(ispin)%matrix)
202 CALL dbcsr_create(matrix_pe_symm(ispin)%matrix, template=matrix_s(1)%matrix)
203 CALL dbcsr_copy(matrix_pe_symm(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix)
205 ALLOCATE (matrix_pe_asymm(ispin)%matrix)
206 CALL dbcsr_create(matrix_pe_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
207 matrix_type=dbcsr_type_antisymmetric)
208 CALL dbcsr_complete_redistribute(ex_env%matrix_pe(ispin)%matrix, matrix_pe_asymm(ispin)%matrix)
210 CALL tddfpt_resvec1(ex_env%evect(ispin), gs_mos(ispin)%mos_occ, &
211 matrix_s(1)%matrix, ex_env%matrix_pe(ispin)%matrix)
215 IF (dft_control%do_admm)
THEN
217 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
220 ALLOCATE (ex_env%matrix_pe_admm(ispin)%matrix)
221 CALL dbcsr_create(ex_env%matrix_pe_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
222 CALL dbcsr_copy(ex_env%matrix_pe_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
223 CALL dbcsr_set(ex_env%matrix_pe_admm(ispin)%matrix, 0.0_dp)
224 CALL tddfpt_resvec1_admm(ex_env%matrix_pe(ispin)%matrix, &
225 admm_env, ex_env%matrix_pe_admm(ispin)%matrix)
231 ALLOCATE (ex_env%matrix_hz(ispin)%matrix)
232 CALL dbcsr_create(ex_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
233 CALL dbcsr_copy(ex_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
234 CALL dbcsr_set(ex_env%matrix_hz(ispin)%matrix, 0.0_dp)
236 IF (dft_control%qs_control%xtb)
THEN
237 CALL tddfpt_resvec2_xtb(qs_env, ex_env%matrix_pe, gs_mos, ex_env%matrix_hz, ex_env%cpmos)
239 CALL tddfpt_resvec2(qs_env, ex_env%matrix_pe, ex_env%matrix_pe_admm, &
240 gs_mos, ex_env%matrix_hz, ex_env%cpmos)
246 ALLOCATE (ex_env%matrix_px1(ispin)%matrix)
247 CALL dbcsr_create(ex_env%matrix_px1(ispin)%matrix, template=matrix_s(1)%matrix)
248 CALL dbcsr_copy(ex_env%matrix_px1(ispin)%matrix, matrix_s(1)%matrix)
249 CALL dbcsr_set(ex_env%matrix_px1(ispin)%matrix, 0.0_dp)
251 ALLOCATE (ex_env%matrix_px1_asymm(ispin)%matrix)
252 CALL dbcsr_create(ex_env%matrix_px1_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
253 matrix_type=dbcsr_type_antisymmetric)
254 CALL dbcsr_complete_redistribute(ex_env%matrix_px1(ispin)%matrix, ex_env%matrix_px1_asymm(ispin)%matrix)
257 IF (tddfpt_control%do_admm)
THEN
259 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
263 ALLOCATE (ex_env%matrix_px1_admm(ispin)%matrix)
264 CALL dbcsr_create(ex_env%matrix_px1_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
265 CALL dbcsr_copy(ex_env%matrix_px1_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
266 CALL dbcsr_set(ex_env%matrix_px1_admm(ispin)%matrix, 0.0_dp)
268 ALLOCATE (ex_env%matrix_px1_admm_asymm(ispin)%matrix)
269 CALL dbcsr_create(ex_env%matrix_px1_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
270 matrix_type=dbcsr_type_antisymmetric)
271 CALL dbcsr_complete_redistribute(ex_env%matrix_px1_admm(ispin)%matrix, &
272 ex_env%matrix_px1_admm_asymm(ispin)%matrix)
276 CALL tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
278 CALL tddfpt_resvec3(qs_env, ex_env%cpmos, work_matrices)
283 CALL timestop(handle)
298 SUBROUTINE tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
300 TYPE(qs_environment_type),
POINTER :: qs_env
301 TYPE(excited_energy_type),
POINTER :: ex_env
302 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
304 TYPE(kernel_env_type),
INTENT(IN) :: kernel_env
305 TYPE(tddfpt_subgroup_env_type) :: sub_env
306 TYPE(tddfpt_work_matrices) :: work_matrices
308 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces'
311 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: natom_of_kind
312 LOGICAL :: debug_forces
313 REAL(kind=
dp) :: ehartree, exc
314 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
315 TYPE(dft_control_type),
POINTER :: dft_control
316 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: ks_force, td_force
318 CALL timeset(routinen, handle)
321 debug_forces = ex_env%debug_forces
323 CALL get_qs_env(qs_env, dft_control=dft_control, force=ks_force, &
324 atomic_kind_set=atomic_kind_set)
328 DEALLOCATE (natom_of_kind)
332 IF (dft_control%qs_control%xtb)
THEN
333 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
334 work_matrices, debug_forces)
339 ex_env%vtau_rspace, ex_env%vadmm_rspace, ehartree, exc)
342 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
343 work_matrices, debug_forces)
352 CALL timestop(handle)
354 END SUBROUTINE tddfpt_forces
368 SUBROUTINE tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, &
371 TYPE(qs_environment_type),
POINTER :: qs_env
372 TYPE(excited_energy_type),
POINTER :: ex_env
373 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
375 TYPE(kernel_env_type),
INTENT(IN) :: kernel_env
376 TYPE(tddfpt_subgroup_env_type) :: sub_env
377 TYPE(tddfpt_work_matrices) :: work_matrices
378 LOGICAL :: debug_forces
380 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_force_direct'
382 INTEGER :: handle, iounit, ispin, natom, norb, &
384 REAL(kind=
dp) :: evalue
385 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2
386 REAL(kind=
dp),
DIMENSION(3) :: fodeb
387 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
388 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: evect
389 TYPE(cp_logger_type),
POINTER :: logger
390 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, matrix_wx1, &
392 TYPE(dft_control_type),
POINTER :: dft_control
393 TYPE(mp_para_env_type),
POINTER :: para_env
394 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
396 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
397 TYPE(qs_ks_env_type),
POINTER :: ks_env
398 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
400 CALL timeset(routinen, handle)
403 IF (logger%para_env%is_source())
THEN
409 evect => ex_env%evect
411 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, para_env=para_env, &
412 sab_orb=sab_orb, dft_control=dft_control, force=force)
413 NULLIFY (tddfpt_control)
414 tddfpt_control => dft_control%tddfpt2_control
415 nspins = dft_control%nspins
417 IF (debug_forces)
THEN
418 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
419 ALLOCATE (ftot1(3, natom))
423 CALL tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
426 matrix_wx1 => ex_env%matrix_wx1
427 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
431 ALLOCATE (matrix_wz(ispin)%matrix)
432 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
434 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
437 evalue = ex_env%evalue
438 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
439 evalue = ex_env%evalue - tddfpt_control%ev_shift
441 CALL dbcsr_scale(matrix_wz(ispin)%matrix, evalue)
443 matrix_wz(ispin)%matrix)
445 IF (nspins == 2)
THEN
446 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
447 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
450 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
452 matrix_name=
"OVERLAP MATRIX", &
453 basis_type_a=
"ORB", basis_type_b=
"ORB", &
454 sab_nl=sab_orb, calculate_forces=.true., &
455 matrix_p=matrix_wz(1)%matrix)
458 IF (debug_forces)
THEN
459 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
460 CALL para_env%sum(fodeb)
461 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wx*dS ", fodeb
465 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
469 ALLOCATE (matrix_wz(ispin)%matrix)
470 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
472 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
474 evalue = ex_env%evalue
475 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
476 evalue = ex_env%evalue - tddfpt_control%ev_shift
479 matrix_ks(ispin)%matrix, matrix_wz(ispin)%matrix, evalue)
481 IF (nspins == 2)
THEN
482 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
483 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
486 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
488 matrix_name=
"OVERLAP MATRIX", &
489 basis_type_a=
"ORB", basis_type_b=
"ORB", &
490 sab_nl=sab_orb, calculate_forces=.true., &
491 matrix_p=matrix_wz(1)%matrix)
494 IF (debug_forces)
THEN
495 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
496 CALL para_env%sum(fodeb)
497 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: xWx*dS ", fodeb
501 IF (
ASSOCIATED(matrix_wx1))
THEN
502 IF (nspins == 2)
THEN
503 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
504 alpha_scalar=0.5_dp, beta_scalar=0.5_dp)
507 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
509 matrix_name=
"OVERLAP MATRIX", &
510 basis_type_a=
"ORB", basis_type_b=
"ORB", &
511 sab_nl=sab_orb, calculate_forces=.true., &
512 matrix_p=matrix_wx1(1)%matrix)
514 IF (debug_forces)
THEN
515 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
516 CALL para_env%sum(fodeb)
517 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: WK*dS ", fodeb
521 IF (debug_forces)
THEN
522 ALLOCATE (ftot2(3, natom))
524 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
525 CALL para_env%sum(fodeb)
526 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T30,3F16.8)")
"DEBUG:: Excitation Force", fodeb
527 DEALLOCATE (ftot1, ftot2)
530 CALL timestop(handle)
532 END SUBROUTINE tddfpt_force_direct
541 SUBROUTINE tddfpt_resvec1(evect, mos_occ, matrix_s, matrix_pe)
543 TYPE(cp_fm_type),
INTENT(IN) :: evect, mos_occ
544 TYPE(dbcsr_type),
POINTER :: matrix_s, matrix_pe
546 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1'
548 INTEGER :: handle, iounit, nao, norb
550 TYPE(cp_fm_struct_type),
POINTER :: fmstruct, fmstruct2
551 TYPE(cp_fm_type) :: cxmat, xxmat
552 TYPE(cp_logger_type),
POINTER :: logger
554 CALL timeset(routinen, handle)
562 nrow_global=norb, ncol_global=norb)
567 CALL parallel_gemm(
'T',
'N', norb, norb, nao, 1.0_dp, cxmat, evect, 0.0_dp, xxmat)
568 CALL parallel_gemm(
'N',
'N', nao, norb, norb, 1.0_dp, mos_occ, xxmat, 0.0_dp, cxmat)
569 CALL cp_fm_release(xxmat)
572 ncol=norb, alpha=-1.0_dp, symmetry_mode=1)
573 CALL cp_fm_release(cxmat)
576 CALL dbcsr_dot(matrix_pe, matrix_s, tmp)
577 IF (abs(tmp) > 1.e-08_dp)
THEN
579 IF (logger%para_env%is_source())
THEN
584 cpwarn(
"Electron count of excitation density matrix is non-zero.")
586 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
587 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
592 CALL timestop(handle)
594 END SUBROUTINE tddfpt_resvec1
602 SUBROUTINE tddfpt_resvec1_admm(matrix_pe, admm_env, matrix_pe_admm)
604 TYPE(dbcsr_type),
POINTER :: matrix_pe
605 TYPE(admm_type),
POINTER :: admm_env
606 TYPE(dbcsr_type),
POINTER :: matrix_pe_admm
608 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1_admm'
610 INTEGER :: handle, nao, nao_aux
612 CALL timeset(routinen, handle)
614 nao_aux = admm_env%nao_aux_fit
615 nao = admm_env%nao_orb
618 CALL parallel_gemm(
'N',
'N', nao_aux, nao, nao, &
619 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
620 admm_env%work_aux_orb)
621 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, &
622 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
623 admm_env%work_aux_aux)
624 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_pe_admm, keep_sparsity=.true.)
626 CALL timestop(handle)
628 END SUBROUTINE tddfpt_resvec1_admm
639 SUBROUTINE tddfpt_resvec2(qs_env, matrix_pe, matrix_pe_admm, gs_mos, matrix_hz, cpmos)
641 TYPE(qs_environment_type),
POINTER :: qs_env
642 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe, matrix_pe_admm
643 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
645 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz
646 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: cpmos
648 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2'
650 CHARACTER(LEN=default_string_length) :: basis_type
651 INTEGER :: handle, iounit, ispin, mspin, n_rep_hf, &
652 nao, nao_aux, natom, norb, nspins
653 LOGICAL :: deriv2_analytic, distribute_fock_matrix, &
654 do_hfx, gapw, gapw_xc, &
655 hfx_treat_lsd_in_core, &
657 REAL(kind=
dp) :: eh1, focc, rhotot, thartree
658 REAL(kind=
dp),
DIMENSION(2) :: total_rho
659 REAL(kind=
dp),
DIMENSION(:),
POINTER :: qlm_tot
660 TYPE(admm_type),
POINTER :: admm_env
661 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
662 TYPE(cp_fm_type),
POINTER :: mos
663 TYPE(cp_logger_type),
POINTER :: logger
664 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: msaux
665 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mhz, mpe
666 TYPE(dbcsr_type),
POINTER :: dbwork
667 TYPE(dft_control_type),
POINTER :: dft_control
668 TYPE(hartree_local_type),
POINTER :: hartree_local
669 TYPE(hfx_type),
DIMENSION(:, :),
POINTER :: x_data
670 TYPE(local_rho_type),
POINTER :: local_rho_set, local_rho_set_admm
671 TYPE(mp_para_env_type),
POINTER :: para_env
672 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
673 POINTER :: sab, sab_aux_fit
674 TYPE(oce_matrix_type),
POINTER :: oce
675 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_hartree_gspace
676 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_g_aux, rhoz_g_aux, trho_g, &
678 TYPE(pw_env_type),
POINTER :: pw_env
679 TYPE(pw_poisson_type),
POINTER :: poisson_env
680 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
681 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
682 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_r_aux, rhoz_r_aux, tau_r, &
683 trho_r, trho_xc_r, v_xc, v_xc_tau
684 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
685 TYPE(qs_ks_env_type),
POINTER :: ks_env
686 TYPE(qs_rho_type),
POINTER :: rho, rho_aux_fit, rho_xc, rhoz_aux, trho
687 TYPE(rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
688 TYPE(section_vals_type),
POINTER :: hfx_section, input, xc_section
689 TYPE(task_list_type),
POINTER :: task_list
691 CALL timeset(routinen, handle)
694 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, ks_env=ks_env, &
695 dft_control=dft_control, para_env=para_env)
696 cpassert(
ASSOCIATED(pw_env))
697 nspins = dft_control%nspins
698 gapw = dft_control%qs_control%gapw
699 gapw_xc = dft_control%qs_control%gapw_xc
701 cpassert(.NOT. dft_control%tddfpt2_control%do_exck)
702 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxsr)
703 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxlr)
705 NULLIFY (auxbas_pw_pool, poisson_env)
707 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
708 poisson_env=poisson_env)
710 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
711 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
712 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
714 ALLOCATE (trho_r(nspins), trho_g(nspins))
716 CALL auxbas_pw_pool%create_pw(trho_r(ispin))
717 CALL auxbas_pw_pool%create_pw(trho_g(ispin))
720 ALLOCATE (trho_xc_r(nspins), trho_xc_g(nspins))
722 CALL auxbas_pw_pool%create_pw(trho_xc_r(ispin))
723 CALL auxbas_pw_pool%create_pw(trho_xc_g(ispin))
728 NULLIFY (hartree_local, local_rho_set)
731 atomic_kind_set=atomic_kind_set, &
733 qs_kind_set=qs_kind_set)
736 qs_kind_set, dft_control, para_env)
737 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
742 ELSEIF (gapw_xc)
THEN
744 atomic_kind_set=atomic_kind_set, &
745 qs_kind_set=qs_kind_set)
748 qs_kind_set, dft_control, para_env)
752 CALL pw_zero(rho_tot_gspace)
756 rho_gspace=trho_g(ispin), &
758 total_rho=total_rho(ispin))
759 CALL pw_axpy(trho_g(ispin), rho_tot_gspace)
762 rho=trho_xc_r(ispin), &
763 rho_gspace=trho_xc_g(ispin), &
764 soft_valid=gapw_xc, &
770 IF (gapw .OR. gapw_xc)
THEN
771 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
773 qs_kind_set, oce, sab, para_env)
776 rhotot = sum(total_rho)
779 rhotot = rhotot + local_rho_set%rho0_mpole%total_rho0_h
780 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_tot_gspace)
783 IF (abs(rhotot) > 1.e-05_dp)
THEN
785 IF (logger%para_env%is_source())
THEN
790 cpwarn(
"Real space electron count of excitation density is non-zero.")
792 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", rhotot
793 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
798 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, thartree, &
800 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
801 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
804 local_rho_set, para_env, tddft=.true.)
806 calculate_forces=.false., &
807 local_rho_set=local_rho_set)
812 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
815 IF (dft_control%do_admm)
THEN
817 xc_section => admm_env%xc_section_primary
823 IF (deriv2_analytic)
THEN
824 NULLIFY (v_xc, v_xc_tau, tau_r)
827 CALL qs_fxc_analytic(rho_xc, trho_xc_r, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
829 CALL qs_fxc_analytic(rho, trho_r, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
831 IF (gapw .OR. gapw_xc)
THEN
832 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
833 rho1_atom_set => local_rho_set%rho_atom_set
835 do_tddft=.true., do_triplet=.false.)
842 CALL qs_rho_set(trho, rho_r=trho_r, rho_g=trho_g)
843 CALL qs_fxc_fdiff(ks_env, rho, trho, xc_section, 6, .false., v_xc, v_xc_tau)
848 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
849 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
853 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
854 hmat=matrix_hz(ispin), &
855 calculate_forces=.false.)
856 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
857 hmat=matrix_hz(ispin), &
858 gapw=gapw_xc, calculate_forces=.false.)
863 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
864 hmat=matrix_hz(ispin), &
865 gapw=gapw, calculate_forces=.false.)
866 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
867 hmat=matrix_hz(ispin), &
868 gapw=gapw, calculate_forces=.false.)
871 IF (gapw .OR. gapw_xc)
THEN
872 mhz(1:nspins, 1:1) => matrix_hz(1:nspins)
873 mpe(1:nspins, 1:1) => matrix_pe(1:nspins)
875 rho_atom_external=local_rho_set%rho_atom_set)
878 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
879 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
880 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
882 CALL auxbas_pw_pool%give_back_pw(trho_r(ispin))
883 CALL auxbas_pw_pool%give_back_pw(trho_g(ispin))
884 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
886 DEALLOCATE (trho_r, trho_g, v_xc)
889 CALL auxbas_pw_pool%give_back_pw(trho_xc_r(ispin))
890 CALL auxbas_pw_pool%give_back_pw(trho_xc_g(ispin))
892 DEALLOCATE (trho_xc_r, trho_xc_g)
894 IF (
ASSOCIATED(v_xc_tau))
THEN
896 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
898 DEALLOCATE (v_xc_tau)
900 IF (dft_control%do_admm)
THEN
906 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=msaux, &
907 task_list_aux_fit=task_list)
908 basis_type =
"AUX_FIT"
911 ALLOCATE (mpe(nspins, 1))
914 ALLOCATE (mhz(ispin, 1)%matrix)
915 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
916 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
917 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
918 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
922 NULLIFY (local_rho_set_admm)
923 IF (admm_env%do_gapw)
THEN
924 basis_type =
"AUX_FIT_SOFT"
925 task_list => admm_env%admm_gapw_env%task_list
926 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
930 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
932 rho_atom_set=local_rho_set_admm%rho_atom_set, &
933 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
934 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
936 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
939 xc_section => admm_env%xc_section_aux
941 NULLIFY (rho_g_aux, rho_r_aux, rhoz_g_aux, rhoz_r_aux)
942 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
944 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
946 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
947 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
951 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
952 basis_type=basis_type, &
953 task_list_external=task_list)
958 IF (deriv2_analytic)
THEN
960 CALL qs_fxc_analytic(rho_aux_fit, rhoz_r_aux, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
966 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
967 CALL qs_fxc_fdiff(ks_env, rho_aux_fit, rhoz_aux, xc_section, 6, .false., v_xc, v_xc_tau)
968 DEALLOCATE (rhoz_aux)
972 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
973 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
974 hmat=mhz(ispin, 1), basis_type=basis_type, &
975 calculate_forces=.false., &
976 task_list_external=task_list)
979 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
980 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
981 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
983 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
985 IF (admm_env%do_gapw)
THEN
986 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
987 rho1_atom_set => local_rho_set_admm%rho_atom_set
989 para_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
990 CALL update_ks_atom(qs_env, mhz(:, 1), matrix_pe_admm, forces=.false., tddft=.false., &
991 rho_atom_external=rho1_atom_set, &
992 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
993 oce_external=admm_env%admm_gapw_env%oce, &
994 sab_external=sab_aux_fit)
997 nao = admm_env%nao_orb
998 nao_aux = admm_env%nao_aux_fit
1000 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1001 DO ispin = 1, nspins
1003 admm_env%work_aux_orb, nao)
1004 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
1005 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1006 admm_env%work_orb_orb)
1007 CALL dbcsr_copy(dbwork, matrix_hz(1)%matrix)
1008 CALL dbcsr_set(dbwork, 0.0_dp)
1010 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1012 CALL dbcsr_release(dbwork)
1016 IF (admm_env%do_gapw)
THEN
1021 IF (gapw .OR. gapw_xc)
THEN
1031 cpassert(n_rep_hf == 1)
1035 IF (hfx_treat_lsd_in_core) mspin = nspins
1037 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, para_env=para_env, &
1038 s_mstruct_changed=s_mstruct_changed)
1039 distribute_fock_matrix = .true.
1040 IF (dft_control%do_admm)
THEN
1044 ALLOCATE (mpe(nspins, 1))
1046 DO ispin = 1, nspins
1047 ALLOCATE (mhz(ispin, 1)%matrix)
1048 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1049 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1050 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1051 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1053 IF (x_data(1, 1)%do_hfx_ri)
THEN
1055 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1056 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1057 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1062 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1067 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
1068 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
1069 nao = admm_env%nao_orb
1070 nao_aux = admm_env%nao_aux_fit
1072 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1073 DO ispin = 1, nspins
1075 admm_env%work_aux_orb, nao)
1076 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
1077 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1078 admm_env%work_orb_orb)
1079 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
1080 CALL dbcsr_set(dbwork, 0.0_dp)
1082 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1084 CALL dbcsr_release(dbwork)
1090 ALLOCATE (mpe(nspins, 1), mhz(nspins, 1))
1091 DO ispin = 1, nspins
1092 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
1093 mpe(ispin, 1)%matrix => matrix_pe(ispin)%matrix
1095 IF (x_data(1, 1)%do_hfx_ri)
THEN
1097 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1098 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1099 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1104 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1108 DEALLOCATE (mpe, mhz)
1113 IF (nspins == 2) focc = 2.0_dp
1114 DO ispin = 1, nspins
1115 mos => gs_mos(ispin)%mos_occ
1118 norb, alpha=focc, beta=0.0_dp)
1121 CALL timestop(handle)
1123 END SUBROUTINE tddfpt_resvec2
1133 SUBROUTINE tddfpt_resvec2_xtb(qs_env, matrix_pe, gs_mos, matrix_hz, cpmos)
1135 TYPE(qs_environment_type),
POINTER :: qs_env
1136 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe
1137 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
1139 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz
1140 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: cpmos
1142 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2_xtb'
1144 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
1145 na, natom, natorb, nkind, norb, ns, &
1147 INTEGER,
DIMENSION(25) :: lao
1148 INTEGER,
DIMENSION(5) :: occ
1149 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, mcharge1
1150 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, aocg1, charges, charges1
1151 REAL(kind=
dp) :: focc
1152 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1153 TYPE(cp_fm_type),
POINTER :: mos
1154 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: p_matrix
1155 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
1156 TYPE(dbcsr_type),
POINTER :: s_matrix
1157 TYPE(dft_control_type),
POINTER :: dft_control
1158 TYPE(mp_para_env_type),
POINTER :: para_env
1159 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1160 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1161 TYPE(qs_rho_type),
POINTER :: rho
1162 TYPE(xtb_atom_type),
POINTER :: xtb_kind
1164 CALL timeset(routinen, handle)
1166 cpassert(
ASSOCIATED(matrix_pe))
1168 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1169 nspins = dft_control%nspins
1171 DO ispin = 1, nspins
1172 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1175 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
1177 CALL get_qs_env(qs_env, rho=rho, particle_set=particle_set, &
1178 matrix_s_kp=matrix_s, para_env=para_env)
1179 natom =
SIZE(particle_set)
1181 ALLOCATE (mcharge(natom), charges(natom, 5))
1182 ALLOCATE (mcharge1(natom), charges1(natom, 5))
1185 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1186 nkind =
SIZE(atomic_kind_set)
1188 ALLOCATE (aocg(nsgf, natom))
1190 ALLOCATE (aocg1(nsgf, natom))
1192 p_matrix => matrix_p(:, 1)
1193 s_matrix => matrix_s(1, 1)%matrix
1194 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1195 CALL ao_charges(matrix_pe, s_matrix, aocg1, para_env)
1198 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1201 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1202 charges(atom_a, :) = real(occ(:), kind=
dp)
1205 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1206 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
1210 DEALLOCATE (aocg, aocg1)
1212 mcharge(iatom) = sum(charges(iatom, :))
1213 mcharge1(iatom) = sum(charges1(iatom, :))
1218 DEALLOCATE (charges, mcharge, charges1, mcharge1)
1222 IF (nspins == 2) focc = 1.0_dp
1223 DO ispin = 1, nspins
1224 mos => gs_mos(ispin)%mos_occ
1227 norb, alpha=focc, beta=0.0_dp)
1230 CALL timestop(handle)
1232 END SUBROUTINE tddfpt_resvec2_xtb
1240 SUBROUTINE tddfpt_resvec3(qs_env, cpmos, work)
1242 TYPE(qs_environment_type),
POINTER :: qs_env
1243 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: cpmos
1244 TYPE(tddfpt_work_matrices) :: work
1246 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec3'
1248 INTEGER :: handle, ispin, nao, norb, nspins
1249 TYPE(cp_fm_struct_type),
POINTER :: fmstruct
1250 TYPE(cp_fm_type) :: cvec, umat
1251 TYPE(cp_fm_type),
POINTER :: omos
1252 TYPE(dft_control_type),
POINTER :: dft_control
1253 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1255 CALL timeset(routinen, handle)
1257 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1258 nspins = dft_control%nspins
1260 DO ispin = 1, nspins
1262 associate(rvecs => cpmos(ispin))
1265 CALL cp_fm_struct_create(fmstruct, context=rvecs%matrix_struct%context, nrow_global=norb, &
1266 ncol_global=norb, para_env=rvecs%matrix_struct%para_env)
1270 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, omos, work%S_C0(ispin), 0.0_dp, umat)
1272 CALL parallel_gemm(
"N",
"T", nao, norb, norb, 1.0_dp, cvec, umat, 0.0_dp, rvecs)
1274 CALL cp_fm_release(cvec)
1275 CALL cp_fm_release(umat)
1278 CALL timestop(handle)
1280 END SUBROUTINE tddfpt_resvec3
1294 SUBROUTINE tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
1296 TYPE(qs_environment_type),
POINTER :: qs_env
1297 TYPE(excited_energy_type),
POINTER :: ex_env
1298 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
1300 TYPE(kernel_env_type),
INTENT(IN) :: kernel_env
1301 TYPE(tddfpt_subgroup_env_type) :: sub_env
1302 TYPE(tddfpt_work_matrices) :: work_matrices
1303 LOGICAL,
INTENT(IN) :: debug_forces
1305 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_kernel_force'
1308 TYPE(dft_control_type),
POINTER :: dft_control
1309 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
1311 mark_used(work_matrices)
1313 CALL timeset(routinen, handle)
1315 CALL get_qs_env(qs_env, dft_control=dft_control)
1316 tddfpt_control => dft_control%tddfpt2_control
1318 IF (tddfpt_control%kernel == tddfpt_kernel_full)
THEN
1320 CALL fhxc_force(qs_env, ex_env, gs_mos, kernel_env%full_kernel, debug_forces)
1321 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda)
THEN
1323 CALL stda_force(qs_env, ex_env, gs_mos, kernel_env%stda_kernel, sub_env, work_matrices, debug_forces)
1324 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none)
THEN
1326 ex_env%matrix_wx1 => null()
1328 cpabort(
'Unknown kernel type')
1331 CALL timestop(handle)
1333 END SUBROUTINE tddfpt_kernel_force
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
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_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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
Types for excited states potential energies.
subroutine, public exstate_potential_release(ex_env)
...
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 HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Types and set/get functions for HFX.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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
collects routines that calculate density matrices
subroutine, public calculate_wx_matrix(mos_occ, xvec, ks_matrix, w_matrix)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
subroutine, public calculate_xwx_matrix(mos_occ, xvec, s_matrix, ks_matrix, w_matrix, eval)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, 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, rhs)
Set the QUICKSTEP environment.
subroutine, public sum_qs_force(qs_force_out, qs_force_in)
Sum up two qs_force entities qs_force_out = qs_force_out + qs_force_in.
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.
https://en.wikipedia.org/wiki/Finite_difference_coefficient
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau)
...
subroutine, public qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external)
...
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, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, 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_r3d_rs_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, floating, name, element_symbol, pao_basis_size, 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)
Get attributes of an atomic kind set.
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...
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)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p)
Calculation of the overlap matrix over Cartesian Gaussian functions.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce)
...
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, Qlm_gg, Qlm_car, Qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs)
...
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_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public stda_force(qs_env, ex_env, gs_mos, stda_env, sub_env, work, debug_forces)
Simplified Tamm Dancoff approach (sTDA). Kernel contribution to forces.
subroutine, public fhxc_force(qs_env, ex_env, gs_mos, full_kernel, debug_forces)
Calculate direct tddft forces.
subroutine, public tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
Perform TDDFPT gradient calculation.
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, do_tddft, do_tddfpt2, do_triplet, kind_set_external)
...
Calculation of Coulomb Hessian contributions in xTB.
subroutine, public xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge)
...
Definition of the xTB parameter types.
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, occupation, electronegativity, chmax)
...