|
|
本帖最后由 白菜 于 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
|
|