Normalized density summation
对所有粒子进行正则化密度求和法
计算量较密度求和法大
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(particle_type), | intent(inout) | :: | particle |
particle |
||
| type(nnps_pairs_type), | intent(in) | :: | pairs |
particle pairs |
||
| integer, | intent(in) | :: | n |
实弹性粒子数, numbers(1) Note用以定义本地数组长度 |
pure subroutine normalized_density_summation(particle, pairs, n)
type(particle_type), intent(inout) :: particle !! particle <br>
!! 区域
type(nnps_pairs_type), intent(in) :: pairs !! particle pairs <br>
!! 粒子对
integer, intent(in) :: n !! 实弹性粒子数, numbers(1)
!! @note 用以定义本地数组长度
integer :: i
real(rk) :: rho_tmp(n), wi(n) !! 分母部分
rho_tmp(:n) = particle%rho(:n) ! 临时存储密度值
particle%rho(:n) = skf_obj%selfden*particle%mass(:n)
wi(:n) = particle%rho(:n)/rho_tmp(:n)
do concurrent(i=1:pairs%len) ! 计算密度求和
associate (ip => pairs%items(2*i - 1), jp => pairs%items(2*i))
if (ip <= n .and. jp <= n) then
if (particle%itype(ip) /= particle%itype(jp)) cycle
particle%rho(ip) = particle%rho(ip) + particle%mass(jp)*pairs%wdwdx(1, i)
particle%rho(jp) = particle%rho(jp) + particle%mass(ip)*pairs%wdwdx(1, i)
wi(ip) = wi(ip) + particle%mass(jp)*pairs%wdwdx(1, i)/rho_tmp(jp)
wi(jp) = wi(jp) + particle%mass(ip)*pairs%wdwdx(1, i)/rho_tmp(ip)
end if
end associate
end do
particle%rho(:n) = particle%rho(:n)/wi(:n) ! 正则化密度
end subroutine normalized_density_summation