!> 粒子对接触控制 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