61#include "./base/base_uses.f90"
67 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_eigensolver'
69 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
71 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
72 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
103 tddfpt_control, S_C0)
104 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
105 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(in) :: s_c0_c0t
109 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: evals
111 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(in) :: s_c0
113 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_orthogonalize_psi1_psi0'
115 INTEGER :: handle, ispin, ivect, nactive, nao, &
119 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos
122 CALL timeset(routinen, handle)
124 nspins =
SIZE(evects, 1)
125 nvects =
SIZE(evects, 2)
128 IF (.NOT. tddfpt_control%do_smearing)
THEN
130 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
131 nrow_global=nao, ncol_global=nactive)
135 CALL parallel_gemm(
'T',
'N', nao, nactive, nao, 1.0_dp, s_c0_c0t(ispin), &
136 evects(ispin, ivect), 0.0_dp, evortho)
145 ALLOCATE (mos(nspins))
147 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
148 nrow_global=nao, ncol_global=nactive)
163 CALL timestop(handle)
180 FUNCTION tddfpt_is_nonorthogonal_psi1_psi0(evects, S_C0, max_norm) &
182 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
183 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(in) :: s_c0
184 REAL(kind=
dp),
INTENT(in) :: max_norm
185 LOGICAL :: is_nonortho
187 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_is_nonorthogonal_psi1_psi0'
189 INTEGER :: handle, ispin, ivect, nactive, nao, &
191 REAL(kind=
dp) :: maxabs_val
195 CALL timeset(routinen, handle)
197 nspins =
SIZE(evects, 1)
198 nvects =
SIZE(evects, 2)
200 is_nonortho = .false.
202 loop:
DO ispin = 1, nspins
204 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
205 nrow_global=nao, ncol_global=nactive)
207 ncol_global=nactive, template_fmstruct=matrix_struct)
212 CALL parallel_gemm(
'T',
'N', nocc, nactive, nao, 1.0_dp, s_c0(ispin), &
213 evects(ispin, ivect), 0.0_dp, aortho)
215 is_nonortho = maxabs_val > max_norm
216 IF (is_nonortho)
THEN
224 CALL timestop(handle)
226 END FUNCTION tddfpt_is_nonorthogonal_psi1_psi0
263 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: evects
264 INTEGER,
INTENT(in) :: nvects_new
265 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: s_evects
268 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_orthonormalize_psi1_psi1'
270 INTEGER :: handle, ispin, ivect, jvect, nspins, &
271 nvects_old, nvects_total
272 INTEGER,
DIMENSION(maxspins) :: nactive
273 REAL(kind=
dp) :: norm
274 REAL(kind=
dp),
DIMENSION(maxspins) :: weights
276 CALL timeset(routinen, handle)
278 nspins =
SIZE(evects, 1)
279 nvects_total =
SIZE(evects, 2)
280 nvects_old = nvects_total - nvects_new
282 IF (debug_this_module)
THEN
283 cpassert(
SIZE(s_evects, 1) == nspins)
284 cpassert(
SIZE(s_evects, 2) == nvects_total)
285 cpassert(nvects_old >= 0)
289 CALL cp_fm_get_info(matrix=evects(ispin, 1), ncol_global=nactive(ispin))
292 DO jvect = nvects_old + 1, nvects_total
294 DO ivect = 1, jvect - 1
295 CALL cp_fm_trace(evects(:, jvect), s_evects(:, ivect), weights(1:nspins), accurate=.false.)
296 norm = sum(weights(1:nspins))
306 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
309 CALL cp_fm_trace(evects(:, jvect), s_evects(:, jvect), weights(1:nspins), accurate=.false.)
311 norm = sum(weights(1:nspins))
312 norm = 1.0_dp/sqrt(norm)
320 CALL timestop(handle)
342 SUBROUTINE tddfpt_compute_aop_evects(Aop_evects, evects, S_evects, gs_mos, tddfpt_control, &
343 matrix_ks, qs_env, kernel_env, &
344 sub_env, work_matrices, matrix_s)
345 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(INOUT) :: aop_evects
346 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects, s_evects
350 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(in) :: matrix_ks
357 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_compute_Aop_evects'
359 INTEGER :: handle, ispin, ivect, nspins, nvects
360 INTEGER,
DIMENSION(maxspins) :: nmo_occ
361 LOGICAL :: do_admm, do_hfx, do_lri_response, &
362 is_rks_triplets, re_int
363 REAL(kind=
dp) :: rcut, scale
368 CALL timeset(routinen, handle)
370 nspins =
SIZE(evects, 1)
371 nvects =
SIZE(evects, 2)
372 do_hfx = tddfpt_control%do_hfx
373 do_admm = tddfpt_control%do_admm
375 kernel_env_admm_aux => kernel_env%admm_kernel
377 NULLIFY (kernel_env_admm_aux)
379 is_rks_triplets = tddfpt_control%rks_triplets
380 do_lri_response = tddfpt_control%do_lrigpw
382 IF (debug_this_module)
THEN
384 cpassert(
SIZE(aop_evects, 1) == nspins)
385 cpassert(
SIZE(aop_evects, 2) == nvects)
386 cpassert(
SIZE(s_evects, 1) == nspins)
387 cpassert(
SIZE(s_evects, 2) == nvects)
388 cpassert(
SIZE(gs_mos) == nspins)
392 nmo_occ(ispin) =
SIZE(gs_mos(ispin)%evals_occ)
397 IF (
ALLOCATED(work_matrices%evects_sub))
THEN
400 associate(evect => evects(ispin, ivect), work_matrix => work_matrices%evects_sub(ispin, ivect))
401 IF (
ASSOCIATED(evect%matrix_struct))
THEN
402 IF (
ASSOCIATED(work_matrix%matrix_struct))
THEN
407 ELSE IF (
ASSOCIATED(work_matrix%matrix_struct))
THEN
419 CALL fhxc_kernel(aop_evects, evects, is_rks_triplets, do_hfx, do_admm, qs_env, &
420 kernel_env%full_kernel, kernel_env_admm_aux, sub_env, work_matrices, &
421 tddfpt_control%admm_symm, tddfpt_control%admm_xc_correction, &
422 do_lri_response, tddfpt_mgrid=tddfpt_control%mgrid_is_explicit)
425 CALL stda_kernel(aop_evects, evects, is_rks_triplets, qs_env, tddfpt_control%stda_control, &
426 kernel_env%stda_kernel, sub_env, work_matrices)
435 cpabort(
"Kernel type not implemented")
438 IF (
ALLOCATED(work_matrices%evects_sub))
THEN
441 associate(aop_evect => aop_evects(ispin, ivect), &
442 work_matrix => work_matrices%Aop_evects_sub(ispin, ivect))
443 IF (
ASSOCIATED(aop_evect%matrix_struct))
THEN
444 IF (
ASSOCIATED(work_matrix%matrix_struct))
THEN
449 ELSE IF (
ASSOCIATED(work_matrix%matrix_struct))
THEN
460 CALL tddfpt_apply_energy_diff(aop_evects=aop_evects, evects=evects, s_evects=s_evects, &
461 gs_mos=gs_mos, matrix_ks=matrix_ks)
464 IF (tddfpt_control%do_smearing)
THEN
467 CALL add_smearing_aterm(qs_env, aop_evects(ispin, ivect), evects(ispin, ivect), &
468 s_evects(ispin, ivect), gs_mos(ispin)%mos_occ, &
469 tddfpt_control%smeared_occup(ispin)%fermia, matrix_s)
475 IF (tddfpt_control%kernel == tddfpt_kernel_full)
THEN
477 CALL tddfpt_apply_hfx(aop_evects=aop_evects, evects=evects, gs_mos=gs_mos, do_admm=do_admm, &
478 qs_env=qs_env, wfm_rho_orb=work_matrices%hfx_fm_ao_ao, &
479 work_hmat_symm=work_matrices%hfx_hmat_symm, &
480 work_hmat_asymm=work_matrices%hfx_hmat_asymm, &
481 work_rho_ia_ao_symm=work_matrices%hfx_rho_ao_symm, &
482 work_rho_ia_ao_asymm=work_matrices%hfx_rho_ao_asymm)
483 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda)
THEN
486 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none)
THEN
490 cpabort(
"Kernel type not implemented")
494 IF (tddfpt_control%kernel == tddfpt_kernel_full)
THEN
495 IF (tddfpt_control%do_hfxsr)
THEN
496 re_int = tddfpt_control%hfxsr_re_int
498 CALL tddfpt_apply_hfxsr_kernel(aop_evects, evects, gs_mos, qs_env, &
499 kernel_env%full_kernel%admm_env, &
500 kernel_env%full_kernel%hfxsr_section, &
501 kernel_env%full_kernel%x_data, 1, re_int, &
502 work_rho_ia_ao=work_matrices%hfxsr_rho_ao_symm, &
503 work_hmat=work_matrices%hfxsr_hmat_symm, &
504 wfm_rho_orb=work_matrices%hfxsr_fm_ao_ao)
506 CALL tddfpt_apply_hfxsr_kernel(aop_evects, evects, gs_mos, qs_env, &
507 kernel_env%full_kernel%admm_env, &
508 kernel_env%full_kernel%hfxsr_section, &
509 kernel_env%full_kernel%x_data, -1, .false., &
510 work_rho_ia_ao=work_matrices%hfxsr_rho_ao_asymm, &
511 work_hmat=work_matrices%hfxsr_hmat_asymm, &
512 wfm_rho_orb=work_matrices%hfxsr_fm_ao_ao)
513 tddfpt_control%hfxsr_re_int = .false.
515 IF (tddfpt_control%do_hfxlr)
THEN
516 rcut = tddfpt_control%hfxlr_rcut
517 scale = tddfpt_control%hfxlr_scale
519 IF (
ALLOCATED(work_matrices%evects_sub))
THEN
520 IF (
ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct))
THEN
521 CALL tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, scale, work_matrices, &
522 work_matrices%evects_sub(:, ivect), &
523 work_matrices%Aop_evects_sub(:, ivect))
529 CALL tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, scale, work_matrices, &
530 evects(:, ivect), aop_evects(:, ivect))
538 CALL timestop(handle)
540 END SUBROUTINE tddfpt_compute_aop_evects
557 SUBROUTINE tddfpt_compute_ritz_vects(ritz_vects, Aop_ritz, evals, krylov_vects, Aop_krylov, &
559 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: ritz_vects, aop_ritz
560 REAL(kind=dp),
DIMENSION(:),
INTENT(out) :: evals
561 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: krylov_vects, aop_krylov
562 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: atilde
563 INTEGER,
INTENT(IN) :: nkvo, nkvn
565 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_compute_ritz_vects'
567 INTEGER :: handle, ikv, irv, ispin, nkvs, nrvs, &
570 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: at12, at21, at22, evects_atilde
571 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_global
572 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
573 TYPE(cp_fm_type) :: atilde_fm, evects_atilde_fm
575 CALL timeset(routinen, handle)
577 nspins =
SIZE(krylov_vects, 1)
578 nkvs =
SIZE(krylov_vects, 2)
579 nrvs =
SIZE(ritz_vects, 2)
580 cpassert(nkvs == nkvo + nkvn)
582 CALL cp_fm_get_info(krylov_vects(1, 1), context=blacs_env_global)
584 CALL cp_fm_struct_create(fm_struct, nrow_global=nkvs, ncol_global=nkvs, context=blacs_env_global)
585 CALL cp_fm_create(atilde_fm, fm_struct)
586 CALL cp_fm_create(evects_atilde_fm, fm_struct)
587 CALL cp_fm_struct_release(fm_struct)
590 CALL reallocate(atilde, 1, nkvs, 1, nkvs)
595 CALL cp_fm_contracted_trace(aop_krylov(:, 1:nkvs), krylov_vects(:, 1:nkvs), &
596 atilde(1:nkvs, 1:nkvs), accurate=.false.)
598 ALLOCATE (at12(nkvn, nkvo), at21(nkvo, nkvn), at22(nkvn, nkvn))
599 CALL cp_fm_contracted_trace(aop_krylov(:, nkvo + 1:nkvs), krylov_vects(:, 1:nkvo), &
600 at12, accurate=.false.)
601 atilde(nkvo + 1:nkvs, 1:nkvo) = at12(1:nkvn, 1:nkvo)
602 CALL cp_fm_contracted_trace(aop_krylov(:, 1:nkvo), krylov_vects(:, nkvo + 1:nkvs), &
603 at21, accurate=.false.)
604 atilde(1:nkvo, nkvo + 1:nkvs) = at21(1:nkvo, 1:nkvn)
605 CALL cp_fm_contracted_trace(aop_krylov(:, nkvo + 1:nkvs), krylov_vects(:, nkvo + 1:nkvs), &
606 at22, accurate=.false.)
607 atilde(nkvo + 1:nkvs, nkvo + 1:nkvs) = at22(1:nkvn, 1:nkvn)
608 DEALLOCATE (at12, at21, at22)
610 atilde = 0.5_dp*(atilde + transpose(atilde))
611 CALL cp_fm_set_submatrix(atilde_fm, atilde)
614 CALL choose_eigv_solver(atilde_fm, evects_atilde_fm, evals(1:nkvs))
616 ALLOCATE (evects_atilde(nkvs, nrvs))
617 CALL cp_fm_get_submatrix(evects_atilde_fm, evects_atilde, start_row=1, start_col=1, n_rows=nkvs, n_cols=nrvs)
618 CALL cp_fm_release(evects_atilde_fm)
619 CALL cp_fm_release(atilde_fm)
626 CALL cp_fm_set_all(ritz_vects(ispin, irv), 0.0_dp)
627 CALL cp_fm_set_all(aop_ritz(ispin, irv), 0.0_dp)
631 act = evects_atilde(ikv, irv)
633 CALL cp_fm_scale_and_add(1.0_dp, ritz_vects(ispin, irv), &
634 act, krylov_vects(ispin, ikv))
635 CALL cp_fm_scale_and_add(1.0_dp, aop_ritz(ispin, irv), &
636 act, aop_krylov(ispin, ikv))
642 DEALLOCATE (evects_atilde)
644 CALL timestop(handle)
646 END SUBROUTINE tddfpt_compute_ritz_vects
660 SUBROUTINE tddfpt_compute_residual_vects(residual_vects, evals, ritz_vects, Aop_ritz, gs_mos, &
662 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: residual_vects
663 REAL(kind=dp),
DIMENSION(:),
INTENT(in) :: evals
664 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(in) :: ritz_vects, aop_ritz
665 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
667 TYPE(dbcsr_type),
POINTER :: matrix_s
669 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_compute_residual_vects'
670 REAL(kind=dp),
PARAMETER :: eref_scale = 0.99_dp, threshold = 16.0_dp*epsilon(1.0_dp)
672 INTEGER :: handle, icol_local, irow_local, irv, &
673 ispin, nao, ncols_local, nrows_local, &
675 INTEGER,
DIMENSION(:),
POINTER :: col_indices_local, row_indices_local
676 INTEGER,
DIMENSION(maxspins) :: nactive, nmo_virt
677 REAL(kind=dp) :: e_occ_plus_lambda, eref, lambda
678 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :), &
679 POINTER :: weights_ldata
680 TYPE(cp_fm_struct_type),
POINTER :: ao_mo_struct, virt_mo_struct
681 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: awork, vomat
683 CALL timeset(routinen, handle)
685 nspins =
SIZE(residual_vects, 1)
686 nrvs =
SIZE(residual_vects, 2)
689 CALL dbcsr_get_info(matrix_s, nfullrows_total=nao)
690 ALLOCATE (awork(nspins), vomat(nspins))
692 nmo_virt(ispin) =
SIZE(gs_mos(ispin)%evals_virt)
694 CALL cp_fm_get_info(matrix=ritz_vects(ispin, 1), matrix_struct=ao_mo_struct, &
695 ncol_global=nactive(ispin))
696 CALL cp_fm_create(awork(ispin), ao_mo_struct)
698 CALL cp_fm_struct_create(virt_mo_struct, nrow_global=nmo_virt(ispin), &
699 ncol_global=nactive(ispin), template_fmstruct=ao_mo_struct)
700 CALL cp_fm_create(vomat(ispin), virt_mo_struct)
701 CALL cp_fm_struct_release(virt_mo_struct)
709 CALL cp_fm_get_info(vomat(ispin), nrow_local=nrows_local, &
710 ncol_local=ncols_local, row_indices=row_indices_local, &
711 col_indices=col_indices_local, local_data=weights_ldata)
714 CALL cp_dbcsr_sm_fm_multiply(matrix_s, ritz_vects(ispin, irv), awork(ispin), &
715 ncol=nactive(ispin), alpha=-lambda, beta=0.0_dp)
716 CALL cp_fm_scale_and_add(1.0_dp, awork(ispin), 1.0_dp, aop_ritz(ispin, irv))
718 CALL parallel_gemm(
'T',
'N', nmo_virt(ispin), nactive(ispin), nao, 1.0_dp, gs_mos(ispin)%mos_virt, &
719 awork(ispin), 0.0_dp, vomat(ispin))
721 DO icol_local = 1, ncols_local
722 e_occ_plus_lambda = gs_mos(ispin)%evals_occ(col_indices_local(icol_local)) + lambda
724 DO irow_local = 1, nrows_local
725 eref = gs_mos(ispin)%evals_virt(row_indices_local(irow_local)) - e_occ_plus_lambda
729 IF (abs(eref) < threshold) &
730 eref = eref + (1.0_dp - eref_scale)*lambda
732 weights_ldata(irow_local, icol_local) = weights_ldata(irow_local, icol_local)/eref
736 CALL parallel_gemm(
'N',
'N', nao, nactive(ispin), nmo_virt(ispin), 1.0_dp, gs_mos(ispin)%mos_virt, &
737 vomat(ispin), 0.0_dp, residual_vects(ispin, irv))
741 CALL cp_fm_release(awork)
742 CALL cp_fm_release(vomat)
745 CALL timestop(handle)
747 END SUBROUTINE tddfpt_compute_residual_vects
773 matrix_ks, qs_env, kernel_env, &
774 sub_env, logger, iter_unit, energy_unit, &
775 tddfpt_print_section, work_matrices)
RESULT(conv)
776 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(inout) :: evects
777 REAL(kind=dp),
DIMENSION(:),
INTENT(inout) :: evals
778 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(inout) :: s_evects
779 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
781 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
782 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks
783 TYPE(qs_environment_type),
POINTER :: qs_env
784 TYPE(kernel_env_type),
INTENT(in) :: kernel_env
785 TYPE(tddfpt_subgroup_env_type),
INTENT(in) :: sub_env
786 TYPE(cp_logger_type),
POINTER :: logger
787 INTEGER,
INTENT(in) :: iter_unit, energy_unit
788 TYPE(section_vals_type),
POINTER :: tddfpt_print_section
789 TYPE(tddfpt_work_matrices),
INTENT(inout) :: work_matrices
790 REAL(kind=dp) :: conv
792 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_davidson_solver'
794 INTEGER :: handle, ispin, istate, iter, &
795 max_krylov_vects, nspins, nstates, &
796 nstates_conv, nvects_exist, nvects_new
797 INTEGER(kind=int_8) :: nstates_total
798 LOGICAL :: is_nonortho
799 REAL(kind=dp) :: t1, t2
800 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: evals_last
801 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: atilde
802 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: aop_krylov, aop_ritz, krylov_vects, &
804 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
806 CALL timeset(routinen, handle)
808 nspins =
SIZE(gs_mos)
809 nstates = tddfpt_control%nstates
810 nstates_total = tddfpt_total_number_of_states(gs_mos)
812 IF (debug_this_module)
THEN
813 cpassert(
SIZE(evects, 1) == nspins)
814 cpassert(
SIZE(evects, 2) == nstates)
815 cpassert(
SIZE(evals) == nstates)
818 CALL get_qs_env(qs_env, matrix_s=matrix_s)
821 max_krylov_vects = tddfpt_control%nkvs
822 IF (max_krylov_vects < nstates) max_krylov_vects = nstates
823 IF (int(max_krylov_vects, kind=int_8) > nstates_total) max_krylov_vects = int(nstates_total)
825 ALLOCATE (aop_ritz(nspins, nstates))
826 DO istate = 1, nstates
828 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, aop_ritz(ispin, istate))
832 ALLOCATE (evals_last(max_krylov_vects))
833 ALLOCATE (aop_krylov(nspins, max_krylov_vects), krylov_vects(nspins, max_krylov_vects), &
834 s_krylov(nspins, max_krylov_vects))
836 DO istate = 1, nstates
838 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, krylov_vects(ispin, istate))
839 CALL cp_fm_to_fm(evects(ispin, istate), krylov_vects(ispin, istate))
841 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, s_krylov(ispin, istate))
842 CALL cp_fm_to_fm(s_evects(ispin, istate), s_krylov(ispin, istate))
844 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, aop_krylov(ispin, istate))
853 ALLOCATE (atilde(1, 1))
857 CALL cp_iterate(logger%iter_info, iter_nr_out=iter)
859 CALL tddfpt_compute_aop_evects(aop_evects=aop_krylov(:, nvects_exist + 1:nvects_exist + nvects_new), &
860 evects=krylov_vects(:, nvects_exist + 1:nvects_exist + nvects_new), &
861 s_evects=s_krylov(:, nvects_exist + 1:nvects_exist + nvects_new), &
862 gs_mos=gs_mos, tddfpt_control=tddfpt_control, &
863 matrix_ks=matrix_ks, &
864 qs_env=qs_env, kernel_env=kernel_env, &
866 work_matrices=work_matrices, &
867 matrix_s=matrix_s(1)%matrix)
869 CALL tddfpt_compute_ritz_vects(ritz_vects=evects, aop_ritz=aop_ritz, &
870 evals=evals_last(1:nvects_exist + nvects_new), &
871 krylov_vects=krylov_vects(:, 1:nvects_exist + nvects_new), &
872 aop_krylov=aop_krylov(:, 1:nvects_exist + nvects_new), &
873 atilde=atilde, nkvo=nvects_exist, nkvn=nvects_new)
875 CALL tddfpt_write_restart(evects=evects, evals=evals_last(1:nstates), gs_mos=gs_mos, &
876 logger=logger, tddfpt_print_section=tddfpt_print_section)
878 conv = maxval(abs(evals_last(1:nstates) - evals(1:nstates)))
880 nvects_exist = nvects_exist + nvects_new
881 IF (nvects_exist + nvects_new > max_krylov_vects) &
882 nvects_new = max_krylov_vects - nvects_exist
883 IF (iter >= tddfpt_control%niters) nvects_new = 0
885 IF (conv > tddfpt_control%conv .AND. nvects_new > 0)
THEN
887 DO istate = 1, nvects_new
889 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
890 krylov_vects(ispin, nvects_exist + istate))
891 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
892 s_krylov(ispin, nvects_exist + istate))
893 CALL fm_pool_create_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
894 aop_krylov(ispin, nvects_exist + istate))
898 CALL tddfpt_compute_residual_vects(residual_vects=krylov_vects(:, nvects_exist + 1:nvects_exist + nvects_new), &
899 evals=evals_last(1:nvects_new), &
900 ritz_vects=evects(:, 1:nvects_new), aop_ritz=aop_ritz(:, 1:nvects_new), &
901 gs_mos=gs_mos, matrix_s=matrix_s(1)%matrix)
904 work_matrices%S_C0_C0T, qs_env, &
905 gs_mos, evals(1:nstates), tddfpt_control, work_matrices%S_C0)
908 s_krylov(:, 1:nvects_exist + nvects_new), matrix_s(1)%matrix)
910 is_nonortho = tddfpt_is_nonorthogonal_psi1_psi0(krylov_vects(:, nvects_exist + 1:nvects_exist + nvects_new), &
911 work_matrices%S_C0, tddfpt_control%orthogonal_eps)
915 is_nonortho = .false.
919 IF (energy_unit > 0)
THEN
920 WRITE (energy_unit,
'(/,4X,A,T14,A,T36,A)')
"State",
"Exc. energy (eV)",
"Convergence (eV)"
921 DO istate = 1, nstates
922 WRITE (energy_unit,
'(1X,I8,T12,F14.7,T38,ES11.4)') istate, &
923 evals_last(istate)*evolt, (evals_last(istate) - evals(istate))*evolt
925 WRITE (energy_unit, *)
926 CALL m_flush(energy_unit)
929 IF (iter_unit > 0)
THEN
931 DO istate = 1, nstates
932 IF (abs(evals_last(istate) - evals(istate)) <= tddfpt_control%conv) &
933 nstates_conv = nstates_conv + 1
936 WRITE (iter_unit,
'(T7,I8,T24,F7.1,T40,ES11.4,T66,I8)') iter, t2 - t1, conv, nstates_conv
937 CALL m_flush(iter_unit)
941 evals(1:nstates) = evals_last(1:nstates)
944 IF (nvects_new == 0 .OR. is_nonortho)
THEN
948 evals(1:nstates), tddfpt_control, work_matrices%S_C0)
957 DO istate = nvects_exist + nvects_new, 1, -1
958 DO ispin = nspins, 1, -1
959 CALL fm_pool_give_back_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, aop_krylov(ispin, istate))
960 CALL fm_pool_give_back_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, s_krylov(ispin, istate))
961 CALL fm_pool_give_back_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, krylov_vects(ispin, istate))
964 DEALLOCATE (aop_krylov, krylov_vects, s_krylov)
965 DEALLOCATE (evals_last)
967 DO istate = nstates, 1, -1
968 DO ispin = nspins, 1, -1
969 CALL fm_pool_give_back_fm(work_matrices%fm_pool_ao_mo_occ(ispin)%pool, aop_ritz(ispin, istate))
972 DEALLOCATE (aop_ritz)
974 CALL timestop(handle)
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_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)
...
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
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....
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
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_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...
subroutine, public cp_fm_maxabsval(matrix, a_max, ir_max, ic_max)
find the maximum absolute value of the matrix element maxval(abs(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_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
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 ...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Utility routines for the memory handling.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Definition of physical constants:
real(kind=dp), parameter, public evolt
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public eigensolver(matrix_ks_fm, mo_set, ortho, work, cholesky_method, do_level_shift, level_shift, matrix_u_fm, use_jacobi)
Diagonalise the Kohn-Sham matrix to get a new set of MO eigen- vectors and MO eigenvalues....
subroutine, public tddfpt_orthonormalize_psi1_psi1(evects, nvects_new, s_evects, matrix_s)
Make new TDDFPT trial vectors orthonormal to all previous trial vectors.
subroutine, public tddfpt_orthogonalize_psi1_psi0(evects, s_c0_c0t, qs_env, gs_mos, evals, tddfpt_control, s_c0)
Make TDDFPT trial vectors orthogonal to all occupied molecular orbitals.
real(kind=dp) function, public tddfpt_davidson_solver(evects, evals, s_evects, gs_mos, tddfpt_control, matrix_ks, qs_env, kernel_env, sub_env, logger, iter_unit, energy_unit, tddfpt_print_section, work_matrices)
Perform Davidson iterations.
subroutine, public fhxc_kernel(aop_evects, evects, is_rks_triplets, do_hfx, do_admm, qs_env, kernel_env, kernel_env_admm_aux, sub_env, work_matrices, admm_symm, admm_xc_correction, do_lrigpw, tddfpt_mgrid)
Compute action matrix-vector products with the FHxc Kernel.
subroutine, public stda_kernel(aop_evects, evects, is_rks_triplets, qs_env, stda_control, stda_env, sub_env, work_matrices)
Compute action matrix-vector products with the sTDA Kernel.
subroutine, public tddfpt_apply_hfx(aop_evects, evects, gs_mos, do_admm, qs_env, work_rho_ia_ao_symm, work_hmat_symm, work_rho_ia_ao_asymm, work_hmat_asymm, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
subroutine, public tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, hfx_scale, work, x, res)
...Calculate the HFXLR kernel contribution by contracting the Lowdin MO coefficients – transition cha...
subroutine, public tddfpt_apply_energy_diff(aop_evects, evects, s_evects, gs_mos, matrix_ks)
Apply orbital energy difference term: Aop_evects(spin,state) += KS(spin) * evects(spin,...
subroutine, public tddfpt_apply_hfxsr_kernel(aop_evects, evects, gs_mos, qs_env, admm_env, hfx_section, x_data, symmetry, recalc_integrals, work_rho_ia_ao, work_hmat, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
subroutine, public tddfpt_write_restart(evects, evals, gs_mos, logger, tddfpt_print_section)
Write Ritz vectors to a binary restart file.
subroutine, public add_smearing_aterm(qs_env, aop_evects, evects, s_evects, mos_occ, fermia, matrix_s)
...
subroutine, public compute_fermib(qs_env, gs_mos, evals)
...
subroutine, public orthogonalize_smeared_occupation(evects, qs_env, mos_occ, s_c0)
...
pure integer(kind=int_8) function, public tddfpt_total_number_of_states(gs_mos)
Compute the number of possible singly excited states (occ -> virt)
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...
stores all the informations relevant to an mpi environment
Collection of variables required to evaluate adiabatic TDDFPT kernel.
Type to hold environments for the different kernels.
Parallel (sub)group environment.
Ground state molecular orbitals.
Set of temporary ("work") matrices.