39 dbcsr_type_no_symmetry, dbcsr_type_symmetric
119#include "./base/base_uses.f90"
139 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'admm_methods'
150 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_mo_calc_rho_aux'
152 CHARACTER(LEN=default_string_length) :: basis_type
153 INTEGER :: handle, ispin
154 LOGICAL :: gapw, s_mstruct_changed
155 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r_aux
157 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit, &
158 matrix_s_aux_fit_vs_orb, rho_ao, &
161 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
169 CALL timeset(routinen, handle)
171 NULLIFY (ks_env, admm_env, mos, mos_aux_fit, matrix_s_aux_fit, &
172 matrix_s_aux_fit_vs_orb, matrix_s, rho, rho_aux_fit, para_env)
173 NULLIFY (rho_g_aux, rho_r_aux, rho_ao, rho_ao_aux, tot_rho_r_aux, task_list)
178 dft_control=dft_control, &
182 s_mstruct_changed=s_mstruct_changed, &
184 CALL get_admm_env(admm_env, mos_aux_fit=mos_aux_fit, matrix_s_aux_fit=matrix_s_aux_fit, &
185 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, rho_aux_fit=rho_aux_fit)
192 tot_rho_r=tot_rho_r_aux)
194 gapw = admm_env%do_gapw
197 DO ispin = 1, dft_control%nspins
198 IF (mos(ispin)%use_mo_coeff_b)
THEN
205 mos, mos_aux_fit, s_mstruct_changed)
207 DO ispin = 1, dft_control%nspins
208 IF (admm_env%block_dm)
THEN
209 CALL blockify_density_matrix(admm_env, &
210 density_matrix=rho_ao(ispin)%matrix, &
211 density_matrix_aux=rho_ao_aux(ispin)%matrix, &
213 nspins=dft_control%nspins)
218 CALL calculate_dm_mo_no_diag(admm_env, &
220 overlap_matrix=matrix_s_aux_fit(1)%matrix, &
221 density_matrix=rho_ao_aux(ispin)%matrix, &
222 overlap_matrix_large=matrix_s(1)%matrix, &
223 density_matrix_large=rho_ao(ispin)%matrix, &
229 CALL purify_dm_cauchy(admm_env, &
230 mo_set=mos_aux_fit(ispin), &
231 density_matrix=rho_ao_aux(ispin)%matrix, &
233 blocked=admm_env%block_dm)
238 basis_type =
"AUX_FIT"
239 task_list => admm_env%task_list_aux_fit
241 basis_type =
"AUX_FIT_SOFT"
242 task_list => admm_env%admm_gapw_env%task_list
246 matrix_p=rho_ao_aux(ispin)%matrix, &
247 rho=rho_r_aux(ispin), &
248 rho_gspace=rho_g_aux(ispin), &
249 total_rho=tot_rho_r_aux(ispin), &
250 soft_valid=.false., &
251 basis_type=basis_type, &
252 task_list_external=task_list)
260 rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
261 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
262 oce=admm_env%admm_gapw_env%oce, sab=admm_env%sab_aux_fit, para_env=para_env)
264 CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, &
265 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
268 IF (dft_control%nspins == 1)
THEN
269 admm_env%gsi(3) = admm_env%gsi(1)
271 admm_env%gsi(3) = (admm_env%gsi(1) + admm_env%gsi(2))/2.0_dp
274 CALL qs_rho_set(rho_aux_fit, rho_r_valid=.true., rho_g_valid=.true.)
276 CALL timestop(handle)
286 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_mo_calc_rho_aux_kp'
288 CHARACTER(LEN=default_string_length) :: basis_type
289 INTEGER :: handle, igroup, ik, ikp, img, indx, &
290 ispin, kplocal, kpmax, nao_aux_fit, &
291 nao_orb, natom, nkp, nkp_groups, nmo, &
293 INTEGER,
DIMENSION(2) :: kp_range
294 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
295 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
296 LOGICAL :: gapw, my_kpgrp, pmat_from_rs, &
298 REAL(
dp) :: maxval_mos, nelec_aux(2), nelec_orb(2), &
300 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occ_num, occ_num_aux, tot_rho_r_aux
301 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
304 TYPE(
cp_cfm_type) :: cpmatrix, cwork_aux_aux, cwork_aux_orb
307 TYPE(
cp_fm_type) :: fmdummy, work_aux_orb, work_orb_orb, &
309 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
311 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, matrix_s_aux_fit, rho_ao_aux, &
314 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: pmatrix
318 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit, mos_aux_fit_kp, mos_kp
321 POINTER :: sab_aux_fit, sab_kp
329 CALL timeset(routinen, handle)
331 NULLIFY (ks_env, admm_env, mos, mos_aux_fit, matrix_s, rho_orb, &
332 matrix_s_aux_fit, rho_aux_fit, rho_ao_orb, &
333 para_env, rho_g_aux, rho_r_aux, rho_ao_aux, tot_rho_r_aux, &
334 kpoints, sab_aux_fit, sab_kp, kp, &
335 struct_orb_orb, struct_aux_orb, struct_aux_aux)
340 dft_control=dft_control, &
344 matrix_s_kp=matrix_s, &
347 rho_aux_fit=rho_aux_fit, &
348 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
349 sab_aux_fit=sab_aux_fit)
350 gapw = admm_env%do_gapw
353 rho_ao_kp=rho_ao_aux, &
356 tot_rho_r=tot_rho_r_aux)
358 CALL qs_rho_get(rho_orb, rho_ao_kp=rho_ao_orb)
359 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
360 nkp_groups=nkp_groups, kp_dist=kp_dist, &
361 cell_to_index=cell_to_index, sab_nl=sab_kp)
365 ALLOCATE (pmatrix(2))
366 CALL dbcsr_create(pmatrix(1), template=matrix_s(1, 1)%matrix, &
367 matrix_type=dbcsr_type_symmetric)
368 CALL dbcsr_create(pmatrix(2), template=matrix_s(1, 1)%matrix, &
369 matrix_type=dbcsr_type_antisymmetric)
370 CALL dbcsr_create(pmatrix_tmp, template=matrix_s(1, 1)%matrix, &
371 matrix_type=dbcsr_type_no_symmetry)
375 nao_aux_fit = admm_env%nao_aux_fit
376 nao_orb = admm_env%nao_orb
377 nspins = dft_control%nspins
380 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
381 nrow_global=nao_orb, ncol_global=nao_orb)
385 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
386 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
388 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
389 nrow_global=nao_aux_fit, ncol_global=nao_orb)
392 IF (.NOT. use_real_wfn)
THEN
405 para_env => kpoints%blacs_env_all%para_env
406 kplocal = kp_range(2) - kp_range(1) + 1
407 kpmax = maxval(kp_dist(2, :) - kp_dist(1, :) + 1)
415 IF (use_real_wfn)
THEN
416 maxval_mos = max(maxval_mos, maxval(abs(mos_kp(ispin)%mo_coeff%local_data)))
418 maxval_mos = max(maxval_mos, maxval(abs(real(mos_kp(ispin)%cmo_coeff%local_data, kind=
dp))), &
419 maxval(abs(aimag(mos_kp(ispin)%cmo_coeff%local_data))))
423 CALL para_env%sum(maxval_mos)
425 pmat_from_rs = .false.
426 IF (maxval_mos < epsilon(0.0_dp)) pmat_from_rs = .true.
430 ALLOCATE (info(nkp*nspins, 2))
433 IF (pmat_from_rs)
THEN
436 DO igroup = 1, nkp_groups
438 ik = kp_dist(1, igroup) + ikp - 1
439 IF (ik > kp_dist(2, igroup)) cycle
440 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
444 IF (use_real_wfn)
THEN
446 CALL rskp_transform(rmatrix=pmatrix(1), rsmat=rho_ao_orb, ispin=ispin, &
447 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
453 CALL rskp_transform(rmatrix=pmatrix(1), cmatrix=pmatrix(2), rsmat=rho_ao_orb, ispin=ispin, &
454 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
463 IF (.NOT. use_real_wfn)
THEN
468 IF (.NOT. use_real_wfn)
THEN
480 DO igroup = 1, nkp_groups
482 ik = kp_dist(1, igroup) + ikp - 1
483 IF (ik > kp_dist(2, igroup)) cycle
484 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
486 IF (my_kpgrp .AND. pmat_from_rs)
THEN
488 IF (.NOT. use_real_wfn)
THEN
490 CALL cp_fm_to_cfm(work_orb_orb, work_orb_orb2, cpmatrix)
495 IF (ikp > kplocal) cycle
496 IF (use_real_wfn)
THEN
498 nmo = admm_env%nmo(ispin)
501 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
503 mos_aux_fit => mos_aux_fit_kp
505 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num)
506 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
507 occupation_numbers=occ_num_aux)
509 kp => kpoints%kp_aux_env(ikp)%kpoint_env
510 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_orb, 1.0_dp, kp%amat, &
511 mo_coeff, 0.0_dp, mo_coeff_aux_fit)
513 occ_num_aux(1:nmo) = occ_num(1:nmo)
515 IF (pmat_from_rs)
THEN
517 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, kp%amat, &
518 work_orb_orb, 0.0_dp, work_aux_orb)
519 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, work_aux_orb, &
520 kp%amat, 0.0_dp, kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin))
525 nmo = admm_env%nmo(ispin)
529 kp => kpoints%kp_aux_env(ikp)%kpoint_env
531 z_one, kp%camat, mos_kp(ispin)%cmo_coeff,
z_zero, &
532 kp%mos(ispin)%cmo_coeff)
535 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
536 CALL get_mo_set(mos_kp(ispin), occupation_numbers=occ_num)
537 CALL get_mo_set(mos_aux_fit_kp(ispin), occupation_numbers=occ_num_aux)
538 occ_num_aux(:) = occ_num(:)
540 IF (pmat_from_rs)
THEN
542 cpmatrix,
z_zero, cwork_aux_orb)
543 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb, &
544 kp%camat,
z_zero, cwork_aux_aux)
546 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin), &
547 mtargeti=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(2, ispin))
559 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit, &
560 admm_env%scf_work_aux_fit, for_aux_fit=.true., &
561 overlap_rs=matrix_s_aux_fit)
564 IF (pmat_from_rs)
THEN
565 DO indx = 1,
SIZE(info, 1)
579 IF (.NOT. use_real_wfn)
THEN
586 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
592 admm_env%n_large_basis = 0.0_dp
595 DO img = 1, dft_control%nimages
596 DO ispin = 1, dft_control%nspins
597 CALL dbcsr_dot(rho_ao_orb(ispin, img)%matrix, matrix_s(1, img)%matrix, tmp)
598 nelec_orb(ispin) = nelec_orb(ispin) + tmp
599 CALL dbcsr_dot(rho_ao_aux(ispin, img)%matrix, matrix_s_aux_fit(1, img)%matrix, tmp)
600 nelec_aux(ispin) = nelec_aux(ispin) + tmp
604 DO ispin = 1, dft_control%nspins
605 admm_env%n_large_basis(ispin) = nelec_orb(ispin)
606 admm_env%gsi(ispin) = nelec_orb(ispin)/nelec_aux(ispin)
609 IF (admm_env%charge_constrain)
THEN
610 DO img = 1, dft_control%nimages
611 DO ispin = 1, dft_control%nspins
612 CALL dbcsr_scale(rho_ao_aux(ispin, img)%matrix, admm_env%gsi(ispin))
617 IF (dft_control%nspins == 1)
THEN
618 admm_env%gsi(3) = admm_env%gsi(1)
620 admm_env%gsi(3) = (admm_env%gsi(1) + admm_env%gsi(2))/2.0_dp
624 basis_type =
"AUX_FIT"
625 task_list => admm_env%task_list_aux_fit
627 basis_type =
"AUX_FIT_SOFT"
628 task_list => admm_env%admm_gapw_env%task_list
632 rho_ao => rho_ao_aux(ispin, :)
634 matrix_p_kp=rho_ao, &
635 rho=rho_r_aux(ispin), &
636 rho_gspace=rho_g_aux(ispin), &
637 total_rho=tot_rho_r_aux(ispin), &
638 soft_valid=.false., &
639 basis_type=basis_type, &
640 task_list_external=task_list)
645 rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
646 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
647 oce=admm_env%admm_gapw_env%oce, &
648 sab=admm_env%sab_aux_fit, para_env=para_env)
650 CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, &
651 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
654 CALL qs_rho_set(rho_aux_fit, rho_r_valid=.true., rho_g_valid=.true.)
656 CALL timestop(handle)
668 LOGICAL,
INTENT(IN) :: calculate_forces
670 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_update_ks_atom'
672 INTEGER :: handle, img, ispin
673 REAL(
dp) :: force_fac(2)
675 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, &
676 matrix_ks_aux_fit_dft, &
677 matrix_ks_aux_fit_hfx, rho_ao_aux
681 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, rho_ao_aux, rho_aux_fit)
682 NULLIFY (admm_env, dft_control)
684 CALL timeset(routinen, handle)
686 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
687 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
688 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
689 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
690 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
694 IF (admm_env%do_admms)
THEN
695 DO ispin = 1, dft_control%nspins
696 force_fac(ispin) = admm_env%gsi(ispin)**(2.0_dp/3.0_dp)
698 ELSE IF (admm_env%do_admmp)
THEN
699 DO ispin = 1, dft_control%nspins
700 force_fac(ispin) = admm_env%gsi(ispin)**2
704 CALL update_ks_atom(qs_env, matrix_ks_aux_fit, rho_ao_aux, calculate_forces, tddft=.false., &
705 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
706 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
707 oce_external=admm_env%admm_gapw_env%oce, &
708 sab_external=admm_env%sab_aux_fit, fscale=force_fac)
711 DO img = 1, dft_control%nimages
712 DO ispin = 1, dft_control%nspins
713 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit(ispin, img)%matrix, &
715 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix, &
720 CALL timestop(handle)
731 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_ks_matrix'
737 CALL timeset(routinen, handle)
740 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
742 SELECT CASE (admm_env%purification_method)
744 CALL merge_ks_matrix_cauchy(qs_env)
747 CALL merge_ks_matrix_cauchy_subspace(qs_env)
750 IF (dft_control%nimages > 1)
THEN
751 CALL merge_ks_matrix_none_kp(qs_env)
753 CALL merge_ks_matrix_none(qs_env)
759 cpabort(
"admm_mo_merge_ks_matrix: unknown purification method")
762 CALL timestop(handle)
778 mo_derivs_aux_fit, matrix_ks_aux_fit)
779 INTEGER,
INTENT(IN) :: ispin
782 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
783 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
784 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
786 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_derivs'
790 CALL timeset(routinen, handle)
792 SELECT CASE (admm_env%purification_method)
794 CALL merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, &
795 mo_derivs, mo_derivs_aux_fit, matrix_ks_aux_fit)
798 CALL merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
803 cpabort(
"admm_mo_merge_derivs: unknown purification method")
806 CALL timestop(handle)
820 mos, mos_aux_fit, geometry_did_change)
823 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
824 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
825 LOGICAL,
INTENT(IN) :: geometry_did_change
827 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_fit_mo_coeffs'
831 CALL timeset(routinen, handle)
833 IF (geometry_did_change)
THEN
834 CALL fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
837 SELECT CASE (admm_env%purification_method)
839 CALL purify_mo_cholesky(admm_env, mos, mos_aux_fit)
842 CALL purify_mo_diag(admm_env, mos, mos_aux_fit)
845 CALL purify_mo_none(admm_env, mos, mos_aux_fit)
848 CALL timestop(handle)
858 SUBROUTINE fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
860 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
862 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fit_mo_coeffs'
864 INTEGER :: handle, iatom, jatom, nao_aux_fit, &
866 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
870 CALL timeset(routinen, handle)
872 nao_aux_fit = admm_env%nao_aux_fit
873 nao_orb = admm_env%nao_orb
877 IF (.NOT. admm_env%block_fit)
THEN
880 NULLIFY (matrix_s_tilde)
881 ALLOCATE (matrix_s_tilde)
882 CALL dbcsr_create(matrix_s_tilde, template=matrix_s_aux_fit(1)%matrix, &
883 name=
'MATRIX s_tilde', &
884 matrix_type=dbcsr_type_symmetric)
886 CALL dbcsr_copy(matrix_s_tilde, matrix_s_aux_fit(1)%matrix)
891 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
892 sparse_block = 0.0_dp
912 IF (admm_env%block_fit)
THEN
915 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
916 1.0_dp, admm_env%S_inv, admm_env%Q, 0.0_dp, &
921 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
922 1.0_dp, admm_env%Q, admm_env%A, 0.0_dp, &
926 CALL timestop(handle)
928 END SUBROUTINE fit_mo_coeffs
941 SUBROUTINE purify_mo_cholesky(admm_env, mos, mos_aux_fit)
944 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
946 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_cholesky'
948 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
950 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
952 CALL timeset(routinen, handle)
954 nao_aux_fit = admm_env%nao_aux_fit
955 nao_orb = admm_env%nao_orb
960 nmo = admm_env%nmo(ispin)
963 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
964 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
966 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
967 admm_env%work_orb_nmo(ispin))
969 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
970 admm_env%lambda(ispin))
971 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
977 CALL cp_fm_to_fm(admm_env%work_nmo_nmo1(ispin), admm_env%lambda_inv(ispin))
981 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
982 admm_env%C_hat(ispin))
983 CALL cp_fm_to_fm(admm_env%C_hat(ispin), mo_coeff_aux_fit)
987 CALL timestop(handle)
989 END SUBROUTINE purify_mo_cholesky
1002 SUBROUTINE purify_mo_diag(admm_env, mos, mos_aux_fit)
1005 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1007 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_diag'
1009 INTEGER :: handle, i, ispin, nao_aux_fit, nao_orb, &
1011 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_work
1012 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1014 CALL timeset(routinen, handle)
1016 nao_aux_fit = admm_env%nao_aux_fit
1017 nao_orb = admm_env%nao_orb
1021 DO ispin = 1, nspins
1022 nmo = admm_env%nmo(ispin)
1025 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
1026 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1028 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1029 admm_env%work_orb_nmo(ispin))
1031 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1032 admm_env%lambda(ispin))
1033 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1035 CALL cp_fm_syevd(admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), &
1036 admm_env%eigvals_lambda(ispin)%eigvals%data)
1037 ALLOCATE (eig_work(nmo))
1039 eig_work(i) = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1041 CALL cp_fm_to_fm(admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin))
1044 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), 0.0_dp, &
1045 admm_env%lambda_inv_sqrt(ispin))
1047 1.0_dp, mo_coeff, admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1048 admm_env%work_orb_nmo(ispin))
1050 1.0_dp, admm_env%A, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1053 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1054 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1055 DEALLOCATE (eig_work)
1058 CALL timestop(handle)
1060 END SUBROUTINE purify_mo_diag
1068 SUBROUTINE purify_mo_none(admm_env, mos, mos_aux_fit)
1070 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1072 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_none'
1074 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
1075 nmo, nmo_mos, nspins
1076 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occ_num, occ_num_aux
1077 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1079 CALL timeset(routinen, handle)
1081 nao_aux_fit = admm_env%nao_aux_fit
1082 nao_orb = admm_env%nao_orb
1085 DO ispin = 1, nspins
1086 nmo = admm_env%nmo(ispin)
1087 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num, nmo=nmo_mos)
1088 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
1089 occupation_numbers=occ_num_aux)
1092 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1094 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1096 occ_num_aux(1:nmo) = occ_num(1:nmo)
1099 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1100 CALL cp_fm_set_all(admm_env%lambda_inv_sqrt(ispin), 0.0_dp, 1.0_dp)
1103 CALL timestop(handle)
1105 END SUBROUTINE purify_mo_none
1115 SUBROUTINE purify_dm_cauchy(admm_env, mo_set, density_matrix, ispin, blocked)
1121 LOGICAL,
INTENT(IN) :: blocked
1123 CHARACTER(len=*),
PARAMETER :: routinen =
'purify_dm_cauchy'
1125 INTEGER :: handle, i, nao_aux_fit, nao_orb, nmo, &
1127 REAL(kind=
dp) :: pole
1128 TYPE(
cp_fm_type),
POINTER :: mo_coeff_aux_fit
1130 CALL timeset(routinen, handle)
1132 nao_aux_fit = admm_env%nao_aux_fit
1133 nao_orb = admm_env%nao_orb
1134 nmo = admm_env%nmo(ispin)
1136 nspins =
SIZE(admm_env%P_to_be_purified)
1138 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff_aux_fit)
1143 IF (.NOT. blocked)
THEN
1144 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1145 1.0_dp, mo_coeff_aux_fit, mo_coeff_aux_fit, 0.0_dp, &
1146 admm_env%P_to_be_purified(ispin))
1149 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1150 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1156 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1157 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1160 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1162 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1167 DO i = 1, nao_aux_fit
1168 pole = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1177 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1178 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1179 admm_env%work_aux_aux)
1181 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1182 1.0_dp, admm_env%work_aux_aux, admm_env%M_purify(ispin), 0.0_dp, &
1183 admm_env%work_aux_aux2)
1185 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1186 1.0_dp, admm_env%work_aux_aux2, admm_env%work_aux_aux, 0.0_dp, &
1187 admm_env%work_aux_aux3)
1189 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux3, density_matrix, keep_sparsity=.true.)
1191 IF (nspins == 1)
THEN
1195 CALL timestop(handle)
1197 END SUBROUTINE purify_dm_cauchy
1203 SUBROUTINE merge_ks_matrix_cauchy(qs_env)
1206 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy'
1208 INTEGER :: handle, i, iatom, ispin, j, jatom, &
1209 nao_aux_fit, nao_orb, nmo
1210 REAL(
dp) :: eig_diff, pole, tmp
1211 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1215 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1220 CALL timeset(routinen, handle)
1221 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mo_coeff)
1224 admm_env=admm_env, &
1225 dft_control=dft_control, &
1226 matrix_ks=matrix_ks, &
1228 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit)
1230 DO ispin = 1, dft_control%nspins
1231 nao_aux_fit = admm_env%nao_aux_fit
1232 nao_orb = admm_env%nao_orb
1233 nmo = admm_env%nmo(ispin)
1234 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1236 IF (.NOT. admm_env%block_dm)
THEN
1239 1.0_dp, mo_coeff, mo_coeff, 0.0_dp, &
1240 admm_env%work_orb_orb)
1243 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
1244 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
1245 admm_env%work_aux_orb2)
1247 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
1248 1.0_dp, admm_env%work_aux_orb2, admm_env%A, 0.0_dp, &
1249 admm_env%P_to_be_purified(ispin))
1253 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1254 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1260 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1261 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1264 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1266 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1270 DO i = 1, nao_aux_fit
1271 DO j = i, nao_aux_fit
1272 eig_diff = (admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1273 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1275 IF (abs(eig_diff) == 0.0_dp)
THEN
1276 pole = delta(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1279 pole = 1.0_dp/(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1280 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1281 tmp = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1282 tmp = tmp - heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j) - 0.5_dp)
1294 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1295 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1296 admm_env%work_aux_aux)
1298 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1299 1.0_dp, admm_env%K(ispin), admm_env%work_aux_aux, 0.0_dp, &
1300 admm_env%work_aux_aux2)
1302 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1303 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1304 admm_env%work_aux_aux3)
1307 admm_env%work_aux_aux)
1310 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1311 1.0_dp, admm_env%R_purify(ispin), admm_env%A, 0.0_dp, &
1312 admm_env%work_aux_orb)
1315 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1316 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_orb, 0.0_dp, &
1317 admm_env%work_aux_orb2)
1319 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1320 1.0_dp, admm_env%work_aux_orb, admm_env%work_aux_orb2, 0.0_dp, &
1321 admm_env%work_orb_orb)
1323 NULLIFY (matrix_k_tilde)
1324 ALLOCATE (matrix_k_tilde)
1325 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1326 name=
'MATRIX K_tilde', &
1327 matrix_type=dbcsr_type_symmetric)
1329 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1331 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1333 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1335 IF (admm_env%block_dm)
THEN
1340 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1341 sparse_block = 0.0_dp
1347 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1353 CALL timestop(handle)
1355 END SUBROUTINE merge_ks_matrix_cauchy
1361 SUBROUTINE merge_ks_matrix_cauchy_subspace(qs_env)
1364 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy_subspace'
1366 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, nmo
1368 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1369 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1372 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
1374 CALL timeset(routinen, handle)
1375 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mos_aux_fit, &
1376 mo_coeff, mo_coeff_aux_fit)
1379 admm_env=admm_env, &
1380 dft_control=dft_control, &
1381 matrix_ks=matrix_ks, &
1383 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, mos_aux_fit=mos_aux_fit)
1385 DO ispin = 1, dft_control%nspins
1386 nao_aux_fit = admm_env%nao_aux_fit
1387 nao_orb = admm_env%nao_orb
1388 nmo = admm_env%nmo(ispin)
1389 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1390 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1393 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1400 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1401 admm_env%lambda_inv2(ispin))
1405 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1406 admm_env%C_hat(ispin))
1410 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
1411 admm_env%work_aux_nmo(ispin))
1413 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1414 1.0_dp, admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
1415 admm_env%P_tilde(ispin))
1419 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv2(ispin), 0.0_dp, &
1420 admm_env%work_aux_nmo(ispin))
1423 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1424 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%C_hat(ispin), 0.0_dp, &
1425 admm_env%work_aux_aux)
1428 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1429 1.0_dp, admm_env%S, admm_env%work_aux_aux, 0.0_dp, &
1430 admm_env%work_aux_aux2)
1436 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1437 1.0_dp, admm_env%work_aux_aux2, admm_env%K(ispin), 0.0_dp, &
1438 admm_env%work_aux_aux)
1441 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1442 1.0_dp, admm_env%P_tilde(ispin), admm_env%S, 0.0_dp, &
1443 admm_env%work_aux_aux2)
1446 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1447 -1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1448 admm_env%work_aux_aux3)
1454 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1455 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 0.0_dp, &
1456 admm_env%work_aux_orb)
1459 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1460 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 1.0_dp, &
1461 admm_env%work_aux_orb)
1464 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1465 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1466 admm_env%work_orb_orb)
1468 NULLIFY (matrix_k_tilde)
1469 ALLOCATE (matrix_k_tilde)
1470 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1471 name=
'MATRIX K_tilde', &
1472 matrix_type=dbcsr_type_symmetric)
1474 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1476 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1478 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1481 1.0_dp, admm_env%work_orb_orb, mo_coeff, 0.0_dp, &
1482 admm_env%mo_derivs_tmp(ispin))
1484 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1489 CALL timestop(handle)
1491 END SUBROUTINE merge_ks_matrix_cauchy_subspace
1511 SUBROUTINE merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, mo_derivs, &
1512 mo_derivs_aux_fit, matrix_ks_aux_fit)
1513 INTEGER,
INTENT(IN) :: ispin
1516 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
1517 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
1518 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
1520 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_diag'
1522 INTEGER :: handle, i, j, nao_aux_fit, nao_orb, nmo
1523 REAL(
dp) :: eig_diff, pole, tmp32, tmp52, tmp72, &
1525 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
1527 CALL timeset(routinen, handle)
1529 nao_aux_fit = admm_env%nao_aux_fit
1530 nao_orb = admm_env%nao_orb
1531 nmo = admm_env%nmo(ispin)
1536 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
1537 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
1540 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
1541 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
1542 scaling_factor = 2.0_dp*occupation_numbers
1546 CALL cp_fm_to_fm(admm_env%H(ispin), mo_derivs_aux_fit(ispin))
1550 1.0_dp, admm_env%H(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1551 admm_env%work_aux_nmo(ispin))
1553 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1554 admm_env%mo_derivs_tmp(ispin))
1560 eig_diff = (admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1561 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1563 IF (abs(eig_diff) < 0.0001_dp)
THEN
1564 tmp32 = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))**3
1565 tmp52 = tmp32/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1566 tmp72 = tmp52/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1567 tmp92 = tmp72/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1569 pole = -0.5_dp*tmp32 + 3.0_dp/8.0_dp*tmp52 - 5.0_dp/16.0_dp*tmp72 + 35.0_dp/128.0_dp*tmp92
1572 pole = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1573 pole = pole - 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1574 pole = pole/(admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1575 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1589 1.0_dp, admm_env%H(ispin), admm_env%R(ispin), 0.0_dp, &
1590 admm_env%work_aux_nmo(ispin))
1593 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1594 admm_env%work_orb_nmo(ispin))
1597 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1598 admm_env%work_nmo_nmo1(ispin))
1601 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1602 admm_env%work_nmo_nmo2(ispin))
1605 admm_env%M(ispin), admm_env%work_nmo_nmo1(ispin))
1608 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1609 admm_env%work_nmo_nmo2(ispin))
1613 1.0_dp, admm_env%work_nmo_nmo2(ispin), admm_env%R(ispin), 0.0_dp, &
1614 admm_env%R_schur_R_t(ispin))
1618 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1619 admm_env%work_orb_nmo(ispin))
1624 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1625 admm_env%mo_derivs_tmp(ispin))
1630 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1631 admm_env%mo_derivs_tmp(ispin))
1633 DO i = 1,
SIZE(scaling_factor)
1634 scaling_factor(i) = 1.0_dp/scaling_factor(i)
1641 DEALLOCATE (scaling_factor)
1643 CALL timestop(handle)
1645 END SUBROUTINE merge_mo_derivs_diag
1651 SUBROUTINE merge_ks_matrix_none(qs_env)
1654 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none'
1656 INTEGER :: handle, iatom, ispin, jatom, &
1657 nao_aux_fit, nao_orb, nmo
1658 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1659 REAL(kind=
dp) :: ener_k(2), ener_x(2), ener_x1(2), &
1660 gsi_square, trace_tmp, trace_tmp_two
1663 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
1664 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, &
1666 TYPE(
dbcsr_type),
POINTER :: matrix_k_tilde, &
1667 matrix_ks_aux_fit_admms_tmp, &
1674 CALL timeset(routinen, handle)
1675 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
1676 matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, rho_ao_aux, matrix_k_tilde, &
1677 matrix_ttst, matrix_ks_aux_fit_admms_tmp, rho, rho_aux_fit, sparse_block, para_env, energy)
1680 admm_env=admm_env, &
1681 dft_control=dft_control, &
1682 matrix_ks=matrix_ks, &
1684 matrix_s=matrix_s, &
1687 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft, &
1688 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, rho_aux_fit=rho_aux_fit, &
1689 matrix_s_aux_fit=matrix_s_aux_fit)
1695 DO ispin = 1, dft_control%nspins
1696 IF (admm_env%block_dm)
THEN
1700 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1701 sparse_block = 0.0_dp
1705 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ks_aux_fit(ispin)%matrix, 1.0_dp, 1.0_dp)
1709 nao_aux_fit = admm_env%nao_aux_fit
1710 nao_orb = admm_env%nao_orb
1711 nmo = admm_env%nmo(ispin)
1714 IF (admm_env%do_admms)
THEN
1715 NULLIFY (matrix_ks_aux_fit_admms_tmp)
1716 ALLOCATE (matrix_ks_aux_fit_admms_tmp)
1717 CALL dbcsr_create(matrix_ks_aux_fit_admms_tmp, template=matrix_ks_aux_fit(ispin)%matrix, &
1718 name=
'matrix_ks_aux_fit_admms_tmp', matrix_type=
's')
1720 CALL dbcsr_copy(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_hfx(ispin)%matrix)
1723 CALL dbcsr_add(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_dft(ispin)%matrix, &
1724 1.0_dp, -(admm_env%gsi(ispin))**(2.0_dp/3.0_dp))
1734 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1735 1.0_dp, admm_env%K(ispin), admm_env%A, 0.0_dp, &
1736 admm_env%work_aux_orb)
1738 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1739 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1740 admm_env%work_orb_orb)
1742 NULLIFY (matrix_k_tilde)
1743 ALLOCATE (matrix_k_tilde)
1744 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1745 name=
'MATRIX K_tilde', matrix_type=
'S')
1746 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1748 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1752 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1753 CALL dbcsr_scale(matrix_k_tilde, admm_env%gsi(ispin))
1757 IF (admm_env%do_admmp)
THEN
1758 gsi_square = (admm_env%gsi(ispin))*(admm_env%gsi(ispin))
1762 admm_env%lambda_merlot(ispin) = 0
1765 IF (admm_env%do_admmq)
THEN
1766 CALL dbcsr_dot(matrix_ks_aux_fit(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1770 admm_env%lambda_merlot(ispin) = trace_tmp/(admm_env%n_large_basis(ispin))
1772 ELSE IF (admm_env%do_admmp)
THEN
1773 IF (dft_control%nspins == 2)
THEN
1774 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1775 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1777 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1778 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
1779 (admm_env%n_large_basis(ispin))
1782 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1783 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
1784 /(admm_env%n_large_basis(ispin))
1787 ELSE IF (admm_env%do_admms)
THEN
1788 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1789 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp_two)
1791 IF (dft_control%nspins == 2)
THEN
1792 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1793 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1795 admm_env%lambda_merlot(ispin) = &
1796 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1797 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1798 trace_tmp_two)/(admm_env%n_large_basis(ispin))
1801 admm_env%lambda_merlot(ispin) = (trace_tmp + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)* &
1802 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
1803 trace_tmp_two))/(admm_env%n_large_basis(ispin))
1810 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1817 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1818 1.0_dp, admm_env%work_aux_aux4, admm_env%A, 0.0_dp, &
1819 admm_env%work_aux_orb3)
1821 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1822 1.0_dp, admm_env%A, admm_env%work_aux_orb3, 0.0_dp, &
1823 admm_env%work_orb_orb3)
1825 NULLIFY (matrix_ttst)
1826 ALLOCATE (matrix_ttst)
1827 CALL dbcsr_create(matrix_ttst, template=matrix_ks(ispin)%matrix, &
1828 name=
'MATRIX TtsT', matrix_type=
'S')
1829 CALL dbcsr_copy(matrix_ttst, matrix_ks(ispin)%matrix)
1831 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb3, matrix_ttst, keep_sparsity=.true.)
1835 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ttst, 1.0_dp, &
1836 (-admm_env%lambda_merlot(ispin))*admm_env%gsi(ispin))
1838 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_s(1)%matrix, 1.0_dp, admm_env%lambda_merlot(ispin))
1844 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1852 IF (admm_env%do_admmp)
THEN
1856 IF (dft_control%nspins == 2)
THEN
1857 energy%exc_aux_fit = 0.0_dp
1858 energy%exc1_aux_fit = 0.0_dp
1860 DO ispin = 1, dft_control%nspins
1861 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
1862 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
1863 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
1866 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
1867 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
1868 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
1871 ELSE IF (admm_env%do_admms)
THEN
1872 IF (dft_control%nspins == 2)
THEN
1873 energy%exc_aux_fit = 0.0_dp
1874 energy%exc1_aux_fit = 0.0_dp
1875 DO ispin = 1, dft_control%nspins
1876 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
1877 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
1880 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
1881 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
1885 CALL timestop(handle)
1887 END SUBROUTINE merge_ks_matrix_none
1893 SUBROUTINE merge_ks_matrix_none_kp(qs_env)
1896 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none_kp'
1898 COMPLEX(dp) ::
fac, fac2
1899 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
1900 ispin, kplocal, kpmax, nao_aux_fit, &
1901 nao_orb, natom, nkp, nkp_groups, nspins
1902 INTEGER,
DIMENSION(2) :: kp_range
1903 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
1904 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1905 LOGICAL :: my_kpgrp, use_real_wfn
1906 REAL(
dp) :: ener_k(2), ener_x(2), ener_x1(2), tmp, &
1907 trace_tmp, trace_tmp_two
1908 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1911 TYPE(
cp_cfm_type) :: ck, cwork_aux_orb, cwork_orb_orb
1914 TYPE(
cp_fm_type) :: fmdummy, work_aux_aux, work_aux_aux2, &
1916 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
1917 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_ks
1918 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_k_tilde, matrix_ks_aux_fit, &
1919 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_kp, matrix_s, matrix_s_aux_fit, &
1922 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: ksmatrix
1928 POINTER :: sab_aux_fit, sab_kp
1933 CALL timeset(routinen, handle)
1934 NULLIFY (admm_env, rho_ao_aux, rho_aux_fit, &
1935 matrix_s_aux_fit, energy, &
1936 para_env, kpoints, sab_aux_fit, &
1937 matrix_k_tilde, matrix_ks_kp, matrix_ks_aux_fit, scf_env, &
1938 struct_orb_orb, struct_aux_orb, struct_aux_aux, kp, &
1939 matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft)
1942 admm_env=admm_env, &
1943 dft_control=dft_control, &
1944 matrix_ks_kp=matrix_ks_kp, &
1945 matrix_s_kp=matrix_s, &
1946 para_env=para_env, &
1953 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
1954 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx, &
1955 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
1956 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
1957 sab_aux_fit=sab_aux_fit, &
1958 rho_aux_fit=rho_aux_fit)
1959 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
1961 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
1962 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_kp, &
1963 cell_to_index=cell_to_index)
1965 nao_aux_fit = admm_env%nao_aux_fit
1966 nao_orb = admm_env%nao_orb
1967 nspins = dft_control%nspins
1972 IF (admm_env%do_admmq)
THEN
1973 admm_env%lambda_merlot = 0.0_dp
1974 DO img = 1, dft_control%nimages
1975 DO ispin = 1, nspins
1976 CALL dbcsr_dot(matrix_ks_aux_fit(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, trace_tmp)
1977 admm_env%lambda_merlot(ispin) = admm_env%lambda_merlot(ispin) + trace_tmp/admm_env%n_large_basis(ispin)
1983 IF (admm_env%do_admmp)
THEN
1984 IF (nspins == 1)
THEN
1985 admm_env%lambda_merlot(1) = 2.0_dp*(admm_env%gsi(1))**2* &
1986 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
1987 /(admm_env%n_large_basis(1))
1989 DO ispin = 1, nspins
1990 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
1991 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
1992 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
1993 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1994 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
1995 (admm_env%n_large_basis(ispin))
2001 IF (admm_env%do_admms)
THEN
2002 IF (nspins == 1)
THEN
2004 trace_tmp_two = 0.0_dp
2005 DO img = 1, dft_control%nimages
2006 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2007 trace_tmp = trace_tmp + tmp
2008 CALL dbcsr_dot(matrix_ks_aux_fit_dft(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2009 trace_tmp_two = trace_tmp_two + tmp
2011 admm_env%lambda_merlot(1) = (trace_tmp + (admm_env%gsi(1))**(2.0_dp/3.0_dp)* &
2012 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
2013 trace_tmp_two))/(admm_env%n_large_basis(1))
2016 DO ispin = 1, nspins
2018 trace_tmp_two = 0.0_dp
2019 DO img = 1, dft_control%nimages
2020 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2021 trace_tmp = trace_tmp + tmp
2022 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2023 trace_tmp_two = trace_tmp_two + tmp
2026 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
2027 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
2028 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
2030 admm_env%lambda_merlot(ispin) = &
2031 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2032 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2033 trace_tmp_two)/(admm_env%n_large_basis(ispin))
2038 NULLIFY (matrix_ks_aux_fit)
2039 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2040 DO img = 1, dft_control%nimages
2041 DO ispin = 1, nspins
2042 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2043 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2044 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2045 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2046 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2047 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2053 ALLOCATE (ksmatrix(2))
2054 CALL dbcsr_create(ksmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2055 matrix_type=dbcsr_type_symmetric)
2056 CALL dbcsr_create(ksmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2057 matrix_type=dbcsr_type_antisymmetric)
2058 CALL dbcsr_create(tmpmatrix_ks, template=matrix_ks_aux_fit(1, 1)%matrix, &
2059 matrix_type=dbcsr_type_symmetric)
2063 kplocal = kp_range(2) - kp_range(1) + 1
2064 kpmax = maxval(kp_dist(2, :) - kp_dist(1, :) + 1)
2065 para_env => kpoints%blacs_env_all%para_env
2067 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2068 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2072 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2073 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2076 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2077 nrow_global=nao_orb, ncol_global=nao_orb)
2080 IF (.NOT. use_real_wfn)
THEN
2089 ALLOCATE (fm_ks(kplocal, 2, nspins))
2090 DO ispin = 1, nspins
2093 CALL cp_fm_create(fm_ks(ikp, i, ispin), struct_orb_orb)
2102 ALLOCATE (info(nkp*nspins, 2))
2105 DO ispin = 1, nspins
2106 DO igroup = 1, nkp_groups
2108 ik = kp_dist(1, igroup) + ikp - 1
2109 IF (ik > kp_dist(2, igroup)) cycle
2110 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2113 IF (use_real_wfn)
THEN
2115 CALL rskp_transform(rmatrix=ksmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2116 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2122 CALL rskp_transform(rmatrix=ksmatrix(1), cmatrix=ksmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2123 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2132 IF (.NOT. use_real_wfn)
THEN
2134 para_env, info(indx, 2))
2138 IF (.NOT. use_real_wfn)
THEN
2148 DO ispin = 1, nspins
2149 DO igroup = 1, nkp_groups
2151 ik = kp_dist(1, igroup) + ikp - 1
2152 IF (ik > kp_dist(2, igroup)) cycle
2153 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2157 IF (.NOT. use_real_wfn)
THEN
2164 IF (ikp > kplocal) cycle
2165 kp => kpoints%kp_aux_env(ikp)%kpoint_env
2166 IF (use_real_wfn)
THEN
2169 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2170 1.0_dp, work_aux_aux, kp%amat, 0.0_dp, &
2173 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
2174 1.0_dp, kp%amat, work_aux_orb, 0.0_dp, &
2175 fm_ks(ikp, 1, ispin))
2178 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
2180 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2185 IF (admm_env%do_admmp)
THEN
2187 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2188 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
2192 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2195 CALL parallel_gemm(
'C',
'N', nao_orb, nao_orb, nao_aux_fit, &
2196 z_one, kp%camat, cwork_aux_orb,
z_zero, cwork_orb_orb)
2198 CALL cp_cfm_to_fm(cwork_orb_orb, mtargetr=fm_ks(ikp, 1, ispin), mtargeti=fm_ks(ikp, 2, ispin))
2203 DO indx = 1,
SIZE(info, 1)
2216 IF (.NOT. use_real_wfn)
THEN
2222 NULLIFY (matrix_k_tilde)
2226 DO ispin = 1, nspins
2227 DO img = 1, dft_control%nimages
2228 ALLOCATE (matrix_k_tilde(ispin, img)%matrix)
2229 CALL dbcsr_create(matrix=matrix_k_tilde(ispin, img)%matrix, template=matrix_ks_kp(1, 1)%matrix, &
2231 matrix_type=dbcsr_type_symmetric)
2233 CALL dbcsr_set(matrix_k_tilde(ispin, img)%matrix, 0.0_dp)
2237 CALL cp_fm_get_info(admm_env%work_orb_orb, matrix_struct=struct_orb_orb)
2238 ALLOCATE (fmwork(2))
2244 matrix_k_tilde(1, 1)%matrix, sab_kp, &
2245 fmwork, for_aux_fit=.false., pmat_ext=fm_ks, overlap_rs=matrix_s)
2249 DO ispin = 1, nspins
2257 DO ispin = 1, nspins
2258 DO img = 1, dft_control%nimages
2259 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_k_tilde(ispin, img)%matrix, 1.0_dp, 1.0_dp)
2260 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
2262 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_s(1, img)%matrix, &
2263 1.0_dp, admm_env%lambda_merlot(ispin))
2269 IF (admm_env%do_admmp)
THEN
2270 IF (nspins == 1)
THEN
2271 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
2272 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
2273 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
2275 energy%exc_aux_fit = 0.0_dp
2276 energy%exc1_aux_fit = 0.0_dp
2278 DO ispin = 1, dft_control%nspins
2279 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
2280 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
2281 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
2287 IF (admm_env%do_admms)
THEN
2288 IF (nspins == 1)
THEN
2289 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
2290 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
2292 energy%exc_aux_fit = 0.0_dp
2293 energy%exc1_aux_fit = 0.0_dp
2294 DO ispin = 1, nspins
2295 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
2296 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
2305 CALL timestop(handle)
2307 END SUBROUTINE merge_ks_matrix_none_kp
2318 SUBROUTINE calc_spin_dep_aux_exch_ener(qs_env, admm_env, ener_k_ispin, ener_x_ispin, &
2319 ener_x1_ispin, ispin)
2322 REAL(
dp),
INTENT(INOUT) :: ener_k_ispin, ener_x_ispin, ener_x1_ispin
2323 INTEGER,
INTENT(IN) :: ispin
2325 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_spin_dep_aux_exch_ener'
2327 CHARACTER(LEN=default_string_length) :: basis_type
2328 INTEGER :: handle, img, myspin, nimg
2331 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
2335 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit_hfx, rho_ao_aux, &
2341 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, v_rspace_dummy, v_tau_rspace_dummy
2343 TYPE(
qs_rho_type),
POINTER :: rho_aux_fit, rho_aux_fit_buffer
2347 CALL timeset(routinen, handle)
2349 NULLIFY (ks_env, rho_aux_fit, rho_aux_fit_buffer, rho_ao, &
2350 xc_section_aux, v_rspace_dummy, v_tau_rspace_dummy, &
2351 rho_ao_aux, rho_ao_aux_buffer, dft_control, &
2352 matrix_ks_aux_fit_hfx, task_list, local_rho_buffer, admm_gapw_env)
2354 NULLIFY (rho_g, rho_r, tot_rho_r)
2356 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
2357 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, rho_aux_fit_buffer=rho_aux_fit_buffer, &
2358 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2361 rho_ao_kp=rho_ao_aux)
2364 rho_ao_kp=rho_ao_aux_buffer, &
2367 tot_rho_r=tot_rho_r)
2369 gapw = admm_env%do_gapw
2370 nimg = dft_control%nimages
2374 CALL dbcsr_set(rho_ao_aux_buffer(1, img)%matrix, 0.0_dp)
2375 CALL dbcsr_set(rho_ao_aux_buffer(2, img)%matrix, 0.0_dp)
2376 CALL dbcsr_add(rho_ao_aux_buffer(ispin, img)%matrix, &
2377 rho_ao_aux(ispin, img)%matrix, 0.0_dp, 1.0_dp)
2381 basis_type =
"AUX_FIT"
2382 task_list => admm_env%task_list_aux_fit
2384 basis_type =
"AUX_FIT_SOFT"
2385 task_list => admm_env%admm_gapw_env%task_list
2389 DO myspin = 1, dft_control%nspins
2391 rho_ao => rho_ao_aux_buffer(myspin, :)
2393 matrix_p_kp=rho_ao, &
2394 rho=rho_r(myspin), &
2395 rho_gspace=rho_g(myspin), &
2396 total_rho=tot_rho_r(myspin), &
2397 soft_valid=.false., &
2398 basis_type=
"AUX_FIT", &
2399 task_list_external=task_list)
2404 CALL qs_rho_set(rho_aux_fit_buffer, rho_r_valid=.true., rho_g_valid=.true.)
2406 xc_section_aux => admm_env%xc_section_aux
2408 ener_x_ispin = 0.0_dp
2410 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_aux_fit_buffer, xc_section=xc_section_aux, &
2411 vxc_rho=v_rspace_dummy, vxc_tau=v_tau_rspace_dummy, exc=ener_x_ispin, &
2415 ener_x1_ispin = 0.0_dp
2418 admm_gapw_env => admm_env%admm_gapw_env
2420 atomic_kind_set=atomic_kind_set, &
2425 admm_gapw_env%admm_kind_set, dft_control, para_env)
2428 rho_atom_set=local_rho_buffer%rho_atom_set, &
2429 qs_kind_set=admm_gapw_env%admm_kind_set, &
2430 oce=admm_gapw_env%oce, sab=admm_env%sab_aux_fit, &
2433 CALL prepare_gapw_den(qs_env, local_rho_set=local_rho_buffer, do_rho0=.false., &
2434 kind_set_external=admm_gapw_env%admm_kind_set)
2437 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2438 xc_section_external=xc_section_aux, &
2439 rho_atom_set_external=local_rho_buffer%rho_atom_set)
2444 ener_k_ispin = 0.0_dp
2448 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux_buffer(ispin, img)%matrix, tmp)
2449 ener_k_ispin = ener_k_ispin + tmp
2454 ener_k_ispin = ener_k_ispin/2.0_dp
2456 CALL timestop(handle)
2458 END SUBROUTINE calc_spin_dep_aux_exch_ener
2469 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_orb
2470 LOGICAL,
INTENT(IN) :: scale_back
2472 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scale_dm'
2474 INTEGER :: handle, img, ispin
2478 CALL timeset(routinen, handle)
2480 NULLIFY (admm_env, dft_control)
2483 admm_env=admm_env, &
2484 dft_control=dft_control)
2487 IF (admm_env%do_admmp)
THEN
2488 DO ispin = 1, dft_control%nspins
2489 DO img = 1, dft_control%nimages
2490 IF (scale_back)
THEN
2491 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, 1.0_dp/admm_env%gsi(ispin))
2493 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, admm_env%gsi(ispin))
2499 CALL timestop(handle)
2510 SUBROUTINE calc_aux_mo_derivs_none(ispin, admm_env, mo_set, mo_coeff_aux_fit)
2511 INTEGER,
INTENT(IN) :: ispin
2514 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff_aux_fit
2516 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_aux_mo_derivs_none'
2518 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2519 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2520 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit, &
2521 matrix_ks_aux_fit_dft, &
2522 matrix_ks_aux_fit_hfx
2525 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx)
2527 CALL timeset(routinen, handle)
2529 nao_aux_fit = admm_env%nao_aux_fit
2530 nao_orb = admm_env%nao_orb
2531 nmo = admm_env%nmo(ispin)
2533 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, &
2534 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, &
2535 matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft)
2543 IF (admm_env%do_admms)
THEN
2545 CALL dbcsr_create(dbcsr_work, template=matrix_ks_aux_fit(ispin)%matrix)
2546 CALL dbcsr_copy(dbcsr_work, matrix_ks_aux_fit_hfx(ispin)%matrix)
2547 CALL dbcsr_add(dbcsr_work, matrix_ks_aux_fit_dft(ispin)%matrix, 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2555 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2556 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
2559 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2560 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2562 scaling_factor = 2.0_dp*occupation_numbers
2566 DEALLOCATE (scaling_factor)
2568 CALL timestop(handle)
2570 END SUBROUTINE calc_aux_mo_derivs_none
2580 SUBROUTINE merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
2581 INTEGER,
INTENT(IN) :: ispin
2584 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs
2585 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2587 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_no_diag'
2589 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2590 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2592 CALL timeset(routinen, handle)
2594 nao_aux_fit = admm_env%nao_aux_fit
2595 nao_orb = admm_env%nao_orb
2596 nmo = admm_env%nmo(ispin)
2601 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2602 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2603 scaling_factor = 0.5_dp
2607 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
2608 admm_env%work_aux_nmo(ispin))
2609 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2610 1.0_dp, admm_env%K(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
2611 admm_env%work_aux_nmo2(ispin))
2613 2.0_dp, admm_env%A, admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2614 admm_env%mo_derivs_tmp(ispin))
2617 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2618 admm_env%work_orb_orb)
2620 1.0_dp, admm_env%C_hat(ispin), admm_env%work_orb_orb, 0.0_dp, &
2621 admm_env%work_aux_orb)
2622 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2623 1.0_dp, admm_env%S, admm_env%work_aux_orb, 0.0_dp, &
2624 admm_env%work_aux_nmo(ispin))
2626 -2.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 1.0_dp, &
2627 admm_env%mo_derivs_tmp(ispin))
2633 DEALLOCATE (scaling_factor)
2635 CALL timestop(handle)
2637 END SUBROUTINE merge_mo_derivs_no_diag
2649 INTEGER :: ispin, nspins
2651 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_derivs_fm
2652 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mo_derivs_aux_fit
2653 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2654 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2655 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array, mos_aux_fit
2657 NULLIFY (mo_array, mos_aux_fit, matrix_ks_aux_fit, mo_coeff_aux_fit, &
2658 mo_derivs_aux_fit, mo_coeff)
2660 CALL get_qs_env(qs_env, admm_env=admm_env, mos=mo_array)
2661 CALL get_admm_env(admm_env, mos_aux_fit=mos_aux_fit, mo_derivs_aux_fit=mo_derivs_aux_fit, &
2662 matrix_ks_aux_fit=matrix_ks_aux_fit)
2664 nspins =
SIZE(mo_derivs)
2665 ALLOCATE (mo_derivs_fm(nspins))
2666 DO ispin = 1, nspins
2667 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2668 CALL cp_fm_create(mo_derivs_fm(ispin), mo_coeff%matrix_struct)
2671 DO ispin = 1, nspins
2672 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2673 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2677 mo_derivs_fm, mo_derivs_aux_fit, matrix_ks_aux_fit)
2694 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2695 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
2697 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
2700 CALL get_qs_env(qs_env, dft_control=dft_control)
2702 IF (dft_control%do_admm_dm)
THEN
2703 cpabort(
"Forces with ADMM DM methods not implemented")
2705 IF (dft_control%do_admm_mo .AND. .NOT. qs_env%run_rtp)
THEN
2706 NULLIFY (matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, mos_aux_fit, mos, admm_env)
2710 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, mos_aux_fit=mos_aux_fit, &
2711 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
2712 DO ispin = 1, dft_control%nspins
2713 mo_set => mos(ispin)
2714 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff)
2717 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2718 CALL calc_aux_mo_derivs_none(ispin, qs_env%admm_env, mo_set, mo_coeff_aux_fit)
2733 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_admm_ovlp_forces_kp'
2735 COMPLEX(dp) ::
fac, fac2
2736 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
2737 ispin, kplocal, kpmax, nao_aux_fit, &
2738 nao_orb, natom, nimg, nkp, nkp_groups, &
2740 INTEGER,
DIMENSION(2) :: kp_range
2741 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
2742 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2743 LOGICAL :: gapw, my_kpgrp, use_real_wfn
2744 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
2745 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
2749 TYPE(
cp_cfm_type) :: ckmatrix, cpmatrix, cs_inv, &
2750 cwork_aux_aux, cwork_aux_orb, &
2754 TYPE(
cp_fm_type) :: fmdummy, s_inv, work_aux_aux, &
2755 work_aux_aux2, work_aux_aux3, &
2757 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_skap, fm_skapa
2758 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fmwork
2759 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
2760 matrix_ks_aux_fit_hfx, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_skap, &
2761 matrix_skapa, rho_ao_orb
2763 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: kmatrix
2769 POINTER :: sab_aux_fit, sab_aux_fit_asymm, &
2770 sab_aux_fit_vs_orb, sab_kp
2775 CALL timeset(routinen, handle)
2783 NULLIFY (ks_env, admm_env, matrix_ks_aux_fit, &
2784 matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, rho, force, &
2785 para_env, atomic_kind_set, kpoints, sab_aux_fit, &
2786 sab_aux_fit_vs_orb, sab_aux_fit_asymm, struct_orb_orb, &
2787 struct_aux_orb, struct_aux_aux)
2791 admm_env=admm_env, &
2792 dft_control=dft_control, &
2795 atomic_kind_set=atomic_kind_set, &
2798 nimg = dft_control%nimages
2800 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
2801 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
2802 sab_aux_fit=sab_aux_fit, &
2803 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb, &
2804 sab_aux_fit_asymm=sab_aux_fit_asymm, &
2805 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
2806 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
2807 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2809 gapw = admm_env%do_gapw
2810 nao_aux_fit = admm_env%nao_aux_fit
2811 nao_orb = admm_env%nao_orb
2812 nspins = dft_control%nspins
2814 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
2815 nkp_groups=nkp_groups, kp_dist=kp_dist, &
2816 cell_to_index=cell_to_index, sab_nl=sab_kp)
2819 IF (admm_env%do_admms)
THEN
2821 NULLIFY (matrix_ks_aux_fit)
2822 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2823 DO img = 1, dft_control%nimages
2824 DO ispin = 1, nspins
2825 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2826 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2827 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2828 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2829 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2830 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2837 ALLOCATE (kmatrix(2))
2838 CALL dbcsr_create(kmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2839 matrix_type=dbcsr_type_symmetric)
2840 CALL dbcsr_create(kmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2841 matrix_type=dbcsr_type_antisymmetric)
2842 CALL dbcsr_create(kmatrix_tmp, template=matrix_ks_aux_fit(1, 1)%matrix, &
2843 matrix_type=dbcsr_type_no_symmetry)
2847 kplocal = kp_range(2) - kp_range(1) + 1
2848 kpmax = maxval(kp_dist(2, :) - kp_dist(1, :) + 1)
2849 para_env => kpoints%blacs_env_all%para_env
2850 ALLOCATE (info(nkp*nspins, 2))
2852 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2853 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2859 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2860 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2863 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2864 nrow_global=nao_orb, ncol_global=nao_orb)
2867 IF (.NOT. use_real_wfn)
THEN
2879 ALLOCATE (fm_skap(kplocal, 2, nspins), fm_skapa(kplocal, 2, nspins))
2880 DO ispin = 1, nspins
2883 CALL cp_fm_create(fm_skap(ikp, i, ispin), struct_aux_orb)
2884 CALL cp_fm_create(fm_skapa(ikp, i, ispin), struct_aux_aux)
2895 DO ispin = 1, nspins
2896 DO igroup = 1, nkp_groups
2898 ik = kp_dist(1, igroup) + ikp - 1
2899 IF (ik > kp_dist(2, igroup)) cycle
2900 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2904 IF (use_real_wfn)
THEN
2906 CALL rskp_transform(rmatrix=kmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2907 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2913 CALL rskp_transform(rmatrix=kmatrix(1), cmatrix=kmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2914 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2923 IF (.NOT. use_real_wfn)
THEN
2928 IF (.NOT. use_real_wfn)
THEN
2938 DO ispin = 1, nspins
2939 DO igroup = 1, nkp_groups
2941 ik = kp_dist(1, igroup) + ikp - 1
2942 IF (ik > kp_dist(2, igroup)) cycle
2943 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2947 IF (.NOT. use_real_wfn)
THEN
2949 CALL cp_fm_to_cfm(work_aux_aux, work_aux_aux2, ckmatrix)
2953 IF (ikp > kplocal) cycle
2954 kp => kpoints%kp_aux_env(ikp)%kpoint_env
2956 IF (use_real_wfn)
THEN
2966 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, 1.0_dp, s_inv, &
2967 work_aux_aux, 0.0_dp, work_aux_aux3)
2968 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, work_aux_aux3, &
2969 kp%amat, 0.0_dp, work_aux_orb)
2970 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, work_aux_orb, &
2971 kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), 0.0_dp, &
2972 fm_skap(ikp, 1, ispin))
2973 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, fm_skap(ikp, 1, ispin), &
2974 kp%amat, 0.0_dp, fm_skapa(ikp, 1, ispin))
2978 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
2980 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2985 IF (admm_env%do_admmp)
THEN
2987 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2988 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
2998 CALL cp_fm_to_cfm(kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), &
2999 kpoints%kp_env(ikp)%kpoint_env%pmat(2, ispin), &
3005 ckmatrix,
z_zero, cwork_aux_aux)
3006 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit,
z_one, cwork_aux_aux, &
3007 kp%camat,
z_zero, cwork_aux_orb)
3009 cpmatrix,
z_zero, cwork_aux_orb2)
3010 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb2, &
3011 kp%camat,
z_zero, cwork_aux_aux)
3013 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3018 fac = cmplx(0.5_dp*admm_env%lambda_merlot(ispin)*admm_env%gsi(ispin), 0.0_dp,
dp)
3019 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb,
z_one, kp%camat, cpmatrix, &
3021 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
fac, cwork_aux_orb, &
3022 kp%camat,
z_one, cwork_aux_aux)
3025 CALL cp_cfm_to_fm(cwork_aux_orb2, mtargetr=fm_skap(ikp, 1, ispin), mtargeti=fm_skap(ikp, 2, ispin))
3026 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=fm_skapa(ikp, 1, ispin), mtargeti=fm_skapa(ikp, 2, ispin))
3033 DO indx = 1,
SIZE(info, 1)
3048 IF (.NOT. use_real_wfn)
THEN
3058 ALLOCATE (matrix_skap(nspins, nimg), matrix_skapa(nspins, nimg))
3060 DO ispin = 1, nspins
3061 ALLOCATE (matrix_skap(ispin, img)%matrix)
3062 CALL dbcsr_create(matrix_skap(ispin, img)%matrix, template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3063 matrix_type=dbcsr_type_no_symmetry)
3066 ALLOCATE (matrix_skapa(ispin, img)%matrix)
3067 CALL dbcsr_create(matrix_skapa(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix, &
3068 matrix_type=dbcsr_type_no_symmetry)
3073 ALLOCATE (fmwork(2))
3074 CALL cp_fm_get_info(admm_env%work_aux_orb, matrix_struct=struct_aux_orb)
3078 matrix_s_aux_fit_vs_orb(1, 1)%matrix, sab_aux_fit_vs_orb, &
3079 fmwork, for_aux_fit=.true., pmat_ext=fm_skap, &
3080 overlap_rs=matrix_s_aux_fit, mixed_aux_orb=.true.)
3084 CALL cp_fm_get_info(admm_env%work_aux_aux, matrix_struct=struct_aux_aux)
3088 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit_asymm, &
3089 fmwork, for_aux_fit=.true., pmat_ext=fm_skapa, overlap_rs=matrix_s_aux_fit)
3095 DO ispin = 1, nspins
3096 CALL dbcsr_scale(matrix_skap(ispin, img)%matrix, -2.0_dp)
3097 CALL dbcsr_scale(matrix_skapa(ispin, img)%matrix, 2.0_dp)
3099 IF (nspins == 2)
THEN
3100 CALL dbcsr_add(matrix_skap(1, img)%matrix, matrix_skap(2, img)%matrix, 1.0_dp, 1.0_dp)
3101 CALL dbcsr_add(matrix_skapa(1, img)%matrix, matrix_skapa(2, img)%matrix, 1.0_dp, 1.0_dp)
3105 ALLOCATE (admm_force(3, natom))
3108 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3111 DO ispin = 1, nspins
3112 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -admm_env%lambda_merlot(ispin))
3114 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, 1.0_dp)
3118 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"ORB", basis_type_b=
"ORB", &
3119 sab_nl=sab_kp, matrixkp_p=rho_ao_orb(1, :))
3121 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, -1.0_dp)
3122 DO ispin = 1, nspins
3123 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3128 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3129 sab_nl=sab_aux_fit_vs_orb, matrixkp_p=matrix_skap(1, :))
3130 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3131 sab_nl=sab_aux_fit_asymm, matrixkp_p=matrix_skapa(1, :))
3133 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3134 DEALLOCATE (admm_force)
3136 DO ispin = 1, nspins
3147 IF (admm_env%do_admms)
THEN
3151 CALL timestop(handle)
3164 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_hz, matrix_pz
3165 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: fval
3167 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_projection_derivative'
3169 INTEGER :: handle, ispin, nao, natom, naux, nspins
3170 REAL(kind=
dp) :: my_fval
3171 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3174 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3175 TYPE(
dbcsr_type),
POINTER :: matrix_w_q, matrix_w_s
3177 POINTER :: sab_aux_fit_asymm, sab_aux_fit_vs_orb
3181 CALL timeset(routinen, handle)
3183 cpassert(
ASSOCIATED(qs_env))
3185 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
3186 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, sab_aux_fit_asymm=sab_aux_fit_asymm, &
3187 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3190 IF (
PRESENT(fval)) my_fval = fval
3192 ALLOCATE (matrix_w_q)
3193 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3196 ALLOCATE (matrix_w_s)
3197 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3198 name=
'W MATRIX AUX S', &
3199 matrix_type=dbcsr_type_no_symmetry)
3202 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3203 natom=natom, force=force)
3204 ALLOCATE (admm_force(3, natom))
3207 nspins =
SIZE(matrix_pz)
3208 nao = admm_env%nao_orb
3209 naux = admm_env%nao_aux_fit
3213 DO ispin = 1, nspins
3215 CALL parallel_gemm(
"N",
"T", naux, naux, naux, 1.0_dp, admm_env%s_inv, &
3216 admm_env%work_aux_aux, 0.0_dp, admm_env%work_aux_aux2)
3217 CALL parallel_gemm(
"N",
"N", naux, nao, naux, 1.0_dp, admm_env%work_aux_aux2, &
3218 admm_env%A, 0.0_dp, admm_env%work_aux_orb)
3221 CALL parallel_gemm(
"N",
"N", naux, nao, nao, 1.0_dp, admm_env%work_aux_orb, &
3222 admm_env%work_orb_orb, 1.0_dp, admm_env%work_aux_orb2)
3225 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb2, matrix_w_q, keep_sparsity=.true.)
3228 CALL parallel_gemm(
"N",
"T", naux, naux, nao, 1.0_dp, admm_env%work_aux_orb2, &
3229 admm_env%A, 0.0_dp, admm_env%work_aux_aux)
3230 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3236 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3237 sab_nl=sab_aux_fit_asymm, matrix_p=matrix_w_s)
3239 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3240 sab_nl=sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3243 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3245 DEALLOCATE (admm_force)
3249 CALL timestop(handle)
3284 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_mixed_overlap_force'
3286 INTEGER :: handle, ispin, iw, nao_aux_fit, nao_orb, &
3287 natom, neighbor_list_id, nmo
3288 LOGICAL :: omit_headers
3289 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3294 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit, &
3295 matrix_s_aux_fit_vs_orb, rho_ao, &
3297 TYPE(
dbcsr_type),
POINTER :: matrix_rho_aux_desymm_tmp, matrix_w_q, &
3309 CALL timeset(routinen, handle)
3311 NULLIFY (admm_env, logger, dft_control, para_env, mos, mo_coeff, matrix_w_q, matrix_w_s, &
3312 rho, rho_aux_fit, energy, sab_orb, ks_env, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_s)
3315 admm_env=admm_env, &
3317 dft_control=dft_control, &
3318 matrix_s=matrix_s, &
3319 neighbor_list_id=neighbor_list_id, &
3325 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, rho_aux_fit=rho_aux_fit, &
3326 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
3332 nao_aux_fit = admm_env%nao_aux_fit
3333 nao_orb = admm_env%nao_orb
3338 IF (admm_env%block_dm)
THEN
3339 cpabort(
"ADMM Forces not implemented for blocked projection methods!")
3344 cpabort(
"ADMM Forces only implemented without purification or for MO_DIAG.")
3349 ALLOCATE (matrix_w_s)
3350 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3351 name=
'W MATRIX AUX S', &
3352 matrix_type=dbcsr_type_no_symmetry)
3355 ALLOCATE (matrix_w_q)
3356 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3359 DO ispin = 1, dft_control%nspins
3360 nmo = admm_env%nmo(ispin)
3361 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
3365 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3366 1.0_dp, admm_env%S_inv, admm_env%mo_derivs_aux_fit(ispin), 0.0_dp, &
3367 admm_env%work_aux_nmo(ispin))
3370 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3371 1.0_dp, admm_env%S_inv, admm_env%H(ispin), 0.0_dp, &
3372 admm_env%work_aux_nmo(ispin))
3377 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
3378 admm_env%work_aux_nmo2(ispin))
3382 -1.0_dp, admm_env%work_aux_nmo2(ispin), mo_coeff, 0.0_dp, &
3383 admm_env%work_aux_orb)
3386 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3387 -1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
3388 admm_env%work_aux_aux)
3393 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3394 admm_env%work_orb_nmo(ispin))
3397 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3398 admm_env%work_orb_orb)
3400 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3401 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3402 admm_env%work_aux_orb)
3406 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3407 admm_env%work_orb_nmo(ispin))
3410 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3411 admm_env%work_orb_orb)
3413 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3414 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3415 admm_env%work_aux_orb)
3421 IF (admm_env%do_admms)
THEN
3423 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3425 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3426 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3429 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3430 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3431 admm_env%work_aux_orb)
3434 ELSE IF (admm_env%do_admmp)
THEN
3435 CALL cp_fm_scale(admm_env%gsi(ispin)**2, admm_env%work_aux_orb)
3438 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3439 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3442 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3443 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3444 admm_env%work_aux_orb)
3447 ELSE IF (admm_env%do_admmq)
THEN
3449 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3451 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3452 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3455 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3456 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3457 admm_env%work_aux_orb)
3461 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb, matrix_w_q, keep_sparsity=.true.)
3465 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3466 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
3467 admm_env%work_aux_orb)
3469 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3470 1.0_dp, admm_env%work_aux_orb, admm_env%A, 1.0_dp, &
3471 admm_env%work_aux_aux)
3475 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3478 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3481 NULLIFY (matrix_rho_aux_desymm_tmp)
3482 ALLOCATE (matrix_rho_aux_desymm_tmp)
3483 CALL dbcsr_create(matrix_rho_aux_desymm_tmp, template=matrix_s_aux_fit(1)%matrix, &
3484 name=
'Rho_aux non-symm', &
3485 matrix_type=dbcsr_type_no_symmetry)
3491 IF (admm_env%do_admms .OR. admm_env%do_admmq)
THEN
3493 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3494 -admm_env%lambda_merlot(ispin))
3497 ELSE IF (admm_env%do_admmp)
THEN
3499 CALL dbcsr_scale(matrix_w_s, admm_env%gsi(ispin)**2)
3500 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3501 (-admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin))
3511 ALLOCATE (admm_force(3, natom))
3514 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3515 sab_nl=admm_env%sab_aux_fit_asymm, matrix_p=matrix_w_s)
3517 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3518 sab_nl=admm_env%sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3521 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3522 CALL dbcsr_scale(rho_ao(ispin)%matrix, -admm_env%lambda_merlot(ispin))
3524 basis_type_a=
"ORB", basis_type_b=
"ORB", &
3525 sab_nl=sab_orb, matrix_p=rho_ao(ispin)%matrix)
3526 CALL dbcsr_scale(rho_ao(ispin)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3530 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3532 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3533 DEALLOCATE (admm_force)
3535 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
3537 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3541 para_env, output_unit=iw, omit_headers=omit_headers)
3543 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3546 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3550 para_env, output_unit=iw, omit_headers=omit_headers)
3552 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3561 CALL timestop(handle)
3575 SUBROUTINE calculate_dm_mo_no_diag(admm_env, mo_set, density_matrix, overlap_matrix, &
3576 density_matrix_large, overlap_matrix_large, ispin)
3579 TYPE(
dbcsr_type),
POINTER :: density_matrix, overlap_matrix, &
3580 density_matrix_large, &
3581 overlap_matrix_large
3584 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_dm_mo_no_diag'
3586 INTEGER :: handle, nao_aux_fit, nmo
3587 REAL(kind=
dp) :: alpha, nel_tmp_aux
3591 CALL timeset(routinen, handle)
3594 nao_aux_fit = admm_env%nao_aux_fit
3595 nmo = admm_env%nmo(ispin)
3596 CALL cp_fm_to_fm(admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin))
3597 CALL cp_fm_column_scale(admm_env%work_aux_nmo(ispin), mo_set%occupation_numbers(1:mo_set%homo))
3600 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
3601 admm_env%work_aux_nmo2(ispin))
3604 IF (.NOT. mo_set%uniform_occupation)
THEN
3607 matrix_v=admm_env%C_hat(ispin), &
3608 matrix_g=admm_env%work_aux_nmo2(ispin), &
3615 matrix_v=admm_env%C_hat(ispin), &
3616 matrix_g=admm_env%work_aux_nmo2(ispin), &
3624 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3628 admm_env%n_large_basis(3) = 0.0_dp
3632 CALL dbcsr_dot(density_matrix_large, overlap_matrix_large, admm_env%n_large_basis(ispin))
3633 admm_env%n_large_basis(3) = admm_env%n_large_basis(3) + admm_env%n_large_basis(ispin)
3635 CALL dbcsr_dot(density_matrix, overlap_matrix, nel_tmp_aux)
3636 admm_env%gsi(ispin) = admm_env%n_large_basis(ispin)/nel_tmp_aux
3638 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3640 CALL dbcsr_scale(density_matrix, admm_env%gsi(ispin))
3645 CALL timestop(handle)
3647 END SUBROUTINE calculate_dm_mo_no_diag
3657 SUBROUTINE blockify_density_matrix(admm_env, density_matrix, density_matrix_aux, &
3660 TYPE(
dbcsr_type),
POINTER :: density_matrix, density_matrix_aux
3661 INTEGER :: ispin, nspins
3663 CHARACTER(len=*),
PARAMETER :: routinen =
'blockify_density_matrix'
3665 INTEGER :: handle, iatom, jatom
3667 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block, sparse_block_aux
3670 CALL timeset(routinen, handle)
3673 CALL dbcsr_set(density_matrix_aux, 0.0_dp)
3679 IF (admm_env%block_map(iatom, jatom) == 1)
THEN
3681 row=iatom, col=jatom, block=sparse_block_aux, found=found)
3683 sparse_block_aux = sparse_block
3690 CALL copy_dbcsr_to_fm(density_matrix_aux, admm_env%P_to_be_purified(ispin))
3693 IF (nspins == 1)
THEN
3694 CALL cp_fm_scale(0.5_dp, admm_env%P_to_be_purified(ispin))
3697 CALL timestop(handle)
3698 END SUBROUTINE blockify_density_matrix
3705 ELEMENTAL FUNCTION delta(x)
3706 REAL(kind=
dp),
INTENT(IN) :: x
3707 REAL(kind=
dp) :: delta
3709 IF (x == 0.0_dp)
THEN
3722 ELEMENTAL FUNCTION heaviside(x)
3723 REAL(kind=
dp),
INTENT(IN) :: x
3724 REAL(kind=
dp) :: heaviside
3726 IF (x < 0.0_dp)
THEN
3731 END FUNCTION heaviside
3742 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: dm_admm
3744 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_aux_response_density'
3746 INTEGER :: handle, ispin, nao, nao_aux, ncol, nspins
3750 CALL timeset(routinen, handle)
3752 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
3754 nspins = dft_control%nspins
3756 cpassert(
ASSOCIATED(admm_env%A))
3757 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
3758 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
3759 cpassert(
ASSOCIATED(admm_env%work_aux_aux))
3760 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
3763 CALL cp_fm_get_info(admm_env%work_orb_orb, nrow_global=nao, ncol_global=ncol)
3764 DO ispin = 1, nspins
3766 CALL parallel_gemm(
'N',
'N', nao_aux, ncol, nao, 1.0_dp, admm_env%A, &
3767 admm_env%work_orb_orb, 0.0_dp, admm_env%work_aux_orb)
3768 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%A, &
3769 admm_env%work_aux_orb, 0.0_dp, admm_env%work_aux_aux)
3770 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, dm_admm(ispin)%matrix, keep_sparsity=.true.)
3773 CALL timestop(handle)
3784 LOGICAL :: calculate_forces
3786 INTEGER :: igroup, ik, ikp, indx, kplocal, kpmax, &
3787 nao_aux_fit, nao_orb, nkp, nkp_groups
3788 INTEGER,
DIMENSION(2) :: kp_range
3789 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
3790 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
3791 LOGICAL :: my_kpgrp, store_overlap, use_real_wfn
3792 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
3795 TYPE(
cp_cfm_type) :: cmat_aux_fit, cmat_aux_fit_vs_orb, &
3798 matrix_struct_aux_fit_vs_orb
3800 imat_aux_fit_vs_orb, rmat_aux_fit, &
3801 rmat_aux_fit_vs_orb, work_aux_fit
3802 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
3803 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3804 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: dbcsr_aux_fit, dbcsr_aux_fit_vs_orb
3809 POINTER :: sab_aux_fit, sab_aux_fit_vs_orb
3811 NULLIFY (xkp, kp_dist, para_env_local, cell_to_index, admm_env, kp, &
3812 kpoints, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, sab_aux_fit, sab_aux_fit_vs_orb, &
3813 para_env_global, matrix_struct_aux_fit, matrix_struct_aux_fit_vs_orb)
3815 CALL get_qs_env(qs_env, kpoints=kpoints, admm_env=admm_env)
3817 CALL get_admm_env(admm_env, matrix_s_aux_fit_kp=matrix_s_aux_fit, &
3818 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
3819 sab_aux_fit=sab_aux_fit, &
3820 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3821 store_overlap = admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms .OR. calculate_forces
3823 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
3824 nkp_groups=nkp_groups, kp_dist=kp_dist, cell_to_index=cell_to_index)
3825 kplocal = kp_range(2) - kp_range(1) + 1
3826 kpmax = maxval(kp_dist(2, :) - kp_dist(1, :) + 1)
3828 ALLOCATE (dbcsr_aux_fit(3))
3829 CALL dbcsr_create(dbcsr_aux_fit(1), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
3830 CALL dbcsr_create(dbcsr_aux_fit(2), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
3831 CALL dbcsr_create(dbcsr_aux_fit(3), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
3835 ALLOCATE (dbcsr_aux_fit_vs_orb(2))
3836 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(1), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3837 matrix_type=dbcsr_type_no_symmetry)
3838 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(2), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3839 matrix_type=dbcsr_type_no_symmetry)
3844 nao_aux_fit = admm_env%nao_aux_fit
3845 nao_orb = admm_env%nao_orb
3846 para_env_global => kpoints%blacs_env_all%para_env
3848 ALLOCATE (fmwork(4))
3849 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env_all, para_env=para_env_global, &
3850 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3852 IF (.NOT. use_real_wfn)
CALL cp_fm_create(fmwork(2), matrix_struct_aux_fit)
3855 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env_all, para_env=para_env_global, &
3856 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3857 CALL cp_fm_create(fmwork(3), matrix_struct_aux_fit_vs_orb)
3858 IF (.NOT. use_real_wfn)
CALL cp_fm_create(fmwork(4), matrix_struct_aux_fit_vs_orb)
3862 nao_aux_fit = admm_env%nao_aux_fit
3863 nao_orb = admm_env%nao_orb
3864 para_env_local => kpoints%blacs_env%para_env
3866 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env, para_env=para_env_local, &
3867 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3869 IF (use_real_wfn)
THEN
3877 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env, para_env=para_env_local, &
3878 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3879 CALL cp_fm_create(rmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3880 IF (.NOT. use_real_wfn)
THEN
3881 CALL cp_fm_create(imat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3882 CALL cp_cfm_create(cmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3885 ALLOCATE (info(nkp, 4))
3890 DO igroup = 1, nkp_groups
3891 ik = kp_dist(1, igroup) + ikp - 1
3892 IF (ik > kp_dist(2, igroup)) cycle
3893 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3896 IF (use_real_wfn)
THEN
3898 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3899 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), rsmat=matrix_s_aux_fit, ispin=1, &
3900 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3905 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3906 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), rsmat=matrix_s_aux_fit_vs_orb, ispin=1, &
3907 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
3911 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3912 CALL dbcsr_set(dbcsr_aux_fit(2), 0.0_dp)
3913 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), cmatrix=dbcsr_aux_fit(2), rsmat=matrix_s_aux_fit, &
3914 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3921 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3922 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(2), 0.0_dp)
3923 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), cmatrix=dbcsr_aux_fit_vs_orb(2), &
3924 rsmat=matrix_s_aux_fit_vs_orb, ispin=1, xkp=xkp(1:3, ik), &
3925 cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
3933 IF (.NOT. use_real_wfn)
THEN
3940 IF (.NOT. use_real_wfn)
THEN
3952 DO igroup = 1, nkp_groups
3953 ik = kp_dist(1, igroup) + ikp - 1
3954 IF (ik > kp_dist(2, igroup)) cycle
3955 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3961 IF (.NOT. use_real_wfn)
THEN
3968 IF (ikp > kplocal) cycle
3969 kp => kpoints%kp_aux_env(ikp)%kpoint_env
3976 IF (store_overlap)
THEN
3981 IF (use_real_wfn)
THEN
3982 CALL cp_fm_create(kp%amat, matrix_struct_aux_fit_vs_orb)
3983 IF (store_overlap)
THEN
3994 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, &
3995 rmat_aux_fit, rmat_aux_fit_vs_orb, 0.0_dp, kp%amat)
3998 CALL cp_fm_to_cfm(rmat_aux_fit, imat_aux_fit, cmat_aux_fit)
3999 IF (store_overlap)
THEN
4010 CALL cp_fm_to_cfm(rmat_aux_fit_vs_orb, imat_aux_fit_vs_orb, cmat_aux_fit_vs_orb)
4012 cmat_aux_fit, cmat_aux_fit_vs_orb,
z_zero, kp%camat)
4017 DO indx = 1,
SIZE(info, 1)
4020 IF (.NOT. use_real_wfn)
THEN
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_mo_calc_rho_aux_kp(qs_env)
...
subroutine, public admm_mo_merge_derivs(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, mo_derivs, mo_derivs_aux_fit, matrix_ks_aux_fit)
...
subroutine, public admm_mo_merge_ks_matrix(qs_env)
...
subroutine, public admm_update_ks_atom(qs_env, calculate_forces)
Adds the GAPW exchange contribution to the aux_fit ks matrices.
subroutine, public calc_admm_ovlp_forces_kp(qs_env)
Calculate the forces due to the AUX/ORB basis overlap in ADMM, in the KP case.
subroutine, public admm_fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed, mos, mos_aux_fit, geometry_did_change)
...
subroutine, public admm_mo_calc_rho_aux(qs_env)
...
subroutine, public calc_admm_ovlp_forces(qs_env)
Calculate the forces due to the AUX/ORB basis overlap in ADMM.
subroutine, public admm_projection_derivative(qs_env, matrix_hz, matrix_pz, fval)
Calculate derivatives terms from overlap matrices.
subroutine, public admm_aux_response_density(qs_env, dm, dm_admm)
Calculate ADMM auxiliary response density.
subroutine, public scale_dm(qs_env, rho_ao_orb, scale_back)
Scale density matrix by gsi(ispin), is needed for force scaling in ADMMP.
subroutine, public kpoint_calc_admm_matrices(qs_env, calculate_forces)
Store the ADMM auxiliary overlap and projection A = S^-1 Q in their native scalar type.
subroutine, public calc_admm_mo_derivatives(qs_env, mo_derivs)
Calculate the derivative of the AUX_FIT mo, based on the ORB mo_derivs.
subroutine, public calc_mixed_overlap_force(qs_env)
Calculates contribution of forces due to basis transformation.
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public merlot2014
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_uplo_to_full(matrix, workspace, uplo)
...
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...
subroutine, public cp_cfm_cholesky_invert(matrix, n, info_out)
Used to replace Cholesky decomposition by the inverse.
Represents a complex full matrix distributed on many processors.
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_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_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, cartesian_basis)
...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_schur_product(matrix_a, matrix_b, matrix_c)
computes the schur product of two matrices c_ij = a_ij * b_ij
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_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full matrix
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
subroutine, public cp_fm_column_scale(matrixa, scaling, first_col, source)
Scales columns of the full matrix by corresponding factors.
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_invert(matrix, n, info_out, work)
Replace the upper Cholesky factor by the upper triangle of the inverse. When work is provided,...
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
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_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_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
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...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
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, file_access)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Routines needed for kpoint calculation.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext, overlap_rs, mixed_aux_orb)
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).
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
Get information from a single kpoint environment.
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, lattice_fft)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
real(kind=dp), dimension(0:maxfac), parameter, public fac
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
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 add_qs_force(force, qs_force, forcetype, atomic_kind_set)
Add force to a force_type variable.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count, cmo_coeff)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_force(ks_env, force, basis_type_a, basis_type_b, sab_nl, matrix_p, matrixkp_p)
Calculation of the force contribution from an overlap matrix over Cartesian Gaussian functions.
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
module that contains the definitions of the scf types
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external, calculate_forces, composite_vxc_rho, composite_vxc_tau, composite_reference_active, direct_valence_atom_grid, atom_composite_grid)
...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external, native_skala_atom_force, qs_env_external, native_gapw_composite_override, native_skala_defer_to_atom_composite)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
A subtype of the admm_env that contains the extra data needed for an ADMM GAPW calculation.
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Represent a complex full matrix.
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
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.