spx_contact_control.f90 Source File


Contents


Source Code

!> 粒子对接触控制
module spx_contact_control

    implicit none

    private
    public :: contact_control

contains

    !> 每个相态仅支持一种粒子模拟, 边界和刚体是表面光滑的 (目前, 后续可以扩展为: 用户在配置文件中指定粒子类型交互规则)
    integer function contact_control(itype, a, b)
        integer, intent(in) :: itype(:)
        integer, intent(inout) :: a, b  !! 粒子类型 1, 2 (2X: 边界粒子, 3X: 刚体粒子, 5X: 液体粒子, 11X: 空气粒子, 23X: 弹性固体粒子)

        contact_control = itype(a)/10 + itype(b)/10
        select case (contact_control)
        case (4, 6)                ! 无交互粒子对: 边界+边界(4), 刚体+刚体(6)
            contact_control = 1
        case (10, 16, 22, 46)        ! 交互粒子对: 液体+液体(10), 液体+空气(16), 空气+空气(22), 弹性固体+弹性固体(46)
            contact_control = 2
        case (5, 7, 13, 25, 26, 28, 34)! 排斥力粒子对: 边界+刚体(5), 边界+液体(7), 边界+空气(13),
            contact_control = 3     ! 边界+弹性固体(25), 刚体+弹性固体(26), 液体+弹性固体(28), 空气+弹性固体(34)
        case (8, 14)                ! 压强交互粒子对: 刚体+液体(8), 刚体+空气(14)
            contact_control = 4     !@tofix
        case default                ! 未定义: 其他, 后续读取配置文件
            contact_control = 0
        end select

    end function contact_control

end module spx_contact_control