36 fm_pools_create_fm_vect
52 USE dbcsr_api,
ONLY: dbcsr_add,&
104 #include "./base/base_uses.f90"
108 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_p_env_methods'
109 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .false.
132 orthogonal_orbitals, linres_control)
134 TYPE(qs_p_env_type) :: p_env
135 TYPE(qs_environment_type),
POINTER :: qs_env
136 TYPE(dbcsr_p_type),
DIMENSION(:),
OPTIONAL, &
137 POINTER :: p1_option, p1_admm_option
138 LOGICAL,
INTENT(in),
OPTIONAL :: orthogonal_orbitals
139 TYPE(linres_control_type),
OPTIONAL,
POINTER :: linres_control
141 CHARACTER(len=*),
PARAMETER :: routinen =
'p_env_create'
143 INTEGER :: handle, n_ao, n_mo, n_spins, natom, spin
144 TYPE(admm_gapw_r3d_rs_type),
POINTER :: admm_gapw_env
145 TYPE(admm_type),
POINTER :: admm_env
146 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
147 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
148 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
POINTER :: ao_mo_fm_pools, mo_mo_fm_pools
149 TYPE(cp_fm_type),
POINTER :: qs_env_c
150 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_fit
151 TYPE(dft_control_type),
POINTER :: dft_control
152 TYPE(mp_para_env_type),
POINTER :: para_env
153 TYPE(pw_env_type),
POINTER :: pw_env
154 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
156 CALL timeset(routinen, handle)
157 NULLIFY (ao_mo_fm_pools, mo_mo_fm_pools, matrix_s, dft_control, para_env, blacs_env)
160 dft_control=dft_control, &
164 n_spins = dft_control%nspins
166 p_env%new_preconditioner = .true.
168 ALLOCATE (p_env%rho1)
170 ALLOCATE (p_env%rho1_xc)
173 ALLOCATE (p_env%kpp1_env)
176 IF (
PRESENT(p1_option))
THEN
177 p_env%p1 => p1_option
181 ALLOCATE (p_env%p1(spin)%matrix)
182 CALL dbcsr_copy(p_env%p1(spin)%matrix, matrix_s(1)%matrix, &
183 name=
"p_env%p1-"//trim(adjustl(cp_to_string(spin))))
184 CALL dbcsr_set(p_env%p1(spin)%matrix, 0.0_dp)
188 IF (dft_control%do_admm)
THEN
189 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
191 ALLOCATE (p_env%rho1_admm)
195 IF (
PRESENT(p1_admm_option))
THEN
196 p_env%p1_admm => p1_admm_option
200 ALLOCATE (p_env%p1_admm(spin)%matrix)
201 CALL dbcsr_copy(p_env%p1_admm(spin)%matrix, matrix_s_aux_fit(1)%matrix, &
202 name=
"p_env%p1_admm-"//trim(adjustl(cp_to_string(spin))))
203 CALL dbcsr_set(p_env%p1_admm(spin)%matrix, 0.0_dp)
207 IF (admm_env%do_gapw)
THEN
208 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
209 admm_gapw_env => admm_env%admm_gapw_env
212 admm_gapw_env%admm_kind_set, dft_control, para_env)
216 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools, &
217 mo_mo_fm_pools=mo_mo_fm_pools)
222 CALL get_mo_set(qs_env%mos(spin), mo_coeff=qs_env_c)
224 ncol_global=n_mo, nrow_global=n_ao)
225 p_env%n_mo(spin) = n_mo
226 p_env%n_ao(spin) = n_ao
229 p_env%orthogonal_orbitals = .false.
230 IF (
PRESENT(orthogonal_orbitals)) &
231 p_env%orthogonal_orbitals = orthogonal_orbitals
233 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%S_psi0, &
237 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%m_epsilon, &
238 name=
"p_env%m_epsilon")
241 IF (.NOT. p_env%orthogonal_orbitals)
THEN
242 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%Smo_inv, &
243 name=
"p_env%Smo_inv")
246 IF (.NOT. p_env%orthogonal_orbitals)
THEN
247 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, &
248 elements=p_env%psi0d, &
255 IF (dft_control%qs_control%gapw)
THEN
257 atomic_kind_set=atomic_kind_set, &
260 qs_kind_set=qs_kind_set)
264 qs_kind_set, dft_control, para_env)
266 CALL init_rho0(p_env%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
271 ELSEIF (dft_control%qs_control%gapw_xc)
THEN
273 atomic_kind_set=atomic_kind_set, &
274 qs_kind_set=qs_kind_set)
277 qs_kind_set, dft_control, para_env)
283 IF (
PRESENT(linres_control))
THEN
287 IF (.NOT.
ASSOCIATED(p_env%preconditioner))
THEN
289 ALLOCATE (p_env%preconditioner(n_spins))
292 para_env=para_env, blacs_env=blacs_env)
295 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%PS_psi0, &
296 name=
"p_env%PS_psi0")
302 CALL timestop(handle)
317 TYPE(qs_p_env_type) :: p_env
318 TYPE(qs_environment_type),
POINTER :: qs_env
320 CHARACTER(len=*),
PARAMETER :: routinen =
'p_env_check_i_alloc'
322 CHARACTER(len=25) :: name
323 INTEGER :: handle, ispin, nspins
325 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
326 TYPE(dft_control_type),
POINTER :: dft_control
328 CALL timeset(routinen, handle)
330 NULLIFY (dft_control, matrix_s)
332 CALL get_qs_env(qs_env, dft_control=dft_control)
333 gapw_xc = dft_control%qs_control%gapw_xc
334 IF (.NOT.
ASSOCIATED(p_env%kpp1))
THEN
336 nspins = dft_control%nspins
342 ALLOCATE (p_env%kpp1(ispin)%matrix)
343 CALL dbcsr_copy(p_env%kpp1(ispin)%matrix, matrix_s(1)%matrix, &
344 name=trim(name)//adjustl(cp_to_string(ispin)))
345 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
355 IF (dft_control%do_admm .AND. .NOT.
ASSOCIATED(p_env%kpp1_admm))
THEN
356 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s)
357 nspins = dft_control%nspins
360 name =
"p_env%kpp1_admm-"
363 ALLOCATE (p_env%kpp1_admm(ispin)%matrix)
364 CALL dbcsr_copy(p_env%kpp1_admm(ispin)%matrix, matrix_s(1)%matrix, &
365 name=trim(name)//adjustl(cp_to_string(ispin)))
366 CALL dbcsr_set(p_env%kpp1_admm(ispin)%matrix, 0.0_dp)
375 IF (.NOT.
ASSOCIATED(p_env%rho1))
THEN
381 IF (dft_control%do_admm)
THEN
389 CALL timestop(handle)
398 TYPE(qs_p_env_type),
INTENT(IN) :: p_env
399 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
401 CHARACTER(LEN=*),
PARAMETER :: routinen =
'p_env_update_rho'
403 CHARACTER(LEN=default_string_length) :: basis_type
404 INTEGER :: handle, ispin
405 TYPE(admm_type),
POINTER :: admm_env
406 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho1_ao
407 TYPE(dft_control_type),
POINTER :: dft_control
408 TYPE(mp_para_env_type),
POINTER :: para_env
409 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
410 POINTER :: sab_aux_fit
411 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_aux
412 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_aux
413 TYPE(qs_ks_env_type),
POINTER :: ks_env
414 TYPE(task_list_type),
POINTER :: task_list
416 CALL timeset(routinen, handle)
418 CALL get_qs_env(qs_env, dft_control=dft_control)
423 DO ispin = 1,
SIZE(rho1_ao)
424 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1(ispin)%matrix)
428 rho_xc_external=p_env%rho1_xc, &
429 local_rho_set=p_env%local_rho_set, &
432 IF (dft_control%do_admm)
THEN
434 NULLIFY (ks_env, rho1_ao, rho_g_aux, rho_r_aux, task_list)
436 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
437 basis_type =
"AUX_FIT"
438 CALL get_admm_env(qs_env%admm_env, task_list_aux_fit=task_list)
439 IF (admm_env%do_gapw)
THEN
440 basis_type =
"AUX_FIT_SOFT"
441 task_list => admm_env%admm_gapw_env%task_list
447 DO ispin = 1,
SIZE(rho1_ao)
448 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
450 matrix_p=rho1_ao(ispin)%matrix, &
451 rho=rho_r_aux(ispin), &
452 rho_gspace=rho_g_aux(ispin), &
453 soft_valid=.false., &
454 basis_type=basis_type, &
455 task_list_external=task_list)
457 IF (admm_env%do_gapw)
THEN
461 rho_atom_set=p_env%local_rho_set_admm%rho_atom_set, &
462 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
463 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
468 CALL timestop(handle)
483 TYPE(qs_p_env_type) :: p_env
484 TYPE(qs_environment_type),
POINTER :: qs_env
486 CHARACTER(len=*),
PARAMETER :: routinen =
'p_env_psi0_changed'
488 INTEGER :: handle, iounit, lfomo, n_spins, nmo, spin
489 LOGICAL :: was_present
490 REAL(kind=
dp) :: maxocc
491 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
POINTER :: ao_mo_fm_pools
492 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: psi0
493 TYPE(cp_fm_type),
POINTER :: mo_coeff
494 TYPE(cp_logger_type),
POINTER :: logger
495 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, rho_ao
496 TYPE(dft_control_type),
POINTER :: dft_control
497 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
498 TYPE(mp_para_env_type),
POINTER :: para_env
499 TYPE(qs_energy_type),
POINTER :: energy
500 TYPE(qs_ks_env_type),
POINTER :: ks_env
501 TYPE(qs_rho_type),
POINTER :: rho
502 TYPE(section_vals_type),
POINTER :: input, lr_section
504 CALL timeset(routinen, handle)
506 NULLIFY (ao_mo_fm_pools, mos, psi0, matrix_s, mos, para_env, ks_env, rho, &
507 logger, input, lr_section, energy, matrix_ks, dft_control, rho_ao)
514 matrix_ks=matrix_ks, &
519 dft_control=dft_control)
523 n_spins = dft_control%nspins
525 ao_mo_fm_pools=ao_mo_fm_pools)
526 ALLOCATE (psi0(n_spins))
530 CALL cp_fm_to_fm(mo_coeff, psi0(spin))
535 IF (p_env%orthogonal_orbitals)
THEN
536 IF (
ASSOCIATED(p_env%psi0d))
THEN
537 CALL cp_fm_release(p_env%psi0d)
547 p_env%S_psi0(spin), &
548 ncol=p_env%n_mo(spin), alpha=1.0_dp)
549 CALL parallel_gemm(transa=
'T', transb=
'N', n=p_env%n_mo(spin), &
550 m=p_env%n_mo(spin), k=p_env%n_ao(spin), alpha=1.0_dp, &
551 matrix_a=psi0(spin), &
552 matrix_b=p_env%S_psi0(spin), &
553 beta=0.0_dp, matrix_c=p_env%m_epsilon(spin))
561 triangular_matrix=p_env%m_epsilon(spin), &
562 matrix_b=p_env%Smo_inv(spin), side=
'R', &
563 invert_tr=.true., n_rows=p_env%n_mo(spin), &
564 n_cols=p_env%n_mo(spin))
566 triangular_matrix=p_env%m_epsilon(spin), &
567 matrix_b=p_env%Smo_inv(spin), side=
'R', &
568 transpose_tr=.true., &
569 invert_tr=.true., n_rows=p_env%n_mo(spin), &
570 n_cols=p_env%n_mo(spin))
574 CALL cp_fm_to_fm(psi0(spin), &
577 triangular_matrix=p_env%m_epsilon(spin), &
578 matrix_b=p_env%psi0d(spin), side=
'R', &
579 invert_tr=.true., n_rows=p_env%n_ao(spin), &
580 n_cols=p_env%n_mo(spin))
582 triangular_matrix=p_env%m_epsilon(spin), &
583 matrix_b=p_env%psi0d(spin), side=
'R', &
584 transpose_tr=.true., &
585 invert_tr=.true., n_rows=p_env%n_ao(spin), &
586 n_cols=p_env%n_mo(spin))
590 nmo=nmo, maxocc=maxocc)
591 IF (lfomo > nmo)
THEN
592 CALL dbcsr_set(rho_ao(spin)%matrix, 0.0_dp)
594 matrix_v=psi0(spin), &
595 matrix_g=p_env%psi0d(spin), &
596 ncol=p_env%n_mo(spin))
597 CALL dbcsr_scale(rho_ao(spin)%matrix, alpha_scalar=maxocc)
599 cpabort(
"symmetrized onesided smearing to do")
614 extension=
".linresLog")
617 IF (was_present)
THEN
618 WRITE (unit=iounit, fmt=
"(/,(T3,A,T55,F25.14))") &
619 "Total energy ground state: ", energy%total
623 "PRINT%PROGRAM_RUN_INFO")
633 p_env%S_psi0(spin), p_env%n_mo(spin))
635 CALL parallel_gemm(
'T',
'N', &
636 p_env%n_mo(spin), p_env%n_mo(spin), p_env%n_ao(spin), &
637 -1.0_dp, p_env%S_psi0(spin), p_env%psi0d(spin), &
638 0.0_dp, p_env%m_epsilon(spin))
651 p_env%S_psi0(spin), &
656 IF (p_env%orthogonal_orbitals)
THEN
659 CALL cp_fm_release(psi0)
665 CALL timestop(handle)
682 TYPE(qs_p_env_type) :: p_env
683 TYPE(qs_environment_type),
POINTER :: qs_env
684 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(in) :: v
685 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(inout) :: res
687 INTEGER :: n_spins, spin
688 TYPE(dft_control_type),
POINTER :: dft_control
690 NULLIFY (dft_control)
691 CALL get_qs_env(qs_env, dft_control=dft_control)
693 n_spins = dft_control%nspins
695 CALL p_op_l1_spin(p_env, qs_env, spin, v(spin), &
715 SUBROUTINE p_op_l1_spin(p_env, qs_env, spin, v, res)
718 TYPE(qs_p_env_type) :: p_env
719 TYPE(qs_environment_type),
POINTER :: qs_env
720 INTEGER,
INTENT(IN) :: spin
721 TYPE(cp_fm_type),
INTENT(IN) :: v, res
723 CHARACTER(len=*),
PARAMETER :: routinen =
'p_op_l1_spin'
725 INTEGER :: handle, ncol
726 TYPE(cp_fm_type) :: tmp
727 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
728 TYPE(dbcsr_type),
POINTER :: k_p
729 TYPE(dft_control_type),
POINTER :: dft_control
730 TYPE(mp_para_env_type),
POINTER :: para_env
732 CALL timeset(routinen, handle)
733 NULLIFY (matrix_ks, matrix_s, dft_control)
738 matrix_ks=matrix_ks, &
739 dft_control=dft_control)
742 cpassert(spin <= dft_control%nspins)
746 k_p => matrix_ks(spin)%matrix
749 IF (p_env%orthogonal_orbitals)
THEN
753 CALL cp_fm_symm(
'R',
'U', p_env%n_ao(spin), p_env%n_mo(spin), 1.0_dp, &
754 p_env%Smo_inv(spin), tmp, 0.0_dp, res)
757 CALL cp_fm_symm(
'R',
'U', p_env%n_ao(spin), p_env%n_mo(spin), 1.0_dp, &
758 p_env%m_epsilon(spin), v, 0.0_dp, tmp)
760 res, p_env%n_mo(spin), alpha=1.0_dp, beta=1.0_dp)
762 CALL cp_fm_release(tmp)
763 CALL timestop(handle)
765 END SUBROUTINE p_op_l1_spin
784 SUBROUTINE p_op_l2(p_env, qs_env, p1, res, alpha, beta)
786 TYPE(qs_p_env_type) :: p_env
787 TYPE(qs_environment_type),
POINTER :: qs_env
788 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: p1
789 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: res
790 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: alpha, beta
792 CHARACTER(len=*),
PARAMETER :: routinen =
'p_op_l2'
793 LOGICAL,
PARAMETER :: fdiff = .false.
795 INTEGER :: handle, ispin, n_spins
796 LOGICAL :: gapw, gapw_xc
797 REAL(kind=
dp) :: my_alpha, my_beta
798 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho1_ao
799 TYPE(dft_control_type),
POINTER :: dft_control
800 TYPE(qs_rho_type),
POINTER :: rho
802 CALL timeset(routinen, handle)
803 NULLIFY (dft_control, rho, rho1_ao)
805 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
807 gapw = dft_control%qs_control%gapw
808 gapw_xc = dft_control%qs_control%gapw_xc
810 IF (
PRESENT(alpha)) my_alpha = alpha
812 IF (
PRESENT(beta)) my_beta = beta
815 n_spins = dft_control%nspins
818 DO ispin = 1,
SIZE(p1)
820 IF (.NOT.
ASSOCIATED(rho1_ao(ispin)%matrix, p1(ispin)%matrix))
THEN
821 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p1(ispin)%matrix)
826 CALL qs_rho_update_rho(rho_struct=p_env%rho1, qs_env=qs_env, local_rho_set=p_env%local_rho_set)
827 ELSEIF (gapw_xc)
THEN
828 CALL qs_rho_update_rho(rho_struct=p_env%rho1, qs_env=qs_env, rho_xc_external=p_env%rho1_xc, &
829 local_rho_set=p_env%local_rho_set)
835 cpassert(.NOT. (gapw .OR. gapw_xc))
837 k_p_p1=p_env%kpp1, rho=rho, rho1=p_env%rho1)
840 rho1=p_env%rho1, rho1_xc=p_env%rho1_xc)
843 DO ispin = 1, n_spins
845 p_env%psi0d(ispin), res(ispin), &
846 ncol=p_env%n_mo(ispin), &
847 alpha=my_alpha, beta=my_beta)
850 CALL timestop(handle)
867 TYPE(qs_p_env_type) :: p_env
868 TYPE(qs_environment_type),
POINTER :: qs_env
869 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(inout) :: v
870 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: n_cols
872 CHARACTER(len=*),
PARAMETER :: routinen =
'p_preortho'
874 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
875 nmo2, spin, v_cols, v_rows
876 TYPE(cp_fm_pool_type),
POINTER :: maxmo_maxmo_fm_pool
877 TYPE(cp_fm_struct_type),
POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
878 TYPE(cp_fm_type) :: tmp_matrix
879 TYPE(dft_control_type),
POINTER :: dft_control
881 CALL timeset(routinen, handle)
883 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
886 CALL get_qs_env(qs_env, dft_control=dft_control)
887 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
888 n_spins = dft_control%nspins
890 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
891 cpassert(
SIZE(v) >= n_spins)
893 IF (
PRESENT(n_cols))
THEN
894 max_cols = maxval(n_cols(1:n_spins))
899 max_cols = max(max_cols, v_cols)
902 IF (max_cols <= nmo2)
THEN
906 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
907 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
914 nrow_global=v_rows, ncol_global=v_cols)
915 cpassert(v_rows >= p_env%n_ao(spin))
917 IF (
PRESENT(n_cols))
THEN
918 cpassert(n_cols(spin) <= cols)
921 cpassert(cols <= max_cols)
924 CALL parallel_gemm(transa=
'T', transb=
'N', m=cols, n=p_env%n_mo(spin), &
925 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
926 matrix_b=p_env%S_psi0(spin), beta=0.0_dp, &
929 CALL parallel_gemm(transa=
'N', transb=
'T', m=p_env%n_ao(spin), n=cols, &
930 k=p_env%n_mo(spin), alpha=-1.0_dp, &
931 matrix_a=p_env%psi0d(spin), matrix_b=tmp_matrix, &
932 beta=1.0_dp, matrix_c=v(spin))
936 IF (max_cols <= nmo2)
THEN
939 CALL cp_fm_release(tmp_matrix)
942 CALL timestop(handle)
959 TYPE(qs_p_env_type) :: p_env
960 TYPE(qs_environment_type),
POINTER :: qs_env
961 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(inout) :: v
962 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: n_cols
964 CHARACTER(len=*),
PARAMETER :: routinen =
'p_postortho'
966 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
967 nmo2, spin, v_cols, v_rows
968 TYPE(cp_fm_pool_type),
POINTER :: maxmo_maxmo_fm_pool
969 TYPE(cp_fm_struct_type),
POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
970 TYPE(cp_fm_type) :: tmp_matrix
971 TYPE(dft_control_type),
POINTER :: dft_control
973 CALL timeset(routinen, handle)
975 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
978 CALL get_qs_env(qs_env, dft_control=dft_control)
979 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
980 n_spins = dft_control%nspins
982 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
983 cpassert(
SIZE(v) >= n_spins)
985 IF (
PRESENT(n_cols))
THEN
986 max_cols = maxval(n_cols(1:n_spins))
991 max_cols = max(max_cols, v_cols)
994 IF (max_cols <= nmo2)
THEN
998 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
999 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
1003 DO spin = 1, n_spins
1006 nrow_global=v_rows, ncol_global=v_cols)
1007 cpassert(v_rows >= p_env%n_ao(spin))
1009 IF (
PRESENT(n_cols))
THEN
1010 cpassert(n_cols(spin) <= cols)
1013 cpassert(cols <= max_cols)
1016 CALL parallel_gemm(transa=
'T', transb=
'N', m=cols, n=p_env%n_mo(spin), &
1017 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
1018 matrix_b=p_env%psi0d(spin), beta=0.0_dp, &
1019 matrix_c=tmp_matrix)
1021 CALL parallel_gemm(transa=
'N', transb=
'T', m=p_env%n_ao(spin), n=cols, &
1022 k=p_env%n_mo(spin), alpha=-1.0_dp, &
1023 matrix_a=p_env%S_psi0(spin), matrix_b=tmp_matrix, &
1024 beta=1.0_dp, matrix_c=v(spin))
1028 IF (max_cols <= nmo2)
THEN
1031 CALL cp_fm_release(tmp_matrix)
1034 CALL timestop(handle)
1044 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
1045 TYPE(qs_p_env_type),
INTENT(IN) :: p_env
1047 CHARACTER(len=*),
PARAMETER :: routinen =
'p_env_finish_kpp1'
1049 INTEGER :: handle, ispin, nao, nao_aux
1050 TYPE(admm_type),
POINTER :: admm_env
1051 TYPE(dbcsr_type) :: work_hmat
1052 TYPE(dft_control_type),
POINTER :: dft_control
1054 CALL timeset(routinen, handle)
1056 CALL get_qs_env(qs_env, dft_control=dft_control, admm_env=admm_env)
1058 IF (dft_control%do_admm)
THEN
1059 CALL dbcsr_copy(work_hmat, p_env%kpp1(1)%matrix)
1061 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
1062 DO ispin = 1,
SIZE(p_env%kpp1)
1064 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
1065 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
1066 admm_env%work_aux_orb, 0.0_dp, admm_env%work_orb_orb)
1067 CALL dbcsr_set(work_hmat, 0.0_dp)
1068 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, work_hmat, keep_sparsity=.true.)
1069 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, work_hmat, 1.0_dp, 1.0_dp)
1072 CALL dbcsr_release(work_hmat)
1075 CALL timestop(handle)
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_aux_response_density(qs_env, dm, dm_admm)
Calculate ADMM auxiliary response density.
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.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public 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.
basic linear algebra operations for full matrices
subroutine, public cp_fm_symm(side, uplo, m, n, alpha, matrix_a, matrix_b, beta, matrix_c)
computes matrix_c = beta * matrix_c + alpha * matrix_a * matrix_b computes matrix_c = beta * matrix_c...
subroutine, public cp_fm_triangular_multiply(triangular_matrix, matrix_b, side, transpose_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
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,...
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
type(cp_fm_struct_type) function, pointer, public fm_pool_get_el_struct(pool)
returns the structure of the elements in this pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the 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_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, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public hartree_local_create(hartree_local)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
container for various plainwaves related things
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
module that builds the second order perturbation kernel kpp1 = delta_rho|_P delta_rho|_P E drho(P1) d...
subroutine, public kpp1_calc_k_p_p1(p_env, qs_env, rho1, rho1_xc)
calculates the k_p_p1 kernel of the perturbation theory
subroutine, public kpp1_create(kpp1_env)
allocates and initializes a kpp1_env
subroutine, public kpp1_calc_k_p_p1_fdiff(qs_env, k_p_p1, rho, rho1, diff)
calcualtes the k_p_p1 kernel of the perturbation theory with finite differences
subroutine, public kpp1_did_change(kpp1_env)
function to advise of changes either in the grids
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Type definitiona for linear response calculations.
subroutine, public local_rho_set_create(local_rho_set)
...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
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.
Utility functions for the perturbation calculations.
subroutine, public p_op_l1(p_env, qs_env, v, res)
Evaluates Fv (S_mo)^-1 - Sv(epsilon) and stores it in res.
subroutine, public p_postortho(p_env, qs_env, v, n_cols)
does a postorthogonalization on the given matrix vector: v = (I-SP) v
subroutine, public p_env_psi0_changed(p_env, qs_env)
To be called after the value of psi0 has changed. Recalculates the quantities S_psi0 and m_epsilon.
subroutine, public p_env_finish_kpp1(qs_env, p_env)
...
subroutine, public p_op_l2(p_env, qs_env, p1, res, alpha, beta)
evaluates res = alpha kpp1(v)*psi0 + beta res with kpp1 evaluated with p=qs_envrhorho_ao,...
subroutine, public p_env_create(p_env, qs_env, p1_option, p1_admm_option, orthogonal_orbitals, linres_control)
allocates and initializes the perturbation environment (no setup)
subroutine, public p_env_update_rho(p_env, qs_env)
...
subroutine, public p_preortho(p_env, qs_env, v, n_cols)
does a preorthogonalization of the given matrix: v = (I-PS)v
subroutine, public p_env_check_i_alloc(p_env, qs_env)
checks that the intenal storage is allocated, and allocs it if needed
basis types for the calculation of the perturbation of density theory.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
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)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.