在粒子束中定义用户编码的能量源

在简单案例中,可使用场函数对颗粒的内部加热进行建模,但可使用用户编码对更复杂的案例建模。 此示例比较将铝颗粒喷射到方盒中的两种瞬态模拟方法。

1.0E8 W/m3 的恒定能量源可在 0.05 秒的模拟时间内加热颗粒,将其温度从 300 度升高到 301.12 度。 由于热源恒定,因此温度随停留时间而线性增加。

由于在拉格朗日求解步骤的子步期间发生其他物理过程,因此部分粒子束分布可能会失效。 在分布上运行之前,用户程序必须检查 parcelId(粒子束 ID) 的有效性。 除了计算热源所需的参数之外,分布还必须将 parcelId(粒子束 ID) 作为参数传入。

子例程 uflib.f 将注册 parcelId(粒子束 ID) 和温度:

subroutine uflib()
     use StarRealMod
     implicit none
 
 c Register user functions
 
    external parcelQdot
 
    call uffunc(parcelQdot,
     &    "ParcelProfile",
     &    "Parcel Heat Source")
 
    call ufarg(parcelQdot,
     & "Parcel",
     & "ParcelId",
     & StarInt)
 
    return
     end

将热源应用到域中的粒子束的用户程序如下:

subroutine parcelQdot(result,size,Id)
 
 c parcel heat source example
 
    use StarRealMod
 
    integer, intent(in) :: size
     real(StarReal), intent(out) :: result(size)
     real(StarInt), intent(in) :: Id(*)
 
    real(StarInt), parameter :: NULL_INDEX = -1
     integer i
 
    do i = 1, size
       if (Id(i) .gt. NULL_INDEX) then
         result(i) = 1e8
       endif
     end do
 
    return
     end

与用户自定义的内部热源相比,上述场函数和用户程序可产生相同的结果:



在上图中,相 1 对应于内部计算的粒子束热通量,相 2 对应于用户编码的粒子束热通量。 对于这种情况,由于颗粒时间在喷射过程中略微错开,因此停留时间稍有不同。 但是,在这两种情况下,颗粒温度与停留时间成线性比例。