mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 22:25:32 -04:00
Specify numbers of MOs and AOs at different spots (#4295)
This commit is contained in:
parent
d7297c05c6
commit
6f70cd24b0
11 changed files with 490 additions and 208 deletions
|
|
@ -366,8 +366,10 @@ CONTAINS
|
|||
END DO
|
||||
nmo = nao - ndep
|
||||
|
||||
CALL get_mo_set(mo_set=mos(1), nelectron=nelec(1))
|
||||
IF (MAXVAL(nelec) > nmo) THEN
|
||||
DO ispin = 1, nspins
|
||||
CALL get_mo_set(mo_set=mos(ispin), nelectron=nelec(ispin))
|
||||
END DO
|
||||
IF (MAXVAL(nelec)/(3 - nspins) > nmo) THEN
|
||||
! Should not happen as the following MO calculation is the same as during the SCF steps
|
||||
CPABORT("Not enough MOs found!")
|
||||
END IF
|
||||
|
|
|
|||
218
src/mp2_cphf.F
218
src/mp2_cphf.F
|
|
@ -150,28 +150,26 @@ CONTAINS
|
|||
!> \param para_env ...
|
||||
!> \param dft_control ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param nmo ...
|
||||
!> \param homo ...
|
||||
!> \param Eigenval ...
|
||||
!> \param unit_nr ...
|
||||
!> \author Mauro Del Ben, Vladimir Rybkin
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE solve_z_vector_eq(qs_env, mp2_env, para_env, dft_control, &
|
||||
mo_coeff, nmo, homo, Eigenval, unit_nr)
|
||||
mo_coeff, homo, Eigenval, unit_nr)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp2_type), INTENT(INOUT) :: mp2_env
|
||||
TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
|
||||
TYPE(dft_control_type), INTENT(IN), POINTER :: dft_control
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
|
||||
INTEGER, INTENT(IN) :: nmo
|
||||
INTEGER, DIMENSION(:), INTENT(IN) :: homo
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: unit_nr
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'solve_z_vector_eq'
|
||||
|
||||
INTEGER :: bin, dimen, handle, handle2, i, i_global, i_thread, iiB, irep, ispin, j_global, &
|
||||
jjB, my_bin_size, n_rep_hf, n_threads, ncol_local, nrow_local, nspins, transf_type_in
|
||||
INTEGER :: bin, handle, handle2, i, i_global, i_thread, iiB, irep, ispin, j_global, jjB, &
|
||||
my_bin_size, n_rep_hf, n_threads, nao, ncol_local, nmo, nrow_local, nspins, transf_type_in
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: virtual
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
|
||||
LOGICAL :: alpha_beta, do_dynamic_load_balancing, &
|
||||
|
|
@ -179,7 +177,7 @@ CONTAINS
|
|||
REAL(KIND=dp) :: focc
|
||||
TYPE(cp_blacs_env_type), POINTER :: blacs_env
|
||||
TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
|
||||
TYPE(cp_fm_type) :: fm_back, fm_G_mu_nu
|
||||
TYPE(cp_fm_type) :: fm_back, fm_G_mu_nu, fm_mo_mo
|
||||
TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: L_jb, mo_coeff_o, mo_coeff_v, P_ia, &
|
||||
P_mo, W_Mo
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_p_mp2, &
|
||||
|
|
@ -197,7 +195,9 @@ CONTAINS
|
|||
CALL timeset(routineN, handle)
|
||||
|
||||
! start collecting stuff
|
||||
dimen = nmo
|
||||
CALL cp_fm_get_info(mo_coeff(1), nrow_global=nao, ncol_global=nmo)
|
||||
CPASSERT(SIZE(eigenval, 1) == nmo)
|
||||
CPASSERT(nao >= nmo)
|
||||
NULLIFY (input, matrix_s, blacs_env, rho, &
|
||||
matrix_p_mp2, matrix_p_mp2_admm, matrix_ks)
|
||||
CALL get_qs_env(qs_env, &
|
||||
|
|
@ -221,7 +221,7 @@ CONTAINS
|
|||
CALL MOVE_ALLOC(mp2_env%ri_grad%L_jb, L_jb)
|
||||
|
||||
ALLOCATE (virtual(nspins))
|
||||
virtual(:) = dimen - homo(:)
|
||||
virtual(:) = nmo - homo(:)
|
||||
|
||||
NULLIFY (P_mu_nu)
|
||||
CALL dbcsr_allocate_matrix_set(P_mu_nu, nspins)
|
||||
|
|
@ -233,7 +233,7 @@ CONTAINS
|
|||
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nao, ncol_global=nao)
|
||||
CALL cp_fm_create(fm_G_mu_nu, fm_struct_tmp, name="G_mu_nu")
|
||||
CALL cp_fm_create(fm_back, fm_struct_tmp, name="fm_back")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
|
|
@ -244,23 +244,23 @@ CONTAINS
|
|||
DO ispin = 1, nspins
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=homo(ispin))
|
||||
nrow_global=nao, ncol_global=homo(ispin))
|
||||
CALL cp_fm_create(mo_coeff_o(ispin), fm_struct_tmp, name="mo_coeff_o")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(mo_coeff_o(ispin), 0.0_dp)
|
||||
CALL cp_fm_to_fm_submat(msource=mo_coeff(ispin), mtarget=mo_coeff_o(ispin), &
|
||||
nrow=dimen, ncol=homo(ispin), &
|
||||
nrow=nao, ncol=homo(ispin), &
|
||||
s_firstrow=1, s_firstcol=1, &
|
||||
t_firstrow=1, t_firstcol=1)
|
||||
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=virtual(ispin))
|
||||
nrow_global=nao, ncol_global=virtual(ispin))
|
||||
CALL cp_fm_create(mo_coeff_v(ispin), fm_struct_tmp, name="mo_coeff_v")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(mo_coeff_v(ispin), 0.0_dp)
|
||||
CALL cp_fm_to_fm_submat(msource=mo_coeff(ispin), mtarget=mo_coeff_v(ispin), &
|
||||
nrow=dimen, ncol=virtual(ispin), &
|
||||
nrow=nao, ncol=virtual(ispin), &
|
||||
s_firstrow=1, s_firstcol=homo(ispin) + 1, &
|
||||
t_firstrow=1, t_firstcol=1)
|
||||
END DO
|
||||
|
|
@ -340,11 +340,11 @@ CONTAINS
|
|||
DO ispin = 1, nspins
|
||||
CALL dbcsr_add(P_mu_nu(ispin)%matrix, matrix_ks(ispin)%matrix, 1.0_dp, -1.0_dp)
|
||||
CALL copy_dbcsr_to_fm(matrix=P_mu_nu(ispin)%matrix, fm=fm_G_mu_nu)
|
||||
CALL parallel_gemm("N", "N", dimen, homo(ispin), dimen, 1.0_dp, &
|
||||
CALL parallel_gemm("N", "N", nao, homo(ispin), nao, 1.0_dp, &
|
||||
fm_G_mu_nu, mo_coeff_o(ispin), 0.0_dp, fm_back)
|
||||
CALL parallel_gemm("T", "N", homo(ispin), virtual(ispin), dimen, focc, &
|
||||
CALL parallel_gemm("T", "N", homo(ispin), virtual(ispin), nao, focc, &
|
||||
fm_back, mo_coeff_v(ispin), 1.0_dp, L_jb(ispin))
|
||||
CALL parallel_gemm("T", "N", homo(ispin), homo(ispin), dimen, -focc, &
|
||||
CALL parallel_gemm("T", "N", homo(ispin), homo(ispin), nao, -focc, &
|
||||
fm_back, mo_coeff_o(ispin), 1.0_dp, W_mo(ispin))
|
||||
END DO
|
||||
END IF
|
||||
|
|
@ -379,11 +379,8 @@ CONTAINS
|
|||
! Complete in closed shell case, alpha-alpha (Coulomb and XC)
|
||||
! part of L_bj(alpha) for open shell
|
||||
|
||||
CALL cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, &
|
||||
mo_coeff_v, Eigenval, p_env, &
|
||||
P_mo, fm_G_mu_nu, fm_back, transf_type_in, &
|
||||
L_jb, &
|
||||
CALL cphf_like_update(qs_env, mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
P_mo, fm_G_mu_nu, fm_back, transf_type_in, L_jb, &
|
||||
recalc_hfx_integrals=(.NOT. do_exx .AND. mp2_env%ri_grad%free_hfx_buffer) &
|
||||
.OR. (do_exx .AND. .NOT. mp2_env%ri_rpa%reuse_hfx))
|
||||
|
||||
|
|
@ -399,7 +396,7 @@ CONTAINS
|
|||
CALL cp_fm_set_all(P_ia(ispin), 0.0_dp)
|
||||
END DO
|
||||
|
||||
CALL solve_z_vector_eq_low(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
CALL solve_z_vector_eq_low(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia)
|
||||
|
||||
|
|
@ -409,6 +406,8 @@ CONTAINS
|
|||
CALL cp_fm_release(mo_coeff_o)
|
||||
CALL cp_fm_release(mo_coeff_v)
|
||||
|
||||
CALL cp_fm_create(fm_mo_mo, P_mo(1)%matrix_struct)
|
||||
|
||||
DO ispin = 1, nspins
|
||||
! update the MP2-MO density matrix with the occ-virt block
|
||||
CALL cp_fm_to_fm_submat(msource=P_ia(ispin), mtarget=P_mo(ispin), &
|
||||
|
|
@ -416,11 +415,12 @@ CONTAINS
|
|||
s_firstrow=1, s_firstcol=1, &
|
||||
t_firstrow=1, t_firstcol=homo(ispin) + 1)
|
||||
! transpose P_MO matrix (easy way to symmetrize)
|
||||
CALL cp_fm_set_all(fm_back, 0.0_dp)
|
||||
CALL cp_fm_set_all(fm_mo_mo, 0.0_dp)
|
||||
! P_mo now is ready
|
||||
CALL cp_fm_uplo_to_full(matrix=P_mo(ispin), work=fm_back)
|
||||
CALL cp_fm_uplo_to_full(matrix=P_mo(ispin), work=fm_mo_mo)
|
||||
END DO
|
||||
CALL cp_fm_release(P_ia)
|
||||
CALL cp_fm_release(fm_mo_mo)
|
||||
|
||||
! do the final update to the energy weighted matrix W_MO
|
||||
DO ispin = 1, nspins
|
||||
|
|
@ -468,9 +468,9 @@ CONTAINS
|
|||
|
||||
! backtnsform the collected parts of the energy-weighted density matrix into AO basis
|
||||
DO ispin = 1, nspins
|
||||
CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nao, nmo, nmo, 1.0_dp, &
|
||||
mo_coeff(ispin), W_mo(ispin), 0.0_dp, fm_back)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%w1(1)%matrix, fm_back, mo_coeff(ispin), dimen, 1.0_dp, .TRUE., 1)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%w1(1)%matrix, fm_back, mo_coeff(ispin), nmo, 1.0_dp, .TRUE., 1)
|
||||
END DO
|
||||
CALL cp_fm_release(W_mo)
|
||||
|
||||
|
|
@ -479,9 +479,9 @@ CONTAINS
|
|||
DO ispin = 1, nspins
|
||||
CALL dbcsr_set(p_env%p1(ispin)%matrix, 0.0_dp)
|
||||
|
||||
CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nao, nmo, nmo, 1.0_dp, &
|
||||
mo_coeff(ispin), P_mo(ispin), 0.0_dp, fm_back)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff(ispin), dimen, 1.0_dp, .TRUE.)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff(ispin), nmo, 1.0_dp, .TRUE.)
|
||||
|
||||
CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1(ispin)%matrix)
|
||||
END DO
|
||||
|
|
@ -529,10 +529,6 @@ CONTAINS
|
|||
!> transf_type_in = 3 -> occ-virt back transformation including the
|
||||
!> eigenvalues energy differences for the diagonal elements
|
||||
!> \param qs_env ...
|
||||
!> \param homo ...
|
||||
!> \param virtual ...
|
||||
!> \param dimen ...
|
||||
!> \param nspins ...
|
||||
!> \param mo_coeff_o ...
|
||||
!> \param mo_coeff_v ...
|
||||
!> \param Eigenval ...
|
||||
|
|
@ -545,64 +541,66 @@ CONTAINS
|
|||
!> \param recalc_hfx_integrals ...
|
||||
!> \author Mauro Del Ben, Vladimir Rybkin
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
SUBROUTINE cphf_like_update(qs_env, mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
fm_mo, fm_ao, fm_back, transf_type_in, &
|
||||
fm_mo_out, recalc_hfx_integrals)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
INTEGER, INTENT(IN) :: nspins, dimen
|
||||
INTEGER, DIMENSION(nspins), INTENT(IN) :: virtual, homo
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(dimen, nspins), &
|
||||
INTENT(IN) :: Eigenval
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
TYPE(qs_p_env_type) :: p_env
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: fm_mo
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_mo
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: fm_ao
|
||||
TYPE(cp_fm_type), INTENT(IN) :: fm_back
|
||||
INTEGER, INTENT(IN) :: transf_type_in
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: fm_mo_out
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_mo_out
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: recalc_hfx_integrals
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'cphf_like_update'
|
||||
|
||||
INTEGER :: handle, i_global, iiB, ispin, j_global, &
|
||||
jjB, ncol_local, nrow_local
|
||||
INTEGER :: handle, homo, i_global, iiB, ispin, &
|
||||
j_global, jjB, nao, ncol_local, &
|
||||
nrow_local, nspins, virtual
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho1_ao
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
nspins = SIZE(Eigenval, 2)
|
||||
|
||||
CALL qs_rho_get(p_env%rho1, rho_ao=rho1_ao)
|
||||
|
||||
! Determine the first-order density matrices in AO basis
|
||||
DO ispin = 1, nspins
|
||||
CALL dbcsr_set(p_env%p1(ispin)%matrix, 0.0_dp)
|
||||
|
||||
CALL cp_fm_get_info(mo_coeff_o(ispin), nrow_global=nao, ncol_global=homo)
|
||||
CALL cp_fm_get_info(mo_coeff_v(ispin), nrow_global=nao, ncol_global=virtual)
|
||||
|
||||
ASSOCIATE (mat_in => fm_mo(ispin))
|
||||
|
||||
! perform back transformation
|
||||
SELECT CASE (transf_type_in)
|
||||
CASE (1)
|
||||
! occ-occ block
|
||||
CALL parallel_gemm('N', 'N', dimen, homo(ispin), homo(ispin), 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nao, homo, homo, 1.0_dp, &
|
||||
mo_coeff_o(ispin), mat_in, 0.0_dp, fm_back)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_o(ispin), homo(ispin), 1.0_dp, .TRUE.)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_o(ispin), homo, 1.0_dp, .TRUE.)
|
||||
! virt-virt block
|
||||
CALL parallel_gemm('N', 'N', dimen, virtual(ispin), virtual(ispin), 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nao, virtual, virtual, 1.0_dp, &
|
||||
mo_coeff_v(ispin), mat_in, 0.0_dp, fm_back, &
|
||||
b_first_col=homo(ispin) + 1, &
|
||||
b_first_row=homo(ispin) + 1)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_v(ispin), virtual(ispin), 1.0_dp, .TRUE.)
|
||||
b_first_col=homo + 1, &
|
||||
b_first_row=homo + 1)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_v(ispin), virtual, 1.0_dp, .TRUE.)
|
||||
|
||||
CASE (3)
|
||||
! virt-occ blocks
|
||||
CALL parallel_gemm('N', 'N', dimen, virtual(ispin), homo(ispin), 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nao, virtual, homo, 1.0_dp, &
|
||||
mo_coeff_o(ispin), mat_in, 0.0_dp, fm_back)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_v(ispin), virtual(ispin), 1.0_dp, .TRUE.)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_v(ispin), virtual, 1.0_dp, .TRUE.)
|
||||
! and symmetrize (here again multiply instead of transposing)
|
||||
CALL parallel_gemm('N', 'T', dimen, homo(ispin), virtual(ispin), 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'T', nao, homo, virtual, 1.0_dp, &
|
||||
mo_coeff_v(ispin), mat_in, 0.0_dp, fm_back)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_o(ispin), homo(ispin), 1.0_dp, .TRUE.)
|
||||
CALL cp_dbcsr_plus_fm_fm_t(p_env%p1(ispin)%matrix, fm_back, mo_coeff_o(ispin), homo, 1.0_dp, .TRUE.)
|
||||
|
||||
CASE DEFAULT
|
||||
! nothing
|
||||
|
|
@ -614,8 +612,13 @@ CONTAINS
|
|||
|
||||
CALL p_env_update_rho(p_env, qs_env)
|
||||
|
||||
IF (transf_type_in == 3) THEN
|
||||
DO ispin = 1, nspins
|
||||
CALL apply_2nd_order_kernel(qs_env, p_env, recalc_hfx_integrals)
|
||||
|
||||
DO ispin = 1, nspins
|
||||
CALL cp_fm_get_info(mo_coeff_o(ispin), nrow_global=nao, ncol_global=homo)
|
||||
CALL cp_fm_get_info(mo_coeff_v(ispin), nrow_global=nao, ncol_global=virtual)
|
||||
|
||||
IF (transf_type_in == 3) THEN
|
||||
|
||||
! scale for the orbital energy differences for the diagonal elements
|
||||
CALL cp_fm_get_info(matrix=fm_mo_out(ispin), &
|
||||
|
|
@ -628,15 +631,11 @@ CONTAINS
|
|||
DO iiB = 1, nrow_local
|
||||
i_global = row_indices(iiB)
|
||||
fm_mo_out(ispin)%local_data(iiB, jjB) = fm_mo(ispin)%local_data(iiB, jjB)* &
|
||||
(Eigenval(j_global + homo(ispin), ispin) - Eigenval(i_global, ispin))
|
||||
(Eigenval(j_global + homo, ispin) - Eigenval(i_global, ispin))
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
END IF
|
||||
END IF
|
||||
|
||||
CALL apply_2nd_order_kernel(qs_env, p_env, recalc_hfx_integrals)
|
||||
|
||||
DO ispin = 1, nspins
|
||||
! copy back to fm
|
||||
CALL cp_fm_set_all(fm_ao, 0.0_dp)
|
||||
CALL copy_dbcsr_to_fm(matrix=p_env%kpp1(ispin)%matrix, fm=fm_ao)
|
||||
|
|
@ -648,9 +647,9 @@ CONTAINS
|
|||
! transform to MO basis, here we always sum the result into the input matrix
|
||||
|
||||
! occ-virt block
|
||||
CALL parallel_gemm('T', 'N', homo(ispin), dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', homo, nao, nao, 1.0_dp, &
|
||||
mo_coeff_o(ispin), fm_ao, 0.0_dp, fm_back)
|
||||
CALL parallel_gemm('N', 'N', homo(ispin), virtual(ispin), dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', homo, virtual, nao, 1.0_dp, &
|
||||
fm_back, mo_coeff_v(ispin), 1.0_dp, mat_out)
|
||||
END ASSOCIATE
|
||||
END DO
|
||||
|
|
@ -664,11 +663,7 @@ CONTAINS
|
|||
!> system of linear equation
|
||||
!> \param qs_env ...
|
||||
!> \param mp2_env ...
|
||||
!> \param homo ...
|
||||
!> \param virtual ...
|
||||
!> \param dimen ...
|
||||
!> \param unit_nr ...
|
||||
!> \param nspins ...
|
||||
!> \param mo_coeff_o ...
|
||||
!> \param mo_coeff_v ...
|
||||
!> \param Eigenval ...
|
||||
|
|
@ -679,31 +674,33 @@ CONTAINS
|
|||
!> \param P_ia ...
|
||||
!> \author Mauro Del Ben, Vladimir Rybkin
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE solve_z_vector_eq_low(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
SUBROUTINE solve_z_vector_eq_low(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp2_type), INTENT(IN) :: mp2_env
|
||||
INTEGER, INTENT(IN) :: nspins, unit_nr, dimen
|
||||
INTEGER, DIMENSION(nspins), INTENT(IN) :: virtual, homo
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(dimen, nspins), &
|
||||
INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: unit_nr
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
TYPE(qs_p_env_type), INTENT(IN), POINTER :: p_env
|
||||
TYPE(cp_fm_type), DIMENSION(dimen), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: fm_G_mu_nu
|
||||
TYPE(cp_fm_type), INTENT(IN) :: fm_back
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: P_ia
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: P_ia
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'solve_z_vector_eq_low'
|
||||
|
||||
INTEGER :: handle, i_global, iiB, ispin, j_global, &
|
||||
jjB, ncol_local, nrow_local
|
||||
jjB, ncol_local, nmo, nrow_local, &
|
||||
nspins, virtual
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
|
||||
TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: precond
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
nmo = SIZE(eigenval, 1)
|
||||
nspins = SIZE(eigenval, 2)
|
||||
|
||||
! Pople method
|
||||
! change sign to L_jb
|
||||
DO ispin = 1, nspins
|
||||
|
|
@ -720,27 +717,24 @@ CONTAINS
|
|||
nrow_local=nrow_local, &
|
||||
ncol_local=ncol_local, &
|
||||
row_indices=row_indices, &
|
||||
col_indices=col_indices)
|
||||
col_indices=col_indices, &
|
||||
ncol_global=virtual)
|
||||
DO jjB = 1, ncol_local
|
||||
j_global = col_indices(jjB)
|
||||
DO iiB = 1, nrow_local
|
||||
i_global = row_indices(iiB)
|
||||
precond(ispin)%local_data(iiB, jjB) = Eigenval(j_global + homo(ispin), ispin) - Eigenval(i_global, ispin)
|
||||
precond(ispin)%local_data(iiB, jjB) = 1.0_dp/(Eigenval(j_global + nmo - virtual, ispin) - Eigenval(i_global, ispin))
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
|
||||
DO ispin = 1, nspins
|
||||
precond(ispin)%local_data(:, :) = 1.0_dp/precond(ispin)%local_data(:, :)
|
||||
END DO
|
||||
|
||||
SELECT CASE (mp2_env%ri_grad%z_solver_method)
|
||||
CASE (z_solver_pople)
|
||||
CALL solve_z_vector_pople(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
CALL solve_z_vector_pople(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia, precond)
|
||||
CASE (z_solver_cg, z_solver_richardson, z_solver_sd)
|
||||
CALL solve_z_vector_cg(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
CALL solve_z_vector_cg(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia, precond)
|
||||
CASE DEFAULT
|
||||
|
|
@ -757,11 +751,7 @@ CONTAINS
|
|||
!> \brief ...
|
||||
!> \param qs_env ...
|
||||
!> \param mp2_env ...
|
||||
!> \param homo ...
|
||||
!> \param virtual ...
|
||||
!> \param dimen ...
|
||||
!> \param unit_nr ...
|
||||
!> \param nspins ...
|
||||
!> \param mo_coeff_o ...
|
||||
!> \param mo_coeff_v ...
|
||||
!> \param Eigenval ...
|
||||
|
|
@ -772,26 +762,25 @@ CONTAINS
|
|||
!> \param P_ia ...
|
||||
!> \param precond ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE solve_z_vector_pople(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
SUBROUTINE solve_z_vector_pople(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia, precond)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp2_type), INTENT(IN) :: mp2_env
|
||||
INTEGER, INTENT(IN) :: nspins, unit_nr, dimen
|
||||
INTEGER, DIMENSION(nspins), INTENT(IN) :: virtual, homo
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(dimen, nspins), &
|
||||
INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: unit_nr
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
TYPE(qs_p_env_type), INTENT(IN), POINTER :: p_env
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: fm_G_mu_nu
|
||||
TYPE(cp_fm_type), INTENT(IN) :: fm_back
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: P_ia, precond
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: P_ia, precond
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'solve_z_vector_pople'
|
||||
|
||||
INTEGER :: cycle_counter, handle, iiB, iiter, &
|
||||
ispin, max_num_iter, transf_type_in
|
||||
ispin, max_num_iter, nspins, &
|
||||
transf_type_in
|
||||
LOGICAL :: converged
|
||||
REAL(KIND=dp) :: conv, eps_conv, scale_cphf, t1, t2
|
||||
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: proj_bi_xj, temp_vals, x_norm, xi_b
|
||||
|
|
@ -803,6 +792,8 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
nspins = SIZE(eigenval, 2)
|
||||
|
||||
eps_conv = mp2_env%ri_grad%cphf_eps_conv
|
||||
|
||||
IF (accurate_dot_product_spin(L_jb, L_jb) >= (eps_conv*eps_conv)) THEN
|
||||
|
|
@ -886,8 +877,7 @@ CONTAINS
|
|||
CALL cp_fm_set_all(Ax(ispin, iiter), 0.0_dp)
|
||||
END DO
|
||||
|
||||
CALL cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, &
|
||||
CALL cphf_like_update(qs_env, mo_coeff_o, &
|
||||
mo_coeff_v, Eigenval, p_env, &
|
||||
xn(:, iiter), fm_G_mu_nu, fm_back, transf_type_in, &
|
||||
Ax(:, iiter))
|
||||
|
|
@ -1007,11 +997,7 @@ CONTAINS
|
|||
!> \brief ...
|
||||
!> \param qs_env ...
|
||||
!> \param mp2_env ...
|
||||
!> \param homo ...
|
||||
!> \param virtual ...
|
||||
!> \param dimen ...
|
||||
!> \param unit_nr ...
|
||||
!> \param nspins ...
|
||||
!> \param mo_coeff_o ...
|
||||
!> \param mo_coeff_v ...
|
||||
!> \param Eigenval ...
|
||||
|
|
@ -1022,25 +1008,23 @@ CONTAINS
|
|||
!> \param P_ia ...
|
||||
!> \param precond ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE solve_z_vector_cg(qs_env, mp2_env, homo, virtual, dimen, unit_nr, nspins, &
|
||||
SUBROUTINE solve_z_vector_cg(qs_env, mp2_env, unit_nr, &
|
||||
mo_coeff_o, mo_coeff_v, Eigenval, p_env, &
|
||||
L_jb, fm_G_mu_nu, fm_back, P_ia, precond)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp2_type), INTENT(IN) :: mp2_env
|
||||
INTEGER, INTENT(IN) :: nspins, unit_nr, dimen
|
||||
INTEGER, DIMENSION(nspins), INTENT(IN) :: virtual, homo
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(dimen, nspins), &
|
||||
INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: unit_nr
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff_o, mo_coeff_v
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
TYPE(qs_p_env_type), INTENT(IN), POINTER :: p_env
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: L_jb
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: fm_G_mu_nu
|
||||
TYPE(cp_fm_type), INTENT(IN) :: fm_back
|
||||
TYPE(cp_fm_type), DIMENSION(nspins), INTENT(IN) :: P_ia, precond
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: P_ia, precond
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'solve_z_vector_cg'
|
||||
|
||||
INTEGER :: cycles_passed, handle, iiter, ispin, max_num_iter, restart_counter, &
|
||||
INTEGER :: cycles_passed, handle, iiter, ispin, max_num_iter, nspins, restart_counter, &
|
||||
restart_every, transf_type_in, z_solver_method
|
||||
LOGICAL :: converged, do_restart
|
||||
REAL(KIND=dp) :: eps_conv, norm_residual, norm_residual_old, &
|
||||
|
|
@ -1060,6 +1044,7 @@ CONTAINS
|
|||
restart_every = mp2_env%ri_grad%cphf_restart
|
||||
scale_step_size = mp2_env%ri_grad%scale_step_size
|
||||
transf_type_in = 3
|
||||
nspins = SIZE(eigenval, 2)
|
||||
|
||||
IF (unit_nr > 0) THEN
|
||||
WRITE (unit_nr, *)
|
||||
|
|
@ -1120,8 +1105,7 @@ CONTAINS
|
|||
! Do not recalculate residual if it is already enforced to save FLOPs
|
||||
IF (.NOT. mp2_env%ri_grad%recalc_residual .OR. (iiter == 1)) THEN
|
||||
IF (iiter > 1) THEN
|
||||
CALL cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, &
|
||||
CALL cphf_like_update(qs_env, mo_coeff_o, &
|
||||
mo_coeff_v, Eigenval, p_env, &
|
||||
P_ia, fm_G_mu_nu, fm_back, transf_type_in, &
|
||||
residual)
|
||||
|
|
@ -1152,8 +1136,7 @@ CONTAINS
|
|||
|
||||
residual_dot_diff_search_vec_old = accurate_dot_product_spin(residual, diff_search_vector)
|
||||
|
||||
CALL cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, &
|
||||
CALL cphf_like_update(qs_env, mo_coeff_o, &
|
||||
mo_coeff_v, Eigenval, p_env, &
|
||||
search_vector, fm_G_mu_nu, fm_back, transf_type_in, &
|
||||
A_dot_search_vector)
|
||||
|
|
@ -1188,8 +1171,7 @@ CONTAINS
|
|||
- scale_result*A_dot_search_vector(ispin)%local_data(:, :)
|
||||
END DO
|
||||
ELSE
|
||||
CALL cphf_like_update(qs_env, homo, virtual, dimen, nspins, &
|
||||
mo_coeff_o, &
|
||||
CALL cphf_like_update(qs_env, mo_coeff_o, &
|
||||
mo_coeff_v, Eigenval, p_env, &
|
||||
P_ia, fm_G_mu_nu, fm_back, transf_type_in, &
|
||||
residual)
|
||||
|
|
|
|||
|
|
@ -373,7 +373,7 @@ CONTAINS
|
|||
! output the two part of the C matrix (virtual, occupied)
|
||||
DO ispin = 1, nspins
|
||||
|
||||
CALL replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff(ispin), nmo, homo(ispin), mat_munu%matrix, &
|
||||
CALL replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff(ispin), homo(ispin), mat_munu%matrix, &
|
||||
mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
|
||||
mo_coeff_all(ispin)%matrix, mo_coeff_gw(ispin)%matrix, &
|
||||
my_do_gw, gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), do_bse, &
|
||||
|
|
@ -560,7 +560,7 @@ CONTAINS
|
|||
starts_array_mc_block, ends_array_mc_block, calc_forces)
|
||||
|
||||
IF (mp2_env%ri_rpa%do_rse) &
|
||||
CALL rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, nmo, homo, Eigenval)
|
||||
CALL rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, homo, Eigenval)
|
||||
|
||||
IF (do_im_time) THEN
|
||||
IF (ASSOCIATED(mat_P_global%matrix)) THEN
|
||||
|
|
@ -603,7 +603,7 @@ CONTAINS
|
|||
|
||||
CALL calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, &
|
||||
particle_set, atomic_kind_set, qs_kind_set, &
|
||||
mo_coeff, nmo, homo, dimen_RI, Eigenval, &
|
||||
mo_coeff, dimen_RI, Eigenval, &
|
||||
my_group_L_start, my_group_L_end, my_group_L_size, &
|
||||
sab_orb_sub, mat_munu, blacs_env_sub)
|
||||
|
||||
|
|
@ -651,7 +651,7 @@ CONTAINS
|
|||
! finally solve the z-vector equation if forces are required
|
||||
IF (calc_forces .AND. .NOT. do_im_time) THEN
|
||||
CALL solve_z_vector_eq(qs_env, mp2_env, para_env, dft_control, &
|
||||
mo_coeff, nmo, homo, Eigenval, unit_nr)
|
||||
mo_coeff, homo, Eigenval, unit_nr)
|
||||
END IF
|
||||
|
||||
DEALLOCATE (Eigenval, mo_coeff)
|
||||
|
|
@ -665,7 +665,6 @@ CONTAINS
|
|||
!> \param para_env ...
|
||||
!> \param para_env_sub ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param dimen ...
|
||||
!> \param homo ...
|
||||
!> \param mat_munu ...
|
||||
!> \param mo_coeff_o ...
|
||||
|
|
@ -681,13 +680,13 @@ CONTAINS
|
|||
!> \param mo_coeff_v_bse ...
|
||||
!> \param eps_filter ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff, dimen, homo, mat_munu, &
|
||||
SUBROUTINE replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff, homo, mat_munu, &
|
||||
mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, my_do_gw, &
|
||||
gw_corr_lev_occ, gw_corr_lev_virt, my_do_bse, &
|
||||
bse_lev_virt, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter)
|
||||
TYPE(mp_para_env_type), INTENT(IN) :: para_env, para_env_sub
|
||||
TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
|
||||
INTEGER, INTENT(IN) :: dimen, homo
|
||||
INTEGER, INTENT(IN) :: homo
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: mat_munu
|
||||
TYPE(dbcsr_type), POINTER :: mo_coeff_o, mo_coeff_v, mo_coeff_all, &
|
||||
mo_coeff_gw
|
||||
|
|
@ -714,7 +713,7 @@ CONTAINS
|
|||
mat_munu, gd_array, eps_filter)
|
||||
|
||||
ALLOCATE (mo_coeff_v)
|
||||
CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v, C(:, homo + 1:dimen), &
|
||||
CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v, C(:, homo + 1:), &
|
||||
mat_munu, gd_array, eps_filter)
|
||||
|
||||
IF (my_do_gw) THEN
|
||||
|
|
|
|||
|
|
@ -17,8 +17,9 @@ MODULE mp2_ri_grad
|
|||
USE cp_blacs_env, ONLY: cp_blacs_env_type
|
||||
USE cp_control_types, ONLY: dft_control_type
|
||||
USE cp_dbcsr_api, ONLY: &
|
||||
dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_multiply, dbcsr_p_type, dbcsr_release, &
|
||||
dbcsr_set, dbcsr_transposed, dbcsr_type, dbcsr_type_no_symmetry, dbcsr_type_symmetric
|
||||
dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_get_info, dbcsr_multiply, dbcsr_p_type, &
|
||||
dbcsr_release, dbcsr_set, dbcsr_transposed, dbcsr_type, dbcsr_type_no_symmetry, &
|
||||
dbcsr_type_symmetric
|
||||
USE cp_dbcsr_operations, ONLY: copy_dbcsr_to_fm,&
|
||||
dbcsr_deallocate_matrix_set
|
||||
USE cp_eri_mme_interface, ONLY: cp_eri_mme_param
|
||||
|
|
@ -97,8 +98,6 @@ CONTAINS
|
|||
!> \param atomic_kind_set ...
|
||||
!> \param qs_kind_set ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param nmo ...
|
||||
!> \param homo ...
|
||||
!> \param dimen_RI ...
|
||||
!> \param Eigenval ...
|
||||
!> \param my_group_L_start ...
|
||||
|
|
@ -110,7 +109,7 @@ CONTAINS
|
|||
!> \author Mauro Del Ben
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, particle_set, &
|
||||
atomic_kind_set, qs_kind_set, mo_coeff, nmo, homo, dimen_RI, Eigenval, &
|
||||
atomic_kind_set, qs_kind_set, mo_coeff, dimen_RI, Eigenval, &
|
||||
my_group_L_start, my_group_L_end, my_group_L_size, sab_orb_sub, mat_munu, &
|
||||
blacs_env_sub)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
|
|
@ -121,8 +120,6 @@ CONTAINS
|
|||
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
|
||||
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
|
||||
INTEGER, INTENT(IN) :: nmo
|
||||
INTEGER, DIMENSION(:), INTENT(IN) :: homo
|
||||
INTEGER, INTENT(IN) :: dimen_RI
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: my_group_L_start, my_group_L_end, &
|
||||
|
|
@ -134,11 +131,12 @@ CONTAINS
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'calc_ri_mp2_nonsep'
|
||||
|
||||
INTEGER :: dimen, eri_method, handle, handle2, i, &
|
||||
ikind, ispin, itmp(2), L_counter, LLL, &
|
||||
my_P_end, my_P_size, my_P_start, nspins
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of, natom_of_kind, &
|
||||
virtual
|
||||
INTEGER :: eri_method, handle, handle2, i, ikind, &
|
||||
ispin, itmp(2), L_counter, LLL, &
|
||||
my_P_end, my_P_size, my_P_start, nao, &
|
||||
nspins
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, homo, kind_of, &
|
||||
natom_of_kind, virtual
|
||||
LOGICAL :: alpha_beta, use_virial
|
||||
REAL(KIND=dp) :: cutoff_old, eps_filter, factor, &
|
||||
factor_2c, relative_cutoff_old
|
||||
|
|
@ -174,17 +172,21 @@ CONTAINS
|
|||
eri_param => mp2_env%eri_mme_param
|
||||
|
||||
! Find out whether we have a closed or open shell
|
||||
nspins = SIZE(homo)
|
||||
nspins = SIZE(Eigenval, 2)
|
||||
alpha_beta = (nspins == 2)
|
||||
|
||||
dimen = nmo
|
||||
ALLOCATE (virtual(nspins))
|
||||
virtual(:) = dimen - homo(:)
|
||||
ALLOCATE (virtual(nspins), homo(nspins))
|
||||
eps_filter = mp2_env%mp2_gpw%eps_filter
|
||||
ALLOCATE (mo_coeff_o(nspins), mo_coeff_v(nspins), G_P_ia(nspins, my_group_L_size))
|
||||
DO ispin = 1, nspins
|
||||
mo_coeff_o(ispin)%matrix => mp2_env%ri_grad%mo_coeff_o(ispin)%matrix
|
||||
mo_coeff_v(ispin)%matrix => mp2_env%ri_grad%mo_coeff_v(ispin)%matrix
|
||||
CALL dbcsr_get_info(mo_coeff_o(ispin)%matrix, &
|
||||
nfullrows_total=nao, &
|
||||
nfullcols_total=homo(ispin))
|
||||
CALL dbcsr_get_info(mo_coeff_v(ispin)%matrix, &
|
||||
nfullrows_total=nao, &
|
||||
nfullcols_total=virtual(ispin))
|
||||
DO LLL = 1, my_group_L_size
|
||||
G_P_ia(ispin, LLL)%matrix => mp2_env%ri_grad%G_P_ia(LLL, ispin)%matrix
|
||||
END DO
|
||||
|
|
@ -447,7 +449,7 @@ CONTAINS
|
|||
! Start with moving from the DBCSR to FM for the lagrangians
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env_sub, context=blacs_env_sub, &
|
||||
nrow_global=dimen, ncol_global=homo(ispin))
|
||||
nrow_global=nao, ncol_global=homo(ispin))
|
||||
CALL cp_fm_create(L1_mu_i(ispin), fm_struct_tmp, name="Lag_mu_i")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(L1_mu_i(ispin), 0.0_dp)
|
||||
|
|
@ -458,7 +460,7 @@ CONTAINS
|
|||
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env_sub, context=blacs_env_sub, &
|
||||
nrow_global=dimen, ncol_global=virtual(ispin))
|
||||
nrow_global=nao, ncol_global=virtual(ispin))
|
||||
CALL cp_fm_create(L2_nu_a(ispin), fm_struct_tmp, name="Lag_nu_a")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(L2_nu_a(ispin), 0.0_dp)
|
||||
|
|
@ -474,7 +476,7 @@ CONTAINS
|
|||
IF (alpha_beta) factor = 0.50_dp
|
||||
|
||||
DO ispin = 1, nspins
|
||||
CALL create_W_P(qs_env, mp2_env, mo_coeff(ispin), homo(ispin), virtual(ispin), dimen, para_env, &
|
||||
CALL create_W_P(qs_env, mp2_env, mo_coeff(ispin), homo(ispin), virtual(ispin), para_env, &
|
||||
para_env_sub, Eigenval(:, ispin), L1_mu_i(ispin), L2_nu_a(ispin), &
|
||||
factor, ispin)
|
||||
END DO
|
||||
|
|
@ -630,7 +632,6 @@ CONTAINS
|
|||
!> \param mo_coeff ...
|
||||
!> \param homo ...
|
||||
!> \param virtual ...
|
||||
!> \param dimen ...
|
||||
!> \param para_env ...
|
||||
!> \param para_env_sub ...
|
||||
!> \param Eigenval ...
|
||||
|
|
@ -639,12 +640,12 @@ CONTAINS
|
|||
!> \param factor ...
|
||||
!> \param kspin ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE create_W_P(qs_env, mp2_env, mo_coeff, homo, virtual, dimen, para_env, para_env_sub, &
|
||||
SUBROUTINE create_W_P(qs_env, mp2_env, mo_coeff, homo, virtual, para_env, para_env_sub, &
|
||||
Eigenval, L1_mu_i, L2_nu_a, factor, kspin)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(mp2_type) :: mp2_env
|
||||
TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
|
||||
INTEGER, INTENT(IN) :: homo, virtual, dimen
|
||||
INTEGER, INTENT(IN) :: homo, virtual
|
||||
TYPE(mp_para_env_type), POINTER :: para_env, para_env_sub
|
||||
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: Eigenval
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: L1_mu_i, L2_nu_a
|
||||
|
|
@ -655,12 +656,13 @@ CONTAINS
|
|||
|
||||
INTEGER :: color_exchange, dummy_proc, handle, handle2, handle3, i_global, i_local, iiB, &
|
||||
iii, iproc, itmp(2), j_global, j_local, jjB, max_col_size, max_row_size, &
|
||||
my_B_virtual_end, my_B_virtual_start, mypcol, myprow, ncol_local, ncol_local_1i, &
|
||||
ncol_local_2a, npcol, nprow, nrow_local, nrow_local_1i, nrow_local_2a, number_of_rec, &
|
||||
number_of_send, proc_receive, proc_receive_static, proc_send, proc_send_ex, &
|
||||
proc_send_static, proc_send_sub, proc_shift, rec_col_size, rec_counter, rec_row_size, &
|
||||
send_col_size, send_counter, send_pcol, send_prow, send_row_size, size_rec_buffer, &
|
||||
size_send_buffer
|
||||
my_B_virtual_end, my_B_virtual_start, mypcol, myprow, nao, ncol_local, ncol_local_1i, &
|
||||
ncol_local_2a, nmo, npcol, nprow, nrow_local, nrow_local_1i, nrow_local_2a, &
|
||||
number_of_rec, number_of_send, proc_receive, proc_receive_static, proc_send, &
|
||||
proc_send_ex, proc_send_static, proc_send_sub, proc_shift, rec_col_size, rec_counter, &
|
||||
rec_row_size, send_col_size, send_counter, send_pcol, send_prow, send_row_size, &
|
||||
size_rec_buffer
|
||||
INTEGER :: size_send_buffer
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: iii_vet, map_rec_size, map_send_size, &
|
||||
pos_info, pos_info_ex, proc_2_send_pos
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: grid_2_mepos, mepos_2_grid, my_col_indeces_info_1i, &
|
||||
|
|
@ -690,9 +692,11 @@ CONTAINS
|
|||
NULLIFY (blacs_env)
|
||||
CALL get_qs_env(qs_env, blacs_env=blacs_env)
|
||||
|
||||
CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_global=nmo)
|
||||
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nao, ncol_global=nmo)
|
||||
CALL cp_fm_create(L_mu_q, fm_struct_tmp, name="Lag_mu_q")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(L_mu_q, 0.0_dp)
|
||||
|
|
@ -1103,7 +1107,7 @@ CONTAINS
|
|||
col_indices=col_indices)
|
||||
|
||||
IF (.NOT. mp2_env%method == ri_rpa_method_gpw) THEN
|
||||
CALL parallel_gemm('T', 'N', homo, homo, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', homo, homo, nao, 1.0_dp, &
|
||||
mo_coeff, L_mu_q, 0.0_dp, fm_P_ij, &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1111,7 +1115,7 @@ CONTAINS
|
|||
b_first_row=1, &
|
||||
c_first_col=1, &
|
||||
c_first_row=1)
|
||||
CALL parallel_gemm('T', 'N', homo, homo, dimen, -2.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', homo, homo, nao, -2.0_dp, &
|
||||
L_mu_q, mo_coeff, 2.0_dp, fm_P_ij, &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1155,7 +1159,7 @@ CONTAINS
|
|||
CALL timeset(routineN//"_PMO", handle2)
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nmo, ncol_global=nmo)
|
||||
CALL cp_fm_create(mp2_env%ri_grad%P_mo(kspin), fm_struct_tmp, name="P_MP2_MO")
|
||||
CALL cp_fm_set_all(mp2_env%ri_grad%P_mo(kspin), 0.0_dp)
|
||||
|
||||
|
|
@ -1175,7 +1179,7 @@ CONTAINS
|
|||
col_indices=col_indices)
|
||||
|
||||
IF (mp2_env%method == ri_mp2_laplace) THEN
|
||||
CALL parallel_gemm('T', 'N', virtual, virtual, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', virtual, virtual, nao, 1.0_dp, &
|
||||
mo_coeff, L_mu_q, 0.0_dp, mp2_env%ri_grad%P_mo(kspin), &
|
||||
a_first_col=homo + 1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1183,7 +1187,7 @@ CONTAINS
|
|||
b_first_row=1, &
|
||||
c_first_col=homo + 1, &
|
||||
c_first_row=homo + 1)
|
||||
CALL parallel_gemm('T', 'N', virtual, virtual, dimen, -2.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', virtual, virtual, nao, -2.0_dp, &
|
||||
L_mu_q, mo_coeff, 2.0_dp, mp2_env%ri_grad%P_mo(kspin), &
|
||||
a_first_col=homo + 1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1294,7 +1298,7 @@ CONTAINS
|
|||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
|
||||
! all block
|
||||
CALL parallel_gemm('T', 'N', dimen, dimen, dimen, 2.0_dp*factor, &
|
||||
CALL parallel_gemm('T', 'N', nmo, nmo, nao, 2.0_dp*factor, &
|
||||
L_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1304,7 +1308,7 @@ CONTAINS
|
|||
c_first_row=1)
|
||||
|
||||
! occ-occ block
|
||||
CALL parallel_gemm('T', 'N', homo, homo, dimen, -2.0_dp*factor, &
|
||||
CALL parallel_gemm('T', 'N', homo, homo, nao, -2.0_dp*factor, &
|
||||
L_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1314,7 +1318,7 @@ CONTAINS
|
|||
c_first_row=1)
|
||||
|
||||
! occ-virt block
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, dimen, 2.0_dp*factor, &
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, nao, 2.0_dp*factor, &
|
||||
mo_coeff, L_mu_q, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1336,7 +1340,7 @@ CONTAINS
|
|||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
|
||||
! first Virtual
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, dimen, 2.0_dp*factor, &
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, nao, 2.0_dp*factor, &
|
||||
L_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%L_jb(kspin), &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
@ -1345,7 +1349,7 @@ CONTAINS
|
|||
c_first_col=1, &
|
||||
c_first_row=1)
|
||||
! then occupied
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, dimen, 2.0_dp*factor, &
|
||||
CALL parallel_gemm('T', 'N', homo, virtual, nao, 2.0_dp*factor, &
|
||||
mo_coeff, L_mu_q, 1.0_dp, mp2_env%ri_grad%L_jb(kspin), &
|
||||
a_first_col=1, &
|
||||
a_first_row=1, &
|
||||
|
|
|
|||
|
|
@ -83,26 +83,24 @@ CONTAINS
|
|||
!> \param para_env ...
|
||||
!> \param dft_control ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param nmo ...
|
||||
!> \param homo ...
|
||||
!> \param Eigenval ...
|
||||
!> \author Vladimir Rybkin, 08/2019
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE rse_energy(qs_env, mp2_env, para_env, dft_control, &
|
||||
mo_coeff, nmo, homo, Eigenval)
|
||||
mo_coeff, homo, Eigenval)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp2_type), INTENT(INOUT) :: mp2_env
|
||||
TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
|
||||
TYPE(dft_control_type), INTENT(IN), POINTER :: dft_control
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
|
||||
INTEGER, INTENT(IN) :: nmo
|
||||
INTEGER, DIMENSION(:), INTENT(IN) :: homo
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'rse_energy'
|
||||
|
||||
INTEGER :: dimen, handle, i_global, iiB, ispin, &
|
||||
j_global, jjB, n_rep_hf, ncol_local, &
|
||||
INTEGER :: handle, i_global, iiB, ispin, j_global, &
|
||||
jjB, n_rep_hf, nao, ncol_local, nmo, &
|
||||
nrow_local, nspins
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
|
||||
LOGICAL :: do_hfx, hfx_treat_lsd_in_core
|
||||
|
|
@ -128,10 +126,11 @@ CONTAINS
|
|||
nrow_local=nrow_local, &
|
||||
ncol_local=ncol_local, &
|
||||
row_indices=row_indices, &
|
||||
col_indices=col_indices)
|
||||
col_indices=col_indices, &
|
||||
nrow_global=nao, &
|
||||
ncol_global=nmo)
|
||||
|
||||
! start collecting stuff
|
||||
dimen = nmo
|
||||
NULLIFY (input, matrix_s, blacs_env, rho, energy, sab_orb)
|
||||
CALL get_qs_env(qs_env, &
|
||||
input=input, &
|
||||
|
|
@ -167,16 +166,19 @@ CONTAINS
|
|||
ALLOCATE (fm_P_mu_nu(nspins))
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nao, ncol_global=nao)
|
||||
DO ispin = 1, nspins
|
||||
CALL cp_fm_create(fm_P_mu_nu(ispin), fm_struct_tmp, name="P_mu_nu")
|
||||
CALL cp_fm_set_all(fm_P_mu_nu(ispin), 0.0_dp)
|
||||
END DO
|
||||
CALL cp_fm_create(fm_ao, fm_struct_tmp, name="f_ao")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(fm_ao, 0.0_dp)
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nmo, ncol_global=nmo)
|
||||
ALLOCATE (fm_X_mo(nspins), fm_XC_mo(nspins))
|
||||
DO ispin = 1, nspins
|
||||
CALL cp_fm_create(fm_X_mo(ispin), fm_struct_tmp, name="f_X_mo")
|
||||
|
|
@ -187,12 +189,7 @@ CONTAINS
|
|||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
CALL cp_fm_create(fm_ao, fm_struct_tmp, name="f_ao")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(fm_ao, 0.0_dp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=dimen, ncol_global=dimen)
|
||||
nrow_global=nmo, ncol_global=nao)
|
||||
CALL cp_fm_create(fm_ao_mo, fm_struct_tmp, name="f_ao_mo")
|
||||
CALL cp_fm_struct_release(fm_struct_tmp)
|
||||
CALL cp_fm_set_all(fm_ao_mo, 0.0_dp)
|
||||
|
|
@ -206,21 +203,21 @@ CONTAINS
|
|||
coeff = 1.0_dp
|
||||
IF (nspins == 1) coeff = 2.0_dp
|
||||
DO ispin = 1, nspins
|
||||
CALL parallel_gemm(transa='N', transb='T', m=dimen, n=dimen, k=homo(ispin), alpha=coeff, &
|
||||
CALL parallel_gemm(transa='N', transb='T', m=nao, n=nao, k=homo(ispin), alpha=coeff, &
|
||||
matrix_a=mo_coeff(ispin), matrix_b=mo_coeff(ispin), &
|
||||
beta=0.0_dp, matrix_c=fm_P_mu_nu(ispin))
|
||||
END DO
|
||||
|
||||
! Calculate exact exchange contribution
|
||||
CALL exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
|
||||
CALL exchange_contribution(qs_env, para_env, mo_coeff, &
|
||||
hfx_sections, n_rep_hf, &
|
||||
rho, mat_mu_nu, fm_P_mu_nu, &
|
||||
fm_ao, fm_X_mo, fm_ao_mo)
|
||||
|
||||
! Calculate DFT exchange-correlation contribution
|
||||
CALL xc_contribution(qs_env, fm_ao, fm_ao_mo, fm_XC_mo, mo_coeff, dimen)
|
||||
CALL xc_contribution(qs_env, fm_ao, fm_ao_mo, fm_XC_mo, mo_coeff)
|
||||
|
||||
ALLOCATE (diag_diff(dimen))
|
||||
ALLOCATE (diag_diff(nmo))
|
||||
rse_corr = 0.0_dp
|
||||
|
||||
DO ispin = 1, nspins
|
||||
|
|
@ -263,7 +260,7 @@ CONTAINS
|
|||
|
||||
mp2_env%ri_rpa%rse_corr_diag = rse_corr
|
||||
|
||||
CALL non_diag_rse(fm_X_mo, eigenval, dimen, homo, para_env, blacs_env, rse_corr)
|
||||
CALL non_diag_rse(fm_X_mo, eigenval, homo, para_env, blacs_env, rse_corr)
|
||||
|
||||
IF (nspins == 1) rse_corr = rse_corr*2.0_dp
|
||||
|
||||
|
|
@ -290,7 +287,6 @@ CONTAINS
|
|||
!> \brief HF exchange occupied-virtual matrix
|
||||
!> \param qs_env ...
|
||||
!> \param para_env ...
|
||||
!> \param dimen ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param hfx_sections ...
|
||||
!> \param n_rep_hf ...
|
||||
|
|
@ -301,13 +297,12 @@ CONTAINS
|
|||
!> \param fm_X_mo ...
|
||||
!> \param fm_X_ao_mo ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
|
||||
SUBROUTINE exchange_contribution(qs_env, para_env, mo_coeff, &
|
||||
hfx_sections, n_rep_hf, &
|
||||
rho_work, mat_mu_nu, fm_P_mu_nu, &
|
||||
fm_X_ao, fm_X_mo, fm_X_ao_mo)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
|
||||
INTEGER, INTENT(IN) :: dimen
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
|
||||
TYPE(section_vals_type), INTENT(IN), POINTER :: hfx_sections
|
||||
INTEGER, INTENT(IN) :: n_rep_hf
|
||||
|
|
@ -321,7 +316,7 @@ CONTAINS
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'exchange_contribution'
|
||||
|
||||
INTEGER :: handle, irep, is, ns
|
||||
INTEGER :: handle, irep, is, nao, nmo, ns
|
||||
LOGICAL :: my_recalc_hfx_integrals
|
||||
REAL(KIND=dp) :: ehfx
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: P_mu_nu, rho_work_ao
|
||||
|
|
@ -329,6 +324,8 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
CALL cp_fm_get_info(mo_coeff(1), nrow_global=nao, ncol_global=nmo)
|
||||
|
||||
CALL qs_rho_get(rho_work, rho_ao=rho_work_ao)
|
||||
ns = SIZE(rho_work_ao)
|
||||
NULLIFY (P_mu_nu)
|
||||
|
|
@ -380,11 +377,11 @@ CONTAINS
|
|||
CALL cp_fm_set_all(fm_X_mo(is), 0.0_dp)
|
||||
|
||||
! First index
|
||||
CALL parallel_gemm('T', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', nmo, nao, nmo, 1.0_dp, &
|
||||
mo_coeff(is), fm_X_ao, 0.0_dp, fm_X_ao_mo)
|
||||
|
||||
! Second index
|
||||
CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nmo, nmo, nao, 1.0_dp, &
|
||||
fm_X_ao_mo, mo_coeff(is), 1.0_dp, fm_X_mo(is))
|
||||
|
||||
END DO
|
||||
|
|
@ -408,18 +405,16 @@ CONTAINS
|
|||
!> \param fm_XC_ao_mo ...
|
||||
!> \param fm_XC_mo ...
|
||||
!> \param mo_coeff ...
|
||||
!> \param dimen ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_contribution(qs_env, fm_XC_ao, fm_XC_ao_mo, fm_XC_mo, mo_coeff, dimen)
|
||||
SUBROUTINE xc_contribution(qs_env, fm_XC_ao, fm_XC_ao_mo, fm_XC_mo, mo_coeff)
|
||||
TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
|
||||
TYPE(cp_fm_type), INTENT(INOUT) :: fm_XC_ao
|
||||
TYPE(cp_fm_type), INTENT(IN) :: fm_XC_ao_mo
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_XC_mo, mo_coeff
|
||||
INTEGER, INTENT(IN) :: dimen
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xc_contribution'
|
||||
|
||||
INTEGER :: handle, i
|
||||
INTEGER :: handle, i, nao, nmo
|
||||
REAL(KIND=dp) :: exc
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_vxc
|
||||
TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: tau_rspace, v_rspace
|
||||
|
|
@ -446,17 +441,19 @@ CONTAINS
|
|||
END DO
|
||||
DEALLOCATE (v_rspace)
|
||||
|
||||
CALL cp_fm_get_info(mo_coeff(1), nrow_global=nao, ncol_global=nmo)
|
||||
|
||||
DO i = 1, SIZE(matrix_vxc)
|
||||
CALL cp_fm_set_all(fm_XC_ao, 0.0_dp)
|
||||
CALL copy_dbcsr_to_fm(matrix=matrix_vxc(i)%matrix, fm=fm_XC_ao)
|
||||
CALL cp_fm_set_all(fm_XC_mo(i), 0.0_dp)
|
||||
|
||||
! First index
|
||||
CALL parallel_gemm('T', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('T', 'N', nmo, nao, nao, 1.0_dp, &
|
||||
mo_coeff(i), fm_XC_ao, 0.0_dp, fm_XC_ao_mo)
|
||||
|
||||
! Second index
|
||||
CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
|
||||
CALL parallel_gemm('N', 'N', nmo, nmo, nao, 1.0_dp, &
|
||||
fm_XC_ao_mo, mo_coeff(i), 1.0_dp, fm_XC_mo(i))
|
||||
|
||||
END DO
|
||||
|
|
@ -476,17 +473,15 @@ CONTAINS
|
|||
!> \brief ...
|
||||
!> \param fm_F_mo ...
|
||||
!> \param eigenval ...
|
||||
!> \param dimen ...
|
||||
!> \param homo ...
|
||||
!> \param para_env ...
|
||||
!> \param blacs_env ...
|
||||
!> \param rse_corr ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE non_diag_rse(fm_F_mo, eigenval, dimen, homo, para_env, &
|
||||
SUBROUTINE non_diag_rse(fm_F_mo, eigenval, homo, para_env, &
|
||||
blacs_env, rse_corr)
|
||||
TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_F_mo
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: Eigenval
|
||||
INTEGER, INTENT(IN) :: dimen
|
||||
INTEGER, DIMENSION(:), INTENT(IN) :: homo
|
||||
TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
|
||||
TYPE(cp_blacs_env_type), INTENT(IN), POINTER :: blacs_env
|
||||
|
|
@ -495,8 +490,8 @@ CONTAINS
|
|||
CHARACTER(LEN=*), PARAMETER :: routineN = 'non_diag_rse'
|
||||
|
||||
INTEGER :: handle, i_global, iiB, ispin, j_global, &
|
||||
jjB, ncol_local, nrow_local, nspins, &
|
||||
virtual
|
||||
jjB, ncol_local, nmo, nrow_local, &
|
||||
nspins, virtual
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
|
||||
REAL(KIND=dp) :: corr
|
||||
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: eig_o, eig_semi_can, eig_v
|
||||
|
|
@ -506,6 +501,7 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
nmo = SIZE(Eigenval, 1)
|
||||
nspins = SIZE(fm_f_mo)
|
||||
|
||||
DO ispin = 1, nspins
|
||||
|
|
@ -532,7 +528,7 @@ CONTAINS
|
|||
rse_corr = 0.0_dp
|
||||
|
||||
DO ispin = 1, nspins
|
||||
IF (homo(ispin) <= 0 .OR. homo(ispin) >= dimen) CYCLE
|
||||
IF (homo(ispin) <= 0 .OR. homo(ispin) >= nmo) CYCLE
|
||||
! Create the occupied-occupied and virtual-virtual blocks, eigenvectors
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
|
|
@ -547,7 +543,7 @@ CONTAINS
|
|||
nrow=homo(ispin), ncol=homo(ispin), &
|
||||
s_firstrow=1, s_firstcol=1, &
|
||||
t_firstrow=1, t_firstcol=1)
|
||||
virtual = dimen - homo(ispin)
|
||||
virtual = nmo - homo(ispin)
|
||||
NULLIFY (fm_struct_tmp)
|
||||
CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
|
||||
nrow_global=virtual, ncol_global=virtual)
|
||||
|
|
@ -571,10 +567,10 @@ CONTAINS
|
|||
CALL choose_eigv_solver(fm_F_vv, fm_U, eig_v)
|
||||
|
||||
! Collect the eigenvalues to one array
|
||||
ALLOCATE (eig_semi_can(dimen))
|
||||
ALLOCATE (eig_semi_can(nmo))
|
||||
eig_semi_can = 0.0_dp
|
||||
eig_semi_can(1:homo(ispin)) = eig_o(:)
|
||||
eig_semi_can(homo(ispin) + 1:dimen) = eig_v(:)
|
||||
eig_semi_can(homo(ispin) + 1:nmo) = eig_v(:)
|
||||
|
||||
! Create occupied-virtual block
|
||||
NULLIFY (fm_struct_tmp)
|
||||
|
|
|
|||
103
tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp
Normal file
103
tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT GRAD_H2O_gpw
|
||||
RUN_TYPE GEO_OPT
|
||||
&END GLOBAL
|
||||
|
||||
&MOTION
|
||||
&GEO_OPT
|
||||
MAX_ITER 1
|
||||
&END GEO_OPT
|
||||
&END MOTION
|
||||
|
||||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME HFX_BASIS
|
||||
POTENTIAL_FILE_NAME POTENTIAL
|
||||
&MGRID
|
||||
CUTOFF 150
|
||||
REL_CUTOFF 30
|
||||
&END MGRID
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-12
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
# This is just for testing !!!
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 5.0E-2
|
||||
EPS_SCF 1.0E-3
|
||||
MAX_SCF 100
|
||||
SCF_GUESS ATOMIC
|
||||
&END SCF
|
||||
&XC
|
||||
&HF
|
||||
FRACTION 1.0000000
|
||||
&INTERACTION_POTENTIAL
|
||||
CUTOFF_RADIUS 1.5
|
||||
POTENTIAL_TYPE TRUNCATED
|
||||
T_C_G_DATA t_c_g.dat
|
||||
&END INTERACTION_POTENTIAL
|
||||
&SCREENING
|
||||
EPS_SCHWARZ 1.0E-6
|
||||
EPS_SCHWARZ_FORCES 1.0E-6
|
||||
SCREEN_ON_INITIAL_P .FALSE.
|
||||
&END SCREENING
|
||||
&END HF
|
||||
&WF_CORRELATION
|
||||
MEMORY 1.00
|
||||
NUMBER_PROC 1
|
||||
&CANONICAL_GRADIENTS
|
||||
EPS_CANONICAL 0.0001
|
||||
FREE_HFX_BUFFER .TRUE.
|
||||
&CPHF
|
||||
EPS_CONV 1.0E-4
|
||||
MAX_ITER 10
|
||||
&END CPHF
|
||||
&END CANONICAL_GRADIENTS
|
||||
&INTEGRALS
|
||||
&WFC_GPW
|
||||
CUTOFF 50
|
||||
EPS_FILTER 1.0E-12
|
||||
EPS_GRID 1.0E-8
|
||||
REL_CUTOFF 20
|
||||
&END WFC_GPW
|
||||
&END INTEGRALS
|
||||
&RI_MP2
|
||||
BLOCK_SIZE 1
|
||||
&END RI_MP2
|
||||
&END WF_CORRELATION
|
||||
&XC_FUNCTIONAL NONE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&END DFT
|
||||
&PRINT
|
||||
&FORCES
|
||||
&END FORCES
|
||||
&END PRINT
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC [angstrom] 5.0 5.0 5.0
|
||||
&END CELL
|
||||
&COORD
|
||||
O 0.000000 0.000000 -0.211000
|
||||
H 0.000000 -0.844000 0.495000
|
||||
H 0.000000 0.744000 0.495000
|
||||
&END COORD
|
||||
&KIND H
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-HF-q1
|
||||
&END KIND
|
||||
&KIND O
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-HF-q6
|
||||
&END KIND
|
||||
&TOPOLOGY
|
||||
&CENTER_COORDINATES
|
||||
&END CENTER_COORDINATES
|
||||
&END TOPOLOGY
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
"H2O_grad_mme.inp" = [{matcher="M011", tol=7e-09, ref=-16.766973117914596}]
|
||||
"H2O_grad_gpw.inp" = [{matcher="M011", tol=7e-08, ref=-16.990049367524886}]
|
||||
"H2O_grad_gpw_chol_off.inp" = [{matcher="M011", tol=7e-08, ref=-16.980584170136297}]
|
||||
"H2O_grad_gpw_single_group.inp" = [{matcher="M011", tol=7e-08, ref=-16.990049367524886}]
|
||||
"HF_dipole.inp" = [{matcher="M011", tol=7e-08, ref=-24.660454660161033}]
|
||||
"H2_H2_no_freeHFX.inp" = [{matcher="M011", tol=2e-13, ref=-2.307432149680968}]
|
||||
|
|
|
|||
102
tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp
Normal file
102
tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL MEDIUM
|
||||
PROJECT RI_RPA_grad_MP2_H2O
|
||||
RUN_TYPE GEO_OPT
|
||||
# RUN_TYPE ENERGY_FORCE
|
||||
&TIMINGS
|
||||
THRESHOLD 0.01
|
||||
&END TIMINGS
|
||||
&END GLOBAL
|
||||
|
||||
&MOTION
|
||||
&GEO_OPT
|
||||
MAX_ITER 1
|
||||
&END GEO_OPT
|
||||
&END MOTION
|
||||
|
||||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME HFX_BASIS
|
||||
POTENTIAL_FILE_NAME POTENTIAL
|
||||
&MGRID
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 20
|
||||
&END MGRID
|
||||
&POISSON
|
||||
PERIODIC XYZ
|
||||
POISSON_SOLVER WAVELET
|
||||
&END POISSON
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-10
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
# This is just for testing !!!
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 5.0E-2
|
||||
EPS_SCF 1.0E-3
|
||||
MAX_SCF 100
|
||||
SCF_GUESS RESTART
|
||||
! ADDED_MOS 15000 15000
|
||||
&END SCF
|
||||
&XC
|
||||
&HF
|
||||
FRACTION 1.0000000
|
||||
&INTERACTION_POTENTIAL
|
||||
CUTOFF_RADIUS 1.5
|
||||
POTENTIAL_TYPE TRUNCATED
|
||||
&END INTERACTION_POTENTIAL
|
||||
&SCREENING
|
||||
EPS_SCHWARZ 1.0E-6
|
||||
EPS_SCHWARZ_FORCES 1.0E-6
|
||||
SCREEN_ON_INITIAL_P FALSE
|
||||
&END SCREENING
|
||||
&END HF
|
||||
&WF_CORRELATION
|
||||
MEMORY 200.
|
||||
NUMBER_PROC 1
|
||||
&CANONICAL_GRADIENTS
|
||||
# Just for testing, use it only if you need the accuracy
|
||||
DOT_PRODUCT_BLKSIZE 1
|
||||
EPS_CANONICAL 0.1
|
||||
&END CANONICAL_GRADIENTS
|
||||
&INTEGRALS
|
||||
ERI_METHOD GPW
|
||||
&WFC_GPW
|
||||
CUTOFF 50
|
||||
REL_CUTOFF 20
|
||||
&END WFC_GPW
|
||||
&END INTEGRALS
|
||||
&RI_RPA
|
||||
MINIMAX
|
||||
QUADRATURE_POINTS 4
|
||||
&END RI_RPA
|
||||
&END WF_CORRELATION
|
||||
&XC_FUNCTIONAL NONE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&END DFT
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC [angstrom] 4.0 4.0 4.0
|
||||
PERIODIC XYZ
|
||||
&END CELL
|
||||
&KIND H
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-HF-q1
|
||||
&END KIND
|
||||
&KIND O
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-HF-q6
|
||||
&END KIND
|
||||
&TOPOLOGY
|
||||
COORD_FILE_FORMAT xyz
|
||||
COORD_FILE_NAME H2O_gas.xyz
|
||||
&CENTER_COORDINATES
|
||||
&END CENTER_COORDINATES
|
||||
&END TOPOLOGY
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
"RI_RPA_grad_MP2_H2O.inp" = [{matcher="M011", tol=8e-08, ref=-16.994618476831036}]
|
||||
"RI_RPA_grad_MP2_H2O_chol_off.inp" = [{matcher="M011", tol=8e-08, ref=-16.999596775201066}]
|
||||
"RI_RPA_grad_MP2_CH3.inp" = [{matcher="M011", tol=8e-08, ref=-7.515607384605213}]
|
||||
"RI_RPA_grad_MP2_H2O_HF_PBE.inp" = [{matcher="M011", tol=8e-08, ref=-17.057843090414949}]
|
||||
"RI_RPA_grad_MP2_H2O_HF_PBE_ADMM.inp" = [{matcher="M011", tol=1e-07, ref=-17.066232490836303}]
|
||||
|
|
|
|||
91
tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp
Normal file
91
tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL MEDIUM
|
||||
PROJECT RI_RPA_RSE_H2_minus
|
||||
RUN_TYPE ENERGY
|
||||
&TIMINGS
|
||||
THRESHOLD 0.01
|
||||
&END TIMINGS
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME HFX_BASIS
|
||||
CHARGE -1
|
||||
MULTIPLICITY 2
|
||||
POTENTIAL_FILE_NAME GTH_POTENTIALS
|
||||
UKS .TRUE.
|
||||
&MGRID
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 20
|
||||
&END MGRID
|
||||
&POISSON
|
||||
PERIODIC NONE
|
||||
POISSON_SOLVER WAVELET
|
||||
&END POISSON
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-15
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
# This is just for testing
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 2.0E-1
|
||||
EPS_SCF 1.0E-7
|
||||
MAX_SCF 100
|
||||
SCF_GUESS ATOMIC
|
||||
&PRINT
|
||||
&RESTART OFF
|
||||
&END RESTART
|
||||
&END PRINT
|
||||
&END SCF
|
||||
&XC
|
||||
&WF_CORRELATION
|
||||
MEMORY 200.
|
||||
NUMBER_PROC 1
|
||||
&INTEGRALS
|
||||
ERI_METHOD GPW
|
||||
&WFC_GPW
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 20
|
||||
&END WFC_GPW
|
||||
&END INTEGRALS
|
||||
&RI_RPA
|
||||
RPA_NUM_QUAD_POINTS 40
|
||||
RSE .TRUE.
|
||||
&HF
|
||||
FRACTION 1.0000000
|
||||
&SCREENING
|
||||
EPS_SCHWARZ 1.0E-8
|
||||
SCREEN_ON_INITIAL_P FALSE
|
||||
&END SCREENING
|
||||
&END HF
|
||||
&END RI_RPA
|
||||
&END WF_CORRELATION
|
||||
&XC_FUNCTIONAL PBE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&END DFT
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC [angstrom] 8.000 8.000 8.000
|
||||
PERIODIC NONE
|
||||
&END CELL
|
||||
&KIND H
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-PBE-q1
|
||||
&END KIND
|
||||
&KIND O
|
||||
BASIS_SET DZVP-GTH
|
||||
BASIS_SET RI_AUX RI_DZVP-GTH
|
||||
POTENTIAL GTH-PBE-q6
|
||||
&END KIND
|
||||
&TOPOLOGY
|
||||
COORD_FILE_FORMAT xyz
|
||||
COORD_FILE_NAME H2.xyz
|
||||
&CENTER_COORDINATES
|
||||
&END CENTER_COORDINATES
|
||||
&END TOPOLOGY
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
"RI_RPA_RSE_H2_minus.inp" = [{matcher="M011", tol=1e-09, ref=-0.985759720085668}]
|
||||
"RI_RPA_RSE_H2_minus_chol_off.inp" = [{matcher="M011", tol=1e-07, ref=-0.704841076981913}]
|
||||
"Cubic_RPA_RSE_H2.inp" = [{matcher="M011", tol=2e-09, ref=-1.169521790614493}]
|
||||
#EOF
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue