Specify numbers of MOs and AOs at different spots (#4295)

This commit is contained in:
Frederick Stein 2025-07-16 16:26:39 +02:00 committed by GitHub
parent d7297c05c6
commit 6f70cd24b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 490 additions and 208 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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, &

View file

@ -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)

View 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

View file

@ -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}]

View 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

View file

@ -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}]

View 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

View file

@ -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