44 dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, dbcsr_type_symmetric
124#include "./base/base_uses.f90"
129 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
130 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_wf_history_methods'
146 SUBROUTINE wfs_create(snapshot)
147 TYPE(qs_wf_snapshot_type),
INTENT(OUT) :: snapshot
149 NULLIFY (snapshot%wf, snapshot%rho_r, &
150 snapshot%rho_g, snapshot%rho_ao, snapshot%rho_ao_kp, &
151 snapshot%overlap, snapshot%wf_kp, snapshot%overlap_cfm_kp, &
152 snapshot%kp_pbc_shift, snapshot%rho_frozen)
154 END SUBROUTINE wfs_create
167 SUBROUTINE wfs_update(snapshot, wf_history, qs_env, dt)
168 TYPE(qs_wf_snapshot_type),
POINTER :: snapshot
169 TYPE(qs_wf_history_type),
POINTER :: wf_history
170 TYPE(qs_environment_type),
POINTER :: qs_env
171 REAL(KIND=
dp),
INTENT(in),
OPTIONAL :: dt
173 CHARACTER(len=*),
PARAMETER :: routineN =
'wfs_update'
175 INTEGER :: handle, ic, igroup, ik, ikp, img, &
176 indx_ft, ispin, kplocal, nc, nimg, &
177 nkp_all, nkp_grps, nspin_kp, nspins
178 INTEGER,
DIMENSION(2) :: kp_range
179 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
180 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
182 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: xkp
183 TYPE(cell_type),
POINTER :: cell
184 TYPE(copy_info_type),
ALLOCATABLE,
DIMENSION(:, :) :: info_ft
185 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
POINTER :: ao_ao_fm_pools, ao_mo_pools
186 TYPE(cp_fm_struct_type),
POINTER :: ao_ao_struct_ft
187 TYPE(cp_fm_type) :: fmdummy_ft, fmlocal_ft
188 TYPE(cp_fm_type),
POINTER :: mo_coeff
189 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
190 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp, rho_ao_kp
191 TYPE(dbcsr_type),
POINTER :: cmat_ft, rmat_ft, tmpmat_ft
192 TYPE(dft_control_type),
POINTER :: dft_control
193 TYPE(kpoint_env_type),
POINTER :: kp
194 TYPE(kpoint_type),
POINTER :: kpoints
195 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
196 TYPE(mp_para_env_type),
POINTER :: para_env_ft
197 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
199 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
200 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
201 TYPE(pw_env_type),
POINTER :: pw_env
202 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
203 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
204 TYPE(qs_matrix_pools_type),
POINTER :: mpools_kp
205 TYPE(qs_rho_type),
POINTER :: rho
206 TYPE(qs_scf_env_type),
POINTER :: scf_env
208 CALL timeset(routinen, handle)
210 NULLIFY (pw_env, auxbas_pw_pool, ao_mo_pools, ao_ao_fm_pools, dft_control, mos, mo_coeff, &
211 rho, rho_r, rho_g, rho_ao, matrix_s, matrix_s_kp, kpoints, kp, cell, &
212 particle_set, kp_dist, cell_to_index, xkp, sab_nl, scf_env, mpools_kp, para_env_ft, &
213 rmat_ft, cmat_ft, tmpmat_ft, ao_ao_struct_ft)
215 dft_control=dft_control, rho=rho, cell=cell, particle_set=particle_set)
216 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_pools)
217 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
219 cpassert(
ASSOCIATED(wf_history))
220 cpassert(
ASSOCIATED(dft_control))
221 IF (.NOT.
ASSOCIATED(snapshot))
THEN
223 CALL wfs_create(snapshot)
225 cpassert(wf_history%ref_count > 0)
227 nspins = dft_control%nspins
229 IF (
PRESENT(dt)) snapshot%dt = dt
230 IF (wf_history%store_wf)
THEN
232 IF (.NOT.
ASSOCIATED(snapshot%wf))
THEN
235 cpassert(nspins ==
SIZE(snapshot%wf))
238 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
245 IF (wf_history%store_rho_r)
THEN
247 cpassert(
ASSOCIATED(rho_r))
248 IF (.NOT.
ASSOCIATED(snapshot%rho_r))
THEN
249 ALLOCATE (snapshot%rho_r(nspins))
251 CALL auxbas_pw_pool%create_pw(snapshot%rho_r(ispin))
255 CALL pw_copy(rho_r(ispin), snapshot%rho_r(ispin))
257 ELSE IF (
ASSOCIATED(snapshot%rho_r))
THEN
258 DO ispin = 1,
SIZE(snapshot%rho_r)
259 CALL auxbas_pw_pool%give_back_pw(snapshot%rho_r(ispin))
261 DEALLOCATE (snapshot%rho_r)
264 IF (wf_history%store_rho_g)
THEN
266 cpassert(
ASSOCIATED(rho_g))
267 IF (.NOT.
ASSOCIATED(snapshot%rho_g))
THEN
268 ALLOCATE (snapshot%rho_g(nspins))
270 CALL auxbas_pw_pool%create_pw(snapshot%rho_g(ispin))
274 CALL pw_copy(rho_g(ispin), snapshot%rho_g(ispin))
276 ELSE IF (
ASSOCIATED(snapshot%rho_g))
THEN
277 DO ispin = 1,
SIZE(snapshot%rho_g)
278 CALL auxbas_pw_pool%give_back_pw(snapshot%rho_g(ispin))
280 DEALLOCATE (snapshot%rho_g)
283 IF (
ASSOCIATED(snapshot%rho_ao))
THEN
287 IF (wf_history%store_rho_ao)
THEN
289 cpassert(
ASSOCIATED(rho_ao))
293 ALLOCATE (snapshot%rho_ao(ispin)%matrix)
294 CALL dbcsr_copy(snapshot%rho_ao(ispin)%matrix, rho_ao(ispin)%matrix)
298 IF (
ASSOCIATED(snapshot%rho_ao_kp))
THEN
302 IF (wf_history%store_rho_ao_kp)
THEN
304 cpassert(
ASSOCIATED(rho_ao_kp))
306 nimg = dft_control%nimages
310 ALLOCATE (snapshot%rho_ao_kp(ispin, img)%matrix)
311 CALL dbcsr_copy(snapshot%rho_ao_kp(ispin, img)%matrix, &
312 rho_ao_kp(ispin, img)%matrix)
317 IF (
ASSOCIATED(snapshot%overlap))
THEN
321 IF (wf_history%store_overlap)
THEN
323 cpassert(
ASSOCIATED(matrix_s))
324 cpassert(
ASSOCIATED(matrix_s(1)%matrix))
325 ALLOCATE (snapshot%overlap)
326 CALL dbcsr_copy(snapshot%overlap, matrix_s(1)%matrix)
330 IF (
ASSOCIATED(kpoints))
THEN
331 IF (
ASSOCIATED(kpoints%kp_env))
THEN
333 IF (wf_history%store_wf_kp)
THEN
335 kplocal = kp_range(2) - kp_range(1) + 1
336 nspin_kp =
SIZE(kpoints%kp_env(1)%kpoint_env%mos, 2)
337 nc =
SIZE(kpoints%kp_env(1)%kpoint_env%mos, 1)
339 CALL wfi_store_kp_pbc_shift(snapshot, cell, particle_set)
341 IF (
ASSOCIATED(snapshot%wf_kp))
THEN
342 DO ikp = 1,
SIZE(snapshot%wf_kp, 1)
343 DO ic = 1,
SIZE(snapshot%wf_kp, 2)
344 DO ispin = 1,
SIZE(snapshot%wf_kp, 3)
349 DEALLOCATE (snapshot%wf_kp)
352 ALLOCATE (snapshot%wf_kp(kplocal, nc, nspin_kp))
354 kp => kpoints%kp_env(ikp)%kpoint_env
355 DO ispin = 1, nspin_kp
357 CALL get_mo_set(kp%mos(ic, ispin), mo_coeff=mo_coeff)
359 mo_coeff%matrix_struct, &
361 CALL cp_fm_to_fm(mo_coeff, snapshot%wf_kp(ikp, ic, ispin))
371 IF (wf_history%store_overlap_kp)
THEN
372 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s_kp, scf_env=scf_env)
373 CALL get_kpoint_info(kpoints, nkp=nkp_all, xkp=xkp, kp_range=kp_range, &
374 nkp_groups=nkp_grps, kp_dist=kp_dist, &
375 sab_nl=sab_nl, cell_to_index=cell_to_index)
376 kplocal = kp_range(2) - kp_range(1) + 1
377 para_env_ft => kpoints%blacs_env_all%para_env
380 ALLOCATE (rmat_ft, cmat_ft, tmpmat_ft)
381 CALL dbcsr_create(rmat_ft, template=matrix_s_kp(1, 1)%matrix, &
382 matrix_type=dbcsr_type_symmetric)
383 CALL dbcsr_create(cmat_ft, template=matrix_s_kp(1, 1)%matrix, &
384 matrix_type=dbcsr_type_antisymmetric)
385 CALL dbcsr_create(tmpmat_ft, template=matrix_s_kp(1, 1)%matrix, &
386 matrix_type=dbcsr_type_no_symmetry)
392 CALL mpools_get(mpools_kp, ao_ao_fm_pools=ao_ao_fm_pools)
396 IF (
ASSOCIATED(snapshot%overlap_cfm_kp))
THEN
397 DO ikp = 1,
SIZE(snapshot%overlap_cfm_kp)
400 DEALLOCATE (snapshot%overlap_cfm_kp)
402 ALLOCATE (snapshot%overlap_cfm_kp(kplocal))
407 ALLOCATE (info_ft(kplocal*nkp_grps, 2))
412 DO igroup = 1, nkp_grps
413 ik = kp_dist(1, igroup) + ikp - 1
414 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
415 indx_ft = indx_ft + 1
419 CALL rskp_transform(rmatrix=rmat_ft, cmatrix=cmat_ft, rsmat=matrix_s_kp, &
420 ispin=1, xkp=xkp(1:3, ik), &
421 cell_to_index=cell_to_index, sab_nl=sab_nl)
429 para_env_ft, info_ft(indx_ft, 1))
431 para_env_ft, info_ft(indx_ft, 2))
434 para_env_ft, info_ft(indx_ft, 1))
436 para_env_ft, info_ft(indx_ft, 2))
444 CALL cp_cfm_create(snapshot%overlap_cfm_kp(ikp), ao_ao_struct_ft)
446 DO igroup = 1, nkp_grps
447 ik = kp_dist(1, igroup) + ikp - 1
448 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
449 indx_ft = indx_ft + 1
462 DO indx_ft = 1, kplocal*nkp_grps
475 IF (wf_history%store_frozen_density)
THEN
480 CALL timestop(handle)
482 END SUBROUTINE wfs_update
496 SUBROUTINE wfi_create(wf_history, interpolation_method_nr, extrapolation_order, &
499 INTEGER,
INTENT(in) :: interpolation_method_nr, &
501 LOGICAL,
INTENT(IN) :: has_unit_metric
503 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_create'
507 CALL timeset(routinen, handle)
509 ALLOCATE (wf_history)
510 wf_history%ref_count = 1
511 wf_history%memory_depth = 0
512 wf_history%snapshot_count = 0
513 wf_history%last_state_index = 1
514 wf_history%store_wf = .false.
515 wf_history%store_rho_r = .false.
516 wf_history%store_rho_g = .false.
517 wf_history%store_rho_ao = .false.
518 wf_history%store_rho_ao_kp = .false.
519 wf_history%store_overlap = .false.
520 wf_history%store_wf_kp = .false.
521 wf_history%store_overlap_kp = .false.
522 wf_history%store_frozen_density = .false.
523 NULLIFY (wf_history%past_states)
525 wf_history%interpolation_method_nr = interpolation_method_nr
527 SELECT CASE (wf_history%interpolation_method_nr)
529 wf_history%memory_depth = 0
531 wf_history%memory_depth = 0
533 wf_history%memory_depth = 1
534 wf_history%store_rho_ao = .true.
536 wf_history%memory_depth = 2
537 wf_history%store_wf = .true.
539 wf_history%memory_depth = 2
540 wf_history%store_rho_ao = .true.
542 wf_history%memory_depth = 2
543 wf_history%store_wf = .true.
544 IF (.NOT. has_unit_metric) wf_history%store_overlap = .true.
547 wf_history%memory_depth = extrapolation_order + 1
548 wf_history%store_wf = .true.
549 wf_history%store_wf_kp = .true.
550 IF (.NOT. has_unit_metric)
THEN
551 wf_history%store_overlap = .true.
552 wf_history%store_overlap_kp = .true.
555 wf_history%memory_depth = 1
556 wf_history%store_frozen_density = .true.
558 wf_history%memory_depth = extrapolation_order + 2
559 wf_history%store_wf = .true.
560 wf_history%store_wf_kp = .true.
561 IF (.NOT. has_unit_metric)
THEN
562 wf_history%store_overlap = .true.
563 wf_history%store_overlap_kp = .true.
566 wf_history%memory_depth = extrapolation_order
567 wf_history%store_wf = .true.
568 wf_history%store_wf_kp = .true.
569 wf_history%store_overlap = .true.
570 wf_history%store_overlap_kp = .true.
572 wf_history%memory_depth = extrapolation_order
573 wf_history%store_wf = .true.
574 wf_history%store_wf_kp = .true.
575 wf_history%store_overlap = .true.
576 wf_history%store_overlap_kp = .true.
578 CALL cp_abort(__location__, &
579 "Unknown interpolation method: "// &
582 ALLOCATE (wf_history%past_states(wf_history%memory_depth))
584 DO i = 1,
SIZE(wf_history%past_states)
585 NULLIFY (wf_history%past_states(i)%snapshot)
588 CALL timestop(handle)
605 cpassert(
ASSOCIATED(wf_history))
606 IF (wf_history%store_rho_ao)
THEN
607 wf_history%store_rho_ao_kp = .true.
608 wf_history%store_rho_ao = .false.
614 wf_history%memory_depth = 1
615 wf_history%store_wf_kp = .true.
616 wf_history%store_wf = .false.
617 wf_history%store_overlap = .false.
618 IF (
ASSOCIATED(wf_history%past_states))
DEALLOCATE (wf_history%past_states)
619 ALLOCATE (wf_history%past_states(wf_history%memory_depth))
620 DO i = 1,
SIZE(wf_history%past_states)
621 NULLIFY (wf_history%past_states(i)%snapshot)
623 ELSE IF (wf_history%store_wf_kp)
THEN
624 wf_history%store_wf = .false.
625 wf_history%store_overlap = .false.
629 IF (wf_history%store_wf .OR. wf_history%store_overlap)
THEN
630 cpabort(
"Linear WFN-based extrapolation methods not implemented for k-points.")
633 IF (wf_history%store_frozen_density)
THEN
634 cpabort(
"Frozen density initialization method not possible for kpoints.")
648 INTEGER,
INTENT(in) :: method_nr
649 CHARACTER(len=30) :: res
652 SELECT CASE (method_nr)
658 res =
"previous_rho_r"
660 res =
"initial_guess"
670 res =
"frozen density approximation"
676 res =
"GEXT_PROJ_QTR"
678 CALL cp_abort(__location__, &
679 "Unknown interpolation method: "// &
703 REAL(kind=
dp),
INTENT(IN) :: dt
704 INTEGER,
INTENT(OUT),
OPTIONAL :: extrapolation_method_nr
705 LOGICAL,
INTENT(OUT),
OPTIONAL :: orthogonal_wf
707 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_extrapolate'
709 INTEGER :: actual_extrapolation_method_nr, handle, &
710 i, img, io_unit, ispin, k, n, nmo, &
712 LOGICAL :: do_kpoints, my_orthogonal_wf, use_overlap
713 REAL(kind=
dp) :: alpha, t0, t1, t2
714 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeffs
720 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao, rho_frozen_ao
721 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
726 NULLIFY (mos, ao_mo_fm_pools, t0_state, t1_state, mo_coeff, &
727 rho, rho_ao, rho_frozen_ao)
729 use_overlap = wf_history%store_overlap
731 CALL timeset(routinen, handle)
733 print_level = logger%iter_info%print_level
737 cpassert(
ASSOCIATED(wf_history))
738 cpassert(wf_history%ref_count > 0)
739 cpassert(
ASSOCIATED(qs_env))
740 CALL get_qs_env(qs_env, mos=mos, rho=rho, do_kpoints=do_kpoints)
741 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
743 IF (wf_history%snapshot_count < 1)
THEN
746 actual_extrapolation_method_nr = wf_history%interpolation_method_nr
749 SELECT CASE (actual_extrapolation_method_nr)
751 IF (wf_history%snapshot_count < 2)
THEN
755 IF (wf_history%snapshot_count < 2)
THEN
759 IF (wf_history%snapshot_count < 2)
THEN
764 IF (
PRESENT(extrapolation_method_nr))
THEN
765 extrapolation_method_nr = actual_extrapolation_method_nr
767 my_orthogonal_wf = .false.
769 SELECT CASE (actual_extrapolation_method_nr)
771 cpassert(.NOT. do_kpoints)
773 cpassert(
ASSOCIATED(t0_state%rho_frozen))
775 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
776 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
778 CALL qs_rho_get(t0_state%rho_frozen, rho_ao=rho_frozen_ao)
780 DO ispin = 1,
SIZE(rho_frozen_ao)
782 rho_frozen_ao(ispin)%matrix, &
783 keep_sparsity=.true.)
790 my_orthogonal_wf = .false.
793 CALL cp_warn(__location__, &
794 "USE_PREV_RHO_R is deprecated and will be removed in a future "// &
795 "release; it is now an alias of USE_PREV_P.")
798 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
799 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
801 cpassert(
ASSOCIATED(t0_state%rho_ao_kp))
803 DO ispin = 1,
SIZE(t0_state%rho_ao_kp, 1)
804 DO img = 1,
SIZE(t0_state%rho_ao_kp, 2)
805 IF (img >
SIZE(rho_ao_kp, 2))
THEN
806 cpwarn(
"Change in cell neighborlist: might affect quality of initial guess")
808 CALL dbcsr_copy(rho_ao_kp(ispin, img)%matrix, &
809 t0_state%rho_ao_kp(ispin, img)%matrix, &
810 keep_sparsity=.true.)
815 cpassert(
ASSOCIATED(t0_state%rho_ao))
817 DO ispin = 1,
SIZE(t0_state%rho_ao)
819 t0_state%rho_ao(ispin)%matrix, &
820 keep_sparsity=.true.)
828 my_orthogonal_wf = .true.
829 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
830 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
833 CALL wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
836 DO ispin = 1,
SIZE(mos)
837 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
851 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
852 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
854 cpassert(.NOT. do_kpoints)
857 cpassert(
ASSOCIATED(t0_state))
858 cpassert(
ASSOCIATED(t1_state))
859 cpassert(
ASSOCIATED(t0_state%wf))
860 cpassert(
ASSOCIATED(t1_state%wf))
861 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
862 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
864 my_orthogonal_wf = .true.
869 DO ispin = 1,
SIZE(mos)
870 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, &
874 matrix_b=t1_state%wf(ispin), &
875 beta=(t2 - t0)/(t1 - t0))
879 beta=(t1 - t2)/(t1 - t0), matrix_b=t0_state%wf(ispin))
884 density_matrix=rho_ao(ispin)%matrix)
893 cpassert(
ASSOCIATED(t0_state))
894 cpassert(
ASSOCIATED(t1_state))
896 cpassert(
ASSOCIATED(t0_state%rho_ao_kp))
897 cpassert(
ASSOCIATED(t1_state%rho_ao_kp))
899 cpassert(
ASSOCIATED(t0_state%rho_ao))
900 cpassert(
ASSOCIATED(t1_state%rho_ao))
902 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
903 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
910 DO ispin = 1,
SIZE(rho_ao_kp, 1)
911 DO img = 1,
SIZE(rho_ao_kp, 2)
912 IF (img >
SIZE(t0_state%rho_ao_kp, 2) .OR. &
913 img >
SIZE(t1_state%rho_ao_kp, 2))
THEN
914 cpwarn(
"Change in cell neighborlist: might affect quality of initial guess")
916 CALL dbcsr_add(rho_ao_kp(ispin, img)%matrix, t1_state%rho_ao_kp(ispin, img)%matrix, &
917 alpha_scalar=0.0_dp, beta_scalar=(t2 - t0)/(t1 - t0))
918 CALL dbcsr_add(rho_ao_kp(ispin, img)%matrix, t0_state%rho_ao_kp(ispin, img)%matrix, &
919 alpha_scalar=1.0_dp, beta_scalar=(t1 - t2)/(t1 - t0))
925 DO ispin = 1,
SIZE(rho_ao)
926 CALL dbcsr_add(rho_ao(ispin)%matrix, t1_state%rho_ao(ispin)%matrix, &
927 alpha_scalar=0.0_dp, beta_scalar=(t2 - t0)/(t1 - t0))
928 CALL dbcsr_add(rho_ao(ispin)%matrix, t0_state%rho_ao(ispin)%matrix, &
929 alpha_scalar=1.0_dp, beta_scalar=(t1 - t2)/(t1 - t0))
937 cpassert(.NOT. do_kpoints)
940 cpassert(
ASSOCIATED(t0_state))
941 cpassert(
ASSOCIATED(t1_state))
942 cpassert(
ASSOCIATED(t0_state%wf))
943 cpassert(
ASSOCIATED(t1_state%wf))
944 IF (wf_history%store_overlap)
THEN
945 cpassert(
ASSOCIATED(t0_state%overlap))
946 cpassert(
ASSOCIATED(t1_state%overlap))
948 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
949 IF (nvec >= wf_history%memory_depth)
THEN
950 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0))
THEN
951 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
952 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
953 qs_env%scf_control%outer_scf%have_scf = .false.
954 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
955 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
956 qs_env%scf_control%outer_scf%have_scf = .false.
957 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
958 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
962 my_orthogonal_wf = .true.
966 DO ispin = 1,
SIZE(mos)
967 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
968 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
970 matrix_struct=matrix_struct)
972 nrow_global=k, ncol_global=k)
976 IF (use_overlap)
THEN
978 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), mo_coeff, 0.0_dp, csc)
980 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
981 t1_state%wf(ispin), 0.0_dp, csc)
983 CALL parallel_gemm(
'N',
'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, mo_coeff)
990 density_matrix=rho_ao(ispin)%matrix)
997 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
999 IF (nvec >= wf_history%memory_depth)
THEN
1000 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0))
THEN
1001 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1002 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1003 qs_env%scf_control%outer_scf%have_scf = .false.
1004 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
1005 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1006 qs_env%scf_control%outer_scf%have_scf = .false.
1007 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
1008 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1012 IF (do_kpoints)
THEN
1013 CALL wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1014 my_orthogonal_wf = .true.
1016 my_orthogonal_wf = .true.
1017 DO ispin = 1,
SIZE(mos)
1018 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1019 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1021 matrix_struct=matrix_struct)
1024 nrow_global=k, ncol_global=k)
1035 IF (use_overlap)
THEN
1037 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1039 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
1040 t1_state%wf(ispin), 0.0_dp, csc)
1042 CALL parallel_gemm(
'N',
'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1043 alpha = -1.0_dp*alpha*real(nvec - i + 1,
dp)/real(i,
dp)
1050 v_matrix=mo_coeff, &
1053 density_matrix=rho_ao(ispin)%matrix)
1063 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1065 IF (nvec >= wf_history%memory_depth)
THEN
1066 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. &
1067 (qs_env%scf_control%eps_scf_hist /= 0))
THEN
1068 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1069 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1070 qs_env%scf_control%outer_scf%have_scf = .false.
1071 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
1072 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1073 qs_env%scf_control%outer_scf%have_scf = .false.
1074 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
1075 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1079 IF (do_kpoints)
THEN
1080 CALL wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1081 my_orthogonal_wf = .true.
1083 my_orthogonal_wf = .true.
1085 DO ispin = 1,
SIZE(mos)
1086 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1087 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1091 matrix_struct=matrix_struct)
1092 CALL cp_fm_create(fm_tmp, matrix_struct, set_zero=.true.)
1094 template_fmstruct=matrix_struct, &
1097 CALL cp_fm_create(csc, matrix_struct_new, set_zero=.true.)
1103 alpha = real(4*nvec - 2, kind=
dp)/real(nvec + 1, kind=
dp)
1105 WRITE (unit=io_unit, fmt=
"(/,T2,A,/,/,T3,A,I0,/,/,T3,A2,I0,A4,F10.6)") &
1106 "Parameters for the always stable predictor-corrector (ASPC) method:", &
1107 "ASPC order: ", max(nvec - 2, 0), &
1108 "B(", 1,
") = ", alpha
1114 IF (use_overlap)
THEN
1116 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1118 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
1119 t1_state%wf(ispin), 0.0_dp, csc)
1121 CALL parallel_gemm(
'N',
'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1122 alpha = (-1.0_dp)**(i + 1)*real(i, kind=
dp)* &
1125 WRITE (unit=io_unit, fmt=
"(T3,A2,I0,A4,F10.6)") &
1126 "B(", i,
") = ", alpha
1133 v_matrix=mo_coeff, &
1136 density_matrix=rho_ao(ispin)%matrix)
1143 IF (do_kpoints)
THEN
1144 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1146 CALL wfi_extrapolate_gext_proj_kp(wf_history, qs_env, nvec, io_unit, print_level)
1150 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1151 IF (nvec >= wf_history%memory_depth)
THEN
1152 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. &
1153 (qs_env%scf_control%eps_scf_hist /= 0))
THEN
1154 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1155 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1156 qs_env%scf_control%outer_scf%have_scf = .false.
1157 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
1158 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1159 qs_env%scf_control%outer_scf%have_scf = .false.
1160 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
1161 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1167 ALLOCATE (coeffs(nvec))
1170 CALL diff_fitting(wf_history, matrix_s(1)%matrix, coeffs, nvec, &
1171 1e-4_dp, io_unit, print_level)
1173 my_orthogonal_wf = .true.
1175 DO ispin = 1,
SIZE(mos)
1176 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1177 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1181 matrix_struct=matrix_struct)
1184 template_fmstruct=matrix_struct, &
1197 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1198 CALL parallel_gemm(
'N',
'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1204 v_matrix=mo_coeff, &
1207 density_matrix=rho_ao(ispin)%matrix)
1217 IF (do_kpoints)
THEN
1218 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1220 CALL wfi_extrapolate_gext_proj_kp(wf_history, qs_env, nvec, io_unit, print_level)
1224 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1225 IF (nvec >= wf_history%memory_depth)
THEN
1226 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. &
1227 (qs_env%scf_control%eps_scf_hist /= 0))
THEN
1228 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1229 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1230 qs_env%scf_control%outer_scf%have_scf = .false.
1231 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
1232 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1233 qs_env%scf_control%outer_scf%have_scf = .false.
1234 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
1235 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1241 ALLOCATE (coeffs(nvec))
1244 CALL tr_fitting(wf_history, matrix_s(1)%matrix, coeffs, nvec, &
1245 1e-4_dp, io_unit, print_level)
1247 my_orthogonal_wf = .true.
1249 DO ispin = 1,
SIZE(mos)
1250 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1251 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1255 matrix_struct=matrix_struct)
1258 template_fmstruct=matrix_struct, &
1271 CALL parallel_gemm(
'T',
'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1272 CALL parallel_gemm(
'N',
'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1278 v_matrix=mo_coeff, &
1281 density_matrix=rho_ao(ispin)%matrix)
1291 CALL cp_abort(__location__, &
1292 "Unknown interpolation method: "// &
1293 trim(adjustl(
cp_to_string(wf_history%interpolation_method_nr))))
1295 IF (
PRESENT(orthogonal_wf)) orthogonal_wf = my_orthogonal_wf
1297 "DFT%SCF%PRINT%PROGRAM_RUN_INFO")
1298 CALL timestop(handle)
1310 SUBROUTINE wfi_use_prev_wf_kp(qs_env, io_unit, print_level, pbc_shift_ref, load_snapshot_wf)
1312 INTEGER,
INTENT(IN) :: io_unit, print_level
1313 INTEGER,
DIMENSION(:, :),
INTENT(IN),
OPTIONAL :: pbc_shift_ref
1314 LOGICAL,
INTENT(IN),
OPTIONAL :: load_snapshot_wf
1316 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_use_prev_wf_kp'
1318 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: col_scaling
1319 INTEGER :: chol_info, handle, igroup, ik, ikp, &
1320 indx, ispin, j, kplocal, nao, nkp, &
1321 nkp_groups, nmo, nspin
1322 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: pbc_shift_cur, pbc_shift_src
1323 INTEGER,
DIMENSION(2) :: kp_range
1324 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
1325 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1326 LOGICAL :: my_kpgrp, reload_snapshot_wf, &
1327 use_pbc_phase_ref, use_real_wfn
1328 REAL(kind=
dp) :: eval_thresh
1329 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1330 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1332 TYPE(
cp_cfm_type) :: cfm_evecs, cfm_mhalf, cfm_nao_nmo_work, &
1334 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: csmat_cur
1338 TYPE(
cp_fm_type),
POINTER :: imos, mo_coeff, rmos
1339 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp, rho_ao_kp
1340 TYPE(
dbcsr_type),
POINTER :: cmatrix_db, rmatrix, tmpmat
1354 CALL timeset(routinen, handle)
1356 NULLIFY (kpoints, dft_control, matrix_s_kp, scf_env, scf_control, rho, sab_nl, kp, &
1357 mo_coeff, rmos, imos, wf_history, t1_state)
1359 CALL get_qs_env(qs_env, kpoints=kpoints, dft_control=dft_control, &
1360 matrix_s_kp=matrix_s_kp, scf_env=scf_env, &
1361 scf_control=scf_control, rho=rho)
1362 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, &
1363 kp_range=kp_range, nkp_groups=nkp_groups, kp_dist=kp_dist, &
1364 sab_nl=sab_nl, cell_to_index=cell_to_index)
1365 kplocal = kp_range(2) - kp_range(1) + 1
1367 IF (use_real_wfn)
THEN
1368 CALL timestop(handle)
1372 wf_history => qs_env%wf_history
1373 reload_snapshot_wf = .false.
1374 IF (
PRESENT(load_snapshot_wf)) reload_snapshot_wf = load_snapshot_wf
1375 IF (
PRESENT(pbc_shift_ref))
THEN
1376 ALLOCATE (pbc_shift_src(3,
SIZE(pbc_shift_ref, 2)))
1377 pbc_shift_src(:, :) = pbc_shift_ref(:, :)
1378 use_pbc_phase_ref = .true.
1380 use_pbc_phase_ref = .false.
1381 IF (
ASSOCIATED(wf_history))
THEN
1382 IF (wf_history%store_wf_kp .AND. wf_history%snapshot_count > 0)
THEN
1384 cpassert(
ASSOCIATED(t1_state%wf_kp))
1385 cpassert(
ASSOCIATED(t1_state%kp_pbc_shift))
1386 reload_snapshot_wf = .true.
1387 ALLOCATE (pbc_shift_src(3,
SIZE(t1_state%kp_pbc_shift, 2)))
1388 pbc_shift_src(:, :) = t1_state%kp_pbc_shift(:, :)
1389 use_pbc_phase_ref = .true.
1393 IF (use_pbc_phase_ref)
CALL wfi_compute_kp_pbc_shift(qs_env, pbc_shift_cur)
1395 kp => kpoints%kp_env(1)%kpoint_env
1396 nspin =
SIZE(kp%mos, 2)
1397 CALL get_mo_set(kp%mos(1, 1), nao=nao, nmo=nmo, mo_coeff=mo_coeff)
1400 WRITE (unit=io_unit, fmt=
"(/,T2,A)") &
1401 "Using previous wavefunctions as initial guess for k-points (with reorthogonalization)"
1405 ALLOCATE (rmatrix, cmatrix_db, tmpmat)
1406 CALL dbcsr_create(rmatrix, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
1407 CALL dbcsr_create(cmatrix_db, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
1408 CALL dbcsr_create(tmpmat, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1413 CALL mpools_get(mpools_kp, ao_ao_fm_pools=ao_ao_fm_pools_kp)
1418 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct)
1420 NULLIFY (nmo_nmo_struct)
1422 nrow_global=nmo, ncol_global=nmo)
1426 para_env => kpoints%blacs_env_all%para_env
1427 ALLOCATE (info(kplocal*nkp_groups, 2))
1429 ALLOCATE (csmat_cur(kplocal))
1437 DO igroup = 1, nkp_groups
1438 ik = kp_dist(1, igroup) + ikp - 1
1439 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
1444 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix_db, rsmat=matrix_s_kp, &
1445 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
1464 DO igroup = 1, nkp_groups
1465 ik = kp_dist(1, igroup) + ikp - 1
1466 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
1477 DO indx = 1, kplocal*nkp_groups
1484 ALLOCATE (eigenvalues(nmo))
1485 eval_thresh = 1.0e-12_dp
1488 kp => kpoints%kp_env(ikp)%kpoint_env
1490 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1491 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1492 IF (reload_snapshot_wf)
THEN
1493 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 1, ispin), rmos)
1494 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 2, ispin), imos)
1496 IF (use_pbc_phase_ref)
THEN
1497 ik = kp_range(1) + ikp - 1
1498 CALL wfi_apply_kp_pbc_phase_fm(rmos, imos, pbc_shift_cur - pbc_shift_src, &
1499 xkp(1:3, ik), matrix_s_kp(1, 1)%matrix)
1504 csmat_cur(ikp), cmos_new,
z_zero, cfm_nao_nmo_work)
1506 cmos_new, cfm_nao_nmo_work,
z_zero, csc_cfm)
1509 IF (chol_info == 0)
THEN
1517 ALLOCATE (col_scaling(nmo))
1519 IF (eigenvalues(j) > eval_thresh)
THEN
1520 col_scaling(j) = cmplx(1.0_dp/sqrt(eigenvalues(j)), 0.0_dp, kind=
dp)
1526 DEALLOCATE (col_scaling)
1536 DEALLOCATE (eigenvalues)
1543 matrix_s_kp(1, 1)%matrix, sab_nl, scf_env%scf_work1)
1551 DEALLOCATE (csmat_cur)
1560 IF (
ALLOCATED(pbc_shift_cur))
DEALLOCATE (pbc_shift_cur)
1561 IF (
ALLOCATED(pbc_shift_src))
DEALLOCATE (pbc_shift_src)
1563 CALL timestop(handle)
1564 END SUBROUTINE wfi_use_prev_wf_kp
1573 SUBROUTINE wfi_store_kp_pbc_shift(snapshot, cell, particle_set)
1578 INTEGER :: iatom, natom
1579 REAL(kind=
dp),
DIMENSION(3) :: frac_pbc, frac_raw, r_pbc
1581 cpassert(
ASSOCIATED(snapshot))
1582 cpassert(
ASSOCIATED(cell))
1583 cpassert(
ASSOCIATED(particle_set))
1585 natom =
SIZE(particle_set)
1586 IF (
ASSOCIATED(snapshot%kp_pbc_shift))
THEN
1587 DEALLOCATE (snapshot%kp_pbc_shift)
1589 ALLOCATE (snapshot%kp_pbc_shift(3, natom))
1591 r_pbc(1:3) =
pbc(particle_set(iatom)%r(1:3), cell)
1594 snapshot%kp_pbc_shift(1:3, iatom) = nint(frac_pbc(1:3) - frac_raw(1:3))
1596 END SUBROUTINE wfi_store_kp_pbc_shift
1603 SUBROUTINE wfi_compute_kp_pbc_shift(qs_env, pbc_shift)
1605 INTEGER,
ALLOCATABLE,
DIMENSION(:, :),
INTENT(OUT) :: pbc_shift
1607 INTEGER :: iatom, natom
1608 REAL(kind=
dp),
DIMENSION(3) :: frac_pbc, frac_raw, r_pbc
1612 NULLIFY (cell, particle_set)
1613 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
1614 cpassert(
ASSOCIATED(cell))
1615 cpassert(
ASSOCIATED(particle_set))
1617 natom =
SIZE(particle_set)
1618 ALLOCATE (pbc_shift(3, natom))
1620 r_pbc(1:3) =
pbc(particle_set(iatom)%r(1:3), cell)
1623 pbc_shift(1:3, iatom) = nint(frac_pbc(1:3) - frac_raw(1:3))
1625 END SUBROUTINE wfi_compute_kp_pbc_shift
1636 SUBROUTINE wfi_apply_kp_pbc_phase_fm(rmos, imos, pbc_shift_delta, xk, matrix_template)
1638 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: pbc_shift_delta
1639 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: xk
1642 INTEGER :: iatom, icol, irow, natom, nmo, nrow, &
1644 INTEGER,
DIMENSION(:),
POINTER :: row_blk_size
1645 REAL(kind=
dp) :: ci, cr, i_old, r_old, theta
1646 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: iblock, rblock
1648 cpassert(
ASSOCIATED(rmos))
1649 cpassert(
ASSOCIATED(imos))
1650 cpassert(
ASSOCIATED(matrix_template))
1652 natom =
SIZE(pbc_shift_delta, 2)
1654 NULLIFY (row_blk_size)
1656 cpassert(
SIZE(row_blk_size) >= natom)
1660 nrow = row_blk_size(iatom)
1661 IF (any(pbc_shift_delta(1:3, iatom) /= 0))
THEN
1662 theta =
twopi*sum(xk(1:3)*real(pbc_shift_delta(1:3, iatom), kind=
dp))
1665 ALLOCATE (rblock(nrow, nmo), iblock(nrow, nmo))
1670 r_old = rblock(irow, icol)
1671 i_old = iblock(irow, icol)
1672 rblock(irow, icol) = cr*r_old - ci*i_old
1673 iblock(irow, icol) = ci*r_old + cr*i_old
1678 DEALLOCATE (rblock, iblock)
1680 row_start = row_start + nrow
1682 END SUBROUTINE wfi_apply_kp_pbc_phase_fm
1692 SUBROUTINE wfi_apply_kp_pbc_phase_cfm(cmos, pbc_shift_delta, xk, matrix_template)
1694 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: pbc_shift_delta
1695 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: xk
1698 COMPLEX(KIND=dp) :: phase
1699 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: zblock
1700 INTEGER :: iatom, natom, nmo, nrow, row_start
1701 INTEGER,
DIMENSION(:),
POINTER :: row_blk_size
1702 REAL(kind=
dp) :: theta
1704 cpassert(
ASSOCIATED(matrix_template))
1706 natom =
SIZE(pbc_shift_delta, 2)
1708 NULLIFY (row_blk_size)
1710 cpassert(
SIZE(row_blk_size) >= natom)
1714 nrow = row_blk_size(iatom)
1715 IF (any(pbc_shift_delta(1:3, iatom) /= 0))
THEN
1716 theta =
twopi*sum(xk(1:3)*real(pbc_shift_delta(1:3, iatom), kind=
dp))
1717 phase = cmplx(cos(theta), sin(theta), kind=
dp)
1718 ALLOCATE (zblock(nrow, nmo))
1720 zblock = phase*zblock
1724 row_start = row_start + nrow
1726 END SUBROUTINE wfi_apply_kp_pbc_phase_cfm
1739 SUBROUTINE wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1742 INTEGER,
INTENT(IN) :: nvec, io_unit, print_level
1744 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_extrapolate_ps_aspc_kp'
1746 INTEGER :: handle, i, ik, ikp, ispin, kplocal, &
1747 method_nr, nao, nmo, nspin
1748 INTEGER,
DIMENSION(2) :: kp_range
1749 LOGICAL :: use_real_wfn
1750 REAL(kind=
dp) :: alpha_coeff
1751 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1752 TYPE(
cp_cfm_type) :: cfm_nao_nmo_work, cmos_1, cmos_i, &
1755 TYPE(
cp_fm_type),
POINTER :: imos, mo_coeff, rmos
1756 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
1761 method_nr = wf_history%interpolation_method_nr
1763 CALL timeset(routinen, handle)
1764 NULLIFY (kpoints, kp, mo_coeff, rmos, imos, t0_state, t1_state, nmo_nmo_struct, &
1767 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp)
1768 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn, kp_range=kp_range, xkp=xkp)
1769 kplocal = kp_range(2) - kp_range(1) + 1
1771 IF (use_real_wfn)
THEN
1773 CALL cp_warn(__location__,
"ASPC with k-points requires complex wavefunctions; "// &
1774 "falling back to USE_PREV_WF.")
1776 CALL cp_warn(__location__,
"PS with k-points requires complex wavefunctions; "// &
1777 "falling back to USE_PREV_WF.")
1779 CALL wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
1780 CALL timestop(handle)
1784 kp => kpoints%kp_env(1)%kpoint_env
1785 nspin =
SIZE(kp%mos, 2)
1786 CALL get_mo_set(kp%mos(1, 1), nao=nao, nmo=nmo, mo_coeff=mo_coeff)
1790 WRITE (unit=io_unit, fmt=
"(/,T2,A,/,T3,A,I0)") &
1791 "Parameters for the always stable predictor-corrector (ASPC) method:", &
1792 "ASPC order: ", max(nvec - 2, 0)
1797 CALL cp_cfm_create(cmos_new, mo_coeff%matrix_struct, set_zero=.true.)
1798 CALL cp_cfm_create(cmos_1, mo_coeff%matrix_struct, set_zero=.true.)
1799 CALL cp_cfm_create(cmos_i, mo_coeff%matrix_struct, set_zero=.true.)
1800 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct, set_zero=.true.)
1805 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct)
1809 nrow_global=nmo, ncol_global=nmo)
1811 CALL cp_cfm_create(csc_cfm, nmo_nmo_struct, set_zero=.true.)
1820 alpha_coeff = real(4*nvec - 2, kind=
dp)/real(nvec + 1, kind=
dp)
1822 WRITE (unit=io_unit, fmt=
"(T3,A2,I0,A4,F10.6)")
"B(", 1,
") = ", alpha_coeff
1829 kp => kpoints%kp_env(ikp)%kpoint_env
1831 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1832 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1833 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 1, ispin), rmos)
1834 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 2, ispin), imos)
1844 alpha_coeff = (-1.0_dp)**(i + 1)*real(i, kind=
dp)* &
1847 WRITE (unit=io_unit, fmt=
"(T3,A2,I0,A4,F10.6)")
"B(", i,
") = ", alpha_coeff
1850 alpha_coeff = -1.0_dp*alpha_coeff*real(nvec - i + 1,
dp)/real(i,
dp)
1854 kp => kpoints%kp_env(ikp)%kpoint_env
1856 ik = kp_range(1) + ikp - 1
1857 CALL cp_fm_to_cfm(t1_state%wf_kp(ikp, 1, ispin), t1_state%wf_kp(ikp, 2, ispin), cmos_1)
1858 CALL cp_fm_to_cfm(t0_state%wf_kp(ikp, 1, ispin), t0_state%wf_kp(ikp, 2, ispin), cmos_i)
1862 CALL wfi_apply_kp_pbc_phase_cfm(cmos_1, t0_state%kp_pbc_shift - t1_state%kp_pbc_shift, &
1863 xkp(1:3, ik), matrix_s_kp(1, 1)%matrix)
1867 t0_state%overlap_cfm_kp(ikp), cmos_1,
z_zero, cfm_nao_nmo_work)
1869 cmos_i, cfm_nao_nmo_work,
z_zero, csc_cfm)
1871 cmos_i, csc_cfm,
z_zero, cfm_nao_nmo_work)
1876 CALL wfi_apply_kp_pbc_phase_cfm(cfm_nao_nmo_work, t1_state%kp_pbc_shift - t0_state%kp_pbc_shift, &
1877 xkp(1:3, ik), matrix_s_kp(1, 1)%matrix)
1879 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1880 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1898 CALL wfi_use_prev_wf_kp(qs_env, 0, print_level, pbc_shift_ref=t1_state%kp_pbc_shift, &
1899 load_snapshot_wf=.false.)
1901 CALL timestop(handle)
1903 END SUBROUTINE wfi_extrapolate_ps_aspc_kp
1915 SUBROUTINE wfi_extrapolate_gext_proj_kp(wf_history, qs_env, nvec, io_unit, print_level)
1918 INTEGER,
INTENT(IN) :: nvec, io_unit, print_level
1920 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_extrapolate_gext_proj_kp'
1922 INTEGER :: handle, i, igroup, ik, ikp, indx, ispin, &
1923 kplocal, method_nr, nao, nkp, &
1924 nkp_groups, nmo, nspin
1925 INTEGER,
DIMENSION(2) :: kp_range
1926 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
1927 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1928 LOGICAL :: my_kpgrp, use_real_wfn
1929 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeffs, weight_kp
1930 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp
1931 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1933 TYPE(
cp_cfm_type) :: cfm_nao_nmo_work, cmos_1, cmos_i, &
1935 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: csmat_cur
1939 TYPE(
cp_fm_type),
POINTER :: imos, mo_coeff, rmos
1940 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
1941 TYPE(
dbcsr_type),
POINTER :: cmatrix_db, rmatrix, tmpmat
1951 method_nr = wf_history%interpolation_method_nr
1953 CALL timeset(routinen, handle)
1954 NULLIFY (ao_ao_struct, cell_to_index, cmatrix_db, imos, kp, kpoints, matrix_s_kp, &
1955 mo_coeff, mpools_kp, para_env, para_env_inter_kp, rmatrix, rmos, sab_nl, &
1956 scf_env, t0_state, t1_state, tmpmat, xkp, kp_dist, wkp, nmo_nmo_struct, &
1959 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp, scf_env=scf_env)
1960 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn, kp_range=kp_range, &
1961 nkp=nkp, xkp=xkp, wkp=wkp, nkp_groups=nkp_groups, &
1962 kp_dist=kp_dist, cell_to_index=cell_to_index, sab_nl=sab_nl, &
1963 mpools=mpools_kp, para_env_inter_kp=para_env_inter_kp)
1964 kplocal = kp_range(2) - kp_range(1) + 1
1966 IF (use_real_wfn)
THEN
1967 CALL cp_warn(__location__,
"GExt with k-points requires complex wavefunctions; "// &
1968 "falling back to USE_PREV_WF.")
1969 CALL wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
1970 CALL timestop(handle)
1974 IF (nvec >= wf_history%memory_depth)
THEN
1975 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. &
1976 (qs_env%scf_control%eps_scf_hist /= 0))
THEN
1977 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1978 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1979 qs_env%scf_control%outer_scf%have_scf = .false.
1980 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
1981 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1982 qs_env%scf_control%outer_scf%have_scf = .false.
1983 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
1984 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1988 kp => kpoints%kp_env(1)%kpoint_env
1989 nspin =
SIZE(kp%mos, 2)
1990 CALL get_mo_set(kp%mos(1, 1), nao=nao, nmo=nmo, mo_coeff=mo_coeff)
1994 ALLOCATE (rmatrix, cmatrix_db, tmpmat)
1995 CALL dbcsr_create(rmatrix, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
1996 CALL dbcsr_create(cmatrix_db, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
1997 CALL dbcsr_create(tmpmat, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
2001 CALL mpools_get(mpools_kp, ao_ao_fm_pools=ao_ao_fm_pools_kp)
2005 para_env => kpoints%blacs_env_all%para_env
2006 ALLOCATE (info(kplocal*nkp_groups, 2))
2007 ALLOCATE (csmat_cur(kplocal), weight_kp(kplocal))
2010 weight_kp(ikp) = wkp(kp_range(1) + ikp - 1)
2015 DO igroup = 1, nkp_groups
2016 ik = kp_dist(1, igroup) + ikp - 1
2017 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
2022 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix_db, rsmat=matrix_s_kp, &
2023 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
2041 DO igroup = 1, nkp_groups
2042 ik = kp_dist(1, igroup) + ikp - 1
2043 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
2054 DO indx = 1, kplocal*nkp_groups
2059 ALLOCATE (coeffs(nvec))
2061 CALL diff_fitting(wf_history, matrix_s_kp(1, 1)%matrix, coeffs, nvec, &
2062 1e-4_dp, io_unit, print_level, current_overlap_kp=csmat_cur, &
2063 kpoint_weights=weight_kp, para_env_inter_kp=para_env_inter_kp)
2065 CALL tr_fitting(wf_history, matrix_s_kp(1, 1)%matrix, coeffs, nvec, &
2066 1e-4_dp, io_unit, print_level, current_overlap_kp=csmat_cur, &
2067 kpoint_weights=weight_kp, para_env_inter_kp=para_env_inter_kp)
2074 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct)
2076 nrow_global=nmo, ncol_global=nmo)
2082 kp => kpoints%kp_env(ikp)%kpoint_env
2084 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
2085 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
2094 kp => kpoints%kp_env(ikp)%kpoint_env
2095 ik = kp_range(1) + ikp - 1
2097 CALL cp_fm_to_cfm(t1_state%wf_kp(ikp, 1, ispin), t1_state%wf_kp(ikp, 2, ispin), cmos_1)
2098 CALL cp_fm_to_cfm(t0_state%wf_kp(ikp, 1, ispin), t0_state%wf_kp(ikp, 2, ispin), cmos_i)
2100 CALL wfi_apply_kp_pbc_phase_cfm(cmos_1, t0_state%kp_pbc_shift - t1_state%kp_pbc_shift, &
2101 xkp(1:3, ik), matrix_s_kp(1, 1)%matrix)
2104 t0_state%overlap_cfm_kp(ikp), cmos_1,
z_zero, cfm_nao_nmo_work)
2106 cmos_i, cfm_nao_nmo_work,
z_zero, csc_cfm)
2108 cmos_i, csc_cfm,
z_zero, cfm_nao_nmo_work)
2110 CALL wfi_apply_kp_pbc_phase_cfm(cfm_nao_nmo_work, t1_state%kp_pbc_shift - t0_state%kp_pbc_shift, &
2111 xkp(1:3, ik), matrix_s_kp(1, 1)%matrix)
2113 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
2114 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
2128 CALL wfi_use_prev_wf_kp(qs_env, 0, print_level, pbc_shift_ref=t1_state%kp_pbc_shift, &
2129 load_snapshot_wf=.false.)
2134 DEALLOCATE (csmat_cur, coeffs, weight_kp, info)
2140 CALL timestop(handle)
2142 END SUBROUTINE wfi_extrapolate_gext_proj_kp
2153 ELEMENTAL SUBROUTINE wfi_set_history_variables(qs_env, nvec)
2155 INTEGER,
INTENT(IN) :: nvec
2157 IF (nvec >= qs_env%wf_history%memory_depth)
THEN
2158 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0))
THEN
2159 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
2160 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
2161 qs_env%scf_control%outer_scf%have_scf = .false.
2162 ELSE IF (qs_env%scf_control%max_scf_hist /= 0)
THEN
2163 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
2164 qs_env%scf_control%outer_scf%have_scf = .false.
2165 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0)
THEN
2166 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
2167 qs_env%scf_control%outer_scf%eps_scf = qs_env%scf_control%eps_scf_hist
2171 END SUBROUTINE wfi_set_history_variables
2185 REAL(kind=
dp),
INTENT(in) :: dt
2187 cpassert(
ASSOCIATED(wf_history))
2188 cpassert(wf_history%ref_count > 0)
2189 cpassert(
ASSOCIATED(qs_env))
2191 wf_history%snapshot_count = wf_history%snapshot_count + 1
2192 IF (wf_history%memory_depth > 0)
THEN
2193 wf_history%last_state_index =
modulo(wf_history%snapshot_count, &
2194 wf_history%memory_depth) + 1
2195 CALL wfs_update(snapshot=wf_history%past_states &
2196 (wf_history%last_state_index)%snapshot, wf_history=wf_history, &
2197 qs_env=qs_env, dt=dt)
2213 INTEGER,
INTENT(in),
OPTIONAL :: n_col
2215 CHARACTER(len=*),
PARAMETER :: routinen =
'reorthogonalize_vectors'
2217 INTEGER :: handle, my_n_col
2218 LOGICAL :: has_unit_metric, &
2219 ortho_contains_cholesky, &
2228 NULLIFY (scf_env, scf_control, maxao_maxmo_fm_pool, matrix_s, mpools, dft_control)
2229 CALL timeset(routinen, handle)
2231 cpassert(
ASSOCIATED(qs_env))
2234 IF (
PRESENT(n_col)) my_n_col = n_col
2237 scf_control=scf_control, &
2238 matrix_s=matrix_s, &
2239 dft_control=dft_control)
2240 CALL mpools_get(mpools, maxao_maxmo_fm_pool=maxao_maxmo_fm_pool)
2241 IF (
ASSOCIATED(scf_env))
THEN
2242 ortho_contains_cholesky = (scf_env%method /=
ot_method_nr) .AND. &
2243 (scf_env%cholesky_method > 0) .AND. &
2244 ASSOCIATED(scf_env%ortho)
2246 ortho_contains_cholesky = .false.
2249 CALL get_qs_env(qs_env, has_unit_metric=has_unit_metric)
2250 smearing_is_used = .false.
2251 IF (dft_control%smear)
THEN
2252 smearing_is_used = .true.
2255 IF (has_unit_metric)
THEN
2257 ELSE IF (smearing_is_used)
THEN
2259 matrix_s=matrix_s(1)%matrix)
2260 ELSE IF (ortho_contains_cholesky)
THEN
2262 ortho=scf_env%ortho)
2266 CALL timestop(handle)
2280 CHARACTER(len=*),
PARAMETER :: routinen =
'wfi_purge_history'
2282 INTEGER :: handle, io_unit, print_level
2287 NULLIFY (dft_control, wf_history)
2289 CALL timeset(routinen, handle)
2291 print_level = logger%iter_info%print_level
2293 extension=
".scfLog")
2295 cpassert(
ASSOCIATED(qs_env))
2296 cpassert(
ASSOCIATED(qs_env%wf_history))
2297 cpassert(qs_env%wf_history%ref_count > 0)
2298 CALL get_qs_env(qs_env, dft_control=dft_control)
2300 SELECT CASE (qs_env%wf_history%interpolation_method_nr)
2308 IF (qs_env%wf_history%snapshot_count >= 2)
THEN
2309 IF (debug_this_module .AND. io_unit > 0)
THEN
2310 WRITE (io_unit, fmt=
"(T2,A)")
"QS| Purging WFN history"
2312 CALL wfi_create(wf_history, interpolation_method_nr= &
2313 dft_control%qs_control%wf_interpolation_method_nr, &
2314 extrapolation_order=dft_control%qs_control%wf_extrapolation_order, &
2315 has_unit_metric=qs_env%has_unit_metric)
2317 wf_history=wf_history)
2319 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
2322 cpabort(
"Unknown extrapolation method.")
2324 CALL timestop(handle)
2347 SUBROUTINE diff_fitting(wf_history, current_overlap, coeffs, nvec, eps, io_unit, print_level, &
2348 current_overlap_kp, kpoint_weights, para_env_inter_kp)
2350 TYPE(
dbcsr_type),
INTENT(IN) :: current_overlap
2351 INTEGER,
INTENT(IN) :: nvec
2352 REAL(kind=
dp),
INTENT(OUT) :: coeffs(nvec)
2353 REAL(kind=
dp),
INTENT(IN) :: eps
2354 INTEGER,
INTENT(IN) :: io_unit, print_level
2356 OPTIONAL :: current_overlap_kp
2357 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kpoint_weights
2360 COMPLEX(KIND=dp) :: ztrace
2361 INTEGER :: i, icol_local, ikp, info, irow_local, j
2362 REAL(kind=
dp) :: error, norm_ref, weight
2363 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: b
2364 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: a
2365 TYPE(
cp_cfm_type) :: target_diff_cfm, tmp_conj_cfm, &
2366 tmp_i_cfm, tmp_j_cfm
2367 TYPE(
dbcsr_type) :: target_diff, tmp_i, tmp_j, tmp_k
2371 cpabort(
"Not enough vectors to do the fitting")
2372 ELSE IF (nvec == 1)
THEN
2377 IF (
PRESENT(current_overlap_kp))
THEN
2378 ALLOCATE (a(nvec - 1, nvec - 1), b(nvec - 1))
2383 CALL cp_cfm_create(target_diff_cfm, current_overlap_kp(1)%matrix_struct)
2384 CALL cp_cfm_create(tmp_i_cfm, current_overlap_kp(1)%matrix_struct)
2385 CALL cp_cfm_create(tmp_j_cfm, current_overlap_kp(1)%matrix_struct)
2386 CALL cp_cfm_create(tmp_conj_cfm, current_overlap_kp(1)%matrix_struct)
2388 DO ikp = 1,
SIZE(current_overlap_kp)
2390 IF (
PRESENT(kpoint_weights)) weight = kpoint_weights(ikp)
2392 CALL cp_cfm_to_cfm(current_overlap_kp(ikp), target_diff_cfm)
2394 ref_state%overlap_cfm_kp(ikp))
2399 ref_state%overlap_cfm_kp(ikp))
2401 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2402 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2403 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2404 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2407 CALL cp_cfm_trace(tmp_conj_cfm, target_diff_cfm, ztrace)
2408 b(i - 1) = b(i - 1) + weight*real(ztrace, kind=
dp)
2414 ref_state%overlap_cfm_kp(ikp))
2416 a(j - 1, i - 1) = a(j - 1, i - 1) + weight*real(ztrace, kind=
dp)
2423 a(i - 1, j - 1) = a(j - 1, i - 1)
2427 IF (
PRESENT(para_env_inter_kp))
THEN
2428 IF (
ASSOCIATED(para_env_inter_kp))
THEN
2429 CALL para_env_inter_kp%sum(a)
2430 CALL para_env_inter_kp%sum(b)
2435 a(i, i) = a(i, i) + eps**2
2438 CALL dposv(
'u', nvec - 1, 1, a, nvec - 1, b, nvec - 1, info)
2440 cpabort(
"DPOSV failed.")
2443 coeffs(1) = 1.0_dp - sum(b)
2444 coeffs(2:nvec) = b(:)
2449 DO ikp = 1,
SIZE(current_overlap_kp)
2451 IF (
PRESENT(kpoint_weights)) weight = kpoint_weights(ikp)
2456 state%overlap_cfm_kp(ikp))
2459 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2460 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2461 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2462 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2466 error = error + weight*real(ztrace, kind=
dp)
2467 CALL cp_cfm_to_cfm(ref_state%overlap_cfm_kp(ikp), tmp_conj_cfm)
2468 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2469 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2470 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2471 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2474 CALL cp_cfm_trace(tmp_conj_cfm, ref_state%overlap_cfm_kp(ikp), ztrace)
2475 norm_ref = norm_ref + weight*real(ztrace, kind=
dp)
2477 IF (
PRESENT(para_env_inter_kp))
THEN
2478 IF (
ASSOCIATED(para_env_inter_kp))
THEN
2479 CALL para_env_inter_kp%sum(error)
2480 CALL para_env_inter_kp%sum(norm_ref)
2483 IF (io_unit > 0)
THEN
2484 WRITE (unit=io_unit, fmt=
"(/,T2,A,F20.10)")
"GEXT overlap fitting error:", &
2485 sqrt(error/max(norm_ref, tiny(1.0_dp)))
2497 ALLOCATE (a(nvec - 1, nvec - 1), b(nvec - 1))
2503 CALL dbcsr_copy(target_diff, current_overlap)
2504 CALL dbcsr_add(target_diff, ref_state%overlap, 1.0_dp, -1.0_dp)
2513 CALL dbcsr_add(tmp_i, ref_state%overlap, 1.0_dp, -1.0_dp)
2514 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp_i, target_diff, 0.0_dp, tmp_k)
2520 CALL dbcsr_add(tmp_j, ref_state%overlap, 1.0_dp, -1.0_dp)
2521 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp_i, tmp_j, 0.0_dp, tmp_k)
2523 a(i - 1, j - 1) = a(j - 1, i - 1)
2529 a(i, i) = a(i, i) + eps**2
2533 CALL dposv(
'u', nvec - 1, 1, a, nvec - 1, b, nvec - 1, info)
2535 cpabort(
"DPOSV failed.")
2539 coeffs(1) = 1.0_dp - sum(b)
2540 coeffs(2:nvec) = b(:)
2548 CALL dbcsr_add(tmp_i, state%overlap, 1.0_dp, -coeffs(i))
2551 IF (io_unit > 0)
THEN
2552 WRITE (unit=io_unit, fmt=
"(/,T2,A,F20.10)")
"GEXT overlap fitting error:", error
2563 END SUBROUTINE diff_fitting
2585 SUBROUTINE tr_fitting(wf_history, current_overlap, coeffs, nvec, eps, io_unit, print_level, &
2586 current_overlap_kp, kpoint_weights, para_env_inter_kp)
2588 TYPE(
dbcsr_type),
INTENT(IN) :: current_overlap
2589 INTEGER,
INTENT(IN) :: nvec
2590 REAL(kind=
dp),
INTENT(OUT) :: coeffs(nvec)
2591 REAL(kind=
dp),
INTENT(IN) :: eps
2592 INTEGER,
INTENT(IN) :: io_unit, print_level
2594 OPTIONAL :: current_overlap_kp
2595 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN),
OPTIONAL :: kpoint_weights
2598 COMPLEX(KIND=dp) :: ztrace
2599 INTEGER :: i, icol_local, ikp, info, irow_local, j, &
2601 REAL(kind=
dp) :: error, norm_ref, weight
2602 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: b
2603 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: a
2604 TYPE(
cp_cfm_type) :: target_overlap_cfm, tmp_conj_cfm, &
2605 tmp_i_cfm, tmp_j_cfm
2606 TYPE(
dbcsr_type) :: target_overlap, tmp_i, tmp_j, tmp_k
2610 cpabort(
"Not enough vectors to do the fitting")
2611 ELSE IF (nvec == 1)
THEN
2616 IF (mod(nvec, 2) == 0)
THEN
2622 IF (
PRESENT(current_overlap_kp))
THEN
2623 ALLOCATE (a(ntr, ntr), b(ntr))
2628 CALL cp_cfm_create(target_overlap_cfm, current_overlap_kp(1)%matrix_struct)
2629 CALL cp_cfm_create(tmp_i_cfm, current_overlap_kp(1)%matrix_struct)
2630 CALL cp_cfm_create(tmp_j_cfm, current_overlap_kp(1)%matrix_struct)
2631 CALL cp_cfm_create(tmp_conj_cfm, current_overlap_kp(1)%matrix_struct)
2633 DO ikp = 1,
SIZE(current_overlap_kp)
2635 IF (
PRESENT(kpoint_weights)) weight = kpoint_weights(ikp)
2637 CALL cp_cfm_to_cfm(current_overlap_kp(ikp), target_overlap_cfm)
2646 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2647 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2648 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2649 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2652 CALL cp_cfm_trace(tmp_conj_cfm, target_overlap_cfm, ztrace)
2653 b(i) = b(i) + weight*real(ztrace, kind=
dp)
2660 a(j, i) = a(j, i) + weight*real(ztrace, kind=
dp)
2671 IF (
PRESENT(para_env_inter_kp))
THEN
2672 IF (
ASSOCIATED(para_env_inter_kp))
THEN
2673 CALL para_env_inter_kp%sum(a)
2674 CALL para_env_inter_kp%sum(b)
2679 a(i, i) = a(i, i) + eps**2
2682 CALL dposv(
'u', ntr, 1, a, ntr, b, ntr, info)
2684 cpabort(
"DPOSV failed.")
2688 coeffs(nvec) = -1.0_dp
2690 coeffs(i) = coeffs(i) + b(i)
2691 coeffs(nvec - i) = coeffs(nvec - i) + b(i)
2697 DO ikp = 1,
SIZE(current_overlap_kp)
2699 IF (
PRESENT(kpoint_weights)) weight = kpoint_weights(ikp)
2704 state%overlap_cfm_kp(ikp))
2707 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2708 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2709 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2710 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2714 error = error + weight*real(ztrace, kind=
dp)
2715 CALL cp_cfm_to_cfm(ref_state%overlap_cfm_kp(ikp), tmp_conj_cfm)
2716 DO icol_local = 1,
SIZE(tmp_conj_cfm%local_data, 2)
2717 DO irow_local = 1,
SIZE(tmp_conj_cfm%local_data, 1)
2718 tmp_conj_cfm%local_data(irow_local, icol_local) = &
2719 conjg(tmp_conj_cfm%local_data(irow_local, icol_local))
2722 CALL cp_cfm_trace(tmp_conj_cfm, ref_state%overlap_cfm_kp(ikp), ztrace)
2723 norm_ref = norm_ref + weight*real(ztrace, kind=
dp)
2725 IF (
PRESENT(para_env_inter_kp))
THEN
2726 IF (
ASSOCIATED(para_env_inter_kp))
THEN
2727 CALL para_env_inter_kp%sum(error)
2728 CALL para_env_inter_kp%sum(norm_ref)
2731 IF (io_unit > 0)
THEN
2732 WRITE (unit=io_unit, fmt=
"(/,T2,A,F20.10)")
"GEXT overlap fitting error:", &
2733 sqrt(error/max(norm_ref, tiny(1.0_dp)))
2745 ALLOCATE (a(ntr, ntr), b(ntr))
2751 CALL dbcsr_copy(target_overlap, current_overlap)
2752 CALL dbcsr_add(target_overlap, ref_state%overlap, 1.0_dp, 1.0_dp)
2762 CALL dbcsr_add(tmp_i, state%overlap, 1.0_dp, 1.0_dp)
2771 CALL dbcsr_add(tmp_j, state%overlap, 1.0_dp, 1.0_dp)
2772 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp_i, tmp_j, 0.0_dp, tmp_k)
2780 a(i, i) = a(i, i) + eps**2
2784 CALL dposv(
'u', ntr, 1, a, ntr, b, ntr, info)
2786 cpabort(
"DPOSV failed.")
2791 coeffs(nvec) = -1.0_dp
2793 coeffs(i) = coeffs(i) + b(i)
2794 coeffs(nvec - i) = coeffs(nvec - i) + b(i)
2803 CALL dbcsr_add(tmp_i, state%overlap, 1.0_dp, -coeffs(i))
2806 IF (io_unit > 0)
THEN
2807 WRITE (unit=io_unit, fmt=
"(/,T2,A,F20.10)")
"GEXT overlap fitting error:", error
2818 END SUBROUTINE tr_fitting
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public vandevondele2005a
integer, save, public kuhne2007
integer, save, public kolafa2004
Handles all functions related to the CELL.
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b).
subroutine, public cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
Performs one of the matrix-matrix operations: matrix_c = alpha * op1( matrix_a ) * op2( matrix_b ) + ...
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_triangular_multiply(triangular_matrix, matrix_b, side, transa_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
Multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
subroutine, public cp_cfm_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
subroutine, public cp_cfm_trace(matrix_a, matrix_b, trace)
Returns the trace of matrix_a^T matrix_b, i.e sum_{i,j}(matrix_a(i,j)*matrix_b(i,j)) .
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
Extract a sub-matrix from the full matrix: op(target_m)(1:n_rows,1:n_cols) = fm(start_row:start_row+n...
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_set_submatrix(matrix, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
Set a sub-matrix of the full matrix: matrix(start_row:start_row+n_rows,start_col:start_col+n_cols) = ...
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
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_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_trace(matrix, trace)
Computes the trace of the given matrix, also known as the sum of its diagonal elements.
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
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.
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
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_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
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,...
various routines to log and control the output. The idea is that decisions about where to log should ...
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)
...
integer, parameter, public low_print_level
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,...
Defines the basic variable types.
integer, parameter, public dp
Routines needed for kpoint calculation.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext, overlap_rs)
generate real space density matrices in DBCSR format
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
subroutine, public kpoint_set_mo_occupation(kpoint, smear, probe)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
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, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
Interface to the message passing library MPI.
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
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
collects routines that calculate density matrices
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
collects routines that perform operations directly related to MOs
subroutine, public make_basis_simple(vmatrix, ncol)
given a set of vectors, return an orthogonal (C^T C == 1) set spanning the same space (notice,...
subroutine, public make_basis_lowdin(vmatrix, ncol, matrix_s)
return a set of S orthonormal vectors (C^T S C == 1) where a Loedwin transformation is applied to kee...
subroutine, public make_basis_cholesky(vmatrix, ncol, ortho)
return a set of S orthonormal vectors (C^T S C == 1) where the cholesky decomposed form of S is passe...
subroutine, public make_basis_sm(vmatrix, ncol, matrix_s)
returns an S-orthonormal basis v (v^T S v ==1)
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.
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
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...
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Storage of past states of the qs_env. Methods to interpolate (or actually normally extrapolate) the n...
subroutine, public wfi_create_for_kp(wf_history)
Adapts wf_history storage flags for k-point calculations. For ASPC, switches from Gamma WFN storage t...
subroutine, public wfi_purge_history(qs_env)
purges wf_history retaining only the latest snapshot
character(len=30) function, public wfi_get_method_label(method_nr)
returns a string describing the interpolation method
subroutine, public reorthogonalize_vectors(qs_env, v_matrix, n_col)
reorthogonalizes the mos
subroutine, public wfi_update(wf_history, qs_env, dt)
updates the snapshot buffer, taking a new snapshot
subroutine, public wfi_extrapolate(wf_history, qs_env, dt, extrapolation_method_nr, orthogonal_wf)
calculates the new starting state for the scf for the next wf optimization
subroutine, public wfi_create(wf_history, interpolation_method_nr, extrapolation_order, has_unit_metric)
...
interpolate the wavefunctions to speed up the convergence when doing MD
type(qs_wf_snapshot_type) function, pointer, public wfi_get_snapshot(wf_history, wf_index)
returns a snapshot, the first being the latest snapshot
subroutine, public wfi_release(wf_history)
releases a wf_history of a wavefunction (see doc/ReferenceCounting.html)
parameters that control an scf iteration
Type defining parameters related to the simulation cell.
Represent a complex full matrix.
to create arrays of pools
represent a pool of elements with the same structure
keeps the information about the structure of a full matrix
Stores the state of a copy between cp_fm_start_copy_general and cp_fm_finish_copy_general.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
container for the pools of matrixes used by qs
keeps the density in various representations, keeping track of which ones are valid.
keeps track of the previous wavefunctions and can extrapolate them for the next step of md
represent a past snapshot of the wavefunction. some elements might not be associated (to spare memory...