normalized_density_summation Subroutine

private pure subroutine normalized_density_summation(particle, pairs, n)

Normalized density summation
对所有粒子进行正则化密度求和法

Arguments

Type IntentOptional Attributes Name
type(particle_type), intent(inout) :: particle

particle
区域

type(nnps_pairs_type), intent(in) :: pairs

particle pairs
粒子对

integer, intent(in) :: n

实弹性粒子数, numbers(1)


Contents


Source Code

    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