From 6f70cd24b09a09b449725aea276f87a025b9010f Mon Sep 17 00:00:00 2001 From: Frederick Stein <43850145+fstein93@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:26:39 +0200 Subject: [PATCH] Specify numbers of MOs and AOs at different spots (#4295) --- src/mp2.F | 6 +- src/mp2_cphf.F | 218 ++++++++---------- src/mp2_gpw.F | 15 +- src/mp2_ri_grad.F | 82 +++---- src/rpa_rse.F | 78 +++---- .../H2O_grad_gpw_chol_off.inp | 103 +++++++++ tests/QS/regtest-mp2-grad-1/TEST_FILES.toml | 1 + .../RI_RPA_grad_MP2_H2O_chol_off.inp | 102 ++++++++ tests/QS/regtest-ri-rpa-grad/TEST_FILES.toml | 1 + .../RI_RPA_RSE_H2_minus_chol_off.inp | 91 ++++++++ tests/QS/regtest-ri-rpa-rse/TEST_FILES.toml | 1 + 11 files changed, 490 insertions(+), 208 deletions(-) create mode 100644 tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp create mode 100644 tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp create mode 100644 tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp diff --git a/src/mp2.F b/src/mp2.F index 94ddb6c37b..d768516cb3 100644 --- a/src/mp2.F +++ b/src/mp2.F @@ -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 diff --git a/src/mp2_cphf.F b/src/mp2_cphf.F index b37de4e3e5..e07b6a8d8c 100644 --- a/src/mp2_cphf.F +++ b/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) diff --git a/src/mp2_gpw.F b/src/mp2_gpw.F index d9e5d4b073..5c748b2102 100644 --- a/src/mp2_gpw.F +++ b/src/mp2_gpw.F @@ -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 diff --git a/src/mp2_ri_grad.F b/src/mp2_ri_grad.F index fb0273d967..2047245c82 100644 --- a/src/mp2_ri_grad.F +++ b/src/mp2_ri_grad.F @@ -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, & diff --git a/src/rpa_rse.F b/src/rpa_rse.F index cd5311df65..88419dbc8e 100644 --- a/src/rpa_rse.F +++ b/src/rpa_rse.F @@ -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) diff --git a/tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp b/tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp new file mode 100644 index 0000000000..af3de9064d --- /dev/null +++ b/tests/QS/regtest-mp2-grad-1/H2O_grad_gpw_chol_off.inp @@ -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 diff --git a/tests/QS/regtest-mp2-grad-1/TEST_FILES.toml b/tests/QS/regtest-mp2-grad-1/TEST_FILES.toml index 1723325a40..26e29565d2 100644 --- a/tests/QS/regtest-mp2-grad-1/TEST_FILES.toml +++ b/tests/QS/regtest-mp2-grad-1/TEST_FILES.toml @@ -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}] diff --git a/tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp b/tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp new file mode 100644 index 0000000000..f1249dcdb9 --- /dev/null +++ b/tests/QS/regtest-ri-rpa-grad/RI_RPA_grad_MP2_H2O_chol_off.inp @@ -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 diff --git a/tests/QS/regtest-ri-rpa-grad/TEST_FILES.toml b/tests/QS/regtest-ri-rpa-grad/TEST_FILES.toml index f40802dcaf..75abd0204a 100644 --- a/tests/QS/regtest-ri-rpa-grad/TEST_FILES.toml +++ b/tests/QS/regtest-ri-rpa-grad/TEST_FILES.toml @@ -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}] diff --git a/tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp b/tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp new file mode 100644 index 0000000000..80eb255aa8 --- /dev/null +++ b/tests/QS/regtest-ri-rpa-rse/RI_RPA_RSE_H2_minus_chol_off.inp @@ -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 diff --git a/tests/QS/regtest-ri-rpa-rse/TEST_FILES.toml b/tests/QS/regtest-ri-rpa-rse/TEST_FILES.toml index f5e2e01a1d..d8bd9bdf75 100644 --- a/tests/QS/regtest-ri-rpa-rse/TEST_FILES.toml +++ b/tests/QS/regtest-ri-rpa-rse/TEST_FILES.toml @@ -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