更改瞬态喷射中的直径分布

下面以颗粒为例进行说明(例如,喷射到模拟中的液滴)。

Simcenter STAR-CCM+ 使用 Rosin-Rammler 分布描述液滴直径。 在一组给定颗粒中找到直径为 D 的颗粒的概率(概率密度函数或 PDF)如下:

PDF(D)=exp[(DDref)q]
(16)

其中,Dref 为 Rosin-Rammler 直径,q 为 Rosin-Rammler 指数。

在双对数曲线图上,这种分布呈直线;Dref 为截距,q 为斜率。 累积概率密度函数(或 CDF)是积分概率:

Y(D)=1exp[(DDref)q]
(17)

其中,Y(D) 为直径小于 D 的液滴的质量分数,介于 0 和 1 之间。 可以针对 D 求解此关系,从而在不同质量分数点获得直径样本:

D=Dref[ln(1Y)]1q
(18)

此关系可用于为 Y 的给定随机样本返回 [0,1] 范围内的直径。 采用 Fortran 或 C 编写返回直径的例程很简单,但是必须提供一些额外的编码才能将例程链接到 Simcenter STAR-CCM+

此示例需要四个文件:

  • StarReal.f 文件,用于为 Fortran 共享对象库定义模块中的变量大小
  • uflib.f 文件,包含将 Simcenter STAR-CCM+ 内的变量链接到为案例创建的外部库的定义
  • 源程序 rosinRammlerDiameter.f,用于返回适当的直径
  • 生成文件,为方便起见

模块文件 StarReal.f

第一个文件 StarReal.f 可定义模块来表示用于 Simcenter STAR-CCM+ 的标准变量大小。 编译 StarReal.f 会创建 Fortran 共享对象库。 该文件为:

module StarRealMod
     integer, parameter :: StarInt = kind(1)
     integer, parameter :: StarReal = kind(1.0)
     integer, parameter :: CoordReal = kind(1D0)
     integer, parameter :: StarIntSize = StarInt
     integer, parameter :: StarRealSize = StarReal
     integer, parameter :: CoordRealSize = CoordReal
 end module StarRealMod
使用双精度时,将 StarReal 定义为 kind(1.0d0)

库文件 uflib.f

库文件 uflib.f 可注册用户例程并定义要传递到用户程序的内部变量。 该文件为:

subroutine uflib()
     use StarRealMod
     implicit none

  c Register user functions here

     external rosinRammlerDiameter

     call uffunc(rosinRammlerDiameter,
     &    "ParcelProfile",
     &    "Rosin-Rammler Diameter")

     return

  end

在这种情况下,内部例程 uffunc 将查找一个名为 rosinRammerDiameter 的模块(正应用于 ParcelProfile 内部)。

列表中的第三个参数 Rosin-Rammler Diameter(Rosin-Rammler 直径) 是加载库时显示在界面中的标题。

子例程 rosinRammlerDiameter.f

该子例程通过对 CDF 均匀采样来计算直径。 此处的示例使用内置的 Fortran 随机数发生器 rand(),这意味着此实施取决于机器和编译器组合。 其他合适的伪随机数发生器可以从多个来源获得。

subroutine rosinRammlerDiameter(result,size)

  c particle diameter example

     use StarRealMod

     implicit none
     integer, intent(in) :: size
     real(StarReal), intent(out) :: result(size)

     real(StarReal), parameter :: meandiam = 1e-5
     real(StarReal), parameter :: rrexpon = 1.0/3.5

     integer i

     do i = 1,size
      result(i) = meandiam*(-log(1.0-rand()))**rrexpon
     end do

     return
     end

生成文件

以下是包含 gnu Fortran95 编译标志的生成文件示例:

default: libuser.so

  libuser.so: StarReal.f uflib.f rosinRammlerDiameter.f
          f95 StarReal.f uflib.f rosinRammlerDiameter.f -fPIC -shared -o $@

运行该生成文件会生成共享对象库 libuser.so。 构建库之后,将函数连接到 Simcenter STAR-CCM+

将用户程序连接到 Simcenter STAR-CCM+

要连接用户程序:

  1. 右键单击工具 > 用户程序节点,然后选择新用户库...

  2. 在文件系统中浏览 libuser.so 并展开用户程序节点:



    假设已为该案例定义适当的喷射,用户程序选项将显示为颗粒直径定义的选项。



  3. 要选择 Rosin-Rammler 分布,编辑用户程序节点的函数属性。

此处显示的案例定义了两个喷射器。 在一个喷射器中,颗粒直径由 Simcenter STAR-CCM+ 在内部定义的 Rosin-Rammler 颗粒尺寸分布给出。 在另一个喷射器中,用户编码定义 Rosin-Rammler 分布。 否则,这些喷射器相同。

下图是内部定义的 Rosin-Rammler 直径分布的颗粒直径直方图:



下图是用户编码的 Rosin-Rammler 直径分布的颗粒直径直方图:



这两个定义的平均直径和实际数分布略有不同。 这些差异主要是由于随机数的采样选项和方法之间的最大值与最小值剪切导致。 在这两种情况下,Rosin-Rammler 直径 Dref 为 1.0E-5 米,Rosin-Rammler 指数 q 设为 3.5。 对于大量样本,这些差异将会变小。