计算化学公社

标题: 请教优化结构用rVV10,任务一开始就报错qs_dispersion_nonloc.F:1430 [打印本页]

作者
Author:
白菜    时间: 2025-9-2 16:06
标题: 请教优化结构用rVV10,任务一开始就报错qs_dispersion_nonloc.F:1430
本帖最后由 白菜 于 2025-9-5 11:55 编辑

老师们好,我在超算(cp2k-2024.1)上提交了一个变胞优化任务,输入文件部分如下(完整.inp和.out文件已上传),计算一开始就中止了,提示:CPASSERT failed   qs_dispersion_nonloc.F:1430
rVV10_kernel_table.dat文件检查过了,存在且大致和网上的一样。不知道是什么问题想请教老师们怎么解决。
    &XC
      &XC_FUNCTIONAL
        &MGGA_X_R2SCAN
        &END MGGA_X_R2SCAN
        &MGGA_C_R2SCAN
        &END MGGA_C_R2SCAN
      &END XC_FUNCTIONAL
      &VDW_POTENTIAL
        POTENTIAL_TYPE NON_LOCAL
        &NON_LOCAL
          TYPE RVV10
          PARAMETERS 11.95 0.0093
          KERNEL_FILE_NAME rVV10_kernel_table.dat
        &END NON_LOCAL
      &END VDW_POTENTIAL
    &END XC
    &MGRID
      CUTOFF  600
      REL_CUTOFF  60
    &END MGRID
下面是我找的一些资料:
CP2K: qs_dispersion_nonloc.F Source File
   ! **************************************************************************************************
   !! This routine is modeled after an algorithm from "Numerical Recipes in C" by Cambridge
   !! University Press, page 97.  Adapted for Fortran and the problem at hand.  This function is used to
   !! find the Phi_alpha_beta needed for equations 8 and 11 of SOLER.
! **************************************************************************************************
!> \brief ...
!> \param k ...
!> \param kernel_of_k ...
!> \param dispersion_env ...
!> \par History
!>     Optimised when adding OpenMP to vdw_energy (which calls this routine): Aug 2016 MTucker
! **************************************************************************************************
   SUBROUTINE interpolate_kernel(k, kernel_of_k, dispersion_env)
      REAL(dp), INTENT(in)                               :: k
      REAL(dp), INTENT(out)                              :: kernel_of_k(:, :)
      TYPE(qs_dispersion_type), POINTER                  :: dispersion_env

      INTEGER                                            :: k_i, nr_points, q1_i, q2_i
      REAL(dp)                                           :: a, b, c, const, d, dk, r_max
      REAL(dp), DIMENSION(:, :, :), POINTER              :: d2phi_dk2, kernel

      nr_points = dispersion_env%nr_points
      r_max = dispersion_env%r_max
      dk = dispersion_env%dk
      kernel => dispersion_env%kernel
      d2phi_dk2 => dispersion_env%d2phi_dk2

      !! Check to make sure that the kernel table we have is capable of dealing with this
      !! value of k.  If k is larger than Nr_points*2*pi/r_max then we can't perform the
      !! interpolation.  In that case, a kernel file should be generated with a larger number
      !! of radial points.
      !! -------------------------------------------------------------------------------------
      cpassert(k < nr_points*dk)
      !! -------------------------------------------------------------------------------------
      kernel_of_k = 0.0_dp         1430行
      !! This integer division figures out which bin k is in since the kernel
      !! is set on a uniform grid.
      k_i = int(k/dk)

      !! Test to see if we are trying to interpolate a k that is one of the actual
      !! function points we have.  The value is just the value of the function in that
      !! case.
      !! ----------------------------------------------------------------------------------------
      IF (mod(k, dk) == 0) THEN
         DO q1_i = 1, dispersion_env%Nqs
            DO q2_i = 1, q1_i
               kernel_of_k(q1_i, q2_i) = kernel(k_i, q1_i, q2_i)
               kernel_of_k(q2_i, q1_i) = kernel(k_i, q2_i, q1_i)
            END DO
         END DO
         RETURN
      END IF
      !! ----------------------------------------------------------------------------------------
      !! If we are not on a function point then we carry out the interpolation
      !! ----------------------------------------------------------------------------------------
      const = dk*dk/6.0_dp
      a = (dk*(k_i + 1.0_dp) - k)/dk
      b = (k - dk*k_i)/dk
      c = (a**3 - a)*const
      d = (b**3 - b)*const
      DO q1_i = 1, dispersion_env%Nqs
         DO q2_i = 1, q1_i
            kernel_of_k(q1_i, q2_i) = a*kernel(k_i, q1_i, q2_i) + b*kernel(k_i + 1, q1_i, q2_i) &
                                      + (c*d2phi_dk2(k_i, q1_i, q2_i) + d*d2phi_dk2(k_i + 1, q1_i, q2_i))
            kernel_of_k(q2_i, q1_i) = kernel_of_k(q1_i, q2_i)
         END DO
      END DO

   END SUBROUTINE interpolate_kernel
NON_LOCAL — CP2K documentation



作者
Author:
sobereva    时间: 2025-9-3 10:46
不建议拿带rVV10色散校正的泛函做这种任务,没额外好处,耗时还很高。PBEsol是干这个的很好选择




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3