39 dbcsr_type_no_symmetry, dbcsr_type_symmetric
120#include "./base/base_uses.f90"
140 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'admm_methods'
151 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_mo_calc_rho_aux'
153 CHARACTER(LEN=default_string_length) :: basis_type
154 INTEGER :: handle, ispin
155 LOGICAL :: gapw, s_mstruct_changed
156 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r_aux
158 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit, &
159 matrix_s_aux_fit_vs_orb, rho_ao, &
162 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
170 CALL timeset(routinen, handle)
172 NULLIFY (ks_env, admm_env, mos, mos_aux_fit, matrix_s_aux_fit, &
173 matrix_s_aux_fit_vs_orb, matrix_s, rho, rho_aux_fit, para_env)
174 NULLIFY (rho_g_aux, rho_r_aux, rho_ao, rho_ao_aux, tot_rho_r_aux, task_list)
179 dft_control=dft_control, &
183 s_mstruct_changed=s_mstruct_changed, &
185 CALL get_admm_env(admm_env, mos_aux_fit=mos_aux_fit, matrix_s_aux_fit=matrix_s_aux_fit, &
186 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, rho_aux_fit=rho_aux_fit)
193 tot_rho_r=tot_rho_r_aux)
195 gapw = admm_env%do_gapw
198 DO ispin = 1, dft_control%nspins
199 IF (mos(ispin)%use_mo_coeff_b)
THEN
206 mos, mos_aux_fit, s_mstruct_changed)
208 DO ispin = 1, dft_control%nspins
209 IF (admm_env%block_dm)
THEN
210 CALL blockify_density_matrix(admm_env, &
211 density_matrix=rho_ao(ispin)%matrix, &
212 density_matrix_aux=rho_ao_aux(ispin)%matrix, &
214 nspins=dft_control%nspins)
219 CALL calculate_dm_mo_no_diag(admm_env, &
221 overlap_matrix=matrix_s_aux_fit(1)%matrix, &
222 density_matrix=rho_ao_aux(ispin)%matrix, &
223 overlap_matrix_large=matrix_s(1)%matrix, &
224 density_matrix_large=rho_ao(ispin)%matrix, &
230 CALL purify_dm_cauchy(admm_env, &
231 mo_set=mos_aux_fit(ispin), &
232 density_matrix=rho_ao_aux(ispin)%matrix, &
234 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)
287 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_mo_calc_rho_aux_kp'
289 CHARACTER(LEN=default_string_length) :: basis_type
290 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
291 ispin, kplocal, nao_aux_fit, nao_orb, &
292 natom, nkp, nkp_groups, nmo, nspins
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) :: ca, cmo_coeff, cmo_coeff_aux_fit, &
305 cpmatrix, cwork_aux_aux, cwork_aux_orb
307 struct_aux_aux, struct_aux_orb, &
309 TYPE(
cp_fm_type) :: fmdummy, work_aux_orb, work_orb_orb, &
311 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
313 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, matrix_s_aux_fit, rho_ao_aux, &
316 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: pmatrix
320 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
321 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_aux_fit_kp, mos_kp
324 POINTER :: sab_aux_fit, sab_kp
332 CALL timeset(routinen, handle)
334 NULLIFY (ks_env, admm_env, mos, mos_aux_fit, matrix_s, rho_orb, &
335 matrix_s_aux_fit, rho_aux_fit, rho_ao_orb, &
336 para_env, rho_g_aux, rho_r_aux, rho_ao_aux, tot_rho_r_aux, &
337 kpoints, sab_aux_fit, sab_kp, kp, &
338 struct_orb_orb, struct_aux_orb, struct_aux_aux, mo_struct, mo_struct_aux_fit)
343 dft_control=dft_control, &
347 matrix_s_kp=matrix_s, &
350 rho_aux_fit=rho_aux_fit, &
351 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
352 sab_aux_fit=sab_aux_fit)
353 gapw = admm_env%do_gapw
356 rho_ao_kp=rho_ao_aux, &
359 tot_rho_r=tot_rho_r_aux)
361 CALL qs_rho_get(rho_orb, rho_ao_kp=rho_ao_orb)
362 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
363 nkp_groups=nkp_groups, kp_dist=kp_dist, &
364 cell_to_index=cell_to_index, sab_nl=sab_kp)
368 ALLOCATE (pmatrix(2))
369 CALL dbcsr_create(pmatrix(1), template=matrix_s(1, 1)%matrix, &
370 matrix_type=dbcsr_type_symmetric)
371 CALL dbcsr_create(pmatrix(2), template=matrix_s(1, 1)%matrix, &
372 matrix_type=dbcsr_type_antisymmetric)
373 CALL dbcsr_create(pmatrix_tmp, template=matrix_s(1, 1)%matrix, &
374 matrix_type=dbcsr_type_no_symmetry)
378 nao_aux_fit = admm_env%nao_aux_fit
379 nao_orb = admm_env%nao_orb
380 nspins = dft_control%nspins
383 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
384 nrow_global=nao_orb, ncol_global=nao_orb)
388 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
389 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
391 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
392 nrow_global=nao_aux_fit, ncol_global=nao_orb)
395 IF (.NOT. use_real_wfn)
THEN
409 CALL get_kpoint_env(kpoints%kp_aux_env(1)%kpoint_env, mos=mos_aux_fit_kp)
410 mos => mos_aux_fit_kp(1, :)
411 CALL get_mo_set(mos(1), mo_coeff=mo_coeff_aux_fit)
412 CALL cp_fm_get_info(mo_coeff_aux_fit, matrix_struct=mo_struct_aux_fit)
420 para_env => kpoints%blacs_env_all%para_env
421 kplocal = kp_range(2) - kp_range(1) + 1
429 DO igroup = 1, nkp_groups
431 ik = kp_dist(1, igroup) + ikp - 1
432 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
437 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
438 maxval_mos = max(maxval_mos, maxval(abs(mo_coeff%local_data)))
440 IF (.NOT. use_real_wfn)
THEN
442 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
443 maxval_mos = max(maxval_mos, maxval(abs(mo_coeff%local_data)))
448 CALL para_env%sum(maxval_mos)
450 pmat_from_rs = .false.
451 IF (maxval_mos < epsilon(0.0_dp)) pmat_from_rs = .true.
455 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
458 IF (pmat_from_rs)
THEN
461 DO igroup = 1, nkp_groups
463 ik = kp_dist(1, igroup) + ikp - 1
464 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
468 IF (use_real_wfn)
THEN
470 CALL rskp_transform(rmatrix=pmatrix(1), rsmat=rho_ao_orb, ispin=ispin, &
471 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
477 CALL rskp_transform(rmatrix=pmatrix(1), cmatrix=pmatrix(2), rsmat=rho_ao_orb, ispin=ispin, &
478 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
487 IF (.NOT. use_real_wfn)
THEN
492 IF (.NOT. use_real_wfn)
THEN
504 DO igroup = 1, nkp_groups
506 ik = kp_dist(1, igroup) + ikp - 1
507 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
509 IF (my_kpgrp .AND. pmat_from_rs)
THEN
511 IF (.NOT. use_real_wfn)
THEN
513 CALL cp_fm_to_cfm(work_orb_orb, work_orb_orb2, cpmatrix)
518 IF (use_real_wfn)
THEN
520 nmo = admm_env%nmo(ispin)
523 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
525 mos_aux_fit => mos_aux_fit_kp(1, :)
527 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num)
528 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
529 occupation_numbers=occ_num_aux)
531 kp => kpoints%kp_aux_env(ikp)%kpoint_env
532 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_orb, 1.0_dp, kp%amat(1, 1), &
533 mo_coeff, 0.0_dp, mo_coeff_aux_fit)
535 occ_num_aux(1:nmo) = occ_num(1:nmo)
537 IF (pmat_from_rs)
THEN
539 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, kp%amat(1, 1), &
540 work_orb_orb, 0.0_dp, work_aux_orb)
541 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, work_aux_orb, &
542 kp%amat(1, 1), 0.0_dp, kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin))
548 nmo = admm_env%nmo(ispin)
551 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
554 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
558 kp => kpoints%kp_aux_env(ikp)%kpoint_env
564 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
565 mos_aux_fit => mos_aux_fit_kp(1, :)
566 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
567 CALL cp_cfm_to_fm(cmo_coeff_aux_fit, mtargetr=mo_coeff_aux_fit)
568 mos_aux_fit => mos_aux_fit_kp(2, :)
569 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
570 CALL cp_cfm_to_fm(cmo_coeff_aux_fit, mtargeti=mo_coeff_aux_fit)
574 CALL get_mo_set(mos(ispin), occupation_numbers=occ_num)
575 mos_aux_fit => mos_aux_fit_kp(i, :)
576 CALL get_mo_set(mos_aux_fit(ispin), occupation_numbers=occ_num_aux)
577 occ_num_aux(:) = occ_num(:)
580 IF (pmat_from_rs)
THEN
582 cpmatrix,
z_zero, cwork_aux_orb)
583 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb, &
584 ca,
z_zero, cwork_aux_aux)
586 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin), &
587 mtargeti=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(2, ispin))
595 IF (pmat_from_rs)
THEN
599 DO igroup = 1, nkp_groups
601 ik = kp_dist(1, igroup) + ikp - 1
602 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
620 IF (.NOT. use_real_wfn)
THEN
631 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit, &
632 admm_env%scf_work_aux_fit, for_aux_fit=.true.)
635 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
641 admm_env%n_large_basis = 0.0_dp
644 DO img = 1, dft_control%nimages
645 DO ispin = 1, dft_control%nspins
646 CALL dbcsr_dot(rho_ao_orb(ispin, img)%matrix, matrix_s(1, img)%matrix, tmp)
647 nelec_orb(ispin) = nelec_orb(ispin) + tmp
648 CALL dbcsr_dot(rho_ao_aux(ispin, img)%matrix, matrix_s_aux_fit(1, img)%matrix, tmp)
649 nelec_aux(ispin) = nelec_aux(ispin) + tmp
653 DO ispin = 1, dft_control%nspins
654 admm_env%n_large_basis(ispin) = nelec_orb(ispin)
655 admm_env%gsi(ispin) = nelec_orb(ispin)/nelec_aux(ispin)
658 IF (admm_env%charge_constrain)
THEN
659 DO img = 1, dft_control%nimages
660 DO ispin = 1, dft_control%nspins
661 CALL dbcsr_scale(rho_ao_aux(ispin, img)%matrix, admm_env%gsi(ispin))
666 IF (dft_control%nspins == 1)
THEN
667 admm_env%gsi(3) = admm_env%gsi(1)
669 admm_env%gsi(3) = (admm_env%gsi(1) + admm_env%gsi(2))/2.0_dp
673 basis_type =
"AUX_FIT"
674 task_list => admm_env%task_list_aux_fit
676 basis_type =
"AUX_FIT_SOFT"
677 task_list => admm_env%admm_gapw_env%task_list
681 rho_ao => rho_ao_aux(ispin, :)
683 matrix_p_kp=rho_ao, &
684 rho=rho_r_aux(ispin), &
685 rho_gspace=rho_g_aux(ispin), &
686 total_rho=tot_rho_r_aux(ispin), &
687 soft_valid=.false., &
688 basis_type=basis_type, &
689 task_list_external=task_list)
694 rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
695 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
696 oce=admm_env%admm_gapw_env%oce, &
697 sab=admm_env%sab_aux_fit, para_env=para_env)
699 CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, &
700 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
703 CALL qs_rho_set(rho_aux_fit, rho_r_valid=.true., rho_g_valid=.true.)
705 CALL timestop(handle)
717 LOGICAL,
INTENT(IN) :: calculate_forces
719 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_update_ks_atom'
721 INTEGER :: handle, img, ispin
722 REAL(
dp) :: force_fac(2)
724 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, &
725 matrix_ks_aux_fit_dft, &
726 matrix_ks_aux_fit_hfx, rho_ao_aux
730 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, rho_ao_aux, rho_aux_fit)
731 NULLIFY (admm_env, dft_control)
733 CALL timeset(routinen, handle)
735 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
736 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
737 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
738 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
739 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
743 IF (admm_env%do_admms)
THEN
744 DO ispin = 1, dft_control%nspins
745 force_fac(ispin) = admm_env%gsi(ispin)**(2.0_dp/3.0_dp)
747 ELSE IF (admm_env%do_admmp)
THEN
748 DO ispin = 1, dft_control%nspins
749 force_fac(ispin) = admm_env%gsi(ispin)**2
753 CALL update_ks_atom(qs_env, matrix_ks_aux_fit, rho_ao_aux, calculate_forces, tddft=.false., &
754 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
755 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
756 oce_external=admm_env%admm_gapw_env%oce, &
757 sab_external=admm_env%sab_aux_fit, fscale=force_fac)
760 DO img = 1, dft_control%nimages
761 DO ispin = 1, dft_control%nspins
762 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit(ispin, img)%matrix, &
764 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix, &
769 CALL timestop(handle)
780 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_ks_matrix'
786 CALL timeset(routinen, handle)
789 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
791 SELECT CASE (admm_env%purification_method)
793 CALL merge_ks_matrix_cauchy(qs_env)
796 CALL merge_ks_matrix_cauchy_subspace(qs_env)
799 IF (dft_control%nimages > 1)
THEN
800 CALL merge_ks_matrix_none_kp(qs_env)
802 CALL merge_ks_matrix_none(qs_env)
808 cpabort(
"admm_mo_merge_ks_matrix: unknown purification method")
811 CALL timestop(handle)
827 mo_derivs_aux_fit, matrix_ks_aux_fit)
828 INTEGER,
INTENT(IN) :: ispin
831 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
832 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
833 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
835 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_derivs'
839 CALL timeset(routinen, handle)
841 SELECT CASE (admm_env%purification_method)
843 CALL merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, &
844 mo_derivs, mo_derivs_aux_fit, matrix_ks_aux_fit)
847 CALL merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
852 cpabort(
"admm_mo_merge_derivs: unknown purification method")
855 CALL timestop(handle)
869 mos, mos_aux_fit, geometry_did_change)
872 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
873 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
874 LOGICAL,
INTENT(IN) :: geometry_did_change
876 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_fit_mo_coeffs'
880 CALL timeset(routinen, handle)
882 IF (geometry_did_change)
THEN
883 CALL fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
886 SELECT CASE (admm_env%purification_method)
888 CALL purify_mo_cholesky(admm_env, mos, mos_aux_fit)
891 CALL purify_mo_diag(admm_env, mos, mos_aux_fit)
894 CALL purify_mo_none(admm_env, mos, mos_aux_fit)
897 CALL timestop(handle)
907 SUBROUTINE fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
909 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
911 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fit_mo_coeffs'
913 INTEGER :: handle, iatom, jatom, nao_aux_fit, &
915 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
919 CALL timeset(routinen, handle)
921 nao_aux_fit = admm_env%nao_aux_fit
922 nao_orb = admm_env%nao_orb
926 IF (.NOT. admm_env%block_fit)
THEN
929 NULLIFY (matrix_s_tilde)
930 ALLOCATE (matrix_s_tilde)
931 CALL dbcsr_create(matrix_s_tilde, template=matrix_s_aux_fit(1)%matrix, &
932 name=
'MATRIX s_tilde', &
933 matrix_type=dbcsr_type_symmetric)
935 CALL dbcsr_copy(matrix_s_tilde, matrix_s_aux_fit(1)%matrix)
940 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
941 sparse_block = 0.0_dp
961 IF (admm_env%block_fit)
THEN
964 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
965 1.0_dp, admm_env%S_inv, admm_env%Q, 0.0_dp, &
970 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
971 1.0_dp, admm_env%Q, admm_env%A, 0.0_dp, &
975 CALL timestop(handle)
977 END SUBROUTINE fit_mo_coeffs
990 SUBROUTINE purify_mo_cholesky(admm_env, mos, mos_aux_fit)
993 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
995 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_cholesky'
997 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
999 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1001 CALL timeset(routinen, handle)
1003 nao_aux_fit = admm_env%nao_aux_fit
1004 nao_orb = admm_env%nao_orb
1008 DO ispin = 1, nspins
1009 nmo = admm_env%nmo(ispin)
1012 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
1013 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1015 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1016 admm_env%work_orb_nmo(ispin))
1018 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1019 admm_env%lambda(ispin))
1020 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1026 CALL cp_fm_to_fm(admm_env%work_nmo_nmo1(ispin), admm_env%lambda_inv(ispin))
1030 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1031 admm_env%C_hat(ispin))
1032 CALL cp_fm_to_fm(admm_env%C_hat(ispin), mo_coeff_aux_fit)
1036 CALL timestop(handle)
1038 END SUBROUTINE purify_mo_cholesky
1051 SUBROUTINE purify_mo_diag(admm_env, mos, mos_aux_fit)
1054 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1056 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_diag'
1058 INTEGER :: handle, i, ispin, nao_aux_fit, nao_orb, &
1060 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_work
1061 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1063 CALL timeset(routinen, handle)
1065 nao_aux_fit = admm_env%nao_aux_fit
1066 nao_orb = admm_env%nao_orb
1070 DO ispin = 1, nspins
1071 nmo = admm_env%nmo(ispin)
1074 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
1075 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1077 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1078 admm_env%work_orb_nmo(ispin))
1080 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1081 admm_env%lambda(ispin))
1082 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1084 CALL cp_fm_syevd(admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), &
1085 admm_env%eigvals_lambda(ispin)%eigvals%data)
1086 ALLOCATE (eig_work(nmo))
1088 eig_work(i) = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1090 CALL cp_fm_to_fm(admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin))
1093 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), 0.0_dp, &
1094 admm_env%lambda_inv_sqrt(ispin))
1096 1.0_dp, mo_coeff, admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1097 admm_env%work_orb_nmo(ispin))
1099 1.0_dp, admm_env%A, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1102 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1103 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1104 DEALLOCATE (eig_work)
1107 CALL timestop(handle)
1109 END SUBROUTINE purify_mo_diag
1117 SUBROUTINE purify_mo_none(admm_env, mos, mos_aux_fit)
1119 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1121 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_none'
1123 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
1124 nmo, nmo_mos, nspins
1125 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occ_num, occ_num_aux
1126 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1128 CALL timeset(routinen, handle)
1130 nao_aux_fit = admm_env%nao_aux_fit
1131 nao_orb = admm_env%nao_orb
1134 DO ispin = 1, nspins
1135 nmo = admm_env%nmo(ispin)
1136 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num, nmo=nmo_mos)
1137 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
1138 occupation_numbers=occ_num_aux)
1141 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1143 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1145 occ_num_aux(1:nmo) = occ_num(1:nmo)
1148 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1149 CALL cp_fm_set_all(admm_env%lambda_inv_sqrt(ispin), 0.0_dp, 1.0_dp)
1152 CALL timestop(handle)
1154 END SUBROUTINE purify_mo_none
1164 SUBROUTINE purify_dm_cauchy(admm_env, mo_set, density_matrix, ispin, blocked)
1170 LOGICAL,
INTENT(IN) :: blocked
1172 CHARACTER(len=*),
PARAMETER :: routinen =
'purify_dm_cauchy'
1174 INTEGER :: handle, i, nao_aux_fit, nao_orb, nmo, &
1176 REAL(kind=
dp) :: pole
1177 TYPE(
cp_fm_type),
POINTER :: mo_coeff_aux_fit
1179 CALL timeset(routinen, handle)
1181 nao_aux_fit = admm_env%nao_aux_fit
1182 nao_orb = admm_env%nao_orb
1183 nmo = admm_env%nmo(ispin)
1185 nspins =
SIZE(admm_env%P_to_be_purified)
1187 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff_aux_fit)
1192 IF (.NOT. blocked)
THEN
1193 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1194 1.0_dp, mo_coeff_aux_fit, mo_coeff_aux_fit, 0.0_dp, &
1195 admm_env%P_to_be_purified(ispin))
1198 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1199 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1205 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1206 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1209 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1211 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1216 DO i = 1, nao_aux_fit
1217 pole = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1226 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1227 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1228 admm_env%work_aux_aux)
1230 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1231 1.0_dp, admm_env%work_aux_aux, admm_env%M_purify(ispin), 0.0_dp, &
1232 admm_env%work_aux_aux2)
1234 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1235 1.0_dp, admm_env%work_aux_aux2, admm_env%work_aux_aux, 0.0_dp, &
1236 admm_env%work_aux_aux3)
1238 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux3, density_matrix, keep_sparsity=.true.)
1240 IF (nspins == 1)
THEN
1244 CALL timestop(handle)
1246 END SUBROUTINE purify_dm_cauchy
1252 SUBROUTINE merge_ks_matrix_cauchy(qs_env)
1255 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy'
1257 INTEGER :: handle, i, iatom, ispin, j, jatom, &
1258 nao_aux_fit, nao_orb, nmo
1259 REAL(
dp) :: eig_diff, pole, tmp
1260 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1264 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1269 CALL timeset(routinen, handle)
1270 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mo_coeff)
1273 admm_env=admm_env, &
1274 dft_control=dft_control, &
1275 matrix_ks=matrix_ks, &
1277 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit)
1279 DO ispin = 1, dft_control%nspins
1280 nao_aux_fit = admm_env%nao_aux_fit
1281 nao_orb = admm_env%nao_orb
1282 nmo = admm_env%nmo(ispin)
1283 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1285 IF (.NOT. admm_env%block_dm)
THEN
1288 1.0_dp, mo_coeff, mo_coeff, 0.0_dp, &
1289 admm_env%work_orb_orb)
1292 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
1293 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
1294 admm_env%work_aux_orb2)
1296 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
1297 1.0_dp, admm_env%work_aux_orb2, admm_env%A, 0.0_dp, &
1298 admm_env%P_to_be_purified(ispin))
1302 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1303 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1309 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1310 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1313 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1315 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1319 DO i = 1, nao_aux_fit
1320 DO j = i, nao_aux_fit
1321 eig_diff = (admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1322 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1324 IF (abs(eig_diff) == 0.0_dp)
THEN
1325 pole = delta(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1328 pole = 1.0_dp/(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1329 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1330 tmp = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1331 tmp = tmp - heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j) - 0.5_dp)
1343 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1344 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1345 admm_env%work_aux_aux)
1347 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1348 1.0_dp, admm_env%K(ispin), admm_env%work_aux_aux, 0.0_dp, &
1349 admm_env%work_aux_aux2)
1351 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1352 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1353 admm_env%work_aux_aux3)
1356 admm_env%work_aux_aux)
1359 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1360 1.0_dp, admm_env%R_purify(ispin), admm_env%A, 0.0_dp, &
1361 admm_env%work_aux_orb)
1364 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1365 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_orb, 0.0_dp, &
1366 admm_env%work_aux_orb2)
1368 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1369 1.0_dp, admm_env%work_aux_orb, admm_env%work_aux_orb2, 0.0_dp, &
1370 admm_env%work_orb_orb)
1372 NULLIFY (matrix_k_tilde)
1373 ALLOCATE (matrix_k_tilde)
1374 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1375 name=
'MATRIX K_tilde', &
1376 matrix_type=dbcsr_type_symmetric)
1378 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1380 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1382 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1384 IF (admm_env%block_dm)
THEN
1389 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1390 sparse_block = 0.0_dp
1396 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1402 CALL timestop(handle)
1404 END SUBROUTINE merge_ks_matrix_cauchy
1410 SUBROUTINE merge_ks_matrix_cauchy_subspace(qs_env)
1413 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy_subspace'
1415 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, nmo
1417 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1418 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1421 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
1423 CALL timeset(routinen, handle)
1424 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mos_aux_fit, &
1425 mo_coeff, mo_coeff_aux_fit)
1428 admm_env=admm_env, &
1429 dft_control=dft_control, &
1430 matrix_ks=matrix_ks, &
1432 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, mos_aux_fit=mos_aux_fit)
1434 DO ispin = 1, dft_control%nspins
1435 nao_aux_fit = admm_env%nao_aux_fit
1436 nao_orb = admm_env%nao_orb
1437 nmo = admm_env%nmo(ispin)
1438 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1439 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1442 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1449 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1450 admm_env%lambda_inv2(ispin))
1454 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1455 admm_env%C_hat(ispin))
1459 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
1460 admm_env%work_aux_nmo(ispin))
1462 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1463 1.0_dp, admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
1464 admm_env%P_tilde(ispin))
1468 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv2(ispin), 0.0_dp, &
1469 admm_env%work_aux_nmo(ispin))
1472 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1473 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%C_hat(ispin), 0.0_dp, &
1474 admm_env%work_aux_aux)
1477 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1478 1.0_dp, admm_env%S, admm_env%work_aux_aux, 0.0_dp, &
1479 admm_env%work_aux_aux2)
1485 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1486 1.0_dp, admm_env%work_aux_aux2, admm_env%K(ispin), 0.0_dp, &
1487 admm_env%work_aux_aux)
1490 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1491 1.0_dp, admm_env%P_tilde(ispin), admm_env%S, 0.0_dp, &
1492 admm_env%work_aux_aux2)
1495 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1496 -1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1497 admm_env%work_aux_aux3)
1503 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1504 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 0.0_dp, &
1505 admm_env%work_aux_orb)
1508 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1509 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 1.0_dp, &
1510 admm_env%work_aux_orb)
1513 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1514 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1515 admm_env%work_orb_orb)
1517 NULLIFY (matrix_k_tilde)
1518 ALLOCATE (matrix_k_tilde)
1519 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1520 name=
'MATRIX K_tilde', &
1521 matrix_type=dbcsr_type_symmetric)
1523 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1525 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1527 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1530 1.0_dp, admm_env%work_orb_orb, mo_coeff, 0.0_dp, &
1531 admm_env%mo_derivs_tmp(ispin))
1533 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1538 CALL timestop(handle)
1540 END SUBROUTINE merge_ks_matrix_cauchy_subspace
1560 SUBROUTINE merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, mo_derivs, &
1561 mo_derivs_aux_fit, matrix_ks_aux_fit)
1562 INTEGER,
INTENT(IN) :: ispin
1565 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
1566 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
1567 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
1569 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_diag'
1571 INTEGER :: handle, i, j, nao_aux_fit, nao_orb, nmo
1572 REAL(
dp) :: eig_diff, pole, tmp32, tmp52, tmp72, &
1574 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
1576 CALL timeset(routinen, handle)
1578 nao_aux_fit = admm_env%nao_aux_fit
1579 nao_orb = admm_env%nao_orb
1580 nmo = admm_env%nmo(ispin)
1585 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
1586 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
1589 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
1590 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
1591 scaling_factor = 2.0_dp*occupation_numbers
1595 CALL cp_fm_to_fm(admm_env%H(ispin), mo_derivs_aux_fit(ispin))
1599 1.0_dp, admm_env%H(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1600 admm_env%work_aux_nmo(ispin))
1602 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1603 admm_env%mo_derivs_tmp(ispin))
1609 eig_diff = (admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1610 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1612 IF (abs(eig_diff) < 0.0001_dp)
THEN
1613 tmp32 = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))**3
1614 tmp52 = tmp32/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1615 tmp72 = tmp52/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1616 tmp92 = tmp72/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1618 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
1621 pole = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1622 pole = pole - 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1623 pole = pole/(admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1624 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1638 1.0_dp, admm_env%H(ispin), admm_env%R(ispin), 0.0_dp, &
1639 admm_env%work_aux_nmo(ispin))
1642 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1643 admm_env%work_orb_nmo(ispin))
1646 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1647 admm_env%work_nmo_nmo1(ispin))
1650 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1651 admm_env%work_nmo_nmo2(ispin))
1654 admm_env%M(ispin), admm_env%work_nmo_nmo1(ispin))
1657 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1658 admm_env%work_nmo_nmo2(ispin))
1662 1.0_dp, admm_env%work_nmo_nmo2(ispin), admm_env%R(ispin), 0.0_dp, &
1663 admm_env%R_schur_R_t(ispin))
1667 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1668 admm_env%work_orb_nmo(ispin))
1673 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1674 admm_env%mo_derivs_tmp(ispin))
1679 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1680 admm_env%mo_derivs_tmp(ispin))
1682 DO i = 1,
SIZE(scaling_factor)
1683 scaling_factor(i) = 1.0_dp/scaling_factor(i)
1690 DEALLOCATE (scaling_factor)
1692 CALL timestop(handle)
1694 END SUBROUTINE merge_mo_derivs_diag
1700 SUBROUTINE merge_ks_matrix_none(qs_env)
1703 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none'
1705 INTEGER :: handle, iatom, ispin, jatom, &
1706 nao_aux_fit, nao_orb, nmo
1707 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1708 REAL(kind=
dp) :: ener_k(2), ener_x(2), ener_x1(2), &
1709 gsi_square, trace_tmp, trace_tmp_two
1712 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
1713 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, &
1715 TYPE(
dbcsr_type),
POINTER :: matrix_k_tilde, &
1716 matrix_ks_aux_fit_admms_tmp, &
1723 CALL timeset(routinen, handle)
1724 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
1725 matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, rho_ao_aux, matrix_k_tilde, &
1726 matrix_ttst, matrix_ks_aux_fit_admms_tmp, rho, rho_aux_fit, sparse_block, para_env, energy)
1729 admm_env=admm_env, &
1730 dft_control=dft_control, &
1731 matrix_ks=matrix_ks, &
1733 matrix_s=matrix_s, &
1736 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft, &
1737 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, rho_aux_fit=rho_aux_fit, &
1738 matrix_s_aux_fit=matrix_s_aux_fit)
1744 DO ispin = 1, dft_control%nspins
1745 IF (admm_env%block_dm)
THEN
1749 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1750 sparse_block = 0.0_dp
1754 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ks_aux_fit(ispin)%matrix, 1.0_dp, 1.0_dp)
1758 nao_aux_fit = admm_env%nao_aux_fit
1759 nao_orb = admm_env%nao_orb
1760 nmo = admm_env%nmo(ispin)
1763 IF (admm_env%do_admms)
THEN
1764 NULLIFY (matrix_ks_aux_fit_admms_tmp)
1765 ALLOCATE (matrix_ks_aux_fit_admms_tmp)
1766 CALL dbcsr_create(matrix_ks_aux_fit_admms_tmp, template=matrix_ks_aux_fit(ispin)%matrix, &
1767 name=
'matrix_ks_aux_fit_admms_tmp', matrix_type=
's')
1769 CALL dbcsr_copy(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_hfx(ispin)%matrix)
1772 CALL dbcsr_add(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_dft(ispin)%matrix, &
1773 1.0_dp, -(admm_env%gsi(ispin))**(2.0_dp/3.0_dp))
1783 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1784 1.0_dp, admm_env%K(ispin), admm_env%A, 0.0_dp, &
1785 admm_env%work_aux_orb)
1787 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1788 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1789 admm_env%work_orb_orb)
1791 NULLIFY (matrix_k_tilde)
1792 ALLOCATE (matrix_k_tilde)
1793 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1794 name=
'MATRIX K_tilde', matrix_type=
'S')
1795 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1797 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1801 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1802 CALL dbcsr_scale(matrix_k_tilde, admm_env%gsi(ispin))
1806 IF (admm_env%do_admmp)
THEN
1807 gsi_square = (admm_env%gsi(ispin))*(admm_env%gsi(ispin))
1811 admm_env%lambda_merlot(ispin) = 0
1814 IF (admm_env%do_admmq)
THEN
1815 CALL dbcsr_dot(matrix_ks_aux_fit(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1819 admm_env%lambda_merlot(ispin) = trace_tmp/(admm_env%n_large_basis(ispin))
1821 ELSE IF (admm_env%do_admmp)
THEN
1822 IF (dft_control%nspins == 2)
THEN
1823 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1824 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1826 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1827 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
1828 (admm_env%n_large_basis(ispin))
1831 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1832 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
1833 /(admm_env%n_large_basis(ispin))
1836 ELSE IF (admm_env%do_admms)
THEN
1837 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1838 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp_two)
1840 IF (dft_control%nspins == 2)
THEN
1841 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1842 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1844 admm_env%lambda_merlot(ispin) = &
1845 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1846 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1847 trace_tmp_two)/(admm_env%n_large_basis(ispin))
1850 admm_env%lambda_merlot(ispin) = (trace_tmp + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)* &
1851 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
1852 trace_tmp_two))/(admm_env%n_large_basis(ispin))
1859 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1866 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1867 1.0_dp, admm_env%work_aux_aux4, admm_env%A, 0.0_dp, &
1868 admm_env%work_aux_orb3)
1870 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1871 1.0_dp, admm_env%A, admm_env%work_aux_orb3, 0.0_dp, &
1872 admm_env%work_orb_orb3)
1874 NULLIFY (matrix_ttst)
1875 ALLOCATE (matrix_ttst)
1876 CALL dbcsr_create(matrix_ttst, template=matrix_ks(ispin)%matrix, &
1877 name=
'MATRIX TtsT', matrix_type=
'S')
1878 CALL dbcsr_copy(matrix_ttst, matrix_ks(ispin)%matrix)
1880 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb3, matrix_ttst, keep_sparsity=.true.)
1884 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ttst, 1.0_dp, &
1885 (-admm_env%lambda_merlot(ispin))*admm_env%gsi(ispin))
1887 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_s(1)%matrix, 1.0_dp, admm_env%lambda_merlot(ispin))
1893 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1901 IF (admm_env%do_admmp)
THEN
1905 IF (dft_control%nspins == 2)
THEN
1906 energy%exc_aux_fit = 0.0_dp
1907 energy%exc1_aux_fit = 0.0_dp
1909 DO ispin = 1, dft_control%nspins
1910 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
1911 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
1912 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
1915 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
1916 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
1917 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
1920 ELSE IF (admm_env%do_admms)
THEN
1921 IF (dft_control%nspins == 2)
THEN
1922 energy%exc_aux_fit = 0.0_dp
1923 energy%exc1_aux_fit = 0.0_dp
1924 DO ispin = 1, dft_control%nspins
1925 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
1926 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
1929 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
1930 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
1934 CALL timestop(handle)
1936 END SUBROUTINE merge_ks_matrix_none
1942 SUBROUTINE merge_ks_matrix_none_kp(qs_env)
1945 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none_kp'
1947 COMPLEX(dp) ::
fac, fac2
1948 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
1949 ispin, kplocal, nao_aux_fit, nao_orb, &
1950 natom, nkp, nkp_groups, nspins
1951 INTEGER,
DIMENSION(2) :: kp_range
1952 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
1953 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1954 LOGICAL :: my_kpgrp, use_real_wfn
1955 REAL(
dp) :: ener_k(2), ener_x(2), ener_x1(2), tmp, &
1956 trace_tmp, trace_tmp_two
1957 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1961 cwork_aux_orb, cwork_orb_orb
1964 TYPE(
cp_fm_type) :: fmdummy, work_aux_aux, work_aux_aux2, &
1966 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
1967 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_ks
1968 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_k_tilde, matrix_ks_aux_fit, &
1969 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_kp, matrix_s, matrix_s_aux_fit, &
1972 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: ksmatrix
1978 POINTER :: sab_aux_fit, sab_kp
1983 CALL timeset(routinen, handle)
1984 NULLIFY (admm_env, rho_ao_aux, rho_aux_fit, &
1985 matrix_s_aux_fit, energy, &
1986 para_env, kpoints, sab_aux_fit, &
1987 matrix_k_tilde, matrix_ks_kp, matrix_ks_aux_fit, scf_env, &
1988 struct_orb_orb, struct_aux_orb, struct_aux_aux, kp, &
1989 matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft)
1992 admm_env=admm_env, &
1993 dft_control=dft_control, &
1994 matrix_ks_kp=matrix_ks_kp, &
1995 matrix_s_kp=matrix_s, &
1996 para_env=para_env, &
2003 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
2004 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx, &
2005 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
2006 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
2007 sab_aux_fit=sab_aux_fit, &
2008 rho_aux_fit=rho_aux_fit)
2009 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
2011 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
2012 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_kp, &
2013 cell_to_index=cell_to_index)
2015 nao_aux_fit = admm_env%nao_aux_fit
2016 nao_orb = admm_env%nao_orb
2017 nspins = dft_control%nspins
2022 IF (admm_env%do_admmq)
THEN
2023 admm_env%lambda_merlot = 0.0_dp
2024 DO img = 1, dft_control%nimages
2025 DO ispin = 1, nspins
2026 CALL dbcsr_dot(matrix_ks_aux_fit(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, trace_tmp)
2027 admm_env%lambda_merlot(ispin) = admm_env%lambda_merlot(ispin) + trace_tmp/admm_env%n_large_basis(ispin)
2033 IF (admm_env%do_admmp)
THEN
2034 IF (nspins == 1)
THEN
2035 admm_env%lambda_merlot(1) = 2.0_dp*(admm_env%gsi(1))**2* &
2036 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
2037 /(admm_env%n_large_basis(1))
2039 DO ispin = 1, nspins
2040 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
2041 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
2042 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
2043 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
2044 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
2045 (admm_env%n_large_basis(ispin))
2051 IF (admm_env%do_admms)
THEN
2052 IF (nspins == 1)
THEN
2054 trace_tmp_two = 0.0_dp
2055 DO img = 1, dft_control%nimages
2056 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2057 trace_tmp = trace_tmp + tmp
2058 CALL dbcsr_dot(matrix_ks_aux_fit_dft(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2059 trace_tmp_two = trace_tmp_two + tmp
2061 admm_env%lambda_merlot(1) = (trace_tmp + (admm_env%gsi(1))**(2.0_dp/3.0_dp)* &
2062 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
2063 trace_tmp_two))/(admm_env%n_large_basis(1))
2066 DO ispin = 1, nspins
2068 trace_tmp_two = 0.0_dp
2069 DO img = 1, dft_control%nimages
2070 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2071 trace_tmp = trace_tmp + tmp
2072 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2073 trace_tmp_two = trace_tmp_two + tmp
2076 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
2077 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
2078 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
2080 admm_env%lambda_merlot(ispin) = &
2081 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2082 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2083 trace_tmp_two)/(admm_env%n_large_basis(ispin))
2088 NULLIFY (matrix_ks_aux_fit)
2089 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2090 DO img = 1, dft_control%nimages
2091 DO ispin = 1, nspins
2092 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2093 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2094 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2095 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2096 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2097 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2103 ALLOCATE (ksmatrix(2))
2104 CALL dbcsr_create(ksmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2105 matrix_type=dbcsr_type_symmetric)
2106 CALL dbcsr_create(ksmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2107 matrix_type=dbcsr_type_antisymmetric)
2108 CALL dbcsr_create(tmpmatrix_ks, template=matrix_ks_aux_fit(1, 1)%matrix, &
2109 matrix_type=dbcsr_type_symmetric)
2113 kplocal = kp_range(2) - kp_range(1) + 1
2114 para_env => kpoints%blacs_env_all%para_env
2116 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2117 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2121 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2122 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2125 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2126 nrow_global=nao_orb, ncol_global=nao_orb)
2129 IF (.NOT. use_real_wfn)
THEN
2141 ALLOCATE (fm_ks(kplocal, 2, nspins))
2142 DO ispin = 1, nspins
2145 CALL cp_fm_create(fm_ks(ikp, i, ispin), struct_orb_orb)
2154 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
2157 DO ispin = 1, nspins
2158 DO igroup = 1, nkp_groups
2160 ik = kp_dist(1, igroup) + ikp - 1
2161 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2164 IF (use_real_wfn)
THEN
2166 CALL rskp_transform(rmatrix=ksmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2167 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2173 CALL rskp_transform(rmatrix=ksmatrix(1), cmatrix=ksmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2174 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2183 IF (.NOT. use_real_wfn) &
2185 para_env, info(indx, 2))
2188 IF (.NOT. use_real_wfn) &
2197 DO ispin = 1, nspins
2198 DO igroup = 1, nkp_groups
2200 ik = kp_dist(1, igroup) + ikp - 1
2201 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2205 IF (.NOT. use_real_wfn)
THEN
2212 kp => kpoints%kp_aux_env(ikp)%kpoint_env
2213 IF (use_real_wfn)
THEN
2216 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2217 1.0_dp, work_aux_aux, kp%amat(1, 1), 0.0_dp, &
2220 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
2221 1.0_dp, kp%amat(1, 1), work_aux_orb, 0.0_dp, &
2222 fm_ks(ikp, 1, ispin))
2225 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
2229 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2234 IF (admm_env%do_admmp)
THEN
2238 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2239 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
2244 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2247 CALL parallel_gemm(
'C',
'N', nao_orb, nao_orb, nao_aux_fit, &
2250 CALL cp_cfm_to_fm(cwork_orb_orb, mtargetr=fm_ks(ikp, 1, ispin), mtargeti=fm_ks(ikp, 2, ispin))
2257 DO ispin = 1, nspins
2258 DO igroup = 1, nkp_groups
2260 ik = kp_dist(1, igroup) + ikp - 1
2261 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2277 IF (.NOT. use_real_wfn)
THEN
2286 NULLIFY (matrix_k_tilde)
2290 DO ispin = 1, nspins
2291 DO img = 1, dft_control%nimages
2292 ALLOCATE (matrix_k_tilde(ispin, img)%matrix)
2293 CALL dbcsr_create(matrix=matrix_k_tilde(ispin, img)%matrix, template=matrix_ks_kp(1, 1)%matrix, &
2295 matrix_type=dbcsr_type_symmetric)
2297 CALL dbcsr_set(matrix_k_tilde(ispin, img)%matrix, 0.0_dp)
2301 CALL cp_fm_get_info(admm_env%work_orb_orb, matrix_struct=struct_orb_orb)
2302 ALLOCATE (fmwork(2))
2308 matrix_k_tilde(1, 1)%matrix, sab_kp, &
2309 fmwork, for_aux_fit=.false., pmat_ext=fm_ks)
2313 DO ispin = 1, nspins
2321 DO ispin = 1, nspins
2322 DO img = 1, dft_control%nimages
2323 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_k_tilde(ispin, img)%matrix, 1.0_dp, 1.0_dp)
2324 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
2326 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_s(1, img)%matrix, &
2327 1.0_dp, admm_env%lambda_merlot(ispin))
2333 IF (admm_env%do_admmp)
THEN
2334 IF (nspins == 1)
THEN
2335 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
2336 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
2337 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
2339 energy%exc_aux_fit = 0.0_dp
2340 energy%exc1_aux_fit = 0.0_dp
2342 DO ispin = 1, dft_control%nspins
2343 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
2344 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
2345 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
2351 IF (admm_env%do_admms)
THEN
2352 IF (nspins == 1)
THEN
2353 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
2354 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
2356 energy%exc_aux_fit = 0.0_dp
2357 energy%exc1_aux_fit = 0.0_dp
2358 DO ispin = 1, nspins
2359 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
2360 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
2369 CALL timestop(handle)
2371 END SUBROUTINE merge_ks_matrix_none_kp
2382 SUBROUTINE calc_spin_dep_aux_exch_ener(qs_env, admm_env, ener_k_ispin, ener_x_ispin, &
2383 ener_x1_ispin, ispin)
2386 REAL(
dp),
INTENT(INOUT) :: ener_k_ispin, ener_x_ispin, ener_x1_ispin
2387 INTEGER,
INTENT(IN) :: ispin
2389 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_spin_dep_aux_exch_ener'
2391 CHARACTER(LEN=default_string_length) :: basis_type
2392 INTEGER :: handle, img, myspin, nimg
2395 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
2399 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit_hfx, rho_ao_aux, &
2405 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, v_rspace_dummy, v_tau_rspace_dummy
2407 TYPE(
qs_rho_type),
POINTER :: rho_aux_fit, rho_aux_fit_buffer
2411 CALL timeset(routinen, handle)
2413 NULLIFY (ks_env, rho_aux_fit, rho_aux_fit_buffer, rho_ao, &
2414 xc_section_aux, v_rspace_dummy, v_tau_rspace_dummy, &
2415 rho_ao_aux, rho_ao_aux_buffer, dft_control, &
2416 matrix_ks_aux_fit_hfx, task_list, local_rho_buffer, admm_gapw_env)
2418 NULLIFY (rho_g, rho_r, tot_rho_r)
2420 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
2421 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, rho_aux_fit_buffer=rho_aux_fit_buffer, &
2422 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2425 rho_ao_kp=rho_ao_aux)
2428 rho_ao_kp=rho_ao_aux_buffer, &
2431 tot_rho_r=tot_rho_r)
2433 gapw = admm_env%do_gapw
2434 nimg = dft_control%nimages
2438 CALL dbcsr_set(rho_ao_aux_buffer(1, img)%matrix, 0.0_dp)
2439 CALL dbcsr_set(rho_ao_aux_buffer(2, img)%matrix, 0.0_dp)
2440 CALL dbcsr_add(rho_ao_aux_buffer(ispin, img)%matrix, &
2441 rho_ao_aux(ispin, img)%matrix, 0.0_dp, 1.0_dp)
2445 basis_type =
"AUX_FIT"
2446 task_list => admm_env%task_list_aux_fit
2448 basis_type =
"AUX_FIT_SOFT"
2449 task_list => admm_env%admm_gapw_env%task_list
2453 DO myspin = 1, dft_control%nspins
2455 rho_ao => rho_ao_aux_buffer(myspin, :)
2457 matrix_p_kp=rho_ao, &
2458 rho=rho_r(myspin), &
2459 rho_gspace=rho_g(myspin), &
2460 total_rho=tot_rho_r(myspin), &
2461 soft_valid=.false., &
2462 basis_type=
"AUX_FIT", &
2463 task_list_external=task_list)
2468 CALL qs_rho_set(rho_aux_fit_buffer, rho_r_valid=.true., rho_g_valid=.true.)
2470 xc_section_aux => admm_env%xc_section_aux
2472 ener_x_ispin = 0.0_dp
2474 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_aux_fit_buffer, xc_section=xc_section_aux, &
2475 vxc_rho=v_rspace_dummy, vxc_tau=v_tau_rspace_dummy, exc=ener_x_ispin, &
2479 ener_x1_ispin = 0.0_dp
2482 admm_gapw_env => admm_env%admm_gapw_env
2484 atomic_kind_set=atomic_kind_set, &
2489 admm_gapw_env%admm_kind_set, dft_control, para_env)
2492 rho_atom_set=local_rho_buffer%rho_atom_set, &
2493 qs_kind_set=admm_gapw_env%admm_kind_set, &
2494 oce=admm_gapw_env%oce, sab=admm_env%sab_aux_fit, &
2497 CALL prepare_gapw_den(qs_env, local_rho_set=local_rho_buffer, do_rho0=.false., &
2498 kind_set_external=admm_gapw_env%admm_kind_set)
2501 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2502 xc_section_external=xc_section_aux, &
2503 rho_atom_set_external=local_rho_buffer%rho_atom_set)
2508 ener_k_ispin = 0.0_dp
2512 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux_buffer(ispin, img)%matrix, tmp)
2513 ener_k_ispin = ener_k_ispin + tmp
2518 ener_k_ispin = ener_k_ispin/2.0_dp
2520 CALL timestop(handle)
2522 END SUBROUTINE calc_spin_dep_aux_exch_ener
2533 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_orb
2534 LOGICAL,
INTENT(IN) :: scale_back
2536 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scale_dm'
2538 INTEGER :: handle, img, ispin
2542 CALL timeset(routinen, handle)
2544 NULLIFY (admm_env, dft_control)
2547 admm_env=admm_env, &
2548 dft_control=dft_control)
2551 IF (admm_env%do_admmp)
THEN
2552 DO ispin = 1, dft_control%nspins
2553 DO img = 1, dft_control%nimages
2554 IF (scale_back)
THEN
2555 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, 1.0_dp/admm_env%gsi(ispin))
2557 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, admm_env%gsi(ispin))
2563 CALL timestop(handle)
2574 SUBROUTINE calc_aux_mo_derivs_none(ispin, admm_env, mo_set, mo_coeff_aux_fit)
2575 INTEGER,
INTENT(IN) :: ispin
2578 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff_aux_fit
2580 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_aux_mo_derivs_none'
2582 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2583 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2584 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit, &
2585 matrix_ks_aux_fit_dft, &
2586 matrix_ks_aux_fit_hfx
2589 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx)
2591 CALL timeset(routinen, handle)
2593 nao_aux_fit = admm_env%nao_aux_fit
2594 nao_orb = admm_env%nao_orb
2595 nmo = admm_env%nmo(ispin)
2597 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, &
2598 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, &
2599 matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft)
2607 IF (admm_env%do_admms)
THEN
2609 CALL dbcsr_create(dbcsr_work, template=matrix_ks_aux_fit(ispin)%matrix)
2610 CALL dbcsr_copy(dbcsr_work, matrix_ks_aux_fit_hfx(ispin)%matrix)
2611 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))
2619 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2620 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
2623 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2624 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2626 scaling_factor = 2.0_dp*occupation_numbers
2630 DEALLOCATE (scaling_factor)
2632 CALL timestop(handle)
2634 END SUBROUTINE calc_aux_mo_derivs_none
2644 SUBROUTINE merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
2645 INTEGER,
INTENT(IN) :: ispin
2648 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs
2649 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2651 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_no_diag'
2653 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2654 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2656 CALL timeset(routinen, handle)
2658 nao_aux_fit = admm_env%nao_aux_fit
2659 nao_orb = admm_env%nao_orb
2660 nmo = admm_env%nmo(ispin)
2665 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2666 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2667 scaling_factor = 0.5_dp
2671 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
2672 admm_env%work_aux_nmo(ispin))
2673 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2674 1.0_dp, admm_env%K(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
2675 admm_env%work_aux_nmo2(ispin))
2677 2.0_dp, admm_env%A, admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2678 admm_env%mo_derivs_tmp(ispin))
2681 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2682 admm_env%work_orb_orb)
2684 1.0_dp, admm_env%C_hat(ispin), admm_env%work_orb_orb, 0.0_dp, &
2685 admm_env%work_aux_orb)
2686 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2687 1.0_dp, admm_env%S, admm_env%work_aux_orb, 0.0_dp, &
2688 admm_env%work_aux_nmo(ispin))
2690 -2.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 1.0_dp, &
2691 admm_env%mo_derivs_tmp(ispin))
2697 DEALLOCATE (scaling_factor)
2699 CALL timestop(handle)
2701 END SUBROUTINE merge_mo_derivs_no_diag
2713 INTEGER :: ispin, nspins
2715 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_derivs_fm
2716 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mo_derivs_aux_fit
2717 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2718 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2719 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array, mos_aux_fit
2721 NULLIFY (mo_array, mos_aux_fit, matrix_ks_aux_fit, mo_coeff_aux_fit, &
2722 mo_derivs_aux_fit, mo_coeff)
2724 CALL get_qs_env(qs_env, admm_env=admm_env, mos=mo_array)
2725 CALL get_admm_env(admm_env, mos_aux_fit=mos_aux_fit, mo_derivs_aux_fit=mo_derivs_aux_fit, &
2726 matrix_ks_aux_fit=matrix_ks_aux_fit)
2728 nspins =
SIZE(mo_derivs)
2729 ALLOCATE (mo_derivs_fm(nspins))
2730 DO ispin = 1, nspins
2731 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2732 CALL cp_fm_create(mo_derivs_fm(ispin), mo_coeff%matrix_struct)
2735 DO ispin = 1, nspins
2736 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2737 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2741 mo_derivs_fm, mo_derivs_aux_fit, matrix_ks_aux_fit)
2758 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2759 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
2761 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
2764 CALL get_qs_env(qs_env, dft_control=dft_control)
2766 IF (dft_control%do_admm_dm)
THEN
2767 cpabort(
"Forces with ADMM DM methods not implemented")
2769 IF (dft_control%do_admm_mo .AND. .NOT. qs_env%run_rtp)
THEN
2770 NULLIFY (matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, mos_aux_fit, mos, admm_env)
2774 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, mos_aux_fit=mos_aux_fit, &
2775 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
2776 DO ispin = 1, dft_control%nspins
2777 mo_set => mos(ispin)
2778 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff)
2781 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2782 CALL calc_aux_mo_derivs_none(ispin, qs_env%admm_env, mo_set, mo_coeff_aux_fit)
2797 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_admm_ovlp_forces_kp'
2799 COMPLEX(dp) ::
fac, fac2
2800 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
2801 ispin, kplocal, nao_aux_fit, nao_orb, &
2802 natom, nimg, nkp, nkp_groups, nspins
2803 INTEGER,
DIMENSION(2) :: kp_range
2804 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
2805 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2806 LOGICAL :: gapw, my_kpgrp, use_real_wfn
2807 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
2808 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
2812 TYPE(
cp_cfm_type) :: ca, ckmatrix, cpmatrix, cq, cs, cs_inv, &
2813 cwork_aux_aux, cwork_aux_orb, &
2817 TYPE(
cp_fm_type) :: fmdummy, s_inv, work_aux_aux, &
2818 work_aux_aux2, work_aux_aux3, &
2820 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_skap, fm_skapa
2821 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fmwork
2822 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
2823 matrix_ks_aux_fit_hfx, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_skap, &
2824 matrix_skapa, rho_ao_orb
2826 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: kmatrix
2832 POINTER :: sab_aux_fit, sab_aux_fit_asymm, &
2833 sab_aux_fit_vs_orb, sab_kp
2838 CALL timeset(routinen, handle)
2846 NULLIFY (ks_env, admm_env, matrix_ks_aux_fit, &
2847 matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, rho, force, &
2848 para_env, atomic_kind_set, kpoints, sab_aux_fit, &
2849 sab_aux_fit_vs_orb, sab_aux_fit_asymm, struct_orb_orb, &
2850 struct_aux_orb, struct_aux_aux)
2854 admm_env=admm_env, &
2855 dft_control=dft_control, &
2858 atomic_kind_set=atomic_kind_set, &
2861 nimg = dft_control%nimages
2863 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
2864 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
2865 sab_aux_fit=sab_aux_fit, &
2866 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb, &
2867 sab_aux_fit_asymm=sab_aux_fit_asymm, &
2868 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
2869 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
2870 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2872 gapw = admm_env%do_gapw
2873 nao_aux_fit = admm_env%nao_aux_fit
2874 nao_orb = admm_env%nao_orb
2875 nspins = dft_control%nspins
2877 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
2878 nkp_groups=nkp_groups, kp_dist=kp_dist, &
2879 cell_to_index=cell_to_index, sab_nl=sab_kp)
2882 IF (admm_env%do_admms)
THEN
2884 NULLIFY (matrix_ks_aux_fit)
2885 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2886 DO img = 1, dft_control%nimages
2887 DO ispin = 1, nspins
2888 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2889 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2890 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2891 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2892 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2893 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2900 ALLOCATE (kmatrix(2))
2901 CALL dbcsr_create(kmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2902 matrix_type=dbcsr_type_symmetric)
2903 CALL dbcsr_create(kmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2904 matrix_type=dbcsr_type_antisymmetric)
2905 CALL dbcsr_create(kmatrix_tmp, template=matrix_ks_aux_fit(1, 1)%matrix, &
2906 matrix_type=dbcsr_type_no_symmetry)
2910 kplocal = kp_range(2) - kp_range(1) + 1
2911 para_env => kpoints%blacs_env_all%para_env
2912 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
2914 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2915 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2921 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2922 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2925 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2926 nrow_global=nao_orb, ncol_global=nao_orb)
2929 IF (.NOT. use_real_wfn)
THEN
2944 ALLOCATE (fm_skap(kplocal, 2, nspins), fm_skapa(kplocal, 2, nspins))
2945 DO ispin = 1, nspins
2948 CALL cp_fm_create(fm_skap(ikp, i, ispin), struct_aux_orb)
2949 CALL cp_fm_create(fm_skapa(ikp, i, ispin), struct_aux_aux)
2960 DO ispin = 1, nspins
2961 DO igroup = 1, nkp_groups
2963 ik = kp_dist(1, igroup) + ikp - 1
2964 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2968 IF (use_real_wfn)
THEN
2970 CALL rskp_transform(rmatrix=kmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2971 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2977 CALL rskp_transform(rmatrix=kmatrix(1), cmatrix=kmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2978 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2987 IF (.NOT. use_real_wfn) &
2991 IF (.NOT. use_real_wfn) &
3000 DO ispin = 1, nspins
3001 DO igroup = 1, nkp_groups
3003 ik = kp_dist(1, igroup) + ikp - 1
3004 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3008 IF (.NOT. use_real_wfn)
THEN
3010 CALL cp_fm_to_cfm(work_aux_aux, work_aux_aux2, ckmatrix)
3014 kp => kpoints%kp_aux_env(ikp)%kpoint_env
3016 IF (use_real_wfn)
THEN
3026 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, 1.0_dp, s_inv, &
3027 work_aux_aux, 0.0_dp, work_aux_aux3)
3028 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, work_aux_aux3, &
3029 kp%amat(1, 1), 0.0_dp, work_aux_orb)
3030 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, work_aux_orb, &
3031 kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), 0.0_dp, &
3032 fm_skap(ikp, 1, ispin))
3033 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, fm_skap(ikp, 1, ispin), &
3034 kp%amat(1, 1), 0.0_dp, fm_skapa(ikp, 1, ispin))
3038 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3042 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
3047 IF (admm_env%do_admmp)
THEN
3051 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
3052 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
3056 CALL cp_fm_to_cfm(kp%smat(1, 1), kp%smat(2, 1), cs_inv)
3062 CALL cp_fm_to_cfm(kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), &
3063 kpoints%kp_env(ikp)%kpoint_env%pmat(2, ispin), &
3070 ckmatrix,
z_zero, cwork_aux_aux)
3071 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit,
z_one, cwork_aux_aux, &
3072 ca,
z_zero, cwork_aux_orb)
3074 cpmatrix,
z_zero, cwork_aux_orb2)
3075 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb2, &
3076 ca,
z_zero, cwork_aux_aux)
3078 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3083 fac = cmplx(0.5_dp*admm_env%lambda_merlot(ispin)*admm_env%gsi(ispin), 0.0_dp,
dp)
3086 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
fac, cwork_aux_orb, &
3087 ca,
z_one, cwork_aux_aux)
3090 CALL cp_cfm_to_fm(cwork_aux_orb2, mtargetr=fm_skap(ikp, 1, ispin), mtargeti=fm_skap(ikp, 2, ispin))
3091 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=fm_skapa(ikp, 1, ispin), mtargeti=fm_skapa(ikp, 2, ispin))
3100 DO ispin = 1, nspins
3101 DO igroup = 1, nkp_groups
3103 ik = kp_dist(1, igroup) + ikp - 1
3104 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3122 IF (.NOT. use_real_wfn)
THEN
3135 ALLOCATE (matrix_skap(nspins, nimg), matrix_skapa(nspins, nimg))
3137 DO ispin = 1, nspins
3138 ALLOCATE (matrix_skap(ispin, img)%matrix)
3139 CALL dbcsr_create(matrix_skap(ispin, img)%matrix, template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3140 matrix_type=dbcsr_type_no_symmetry)
3143 ALLOCATE (matrix_skapa(ispin, img)%matrix)
3144 CALL dbcsr_create(matrix_skapa(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix, &
3145 matrix_type=dbcsr_type_no_symmetry)
3150 ALLOCATE (fmwork(2))
3151 CALL cp_fm_get_info(admm_env%work_aux_orb, matrix_struct=struct_aux_orb)
3155 matrix_s_aux_fit_vs_orb(1, 1)%matrix, sab_aux_fit_vs_orb, &
3156 fmwork, for_aux_fit=.true., pmat_ext=fm_skap)
3160 CALL cp_fm_get_info(admm_env%work_aux_aux, matrix_struct=struct_aux_aux)
3164 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit_asymm, &
3165 fmwork, for_aux_fit=.true., pmat_ext=fm_skapa)
3171 DO ispin = 1, nspins
3172 CALL dbcsr_scale(matrix_skap(ispin, img)%matrix, -2.0_dp)
3173 CALL dbcsr_scale(matrix_skapa(ispin, img)%matrix, 2.0_dp)
3175 IF (nspins == 2)
THEN
3176 CALL dbcsr_add(matrix_skap(1, img)%matrix, matrix_skap(2, img)%matrix, 1.0_dp, 1.0_dp)
3177 CALL dbcsr_add(matrix_skapa(1, img)%matrix, matrix_skapa(2, img)%matrix, 1.0_dp, 1.0_dp)
3181 ALLOCATE (admm_force(3, natom))
3184 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3187 DO ispin = 1, nspins
3188 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -admm_env%lambda_merlot(ispin))
3190 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, 1.0_dp)
3194 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"ORB", basis_type_b=
"ORB", &
3195 sab_nl=sab_kp, matrixkp_p=rho_ao_orb(1, :))
3197 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, -1.0_dp)
3198 DO ispin = 1, nspins
3199 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3204 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3205 sab_nl=sab_aux_fit_vs_orb, matrixkp_p=matrix_skap(1, :))
3206 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3207 sab_nl=sab_aux_fit_asymm, matrixkp_p=matrix_skapa(1, :))
3209 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3210 DEALLOCATE (admm_force)
3212 DO ispin = 1, nspins
3223 IF (admm_env%do_admms)
THEN
3227 CALL timestop(handle)
3240 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_hz, matrix_pz
3241 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: fval
3243 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_projection_derivative'
3245 INTEGER :: handle, ispin, nao, natom, naux, nspins
3246 REAL(kind=
dp) :: my_fval
3247 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3250 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3251 TYPE(
dbcsr_type),
POINTER :: matrix_w_q, matrix_w_s
3253 POINTER :: sab_aux_fit_asymm, sab_aux_fit_vs_orb
3257 CALL timeset(routinen, handle)
3259 cpassert(
ASSOCIATED(qs_env))
3261 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
3262 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, sab_aux_fit_asymm=sab_aux_fit_asymm, &
3263 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3266 IF (
PRESENT(fval)) my_fval = fval
3268 ALLOCATE (matrix_w_q)
3269 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3272 ALLOCATE (matrix_w_s)
3273 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3274 name=
'W MATRIX AUX S', &
3275 matrix_type=dbcsr_type_no_symmetry)
3278 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3279 natom=natom, force=force)
3280 ALLOCATE (admm_force(3, natom))
3283 nspins =
SIZE(matrix_pz)
3284 nao = admm_env%nao_orb
3285 naux = admm_env%nao_aux_fit
3289 DO ispin = 1, nspins
3291 CALL parallel_gemm(
"N",
"T", naux, naux, naux, 1.0_dp, admm_env%s_inv, &
3292 admm_env%work_aux_aux, 0.0_dp, admm_env%work_aux_aux2)
3293 CALL parallel_gemm(
"N",
"N", naux, nao, naux, 1.0_dp, admm_env%work_aux_aux2, &
3294 admm_env%A, 0.0_dp, admm_env%work_aux_orb)
3297 CALL parallel_gemm(
"N",
"N", naux, nao, nao, 1.0_dp, admm_env%work_aux_orb, &
3298 admm_env%work_orb_orb, 1.0_dp, admm_env%work_aux_orb2)
3301 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb2, matrix_w_q, keep_sparsity=.true.)
3304 CALL parallel_gemm(
"N",
"T", naux, naux, nao, 1.0_dp, admm_env%work_aux_orb2, &
3305 admm_env%A, 0.0_dp, admm_env%work_aux_aux)
3306 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3312 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3313 sab_nl=sab_aux_fit_asymm, matrix_p=matrix_w_s)
3315 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3316 sab_nl=sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3319 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3321 DEALLOCATE (admm_force)
3325 CALL timestop(handle)
3360 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_mixed_overlap_force'
3362 INTEGER :: handle, ispin, iw, nao_aux_fit, nao_orb, &
3363 natom, neighbor_list_id, nmo
3364 LOGICAL :: omit_headers
3365 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3370 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit, &
3371 matrix_s_aux_fit_vs_orb, rho_ao, &
3373 TYPE(
dbcsr_type),
POINTER :: matrix_rho_aux_desymm_tmp, matrix_w_q, &
3385 CALL timeset(routinen, handle)
3387 NULLIFY (admm_env, logger, dft_control, para_env, mos, mo_coeff, matrix_w_q, matrix_w_s, &
3388 rho, rho_aux_fit, energy, sab_orb, ks_env, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_s)
3391 admm_env=admm_env, &
3393 dft_control=dft_control, &
3394 matrix_s=matrix_s, &
3395 neighbor_list_id=neighbor_list_id, &
3401 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, rho_aux_fit=rho_aux_fit, &
3402 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
3408 nao_aux_fit = admm_env%nao_aux_fit
3409 nao_orb = admm_env%nao_orb
3414 IF (admm_env%block_dm)
THEN
3415 cpabort(
"ADMM Forces not implemented for blocked projection methods!")
3420 cpabort(
"ADMM Forces only implemented without purification or for MO_DIAG.")
3425 ALLOCATE (matrix_w_s)
3426 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3427 name=
'W MATRIX AUX S', &
3428 matrix_type=dbcsr_type_no_symmetry)
3431 ALLOCATE (matrix_w_q)
3432 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3435 DO ispin = 1, dft_control%nspins
3436 nmo = admm_env%nmo(ispin)
3437 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
3441 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3442 1.0_dp, admm_env%S_inv, admm_env%mo_derivs_aux_fit(ispin), 0.0_dp, &
3443 admm_env%work_aux_nmo(ispin))
3446 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3447 1.0_dp, admm_env%S_inv, admm_env%H(ispin), 0.0_dp, &
3448 admm_env%work_aux_nmo(ispin))
3453 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
3454 admm_env%work_aux_nmo2(ispin))
3458 -1.0_dp, admm_env%work_aux_nmo2(ispin), mo_coeff, 0.0_dp, &
3459 admm_env%work_aux_orb)
3462 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3463 -1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
3464 admm_env%work_aux_aux)
3469 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3470 admm_env%work_orb_nmo(ispin))
3473 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3474 admm_env%work_orb_orb)
3476 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3477 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3478 admm_env%work_aux_orb)
3482 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3483 admm_env%work_orb_nmo(ispin))
3486 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3487 admm_env%work_orb_orb)
3489 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3490 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3491 admm_env%work_aux_orb)
3497 IF (admm_env%do_admms)
THEN
3499 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3501 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3502 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3505 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3506 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3507 admm_env%work_aux_orb)
3510 ELSE IF (admm_env%do_admmp)
THEN
3511 CALL cp_fm_scale(admm_env%gsi(ispin)**2, admm_env%work_aux_orb)
3514 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3515 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3518 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3519 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3520 admm_env%work_aux_orb)
3523 ELSE IF (admm_env%do_admmq)
THEN
3525 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3527 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3528 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3531 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3532 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3533 admm_env%work_aux_orb)
3537 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb, matrix_w_q, keep_sparsity=.true.)
3541 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3542 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
3543 admm_env%work_aux_orb)
3545 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3546 1.0_dp, admm_env%work_aux_orb, admm_env%A, 1.0_dp, &
3547 admm_env%work_aux_aux)
3551 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3554 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3557 NULLIFY (matrix_rho_aux_desymm_tmp)
3558 ALLOCATE (matrix_rho_aux_desymm_tmp)
3559 CALL dbcsr_create(matrix_rho_aux_desymm_tmp, template=matrix_s_aux_fit(1)%matrix, &
3560 name=
'Rho_aux non-symm', &
3561 matrix_type=dbcsr_type_no_symmetry)
3567 IF (admm_env%do_admms .OR. admm_env%do_admmq)
THEN
3569 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3570 -admm_env%lambda_merlot(ispin))
3573 ELSE IF (admm_env%do_admmp)
THEN
3575 CALL dbcsr_scale(matrix_w_s, admm_env%gsi(ispin)**2)
3576 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3577 (-admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin))
3587 ALLOCATE (admm_force(3, natom))
3590 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3591 sab_nl=admm_env%sab_aux_fit_asymm, matrix_p=matrix_w_s)
3593 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3594 sab_nl=admm_env%sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3597 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3598 CALL dbcsr_scale(rho_ao(ispin)%matrix, -admm_env%lambda_merlot(ispin))
3600 basis_type_a=
"ORB", basis_type_b=
"ORB", &
3601 sab_nl=sab_orb, matrix_p=rho_ao(ispin)%matrix)
3602 CALL dbcsr_scale(rho_ao(ispin)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3606 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3608 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3609 DEALLOCATE (admm_force)
3611 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
3613 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3617 para_env, output_unit=iw, omit_headers=omit_headers)
3619 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3622 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3626 para_env, output_unit=iw, omit_headers=omit_headers)
3628 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3637 CALL timestop(handle)
3651 SUBROUTINE calculate_dm_mo_no_diag(admm_env, mo_set, density_matrix, overlap_matrix, &
3652 density_matrix_large, overlap_matrix_large, ispin)
3655 TYPE(
dbcsr_type),
POINTER :: density_matrix, overlap_matrix, &
3656 density_matrix_large, &
3657 overlap_matrix_large
3660 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_dm_mo_no_diag'
3662 INTEGER :: handle, nao_aux_fit, nmo
3663 REAL(kind=
dp) :: alpha, nel_tmp_aux
3667 CALL timeset(routinen, handle)
3670 nao_aux_fit = admm_env%nao_aux_fit
3671 nmo = admm_env%nmo(ispin)
3672 CALL cp_fm_to_fm(admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin))
3673 CALL cp_fm_column_scale(admm_env%work_aux_nmo(ispin), mo_set%occupation_numbers(1:mo_set%homo))
3676 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
3677 admm_env%work_aux_nmo2(ispin))
3680 IF (.NOT. mo_set%uniform_occupation)
THEN
3683 matrix_v=admm_env%C_hat(ispin), &
3684 matrix_g=admm_env%work_aux_nmo2(ispin), &
3691 matrix_v=admm_env%C_hat(ispin), &
3692 matrix_g=admm_env%work_aux_nmo2(ispin), &
3700 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3704 admm_env%n_large_basis(3) = 0.0_dp
3708 CALL dbcsr_dot(density_matrix_large, overlap_matrix_large, admm_env%n_large_basis(ispin))
3709 admm_env%n_large_basis(3) = admm_env%n_large_basis(3) + admm_env%n_large_basis(ispin)
3711 CALL dbcsr_dot(density_matrix, overlap_matrix, nel_tmp_aux)
3712 admm_env%gsi(ispin) = admm_env%n_large_basis(ispin)/nel_tmp_aux
3714 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3716 CALL dbcsr_scale(density_matrix, admm_env%gsi(ispin))
3721 CALL timestop(handle)
3723 END SUBROUTINE calculate_dm_mo_no_diag
3733 SUBROUTINE blockify_density_matrix(admm_env, density_matrix, density_matrix_aux, &
3736 TYPE(
dbcsr_type),
POINTER :: density_matrix, density_matrix_aux
3737 INTEGER :: ispin, nspins
3739 CHARACTER(len=*),
PARAMETER :: routinen =
'blockify_density_matrix'
3741 INTEGER :: handle, iatom, jatom
3743 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block, sparse_block_aux
3746 CALL timeset(routinen, handle)
3749 CALL dbcsr_set(density_matrix_aux, 0.0_dp)
3755 IF (admm_env%block_map(iatom, jatom) == 1)
THEN
3757 row=iatom, col=jatom, block=sparse_block_aux, found=found)
3759 sparse_block_aux = sparse_block
3766 CALL copy_dbcsr_to_fm(density_matrix_aux, admm_env%P_to_be_purified(ispin))
3769 IF (nspins == 1)
THEN
3770 CALL cp_fm_scale(0.5_dp, admm_env%P_to_be_purified(ispin))
3773 CALL timestop(handle)
3774 END SUBROUTINE blockify_density_matrix
3781 ELEMENTAL FUNCTION delta(x)
3782 REAL(kind=
dp),
INTENT(IN) :: x
3783 REAL(kind=
dp) :: delta
3785 IF (x == 0.0_dp)
THEN
3798 ELEMENTAL FUNCTION heaviside(x)
3799 REAL(kind=
dp),
INTENT(IN) :: x
3800 REAL(kind=
dp) :: heaviside
3802 IF (x < 0.0_dp)
THEN
3807 END FUNCTION heaviside
3818 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: dm_admm
3820 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_aux_response_density'
3822 INTEGER :: handle, ispin, nao, nao_aux, ncol, nspins
3826 CALL timeset(routinen, handle)
3828 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
3830 nspins = dft_control%nspins
3832 cpassert(
ASSOCIATED(admm_env%A))
3833 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
3834 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
3835 cpassert(
ASSOCIATED(admm_env%work_aux_aux))
3836 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
3839 CALL cp_fm_get_info(admm_env%work_orb_orb, nrow_global=nao, ncol_global=ncol)
3840 DO ispin = 1, nspins
3842 CALL parallel_gemm(
'N',
'N', nao_aux, ncol, nao, 1.0_dp, admm_env%A, &
3843 admm_env%work_orb_orb, 0.0_dp, admm_env%work_aux_orb)
3844 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%A, &
3845 admm_env%work_aux_orb, 0.0_dp, admm_env%work_aux_aux)
3846 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, dm_admm(ispin)%matrix, keep_sparsity=.true.)
3849 CALL timestop(handle)
3860 LOGICAL :: calculate_forces
3862 INTEGER :: ic, igroup, ik, ikp, indx, kplocal, &
3863 nao_aux_fit, nao_orb, nc, nkp, &
3865 INTEGER,
DIMENSION(2) :: kp_range
3866 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
3867 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
3868 LOGICAL :: my_kpgrp, use_real_wfn
3869 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
3872 TYPE(
cp_cfm_type) :: cmat_aux_fit, cmat_aux_fit_vs_orb, &
3873 cwork_aux_fit, cwork_aux_fit_vs_orb
3875 matrix_struct_aux_fit_vs_orb
3877 imat_aux_fit_vs_orb, rmat_aux_fit, &
3878 rmat_aux_fit_vs_orb, work_aux_fit
3879 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
3880 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3881 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: dbcsr_aux_fit, dbcsr_aux_fit_vs_orb
3886 POINTER :: sab_aux_fit, sab_aux_fit_vs_orb
3888 NULLIFY (xkp, kp_dist, para_env_local, cell_to_index, admm_env, kp, &
3889 kpoints, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, sab_aux_fit, sab_aux_fit_vs_orb, &
3890 para_env_global, matrix_struct_aux_fit, matrix_struct_aux_fit_vs_orb)
3892 CALL get_qs_env(qs_env, kpoints=kpoints, admm_env=admm_env)
3894 CALL get_admm_env(admm_env, matrix_s_aux_fit_kp=matrix_s_aux_fit, &
3895 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
3896 sab_aux_fit=sab_aux_fit, &
3897 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3899 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
3900 nkp_groups=nkp_groups, kp_dist=kp_dist, cell_to_index=cell_to_index)
3901 kplocal = kp_range(2) - kp_range(1) + 1
3903 IF (.NOT. use_real_wfn) nc = 2
3905 ALLOCATE (dbcsr_aux_fit(3))
3906 CALL dbcsr_create(dbcsr_aux_fit(1), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
3907 CALL dbcsr_create(dbcsr_aux_fit(2), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
3908 CALL dbcsr_create(dbcsr_aux_fit(3), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
3912 ALLOCATE (dbcsr_aux_fit_vs_orb(2))
3913 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(1), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3914 matrix_type=dbcsr_type_no_symmetry)
3915 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(2), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3916 matrix_type=dbcsr_type_no_symmetry)
3921 nao_aux_fit = admm_env%nao_aux_fit
3922 nao_orb = admm_env%nao_orb
3923 para_env_global => kpoints%blacs_env_all%para_env
3925 ALLOCATE (fmwork(4))
3926 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env_all, para_env=para_env_global, &
3927 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3932 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env_all, para_env=para_env_global, &
3933 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3934 CALL cp_fm_create(fmwork(3), matrix_struct_aux_fit_vs_orb)
3935 CALL cp_fm_create(fmwork(4), matrix_struct_aux_fit_vs_orb)
3939 nao_aux_fit = admm_env%nao_aux_fit
3940 nao_orb = admm_env%nao_orb
3941 para_env_local => kpoints%blacs_env%para_env
3943 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env, para_env=para_env_local, &
3944 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3951 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env, para_env=para_env_local, &
3952 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3953 CALL cp_fm_create(rmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3954 CALL cp_fm_create(imat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3955 CALL cp_cfm_create(cwork_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3956 CALL cp_cfm_create(cmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3958 ALLOCATE (info(kplocal*nkp_groups, 4))
3963 DO igroup = 1, nkp_groups
3964 ik = kp_dist(1, igroup) + ikp - 1
3965 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3968 IF (use_real_wfn)
THEN
3970 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3971 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), rsmat=matrix_s_aux_fit, ispin=1, &
3972 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3977 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3978 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), rsmat=matrix_s_aux_fit_vs_orb, ispin=1, &
3979 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
3983 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3984 CALL dbcsr_set(dbcsr_aux_fit(2), 0.0_dp)
3985 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), cmatrix=dbcsr_aux_fit(2), rsmat=matrix_s_aux_fit, &
3986 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3993 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3994 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(2), 0.0_dp)
3995 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), cmatrix=dbcsr_aux_fit_vs_orb(2), &
3996 rsmat=matrix_s_aux_fit_vs_orb, ispin=1, xkp=xkp(1:3, ik), &
3997 cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
4005 IF (.NOT. use_real_wfn)
THEN
4012 IF (.NOT. use_real_wfn)
THEN
4024 DO igroup = 1, nkp_groups
4025 ik = kp_dist(1, igroup) + ikp - 1
4026 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
4032 IF (.NOT. use_real_wfn)
THEN
4039 kp => kpoints%kp_aux_env(ikp)%kpoint_env
4043 ALLOCATE (kp%amat(nc, 1))
4045 CALL cp_fm_create(kp%amat(ic, 1), matrix_struct_aux_fit_vs_orb)
4049 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms .OR. calculate_forces)
THEN
4051 ALLOCATE (kp%smat(nc, 1))
4053 CALL cp_fm_create(kp%smat(ic, 1), matrix_struct_aux_fit)
4056 IF (.NOT. use_real_wfn)
CALL cp_fm_to_fm(imat_aux_fit, kp%smat(2, 1))
4059 IF (use_real_wfn)
THEN
4066 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, &
4067 rmat_aux_fit, rmat_aux_fit_vs_orb, 0.0_dp, kp%amat(1, 1))
4071 CALL cp_fm_to_cfm(rmat_aux_fit, imat_aux_fit, cmat_aux_fit)
4077 CALL cp_fm_to_cfm(rmat_aux_fit_vs_orb, imat_aux_fit_vs_orb, cmat_aux_fit_vs_orb)
4079 cmat_aux_fit, cmat_aux_fit_vs_orb,
z_zero, cwork_aux_fit_vs_orb)
4080 CALL cp_cfm_to_fm(cwork_aux_fit_vs_orb, kp%amat(1, 1), kp%amat(2, 1))
4087 DO igroup = 1, nkp_groups
4088 ik = kp_dist(1, igroup) + ikp - 1
4089 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
4095 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)
Fill the ADMM overlp and basis change matrices in the KP env based on the real-space array.
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_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_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_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
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_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)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
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_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)
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)
...
basic linear algebra operations for full matrices
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
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_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
...
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
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_invert(matrix, n, info_out)
used to replace the cholesky decomposition by the inverse
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_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
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Routines needed for kpoint calculation.
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_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
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)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), 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, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
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)
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, gradient_atom_set, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
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.