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)
239 basis_type =
"AUX_FIT"
240 task_list => admm_env%task_list_aux_fit
242 basis_type =
"AUX_FIT_SOFT"
243 task_list => admm_env%admm_gapw_env%task_list
247 matrix_p=rho_ao_aux(ispin)%matrix, &
248 rho=rho_r_aux(ispin), &
249 rho_gspace=rho_g_aux(ispin), &
250 total_rho=tot_rho_r_aux(ispin), &
251 soft_valid=.false., &
252 basis_type=basis_type, &
253 task_list_external=task_list)
261 rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
262 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
263 oce=admm_env%admm_gapw_env%oce, sab=admm_env%sab_aux_fit, para_env=para_env)
265 CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, &
266 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
269 IF (dft_control%nspins == 1)
THEN
270 admm_env%gsi(3) = admm_env%gsi(1)
272 admm_env%gsi(3) = (admm_env%gsi(1) + admm_env%gsi(2))/2.0_dp
275 CALL qs_rho_set(rho_aux_fit, rho_r_valid=.true., rho_g_valid=.true.)
277 CALL timestop(handle)
288 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_mo_calc_rho_aux_kp'
290 CHARACTER(LEN=default_string_length) :: basis_type
291 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
292 ispin, kplocal, nao_aux_fit, nao_orb, &
293 natom, nkp, nkp_groups, nmo, nspins
294 INTEGER,
DIMENSION(2) :: kp_range
295 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
296 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
297 LOGICAL :: gapw, my_kpgrp, pmat_from_rs, &
299 REAL(
dp) :: maxval_mos, nelec_aux(2), nelec_orb(2), &
301 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occ_num, occ_num_aux, tot_rho_r_aux
302 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
305 TYPE(
cp_cfm_type) :: ca, cmo_coeff, cmo_coeff_aux_fit, &
306 cpmatrix, cwork_aux_aux, cwork_aux_orb
308 struct_aux_aux, struct_aux_orb, &
310 TYPE(
cp_fm_type) :: fmdummy, work_aux_orb, work_orb_orb, &
312 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
314 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, matrix_s_aux_fit, rho_ao_aux, &
317 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: pmatrix
321 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
322 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_aux_fit_kp, mos_kp
325 POINTER :: sab_aux_fit, sab_kp
333 CALL timeset(routinen, handle)
335 NULLIFY (ks_env, admm_env, mos, mos_aux_fit, matrix_s, rho_orb, &
336 matrix_s_aux_fit, rho_aux_fit, rho_ao_orb, &
337 para_env, rho_g_aux, rho_r_aux, rho_ao_aux, tot_rho_r_aux, &
338 kpoints, sab_aux_fit, sab_kp, kp, &
339 struct_orb_orb, struct_aux_orb, struct_aux_aux, mo_struct, mo_struct_aux_fit)
344 dft_control=dft_control, &
348 matrix_s_kp=matrix_s, &
351 rho_aux_fit=rho_aux_fit, &
352 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
353 sab_aux_fit=sab_aux_fit)
354 gapw = admm_env%do_gapw
357 rho_ao_kp=rho_ao_aux, &
360 tot_rho_r=tot_rho_r_aux)
362 CALL qs_rho_get(rho_orb, rho_ao_kp=rho_ao_orb)
363 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
364 nkp_groups=nkp_groups, kp_dist=kp_dist, &
365 cell_to_index=cell_to_index, sab_nl=sab_kp)
369 ALLOCATE (pmatrix(2))
370 CALL dbcsr_create(pmatrix(1), template=matrix_s(1, 1)%matrix, &
371 matrix_type=dbcsr_type_symmetric)
372 CALL dbcsr_create(pmatrix(2), template=matrix_s(1, 1)%matrix, &
373 matrix_type=dbcsr_type_antisymmetric)
374 CALL dbcsr_create(pmatrix_tmp, template=matrix_s(1, 1)%matrix, &
375 matrix_type=dbcsr_type_no_symmetry)
379 nao_aux_fit = admm_env%nao_aux_fit
380 nao_orb = admm_env%nao_orb
381 nspins = dft_control%nspins
384 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
385 nrow_global=nao_orb, ncol_global=nao_orb)
389 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
390 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
392 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
393 nrow_global=nao_aux_fit, ncol_global=nao_orb)
396 IF (.NOT. use_real_wfn)
THEN
410 CALL get_kpoint_env(kpoints%kp_aux_env(1)%kpoint_env, mos=mos_aux_fit_kp)
411 mos => mos_aux_fit_kp(1, :)
412 CALL get_mo_set(mos(1), mo_coeff=mo_coeff_aux_fit)
413 CALL cp_fm_get_info(mo_coeff_aux_fit, matrix_struct=mo_struct_aux_fit)
421 para_env => kpoints%blacs_env_all%para_env
422 kplocal = kp_range(2) - kp_range(1) + 1
430 DO igroup = 1, nkp_groups
432 ik = kp_dist(1, igroup) + ikp - 1
433 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
438 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
439 maxval_mos = max(maxval_mos, maxval(abs(mo_coeff%local_data)))
441 IF (.NOT. use_real_wfn)
THEN
443 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
444 maxval_mos = max(maxval_mos, maxval(abs(mo_coeff%local_data)))
449 CALL para_env%sum(maxval_mos)
451 pmat_from_rs = .false.
452 IF (maxval_mos < epsilon(0.0_dp)) pmat_from_rs = .true.
456 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
459 IF (pmat_from_rs)
THEN
462 DO igroup = 1, nkp_groups
464 ik = kp_dist(1, igroup) + ikp - 1
465 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
469 IF (use_real_wfn)
THEN
471 CALL rskp_transform(rmatrix=pmatrix(1), rsmat=rho_ao_orb, ispin=ispin, &
472 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
478 CALL rskp_transform(rmatrix=pmatrix(1), cmatrix=pmatrix(2), rsmat=rho_ao_orb, ispin=ispin, &
479 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_kp)
488 IF (.NOT. use_real_wfn)
THEN
493 IF (.NOT. use_real_wfn)
THEN
505 DO igroup = 1, nkp_groups
507 ik = kp_dist(1, igroup) + ikp - 1
508 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
510 IF (my_kpgrp .AND. pmat_from_rs)
THEN
512 IF (.NOT. use_real_wfn)
THEN
514 CALL cp_fm_to_cfm(work_orb_orb, work_orb_orb2, cpmatrix)
519 IF (use_real_wfn)
THEN
521 nmo = admm_env%nmo(ispin)
524 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
526 mos_aux_fit => mos_aux_fit_kp(1, :)
528 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num)
529 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
530 occupation_numbers=occ_num_aux)
532 kp => kpoints%kp_aux_env(ikp)%kpoint_env
533 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_orb, 1.0_dp, kp%amat(1, 1), &
534 mo_coeff, 0.0_dp, mo_coeff_aux_fit)
536 occ_num_aux(1:nmo) = occ_num(1:nmo)
538 IF (pmat_from_rs)
THEN
540 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, kp%amat(1, 1), &
541 work_orb_orb, 0.0_dp, work_aux_orb)
542 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, work_aux_orb, &
543 kp%amat(1, 1), 0.0_dp, kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin))
549 nmo = admm_env%nmo(ispin)
552 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
555 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
559 kp => kpoints%kp_aux_env(ikp)%kpoint_env
565 CALL get_kpoint_env(kpoints%kp_aux_env(ikp)%kpoint_env, mos=mos_aux_fit_kp)
566 mos_aux_fit => mos_aux_fit_kp(1, :)
567 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
568 CALL cp_cfm_to_fm(cmo_coeff_aux_fit, mtargetr=mo_coeff_aux_fit)
569 mos_aux_fit => mos_aux_fit_kp(2, :)
570 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
571 CALL cp_cfm_to_fm(cmo_coeff_aux_fit, mtargeti=mo_coeff_aux_fit)
575 CALL get_mo_set(mos(ispin), occupation_numbers=occ_num)
576 mos_aux_fit => mos_aux_fit_kp(i, :)
577 CALL get_mo_set(mos_aux_fit(ispin), occupation_numbers=occ_num_aux)
578 occ_num_aux(:) = occ_num(:)
581 IF (pmat_from_rs)
THEN
583 cpmatrix,
z_zero, cwork_aux_orb)
584 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb, &
585 ca,
z_zero, cwork_aux_aux)
587 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(1, ispin), &
588 mtargeti=kpoints%kp_aux_env(ikp)%kpoint_env%pmat(2, ispin))
596 IF (pmat_from_rs)
THEN
600 DO igroup = 1, nkp_groups
602 ik = kp_dist(1, igroup) + ikp - 1
603 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
621 IF (.NOT. use_real_wfn)
THEN
632 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit, &
633 admm_env%scf_work_aux_fit, for_aux_fit=.true.)
636 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
642 admm_env%n_large_basis = 0.0_dp
645 DO img = 1, dft_control%nimages
646 DO ispin = 1, dft_control%nspins
647 CALL dbcsr_dot(rho_ao_orb(ispin, img)%matrix, matrix_s(1, img)%matrix, tmp)
648 nelec_orb(ispin) = nelec_orb(ispin) + tmp
649 CALL dbcsr_dot(rho_ao_aux(ispin, img)%matrix, matrix_s_aux_fit(1, img)%matrix, tmp)
650 nelec_aux(ispin) = nelec_aux(ispin) + tmp
654 DO ispin = 1, dft_control%nspins
655 admm_env%n_large_basis(ispin) = nelec_orb(ispin)
656 admm_env%gsi(ispin) = nelec_orb(ispin)/nelec_aux(ispin)
659 IF (admm_env%charge_constrain)
THEN
660 DO img = 1, dft_control%nimages
661 DO ispin = 1, dft_control%nspins
662 CALL dbcsr_scale(rho_ao_aux(ispin, img)%matrix, admm_env%gsi(ispin))
667 IF (dft_control%nspins == 1)
THEN
668 admm_env%gsi(3) = admm_env%gsi(1)
670 admm_env%gsi(3) = (admm_env%gsi(1) + admm_env%gsi(2))/2.0_dp
674 basis_type =
"AUX_FIT"
675 task_list => admm_env%task_list_aux_fit
677 basis_type =
"AUX_FIT_SOFT"
678 task_list => admm_env%admm_gapw_env%task_list
682 rho_ao => rho_ao_aux(ispin, :)
684 matrix_p_kp=rho_ao, &
685 rho=rho_r_aux(ispin), &
686 rho_gspace=rho_g_aux(ispin), &
687 total_rho=tot_rho_r_aux(ispin), &
688 soft_valid=.false., &
689 basis_type=basis_type, &
690 task_list_external=task_list)
695 rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
696 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
697 oce=admm_env%admm_gapw_env%oce, &
698 sab=admm_env%sab_aux_fit, para_env=para_env)
700 CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, &
701 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
704 CALL qs_rho_set(rho_aux_fit, rho_r_valid=.true., rho_g_valid=.true.)
706 CALL timestop(handle)
718 LOGICAL,
INTENT(IN) :: calculate_forces
720 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_update_ks_atom'
722 INTEGER :: handle, img, ispin
723 REAL(
dp) :: force_fac(2)
725 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, &
726 matrix_ks_aux_fit_dft, &
727 matrix_ks_aux_fit_hfx, rho_ao_aux
731 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, rho_ao_aux, rho_aux_fit)
732 NULLIFY (admm_env, dft_control)
734 CALL timeset(routinen, handle)
736 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
737 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
738 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
739 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
740 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
744 IF (admm_env%do_admms)
THEN
745 DO ispin = 1, dft_control%nspins
746 force_fac(ispin) = admm_env%gsi(ispin)**(2.0_dp/3.0_dp)
748 ELSE IF (admm_env%do_admmp)
THEN
749 DO ispin = 1, dft_control%nspins
750 force_fac(ispin) = admm_env%gsi(ispin)**2
754 CALL update_ks_atom(qs_env, matrix_ks_aux_fit, rho_ao_aux, calculate_forces, tddft=.false., &
755 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
756 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
757 oce_external=admm_env%admm_gapw_env%oce, &
758 sab_external=admm_env%sab_aux_fit, fscale=force_fac)
761 DO img = 1, dft_control%nimages
762 DO ispin = 1, dft_control%nspins
763 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit(ispin, img)%matrix, &
765 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix, &
770 CALL timestop(handle)
781 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_ks_matrix'
787 CALL timeset(routinen, handle)
790 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
792 SELECT CASE (admm_env%purification_method)
794 CALL merge_ks_matrix_cauchy(qs_env)
797 CALL merge_ks_matrix_cauchy_subspace(qs_env)
800 IF (dft_control%nimages > 1)
THEN
801 CALL merge_ks_matrix_none_kp(qs_env)
803 CALL merge_ks_matrix_none(qs_env)
809 cpabort(
"admm_mo_merge_ks_matrix: unknown purification method")
812 CALL timestop(handle)
828 mo_derivs_aux_fit, matrix_ks_aux_fit)
829 INTEGER,
INTENT(IN) :: ispin
832 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
833 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
834 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
836 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_mo_merge_derivs'
840 CALL timeset(routinen, handle)
842 SELECT CASE (admm_env%purification_method)
844 CALL merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, &
845 mo_derivs, mo_derivs_aux_fit, matrix_ks_aux_fit)
848 CALL merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
853 cpabort(
"admm_mo_merge_derivs: unknown purification method")
856 CALL timestop(handle)
870 mos, mos_aux_fit, geometry_did_change)
873 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
874 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
875 LOGICAL,
INTENT(IN) :: geometry_did_change
877 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_fit_mo_coeffs'
881 CALL timeset(routinen, handle)
883 IF (geometry_did_change)
THEN
884 CALL fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
887 SELECT CASE (admm_env%purification_method)
889 CALL purify_mo_cholesky(admm_env, mos, mos_aux_fit)
892 CALL purify_mo_diag(admm_env, mos, mos_aux_fit)
895 CALL purify_mo_none(admm_env, mos, mos_aux_fit)
898 CALL timestop(handle)
908 SUBROUTINE fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed)
910 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_mixed
912 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fit_mo_coeffs'
914 INTEGER :: handle, iatom, jatom, nao_aux_fit, &
916 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
920 CALL timeset(routinen, handle)
922 nao_aux_fit = admm_env%nao_aux_fit
923 nao_orb = admm_env%nao_orb
927 IF (.NOT. admm_env%block_fit)
THEN
930 NULLIFY (matrix_s_tilde)
931 ALLOCATE (matrix_s_tilde)
932 CALL dbcsr_create(matrix_s_tilde, template=matrix_s_aux_fit(1)%matrix, &
933 name=
'MATRIX s_tilde', &
934 matrix_type=dbcsr_type_symmetric)
936 CALL dbcsr_copy(matrix_s_tilde, matrix_s_aux_fit(1)%matrix)
941 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
942 sparse_block = 0.0_dp
962 IF (admm_env%block_fit)
THEN
965 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
966 1.0_dp, admm_env%S_inv, admm_env%Q, 0.0_dp, &
971 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
972 1.0_dp, admm_env%Q, admm_env%A, 0.0_dp, &
976 CALL timestop(handle)
978 END SUBROUTINE fit_mo_coeffs
991 SUBROUTINE purify_mo_cholesky(admm_env, mos, mos_aux_fit)
994 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
996 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_cholesky'
998 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
1000 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1002 CALL timeset(routinen, handle)
1004 nao_aux_fit = admm_env%nao_aux_fit
1005 nao_orb = admm_env%nao_orb
1009 DO ispin = 1, nspins
1010 nmo = admm_env%nmo(ispin)
1013 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
1014 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1016 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1017 admm_env%work_orb_nmo(ispin))
1019 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1020 admm_env%lambda(ispin))
1021 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1027 CALL cp_fm_to_fm(admm_env%work_nmo_nmo1(ispin), admm_env%lambda_inv(ispin))
1031 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1032 admm_env%C_hat(ispin))
1033 CALL cp_fm_to_fm(admm_env%C_hat(ispin), mo_coeff_aux_fit)
1037 CALL timestop(handle)
1039 END SUBROUTINE purify_mo_cholesky
1052 SUBROUTINE purify_mo_diag(admm_env, mos, mos_aux_fit)
1055 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1057 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_diag'
1059 INTEGER :: handle, i, ispin, nao_aux_fit, nao_orb, &
1061 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_work
1062 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1064 CALL timeset(routinen, handle)
1066 nao_aux_fit = admm_env%nao_aux_fit
1067 nao_orb = admm_env%nao_orb
1071 DO ispin = 1, nspins
1072 nmo = admm_env%nmo(ispin)
1075 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
1076 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1078 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1079 admm_env%work_orb_nmo(ispin))
1081 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1082 admm_env%lambda(ispin))
1083 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1085 CALL cp_fm_syevd(admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), &
1086 admm_env%eigvals_lambda(ispin)%eigvals%data)
1087 ALLOCATE (eig_work(nmo))
1089 eig_work(i) = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1091 CALL cp_fm_to_fm(admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin))
1094 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%R(ispin), 0.0_dp, &
1095 admm_env%lambda_inv_sqrt(ispin))
1097 1.0_dp, mo_coeff, admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1098 admm_env%work_orb_nmo(ispin))
1100 1.0_dp, admm_env%A, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1103 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1104 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1105 DEALLOCATE (eig_work)
1108 CALL timestop(handle)
1110 END SUBROUTINE purify_mo_diag
1118 SUBROUTINE purify_mo_none(admm_env, mos, mos_aux_fit)
1120 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos, mos_aux_fit
1122 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mo_none'
1124 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, &
1125 nmo, nmo_mos, nspins
1126 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occ_num, occ_num_aux
1127 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1129 CALL timeset(routinen, handle)
1131 nao_aux_fit = admm_env%nao_aux_fit
1132 nao_orb = admm_env%nao_orb
1135 DO ispin = 1, nspins
1136 nmo = admm_env%nmo(ispin)
1137 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, occupation_numbers=occ_num, nmo=nmo_mos)
1138 CALL get_mo_set(mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit, &
1139 occupation_numbers=occ_num_aux)
1142 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1144 CALL cp_fm_to_fm(mo_coeff_aux_fit, admm_env%C_hat(ispin))
1146 occ_num_aux(1:nmo) = occ_num(1:nmo)
1149 CALL cp_fm_set_all(admm_env%lambda_inv(ispin), 0.0_dp, 1.0_dp)
1150 CALL cp_fm_set_all(admm_env%lambda_inv_sqrt(ispin), 0.0_dp, 1.0_dp)
1153 CALL timestop(handle)
1155 END SUBROUTINE purify_mo_none
1165 SUBROUTINE purify_dm_cauchy(admm_env, mo_set, density_matrix, ispin, blocked)
1171 LOGICAL,
INTENT(IN) :: blocked
1173 CHARACTER(len=*),
PARAMETER :: routinen =
'purify_dm_cauchy'
1175 INTEGER :: handle, i, nao_aux_fit, nao_orb, nmo, &
1177 REAL(kind=
dp) :: pole
1178 TYPE(
cp_fm_type),
POINTER :: mo_coeff_aux_fit
1180 CALL timeset(routinen, handle)
1182 nao_aux_fit = admm_env%nao_aux_fit
1183 nao_orb = admm_env%nao_orb
1184 nmo = admm_env%nmo(ispin)
1186 nspins =
SIZE(admm_env%P_to_be_purified)
1188 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff_aux_fit)
1193 IF (.NOT. blocked)
THEN
1194 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1195 1.0_dp, mo_coeff_aux_fit, mo_coeff_aux_fit, 0.0_dp, &
1196 admm_env%P_to_be_purified(ispin))
1199 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1200 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1206 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1207 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1210 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1212 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1217 DO i = 1, nao_aux_fit
1218 pole = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1227 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1228 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1229 admm_env%work_aux_aux)
1231 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1232 1.0_dp, admm_env%work_aux_aux, admm_env%M_purify(ispin), 0.0_dp, &
1233 admm_env%work_aux_aux2)
1235 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1236 1.0_dp, admm_env%work_aux_aux2, admm_env%work_aux_aux, 0.0_dp, &
1237 admm_env%work_aux_aux3)
1239 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux3, density_matrix, keep_sparsity=.true.)
1241 IF (nspins == 1)
THEN
1245 CALL timestop(handle)
1247 END SUBROUTINE purify_dm_cauchy
1253 SUBROUTINE merge_ks_matrix_cauchy(qs_env)
1256 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy'
1258 INTEGER :: handle, i, iatom, ispin, j, jatom, &
1259 nao_aux_fit, nao_orb, nmo
1260 REAL(
dp) :: eig_diff, pole, tmp
1261 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1265 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1270 CALL timeset(routinen, handle)
1271 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mo_coeff)
1274 admm_env=admm_env, &
1275 dft_control=dft_control, &
1276 matrix_ks=matrix_ks, &
1278 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit)
1280 DO ispin = 1, dft_control%nspins
1281 nao_aux_fit = admm_env%nao_aux_fit
1282 nao_orb = admm_env%nao_orb
1283 nmo = admm_env%nmo(ispin)
1284 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1286 IF (.NOT. admm_env%block_dm)
THEN
1289 1.0_dp, mo_coeff, mo_coeff, 0.0_dp, &
1290 admm_env%work_orb_orb)
1293 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
1294 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
1295 admm_env%work_aux_orb2)
1297 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
1298 1.0_dp, admm_env%work_aux_orb2, admm_env%A, 0.0_dp, &
1299 admm_env%P_to_be_purified(ispin))
1303 CALL cp_fm_to_fm(admm_env%S, admm_env%work_aux_aux)
1304 CALL cp_fm_to_fm(admm_env%P_to_be_purified(ispin), admm_env%work_aux_aux2)
1310 CALL cp_fm_syevd(admm_env%work_aux_aux2, admm_env%R_purify(ispin), &
1311 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
1314 admm_env%work_aux_aux3, op=
"MULTIPLY", pos=
"LEFT", transa=
"T")
1316 CALL cp_fm_to_fm(admm_env%work_aux_aux3, admm_env%R_purify(ispin))
1320 DO i = 1, nao_aux_fit
1321 DO j = i, nao_aux_fit
1322 eig_diff = (admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1323 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1325 IF (abs(eig_diff) == 0.0_dp)
THEN
1326 pole = delta(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1329 pole = 1.0_dp/(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - &
1330 admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j))
1331 tmp = heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(i) - 0.5_dp)
1332 tmp = tmp - heaviside(admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(j) - 0.5_dp)
1344 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1345 1.0_dp, admm_env%S_inv, admm_env%R_purify(ispin), 0.0_dp, &
1346 admm_env%work_aux_aux)
1348 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1349 1.0_dp, admm_env%K(ispin), admm_env%work_aux_aux, 0.0_dp, &
1350 admm_env%work_aux_aux2)
1352 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1353 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1354 admm_env%work_aux_aux3)
1357 admm_env%work_aux_aux)
1360 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1361 1.0_dp, admm_env%R_purify(ispin), admm_env%A, 0.0_dp, &
1362 admm_env%work_aux_orb)
1365 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1366 1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_orb, 0.0_dp, &
1367 admm_env%work_aux_orb2)
1369 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1370 1.0_dp, admm_env%work_aux_orb, admm_env%work_aux_orb2, 0.0_dp, &
1371 admm_env%work_orb_orb)
1373 NULLIFY (matrix_k_tilde)
1374 ALLOCATE (matrix_k_tilde)
1375 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1376 name=
'MATRIX K_tilde', &
1377 matrix_type=dbcsr_type_symmetric)
1379 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1381 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1383 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1385 IF (admm_env%block_dm)
THEN
1390 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1391 sparse_block = 0.0_dp
1397 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1403 CALL timestop(handle)
1405 END SUBROUTINE merge_ks_matrix_cauchy
1411 SUBROUTINE merge_ks_matrix_cauchy_subspace(qs_env)
1414 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_cauchy_subspace'
1416 INTEGER :: handle, ispin, nao_aux_fit, nao_orb, nmo
1418 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
1419 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit
1422 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
1424 CALL timeset(routinen, handle)
1425 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, mos, mos_aux_fit, &
1426 mo_coeff, mo_coeff_aux_fit)
1429 admm_env=admm_env, &
1430 dft_control=dft_control, &
1431 matrix_ks=matrix_ks, &
1433 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, mos_aux_fit=mos_aux_fit)
1435 DO ispin = 1, dft_control%nspins
1436 nao_aux_fit = admm_env%nao_aux_fit
1437 nao_orb = admm_env%nao_orb
1438 nmo = admm_env%nmo(ispin)
1439 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1440 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
1443 CALL cp_fm_to_fm(admm_env%lambda(ispin), admm_env%work_nmo_nmo1(ispin))
1450 1.0_dp, admm_env%work_nmo_nmo1(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1451 admm_env%lambda_inv2(ispin))
1455 1.0_dp, admm_env%A, mo_coeff, 0.0_dp, &
1456 admm_env%C_hat(ispin))
1460 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
1461 admm_env%work_aux_nmo(ispin))
1463 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1464 1.0_dp, admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
1465 admm_env%P_tilde(ispin))
1469 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv2(ispin), 0.0_dp, &
1470 admm_env%work_aux_nmo(ispin))
1473 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nmo, &
1474 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%C_hat(ispin), 0.0_dp, &
1475 admm_env%work_aux_aux)
1478 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1479 1.0_dp, admm_env%S, admm_env%work_aux_aux, 0.0_dp, &
1480 admm_env%work_aux_aux2)
1486 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1487 1.0_dp, admm_env%work_aux_aux2, admm_env%K(ispin), 0.0_dp, &
1488 admm_env%work_aux_aux)
1491 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1492 1.0_dp, admm_env%P_tilde(ispin), admm_env%S, 0.0_dp, &
1493 admm_env%work_aux_aux2)
1496 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, &
1497 -1.0_dp, admm_env%work_aux_aux, admm_env%work_aux_aux2, 0.0_dp, &
1498 admm_env%work_aux_aux3)
1504 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1505 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 0.0_dp, &
1506 admm_env%work_aux_orb)
1509 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1510 1.0_dp, admm_env%work_aux_aux3, admm_env%A, 1.0_dp, &
1511 admm_env%work_aux_orb)
1514 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1515 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1516 admm_env%work_orb_orb)
1518 NULLIFY (matrix_k_tilde)
1519 ALLOCATE (matrix_k_tilde)
1520 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1521 name=
'MATRIX K_tilde', &
1522 matrix_type=dbcsr_type_symmetric)
1524 CALL cp_fm_to_fm(admm_env%work_orb_orb, admm_env%ks_to_be_merged(ispin))
1526 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1528 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1531 1.0_dp, admm_env%work_orb_orb, mo_coeff, 0.0_dp, &
1532 admm_env%mo_derivs_tmp(ispin))
1534 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1539 CALL timestop(handle)
1541 END SUBROUTINE merge_ks_matrix_cauchy_subspace
1561 SUBROUTINE merge_mo_derivs_diag(ispin, admm_env, mo_set, mo_coeff, mo_coeff_aux_fit, mo_derivs, &
1562 mo_derivs_aux_fit, matrix_ks_aux_fit)
1563 INTEGER,
INTENT(IN) :: ispin
1566 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff, mo_coeff_aux_fit
1567 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs, mo_derivs_aux_fit
1568 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
1570 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_diag'
1572 INTEGER :: handle, i, j, nao_aux_fit, nao_orb, nmo
1573 REAL(
dp) :: eig_diff, pole, tmp32, tmp52, tmp72, &
1575 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
1577 CALL timeset(routinen, handle)
1579 nao_aux_fit = admm_env%nao_aux_fit
1580 nao_orb = admm_env%nao_orb
1581 nmo = admm_env%nmo(ispin)
1586 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
1587 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
1590 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
1591 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
1592 scaling_factor = 2.0_dp*occupation_numbers
1596 CALL cp_fm_to_fm(admm_env%H(ispin), mo_derivs_aux_fit(ispin))
1600 1.0_dp, admm_env%H(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
1601 admm_env%work_aux_nmo(ispin))
1603 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1604 admm_env%mo_derivs_tmp(ispin))
1610 eig_diff = (admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1611 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1613 IF (abs(eig_diff) < 0.0001_dp)
THEN
1614 tmp32 = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))**3
1615 tmp52 = tmp32/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1616 tmp72 = tmp52/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1617 tmp92 = tmp72/admm_env%eigvals_lambda(ispin)%eigvals%data(j)*eig_diff
1619 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
1622 pole = 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(i))
1623 pole = pole - 1.0_dp/sqrt(admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1624 pole = pole/(admm_env%eigvals_lambda(ispin)%eigvals%data(i) - &
1625 admm_env%eigvals_lambda(ispin)%eigvals%data(j))
1639 1.0_dp, admm_env%H(ispin), admm_env%R(ispin), 0.0_dp, &
1640 admm_env%work_aux_nmo(ispin))
1643 1.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 0.0_dp, &
1644 admm_env%work_orb_nmo(ispin))
1647 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
1648 admm_env%work_nmo_nmo1(ispin))
1651 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1652 admm_env%work_nmo_nmo2(ispin))
1655 admm_env%M(ispin), admm_env%work_nmo_nmo1(ispin))
1658 1.0_dp, admm_env%R(ispin), admm_env%work_nmo_nmo1(ispin), 0.0_dp, &
1659 admm_env%work_nmo_nmo2(ispin))
1663 1.0_dp, admm_env%work_nmo_nmo2(ispin), admm_env%R(ispin), 0.0_dp, &
1664 admm_env%R_schur_R_t(ispin))
1668 1.0_dp, admm_env%B, mo_coeff, 0.0_dp, &
1669 admm_env%work_orb_nmo(ispin))
1674 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1675 admm_env%mo_derivs_tmp(ispin))
1680 1.0_dp, admm_env%work_orb_nmo(ispin), admm_env%R_schur_R_t(ispin), 1.0_dp, &
1681 admm_env%mo_derivs_tmp(ispin))
1683 DO i = 1,
SIZE(scaling_factor)
1684 scaling_factor(i) = 1.0_dp/scaling_factor(i)
1691 DEALLOCATE (scaling_factor)
1693 CALL timestop(handle)
1695 END SUBROUTINE merge_mo_derivs_diag
1701 SUBROUTINE merge_ks_matrix_none(qs_env)
1704 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none'
1706 INTEGER :: handle, iatom, ispin, jatom, &
1707 nao_aux_fit, nao_orb, nmo
1708 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
1709 REAL(kind=
dp) :: ener_k(2), ener_x(2), ener_x1(2), &
1710 gsi_square, trace_tmp, trace_tmp_two
1713 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
1714 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, &
1716 TYPE(
dbcsr_type),
POINTER :: matrix_k_tilde, &
1717 matrix_ks_aux_fit_admms_tmp, &
1724 CALL timeset(routinen, handle)
1725 NULLIFY (admm_env, dft_control, matrix_ks, matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
1726 matrix_ks_aux_fit_hfx, matrix_s, matrix_s_aux_fit, rho_ao, rho_ao_aux, matrix_k_tilde, &
1727 matrix_ttst, matrix_ks_aux_fit_admms_tmp, rho, rho_aux_fit, sparse_block, para_env, energy)
1730 admm_env=admm_env, &
1731 dft_control=dft_control, &
1732 matrix_ks=matrix_ks, &
1734 matrix_s=matrix_s, &
1737 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft, &
1738 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, rho_aux_fit=rho_aux_fit, &
1739 matrix_s_aux_fit=matrix_s_aux_fit)
1745 DO ispin = 1, dft_control%nspins
1746 IF (admm_env%block_dm)
THEN
1750 IF (admm_env%block_map(iatom, jatom) == 0)
THEN
1751 sparse_block = 0.0_dp
1755 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ks_aux_fit(ispin)%matrix, 1.0_dp, 1.0_dp)
1759 nao_aux_fit = admm_env%nao_aux_fit
1760 nao_orb = admm_env%nao_orb
1761 nmo = admm_env%nmo(ispin)
1764 IF (admm_env%do_admms)
THEN
1765 NULLIFY (matrix_ks_aux_fit_admms_tmp)
1766 ALLOCATE (matrix_ks_aux_fit_admms_tmp)
1767 CALL dbcsr_create(matrix_ks_aux_fit_admms_tmp, template=matrix_ks_aux_fit(ispin)%matrix, &
1768 name=
'matrix_ks_aux_fit_admms_tmp', matrix_type=
's')
1770 CALL dbcsr_copy(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_hfx(ispin)%matrix)
1773 CALL dbcsr_add(matrix_ks_aux_fit_admms_tmp, matrix_ks_aux_fit_dft(ispin)%matrix, &
1774 1.0_dp, -(admm_env%gsi(ispin))**(2.0_dp/3.0_dp))
1784 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1785 1.0_dp, admm_env%K(ispin), admm_env%A, 0.0_dp, &
1786 admm_env%work_aux_orb)
1788 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1789 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1790 admm_env%work_orb_orb)
1792 NULLIFY (matrix_k_tilde)
1793 ALLOCATE (matrix_k_tilde)
1794 CALL dbcsr_create(matrix_k_tilde, template=matrix_ks(ispin)%matrix, &
1795 name=
'MATRIX K_tilde', matrix_type=
'S')
1796 CALL dbcsr_copy(matrix_k_tilde, matrix_ks(ispin)%matrix)
1798 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, matrix_k_tilde, keep_sparsity=.true.)
1802 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1803 CALL dbcsr_scale(matrix_k_tilde, admm_env%gsi(ispin))
1807 IF (admm_env%do_admmp)
THEN
1808 gsi_square = (admm_env%gsi(ispin))*(admm_env%gsi(ispin))
1812 admm_env%lambda_merlot(ispin) = 0
1815 IF (admm_env%do_admmq)
THEN
1816 CALL dbcsr_dot(matrix_ks_aux_fit(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1820 admm_env%lambda_merlot(ispin) = trace_tmp/(admm_env%n_large_basis(ispin))
1822 ELSE IF (admm_env%do_admmp)
THEN
1823 IF (dft_control%nspins == 2)
THEN
1824 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1825 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1827 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1828 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
1829 (admm_env%n_large_basis(ispin))
1832 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
1833 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
1834 /(admm_env%n_large_basis(ispin))
1837 ELSE IF (admm_env%do_admms)
THEN
1838 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp)
1839 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin)%matrix, rho_ao_aux(ispin)%matrix, trace_tmp_two)
1841 IF (dft_control%nspins == 2)
THEN
1842 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, ener_k_ispin=ener_k(ispin), &
1843 ener_x_ispin=ener_x(ispin), ener_x1_ispin=ener_x1(ispin), &
1845 admm_env%lambda_merlot(ispin) = &
1846 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1847 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
1848 trace_tmp_two)/(admm_env%n_large_basis(ispin))
1851 admm_env%lambda_merlot(ispin) = (trace_tmp + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)* &
1852 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
1853 trace_tmp_two))/(admm_env%n_large_basis(ispin))
1860 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
1867 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
1868 1.0_dp, admm_env%work_aux_aux4, admm_env%A, 0.0_dp, &
1869 admm_env%work_aux_orb3)
1871 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
1872 1.0_dp, admm_env%A, admm_env%work_aux_orb3, 0.0_dp, &
1873 admm_env%work_orb_orb3)
1875 NULLIFY (matrix_ttst)
1876 ALLOCATE (matrix_ttst)
1877 CALL dbcsr_create(matrix_ttst, template=matrix_ks(ispin)%matrix, &
1878 name=
'MATRIX TtsT', matrix_type=
'S')
1879 CALL dbcsr_copy(matrix_ttst, matrix_ks(ispin)%matrix)
1881 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb3, matrix_ttst, keep_sparsity=.true.)
1885 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ttst, 1.0_dp, &
1886 (-admm_env%lambda_merlot(ispin))*admm_env%gsi(ispin))
1888 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_s(1)%matrix, 1.0_dp, admm_env%lambda_merlot(ispin))
1894 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_k_tilde, 1.0_dp, 1.0_dp)
1902 IF (admm_env%do_admmp)
THEN
1906 IF (dft_control%nspins == 2)
THEN
1907 energy%exc_aux_fit = 0.0_dp
1908 energy%exc1_aux_fit = 0.0_dp
1910 DO ispin = 1, dft_control%nspins
1911 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
1912 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
1913 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
1916 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
1917 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
1918 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
1921 ELSE IF (admm_env%do_admms)
THEN
1922 IF (dft_control%nspins == 2)
THEN
1923 energy%exc_aux_fit = 0.0_dp
1924 energy%exc1_aux_fit = 0.0_dp
1925 DO ispin = 1, dft_control%nspins
1926 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
1927 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
1930 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
1931 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
1935 CALL timestop(handle)
1937 END SUBROUTINE merge_ks_matrix_none
1943 SUBROUTINE merge_ks_matrix_none_kp(qs_env)
1946 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_ks_matrix_none_kp'
1948 COMPLEX(dp) ::
fac, fac2
1949 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
1950 ispin, kplocal, nao_aux_fit, nao_orb, &
1951 natom, nkp, nkp_groups, nspins
1952 INTEGER,
DIMENSION(2) :: kp_range
1953 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
1954 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1955 LOGICAL :: my_kpgrp, use_real_wfn
1956 REAL(
dp) :: ener_k(2), ener_x(2), ener_x1(2), tmp, &
1957 trace_tmp, trace_tmp_two
1958 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1962 cwork_aux_orb, cwork_orb_orb
1965 TYPE(
cp_fm_type) :: fmdummy, work_aux_aux, work_aux_aux2, &
1967 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
1968 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_ks
1969 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_k_tilde, matrix_ks_aux_fit, &
1970 matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_kp, matrix_s, matrix_s_aux_fit, &
1973 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: ksmatrix
1979 POINTER :: sab_aux_fit, sab_kp
1984 CALL timeset(routinen, handle)
1985 NULLIFY (admm_env, rho_ao_aux, rho_aux_fit, &
1986 matrix_s_aux_fit, energy, &
1987 para_env, kpoints, sab_aux_fit, &
1988 matrix_k_tilde, matrix_ks_kp, matrix_ks_aux_fit, scf_env, &
1989 struct_orb_orb, struct_aux_orb, struct_aux_aux, kp, &
1990 matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft)
1993 admm_env=admm_env, &
1994 dft_control=dft_control, &
1995 matrix_ks_kp=matrix_ks_kp, &
1996 matrix_s_kp=matrix_s, &
1997 para_env=para_env, &
2004 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
2005 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx, &
2006 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
2007 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
2008 sab_aux_fit=sab_aux_fit, &
2009 rho_aux_fit=rho_aux_fit)
2010 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
2012 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
2013 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_kp, &
2014 cell_to_index=cell_to_index)
2016 nao_aux_fit = admm_env%nao_aux_fit
2017 nao_orb = admm_env%nao_orb
2018 nspins = dft_control%nspins
2023 IF (admm_env%do_admmq)
THEN
2024 admm_env%lambda_merlot = 0.0_dp
2025 DO img = 1, dft_control%nimages
2026 DO ispin = 1, nspins
2027 CALL dbcsr_dot(matrix_ks_aux_fit(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, trace_tmp)
2028 admm_env%lambda_merlot(ispin) = admm_env%lambda_merlot(ispin) + trace_tmp/admm_env%n_large_basis(ispin)
2034 IF (admm_env%do_admmp)
THEN
2035 IF (nspins == 1)
THEN
2036 admm_env%lambda_merlot(1) = 2.0_dp*(admm_env%gsi(1))**2* &
2037 (energy%ex + energy%exc_aux_fit + energy%exc1_aux_fit) &
2038 /(admm_env%n_large_basis(1))
2040 DO ispin = 1, nspins
2041 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
2042 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
2043 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
2044 admm_env%lambda_merlot(ispin) = 2.0_dp*(admm_env%gsi(ispin))**2* &
2045 (ener_k(ispin) + ener_x(ispin) + ener_x1(ispin))/ &
2046 (admm_env%n_large_basis(ispin))
2052 IF (admm_env%do_admms)
THEN
2053 IF (nspins == 1)
THEN
2055 trace_tmp_two = 0.0_dp
2056 DO img = 1, dft_control%nimages
2057 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2058 trace_tmp = trace_tmp + tmp
2059 CALL dbcsr_dot(matrix_ks_aux_fit_dft(1, img)%matrix, rho_ao_aux(1, img)%matrix, tmp)
2060 trace_tmp_two = trace_tmp_two + tmp
2062 admm_env%lambda_merlot(1) = (trace_tmp + (admm_env%gsi(1))**(2.0_dp/3.0_dp)* &
2063 (2.0_dp/3.0_dp*(energy%exc_aux_fit + energy%exc1_aux_fit) - &
2064 trace_tmp_two))/(admm_env%n_large_basis(1))
2067 DO ispin = 1, nspins
2069 trace_tmp_two = 0.0_dp
2070 DO img = 1, dft_control%nimages
2071 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2072 trace_tmp = trace_tmp + tmp
2073 CALL dbcsr_dot(matrix_ks_aux_fit_dft(ispin, img)%matrix, rho_ao_aux(ispin, img)%matrix, tmp)
2074 trace_tmp_two = trace_tmp_two + tmp
2077 CALL calc_spin_dep_aux_exch_ener(qs_env=qs_env, admm_env=admm_env, &
2078 ener_k_ispin=ener_k(ispin), ener_x_ispin=ener_x(ispin), &
2079 ener_x1_ispin=ener_x1(ispin), ispin=ispin)
2081 admm_env%lambda_merlot(ispin) = &
2082 (trace_tmp + 2.0_dp/3.0_dp*((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2083 (ener_x(ispin) + ener_x1(ispin)) - ((admm_env%gsi(ispin))**(2.0_dp/3.0_dp))* &
2084 trace_tmp_two)/(admm_env%n_large_basis(ispin))
2089 NULLIFY (matrix_ks_aux_fit)
2090 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2091 DO img = 1, dft_control%nimages
2092 DO ispin = 1, nspins
2093 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2094 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2095 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2096 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2097 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2098 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2104 ALLOCATE (ksmatrix(2))
2105 CALL dbcsr_create(ksmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2106 matrix_type=dbcsr_type_symmetric)
2107 CALL dbcsr_create(ksmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2108 matrix_type=dbcsr_type_antisymmetric)
2109 CALL dbcsr_create(tmpmatrix_ks, template=matrix_ks_aux_fit(1, 1)%matrix, &
2110 matrix_type=dbcsr_type_symmetric)
2114 kplocal = kp_range(2) - kp_range(1) + 1
2115 para_env => kpoints%blacs_env_all%para_env
2117 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2118 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2122 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2123 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2126 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2127 nrow_global=nao_orb, ncol_global=nao_orb)
2130 IF (.NOT. use_real_wfn)
THEN
2142 ALLOCATE (fm_ks(kplocal, 2, nspins))
2143 DO ispin = 1, nspins
2146 CALL cp_fm_create(fm_ks(ikp, i, ispin), struct_orb_orb)
2155 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
2158 DO ispin = 1, nspins
2159 DO igroup = 1, nkp_groups
2161 ik = kp_dist(1, igroup) + ikp - 1
2162 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2165 IF (use_real_wfn)
THEN
2167 CALL rskp_transform(rmatrix=ksmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2168 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2174 CALL rskp_transform(rmatrix=ksmatrix(1), cmatrix=ksmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2175 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2184 IF (.NOT. use_real_wfn)
THEN
2186 para_env, info(indx, 2))
2190 IF (.NOT. use_real_wfn)
THEN
2200 DO ispin = 1, nspins
2201 DO igroup = 1, nkp_groups
2203 ik = kp_dist(1, igroup) + ikp - 1
2204 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2208 IF (.NOT. use_real_wfn)
THEN
2215 kp => kpoints%kp_aux_env(ikp)%kpoint_env
2216 IF (use_real_wfn)
THEN
2219 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2220 1.0_dp, work_aux_aux, kp%amat(1, 1), 0.0_dp, &
2223 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
2224 1.0_dp, kp%amat(1, 1), work_aux_orb, 0.0_dp, &
2225 fm_ks(ikp, 1, ispin))
2228 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
2232 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2237 IF (admm_env%do_admmp)
THEN
2241 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
2242 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
2247 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
2250 CALL parallel_gemm(
'C',
'N', nao_orb, nao_orb, nao_aux_fit, &
2253 CALL cp_cfm_to_fm(cwork_orb_orb, mtargetr=fm_ks(ikp, 1, ispin), mtargeti=fm_ks(ikp, 2, ispin))
2260 DO ispin = 1, nspins
2261 DO igroup = 1, nkp_groups
2263 ik = kp_dist(1, igroup) + ikp - 1
2264 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2280 IF (.NOT. use_real_wfn)
THEN
2289 NULLIFY (matrix_k_tilde)
2293 DO ispin = 1, nspins
2294 DO img = 1, dft_control%nimages
2295 ALLOCATE (matrix_k_tilde(ispin, img)%matrix)
2296 CALL dbcsr_create(matrix=matrix_k_tilde(ispin, img)%matrix, template=matrix_ks_kp(1, 1)%matrix, &
2298 matrix_type=dbcsr_type_symmetric)
2300 CALL dbcsr_set(matrix_k_tilde(ispin, img)%matrix, 0.0_dp)
2304 CALL cp_fm_get_info(admm_env%work_orb_orb, matrix_struct=struct_orb_orb)
2305 ALLOCATE (fmwork(2))
2311 matrix_k_tilde(1, 1)%matrix, sab_kp, &
2312 fmwork, for_aux_fit=.false., pmat_ext=fm_ks)
2316 DO ispin = 1, nspins
2324 DO ispin = 1, nspins
2325 DO img = 1, dft_control%nimages
2326 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_k_tilde(ispin, img)%matrix, 1.0_dp, 1.0_dp)
2327 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
2329 CALL dbcsr_add(matrix_ks_kp(ispin, img)%matrix, matrix_s(1, img)%matrix, &
2330 1.0_dp, admm_env%lambda_merlot(ispin))
2336 IF (admm_env%do_admmp)
THEN
2337 IF (nspins == 1)
THEN
2338 energy%exc_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc_aux_fit
2339 energy%exc1_aux_fit = (admm_env%gsi(1))**2.0_dp*energy%exc1_aux_fit
2340 energy%ex = (admm_env%gsi(1))**2.0_dp*energy%ex
2342 energy%exc_aux_fit = 0.0_dp
2343 energy%exc1_aux_fit = 0.0_dp
2345 DO ispin = 1, dft_control%nspins
2346 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x(ispin)
2347 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**2.0_dp*ener_x1(ispin)
2348 energy%ex = energy%ex + (admm_env%gsi(ispin))**2.0_dp*ener_k(ispin)
2354 IF (admm_env%do_admms)
THEN
2355 IF (nspins == 1)
THEN
2356 energy%exc_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc_aux_fit
2357 energy%exc1_aux_fit = (admm_env%gsi(1))**(2.0_dp/3.0_dp)*energy%exc1_aux_fit
2359 energy%exc_aux_fit = 0.0_dp
2360 energy%exc1_aux_fit = 0.0_dp
2361 DO ispin = 1, nspins
2362 energy%exc_aux_fit = energy%exc_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x(ispin)
2363 energy%exc1_aux_fit = energy%exc1_aux_fit + (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)*ener_x1(ispin)
2372 CALL timestop(handle)
2374 END SUBROUTINE merge_ks_matrix_none_kp
2385 SUBROUTINE calc_spin_dep_aux_exch_ener(qs_env, admm_env, ener_k_ispin, ener_x_ispin, &
2386 ener_x1_ispin, ispin)
2389 REAL(
dp),
INTENT(INOUT) :: ener_k_ispin, ener_x_ispin, ener_x1_ispin
2390 INTEGER,
INTENT(IN) :: ispin
2392 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_spin_dep_aux_exch_ener'
2394 CHARACTER(LEN=default_string_length) :: basis_type
2395 INTEGER :: handle, img, myspin, nimg
2398 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
2402 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit_hfx, rho_ao_aux, &
2408 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, v_rspace_dummy, v_tau_rspace_dummy
2410 TYPE(
qs_rho_type),
POINTER :: rho_aux_fit, rho_aux_fit_buffer
2414 CALL timeset(routinen, handle)
2416 NULLIFY (ks_env, rho_aux_fit, rho_aux_fit_buffer, rho_ao, &
2417 xc_section_aux, v_rspace_dummy, v_tau_rspace_dummy, &
2418 rho_ao_aux, rho_ao_aux_buffer, dft_control, &
2419 matrix_ks_aux_fit_hfx, task_list, local_rho_buffer, admm_gapw_env)
2421 NULLIFY (rho_g, rho_r, tot_rho_r)
2423 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
2424 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, rho_aux_fit_buffer=rho_aux_fit_buffer, &
2425 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2428 rho_ao_kp=rho_ao_aux)
2431 rho_ao_kp=rho_ao_aux_buffer, &
2434 tot_rho_r=tot_rho_r)
2436 gapw = admm_env%do_gapw
2437 nimg = dft_control%nimages
2441 CALL dbcsr_set(rho_ao_aux_buffer(1, img)%matrix, 0.0_dp)
2442 CALL dbcsr_set(rho_ao_aux_buffer(2, img)%matrix, 0.0_dp)
2443 CALL dbcsr_add(rho_ao_aux_buffer(ispin, img)%matrix, &
2444 rho_ao_aux(ispin, img)%matrix, 0.0_dp, 1.0_dp)
2448 basis_type =
"AUX_FIT"
2449 task_list => admm_env%task_list_aux_fit
2451 basis_type =
"AUX_FIT_SOFT"
2452 task_list => admm_env%admm_gapw_env%task_list
2456 DO myspin = 1, dft_control%nspins
2458 rho_ao => rho_ao_aux_buffer(myspin, :)
2460 matrix_p_kp=rho_ao, &
2461 rho=rho_r(myspin), &
2462 rho_gspace=rho_g(myspin), &
2463 total_rho=tot_rho_r(myspin), &
2464 soft_valid=.false., &
2465 basis_type=
"AUX_FIT", &
2466 task_list_external=task_list)
2471 CALL qs_rho_set(rho_aux_fit_buffer, rho_r_valid=.true., rho_g_valid=.true.)
2473 xc_section_aux => admm_env%xc_section_aux
2475 ener_x_ispin = 0.0_dp
2477 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_aux_fit_buffer, xc_section=xc_section_aux, &
2478 vxc_rho=v_rspace_dummy, vxc_tau=v_tau_rspace_dummy, exc=ener_x_ispin, &
2482 ener_x1_ispin = 0.0_dp
2485 admm_gapw_env => admm_env%admm_gapw_env
2487 atomic_kind_set=atomic_kind_set, &
2492 admm_gapw_env%admm_kind_set, dft_control, para_env)
2495 rho_atom_set=local_rho_buffer%rho_atom_set, &
2496 qs_kind_set=admm_gapw_env%admm_kind_set, &
2497 oce=admm_gapw_env%oce, sab=admm_env%sab_aux_fit, &
2500 CALL prepare_gapw_den(qs_env, local_rho_set=local_rho_buffer, do_rho0=.false., &
2501 kind_set_external=admm_gapw_env%admm_kind_set)
2504 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2505 xc_section_external=xc_section_aux, &
2506 rho_atom_set_external=local_rho_buffer%rho_atom_set)
2511 ener_k_ispin = 0.0_dp
2515 CALL dbcsr_dot(matrix_ks_aux_fit_hfx(ispin, img)%matrix, rho_ao_aux_buffer(ispin, img)%matrix, tmp)
2516 ener_k_ispin = ener_k_ispin + tmp
2521 ener_k_ispin = ener_k_ispin/2.0_dp
2523 CALL timestop(handle)
2525 END SUBROUTINE calc_spin_dep_aux_exch_ener
2536 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_orb
2537 LOGICAL,
INTENT(IN) :: scale_back
2539 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scale_dm'
2541 INTEGER :: handle, img, ispin
2545 CALL timeset(routinen, handle)
2547 NULLIFY (admm_env, dft_control)
2550 admm_env=admm_env, &
2551 dft_control=dft_control)
2554 IF (admm_env%do_admmp)
THEN
2555 DO ispin = 1, dft_control%nspins
2556 DO img = 1, dft_control%nimages
2557 IF (scale_back)
THEN
2558 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, 1.0_dp/admm_env%gsi(ispin))
2560 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, admm_env%gsi(ispin))
2566 CALL timestop(handle)
2577 SUBROUTINE calc_aux_mo_derivs_none(ispin, admm_env, mo_set, mo_coeff_aux_fit)
2578 INTEGER,
INTENT(IN) :: ispin
2581 TYPE(
cp_fm_type),
INTENT(IN) :: mo_coeff_aux_fit
2583 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_aux_mo_derivs_none'
2585 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2586 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2587 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit, &
2588 matrix_ks_aux_fit_dft, &
2589 matrix_ks_aux_fit_hfx
2592 NULLIFY (matrix_ks_aux_fit, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx)
2594 CALL timeset(routinen, handle)
2596 nao_aux_fit = admm_env%nao_aux_fit
2597 nao_orb = admm_env%nao_orb
2598 nmo = admm_env%nmo(ispin)
2600 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, &
2601 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx, &
2602 matrix_ks_aux_fit_dft=matrix_ks_aux_fit_dft)
2610 IF (admm_env%do_admms)
THEN
2612 CALL dbcsr_create(dbcsr_work, template=matrix_ks_aux_fit(ispin)%matrix)
2613 CALL dbcsr_copy(dbcsr_work, matrix_ks_aux_fit_hfx(ispin)%matrix)
2614 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))
2622 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2623 1.0_dp, admm_env%K(ispin), mo_coeff_aux_fit, 0.0_dp, &
2626 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2627 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2629 scaling_factor = 2.0_dp*occupation_numbers
2633 DEALLOCATE (scaling_factor)
2635 CALL timestop(handle)
2637 END SUBROUTINE calc_aux_mo_derivs_none
2647 SUBROUTINE merge_mo_derivs_no_diag(ispin, admm_env, mo_set, mo_derivs, matrix_ks_aux_fit)
2648 INTEGER,
INTENT(IN) :: ispin
2651 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_derivs
2652 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2654 CHARACTER(LEN=*),
PARAMETER :: routinen =
'merge_mo_derivs_no_diag'
2656 INTEGER :: handle, nao_aux_fit, nao_orb, nmo
2657 REAL(
dp),
DIMENSION(:),
POINTER :: occupation_numbers, scaling_factor
2659 CALL timeset(routinen, handle)
2661 nao_aux_fit = admm_env%nao_aux_fit
2662 nao_orb = admm_env%nao_orb
2663 nmo = admm_env%nmo(ispin)
2668 CALL get_mo_set(mo_set=mo_set, occupation_numbers=occupation_numbers)
2669 ALLOCATE (scaling_factor(
SIZE(occupation_numbers)))
2670 scaling_factor = 0.5_dp
2674 1.0_dp, admm_env%C_hat(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
2675 admm_env%work_aux_nmo(ispin))
2676 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2677 1.0_dp, admm_env%K(ispin), admm_env%work_aux_nmo(ispin), 0.0_dp, &
2678 admm_env%work_aux_nmo2(ispin))
2680 2.0_dp, admm_env%A, admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2681 admm_env%mo_derivs_tmp(ispin))
2684 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%work_aux_nmo2(ispin), 0.0_dp, &
2685 admm_env%work_orb_orb)
2687 1.0_dp, admm_env%C_hat(ispin), admm_env%work_orb_orb, 0.0_dp, &
2688 admm_env%work_aux_orb)
2689 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nmo, nao_aux_fit, &
2690 1.0_dp, admm_env%S, admm_env%work_aux_orb, 0.0_dp, &
2691 admm_env%work_aux_nmo(ispin))
2693 -2.0_dp, admm_env%A, admm_env%work_aux_nmo(ispin), 1.0_dp, &
2694 admm_env%mo_derivs_tmp(ispin))
2700 DEALLOCATE (scaling_factor)
2702 CALL timestop(handle)
2704 END SUBROUTINE merge_mo_derivs_no_diag
2716 INTEGER :: ispin, nspins
2718 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_derivs_fm
2719 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mo_derivs_aux_fit
2720 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2721 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit
2722 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array, mos_aux_fit
2724 NULLIFY (mo_array, mos_aux_fit, matrix_ks_aux_fit, mo_coeff_aux_fit, &
2725 mo_derivs_aux_fit, mo_coeff)
2727 CALL get_qs_env(qs_env, admm_env=admm_env, mos=mo_array)
2728 CALL get_admm_env(admm_env, mos_aux_fit=mos_aux_fit, mo_derivs_aux_fit=mo_derivs_aux_fit, &
2729 matrix_ks_aux_fit=matrix_ks_aux_fit)
2731 nspins =
SIZE(mo_derivs)
2732 ALLOCATE (mo_derivs_fm(nspins))
2733 DO ispin = 1, nspins
2734 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2735 CALL cp_fm_create(mo_derivs_fm(ispin), mo_coeff%matrix_struct)
2738 DO ispin = 1, nspins
2739 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
2740 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2744 mo_derivs_fm, mo_derivs_aux_fit, matrix_ks_aux_fit)
2761 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_aux_fit
2762 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
2764 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
2767 CALL get_qs_env(qs_env, dft_control=dft_control)
2769 IF (dft_control%do_admm_dm)
THEN
2770 cpabort(
"Forces with ADMM DM methods not implemented")
2772 IF (dft_control%do_admm_mo .AND. .NOT. qs_env%run_rtp)
THEN
2773 NULLIFY (matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, mos_aux_fit, mos, admm_env)
2777 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, mos_aux_fit=mos_aux_fit, &
2778 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
2779 DO ispin = 1, dft_control%nspins
2780 mo_set => mos(ispin)
2781 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff)
2784 CALL get_mo_set(mo_set=mos_aux_fit(ispin), mo_coeff=mo_coeff_aux_fit)
2785 CALL calc_aux_mo_derivs_none(ispin, qs_env%admm_env, mo_set, mo_coeff_aux_fit)
2800 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_admm_ovlp_forces_kp'
2802 COMPLEX(dp) ::
fac, fac2
2803 INTEGER :: handle, i, igroup, ik, ikp, img, indx, &
2804 ispin, kplocal, nao_aux_fit, nao_orb, &
2805 natom, nimg, nkp, nkp_groups, nspins
2806 INTEGER,
DIMENSION(2) :: kp_range
2807 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
2808 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2809 LOGICAL :: gapw, my_kpgrp, use_real_wfn
2810 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
2811 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
2815 TYPE(
cp_cfm_type) :: ca, ckmatrix, cpmatrix, cq, cs, cs_inv, &
2816 cwork_aux_aux, cwork_aux_orb, &
2820 TYPE(
cp_fm_type) :: fmdummy, s_inv, work_aux_aux, &
2821 work_aux_aux2, work_aux_aux3, &
2823 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_skap, fm_skapa
2824 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fmwork
2825 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, matrix_ks_aux_fit_dft, &
2826 matrix_ks_aux_fit_hfx, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_skap, &
2827 matrix_skapa, rho_ao_orb
2829 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: kmatrix
2835 POINTER :: sab_aux_fit, sab_aux_fit_asymm, &
2836 sab_aux_fit_vs_orb, sab_kp
2841 CALL timeset(routinen, handle)
2849 NULLIFY (ks_env, admm_env, matrix_ks_aux_fit, &
2850 matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, rho, force, &
2851 para_env, atomic_kind_set, kpoints, sab_aux_fit, &
2852 sab_aux_fit_vs_orb, sab_aux_fit_asymm, struct_orb_orb, &
2853 struct_aux_orb, struct_aux_aux)
2857 admm_env=admm_env, &
2858 dft_control=dft_control, &
2861 atomic_kind_set=atomic_kind_set, &
2864 nimg = dft_control%nimages
2866 matrix_s_aux_fit_kp=matrix_s_aux_fit, &
2867 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
2868 sab_aux_fit=sab_aux_fit, &
2869 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb, &
2870 sab_aux_fit_asymm=sab_aux_fit_asymm, &
2871 matrix_ks_aux_fit_kp=matrix_ks_aux_fit, &
2872 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft, &
2873 matrix_ks_aux_fit_hfx_kp=matrix_ks_aux_fit_hfx)
2875 gapw = admm_env%do_gapw
2876 nao_aux_fit = admm_env%nao_aux_fit
2877 nao_orb = admm_env%nao_orb
2878 nspins = dft_control%nspins
2880 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
2881 nkp_groups=nkp_groups, kp_dist=kp_dist, &
2882 cell_to_index=cell_to_index, sab_nl=sab_kp)
2885 IF (admm_env%do_admms)
THEN
2887 NULLIFY (matrix_ks_aux_fit)
2888 ALLOCATE (matrix_ks_aux_fit(nspins, dft_control%nimages))
2889 DO img = 1, dft_control%nimages
2890 DO ispin = 1, nspins
2891 NULLIFY (matrix_ks_aux_fit(ispin, img)%matrix)
2892 ALLOCATE (matrix_ks_aux_fit(ispin, img)%matrix)
2893 CALL dbcsr_create(matrix_ks_aux_fit(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix)
2894 CALL dbcsr_copy(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_hfx(ispin, img)%matrix)
2895 CALL dbcsr_add(matrix_ks_aux_fit(ispin, img)%matrix, matrix_ks_aux_fit_dft(ispin, img)%matrix, &
2896 1.0_dp, -admm_env%gsi(ispin)**(2.0_dp/3.0_dp))
2903 ALLOCATE (kmatrix(2))
2904 CALL dbcsr_create(kmatrix(1), template=matrix_ks_aux_fit(1, 1)%matrix, &
2905 matrix_type=dbcsr_type_symmetric)
2906 CALL dbcsr_create(kmatrix(2), template=matrix_ks_aux_fit(1, 1)%matrix, &
2907 matrix_type=dbcsr_type_antisymmetric)
2908 CALL dbcsr_create(kmatrix_tmp, template=matrix_ks_aux_fit(1, 1)%matrix, &
2909 matrix_type=dbcsr_type_no_symmetry)
2913 kplocal = kp_range(2) - kp_range(1) + 1
2914 para_env => kpoints%blacs_env_all%para_env
2915 ALLOCATE (info(kplocal*nspins*nkp_groups, 2))
2917 CALL cp_fm_struct_create(struct_aux_aux, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2918 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
2924 CALL cp_fm_struct_create(struct_aux_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2925 nrow_global=nao_aux_fit, ncol_global=nao_orb)
2928 CALL cp_fm_struct_create(struct_orb_orb, context=kpoints%blacs_env, para_env=kpoints%para_env_kp, &
2929 nrow_global=nao_orb, ncol_global=nao_orb)
2932 IF (.NOT. use_real_wfn)
THEN
2947 ALLOCATE (fm_skap(kplocal, 2, nspins), fm_skapa(kplocal, 2, nspins))
2948 DO ispin = 1, nspins
2951 CALL cp_fm_create(fm_skap(ikp, i, ispin), struct_aux_orb)
2952 CALL cp_fm_create(fm_skapa(ikp, i, ispin), struct_aux_aux)
2963 DO ispin = 1, nspins
2964 DO igroup = 1, nkp_groups
2966 ik = kp_dist(1, igroup) + ikp - 1
2967 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
2971 IF (use_real_wfn)
THEN
2973 CALL rskp_transform(rmatrix=kmatrix(1), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2974 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2980 CALL rskp_transform(rmatrix=kmatrix(1), cmatrix=kmatrix(2), rsmat=matrix_ks_aux_fit, ispin=ispin, &
2981 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
2990 IF (.NOT. use_real_wfn)
THEN
2995 IF (.NOT. use_real_wfn)
THEN
3005 DO ispin = 1, nspins
3006 DO igroup = 1, nkp_groups
3008 ik = kp_dist(1, igroup) + ikp - 1
3009 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3013 IF (.NOT. use_real_wfn)
THEN
3015 CALL cp_fm_to_cfm(work_aux_aux, work_aux_aux2, ckmatrix)
3019 kp => kpoints%kp_aux_env(ikp)%kpoint_env
3021 IF (use_real_wfn)
THEN
3031 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_aux_fit, nao_aux_fit, 1.0_dp, s_inv, &
3032 work_aux_aux, 0.0_dp, work_aux_aux3)
3033 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, work_aux_aux3, &
3034 kp%amat(1, 1), 0.0_dp, work_aux_orb)
3035 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, 1.0_dp, work_aux_orb, &
3036 kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), 0.0_dp, &
3037 fm_skap(ikp, 1, ispin))
3038 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, 1.0_dp, fm_skap(ikp, 1, ispin), &
3039 kp%amat(1, 1), 0.0_dp, fm_skapa(ikp, 1, ispin))
3043 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3047 fac = cmplx(-admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
3052 IF (admm_env%do_admmp)
THEN
3056 fac = cmplx(-admm_env%gsi(ispin)*admm_env%lambda_merlot(ispin), 0.0_dp,
dp)
3057 fac2 = cmplx(admm_env%gsi(ispin)**2, 0.0_dp,
dp)
3061 CALL cp_fm_to_cfm(kp%smat(1, 1), kp%smat(2, 1), cs_inv)
3067 CALL cp_fm_to_cfm(kpoints%kp_env(ikp)%kpoint_env%pmat(1, ispin), &
3068 kpoints%kp_env(ikp)%kpoint_env%pmat(2, ispin), &
3075 ckmatrix,
z_zero, cwork_aux_aux)
3076 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit,
z_one, cwork_aux_aux, &
3077 ca,
z_zero, cwork_aux_orb)
3079 cpmatrix,
z_zero, cwork_aux_orb2)
3080 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
z_one, cwork_aux_orb2, &
3081 ca,
z_zero, cwork_aux_aux)
3083 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3088 fac = cmplx(0.5_dp*admm_env%lambda_merlot(ispin)*admm_env%gsi(ispin), 0.0_dp,
dp)
3091 CALL parallel_gemm(
'N',
'C', nao_aux_fit, nao_aux_fit, nao_orb,
fac, cwork_aux_orb, &
3092 ca,
z_one, cwork_aux_aux)
3095 CALL cp_cfm_to_fm(cwork_aux_orb2, mtargetr=fm_skap(ikp, 1, ispin), mtargeti=fm_skap(ikp, 2, ispin))
3096 CALL cp_cfm_to_fm(cwork_aux_aux, mtargetr=fm_skapa(ikp, 1, ispin), mtargeti=fm_skapa(ikp, 2, ispin))
3105 DO ispin = 1, nspins
3106 DO igroup = 1, nkp_groups
3108 ik = kp_dist(1, igroup) + ikp - 1
3109 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3127 IF (.NOT. use_real_wfn)
THEN
3140 ALLOCATE (matrix_skap(nspins, nimg), matrix_skapa(nspins, nimg))
3142 DO ispin = 1, nspins
3143 ALLOCATE (matrix_skap(ispin, img)%matrix)
3144 CALL dbcsr_create(matrix_skap(ispin, img)%matrix, template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3145 matrix_type=dbcsr_type_no_symmetry)
3148 ALLOCATE (matrix_skapa(ispin, img)%matrix)
3149 CALL dbcsr_create(matrix_skapa(ispin, img)%matrix, template=matrix_s_aux_fit(1, 1)%matrix, &
3150 matrix_type=dbcsr_type_no_symmetry)
3155 ALLOCATE (fmwork(2))
3156 CALL cp_fm_get_info(admm_env%work_aux_orb, matrix_struct=struct_aux_orb)
3160 matrix_s_aux_fit_vs_orb(1, 1)%matrix, sab_aux_fit_vs_orb, &
3161 fmwork, for_aux_fit=.true., pmat_ext=fm_skap)
3165 CALL cp_fm_get_info(admm_env%work_aux_aux, matrix_struct=struct_aux_aux)
3169 matrix_s_aux_fit(1, 1)%matrix, sab_aux_fit_asymm, &
3170 fmwork, for_aux_fit=.true., pmat_ext=fm_skapa)
3176 DO ispin = 1, nspins
3177 CALL dbcsr_scale(matrix_skap(ispin, img)%matrix, -2.0_dp)
3178 CALL dbcsr_scale(matrix_skapa(ispin, img)%matrix, 2.0_dp)
3180 IF (nspins == 2)
THEN
3181 CALL dbcsr_add(matrix_skap(1, img)%matrix, matrix_skap(2, img)%matrix, 1.0_dp, 1.0_dp)
3182 CALL dbcsr_add(matrix_skapa(1, img)%matrix, matrix_skapa(2, img)%matrix, 1.0_dp, 1.0_dp)
3186 ALLOCATE (admm_force(3, natom))
3189 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3192 DO ispin = 1, nspins
3193 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -admm_env%lambda_merlot(ispin))
3195 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, 1.0_dp)
3199 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"ORB", basis_type_b=
"ORB", &
3200 sab_nl=sab_kp, matrixkp_p=rho_ao_orb(1, :))
3202 IF (nspins == 2)
CALL dbcsr_add(rho_ao_orb(1, img)%matrix, rho_ao_orb(2, img)%matrix, 1.0_dp, -1.0_dp)
3203 DO ispin = 1, nspins
3204 CALL dbcsr_scale(rho_ao_orb(ispin, img)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3209 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3210 sab_nl=sab_aux_fit_vs_orb, matrixkp_p=matrix_skap(1, :))
3211 CALL build_overlap_force(qs_env%ks_env, admm_force, basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3212 sab_nl=sab_aux_fit_asymm, matrixkp_p=matrix_skapa(1, :))
3214 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3215 DEALLOCATE (admm_force)
3217 DO ispin = 1, nspins
3228 IF (admm_env%do_admms)
THEN
3232 CALL timestop(handle)
3245 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_hz, matrix_pz
3246 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: fval
3248 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_projection_derivative'
3250 INTEGER :: handle, ispin, nao, natom, naux, nspins
3251 REAL(kind=
dp) :: my_fval
3252 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3255 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3256 TYPE(
dbcsr_type),
POINTER :: matrix_w_q, matrix_w_s
3258 POINTER :: sab_aux_fit_asymm, sab_aux_fit_vs_orb
3262 CALL timeset(routinen, handle)
3264 cpassert(
ASSOCIATED(qs_env))
3266 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
3267 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, sab_aux_fit_asymm=sab_aux_fit_asymm, &
3268 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3271 IF (
PRESENT(fval)) my_fval = fval
3273 ALLOCATE (matrix_w_q)
3274 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3277 ALLOCATE (matrix_w_s)
3278 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3279 name=
'W MATRIX AUX S', &
3280 matrix_type=dbcsr_type_no_symmetry)
3283 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3284 natom=natom, force=force)
3285 ALLOCATE (admm_force(3, natom))
3288 nspins =
SIZE(matrix_pz)
3289 nao = admm_env%nao_orb
3290 naux = admm_env%nao_aux_fit
3294 DO ispin = 1, nspins
3296 CALL parallel_gemm(
"N",
"T", naux, naux, naux, 1.0_dp, admm_env%s_inv, &
3297 admm_env%work_aux_aux, 0.0_dp, admm_env%work_aux_aux2)
3298 CALL parallel_gemm(
"N",
"N", naux, nao, naux, 1.0_dp, admm_env%work_aux_aux2, &
3299 admm_env%A, 0.0_dp, admm_env%work_aux_orb)
3302 CALL parallel_gemm(
"N",
"N", naux, nao, nao, 1.0_dp, admm_env%work_aux_orb, &
3303 admm_env%work_orb_orb, 1.0_dp, admm_env%work_aux_orb2)
3306 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb2, matrix_w_q, keep_sparsity=.true.)
3309 CALL parallel_gemm(
"N",
"T", naux, naux, nao, 1.0_dp, admm_env%work_aux_orb2, &
3310 admm_env%A, 0.0_dp, admm_env%work_aux_aux)
3311 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3317 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3318 sab_nl=sab_aux_fit_asymm, matrix_p=matrix_w_s)
3320 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3321 sab_nl=sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3324 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3326 DEALLOCATE (admm_force)
3330 CALL timestop(handle)
3365 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_mixed_overlap_force'
3367 INTEGER :: handle, ispin, iw, nao_aux_fit, nao_orb, &
3368 natom, neighbor_list_id, nmo
3369 LOGICAL :: omit_headers
3370 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
3375 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit, &
3376 matrix_s_aux_fit_vs_orb, rho_ao, &
3378 TYPE(
dbcsr_type),
POINTER :: matrix_rho_aux_desymm_tmp, matrix_w_q, &
3390 CALL timeset(routinen, handle)
3392 NULLIFY (admm_env, logger, dft_control, para_env, mos, mo_coeff, matrix_w_q, matrix_w_s, &
3393 rho, rho_aux_fit, energy, sab_orb, ks_env, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, matrix_s)
3396 admm_env=admm_env, &
3398 dft_control=dft_control, &
3399 matrix_s=matrix_s, &
3400 neighbor_list_id=neighbor_list_id, &
3406 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, rho_aux_fit=rho_aux_fit, &
3407 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
3413 nao_aux_fit = admm_env%nao_aux_fit
3414 nao_orb = admm_env%nao_orb
3419 IF (admm_env%block_dm)
THEN
3420 cpabort(
"ADMM Forces not implemented for blocked projection methods!")
3425 cpabort(
"ADMM Forces only implemented without purification or for MO_DIAG.")
3430 ALLOCATE (matrix_w_s)
3431 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
3432 name=
'W MATRIX AUX S', &
3433 matrix_type=dbcsr_type_no_symmetry)
3436 ALLOCATE (matrix_w_q)
3437 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
3440 DO ispin = 1, dft_control%nspins
3441 nmo = admm_env%nmo(ispin)
3442 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
3446 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3447 1.0_dp, admm_env%S_inv, admm_env%mo_derivs_aux_fit(ispin), 0.0_dp, &
3448 admm_env%work_aux_nmo(ispin))
3451 CALL parallel_gemm(
'T',
'N', nao_aux_fit, nmo, nao_aux_fit, &
3452 1.0_dp, admm_env%S_inv, admm_env%H(ispin), 0.0_dp, &
3453 admm_env%work_aux_nmo(ispin))
3458 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv_sqrt(ispin), 0.0_dp, &
3459 admm_env%work_aux_nmo2(ispin))
3463 -1.0_dp, admm_env%work_aux_nmo2(ispin), mo_coeff, 0.0_dp, &
3464 admm_env%work_aux_orb)
3467 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3468 -1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
3469 admm_env%work_aux_aux)
3474 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3475 admm_env%work_orb_nmo(ispin))
3478 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3479 admm_env%work_orb_orb)
3481 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3482 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3483 admm_env%work_aux_orb)
3487 1.0_dp, mo_coeff, admm_env%R_schur_R_t(ispin), 0.0_dp, &
3488 admm_env%work_orb_nmo(ispin))
3491 1.0_dp, mo_coeff, admm_env%work_orb_nmo(ispin), 0.0_dp, &
3492 admm_env%work_orb_orb)
3494 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3495 -1.0_dp, admm_env%A, admm_env%work_orb_orb, 1.0_dp, &
3496 admm_env%work_aux_orb)
3502 IF (admm_env%do_admms)
THEN
3504 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3506 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3507 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3510 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3511 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3512 admm_env%work_aux_orb)
3515 ELSE IF (admm_env%do_admmp)
THEN
3516 CALL cp_fm_scale(admm_env%gsi(ispin)**2, admm_env%work_aux_orb)
3519 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3520 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3523 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3524 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3525 admm_env%work_aux_orb)
3528 ELSE IF (admm_env%do_admmq)
THEN
3530 CALL cp_fm_scale(admm_env%gsi(ispin), admm_env%work_aux_orb)
3532 4.0_dp*(admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin)/dft_control%nspins, &
3533 mo_coeff, mo_coeff, 0.0_dp, admm_env%work_orb_orb2)
3536 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3537 1.0_dp, admm_env%A, admm_env%work_orb_orb2, 1.0_dp, &
3538 admm_env%work_aux_orb)
3542 CALL copy_fm_to_dbcsr(admm_env%work_aux_orb, matrix_w_q, keep_sparsity=.true.)
3546 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_orb, &
3547 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
3548 admm_env%work_aux_orb)
3550 CALL parallel_gemm(
'N',
'T', nao_aux_fit, nao_aux_fit, nao_orb, &
3551 1.0_dp, admm_env%work_aux_orb, admm_env%A, 1.0_dp, &
3552 admm_env%work_aux_aux)
3556 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_w_s, keep_sparsity=.true.)
3559 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3562 NULLIFY (matrix_rho_aux_desymm_tmp)
3563 ALLOCATE (matrix_rho_aux_desymm_tmp)
3564 CALL dbcsr_create(matrix_rho_aux_desymm_tmp, template=matrix_s_aux_fit(1)%matrix, &
3565 name=
'Rho_aux non-symm', &
3566 matrix_type=dbcsr_type_no_symmetry)
3572 IF (admm_env%do_admms .OR. admm_env%do_admmq)
THEN
3574 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3575 -admm_env%lambda_merlot(ispin))
3578 ELSE IF (admm_env%do_admmp)
THEN
3580 CALL dbcsr_scale(matrix_w_s, admm_env%gsi(ispin)**2)
3581 CALL dbcsr_add(matrix_w_s, matrix_rho_aux_desymm_tmp, 1.0_dp, &
3582 (-admm_env%gsi(ispin))*admm_env%lambda_merlot(ispin))
3592 ALLOCATE (admm_force(3, natom))
3595 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
3596 sab_nl=admm_env%sab_aux_fit_asymm, matrix_p=matrix_w_s)
3598 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
3599 sab_nl=admm_env%sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
3602 IF (admm_env%do_admmq .OR. admm_env%do_admmp .OR. admm_env%do_admms)
THEN
3603 CALL dbcsr_scale(rho_ao(ispin)%matrix, -admm_env%lambda_merlot(ispin))
3605 basis_type_a=
"ORB", basis_type_b=
"ORB", &
3606 sab_nl=sab_orb, matrix_p=rho_ao(ispin)%matrix)
3607 CALL dbcsr_scale(rho_ao(ispin)%matrix, -1.0_dp/admm_env%lambda_merlot(ispin))
3611 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
3613 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
3614 DEALLOCATE (admm_force)
3616 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
3618 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3622 para_env, output_unit=iw, omit_headers=omit_headers)
3624 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3627 qs_env%input,
"DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT"),
cp_p_file))
THEN
3631 para_env, output_unit=iw, omit_headers=omit_headers)
3633 "DFT%PRINT%AO_MATRICES/W_MATRIX_AUX_FIT")
3642 CALL timestop(handle)
3656 SUBROUTINE calculate_dm_mo_no_diag(admm_env, mo_set, density_matrix, overlap_matrix, &
3657 density_matrix_large, overlap_matrix_large, ispin)
3660 TYPE(
dbcsr_type),
POINTER :: density_matrix, overlap_matrix, &
3661 density_matrix_large, &
3662 overlap_matrix_large
3665 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_dm_mo_no_diag'
3667 INTEGER :: handle, nao_aux_fit, nmo
3668 REAL(kind=
dp) :: alpha, nel_tmp_aux
3672 CALL timeset(routinen, handle)
3675 nao_aux_fit = admm_env%nao_aux_fit
3676 nmo = admm_env%nmo(ispin)
3677 CALL cp_fm_to_fm(admm_env%C_hat(ispin), admm_env%work_aux_nmo(ispin))
3678 CALL cp_fm_column_scale(admm_env%work_aux_nmo(ispin), mo_set%occupation_numbers(1:mo_set%homo))
3681 1.0_dp, admm_env%work_aux_nmo(ispin), admm_env%lambda_inv(ispin), 0.0_dp, &
3682 admm_env%work_aux_nmo2(ispin))
3685 IF (.NOT. mo_set%uniform_occupation)
THEN
3688 matrix_v=admm_env%C_hat(ispin), &
3689 matrix_g=admm_env%work_aux_nmo2(ispin), &
3696 matrix_v=admm_env%C_hat(ispin), &
3697 matrix_g=admm_env%work_aux_nmo2(ispin), &
3705 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3709 admm_env%n_large_basis(3) = 0.0_dp
3713 CALL dbcsr_dot(density_matrix_large, overlap_matrix_large, admm_env%n_large_basis(ispin))
3714 admm_env%n_large_basis(3) = admm_env%n_large_basis(3) + admm_env%n_large_basis(ispin)
3716 CALL dbcsr_dot(density_matrix, overlap_matrix, nel_tmp_aux)
3717 admm_env%gsi(ispin) = admm_env%n_large_basis(ispin)/nel_tmp_aux
3719 IF (admm_env%do_admmq .OR. admm_env%do_admms)
THEN
3721 CALL dbcsr_scale(density_matrix, admm_env%gsi(ispin))
3726 CALL timestop(handle)
3728 END SUBROUTINE calculate_dm_mo_no_diag
3738 SUBROUTINE blockify_density_matrix(admm_env, density_matrix, density_matrix_aux, &
3741 TYPE(
dbcsr_type),
POINTER :: density_matrix, density_matrix_aux
3742 INTEGER :: ispin, nspins
3744 CHARACTER(len=*),
PARAMETER :: routinen =
'blockify_density_matrix'
3746 INTEGER :: handle, iatom, jatom
3748 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block, sparse_block_aux
3751 CALL timeset(routinen, handle)
3754 CALL dbcsr_set(density_matrix_aux, 0.0_dp)
3760 IF (admm_env%block_map(iatom, jatom) == 1)
THEN
3762 row=iatom, col=jatom, block=sparse_block_aux, found=found)
3764 sparse_block_aux = sparse_block
3771 CALL copy_dbcsr_to_fm(density_matrix_aux, admm_env%P_to_be_purified(ispin))
3774 IF (nspins == 1)
THEN
3775 CALL cp_fm_scale(0.5_dp, admm_env%P_to_be_purified(ispin))
3778 CALL timestop(handle)
3779 END SUBROUTINE blockify_density_matrix
3786 ELEMENTAL FUNCTION delta(x)
3787 REAL(kind=
dp),
INTENT(IN) :: x
3788 REAL(kind=
dp) :: delta
3790 IF (x == 0.0_dp)
THEN
3803 ELEMENTAL FUNCTION heaviside(x)
3804 REAL(kind=
dp),
INTENT(IN) :: x
3805 REAL(kind=
dp) :: heaviside
3807 IF (x < 0.0_dp)
THEN
3812 END FUNCTION heaviside
3823 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: dm_admm
3825 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_aux_response_density'
3827 INTEGER :: handle, ispin, nao, nao_aux, ncol, nspins
3831 CALL timeset(routinen, handle)
3833 CALL get_qs_env(qs_env, admm_env=admm_env, dft_control=dft_control)
3835 nspins = dft_control%nspins
3837 cpassert(
ASSOCIATED(admm_env%A))
3838 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
3839 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
3840 cpassert(
ASSOCIATED(admm_env%work_aux_aux))
3841 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
3844 CALL cp_fm_get_info(admm_env%work_orb_orb, nrow_global=nao, ncol_global=ncol)
3845 DO ispin = 1, nspins
3847 CALL parallel_gemm(
'N',
'N', nao_aux, ncol, nao, 1.0_dp, admm_env%A, &
3848 admm_env%work_orb_orb, 0.0_dp, admm_env%work_aux_orb)
3849 CALL parallel_gemm(
'N',
'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%A, &
3850 admm_env%work_aux_orb, 0.0_dp, admm_env%work_aux_aux)
3851 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, dm_admm(ispin)%matrix, keep_sparsity=.true.)
3854 CALL timestop(handle)
3865 LOGICAL :: calculate_forces
3867 INTEGER :: ic, igroup, ik, ikp, indx, kplocal, &
3868 nao_aux_fit, nao_orb, nc, nkp, &
3870 INTEGER,
DIMENSION(2) :: kp_range
3871 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
3872 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
3873 LOGICAL :: my_kpgrp, use_real_wfn
3874 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
3877 TYPE(
cp_cfm_type) :: cmat_aux_fit, cmat_aux_fit_vs_orb, &
3878 cwork_aux_fit, cwork_aux_fit_vs_orb
3880 matrix_struct_aux_fit_vs_orb
3882 imat_aux_fit_vs_orb, rmat_aux_fit, &
3883 rmat_aux_fit_vs_orb, work_aux_fit
3884 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fmwork
3885 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_aux_fit, matrix_s_aux_fit_vs_orb
3886 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: dbcsr_aux_fit, dbcsr_aux_fit_vs_orb
3891 POINTER :: sab_aux_fit, sab_aux_fit_vs_orb
3893 NULLIFY (xkp, kp_dist, para_env_local, cell_to_index, admm_env, kp, &
3894 kpoints, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, sab_aux_fit, sab_aux_fit_vs_orb, &
3895 para_env_global, matrix_struct_aux_fit, matrix_struct_aux_fit_vs_orb)
3897 CALL get_qs_env(qs_env, kpoints=kpoints, admm_env=admm_env)
3899 CALL get_admm_env(admm_env, matrix_s_aux_fit_kp=matrix_s_aux_fit, &
3900 matrix_s_aux_fit_vs_orb_kp=matrix_s_aux_fit_vs_orb, &
3901 sab_aux_fit=sab_aux_fit, &
3902 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
3904 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
3905 nkp_groups=nkp_groups, kp_dist=kp_dist, cell_to_index=cell_to_index)
3906 kplocal = kp_range(2) - kp_range(1) + 1
3908 IF (.NOT. use_real_wfn) nc = 2
3910 ALLOCATE (dbcsr_aux_fit(3))
3911 CALL dbcsr_create(dbcsr_aux_fit(1), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
3912 CALL dbcsr_create(dbcsr_aux_fit(2), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
3913 CALL dbcsr_create(dbcsr_aux_fit(3), template=matrix_s_aux_fit(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
3917 ALLOCATE (dbcsr_aux_fit_vs_orb(2))
3918 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(1), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3919 matrix_type=dbcsr_type_no_symmetry)
3920 CALL dbcsr_create(dbcsr_aux_fit_vs_orb(2), template=matrix_s_aux_fit_vs_orb(1, 1)%matrix, &
3921 matrix_type=dbcsr_type_no_symmetry)
3926 nao_aux_fit = admm_env%nao_aux_fit
3927 nao_orb = admm_env%nao_orb
3928 para_env_global => kpoints%blacs_env_all%para_env
3930 ALLOCATE (fmwork(4))
3931 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env_all, para_env=para_env_global, &
3932 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3937 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env_all, para_env=para_env_global, &
3938 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3939 CALL cp_fm_create(fmwork(3), matrix_struct_aux_fit_vs_orb)
3940 CALL cp_fm_create(fmwork(4), matrix_struct_aux_fit_vs_orb)
3944 nao_aux_fit = admm_env%nao_aux_fit
3945 nao_orb = admm_env%nao_orb
3946 para_env_local => kpoints%blacs_env%para_env
3948 CALL cp_fm_struct_create(matrix_struct_aux_fit, context=kpoints%blacs_env, para_env=para_env_local, &
3949 nrow_global=nao_aux_fit, ncol_global=nao_aux_fit)
3956 CALL cp_fm_struct_create(matrix_struct_aux_fit_vs_orb, context=kpoints%blacs_env, para_env=para_env_local, &
3957 nrow_global=nao_aux_fit, ncol_global=nao_orb)
3958 CALL cp_fm_create(rmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3959 CALL cp_fm_create(imat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3960 CALL cp_cfm_create(cwork_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3961 CALL cp_cfm_create(cmat_aux_fit_vs_orb, matrix_struct_aux_fit_vs_orb)
3963 ALLOCATE (info(kplocal*nkp_groups, 4))
3968 DO igroup = 1, nkp_groups
3969 ik = kp_dist(1, igroup) + ikp - 1
3970 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
3973 IF (use_real_wfn)
THEN
3975 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3976 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), rsmat=matrix_s_aux_fit, ispin=1, &
3977 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3982 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3983 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), rsmat=matrix_s_aux_fit_vs_orb, ispin=1, &
3984 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
3988 CALL dbcsr_set(dbcsr_aux_fit(1), 0.0_dp)
3989 CALL dbcsr_set(dbcsr_aux_fit(2), 0.0_dp)
3990 CALL rskp_transform(rmatrix=dbcsr_aux_fit(1), cmatrix=dbcsr_aux_fit(2), rsmat=matrix_s_aux_fit, &
3991 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_aux_fit)
3998 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(1), 0.0_dp)
3999 CALL dbcsr_set(dbcsr_aux_fit_vs_orb(2), 0.0_dp)
4000 CALL rskp_transform(rmatrix=dbcsr_aux_fit_vs_orb(1), cmatrix=dbcsr_aux_fit_vs_orb(2), &
4001 rsmat=matrix_s_aux_fit_vs_orb, ispin=1, xkp=xkp(1:3, ik), &
4002 cell_to_index=cell_to_index, sab_nl=sab_aux_fit_vs_orb)
4010 IF (.NOT. use_real_wfn)
THEN
4017 IF (.NOT. use_real_wfn)
THEN
4029 DO igroup = 1, nkp_groups
4030 ik = kp_dist(1, igroup) + ikp - 1
4031 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
4037 IF (.NOT. use_real_wfn)
THEN
4044 kp => kpoints%kp_aux_env(ikp)%kpoint_env
4048 ALLOCATE (kp%amat(nc, 1))
4050 CALL cp_fm_create(kp%amat(ic, 1), matrix_struct_aux_fit_vs_orb)
4054 IF (admm_env%do_admmp .OR. admm_env%do_admmq .OR. admm_env%do_admms .OR. calculate_forces)
THEN
4056 ALLOCATE (kp%smat(nc, 1))
4058 CALL cp_fm_create(kp%smat(ic, 1), matrix_struct_aux_fit)
4061 IF (.NOT. use_real_wfn)
CALL cp_fm_to_fm(imat_aux_fit, kp%smat(2, 1))
4064 IF (use_real_wfn)
THEN
4071 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, 1.0_dp, &
4072 rmat_aux_fit, rmat_aux_fit_vs_orb, 0.0_dp, kp%amat(1, 1))
4076 CALL cp_fm_to_cfm(rmat_aux_fit, imat_aux_fit, cmat_aux_fit)
4082 CALL cp_fm_to_cfm(rmat_aux_fit_vs_orb, imat_aux_fit_vs_orb, cmat_aux_fit_vs_orb)
4084 cmat_aux_fit, cmat_aux_fit_vs_orb,
z_zero, cwork_aux_fit_vs_orb)
4085 CALL cp_cfm_to_fm(cwork_aux_fit_vs_orb, kp%amat(1, 1), kp%amat(2, 1))
4092 DO igroup = 1, nkp_groups
4093 ik = kp_dist(1, igroup) + ikp - 1
4094 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
4100 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_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, cartesian_basis)
...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_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_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_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
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 kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext, overlap_rs)
generate real space density matrices in DBCSR format
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
Get information from a single kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public add_qs_force(force, qs_force, forcetype, atomic_kind_set)
Add force to a force_type variable.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_force(ks_env, force, basis_type_a, basis_type_b, sab_nl, matrix_p, matrixkp_p)
Calculation of the force contribution from an overlap matrix over Cartesian Gaussian functions.
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
module that contains the definitions of the scf types
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external, calculate_forces)
...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external, native_skala_atom_force)
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.